Commit dceaf394585191ced65ce6a478580ac1655510d7
1 parent
069de562
CRIS: More TCG conversion.
* Convert moves to/from support function regs (including TLB updates) to TCG. * SCC no longer requires T0 to strictly be 0 or 1, relaxed to 0 or non-zero. * Convert the the condition code evaluation to TCG. * Convert rfe into a helper and TCG. * Convert evaluate_bcc and setf to TCG. * Convert clrf to TCG. * Convert CRIS exception raising to TCG. * Convert btst to TCG. git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@4376 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
5 changed files
with
332 additions
and
103 deletions
target-cris/helper.h
| 1 | 1 | #define TCG_HELPER_PROTO |
| 2 | -void TCG_HELPER_PROTO helper_tlb_update(uint32_t T0); | |
| 2 | + | |
| 3 | +void TCG_HELPER_PROTO helper_raise_exception(uint32_t index); | |
| 3 | 4 | void TCG_HELPER_PROTO helper_tlb_flush(void); |
| 4 | 5 | void TCG_HELPER_PROTO helper_dump(uint32_t a0, uint32_t a1, uint32_t a2); |
| 5 | 6 | void TCG_HELPER_PROTO helper_dummy(void); |
| 6 | 7 | void TCG_HELPER_PROTO helper_rfe(void); |
| 7 | 8 | void TCG_HELPER_PROTO helper_store(uint32_t a0); |
| 8 | 9 | |
| 10 | +void TCG_HELPER_PROTO helper_movl_sreg_reg (uint32_t sreg, uint32_t reg); | |
| 11 | +void TCG_HELPER_PROTO helper_movl_reg_sreg (uint32_t reg, uint32_t sreg); | |
| 12 | + | |
| 9 | 13 | void TCG_HELPER_PROTO helper_evaluate_flags_muls(void); |
| 10 | 14 | void TCG_HELPER_PROTO helper_evaluate_flags_mulu(void); |
| 11 | 15 | void TCG_HELPER_PROTO helper_evaluate_flags_mcp(void); | ... | ... |
target-cris/mmu.c
| ... | ... | @@ -265,7 +265,7 @@ static int cris_mmu_translate_page(struct cris_mmu_result_t *res, |
| 265 | 265 | } |
| 266 | 266 | |
| 267 | 267 | /* Give us the vaddr corresponding to the latest TLB update. */ |
| 268 | -target_ulong cris_mmu_tlb_latest_update(CPUState *env, uint32_t new_lo) | |
| 268 | +target_ulong cris_mmu_tlb_latest_update(CPUState *env) | |
| 269 | 269 | { |
| 270 | 270 | uint32_t sel = env->sregs[SFR_RW_MM_TLB_SEL]; |
| 271 | 271 | uint32_t vaddr; | ... | ... |
target-cris/mmu.h
| ... | ... | @@ -11,7 +11,7 @@ struct cris_mmu_result_t |
| 11 | 11 | int bf_vec; |
| 12 | 12 | }; |
| 13 | 13 | |
| 14 | -target_ulong cris_mmu_tlb_latest_update(CPUState *env, uint32_t new_lo); | |
| 14 | +target_ulong cris_mmu_tlb_latest_update(CPUState *env); | |
| 15 | 15 | int cris_mmu_translate(struct cris_mmu_result_t *res, |
| 16 | 16 | CPUState *env, uint32_t vaddr, |
| 17 | 17 | int rw, int mmu_idx); | ... | ... |
target-cris/op_helper.c
| ... | ... | @@ -79,20 +79,10 @@ void tlb_fill (target_ulong addr, int is_write, int mmu_idx, void *retaddr) |
| 79 | 79 | env = saved_env; |
| 80 | 80 | } |
| 81 | 81 | |
| 82 | -void helper_tlb_update(uint32_t T0) | |
| 82 | +void helper_raise_exception(uint32_t index) | |
| 83 | 83 | { |
| 84 | -#if !defined(CONFIG_USER_ONLY) | |
| 85 | - uint32_t vaddr; | |
| 86 | - uint32_t srs = env->pregs[PR_SRS]; | |
| 87 | - | |
| 88 | - if (srs != 1 && srs != 2) | |
| 89 | - return; | |
| 90 | - | |
| 91 | - vaddr = cris_mmu_tlb_latest_update(env, T0); | |
| 92 | - D(fprintf(logfile, "flush old_vaddr=%x vaddr=%x T0=%x\n", vaddr, | |
| 93 | - env->sregs[SFR_R_MM_CAUSE] & TARGET_PAGE_MASK, T0)); | |
| 94 | - tlb_flush_page(env, vaddr); | |
| 95 | -#endif | |
| 84 | + env->exception_index = index; | |
| 85 | + cpu_loop_exit(); | |
| 96 | 86 | } |
| 97 | 87 | |
| 98 | 88 | void helper_tlb_flush(void) |
| ... | ... | @@ -110,13 +100,105 @@ void helper_dummy(void) |
| 110 | 100 | |
| 111 | 101 | } |
| 112 | 102 | |
| 113 | -/* Only used for debugging at the moment. */ | |
| 103 | +void helper_movl_sreg_reg (uint32_t sreg, uint32_t reg) | |
| 104 | +{ | |
| 105 | + uint32_t srs; | |
| 106 | + srs = env->pregs[PR_SRS]; | |
| 107 | + srs &= 3; | |
| 108 | + env->sregs[srs][sreg] = env->regs[reg]; | |
| 109 | + | |
| 110 | +#if !defined(CONFIG_USER_ONLY) | |
| 111 | + if (srs == 1 || srs == 2) { | |
| 112 | + if (sreg == 6) { | |
| 113 | + /* Writes to tlb-hi write to mm_cause as a side | |
| 114 | + effect. */ | |
| 115 | + env->sregs[SFR_RW_MM_TLB_HI] = T0; | |
| 116 | + env->sregs[SFR_R_MM_CAUSE] = T0; | |
| 117 | + } | |
| 118 | + else if (sreg == 5) { | |
| 119 | + uint32_t set; | |
| 120 | + uint32_t idx; | |
| 121 | + uint32_t lo, hi; | |
| 122 | + uint32_t vaddr; | |
| 123 | + | |
| 124 | + vaddr = cris_mmu_tlb_latest_update(env); | |
| 125 | + D(fprintf(logfile, "tlb flush vaddr=%x\n", vaddr)); | |
| 126 | + tlb_flush_page(env, vaddr); | |
| 127 | + | |
| 128 | + idx = set = env->sregs[SFR_RW_MM_TLB_SEL]; | |
| 129 | + set >>= 4; | |
| 130 | + set &= 3; | |
| 131 | + | |
| 132 | + idx &= 15; | |
| 133 | + /* We've just made a write to tlb_lo. */ | |
| 134 | + lo = env->sregs[SFR_RW_MM_TLB_LO]; | |
| 135 | + /* Writes are done via r_mm_cause. */ | |
| 136 | + hi = env->sregs[SFR_R_MM_CAUSE]; | |
| 137 | + env->tlbsets[srs - 1][set][idx].lo = lo; | |
| 138 | + env->tlbsets[srs - 1][set][idx].hi = hi; | |
| 139 | + } | |
| 140 | + } | |
| 141 | +#endif | |
| 142 | +} | |
| 143 | + | |
| 144 | +void helper_movl_reg_sreg (uint32_t reg, uint32_t sreg) | |
| 145 | +{ | |
| 146 | + uint32_t srs; | |
| 147 | + env->pregs[PR_SRS] &= 3; | |
| 148 | + srs = env->pregs[PR_SRS]; | |
| 149 | + | |
| 150 | +#if !defined(CONFIG_USER_ONLY) | |
| 151 | + if (srs == 1 || srs == 2) | |
| 152 | + { | |
| 153 | + uint32_t set; | |
| 154 | + uint32_t idx; | |
| 155 | + uint32_t lo, hi; | |
| 156 | + | |
| 157 | + idx = set = env->sregs[SFR_RW_MM_TLB_SEL]; | |
| 158 | + set >>= 4; | |
| 159 | + set &= 3; | |
| 160 | + idx &= 15; | |
| 161 | + | |
| 162 | + /* Update the mirror regs. */ | |
| 163 | + hi = env->tlbsets[srs - 1][set][idx].hi; | |
| 164 | + lo = env->tlbsets[srs - 1][set][idx].lo; | |
| 165 | + env->sregs[SFR_RW_MM_TLB_HI] = hi; | |
| 166 | + env->sregs[SFR_RW_MM_TLB_LO] = lo; | |
| 167 | + } | |
| 168 | +#endif | |
| 169 | + env->regs[reg] = env->sregs[srs][sreg]; | |
| 170 | + RETURN(); | |
| 171 | +} | |
| 172 | + | |
| 173 | +static void cris_ccs_rshift(CPUState *env) | |
| 174 | +{ | |
| 175 | + uint32_t ccs; | |
| 176 | + | |
| 177 | + /* Apply the ccs shift. */ | |
| 178 | + ccs = env->pregs[PR_CCS]; | |
| 179 | + ccs = (ccs & 0xc0000000) | ((ccs & 0x0fffffff) >> 10); | |
| 180 | + if (ccs & U_FLAG) | |
| 181 | + { | |
| 182 | + /* Enter user mode. */ | |
| 183 | + env->ksp = env->regs[R_SP]; | |
| 184 | + env->regs[R_SP] = env->pregs[PR_USP]; | |
| 185 | + } | |
| 186 | + | |
| 187 | + env->pregs[PR_CCS] = ccs; | |
| 188 | +} | |
| 189 | + | |
| 114 | 190 | void helper_rfe(void) |
| 115 | 191 | { |
| 116 | 192 | D(fprintf(logfile, "rfe: erp=%x pid=%x ccs=%x btarget=%x\n", |
| 117 | 193 | env->pregs[PR_ERP], env->pregs[PR_PID], |
| 118 | 194 | env->pregs[PR_CCS], |
| 119 | 195 | env->btarget)); |
| 196 | + | |
| 197 | + cris_ccs_rshift(env); | |
| 198 | + | |
| 199 | + /* RFE sets the P_FLAG only if the R_FLAG is not set. */ | |
| 200 | + if (!(env->pregs[PR_CCS] & R_FLAG)) | |
| 201 | + env->pregs[PR_CCS] |= P_FLAG; | |
| 120 | 202 | } |
| 121 | 203 | |
| 122 | 204 | void helper_store(uint32_t a0) |
| ... | ... | @@ -155,7 +237,6 @@ static void evaluate_flags_writeback(uint32_t flags) |
| 155 | 237 | env->pregs[PR_CCS] &= ~(env->cc_mask | X_FLAG); |
| 156 | 238 | flags &= env->cc_mask; |
| 157 | 239 | env->pregs[PR_CCS] |= flags; |
| 158 | - RETURN(); | |
| 159 | 240 | } |
| 160 | 241 | |
| 161 | 242 | void helper_evaluate_flags_muls(void) |
| ... | ... | @@ -164,8 +245,7 @@ void helper_evaluate_flags_muls(void) |
| 164 | 245 | uint32_t dst; |
| 165 | 246 | uint32_t res; |
| 166 | 247 | uint32_t flags = 0; |
| 167 | - /* were gonna have to redo the muls. */ | |
| 168 | - int64_t tmp, t0 ,t1; | |
| 248 | + int64_t tmp; | |
| 169 | 249 | int32_t mof; |
| 170 | 250 | int dneg; |
| 171 | 251 | |
| ... | ... | @@ -173,14 +253,12 @@ void helper_evaluate_flags_muls(void) |
| 173 | 253 | dst = env->cc_dest; |
| 174 | 254 | res = env->cc_result; |
| 175 | 255 | |
| 176 | - | |
| 177 | - /* cast into signed values to make GCC sign extend. */ | |
| 178 | - t0 = (int32_t)src; | |
| 179 | - t1 = (int32_t)dst; | |
| 180 | 256 | dneg = ((int32_t)res) < 0; |
| 181 | 257 | |
| 182 | - tmp = t0 * t1; | |
| 183 | - mof = tmp >> 32; | |
| 258 | + mof = env->pregs[PR_MOF]; | |
| 259 | + tmp = mof; | |
| 260 | + tmp <<= 32; | |
| 261 | + tmp |= res; | |
| 184 | 262 | if (tmp == 0) |
| 185 | 263 | flags |= Z_FLAG; |
| 186 | 264 | else if (tmp < 0) |
| ... | ... | @@ -197,21 +275,17 @@ void helper_evaluate_flags_mulu(void) |
| 197 | 275 | uint32_t dst; |
| 198 | 276 | uint32_t res; |
| 199 | 277 | uint32_t flags = 0; |
| 200 | - /* were gonna have to redo the muls. */ | |
| 201 | - uint64_t tmp, t0 ,t1; | |
| 278 | + uint64_t tmp; | |
| 202 | 279 | uint32_t mof; |
| 203 | 280 | |
| 204 | 281 | src = env->cc_src; |
| 205 | 282 | dst = env->cc_dest; |
| 206 | 283 | res = env->cc_result; |
| 207 | 284 | |
| 208 | - | |
| 209 | - /* cast into signed values to make GCC sign extend. */ | |
| 210 | - t0 = src; | |
| 211 | - t1 = dst; | |
| 212 | - | |
| 213 | - tmp = t0 * t1; | |
| 214 | - mof = tmp >> 32; | |
| 285 | + mof = env->pregs[PR_MOF]; | |
| 286 | + tmp = mof; | |
| 287 | + tmp <<= 32; | |
| 288 | + tmp |= res; | |
| 215 | 289 | if (tmp == 0) |
| 216 | 290 | flags |= Z_FLAG; |
| 217 | 291 | else if (tmp >> 63) | ... | ... |
target-cris/translate.c
| ... | ... | @@ -223,9 +223,9 @@ static inline void t_gen_mov_preg_TN(int r, TCGv tn) |
| 223 | 223 | } |
| 224 | 224 | } |
| 225 | 225 | |
| 226 | -static inline void t_gen_mov_TN_im(TCGv tn, int32_t val) | |
| 226 | +static inline void t_gen_raise_exception(uint32_t index) | |
| 227 | 227 | { |
| 228 | - tcg_gen_movi_tl(tn, val); | |
| 228 | + tcg_gen_helper_0_1(helper_raise_exception, tcg_const_tl(index)); | |
| 229 | 229 | } |
| 230 | 230 | |
| 231 | 231 | static void t_gen_lsl(TCGv d, TCGv a, TCGv b) |
| ... | ... | @@ -375,6 +375,62 @@ static void t_gen_lz_i32(TCGv d, TCGv x) |
| 375 | 375 | tcg_gen_discard_i32(n); |
| 376 | 376 | } |
| 377 | 377 | |
| 378 | +static void t_gen_btst(TCGv d, TCGv s) | |
| 379 | +{ | |
| 380 | + TCGv sbit; | |
| 381 | + TCGv bset; | |
| 382 | + int l1; | |
| 383 | + | |
| 384 | + /* des ref: | |
| 385 | + The N flag is set according to the selected bit in the dest reg. | |
| 386 | + The Z flag is set if the selected bit and all bits to the right are | |
| 387 | + zero. | |
| 388 | + The X flag is cleared. | |
| 389 | + Other flags are left untouched. | |
| 390 | + The destination reg is not affected. | |
| 391 | + | |
| 392 | + unsigned int fz, sbit, bset, mask, masked_t0; | |
| 393 | + | |
| 394 | + sbit = T1 & 31; | |
| 395 | + bset = !!(T0 & (1 << sbit)); | |
| 396 | + mask = sbit == 31 ? -1 : (1 << (sbit + 1)) - 1; | |
| 397 | + masked_t0 = T0 & mask; | |
| 398 | + fz = !(masked_t0 | bset); | |
| 399 | + | |
| 400 | + // Clear the X, N and Z flags. | |
| 401 | + T0 = env->pregs[PR_CCS] & ~(X_FLAG | N_FLAG | Z_FLAG); | |
| 402 | + // Set the N and Z flags accordingly. | |
| 403 | + T0 |= (bset << 3) | (fz << 2); | |
| 404 | + */ | |
| 405 | + | |
| 406 | + l1 = gen_new_label(); | |
| 407 | + sbit = tcg_temp_new(TCG_TYPE_TL); | |
| 408 | + bset = tcg_temp_new(TCG_TYPE_TL); | |
| 409 | + | |
| 410 | + /* Compute bset and sbit. */ | |
| 411 | + tcg_gen_andi_tl(sbit, s, 31); | |
| 412 | + tcg_gen_shl_tl(s, tcg_const_tl(1), sbit); | |
| 413 | + tcg_gen_and_tl(bset, d, s); | |
| 414 | + tcg_gen_shr_tl(bset, bset, sbit); | |
| 415 | + /* Displace to N_FLAG. */ | |
| 416 | + tcg_gen_shli_tl(bset, bset, 3); | |
| 417 | + | |
| 418 | + tcg_gen_shl_tl(sbit, tcg_const_tl(2), sbit); | |
| 419 | + tcg_gen_subi_tl(sbit, sbit, 1); | |
| 420 | + tcg_gen_and_tl(sbit, d, sbit); | |
| 421 | + | |
| 422 | + tcg_gen_andi_tl(d, cpu_PR[PR_CCS], ~(X_FLAG | N_FLAG | Z_FLAG)); | |
| 423 | + /* or in the N_FLAG. */ | |
| 424 | + tcg_gen_or_tl(d, d, bset); | |
| 425 | + tcg_gen_brcond_tl(TCG_COND_NE, sbit, tcg_const_tl(0), l1); | |
| 426 | + /* or in the Z_FLAG. */ | |
| 427 | + tcg_gen_ori_tl(d, d, Z_FLAG); | |
| 428 | + gen_set_label(l1); | |
| 429 | + | |
| 430 | + tcg_gen_discard_tl(sbit); | |
| 431 | + tcg_gen_discard_tl(bset); | |
| 432 | +} | |
| 433 | + | |
| 378 | 434 | static void t_gen_cris_dstep(TCGv d, TCGv s) |
| 379 | 435 | { |
| 380 | 436 | int l1; |
| ... | ... | @@ -738,7 +794,7 @@ static void crisv32_alu_op(DisasContext *dc, int op, int rd, int size) |
| 738 | 794 | t_gen_lz_i32(cpu_T[0], cpu_T[1]); |
| 739 | 795 | break; |
| 740 | 796 | case CC_OP_BTST: |
| 741 | - gen_op_btst_T0_T1(); | |
| 797 | + t_gen_btst(cpu_T[0], cpu_T[1]); | |
| 742 | 798 | writeback = 0; |
| 743 | 799 | break; |
| 744 | 800 | case CC_OP_MULS: |
| ... | ... | @@ -846,83 +902,172 @@ static void gen_tst_cc (DisasContext *dc, int cond) |
| 846 | 902 | int arith_opt; |
| 847 | 903 | |
| 848 | 904 | /* TODO: optimize more condition codes. */ |
| 905 | + | |
| 906 | + /* | |
| 907 | + * If the flags are live, we've gotta look into the bits of CCS. | |
| 908 | + * Otherwise, if we just did an arithmetic operation we try to | |
| 909 | + * evaluate the condition code faster. | |
| 910 | + * | |
| 911 | + * When this function is done, T0 should be non-zero if the condition | |
| 912 | + * code is true. | |
| 913 | + */ | |
| 849 | 914 | arith_opt = arith_cc(dc) && !dc->flags_live; |
| 850 | 915 | switch (cond) { |
| 851 | 916 | case CC_EQ: |
| 852 | - if (arith_opt) | |
| 853 | - gen_op_tst_cc_eq_fast (); | |
| 917 | + if (arith_opt) { | |
| 918 | + /* If cc_result is zero, T0 should be | |
| 919 | + non-zero otherwise T0 should be zero. */ | |
| 920 | + int l1; | |
| 921 | + l1 = gen_new_label(); | |
| 922 | + tcg_gen_movi_tl(cpu_T[0], 0); | |
| 923 | + tcg_gen_brcond_tl(TCG_COND_NE, cc_result, | |
| 924 | + tcg_const_tl(0), l1); | |
| 925 | + tcg_gen_movi_tl(cpu_T[0], 1); | |
| 926 | + gen_set_label(l1); | |
| 927 | + } | |
| 854 | 928 | else { |
| 855 | 929 | cris_evaluate_flags(dc); |
| 856 | - gen_op_tst_cc_eq (); | |
| 930 | + tcg_gen_andi_tl(cpu_T[0], | |
| 931 | + cpu_PR[PR_CCS], Z_FLAG); | |
| 857 | 932 | } |
| 858 | 933 | break; |
| 859 | 934 | case CC_NE: |
| 860 | 935 | if (arith_opt) |
| 861 | - gen_op_tst_cc_ne_fast (); | |
| 936 | + tcg_gen_mov_tl(cpu_T[0], cc_result); | |
| 862 | 937 | else { |
| 863 | 938 | cris_evaluate_flags(dc); |
| 864 | - gen_op_tst_cc_ne (); | |
| 939 | + tcg_gen_xori_tl(cpu_T[0], cpu_PR[PR_CCS], | |
| 940 | + Z_FLAG); | |
| 941 | + tcg_gen_andi_tl(cpu_T[0], cpu_T[0], Z_FLAG); | |
| 865 | 942 | } |
| 866 | 943 | break; |
| 867 | 944 | case CC_CS: |
| 868 | 945 | cris_evaluate_flags(dc); |
| 869 | - gen_op_tst_cc_cs (); | |
| 946 | + tcg_gen_andi_tl(cpu_T[0], cpu_PR[PR_CCS], C_FLAG); | |
| 870 | 947 | break; |
| 871 | 948 | case CC_CC: |
| 872 | 949 | cris_evaluate_flags(dc); |
| 873 | - gen_op_tst_cc_cc (); | |
| 950 | + tcg_gen_xori_tl(cpu_T[0], cpu_PR[PR_CCS], | |
| 951 | + C_FLAG); | |
| 952 | + tcg_gen_andi_tl(cpu_T[0], cpu_T[0], C_FLAG); | |
| 874 | 953 | break; |
| 875 | 954 | case CC_VS: |
| 876 | 955 | cris_evaluate_flags(dc); |
| 877 | - gen_op_tst_cc_vs (); | |
| 956 | + tcg_gen_andi_tl(cpu_T[0], cpu_PR[PR_CCS], V_FLAG); | |
| 878 | 957 | break; |
| 879 | 958 | case CC_VC: |
| 880 | 959 | cris_evaluate_flags(dc); |
| 881 | - gen_op_tst_cc_vc (); | |
| 960 | + tcg_gen_xori_tl(cpu_T[0], cpu_PR[PR_CCS], | |
| 961 | + V_FLAG); | |
| 962 | + tcg_gen_andi_tl(cpu_T[0], cpu_T[0], V_FLAG); | |
| 882 | 963 | break; |
| 883 | 964 | case CC_PL: |
| 884 | 965 | if (arith_opt) |
| 885 | - gen_op_tst_cc_pl_fast (); | |
| 966 | + tcg_gen_shli_tl(cpu_T[0], cc_result, 31); | |
| 886 | 967 | else { |
| 887 | 968 | cris_evaluate_flags(dc); |
| 888 | - gen_op_tst_cc_pl (); | |
| 969 | + tcg_gen_xori_tl(cpu_T[0], cpu_PR[PR_CCS], | |
| 970 | + N_FLAG); | |
| 971 | + tcg_gen_andi_tl(cpu_T[0], cpu_T[0], N_FLAG); | |
| 889 | 972 | } |
| 890 | 973 | break; |
| 891 | 974 | case CC_MI: |
| 892 | - if (arith_opt) | |
| 893 | - gen_op_tst_cc_mi_fast (); | |
| 975 | + if (arith_opt) { | |
| 976 | + tcg_gen_shli_tl(cpu_T[0], cc_result, 31); | |
| 977 | + tcg_gen_xori_tl(cpu_T[0], cpu_T[0], 1); | |
| 978 | + } | |
| 894 | 979 | else { |
| 895 | 980 | cris_evaluate_flags(dc); |
| 896 | - gen_op_tst_cc_mi (); | |
| 981 | + tcg_gen_andi_tl(cpu_T[0], cpu_PR[PR_CCS], | |
| 982 | + N_FLAG); | |
| 897 | 983 | } |
| 898 | 984 | break; |
| 899 | 985 | case CC_LS: |
| 900 | 986 | cris_evaluate_flags(dc); |
| 901 | - gen_op_tst_cc_ls (); | |
| 987 | + tcg_gen_andi_tl(cpu_T[0], cpu_PR[PR_CCS], | |
| 988 | + C_FLAG | Z_FLAG); | |
| 902 | 989 | break; |
| 903 | 990 | case CC_HI: |
| 904 | 991 | cris_evaluate_flags(dc); |
| 905 | - gen_op_tst_cc_hi (); | |
| 992 | + { | |
| 993 | + TCGv tmp; | |
| 994 | + | |
| 995 | + tmp = tcg_temp_new(TCG_TYPE_TL); | |
| 996 | + tcg_gen_xori_tl(tmp, cpu_PR[PR_CCS], | |
| 997 | + C_FLAG | Z_FLAG); | |
| 998 | + /* Overlay the C flag on top of the Z. */ | |
| 999 | + tcg_gen_shli_tl(cpu_T[0], tmp, 2); | |
| 1000 | + tcg_gen_and_tl(cpu_T[0], tmp, cpu_T[0]); | |
| 1001 | + tcg_gen_andi_tl(cpu_T[0], cpu_T[0], Z_FLAG); | |
| 1002 | + | |
| 1003 | + tcg_gen_discard_tl(tmp); | |
| 1004 | + } | |
| 906 | 1005 | break; |
| 907 | 1006 | case CC_GE: |
| 908 | 1007 | cris_evaluate_flags(dc); |
| 909 | - gen_op_tst_cc_ge (); | |
| 1008 | + /* Overlay the V flag on top of the N. */ | |
| 1009 | + tcg_gen_shli_tl(cpu_T[0], cpu_PR[PR_CCS], 2); | |
| 1010 | + tcg_gen_xor_tl(cpu_T[0], | |
| 1011 | + cpu_PR[PR_CCS], cpu_T[0]); | |
| 1012 | + tcg_gen_andi_tl(cpu_T[0], cpu_T[0], N_FLAG); | |
| 1013 | + tcg_gen_xori_tl(cpu_T[0], cpu_T[0], N_FLAG); | |
| 910 | 1014 | break; |
| 911 | 1015 | case CC_LT: |
| 912 | 1016 | cris_evaluate_flags(dc); |
| 913 | - gen_op_tst_cc_lt (); | |
| 1017 | + /* Overlay the V flag on top of the N. */ | |
| 1018 | + tcg_gen_shli_tl(cpu_T[0], cpu_PR[PR_CCS], 2); | |
| 1019 | + tcg_gen_xor_tl(cpu_T[0], | |
| 1020 | + cpu_PR[PR_CCS], cpu_T[0]); | |
| 1021 | + tcg_gen_andi_tl(cpu_T[0], cpu_T[0], N_FLAG); | |
| 914 | 1022 | break; |
| 915 | 1023 | case CC_GT: |
| 916 | 1024 | cris_evaluate_flags(dc); |
| 917 | - gen_op_tst_cc_gt (); | |
| 1025 | + { | |
| 1026 | + TCGv n, z; | |
| 1027 | + | |
| 1028 | + n = tcg_temp_new(TCG_TYPE_TL); | |
| 1029 | + z = tcg_temp_new(TCG_TYPE_TL); | |
| 1030 | + | |
| 1031 | + /* To avoid a shift we overlay everything on | |
| 1032 | + the V flag. */ | |
| 1033 | + tcg_gen_shri_tl(n, cpu_PR[PR_CCS], 2); | |
| 1034 | + tcg_gen_shri_tl(z, cpu_PR[PR_CCS], 1); | |
| 1035 | + /* invert Z. */ | |
| 1036 | + tcg_gen_xori_tl(z, z, 2); | |
| 1037 | + | |
| 1038 | + tcg_gen_xor_tl(n, n, cpu_PR[PR_CCS]); | |
| 1039 | + tcg_gen_xori_tl(n, n, 2); | |
| 1040 | + tcg_gen_and_tl(cpu_T[0], z, n); | |
| 1041 | + tcg_gen_andi_tl(cpu_T[0], cpu_T[0], 2); | |
| 1042 | + | |
| 1043 | + tcg_gen_discard_tl(n); | |
| 1044 | + tcg_gen_discard_tl(z); | |
| 1045 | + } | |
| 918 | 1046 | break; |
| 919 | 1047 | case CC_LE: |
| 920 | 1048 | cris_evaluate_flags(dc); |
| 921 | - gen_op_tst_cc_le (); | |
| 1049 | + { | |
| 1050 | + TCGv n, z; | |
| 1051 | + | |
| 1052 | + n = tcg_temp_new(TCG_TYPE_TL); | |
| 1053 | + z = tcg_temp_new(TCG_TYPE_TL); | |
| 1054 | + | |
| 1055 | + /* To avoid a shift we overlay everything on | |
| 1056 | + the V flag. */ | |
| 1057 | + tcg_gen_shri_tl(n, cpu_PR[PR_CCS], 2); | |
| 1058 | + tcg_gen_shri_tl(z, cpu_PR[PR_CCS], 1); | |
| 1059 | + | |
| 1060 | + tcg_gen_xor_tl(n, n, cpu_PR[PR_CCS]); | |
| 1061 | + tcg_gen_or_tl(cpu_T[0], z, n); | |
| 1062 | + tcg_gen_andi_tl(cpu_T[0], cpu_T[0], 2); | |
| 1063 | + | |
| 1064 | + tcg_gen_discard_tl(n); | |
| 1065 | + tcg_gen_discard_tl(z); | |
| 1066 | + } | |
| 922 | 1067 | break; |
| 923 | 1068 | case CC_P: |
| 924 | 1069 | cris_evaluate_flags(dc); |
| 925 | - gen_op_tst_cc_p (); | |
| 1070 | + tcg_gen_andi_tl(cpu_T[0], cpu_PR[PR_CCS], P_FLAG); | |
| 926 | 1071 | break; |
| 927 | 1072 | case CC_A: |
| 928 | 1073 | cris_evaluate_flags(dc); |
| ... | ... | @@ -944,7 +1089,7 @@ static void cris_prepare_cc_branch (DisasContext *dc, int offset, int cond) |
| 944 | 1089 | if (cond != CC_A) |
| 945 | 1090 | { |
| 946 | 1091 | gen_tst_cc (dc, cond); |
| 947 | - gen_op_evaluate_bcc (); | |
| 1092 | + t_gen_mov_env_TN(btaken, cpu_T[0]); | |
| 948 | 1093 | } |
| 949 | 1094 | tcg_gen_movi_tl(env_btarget, dc->delayed_pc); |
| 950 | 1095 | } |
| ... | ... | @@ -1225,7 +1370,7 @@ static unsigned int dec_subq(DisasContext *dc) |
| 1225 | 1370 | cris_cc_mask(dc, CC_MASK_NZVC); |
| 1226 | 1371 | /* Fetch register operand, */ |
| 1227 | 1372 | t_gen_mov_TN_reg(cpu_T[0], dc->op2); |
| 1228 | - t_gen_mov_TN_im(cpu_T[1], dc->op1); | |
| 1373 | + tcg_gen_movi_tl(cpu_T[1], dc->op1); | |
| 1229 | 1374 | crisv32_alu_op(dc, CC_OP_SUB, dc->op2, 4); |
| 1230 | 1375 | return 2; |
| 1231 | 1376 | } |
| ... | ... | @@ -1238,7 +1383,7 @@ static unsigned int dec_cmpq(DisasContext *dc) |
| 1238 | 1383 | DIS(fprintf (logfile, "cmpq %d, $r%d\n", imm, dc->op2)); |
| 1239 | 1384 | cris_cc_mask(dc, CC_MASK_NZVC); |
| 1240 | 1385 | t_gen_mov_TN_reg(cpu_T[0], dc->op2); |
| 1241 | - t_gen_mov_TN_im(cpu_T[1], imm); | |
| 1386 | + tcg_gen_movi_tl(cpu_T[1], imm); | |
| 1242 | 1387 | crisv32_alu_op(dc, CC_OP_CMP, dc->op2, 4); |
| 1243 | 1388 | return 2; |
| 1244 | 1389 | } |
| ... | ... | @@ -1251,7 +1396,7 @@ static unsigned int dec_andq(DisasContext *dc) |
| 1251 | 1396 | DIS(fprintf (logfile, "andq %d, $r%d\n", imm, dc->op2)); |
| 1252 | 1397 | cris_cc_mask(dc, CC_MASK_NZ); |
| 1253 | 1398 | t_gen_mov_TN_reg(cpu_T[0], dc->op2); |
| 1254 | - t_gen_mov_TN_im(cpu_T[1], imm); | |
| 1399 | + tcg_gen_movi_tl(cpu_T[1], imm); | |
| 1255 | 1400 | crisv32_alu_op(dc, CC_OP_AND, dc->op2, 4); |
| 1256 | 1401 | return 2; |
| 1257 | 1402 | } |
| ... | ... | @@ -1263,7 +1408,7 @@ static unsigned int dec_orq(DisasContext *dc) |
| 1263 | 1408 | DIS(fprintf (logfile, "orq %d, $r%d\n", imm, dc->op2)); |
| 1264 | 1409 | cris_cc_mask(dc, CC_MASK_NZ); |
| 1265 | 1410 | t_gen_mov_TN_reg(cpu_T[0], dc->op2); |
| 1266 | - t_gen_mov_TN_im(cpu_T[1], imm); | |
| 1411 | + tcg_gen_movi_tl(cpu_T[1], imm); | |
| 1267 | 1412 | crisv32_alu_op(dc, CC_OP_OR, dc->op2, 4); |
| 1268 | 1413 | return 2; |
| 1269 | 1414 | } |
| ... | ... | @@ -1272,10 +1417,9 @@ static unsigned int dec_btstq(DisasContext *dc) |
| 1272 | 1417 | dc->op1 = EXTRACT_FIELD(dc->ir, 0, 4); |
| 1273 | 1418 | DIS(fprintf (logfile, "btstq %u, $r%d\n", dc->op1, dc->op2)); |
| 1274 | 1419 | |
| 1275 | - cris_evaluate_flags(dc); | |
| 1276 | 1420 | cris_cc_mask(dc, CC_MASK_NZ); |
| 1277 | 1421 | t_gen_mov_TN_reg(cpu_T[0], dc->op2); |
| 1278 | - t_gen_mov_TN_im(cpu_T[1], dc->op1); | |
| 1422 | + tcg_gen_movi_tl(cpu_T[1], dc->op1); | |
| 1279 | 1423 | crisv32_alu_op(dc, CC_OP_BTST, dc->op2, 4); |
| 1280 | 1424 | |
| 1281 | 1425 | cris_update_cc_op(dc, CC_OP_FLAGS, 4); |
| ... | ... | @@ -1289,7 +1433,7 @@ static unsigned int dec_asrq(DisasContext *dc) |
| 1289 | 1433 | DIS(fprintf (logfile, "asrq %u, $r%d\n", dc->op1, dc->op2)); |
| 1290 | 1434 | cris_cc_mask(dc, CC_MASK_NZ); |
| 1291 | 1435 | t_gen_mov_TN_reg(cpu_T[0], dc->op2); |
| 1292 | - t_gen_mov_TN_im(cpu_T[1], dc->op1); | |
| 1436 | + tcg_gen_movi_tl(cpu_T[1], dc->op1); | |
| 1293 | 1437 | crisv32_alu_op(dc, CC_OP_ASR, dc->op2, 4); |
| 1294 | 1438 | return 2; |
| 1295 | 1439 | } |
| ... | ... | @@ -1300,7 +1444,7 @@ static unsigned int dec_lslq(DisasContext *dc) |
| 1300 | 1444 | |
| 1301 | 1445 | cris_cc_mask(dc, CC_MASK_NZ); |
| 1302 | 1446 | t_gen_mov_TN_reg(cpu_T[0], dc->op2); |
| 1303 | - t_gen_mov_TN_im(cpu_T[1], dc->op1); | |
| 1447 | + tcg_gen_movi_tl(cpu_T[1], dc->op1); | |
| 1304 | 1448 | crisv32_alu_op(dc, CC_OP_LSL, dc->op2, 4); |
| 1305 | 1449 | return 2; |
| 1306 | 1450 | } |
| ... | ... | @@ -1311,7 +1455,7 @@ static unsigned int dec_lsrq(DisasContext *dc) |
| 1311 | 1455 | |
| 1312 | 1456 | cris_cc_mask(dc, CC_MASK_NZ); |
| 1313 | 1457 | t_gen_mov_TN_reg(cpu_T[0], dc->op2); |
| 1314 | - t_gen_mov_TN_im(cpu_T[1], dc->op1); | |
| 1458 | + tcg_gen_movi_tl(cpu_T[1], dc->op1); | |
| 1315 | 1459 | crisv32_alu_op(dc, CC_OP_LSR, dc->op2, 4); |
| 1316 | 1460 | return 2; |
| 1317 | 1461 | } |
| ... | ... | @@ -1338,14 +1482,20 @@ static unsigned int dec_scc_r(DisasContext *dc) |
| 1338 | 1482 | |
| 1339 | 1483 | if (cond != CC_A) |
| 1340 | 1484 | { |
| 1485 | + int l1; | |
| 1486 | + | |
| 1341 | 1487 | gen_tst_cc (dc, cond); |
| 1342 | - tcg_gen_mov_tl(cpu_T[1], cpu_T[0]); | |
| 1488 | + | |
| 1489 | + l1 = gen_new_label(); | |
| 1490 | + tcg_gen_movi_tl(cpu_R[dc->op1], 0); | |
| 1491 | + tcg_gen_brcond_tl(TCG_COND_EQ, cpu_T[0], tcg_const_tl(0), l1); | |
| 1492 | + tcg_gen_movi_tl(cpu_R[dc->op1], 1); | |
| 1493 | + gen_set_label(l1); | |
| 1343 | 1494 | } |
| 1344 | 1495 | else |
| 1345 | - tcg_gen_movi_tl(cpu_T[1], 1); | |
| 1496 | + tcg_gen_movi_tl(cpu_R[dc->op1], 1); | |
| 1346 | 1497 | |
| 1347 | 1498 | cris_cc_mask(dc, 0); |
| 1348 | - crisv32_alu_op(dc, CC_OP_MOVE, dc->op1, 4); | |
| 1349 | 1499 | return 2; |
| 1350 | 1500 | } |
| 1351 | 1501 | |
| ... | ... | @@ -1624,7 +1774,6 @@ static unsigned int dec_btst_r(DisasContext *dc) |
| 1624 | 1774 | { |
| 1625 | 1775 | DIS(fprintf (logfile, "btst $r%u, $r%u\n", |
| 1626 | 1776 | dc->op1, dc->op2)); |
| 1627 | - cris_evaluate_flags(dc); | |
| 1628 | 1777 | cris_cc_mask(dc, CC_MASK_NZ); |
| 1629 | 1778 | dec_prep_alu_r(dc, dc->op1, dc->op2, 4, 0); |
| 1630 | 1779 | crisv32_alu_op(dc, CC_OP_BTST, dc->op2, 4); |
| ... | ... | @@ -1772,10 +1921,18 @@ static unsigned int dec_setclrf(DisasContext *dc) |
| 1772 | 1921 | cris_update_cc_op(dc, CC_OP_FLAGS, 4); |
| 1773 | 1922 | tcg_gen_movi_tl(cc_op, dc->cc_op); |
| 1774 | 1923 | |
| 1775 | - if (set) | |
| 1776 | - gen_op_setf(flags); | |
| 1924 | + if (set) { | |
| 1925 | + if (!dc->user && (flags & U_FLAG)) { | |
| 1926 | + /* Enter user mode. */ | |
| 1927 | + t_gen_mov_env_TN(ksp, cpu_R[R_SP]); | |
| 1928 | + tcg_gen_mov_tl(cpu_R[R_SP], cpu_PR[PR_USP]); | |
| 1929 | + dc->is_jmp = DISAS_UPDATE; | |
| 1930 | + } | |
| 1931 | + tcg_gen_ori_tl(cpu_PR[PR_CCS], cpu_PR[PR_CCS], flags); | |
| 1932 | + } | |
| 1777 | 1933 | else |
| 1778 | - gen_op_clrf(flags); | |
| 1934 | + tcg_gen_andi_tl(cpu_PR[PR_CCS], cpu_PR[PR_CCS], ~flags); | |
| 1935 | + | |
| 1779 | 1936 | dc->flags_live = 1; |
| 1780 | 1937 | dc->clear_x = 0; |
| 1781 | 1938 | return 2; |
| ... | ... | @@ -1785,28 +1942,19 @@ static unsigned int dec_move_rs(DisasContext *dc) |
| 1785 | 1942 | { |
| 1786 | 1943 | DIS(fprintf (logfile, "move $r%u, $s%u\n", dc->op1, dc->op2)); |
| 1787 | 1944 | cris_cc_mask(dc, 0); |
| 1788 | - t_gen_mov_TN_reg(cpu_T[0], dc->op1); | |
| 1789 | - gen_op_movl_sreg_T0(dc->op2); | |
| 1790 | - | |
| 1791 | -#if !defined(CONFIG_USER_ONLY) | |
| 1792 | - if (dc->op2 == 6) | |
| 1793 | - gen_op_movl_tlb_hi_T0(); | |
| 1794 | - else if (dc->op2 == 5) { /* srs is checked at runtime. */ | |
| 1795 | - tcg_gen_helper_0_1(helper_tlb_update, cpu_T[0]); | |
| 1796 | - gen_op_movl_tlb_lo_T0(); | |
| 1797 | - } | |
| 1798 | -#endif | |
| 1945 | + tcg_gen_helper_0_2(helper_movl_sreg_reg, | |
| 1946 | + tcg_const_tl(dc->op2), tcg_const_tl(dc->op1)); | |
| 1799 | 1947 | return 2; |
| 1800 | 1948 | } |
| 1801 | 1949 | static unsigned int dec_move_sr(DisasContext *dc) |
| 1802 | 1950 | { |
| 1803 | 1951 | DIS(fprintf (logfile, "move $s%u, $r%u\n", dc->op2, dc->op1)); |
| 1804 | 1952 | cris_cc_mask(dc, 0); |
| 1805 | - gen_op_movl_T0_sreg(dc->op2); | |
| 1806 | - tcg_gen_mov_tl(cpu_T[1], cpu_T[0]); | |
| 1807 | - crisv32_alu_op(dc, CC_OP_MOVE, dc->op1, 4); | |
| 1953 | + tcg_gen_helper_0_2(helper_movl_reg_sreg, | |
| 1954 | + tcg_const_tl(dc->op1), tcg_const_tl(dc->op2)); | |
| 1808 | 1955 | return 2; |
| 1809 | 1956 | } |
| 1957 | + | |
| 1810 | 1958 | static unsigned int dec_move_rp(DisasContext *dc) |
| 1811 | 1959 | { |
| 1812 | 1960 | DIS(fprintf (logfile, "move $r%u, $p%u\n", dc->op1, dc->op2)); |
| ... | ... | @@ -2024,9 +2172,11 @@ static unsigned int dec_test_m(DisasContext *dc) |
| 2024 | 2172 | dc->op1, dc->postinc ? "+]" : "]", |
| 2025 | 2173 | dc->op2)); |
| 2026 | 2174 | |
| 2175 | + cris_evaluate_flags(dc); | |
| 2176 | + | |
| 2027 | 2177 | insn_len = dec_prep_alu_m(dc, 0, memsize); |
| 2028 | 2178 | cris_cc_mask(dc, CC_MASK_NZ); |
| 2029 | - gen_op_clrf(3); | |
| 2179 | + tcg_gen_andi_tl(cpu_PR[PR_CCS], cpu_PR[PR_CCS], ~3); | |
| 2030 | 2180 | |
| 2031 | 2181 | tcg_gen_mov_tl(cpu_T[0], cpu_T[1]); |
| 2032 | 2182 | tcg_gen_movi_tl(cpu_T[1], 0); |
| ... | ... | @@ -2444,10 +2594,6 @@ static unsigned int dec_rfe_etc(DisasContext *dc) |
| 2444 | 2594 | case 2: |
| 2445 | 2595 | /* rfe. */ |
| 2446 | 2596 | cris_evaluate_flags(dc); |
| 2447 | - gen_op_ccs_rshift(); | |
| 2448 | - /* FIXME: don't set the P-FLAG if R is set. */ | |
| 2449 | - tcg_gen_ori_tl(cpu_PR[PR_CCS], cpu_PR[PR_CCS], P_FLAG); | |
| 2450 | - /* Debug helper. */ | |
| 2451 | 2597 | tcg_gen_helper_0_0(helper_rfe); |
| 2452 | 2598 | dc->is_jmp = DISAS_UPDATE; |
| 2453 | 2599 | break; |
| ... | ... | @@ -2460,7 +2606,9 @@ static unsigned int dec_rfe_etc(DisasContext *dc) |
| 2460 | 2606 | tcg_gen_movi_tl(cpu_T[0], dc->pc); |
| 2461 | 2607 | t_gen_mov_env_TN(pc, cpu_T[0]); |
| 2462 | 2608 | /* Breaks start at 16 in the exception vector. */ |
| 2463 | - gen_op_break_im(dc->op1 + 16); | |
| 2609 | + t_gen_mov_env_TN(trap_vector, | |
| 2610 | + tcg_const_tl(dc->op1 + 16)); | |
| 2611 | + t_gen_raise_exception(EXCP_BREAK); | |
| 2464 | 2612 | dc->is_jmp = DISAS_UPDATE; |
| 2465 | 2613 | break; |
| 2466 | 2614 | default: |
| ... | ... | @@ -2642,7 +2790,7 @@ static void check_breakpoint(CPUState *env, DisasContext *dc) |
| 2642 | 2790 | cris_evaluate_flags (dc); |
| 2643 | 2791 | tcg_gen_movi_tl(cpu_T[0], dc->pc); |
| 2644 | 2792 | t_gen_mov_env_TN(pc, cpu_T[0]); |
| 2645 | - gen_op_debug(); | |
| 2793 | + t_gen_raise_exception(EXCP_DEBUG); | |
| 2646 | 2794 | dc->is_jmp = DISAS_UPDATE; |
| 2647 | 2795 | } |
| 2648 | 2796 | } |
| ... | ... | @@ -2689,13 +2837,14 @@ gen_intermediate_code_internal(CPUState *env, TranslationBlock *tb, |
| 2689 | 2837 | |
| 2690 | 2838 | if (loglevel & CPU_LOG_TB_IN_ASM) { |
| 2691 | 2839 | fprintf(logfile, |
| 2692 | - "search=%d pc=%x ccs=%x pid=%x usp=%x\n" | |
| 2840 | + "search=%d pc=%x ccs=%x pid=%x usp=%x dbg=%x %x %x\n" | |
| 2693 | 2841 | "%x.%x.%x.%x\n" |
| 2694 | 2842 | "%x.%x.%x.%x\n" |
| 2695 | 2843 | "%x.%x.%x.%x\n" |
| 2696 | 2844 | "%x.%x.%x.%x\n", |
| 2697 | 2845 | search_pc, env->pc, env->pregs[PR_CCS], |
| 2698 | 2846 | env->pregs[PR_PID], env->pregs[PR_USP], |
| 2847 | + env->debug1, env->debug2, env->debug3, | |
| 2699 | 2848 | env->regs[0], env->regs[1], env->regs[2], env->regs[3], |
| 2700 | 2849 | env->regs[4], env->regs[5], env->regs[6], env->regs[7], |
| 2701 | 2850 | env->regs[8], env->regs[9], |
| ... | ... | @@ -2733,7 +2882,6 @@ gen_intermediate_code_internal(CPUState *env, TranslationBlock *tb, |
| 2733 | 2882 | |
| 2734 | 2883 | dc->clear_x = 1; |
| 2735 | 2884 | insn_len = cris_decoder(dc); |
| 2736 | - STATS(gen_op_exec_insn()); | |
| 2737 | 2885 | dc->ppc = dc->pc; |
| 2738 | 2886 | dc->pc += insn_len; |
| 2739 | 2887 | if (dc->clear_x) |
| ... | ... | @@ -2778,7 +2926,7 @@ gen_intermediate_code_internal(CPUState *env, TranslationBlock *tb, |
| 2778 | 2926 | cris_evaluate_flags (dc); |
| 2779 | 2927 | done: |
| 2780 | 2928 | if (__builtin_expect(env->singlestep_enabled, 0)) { |
| 2781 | - gen_op_debug(); | |
| 2929 | + t_gen_raise_exception(EXCP_DEBUG); | |
| 2782 | 2930 | } else { |
| 2783 | 2931 | switch(dc->is_jmp) { |
| 2784 | 2932 | case DISAS_NEXT: |
| ... | ... | @@ -2933,13 +3081,16 @@ CPUCRISState *cpu_cris_init (const char *cpu_model) |
| 2933 | 3081 | pregnames[i]); |
| 2934 | 3082 | } |
| 2935 | 3083 | |
| 2936 | - TCG_HELPER(helper_tlb_update); | |
| 2937 | - TCG_HELPER(helper_tlb_flush); | |
| 2938 | - TCG_HELPER(helper_rfe); | |
| 3084 | + TCG_HELPER(helper_raise_exception); | |
| 2939 | 3085 | TCG_HELPER(helper_store); |
| 2940 | 3086 | TCG_HELPER(helper_dump); |
| 2941 | 3087 | TCG_HELPER(helper_dummy); |
| 2942 | 3088 | |
| 3089 | + TCG_HELPER(helper_tlb_flush); | |
| 3090 | + TCG_HELPER(helper_movl_sreg_reg); | |
| 3091 | + TCG_HELPER(helper_movl_reg_sreg); | |
| 3092 | + TCG_HELPER(helper_rfe); | |
| 3093 | + | |
| 2943 | 3094 | TCG_HELPER(helper_evaluate_flags_muls); |
| 2944 | 3095 | TCG_HELPER(helper_evaluate_flags_mulu); |
| 2945 | 3096 | TCG_HELPER(helper_evaluate_flags_mcp); | ... | ... |