mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-09-07 14:30:27 +02:00
+ also check the register type when checking for specific integer registers in
i386's TCpuAsmOptimizer.RegReadByInstruction. Previously, the lack of this check could generate false reads on some other register types (e.g. mmx/xmm/ flags, etc.), and this could worsen optimizations. git-svn-id: trunk@35957 -
This commit is contained in:
parent
618b6292ee
commit
916c09af55
@ -170,7 +170,7 @@ unit aoptcpu;
|
||||
A_IDIV,A_DIV,A_MUL:
|
||||
begin
|
||||
regReadByInstruction :=
|
||||
RegInOp(reg,p.oper[0]^) or (getsupreg(reg) in [RS_EAX,RS_EDX]);
|
||||
RegInOp(reg,p.oper[0]^) or ((getregtype(reg)=R_INTREGISTER) and (getsupreg(reg) in [RS_EAX,RS_EDX]));
|
||||
end;
|
||||
else
|
||||
begin
|
||||
@ -183,56 +183,59 @@ unit aoptcpu;
|
||||
end;
|
||||
with insprop[p.opcode] do
|
||||
begin
|
||||
case getsupreg(reg) of
|
||||
RS_EAX:
|
||||
if [Ch_REAX,Ch_RWEAX,Ch_MEAX]*Ch<>[] then
|
||||
begin
|
||||
RegReadByInstruction := true;
|
||||
exit
|
||||
end;
|
||||
RS_ECX:
|
||||
if [Ch_RECX,Ch_RWECX,Ch_MECX]*Ch<>[] then
|
||||
begin
|
||||
RegReadByInstruction := true;
|
||||
exit
|
||||
end;
|
||||
RS_EDX:
|
||||
if [Ch_REDX,Ch_RWEDX,Ch_MEDX]*Ch<>[] then
|
||||
begin
|
||||
RegReadByInstruction := true;
|
||||
exit
|
||||
end;
|
||||
RS_EBX:
|
||||
if [Ch_REBX,Ch_RWEBX,Ch_MEBX]*Ch<>[] then
|
||||
begin
|
||||
RegReadByInstruction := true;
|
||||
exit
|
||||
end;
|
||||
RS_ESP:
|
||||
if [Ch_RESP,Ch_RWESP,Ch_MESP]*Ch<>[] then
|
||||
begin
|
||||
RegReadByInstruction := true;
|
||||
exit
|
||||
end;
|
||||
RS_EBP:
|
||||
if [Ch_REBP,Ch_RWEBP,Ch_MEBP]*Ch<>[] then
|
||||
begin
|
||||
RegReadByInstruction := true;
|
||||
exit
|
||||
end;
|
||||
RS_ESI:
|
||||
if [Ch_RESI,Ch_RWESI,Ch_MESI]*Ch<>[] then
|
||||
begin
|
||||
RegReadByInstruction := true;
|
||||
exit
|
||||
end;
|
||||
RS_EDI:
|
||||
if [Ch_REDI,Ch_RWEDI,Ch_MEDI]*Ch<>[] then
|
||||
begin
|
||||
RegReadByInstruction := true;
|
||||
exit
|
||||
end;
|
||||
end;
|
||||
if getregtype(reg)=R_INTREGISTER then
|
||||
begin
|
||||
case getsupreg(reg) of
|
||||
RS_EAX:
|
||||
if [Ch_REAX,Ch_RWEAX,Ch_MEAX]*Ch<>[] then
|
||||
begin
|
||||
RegReadByInstruction := true;
|
||||
exit
|
||||
end;
|
||||
RS_ECX:
|
||||
if [Ch_RECX,Ch_RWECX,Ch_MECX]*Ch<>[] then
|
||||
begin
|
||||
RegReadByInstruction := true;
|
||||
exit
|
||||
end;
|
||||
RS_EDX:
|
||||
if [Ch_REDX,Ch_RWEDX,Ch_MEDX]*Ch<>[] then
|
||||
begin
|
||||
RegReadByInstruction := true;
|
||||
exit
|
||||
end;
|
||||
RS_EBX:
|
||||
if [Ch_REBX,Ch_RWEBX,Ch_MEBX]*Ch<>[] then
|
||||
begin
|
||||
RegReadByInstruction := true;
|
||||
exit
|
||||
end;
|
||||
RS_ESP:
|
||||
if [Ch_RESP,Ch_RWESP,Ch_MESP]*Ch<>[] then
|
||||
begin
|
||||
RegReadByInstruction := true;
|
||||
exit
|
||||
end;
|
||||
RS_EBP:
|
||||
if [Ch_REBP,Ch_RWEBP,Ch_MEBP]*Ch<>[] then
|
||||
begin
|
||||
RegReadByInstruction := true;
|
||||
exit
|
||||
end;
|
||||
RS_ESI:
|
||||
if [Ch_RESI,Ch_RWESI,Ch_MESI]*Ch<>[] then
|
||||
begin
|
||||
RegReadByInstruction := true;
|
||||
exit
|
||||
end;
|
||||
RS_EDI:
|
||||
if [Ch_REDI,Ch_RWEDI,Ch_MEDI]*Ch<>[] then
|
||||
begin
|
||||
RegReadByInstruction := true;
|
||||
exit
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
if SuperRegistersEqual(reg,NR_DEFAULTFLAGS) then
|
||||
begin
|
||||
case getsubreg(reg) of
|
||||
|
Loading…
Reference in New Issue
Block a user