mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-06-06 06:40:05 +02:00
* fixing several bugs compiling the RTL
This commit is contained in:
parent
99c5d0adab
commit
215880afe8
@ -282,9 +282,7 @@ constructor taicpu.op_caddr_reg(op:TAsmOp;rgb:TRegister;cnst:Integer;reg:TRegist
|
|||||||
inherited create(op);
|
inherited create(op);
|
||||||
init(S_SW);
|
init(S_SW);
|
||||||
ops:=2;
|
ops:=2;
|
||||||
WriteLn(1,std_reg2str[rgb]);
|
|
||||||
loadcaddr(0,rgb,cnst);
|
loadcaddr(0,rgb,cnst);
|
||||||
WriteLn(2,std_reg2str[rgb]);
|
|
||||||
loadreg(1,reg);
|
loadreg(1,reg);
|
||||||
end;
|
end;
|
||||||
constructor taicpu.op_raddr_reg(op:TAsmOp;rg1,rg2,reg:TRegister);
|
constructor taicpu.op_raddr_reg(op:TAsmOp;rg1,rg2,reg:TRegister);
|
||||||
@ -1083,7 +1081,10 @@ procedure InitAsm;
|
|||||||
end.
|
end.
|
||||||
{
|
{
|
||||||
$Log$
|
$Log$
|
||||||
Revision 1.14 2002-12-14 15:02:03 carl
|
Revision 1.15 2003-01-05 21:32:35 mazen
|
||||||
|
* fixing several bugs compiling the RTL
|
||||||
|
|
||||||
|
Revision 1.14 2002/12/14 15:02:03 carl
|
||||||
* maxoperands -> max_operands (for portability in rautils.pas)
|
* maxoperands -> max_operands (for portability in rautils.pas)
|
||||||
* fix some range-check errors with loadconst
|
* fix some range-check errors with loadconst
|
||||||
+ add ncgadd unit to m68k
|
+ add ncgadd unit to m68k
|
||||||
|
@ -27,7 +27,7 @@ USES
|
|||||||
cpubase,cpuinfo,cpupara,
|
cpubase,cpuinfo,cpupara,
|
||||||
node,symconst;
|
node,symconst;
|
||||||
TYPE
|
TYPE
|
||||||
tcgSPARC=CLASS(tcg)
|
TCgSparc=CLASS(tcg)
|
||||||
{This method is used to pass a parameter, which is located in a register, to a
|
{This method is used to pass a parameter, which is located in a register, to a
|
||||||
routine. It should give the parameter to the routine, as required by the
|
routine. It should give the parameter to the routine, as required by the
|
||||||
specific processor ABI. It is overriden for each CPU target.
|
specific processor ABI. It is overriden for each CPU target.
|
||||||
@ -80,6 +80,8 @@ specific processor ABI. It is overriden for each CPU target.
|
|||||||
procedure g_stackframe_entry(list:TAasmOutput;localsize:LongInt);override;
|
procedure g_stackframe_entry(list:TAasmOutput;localsize:LongInt);override;
|
||||||
procedure g_restore_frame_pointer(list:TAasmOutput);override;
|
procedure g_restore_frame_pointer(list:TAasmOutput);override;
|
||||||
procedure g_return_from_proc(list:TAasmOutput;parasize:aword);override;
|
procedure g_return_from_proc(list:TAasmOutput;parasize:aword);override;
|
||||||
|
procedure g_save_all_registers(list : taasmoutput);override;
|
||||||
|
procedure g_save_standard_registers(list : taasmoutput; usedinproc : tregisterset);override;
|
||||||
procedure g_concatcopy(list:TAasmOutput;CONST source,dest:TReference;len:aword;delsource,loadref:boolean);override;
|
procedure g_concatcopy(list:TAasmOutput;CONST source,dest:TReference;len:aword;delsource,loadref:boolean);override;
|
||||||
class function reg_cgsize(CONST reg:tregister):tcgsize;override;
|
class function reg_cgsize(CONST reg:tregister):tcgsize;override;
|
||||||
PRIVATE
|
PRIVATE
|
||||||
@ -109,7 +111,7 @@ USES
|
|||||||
rgobj,tgobj,rgcpu,cpupi;
|
rgobj,tgobj,rgcpu,cpupi;
|
||||||
{ we implement the following routines because otherwise we can't }
|
{ we implement the following routines because otherwise we can't }
|
||||||
{ instantiate the class since it's abstract }
|
{ instantiate the class since it's abstract }
|
||||||
procedure tcgSPARC.a_param_reg(list:TAasmOutput;size:tcgsize;r:tregister;const LocPara:TParaLocation);
|
procedure TCgSparc.a_param_reg(list:TAasmOutput;size:tcgsize;r:tregister;const LocPara:TParaLocation);
|
||||||
begin
|
begin
|
||||||
if(Size<>OS_32)and(Size<>OS_S32)
|
if(Size<>OS_32)and(Size<>OS_S32)
|
||||||
then
|
then
|
||||||
@ -124,7 +126,7 @@ procedure tcgSPARC.a_param_reg(list:TAasmOutput;size:tcgsize;r:tregister;const L
|
|||||||
InternalError(2002101002);
|
InternalError(2002101002);
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
procedure tcgSPARC.a_param_const(list:TAasmOutput;size:tcgsize;a:aword;CONST LocPara:TParaLocation);
|
procedure TCgSparc.a_param_const(list:TAasmOutput;size:tcgsize;a:aword;CONST LocPara:TParaLocation);
|
||||||
var
|
var
|
||||||
Ref:TReference;
|
Ref:TReference;
|
||||||
begin
|
begin
|
||||||
@ -146,7 +148,7 @@ procedure tcgSPARC.a_param_const(list:TAasmOutput;size:tcgsize;a:aword;CONST Loc
|
|||||||
then
|
then
|
||||||
InternalError(2002122201);
|
InternalError(2002122201);
|
||||||
end;
|
end;
|
||||||
procedure tcgSPARC.a_param_ref(list:TAasmOutput;sz:TCgSize;const r:TReference;const LocPara:TParaLocation);
|
procedure TCgSparc.a_param_ref(list:TAasmOutput;sz:TCgSize;const r:TReference;const LocPara:TParaLocation);
|
||||||
var
|
var
|
||||||
ref: treference;
|
ref: treference;
|
||||||
tmpreg:TRegister;
|
tmpreg:TRegister;
|
||||||
@ -183,7 +185,7 @@ procedure tcgSPARC.a_param_ref(list:TAasmOutput;sz:TCgSize;const r:TReference;co
|
|||||||
internalerror(2002081103);
|
internalerror(2002081103);
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
procedure tcgSPARC.a_paramaddr_ref(list:TAasmOutput;CONST r:TReference;CONST LocPara:TParaLocation);
|
procedure TCgSparc.a_paramaddr_ref(list:TAasmOutput;CONST r:TReference;CONST LocPara:TParaLocation);
|
||||||
VAR
|
VAR
|
||||||
tmpreg:TRegister;
|
tmpreg:TRegister;
|
||||||
BEGIN
|
BEGIN
|
||||||
@ -209,7 +211,7 @@ procedure tcgSPARC.a_paramaddr_ref(list:TAasmOutput;CONST r:TReference;CONST Loc
|
|||||||
free_scratch_reg(list,tmpreg);
|
free_scratch_reg(list,tmpreg);
|
||||||
END;
|
END;
|
||||||
END;
|
END;
|
||||||
procedure tcgSPARC.a_call_name(list:TAasmOutput;CONST s:string);
|
procedure TCgSparc.a_call_name(list:TAasmOutput;CONST s:string);
|
||||||
BEGIN
|
BEGIN
|
||||||
WITH List,objectlibrary DO
|
WITH List,objectlibrary DO
|
||||||
BEGIN
|
BEGIN
|
||||||
@ -217,7 +219,7 @@ procedure tcgSPARC.a_call_name(list:TAasmOutput;CONST s:string);
|
|||||||
concat(taicpu.op_none(A_NOP));
|
concat(taicpu.op_none(A_NOP));
|
||||||
END;
|
END;
|
||||||
END;
|
END;
|
||||||
procedure tcgSPARC.a_call_ref(list:TAasmOutput;CONST ref:TReference);
|
procedure TCgSparc.a_call_ref(list:TAasmOutput;CONST ref:TReference);
|
||||||
begin
|
begin
|
||||||
list.concat(taicpu.op_ref(A_CALL,ref));
|
list.concat(taicpu.op_ref(A_CALL,ref));
|
||||||
list.concat(taicpu.op_none(A_NOP));
|
list.concat(taicpu.op_none(A_NOP));
|
||||||
@ -231,12 +233,12 @@ procedure TCgSparc.a_call_reg(list:TAasmOutput;Reg:TRegister);
|
|||||||
procinfo.flags:=procinfo.flags or pi_do_call;
|
procinfo.flags:=procinfo.flags or pi_do_call;
|
||||||
end;
|
end;
|
||||||
{********************** branch instructions ********************}
|
{********************** branch instructions ********************}
|
||||||
procedure TCgSPARC.a_jmp_always(List:TAasmOutput;l:TAsmLabel);
|
procedure TCgSparc.a_jmp_always(List:TAasmOutput;l:TAsmLabel);
|
||||||
begin
|
begin
|
||||||
List.Concat(TAiCpu.op_sym(A_BA,S_NO,objectlibrary.newasmsymbol(l.name)));
|
List.Concat(TAiCpu.op_sym(A_BA,S_NO,objectlibrary.newasmsymbol(l.name)));
|
||||||
end;
|
end;
|
||||||
{********************** load instructions ********************}
|
{********************** load instructions ********************}
|
||||||
procedure tcgSPARC.a_load_const_reg(list:TAasmOutput;size:TCGSize;a:aword;reg:TRegister);
|
procedure TCgSparc.a_load_const_reg(list:TAasmOutput;size:TCGSize;a:aword;reg:TRegister);
|
||||||
BEGIN
|
BEGIN
|
||||||
WITH List DO
|
WITH List DO
|
||||||
IF a<>0
|
IF a<>0
|
||||||
@ -245,7 +247,7 @@ procedure tcgSPARC.a_load_const_reg(list:TAasmOutput;size:TCGSize;a:aword;reg:TR
|
|||||||
ELSE{The is no A_MOV in sparc, that's why we use A_OR with help of R_G0}
|
ELSE{The is no A_MOV in sparc, that's why we use A_OR with help of R_G0}
|
||||||
Concat(taicpu.op_reg_reg_reg(A_OR,R_G0,R_G0,reg));
|
Concat(taicpu.op_reg_reg_reg(A_OR,R_G0,R_G0,reg));
|
||||||
END;
|
END;
|
||||||
procedure tcgSPARC.a_load_const_ref(list:TAasmOutput;size:tcgsize;a:aword;CONST ref:TReference);
|
procedure TCgSparc.a_load_const_ref(list:TAasmOutput;size:tcgsize;a:aword;CONST ref:TReference);
|
||||||
BEGIN
|
BEGIN
|
||||||
WITH List DO
|
WITH List DO
|
||||||
IF a=0
|
IF a=0
|
||||||
@ -264,11 +266,11 @@ procedure tcgSPARC.a_load_const_ref(list:TAasmOutput;size:tcgsize;a:aword;CONST
|
|||||||
end;
|
end;
|
||||||
END;
|
END;
|
||||||
END;
|
END;
|
||||||
procedure tcgSPARC.a_load_reg_ref(list:TAasmOutput;size:TCGSize;reg:tregister;CONST ref:TReference);
|
procedure TCgSparc.a_load_reg_ref(list:TAasmOutput;size:TCGSize;reg:tregister;CONST ref:TReference);
|
||||||
BEGIN
|
BEGIN
|
||||||
list.concat(taicpu.op_reg_ref(A_ST,reg,ref));
|
list.concat(taicpu.op_reg_ref(A_ST,reg,ref));
|
||||||
END;
|
END;
|
||||||
procedure tcgSPARC.a_load_ref_reg(list:TAasmOutput;size:TCgSize;const ref:TReference;reg:tregister);
|
procedure TCgSparc.a_load_ref_reg(list:TAasmOutput;size:TCgSize;const ref:TReference;reg:tregister);
|
||||||
var
|
var
|
||||||
op:tasmop;
|
op:tasmop;
|
||||||
s:topsize;
|
s:topsize;
|
||||||
@ -308,7 +310,7 @@ procedure tcgSPARC.a_load_ref_reg(list:TAasmOutput;size:TCgSize;const ref:TRefer
|
|||||||
with list do
|
with list do
|
||||||
concat(taicpu.op_ref_reg(op,ref,reg));
|
concat(taicpu.op_ref_reg(op,ref,reg));
|
||||||
end;
|
end;
|
||||||
procedure tcgSPARC.a_load_reg_reg(list:TAasmOutput;fromsize,tosize:tcgsize;reg1,reg2:tregister);
|
procedure TCgSparc.a_load_reg_reg(list:TAasmOutput;fromsize,tosize:tcgsize;reg1,reg2:tregister);
|
||||||
var
|
var
|
||||||
op:tasmop;
|
op:tasmop;
|
||||||
s:topsize;
|
s:topsize;
|
||||||
@ -336,7 +338,7 @@ procedure tcgSPARC.a_load_reg_reg(list:TAasmOutput;fromsize,tosize:tcgsize;reg1,
|
|||||||
end;
|
end;
|
||||||
{ all fpu load routines expect that R_ST[0-7] means an fpu regvar and }
|
{ all fpu load routines expect that R_ST[0-7] means an fpu regvar and }
|
||||||
{ R_ST means "the current value at the top of the fpu stack" (JM) }
|
{ R_ST means "the current value at the top of the fpu stack" (JM) }
|
||||||
procedure tcgSPARC.a_loadfpu_reg_reg(list:TAasmOutput;reg1, reg2:tregister);
|
procedure TCgSparc.a_loadfpu_reg_reg(list:TAasmOutput;reg1, reg2:tregister);
|
||||||
|
|
||||||
begin
|
begin
|
||||||
{ if NOT (reg1 IN [R_F0..R_F31]) then
|
{ if NOT (reg1 IN [R_F0..R_F31]) then
|
||||||
@ -354,7 +356,7 @@ procedure tcgSPARC.a_loadfpu_reg_reg(list:TAasmOutput;reg1, reg2:tregister);
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
procedure tcgSPARC.a_loadfpu_ref_reg(list:TAasmOutput;size:tcgsize;CONST ref:TReference;reg:tregister);
|
procedure TCgSparc.a_loadfpu_ref_reg(list:TAasmOutput;size:tcgsize;CONST ref:TReference;reg:tregister);
|
||||||
|
|
||||||
begin
|
begin
|
||||||
floatload(list,size,ref);
|
floatload(list,size,ref);
|
||||||
@ -363,7 +365,7 @@ procedure tcgSPARC.a_loadfpu_reg_reg(list:TAasmOutput;reg1, reg2:tregister);
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
procedure tcgSPARC.a_loadfpu_reg_ref(list:TAasmOutput;size:tcgsize;reg:tregister;CONST ref:TReference);
|
procedure TCgSparc.a_loadfpu_reg_ref(list:TAasmOutput;size:tcgsize;reg:tregister;CONST ref:TReference);
|
||||||
|
|
||||||
begin
|
begin
|
||||||
{ if reg <> R_ST then
|
{ if reg <> R_ST then
|
||||||
@ -372,26 +374,26 @@ procedure tcgSPARC.a_loadfpu_reg_reg(list:TAasmOutput;reg1, reg2:tregister);
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
procedure tcgSPARC.a_loadmm_reg_reg(list:TAasmOutput;reg1, reg2:tregister);
|
procedure TCgSparc.a_loadmm_reg_reg(list:TAasmOutput;reg1, reg2:tregister);
|
||||||
|
|
||||||
begin
|
begin
|
||||||
// list.concat(taicpu.op_reg_reg(A_NONEQ,S_NO,reg1,reg2));
|
// list.concat(taicpu.op_reg_reg(A_NONEQ,S_NO,reg1,reg2));
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
procedure tcgSPARC.a_loadmm_ref_reg(list:TAasmOutput;CONST ref:TReference;reg:tregister);
|
procedure TCgSparc.a_loadmm_ref_reg(list:TAasmOutput;CONST ref:TReference;reg:tregister);
|
||||||
|
|
||||||
begin
|
begin
|
||||||
// list.concat(taicpu.op_ref_reg(A_NONEQ,S_NO,ref,reg));
|
// list.concat(taicpu.op_ref_reg(A_NONEQ,S_NO,ref,reg));
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
procedure tcgSPARC.a_loadmm_reg_ref(list:TAasmOutput;reg:tregister;CONST ref:TReference);
|
procedure TCgSparc.a_loadmm_reg_ref(list:TAasmOutput;reg:tregister;CONST ref:TReference);
|
||||||
|
|
||||||
begin
|
begin
|
||||||
// list.concat(taicpu.op_reg_ref(A_NONEQ,S_NO,reg,ref));
|
// list.concat(taicpu.op_reg_ref(A_NONEQ,S_NO,reg,ref));
|
||||||
end;
|
end;
|
||||||
procedure tcgSPARC.a_parammm_reg(list:TAasmOutput;reg:tregister);
|
procedure TCgSparc.a_parammm_reg(list:TAasmOutput;reg:tregister);
|
||||||
VAR
|
VAR
|
||||||
href:TReference;
|
href:TReference;
|
||||||
BEGIN
|
BEGIN
|
||||||
@ -399,7 +401,7 @@ procedure tcgSPARC.a_parammm_reg(list:TAasmOutput;reg:tregister);
|
|||||||
// reference_reset_base(href,R_ESP,0);
|
// reference_reset_base(href,R_ESP,0);
|
||||||
// list.concat(taicpu.op_reg_ref(A_NONEQ,S_NO,reg,href));
|
// list.concat(taicpu.op_reg_ref(A_NONEQ,S_NO,reg,href));
|
||||||
END;
|
END;
|
||||||
procedure tcgSPARC.a_op_const_reg(list:TAasmOutput;Op:TOpCG;a:AWord;reg:TRegister);
|
procedure TCgSparc.a_op_const_reg(list:TAasmOutput;Op:TOpCG;a:AWord;reg:TRegister);
|
||||||
|
|
||||||
var
|
var
|
||||||
opcode:tasmop;
|
opcode:tasmop;
|
||||||
@ -483,7 +485,7 @@ procedure tcgSPARC.a_op_const_reg(list:TAasmOutput;Op:TOpCG;a:AWord;reg:TRegiste
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
procedure tcgSPARC.a_op_const_ref(list:TAasmOutput;Op:TOpCG;size:TCGSize;a:AWord;CONST ref:TReference);
|
procedure TCgSparc.a_op_const_ref(list:TAasmOutput;Op:TOpCG;size:TCGSize;a:AWord;CONST ref:TReference);
|
||||||
|
|
||||||
var
|
var
|
||||||
opcode:tasmop;
|
opcode:tasmop;
|
||||||
@ -567,7 +569,7 @@ procedure tcgSPARC.a_op_const_reg(list:TAasmOutput;Op:TOpCG;a:AWord;reg:TRegiste
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
procedure tcgSPARC.a_op_reg_reg(list:TAasmOutput;Op:TOpCG;size:TCGSize;src, dst:TRegister);
|
procedure TCgSparc.a_op_reg_reg(list:TAasmOutput;Op:TOpCG;size:TCGSize;src, dst:TRegister);
|
||||||
|
|
||||||
var
|
var
|
||||||
regloadsize:tcgsize;
|
regloadsize:tcgsize;
|
||||||
@ -648,7 +650,7 @@ procedure tcgSPARC.a_op_const_reg(list:TAasmOutput;Op:TOpCG;a:AWord;reg:TRegiste
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
procedure tcgSPARC.a_op_ref_reg(list:TAasmOutput;Op:TOpCG;size:TCGSize;CONST ref:TReference;reg:TRegister);
|
procedure TCgSparc.a_op_ref_reg(list:TAasmOutput;Op:TOpCG;size:TCGSize;CONST ref:TReference;reg:TRegister);
|
||||||
|
|
||||||
var
|
var
|
||||||
opsize:topsize;
|
opsize:topsize;
|
||||||
@ -672,7 +674,7 @@ procedure tcgSPARC.a_op_const_reg(list:TAasmOutput;Op:TOpCG;a:AWord;reg:TRegiste
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
procedure tcgSPARC.a_op_reg_ref(list:TAasmOutput;Op:TOpCG;size:TCGSize;reg:TRegister;CONST ref:TReference);
|
procedure TCgSparc.a_op_reg_ref(list:TAasmOutput;Op:TOpCG;size:TCGSize;reg:TRegister;CONST ref:TReference);
|
||||||
|
|
||||||
var
|
var
|
||||||
opsize:topsize;
|
opsize:topsize;
|
||||||
@ -703,7 +705,7 @@ procedure tcgSPARC.a_op_const_reg(list:TAasmOutput;Op:TOpCG;a:AWord;reg:TRegiste
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
procedure tcgSPARC.a_op_const_reg_reg(list:TAasmOutput;op:TOpCg;
|
procedure TCgSparc.a_op_const_reg_reg(list:TAasmOutput;op:TOpCg;
|
||||||
size:tcgsize;a:aword;src, dst:tregister);
|
size:tcgsize;a:aword;src, dst:tregister);
|
||||||
var
|
var
|
||||||
tmpref:TReference;
|
tmpref:TReference;
|
||||||
@ -747,7 +749,7 @@ procedure tcgSPARC.a_op_const_reg(list:TAasmOutput;Op:TOpCG;a:AWord;reg:TRegiste
|
|||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure tcgSPARC.a_op_reg_reg_reg(list:TAasmOutput;op:TOpCg;
|
procedure TCgSparc.a_op_reg_reg_reg(list:TAasmOutput;op:TOpCg;
|
||||||
size:tcgsize;src1, src2, dst:tregister);
|
size:tcgsize;src1, src2, dst:tregister);
|
||||||
var
|
var
|
||||||
tmpref:TReference;
|
tmpref:TReference;
|
||||||
@ -783,7 +785,7 @@ procedure tcgSPARC.a_op_const_reg(list:TAasmOutput;Op:TOpCG;a:AWord;reg:TRegiste
|
|||||||
|
|
||||||
{*************** compare instructructions ****************}
|
{*************** compare instructructions ****************}
|
||||||
|
|
||||||
procedure tcgSPARC.a_cmp_const_reg_label(list:TAasmOutput;size:tcgsize;cmp_op:topcmp;a:aword;reg:tregister;
|
procedure TCgSparc.a_cmp_const_reg_label(list:TAasmOutput;size:tcgsize;cmp_op:topcmp;a:aword;reg:tregister;
|
||||||
l:tasmlabel);
|
l:tasmlabel);
|
||||||
|
|
||||||
begin
|
begin
|
||||||
@ -794,7 +796,7 @@ procedure tcgSPARC.a_op_const_reg(list:TAasmOutput;Op:TOpCG;a:AWord;reg:TRegiste
|
|||||||
a_jmp_cond(list,cmp_op,l);
|
a_jmp_cond(list,cmp_op,l);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure tcgSPARC.a_cmp_const_ref_label(list:TAasmOutput;size:tcgsize;cmp_op:topcmp;a:aword;const ref:TReference;l:tasmlabel);
|
procedure TCgSparc.a_cmp_const_ref_label(list:TAasmOutput;size:tcgsize;cmp_op:topcmp;a:aword;const ref:TReference;l:tasmlabel);
|
||||||
begin
|
begin
|
||||||
with List do
|
with List do
|
||||||
begin
|
begin
|
||||||
@ -804,7 +806,7 @@ procedure tcgSPARC.a_cmp_const_ref_label(list:TAasmOutput;size:tcgsize;cmp_op:to
|
|||||||
a_jmp_cond(list,cmp_op,l);
|
a_jmp_cond(list,cmp_op,l);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure tcgSPARC.a_cmp_reg_reg_label(list:TAasmOutput;size:tcgsize;cmp_op:topcmp;
|
procedure TCgSparc.a_cmp_reg_reg_label(list:TAasmOutput;size:tcgsize;cmp_op:topcmp;
|
||||||
reg1,reg2:tregister;l:tasmlabel);
|
reg1,reg2:tregister;l:tasmlabel);
|
||||||
|
|
||||||
begin
|
begin
|
||||||
@ -814,7 +816,7 @@ procedure tcgSPARC.a_cmp_const_ref_label(list:TAasmOutput;size:tcgsize;cmp_op:to
|
|||||||
a_jmp_cond(list,cmp_op,l);}
|
a_jmp_cond(list,cmp_op,l);}
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure tcgSPARC.a_cmp_ref_reg_label(list:TAasmOutput;size:tcgsize;cmp_op:topcmp;CONST ref:TReference;reg:tregister;l:tasmlabel);
|
procedure TCgSparc.a_cmp_ref_reg_label(list:TAasmOutput;size:tcgsize;cmp_op:topcmp;CONST ref:TReference;reg:tregister;l:tasmlabel);
|
||||||
var
|
var
|
||||||
TempReg:TRegister;
|
TempReg:TRegister;
|
||||||
begin
|
begin
|
||||||
@ -824,7 +826,7 @@ procedure tcgSPARC.a_cmp_ref_reg_label(list:TAasmOutput;size:tcgsize;cmp_op:topc
|
|||||||
a_jmp_cond(list,cmp_op,l);
|
a_jmp_cond(list,cmp_op,l);
|
||||||
cg.free_scratch_reg(exprasmlist,TempReg);
|
cg.free_scratch_reg(exprasmlist,TempReg);
|
||||||
end;
|
end;
|
||||||
procedure tcgSPARC.a_jmp_cond(list:TAasmOutput;cond:TOpCmp;l:tasmlabel);
|
procedure TCgSparc.a_jmp_cond(list:TAasmOutput;cond:TOpCmp;l:tasmlabel);
|
||||||
|
|
||||||
var
|
var
|
||||||
ai:taicpu;
|
ai:taicpu;
|
||||||
@ -841,7 +843,7 @@ procedure tcgSPARC.a_jmp_cond(list:TAasmOutput;cond:TOpCmp;l:tasmlabel);
|
|||||||
list.concat(ai);
|
list.concat(ai);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure tcgSPARC.a_jmp_flags(list:TAasmOutput;CONST f:TResFlags;l:tasmlabel);
|
procedure TCgSparc.a_jmp_flags(list:TAasmOutput;CONST f:TResFlags;l:tasmlabel);
|
||||||
var
|
var
|
||||||
ai:taicpu;
|
ai:taicpu;
|
||||||
begin
|
begin
|
||||||
@ -851,7 +853,7 @@ procedure tcgSPARC.a_jmp_cond(list:TAasmOutput;cond:TOpCmp;l:tasmlabel);
|
|||||||
list.concat(ai);
|
list.concat(ai);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure tcgSPARC.g_flags2reg(list:TAasmOutput;Size:TCgSize;CONST f:tresflags;reg:TRegister);
|
procedure TCgSparc.g_flags2reg(list:TAasmOutput;Size:TCgSize;CONST f:tresflags;reg:TRegister);
|
||||||
VAR
|
VAR
|
||||||
ai:taicpu;
|
ai:taicpu;
|
||||||
hreg:tregister;
|
hreg:tregister;
|
||||||
@ -888,7 +890,7 @@ procedure TCgSparc.g_overflowCheck(List:TAasmOutput;const p:TNode);
|
|||||||
end;
|
end;
|
||||||
{ *********** entry/exit code and address loading ************ }
|
{ *********** entry/exit code and address loading ************ }
|
||||||
|
|
||||||
procedure tcgSPARC.g_stackframe_entry(list:TAasmOutput;LocalSize:LongInt);
|
procedure TCgSparc.g_stackframe_entry(list:TAasmOutput;LocalSize:LongInt);
|
||||||
var
|
var
|
||||||
href:TReference;
|
href:TReference;
|
||||||
i:integer;
|
i:integer;
|
||||||
@ -905,12 +907,12 @@ after execution of that instruction is the called function stack pointer}
|
|||||||
with list do
|
with list do
|
||||||
concat(Taicpu.Op_reg_const_reg(A_SAVE,Stack_Pointer_Reg,-LocalSize,Stack_Pointer_Reg));
|
concat(Taicpu.Op_reg_const_reg(A_SAVE,Stack_Pointer_Reg,-LocalSize,Stack_Pointer_Reg));
|
||||||
end;
|
end;
|
||||||
procedure tcgSPARC.g_restore_frame_pointer(list:TAasmOutput);
|
procedure TCgSparc.g_restore_frame_pointer(list:TAasmOutput);
|
||||||
begin
|
begin
|
||||||
{This function intontionally does nothing as frame pointer is restored in the
|
{This function intontionally does nothing as frame pointer is restored in the
|
||||||
delay slot of the return instrucion done in g_return_from_proc}
|
delay slot of the return instrucion done in g_return_from_proc}
|
||||||
end;
|
end;
|
||||||
procedure tcgSPARC.g_return_from_proc(list:TAasmOutput;parasize:aword);
|
procedure TCgSparc.g_return_from_proc(list:TAasmOutput;parasize:aword);
|
||||||
begin
|
begin
|
||||||
{According to the SPARC ABI, the stack is cleared using the RESTORE instruction
|
{According to the SPARC ABI, the stack is cleared using the RESTORE instruction
|
||||||
which is genereted in the g_restore_frame_pointer. Notice that SPARC has no
|
which is genereted in the g_restore_frame_pointer. Notice that SPARC has no
|
||||||
@ -931,7 +933,15 @@ already set result onto %i0}
|
|||||||
concat(Taicpu.Op_reg_const_reg(A_RESTORE,R_G0,0,R_G0));
|
concat(Taicpu.Op_reg_const_reg(A_RESTORE,R_G0,0,R_G0));
|
||||||
end
|
end
|
||||||
end;
|
end;
|
||||||
procedure tcgSPARC.a_loadaddr_ref_reg(list:TAasmOutput;CONST ref:TReference;r:tregister);
|
procedure TCgSparc.g_save_all_registers(list : taasmoutput);
|
||||||
|
begin
|
||||||
|
{$warning FIX ME TCgSparc.g_save_all_registers}
|
||||||
|
end;
|
||||||
|
procedure TCgSparc.g_save_standard_registers(list : taasmoutput; usedinproc : tregisterset);
|
||||||
|
begin
|
||||||
|
{$warning FIX ME tcgppc.g_save_standard_registers}
|
||||||
|
end;
|
||||||
|
procedure TCgSparc.a_loadaddr_ref_reg(list:TAasmOutput;CONST ref:TReference;r:tregister);
|
||||||
|
|
||||||
begin
|
begin
|
||||||
// list.concat(taicpu.op_ref_reg(A_LEA,S_SW,ref,r));
|
// list.concat(taicpu.op_ref_reg(A_LEA,S_SW,ref,r));
|
||||||
@ -1204,7 +1214,7 @@ procedure TCgSparc.g_concatcopy(list:taasmoutput;const source,dest:treference;le
|
|||||||
if not orgdst then
|
if not orgdst then
|
||||||
free_scratch_reg(list,dst.base);
|
free_scratch_reg(list,dst.base);
|
||||||
end;
|
end;
|
||||||
function tcgSPARC.reg_cgsize(CONST reg:tregister):tcgsize;
|
function TCgSparc.reg_cgsize(CONST reg:tregister):tcgsize;
|
||||||
begin
|
begin
|
||||||
result:=OS_32;
|
result:=OS_32;
|
||||||
end;
|
end;
|
||||||
@ -1223,7 +1233,7 @@ function TCgSparc.IsSimpleRef(const ref:treference):boolean;
|
|||||||
((ref.index <> R_NO) and
|
((ref.index <> R_NO) and
|
||||||
(ref.offset = 0)));
|
(ref.offset = 0)));
|
||||||
end;
|
end;
|
||||||
procedure tcgSPARC.sizes2load(s1:tcgsize;s2:topsize;var op:tasmop;var s3:topsize);
|
procedure TCgSparc.sizes2load(s1:tcgsize;s2:topsize;var op:tasmop;var s3:topsize);
|
||||||
begin
|
begin
|
||||||
case s2 of
|
case s2 of
|
||||||
S_B:
|
S_B:
|
||||||
@ -1266,7 +1276,7 @@ procedure tcgSPARC.sizes2load(s1:tcgsize;s2:topsize;var op:tasmop;var s3:topsize
|
|||||||
else
|
else
|
||||||
op := A_NONE;
|
op := A_NONE;
|
||||||
end;
|
end;
|
||||||
procedure tcgSPARC.floatloadops(t:tcgsize;VAR op:tasmop;VAR s:topsize);
|
procedure TCgSparc.floatloadops(t:tcgsize;VAR op:tasmop;VAR s:topsize);
|
||||||
BEGIN
|
BEGIN
|
||||||
(* case t of
|
(* case t of
|
||||||
OS_F32:begin
|
OS_F32:begin
|
||||||
@ -1289,7 +1299,7 @@ procedure tcgSPARC.floatloadops(t:tcgsize;VAR op:tasmop;VAR s:topsize);
|
|||||||
else internalerror(17);
|
else internalerror(17);
|
||||||
end;*)
|
end;*)
|
||||||
END;
|
END;
|
||||||
procedure tcgSPARC.floatload(list:TAasmOutput;t:tcgsize;CONST ref:TReference);
|
procedure TCgSparc.floatload(list:TAasmOutput;t:tcgsize;CONST ref:TReference);
|
||||||
VAR
|
VAR
|
||||||
op:tasmop;
|
op:tasmop;
|
||||||
s:topsize;
|
s:topsize;
|
||||||
@ -1298,7 +1308,7 @@ procedure tcgSPARC.floatload(list:TAasmOutput;t:tcgsize;CONST ref:TReference);
|
|||||||
list.concat(Taicpu.Op_ref(op,ref));
|
list.concat(Taicpu.Op_ref(op,ref));
|
||||||
{ inc(trgcpu(rg).fpuvaroffset);}
|
{ inc(trgcpu(rg).fpuvaroffset);}
|
||||||
END;
|
END;
|
||||||
procedure tcgSPARC.floatstoreops(t:tcgsize;var op:tasmop;var s:topsize);
|
procedure TCgSparc.floatstoreops(t:tcgsize;var op:tasmop;var s:topsize);
|
||||||
BEGIN
|
BEGIN
|
||||||
{ case t of
|
{ case t of
|
||||||
OS_F32:begin
|
OS_F32:begin
|
||||||
@ -1321,7 +1331,7 @@ procedure tcgSPARC.floatstoreops(t:tcgsize;var op:tasmop;var s:topsize);
|
|||||||
internalerror(17);
|
internalerror(17);
|
||||||
end;}
|
end;}
|
||||||
end;
|
end;
|
||||||
procedure tcgSPARC.floatstore(list:TAasmOutput;t:tcgsize;CONST ref:TReference);
|
procedure TCgSparc.floatstore(list:TAasmOutput;t:tcgsize;CONST ref:TReference);
|
||||||
VAR
|
VAR
|
||||||
op:tasmop;
|
op:tasmop;
|
||||||
s:topsize;
|
s:topsize;
|
||||||
@ -1331,11 +1341,14 @@ procedure tcgSPARC.floatstore(list:TAasmOutput;t:tcgsize;CONST ref:TReference);
|
|||||||
{ dec(trgcpu(rg).fpuvaroffset);}
|
{ dec(trgcpu(rg).fpuvaroffset);}
|
||||||
END;
|
END;
|
||||||
BEGIN
|
BEGIN
|
||||||
cg:=tcgSPARC.create;
|
cg:=TCgSparc.create;
|
||||||
END.
|
END.
|
||||||
{
|
{
|
||||||
$Log$
|
$Log$
|
||||||
Revision 1.30 2003-01-05 13:36:53 florian
|
Revision 1.31 2003-01-05 21:32:35 mazen
|
||||||
|
* fixing several bugs compiling the RTL
|
||||||
|
|
||||||
|
Revision 1.30 2003/01/05 13:36:53 florian
|
||||||
* x86-64 compiles
|
* x86-64 compiles
|
||||||
+ very basic support for float128 type (x86-64 only)
|
+ very basic support for float128 type (x86-64 only)
|
||||||
|
|
||||||
|
@ -17,7 +17,7 @@
|
|||||||
You should have received a copy of the GNU General Public License
|
You should have received a copy of the GNU General Public License
|
||||||
along with this program; if not, write to the Free Software
|
along with this program; if not, write to the Free Software
|
||||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
****************************************************************************}
|
*****************************************************************************}
|
||||||
unit cpupara;
|
unit cpupara;
|
||||||
{SPARC specific calling conventions are handled by this unit}
|
{SPARC specific calling conventions are handled by this unit}
|
||||||
{$INCLUDE fpcdefs.inc}
|
{$INCLUDE fpcdefs.inc}
|
||||||
@ -119,7 +119,7 @@ push_addr_param for the def is true}
|
|||||||
internalerror(2002071001);
|
internalerror(2002071001);
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
procedure TSparcParaManager.create_param_loc_info(p:tabstractprocdef);
|
procedure TSparcParaManager.create_param_loc_info(p:TAbstractProcDef);
|
||||||
var
|
var
|
||||||
nextintreg,nextfloatreg:tregister;
|
nextintreg,nextfloatreg:tregister;
|
||||||
stack_offset:aword;
|
stack_offset:aword;
|
||||||
@ -184,7 +184,6 @@ procedure TSparcParaManager.create_param_loc_info(p:tabstractprocdef);
|
|||||||
else
|
else
|
||||||
begin
|
begin
|
||||||
{!!!!!!!}
|
{!!!!!!!}
|
||||||
WriteLn('NextIntReg=',std_reg2str[NextIntReg]);
|
|
||||||
hp.paraloc.size:=def_cgsize(hp.paratype.def);
|
hp.paraloc.size:=def_cgsize(hp.paratype.def);
|
||||||
internalerror(2002071006);
|
internalerror(2002071006);
|
||||||
end;
|
end;
|
||||||
@ -282,7 +281,10 @@ begin
|
|||||||
end.
|
end.
|
||||||
{
|
{
|
||||||
$Log$
|
$Log$
|
||||||
Revision 1.12 2002-11-25 19:21:49 mazen
|
Revision 1.13 2003-01-05 21:32:35 mazen
|
||||||
|
* fixing several bugs compiling the RTL
|
||||||
|
|
||||||
|
Revision 1.12 2002/11/25 19:21:49 mazen
|
||||||
* fixed support of nSparcInline
|
* fixed support of nSparcInline
|
||||||
|
|
||||||
Revision 1.11 2002/11/25 17:43:28 peter
|
Revision 1.11 2002/11/25 17:43:28 peter
|
||||||
|
@ -60,10 +60,9 @@ constructor TSparcprocinfo.create;
|
|||||||
procedure TSparcprocinfo.after_header;
|
procedure TSparcprocinfo.after_header;
|
||||||
begin
|
begin
|
||||||
{First 16 words are in the frame are used to save registers in case of a
|
{First 16 words are in the frame are used to save registers in case of a
|
||||||
register overflow/underflow}
|
register overflow/underflow.The 17th word is used to save the address of
|
||||||
{The 17th word is used to save the address of the variable which will
|
the variable which will receive the return value of the called function}
|
||||||
receive the return value of the called function}
|
Return_Offset:=16*4;
|
||||||
Return_Offset:=64;{16*4}
|
|
||||||
procdef.parast.address_fixup:=(16+1)*4;
|
procdef.parast.address_fixup:=(16+1)*4;
|
||||||
end;
|
end;
|
||||||
procedure TSparcProcInfo.after_pass1;
|
procedure TSparcProcInfo.after_pass1;
|
||||||
@ -81,8 +80,8 @@ procedure TSparcProcInfo.after_pass1;
|
|||||||
firsttemp_offset:=localst.address_fixup+localst.datasize;
|
firsttemp_offset:=localst.address_fixup+localst.datasize;
|
||||||
with tg do
|
with tg do
|
||||||
begin
|
begin
|
||||||
FirstTemp:=firsttemp_offset;
|
SetFirstTemp(firsttemp_offset);
|
||||||
LastTemp:=firsttemp_offset;
|
//LastTemp:=firsttemp_offset;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
@ -91,7 +90,10 @@ begin
|
|||||||
end.
|
end.
|
||||||
{
|
{
|
||||||
$Log$
|
$Log$
|
||||||
Revision 1.10 2002-12-24 21:30:20 mazen
|
Revision 1.11 2003-01-05 21:32:35 mazen
|
||||||
|
* fixing several bugs compiling the RTL
|
||||||
|
|
||||||
|
Revision 1.10 2002/12/24 21:30:20 mazen
|
||||||
- some writeln(s) removed in compiler
|
- some writeln(s) removed in compiler
|
||||||
+ many files added to RTL
|
+ many files added to RTL
|
||||||
* some errors fixed in RTL
|
* some errors fixed in RTL
|
||||||
|
@ -61,7 +61,7 @@ function tSparcInlineNode.first_sqr_real : tnode;
|
|||||||
location.loc:=LOC_FPUREGISTER;
|
location.loc:=LOC_FPUREGISTER;
|
||||||
registers32:=left.registers32;
|
registers32:=left.registers32;
|
||||||
registersfpu:=max(left.registersfpu,1);
|
registersfpu:=max(left.registersfpu,1);
|
||||||
first_sqr_real := nil;
|
first_sqr_real:=nil;
|
||||||
end;
|
end;
|
||||||
function tSparcInlineNode.first_sqrt_real : tnode;
|
function tSparcInlineNode.first_sqrt_real : tnode;
|
||||||
begin
|
begin
|
||||||
@ -120,7 +120,10 @@ begin
|
|||||||
end.
|
end.
|
||||||
{
|
{
|
||||||
$Log$
|
$Log$
|
||||||
Revision 1.2 2002-12-30 21:17:22 mazen
|
Revision 1.3 2003-01-05 21:32:35 mazen
|
||||||
|
* fixing several bugs compiling the RTL
|
||||||
|
|
||||||
|
Revision 1.2 2002/12/30 21:17:22 mazen
|
||||||
- unit cga no more used in sparc compiler.
|
- unit cga no more used in sparc compiler.
|
||||||
|
|
||||||
Revision 1.1 2002/11/30 20:03:49 mazen
|
Revision 1.1 2002/11/30 20:03:49 mazen
|
||||||
|
@ -215,7 +215,7 @@ Function fpc_Catches(Objtype : TClass) : TObject; compilerproc;
|
|||||||
Procedure fpc_DestroyException(o : TObject); compilerproc;
|
Procedure fpc_DestroyException(o : TObject); compilerproc;
|
||||||
procedure fpc_help_constructor; compilerproc;
|
procedure fpc_help_constructor; compilerproc;
|
||||||
procedure fpc_help_fail; compilerproc;
|
procedure fpc_help_fail; compilerproc;
|
||||||
procedure fpc_help_destructor; compilerproc;
|
procedure fpc_help_destructor(var _self : pointer; vmt : pointer; vmt_pos : cardinal);saveregisters;compilerproc;
|
||||||
procedure fpc_new_class; compilerproc;
|
procedure fpc_new_class; compilerproc;
|
||||||
procedure fpc_dispose_class; compilerproc;
|
procedure fpc_dispose_class; compilerproc;
|
||||||
procedure fpc_help_fail_class; compilerproc;
|
procedure fpc_help_fail_class; compilerproc;
|
||||||
@ -283,7 +283,10 @@ function fpc_qword_to_double(q: qword): double; compilerproc;
|
|||||||
|
|
||||||
{
|
{
|
||||||
$Log$
|
$Log$
|
||||||
Revision 1.30 2002-12-29 16:59:17 peter
|
Revision 1.31 2003-01-05 21:32:35 mazen
|
||||||
|
* fixing several bugs compiling the RTL
|
||||||
|
|
||||||
|
Revision 1.30 2002/12/29 16:59:17 peter
|
||||||
* implemented some more conversions
|
* implemented some more conversions
|
||||||
|
|
||||||
Revision 1.29 2002/11/26 23:02:07 peter
|
Revision 1.29 2002/11/26 23:02:07 peter
|
||||||
|
@ -27,7 +27,7 @@ procedure Move(const source;var dest;count:longint);
|
|||||||
type
|
type
|
||||||
bytearray = array [0..maxlongint-1] of byte;
|
bytearray = array [0..maxlongint-1] of byte;
|
||||||
var
|
var
|
||||||
i,size : longint;
|
i:longint;
|
||||||
begin
|
begin
|
||||||
if count <= 0 then exit;
|
if count <= 0 then exit;
|
||||||
Dec(count);
|
Dec(count);
|
||||||
@ -170,7 +170,7 @@ function CompareByte(Const buf1,buf2;len:longint):longint;
|
|||||||
type
|
type
|
||||||
bytearray = array [0..maxlongint-1] of byte;
|
bytearray = array [0..maxlongint-1] of byte;
|
||||||
var
|
var
|
||||||
I,J : longint;
|
I : longint;
|
||||||
begin
|
begin
|
||||||
I:=0;
|
I:=0;
|
||||||
if (Len<>0) and (@Buf1<>@Buf2) then
|
if (Len<>0) and (@Buf1<>@Buf2) then
|
||||||
@ -199,7 +199,7 @@ function CompareWord(Const buf1,buf2;len:longint):longint;
|
|||||||
type
|
type
|
||||||
wordarray = array [0..maxlongint div 2] of word;
|
wordarray = array [0..maxlongint div 2] of word;
|
||||||
var
|
var
|
||||||
I,J : longint;
|
I : longint;
|
||||||
begin
|
begin
|
||||||
I:=0;
|
I:=0;
|
||||||
if (Len<>0) and (@Buf1<>@Buf2) then
|
if (Len<>0) and (@Buf1<>@Buf2) then
|
||||||
@ -228,7 +228,7 @@ function CompareDWord(Const buf1,buf2;len:longint):longint;
|
|||||||
type
|
type
|
||||||
longintarray = array [0..maxlongint div 4] of longint;
|
longintarray = array [0..maxlongint div 4] of longint;
|
||||||
var
|
var
|
||||||
I,J : longint;
|
I : longint;
|
||||||
begin
|
begin
|
||||||
I:=0;
|
I:=0;
|
||||||
if (Len<>0) and (@Buf1<>@Buf2) then
|
if (Len<>0) and (@Buf1<>@Buf2) then
|
||||||
@ -328,36 +328,38 @@ end;
|
|||||||
FPC_HELP_CONSTRUCTOR : generic allways means aa little less efficient (PM) }
|
FPC_HELP_CONSTRUCTOR : generic allways means aa little less efficient (PM) }
|
||||||
{ I don't think we really need to save any registers here }
|
{ I don't think we really need to save any registers here }
|
||||||
{ since this is called at the start of the constructor (CEC) }
|
{ since this is called at the start of the constructor (CEC) }
|
||||||
function fpc_help_constructor(var _self : pointer; var vmt : pointer; vmt_pos : cardinal) : pointer; [public,alias:'FPC_HELP_CONSTRUCTOR']; {$ifdef hascompilerproc} compilerproc; {$endif}
|
procedure fpc_help_constructor;[public,alias:'FPC_HELP_CONSTRUCTOR'];{$ifdef hascompilerproc}compilerproc;{$endif}
|
||||||
type
|
type
|
||||||
ppointer = ^pointer;
|
ppointer = ^pointer;
|
||||||
pvmt = ^tvmt;
|
pvmt = ^tvmt;
|
||||||
tvmt = packed record
|
tvmt=packed record
|
||||||
size,msize : longint;
|
size,msize:longint;
|
||||||
parent : pointer;
|
parent:pointer;
|
||||||
end;
|
end;
|
||||||
var
|
var
|
||||||
objectsize : longint;
|
objectsize:longint;
|
||||||
vmtcopy : pointer;
|
vmtcopy:pointer;
|
||||||
|
_self:pointer;
|
||||||
|
vmt:pointer;
|
||||||
|
vmt_pos:cardinal;
|
||||||
begin
|
begin
|
||||||
if vmt=nil then
|
if vmt=nil
|
||||||
begin
|
then
|
||||||
fpc_help_constructor:=_self;
|
exit;
|
||||||
exit;
|
vmtcopy:=vmt;
|
||||||
end;
|
objectsize:=pvmt(vmtcopy)^.size;
|
||||||
vmtcopy:=vmt;
|
if _self=nil
|
||||||
objectsize:=pvmt(vmtcopy)^.size;
|
then
|
||||||
if _self=nil then
|
begin
|
||||||
begin
|
getmem(_self,objectsize);
|
||||||
getmem(_self,objectsize);
|
longint(vmt):=-1; { needed for fail }
|
||||||
longint(vmt):=-1; { needed for fail }
|
end;
|
||||||
end;
|
if _self<>nil
|
||||||
if _self<>nil then
|
then
|
||||||
begin
|
begin
|
||||||
fillchar(_self^,objectsize,#0);
|
fillchar(_self^,objectsize,#0);
|
||||||
ppointer(_self+vmt_pos)^:=vmtcopy;
|
ppointer(_self+vmt_pos)^:=vmtcopy;
|
||||||
end;
|
end;
|
||||||
fpc_help_constructor:=_self;
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{$endif FPC_SYSTEM_HAS_FPC_HELP_CONSTRUCTOR}
|
{$endif FPC_SYSTEM_HAS_FPC_HELP_CONSTRUCTOR}
|
||||||
@ -948,7 +950,10 @@ end;
|
|||||||
|
|
||||||
{
|
{
|
||||||
$Log$
|
$Log$
|
||||||
Revision 1.44 2002-12-23 21:27:13 peter
|
Revision 1.45 2003-01-05 21:32:35 mazen
|
||||||
|
* fixing several bugs compiling the RTL
|
||||||
|
|
||||||
|
Revision 1.44 2002/12/23 21:27:13 peter
|
||||||
* fix wrong var names for shortstr_compare
|
* fix wrong var names for shortstr_compare
|
||||||
|
|
||||||
Revision 1.43 2002/10/20 11:51:54 carl
|
Revision 1.43 2002/10/20 11:51:54 carl
|
||||||
|
@ -18,18 +18,6 @@
|
|||||||
{$UNDEF SYSCALL_DEBUG}
|
{$UNDEF SYSCALL_DEBUG}
|
||||||
{$ENDIF SYS_LINUX}
|
{$ENDIF SYS_LINUX}
|
||||||
|
|
||||||
|
|
||||||
Type
|
|
||||||
|
|
||||||
TSysResult = Longint; // all platforms, cint=32-bit.
|
|
||||||
// On platforms with off_t =64-bit, people should
|
|
||||||
// use int64, and typecast all other calls to cint.
|
|
||||||
|
|
||||||
// I don't think this is going to work on several platforms 64-bit machines
|
|
||||||
// don't have only 64-bit params.
|
|
||||||
|
|
||||||
TSysParam = Longint;
|
|
||||||
|
|
||||||
{*****************************************************************************
|
{*****************************************************************************
|
||||||
--- Main:The System Call Self ---
|
--- Main:The System Call Self ---
|
||||||
*****************************************************************************}
|
*****************************************************************************}
|
||||||
@ -227,7 +215,10 @@ end;
|
|||||||
|
|
||||||
{
|
{
|
||||||
$Log$
|
$Log$
|
||||||
Revision 1.2 2002-12-24 21:30:20 mazen
|
Revision 1.3 2003-01-05 21:32:35 mazen
|
||||||
|
* fixing several bugs compiling the RTL
|
||||||
|
|
||||||
|
Revision 1.2 2002/12/24 21:30:20 mazen
|
||||||
- some writeln(s) removed in compiler
|
- some writeln(s) removed in compiler
|
||||||
+ many files added to RTL
|
+ many files added to RTL
|
||||||
* some errors fixed in RTL
|
* some errors fixed in RTL
|
||||||
|
@ -34,19 +34,22 @@ Type
|
|||||||
|
|
||||||
TSysParam = Longint;
|
TSysParam = Longint;
|
||||||
|
|
||||||
function Do_SysCall(sysnr:TSysParam):TSysResult; external name 'FPC_SYSCALL0';
|
{function Do_SysCall(sysnr:TSysParam):TSysResult; external name 'FPC_SYSCALL0';
|
||||||
function Do_SysCall(sysnr,param1:TSysParam):TSysResult; external name 'FPC_SYSCALL1';
|
function Do_SysCall(sysnr,param1:TSysParam):TSysResult; external name 'FPC_SYSCALL1';
|
||||||
function Do_SysCall(sysnr,param1,param2:TSysParam):TSysResult; external name 'FPC_SYSCALL2';
|
function Do_SysCall(sysnr,param1,param2:TSysParam):TSysResult; external name 'FPC_SYSCALL2';
|
||||||
function Do_SysCall(sysnr,param1,param2,param3:TSysParam):TSysResult; external name 'FPC_SYSCALL3';
|
function Do_SysCall(sysnr,param1,param2,param3:TSysParam):TSysResult; external name 'FPC_SYSCALL3';
|
||||||
function Do_SysCall(sysnr,param1,param2,param3,param4:TSysParam):TSysResult; external name 'FPC_SYSCALL4';
|
function Do_SysCall(sysnr,param1,param2,param3,param4:TSysParam):TSysResult; external name 'FPC_SYSCALL4';
|
||||||
function Do_SysCall(sysnr,param1,param2,param3,param4,param5:TSysParam):TSysResult; external name 'FPC_SYSCALL5';
|
function Do_SysCall(sysnr,param1,param2,param3,param4,param5:TSysParam):TSysResult; external name 'FPC_SYSCALL5';}
|
||||||
{$ifdef notsupported}
|
{$ifdef notsupported}
|
||||||
function Do_SysCall(sysnr,param1,param2,param3,param4,param5,param6:TSysParam):TSysResult; external name 'FPC_SYSCALL5';
|
function Do_SysCall(sysnr,param1,param2,param3,param4,param5,param6:TSysParam):TSysResult; external name 'FPC_SYSCALL5';
|
||||||
{$endif notsupported}
|
{$endif notsupported}
|
||||||
|
|
||||||
{
|
{
|
||||||
$Log$
|
$Log$
|
||||||
Revision 1.1 2002-12-24 21:30:20 mazen
|
Revision 1.2 2003-01-05 21:32:35 mazen
|
||||||
|
* fixing several bugs compiling the RTL
|
||||||
|
|
||||||
|
Revision 1.1 2002/12/24 21:30:20 mazen
|
||||||
- some writeln(s) removed in compiler
|
- some writeln(s) removed in compiler
|
||||||
+ many files added to RTL
|
+ many files added to RTL
|
||||||
* some errors fixed in RTL
|
* some errors fixed in RTL
|
||||||
|
@ -14,21 +14,95 @@
|
|||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
|
||||||
**********************************************************************}
|
**********************************************************************}
|
||||||
|
{#define ENV(base,reg) [%base + (reg * 4)]
|
||||||
|
#define ST_FLUSH_WINDOWS 3
|
||||||
|
#define RW_FP [%fp + 0x48]
|
||||||
|
}
|
||||||
|
procedure longjmp(var S:jmp_buf;value:longint);{assembler;}[Public,alias:'FPC_LONGJMP'];
|
||||||
|
begin{asm
|
||||||
|
/* Store our arguments in global registers so we can still
|
||||||
|
use them while unwinding frames and their register windows. */
|
||||||
|
|
||||||
{ the necessary code can be copied from the linux kernel sources }
|
ld ENV(o0,JB_FP), %g3 /* Cache target FP in register %g3. */
|
||||||
function setjmp(var S : jmp_buf) : longint;{assembler;}[Public, alias : 'FPC_SETJMP'];
|
mov %o0, %g1 /* ENV in %g1 */
|
||||||
begin{asm}
|
orcc %o1, %g0, %g2 /* VAL in %g2 */
|
||||||
{$warning FIXME!!!!}
|
be,a 0f /* Branch if zero; else skip delay slot. */
|
||||||
|
mov 1, %g2 /* Delay slot only hit if zero: VAL = 1. */
|
||||||
|
0:
|
||||||
|
xor %fp, %g3, %o0
|
||||||
|
add %fp, 512, %o1
|
||||||
|
andncc %o0, 4095, %o0
|
||||||
|
bne LOC(thread)
|
||||||
|
cmp %o1, %g3
|
||||||
|
bl LOC(thread)
|
||||||
|
|
||||||
|
/* Now we will loop, unwinding the register windows up the stack
|
||||||
|
until the restored %fp value matches the target value in %g3. */
|
||||||
|
|
||||||
|
LOC(loop):
|
||||||
|
cmp %fp, %g3 /* Have we reached the target frame? */
|
||||||
|
bl,a LOC(loop) /* Loop while current fp is below target. */
|
||||||
|
restore /* Unwind register window in delay slot. */
|
||||||
|
be,a LOC(found) /* Better have hit it exactly. */
|
||||||
|
ld ENV(g1,JB_SP), %o0 /* Delay slot: extract target SP. */
|
||||||
|
|
||||||
|
LOC(thread):
|
||||||
|
/*
|
||||||
|
* Do a "flush register windows trap". The trap handler in the
|
||||||
|
* kernel writes all the register windows to their stack slots, and
|
||||||
|
* marks them all as invalid (needing to be sucked up from the
|
||||||
|
* stack when used). This ensures that all information needed to
|
||||||
|
* unwind to these callers is in memory, not in the register
|
||||||
|
* windows.
|
||||||
|
*/
|
||||||
|
ta ST_FLUSH_WINDOWS
|
||||||
|
ld ENV(g1,JB_PC), %o7 /* Set return PC. */
|
||||||
|
ld ENV(g1,JB_SP), %fp /* Set saved SP on restore below. */
|
||||||
|
sub %fp, 64, %sp /* Allocate a register frame. */
|
||||||
|
st %g3, RW_FP /* Set saved FP on restore below. */
|
||||||
|
retl
|
||||||
|
restore %g2, 0, %o0 /* Restore values from above register frame. */
|
||||||
|
|
||||||
|
LOC(found):
|
||||||
|
/* We have unwound register windows so %fp matches the target. */
|
||||||
|
mov %o0, %sp /* OK, install new SP. */
|
||||||
|
|
||||||
|
LOC(sp_ok):
|
||||||
|
ld ENV(g1,JB_PC), %o0 /* Extract target return PC. */
|
||||||
|
jmp %o0 + 8 /* Return there. */
|
||||||
|
mov %g2, %o0 /* Delay slot: set return value. */
|
||||||
|
}
|
||||||
|
end;
|
||||||
|
function setjmp(var S:jmp_buf):longint;{assembler;}[Public,alias:'FPC_SETJMP'];
|
||||||
|
begin{asm
|
||||||
|
b 1f
|
||||||
|
set 0, %o1}
|
||||||
end;
|
end;
|
||||||
|
{ENTRY (__sigsetjmp)
|
||||||
|
1:
|
||||||
|
/* Save our PC, SP and FP. Save the signal mask if requested with
|
||||||
|
a tail-call for simplicity; it always returns zero. */
|
||||||
|
ta ST_FLUSH_WINDOWS
|
||||||
|
|
||||||
procedure longjmp(var S : jmp_buf;value : longint);{assembler;}[Public, alias : 'FPC_LONGJMP'];
|
st %o7, [%o0 + (JB_PC * 4)]
|
||||||
begin{asm}
|
st %sp, [%o0 + (JB_SP * 4)]
|
||||||
{$warning FIXME!!!!}
|
st %fp, [%o0 + (JB_FP * 4)]
|
||||||
end;
|
|
||||||
|
|
||||||
|
mov %o7, %g1
|
||||||
|
call __sigjmp_save
|
||||||
|
mov %g1, %o7
|
||||||
|
END(__sigsetjmp)
|
||||||
|
/* Test if longjmp to JMPBUF would unwind the frame
|
||||||
|
containing a local variable at ADDRESS. */
|
||||||
|
#define _JMPBUF_UNWINDS(jmpbuf, address) \
|
||||||
|
((int) (address) < (jmpbuf)[JB_SP])
|
||||||
|
}
|
||||||
{
|
{
|
||||||
$Log$
|
$Log$
|
||||||
Revision 1.3 2002-12-24 21:30:20 mazen
|
Revision 1.4 2003-01-05 21:32:35 mazen
|
||||||
|
* fixing several bugs compiling the RTL
|
||||||
|
|
||||||
|
Revision 1.3 2002/12/24 21:30:20 mazen
|
||||||
- some writeln(s) removed in compiler
|
- some writeln(s) removed in compiler
|
||||||
+ many files added to RTL
|
+ many files added to RTL
|
||||||
* some errors fixed in RTL
|
* some errors fixed in RTL
|
||||||
|
@ -9,23 +9,51 @@
|
|||||||
See the file COPYING.FPC, included in this distribution,
|
See the file COPYING.FPC, included in this distribution,
|
||||||
for details about the copyright.
|
for details about the copyright.
|
||||||
|
|
||||||
|
This file was adapted from
|
||||||
|
Guardian:/usr/local/src/glibc-2.2.3/sysdeps/sparc/sparc32# more setjmp.S
|
||||||
|
Guardian:/usr/local/src/glibc-2.2.3/sysdeps/sparc/sparc32# more __longjmp.S
|
||||||
|
Copyright (C) 1991, 93, 94, 96, 97, 98 Free Software Foundation, Inc.
|
||||||
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Library General Public License as
|
||||||
|
published by the Free Software Foundation; either version 2 of the
|
||||||
|
License, or (at your option) any later version.
|
||||||
|
|
||||||
|
The GNU C Library is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
Library General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Library General Public
|
||||||
|
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||||
|
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
|
Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
This program is distributed in the hope that it will be useful,
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
|
||||||
******************************************************************************}
|
******************************************************************************}
|
||||||
|
{@Define the machine-dependent type `jmp_buf'. SPARC version.}
|
||||||
type
|
type
|
||||||
jmp_buf = packed record
|
jmp_buf=packed record
|
||||||
ProgramCounter,
|
{stack pointer}
|
||||||
StackPointer,
|
JB_SP,
|
||||||
BasePointer:Pointer;
|
{frame pointer}
|
||||||
|
JB_FP,
|
||||||
|
{program counter}
|
||||||
|
JB_PV:Pointer;
|
||||||
end;
|
end;
|
||||||
Pjmp_buf = ^jmp_buf;
|
Pjmp_buf=^jmp_buf;
|
||||||
function setjmp(var S:jmp_buf):longint;
|
function setjmp(var S:jmp_buf):longint;
|
||||||
procedure longjmp(var S:jmp_buf;value:longint);
|
procedure longjmp(var S:jmp_buf;value:longint);
|
||||||
{
|
{
|
||||||
$Log$
|
$Log$
|
||||||
Revision 1.3 2003-01-01 18:24:41 mazen
|
Revision 1.4 2003-01-05 21:32:35 mazen
|
||||||
|
* fixing several bugs compiling the RTL
|
||||||
|
|
||||||
|
Revision 1.3 2003/01/01 18:24:41 mazen
|
||||||
* just put register pointers
|
* just put register pointers
|
||||||
|
|
||||||
Revision 1.2 2002/11/24 18:19:44 mazen
|
Revision 1.2 2002/11/24 18:19:44 mazen
|
||||||
|
Loading…
Reference in New Issue
Block a user