diff --git a/compiler/i8086/n8086mat.pas b/compiler/i8086/n8086mat.pas index 0b133324f2..8f0d6f79ca 100644 --- a/compiler/i8086/n8086mat.pas +++ b/compiler/i8086/n8086mat.pas @@ -136,10 +136,18 @@ implementation { no jumps, but more operations } hreg2:=cg.getintregister(current_asmdata.CurrAsmList,OS_INT); emit_reg_reg(A_MOV,S_W,hreg1,hreg2); - {If the left value is negative, hreg2=$ffff, otherwise 0.} - cg.a_op_const_reg(current_asmdata.CurrAsmList,OP_SAR,OS_16,15,hreg2); - {If negative, hreg2=right value-1, otherwise 0.} - emit_const_reg(A_AND,S_W,tordconstnode(right).value.svalue-1,hreg2); + if tordconstnode(right).value=2 then + begin + {If the left value is negative, hreg2=(right value-1)=1, otherwise 0.} + cg.a_op_const_reg(current_asmdata.CurrAsmList,OP_SHR,OS_16,15,hreg2); + end + else + begin + {If the left value is negative, hreg2=$ffff, otherwise 0.} + cg.a_op_const_reg(current_asmdata.CurrAsmList,OP_SAR,OS_16,15,hreg2); + {If negative, hreg2=right value-1, otherwise 0.} + emit_const_reg(A_AND,S_W,tordconstnode(right).value.svalue-1,hreg2); + end; { add to the left value } emit_reg_reg(A_ADD,S_W,hreg2,hreg1); { do the shift }