* compilation of the powerpc compiler fixed

This commit is contained in:
florian 2003-10-17 01:22:08 +00:00
parent 8a4c312509
commit 6a01a7b4a6
9 changed files with 177 additions and 96 deletions

View File

@ -136,7 +136,7 @@ interface
end; end;
if pushedfpu then if pushedfpu then
begin begin
tmpreg := rg.getregisterfpu(exprasmlist,left.location.size); tmpreg := cg.getfpuregister(exprasmlist,left.location.size);
cg.a_loadfpu_loc_reg(exprasmlist,left.location,tmpreg); cg.a_loadfpu_loc_reg(exprasmlist,left.location,tmpreg);
location_reset(left.location,LOC_FPUREGISTER,left.location.size); location_reset(left.location,LOC_FPUREGISTER,left.location.size);
left.location.register := tmpreg; left.location.register := tmpreg;
@ -181,12 +181,12 @@ interface
{$ifndef cpu64bit} {$ifndef cpu64bit}
if location.size in [OS_64,OS_S64] then if location.size in [OS_64,OS_S64] then
begin begin
location.registerlow := rg.getregisterint(exprasmlist,OS_INT); location.registerlow := cg.getintregister(exprasmlist,OS_INT);
location.registerhigh := rg.getregisterint(exprasmlist,OS_INT); location.registerhigh := cg.getintregister(exprasmlist,OS_INT);
end end
else else
{$endif} {$endif}
location.register := rg.getregisterint(exprasmlist,location.size); location.register := cg.getintregister(exprasmlist,location.size);
end; end;
end; end;
@ -294,7 +294,7 @@ interface
left.location.register,location.register) left.location.register,location.register)
else else
begin begin
tmpreg := rg.getregisterint(exprasmlist,location.size); tmpreg := cg.getintregister(exprasmlist,location.size);
cg.a_load_const_reg(exprasmlist,location.size,1,tmpreg); cg.a_load_const_reg(exprasmlist,location.size,1,tmpreg);
cg.a_op_reg_reg(exprasmlist,OP_SHL,location.size, cg.a_op_reg_reg(exprasmlist,OP_SHL,location.size,
right.location.register,tmpreg); right.location.register,tmpreg);
@ -304,7 +304,7 @@ interface
else else
cg.a_op_const_reg_reg(exprasmlist,OP_OR,location.size, cg.a_op_const_reg_reg(exprasmlist,OP_OR,location.size,
aword(left.location.value),tmpreg,location.register); aword(left.location.value),tmpreg,location.register);
rg.ungetregisterint(exprasmlist,tmpreg); cg.ungetregister(exprasmlist,tmpreg);
end; end;
opdone := true; opdone := true;
end end
@ -334,13 +334,13 @@ interface
begin begin
if left.location.loc = LOC_CONSTANT then if left.location.loc = LOC_CONSTANT then
begin begin
tmpreg := rg.getregisterint(exprasmlist,location.size); tmpreg := cg.getintregister(exprasmlist,location.size);
cg.a_load_const_reg(exprasmlist,location.size, cg.a_load_const_reg(exprasmlist,location.size,
aword(left.location.value),tmpreg); aword(left.location.value),tmpreg);
cg.a_op_reg_reg(exprasmlist,OP_NOT,location.size,right.location.register,right.location.register); cg.a_op_reg_reg(exprasmlist,OP_NOT,location.size,right.location.register,right.location.register);
cg.a_op_reg_reg(exprasmlist,OP_AND,location.size,right.location.register,tmpreg); cg.a_op_reg_reg(exprasmlist,OP_AND,location.size,right.location.register,tmpreg);
cg.a_load_reg_reg(exprasmlist,OS_INT,location.size,tmpreg,location.register); cg.a_load_reg_reg(exprasmlist,OS_INT,location.size,tmpreg,location.register);
rg.ungetregisterint(exprasmlist,tmpreg); cg.ungetregister(exprasmlist,tmpreg);
end end
else else
begin begin
@ -660,12 +660,12 @@ interface
end end
else else
begin begin
tmpreg := rg.getregisterint(exprasmlist,location.size); tmpreg := cg.getintregister(exprasmlist,location.size);
cg.a_load_const_reg(exprasmlist,location.size, cg.a_load_const_reg(exprasmlist,location.size,
aword(left.location.value),tmpreg); aword(left.location.value),tmpreg);
cg.a_op_reg_reg_reg(exprasmlist,OP_SUB,location.size, cg.a_op_reg_reg_reg(exprasmlist,OP_SUB,location.size,
right.location.register,tmpreg,location.register); right.location.register,tmpreg,location.register);
rg.ungetregisterint(exprasmlist,tmpreg); cg.ungetregister(exprasmlist,tmpreg);
end; end;
end; end;
@ -735,7 +735,10 @@ begin
end. end.
{ {
$Log$ $Log$
Revision 1.21 2003-10-10 17:48:13 peter Revision 1.22 2003-10-17 01:22:08 florian
* compilation of the powerpc compiler fixed
Revision 1.21 2003/10/10 17:48:13 peter
* old trgobj moved to x86/rgcpu and renamed to trgx86fpu * old trgobj moved to x86/rgcpu and renamed to trgx86fpu
* tregisteralloctor renamed to trgobj * tregisteralloctor renamed to trgobj
* removed rgobj from a lot of units * removed rgobj from a lot of units

View File

@ -466,7 +466,7 @@ implementation
{$ifdef x86} {$ifdef x86}
tcgx86(cg).inc_fpu_stack; tcgx86(cg).inc_fpu_stack;
{$else x86} {$else x86}
hregister := cg.getregister(exprasmlist,location.size); hregister := cg.getfpuregister(exprasmlist,location.size);
cg.a_loadfpu_reg_reg(exprasmlist,location.size,location.register,hregister); cg.a_loadfpu_reg_reg(exprasmlist,location.size,location.register,hregister);
location.register := hregister; location.register := hregister;
{$endif x86} {$endif x86}
@ -1104,7 +1104,10 @@ begin
end. end.
{ {
$Log$ $Log$
Revision 1.130 2003-10-11 16:06:42 florian Revision 1.131 2003-10-17 01:22:08 florian
* compilation of the powerpc compiler fixed
Revision 1.130 2003/10/11 16:06:42 florian
* fixed some MMX<->SSE * fixed some MMX<->SSE
* started to fix ppc, needs an overhaul * started to fix ppc, needs an overhaul
+ stabs info improve for spilling, not sure if it works correctly/completly + stabs info improve for spilling, not sure if it works correctly/completly

View File

@ -614,7 +614,7 @@ implementation
else else
write(t,', resulttype = <nil>'); write(t,', resulttype = <nil>');
writeln(t,', pos = (',fileinfo.line,',',fileinfo.column,')', writeln(t,', pos = (',fileinfo.line,',',fileinfo.column,')',
// ', loc = ',tcgloc2str[location.loc], ', loc = ',tcgloc2str[location.loc],
', expectloc = ',tcgloc2str[expectloc], ', expectloc = ',tcgloc2str[expectloc],
', intregs = ',registers32, ', intregs = ',registers32,
', fpuregs = ',registersfpu); ', fpuregs = ',registersfpu);
@ -976,7 +976,10 @@ implementation
end. end.
{ {
$Log$ $Log$
Revision 1.69 2003-10-08 19:19:45 peter Revision 1.70 2003-10-17 01:22:08 florian
* compilation of the powerpc compiler fixed
Revision 1.69 2003/10/08 19:19:45 peter
* set_varstate cleanup * set_varstate cleanup
Revision 1.68 2003/10/01 20:34:49 peter Revision 1.68 2003/10/01 20:34:49 peter

View File

@ -42,16 +42,16 @@ unit cgcpu;
procedure done_register_allocators;override; procedure done_register_allocators;override;
function getintregister(list:Taasmoutput;size:Tcgsize):Tregister;override; function getintregister(list:Taasmoutput;size:Tcgsize):Tregister;override;
function getaddressregister(list:Taasmoutput):Tregister;override; function getaddressregister(list:Taasmoutput):Tregister;
function getfpuregister(list:Taasmoutput;size:Tcgsize):Tregister;override; function getfpuregister(list:Taasmoutput;size:Tcgsize):Tregister;override;
function getmmregister(list:Taasmoutput;size:Tcgsize):Tregister;override; function getmmregister(list:Taasmoutput;size:Tcgsize):Tregister;override;
procedure getexplicitregister(list:Taasmoutput;r:Tregister);override; procedure getexplicitregister(list:Taasmoutput;r:Tregister);override;
function getabtintregister(list:Taasmoutput;size:Tcgsize):Tregister;override;
procedure ungetregister(list:Taasmoutput;r:Tregister);override; procedure ungetregister(list:Taasmoutput;r:Tregister);override;
procedure ungetreference(list:Taasmoutput;const r:Treference);override; {!!!
procedure allocexplicitregisters(list:Taasmoutput;rt:Tregistertype;r:Tsuperregisterset);override; procedure allocexplicitregisters(list:Taasmoutput;rt:Tregistertype;r:Tsuperregisterset);override;
procedure deallocexplicitregisters(list:Taasmoutput;rt:Tregistertype;r:Tsuperregisterset);override; procedure deallocexplicitregisters(list:Taasmoutput;rt:Tregistertype;r:Tsuperregisterset);override;
procedure add_move_instruction(instr:Taicpu);override; procedure add_move_instruction(instr:Taicpu);override;
}
{ passing parameters, per default the parameter is pushed } { passing parameters, per default the parameter is pushed }
{ nr gives the number of the parameter (enumerated from } { nr gives the number of the parameter (enumerated from }
@ -195,6 +195,60 @@ const
end; end;
function tcgppc.getintregister(list:Taasmoutput;size:Tcgsize):Tregister;
begin
result:=rgint.getregister(list,cgsize2subreg(size));
end;
function tcgppc.getaddressregister(list:Taasmoutput):Tregister;
begin
result:=rgint.getregister(list,R_SUBWHOLE);
end;
function tcgppc.getfpuregister(list:Taasmoutput;size:Tcgsize):Tregister;
begin
result:=rgfpu.getregister(list,R_SUBWHOLE);
end;
function tcgppc.getmmregister(list:Taasmoutput;size:Tcgsize):Tregister;
begin
result:=rgmm.getregister(list,R_SUBNONE);
end;
procedure tcgppc.getexplicitregister(list:Taasmoutput;r:Tregister);
begin
case getregtype(r) of
R_INTREGISTER :
rgint.getexplicitregister(list,r);
R_MMREGISTER :
rgmm.getexplicitregister(list,r);
R_FPUREGISTER :
rgfpu.getexplicitregister(list,r);
else
internalerror(200310091);
end;
end;
procedure tcgppc.ungetregister(list:Taasmoutput;r:Tregister);
begin
case getregtype(r) of
R_INTREGISTER :
rgint.ungetregister(list,r);
R_FPUREGISTER :
rgfpu.ungetregister(list,r);
R_MMREGISTER :
rgmm.ungetregister(list,r);
else
internalerror(200310091);
end;
end;
procedure tcgppc.a_param_const(list : taasmoutput;size : tcgsize;a : aword;const locpara : tparalocation); procedure tcgppc.a_param_const(list : taasmoutput;size : tcgsize;a : aword;const locpara : tparalocation);
var var
ref: treference; ref: treference;
@ -2387,7 +2441,10 @@ begin
end. end.
{ {
$Log$ $Log$
Revision 1.129 2003-10-13 01:58:04 florian Revision 1.130 2003-10-17 01:22:08 florian
* compilation of the powerpc compiler fixed
Revision 1.129 2003/10/13 01:58:04 florian
* some ideas for mm support implemented * some ideas for mm support implemented
Revision 1.128 2003/10/11 16:06:42 florian Revision 1.128 2003/10/11 16:06:42 florian

View File

@ -106,7 +106,7 @@ interface
secondpass(right); secondpass(right);
if pushedfpu then if pushedfpu then
begin begin
tmpreg := rg.getregisterfpu(exprasmlist,left.location.size); tmpreg := cg.getfpuregister(exprasmlist,left.location.size);
cg.a_loadfpu_loc_reg(exprasmlist,left.location,tmpreg); cg.a_loadfpu_loc_reg(exprasmlist,left.location,tmpreg);
location_reset(left.location,LOC_FPUREGISTER,left.location.size); location_reset(left.location,LOC_FPUREGISTER,left.location.size);
left.location.register := tmpreg; left.location.register := tmpreg;
@ -156,9 +156,9 @@ interface
if not(cmpop) and if not(cmpop) and
(location.register = NR_NO) then (location.register = NR_NO) then
begin begin
location.register := rg.getregisterint(exprasmlist,OS_INT); location.register := cg.getintregister(exprasmlist,OS_INT);
if is_64bit(resulttype.def) then if is_64bit(resulttype.def) then
location.registerhigh := rg.getregisterint(exprasmlist,OS_INT); location.registerhigh := cg.getintregister(exprasmlist,OS_INT);
end; end;
end; end;
@ -227,7 +227,7 @@ interface
else else
begin begin
useconst := false; useconst := false;
tmpreg := rg.getregisterint(exprasmlist,OS_INT); tmpreg := cg.getintregister(exprasmlist,OS_INT);
cg.a_load_const_reg(exprasmlist,OS_INT, cg.a_load_const_reg(exprasmlist,OS_INT,
aword(right.location.value),tmpreg); aword(right.location.value),tmpreg);
end end
@ -255,7 +255,7 @@ interface
begin begin
exprasmlist.concat(taicpu.op_reg_reg(op, exprasmlist.concat(taicpu.op_reg_reg(op,
left.location.register,tmpreg)); left.location.register,tmpreg));
rg.ungetregisterint(exprasmlist,tmpreg); cg.ungetregister(exprasmlist,tmpreg);
end end
else else
exprasmlist.concat(taicpu.op_reg_reg(op, exprasmlist.concat(taicpu.op_reg_reg(op,
@ -469,7 +469,7 @@ interface
else if right.location.loc = LOC_FPUREGISTER then else if right.location.loc = LOC_FPUREGISTER then
location.register := right.location.register location.register := right.location.register
else else
location.register := rg.getregisterfpu(exprasmlist,location.size); location.register := cg.getfpuregister(exprasmlist,location.size);
end end
else else
begin begin
@ -526,7 +526,7 @@ interface
if not(cmpop) and if not(cmpop) and
(location.register = NR_NO) then (location.register = NR_NO) then
location.register := rg.getregisterint(exprasmlist,OS_INT); location.register := cg.getintregister(exprasmlist,OS_INT);
case nodetype of case nodetype of
addn : addn :
@ -545,7 +545,7 @@ interface
left.location.register,location.register) left.location.register,location.register)
else else
begin begin
tmpreg := rg.getregisterint(exprasmlist,OS_INT); tmpreg := cg.getintregister(exprasmlist,OS_INT);
cg.a_load_const_reg(exprasmlist,OS_INT,1,tmpreg); cg.a_load_const_reg(exprasmlist,OS_INT,1,tmpreg);
cg.a_op_reg_reg(exprasmlist,OP_SHL,OS_INT, cg.a_op_reg_reg(exprasmlist,OP_SHL,OS_INT,
right.location.register,tmpreg); right.location.register,tmpreg);
@ -555,7 +555,7 @@ interface
else else
cg.a_op_const_reg_reg(exprasmlist,OP_OR,OS_INT, cg.a_op_const_reg_reg(exprasmlist,OP_OR,OS_INT,
aword(left.location.value),tmpreg,location.register); aword(left.location.value),tmpreg,location.register);
rg.ungetregisterint(exprasmlist,tmpreg); cg.ungetregister(exprasmlist,tmpreg);
end; end;
opdone := true; opdone := true;
end end
@ -585,12 +585,12 @@ interface
begin begin
if left.location.loc = LOC_CONSTANT then if left.location.loc = LOC_CONSTANT then
begin begin
tmpreg := rg.getregisterint(exprasmlist,OS_INT); tmpreg := cg.getintregister(exprasmlist,OS_INT);
cg.a_load_const_reg(exprasmlist,OS_INT, cg.a_load_const_reg(exprasmlist,OS_INT,
aword(left.location.value),tmpreg); aword(left.location.value),tmpreg);
exprasmlist.concat(taicpu.op_reg_reg_reg(A_ANDC, exprasmlist.concat(taicpu.op_reg_reg_reg(A_ANDC,
location.register,tmpreg,right.location.register)); location.register,tmpreg,right.location.register));
rg.ungetregisterint(exprasmlist,tmpreg); cg.ungetregister(exprasmlist,tmpreg);
end end
else else
exprasmlist.concat(taicpu.op_reg_reg_reg(A_ANDC, exprasmlist.concat(taicpu.op_reg_reg_reg(A_ANDC,
@ -612,7 +612,7 @@ interface
(nodetype = gten)) then (nodetype = gten)) then
swapleftright; swapleftright;
// now we have to check whether left >= right // now we have to check whether left >= right
tmpreg := rg.getregisterint(exprasmlist,OS_INT); tmpreg := cg.getintregister(exprasmlist,OS_INT);
if left.location.loc = LOC_CONSTANT then if left.location.loc = LOC_CONSTANT then
begin begin
cg.a_op_const_reg_reg(exprasmlist,OP_AND,OS_INT, cg.a_op_const_reg_reg(exprasmlist,OP_AND,OS_INT,
@ -634,7 +634,7 @@ interface
exprasmlist.concat(taicpu.op_reg_reg_reg(A_ANDC_,tmpreg, exprasmlist.concat(taicpu.op_reg_reg_reg(A_ANDC_,tmpreg,
right.location.register,left.location.register)); right.location.register,left.location.register));
end; end;
rg.ungetregisterint(exprasmlist,tmpreg); cg.ungetregister(exprasmlist,tmpreg);
location.resflags.cr := RS_CR0; location.resflags.cr := RS_CR0;
location.resflags.flag := F_EQ; location.resflags.flag := F_EQ;
opdone := true; opdone := true;
@ -860,11 +860,11 @@ interface
else else
begin begin
if (aword(right.location.valueqword) <> 0) then if (aword(right.location.valueqword) <> 0) then
tempreg64.reglo := rg.getregisterint(exprasmlist,OS_32) tempreg64.reglo := cg.getintregister(exprasmlist,OS_32)
else else
tempreg64.reglo := left.location.registerlow; tempreg64.reglo := left.location.registerlow;
if ((right.location.valueqword shr 32) <> 0) then if ((right.location.valueqword shr 32) <> 0) then
tempreg64.reghi := rg.getregisterint(exprasmlist,OS_32) tempreg64.reghi := cg.getintregister(exprasmlist,OS_32)
else else
tempreg64.reghi := left.location.registerhigh; tempreg64.reghi := left.location.registerhigh;
end; end;
@ -895,8 +895,8 @@ interface
end end
else else
begin begin
tempreg64.reglo := rg.getregisterint(exprasmlist,OS_INT); tempreg64.reglo := cg.getintregister(exprasmlist,OS_INT);
tempreg64.reghi := rg.getregisterint(exprasmlist,OS_INT); tempreg64.reghi := cg.getintregister(exprasmlist,OS_INT);
cg64.a_op64_reg_reg_reg(exprasmlist,OP_XOR, cg64.a_op64_reg_reg_reg(exprasmlist,OP_XOR,
left.location.register64,right.location.register64, left.location.register64,right.location.register64,
tempreg64); tempreg64);
@ -907,9 +907,9 @@ interface
tempreg64.reglo,tempreg64.reghi)); tempreg64.reglo,tempreg64.reghi));
cg.a_reg_dealloc(exprasmlist,NR_R0); cg.a_reg_dealloc(exprasmlist,NR_R0);
if (tempreg64.reglo <> left.location.registerlow) then if (tempreg64.reglo <> left.location.registerlow) then
rg.ungetregisterint(exprasmlist,tempreg64.reglo); cg.ungetregister(exprasmlist,tempreg64.reglo);
if (tempreg64.reghi <> left.location.registerhigh) then if (tempreg64.reghi <> left.location.registerhigh) then
rg.ungetregisterint(exprasmlist,tempreg64.reghi); cg.ungetregister(exprasmlist,tempreg64.reghi);
location_reset(location,LOC_FLAGS,OS_NO); location_reset(location,LOC_FLAGS,OS_NO);
location.resflags := getresflags; location.resflags := getresflags;
@ -918,8 +918,8 @@ interface
begin begin
if (location.registerlow = NR_NO) then if (location.registerlow = NR_NO) then
begin begin
location.registerlow := rg.getregisterint(exprasmlist,OS_INT); location.registerlow := cg.getintregister(exprasmlist,OS_INT);
location.registerhigh := rg.getregisterint(exprasmlist,OS_INT); location.registerhigh := cg.getintregister(exprasmlist,OS_INT);
end; end;
if (left.location.loc = LOC_CONSTANT) then if (left.location.loc = LOC_CONSTANT) then
@ -940,8 +940,8 @@ interface
begin begin
if (location.registerlow = NR_NO) then if (location.registerlow = NR_NO) then
begin begin
location.registerlow := rg.getregisterint(exprasmlist,OS_INT); location.registerlow := cg.getintregister(exprasmlist,OS_INT);
location.registerhigh := rg.getregisterint(exprasmlist,OS_INT); location.registerhigh := cg.getintregister(exprasmlist,OS_INT);
end; end;
if right.location.loc <> LOC_CONSTANT then if right.location.loc <> LOC_CONSTANT then
// reg64 - reg64 // reg64 - reg64
@ -958,8 +958,8 @@ interface
begin begin
if (location.registerlow = NR_NO) then if (location.registerlow = NR_NO) then
begin begin
location.registerlow := rg.getregisterint(exprasmlist,OS_INT); location.registerlow := cg.getintregister(exprasmlist,OS_INT);
location.registerhigh := rg.getregisterint(exprasmlist,OS_INT); location.registerhigh := cg.getintregister(exprasmlist,OS_INT);
end; end;
if (int64(left.location.valueqword) >= low(smallint)) and if (int64(left.location.valueqword) >= low(smallint)) and
(int64(left.location.valueqword) <= high(smallint)) then (int64(left.location.valueqword) <= high(smallint)) then
@ -986,8 +986,8 @@ interface
// (const32 shl 32) - reg64 // (const32 shl 32) - reg64
if (location.registerlow = NR_NO) then if (location.registerlow = NR_NO) then
begin begin
location.registerlow := rg.getregisterint(exprasmlist,OS_INT); location.registerlow := cg.getintregister(exprasmlist,OS_INT);
location.registerhigh := rg.getregisterint(exprasmlist,OS_INT); location.registerhigh := cg.getintregister(exprasmlist,OS_INT);
end; end;
exprasmlist.concat(taicpu.op_reg_reg_const(A_SUBFIC, exprasmlist.concat(taicpu.op_reg_reg_const(A_SUBFIC,
location.registerlow,right.location.registerlow,0)); location.registerlow,right.location.registerlow,0));
@ -1006,8 +1006,8 @@ interface
location.register64 := left.location.register64 location.register64 := left.location.register64
else if (location.registerlow = NR_NO) then else if (location.registerlow = NR_NO) then
begin begin
location.registerlow := rg.getregisterint(exprasmlist,OS_INT); location.registerlow := cg.getintregister(exprasmlist,OS_INT);
location.registerhigh := rg.getregisterint(exprasmlist,OS_INT); location.registerhigh := cg.getintregister(exprasmlist,OS_INT);
end; end;
cg64.a_op64_reg_reg_reg(exprasmlist,OP_SUB, cg64.a_op64_reg_reg_reg(exprasmlist,OP_SUB,
right.location.register64,left.location.register64, right.location.register64,left.location.register64,
@ -1330,7 +1330,7 @@ interface
if (location.register = NR_NO) and if (location.register = NR_NO) and
not(cmpop) then not(cmpop) then
location.register := rg.getregisterint(exprasmlist,OS_INT); location.register := cg.getintregister(exprasmlist,OS_INT);
if not(cs_check_overflow in aktlocalswitches) or if not(cs_check_overflow in aktlocalswitches) or
(cmpop) or (cmpop) or
@ -1388,12 +1388,12 @@ interface
end end
else else
begin begin
tmpreg := rg.getregisterint(exprasmlist,OS_INT); tmpreg := cg.getintregister(exprasmlist,OS_INT);
cg.a_load_const_reg(exprasmlist,OS_INT, cg.a_load_const_reg(exprasmlist,OS_INT,
aword(left.location.value),tmpreg); aword(left.location.value),tmpreg);
cg.a_op_reg_reg_reg(exprasmlist,OP_SUB,OS_INT, cg.a_op_reg_reg_reg(exprasmlist,OP_SUB,OS_INT,
right.location.register,tmpreg,location.register); right.location.register,tmpreg,location.register);
rg.ungetregisterint(exprasmlist,tmpreg); cg.ungetregister(exprasmlist,tmpreg);
end; end;
end; end;
ltn,lten,gtn,gten,equaln,unequaln : ltn,lten,gtn,gten,equaln,unequaln :
@ -1428,7 +1428,10 @@ begin
end. end.
{ {
$Log$ $Log$
Revision 1.36 2003-10-01 20:34:49 peter Revision 1.37 2003-10-17 01:22:08 florian
* compilation of the powerpc compiler fixed
Revision 1.36 2003/10/01 20:34:49 peter
* procinfo unit contains tprocinfo * procinfo unit contains tprocinfo
* cginfo renamed to cgbase * cginfo renamed to cgbase
* moved cgmessage to verbose * moved cgmessage to verbose

View File

@ -188,7 +188,7 @@ implementation
leftreg := left.location.register; leftreg := left.location.register;
if signed then if signed then
begin begin
valuereg := rg.getregisterint(exprasmlist,OS_INT); valuereg := cg.getintregister(exprasmlist,OS_INT);
valuereg_is_scratch := true; valuereg_is_scratch := true;
end end
else else
@ -196,7 +196,7 @@ implementation
end; end;
LOC_REFERENCE,LOC_CREFERENCE: LOC_REFERENCE,LOC_CREFERENCE:
begin begin
leftreg := rg.getregisterint(exprasmlist,OS_INT); leftreg := cg.getintregister(exprasmlist,OS_INT);
valuereg := leftreg; valuereg := leftreg;
valuereg_is_scratch := true; valuereg_is_scratch := true;
if signed then if signed then
@ -209,10 +209,10 @@ implementation
else else
internalerror(200110012); internalerror(200110012);
end; end;
tempreg := rg.getregisterint(exprasmlist,OS_INT); tempreg := cg.getintregister(exprasmlist,OS_INT);
exprasmlist.concat(taicpu.op_reg_const(A_LIS,tempreg,$4330)); exprasmlist.concat(taicpu.op_reg_const(A_LIS,tempreg,$4330));
cg.a_load_reg_ref(exprasmlist,OS_32,OS_32,tempreg,ref); cg.a_load_reg_ref(exprasmlist,OS_32,OS_32,tempreg,ref);
rg.ungetregisterint(exprasmlist,tempreg); cg.ungetregister(exprasmlist,tempreg);
if signed then if signed then
exprasmlist.concat(taicpu.op_reg_reg_const(A_XORIS,valuereg, exprasmlist.concat(taicpu.op_reg_reg_const(A_XORIS,valuereg,
{ xoris expects a unsigned 16 bit int (FK) } { xoris expects a unsigned 16 bit int (FK) }
@ -221,21 +221,21 @@ implementation
cg.a_load_reg_ref(exprasmlist,OS_32,OS_32,valuereg,ref); cg.a_load_reg_ref(exprasmlist,OS_32,OS_32,valuereg,ref);
dec(ref.offset,4); dec(ref.offset,4);
if (valuereg_is_scratch) then if (valuereg_is_scratch) then
rg.ungetregisterint(exprasmlist,valuereg); cg.ungetregister(exprasmlist,valuereg);
if (left.location.loc = LOC_REGISTER) or if (left.location.loc = LOC_REGISTER) or
((left.location.loc = LOC_CREGISTER) and ((left.location.loc = LOC_CREGISTER) and
not signed) then not signed) then
rg.ungetregisterint(exprasmlist,leftreg) cg.ungetregister(exprasmlist,leftreg)
else else
rg.ungetregisterint(exprasmlist,valuereg); cg.ungetregister(exprasmlist,valuereg);
tmpfpureg := rg.getregisterfpu(exprasmlist,OS_F64); tmpfpureg := cg.getfpuregister(exprasmlist,OS_F64);
cg.a_loadfpu_ref_reg(exprasmlist,OS_F64,tempconst.location.reference, cg.a_loadfpu_ref_reg(exprasmlist,OS_F64,tempconst.location.reference,
tmpfpureg); tmpfpureg);
tempconst.free; tempconst.free;
location.register := rg.getregisterfpu(exprasmlist,OS_F64); location.register := cg.getfpuregister(exprasmlist,OS_F64);
exprasmlist.concat(taicpu.op_reg_ref(A_LFD,location.register, exprasmlist.concat(taicpu.op_reg_ref(A_LFD,location.register,
ref)); ref));
@ -243,7 +243,7 @@ implementation
exprasmlist.concat(taicpu.op_reg_reg_reg(A_FSUB,location.register, exprasmlist.concat(taicpu.op_reg_reg_reg(A_FSUB,location.register,
location.register,tmpfpureg)); location.register,tmpfpureg));
rg.ungetregisterfpu(exprasmlist,tmpfpureg,OS_F64); cg.ungetregister(exprasmlist,tmpfpureg);
{ work around bug in some PowerPC processors } { work around bug in some PowerPC processors }
if (tfloatdef(resulttype.def).typ = s32real) then if (tfloatdef(resulttype.def).typ = s32real) then
@ -301,18 +301,18 @@ implementation
if left.location.loc in [LOC_CREFERENCE,LOC_REFERENCE] then if left.location.loc in [LOC_CREFERENCE,LOC_REFERENCE] then
begin begin
reference_release(exprasmlist,left.location.reference); reference_release(exprasmlist,left.location.reference);
hreg2:=rg.getregisterint(exprasmlist,OS_INT); hreg2:=cg.getintregister(exprasmlist,OS_INT);
if left.location.size in [OS_64,OS_S64] then if left.location.size in [OS_64,OS_S64] then
begin begin
cg.a_load_ref_reg(exprasmlist,OS_INT,OS_INT, cg.a_load_ref_reg(exprasmlist,OS_INT,OS_INT,
left.location.reference,hreg2); left.location.reference,hreg2);
hreg1:=rg.getregisterint(exprasmlist,OS_INT); hreg1:=cg.getintregister(exprasmlist,OS_INT);
href:=left.location.reference; href:=left.location.reference;
inc(href.offset,4); inc(href.offset,4);
cg.a_load_ref_reg(exprasmlist,OS_INT,OS_INT, cg.a_load_ref_reg(exprasmlist,OS_INT,OS_INT,
href,hreg1); href,hreg1);
cg.a_op_reg_reg_reg(exprasmlist,OP_OR,OS_32,hreg2,hreg1,hreg2); cg.a_op_reg_reg_reg(exprasmlist,OP_OR,OS_32,hreg2,hreg1,hreg2);
rg.ungetregisterint(exprasmlist,hreg1); cg.ungetregister(exprasmlist,hreg1);
end end
else else
cg.a_load_ref_reg(exprasmlist,opsize,opsize, cg.a_load_ref_reg(exprasmlist,opsize,opsize,
@ -322,23 +322,23 @@ implementation
begin begin
if left.location.size in [OS_64,OS_S64] then if left.location.size in [OS_64,OS_S64] then
begin begin
hreg2:=rg.getregisterint(exprasmlist,OS_32); hreg2:=cg.getintregister(exprasmlist,OS_32);
cg.a_op_reg_reg_reg(exprasmlist,OP_OR,OS_32,left.location.registerhigh,left.location.registerlow,hreg2); cg.a_op_reg_reg_reg(exprasmlist,OP_OR,OS_32,left.location.registerhigh,left.location.registerlow,hreg2);
location_release(exprasmlist,left.location); location_release(exprasmlist,left.location);
end end
else else
hreg2 := left.location.register; hreg2 := left.location.register;
end; end;
hreg1 := rg.getregisterint(exprasmlist,OS_INT); hreg1 := cg.getintregister(exprasmlist,OS_INT);
exprasmlist.concat(taicpu.op_reg_reg_const(A_SUBIC,hreg1, exprasmlist.concat(taicpu.op_reg_reg_const(A_SUBIC,hreg1,
hreg2,1)); hreg2,1));
exprasmlist.concat(taicpu.op_reg_reg_reg(A_SUBFE,hreg1,hreg1, exprasmlist.concat(taicpu.op_reg_reg_reg(A_SUBFE,hreg1,hreg1,
hreg2)); hreg2));
rg.ungetregisterint(exprasmlist,hreg2); cg.ungetregister(exprasmlist,hreg2);
end; end;
LOC_FLAGS : LOC_FLAGS :
begin begin
hreg1:=rg.getregisterint(exprasmlist,OS_INT); hreg1:=cg.getintregister(exprasmlist,OS_INT);
resflags:=left.location.resflags; resflags:=left.location.resflags;
cg.g_flags2reg(exprasmlist,location.size,resflags,hreg1); cg.g_flags2reg(exprasmlist,location.size,resflags,hreg1);
end; end;
@ -431,7 +431,10 @@ begin
end. end.
{ {
$Log$ $Log$
Revision 1.43 2003-10-01 20:34:49 peter Revision 1.44 2003-10-17 01:22:08 florian
* compilation of the powerpc compiler fixed
Revision 1.43 2003/10/01 20:34:49 peter
* procinfo unit contains tprocinfo * procinfo unit contains tprocinfo
* cginfo renamed to cgbase * cginfo renamed to cgbase
* moved cgmessage to verbose * moved cgmessage to verbose

View File

@ -91,7 +91,7 @@ implementation
if (location.loc = LOC_CFPUREGISTER) then if (location.loc = LOC_CFPUREGISTER) then
begin begin
location.loc := LOC_FPUREGISTER; location.loc := LOC_FPUREGISTER;
location.register := rg.getregisterfpu(exprasmlist,OS_F64); location.register := cg.getfpuregister(exprasmlist,OS_F64);
end; end;
end; end;
@ -116,7 +116,10 @@ begin
end. end.
{ {
$Log$ $Log$
Revision 1.10 2003-10-01 20:34:49 peter Revision 1.11 2003-10-17 01:22:08 florian
* compilation of the powerpc compiler fixed
Revision 1.10 2003/10/01 20:34:49 peter
* procinfo unit contains tprocinfo * procinfo unit contains tprocinfo
* cginfo renamed to cgbase * cginfo renamed to cgbase
* moved cgmessage to verbose * moved cgmessage to verbose

View File

@ -93,12 +93,12 @@ implementation
if (location.loc = LOC_CREGISTER) then if (location.loc = LOC_CREGISTER) then
begin begin
location.loc := LOC_REGISTER; location.loc := LOC_REGISTER;
location.register := rg.getregisterint(exprasmlist,size); location.register := cg.getintregister(exprasmlist,size);
resultreg := location.register; resultreg := location.register;
end; end;
if (nodetype = modn) then if (nodetype = modn) then
begin begin
resultreg := rg.getregisterint(exprasmlist,size); resultreg := cg.getintregister(exprasmlist,size);
end; end;
if (nodetype = divn) and if (nodetype = divn) and
@ -138,18 +138,18 @@ implementation
begin begin
exprasmlist.concat(taicpu.op_reg_reg_reg(A_MULLW,resultreg, exprasmlist.concat(taicpu.op_reg_reg_reg(A_MULLW,resultreg,
divider,resultreg)); divider,resultreg));
rg.ungetregisterint(exprasmlist,divider); cg.ungetregister(exprasmlist,divider);
exprasmlist.concat(taicpu.op_reg_reg_reg(A_SUB,location.register, exprasmlist.concat(taicpu.op_reg_reg_reg(A_SUB,location.register,
numerator,resultreg)); numerator,resultreg));
rg.ungetregisterint(exprasmlist,resultreg); cg.ungetregister(exprasmlist,resultreg);
resultreg := location.register; resultreg := location.register;
end end
else else
rg.ungetregisterint(exprasmlist,divider); cg.ungetregister(exprasmlist,divider);
end; end;
{ free used registers } { free used registers }
if numerator <> resultreg then if numerator <> resultreg then
rg.ungetregisterint(exprasmlist,numerator); cg.ungetregister(exprasmlist,numerator);
{ set result location } { set result location }
location.loc:=LOC_REGISTER; location.loc:=LOC_REGISTER;
location.register:=resultreg; location.register:=resultreg;
@ -190,8 +190,8 @@ implementation
if (location.loc = LOC_CREGISTER) then if (location.loc = LOC_CREGISTER) then
begin begin
location.loc := LOC_REGISTER; location.loc := LOC_REGISTER;
location.registerhigh := rg.getregisterint(exprasmlist,OS_32); location.registerhigh := cg.getintregister(exprasmlist,OS_32);
location.registerlow := rg.getregisterint(exprasmlist,OS_32); location.registerlow := cg.getintregister(exprasmlist,OS_32);
end; end;
if (right.nodetype = ordconstn) then if (right.nodetype = ordconstn) then
begin begin
@ -261,7 +261,7 @@ implementation
location.registerlow := resultreg; location.registerlow := resultreg;
end; end;
rg.getexplicitregisterint(exprasmlist,NR_R0); cg.getexplicitregister(exprasmlist,NR_R0);
exprasmlist.concat(taicpu.op_reg_reg_const(A_SUBFIC, exprasmlist.concat(taicpu.op_reg_reg_const(A_SUBFIC,
NR_R0,hregister1,32)); NR_R0,hregister1,32));
exprasmlist.concat(taicpu.op_reg_reg_reg(asmop1, exprasmlist.concat(taicpu.op_reg_reg_reg(asmop1,
@ -278,7 +278,7 @@ implementation
location.registerhigh,location.registerhigh,NR_R0)); location.registerhigh,location.registerhigh,NR_R0));
exprasmlist.concat(taicpu.op_reg_reg_reg(asmop1, exprasmlist.concat(taicpu.op_reg_reg_reg(asmop1,
location.registerlow,hregisterlow,hregister1)); location.registerlow,hregisterlow,hregister1));
rg.ungetregisterint(exprasmlist,NR_R0); cg.ungetregister(exprasmlist,NR_R0);
if nodetype = shrn then if nodetype = shrn then
begin begin
@ -287,7 +287,7 @@ implementation
location.registerlow := resultreg; location.registerlow := resultreg;
end; end;
rg.ungetregisterint(exprasmlist,hregister1); cg.ungetregister(exprasmlist,hregister1);
end end
end end
else else
@ -300,7 +300,7 @@ implementation
if (location.loc = LOC_CREGISTER) then if (location.loc = LOC_CREGISTER) then
begin begin
location.loc := LOC_REGISTER; location.loc := LOC_REGISTER;
resultreg := rg.getregisterint(exprasmlist,OS_32); resultreg := cg.getintregister(exprasmlist,OS_32);
location.register := resultreg; location.register := resultreg;
end; end;
@ -323,7 +323,7 @@ implementation
cg.a_op_reg_reg_reg(exprasmlist,op,OS_32,hregister2, cg.a_op_reg_reg_reg(exprasmlist,op,OS_32,hregister2,
hregister1,resultreg); hregister1,resultreg);
rg.ungetregisterint(exprasmlist,hregister2); cg.ungetregister(exprasmlist,hregister2);
end; end;
end; end;
end; end;
@ -347,8 +347,8 @@ implementation
location_copy(location,left.location); location_copy(location,left.location);
if (location.loc = LOC_CREGISTER) then if (location.loc = LOC_CREGISTER) then
begin begin
location.registerlow := rg.getregisterint(exprasmlist,OS_INT); location.registerlow := cg.getintregister(exprasmlist,OS_INT);
location.registerhigh := rg.getregisterint(exprasmlist,OS_INT); location.registerhigh := cg.getintregister(exprasmlist,OS_INT);
location.loc := LOC_REGISTER; location.loc := LOC_REGISTER;
end; end;
exprasmlist.concat(taicpu.op_reg_reg_const(A_SUBFIC, exprasmlist.concat(taicpu.op_reg_reg_const(A_SUBFIC,
@ -374,15 +374,15 @@ implementation
begin begin
src1 := left.location.register; src1 := left.location.register;
if left.location.loc = LOC_CREGISTER then if left.location.loc = LOC_CREGISTER then
location.register := rg.getregisterint(exprasmlist,OS_INT) location.register := cg.getintregister(exprasmlist,OS_INT)
else else
location.register := rg.getregisterfpu(exprasmlist,location.size); location.register := cg.getfpuregister(exprasmlist,location.size);
end; end;
LOC_REFERENCE,LOC_CREFERENCE: LOC_REFERENCE,LOC_CREFERENCE:
begin begin
if (left.resulttype.def.deftype=floatdef) then if (left.resulttype.def.deftype=floatdef) then
begin begin
src1 := rg.getregisterfpu(exprasmlist,def_cgsize(left.resulttype.def)); src1 := cg.getfpuregister(exprasmlist,def_cgsize(left.resulttype.def));
location.register := src1; location.register := src1;
cg.a_loadfpu_ref_reg(exprasmlist, cg.a_loadfpu_ref_reg(exprasmlist,
def_cgsize(left.resulttype.def), def_cgsize(left.resulttype.def),
@ -390,7 +390,7 @@ implementation
end end
else else
begin begin
src1 := rg.getregisterint(exprasmlist,OS_32); src1 := cg.getintregister(exprasmlist,OS_32);
location.register:= src1; location.register:= src1;
cg.a_load_ref_reg(exprasmlist,OS_32,OS_32, cg.a_load_ref_reg(exprasmlist,OS_32,OS_32,
left.location.reference,src1); left.location.reference,src1);
@ -493,7 +493,7 @@ implementation
location_force_reg(exprasmlist,left.location,def_cgsize(left.resulttype.def),false); location_force_reg(exprasmlist,left.location,def_cgsize(left.resulttype.def),false);
location_copy(location,left.location); location_copy(location,left.location);
if location.loc=LOC_CREGISTER then if location.loc=LOC_CREGISTER then
location.register := rg.getregisterint(exprasmlist,OS_INT); location.register := cg.getintregister(exprasmlist,OS_INT);
{ perform the NOT operation } { perform the NOT operation }
exprasmlist.concat(taicpu.op_reg_reg(A_NOT,location.register, exprasmlist.concat(taicpu.op_reg_reg(A_NOT,location.register,
left.location.register)); left.location.register));
@ -508,7 +508,10 @@ begin
end. end.
{ {
$Log$ $Log$
Revision 1.34 2003-10-01 20:34:49 peter Revision 1.35 2003-10-17 01:22:08 florian
* compilation of the powerpc compiler fixed
Revision 1.34 2003/10/01 20:34:49 peter
* procinfo unit contains tprocinfo * procinfo unit contains tprocinfo
* cginfo renamed to cgbase * cginfo renamed to cgbase
* moved cgmessage to verbose * moved cgmessage to verbose

View File

@ -78,11 +78,11 @@ implementation
hregister,value)) hregister,value))
else else
begin begin
tmpreg := rg.getregisterint(exprasmlist,OS_INT); tmpreg := cg.getintregister(exprasmlist,OS_INT);
cg.a_load_const_reg(exprasmlist,OS_INT,aword(value),tmpreg); cg.a_load_const_reg(exprasmlist,OS_INT,aword(value),tmpreg);
exprasmlist.concat(taicpu.op_reg_reg_reg(A_ADD_,hregister, exprasmlist.concat(taicpu.op_reg_reg_reg(A_ADD_,hregister,
hregister,tmpreg)); hregister,tmpreg));
rg.ungetregisterint(exprasmlist,tmpreg); cg.ungetregister(exprasmlist,tmpreg);
end; end;
end; end;
@ -158,7 +158,10 @@ begin
end. end.
{ {
$Log$ $Log$
Revision 1.11 2003-10-01 20:34:49 peter Revision 1.12 2003-10-17 01:22:08 florian
* compilation of the powerpc compiler fixed
Revision 1.11 2003/10/01 20:34:49 peter
* procinfo unit contains tprocinfo * procinfo unit contains tprocinfo
* cginfo renamed to cgbase * cginfo renamed to cgbase
* moved cgmessage to verbose * moved cgmessage to verbose