Commit 5578ceab945bd2181d220ab17462c26014f29cae

Authored by blueswir1
1 parent 1a7de94a

Use initial CPU definition structure for some CPU fields instead of copying

them around, based on patch by Luis Pureza.


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@5042 c046a42c-6fe2-441c-8c8c-71466251a162
target-sparc/cpu.h
@@ -187,6 +187,54 @@ typedef struct trap_state { @@ -187,6 +187,54 @@ typedef struct trap_state {
187 } trap_state; 187 } trap_state;
188 #endif 188 #endif
189 189
  190 +typedef struct sparc_def_t {
  191 + const char *name;
  192 + target_ulong iu_version;
  193 + uint32_t fpu_version;
  194 + uint32_t mmu_version;
  195 + uint32_t mmu_bm;
  196 + uint32_t mmu_ctpr_mask;
  197 + uint32_t mmu_cxr_mask;
  198 + uint32_t mmu_sfsr_mask;
  199 + uint32_t mmu_trcr_mask;
  200 + uint32_t features;
  201 + uint32_t nwindows;
  202 + uint32_t maxtl;
  203 +} sparc_def_t;
  204 +
  205 +#define CPU_FEATURE_FLOAT (1 << 0)
  206 +#define CPU_FEATURE_FLOAT128 (1 << 1)
  207 +#define CPU_FEATURE_SWAP (1 << 2)
  208 +#define CPU_FEATURE_MUL (1 << 3)
  209 +#define CPU_FEATURE_DIV (1 << 4)
  210 +#define CPU_FEATURE_FLUSH (1 << 5)
  211 +#define CPU_FEATURE_FSQRT (1 << 6)
  212 +#define CPU_FEATURE_FMUL (1 << 7)
  213 +#define CPU_FEATURE_VIS1 (1 << 8)
  214 +#define CPU_FEATURE_VIS2 (1 << 9)
  215 +#define CPU_FEATURE_FSMULD (1 << 10)
  216 +#define CPU_FEATURE_HYPV (1 << 11)
  217 +#define CPU_FEATURE_CMT (1 << 12)
  218 +#define CPU_FEATURE_GL (1 << 13)
  219 +#ifndef TARGET_SPARC64
  220 +#define CPU_DEFAULT_FEATURES (CPU_FEATURE_FLOAT | CPU_FEATURE_SWAP | \
  221 + CPU_FEATURE_MUL | CPU_FEATURE_DIV | \
  222 + CPU_FEATURE_FLUSH | CPU_FEATURE_FSQRT | \
  223 + CPU_FEATURE_FMUL | CPU_FEATURE_FSMULD)
  224 +#else
  225 +#define CPU_DEFAULT_FEATURES (CPU_FEATURE_FLOAT | CPU_FEATURE_SWAP | \
  226 + CPU_FEATURE_MUL | CPU_FEATURE_DIV | \
  227 + CPU_FEATURE_FLUSH | CPU_FEATURE_FSQRT | \
  228 + CPU_FEATURE_FMUL | CPU_FEATURE_VIS1 | \
  229 + CPU_FEATURE_VIS2 | CPU_FEATURE_FSMULD)
  230 +enum {
  231 + mmu_us_12, // Ultrasparc < III (64 entry TLB)
  232 + mmu_us_3, // Ultrasparc III (512 entry TLB)
  233 + mmu_us_4, // Ultrasparc IV (several TLBs, 32 and 256MB pages)
  234 + mmu_sun4v, // T1, T2
  235 +};
  236 +#endif
  237 +
