Commit 38482a77f0b3f3147242c1f3eee573c51871b3a5
1 parent
789c91ef
Convert logical operations and umul/smul
Signed-off-by: Blue Swirl <blauwirbel@gmail.com>
Showing
2 changed files
with
43 additions
and
24 deletions
target-sparc/op_helper.c
... | ... | @@ -902,6 +902,23 @@ static uint32_t compute_C_addx_xcc(void) |
902 | 902 | } |
903 | 903 | #endif |
904 | 904 | |
905 | +static uint32_t compute_all_logic(void) | |
906 | +{ | |
907 | + return get_NZ_icc(CC_DST); | |
908 | +} | |
909 | + | |
910 | +static uint32_t compute_C_logic(void) | |
911 | +{ | |
912 | + return 0; | |
913 | +} | |
914 | + | |
915 | +#ifdef TARGET_SPARC64 | |
916 | +static uint32_t compute_all_logic_xcc(void) | |
917 | +{ | |
918 | + return get_NZ_xcc(CC_DST); | |
919 | +} | |
920 | +#endif | |
921 | + | |
905 | 922 | typedef struct CCTable { |
906 | 923 | uint32_t (*compute_all)(void); /* return all the flags */ |
907 | 924 | uint32_t (*compute_c)(void); /* return the C flag */ |
... | ... | @@ -912,6 +929,7 @@ static const CCTable icc_table[CC_OP_NB] = { |
912 | 929 | [CC_OP_FLAGS] = { compute_all_flags, compute_C_flags }, |
913 | 930 | [CC_OP_ADD] = { compute_all_add, compute_C_add }, |
914 | 931 | [CC_OP_ADDX] = { compute_all_addx, compute_C_addx }, |
932 | + [CC_OP_LOGIC] = { compute_all_logic, compute_C_logic }, | |
915 | 933 | }; |
916 | 934 | |
917 | 935 | #ifdef TARGET_SPARC64 |
... | ... | @@ -920,6 +938,7 @@ static const CCTable xcc_table[CC_OP_NB] = { |
920 | 938 | [CC_OP_FLAGS] = { compute_all_flags_xcc, compute_C_flags_xcc }, |
921 | 939 | [CC_OP_ADD] = { compute_all_add_xcc, compute_C_add_xcc }, |
922 | 940 | [CC_OP_ADDX] = { compute_all_addx_xcc, compute_C_addx_xcc }, |
941 | + [CC_OP_LOGIC] = { compute_all_logic_xcc, compute_C_logic }, | |
923 | 942 | }; |
924 | 943 | #endif |
925 | 944 | ... | ... |
target-sparc/translate.c
... | ... | @@ -3136,9 +3136,9 @@ static void disas_sparc_insn(DisasContext * dc) |
3136 | 3136 | tcg_gen_and_tl(cpu_dst, cpu_src1, cpu_src2); |
3137 | 3137 | } |
3138 | 3138 | if (xop & 0x10) { |
3139 | - gen_op_logic_cc(cpu_dst); | |
3140 | - tcg_gen_movi_i32(cpu_cc_op, CC_OP_FLAGS); | |
3141 | - dc->cc_op = CC_OP_FLAGS; | |
3139 | + tcg_gen_mov_tl(cpu_cc_dst, cpu_dst); | |
3140 | + tcg_gen_movi_i32(cpu_cc_op, CC_OP_LOGIC); | |
3141 | + dc->cc_op = CC_OP_LOGIC; | |
3142 | 3142 | } |
3143 | 3143 | break; |
3144 | 3144 | case 0x2: /* or */ |
... | ... | @@ -3149,9 +3149,9 @@ static void disas_sparc_insn(DisasContext * dc) |
3149 | 3149 | tcg_gen_or_tl(cpu_dst, cpu_src1, cpu_src2); |
3150 | 3150 | } |
3151 | 3151 | if (xop & 0x10) { |
3152 | - gen_op_logic_cc(cpu_dst); | |
3153 | - tcg_gen_movi_i32(cpu_cc_op, CC_OP_FLAGS); | |
3154 | - dc->cc_op = CC_OP_FLAGS; | |
3152 | + tcg_gen_mov_tl(cpu_cc_dst, cpu_dst); | |
3153 | + tcg_gen_movi_i32(cpu_cc_op, CC_OP_LOGIC); | |
3154 | + dc->cc_op = CC_OP_LOGIC; | |
3155 | 3155 | } |
3156 | 3156 | break; |
3157 | 3157 | case 0x3: /* xor */ |
... | ... | @@ -3162,9 +3162,9 @@ static void disas_sparc_insn(DisasContext * dc) |
3162 | 3162 | tcg_gen_xor_tl(cpu_dst, cpu_src1, cpu_src2); |
3163 | 3163 | } |
3164 | 3164 | if (xop & 0x10) { |
3165 | - gen_op_logic_cc(cpu_dst); | |
3166 | - tcg_gen_movi_i32(cpu_cc_op, CC_OP_FLAGS); | |
3167 | - dc->cc_op = CC_OP_FLAGS; | |
3165 | + tcg_gen_mov_tl(cpu_cc_dst, cpu_dst); | |
3166 | + tcg_gen_movi_i32(cpu_cc_op, CC_OP_LOGIC); | |
3167 | + dc->cc_op = CC_OP_LOGIC; | |
3168 | 3168 | } |
3169 | 3169 | break; |
3170 | 3170 | case 0x4: /* sub */ |
... | ... | @@ -3195,9 +3195,9 @@ static void disas_sparc_insn(DisasContext * dc) |
3195 | 3195 | tcg_gen_andc_tl(cpu_dst, cpu_src1, cpu_src2); |
3196 | 3196 | } |
3197 | 3197 | if (xop & 0x10) { |
3198 | - gen_op_logic_cc(cpu_dst); | |
3199 | - tcg_gen_movi_i32(cpu_cc_op, CC_OP_FLAGS); | |
3200 | - dc->cc_op = CC_OP_FLAGS; | |
3198 | + tcg_gen_mov_tl(cpu_cc_dst, cpu_dst); | |
3199 | + tcg_gen_movi_i32(cpu_cc_op, CC_OP_LOGIC); | |
3200 | + dc->cc_op = CC_OP_LOGIC; | |
3201 | 3201 | } |
3202 | 3202 | break; |
3203 | 3203 | case 0x6: /* orn */ |
... | ... | @@ -3208,9 +3208,9 @@ static void disas_sparc_insn(DisasContext * dc) |
3208 | 3208 | tcg_gen_orc_tl(cpu_dst, cpu_src1, cpu_src2); |
3209 | 3209 | } |
3210 | 3210 | if (xop & 0x10) { |
3211 | - gen_op_logic_cc(cpu_dst); | |
3212 | - tcg_gen_movi_i32(cpu_cc_op, CC_OP_FLAGS); | |
3213 | - dc->cc_op = CC_OP_FLAGS; | |
3211 | + tcg_gen_mov_tl(cpu_cc_dst, cpu_dst); | |
3212 | + tcg_gen_movi_i32(cpu_cc_op, CC_OP_LOGIC); | |
3213 | + dc->cc_op = CC_OP_LOGIC; | |
3214 | 3214 | } |
3215 | 3215 | break; |
3216 | 3216 | case 0x7: /* xorn */ |
... | ... | @@ -3222,9 +3222,9 @@ static void disas_sparc_insn(DisasContext * dc) |
3222 | 3222 | tcg_gen_xor_tl(cpu_dst, cpu_src1, cpu_tmp0); |
3223 | 3223 | } |
3224 | 3224 | if (xop & 0x10) { |
3225 | - gen_op_logic_cc(cpu_dst); | |
3226 | - tcg_gen_movi_i32(cpu_cc_op, CC_OP_FLAGS); | |
3227 | - dc->cc_op = CC_OP_FLAGS; | |
3225 | + tcg_gen_mov_tl(cpu_cc_dst, cpu_dst); | |
3226 | + tcg_gen_movi_i32(cpu_cc_op, CC_OP_LOGIC); | |
3227 | + dc->cc_op = CC_OP_LOGIC; | |
3228 | 3228 | } |
3229 | 3229 | break; |
3230 | 3230 | case 0x8: /* addx, V9 addc */ |
... | ... | @@ -3269,18 +3269,18 @@ static void disas_sparc_insn(DisasContext * dc) |
3269 | 3269 | CHECK_IU_FEATURE(dc, MUL); |
3270 | 3270 | gen_op_umul(cpu_dst, cpu_src1, cpu_src2); |
3271 | 3271 | if (xop & 0x10) { |
3272 | - gen_op_logic_cc(cpu_dst); | |
3273 | - tcg_gen_movi_i32(cpu_cc_op, CC_OP_FLAGS); | |
3274 | - dc->cc_op = CC_OP_FLAGS; | |
3272 | + tcg_gen_mov_tl(cpu_cc_dst, cpu_dst); | |
3273 | + tcg_gen_movi_i32(cpu_cc_op, CC_OP_LOGIC); | |
3274 | + dc->cc_op = CC_OP_LOGIC; | |
3275 | 3275 | } |
3276 | 3276 | break; |
3277 | 3277 | case 0xb: /* smul */ |
3278 | 3278 | CHECK_IU_FEATURE(dc, MUL); |
3279 | 3279 | gen_op_smul(cpu_dst, cpu_src1, cpu_src2); |
3280 | 3280 | if (xop & 0x10) { |
3281 | - gen_op_logic_cc(cpu_dst); | |
3282 | - tcg_gen_movi_i32(cpu_cc_op, CC_OP_FLAGS); | |
3283 | - dc->cc_op = CC_OP_FLAGS; | |
3281 | + tcg_gen_mov_tl(cpu_cc_dst, cpu_dst); | |
3282 | + tcg_gen_movi_i32(cpu_cc_op, CC_OP_LOGIC); | |
3283 | + dc->cc_op = CC_OP_LOGIC; | |
3284 | 3284 | } |
3285 | 3285 | break; |
3286 | 3286 | case 0xc: /* subx, V9 subc */ | ... | ... |