summaryrefslogtreecommitdiff
path: root/src/lj_asm_x86.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/lj_asm_x86.h')
-rw-r--r--src/lj_asm_x86.h18
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: