mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-11-26 12:27:20 +01:00
m68k: add support for OP_ROL/OP_ROR to a_op_reg_reg. this fixes m68k builds after 0af3f2a9
This commit is contained in:
parent
69611bba2d
commit
6a82ca8a1e
@ -1431,9 +1431,35 @@ unit cgcpu;
|
|||||||
end;
|
end;
|
||||||
list.concat(taicpu.op_reg_reg(opcode, opsize, src, dst));
|
list.concat(taicpu.op_reg_reg(opcode, opsize, src, dst));
|
||||||
end;
|
end;
|
||||||
OP_AND,OP_OR,
|
OP_SAR,
|
||||||
OP_SAR,OP_SHL,
|
OP_SHL,
|
||||||
OP_SHR,OP_XOR:
|
OP_SHR:
|
||||||
|
OP_ROR,
|
||||||
|
OP_ROL:
|
||||||
|
begin
|
||||||
|
{ the compiler has code on the higher levels to try to prevent generating
|
||||||
|
ROR/ROL instructions on m68k CPUs that don't support it (ColdFire family) }
|
||||||
|
if op in [OP_ROR,OP_ROL] and
|
||||||
|
not CPUM68K_HAS_ROLROR in cpu_capabilites[current_settings.cputype]) then
|
||||||
|
internalerror(2025091101);
|
||||||
|
|
||||||
|
{ load to data registers }
|
||||||
|
hreg1 := force_to_dataregister(list, size, src);
|
||||||
|
hreg2 := force_to_dataregister(list, size, dst);
|
||||||
|
|
||||||
|
if not (CPUM68K_HAS_BYTEWORDMATH in cpu_capabilities[current_settings.cputype]) then
|
||||||
|
{ source for these ops are always modulo 64 on m68k,
|
||||||
|
so we don't need to extend the src register }
|
||||||
|
sign_extend(list, size, dst);
|
||||||
|
|
||||||
|
list.concat(taicpu.op_reg_reg(opcode, opsize, hreg1, hreg2));
|
||||||
|
|
||||||
|
{ move back result into destination register }
|
||||||
|
move_if_needed(list, size, hreg2, dst);
|
||||||
|
end;
|
||||||
|
OP_AND,
|
||||||
|
OP_OR,
|
||||||
|
OP_XOR:
|
||||||
begin
|
begin
|
||||||
{ load to data registers }
|
{ load to data registers }
|
||||||
hreg1 := force_to_dataregister(list, size, src);
|
hreg1 := force_to_dataregister(list, size, src);
|
||||||
@ -1441,15 +1467,7 @@ unit cgcpu;
|
|||||||
|
|
||||||
if current_settings.cputype in cpu_coldfire then
|
if current_settings.cputype in cpu_coldfire then
|
||||||
begin
|
begin
|
||||||
{ operation only allowed only a longword }
|
sign_extend(list, size, hreg1);
|
||||||
{!***************************************
|
|
||||||
in the case of shifts, the value to
|
|
||||||
shift by, should already be valid, so
|
|
||||||
no need to sign extend the value
|
|
||||||
!
|
|
||||||
}
|
|
||||||
if op in [OP_AND,OP_OR,OP_XOR] then
|
|
||||||
sign_extend(list, size, hreg1);
|
|
||||||
sign_extend(list, size, hreg2);
|
sign_extend(list, size, hreg2);
|
||||||
end;
|
end;
|
||||||
list.concat(taicpu.op_reg_reg(opcode, opsize, hreg1, hreg2));
|
list.concat(taicpu.op_reg_reg(opcode, opsize, hreg1, hreg2));
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user