mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-17 05:19:17 +02:00
* push reads the register
* concatcopy for len>=16 implemented git-svn-id: branches/avr@17102 -
This commit is contained in:
parent
1cc956afc8
commit
a6464c36e3
@ -211,11 +211,11 @@ implementation
|
|||||||
begin
|
begin
|
||||||
result:=operand_read;
|
result:=operand_read;
|
||||||
case opcode of
|
case opcode of
|
||||||
A_CP,A_CPC,A_CPI :
|
A_CP,A_CPC,A_CPI,A_PUSH :
|
||||||
;
|
;
|
||||||
else
|
else
|
||||||
begin
|
begin
|
||||||
if (opnr=0) then
|
if opnr=0 then
|
||||||
result:=operand_write;
|
result:=operand_write;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
@ -77,9 +77,7 @@ unit cgcpu;
|
|||||||
procedure a_loadaddr_ref_reg(list : TAsmList;const ref : treference;r : tregister);override;
|
procedure a_loadaddr_ref_reg(list : TAsmList;const ref : treference;r : tregister);override;
|
||||||
|
|
||||||
procedure g_concatcopy(list : TAsmList;const source,dest : treference;len : aint);override;
|
procedure g_concatcopy(list : TAsmList;const source,dest : treference;len : aint);override;
|
||||||
procedure g_concatcopy_unaligned(list : TAsmList;const source,dest : treference;len : aint);override;
|
|
||||||
procedure g_concatcopy_move(list : TAsmList;const source,dest : treference;len : aint);
|
procedure g_concatcopy_move(list : TAsmList;const source,dest : treference;len : aint);
|
||||||
procedure g_concatcopy_internal(list : TAsmList;const source,dest : treference;len : aint;aligned : boolean);
|
|
||||||
|
|
||||||
procedure g_overflowcheck(list: TAsmList; const l: tlocation; def: tdef); override;
|
procedure g_overflowcheck(list: TAsmList; const l: tlocation; def: tdef); override;
|
||||||
|
|
||||||
@ -1198,18 +1196,6 @@ unit cgcpu;
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
procedure tcgavr.g_concatcopy_internal(list : TAsmList;const source,dest : treference;len : aint;aligned : boolean);
|
|
||||||
begin
|
|
||||||
internalerror(2011021321);
|
|
||||||
end;
|
|
||||||
|
|
||||||
|
|
||||||
procedure tcgavr.g_concatcopy_unaligned(list : TAsmList;const source,dest : treference;len : aint);
|
|
||||||
begin
|
|
||||||
g_concatcopy_internal(list,source,dest,len,false);
|
|
||||||
end;
|
|
||||||
|
|
||||||
|
|
||||||
procedure tcgavr.g_concatcopy(list : TAsmList;const source,dest : treference;len : aint);
|
procedure tcgavr.g_concatcopy(list : TAsmList;const source,dest : treference;len : aint);
|
||||||
var
|
var
|
||||||
countreg,tmpreg : tregister;
|
countreg,tmpreg : tregister;
|
||||||
@ -1218,12 +1204,17 @@ unit cgcpu;
|
|||||||
l : TAsmLabel;
|
l : TAsmLabel;
|
||||||
i : longint;
|
i : longint;
|
||||||
begin
|
begin
|
||||||
current_asmdata.getjumplabel(l);
|
|
||||||
if len>16 then
|
if len>16 then
|
||||||
begin
|
begin
|
||||||
|
current_asmdata.getjumplabel(l);
|
||||||
|
|
||||||
reference_reset(srcref,0);
|
reference_reset(srcref,0);
|
||||||
reference_reset(dstref,0);
|
reference_reset(dstref,0);
|
||||||
{ TODO : load refs! }
|
srcref.base:=NR_R30;
|
||||||
|
srcref.addressmode:=AM_POSTINCREMENT;
|
||||||
|
dstref.base:=NR_R26;
|
||||||
|
dstref.addressmode:=AM_POSTINCREMENT;
|
||||||
|
|
||||||
copysize:=OS_8;
|
copysize:=OS_8;
|
||||||
if len<256 then
|
if len<256 then
|
||||||
countregsize:=OS_8
|
countregsize:=OS_8
|
||||||
@ -1233,12 +1224,26 @@ unit cgcpu;
|
|||||||
internalerror(2011022007);
|
internalerror(2011022007);
|
||||||
countreg:=getintregister(list,countregsize);
|
countreg:=getintregister(list,countregsize);
|
||||||
a_load_const_reg(list,countregsize,len,countreg);
|
a_load_const_reg(list,countregsize,len,countreg);
|
||||||
|
a_loadaddr_ref_reg(list,source,NR_R30);
|
||||||
|
tmpreg:=getaddressregister(list);
|
||||||
|
a_loadaddr_ref_reg(list,dest,tmpreg);
|
||||||
|
|
||||||
|
{ X is used for spilling code so we can load it
|
||||||
|
only by a push/pop sequence, this can be
|
||||||
|
optimized later on by the peephole optimizer
|
||||||
|
}
|
||||||
|
list.concat(taicpu.op_reg(A_PUSH,tmpreg));
|
||||||
|
list.concat(taicpu.op_reg(A_PUSH,GetNextReg(tmpreg)));
|
||||||
|
list.concat(taicpu.op_reg(A_POP,NR_R27));
|
||||||
|
list.concat(taicpu.op_reg(A_POP,NR_R26));
|
||||||
cg.a_label(list,l);
|
cg.a_label(list,l);
|
||||||
tmpreg:=getintregister(list,copysize);
|
tmpreg:=getintregister(list,copysize);
|
||||||
list.concat(taicpu.op_reg_ref(GetLoad(srcref),tmpreg,srcref));
|
list.concat(taicpu.op_reg_ref(GetLoad(srcref),tmpreg,srcref));
|
||||||
list.concat(taicpu.op_ref_reg(GetStore(dstref),dstref,tmpreg));
|
list.concat(taicpu.op_ref_reg(GetStore(dstref),dstref,tmpreg));
|
||||||
a_op_const_reg(list,OP_SUB,countregsize,1,countreg);
|
a_op_const_reg(list,OP_SUB,countregsize,1,countreg);
|
||||||
a_jmp_flags(list,F_NE,l);
|
a_jmp_flags(list,F_NE,l);
|
||||||
|
// keep registers alive
|
||||||
|
list.concat(taicpu.op_reg_reg(A_MOV,countreg,countreg));
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
begin
|
begin
|
||||||
|
Loading…
Reference in New Issue
Block a user