mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-19 12:09:14 +02:00
* fix building on i386 after r49366
git-svn-id: trunk@49372 -
This commit is contained in:
parent
e72665051f
commit
e57059eea3
@ -5160,12 +5160,16 @@ unit aoptx86;
|
|||||||
|
|
||||||
{ Data flow analysis }
|
{ Data flow analysis }
|
||||||
TestValMin, TestValMax: TCgInt;
|
TestValMin, TestValMax: TCgInt;
|
||||||
SmallerOverflow, FirstCheck: Boolean;
|
SmallerOverflow: Boolean;
|
||||||
|
|
||||||
begin
|
begin
|
||||||
Result := False;
|
Result := False;
|
||||||
p_removed := False;
|
p_removed := False;
|
||||||
|
|
||||||
|
{ This is anything but quick! }
|
||||||
|
if not(cs_opt_level2 in current_settings.optimizerswitches) then
|
||||||
|
Exit;
|
||||||
|
|
||||||
SetLength(InstrList, 0);
|
SetLength(InstrList, 0);
|
||||||
InstrMax := -1;
|
InstrMax := -1;
|
||||||
ThisReg := taicpu(p).oper[1]^.reg;
|
ThisReg := taicpu(p).oper[1]^.reg;
|
||||||
@ -5173,6 +5177,12 @@ unit aoptx86;
|
|||||||
case taicpu(p).opsize of
|
case taicpu(p).opsize of
|
||||||
S_BW, S_BL:
|
S_BW, S_BL:
|
||||||
begin
|
begin
|
||||||
|
{$if defined(i386) or defined(i8086)}
|
||||||
|
{ If the target size is 8-bit, make sure we can actually encode it }
|
||||||
|
if not (GetSupReg(ThisReg) in [RS_EAX,RS_EBX,RS_ECX,RS_EDX]) then
|
||||||
|
Exit;
|
||||||
|
{$endif i386 or i8086}
|
||||||
|
|
||||||
UpperLimit := $FF;
|
UpperLimit := $FF;
|
||||||
MinSize := S_B;
|
MinSize := S_B;
|
||||||
if taicpu(p).opsize = S_BW then
|
if taicpu(p).opsize = S_BW then
|
||||||
@ -5190,33 +5200,6 @@ unit aoptx86;
|
|||||||
InternalError(2020112301);
|
InternalError(2020112301);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{ With MinSize and MaxSize set, we can check some other optimisations
|
|
||||||
first, before attempting the expensive data flow analysis }
|
|
||||||
FirstCheck := GetNextInstructionUsingReg(p, hp1, ThisReg) and
|
|
||||||
(hp1.typ = ait_instruction) and
|
|
||||||
(
|
|
||||||
{ Under -O1 and -O2, GetNextInstructionUsingReg may return an
|
|
||||||
instruction that doesn't actually contain ThisReg }
|
|
||||||
(cs_opt_level3 in current_settings.optimizerswitches) or
|
|
||||||
RegInInstruction(ThisReg, hp1)
|
|
||||||
);
|
|
||||||
|
|
||||||
{ Data-flow analysis won't get anywhere since there was no instruction match }
|
|
||||||
if not FirstCheck then
|
|
||||||
Exit;
|
|
||||||
|
|
||||||
{ Check for:
|
|
||||||
movz ##,%reg
|
|
||||||
cmp $y,%reg
|
|
||||||
(%reg deallocated)
|
|
||||||
|
|
||||||
Change register size so movz becomes mov
|
|
||||||
}
|
|
||||||
|
|
||||||
{ This is anything but quick! }
|
|
||||||
if not(cs_opt_level2 in current_settings.optimizerswitches) then
|
|
||||||
Exit;
|
|
||||||
|
|
||||||
TestValMin := 0;
|
TestValMin := 0;
|
||||||
TestValMax := UpperLimit;
|
TestValMax := UpperLimit;
|
||||||
TrySmallerLimit := UpperLimit;
|
TrySmallerLimit := UpperLimit;
|
||||||
@ -5224,19 +5207,17 @@ unit aoptx86;
|
|||||||
SmallerOverflow := False;
|
SmallerOverflow := False;
|
||||||
RegChanged := False;
|
RegChanged := False;
|
||||||
|
|
||||||
while FirstCheck { No need to waste checking for the next instruction again } or
|
hp1 := p;
|
||||||
|
|
||||||
|
while GetNextInstructionUsingReg(hp1, hp1, ThisReg) and
|
||||||
|
(hp1.typ = ait_instruction) and
|
||||||
(
|
(
|
||||||
GetNextInstructionUsingReg(hp1, hp1, ThisReg) and
|
{ Under -O1 and -O2, GetNextInstructionUsingReg may return an
|
||||||
(hp1.typ = ait_instruction) and
|
instruction that doesn't actually contain ThisReg }
|
||||||
(
|
(cs_opt_level3 in current_settings.optimizerswitches) or
|
||||||
{ Under -O1 and -O2, GetNextInstructionUsingReg may return an
|
RegInInstruction(ThisReg, hp1)
|
||||||
instruction that doesn't actually contain ThisReg }
|
|
||||||
(cs_opt_level3 in current_settings.optimizerswitches) or
|
|
||||||
RegInInstruction(ThisReg, hp1)
|
|
||||||
)
|
|
||||||
) do
|
) do
|
||||||
begin
|
begin
|
||||||
FirstCheck := False;
|
|
||||||
|
|
||||||
case taicpu(hp1).opcode of
|
case taicpu(hp1).opcode of
|
||||||
A_INC,A_DEC:
|
A_INC,A_DEC:
|
||||||
@ -5259,9 +5240,6 @@ unit aoptx86;
|
|||||||
|
|
||||||
A_CMP:
|
A_CMP:
|
||||||
begin
|
begin
|
||||||
{ Smallest signed value for MinSize }
|
|
||||||
TrySmallerLimit := not (UpperLimit shr 1);
|
|
||||||
|
|
||||||
if (taicpu(hp1).oper[1]^.typ <> top_reg) or
|
if (taicpu(hp1).oper[1]^.typ <> top_reg) or
|
||||||
{ Has to be an exact match on the register }
|
{ Has to be an exact match on the register }
|
||||||
(taicpu(hp1).oper[1]^.reg <> ThisReg) or
|
(taicpu(hp1).oper[1]^.reg <> ThisReg) or
|
||||||
@ -5269,7 +5247,11 @@ unit aoptx86;
|
|||||||
{ Make sure the comparison value is not smaller than the
|
{ Make sure the comparison value is not smaller than the
|
||||||
smallest allowed signed value for the minimum size (e.g.
|
smallest allowed signed value for the minimum size (e.g.
|
||||||
-128 for 8-bit) }
|
-128 for 8-bit) }
|
||||||
(taicpu(hp1).oper[0]^.val < TrySmallerLimit) then
|
not (
|
||||||
|
((taicpu(hp1).oper[0]^.val and UpperLimit) = taicpu(hp1).oper[0]^.val) or
|
||||||
|
{ Is it in the negative range? }
|
||||||
|
(((not taicpu(hp1).oper[0]^.val) and (UpperLimit shr 1)) = (not taicpu(hp1).oper[0]^.val))
|
||||||
|
) then
|
||||||
Break;
|
Break;
|
||||||
|
|
||||||
TestValMin := TestValMin - taicpu(hp1).oper[0]^.val;
|
TestValMin := TestValMin - taicpu(hp1).oper[0]^.val;
|
||||||
@ -5295,7 +5277,7 @@ unit aoptx86;
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
{ Update the register to its new size }
|
{ Update the register to its new size }
|
||||||
ThisReg := newreg(R_INTREGISTER, getsupreg(ThisReg), TargetSubReg);
|
setsubreg(ThisReg, TargetSubReg);
|
||||||
|
|
||||||
taicpu(hp1).oper[1]^.reg := ThisReg;
|
taicpu(hp1).oper[1]^.reg := ThisReg;
|
||||||
taicpu(hp1).opsize := MinSize;
|
taicpu(hp1).opsize := MinSize;
|
||||||
@ -5604,7 +5586,7 @@ unit aoptx86;
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
{ Update the register to its new size }
|
{ Update the register to its new size }
|
||||||
ThisReg := newreg(R_INTREGISTER, getsupreg(ThisReg), TargetSubReg);
|
setsubreg(ThisReg, TargetSubReg);
|
||||||
|
|
||||||
if TargetSize = MinSize then
|
if TargetSize = MinSize then
|
||||||
begin
|
begin
|
||||||
|
Loading…
Reference in New Issue
Block a user