diff options
Diffstat (limited to 'src/lj_asm_x86.h')
-rw-r--r-- | src/lj_asm_x86.h | 18 |
1 files changed, 12 insertions, 6 deletions
diff --git a/src/lj_asm_x86.h b/src/lj_asm_x86.h index 45afdc88..6767e0c7 100644 --- a/src/lj_asm_x86.h +++ b/src/lj_asm_x86.h | |||
@@ -2160,19 +2160,25 @@ static void asm_hiop(ASMState *as, IRIns *ir) | |||
2160 | if (!usehi) return; /* Skip unused hiword op for all remaining ops. */ | 2160 | if (!usehi) return; /* Skip unused hiword op for all remaining ops. */ |
2161 | switch ((ir-1)->o) { | 2161 | switch ((ir-1)->o) { |
2162 | case IR_ADD: | 2162 | case IR_ADD: |
2163 | asm_intarith(as, ir, uselo ? XOg_ADC : XOg_ADD); | 2163 | as->flagmcp = NULL; |
2164 | as->curins--; | ||
2165 | asm_intarith(as, ir, XOg_ADC); | ||
2166 | asm_intarith(as, ir-1, XOg_ADD); | ||
2164 | break; | 2167 | break; |
2165 | case IR_SUB: | 2168 | case IR_SUB: |
2166 | asm_intarith(as, ir, uselo ? XOg_SBB : XOg_SUB); | 2169 | as->flagmcp = NULL; |
2170 | as->curins--; | ||
2171 | asm_intarith(as, ir, XOg_SBB); | ||
2172 | asm_intarith(as, ir-1, XOg_SUB); | ||
2167 | break; | 2173 | break; |
2168 | case IR_NEG: { | 2174 | case IR_NEG: { |
2169 | Reg dest = ra_dest(as, ir, RSET_GPR); | 2175 | Reg dest = ra_dest(as, ir, RSET_GPR); |
2170 | emit_rr(as, XO_GROUP3, XOg_NEG, dest); | 2176 | emit_rr(as, XO_GROUP3, XOg_NEG, dest); |
2171 | if (uselo) { | 2177 | emit_i8(as, 0); |
2172 | emit_i8(as, 0); | 2178 | emit_rr(as, XO_ARITHi8, XOg_ADC, dest); |
2173 | emit_rr(as, XO_ARITHi8, XOg_ADC, dest); | ||
2174 | } | ||
2175 | ra_left(as, dest, ir->op1); | 2179 | ra_left(as, dest, ir->op1); |
2180 | as->curins--; | ||
2181 | asm_neg_not(as, ir-1, XOg_NEG); | ||
2176 | break; | 2182 | break; |
2177 | } | 2183 | } |
2178 | case IR_CALLN: | 2184 | case IR_CALLN: |