Commit d2604285b26501435286d7d2933d9017920794d6
1 parent
f31e9370
Implement TCG not ops for x86-64
Signed-off-by: Aurelien Jarno <aurelien@aurel32.net> git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@6797 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
4 changed files
with
26 additions
and
0 deletions
tcg/tcg-op.h
... | ... | @@ -1425,12 +1425,20 @@ static inline void tcg_gen_neg_i64(TCGv_i64 ret, TCGv_i64 arg) |
1425 | 1425 | |
1426 | 1426 | static inline void tcg_gen_not_i32(TCGv_i32 ret, TCGv_i32 arg) |
1427 | 1427 | { |
1428 | +#ifdef TCG_TARGET_HAS_not_i32 | |
1429 | + tcg_gen_op2_i32(INDEX_op_not_i32, ret, arg); | |
1430 | +#else | |
1428 | 1431 | tcg_gen_xori_i32(ret, arg, -1); |
1432 | +#endif | |
1429 | 1433 | } |
1430 | 1434 | |
1431 | 1435 | static inline void tcg_gen_not_i64(TCGv_i64 ret, TCGv_i64 arg) |
1432 | 1436 | { |
1437 | +#ifdef TCG_TARGET_HAS_not_i64 | |
1438 | + tcg_gen_op2_i32(INDEX_op_not_i64, ret, arg); | |
1439 | +#else | |
1433 | 1440 | tcg_gen_xori_i64(ret, arg, -1); |
1441 | +#endif | |
1434 | 1442 | } |
1435 | 1443 | |
1436 | 1444 | static inline void tcg_gen_discard_i32(TCGv_i32 arg) | ... | ... |
tcg/tcg-opc.h
... | ... | @@ -147,6 +147,12 @@ DEF2(ext32s_i64, 1, 1, 0, 0) |
147 | 147 | DEF2(bswap_i64, 1, 1, 0, 0) |
148 | 148 | #endif |
149 | 149 | #endif |
150 | +#ifdef TCG_TARGET_HAS_not_i32 | |
151 | +DEF2(not_i32, 1, 1, 0, 0) | |
152 | +#endif | |
153 | +#ifdef TCG_TARGET_HAS_not_i64 | |
154 | +DEF2(not_i64, 1, 1, 0, 0) | |
155 | +#endif | |
150 | 156 | #ifdef TCG_TARGET_HAS_neg_i32 |
151 | 157 | DEF2(neg_i32, 1, 1, 0, 0) |
152 | 158 | #endif | ... | ... |
tcg/x86_64/tcg-target.c
... | ... | @@ -1108,6 +1108,13 @@ static inline void tcg_out_op(TCGContext *s, int opc, const TCGArg *args, |
1108 | 1108 | tcg_out_modrm(s, 0xf7 | P_REXW, 3, args[0]); |
1109 | 1109 | break; |
1110 | 1110 | |
1111 | + case INDEX_op_not_i32: | |
1112 | + tcg_out_modrm(s, 0xf7, 2, args[0]); | |
1113 | + break; | |
1114 | + case INDEX_op_not_i64: | |
1115 | + tcg_out_modrm(s, 0xf7 | P_REXW, 2, args[0]); | |
1116 | + break; | |
1117 | + | |
1111 | 1118 | case INDEX_op_ext8s_i32: |
1112 | 1119 | tcg_out_modrm(s, 0xbe | P_EXT | P_REXB, args[0], args[1]); |
1113 | 1120 | break; |
... | ... | @@ -1286,6 +1293,9 @@ static const TCGTargetOpDef x86_64_op_defs[] = { |
1286 | 1293 | { INDEX_op_neg_i32, { "r", "0" } }, |
1287 | 1294 | { INDEX_op_neg_i64, { "r", "0" } }, |
1288 | 1295 | |
1296 | + { INDEX_op_not_i32, { "r", "0" } }, | |
1297 | + { INDEX_op_not_i64, { "r", "0" } }, | |
1298 | + | |
1289 | 1299 | { INDEX_op_ext8s_i32, { "r", "r"} }, |
1290 | 1300 | { INDEX_op_ext16s_i32, { "r", "r"} }, |
1291 | 1301 | { INDEX_op_ext8s_i64, { "r", "r"} }, | ... | ... |
tcg/x86_64/tcg-target.h
... | ... | @@ -60,6 +60,8 @@ enum { |
60 | 60 | #define TCG_TARGET_HAS_bswap_i64 |
61 | 61 | #define TCG_TARGET_HAS_neg_i32 |
62 | 62 | #define TCG_TARGET_HAS_neg_i64 |
63 | +#define TCG_TARGET_HAS_not_i32 | |
64 | +#define TCG_TARGET_HAS_not_i64 | |
63 | 65 | #define TCG_TARGET_HAS_ext8s_i32 |
64 | 66 | #define TCG_TARGET_HAS_ext16s_i32 |
65 | 67 | #define TCG_TARGET_HAS_ext8s_i64 | ... | ... |