mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-29 14:40:25 +02:00
+ change "MUL <power of 2>, reg" to SHL (-d ShlMul)
* do the NOT of a constant set when it's substracted internally (-dsetconstnot)
This commit is contained in:
parent
02364c2124
commit
312ba676f2
@ -920,7 +920,12 @@ implementation
|
||||
op:=A_AND;
|
||||
mboverflow:=false;
|
||||
unsigned:=false;
|
||||
extra_not:=true;
|
||||
{$IfDef setConstNot}
|
||||
If (p^.right^.treetype = setconstn) then
|
||||
p^.right^.location.reference.offset := not(p^.right^.location.reference.offset)
|
||||
Else
|
||||
{$EndIf setConstNot}
|
||||
extra_not:=true;
|
||||
end
|
||||
else
|
||||
begin
|
||||
@ -997,24 +1002,40 @@ implementation
|
||||
clear_location(p^.location);
|
||||
p^.location.register:=getregister32;
|
||||
p^.location.loc:=LOC_REGISTER;
|
||||
if not(R_EAX in unused) and (p^.location.register<>R_EAX) then
|
||||
begin
|
||||
exprasmlist^.concat(new(pai386,op_reg(A_PUSH,S_L,R_EAX)));
|
||||
popeax:=true;
|
||||
end;
|
||||
if not(R_EDX in unused) and (p^.location.register<>R_EDX) then
|
||||
begin
|
||||
exprasmlist^.concat(new(pai386,op_reg(A_PUSH,S_L,R_EDX)));
|
||||
popedx:=true;
|
||||
end;
|
||||
emitloadord2reg(p^.left^.location,u32bitdef,R_EDI,true);
|
||||
emitloadord2reg(p^.right^.location,u32bitdef,R_EAX,true);
|
||||
exprasmlist^.concat(new(pai386,op_reg(A_MUL,S_L,R_EDI)));
|
||||
emit_reg_reg(A_MOV,S_L,R_EAX,p^.location.register);
|
||||
if popedx then
|
||||
exprasmlist^.concat(new(pai386,op_reg(A_POP,S_L,R_EDX)));
|
||||
if popeax then
|
||||
exprasmlist^.concat(new(pai386,op_reg(A_POP,S_L,R_EAX)));
|
||||
{$IfDef ShlMul}
|
||||
if p^.right^.treetype=ordconstn then
|
||||
swaptree(p);
|
||||
If (p^.left^.treetype = ordconstn) and
|
||||
ispowerof2(p^.left^.value, power) and
|
||||
not(cs_check_overflow in aktlocalswitches) then
|
||||
Begin
|
||||
emitloadord2reg(p^.right^.location,u32bitdef,p^.location.register,true);
|
||||
exprasmlist^.concat(new(pai386,op_const_reg(A_SHL,S_L,power,p^.location.register)))
|
||||
End
|
||||
Else
|
||||
Begin
|
||||
{$EndIf ShlMul}
|
||||
if not(R_EAX in unused) and (p^.location.register<>R_EAX) then
|
||||
begin
|
||||
exprasmlist^.concat(new(pai386,op_reg(A_PUSH,S_L,R_EAX)));
|
||||
popeax:=true;
|
||||
end;
|
||||
if not(R_EDX in unused) and (p^.location.register<>R_EDX) then
|
||||
begin
|
||||
exprasmlist^.concat(new(pai386,op_reg(A_PUSH,S_L,R_EDX)));
|
||||
popedx:=true;
|
||||
end;
|
||||
emitloadord2reg(p^.right^.location,u32bitdef,R_EAX,true);
|
||||
emitloadord2reg(p^.left^.location,u32bitdef,R_EDI,true);
|
||||
exprasmlist^.concat(new(pai386,op_reg(A_MUL,S_L,R_EDI)));
|
||||
emit_reg_reg(A_MOV,S_L,R_EAX,p^.location.register);
|
||||
if popedx then
|
||||
exprasmlist^.concat(new(pai386,op_reg(A_POP,S_L,R_EDX)));
|
||||
if popeax then
|
||||
exprasmlist^.concat(new(pai386,op_reg(A_POP,S_L,R_EAX)));
|
||||
{$IfDef ShlMul}
|
||||
End;
|
||||
{$endif ShlMul}
|
||||
SetResultLocation(false,true,p);
|
||||
exit;
|
||||
end;
|
||||
@ -2034,7 +2055,12 @@ implementation
|
||||
end.
|
||||
{
|
||||
$Log$
|
||||
Revision 1.53 1999-05-01 13:24:01 peter
|
||||
Revision 1.54 1999-05-09 17:58:42 jonas
|
||||
+ change "MUL <power of 2>, reg" to SHL (-d ShlMul)
|
||||
* do the NOT of a constant set when it's substracted internally
|
||||
(-dsetconstnot)
|
||||
|
||||
Revision 1.53 1999/05/01 13:24:01 peter
|
||||
* merged nasm compiler
|
||||
* old asm moved to oldasm/
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user