mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-14 17:21:20 +02:00
xor optimisation now doesn't check to see if the REX prefix will actually be removed, as it's beneficial for speed reasons to only use the 32-bit register when zeroing the whole thing
This commit is contained in:
parent
2c180cf101
commit
a925522ead
@ -10326,28 +10326,6 @@ unit aoptx86;
|
||||
end;
|
||||
|
||||
end;
|
||||
|
||||
{$ifdef x86_64}
|
||||
{ Code size reduction by J. Gareth "Kit" Moreton }
|
||||
{ Convert MOVZBQ and MOVZWQ to MOVZBL and MOVZWL respectively if it removes the REX prefix }
|
||||
if (taicpu(p).opsize in [S_BQ, S_WQ]) and
|
||||
(getsupreg(taicpu(p).oper[1]^.reg) in [RS_RAX, RS_RCX, RS_RDX, RS_RBX, RS_RSI, RS_RDI, RS_RBP, RS_RSP])
|
||||
then
|
||||
begin
|
||||
{ Has 64-bit register name and opcode suffix }
|
||||
PreMessage := 'movz' + debug_opsize2str(taicpu(p).opsize) + ' ' + debug_operstr(taicpu(p).oper[0]^) + ',' + debug_regname(taicpu(p).oper[1]^.reg) + ' -> movz';
|
||||
|
||||
{ The actual optimization }
|
||||
setsubreg(taicpu(p).oper[1]^.reg, R_SUBD);
|
||||
if taicpu(p).opsize = S_BQ then
|
||||
taicpu(p).changeopsize(S_BL)
|
||||
else
|
||||
taicpu(p).changeopsize(S_WL);
|
||||
|
||||
DebugMsg(SPeepholeOptimization + PreMessage +
|
||||
debug_opsize2str(taicpu(p).opsize) + ' ' + debug_operstr(taicpu(p).oper[0]^) + ',' + debug_regname(taicpu(p).oper[1]^.reg) + ' (removes REX prefix)', p);
|
||||
end;
|
||||
{$endif}
|
||||
end;
|
||||
|
||||
|
||||
@ -10371,20 +10349,17 @@ unit aoptx86;
|
||||
case taicpu(p).opsize of
|
||||
S_Q:
|
||||
begin
|
||||
if (getsupreg(taicpu(p).oper[0]^.reg) in [RS_RAX, RS_RCX, RS_RDX, RS_RBX, RS_RSI, RS_RDI, RS_RBP, RS_RSP]) then
|
||||
begin
|
||||
RegName := debug_regname(taicpu(p).oper[0]^.reg); { 64-bit register name }
|
||||
PreMessage := 'xorq ' + RegName + ',' + RegName + ' -> xorl ';
|
||||
RegName := debug_regname(taicpu(p).oper[0]^.reg); { 64-bit register name }
|
||||
PreMessage := 'xorq ' + RegName + ',' + RegName + ' -> xorl ';
|
||||
|
||||
{ The actual optimization }
|
||||
setsubreg(taicpu(p).oper[0]^.reg, R_SUBD);
|
||||
setsubreg(taicpu(p).oper[1]^.reg, R_SUBD);
|
||||
taicpu(p).changeopsize(S_L);
|
||||
{ The actual optimization }
|
||||
setsubreg(taicpu(p).oper[0]^.reg, R_SUBD);
|
||||
setsubreg(taicpu(p).oper[1]^.reg, R_SUBD);
|
||||
taicpu(p).changeopsize(S_L);
|
||||
|
||||
RegName := debug_regname(taicpu(p).oper[0]^.reg); { 32-bit register name }
|
||||
RegName := debug_regname(taicpu(p).oper[0]^.reg); { 32-bit register name }
|
||||
|
||||
DebugMsg(SPeepholeOptimization + PreMessage + RegName + ',' + RegName + ' (removes REX prefix)', p);
|
||||
end;
|
||||
DebugMsg(SPeepholeOptimization + PreMessage + RegName + ',' + RegName + ' (32-bit register recommended when zeroing 64-bit counterpart)', p);
|
||||
end;
|
||||
else
|
||||
;
|
||||
|
Loading…
Reference in New Issue
Block a user