Commit a46256129e80d993d23ed9d95566c79bcfa65e2d
1 parent
3a8a44c4
SH4: convert simple compare instructions to TCG
(Shin-ichiro KAWASAKI) git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@5108 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
2 changed files
with
53 additions
and
87 deletions
target-sh4/op.c
... | ... | @@ -37,12 +37,6 @@ static inline void cond_t(int cond) |
37 | 37 | clr_t(); |
38 | 38 | } |
39 | 39 | |
40 | -void OPPROTO op_cmp_eq_imm_T0(void) | |
41 | -{ | |
42 | - cond_t((int32_t) T0 == (int32_t) PARAM1); | |
43 | - RETURN(); | |
44 | -} | |
45 | - | |
46 | 40 | void OPPROTO op_bf_s(void) |
47 | 41 | { |
48 | 42 | env->delayed_pc = PARAM1; |
... | ... | @@ -144,36 +138,6 @@ void OPPROTO op_addv_T0_T1(void) |
144 | 138 | RETURN(); |
145 | 139 | } |
146 | 140 | |
147 | -void OPPROTO op_cmp_eq_T0_T1(void) | |
148 | -{ | |
149 | - cond_t(T1 == T0); | |
150 | - RETURN(); | |
151 | -} | |
152 | - | |
153 | -void OPPROTO op_cmp_ge_T0_T1(void) | |
154 | -{ | |
155 | - cond_t((int32_t) T1 >= (int32_t) T0); | |
156 | - RETURN(); | |
157 | -} | |
158 | - | |
159 | -void OPPROTO op_cmp_gt_T0_T1(void) | |
160 | -{ | |
161 | - cond_t((int32_t) T1 > (int32_t) T0); | |
162 | - RETURN(); | |
163 | -} | |
164 | - | |
165 | -void OPPROTO op_cmp_hi_T0_T1(void) | |
166 | -{ | |
167 | - cond_t((uint32_t) T1 > (uint32_t) T0); | |
168 | - RETURN(); | |
169 | -} | |
170 | - | |
171 | -void OPPROTO op_cmp_hs_T0_T1(void) | |
172 | -{ | |
173 | - cond_t((uint32_t) T1 >= (uint32_t) T0); | |
174 | - RETURN(); | |
175 | -} | |
176 | - | |
177 | 141 | void OPPROTO op_cmp_str_T0_T1(void) |
178 | 142 | { |
179 | 143 | cond_t((T0 & 0x000000ff) == (T1 & 0x000000ff) || |
... | ... | @@ -183,12 +147,6 @@ void OPPROTO op_cmp_str_T0_T1(void) |
183 | 147 | RETURN(); |
184 | 148 | } |
185 | 149 | |
186 | -void OPPROTO op_tst_T0_T1(void) | |
187 | -{ | |
188 | - cond_t((T1 & T0) == 0); | |
189 | - RETURN(); | |
190 | -} | |
191 | - | |
192 | 150 | void OPPROTO op_div0s_T0_T1(void) |
193 | 151 | { |
194 | 152 | if (T1 & 0x80000000) |
... | ... | @@ -299,18 +257,6 @@ void OPPROTO op_trapa(void) |
299 | 257 | RETURN(); |
300 | 258 | } |
301 | 259 | |
302 | -void OPPROTO op_cmp_pl_T0(void) | |
303 | -{ | |
304 | - cond_t((int32_t) T0 > 0); | |
305 | - RETURN(); | |
306 | -} | |
307 | - | |
308 | -void OPPROTO op_cmp_pz_T0(void) | |
309 | -{ | |
310 | - cond_t((int32_t) T0 >= 0); | |
311 | - RETURN(); | |
312 | -} | |
313 | - | |
314 | 260 | void OPPROTO op_jmp_T0(void) |
315 | 261 | { |
316 | 262 | env->delayed_pc = T0; |
... | ... | @@ -610,18 +556,6 @@ void OPPROTO op_fmov_T0_frN(void) |
610 | 556 | RETURN(); |
611 | 557 | } |
612 | 558 | |
613 | -void OPPROTO op_dt_rN(void) | |
614 | -{ | |
615 | - cond_t((--env->gregs[PARAM1]) == 0); | |
616 | - RETURN(); | |
617 | -} | |
618 | - | |
619 | -void OPPROTO op_tst_imm_rN(void) | |
620 | -{ | |
621 | - cond_t((env->gregs[PARAM2] & PARAM1) == 0); | |
622 | - RETURN(); | |
623 | -} | |
624 | - | |
625 | 559 | void OPPROTO op_movl_fpul_FT0(void) |
626 | 560 | { |
627 | 561 | FT0 = *(float32 *)&env->fpul; |
... | ... | @@ -656,12 +590,6 @@ void OPPROTO op_movl_delayed_pc_PC(void) |
656 | 590 | RETURN(); |
657 | 591 | } |
658 | 592 | |
659 | -void OPPROTO op_tst_imm_T0(void) | |
660 | -{ | |
661 | - cond_t((T0 & PARAM1) == 0); | |
662 | - RETURN(); | |
663 | -} | |
664 | - | |
665 | 593 | void OPPROTO op_raise_illegal_instruction(void) |
666 | 594 | { |
667 | 595 | env->exception_index = 0x180; | ... | ... |
target-sh4/translate.c
... | ... | @@ -283,6 +283,40 @@ static void gen_delayed_conditional_jump(DisasContext * ctx) |
283 | 283 | gen_jump(ctx); |
284 | 284 | } |
285 | 285 | |
286 | +static inline void gen_set_t(void) | |
287 | +{ | |
288 | + tcg_gen_ori_i32(cpu_sr, cpu_sr, SR_T); | |
289 | +} | |
290 | + | |
291 | +static inline void gen_clr_t(void) | |
292 | +{ | |
293 | + tcg_gen_andi_i32(cpu_sr, cpu_sr, ~SR_T); | |
294 | +} | |
295 | + | |
296 | +static inline void gen_cmp(int cond, TCGv t0, TCGv t1) | |
297 | +{ | |
298 | + int label1 = gen_new_label(); | |
299 | + int label2 = gen_new_label(); | |
300 | + tcg_gen_brcond_i32(cond, t1, t0, label1); | |
301 | + gen_clr_t(); | |
302 | + tcg_gen_br(label2); | |
303 | + gen_set_label(label1); | |
304 | + gen_set_t(); | |
305 | + gen_set_label(label2); | |
306 | +} | |
307 | + | |
308 | +static inline void gen_cmp_imm(int cond, TCGv t0, int32_t imm) | |
309 | +{ | |
310 | + int label1 = gen_new_label(); | |
311 | + int label2 = gen_new_label(); | |
312 | + tcg_gen_brcondi_i32(cond, t0, imm, label1); | |
313 | + gen_clr_t(); | |
314 | + tcg_gen_br(label2); | |
315 | + gen_set_label(label1); | |
316 | + gen_set_t(); | |
317 | + gen_set_label(label2); | |
318 | +} | |
319 | + | |
286 | 320 | #define B3_0 (ctx->opcode & 0xf) |
287 | 321 | #define B6_4 ((ctx->opcode >> 4) & 0x7) |
288 | 322 | #define B7_4 ((ctx->opcode >> 4) & 0xf) |
... | ... | @@ -331,7 +365,7 @@ void _decode_opc(DisasContext * ctx) |
331 | 365 | tcg_gen_andi_i32(cpu_sr, cpu_sr, ~SR_S); |
332 | 366 | return; |
333 | 367 | case 0x0008: /* clrt */ |
334 | - tcg_gen_andi_i32(cpu_sr, cpu_sr, ~SR_T); | |
368 | + gen_clr_t(); | |
335 | 369 | return; |
336 | 370 | case 0x0038: /* ldtlb */ |
337 | 371 | #if defined(CONFIG_USER_ONLY) |
... | ... | @@ -349,7 +383,7 @@ void _decode_opc(DisasContext * ctx) |
349 | 383 | tcg_gen_ori_i32(cpu_sr, cpu_sr, SR_S); |
350 | 384 | return; |
351 | 385 | case 0x0018: /* sett */ |
352 | - tcg_gen_ori_i32(cpu_sr, cpu_sr, SR_T); | |
386 | + gen_set_t(); | |
353 | 387 | return; |
354 | 388 | case 0xfbfd: /* frchg */ |
355 | 389 | gen_op_frchg(); |
... | ... | @@ -582,27 +616,27 @@ void _decode_opc(DisasContext * ctx) |
582 | 616 | case 0x3000: /* cmp/eq Rm,Rn */ |
583 | 617 | tcg_gen_mov_i32(cpu_T[0], cpu_gregs[REG(B7_4)]); |
584 | 618 | tcg_gen_mov_i32(cpu_T[1], cpu_gregs[REG(B11_8)]); |
585 | - gen_op_cmp_eq_T0_T1(); | |
619 | + gen_cmp(TCG_COND_EQ, cpu_T[0], cpu_T[1]); | |
586 | 620 | return; |
587 | 621 | case 0x3003: /* cmp/ge Rm,Rn */ |
588 | 622 | tcg_gen_mov_i32(cpu_T[0], cpu_gregs[REG(B7_4)]); |
589 | 623 | tcg_gen_mov_i32(cpu_T[1], cpu_gregs[REG(B11_8)]); |
590 | - gen_op_cmp_ge_T0_T1(); | |
624 | + gen_cmp(TCG_COND_GE, cpu_T[0], cpu_T[1]); | |
591 | 625 | return; |
592 | 626 | case 0x3007: /* cmp/gt Rm,Rn */ |
593 | 627 | tcg_gen_mov_i32(cpu_T[0], cpu_gregs[REG(B7_4)]); |
594 | 628 | tcg_gen_mov_i32(cpu_T[1], cpu_gregs[REG(B11_8)]); |
595 | - gen_op_cmp_gt_T0_T1(); | |
629 | + gen_cmp(TCG_COND_GT, cpu_T[0], cpu_T[1]); | |
596 | 630 | return; |
597 | 631 | case 0x3006: /* cmp/hi Rm,Rn */ |
598 | 632 | tcg_gen_mov_i32(cpu_T[0], cpu_gregs[REG(B7_4)]); |
599 | 633 | tcg_gen_mov_i32(cpu_T[1], cpu_gregs[REG(B11_8)]); |
600 | - gen_op_cmp_hi_T0_T1(); | |
634 | + gen_cmp(TCG_COND_GTU, cpu_T[0], cpu_T[1]); | |
601 | 635 | return; |
602 | 636 | case 0x3002: /* cmp/hs Rm,Rn */ |
603 | 637 | tcg_gen_mov_i32(cpu_T[0], cpu_gregs[REG(B7_4)]); |
604 | 638 | tcg_gen_mov_i32(cpu_T[1], cpu_gregs[REG(B11_8)]); |
605 | - gen_op_cmp_hs_T0_T1(); | |
639 | + gen_cmp(TCG_COND_GEU, cpu_T[0], cpu_T[1]); | |
606 | 640 | return; |
607 | 641 | case 0x200c: /* cmp/str Rm,Rn */ |
608 | 642 | tcg_gen_mov_i32(cpu_T[0], cpu_gregs[REG(B7_4)]); |
... | ... | @@ -737,7 +771,8 @@ void _decode_opc(DisasContext * ctx) |
737 | 771 | case 0x2008: /* tst Rm,Rn */ |
738 | 772 | tcg_gen_mov_i32(cpu_T[0], cpu_gregs[REG(B7_4)]); |
739 | 773 | tcg_gen_mov_i32(cpu_T[1], cpu_gregs[REG(B11_8)]); |
740 | - gen_op_tst_T0_T1(); | |
774 | + tcg_gen_and_i32(cpu_T[0], cpu_T[0], cpu_T[1]); | |
775 | + gen_cmp_imm(TCG_COND_EQ, cpu_T[0], 0); | |
741 | 776 | return; |
742 | 777 | case 0x200a: /* xor Rm,Rn */ |
743 | 778 | tcg_gen_xor_i32(cpu_gregs[REG(B11_8)], cpu_gregs[REG(B11_8)], cpu_gregs[REG(B7_4)]); |
... | ... | @@ -911,7 +946,7 @@ void _decode_opc(DisasContext * ctx) |
911 | 946 | return; |
912 | 947 | case 0x8800: /* cmp/eq #imm,R0 */ |
913 | 948 | tcg_gen_mov_i32(cpu_T[0], cpu_gregs[REG(0)]); |
914 | - gen_op_cmp_eq_imm_T0(B7_0s); | |
949 | + gen_cmp_imm(TCG_COND_EQ, cpu_T[0], B7_0s); | |
915 | 950 | return; |
916 | 951 | case 0xc400: /* mov.b @(disp,GBR),R0 */ |
917 | 952 | gen_op_stc_gbr_T0(); |
... | ... | @@ -997,13 +1032,15 @@ void _decode_opc(DisasContext * ctx) |
997 | 1032 | ctx->bstate = BS_BRANCH; |
998 | 1033 | return; |
999 | 1034 | case 0xc800: /* tst #imm,R0 */ |
1000 | - gen_op_tst_imm_rN(B7_0, REG(0)); | |
1035 | + tcg_gen_andi_i32(cpu_T[0], cpu_gregs[REG(0)], B7_0); | |
1036 | + gen_cmp_imm(TCG_COND_EQ, cpu_T[0], 0); | |
1001 | 1037 | return; |
1002 | 1038 | case 0xcc00: /* tst.b #imm,@(R0,GBR) */ |
1003 | 1039 | tcg_gen_mov_i32(cpu_T[0], cpu_gregs[REG(0)]); |
1004 | 1040 | tcg_gen_add_i32(cpu_T[0], cpu_T[0], cpu_gbr); |
1005 | 1041 | gen_op_ldub_T0_T0(ctx); |
1006 | - gen_op_tst_imm_T0(B7_0); | |
1042 | + tcg_gen_andi_i32(cpu_T[0], cpu_T[0], B7_0); | |
1043 | + gen_cmp_imm(TCG_COND_EQ, cpu_T[0], 0); | |
1007 | 1044 | return; |
1008 | 1045 | case 0xca00: /* xor #imm,R0 */ |
1009 | 1046 | tcg_gen_xori_i32(cpu_gregs[REG(0)], cpu_gregs[REG(0)], B7_0); |
... | ... | @@ -1058,14 +1095,15 @@ void _decode_opc(DisasContext * ctx) |
1058 | 1095 | return; |
1059 | 1096 | case 0x4015: /* cmp/pl Rn */ |
1060 | 1097 | tcg_gen_mov_i32(cpu_T[0], cpu_gregs[REG(B11_8)]); |
1061 | - gen_op_cmp_pl_T0(); | |
1098 | + gen_cmp_imm(TCG_COND_GT, cpu_T[0], 0); | |
1062 | 1099 | return; |
1063 | 1100 | case 0x4011: /* cmp/pz Rn */ |
1064 | 1101 | tcg_gen_mov_i32(cpu_T[0], cpu_gregs[REG(B11_8)]); |
1065 | - gen_op_cmp_pz_T0(); | |
1102 | + gen_cmp_imm(TCG_COND_GE, cpu_T[0], 0); | |
1066 | 1103 | return; |
1067 | 1104 | case 0x4010: /* dt Rn */ |
1068 | - gen_op_dt_rN(REG(B11_8)); | |
1105 | + tcg_gen_subi_i32(cpu_gregs[REG(B11_8)], cpu_gregs[REG(B11_8)], 1); | |
1106 | + gen_cmp_imm(TCG_COND_EQ, cpu_gregs[REG(B11_8)], 0); | |
1069 | 1107 | return; |
1070 | 1108 | case 0x402b: /* jmp @Rn */ |
1071 | 1109 | CHECK_NOT_DELAY_SLOT tcg_gen_mov_i32(cpu_T[0], cpu_gregs[REG(B11_8)]); |
... | ... | @@ -1187,7 +1225,7 @@ void _decode_opc(DisasContext * ctx) |
1187 | 1225 | tcg_gen_mov_i32(cpu_T[0], cpu_gregs[REG(B11_8)]); |
1188 | 1226 | tcg_gen_mov_i32(cpu_T[1], cpu_T[0]); |
1189 | 1227 | gen_op_ldub_T0_T0(ctx); |
1190 | - gen_op_cmp_eq_imm_T0(0); | |
1228 | + gen_cmp_imm(TCG_COND_EQ, cpu_T[0], 0); | |
1191 | 1229 | tcg_gen_ori_i32(cpu_T[0], cpu_T[0], 0x80); |
1192 | 1230 | gen_op_stb_T0_T1(ctx); |
1193 | 1231 | return; | ... | ... |