+ simplify shl/shr x, if (x mod bitsizeof(left))=0

git-svn-id: trunk@26628 -
This commit is contained in:
florian 2014-01-30 17:34:33 +00:00
parent b1f54b2853
commit cd235d8409

View File

@ -578,47 +578,58 @@ implementation
begin begin
result:=nil; result:=nil;
{ constant folding } { constant folding }
if is_constintnode(left) and is_constintnode(right) then if is_constintnode(right) then
begin begin
if forinline then if forinline then
begin begin
{ shl/shr are unsigned operations, so cut off upper bits } { shl/shr are unsigned operations, so cut off upper bits }
case resultdef.size of case resultdef.size of
1: 1:
begin
rvalue:=tordconstnode(right).value and byte($7); rvalue:=tordconstnode(right).value and byte($7);
lvalue:=tordconstnode(left).value and byte($ff);
end;
2: 2:
begin
rvalue:=tordconstnode(right).value and byte($f); rvalue:=tordconstnode(right).value and byte($f);
lvalue:=tordconstnode(left).value and word($ffff);
end;
4: 4:
begin
rvalue:=tordconstnode(right).value and byte($1f); rvalue:=tordconstnode(right).value and byte($1f);
lvalue:=tordconstnode(left).value and dword($ffffffff);
end;
8: 8:
begin
rvalue:=tordconstnode(right).value and byte($3f); rvalue:=tordconstnode(right).value and byte($3f);
lvalue:=tordconstnode(left).value and qword($ffffffffffffffff); else
internalerror(2013122302);
end; end;
end
else
rvalue:=tordconstnode(right).value;
if is_constintnode(left) then
begin
if forinline then
begin
{ shl/shr are unsigned operations, so cut off upper bits }
case resultdef.size of
1:
lvalue:=tordconstnode(left).value and byte($ff);
2:
lvalue:=tordconstnode(left).value and word($ffff);
4:
lvalue:=tordconstnode(left).value and dword($ffffffff);
8:
lvalue:=tordconstnode(left).value and qword($ffffffffffffffff);
else else
internalerror(2013122301); internalerror(2013122301);
end; end;
end end
else else
begin
rvalue:=tordconstnode(right).value;
lvalue:=tordconstnode(left).value; lvalue:=tordconstnode(left).value;
end;
case nodetype of case nodetype of
shrn: shrn:
result:=create_simplified_ord_const(lvalue shr rvalue,resultdef,forinline); result:=create_simplified_ord_const(lvalue shr rvalue,resultdef,forinline);
shln: shln:
result:=create_simplified_ord_const(lvalue shl rvalue,resultdef,forinline); result:=create_simplified_ord_const(lvalue shl rvalue,resultdef,forinline);
end; end;
end
else if rvalue=0 then
begin
result:=left;
left:=nil;
end;
end; end;
end; end;