Commit 69d6275b0058cf7a8ccba83f74e36b973b951d22
1 parent
c047da1a
SH4: Convert remaining non-fp ops to TCG
Signed-off-by: Aurelien Jarno <aurelien@aurel32.net> git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@5120 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
5 changed files
with
130 additions
and
153 deletions
target-sh4/exec.h
| ... | ... | @@ -71,10 +71,6 @@ int find_itlb_entry(CPUState * env, target_ulong address, |
| 71 | 71 | int use_asid, int update); |
| 72 | 72 | int find_utlb_entry(CPUState * env, target_ulong address, int use_asid); |
| 73 | 73 | |
| 74 | -void helper_div1_T0_T1(void); | |
| 75 | -void helper_rotcl(uint32_t * addr); | |
| 76 | -void helper_rotcr(uint32_t * addr); | |
| 77 | - | |
| 78 | 74 | void do_interrupt(CPUState * env); |
| 79 | 75 | |
| 80 | 76 | void cpu_loop_exit(void); | ... | ... |
target-sh4/helper.h
| ... | ... | @@ -14,6 +14,7 @@ DEF_HELPER(uint32_t, helper_addc, (uint32_t, uint32_t)) |
| 14 | 14 | DEF_HELPER(uint32_t, helper_subv, (uint32_t, uint32_t)) |
| 15 | 15 | DEF_HELPER(uint32_t, helper_subc, (uint32_t, uint32_t)) |
| 16 | 16 | DEF_HELPER(uint32_t, helper_negc, (uint32_t)) |
| 17 | +DEF_HELPER(uint32_t, helper_div1, (uint32_t, uint32_t)) | |
| 17 | 18 | DEF_HELPER(void, helper_macl, (uint32_t, uint32_t)) |
| 18 | 19 | DEF_HELPER(void, helper_macw, (uint32_t, uint32_t)) |
| 19 | 20 | ... | ... |
target-sh4/op.c
| ... | ... | @@ -37,84 +37,6 @@ static inline void cond_t(int cond) |
| 37 | 37 | clr_t(); |
| 38 | 38 | } |
| 39 | 39 | |
| 40 | -void OPPROTO op_cmp_str_T0_T1(void) | |
| 41 | -{ | |
| 42 | - cond_t((T0 & 0x000000ff) == (T1 & 0x000000ff) || | |
| 43 | - (T0 & 0x0000ff00) == (T1 & 0x0000ff00) || | |
| 44 | - (T0 & 0x00ff0000) == (T1 & 0x00ff0000) || | |
| 45 | - (T0 & 0xff000000) == (T1 & 0xff000000)); | |
| 46 | - RETURN(); | |
| 47 | -} | |
| 48 | - | |
| 49 | -void OPPROTO op_div0s_T0_T1(void) | |
| 50 | -{ | |
| 51 | - if (T1 & 0x80000000) | |
| 52 | - env->sr |= SR_Q; | |
| 53 | - else | |
| 54 | - env->sr &= ~SR_Q; | |
| 55 | - if (T0 & 0x80000000) | |
| 56 | - env->sr |= SR_M; | |
| 57 | - else | |
| 58 | - env->sr &= ~SR_M; | |
| 59 | - cond_t((T1 ^ T0) & 0x80000000); | |
| 60 | - RETURN(); | |
| 61 | -} | |
| 62 | - | |
| 63 | -void OPPROTO op_div1_T0_T1(void) | |
| 64 | -{ | |
| 65 | - helper_div1_T0_T1(); | |
| 66 | - RETURN(); | |
| 67 | -} | |
| 68 | - | |
| 69 | -void OPPROTO op_shad_T0_T1(void) | |
| 70 | -{ | |
| 71 | - if ((T0 & 0x80000000) == 0) | |
| 72 | - T1 <<= (T0 & 0x1f); | |
| 73 | - else if ((T0 & 0x1f) == 0) | |
| 74 | - T1 = (T1 & 0x80000000)? 0xffffffff : 0; | |
| 75 | - else | |
| 76 | - T1 = ((int32_t) T1) >> ((~T0 & 0x1f) + 1); | |
| 77 | - RETURN(); | |
| 78 | -} | |
| 79 | - | |
| 80 | -void OPPROTO op_shld_T0_T1(void) | |
| 81 | -{ | |
| 82 | - if ((T0 & 0x80000000) == 0) | |
| 83 | - T1 <<= (T0 & 0x1f); | |
| 84 | - else if ((T0 & 0x1f) == 0) | |
| 85 | - T1 = 0; | |
| 86 | - else | |
| 87 | - T1 = ((uint32_t) T1) >> ((~T0 & 0x1f) + 1); | |
| 88 | - RETURN(); | |
| 89 | -} | |
| 90 | - | |
| 91 | -void OPPROTO op_rotcl_Rn(void) | |
| 92 | -{ | |
| 93 | - helper_rotcl(&env->gregs[PARAM1]); | |
| 94 | - RETURN(); | |
| 95 | -} | |
| 96 | - | |
| 97 | -void OPPROTO op_rotcr_Rn(void) | |
| 98 | -{ | |
| 99 | - helper_rotcr(&env->gregs[PARAM1]); | |
| 100 | - RETURN(); | |
| 101 | -} | |
| 102 | - | |
| 103 | -void OPPROTO op_rotl_Rn(void) | |
| 104 | -{ | |
| 105 | - cond_t(env->gregs[PARAM1] & 0x80000000); | |
| 106 | - env->gregs[PARAM1] = (env->gregs[PARAM1] << 1) | (env->sr & SR_T); | |
| 107 | - RETURN(); | |
| 108 | -} | |
| 109 | - | |
| 110 | -void OPPROTO op_rotr_Rn(void) | |
| 111 | -{ | |
| 112 | - cond_t(env->gregs[PARAM1] & 1); | |
| 113 | - env->gregs[PARAM1] = (env->gregs[PARAM1] >> 1) | | |
| 114 | - ((env->sr & SR_T) ? 0x80000000 : 0); | |
| 115 | - RETURN(); | |
| 116 | -} | |
| 117 | - | |
| 118 | 40 | void OPPROTO op_fmov_frN_FT0(void) |
| 119 | 41 | { |
| 120 | 42 | FT0 = env->fregs[PARAM1]; | ... | ... |
target-sh4/op_helper.c
| ... | ... | @@ -163,27 +163,27 @@ uint32_t helper_addv(uint32_t arg0, uint32_t arg1) |
| 163 | 163 | #define SETM env->sr |= SR_M |
| 164 | 164 | #define CLRM env->sr &= ~SR_M |
| 165 | 165 | |
| 166 | -void helper_div1_T0_T1(void) | |
| 166 | +uint32_t helper_div1(uint32_t arg0, uint32_t arg1) | |
| 167 | 167 | { |
| 168 | 168 | uint32_t tmp0, tmp2; |
| 169 | 169 | uint8_t old_q, tmp1 = 0xff; |
| 170 | 170 | |
| 171 | - //printf("div1 T0=0x%08x T1=0x%08x M=%d Q=%d T=%d\n", T0, T1, M, Q, T); | |
| 171 | + //printf("div1 arg0=0x%08x arg1=0x%08x M=%d Q=%d T=%d\n", arg0, arg1, M, Q, T); | |
| 172 | 172 | old_q = Q; |
| 173 | - if ((0x80000000 & T1) != 0) | |
| 173 | + if ((0x80000000 & arg1) != 0) | |
| 174 | 174 | SETQ; |
| 175 | 175 | else |
| 176 | 176 | CLRQ; |
| 177 | - tmp2 = T0; | |
| 178 | - T1 <<= 1; | |
| 179 | - T1 |= T; | |
| 177 | + tmp2 = arg0; | |
| 178 | + arg1 <<= 1; | |
| 179 | + arg1 |= T; | |
| 180 | 180 | switch (old_q) { |
| 181 | 181 | case 0: |
| 182 | 182 | switch (M) { |
| 183 | 183 | case 0: |
| 184 | - tmp0 = T1; | |
| 185 | - T1 -= tmp2; | |
| 186 | - tmp1 = T1 > tmp0; | |
| 184 | + tmp0 = arg1; | |
| 185 | + arg1 -= tmp2; | |
| 186 | + tmp1 = arg1 > tmp0; | |
| 187 | 187 | switch (Q) { |
| 188 | 188 | case 0: |
| 189 | 189 | if (tmp1) |
| ... | ... | @@ -200,9 +200,9 @@ void helper_div1_T0_T1(void) |
| 200 | 200 | } |
| 201 | 201 | break; |
| 202 | 202 | case 1: |
| 203 | - tmp0 = T1; | |
| 204 | - T1 += tmp2; | |
| 205 | - tmp1 = T1 < tmp0; | |
| 203 | + tmp0 = arg1; | |
| 204 | + arg1 += tmp2; | |
| 205 | + tmp1 = arg1 < tmp0; | |
| 206 | 206 | switch (Q) { |
| 207 | 207 | case 0: |
| 208 | 208 | if (tmp1 == 0) |
| ... | ... | @@ -223,9 +223,9 @@ void helper_div1_T0_T1(void) |
| 223 | 223 | case 1: |
| 224 | 224 | switch (M) { |
| 225 | 225 | case 0: |
| 226 | - tmp0 = T1; | |
| 227 | - T1 += tmp2; | |
| 228 | - tmp1 = T1 < tmp0; | |
| 226 | + tmp0 = arg1; | |
| 227 | + arg1 += tmp2; | |
| 228 | + tmp1 = arg1 < tmp0; | |
| 229 | 229 | switch (Q) { |
| 230 | 230 | case 0: |
| 231 | 231 | if (tmp1) |
| ... | ... | @@ -242,9 +242,9 @@ void helper_div1_T0_T1(void) |
| 242 | 242 | } |
| 243 | 243 | break; |
| 244 | 244 | case 1: |
| 245 | - tmp0 = T1; | |
| 246 | - T1 -= tmp2; | |
| 247 | - tmp1 = T1 > tmp0; | |
| 245 | + tmp0 = arg1; | |
| 246 | + arg1 -= tmp2; | |
| 247 | + tmp1 = arg1 > tmp0; | |
| 248 | 248 | switch (Q) { |
| 249 | 249 | case 0: |
| 250 | 250 | if (tmp1 == 0) |
| ... | ... | @@ -267,7 +267,8 @@ void helper_div1_T0_T1(void) |
| 267 | 267 | SETT; |
| 268 | 268 | else |
| 269 | 269 | CLRT; |
| 270 | - //printf("Output: T1=0x%08x M=%d Q=%d T=%d\n", T1, M, Q, T); | |
| 270 | + //printf("Output: arg1=0x%08x M=%d Q=%d T=%d\n", arg1, M, Q, T); | |
| 271 | + return arg1; | |
| 271 | 272 | } |
| 272 | 273 | |
| 273 | 274 | void helper_macl(uint32_t arg0, uint32_t arg1) |
| ... | ... | @@ -365,30 +366,6 @@ uint32_t helper_subv(uint32_t arg0, uint32_t arg1) |
| 365 | 366 | return arg1; |
| 366 | 367 | } |
| 367 | 368 | |
| 368 | -void helper_rotcl(uint32_t * addr) | |
| 369 | -{ | |
| 370 | - uint32_t new; | |
| 371 | - | |
| 372 | - new = (*addr << 1) | (env->sr & SR_T); | |
| 373 | - if (*addr & 0x80000000) | |
| 374 | - env->sr |= SR_T; | |
| 375 | - else | |
| 376 | - env->sr &= ~SR_T; | |
| 377 | - *addr = new; | |
| 378 | -} | |
| 379 | - | |
| 380 | -void helper_rotcr(uint32_t * addr) | |
| 381 | -{ | |
| 382 | - uint32_t new; | |
| 383 | - | |
| 384 | - new = (*addr >> 1) | ((env->sr & SR_T) ? 0x80000000 : 0); | |
| 385 | - if (*addr & 1) | |
| 386 | - env->sr |= SR_T; | |
| 387 | - else | |
| 388 | - env->sr &= ~SR_T; | |
| 389 | - *addr = new; | |
| 390 | -} | |
| 391 | - | |
| 392 | 369 | void helper_ld_fpscr(uint32_t val) |
| 393 | 370 | { |
| 394 | 371 | env->fpscr = val & 0x003fffff; | ... | ... |
target-sh4/translate.c
| ... | ... | @@ -337,6 +337,24 @@ static inline void gen_store_flags(uint32_t flags) |
| 337 | 337 | tcg_gen_ori_i32(cpu_flags, cpu_flags, flags); |
| 338 | 338 | } |
| 339 | 339 | |
| 340 | +static inline void gen_copy_bit_i32(TCGv t0, int p0, TCGv t1, int p1) | |
| 341 | +{ | |
| 342 | + TCGv tmp = tcg_temp_new(TCG_TYPE_I32); | |
| 343 | + | |
| 344 | + p0 &= 0x1f; | |
| 345 | + p1 &= 0x1f; | |
| 346 | + | |
| 347 | + tcg_gen_andi_i32(tmp, t1, (1 << p1)); | |
| 348 | + tcg_gen_andi_i32(t0, t0, ~(1 << p0)); | |
| 349 | + if (p0 < p1) | |
| 350 | + tcg_gen_shri_i32(tmp, tmp, p1 - p0); | |
| 351 | + else if (p0 > p1) | |
| 352 | + tcg_gen_shli_i32(tmp, tmp, p0 - p1); | |
| 353 | + tcg_gen_or_i32(t0, t0, tmp); | |
| 354 | + | |
| 355 | + tcg_temp_free(tmp); | |
| 356 | +} | |
| 357 | + | |
| 340 | 358 | #define B3_0 (ctx->opcode & 0xf) |
| 341 | 359 | #define B6_4 ((ctx->opcode >> 4) & 0x7) |
| 342 | 360 | #define B7_4 ((ctx->opcode >> 4) & 0xf) |
| ... | ... | @@ -643,20 +661,33 @@ void _decode_opc(DisasContext * ctx) |
| 643 | 661 | gen_cmp(TCG_COND_GEU, cpu_T[0], cpu_T[1]); |
| 644 | 662 | return; |
| 645 | 663 | case 0x200c: /* cmp/str Rm,Rn */ |
| 646 | - tcg_gen_mov_i32(cpu_T[0], cpu_gregs[REG(B7_4)]); | |
| 647 | - tcg_gen_mov_i32(cpu_T[1], cpu_gregs[REG(B11_8)]); | |
| 648 | - gen_op_cmp_str_T0_T1(); | |
| 664 | + { | |
| 665 | + int label1 = gen_new_label(); | |
| 666 | + int label2 = gen_new_label(); | |
| 667 | + tcg_gen_xor_i32(cpu_T[0], cpu_gregs[REG(B7_4)], cpu_gregs[REG(B11_8)]); | |
| 668 | + tcg_gen_andi_i32(cpu_T[0], cpu_T[0], 0xff000000); | |
| 669 | + tcg_gen_brcondi_i32(TCG_COND_EQ, cpu_T[0], 0, label1); | |
| 670 | + tcg_gen_andi_i32(cpu_T[0], cpu_T[0], 0x00ff0000); | |
| 671 | + tcg_gen_brcondi_i32(TCG_COND_EQ, cpu_T[0], 0, label1); | |
| 672 | + tcg_gen_andi_i32(cpu_T[0], cpu_T[0], 0x0000ff00); | |
| 673 | + tcg_gen_brcondi_i32(TCG_COND_EQ, cpu_T[0], 0, label1); | |
| 674 | + tcg_gen_andi_i32(cpu_T[0], cpu_T[0], 0x000000ff); | |
| 675 | + tcg_gen_brcondi_i32(TCG_COND_EQ, cpu_T[0], 0, label1); | |
| 676 | + tcg_gen_andi_i32(cpu_sr, cpu_sr, ~SR_T); | |
| 677 | + tcg_gen_br(label2); | |
| 678 | + gen_set_label(label1); | |
| 679 | + tcg_gen_ori_i32(cpu_sr, cpu_sr, SR_T); | |
| 680 | + gen_set_label(label2); | |
| 681 | + } | |
| 649 | 682 | return; |
| 650 | 683 | case 0x2007: /* div0s Rm,Rn */ |
| 651 | - tcg_gen_mov_i32(cpu_T[0], cpu_gregs[REG(B7_4)]); | |
| 652 | - tcg_gen_mov_i32(cpu_T[1], cpu_gregs[REG(B11_8)]); | |
| 653 | - gen_op_div0s_T0_T1(); | |
| 684 | + gen_copy_bit_i32(cpu_sr, 8, cpu_gregs[REG(B11_8)], 31); /* SR_Q */ | |
| 685 | + gen_copy_bit_i32(cpu_sr, 9, cpu_gregs[REG(B7_4)], 31); /* SR_M */ | |
| 686 | + tcg_gen_xor_i32(cpu_T[0], cpu_gregs[REG(B7_4)], cpu_gregs[REG(B11_8)]); | |
| 687 | + gen_copy_bit_i32(cpu_sr, 0, cpu_T[0], 31); /* SR_T */ | |
| 654 | 688 | return; |
| 655 | 689 | case 0x3004: /* div1 Rm,Rn */ |
| 656 | - tcg_gen_mov_i32(cpu_T[0], cpu_gregs[REG(B7_4)]); | |
| 657 | - tcg_gen_mov_i32(cpu_T[1], cpu_gregs[REG(B11_8)]); | |
| 658 | - gen_op_div1_T0_T1(); | |
| 659 | - tcg_gen_mov_i32(cpu_gregs[REG(B11_8)], cpu_T[1]); | |
| 690 | + tcg_gen_helper_1_2(helper_div1, cpu_gregs[REG(B11_8)], cpu_gregs[REG(B7_4)], cpu_gregs[REG(B11_8)]); | |
| 660 | 691 | return; |
| 661 | 692 | case 0x300d: /* dmuls.l Rm,Rn */ |
| 662 | 693 | { |
| ... | ... | @@ -758,16 +789,59 @@ void _decode_opc(DisasContext * ctx) |
| 758 | 789 | tcg_gen_or_i32(cpu_gregs[REG(B11_8)], cpu_gregs[REG(B11_8)], cpu_gregs[REG(B7_4)]); |
| 759 | 790 | return; |
| 760 | 791 | case 0x400c: /* shad Rm,Rn */ |
| 761 | - tcg_gen_mov_i32(cpu_T[0], cpu_gregs[REG(B7_4)]); | |
| 762 | - tcg_gen_mov_i32(cpu_T[1], cpu_gregs[REG(B11_8)]); | |
| 763 | - gen_op_shad_T0_T1(); | |
| 764 | - tcg_gen_mov_i32(cpu_gregs[REG(B11_8)], cpu_T[1]); | |
| 792 | + { | |
| 793 | + int label1 = gen_new_label(); | |
| 794 | + int label2 = gen_new_label(); | |
| 795 | + int label3 = gen_new_label(); | |
| 796 | + int label4 = gen_new_label(); | |
| 797 | + tcg_gen_brcondi_i32(TCG_COND_LT, cpu_gregs[REG(B7_4)], 0, label1); | |
| 798 | + /* Rm positive, shift to the left */ | |
| 799 | + tcg_gen_andi_i32(cpu_T[0], cpu_gregs[REG(B7_4)], 0x1f); | |
| 800 | + tcg_gen_shl_i32(cpu_gregs[REG(B11_8)], cpu_gregs[REG(B11_8)], cpu_T[0]); | |
| 801 | + tcg_gen_br(label4); | |
| 802 | + /* Rm negative, shift to the right */ | |
| 803 | + gen_set_label(label1); | |
| 804 | + tcg_gen_andi_i32(cpu_T[0], cpu_gregs[REG(B7_4)], 0x1f); | |
| 805 | + tcg_gen_brcondi_i32(TCG_COND_EQ, cpu_T[0], 0, label2); | |
| 806 | + tcg_gen_not_i32(cpu_T[0], cpu_gregs[REG(B7_4)]); | |
| 807 | + tcg_gen_andi_i32(cpu_T[0], cpu_T[0], 0x1f); | |
| 808 | + tcg_gen_addi_i32(cpu_T[0], cpu_T[0], 1); | |
| 809 | + tcg_gen_sar_i32(cpu_gregs[REG(B11_8)], cpu_gregs[REG(B11_8)], cpu_T[0]); | |
| 810 | + tcg_gen_br(label4); | |
| 811 | + /* Rm = -32 */ | |
| 812 | + gen_set_label(label2); | |
| 813 | + tcg_gen_brcondi_i32(TCG_COND_LT, cpu_gregs[REG(B11_8)], 0, label3); | |
| 814 | + tcg_gen_movi_i32(cpu_gregs[REG(B11_8)], 0); | |
| 815 | + tcg_gen_br(label4); | |
| 816 | + gen_set_label(label3); | |
| 817 | + tcg_gen_movi_i32(cpu_gregs[REG(B11_8)], 0xffffffff); | |
| 818 | + gen_set_label(label4); | |
| 819 | + } | |
| 765 | 820 | return; |
| 766 | 821 | case 0x400d: /* shld Rm,Rn */ |
| 767 | - tcg_gen_mov_i32(cpu_T[0], cpu_gregs[REG(B7_4)]); | |
| 768 | - tcg_gen_mov_i32(cpu_T[1], cpu_gregs[REG(B11_8)]); | |
| 769 | - gen_op_shld_T0_T1(); | |
| 770 | - tcg_gen_mov_i32(cpu_gregs[REG(B11_8)], cpu_T[1]); | |
| 822 | + { | |
| 823 | + int label1 = gen_new_label(); | |
| 824 | + int label2 = gen_new_label(); | |
| 825 | + int label3 = gen_new_label(); | |
| 826 | + tcg_gen_brcondi_i32(TCG_COND_LT, cpu_gregs[REG(B7_4)], 0, label1); | |
| 827 | + /* Rm positive, shift to the left */ | |
| 828 | + tcg_gen_andi_i32(cpu_T[0], cpu_gregs[REG(B7_4)], 0x1f); | |
| 829 | + tcg_gen_shl_i32(cpu_gregs[REG(B11_8)], cpu_gregs[REG(B11_8)], cpu_T[0]); | |
| 830 | + tcg_gen_br(label3); | |
| 831 | + /* Rm negative, shift to the right */ | |
| 832 | + gen_set_label(label1); | |
| 833 | + tcg_gen_andi_i32(cpu_T[0], cpu_gregs[REG(B7_4)], 0x1f); | |
| 834 | + tcg_gen_brcondi_i32(TCG_COND_EQ, cpu_T[0], 0, label2); | |
| 835 | + tcg_gen_not_i32(cpu_T[0], cpu_gregs[REG(B7_4)]); | |
| 836 | + tcg_gen_andi_i32(cpu_T[0], cpu_T[0], 0x1f); | |
| 837 | + tcg_gen_addi_i32(cpu_T[0], cpu_T[0], 1); | |
| 838 | + tcg_gen_shr_i32(cpu_gregs[REG(B11_8)], cpu_gregs[REG(B11_8)], cpu_T[0]); | |
| 839 | + tcg_gen_br(label3); | |
| 840 | + /* Rm = -32 */ | |
| 841 | + gen_set_label(label2); | |
| 842 | + tcg_gen_movi_i32(cpu_gregs[REG(B11_8)], 0); | |
| 843 | + gen_set_label(label3); | |
| 844 | + } | |
| 771 | 845 | return; |
| 772 | 846 | case 0x3008: /* sub Rm,Rn */ |
| 773 | 847 | tcg_gen_sub_i32(cpu_gregs[REG(B11_8)], cpu_gregs[REG(B11_8)], cpu_gregs[REG(B7_4)]); |
| ... | ... | @@ -1213,31 +1287,38 @@ void _decode_opc(DisasContext * ctx) |
| 1213 | 1287 | case 0x0083: /* pref @Rn */ |
| 1214 | 1288 | return; |
| 1215 | 1289 | case 0x4024: /* rotcl Rn */ |
| 1216 | - gen_op_rotcl_Rn(REG(B11_8)); | |
| 1290 | + tcg_gen_mov_i32(cpu_T[0], cpu_sr); | |
| 1291 | + gen_copy_bit_i32(cpu_sr, 0, cpu_gregs[REG(B11_8)], 31); | |
| 1292 | + tcg_gen_shli_i32(cpu_gregs[REG(B11_8)], cpu_gregs[REG(B11_8)], 1); | |
| 1293 | + gen_copy_bit_i32(cpu_gregs[REG(B11_8)], 0, cpu_T[0], 0); | |
| 1217 | 1294 | return; |
| 1218 | 1295 | case 0x4025: /* rotcr Rn */ |
| 1219 | - gen_op_rotcr_Rn(REG(B11_8)); | |
| 1296 | + tcg_gen_mov_i32(cpu_T[0], cpu_sr); | |
| 1297 | + gen_copy_bit_i32(cpu_sr, 0, cpu_gregs[REG(B11_8)], 0); | |
| 1298 | + tcg_gen_shri_i32(cpu_gregs[REG(B11_8)], cpu_gregs[REG(B11_8)], 1); | |
| 1299 | + gen_copy_bit_i32(cpu_gregs[REG(B11_8)], 31, cpu_T[0], 0); | |
| 1220 | 1300 | return; |
| 1221 | 1301 | case 0x4004: /* rotl Rn */ |
| 1222 | - gen_op_rotl_Rn(REG(B11_8)); | |
| 1302 | + gen_copy_bit_i32(cpu_sr, 0, cpu_gregs[REG(B11_8)], 31); | |
| 1303 | + tcg_gen_shli_i32(cpu_gregs[REG(B11_8)], cpu_gregs[REG(B11_8)], 1); | |
| 1304 | + gen_copy_bit_i32(cpu_gregs[REG(B11_8)], 0, cpu_sr, 0); | |
| 1223 | 1305 | return; |
| 1224 | 1306 | case 0x4005: /* rotr Rn */ |
| 1225 | - gen_op_rotr_Rn(REG(B11_8)); | |
| 1307 | + gen_copy_bit_i32(cpu_sr, 0, cpu_gregs[REG(B11_8)], 0); | |
| 1308 | + tcg_gen_shri_i32(cpu_gregs[REG(B11_8)], cpu_gregs[REG(B11_8)], 1); | |
| 1309 | + gen_copy_bit_i32(cpu_gregs[REG(B11_8)], 31, cpu_sr, 0); | |
| 1226 | 1310 | return; |
| 1227 | 1311 | case 0x4000: /* shll Rn */ |
| 1228 | 1312 | case 0x4020: /* shal Rn */ |
| 1229 | - tcg_gen_andi_i32(cpu_T[0], cpu_gregs[REG(B11_8)], 0x80000000); | |
| 1230 | - gen_cmp_imm(TCG_COND_NE, cpu_T[0], 0); | |
| 1313 | + gen_copy_bit_i32(cpu_sr, 0, cpu_gregs[REG(B11_8)], 31); | |
| 1231 | 1314 | tcg_gen_shli_i32(cpu_gregs[REG(B11_8)], cpu_gregs[REG(B11_8)], 1); |
| 1232 | 1315 | return; |
| 1233 | 1316 | case 0x4021: /* shar Rn */ |
| 1234 | - tcg_gen_andi_i32(cpu_T[0], cpu_gregs[REG(B11_8)], 1); | |
| 1235 | - gen_cmp_imm(TCG_COND_NE, cpu_T[0], 0); | |
| 1317 | + gen_copy_bit_i32(cpu_sr, 0, cpu_gregs[REG(B11_8)], 0); | |
| 1236 | 1318 | tcg_gen_sari_i32(cpu_gregs[REG(B11_8)], cpu_gregs[REG(B11_8)], 1); |
| 1237 | 1319 | return; |
| 1238 | 1320 | case 0x4001: /* shlr Rn */ |
| 1239 | - tcg_gen_andi_i32(cpu_T[0], cpu_gregs[REG(B11_8)], 1); | |
| 1240 | - gen_cmp_imm(TCG_COND_NE, cpu_T[0], 0); | |
| 1321 | + gen_copy_bit_i32(cpu_sr, 0, cpu_gregs[REG(B11_8)], 0); | |
| 1241 | 1322 | tcg_gen_shri_i32(cpu_gregs[REG(B11_8)], cpu_gregs[REG(B11_8)], 1); |
| 1242 | 1323 | return; |
| 1243 | 1324 | case 0x4008: /* shll2 Rn */ | ... | ... |