translate.c (52123f14e14233a353f81f87506b3b8c7b38898c) | translate.c (36ab4623a894de80c413fa958a5fdb79dc50b1c2) |
---|---|
1/* 2 SPARC translation 3 4 Copyright (C) 2003 Thomas M. Ogrisegg <tom@fnord.at> 5 Copyright (C) 2003-2005 Fabrice Bellard 6 7 This library is free software; you can redistribute it and/or 8 modify it under the terms of the GNU Lesser General Public --- 70 unchanged lines hidden (view full) --- 79 bool supervisor; 80#ifdef TARGET_SPARC64 81 bool hypervisor; 82#endif 83#endif 84 85 uint32_t cc_op; /* current CC operation */ 86 sparc_def_t *def; | 1/* 2 SPARC translation 3 4 Copyright (C) 2003 Thomas M. Ogrisegg <tom@fnord.at> 5 Copyright (C) 2003-2005 Fabrice Bellard 6 7 This library is free software; you can redistribute it and/or 8 modify it under the terms of the GNU Lesser General Public --- 70 unchanged lines hidden (view full) --- 79 bool supervisor; 80#ifdef TARGET_SPARC64 81 bool hypervisor; 82#endif 83#endif 84 85 uint32_t cc_op; /* current CC operation */ 86 sparc_def_t *def; |
87 TCGv_i32 t32[3]; 88 int n_t32; | |
89#ifdef TARGET_SPARC64 90 int fprs_dirty; 91 int asi; 92#endif 93} DisasContext; 94 95typedef struct { 96 TCGCond cond; --- 27 unchanged lines hidden (view full) --- 124static int sign_extend(int x, int len) 125{ 126 len = 32 - len; 127 return (x << len) >> len; 128} 129 130#define IS_IMM (insn & (1<<13)) 131 | 87#ifdef TARGET_SPARC64 88 int fprs_dirty; 89 int asi; 90#endif 91} DisasContext; 92 93typedef struct { 94 TCGCond cond; --- 27 unchanged lines hidden (view full) --- 122static int sign_extend(int x, int len) 123{ 124 len = 32 - len; 125 return (x << len) >> len; 126} 127 128#define IS_IMM (insn & (1<<13)) 129 |
132static inline TCGv_i32 get_temp_i32(DisasContext *dc) 133{ 134 TCGv_i32 t; 135 assert(dc->n_t32 < ARRAY_SIZE(dc->t32)); 136 dc->t32[dc->n_t32++] = t = tcg_temp_new_i32(); 137 return t; 138} 139 | |
140static inline void gen_update_fprs_dirty(DisasContext *dc, int rd) 141{ 142#if defined(TARGET_SPARC64) 143 int bit = (rd < 32) ? 1 : 2; 144 /* If we know we've already set this bit within the TB, 145 we can avoid setting it again. */ 146 if (!(dc->fprs_dirty & bit)) { 147 dc->fprs_dirty |= bit; 148 tcg_gen_ori_i32(cpu_fprs, cpu_fprs, bit); 149 } 150#endif 151} 152 153/* floating point registers moves */ 154static TCGv_i32 gen_load_fpr_F(DisasContext *dc, unsigned int src) 155{ | 130static inline void gen_update_fprs_dirty(DisasContext *dc, int rd) 131{ 132#if defined(TARGET_SPARC64) 133 int bit = (rd < 32) ? 1 : 2; 134 /* If we know we've already set this bit within the TB, 135 we can avoid setting it again. */ 136 if (!(dc->fprs_dirty & bit)) { 137 dc->fprs_dirty |= bit; 138 tcg_gen_ori_i32(cpu_fprs, cpu_fprs, bit); 139 } 140#endif 141} 142 143/* floating point registers moves */ 144static TCGv_i32 gen_load_fpr_F(DisasContext *dc, unsigned int src) 145{ |
156 TCGv_i32 ret = get_temp_i32(dc); | 146 TCGv_i32 ret = tcg_temp_new_i32(); |
157 if (src & 1) { 158 tcg_gen_extrl_i64_i32(ret, cpu_fpr[src / 2]); 159 } else { 160 tcg_gen_extrh_i64_i32(ret, cpu_fpr[src / 2]); 161 } 162 return ret; 163} 164 --- 5 unchanged lines hidden (view full) --- 170 tcg_gen_deposit_i64(cpu_fpr[dst / 2], cpu_fpr[dst / 2], t, 171 (dst & 1 ? 0 : 32), 32); 172 tcg_temp_free_i64(t); 173 gen_update_fprs_dirty(dc, dst); 174} 175 176static TCGv_i32 gen_dest_fpr_F(DisasContext *dc) 177{ | 147 if (src & 1) { 148 tcg_gen_extrl_i64_i32(ret, cpu_fpr[src / 2]); 149 } else { 150 tcg_gen_extrh_i64_i32(ret, cpu_fpr[src / 2]); 151 } 152 return ret; 153} 154 --- 5 unchanged lines hidden (view full) --- 160 tcg_gen_deposit_i64(cpu_fpr[dst / 2], cpu_fpr[dst / 2], t, 161 (dst & 1 ? 0 : 32), 32); 162 tcg_temp_free_i64(t); 163 gen_update_fprs_dirty(dc, dst); 164} 165 166static TCGv_i32 gen_dest_fpr_F(DisasContext *dc) 167{ |
178 return get_temp_i32(dc); | 168 return tcg_temp_new_i32(); |
179} 180 181static TCGv_i64 gen_load_fpr_D(DisasContext *dc, unsigned int src) 182{ 183 src = DFPREG(src); 184 return cpu_fpr[src / 2]; 185} 186 --- 5324 unchanged lines hidden (view full) --- 5511 TCGv_i64 t64 = tcg_temp_new_i64(); 5512 tcg_gen_qemu_ld_i64(t64, cpu_addr, 5513 dc->mem_idx, MO_TEUQ); 5514 gen_helper_ldxfsr(cpu_fsr, cpu_env, cpu_fsr, t64); 5515 tcg_temp_free_i64(t64); 5516 break; 5517 } 5518#endif | 169} 170 171static TCGv_i64 gen_load_fpr_D(DisasContext *dc, unsigned int src) 172{ 173 src = DFPREG(src); 174 return cpu_fpr[src / 2]; 175} 176 --- 5324 unchanged lines hidden (view full) --- 5501 TCGv_i64 t64 = tcg_temp_new_i64(); 5502 tcg_gen_qemu_ld_i64(t64, cpu_addr, 5503 dc->mem_idx, MO_TEUQ); 5504 gen_helper_ldxfsr(cpu_fsr, cpu_env, cpu_fsr, t64); 5505 tcg_temp_free_i64(t64); 5506 break; 5507 } 5508#endif |
5519 cpu_dst_32 = get_temp_i32(dc); | 5509 cpu_dst_32 = tcg_temp_new_i32(); |
5520 tcg_gen_qemu_ld_i32(cpu_dst_32, cpu_addr, 5521 dc->mem_idx, MO_TEUL); 5522 gen_helper_ldfsr(cpu_fsr, cpu_env, cpu_fsr, cpu_dst_32); 5523 break; 5524 case 0x22: /* ldqf, load quad fpreg */ 5525 CHECK_FPU_FEATURE(dc, FLOAT128); 5526 gen_address_mask(dc, cpu_addr); 5527 cpu_src1_64 = tcg_temp_new_i64(); --- 230 unchanged lines hidden (view full) --- 5758 goto egress; 5759#endif 5760#ifndef TARGET_SPARC64 5761 ncp_insn: 5762 gen_exception(dc, TT_NCP_INSN); 5763 goto egress; 5764#endif 5765 egress: | 5510 tcg_gen_qemu_ld_i32(cpu_dst_32, cpu_addr, 5511 dc->mem_idx, MO_TEUL); 5512 gen_helper_ldfsr(cpu_fsr, cpu_env, cpu_fsr, cpu_dst_32); 5513 break; 5514 case 0x22: /* ldqf, load quad fpreg */ 5515 CHECK_FPU_FEATURE(dc, FLOAT128); 5516 gen_address_mask(dc, cpu_addr); 5517 cpu_src1_64 = tcg_temp_new_i64(); --- 230 unchanged lines hidden (view full) --- 5748 goto egress; 5749#endif 5750#ifndef TARGET_SPARC64 5751 ncp_insn: 5752 gen_exception(dc, TT_NCP_INSN); 5753 goto egress; 5754#endif 5755 egress: |
5766 if (dc->n_t32 != 0) { 5767 int i; 5768 for (i = dc->n_t32 - 1; i >= 0; --i) { 5769 tcg_temp_free_i32(dc->t32[i]); 5770 } 5771 dc->n_t32 = 0; 5772 } | |
5773} 5774 5775static void sparc_tr_init_disas_context(DisasContextBase *dcbase, CPUState *cs) 5776{ 5777 DisasContext *dc = container_of(dcbase, DisasContext, base); 5778 CPUSPARCState *env = cs->env_ptr; 5779 int bound; 5780 --- 226 unchanged lines hidden --- | 5756} 5757 5758static void sparc_tr_init_disas_context(DisasContextBase *dcbase, CPUState *cs) 5759{ 5760 DisasContext *dc = container_of(dcbase, DisasContext, base); 5761 CPUSPARCState *env = cs->env_ptr; 5762 int bound; 5763 --- 226 unchanged lines hidden --- |