diff --git a/compiler/sparc/cgcpu.pas b/compiler/sparc/cgcpu.pas index 74dbbbd374..78a7050651 100644 --- a/compiler/sparc/cgcpu.pas +++ b/compiler/sparc/cgcpu.pas @@ -40,10 +40,9 @@ TYPE {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 specific processor ABI. It is overriden for each CPU target. - Size : is the size of the operand in the register - r : is the register source of the operand - nr : is number of that parameter in the routine parameters list starting - from one from left to right} + Size : is the size of the operand in the register + r : is the register source of the operand + LocPara : is the location where the parameter will be stored} procedure a_param_reg(list:TAasmOutput;size:tcgsize;r:tregister;const LocPara:TParaLocation);override; procedure a_param_const(list:TAasmOutput;size:tcgsize;a:aword;CONST LocPara:TParaLocation);override; procedure a_param_ref(list:TAasmOutput;size:tcgsize;CONST r:TReference;CONST LocPara:TParaLocation);override; @@ -117,8 +116,16 @@ procedure tcgSPARC.a_param_reg(list:TAasmOutput;size:tcgsize;r:tregister;CONST L IF(Size<>OS_32)AND(Size<>OS_S32) THEN InternalError(2002032212); - List.Concat(taicpu.op_reg(A_LD,S_L,r)); - END; + with list,LocPara do + case Loc of + LOC_REGISTER: + if r<>Register + then + Concat(taicpu.op_Reg_Reg_Reg(A_OR,S_L,r,R_G0,Register)); + else + InternalError(2002101002); + end; + end; procedure tcgSPARC.a_param_const(list:TAasmOutput;size:tcgsize;a:aword;CONST LocPara:TParaLocation); BEGIN IF(Size<>OS_32)AND(Size<>OS_S32) @@ -131,36 +138,37 @@ procedure tcgSPARC.a_param_ref(list:TAasmOutput;size:tcgsize;const r:TReference; ref: treference; tmpreg:TRegister; begin - case locpara.loc of - LOC_REGISTER,LOC_CREGISTER: - a_load_ref_reg(list,size,r,locpara.register); - LOC_REFERENCE: - begin + with LocPara do + case locpara.loc of + LOC_REGISTER,LOC_CREGISTER: + a_load_ref_reg(list,size,r,Register); + LOC_REFERENCE: + begin {Code conventions need the parameters being allocated in %o6+92. See comment on g_stack_frame} - if locpara.sp_fixup<92 - then - InternalError(2002081104); - reference_reset(ref); - ref.base:=locpara.reference.index; - ref.offset:=locpara.reference.offset; - tmpreg := get_scratch_reg_int(list); - a_load_ref_reg(list,size,r,tmpreg); - a_load_reg_ref(list,size,tmpreg,ref); - free_scratch_reg(list,tmpreg); - end; - LOC_FPUREGISTER,LOC_CFPUREGISTER: - case size of - OS_32: - a_loadfpu_ref_reg(list,OS_F32,r,locpara.register); - OS_64: - a_loadfpu_ref_reg(list,OS_F64,r,locpara.register); - else - internalerror(2002072801); - end; - else - internalerror(2002081103); - end; + if locpara.sp_fixup<92 + then + InternalError(2002081104); + reference_reset(ref); + ref.base:=locpara.reference.index; + ref.offset:=locpara.reference.offset; + tmpreg := get_scratch_reg_int(list); + a_load_ref_reg(list,size,r,tmpreg); + a_load_reg_ref(list,size,tmpreg,ref); + free_scratch_reg(list,tmpreg); + end; + LOC_FPUREGISTER,LOC_CFPUREGISTER: + case size of + OS_32: + a_loadfpu_ref_reg(list,OS_F32,r,locpara.register); + OS_64: + a_loadfpu_ref_reg(list,OS_F64,r,locpara.register); + else + internalerror(2002072801); + end; + else + internalerror(2002081103); + end; end; procedure tcgSPARC.a_paramaddr_ref(list:TAasmOutput;CONST r:TReference;CONST LocPara:TParaLocation); VAR @@ -1256,7 +1264,10 @@ BEGIN END. { $Log$ - Revision 1.13 2002-10-10 15:10:39 mazen + Revision 1.14 2002-10-10 19:57:51 mazen + * Just to update repsitory + + Revision 1.13 2002/10/10 15:10:39 mazen * Internal error fixed, but usually i386 parameter model used Revision 1.12 2002/10/08 17:17:03 mazen diff --git a/compiler/sparc/cpubase.pas b/compiler/sparc/cpubase.pas index 1ffc1628c1..2a48b6d489 100644 --- a/compiler/sparc/cpubase.pas +++ b/compiler/sparc/cpubase.pas @@ -1,12 +1,5 @@ -{*****************************************************************************} -{ File : cpubase.pas } -{ Author : Mazen NEIFER } -{ Project : Free Pascal Compiler (FPC) } -{ Creation date : 2002\04\26 } -{ Licence : GPL } -{ Bug report : mazen.neifer.01@supaero.org } -{*****************************************************************************} -{ $Id$ +{****************************************************************************** + $Id$ Copyright (c) 1998-2000 by Florian Klaempfl and Peter Vreman Contains the base types for the Scalable Processor ARChitecture (SPARC) @@ -401,7 +394,6 @@ used, because contains a lot of unnessary fields.} CONST general_registers = [R_L0..R_L7]; - { legEND: } { xxxregs = set of all possibly used registers of that type in the code } { generator } @@ -410,19 +402,16 @@ CONST { excludes registers which can be only used for parameter } { passing on ABI's that define this) } { c_countusableregsxxx = amount of registers in the usableregsxxx set } - - intregs = [R_G0..R_I7]; - usableregsint = general_registers; + IntRegs=[R_L0..R_O7]; + usableregsint=general_registers; c_countusableregsint = 4; - - fpuregs = [R_F0..R_F31]; - usableregsfpu = []; - c_countusableregsfpu = 0; - - mmregs = [R_G0..R_G7]; - usableregsmm = [R_G0..R_G7]; - c_countusableregsmm = 8; - + fpuregs=[R_F0..R_F31]; + usableregsfpu=[]; + c_countusableregsfpu=0; + mmregs=[]; + usableregsmm=[]; + c_countusableregsmm=8; + firstsaveintreg = R_G0; lastsaveintreg = R_I7; firstsavefpureg = R_F0; @@ -468,9 +457,10 @@ function othewise it contains a pointer to the returned result} {There is no accumulator in the SPARC architecture. There are just families of registers. All registers belonging to the same family are identical except in the "global registers" family where GO is different from the others : G0 gives -always 0 when it is red and thows away any value written to it} - accumulator = R_L0; - accumulatorhigh = R_L7; +always 0 when it is red and thows away any value written to it.Nevertheless, +scalar routine results are returned onto R_O0.} + accumulator = R_O0; + accumulatorhigh = R_O1; fpu_result_reg =R_F0; mmresultreg =R_G0; {*****************************************************************************} @@ -581,7 +571,10 @@ FUNCTION flags_to_cond(CONST f:TResFlags):TAsmCond; END. { $Log$ - Revision 1.10 2002-10-02 22:20:28 mazen + Revision 1.11 2002-10-10 19:57:51 mazen + * Just to update repsitory + + Revision 1.10 2002/10/02 22:20:28 mazen + out registers allocator for the first 6 scalar parameters which must be passed into %o0..%o5 Revision 1.9 2002/10/01 21:06:29 mazen diff --git a/compiler/sparc/cpupara.pas b/compiler/sparc/cpupara.pas index 81a994add5..5c9fe2d12c 100644 --- a/compiler/sparc/cpupara.pas +++ b/compiler/sparc/cpupara.pas @@ -42,22 +42,20 @@ function TSparcParaManager.GetIntParaLoc(nr:longint):TParaLocation; if nr<1 then InternalError(2002100806); - FillChar(Result,SizeOf(TParaLocation),0); + FillChar(GetIntParaLoc,SizeOf(TParaLocation),0); Dec(nr); - with Result do + with GetIntParaLoc do if nr<6 then{The six first parameters are passed into registers} begin loc:=LOC_REGISTER; - register:=TRegister(LongInt(R_O0)+nr); - WriteLn('-------------------------------------------'); + register:=TRegister(LongInt(R_i0)+nr); end else{The other parameters are passed into the frame} begin loc:=LOC_REFERENCE; reference.index:=frame_pointer_reg; - reference.offset:=-92-(nr-6)*4; - WriteLn('+++++++++++++++++++++++++++++++++++++++++++'); + reference.offset:=-68-nr*4; end; end; function GetParaLoc(p:TDef):TLoc; @@ -124,7 +122,7 @@ procedure TSparcParaManager.create_param_loc_info(p:tabstractprocdef); loc : tloc; is_64bit: boolean; begin - nextintreg:=R_O0; + nextintreg:=R_i0; nextfloatreg:=R_F0; stack_offset:=92; WriteLn('***********************************************'); @@ -140,7 +138,7 @@ WriteLn('***********************************************'); then hp.paraloc.size:=OS_ADDR; is_64bit:=hp.paraloc.size in [OS_64,OS_S64]; - if NextIntReg<=TRegister(ord(R_O5)-ord(is_64bit)) + if NextIntReg<=TRegister(ord(R_i5)-ord(is_64bit)) then begin WriteLn('Allocating ',std_reg2str[NextIntReg]); @@ -156,7 +154,7 @@ WriteLn('***********************************************'); end else begin - nextintreg:=R_O6; + nextintreg:=R_i6; hp.paraloc.loc:=LOC_REFERENCE; hp.paraloc.reference.index:=stack_pointer_reg; hp.paraloc.reference.offset:=stack_offset; @@ -239,11 +237,11 @@ function tSparcParaManager.GetFuncRetParaLoc(p:TAbstractProcDef):TParaLocation; begin WriteLn('Allocating i0 as return register'); GetFuncRetParaLoc.loc:=LOC_REGISTER; - GetFuncRetParaLoc.register:=R_i0; + GetFuncRetParaLoc.register:=R_I0; GetFuncRetParaLoc.size:=def_cgsize(p.rettype.def); if GetFuncRetParaLoc.size in [OS_S64,OS_64] then - GetFuncRetParaLoc.RegisterHigh:=R_O1; + GetFuncRetParaLoc.RegisterHigh:=R_I1; end; floatdef: begin @@ -251,8 +249,6 @@ function tSparcParaManager.GetFuncRetParaLoc(p:TAbstractProcDef):TParaLocation; GetFuncRetParaLoc.register:=R_F1; GetFuncRetParaLoc.size:=def_cgsize(p.rettype.def); end; - { smallsets are OS_INT in R3, others are OS_ADDR in R3 -> the same } - { ugly, I know :) (JM) } setdef, variantdef, pointerdef, @@ -267,7 +263,7 @@ function tSparcParaManager.GetFuncRetParaLoc(p:TAbstractProcDef):TParaLocation; errordef: begin GetFuncRetParaLoc.loc:=LOC_REGISTER; - GetFuncRetParaLoc.register:=R_O0; + GetFuncRetParaLoc.register:=R_I0; GetFuncRetParaLoc.size:=OS_ADDR; end; else @@ -279,7 +275,10 @@ begin end. { $Log$ - Revision 1.6 2002-10-10 15:10:39 mazen + Revision 1.7 2002-10-10 19:57:51 mazen + * Just to update repsitory + + Revision 1.6 2002/10/10 15:10:39 mazen * Internal error fixed, but usually i386 parameter model used Revision 1.5 2002/10/09 13:52:19 mazen diff --git a/compiler/sparc/ncpucall.pas b/compiler/sparc/ncpucall.pas index 4aa3a73e1c..7d8148ffad 100644 --- a/compiler/sparc/ncpucall.pas +++ b/compiler/sparc/ncpucall.pas @@ -1,20 +1,11 @@ -{*****************************************************************************} -{ File : ncpucall.pas } -{ Author : Mazen NEIFER } -{ Project : Free Pascal Compiler (FPC) } -{ Creation date : 2002\26\26 } -{ Last modification date : 2002\07\01 } -{ Licence : GPL } -{ Bug report : mazen.neifer.01@supaero.org } -{*****************************************************************************} -{ +{****************************************************************************** $Id$ Copyright (c) 1998-2002 by Florian Klaempfl Generate SPARC assembler for in call nodes This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published bymethodpointer + it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. @@ -34,60 +25,60 @@ interface uses symdef,node,ncal,ncgcal; type - TSparccallnode = class(tcgcallnode) - function pass_1 : tnode;override; + TSparcCallNode=class(TCgCallNode) + function pass_1:TNode;override; {Under SPARC, the frame pointer is automatically set by the SAVE instruction -which is part of the stardrad calling mechanism. This function will do nothing -else than adding the function prologue, which is in some case loading the -correct value into the frame pointer register!} +which is part of the stardrad calling mechanism. This function will do nothing. +the frame pointer register is the stack pointer register of the caller, and is +set when generating function prologue in cgcpu.tcgSPARC.g_stackframe_entry} procedure load_framepointer;override; end; - implementation - - uses - globtype,systems, - cutils,verbose,globals, - symconst,symbase,symsym,symtable,defbase,paramgr, +uses + globtype,systems, + cutils,verbose,globals, + symconst,symbase,symsym,symtable,defbase,paramgr, {$ifdef GDB} {$ifdef delphi} - sysutils, + sysutils, {$else} - strings, + strings, {$endif} - gdb, + gdb, {$endif GDB} - cginfo,cgbase,pass_2, - cpuinfo,cpubase,aasmbase,aasmtai,aasmcpu, - nmem,nld,ncnv, - ncgutil,cgobj,tgobj,regvars,rgobj,rgcpu,cg64f32,cgcpu,cpupi; - - function TSparccallnode.pass_1 : tnode; - - begin - result:=inherited pass_1; - if assigned(result) then - exit; - if procdefinition is tprocdef then - begin - if tprocdef(procdefinition).parast.datasize>TSparcprocinfo(procinfo).maxpushedparasize then - TSparcprocinfo(procinfo).maxpushedparasize:=tprocdef(procdefinition).parast.datasize - end - else - begin - {!!!!} - end; - end; + cginfo,cgbase,pass_2, + cpuinfo,cpubase,aasmbase,aasmtai,aasmcpu, + nmem,nld,ncnv, + ncgutil,cgobj,tgobj,regvars,rgobj,rgcpu,cg64f32,cgcpu,cpupi; +function TSparcCallNode.pass_1:TNode; + begin + result:=inherited pass_1; + if assigned(result) + then + exit; + if ProcDefinition is TProcDef + then + begin + if TProcDef(procdefinition).parast.datasize>TSparcProcInfo(procinfo).maxpushedparasize + then + TSparcProcInfo(procinfo).maxpushedparasize:=TProcdef(procdefinition).parast.datasize + end + else + InternalError(2002101001); + end; procedure TSparcCallNode.load_framepointer; - begin - exprasmList.concat(TAiCpu.Op_reg_const_reg(A_SAVE,S_L,stack_pointer_reg,-tprocdef(procdefinition).parast.datasize,stack_pointer_reg)); + begin + InternalError(2002101000); end; begin - ccallnode:=TSparccallnode; + ccallnode:=TSparcCallNode; end. { $Log$ - Revision 1.3 2002-09-30 19:12:14 mazen + Revision 1.4 2002-10-10 19:57:52 mazen + * Just to update repsitory + + Revision 1.3 2002/09/30 19:12:14 mazen * function prologue fixed Revision 1.2 2002/08/30 13:16:23 mazen diff --git a/compiler/sparc/ncpucnv.pas b/compiler/sparc/ncpucnv.pas index 507bf4b986..f19aca72ea 100644 --- a/compiler/sparc/ncpucnv.pas +++ b/compiler/sparc/ncpucnv.pas @@ -375,7 +375,8 @@ implementation @second_class_to_intf, @second_char_to_char, @second_nothing, { normal_2_smallset } - @second_nothing { dynarray_2_openarray } + @second_nothing, { dynarray_2_openarray } + @second_nothing ); type tprocedureofobject = procedure of object; @@ -421,7 +422,10 @@ begin end. { $Log$ - Revision 1.3 2002-09-07 15:25:14 peter + Revision 1.4 2002-10-10 19:57:52 mazen + * Just to update repsitory + + Revision 1.3 2002/09/07 15:25:14 peter * old logs removed and tabs fixed Revision 1.2 2002/08/30 06:15:27 mazen