Revision 390efc54
b/target-arm/translate.c | ||
---|---|---|
457 | 457 |
tcg_gen_xori_i32(t0, t1, ~0); |
458 | 458 |
} |
459 | 459 |
|
460 |
/* FIXME: Implement this natively. */ |
|
461 |
static inline void tcg_gen_neg_i64(TCGv dest, TCGv src) |
|
462 |
{ |
|
463 |
tcg_gen_sub_i64(dest, tcg_const_i64(0), src); |
|
464 |
} |
|
465 |
|
|
466 | 460 |
/* T0 &= ~T1. Clobbers T1. */ |
467 | 461 |
/* FIXME: Implement bic natively. */ |
468 | 462 |
static inline void tcg_gen_bic_i32(TCGv dest, TCGv t0, TCGv t1) |
... | ... | |
8111 | 8105 |
break; |
8112 | 8106 |
case 0x9: /* neg */ |
8113 | 8107 |
if (s->condexec_mask) |
8114 |
gen_op_subl_T0_T1();
|
|
8108 |
tcg_gen_neg_i32(cpu_T[0], cpu_T[1]);
|
|
8115 | 8109 |
else |
8116 | 8110 |
gen_op_subl_T0_T1_cc(); |
8117 | 8111 |
break; |
b/target-cris/translate.c | ||
---|---|---|
318 | 318 |
|
319 | 319 |
/* y = -(x >> 16) */ |
320 | 320 |
tcg_gen_shri_i32(y, x, 16); |
321 |
tcg_gen_sub_i32(y, tcg_const_i32(0), y);
|
|
321 |
tcg_gen_neg_i32(y, y);
|
|
322 | 322 |
|
323 | 323 |
/* m = (y >> 16) & 16 */ |
324 | 324 |
tcg_gen_sari_i32(m, y, 16); |
... | ... | |
753 | 753 |
t_gen_add_flag(cpu_T[0], 8); /* R_FLAG. */ |
754 | 754 |
break; |
755 | 755 |
case CC_OP_SUB: |
756 |
tcg_gen_sub_tl(cpu_T[1], tcg_const_tl(0), cpu_T[1]);
|
|
756 |
tcg_gen_neg_tl(cpu_T[1], cpu_T[1]);
|
|
757 | 757 |
tcg_gen_add_tl(cpu_T[0], cpu_T[0], cpu_T[1]); |
758 |
tcg_gen_sub_tl(cpu_T[1], tcg_const_tl(0), cpu_T[1]);
|
|
758 |
tcg_gen_neg_tl(cpu_T[1], cpu_T[1]);
|
|
759 | 759 |
/* CRIS flag evaluation needs ~src. */ |
760 | 760 |
tcg_gen_xori_tl(cpu_T[1], cpu_T[1], -1); |
761 | 761 |
|
... | ... | |
784 | 784 |
t_gen_asr(cpu_T[0], cpu_T[0], cpu_T[1]); |
785 | 785 |
break; |
786 | 786 |
case CC_OP_NEG: |
787 |
/* Hopefully the TCG backend recognizes this pattern |
|
788 |
and makes a real neg out of it. */ |
|
789 |
tcg_gen_sub_tl(cpu_T[0], tcg_const_tl(0), cpu_T[1]); |
|
787 |
tcg_gen_neg_tl(cpu_T[0], cpu_T[1]); |
|
790 | 788 |
/* Extended arithmetics. */ |
791 | 789 |
t_gen_subx_carry(cpu_T[0]); |
792 | 790 |
break; |
... | ... | |
829 | 827 |
} |
830 | 828 |
break; |
831 | 829 |
case CC_OP_CMP: |
832 |
tcg_gen_sub_tl(cpu_T[1], tcg_const_tl(0), cpu_T[1]);
|
|
830 |
tcg_gen_neg_tl(cpu_T[1], cpu_T[1]);
|
|
833 | 831 |
tcg_gen_add_tl(cpu_T[0], cpu_T[0], cpu_T[1]); |
834 | 832 |
/* CRIS flag evaluation needs ~src. */ |
835 |
tcg_gen_sub_tl(cpu_T[1], tcg_const_tl(0), cpu_T[1]);
|
|
833 |
tcg_gen_neg_tl(cpu_T[1], cpu_T[1]);
|
|
836 | 834 |
/* CRIS flag evaluation needs ~src. */ |
837 | 835 |
tcg_gen_xori_tl(cpu_T[1], cpu_T[1], -1); |
838 | 836 |
|
... | ... | |
1642 | 1640 |
/* TODO: consider a branch free approach. */ |
1643 | 1641 |
l1 = gen_new_label(); |
1644 | 1642 |
tcg_gen_brcond_tl(TCG_COND_GE, cpu_T[1], tcg_const_tl(0), l1); |
1645 |
tcg_gen_sub_tl(cpu_T[1], tcg_const_tl(0), cpu_T[1]);
|
|
1643 |
tcg_gen_neg_tl(cpu_T[1], cpu_T[1]);
|
|
1646 | 1644 |
gen_set_label(l1); |
1647 | 1645 |
crisv32_alu_op(dc, CC_OP_MOVE, dc->op2, 4); |
1648 | 1646 |
return 2; |
b/tcg/README | ||
---|---|---|
203 | 203 |
|
204 | 204 |
t0=t1-t2 |
205 | 205 |
|
206 |
* neg_i32/i64 t0, t1 |
|
207 |
|
|
208 |
t0=-t1 (two's complement) |
|
209 |
|
|
206 | 210 |
* mul_i32/i64 t0, t1, t2 |
207 | 211 |
|
208 | 212 |
t0=t1*t2 |
b/tcg/tcg-op.h | ||
---|---|---|
1208 | 1208 |
|
1209 | 1209 |
#endif |
1210 | 1210 |
|
1211 |
static inline void tcg_gen_neg_i32(TCGv ret, TCGv arg) |
|
1212 |
{ |
|
1213 |
#ifdef TCG_TARGET_HAS_neg_i32 |
|
1214 |
tcg_gen_op2(INDEX_op_neg_i32, ret, arg); |
|
1215 |
#else |
|
1216 |
tcg_gen_sub_i32(ret, tcg_const_i32(0), arg); |
|
1217 |
#endif |
|
1218 |
} |
|
1219 |
|
|
1220 |
static inline void tcg_gen_neg_i64(TCGv ret, TCGv arg) |
|
1221 |
{ |
|
1222 |
#ifdef TCG_TARGET_HAS_neg_i64 |
|
1223 |
tcg_gen_op2(INDEX_op_neg_i64, ret, arg); |
|
1224 |
#else |
|
1225 |
tcg_gen_sub_i64(ret, tcg_const_i64(0), arg); |
|
1226 |
#endif |
|
1227 |
} |
|
1228 |
|
|
1211 | 1229 |
|
1212 | 1230 |
static inline void tcg_gen_discard_i32(TCGv arg) |
1213 | 1231 |
{ |
... | ... | |
1441 | 1459 |
#define tcg_gen_add_tl tcg_gen_add_i64 |
1442 | 1460 |
#define tcg_gen_addi_tl tcg_gen_addi_i64 |
1443 | 1461 |
#define tcg_gen_sub_tl tcg_gen_sub_i64 |
1462 |
#define tcg_gen_neg_tl tcg_gen_neg_i64 |
|
1444 | 1463 |
#define tcg_gen_subi_tl tcg_gen_subi_i64 |
1445 | 1464 |
#define tcg_gen_and_tl tcg_gen_and_i64 |
1446 | 1465 |
#define tcg_gen_andi_tl tcg_gen_andi_i64 |
... | ... | |
1483 | 1502 |
#define tcg_gen_add_tl tcg_gen_add_i32 |
1484 | 1503 |
#define tcg_gen_addi_tl tcg_gen_addi_i32 |
1485 | 1504 |
#define tcg_gen_sub_tl tcg_gen_sub_i32 |
1505 |
#define tcg_gen_neg_tl tcg_gen_neg_i32 |
|
1486 | 1506 |
#define tcg_gen_subi_tl tcg_gen_subi_i32 |
1487 | 1507 |
#define tcg_gen_and_tl tcg_gen_and_i32 |
1488 | 1508 |
#define tcg_gen_andi_tl tcg_gen_andi_i32 |
b/tcg/tcg-opc.h | ||
---|---|---|
148 | 148 |
DEF2(bswap_i64, 1, 1, 0, 0) |
149 | 149 |
#endif |
150 | 150 |
#endif |
151 |
#ifdef TCG_TARGET_HAS_neg_i32 |
|
152 |
DEF2(neg_i32, 1, 1, 0, 0) |
|
153 |
#endif |
|
154 |
#ifdef TCG_TARGET_HAS_neg_i64 |
|
155 |
DEF2(neg_i64, 1, 1, 0, 0) |
|
156 |
#endif |
|
151 | 157 |
|
152 | 158 |
/* QEMU specific */ |
153 | 159 |
DEF2(exit_tb, 0, 0, 1, TCG_OPF_BB_END | TCG_OPF_SIDE_EFFECTS) |
b/tcg/x86_64/tcg-target.c | ||
---|---|---|
1092 | 1092 |
tcg_out_opc(s, (0xc8 + (args[0] & 7)) | P_EXT | P_REXW, 0, args[0], 0); |
1093 | 1093 |
break; |
1094 | 1094 |
|
1095 |
case INDEX_op_neg_i32: |
|
1096 |
tcg_out_modrm(s, 0xf7, 3, args[0]); |
|
1097 |
break; |
|
1098 |
case INDEX_op_neg_i64: |
|
1099 |
tcg_out_modrm(s, 0xf7 | P_REXW, 3, args[0]); |
|
1100 |
break; |
|
1101 |
|
|
1095 | 1102 |
case INDEX_op_qemu_ld8u: |
1096 | 1103 |
tcg_out_qemu_ld(s, args, 0); |
1097 | 1104 |
break; |
... | ... | |
1247 | 1254 |
{ INDEX_op_bswap_i32, { "r", "0" } }, |
1248 | 1255 |
{ INDEX_op_bswap_i64, { "r", "0" } }, |
1249 | 1256 |
|
1257 |
{ INDEX_op_neg_i32, { "r", "0" } }, |
|
1258 |
{ INDEX_op_neg_i64, { "r", "0" } }, |
|
1259 |
|
|
1250 | 1260 |
{ INDEX_op_qemu_ld8u, { "r", "L" } }, |
1251 | 1261 |
{ INDEX_op_qemu_ld8s, { "r", "L" } }, |
1252 | 1262 |
{ INDEX_op_qemu_ld16u, { "r", "L" } }, |
b/tcg/x86_64/tcg-target.h | ||
---|---|---|
57 | 57 |
/* optional instructions */ |
58 | 58 |
#define TCG_TARGET_HAS_bswap_i32 |
59 | 59 |
#define TCG_TARGET_HAS_bswap_i64 |
60 |
#define TCG_TARGET_HAS_neg_i32 |
|
61 |
#define TCG_TARGET_HAS_neg_i64 |
|
60 | 62 |
|
61 | 63 |
/* Note: must be synced with dyngen-exec.h */ |
62 | 64 |
#define TCG_AREG0 TCG_REG_R14 |
Also available in: Unified diff