* 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:
florian 2025-05-05 22:46:49 +02:00
parent 3ea997f719
commit 420f7af213

View File

@ -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;