Link Here
|
75 |
void REGPARM(2) glue(glue(__st, SUFFIX), MMUSUFFIX)(target_ulong addr, DATA_TYPE v, int mmu_idx); |
75 |
void REGPARM(2) glue(glue(__st, SUFFIX), MMUSUFFIX)(target_ulong addr, DATA_TYPE v, int mmu_idx); |
76 |
|
76 |
|
77 |
#if (DATA_SIZE <= 4) && (TARGET_LONG_BITS == 32) && defined(__i386__) && \ |
77 |
#if (DATA_SIZE <= 4) && (TARGET_LONG_BITS == 32) && defined(__i386__) && \ |
78 |
(ACCESS_TYPE < NB_MMU_MODES) && defined(ASM_SOFTMMU) |
78 |
(ACCESS_TYPE < NB_MMU_MODES) && defined(ASM_SOFTMMU) && (__GNUC__ < 4) |
79 |
|
79 |
|
80 |
#define CPU_TLB_ENTRY_BITS 4 |
80 |
#define CPU_TLB_ENTRY_BITS 4 |
81 |
|
81 |
|
Link Here
|
117 |
"m" (*(uint32_t *)offsetof(CPUState, tlb_table[CPU_MMU_INDEX][0].addr_read)), |
117 |
"m" (*(uint32_t *)offsetof(CPUState, tlb_table[CPU_MMU_INDEX][0].addr_read)), |
118 |
"i" (CPU_MMU_INDEX), |
118 |
"i" (CPU_MMU_INDEX), |
119 |
"m" (*(uint8_t *)&glue(glue(__ld, SUFFIX), MMUSUFFIX)) |
119 |
"m" (*(uint8_t *)&glue(glue(__ld, SUFFIX), MMUSUFFIX)) |
120 |
: "%eax", "%ecx", "%edx", "memory", "cc"); |
120 |
: "%eax", "%edx", "memory", "cc"); |
121 |
return res; |
121 |
return res; |
122 |
} |
122 |
} |
123 |
|
123 |
|
Link Here
|
164 |
"m" (*(uint32_t *)offsetof(CPUState, tlb_table[CPU_MMU_INDEX][0].addr_read)), |
164 |
"m" (*(uint32_t *)offsetof(CPUState, tlb_table[CPU_MMU_INDEX][0].addr_read)), |
165 |
"i" (CPU_MMU_INDEX), |
165 |
"i" (CPU_MMU_INDEX), |
166 |
"m" (*(uint8_t *)&glue(glue(__ld, SUFFIX), MMUSUFFIX)) |
166 |
"m" (*(uint8_t *)&glue(glue(__ld, SUFFIX), MMUSUFFIX)) |
167 |
: "%eax", "%ecx", "%edx", "memory", "cc"); |
167 |
: "%eax", "%edx", "memory", "cc"); |
168 |
return res; |
168 |
return res; |
169 |
} |
169 |
} |
170 |
#endif |
170 |
#endif |
171 |
|
171 |
|
172 |
static inline void glue(glue(st, SUFFIX), MEMSUFFIX)(target_ulong ptr, RES_TYPE v) |
172 |
static inline void glue(glue(st, SUFFIX), MEMSUFFIX)(target_ulong ptr, RES_TYPE val) |
173 |
{ |
173 |
{ |
|
|
174 |
RES_TYPE v = val; |
174 |
asm volatile ("movl %0, %%edx\n" |
175 |
asm volatile ("movl %0, %%edx\n" |
175 |
"movl %0, %%eax\n" |
176 |
"movl %0, %%eax\n" |
176 |
"shrl %3, %%edx\n" |
177 |
"shrl %3, %%edx\n" |
Link Here
|
207 |
"2:\n" |
208 |
"2:\n" |
208 |
: |
209 |
: |
209 |
: "r" (ptr), |
210 |
: "r" (ptr), |
210 |
/* NOTE: 'q' would be needed as constraint, but we could not use it |
211 |
"q" (v), |
211 |
with T1 ! */ |
|
|
212 |
"r" (v), |
213 |
"i" ((CPU_TLB_SIZE - 1) << CPU_TLB_ENTRY_BITS), |
212 |
"i" ((CPU_TLB_SIZE - 1) << CPU_TLB_ENTRY_BITS), |
214 |
"i" (TARGET_PAGE_BITS - CPU_TLB_ENTRY_BITS), |
213 |
"i" (TARGET_PAGE_BITS - CPU_TLB_ENTRY_BITS), |
215 |
"i" (TARGET_PAGE_MASK | (DATA_SIZE - 1)), |
214 |
"i" (TARGET_PAGE_MASK | (DATA_SIZE - 1)), |
216 |
"m" (*(uint32_t *)offsetof(CPUState, tlb_table[CPU_MMU_INDEX][0].addr_write)), |
215 |
"m" (*(uint32_t *)offsetof(CPUState, tlb_table[CPU_MMU_INDEX][0].addr_write)), |
217 |
"i" (CPU_MMU_INDEX), |
216 |
"i" (CPU_MMU_INDEX), |
218 |
"m" (*(uint8_t *)&glue(glue(__st, SUFFIX), MMUSUFFIX)) |
217 |
"m" (*(uint8_t *)&glue(glue(__st, SUFFIX), MMUSUFFIX)) |
219 |
: "%eax", "%ecx", "%edx", "memory", "cc"); |
218 |
: "%eax", "%edx", "memory", "cc"); |
220 |
} |
219 |
} |
221 |
|
220 |
|
222 |
#else |
221 |
#else |