mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-11 18:25:58 +02:00
+ better high level optimization for 64-bit signed division by 2 on 32-bit and
lower CPUs. Instead of the (sar(temp,sizeof(temp)*8-1) and 1) expression, use the equivalent, but simpler (temp shr (sizeof(temp)*8-1)) git-svn-id: trunk@36839 -
This commit is contained in:
parent
1aab7e7ee2
commit
b9fdca6f49
@ -493,6 +493,7 @@ implementation
|
|||||||
power,shiftval : longint;
|
power,shiftval : longint;
|
||||||
statements : tstatementnode;
|
statements : tstatementnode;
|
||||||
temp,resulttemp : ttempcreatenode;
|
temp,resulttemp : ttempcreatenode;
|
||||||
|
masknode : tnode;
|
||||||
begin
|
begin
|
||||||
result := nil;
|
result := nil;
|
||||||
{ divide/mod a number by a constant which is a power of 2? }
|
{ divide/mod a number by a constant which is a power of 2? }
|
||||||
@ -530,18 +531,30 @@ implementation
|
|||||||
left));
|
left));
|
||||||
left:=nil;
|
left:=nil;
|
||||||
|
|
||||||
|
{ masknode is (sar(temp,shiftval) and (tordconstnode(right).value-1))
|
||||||
|
for tordconstnode(right).value=2, masknode is simply (temp shr shiftval)}
|
||||||
|
if power=1 then
|
||||||
|
masknode:=
|
||||||
|
cshlshrnode.create(shrn,
|
||||||
|
ctemprefnode.create(temp),
|
||||||
|
cordconstnode.create(shiftval,u8inttype,false)
|
||||||
|
)
|
||||||
|
else
|
||||||
|
masknode:=
|
||||||
|
caddnode.create(andn,
|
||||||
|
cinlinenode.create(in_sar_x_y,false,
|
||||||
|
ccallparanode.create(cordconstnode.create(shiftval,u8inttype,false),
|
||||||
|
ccallparanode.create(ctemprefnode.create(temp),nil))
|
||||||
|
),
|
||||||
|
cordconstnode.create(tordconstnode(right).value-1,
|
||||||
|
right.resultdef,false)
|
||||||
|
);
|
||||||
|
|
||||||
addstatement(statements,cassignmentnode.create(ctemprefnode.create(resulttemp),
|
addstatement(statements,cassignmentnode.create(ctemprefnode.create(resulttemp),
|
||||||
cinlinenode.create(in_sar_x_y,false,
|
cinlinenode.create(in_sar_x_y,false,
|
||||||
ccallparanode.create(cordconstnode.create(power,u8inttype,false),
|
ccallparanode.create(cordconstnode.create(power,u8inttype,false),
|
||||||
ccallparanode.create(caddnode.create(addn,ctemprefnode.create(temp),
|
ccallparanode.create(caddnode.create(addn,ctemprefnode.create(temp),
|
||||||
caddnode.create(andn,
|
masknode),nil
|
||||||
cinlinenode.create(in_sar_x_y,false,
|
|
||||||
ccallparanode.create(cordconstnode.create(shiftval,u8inttype,false),
|
|
||||||
ccallparanode.create(ctemprefnode.create(temp),nil))
|
|
||||||
),
|
|
||||||
cordconstnode.create(tordconstnode(right).value-1,
|
|
||||||
right.resultdef,false)
|
|
||||||
)),nil
|
|
||||||
))))
|
))))
|
||||||
);
|
);
|
||||||
addstatement(statements,ctempdeletenode.create(temp));
|
addstatement(statements,ctempdeletenode.create(temp));
|
||||||
|
Loading…
Reference in New Issue
Block a user