mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-06-03 06:18:34 +02:00
* fixed/completed spilling_get_operation_type
+ implemented spilling_get_operation_type_ref git-svn-id: trunk@29926 -
This commit is contained in:
parent
5041354b8e
commit
28a713494c
@ -192,6 +192,7 @@ uses
|
||||
function is_same_reg_move(regtype: Tregistertype):boolean; override;
|
||||
|
||||
function spilling_get_operation_type(opnr: longint): topertype;override;
|
||||
function spilling_get_operation_type_ref(opnr: longint; reg: tregister): topertype;override;
|
||||
|
||||
{ assembler }
|
||||
public
|
||||
@ -722,7 +723,8 @@ implementation
|
||||
else
|
||||
result:=sr_complex;
|
||||
end;
|
||||
A_LDP,A_STP:
|
||||
A_LDP,A_LDNP,
|
||||
A_STP,A_STNP:
|
||||
begin
|
||||
{ only supported for 32/64 bit }
|
||||
if not(oppostfix in [PF_W,PF_SW,PF_None]) then
|
||||
@ -750,6 +752,20 @@ implementation
|
||||
A_LD1,A_LD2,A_LD3,A_LD4,
|
||||
A_ST1,A_ST2,A_ST3,A_ST4:
|
||||
internalerror(2014110907);
|
||||
A_LDAR,
|
||||
A_LDAXR,
|
||||
A_LDXR,
|
||||
A_LDXP,
|
||||
A_STLR,
|
||||
A_STLXR,
|
||||
A_STLXP,
|
||||
A_STXP,
|
||||
A_STXR:
|
||||
begin
|
||||
if (ref.addressmode=AM_OFFSET) and
|
||||
(ref.offset=0) then
|
||||
result:=sr_simple;
|
||||
end
|
||||
else
|
||||
{ nothing: result is already sr_internal_illegal };
|
||||
end;
|
||||
@ -866,32 +882,60 @@ implementation
|
||||
function taicpu.spilling_get_operation_type(opnr: longint): topertype;
|
||||
begin
|
||||
case opcode of
|
||||
A_ADC,A_ADD,A_AND,A_BIC,
|
||||
A_EOR,A_CLZ,A_RBIT,
|
||||
A_LDR,
|
||||
A_MOV,A_MVN,A_MUL,
|
||||
A_ORR,A_SBC,A_SUB,
|
||||
A_UXT,A_SXT:
|
||||
A_B,A_BL,
|
||||
A_CMN,A_CMP,
|
||||
A_CCMN,A_CCMP,
|
||||
A_TST:
|
||||
result:=operand_read;
|
||||
A_STR,A_STUR:
|
||||
if opnr=0 then
|
||||
result:=operand_read
|
||||
else
|
||||
{ check for pre/post indexed in spilling_get_operation_type_ref }
|
||||
result:=operand_read;
|
||||
A_STLXP,
|
||||
A_STLXR,
|
||||
A_STXP,
|
||||
A_STXR:
|
||||
if opnr=0 then
|
||||
result:=operand_write
|
||||
else
|
||||
result:=operand_read;
|
||||
A_B,A_BL,
|
||||
A_CMN,A_CMP,A_TST:
|
||||
result:=operand_read;
|
||||
A_STR:
|
||||
{ important is what happens with the involved registers }
|
||||
if opnr=0 then
|
||||
result := operand_read
|
||||
else
|
||||
{ check for pre/post indexed }
|
||||
result := operand_read;
|
||||
else
|
||||
internalerror(200403151);
|
||||
A_STP:
|
||||
begin
|
||||
if opnr in [0,1] then
|
||||
result:=operand_read
|
||||
else
|
||||
{ check for pre/post indexed in spilling_get_operation_type_ref }
|
||||
result:=operand_read;
|
||||
end;
|
||||
A_LDP,
|
||||
A_LDXP:
|
||||
begin
|
||||
if opnr in [0,1] then
|
||||
result:=operand_write
|
||||
else
|
||||
{ check for pre/post indexed in spilling_get_operation_type_ref }
|
||||
result:=operand_read;
|
||||
end;
|
||||
else
|
||||
if opnr=0 then
|
||||
result:=operand_write
|
||||
else
|
||||
result:=operand_read;
|
||||
end;
|
||||
end;
|
||||
|
||||
|
||||
function taicpu.spilling_get_operation_type_ref(opnr: longint; reg: tregister): topertype;
|
||||
begin
|
||||
result:=operand_read;
|
||||
if (oper[opnr]^.ref^.base = reg) and
|
||||
(oper[opnr]^.ref^.addressmode in [AM_PREINDEXED,AM_POSTINDEXED]) then
|
||||
result:=operand_readwrite;
|
||||
end;
|
||||
|
||||
|
||||
procedure BuildInsTabCache;
|
||||
var
|
||||
i : longint;
|
||||
|
Loading…
Reference in New Issue
Block a user