Generate more efficient code for shifts by 13, 14, or 15 bits.

This commit is contained in:
Stephen Heumann 2022-12-07 21:36:40 -06:00
parent bb1bd176f4
commit fb5a2fcf33

15
Gen.pas
View File

@ -7210,17 +7210,19 @@ procedure GenTree {op: icptr};
{ Generate code for a pc_shl, pc_shr or pc_usr }
var
i,op1,op2,num: integer; {temp variables}
i,op1,op2,op3,num: integer; {temp variables}
begin {GenShlShrUsr}
{get the standard native operations}
if op^.opcode = pc_shl then begin
op1 := m_asl_a;
op2 := m_lsr_a;
op3 := m_ror_a;
end {if}
else begin
op1 := m_lsr_a;
op2 := m_asl_a;
op3 := m_rol_a;
end; {else}
{take short cuts if they are legal}
@ -7230,6 +7232,16 @@ procedure GenTree {op: icptr};
GenNative(m_lda_imm, immediate, 0, nil, 0)
else if num > 0 then begin
GenTree(op^.left);
if num in [13..15] then begin
for i := 1 to 17-num do
GenImplied(op3);
if op^.opcode = pc_shl then
i := $ffff << num
else
i := $7fff >> (num-1);
GenNative(m_and_imm, immediate, i, nil, 0);
end {if}
else begin
if num >= 8 then begin
GenImplied(m_xba);
if op1 = m_lsr_a then
@ -7241,6 +7253,7 @@ procedure GenTree {op: icptr};
end; {if}
for i := 1 to num do
GenImplied(op1);
end; {else}
end {else if}
else if num < 0 then begin
GenTree(op^.left);