mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-22 06:49:27 +02:00
* more powerpc and generic fixes related to the new register allocator
This commit is contained in:
parent
56f299a5a4
commit
24e2741659
@ -522,12 +522,12 @@ implementation
|
||||
|
||||
procedure tcgvecnode.update_reference_reg_mul(reg:tregister;l:aword);
|
||||
begin
|
||||
if location.reference.base.enum=R_NO then
|
||||
if location.reference.base.number=NR_NO then
|
||||
begin
|
||||
cg.a_op_const_reg(exprasmlist,OP_IMUL,l,reg);
|
||||
location.reference.base:=reg;
|
||||
end
|
||||
else if location.reference.index.enum=R_NO then
|
||||
else if location.reference.index.number=NR_NO then
|
||||
begin
|
||||
cg.a_op_const_reg(exprasmlist,OP_IMUL,l,reg);
|
||||
location.reference.index:=reg;
|
||||
@ -925,7 +925,10 @@ begin
|
||||
end.
|
||||
{
|
||||
$Log$
|
||||
Revision 1.42 2003-02-19 22:00:14 daniel
|
||||
Revision 1.43 2003-03-12 22:43:38 jonas
|
||||
* more powerpc and generic fixes related to the new register allocator
|
||||
|
||||
Revision 1.42 2003/02/19 22:00:14 daniel
|
||||
* Code generator converted to new register notation
|
||||
- Horribily outdated todo.txt removed
|
||||
|
||||
|
@ -109,6 +109,8 @@ 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;
|
||||
@ -125,6 +127,10 @@ 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);
|
||||
@ -133,6 +139,8 @@ 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));
|
||||
@ -141,6 +149,8 @@ implementation
|
||||
constructor taicpu.op_const_reg(op:tasmop; _op1: longint; _op2: tregister);
|
||||
begin
|
||||
inherited create(op);
|
||||
if (_op2.enum = R_INTREGISTER) and (_op2.number = NR_NO) then
|
||||
internalerror(2003031209);
|
||||
ops:=2;
|
||||
loadconst(0,aword(_op1));
|
||||
loadreg(1,_op2);
|
||||
@ -150,6 +160,8 @@ 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);
|
||||
@ -168,6 +180,12 @@ implementation
|
||||
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);
|
||||
@ -177,6 +195,10 @@ 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);
|
||||
@ -186,6 +208,10 @@ 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);
|
||||
@ -195,6 +221,10 @@ 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);
|
||||
@ -204,6 +234,10 @@ implementation
|
||||
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);
|
||||
@ -213,6 +247,8 @@ implementation
|
||||
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);
|
||||
@ -223,6 +259,14 @@ implementation
|
||||
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);
|
||||
@ -233,6 +277,12 @@ implementation
|
||||
constructor taicpu.op_reg_bool_reg_reg(op : tasmop;_op1: tregister;_op2:boolean;_op3,_op4:tregister);
|
||||
begin
|
||||
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;
|
||||
loadreg(0,_op1);
|
||||
loadbool(1,_op2);
|
||||
@ -243,6 +293,10 @@ implementation
|
||||
constructor taicpu.op_reg_bool_reg_const(op : tasmop;_op1: tregister;_op2:boolean;_op3:tregister;_op4: longint);
|
||||
begin
|
||||
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;
|
||||
loadreg(0,_op1);
|
||||
loadbool(0,_op2);
|
||||
@ -253,6 +307,10 @@ implementation
|
||||
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);
|
||||
@ -325,7 +383,10 @@ implementation
|
||||
end.
|
||||
{
|
||||
$Log$
|
||||
Revision 1.4 2002-12-14 15:02:03 carl
|
||||
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)
|
||||
* fix some range-check errors with loadconst
|
||||
+ add ncgadd unit to m68k
|
||||
|
@ -174,6 +174,10 @@ unit agppcgas;
|
||||
if (symaddr <> refs_full) then
|
||||
s := s+')'+symaddr2str[symaddr];
|
||||
|
||||
if (index.enum < firstreg) or (index.enum > lastreg) then
|
||||
internalerror(20030312);
|
||||
if (base.enum < firstreg) or (base.enum > lastreg) then
|
||||
internalerror(200303123);
|
||||
if (index.enum=R_NO) and (base.enum<>R_NO) then
|
||||
begin
|
||||
if offset=0 then
|
||||
@ -200,7 +204,11 @@ unit agppcgas;
|
||||
begin
|
||||
case o.typ of
|
||||
top_reg :
|
||||
getopstr_jmp:=gas_reg2str[o.reg.enum];
|
||||
begin
|
||||
if (o.reg.enum < R_0) or (o.reg.enum > lastreg) then
|
||||
internalerror(200303121);
|
||||
getopstr_jmp:=gas_reg2str[o.reg.enum];
|
||||
end;
|
||||
{ no top_ref jumping for powerpc }
|
||||
top_const :
|
||||
getopstr_jmp:=tostr(o.val);
|
||||
@ -234,8 +242,11 @@ unit agppcgas;
|
||||
begin
|
||||
case o.typ of
|
||||
top_reg:
|
||||
getopstr:=gas_reg2str[o.reg.enum];
|
||||
{ no top_ref jumping for powerpc }
|
||||
begin
|
||||
if (o.reg.enum < R_0) or (o.reg.enum > lastreg) then
|
||||
internalerror(200303125);
|
||||
getopstr:=gas_reg2str[o.reg.enum];
|
||||
end;
|
||||
top_const:
|
||||
getopstr:=tostr(longint(o.val));
|
||||
top_ref:
|
||||
@ -366,7 +377,10 @@ begin
|
||||
end.
|
||||
{
|
||||
$Log$
|
||||
Revision 1.20 2003-01-08 18:43:57 daniel
|
||||
Revision 1.21 2003-03-12 22:43:38 jonas
|
||||
* more powerpc and generic fixes related to the new register allocator
|
||||
|
||||
Revision 1.20 2003/01/08 18:43:57 daniel
|
||||
* Tregister changed into a record
|
||||
|
||||
Revision 1.19 2002/11/07 15:50:23 jonas
|
||||
|
@ -410,9 +410,9 @@ const
|
||||
procedure tcgppc.a_load_reg_reg(list : taasmoutput;fromsize, tosize : tcgsize;reg1,reg2 : tregister);
|
||||
|
||||
begin
|
||||
if reg1.enum<>R_INTREGISTER then
|
||||
if (reg1.enum<>R_INTREGISTER) or (reg1.number = 0) then
|
||||
internalerror(200303101);
|
||||
if reg2.enum<>R_INTREGISTER then
|
||||
if (reg2.enum<>R_INTREGISTER) or (reg2.number = 0) then
|
||||
internalerror(200303102);
|
||||
if (reg1.number<>reg2.number) or
|
||||
(tcgsize2size[tosize] < tcgsize2size[fromsize]) or
|
||||
@ -942,12 +942,13 @@ const
|
||||
{ sum of the size necessary for local variables and the maximum possible }
|
||||
{ combined size of ALL the parameters of a procedure called by the current }
|
||||
{ one }
|
||||
var regcounter,firstregfpu,firstreggpr, regcounter2 : TRegister;
|
||||
var regcounter,firstregfpu,firstreggpr: TRegister;
|
||||
href : treference;
|
||||
usesfpr,usesgpr,gotgot : boolean;
|
||||
parastart : aword;
|
||||
offset : aword;
|
||||
r,r2,rsp:Tregister;
|
||||
regcounter2: Tsuperregister;
|
||||
|
||||
begin
|
||||
{ we do our own localsize calculation }
|
||||
@ -963,12 +964,11 @@ const
|
||||
r.number:=NR_R0;
|
||||
a_reg_alloc(list,r);
|
||||
{ allocate registers containing reg parameters }
|
||||
regcounter2.enum := R_INTREGISTER;
|
||||
regcounter2.number := NR_R3;
|
||||
for regcounter.enum := R_3 to R_10 do
|
||||
r.enum := R_INTREGISTER;
|
||||
for regcounter2 := RS_R3 to RS_R10 do
|
||||
begin
|
||||
a_reg_alloc(list,regcounter2);
|
||||
inc(regcounter2.number,NR_R1-NR_R0);
|
||||
r.number:=regcounter2 shl 8;
|
||||
a_reg_alloc(list,r);
|
||||
end;
|
||||
|
||||
usesfpr:=false;
|
||||
@ -981,17 +981,15 @@ const
|
||||
end;
|
||||
|
||||
usesgpr:=false;
|
||||
regcounter2.enum := R_INTREGISTER;
|
||||
regcounter2.number := NR_R14;
|
||||
for regcounter.enum:=R_14 to R_31 do
|
||||
for regcounter2:=RS_R14 to RS_R31 do
|
||||
begin
|
||||
if regcounter.enum in rg.usedbyproc then
|
||||
if regcounter2 in rg.usedintbyproc then
|
||||
begin
|
||||
usesgpr:=true;
|
||||
firstreggpr:=regcounter;
|
||||
firstreggpr.enum := R_INTREGISTER;
|
||||
firstreggpr.number := regcounter2 shl 8;
|
||||
break;
|
||||
end;
|
||||
inc(regcounter2.number,NR_R1-NR_R0);
|
||||
end;
|
||||
|
||||
{ save link register? }
|
||||
@ -1114,19 +1112,19 @@ const
|
||||
procedure tcgppc.g_return_from_proc_sysv(list : taasmoutput;parasize : aword);
|
||||
|
||||
var
|
||||
regcounter,firstregfpu,firstreggpr, regcounter2 : TRegister;
|
||||
regcounter,firstregfpu,firstreggpr: TRegister;
|
||||
href : treference;
|
||||
usesfpr,usesgpr,genret : boolean;
|
||||
r,r2:Tregister;
|
||||
regcounter2:Tsuperregister;
|
||||
|
||||
begin
|
||||
{ release parameter registers }
|
||||
regcounter2.enum := R_INTREGISTER;
|
||||
regcounter2.number := NR_R3;
|
||||
for regcounter.enum := R_3 to R_10 do
|
||||
r.enum := R_INTREGISTER;
|
||||
for regcounter2 := RS_R3 to RS_R10 do
|
||||
begin
|
||||
a_reg_dealloc(list,regcounter2);
|
||||
inc(regcounter2.number,NR_R1-NR_R0);
|
||||
r.number:=regcounter2 shl 8;
|
||||
a_reg_dealloc(list,r);
|
||||
end;
|
||||
{ AltiVec context restore, not yet implemented !!! }
|
||||
|
||||
@ -1140,17 +1138,15 @@ const
|
||||
end;
|
||||
|
||||
usesgpr:=false;
|
||||
regcounter2.enum := R_INTREGISTER;
|
||||
regcounter2.number := NR_R14;
|
||||
for regcounter.enum:=R_14 to R_30 do
|
||||
for regcounter2:=RS_R14 to RS_R30 do
|
||||
begin
|
||||
if regcounter.enum in rg.usedbyproc then
|
||||
if regcounter2 in rg.usedintbyproc then
|
||||
begin
|
||||
usesgpr:=true;
|
||||
firstreggpr:=regcounter2;
|
||||
firstreggpr.enum:=R_INTREGISTER;
|
||||
firstreggpr.number:=regcounter2 shl 8;
|
||||
break;
|
||||
end;
|
||||
inc(regcounter2.number,NR_R1-NR_R0);
|
||||
end;
|
||||
|
||||
{ no return (blr) generated yet }
|
||||
@ -1221,11 +1217,12 @@ const
|
||||
the save area right below the address the stackpointer point to.
|
||||
Returns the actual used save area size.}
|
||||
|
||||
var regcounter,firstregfpu,firstreggpr, regcounter2: TRegister;
|
||||
var regcounter,firstregfpu,firstreggpr: TRegister;
|
||||
usesfpr,usesgpr: boolean;
|
||||
href : treference;
|
||||
offset: integer;
|
||||
r:Tregister;
|
||||
r,r2:Tregister;
|
||||
regcounter2: Tsuperregister;
|
||||
|
||||
begin
|
||||
usesfpr:=false;
|
||||
@ -1238,17 +1235,15 @@ const
|
||||
end;
|
||||
|
||||
usesgpr:=false;
|
||||
r.enum := R_INTREGISTER;
|
||||
r.number := NR_R13;
|
||||
for regcounter.enum:=R_13 to R_31 do
|
||||
for regcounter2:=RS_R13 to RS_R31 do
|
||||
begin
|
||||
if regcounter.enum in rg.usedbyproc then
|
||||
if regcounter2 in rg.usedintbyproc then
|
||||
begin
|
||||
usesgpr:=true;
|
||||
firstreggpr:=r;
|
||||
firstreggpr.enum:=R_INTREGISTER;
|
||||
firstreggpr.number:=regcounter2 shl 8;
|
||||
break;
|
||||
end;
|
||||
inc(r.number,NR_R1-NR_R0);
|
||||
end;
|
||||
offset:= 0;
|
||||
|
||||
@ -1277,16 +1272,16 @@ const
|
||||
end
|
||||
else
|
||||
begin
|
||||
regcounter2 := firstreggpr;
|
||||
r.enum:=R_INTREGISTER;
|
||||
r.number:=NR_STACK_POINTER_REG;
|
||||
r2 := firstreggpr;
|
||||
convert_register_to_enum(firstreggpr);
|
||||
for regcounter.enum := firstreggpr.enum to R_31 do
|
||||
begin
|
||||
offset:= offset - 4;
|
||||
r.enum:=R_INTREGISTER;
|
||||
r.number:=NR_STACK_POINTER_REG;
|
||||
reference_reset_base(href, r, offset);
|
||||
list.concat(taicpu.op_reg_ref(A_STW, regcounter2, href));
|
||||
inc(regcounter2.number,NR_R1-NR_R0);
|
||||
list.concat(taicpu.op_reg_ref(A_STW, r2, href));
|
||||
inc(r2.number,NR_R1-NR_R0);
|
||||
end;
|
||||
end;
|
||||
|
||||
@ -1299,11 +1294,12 @@ const
|
||||
{Generates code which restores used non-volatile registers from
|
||||
the save area right below the address the stackpointer point to.}
|
||||
|
||||
var regcounter,firstregfpu,firstreggpr,regcounter2: TRegister;
|
||||
var regcounter,firstregfpu,firstreggpr: TRegister;
|
||||
usesfpr,usesgpr: boolean;
|
||||
href : treference;
|
||||
offset: integer;
|
||||
r:Tregister;
|
||||
r,r2:Tregister;
|
||||
regcounter2: Tsuperregister;
|
||||
|
||||
begin
|
||||
usesfpr:=false;
|
||||
@ -1316,14 +1312,13 @@ const
|
||||
end;
|
||||
|
||||
usesgpr:=false;
|
||||
r.enum := R_INTREGISTER;
|
||||
r.number := NR_R13;
|
||||
for regcounter.enum:=R_13 to R_31 do
|
||||
for regcounter2:=RS_R13 to RS_R31 do
|
||||
begin
|
||||
if regcounter.enum in rg.usedbyproc then
|
||||
if regcounter2 in rg.usedintbyproc then
|
||||
begin
|
||||
usesgpr:=true;
|
||||
firstreggpr:=r;
|
||||
firstreggpr.enum:=R_INTREGISTER;
|
||||
firstreggpr.number:=regcounter2 shl 8;
|
||||
break;
|
||||
end;
|
||||
inc(r.number,NR_R1-NR_R0);
|
||||
@ -1356,16 +1351,16 @@ const
|
||||
end
|
||||
else
|
||||
begin
|
||||
regcounter2 := firstreggpr;
|
||||
r.enum:=R_INTREGISTER;
|
||||
r.number:=NR_STACK_POINTER_REG;
|
||||
r2 := firstreggpr;
|
||||
convert_register_to_enum(firstreggpr);
|
||||
for regcounter.enum := firstreggpr.enum to R_31 do
|
||||
begin
|
||||
offset:= offset - 4;
|
||||
r.enum:=R_INTREGISTER;
|
||||
r.number:=NR_STACK_POINTER_REG;
|
||||
reference_reset_base(href, r, offset);
|
||||
list.concat(taicpu.op_reg_ref(A_LWZ, regcounter2, href));
|
||||
inc(regcounter2.number,NR_R1-NR_R0);
|
||||
list.concat(taicpu.op_reg_ref(A_LWZ, r2, href));
|
||||
inc(r2.number,NR_R1-NR_R0);
|
||||
end;
|
||||
end;
|
||||
|
||||
@ -1382,10 +1377,11 @@ const
|
||||
const
|
||||
macosLinkageAreaSize = 24;
|
||||
|
||||
var regcounter,regcounter2: TRegister;
|
||||
var regcounter: TRegister;
|
||||
href : treference;
|
||||
registerSaveAreaSize : longint;
|
||||
r,r2,rsp:Tregister;
|
||||
regcounter2: Tsuperregister;
|
||||
|
||||
begin
|
||||
if (localsize mod 8) <> 0 then internalerror(58991);
|
||||
@ -1401,12 +1397,11 @@ const
|
||||
a_reg_alloc(list,r);
|
||||
|
||||
{ allocate registers containing reg parameters }
|
||||
regcounter2.enum := R_INTREGISTER;
|
||||
regcounter2.number := NR_R3;
|
||||
for regcounter.enum := R_3 to R_10 do
|
||||
r.enum := R_INTREGISTER;
|
||||
for regcounter2 := RS_R3 to RS_R10 do
|
||||
begin
|
||||
a_reg_alloc(list,regcounter2);
|
||||
inc(regcounter2.number,NR_R1-NR_R0);
|
||||
r.number:=regcounter2 shl 8;
|
||||
a_reg_alloc(list,r);
|
||||
end;
|
||||
|
||||
{TODO: Allocate fp and altivec parameter registers also}
|
||||
@ -1466,17 +1461,17 @@ const
|
||||
procedure tcgppc.g_return_from_proc_mac(list : taasmoutput;parasize : aword);
|
||||
|
||||
var
|
||||
regcounter, regcounter2: TRegister;
|
||||
regcounter: TRegister;
|
||||
href : treference;
|
||||
r,r2,rsp:Tregister;
|
||||
regcounter2: Tsuperregister;
|
||||
begin
|
||||
{ release parameter registers }
|
||||
regcounter2.enum := R_INTREGISTER;
|
||||
regcounter2.number := NR_R3;
|
||||
for regcounter.enum := R_3 to R_10 do
|
||||
r.enum := R_INTREGISTER;
|
||||
for regcounter2 := RS_R3 to RS_R10 do
|
||||
begin
|
||||
a_reg_dealloc(list,regcounter2);
|
||||
inc(regcounter2.number,NR_R1-NR_R0);
|
||||
r.number := regcounter2 shl 8;
|
||||
a_reg_dealloc(list,r);
|
||||
end;
|
||||
{TODO: Release fp and altivec parameter registers also}
|
||||
|
||||
@ -2192,7 +2187,10 @@ begin
|
||||
end.
|
||||
{
|
||||
$Log$
|
||||
Revision 1.72 2003-03-11 21:46:24 jonas
|
||||
Revision 1.73 2003-03-12 22:43:38 jonas
|
||||
* more powerpc and generic fixes related to the new register allocator
|
||||
|
||||
Revision 1.72 2003/03/11 21:46:24 jonas
|
||||
* lots of new regallocator fixes, both in generic and ppc-specific code
|
||||
(ppc compiler still can't compile the linux system unit though)
|
||||
|
||||
|
@ -364,9 +364,7 @@ implementation
|
||||
procinfo.aktproccode.concatlist(procinfo.aktexitcode);
|
||||
if not(cs_no_regalloc in aktglobalswitches) then
|
||||
begin
|
||||
{$ifdef i386}
|
||||
procinfo.aktproccode.convert_registers;
|
||||
{$endif}
|
||||
{$ifndef NoOpt}
|
||||
if (cs_optimize in aktglobalswitches) and
|
||||
{ do not optimize pure assembler procedures }
|
||||
@ -851,7 +849,10 @@ implementation
|
||||
end.
|
||||
{
|
||||
$Log$
|
||||
Revision 1.93 2003-03-08 08:59:07 daniel
|
||||
Revision 1.94 2003-03-12 22:43:38 jonas
|
||||
* more powerpc and generic fixes related to the new register allocator
|
||||
|
||||
Revision 1.93 2003/03/08 08:59:07 daniel
|
||||
+ $define newra will enable new register allocator
|
||||
+ getregisterint will return imaginary registers with $newra
|
||||
+ -sr switch added, will skip register allocation so you can see
|
||||
|
Loading…
Reference in New Issue
Block a user