* handling spilling of (v)movq/(v)movd properly if the mm register is replaced by a memory reference

This commit is contained in:
florian 2025-05-04 15:22:51 +02:00
parent 5cf2fac78c
commit 79708f45ab

View File

@ -418,6 +418,24 @@ implementation
{ Replace register with spill reference }
if replaceoper<>-1 then
begin
if replaceoper=0 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
begin
opcode:=A_MOV;
opsize:=S_Q;
end;
{$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
begin
opcode:=A_MOV;
opsize:=S_L;
end;
end;
if opcode=A_LEA then
begin
opcode:=A_ADD;