mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-21 11:09:27 +02:00
+ perform the optimization in tmoddivnode.firstoptimize also for div/mod by
negative powers of 2 as well git-svn-id: trunk@36930 -
This commit is contained in:
parent
e47a0599a5
commit
b41762d1bf
@ -494,11 +494,12 @@ implementation
|
||||
statements : tstatementnode;
|
||||
temp,resulttemp : ttempcreatenode;
|
||||
masknode : tnode;
|
||||
invertsign: Boolean;
|
||||
begin
|
||||
result := nil;
|
||||
{ divide/mod a number by a constant which is a power of 2? }
|
||||
if (right.nodetype = ordconstn) and
|
||||
ispowerof2(tordconstnode(right).value,power) and
|
||||
isabspowerof2(tordconstnode(right).value,power) and
|
||||
{$ifdef cpu64bitalu}
|
||||
{ for 64 bit, we leave the optimization to the cg }
|
||||
(not is_signed(resultdef)) then
|
||||
@ -512,6 +513,7 @@ implementation
|
||||
begin
|
||||
if is_signed(resultdef) then
|
||||
begin
|
||||
invertsign:=tordconstnode(right).value<0;
|
||||
if is_64bitint(left.resultdef) then
|
||||
if not (cs_opt_size in current_settings.optimizerswitches) then
|
||||
shiftval:=63
|
||||
@ -550,13 +552,23 @@ implementation
|
||||
right.resultdef,false)
|
||||
);
|
||||
|
||||
addstatement(statements,cassignmentnode.create(ctemprefnode.create(resulttemp),
|
||||
cinlinenode.create(in_sar_x_y,false,
|
||||
ccallparanode.create(cordconstnode.create(power,u8inttype,false),
|
||||
ccallparanode.create(caddnode.create(addn,ctemprefnode.create(temp),
|
||||
masknode),nil
|
||||
))))
|
||||
);
|
||||
if invertsign then
|
||||
addstatement(statements,cassignmentnode.create(ctemprefnode.create(resulttemp),
|
||||
cunaryminusnode.create(
|
||||
cinlinenode.create(in_sar_x_y,false,
|
||||
ccallparanode.create(cordconstnode.create(power,u8inttype,false),
|
||||
ccallparanode.create(caddnode.create(addn,ctemprefnode.create(temp),
|
||||
masknode),nil
|
||||
)))))
|
||||
)
|
||||
else
|
||||
addstatement(statements,cassignmentnode.create(ctemprefnode.create(resulttemp),
|
||||
cinlinenode.create(in_sar_x_y,false,
|
||||
ccallparanode.create(cordconstnode.create(power,u8inttype,false),
|
||||
ccallparanode.create(caddnode.create(addn,ctemprefnode.create(temp),
|
||||
masknode),nil
|
||||
))))
|
||||
);
|
||||
addstatement(statements,ctempdeletenode.create(temp));
|
||||
addstatement(statements,ctempdeletenode.create_normal_temp(resulttemp));
|
||||
addstatement(statements,ctemprefnode.create(resulttemp));
|
||||
|
Loading…
Reference in New Issue
Block a user