|
@@ -29,7 +29,7 @@ interface
|
|
|
uses
|
|
|
cclasses,aasmtai,
|
|
|
aasmbase,globals,verbose,
|
|
|
- cpubase,cpuinfo;
|
|
|
+ cpubase,cpuinfo,cginfo;
|
|
|
|
|
|
const
|
|
|
{ "mov reg,reg" source operand number }
|
|
@@ -42,7 +42,7 @@ uses
|
|
|
oppostfix : TOpPostfix;
|
|
|
roundingmode : troundingmode;
|
|
|
procedure loadshifterop(opidx:longint;const so:tshifterop);
|
|
|
- procedure loadregset(opidx:longint;const s:tsupregset);
|
|
|
+ procedure loadregset(opidx:longint;const s:tsuperregisterset);
|
|
|
constructor op_none(op : tasmop);
|
|
|
|
|
|
constructor op_reg(op : tasmop;_op1 : tregister);
|
|
@@ -51,28 +51,16 @@ uses
|
|
|
constructor op_reg_reg(op : tasmop;_op1,_op2 : tregister);
|
|
|
constructor op_reg_ref(op : tasmop;_op1 : tregister;const _op2 : treference);
|
|
|
constructor op_reg_const(op:tasmop; _op1: tregister; _op2: longint);
|
|
|
- constructor op_reg_regset(op:tasmop; _op1: tregister; _op2: tsupregset);
|
|
|
-
|
|
|
- constructor op_const_const(op : tasmop;_op1,_op2 : longint);
|
|
|
+ constructor op_reg_regset(op:tasmop; _op1: tregister; _op2: tsuperregisterset);
|
|
|
|
|
|
constructor op_reg_reg_reg(op : tasmop;_op1,_op2,_op3 : tregister);
|
|
|
constructor op_reg_reg_const(op : tasmop;_op1,_op2 : tregister; _op3: Longint);
|
|
|
constructor op_reg_reg_sym_ofs(op : tasmop;_op1,_op2 : tregister; _op3: tasmsymbol;_op3ofs: longint);
|
|
|
constructor op_reg_reg_ref(op : tasmop;_op1,_op2 : tregister; const _op3: treference);
|
|
|
- constructor op_const_reg_reg(op : tasmop;_op1 : longint;_op2, _op3 : tregister);
|
|
|
- constructor op_const_reg_const(op : tasmop;_op1 : longint;_op2 : tregister;_op3 : longint);
|
|
|
constructor op_reg_reg_shifterop(op : tasmop;_op1,_op2 : tregister;_op3 : tshifterop);
|
|
|
|
|
|
- constructor op_reg_reg_reg_reg(op : tasmop;_op1,_op2,_op3,_op4 : tregister);
|
|
|
-
|
|
|
- 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);
|
|
|
-
|
|
|
-
|
|
|
{ this is for Jmp instructions }
|
|
|
constructor op_cond_sym(op : tasmop;cond:TAsmCond;_op1 : tasmsymbol);
|
|
|
- constructor op_const_const_sym(op : tasmop;_op1,_op2 : longint;_op3: tasmsymbol);
|
|
|
-
|
|
|
|
|
|
constructor op_sym(op : tasmop;_op1 : tasmsymbol);
|
|
|
constructor op_sym_ofs(op : tasmop;_op1 : tasmsymbol;_op1ofs:longint);
|
|
@@ -84,8 +72,8 @@ uses
|
|
|
function spill_registers(list:Taasmoutput;
|
|
|
rgget:Trggetproc;
|
|
|
rgunget:Trgungetproc;
|
|
|
- r:Tsupregset;
|
|
|
- var unusedregsint:Tsupregset;
|
|
|
+ r:tsuperregisterset;
|
|
|
+ var unusedregsint:tsuperregisterset;
|
|
|
const spilltemplist:Tspill_temp_list):boolean; override;
|
|
|
end;
|
|
|
|
|
@@ -124,7 +112,7 @@ implementation
|
|
|
end;
|
|
|
|
|
|
|
|
|
- procedure taicpu.loadregset(opidx:longint;const s:tsupregset);
|
|
|
+ procedure taicpu.loadregset(opidx:longint;const s:tsuperregisterset);
|
|
|
begin
|
|
|
if opidx>=ops then
|
|
|
ops:=opidx+1;
|
|
@@ -151,8 +139,6 @@ implementation
|
|
|
constructor taicpu.op_reg(op : tasmop;_op1 : tregister);
|
|
|
begin
|
|
|
inherited create(op);
|
|
|
- if (_op1.enum = R_INTREGISTER) and (_op1.number = NR_NO) then
|
|
|
- internalerror(2003031207);
|
|
|
ops:=1;
|
|
|
loadreg(0,_op1);
|
|
|
end;
|
|
@@ -169,10 +155,6 @@ implementation
|
|
|
constructor taicpu.op_reg_reg(op : tasmop;_op1,_op2 : tregister);
|
|
|
begin
|
|
|
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;
|
|
|
loadreg(0,_op1);
|
|
|
loadreg(1,_op2);
|
|
@@ -182,19 +164,15 @@ implementation
|
|
|
constructor taicpu.op_reg_const(op:tasmop; _op1: tregister; _op2: longint);
|
|
|
begin
|
|
|
inherited create(op);
|
|
|
- if (_op1.enum = R_INTREGISTER) and (_op1.number = NR_NO) then
|
|
|
- internalerror(2003031208);
|
|
|
ops:=2;
|
|
|
loadreg(0,_op1);
|
|
|
loadconst(1,aword(_op2));
|
|
|
end;
|
|
|
|
|
|
|
|
|
- constructor taicpu.op_reg_regset(op:tasmop; _op1: tregister; _op2: tsupregset);
|
|
|
+ constructor taicpu.op_reg_regset(op:tasmop; _op1: tregister; _op2: tsuperregisterset);
|
|
|
begin
|
|
|
inherited create(op);
|
|
|
- if (_op1.enum = R_INTREGISTER) and (_op1.number = NR_NO) then
|
|
|
- internalerror(2003031208);
|
|
|
ops:=2;
|
|
|
loadreg(0,_op1);
|
|
|
loadregset(1,_op2);
|
|
@@ -204,32 +182,15 @@ implementation
|
|
|
constructor taicpu.op_reg_ref(op : tasmop;_op1 : tregister;const _op2 : treference);
|
|
|
begin
|
|
|
inherited create(op);
|
|
|
- if (_op1.enum = R_INTREGISTER) and (_op1.number = NR_NO) then
|
|
|
- internalerror(2003031210);
|
|
|
ops:=2;
|
|
|
loadreg(0,_op1);
|
|
|
loadref(1,_op2);
|
|
|
end;
|
|
|
|
|
|
|
|
|
- constructor taicpu.op_const_const(op : tasmop;_op1,_op2 : longint);
|
|
|
- begin
|
|
|
- inherited create(op);
|
|
|
- ops:=2;
|
|
|
- loadconst(0,aword(_op1));
|
|
|
- loadconst(1,aword(_op2));
|
|
|
- end;
|
|
|
-
|
|
|
-
|
|
|
constructor taicpu.op_reg_reg_reg(op : tasmop;_op1,_op2,_op3 : tregister);
|
|
|
begin
|
|
|
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;
|
|
|
loadreg(0,_op1);
|
|
|
loadreg(1,_op2);
|
|
@@ -240,10 +201,6 @@ implementation
|
|
|
constructor taicpu.op_reg_reg_const(op : tasmop;_op1,_op2 : tregister; _op3: Longint);
|
|
|
begin
|
|
|
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;
|
|
|
loadreg(0,_op1);
|
|
|
loadreg(1,_op2);
|
|
@@ -254,10 +211,6 @@ implementation
|
|
|
constructor taicpu.op_reg_reg_sym_ofs(op : tasmop;_op1,_op2 : tregister; _op3: tasmsymbol;_op3ofs: longint);
|
|
|
begin
|
|
|
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;
|
|
|
loadreg(0,_op1);
|
|
|
loadreg(1,_op2);
|
|
@@ -268,10 +221,6 @@ implementation
|
|
|
constructor taicpu.op_reg_reg_ref(op : tasmop;_op1,_op2 : tregister; const _op3: treference);
|
|
|
begin
|
|
|
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;
|
|
|
loadreg(0,_op1);
|
|
|
loadreg(1,_op2);
|
|
@@ -279,39 +228,9 @@ implementation
|
|
|
end;
|
|
|
|
|
|
|
|
|
- constructor taicpu.op_const_reg_reg(op : tasmop;_op1 : longint;_op2, _op3 : tregister);
|
|
|
- begin
|
|
|
- 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;
|
|
|
- loadconst(0,aword(_op1));
|
|
|
- loadreg(1,_op2);
|
|
|
- loadreg(2,_op3);
|
|
|
- end;
|
|
|
-
|
|
|
-
|
|
|
- constructor taicpu.op_const_reg_const(op : tasmop;_op1 : longint;_op2 : tregister;_op3 : longint);
|
|
|
- begin
|
|
|
- inherited create(op);
|
|
|
- if (_op2.enum = R_INTREGISTER) and (_op2.number = NR_NO) then
|
|
|
- internalerror(2003031222);
|
|
|
- ops:=3;
|
|
|
- loadconst(0,aword(_op1));
|
|
|
- loadreg(1,_op2);
|
|
|
- loadconst(2,aword(_op3));
|
|
|
- end;
|
|
|
-
|
|
|
-
|
|
|
constructor taicpu.op_reg_reg_shifterop(op : tasmop;_op1,_op2 : tregister;_op3 : tshifterop);
|
|
|
begin
|
|
|
inherited create(op);
|
|
|
- if (_op1.enum = R_INTREGISTER) and (_op1.number = NR_NO) then
|
|
|
- internalerror(200308233);
|
|
|
- if (_op2.enum = R_INTREGISTER) and (_op2.number = NR_NO) then
|
|
|
- internalerror(200308233);
|
|
|
ops:=3;
|
|
|
loadreg(0,_op1);
|
|
|
loadreg(1,_op2);
|
|
@@ -319,59 +238,6 @@ implementation
|
|
|
end;
|
|
|
|
|
|
|
|
|
- constructor taicpu.op_reg_reg_reg_reg(op : tasmop;_op1,_op2,_op3,_op4 : tregister);
|
|
|
- begin
|
|
|
- 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;
|
|
|
- loadreg(0,_op1);
|
|
|
- loadreg(1,_op2);
|
|
|
- loadreg(2,_op3);
|
|
|
- loadreg(3,_op4);
|
|
|
- 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);
|
|
|
- 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);
|
|
|
- ops:=5;
|
|
|
- loadreg(0,_op1);
|
|
|
- loadreg(1,_op2);
|
|
|
- loadconst(2,aword(_op3));
|
|
|
- loadconst(3,cardinal(_op4));
|
|
|
- loadconst(4,cardinal(_op5));
|
|
|
- end;
|
|
|
-
|
|
|
-
|
|
|
constructor taicpu.op_cond_sym(op : tasmop;cond:TAsmCond;_op1 : tasmsymbol);
|
|
|
begin
|
|
|
inherited create(op);
|
|
@@ -443,14 +309,14 @@ implementation
|
|
|
function taicpu.spill_registers(list:Taasmoutput;
|
|
|
rgget:Trggetproc;
|
|
|
rgunget:Trgungetproc;
|
|
|
- r:Tsupregset;
|
|
|
- var unusedregsint:Tsupregset;
|
|
|
+ r:tsuperregisterset;
|
|
|
+ var unusedregsint:tsuperregisterset;
|
|
|
const spilltemplist:Tspill_temp_list): boolean;
|
|
|
|
|
|
|
|
|
function get_insert_pos(p:Tai;huntfor1,huntfor2,huntfor3:Tsuperregister):Tai;
|
|
|
|
|
|
- var back:Tsupregset;
|
|
|
+ var back:tsuperregisterset;
|
|
|
|
|
|
begin
|
|
|
back:=unusedregsint;
|
|
@@ -749,7 +615,10 @@ implementation
|
|
|
end.
|
|
|
{
|
|
|
$Log$
|
|
|
- Revision 1.8 2003-09-03 11:18:37 florian
|
|
|
+ Revision 1.9 2003-09-04 00:15:29 florian
|
|
|
+ * first bunch of adaptions of arm compiler for new register type
|
|
|
+
|
|
|
+ Revision 1.8 2003/09/03 11:18:37 florian
|
|
|
* fixed arm concatcopy
|
|
|
+ arm support in the common compiler sources added
|
|
|
* moved some generic cg code around
|