mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-12-04 14:07:10 +01:00
* when handling spilling of mm registers of (v)movd/(v)movq consider also the destination operand
(cherry picked from commit 0632cb548a)
This commit is contained in:
parent
3ea997f719
commit
420f7af213
@ -399,18 +399,19 @@ implementation
|
||||
{ Replace register with spill reference }
|
||||
if replaceoper<>-1 then
|
||||
begin
|
||||
if replaceoper=0 then
|
||||
if replaceoper<=1 then
|
||||
begin
|
||||
{$ifdef x86_64}
|
||||
{ if an mm register => int register (v)movq is converted, replace it by MOV with opsize Q }
|
||||
if ((opcode=A_MOVQ) or (opcode=A_VMOVQ)) and (oper[0]^.typ=top_reg) and (oper[1]^.typ=top_reg) and (getregtype(oper[1]^.reg)=R_INTREGISTER) then
|
||||
if ((opcode=A_MOVQ) or (opcode=A_VMOVQ)) and (oper[0]^.typ=top_reg) and (oper[1]^.typ=top_reg) and (getregtype(oper[replaceoper xor 1]^.reg)=R_INTREGISTER) then
|
||||
begin
|
||||
opcode:=A_MOV;
|
||||
opsize:=S_Q;
|
||||
end;
|
||||
end
|
||||
else
|
||||
{$endif x86_64}
|
||||
{ if an mm register => int register (v)movd is converted, replace it by MOV with opsize L }
|
||||
if ((opcode=A_MOVD) or (opcode=A_VMOVD)) and (oper[0]^.typ=top_reg) and (oper[1]^.typ=top_reg) and (getregtype(oper[1]^.reg)=R_INTREGISTER) then
|
||||
if ((opcode=A_MOVD) or (opcode=A_VMOVD)) and (oper[0]^.typ=top_reg) and (oper[1]^.typ=top_reg) and (getregtype(oper[replaceoper xor 1]^.reg)=R_INTREGISTER) then
|
||||
begin
|
||||
opcode:=A_MOV;
|
||||
opsize:=S_L;
|
||||
|
||||
Loading…
Reference in New Issue
Block a user