]>
Commit | Line | Data |
---|---|---|
891bbdf5 AM |
1 | 2005-10-28 Gwenole Beauchesne <gbeauchesne@mandriva.com> |
2 | ||
3 | * Various additional hacks for GCC4. | |
4 | ||
5 | --- qemu-0.7.2/target-i386/ops_sse.h.gcc4-hacks 2005-09-04 19:11:31.000000000 +0200 | |
6 | +++ qemu-0.7.2/target-i386/ops_sse.h 2005-10-28 10:09:21.000000000 +0200 | |
7 | @@ -34,6 +34,12 @@ | |
8 | #define Q(n) XMM_Q(n) | |
9 | #define SUFFIX _xmm | |
10 | #endif | |
11 | +#if defined(__i386__) && __GNUC__ >= 4 | |
12 | +#define RegCopy(d, s) __builtin_memcpy(&(d), &(s), sizeof(d)) | |
13 | +#endif | |
14 | +#ifndef RegCopy | |
15 | +#define RegCopy(d, s) d = s | |
16 | +#endif | |
17 | ||
18 | void OPPROTO glue(op_psrlw, SUFFIX)(void) | |
19 | { | |
20 | @@ -570,7 +576,7 @@ void OPPROTO glue(op_pshufw, SUFFIX) (vo | |
21 | r.W(1) = s->W((order >> 2) & 3); | |
22 | r.W(2) = s->W((order >> 4) & 3); | |
23 | r.W(3) = s->W((order >> 6) & 3); | |
24 | - *d = r; | |
25 | + RegCopy(*d, r); | |
26 | } | |
27 | #else | |
28 | void OPPROTO op_shufps(void) | |
29 | --- qemu-0.7.2/target-i386/helper.c.gcc4-hacks 2005-09-04 19:11:31.000000000 +0200 | |
30 | +++ qemu-0.7.2/target-i386/helper.c 2005-10-28 10:09:21.000000000 +0200 | |
31 | @@ -3130,8 +3130,15 @@ void helper_fxrstor(target_ulong ptr, in | |
32 | nb_xmm_regs = 8 << data64; | |
33 | addr = ptr + 0xa0; | |
34 | for(i = 0; i < nb_xmm_regs; i++) { | |
35 | +#if defined(__i386__) && __GNUC__ >= 4 | |
36 | + env->xmm_regs[i].XMM_L(0) = ldl(addr); | |
37 | + env->xmm_regs[i].XMM_L(1) = ldl(addr + 4); | |
38 | + env->xmm_regs[i].XMM_L(2) = ldl(addr + 8); | |
39 | + env->xmm_regs[i].XMM_L(3) = ldl(addr + 12); | |
40 | +#else | |
41 | env->xmm_regs[i].XMM_Q(0) = ldq(addr); | |
42 | env->xmm_regs[i].XMM_Q(1) = ldq(addr + 8); | |
43 | +#endif | |
44 | addr += 16; | |
45 | } | |
46 | } | |
47 | --- qemu-0.7.2/cpu-all.h.gcc4-hacks 2005-09-04 19:11:31.000000000 +0200 | |
48 | +++ qemu-0.7.2/cpu-all.h 2005-10-28 10:09:21.000000000 +0200 | |
49 | @@ -339,7 +339,13 @@ | |
50 | ||
51 | static inline void stq_le_p(void *ptr, uint64_t v) | |
52 | { | |
53 | +#if defined(__i386__) && __GNUC__ >= 4 | |
54 | + const union { uint64_t v; uint32_t p[2]; } x = { .v = v }; | |
55 | + ((uint32_t *)ptr)[0] = x.p[0]; | |
56 | + ((uint32_t *)ptr)[1] = x.p[1]; | |
57 | +#else | |
58 | *(uint64_t *)ptr = v; | |
59 | +#endif | |
60 | } | |
61 | ||
62 | /* float access */ | |
63 | --- qemu-0.7.2/softmmu_header.h.gcc4-hacks 2005-10-28 10:08:08.000000000 +0200 | |
64 | +++ qemu-0.7.2/softmmu_header.h 2005-10-28 10:09:21.000000000 +0200 | |
65 | @@ -104,7 +104,7 @@ | |
66 | void REGPARM(2) glue(glue(__st, SUFFIX), MMUSUFFIX)(target_ulong addr, DATA_TYPE v, int is_user); | |
67 | ||
68 | #if (DATA_SIZE <= 4) && (TARGET_LONG_BITS == 32) && defined(__i386__) && \ | |
69 | - (ACCESS_TYPE <= 1) && defined(ASM_SOFTMMU) | |
70 | + (ACCESS_TYPE <= 1) && defined(ASM_SOFTMMU) && (__GNUC__ < 4) | |
71 | ||
72 | #define CPU_TLB_ENTRY_BITS 4 | |
73 | ||
74 | @@ -131,7 +131,7 @@ static inline RES_TYPE glue(glue(ld, USU | |
75 | "m" (*(uint32_t *)offsetof(CPUState, tlb_read[CPU_MEM_INDEX][0].address)), | |
76 | "i" (CPU_MEM_INDEX), | |
77 | "m" (*(uint8_t *)&glue(glue(__ld, SUFFIX), MMUSUFFIX)) | |
78 | - : "%eax", "%ecx", "%edx", "memory", "cc"); | |
79 | + : "%eax", "%edx", "memory", "cc"); | |
80 | return res; | |
81 | } | |
82 | ||
83 | @@ -178,13 +178,14 @@ static inline int glue(glue(lds, SUFFIX) | |
84 | "m" (*(uint32_t *)offsetof(CPUState, tlb_read[CPU_MEM_INDEX][0].address)), | |
85 | "i" (CPU_MEM_INDEX), | |
86 | "m" (*(uint8_t *)&glue(glue(__ld, SUFFIX), MMUSUFFIX)) | |
87 | - : "%eax", "%ecx", "%edx", "memory", "cc"); | |
88 | + : "%eax", "%edx", "memory", "cc"); | |
89 | return res; | |
90 | } | |
91 | #endif | |
92 | ||
93 | -static inline void glue(glue(st, SUFFIX), MEMSUFFIX)(target_ulong ptr, RES_TYPE v) | |
94 | +static inline void glue(glue(st, SUFFIX), MEMSUFFIX)(target_ulong ptr, RES_TYPE val) | |
95 | { | |
96 | + RES_TYPE v = val; | |
97 | asm volatile ("movl %0, %%edx\n" | |
98 | "movl %0, %%eax\n" | |
99 | "shrl %3, %%edx\n" | |
100 | @@ -236,16 +237,14 @@ | |
101 | "2:\n" | |
102 | : | |
103 | : "r" (ptr), | |
104 | -/* NOTE: 'q' would be needed as constraint, but we could not use it | |
105 | - with T1 ! */ | |
106 | - "r" (v), | |
107 | + "q" (v), | |
108 | "i" ((CPU_TLB_SIZE - 1) << CPU_TLB_ENTRY_BITS), | |
109 | "i" (TARGET_PAGE_BITS - CPU_TLB_ENTRY_BITS), | |
110 | "i" (TARGET_PAGE_MASK | (DATA_SIZE - 1)), | |
111 | "m" (*(uint32_t *)offsetof(CPUState, tlb_table[CPU_MEM_INDEX][0].addr_write)), | |
112 | "i" (CPU_MEM_INDEX), | |
113 | "m" (*(uint8_t *)&glue(glue(__st, SUFFIX), MMUSUFFIX)) | |
114 | - : "%eax", "%ecx", "%edx", "memory", "cc"); | |
115 | + : "%eax", "%edx", "memory", "cc"); | |
116 | } | |
117 | ||
118 | /* TODO: handle 64-bit access sizes and addresses */ |