* maxoperands -> max_operands (for portability in rautils.pas)

* fix some range-check errors with loadconst
  + add ncgadd unit to m68k
  * some bugfix of a_param_reg with LOC_CREFERENCE
This commit is contained in:
carl 2002-12-14 15:02:03 +00:00
parent 9972293cee
commit 3214bab118
12 changed files with 103 additions and 503 deletions

View File

@ -582,7 +582,7 @@ unit cgobj;
case locpara.loc of case locpara.loc of
LOC_REGISTER,LOC_CREGISTER: LOC_REGISTER,LOC_CREGISTER:
a_load_reg_reg(list,size,locpara.size,r,locpara.register); a_load_reg_reg(list,size,locpara.size,r,locpara.register);
LOC_REFERENCE: LOC_REFERENCE,LOC_CREFERENCE:
begin begin
if locpara.sp_fixup<>0 then if locpara.sp_fixup<>0 then
a_op_const_reg(list,OP_ADD,locpara.sp_fixup,stack_pointer_reg); a_op_const_reg(list,OP_ADD,locpara.sp_fixup,stack_pointer_reg);
@ -1625,7 +1625,13 @@ finalization
end. end.
{ {
$Log$ $Log$
Revision 1.66 2002-11-25 17:43:16 peter Revision 1.67 2002-12-14 15:02:03 carl
* maxoperands -> max_operands (for portability in rautils.pas)
* fix some range-check errors with loadconst
+ add ncgadd unit to m68k
* some bugfix of a_param_reg with LOC_CREFERENCE
Revision 1.66 2002/11/25 17:43:16 peter
* splitted defbase in defutil,symutil,defcmp * splitted defbase in defutil,symutil,defcmp
* merged isconvertable and is_equal into compare_defs(_ext) * merged isconvertable and is_equal into compare_defs(_ext)
* made operator search faster by walking the list only once * made operator search faster by walking the list only once

View File

@ -1682,7 +1682,7 @@ Begin
case actasmtoken of case actasmtoken of
AS_COMMA: { Operand delimiter } AS_COMMA: { Operand delimiter }
Begin Begin
if operandnum > MaxOperands then if operandnum > Max_Operands then
Message(asmr_e_too_many_operands) Message(asmr_e_too_many_operands)
else else
Inc(operandnum); Inc(operandnum);
@ -2122,7 +2122,13 @@ finalization
end. end.
{ {
$Log$ $Log$
Revision 1.34 2002-12-01 22:08:34 carl Revision 1.35 2002-12-14 15:02:03 carl
* maxoperands -> max_operands (for portability in rautils.pas)
* fix some range-check errors with loadconst
+ add ncgadd unit to m68k
* some bugfix of a_param_reg with LOC_CREFERENCE
Revision 1.34 2002/12/01 22:08:34 carl
* some small cleanup (remove some specific operators which are not supported) * some small cleanup (remove some specific operators which are not supported)
Revision 1.33 2002/11/30 23:16:39 carl Revision 1.33 2002/11/30 23:16:39 carl

View File

@ -1684,7 +1684,7 @@ Begin
{ Operand delimiter } { Operand delimiter }
AS_COMMA : AS_COMMA :
Begin Begin
if operandnum > MaxOperands then if operandnum > Max_Operands then
Message(asmr_e_too_many_operands) Message(asmr_e_too_many_operands)
else else
Inc(operandnum); Inc(operandnum);
@ -1956,7 +1956,13 @@ finalization
end. end.
{ {
$Log$ $Log$
Revision 1.37 2002-12-01 22:08:34 carl Revision 1.38 2002-12-14 15:02:03 carl
* maxoperands -> max_operands (for portability in rautils.pas)
* fix some range-check errors with loadconst
+ add ncgadd unit to m68k
* some bugfix of a_param_reg with LOC_CREFERENCE
Revision 1.37 2002/12/01 22:08:34 carl
* some small cleanup (remove some specific operators which are not supported) * some small cleanup (remove some specific operators which are not supported)
Revision 1.36 2002/11/15 01:58:59 peter Revision 1.36 2002/11/15 01:58:59 peter

View File

@ -29,7 +29,7 @@ interface
uses uses
cclasses,aasmtai, cclasses,aasmtai,
aasmbase,globals,verbose, aasmbase,globals,verbose,
cpubase; cpubase,cpuinfo;
type type
@ -142,7 +142,7 @@ implementation
inherited create(op);; inherited create(op);;
init(_size); init(_size);
ops:=1; ops:=1;
loadconst(0,_op1); loadconst(0,aword(_op1));
end; end;
@ -171,7 +171,7 @@ implementation
init(_size); init(_size);
ops:=2; ops:=2;
loadreg(0,_op1); loadreg(0,_op1);
loadconst(1,_op2); loadconst(1,aword(_op2));
end; end;
@ -190,7 +190,7 @@ implementation
inherited create(op);; inherited create(op);;
init(_size); init(_size);
ops:=2; ops:=2;
loadconst(0,_op1); loadconst(0,aword(_op1));
loadreg(1,_op2); loadreg(1,_op2);
end; end;
@ -200,8 +200,8 @@ implementation
inherited create(op);; inherited create(op);;
init(_size); init(_size);
ops:=2; ops:=2;
loadconst(0,_op1); loadconst(0,aword(_op1));
loadconst(1,_op2); loadconst(1,aword(_op2));
end; end;
@ -210,7 +210,7 @@ implementation
inherited create(op);; inherited create(op);;
init(_size); init(_size);
ops:=2; ops:=2;
loadconst(0,_op1); loadconst(0,aword(_op1));
loadref(1,_op2); loadref(1,_op2);
end; end;
@ -250,7 +250,7 @@ implementation
inherited create(op);; inherited create(op);;
init(_size); init(_size);
ops:=3; ops:=3;
loadconst(0,_op1); loadconst(0,aword(_op1));
loadreg(1,_op2); loadreg(1,_op2);
loadreg(2,_op3); loadreg(2,_op3);
end; end;
@ -271,7 +271,7 @@ implementation
inherited create(op);; inherited create(op);;
init(_size); init(_size);
ops:=3; ops:=3;
loadconst(0,_op1); loadconst(0,aword(_op1));
loadref(1,_op2); loadref(1,_op2);
loadreg(2,_op3); loadreg(2,_op3);
end; end;
@ -282,7 +282,7 @@ implementation
inherited create(op);; inherited create(op);;
init(_size); init(_size);
ops:=3; ops:=3;
loadconst(0,_op1); loadconst(0,aword(_op1));
loadreg(1,_op2); loadreg(1,_op2);
loadref(2,_op3); loadref(2,_op3);
end; end;
@ -409,7 +409,13 @@ implementation
end. end.
{ {
$Log$ $Log$
Revision 1.6 2002-11-30 23:33:02 carl Revision 1.7 2002-12-14 15:02:03 carl
* maxoperands -> max_operands (for portability in rautils.pas)
* fix some range-check errors with loadconst
+ add ncgadd unit to m68k
* some bugfix of a_param_reg with LOC_CREFERENCE
Revision 1.6 2002/11/30 23:33:02 carl
* merges from Pierre's fixes in m68k fixes branch * merges from Pierre's fixes in m68k fixes branch
Revision 1.5 2002/09/07 15:25:11 peter Revision 1.5 2002/09/07 15:25:11 peter

View File

@ -19,7 +19,7 @@ Interface
Type Type
{ Architecture word - Native unsigned type } { Architecture word - Native unsigned type }
AWord = longword; aword = longword;
PAWord = ^AWord; PAWord = ^AWord;
{ this must be an ordinal type with the same size as a pointer } { this must be an ordinal type with the same size as a pointer }
@ -67,7 +67,13 @@ Implementation
end. end.
{ {
$Log$ $Log$
Revision 1.5 2002-09-07 20:53:28 carl Revision 1.6 2002-12-14 15:02:03 carl
* maxoperands -> max_operands (for portability in rautils.pas)
* fix some range-check errors with loadconst
+ add ncgadd unit to m68k
* some bugfix of a_param_reg with LOC_CREFERENCE
Revision 1.5 2002/09/07 20:53:28 carl
* cardinal -> longword * cardinal -> longword
Revision 1.4 2002/09/07 15:25:13 peter Revision 1.4 2002/09/07 15:25:13 peter

View File

@ -30,7 +30,7 @@ unit cpunode;
uses uses
{ generic nodes } { generic nodes }
ncgbas,ncgld,ncgflw,ncgcnv,ncgmem,ncgcon,ncgcal,ncgset,ncginl,ncgmat ncgbas,ncgld,ncgflw,ncgcnv,ncgmem,ncgcon,ncgcal,ncgset,ncginl,ncgmat,ncgadd
{ to be able to only parts of the generic code, { to be able to only parts of the generic code,
the processor specific nodes must be included the processor specific nodes must be included
after the generic one (FK) after the generic one (FK)
@ -52,7 +52,13 @@ unit cpunode;
end. end.
{ {
$Log$ $Log$
Revision 1.2 2002-08-14 19:16:34 carl Revision 1.3 2002-12-14 15:02:03 carl
* maxoperands -> max_operands (for portability in rautils.pas)
* fix some range-check errors with loadconst
+ add ncgadd unit to m68k
* some bugfix of a_param_reg with LOC_CREFERENCE
Revision 1.2 2002/08/14 19:16:34 carl
+ m68k type conversion nodes + m68k type conversion nodes
+ started some mathematical nodes + started some mathematical nodes
* out of bound references should now be handled correctly * out of bound references should now be handled correctly

View File

@ -51,6 +51,7 @@ unit cpupara;
function tm68kparamanager.getintparaloc(nr : longint) : tparalocation; function tm68kparamanager.getintparaloc(nr : longint) : tparalocation;
begin begin
fillchar(result,sizeof(tparalocation),0);
end; end;
procedure tm68kparamanager.create_param_loc_info(p : tabstractprocdef); procedure tm68kparamanager.create_param_loc_info(p : tabstractprocdef);
@ -74,7 +75,13 @@ end.
{ {
$Log$ $Log$
Revision 1.1 2002-08-12 15:08:44 carl Revision 1.2 2002-12-14 15:02:03 carl
* maxoperands -> max_operands (for portability in rautils.pas)
* fix some range-check errors with loadconst
+ add ncgadd unit to m68k
* some bugfix of a_param_reg with LOC_CREFERENCE
Revision 1.1 2002/08/12 15:08:44 carl
+ stab register indexes for powerpc (moved from gdb to cpubase) + stab register indexes for powerpc (moved from gdb to cpubase)
+ tprocessor enumeration moved to cpuinfo + tprocessor enumeration moved to cpuinfo
+ linker in target_info is now a class + linker in target_info is now a class

View File

@ -1702,7 +1702,7 @@ type
var var
i : longint; i : longint;
begin begin
for i:=1to max_operands do for i:=1 to max_operands do
Operands[i]:=TM68kOperand.Create; Operands[i]:=TM68kOperand.Create;
end; end;
@ -1752,7 +1752,7 @@ type
case actasmtoken of case actasmtoken of
{ // Operand delimiter // } { // Operand delimiter // }
AS_COMMA: Begin AS_COMMA: Begin
if operandnum > MaxOperands then if operandnum > Max_Operands then
Message(asmr_e_too_many_operands) Message(asmr_e_too_many_operands)
else else
Inc(operandnum); Inc(operandnum);
@ -2197,7 +2197,13 @@ Begin
end. end.
{ {
$Log$ $Log$
Revision 1.9 2002-11-30 23:33:03 carl Revision 1.10 2002-12-14 15:02:03 carl
* maxoperands -> max_operands (for portability in rautils.pas)
* fix some range-check errors with loadconst
+ add ncgadd unit to m68k
* some bugfix of a_param_reg with LOC_CREFERENCE
Revision 1.9 2002/11/30 23:33:03 carl
* merges from Pierre's fixes in m68k fixes branch * merges from Pierre's fixes in m68k fixes branch
Revision 1.8 2002/09/07 15:25:13 peter Revision 1.8 2002/09/07 15:25:13 peter

View File

@ -68,8 +68,7 @@ interface
aasmbase,aasmtai,aasmcpu,defutil,htypechk, aasmbase,aasmtai,aasmcpu,defutil,htypechk,
cgbase,cpuinfo,pass_1,pass_2,regvars, cgbase,cpuinfo,pass_1,pass_2,regvars,
cpupara, cpupara,
ncon,nset, ncon,nset,ncgutil,tgobj,rgobj,rgcpu,cgobj,cg64f32;
cga,ncgutil,tgobj,rgobj,rgcpu,cgobj,cg64f32;
@ -1053,7 +1052,13 @@ interface
end. end.
{ {
$Log$ $Log$
Revision 1.2 2002-12-08 15:02:17 carl Revision 1.3 2002-12-14 15:02:03 carl
* maxoperands -> max_operands (for portability in rautils.pas)
* fix some range-check errors with loadconst
+ add ncgadd unit to m68k
* some bugfix of a_param_reg with LOC_CREFERENCE
Revision 1.2 2002/12/08 15:02:17 carl
+ more fixes + more fixes
Revision 1.1 2002/12/07 19:51:35 carl Revision 1.1 2002/12/07 19:51:35 carl

View File

@ -31,13 +31,6 @@ uses
aasmbase,globals,verbose, aasmbase,globals,verbose,
cpubase,cpuinfo; cpubase,cpuinfo;
const
{ "mov reg,reg" source operand number }
O_MOV_SOURCE = 1;
{ "mov reg,reg" source operand number }
O_MOV_DEST = 0;
type type
taicpu = class(taicpu_abstract) taicpu = class(taicpu_abstract)
constructor op_none(op : tasmop); constructor op_none(op : tasmop);
@ -63,7 +56,6 @@ uses
constructor op_reg_bool_reg_reg(op : tasmop;_op1: tregister;_op2:boolean;_op3,_op4:tregister); constructor op_reg_bool_reg_reg(op : tasmop;_op1: tregister;_op2:boolean;_op3,_op4:tregister);
constructor op_reg_bool_reg_const(op : tasmop;_op1: tregister;_op2:boolean;_op3:tregister;_op4: longint); constructor op_reg_bool_reg_const(op : tasmop;_op1: tregister;_op2:boolean;_op3:tregister;_op4: longint);
constructor op_reg_reg_reg_const_const(op : tasmop;_op1,_op2,_op3 : tregister;_op4,_op5 : Longint);
constructor op_reg_reg_const_const_const(op : tasmop;_op1,_op2 : tregister;_op3,_op4,_op5 : Longint); constructor op_reg_reg_const_const_const(op : tasmop;_op1,_op2 : tregister;_op3,_op4,_op5 : Longint);
@ -78,18 +70,6 @@ uses
constructor op_sym_ofs_ref(op : tasmop;_op1 : tasmsymbol;_op1ofs:longint;const _op2 : treference); constructor op_sym_ofs_ref(op : tasmop;_op1 : tasmsymbol;_op1ofs:longint;const _op2 : treference);
procedure loadbool(opidx:longint;_b:boolean); procedure loadbool(opidx:longint;_b:boolean);
function is_nop: boolean; override;
function is_move:boolean; override;
function spill_registers(list:Taasmoutput;
rgget:Trggetproc;
rgunget:Trgungetproc;
r:Tsupregset;
var unusedregsint:Tsupregset;
const spilltemplist:Tspill_temp_list):boolean; override;
end; end;
tai_align = class(tai_align_abstract) tai_align = class(tai_align_abstract)
@ -102,8 +82,6 @@ uses
implementation implementation
uses cutils,rgobj;
{***************************************************************************** {*****************************************************************************
taicpu Constructors taicpu Constructors
*****************************************************************************} *****************************************************************************}
@ -131,8 +109,6 @@ uses cutils,rgobj;
constructor taicpu.op_reg(op : tasmop;_op1 : tregister); constructor taicpu.op_reg(op : tasmop;_op1 : tregister);
begin begin
inherited create(op); inherited create(op);
if (_op1.enum = R_INTREGISTER) and (_op1.number = NR_NO) then
internalerror(2003031207);
ops:=1; ops:=1;
loadreg(0,_op1); loadreg(0,_op1);
end; end;
@ -149,10 +125,6 @@ uses cutils,rgobj;
constructor taicpu.op_reg_reg(op : tasmop;_op1,_op2 : tregister); constructor taicpu.op_reg_reg(op : tasmop;_op1,_op2 : tregister);
begin begin
inherited create(op); inherited create(op);
if (_op1.enum = R_INTREGISTER) and (_op1.number = NR_NO) then
internalerror(2003031205);
if (_op2.enum = R_INTREGISTER) and (_op2.number = NR_NO) then
internalerror(2003031206);
ops:=2; ops:=2;
loadreg(0,_op1); loadreg(0,_op1);
loadreg(1,_op2); loadreg(1,_op2);
@ -161,8 +133,6 @@ uses cutils,rgobj;
constructor taicpu.op_reg_const(op:tasmop; _op1: tregister; _op2: longint); constructor taicpu.op_reg_const(op:tasmop; _op1: tregister; _op2: longint);
begin begin
inherited create(op); inherited create(op);
if (_op1.enum = R_INTREGISTER) and (_op1.number = NR_NO) then
internalerror(2003031208);
ops:=2; ops:=2;
loadreg(0,_op1); loadreg(0,_op1);
loadconst(1,aword(_op2)); loadconst(1,aword(_op2));
@ -171,8 +141,6 @@ uses cutils,rgobj;
constructor taicpu.op_const_reg(op:tasmop; _op1: longint; _op2: tregister); constructor taicpu.op_const_reg(op:tasmop; _op1: longint; _op2: tregister);
begin begin
inherited create(op); inherited create(op);
if (_op2.enum = R_INTREGISTER) and (_op2.number = NR_NO) then
internalerror(2003031209);
ops:=2; ops:=2;
loadconst(0,aword(_op1)); loadconst(0,aword(_op1));
loadreg(1,_op2); loadreg(1,_op2);
@ -182,8 +150,6 @@ uses cutils,rgobj;
constructor taicpu.op_reg_ref(op : tasmop;_op1 : tregister;const _op2 : treference); constructor taicpu.op_reg_ref(op : tasmop;_op1 : tregister;const _op2 : treference);
begin begin
inherited create(op); inherited create(op);
if (_op1.enum = R_INTREGISTER) and (_op1.number = NR_NO) then
internalerror(2003031210);
ops:=2; ops:=2;
loadreg(0,_op1); loadreg(0,_op1);
loadref(1,_op2); loadref(1,_op2);
@ -202,12 +168,6 @@ uses cutils,rgobj;
constructor taicpu.op_reg_reg_reg(op : tasmop;_op1,_op2,_op3 : tregister); constructor taicpu.op_reg_reg_reg(op : tasmop;_op1,_op2,_op3 : tregister);
begin begin
inherited create(op); inherited create(op);
if (_op1.enum = R_INTREGISTER) and (_op1.number = NR_NO) then
internalerror(2003031211);
if (_op2.enum = R_INTREGISTER) and (_op2.number = NR_NO) then
internalerror(2003031212);
if (_op3.enum = R_INTREGISTER) and (_op3.number = NR_NO) then
internalerror(2003031213);
ops:=3; ops:=3;
loadreg(0,_op1); loadreg(0,_op1);
loadreg(1,_op2); loadreg(1,_op2);
@ -217,10 +177,6 @@ uses cutils,rgobj;
constructor taicpu.op_reg_reg_const(op : tasmop;_op1,_op2 : tregister; _op3: Longint); constructor taicpu.op_reg_reg_const(op : tasmop;_op1,_op2 : tregister; _op3: Longint);
begin begin
inherited create(op); inherited create(op);
if (_op1.enum = R_INTREGISTER) and (_op1.number = NR_NO) then
internalerror(2003031214);
if (_op2.enum = R_INTREGISTER) and (_op2.number = NR_NO) then
internalerror(2003031215);
ops:=3; ops:=3;
loadreg(0,_op1); loadreg(0,_op1);
loadreg(1,_op2); loadreg(1,_op2);
@ -230,10 +186,6 @@ uses cutils,rgobj;
constructor taicpu.op_reg_reg_sym_ofs(op : tasmop;_op1,_op2 : tregister; _op3: tasmsymbol;_op3ofs: longint); constructor taicpu.op_reg_reg_sym_ofs(op : tasmop;_op1,_op2 : tregister; _op3: tasmsymbol;_op3ofs: longint);
begin begin
inherited create(op); inherited create(op);
if (_op1.enum = R_INTREGISTER) and (_op1.number = NR_NO) then
internalerror(2003031216);
if (_op2.enum = R_INTREGISTER) and (_op2.number = NR_NO) then
internalerror(2003031217);
ops:=3; ops:=3;
loadreg(0,_op1); loadreg(0,_op1);
loadreg(1,_op2); loadreg(1,_op2);
@ -243,10 +195,6 @@ uses cutils,rgobj;
constructor taicpu.op_reg_reg_ref(op : tasmop;_op1,_op2 : tregister; const _op3: treference); constructor taicpu.op_reg_reg_ref(op : tasmop;_op1,_op2 : tregister; const _op3: treference);
begin begin
inherited create(op); inherited create(op);
if (_op1.enum = R_INTREGISTER) and (_op1.number = NR_NO) then
internalerror(2003031218);
if (_op2.enum = R_INTREGISTER) and (_op2.number = NR_NO) then
internalerror(2003031219);
ops:=3; ops:=3;
loadreg(0,_op1); loadreg(0,_op1);
loadreg(1,_op2); loadreg(1,_op2);
@ -256,10 +204,6 @@ uses cutils,rgobj;
constructor taicpu.op_const_reg_reg(op : tasmop;_op1 : longint;_op2, _op3 : tregister); constructor taicpu.op_const_reg_reg(op : tasmop;_op1 : longint;_op2, _op3 : tregister);
begin begin
inherited create(op); inherited create(op);
if (_op2.enum = R_INTREGISTER) and (_op2.number = NR_NO) then
internalerror(2003031221);
if (_op3.enum = R_INTREGISTER) and (_op3.number = NR_NO) then
internalerror(2003031220);
ops:=3; ops:=3;
loadconst(0,aword(_op1)); loadconst(0,aword(_op1));
loadreg(1,_op2); loadreg(1,_op2);
@ -269,8 +213,6 @@ uses cutils,rgobj;
constructor taicpu.op_const_reg_const(op : tasmop;_op1 : longint;_op2 : tregister;_op3 : longint); constructor taicpu.op_const_reg_const(op : tasmop;_op1 : longint;_op2 : tregister;_op3 : longint);
begin begin
inherited create(op); inherited create(op);
if (_op2.enum = R_INTREGISTER) and (_op2.number = NR_NO) then
internalerror(2003031222);
ops:=3; ops:=3;
loadconst(0,aword(_op1)); loadconst(0,aword(_op1));
loadreg(1,_op2); loadreg(1,_op2);
@ -281,14 +223,6 @@ uses cutils,rgobj;
constructor taicpu.op_reg_reg_reg_reg(op : tasmop;_op1,_op2,_op3,_op4 : tregister); constructor taicpu.op_reg_reg_reg_reg(op : tasmop;_op1,_op2,_op3,_op4 : tregister);
begin begin
inherited create(op); inherited create(op);
if (_op1.enum = R_INTREGISTER) and (_op1.number = NR_NO) then
internalerror(2003031223);
if (_op2.enum = R_INTREGISTER) and (_op2.number = NR_NO) then
internalerror(2003031224);
if (_op3.enum = R_INTREGISTER) and (_op3.number = NR_NO) then
internalerror(2003031225);
if (_op4.enum = R_INTREGISTER) and (_op4.number = NR_NO) then
internalerror(2003031226);
ops:=4; ops:=4;
loadreg(0,_op1); loadreg(0,_op1);
loadreg(1,_op2); loadreg(1,_op2);
@ -299,12 +233,6 @@ uses cutils,rgobj;
constructor taicpu.op_reg_bool_reg_reg(op : tasmop;_op1: tregister;_op2:boolean;_op3,_op4:tregister); constructor taicpu.op_reg_bool_reg_reg(op : tasmop;_op1: tregister;_op2:boolean;_op3,_op4:tregister);
begin begin
inherited create(op); inherited create(op);
if (_op1.enum = R_INTREGISTER) and (_op1.number = NR_NO) then
internalerror(2003031227);
if (_op3.enum = R_INTREGISTER) and (_op3.number = NR_NO) then
internalerror(2003031228);
if (_op4.enum = R_INTREGISTER) and (_op4.number = NR_NO) then
internalerror(2003031229);
ops:=4; ops:=4;
loadreg(0,_op1); loadreg(0,_op1);
loadbool(1,_op2); loadbool(1,_op2);
@ -315,10 +243,6 @@ uses cutils,rgobj;
constructor taicpu.op_reg_bool_reg_const(op : tasmop;_op1: tregister;_op2:boolean;_op3:tregister;_op4: longint); constructor taicpu.op_reg_bool_reg_const(op : tasmop;_op1: tregister;_op2:boolean;_op3:tregister;_op4: longint);
begin begin
inherited create(op); inherited create(op);
if (_op1.enum = R_INTREGISTER) and (_op1.number = NR_NO) then
internalerror(2003031230);
if (_op3.enum = R_INTREGISTER) and (_op3.number = NR_NO) then
internalerror(2003031231);
ops:=4; ops:=4;
loadreg(0,_op1); loadreg(0,_op1);
loadbool(0,_op2); loadbool(0,_op2);
@ -326,31 +250,9 @@ uses cutils,rgobj;
loadconst(0,cardinal(_op4)); loadconst(0,cardinal(_op4));
end; end;
constructor taicpu.op_reg_reg_reg_const_const(op : tasmop;_op1,_op2,_op3 : tregister;_op4,_op5 : Longint);
begin
inherited create(op);
if (_op1.enum = R_INTREGISTER) and (_op1.number = NR_NO) then
internalerror(2003031232);
if (_op2.enum = R_INTREGISTER) and (_op2.number = NR_NO) then
internalerror(2003031233);
if (_op3.enum = R_INTREGISTER) and (_op3.number = NR_NO) then
internalerror(2003031233);
ops:=5;
loadreg(0,_op1);
loadreg(1,_op2);
loadreg(2,_op3);
loadconst(3,cardinal(_op4));
loadconst(4,cardinal(_op5));
end;
constructor taicpu.op_reg_reg_const_const_const(op : tasmop;_op1,_op2 : tregister;_op3,_op4,_op5 : Longint); constructor taicpu.op_reg_reg_const_const_const(op : tasmop;_op1,_op2 : tregister;_op3,_op4,_op5 : Longint);
begin begin
inherited create(op); inherited create(op);
if (_op1.enum = R_INTREGISTER) and (_op1.number = NR_NO) then
internalerror(2003031232);
if (_op2.enum = R_INTREGISTER) and (_op2.number = NR_NO) then
internalerror(2003031233);
ops:=5; ops:=5;
loadreg(0,_op1); loadreg(0,_op1);
loadreg(1,_op2); loadreg(1,_op2);
@ -411,349 +313,6 @@ uses cutils,rgobj;
end; end;
{ ****************************** newra stuff *************************** }
function taicpu.is_nop: boolean;
begin
{ we don't insert any more nops than necessary }
is_nop :=
((opcode=A_MR) and (oper[0].typ=top_reg) and (oper[1].typ=top_reg) and (oper[0].reg.number=oper[1].reg.number));
end;
function taicpu.is_move:boolean;
begin
is_move := opcode = A_MR;
end;
function taicpu.spill_registers(list:Taasmoutput;
rgget:Trggetproc;
rgunget:Trgungetproc;
r:Tsupregset;
var unusedregsint:Tsupregset;
const spilltemplist:Tspill_temp_list): boolean;
function get_insert_pos(p:Tai;huntfor1,huntfor2,huntfor3:Tsuperregister):Tai;
var back:Tsupregset;
begin
back:=unusedregsint;
get_insert_pos:=p;
while (p<>nil) and (p.typ=ait_regalloc) do
begin
{Rewind the register allocation.}
if Tai_regalloc(p).allocation then
include(unusedregsint,Tai_regalloc(p).reg.number shr 8)
else
begin
exclude(unusedregsint,Tai_regalloc(p).reg.number shr 8);
if Tai_regalloc(p).reg.number shr 8=huntfor1 then
begin
get_insert_pos:=Tai(p.previous);
back:=unusedregsint;
end;
if Tai_regalloc(p).reg.number shr 8=huntfor2 then
begin
get_insert_pos:=Tai(p.previous);
back:=unusedregsint;
end;
if Tai_regalloc(p).reg.number shr 8=huntfor3 then
begin
get_insert_pos:=Tai(p.previous);
back:=unusedregsint;
end;
end;
p:=Tai(p.previous);
end;
unusedregsint:=back;
end;
procedure forward_allocation(p:Tai);
begin
{Forward the register allocation again.}
while (p<>self) do
begin
if p.typ<>ait_regalloc then
internalerror(200305311);
if Tai_regalloc(p).allocation then
exclude(unusedregsint,Tai_regalloc(p).reg.number shr 8)
else
include(unusedregsint,Tai_regalloc(p).reg.number shr 8);
p:=Tai(p.next);
end;
end;
function decode_loadstore(op: tasmop; var counterpart: tasmop; wasload: boolean): boolean;
begin
result := true;
wasload := true;
case op of
A_LBZ:
begin
counterpart := A_STB;
end;
A_LBZX:
begin
counterpart := A_STBX;
end;
A_LHZ,A_LHA:
begin
counterpart := A_STH;
end;
A_LHZX,A_LHAX:
begin
counterpart := A_STHX;
end;
A_LWZ:
begin
counterpart := A_STW;
end;
A_LWZX:
begin
counterpart := A_STWX;
end;
A_STB:
begin
counterpart := A_LBZ;
wasload := false;
end;
A_STBX:
begin
counterpart := A_LBZX;
wasload := false;
end;
A_STH:
begin
counterpart := A_LHZ;
wasload := false;
end;
A_STHX:
begin
counterpart := A_LHZX;
wasload := false;
end;
A_STW:
begin
counterpart := A_LWZ;
wasload := false;
end;
A_STWX:
begin
counterpart := A_LWZX;
wasload := false;
end;
A_LBZU,A_LBZUX,A_LHZU,A_LHZUX,A_LHAU,A_LHAUX,
A_LWZU,A_LWZUX,A_STBU,A_STBUX,A_STHU,A_STHUX,
A_STWU,A_STWUX:
internalerror(2003070602);
else
result := false;
end;
end;
var i:byte;
supreg, reg1, reg2, reg3: Tsuperregister;
helpreg:Tregister;
helpins:Taicpu;
op:Tasmop;
pos:Tai;
wasload: boolean;
begin
spill_registers:=false;
if (ops = 2) and
(oper[1].typ=top_ref) and
{ oper[1] can also be ref in case of "lis r3,symbol@ha" or so }
decode_loadstore(opcode,op,wasload) then
begin
{ the register that's being stored/loaded }
supreg:=oper[0].reg.number shr 8;
if supreg in r then
begin
// Example:
// l?? r20d, 8(r1) ; r20d must be spilled into -60(r1)
//
// Change into:
//
// l?? r21d, 8(r1)
// st? r21d, -60(r1)
//
// And:
//
// st? r20d, 8(r1) ; r20d must be spilled into -60(r1)
//
// Change into:
//
// l?? r21d, -60(r1)
// st? r21d, 8(r1)
pos := get_insert_pos(Tai(previous),oper[0].reg.number shr 8,
oper[1].ref^.base.number shr 8,oper[1].ref^.index.number shr 8);
rgget(list,pos,0,helpreg);
spill_registers := true;
if wasload then
begin
helpins := taicpu.op_reg_ref(opcode,helpreg,oper[1].ref^);
loadref(1,spilltemplist[supreg]);
opcode := op;
end
else
helpins := taicpu.op_reg_ref(op,helpreg,spilltemplist[supreg]);
if pos=nil then
list.insertafter(helpins,list.first)
else
list.insertafter(helpins,pos.next);
loadreg(0,helpreg);
rgunget(list,helpins,helpreg);
forward_allocation(tai(helpins.next));
{
writeln('spilling!');
list.insertafter(tai_comment.Create(strpnew('Spilling!')),helpins);
}
end;
{ now the registers used in the reference }
{ a) base }
supreg := oper[1].ref^.base.number shr 8;
if supreg in r then
begin
if wasload then
pos:=get_insert_pos(Tai(previous),oper[1].ref^.index.number shr 8,oper[0].reg.number shr 8,0)
else
pos:=get_insert_pos(Tai(previous),oper[1].ref^.index.number shr 8,0,0);
rgget(list,pos,0,helpreg);
spill_registers:=true;
helpins:=Taicpu.op_reg_ref(A_LWZ,helpreg,spilltemplist[supreg]);
if pos=nil then
list.insertafter(helpins,list.first)
else
list.insertafter(helpins,pos.next);
oper[1].ref^.base:=helpreg;
rgunget(list,helpins,helpreg);
forward_allocation(Tai(helpins.next));
{
writeln('spilling!');
list.insertafter(tai_comment.Create(strpnew('Spilling!')),helpins);
}
end;
{ b) index }
supreg := oper[1].ref^.index.number shr 8;
if supreg in r then
begin
if wasload then
pos:=get_insert_pos(Tai(previous),oper[1].ref^.base.number shr 8,oper[0].reg.number shr 8,0)
else
pos:=get_insert_pos(Tai(previous),oper[1].ref^.base.number shr 8,0,0);
rgget(list,pos,0,helpreg);
spill_registers:=true;
helpins:=Taicpu.op_reg_ref(A_LWZ,helpreg,spilltemplist[supreg]);
if pos=nil then
list.insertafter(helpins,list.first)
else
list.insertafter(helpins,pos.next);
oper[1].ref^.index:=helpreg;
rgunget(list,helpins,helpreg);
forward_allocation(Tai(helpins.next));
{
writeln('spilling!');
list.insertafter(tai_comment.Create(strpnew('Spilling!')),helpins);
}
end;
{ load/store is done }
exit;
end;
{ all other instructions the compiler generates are the same (I hope): }
{ operand 0 is a register and is the destination, the others are sources }
{ and can be either registers or constants }
{ exception: branches (is_jmp isn't always set for them) }
if oper[0].typ <> top_reg then
exit;
reg1 := oper[0].reg.number shr 8;
if oper[1].typ = top_reg then
reg2 := oper[1].reg.number shr 8
else
reg2 := 0;
if (ops >= 3) and
(oper[2].typ = top_reg) then
reg3 := oper[2].reg.number shr 8
else
reg3 := 0;
supreg:=reg1;
if supreg in r then
begin
// Example:
// add r20d, r21d, r22d ; r20d must be spilled into -60(r1)
//
// Change into:
//
// lwz r23d, -60(r1)
// add r23d, r21d, r22d
// stw r23d, -60(r1)
pos := get_insert_pos(Tai(previous),reg1,reg2,reg3);
rgget(list,pos,0,helpreg);
spill_registers := true;
helpins := taicpu.op_reg_ref(A_STW,helpreg,spilltemplist[supreg]);
list.insertafter(helpins,self);
helpins := taicpu.op_reg_ref(A_LWZ,helpreg,spilltemplist[supreg]);
if pos=nil then
list.insertafter(helpins,list.first)
else
list.insertafter(helpins,pos.next);
loadreg(0,helpreg);
rgunget(list,helpins,helpreg);
forward_allocation(tai(helpins.next));
{
writeln('spilling!');
list.insertafter(tai_comment.Create(strpnew('Spilling!')),helpins);
}
end;
for i := 1 to 2 do
if (oper[i].typ = top_reg) then
begin
supreg:=oper[i].reg.number;
if supreg in r then
begin
// Example:
// add r20d, r21d, r22d ; r20d must be spilled into -60(r1)
//
// Change into:
//
// lwz r23d, -60(r1)
// add r23d, r21d, r22d
// stw r23d, -60(r1)
pos := get_insert_pos(Tai(previous),reg1,reg2,reg3);
rgget(list,pos,0,helpreg);
spill_registers := true;
helpins := taicpu.op_reg_ref(A_LWZ,helpreg,spilltemplist[supreg]);
if pos=nil then
list.insertafter(helpins,list.first)
else
list.insertafter(helpins,pos.next);
loadreg(i,helpreg);
rgunget(list,helpins,helpreg);
forward_allocation(tai(helpins.next));
{
writeln('spilling!');
list.insertafter(tai_comment.Create(strpnew('Spilling!')),helpins);
}
end;
end;
end;
procedure InitAsm; procedure InitAsm;
begin begin
end; end;
@ -766,31 +325,7 @@ uses cutils,rgobj;
end. end.
{ {
$Log$ $Log$
Revision 1.12 2002-09-30 23:16:49 jonas Revision 1.4 2002-12-14 15:02:03 carl
* is_nop() now identifies "mr rA,rA" instructions for removal
Revision 1.11 2003/07/23 10:58:06 jonas
- disabled some debugging code
Revision 1.10 2003/07/06 21:26:06 jonas
* committed wrong file previously :(
Revision 1.8 2003/06/14 22:32:43 jonas
* ppc compiles with -dnewra, haven't tried to compile anything with it
yet though
Revision 1.7 2003/06/14 14:53:50 jonas
* fixed newra cycle for x86
* added constants for indicating source and destination operands of the
"move reg,reg" instruction to aasmcpu (and use those in rgobj)
Revision 1.6 2003/05/11 11:08:25 jonas
+ op_reg_reg_reg_const_const (for rlwnm)
Revision 1.5 2003/03/12 22:43:38 jonas
* more powerpc and generic fixes related to the new register allocator
Revision 1.4 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

View File

@ -35,7 +35,6 @@ Const
RPNMax = 10; { I think you only need 4, but just to be safe } RPNMax = 10; { I think you only need 4, but just to be safe }
OpMax = 25; OpMax = 25;
maxoperands = 3; { Maximum operands for assembler instructions }
{--------------------------------------------------------------------- {---------------------------------------------------------------------
@ -109,7 +108,7 @@ type
condition : tasmcond; condition : tasmcond;
ops : byte; ops : byte;
labeled : boolean; labeled : boolean;
operands : array[1..maxoperands] of toperand; operands : array[1..max_operands] of toperand;
constructor create; constructor create;
destructor destroy;override; destructor destroy;override;
Procedure InitOperands;virtual; Procedure InitOperands;virtual;
@ -1592,7 +1591,13 @@ end;
end. end.
{ {
$Log$ $Log$
Revision 1.50 2002-11-25 17:43:23 peter Revision 1.51 2002-12-14 15:02:03 carl
* maxoperands -> max_operands (for portability in rautils.pas)
* fix some range-check errors with loadconst
+ add ncgadd unit to m68k
* some bugfix of a_param_reg with LOC_CREFERENCE
Revision 1.50 2002/11/25 17:43:23 peter
* splitted defbase in defutil,symutil,defcmp * splitted defbase in defutil,symutil,defcmp
* merged isconvertable and is_equal into compare_defs(_ext) * merged isconvertable and is_equal into compare_defs(_ext)
* made operator search faster by walking the list only once * made operator search faster by walking the list only once

View File

@ -137,7 +137,7 @@ constructor taicpu.op_const(op:tasmop;_op1:aword);
inherited create(op); inherited create(op);
init(_size); init(_size);
ops:=1; ops:=1;
loadconst(0,_op1); loadconst(0,aword(_op1));
end; end;
constructor taicpu.op_ref(op:tasmop;const _op1:treference); constructor taicpu.op_ref(op:tasmop;const _op1:treference);
begin begin
@ -160,7 +160,7 @@ constructor taicpu.op_reg_const(op:tasmop;_op1:tregister; _op2:aword);
init(_size); init(_size);
ops:=2; ops:=2;
loadreg(0,_op1); loadreg(0,_op1);
loadconst(1,_op2); loadconst(1,aword(_op2));
end; end;
constructor taicpu.op_reg_ref(Op:TAsmOp;Reg:TRegister;const Ref:TReference); constructor taicpu.op_reg_ref(Op:TAsmOp;Reg:TRegister;const Ref:TReference);
begin begin
@ -178,7 +178,7 @@ constructor taicpu.op_const_reg(op:tasmop;_op1:aword;_op2:tregister);
inherited create(op); inherited create(op);
init(_size); init(_size);
ops:=2; ops:=2;
loadconst(0,_op1); loadconst(0,aword(_op1));
loadreg(1,_op2); loadreg(1,_op2);
end; end;
constructor TAiCpu.op_ref_reg(Op:TAsmOp;const Ref:TReference;Reg:TRegister); constructor TAiCpu.op_ref_reg(Op:TAsmOp;const Ref:TReference;Reg:TRegister);
@ -223,7 +223,7 @@ constructor taicpu.op_const_ref_reg(op:tasmop;_size:topsize;_op1:aword;const _op
inherited create(op); inherited create(op);
init(_size); init(_size);
ops:=3; ops:=3;
loadconst(0,_op1); loadconst(0,aword(_op1));
loadref(1,_op2); loadref(1,_op2);
loadreg(2,_op3); loadreg(2,_op3);
end; end;
@ -232,7 +232,7 @@ constructor taicpu.op_const_reg_ref(op:tasmop;_size:topsize;_op1:aword;_op2:treg
inherited create(op); inherited create(op);
init(_size); init(_size);
ops:=3; ops:=3;
loadconst(0,_op1); loadconst(0,aword(_op1));
loadreg(1,_op2); loadreg(1,_op2);
loadref(2,_op3); loadref(2,_op3);
end; end;
@ -1083,7 +1083,13 @@ procedure InitAsm;
end. end.
{ {
$Log$ $Log$
Revision 1.13 2002-11-17 16:32:04 carl Revision 1.14 2002-12-14 15:02:03 carl
* maxoperands -> max_operands (for portability in rautils.pas)
* fix some range-check errors with loadconst
+ add ncgadd unit to m68k
* some bugfix of a_param_reg with LOC_CREFERENCE
Revision 1.13 2002/11/17 16:32:04 carl
* memory optimization (3-4%) : cleanup of tai fields, * memory optimization (3-4%) : cleanup of tai fields,
cleanup of tdef and tsym fields. cleanup of tdef and tsym fields.
* make it work for m68k * make it work for m68k