Commit 9619376c1be7c6d47310948d186efd9b3ddd203c
1 parent
7fc81051
tcg/x86: add not/neg/extu/bswap/rot i32 ops
Signed-off-by: Aurelien Jarno <aurelien@aurel32.net> git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@6806 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
2 changed files
with
48 additions
and
1 deletions
tcg/i386/tcg-target.c
... | ... | @@ -158,6 +158,8 @@ static inline int tcg_target_const_match(tcg_target_long val, |
158 | 158 | #define ARITH_XOR 6 |
159 | 159 | #define ARITH_CMP 7 |
160 | 160 | |
161 | +#define SHIFT_ROL 0 | |
162 | +#define SHIFT_ROR 1 | |
161 | 163 | #define SHIFT_SHL 4 |
162 | 164 | #define SHIFT_SHR 5 |
163 | 165 | #define SHIFT_SAR 7 |
... | ... | @@ -998,7 +1000,13 @@ static inline void tcg_out_op(TCGContext *s, int opc, |
998 | 1000 | case INDEX_op_sar_i32: |
999 | 1001 | c = SHIFT_SAR; |
1000 | 1002 | goto gen_shift32; |
1001 | - | |
1003 | + case INDEX_op_rotl_i32: | |
1004 | + c = SHIFT_ROL; | |
1005 | + goto gen_shift32; | |
1006 | + case INDEX_op_rotr_i32: | |
1007 | + c = SHIFT_ROR; | |
1008 | + goto gen_shift32; | |
1009 | + | |
1002 | 1010 | case INDEX_op_add2_i32: |
1003 | 1011 | if (const_args[4]) |
1004 | 1012 | tgen_arithi(s, ARITH_ADD, args[0], args[4]); |
... | ... | @@ -1026,6 +1034,25 @@ static inline void tcg_out_op(TCGContext *s, int opc, |
1026 | 1034 | tcg_out_brcond2(s, args, const_args); |
1027 | 1035 | break; |
1028 | 1036 | |
1037 | + case INDEX_op_bswap_i32: | |
1038 | + tcg_out_opc(s, (0xc8 + args[0]) | P_EXT); | |
1039 | + break; | |
1040 | + | |
1041 | + case INDEX_op_neg_i32: | |
1042 | + tcg_out_modrm(s, 0xf7, 3, args[0]); | |
1043 | + break; | |
1044 | + | |
1045 | + case INDEX_op_not_i32: | |
1046 | + tcg_out_modrm(s, 0xf7, 2, args[0]); | |
1047 | + break; | |
1048 | + | |
1049 | + case INDEX_op_ext8s_i32: | |
1050 | + tcg_out_modrm(s, 0xbe | P_EXT, args[0], args[1]); | |
1051 | + break; | |
1052 | + case INDEX_op_ext16s_i32: | |
1053 | + tcg_out_modrm(s, 0xbf | P_EXT, args[0], args[1]); | |
1054 | + break; | |
1055 | + | |
1029 | 1056 | case INDEX_op_qemu_ld8u: |
1030 | 1057 | tcg_out_qemu_ld(s, args, 0); |
1031 | 1058 | break; |
... | ... | @@ -1093,6 +1120,9 @@ static const TCGTargetOpDef x86_op_defs[] = { |
1093 | 1120 | { INDEX_op_shl_i32, { "r", "0", "ci" } }, |
1094 | 1121 | { INDEX_op_shr_i32, { "r", "0", "ci" } }, |
1095 | 1122 | { INDEX_op_sar_i32, { "r", "0", "ci" } }, |
1123 | + { INDEX_op_sar_i32, { "r", "0", "ci" } }, | |
1124 | + { INDEX_op_rotl_i32, { "r", "0", "ci" } }, | |
1125 | + { INDEX_op_rotr_i32, { "r", "0", "ci" } }, | |
1096 | 1126 | |
1097 | 1127 | { INDEX_op_brcond_i32, { "r", "ri" } }, |
1098 | 1128 | |
... | ... | @@ -1100,6 +1130,15 @@ static const TCGTargetOpDef x86_op_defs[] = { |
1100 | 1130 | { INDEX_op_sub2_i32, { "r", "r", "0", "1", "ri", "ri" } }, |
1101 | 1131 | { INDEX_op_brcond2_i32, { "r", "r", "ri", "ri" } }, |
1102 | 1132 | |
1133 | + { INDEX_op_bswap_i32, { "r", "0" } }, | |
1134 | + | |
1135 | + { INDEX_op_neg_i32, { "r", "0" } }, | |
1136 | + | |
1137 | + { INDEX_op_not_i32, { "r", "0" } }, | |
1138 | + | |
1139 | + { INDEX_op_ext8s_i32, { "r", "q" } }, | |
1140 | + { INDEX_op_ext16s_i32, { "r", "r" } }, | |
1141 | + | |
1103 | 1142 | #if TARGET_LONG_BITS == 32 |
1104 | 1143 | { INDEX_op_qemu_ld8u, { "r", "L" } }, |
1105 | 1144 | { INDEX_op_qemu_ld8s, { "r", "L" } }, | ... | ... |
tcg/i386/tcg-target.h
... | ... | @@ -44,6 +44,14 @@ enum { |
44 | 44 | #define TCG_TARGET_STACK_ALIGN 16 |
45 | 45 | #define TCG_TARGET_CALL_STACK_OFFSET 0 |
46 | 46 | |
47 | +/* optional instructions */ | |
48 | +#define TCG_TARGET_HAS_bswap_i32 | |
49 | +#define TCG_TARGET_HAS_neg_i32 | |
50 | +#define TCG_TARGET_HAS_not_i32 | |
51 | +#define TCG_TARGET_HAS_ext8s_i32 | |
52 | +#define TCG_TARGET_HAS_ext16s_i32 | |
53 | +#define TCG_TARGET_HAS_rot_i32 | |
54 | + | |
47 | 55 | /* Note: must be synced with dyngen-exec.h */ |
48 | 56 | #define TCG_AREG0 TCG_REG_EBP |
49 | 57 | #define TCG_AREG1 TCG_REG_EBX | ... | ... |