]> git.pld-linux.org Git - packages/qemu.git/blob - qemu-0.8.0-gcc4-hacks.patch
- gcc 3.4 segfault for mips
[packages/qemu.git] / qemu-0.8.0-gcc4-hacks.patch
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 */
This page took 0.03145 seconds and 3 git commands to generate.