mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-18 14:49:11 +02:00
some dirty 68k changes/experiments...
git-svn-id: trunk@792 -
This commit is contained in:
parent
e473858821
commit
e7b1c386b7
@ -82,6 +82,7 @@ type
|
|||||||
constructor op_sym_ofs_ref(op : tasmop;_size : topsize;_op1 : tasmsymbol;_op1ofs:longint;const _op2 : treference);
|
constructor op_sym_ofs_ref(op : tasmop;_size : topsize;_op1 : tasmsymbol;_op1ofs:longint;const _op2 : treference);
|
||||||
|
|
||||||
function is_same_reg_move(regtype: Tregistertype):boolean;override;
|
function is_same_reg_move(regtype: Tregistertype):boolean;override;
|
||||||
|
function spilling_get_operation_type(opnr: longint): topertype;override;
|
||||||
|
|
||||||
private
|
private
|
||||||
procedure loadregset(opidx:longint;const s:tcpuregisterset);
|
procedure loadregset(opidx:longint;const s:tcpuregisterset);
|
||||||
@ -438,9 +439,40 @@ type
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
function taicpu.spilling_get_operation_type(opnr: longint): topertype;
|
||||||
|
begin
|
||||||
|
case opcode of
|
||||||
|
A_MOVE, A_ADD:
|
||||||
|
if opnr=0 then begin
|
||||||
|
writeln('move/add write');
|
||||||
|
result:=operand_write;
|
||||||
|
end else begin
|
||||||
|
writeln('move/add read');
|
||||||
|
result:=operand_read;
|
||||||
|
end;
|
||||||
|
A_RTS:
|
||||||
|
begin
|
||||||
|
writeln('rts!');
|
||||||
|
result:=operand_readwrite;
|
||||||
|
end;
|
||||||
|
else
|
||||||
|
writeln('other opcode: (faked value returned)',opnr);
|
||||||
|
result:=operand_write;
|
||||||
|
end;
|
||||||
|
// fake
|
||||||
|
|
||||||
|
// internalerror(200404091);
|
||||||
|
end;
|
||||||
|
|
||||||
function spilling_create_load(const ref:treference;r:tregister): tai;
|
function spilling_create_load(const ref:treference;r:tregister): tai;
|
||||||
begin
|
begin
|
||||||
{
|
writeln('spilling_create_load');
|
||||||
|
case getregtype(r) of
|
||||||
|
R_INTREGISTER :
|
||||||
|
result:=taicpu.op_ref_reg(A_MOVE,S_L,ref,r);
|
||||||
|
R_FPUREGISTER : begin end;
|
||||||
|
end;
|
||||||
|
{
|
||||||
case getregtype(r) of
|
case getregtype(r) of
|
||||||
R_INTREGISTER :
|
R_INTREGISTER :
|
||||||
result:=taicpu.op_ref_reg(A_LD,ref,r);
|
result:=taicpu.op_ref_reg(A_LD,ref,r);
|
||||||
@ -457,12 +489,22 @@ type
|
|||||||
end
|
end
|
||||||
else
|
else
|
||||||
internalerror(200401041);
|
internalerror(200401041);
|
||||||
end;}
|
end;
|
||||||
|
}
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
function spilling_create_store(r:tregister; const ref:treference): tai;
|
function spilling_create_store(r:tregister; const ref:treference): tai;
|
||||||
begin
|
begin
|
||||||
|
writeln('spilling_create_store');
|
||||||
|
case getregtype(r) of
|
||||||
|
R_INTREGISTER :
|
||||||
|
result:=taicpu.op_reg_ref(A_MOVE,S_L,r,ref);
|
||||||
|
R_FPUREGISTER :
|
||||||
|
begin
|
||||||
|
// result:=taicpu.op_reg_ref(A_FMOVE,R_SUBFS,r,ref);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
{case getregtype(r) of
|
{case getregtype(r) of
|
||||||
R_INTREGISTER :
|
R_INTREGISTER :
|
||||||
result:=taicpu.op_reg_ref(A_ST,r,ref);
|
result:=taicpu.op_reg_ref(A_ST,r,ref);
|
||||||
|
@ -886,14 +886,16 @@ unit cgcpu;
|
|||||||
begin
|
begin
|
||||||
popaddress := false;
|
popaddress := false;
|
||||||
|
|
||||||
|
writeln('concatcopy:',len);
|
||||||
|
|
||||||
{ this should never occur }
|
{ this should never occur }
|
||||||
if len > 65535 then
|
if len > 65535 then
|
||||||
internalerror(0);
|
internalerror(0);
|
||||||
hregister := cg.getintregister(list,OS_INT);
|
|
||||||
|
hregister := getintregister(list,OS_INT);
|
||||||
// if delsource then
|
// if delsource then
|
||||||
// reference_release(list,source);
|
// reference_release(list,source);
|
||||||
|
|
||||||
|
|
||||||
{ from 12 bytes movs is being used }
|
{ from 12 bytes movs is being used }
|
||||||
if {(not loadref) and} ((len<=8) or (not(cs_littlesize in aktglobalswitches) and (len<=12))) then
|
if {(not loadref) and} ((len<=8) or (not(cs_littlesize in aktglobalswitches) and (len<=12))) then
|
||||||
begin
|
begin
|
||||||
@ -903,8 +905,8 @@ unit cgcpu;
|
|||||||
{ move a dword x times }
|
{ move a dword x times }
|
||||||
for i:=1 to helpsize do
|
for i:=1 to helpsize do
|
||||||
begin
|
begin
|
||||||
cg.a_load_ref_reg(list,OS_INT,OS_INT,srcref,hregister);
|
a_load_ref_reg(list,OS_INT,OS_INT,srcref,hregister);
|
||||||
cg.a_load_reg_ref(list,OS_INT,OS_INT,hregister,dstref);
|
a_load_reg_ref(list,OS_INT,OS_INT,hregister,dstref);
|
||||||
inc(srcref.offset,4);
|
inc(srcref.offset,4);
|
||||||
inc(dstref.offset,4);
|
inc(dstref.offset,4);
|
||||||
dec(len,4);
|
dec(len,4);
|
||||||
@ -912,8 +914,8 @@ unit cgcpu;
|
|||||||
{ move a word }
|
{ move a word }
|
||||||
if len>1 then
|
if len>1 then
|
||||||
begin
|
begin
|
||||||
cg.a_load_ref_reg(list,OS_16,OS_16,srcref,hregister);
|
a_load_ref_reg(list,OS_16,OS_16,srcref,hregister);
|
||||||
cg.a_load_reg_ref(list,OS_16,OS_16,hregister,dstref);
|
a_load_reg_ref(list,OS_16,OS_16,hregister,dstref);
|
||||||
inc(srcref.offset,2);
|
inc(srcref.offset,2);
|
||||||
inc(dstref.offset,2);
|
inc(dstref.offset,2);
|
||||||
dec(len,2);
|
dec(len,2);
|
||||||
@ -921,14 +923,14 @@ unit cgcpu;
|
|||||||
{ move a single byte }
|
{ move a single byte }
|
||||||
if len>0 then
|
if len>0 then
|
||||||
begin
|
begin
|
||||||
cg.a_load_ref_reg(list,OS_8,OS_8,srcref,hregister);
|
a_load_ref_reg(list,OS_8,OS_8,srcref,hregister);
|
||||||
cg.a_load_reg_ref(list,OS_8,OS_8,hregister,dstref);
|
a_load_reg_ref(list,OS_8,OS_8,hregister,dstref);
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
begin
|
begin
|
||||||
iregister:=cg.getaddressregister(list);
|
iregister:=getaddressregister(list);
|
||||||
jregister:=cg.getaddressregister(list);
|
jregister:=getaddressregister(list);
|
||||||
{ reference for move (An)+,(An)+ }
|
{ reference for move (An)+,(An)+ }
|
||||||
reference_reset(hp1);
|
reference_reset(hp1);
|
||||||
hp1.base := iregister; { source register }
|
hp1.base := iregister; { source register }
|
||||||
@ -942,9 +944,9 @@ unit cgcpu;
|
|||||||
{ if loadref then
|
{ if loadref then
|
||||||
cg.a_load_ref_reg(list,OS_INT,OS_INT,source,iregister)
|
cg.a_load_ref_reg(list,OS_INT,OS_INT,source,iregister)
|
||||||
else}
|
else}
|
||||||
cg.a_loadaddr_ref_reg(list,source,iregister);
|
a_loadaddr_ref_reg(list,source,iregister);
|
||||||
|
|
||||||
cg.a_loadaddr_ref_reg(list,dest,jregister);
|
a_loadaddr_ref_reg(list,dest,jregister);
|
||||||
|
|
||||||
{ double word move only on 68020+ machines }
|
{ double word move only on 68020+ machines }
|
||||||
{ because of possible alignment problems }
|
{ because of possible alignment problems }
|
||||||
@ -955,11 +957,11 @@ unit cgcpu;
|
|||||||
len := len mod 4;
|
len := len mod 4;
|
||||||
list.concat(taicpu.op_const_reg(A_MOVE,S_L,helpsize div 4,hregister));
|
list.concat(taicpu.op_const_reg(A_MOVE,S_L,helpsize div 4,hregister));
|
||||||
objectlibrary.getlabel(hl2);
|
objectlibrary.getlabel(hl2);
|
||||||
cg.a_jmp_always(list,hl2);
|
a_jmp_always(list,hl2);
|
||||||
objectlibrary.getlabel(hl);
|
objectlibrary.getlabel(hl);
|
||||||
cg.a_label(list,hl);
|
a_label(list,hl);
|
||||||
list.concat(taicpu.op_ref_ref(A_MOVE,S_L,hp1,hp2));
|
list.concat(taicpu.op_ref_ref(A_MOVE,S_L,hp1,hp2));
|
||||||
cg.a_label(list,hl2);
|
a_label(list,hl2);
|
||||||
list.concat(taicpu.op_reg_sym(A_DBRA,S_L,hregister,hl));
|
list.concat(taicpu.op_reg_sym(A_DBRA,S_L,hregister,hl));
|
||||||
if len > 1 then
|
if len > 1 then
|
||||||
begin
|
begin
|
||||||
@ -975,17 +977,17 @@ unit cgcpu;
|
|||||||
helpsize := len;
|
helpsize := len;
|
||||||
list.concat(taicpu.op_const_reg(A_MOVE,S_L,helpsize,hregister));
|
list.concat(taicpu.op_const_reg(A_MOVE,S_L,helpsize,hregister));
|
||||||
objectlibrary.getlabel(hl2);
|
objectlibrary.getlabel(hl2);
|
||||||
cg.a_jmp_always(list,hl2);
|
a_jmp_always(list,hl2);
|
||||||
objectlibrary.getlabel(hl);
|
objectlibrary.getlabel(hl);
|
||||||
cg.a_label(list,hl);
|
a_label(list,hl);
|
||||||
list.concat(taicpu.op_ref_ref(A_MOVE,S_B,hp1,hp2));
|
list.concat(taicpu.op_ref_ref(A_MOVE,S_B,hp1,hp2));
|
||||||
cg.a_label(list,hl2);
|
a_label(list,hl2);
|
||||||
list.concat(taicpu.op_reg_sym(A_DBRA,S_L,hregister,hl));
|
list.concat(taicpu.op_reg_sym(A_DBRA,S_L,hregister,hl));
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{ restore the registers that we have just used olny if they are used! }
|
{ restore the registers that we have just used olny if they are used! }
|
||||||
cg.ungetcpuregister(list, iregister);
|
ungetcpuregister(list, iregister);
|
||||||
cg.ungetcpuregister(list, jregister);
|
ungetcpuregister(list, jregister);
|
||||||
if jregister = NR_A1 then
|
if jregister = NR_A1 then
|
||||||
hp2.base := NR_NO;
|
hp2.base := NR_NO;
|
||||||
if iregister = NR_A0 then
|
if iregister = NR_A0 then
|
||||||
@ -997,7 +999,8 @@ unit cgcpu;
|
|||||||
// if delsource then
|
// if delsource then
|
||||||
// tg.ungetiftemp(list,source);
|
// tg.ungetiftemp(list,source);
|
||||||
|
|
||||||
cg.ungetcpuregister(list,hregister);
|
// Not needed? (KB)
|
||||||
|
// ungetcpuregister(list,hregister);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure tcg68k.g_overflowcheck(list: taasmoutput; const l:tlocation; def:tdef);
|
procedure tcg68k.g_overflowcheck(list: taasmoutput; const l:tlocation; def:tdef);
|
||||||
@ -1093,8 +1096,8 @@ unit cgcpu;
|
|||||||
{ restore the PC counter (push it on the stack) }
|
{ restore the PC counter (push it on the stack) }
|
||||||
reference_reset_base(ref,NR_STACK_POINTER_REG,0);
|
reference_reset_base(ref,NR_STACK_POINTER_REG,0);
|
||||||
ref.direction:=dir_dec;
|
ref.direction:=dir_dec;
|
||||||
list.concat(taicpu.op_reg_ref(A_MOVE,S_L,hregister,ref));
|
|
||||||
cg.a_reg_alloc(list,hregister);
|
cg.a_reg_alloc(list,hregister);
|
||||||
|
list.concat(taicpu.op_reg_ref(A_MOVE,S_L,hregister,ref));
|
||||||
list.concat(taicpu.op_none(A_RTS,S_NO));
|
list.concat(taicpu.op_none(A_RTS,S_NO));
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
@ -217,7 +217,7 @@ unit cpupara;
|
|||||||
else
|
else
|
||||||
p.funcretloc[side].register64.reglo:=NR_FUNCTION_RETURN64_LOW_REG;
|
p.funcretloc[side].register64.reglo:=NR_FUNCTION_RETURN64_LOW_REG;
|
||||||
{ high 32bits }
|
{ high 32bits }
|
||||||
if side=callerside then
|
if side=calleeside then
|
||||||
p.funcretloc[side].register64.reghi:=NR_FUNCTION_RESULT64_HIGH_REG
|
p.funcretloc[side].register64.reghi:=NR_FUNCTION_RESULT64_HIGH_REG
|
||||||
else
|
else
|
||||||
p.funcretloc[side].register64.reghi:=NR_FUNCTION_RETURN64_HIGH_REG;
|
p.funcretloc[side].register64.reghi:=NR_FUNCTION_RETURN64_HIGH_REG;
|
||||||
|
Loading…
Reference in New Issue
Block a user