190 typedef struct CPUSPARCState { 238 typedef struct CPUSPARCState {
191 target_ulong gregs[8]; /* general registers */ 239 target_ulong gregs[8]; /* general registers */
192 target_ulong *regwptr; /* pointer to current register window */ 240 target_ulong *regwptr; /* pointer to current register window */
@@ -217,11 +265,6 @@ typedef struct CPUSPARCState { @@ -217,11 +265,6 @@ typedef struct CPUSPARCState {
217 int psref; /* enable fpu */ 265 int psref; /* enable fpu */
218 target_ulong version; 266 target_ulong version;
219 int interrupt_index; 267 int interrupt_index;
220 - uint32_t mmu_bm;  
221 - uint32_t mmu_ctpr_mask;  
222 - uint32_t mmu_cxr_mask;  
223 - uint32_t mmu_sfsr_mask;  
224 - uint32_t mmu_trcr_mask;  
225 uint32_t nwindows; 268 uint32_t nwindows;
226 /* NOTE: we allow 8 more registers to handle wrapping */ 269 /* NOTE: we allow 8 more registers to handle wrapping */
227 target_ulong regbase[MAX_NWINDOWS * 16 + 8]; 270 target_ulong regbase[MAX_NWINDOWS * 16 + 8];
@@ -275,42 +318,9 @@ typedef struct CPUSPARCState { @@ -275,42 +318,9 @@ typedef struct CPUSPARCState {
275 uint64_t hpstate, htstate[MAXTL_MAX], hintp, htba, hver, hstick_cmpr, ssr; 318 uint64_t hpstate, htstate[MAXTL_MAX], hintp, htba, hver, hstick_cmpr, ssr;
276 void *hstick; // UA 2005 319 void *hstick; // UA 2005
277 #endif 320 #endif
278 - uint32_t features; 321 + sparc_def_t *def;
279 } CPUSPARCState; 322 } CPUSPARCState;
280 323
281 -#define CPU_FEATURE_FLOAT (1 << 0)  
282 -#define CPU_FEATURE_FLOAT128 (1 << 1)  
283 -#define CPU_FEATURE_SWAP (1 << 2)  
284 -#define CPU_FEATURE_MUL (1 << 3)  
285 -#define CPU_FEATURE_DIV (1 << 4)  
286 -#define CPU_FEATURE_FLUSH (1 << 5)  
287 -#define CPU_FEATURE_FSQRT (1 << 6)  
288 -#define CPU_FEATURE_FMUL (1 << 7)  
289 -#define CPU_FEATURE_VIS1 (1 << 8)  
290 -#define CPU_FEATURE_VIS2 (1 << 9)  
291 -#define CPU_FEATURE_FSMULD (1 << 10)  
292 -#define CPU_FEATURE_HYPV (1 << 11)  
293 -#define CPU_FEATURE_CMT (1 << 12)  
294 -#define CPU_FEATURE_GL (1 << 13)  
295 -#ifndef TARGET_SPARC64  
296 -#define CPU_DEFAULT_FEATURES (CPU_FEATURE_FLOAT | CPU_FEATURE_SWAP | \  
297 - CPU_FEATURE_MUL | CPU_FEATURE_DIV | \  
298 - CPU_FEATURE_FLUSH | CPU_FEATURE_FSQRT | \  
299 - CPU_FEATURE_FMUL | CPU_FEATURE_FSMULD)  
300 -#else  
301 -#define CPU_DEFAULT_FEATURES (CPU_FEATURE_FLOAT | CPU_FEATURE_SWAP | \  
302 - CPU_FEATURE_MUL | CPU_FEATURE_DIV | \  
303 - CPU_FEATURE_FLUSH | CPU_FEATURE_FSQRT | \  
304 - CPU_FEATURE_FMUL | CPU_FEATURE_VIS1 | \  
305 - CPU_FEATURE_VIS2 | CPU_FEATURE_FSMULD)  
306 -enum {  
307 - mmu_us_12, // Ultrasparc < III (64 entry TLB)  
308 - mmu_us_3, // Ultrasparc III (512 entry TLB)  
309 - mmu_us_4, // Ultrasparc IV (several TLBs, 32 and 256MB pages)  
310 - mmu_sun4v, // T1, T2  
311 -};  
312 -#endif  
313 -  
314 #if defined(TARGET_SPARC64) 324 #if defined(TARGET_SPARC64)
315 #define GET_FSR32(env) (env->fsr & 0xcfc1ffff) 325 #define GET_FSR32(env) (env->fsr & 0xcfc1ffff)
316 #define PUT_FSR32(env, val) do { uint32_t _tmp = val; \ 326 #define PUT_FSR32(env, val) do { uint32_t _tmp = val; \
target-sparc/helper.c
@@ -34,23 +34,6 @@ @@ -34,23 +34,6 @@
34 //#define DEBUG_FEATURES 34 //#define DEBUG_FEATURES
35 //#define DEBUG_PCALL 35 //#define DEBUG_PCALL
36 36
37 -typedef struct sparc_def_t sparc_def_t;  
38 -  
39 -struct sparc_def_t {  
40 - const char *name;  
41 - target_ulong iu_version;  
42 - uint32_t fpu_version;  
43 - uint32_t mmu_version;  
44 - uint32_t mmu_bm;  
45 - uint32_t mmu_ctpr_mask;  
46 - uint32_t mmu_cxr_mask;  
47 - uint32_t mmu_sfsr_mask;  
48 - uint32_t mmu_trcr_mask;  
49 - uint32_t features;  
50 - uint32_t nwindows;  
51 - uint32_t maxtl;  
52 -};  
53 -  
54 static int cpu_sparc_find_by_name(sparc_def_t *cpu_def, const char *cpu_model); 37 static int cpu_sparc_find_by_name(sparc_def_t *cpu_def, const char *cpu_model);
55 38
56 /* Sparc MMU emulation */ 39 /* Sparc MMU emulation */
@@ -137,7 +120,7 @@ static int get_physical_address(CPUState *env, target_phys_addr_t *physical, @@ -137,7 +120,7 @@ static int get_physical_address(CPUState *env, target_phys_addr_t *physical,
137 120
138 if ((env->mmuregs[0] & MMU_E) == 0) { /* MMU disabled */ 121 if ((env->mmuregs[0] & MMU_E) == 0) { /* MMU disabled */
139 // Boot mode: instruction fetches are taken from PROM 122 // Boot mode: instruction fetches are taken from PROM
140 - if (rw == 2 && (env->mmuregs[0] & env->mmu_bm)) { 123 + if (rw == 2 && (env->mmuregs[0] & env->def->mmu_bm)) {
141 *physical = env->prom_addr | (address & 0x7ffffULL); 124 *physical = env->prom_addr | (address & 0x7ffffULL);
142 *prot = PAGE_READ | PAGE_EXEC; 125 *prot = PAGE_READ | PAGE_EXEC;
143 return 0; 126 return 0;
@@ -759,7 +742,7 @@ void do_interrupt(CPUState *env) @@ -759,7 +742,7 @@ void do_interrupt(CPUState *env)
759 env->tsptr->tpc = env->pc; 742 env->tsptr->tpc = env->pc;
760 env->tsptr->tnpc = env->npc; 743 env->tsptr->tnpc = env->npc;
761 env->tsptr->tt = intno; 744 env->tsptr->tt = intno;
762 - if (!(env->features & CPU_FEATURE_GL)) { 745 + if (!(env->def->features & CPU_FEATURE_GL)) {
763 switch (intno) { 746 switch (intno) {
764 case TT_IVEC: 747 case TT_IVEC:
765 change_pstate(PS_PEF | PS_PRIV | PS_IG); 748 change_pstate(PS_PEF | PS_PRIV | PS_IG);
@@ -923,7 +906,7 @@ void cpu_reset(CPUSPARCState *env) @@ -923,7 +906,7 @@ void cpu_reset(CPUSPARCState *env)
923 #else 906 #else
924 env->pc = 0; 907 env->pc = 0;
925 env->mmuregs[0] &= ~(MMU_E | MMU_NF); 908 env->mmuregs[0] &= ~(MMU_E | MMU_NF);
926 - env->mmuregs[0] |= env->mmu_bm; 909 + env->mmuregs[0] |= env->def->mmu_bm;
927 #endif 910 #endif
928 env->npc = env->pc + 4; 911 env->npc = env->pc + 4;
929 #endif 912 #endif
@@ -936,17 +919,17 @@ static int cpu_sparc_register(CPUSPARCState *env, const char *cpu_model) @@ -936,17 +919,17 @@ static int cpu_sparc_register(CPUSPARCState *env, const char *cpu_model)
936 if (cpu_sparc_find_by_name(def, cpu_model) < 0) 919 if (cpu_sparc_find_by_name(def, cpu_model) < 0)
937 return -1; 920 return -1;
938 921
939 - env->features = def->features; 922 + env->def = qemu_mallocz(sizeof(*def));
  923 + memcpy(env->def, def, sizeof(*def));
  924 +#if defined(CONFIG_USER_ONLY)
  925 + if ((env->def->features & CPU_FEATURE_FLOAT))
  926 + env->def->features |= CPU_FEATURE_FLOAT128;
  927 +#endif
940 env->cpu_model_str = cpu_model; 928 env->cpu_model_str = cpu_model;
941 env->version = def->iu_version; 929 env->version = def->iu_version;
942 env->fsr = def->fpu_version; 930 env->fsr = def->fpu_version;
943 env->nwindows = def->nwindows; 931 env->nwindows = def->nwindows;
944 #if !defined(TARGET_SPARC64) 932 #if !defined(TARGET_SPARC64)
945 - env->mmu_bm = def->mmu_bm;  
946 - env->mmu_ctpr_mask = def->mmu_ctpr_mask;  
947 - env->mmu_cxr_mask = def->mmu_cxr_mask;  
948 - env->mmu_sfsr_mask = def->mmu_sfsr_mask;  
949 - env->mmu_trcr_mask = def->mmu_trcr_mask;  
950 env->mmuregs[0] |= def->mmu_version; 933 env->mmuregs[0] |= def->mmu_version;
951 cpu_sparc_set_id(env, 0); 934 cpu_sparc_set_id(env, 0);
952 #else 935 #else
@@ -960,6 +943,7 @@ static int cpu_sparc_register(CPUSPARCState *env, const char *cpu_model) @@ -960,6 +943,7 @@ static int cpu_sparc_register(CPUSPARCState *env, const char *cpu_model)
960 943
961 static void cpu_sparc_close(CPUSPARCState *env) 944 static void cpu_sparc_close(CPUSPARCState *env)
962 { 945 {
  946 + free(env->def);
963 free(env); 947 free(env);
964 } 948 }
965 949
target-sparc/op_helper.c
@@ -1203,15 +1203,15 @@ void helper_st_asi(target_ulong addr, uint64_t val, int asi, int size) @@ -1203,15 +1203,15 @@ void helper_st_asi(target_ulong addr, uint64_t val, int asi, int size)
1203 (val & 0x00ffffff); 1203 (val & 0x00ffffff);
1204 // Mappings generated during no-fault mode or MMU 1204 // Mappings generated during no-fault mode or MMU
1205 // disabled mode are invalid in normal mode 1205 // disabled mode are invalid in normal mode
1206 - if ((oldreg & (MMU_E | MMU_NF | env->mmu_bm)) !=  
1207 - (env->mmuregs[reg] & (MMU_E | MMU_NF | env->mmu_bm))) 1206 + if ((oldreg & (MMU_E | MMU_NF | env->def->mmu_bm)) !=
  1207 + (env->mmuregs[reg] & (MMU_E | MMU_NF | env->def->mmu_bm)))
1208 tlb_flush(env, 1); 1208 tlb_flush(env, 1);
1209 break; 1209 break;
1210 case 1: // Context Table Pointer Register 1210 case 1: // Context Table Pointer Register
1211 - env->mmuregs[reg] = val & env->mmu_ctpr_mask; 1211 + env->mmuregs[reg] = val & env->def->mmu_ctpr_mask;
1212 break; 1212 break;
1213 case 2: // Context Register 1213 case 2: // Context Register
1214 - env->mmuregs[reg] = val & env->mmu_cxr_mask; 1214 + env->mmuregs[reg] = val & env->def->mmu_cxr_mask;
1215 if (oldreg != env->mmuregs[reg]) { 1215 if (oldreg != env->mmuregs[reg]) {
1216 /* we flush when the MMU context changes because 1216 /* we flush when the MMU context changes because
1217 QEMU has no MMU context support */ 1217 QEMU has no MMU context support */
@@ -1222,10 +1222,10 @@ void helper_st_asi(target_ulong addr, uint64_t val, int asi, int size) @@ -1222,10 +1222,10 @@ void helper_st_asi(target_ulong addr, uint64_t val, int asi, int size)
1222 case 4: // Synchronous Fault Address Register 1222 case 4: // Synchronous Fault Address Register
1223 break; 1223 break;
1224 case 0x10: // TLB Replacement Control Register 1224 case 0x10: // TLB Replacement Control Register
1225 - env->mmuregs[reg] = val & env->mmu_trcr_mask; 1225 + env->mmuregs[reg] = val & env->def->mmu_trcr_mask;
1226 break; 1226 break;
1227 case 0x13: // Synchronous Fault Status Register with Read and Clear 1227 case 0x13: // Synchronous Fault Status Register with Read and Clear
1228 - env->mmuregs[3] = val & env->mmu_sfsr_mask; 1228 + env->mmuregs[3] = val & env->def->mmu_sfsr_mask;
1229 break; 1229 break;
1230 case 0x14: // Synchronous Fault Address Register 1230 case 0x14: // Synchronous Fault Address Register
1231 env->mmuregs[4] = val; 1231 env->mmuregs[4] = val;
@@ -1552,7 +1552,8 @@ uint64_t helper_ld_asi(target_ulong addr, int asi, int size, int sign) @@ -1552,7 +1552,8 @@ uint64_t helper_ld_asi(target_ulong addr, int asi, int size, int sign)
1552 #endif 1552 #endif
1553 1553
1554 if ((asi < 0x80 && (env->pstate & PS_PRIV) == 0) 1554 if ((asi < 0x80 && (env->pstate & PS_PRIV) == 0)
1555 - || ((env->features & CPU_FEATURE_HYPV) && asi >= 0x30 && asi < 0x80 1555 + || ((env->def->features & CPU_FEATURE_HYPV)
  1556 + && asi >= 0x30 && asi < 0x80
1556 && !(env->hpstate & HS_PRIV))) 1557 && !(env->hpstate & HS_PRIV)))
1557 raise_exception(TT_PRIV_ACT); 1558 raise_exception(TT_PRIV_ACT);
1558 1559
@@ -1565,7 +1566,8 @@ uint64_t helper_ld_asi(target_ulong addr, int asi, int size, int sign) @@ -1565,7 +1566,8 @@ uint64_t helper_ld_asi(target_ulong addr, int asi, int size, int sign)
1565 case 0x88: // Primary LE 1566 case 0x88: // Primary LE
1566 case 0x8a: // Primary no-fault LE 1567 case 0x8a: // Primary no-fault LE
1567 if ((asi & 0x80) && (env->pstate & PS_PRIV)) { 1568 if ((asi & 0x80) && (env->pstate & PS_PRIV)) {
1568 - if ((env->features & CPU_FEATURE_HYPV) && env->hpstate & HS_PRIV) { 1569 + if ((env->def->features & CPU_FEATURE_HYPV)
  1570 + && env->hpstate & HS_PRIV) {
1569 switch(size) { 1571 switch(size) {
1570 case 1: 1572 case 1:
1571 ret = ldub_hypv(addr); 1573 ret = ldub_hypv(addr);
@@ -1791,7 +1793,8 @@ void helper_st_asi(target_ulong addr, target_ulong val, int asi, int size) @@ -1791,7 +1793,8 @@ void helper_st_asi(target_ulong addr, target_ulong val, int asi, int size)
1791 dump_asi("write", addr, asi, size, val); 1793 dump_asi("write", addr, asi, size, val);
1792 #endif 1794 #endif
1793 if ((asi < 0x80 && (env->pstate & PS_PRIV) == 0) 1795 if ((asi < 0x80 && (env->pstate & PS_PRIV) == 0)
1794 - || ((env->features & CPU_FEATURE_HYPV) && asi >= 0x30 && asi < 0x80 1796 + || ((env->def->features & CPU_FEATURE_HYPV)
  1797 + && asi >= 0x30 && asi < 0x80
1795 && !(env->hpstate & HS_PRIV))) 1798 && !(env->hpstate & HS_PRIV)))
1796 raise_exception(TT_PRIV_ACT); 1799 raise_exception(TT_PRIV_ACT);
1797 1800
@@ -1828,7 +1831,8 @@ void helper_st_asi(target_ulong addr, target_ulong val, int asi, int size) @@ -1828,7 +1831,8 @@ void helper_st_asi(target_ulong addr, target_ulong val, int asi, int size)
1828 case 0x80: // Primary 1831 case 0x80: // Primary
1829 case 0x88: // Primary LE 1832 case 0x88: // Primary LE
1830 if ((asi & 0x80) && (env->pstate & PS_PRIV)) { 1833 if ((asi & 0x80) && (env->pstate & PS_PRIV)) {
1831 - if ((env->features & CPU_FEATURE_HYPV) && env->hpstate & HS_PRIV) { 1834 + if ((env->def->features & CPU_FEATURE_HYPV)
  1835 + && env->hpstate & HS_PRIV) {
1832 switch(size) { 1836 switch(size) {
1833 case 1: 1837 case 1:
1834 stb_hypv(addr, val); 1838 stb_hypv(addr, val);
@@ -2108,7 +2112,8 @@ void helper_st_asi(target_ulong addr, target_ulong val, int asi, int size) @@ -2108,7 +2112,8 @@ void helper_st_asi(target_ulong addr, target_ulong val, int asi, int size)
2108 void helper_ldda_asi(target_ulong addr, int asi, int rd) 2112 void helper_ldda_asi(target_ulong addr, int asi, int rd)
2109 { 2113 {
2110 if ((asi < 0x80 && (env->pstate & PS_PRIV) == 0) 2114 if ((asi < 0x80 && (env->pstate & PS_PRIV) == 0)
2111 - || ((env->features & CPU_FEATURE_HYPV) && asi >= 0x30 && asi < 0x80 2115 + || ((env->def->features & CPU_FEATURE_HYPV)
  2116 + && asi >= 0x30 && asi < 0x80
2112 && !(env->hpstate & HS_PRIV))) 2117 && !(env->hpstate & HS_PRIV)))
2113 raise_exception(TT_PRIV_ACT); 2118 raise_exception(TT_PRIV_ACT);
2114 2119
@@ -2682,7 +2687,7 @@ void change_pstate(uint64_t new_pstate) @@ -2682,7 +2687,7 @@ void change_pstate(uint64_t new_pstate)
2682 2687
2683 void helper_wrpstate(target_ulong new_state) 2688 void helper_wrpstate(target_ulong new_state)
2684 { 2689 {
2685 - if (!(env->features & CPU_FEATURE_GL)) 2690 + if (!(env->def->features & CPU_FEATURE_GL))
2686 change_pstate(new_state & 0xf3f); 2691 change_pstate(new_state & 0xf3f);
2687 } 2692 }
2688 2693
target-sparc/translate.c
@@ -59,7 +59,7 @@ typedef struct DisasContext { @@ -59,7 +59,7 @@ typedef struct DisasContext {
59 int fpu_enabled; 59 int fpu_enabled;
60 int address_mask_32bit; 60 int address_mask_32bit;
61 struct TranslationBlock *tb; 61 struct TranslationBlock *tb;
62 - uint32_t features; 62 + sparc_def_t *def;
63 } DisasContext; 63 } DisasContext;
64 64
65 // This function uses non-native bit order 65 // This function uses non-native bit order
@@ -1905,10 +1905,10 @@ static inline TCGv get_src2(unsigned int insn, TCGv def) @@ -1905,10 +1905,10 @@ static inline TCGv get_src2(unsigned int insn, TCGv def)
1905 } 1905 }
1906 1906
1907 #define CHECK_IU_FEATURE(dc, FEATURE) \ 1907 #define CHECK_IU_FEATURE(dc, FEATURE) \
1908 - if (!((dc)->features & CPU_FEATURE_ ## FEATURE)) \ 1908 + if (!((dc)->def->features & CPU_FEATURE_ ## FEATURE)) \
1909 goto illegal_insn; 1909 goto illegal_insn;
1910 #define CHECK_FPU_FEATURE(dc, FEATURE) \ 1910 #define CHECK_FPU_FEATURE(dc, FEATURE) \
1911 - if (!((dc)->features & CPU_FEATURE_ ## FEATURE)) \ 1911 + if (!((dc)->def->features & CPU_FEATURE_ ## FEATURE)) \
1912 goto nfpu_insn; 1912 goto nfpu_insn;
1913 1913
1914 /* before an instruction, dc->pc must be static */ 1914 /* before an instruction, dc->pc must be static */
@@ -4141,7 +4141,7 @@ static void disas_sparc_insn(DisasContext * dc) @@ -4141,7 +4141,7 @@ static void disas_sparc_insn(DisasContext * dc)
4141 goto jmp_insn; 4141 goto jmp_insn;
4142 #endif 4142 #endif
4143 case 0x3b: /* flush */ 4143 case 0x3b: /* flush */
4144 - if (!((dc)->features & CPU_FEATURE_FLUSH)) 4144 + if (!((dc)->def->features & CPU_FEATURE_FLUSH))
4145 goto unimp_flush; 4145 goto unimp_flush;
4146 tcg_gen_helper_0_1(helper_flush, cpu_dst); 4146 tcg_gen_helper_0_1(helper_flush, cpu_dst);
4147 break; 4147 break;
@@ -4742,13 +4742,10 @@ static inline void gen_intermediate_code_internal(TranslationBlock * tb, @@ -4742,13 +4742,10 @@ static inline void gen_intermediate_code_internal(TranslationBlock * tb,
4742 last_pc = dc->pc; 4742 last_pc = dc->pc;
4743 dc->npc = (target_ulong) tb->cs_base; 4743 dc->npc = (target_ulong) tb->cs_base;
4744 dc->mem_idx = cpu_mmu_index(env); 4744 dc->mem_idx = cpu_mmu_index(env);
4745 - dc->features = env->features;  
4746 - if ((dc->features & CPU_FEATURE_FLOAT)) { 4745 + dc->def = env->def;
  4746 + if ((dc->def->features & CPU_FEATURE_FLOAT))
4747 dc->fpu_enabled = cpu_fpu_enabled(env); 4747 dc->fpu_enabled = cpu_fpu_enabled(env);
4748 -#if defined(CONFIG_USER_ONLY)  
4749 - dc->features |= CPU_FEATURE_FLOAT128;  
4750 -#endif  
4751 - } else 4748 + else
4752 dc->fpu_enabled = 0; 4749 dc->fpu_enabled = 0;
4753 #ifdef TARGET_SPARC64 4750 #ifdef TARGET_SPARC64
4754 dc->address_mask_32bit = env->pstate & PS_AM; 4751 dc->address_mask_32bit = env->pstate & PS_AM;