Revision 92e90443
b/target-mips/translate.c | ||
---|---|---|
688 | 688 |
#undef FOP_CONDS |
689 | 689 |
|
690 | 690 |
/* Tests */ |
691 |
#define OP_COND(name, cond) \ |
|
692 |
static inline void glue(gen_op_, name) (TCGv t0, TCGv t1) \
|
|
693 |
{ \ |
|
694 |
int l1 = gen_new_label(); \ |
|
695 |
int l2 = gen_new_label(); \ |
|
696 |
\ |
|
697 |
tcg_gen_brcond_tl(cond, t0, t1, l1); \ |
|
698 |
tcg_gen_movi_tl(t0, 0); \
|
|
699 |
tcg_gen_br(l2); \ |
|
700 |
gen_set_label(l1); \ |
|
701 |
tcg_gen_movi_tl(t0, 1); \
|
|
702 |
gen_set_label(l2); \ |
|
691 |
#define OP_COND(name, cond) \
|
|
692 |
static inline void glue(gen_op_, name) (TCGv ret, TCGv t0, TCGv t1) \
|
|
693 |
{ \
|
|
694 |
int l1 = gen_new_label(); \
|
|
695 |
int l2 = gen_new_label(); \
|
|
696 |
\
|
|
697 |
tcg_gen_brcond_tl(cond, t0, t1, l1); \
|
|
698 |
tcg_gen_movi_tl(ret, 0); \
|
|
699 |
tcg_gen_br(l2); \
|
|
700 |
gen_set_label(l1); \
|
|
701 |
tcg_gen_movi_tl(ret, 1); \
|
|
702 |
gen_set_label(l2); \
|
|
703 | 703 |
} |
704 | 704 |
OP_COND(eq, TCG_COND_EQ); |
705 | 705 |
OP_COND(ne, TCG_COND_NE); |
... | ... | |
709 | 709 |
OP_COND(ltu, TCG_COND_LTU); |
710 | 710 |
#undef OP_COND |
711 | 711 |
|
712 |
#define OP_CONDI(name, cond) \ |
|
713 |
static inline void glue(gen_op_, name) (TCGv t, target_ulong val) \
|
|
714 |
{ \ |
|
715 |
int l1 = gen_new_label(); \ |
|
716 |
int l2 = gen_new_label(); \ |
|
717 |
\ |
|
718 |
tcg_gen_brcondi_tl(cond, t, val, l1); \
|
|
719 |
tcg_gen_movi_tl(t, 0); \
|
|
720 |
tcg_gen_br(l2); \ |
|
721 |
gen_set_label(l1); \ |
|
722 |
tcg_gen_movi_tl(t, 1); \
|
|
723 |
gen_set_label(l2); \ |
|
712 |
#define OP_CONDI(name, cond) \
|
|
713 |
static inline void glue(gen_op_, name) (TCGv ret, TCGv t0, target_ulong val) \
|
|
714 |
{ \
|
|
715 |
int l1 = gen_new_label(); \
|
|
716 |
int l2 = gen_new_label(); \
|
|
717 |
\
|
|
718 |
tcg_gen_brcondi_tl(cond, t0, val, l1); \
|
|
719 |
tcg_gen_movi_tl(ret, 0); \
|
|
720 |
tcg_gen_br(l2); \
|
|
721 |
gen_set_label(l1); \
|
|
722 |
tcg_gen_movi_tl(ret, 1); \
|
|
723 |
gen_set_label(l2); \
|
|
724 | 724 |
} |
725 | 725 |
OP_CONDI(lti, TCG_COND_LT); |
726 | 726 |
OP_CONDI(ltiu, TCG_COND_LTU); |
727 | 727 |
#undef OP_CONDI |
728 | 728 |
|
729 | 729 |
#define OP_CONDZ(name, cond) \ |
730 |
static inline void glue(gen_op_, name) (TCGv t) \
|
|
730 |
static inline void glue(gen_op_, name) (TCGv ret, TCGv t0) \
|
|
731 | 731 |
{ \ |
732 | 732 |
int l1 = gen_new_label(); \ |
733 | 733 |
int l2 = gen_new_label(); \ |
734 | 734 |
\ |
735 |
tcg_gen_brcondi_tl(cond, t, 0, l1); \
|
|
736 |
tcg_gen_movi_tl(t, 0); \
|
|
735 |
tcg_gen_brcondi_tl(cond, t0, 0, l1); \
|
|
736 |
tcg_gen_movi_tl(ret, 0); \
|
|
737 | 737 |
tcg_gen_br(l2); \ |
738 | 738 |
gen_set_label(l1); \ |
739 |
tcg_gen_movi_tl(t, 1); \
|
|
739 |
tcg_gen_movi_tl(ret, 1); \
|
|
740 | 740 |
gen_set_label(l2); \ |
741 | 741 |
} |
742 | 742 |
OP_CONDZ(gez, TCG_COND_GE); |
... | ... | |
1309 | 1309 |
break; |
1310 | 1310 |
#endif |
1311 | 1311 |
case OPC_SLTI: |
1312 |
gen_op_lti(t0, uimm); |
|
1312 |
gen_op_lti(t0, t0, uimm);
|
|
1313 | 1313 |
opn = "slti"; |
1314 | 1314 |
break; |
1315 | 1315 |
case OPC_SLTIU: |
1316 |
gen_op_ltiu(t0, uimm); |
|
1316 |
gen_op_ltiu(t0, t0, uimm);
|
|
1317 | 1317 |
opn = "sltiu"; |
1318 | 1318 |
break; |
1319 | 1319 |
case OPC_ANDI: |
... | ... | |
1596 | 1596 |
break; |
1597 | 1597 |
#endif |
1598 | 1598 |
case OPC_SLT: |
1599 |
gen_op_lt(t0, t1); |
|
1599 |
gen_op_lt(t0, t0, t1);
|
|
1600 | 1600 |
opn = "slt"; |
1601 | 1601 |
break; |
1602 | 1602 |
case OPC_SLTU: |
1603 |
gen_op_ltu(t0, t1); |
|
1603 |
gen_op_ltu(t0, t0, t1);
|
|
1604 | 1604 |
opn = "sltu"; |
1605 | 1605 |
break; |
1606 | 1606 |
case OPC_AND: |
... | ... | |
2227 | 2227 |
switch (opc) { |
2228 | 2228 |
case OPC_TEQ: |
2229 | 2229 |
case OPC_TEQI: |
2230 |
gen_op_eq(t0, t1); |
|
2230 |
gen_op_eq(t0, t0, t1);
|
|
2231 | 2231 |
break; |
2232 | 2232 |
case OPC_TGE: |
2233 | 2233 |
case OPC_TGEI: |
2234 |
gen_op_ge(t0, t1); |
|
2234 |
gen_op_ge(t0, t0, t1);
|
|
2235 | 2235 |
break; |
2236 | 2236 |
case OPC_TGEU: |
2237 | 2237 |
case OPC_TGEIU: |
2238 |
gen_op_geu(t0, t1); |
|
2238 |
gen_op_geu(t0, t0, t1);
|
|
2239 | 2239 |
break; |
2240 | 2240 |
case OPC_TLT: |
2241 | 2241 |
case OPC_TLTI: |
2242 |
gen_op_lt(t0, t1); |
|
2242 |
gen_op_lt(t0, t0, t1);
|
|
2243 | 2243 |
break; |
2244 | 2244 |
case OPC_TLTU: |
2245 | 2245 |
case OPC_TLTIU: |
2246 |
gen_op_ltu(t0, t1); |
|
2246 |
gen_op_ltu(t0, t0, t1);
|
|
2247 | 2247 |
break; |
2248 | 2248 |
case OPC_TNE: |
2249 | 2249 |
case OPC_TNEI: |
2250 |
gen_op_ne(t0, t1); |
|
2250 |
gen_op_ne(t0, t0, t1);
|
|
2251 | 2251 |
break; |
2252 | 2252 |
default: |
2253 | 2253 |
MIPS_INVAL("trap"); |
... | ... | |
2427 | 2427 |
} else { |
2428 | 2428 |
switch (opc) { |
2429 | 2429 |
case OPC_BEQ: |
2430 |
gen_op_eq(t0, t1); |
|
2430 |
gen_op_eq(t0, t0, t1);
|
|
2431 | 2431 |
MIPS_DEBUG("beq %s, %s, " TARGET_FMT_lx, |
2432 | 2432 |
regnames[rs], regnames[rt], btgt); |
2433 | 2433 |
goto not_likely; |
2434 | 2434 |
case OPC_BEQL: |
2435 |
gen_op_eq(t0, t1); |
|
2435 |
gen_op_eq(t0, t0, t1);
|
|
2436 | 2436 |
MIPS_DEBUG("beql %s, %s, " TARGET_FMT_lx, |
2437 | 2437 |
regnames[rs], regnames[rt], btgt); |
2438 | 2438 |
goto likely; |
2439 | 2439 |
case OPC_BNE: |
2440 |
gen_op_ne(t0, t1); |
|
2440 |
gen_op_ne(t0, t0, t1);
|
|
2441 | 2441 |
MIPS_DEBUG("bne %s, %s, " TARGET_FMT_lx, |
2442 | 2442 |
regnames[rs], regnames[rt], btgt); |
2443 | 2443 |
goto not_likely; |
2444 | 2444 |
case OPC_BNEL: |
2445 |
gen_op_ne(t0, t1); |
|
2445 |
gen_op_ne(t0, t0, t1);
|
|
2446 | 2446 |
MIPS_DEBUG("bnel %s, %s, " TARGET_FMT_lx, |
2447 | 2447 |
regnames[rs], regnames[rt], btgt); |
2448 | 2448 |
goto likely; |
2449 | 2449 |
case OPC_BGEZ: |
2450 |
gen_op_gez(t0); |
|
2450 |
gen_op_gez(t0, t0);
|
|
2451 | 2451 |
MIPS_DEBUG("bgez %s, " TARGET_FMT_lx, regnames[rs], btgt); |
2452 | 2452 |
goto not_likely; |
2453 | 2453 |
case OPC_BGEZL: |
2454 |
gen_op_gez(t0); |
|
2454 |
gen_op_gez(t0, t0);
|
|
2455 | 2455 |
MIPS_DEBUG("bgezl %s, " TARGET_FMT_lx, regnames[rs], btgt); |
2456 | 2456 |
goto likely; |
2457 | 2457 |
case OPC_BGEZAL: |
2458 |
gen_op_gez(t0); |
|
2458 |
gen_op_gez(t0, t0);
|
|
2459 | 2459 |
MIPS_DEBUG("bgezal %s, " TARGET_FMT_lx, regnames[rs], btgt); |
2460 | 2460 |
blink = 31; |
2461 | 2461 |
goto not_likely; |
2462 | 2462 |
case OPC_BGEZALL: |
2463 |
gen_op_gez(t0); |
|
2463 |
gen_op_gez(t0, t0);
|
|
2464 | 2464 |
blink = 31; |
2465 | 2465 |
MIPS_DEBUG("bgezall %s, " TARGET_FMT_lx, regnames[rs], btgt); |
2466 | 2466 |
goto likely; |
2467 | 2467 |
case OPC_BGTZ: |
2468 |
gen_op_gtz(t0); |
|
2468 |
gen_op_gtz(t0, t0);
|
|
2469 | 2469 |
MIPS_DEBUG("bgtz %s, " TARGET_FMT_lx, regnames[rs], btgt); |
2470 | 2470 |
goto not_likely; |
2471 | 2471 |
case OPC_BGTZL: |
2472 |
gen_op_gtz(t0); |
|
2472 |
gen_op_gtz(t0, t0);
|
|
2473 | 2473 |
MIPS_DEBUG("bgtzl %s, " TARGET_FMT_lx, regnames[rs], btgt); |
2474 | 2474 |
goto likely; |
2475 | 2475 |
case OPC_BLEZ: |
2476 |
gen_op_lez(t0); |
|
2476 |
gen_op_lez(t0, t0);
|
|
2477 | 2477 |
MIPS_DEBUG("blez %s, " TARGET_FMT_lx, regnames[rs], btgt); |
2478 | 2478 |
goto not_likely; |
2479 | 2479 |
case OPC_BLEZL: |
2480 |
gen_op_lez(t0); |
|
2480 |
gen_op_lez(t0, t0);
|
|
2481 | 2481 |
MIPS_DEBUG("blezl %s, " TARGET_FMT_lx, regnames[rs], btgt); |
2482 | 2482 |
goto likely; |
2483 | 2483 |
case OPC_BLTZ: |
2484 |
gen_op_ltz(t0); |
|
2484 |
gen_op_ltz(t0, t0);
|
|
2485 | 2485 |
MIPS_DEBUG("bltz %s, " TARGET_FMT_lx, regnames[rs], btgt); |
2486 | 2486 |
goto not_likely; |
2487 | 2487 |
case OPC_BLTZL: |
2488 |
gen_op_ltz(t0); |
|
2488 |
gen_op_ltz(t0, t0);
|
|
2489 | 2489 |
MIPS_DEBUG("bltzl %s, " TARGET_FMT_lx, regnames[rs], btgt); |
2490 | 2490 |
goto likely; |
2491 | 2491 |
case OPC_BLTZAL: |
2492 |
gen_op_ltz(t0); |
|
2492 |
gen_op_ltz(t0, t0);
|
|
2493 | 2493 |
blink = 31; |
2494 | 2494 |
MIPS_DEBUG("bltzal %s, " TARGET_FMT_lx, regnames[rs], btgt); |
2495 | 2495 |
not_likely: |
... | ... | |
2497 | 2497 |
tcg_gen_trunc_tl_i32(bcond, t0); |
2498 | 2498 |
break; |
2499 | 2499 |
case OPC_BLTZALL: |
2500 |
gen_op_ltz(t0); |
|
2500 |
gen_op_ltz(t0, t0);
|
|
2501 | 2501 |
blink = 31; |
2502 | 2502 |
MIPS_DEBUG("bltzall %s, " TARGET_FMT_lx, regnames[rs], btgt); |
2503 | 2503 |
likely: |
Also available in: Unified diff