* powerpc compiles again

This commit is contained in:
peter 2004-06-17 16:55:46 +00:00
parent 7f9b703d64
commit 54cb433625
12 changed files with 490 additions and 372 deletions

View File

@ -239,7 +239,7 @@ unit cg64f32;
begin
case l.loc of
LOC_REGISTER,LOC_CREGISTER:
a_load64_reg_ref(list,l.reg64,ref);
a_load64_reg_ref(list,l.register64,ref);
LOC_CONSTANT :
a_load64_const_ref(list,l.value64,ref);
else
@ -255,7 +255,7 @@ unit cg64f32;
LOC_REFERENCE, LOC_CREFERENCE:
a_load64_const_ref(list,value,l.reference);
LOC_REGISTER,LOC_CREGISTER:
a_load64_const_reg(list,value,l.reg64);
a_load64_const_reg(list,value,l.register64);
else
internalerror(200112293);
end;
@ -753,7 +753,10 @@ unit cg64f32;
end.
{
$Log$
Revision 1.58 2004-06-16 20:07:07 florian
Revision 1.59 2004-06-17 16:55:46 peter
* powerpc compiles again
Revision 1.58 2004/06/16 20:07:07 florian
* dwarf branch merged
Revision 1.57.2.5 2004/06/13 10:51:16 florian

View File

@ -27,8 +27,9 @@ unit aasmcpu;
interface
uses
cclasses,aasmtai,
aasmbase,globals,verbose,
cclasses,
globtype,globals,verbose,
aasmbase,aasmtai,
cpubase,cpuinfo,cgbase;
const
@ -39,54 +40,52 @@ uses
type
taicpu = class(taicpu_abstract)
taicpu = class(tai_cpu_abstract)
constructor op_none(op : tasmop);
constructor op_reg(op : tasmop;_op1 : tregister);
constructor op_const(op : tasmop;_op1 : longint);
constructor op_const(op : tasmop;_op1 : aint);
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_const_reg(op:tasmop; _op1: longint; _op2: tregister);
constructor op_reg_const(op:tasmop; _op1: tregister; _op2: aint);
constructor op_const_reg(op:tasmop; _op1: aint; _op2: tregister);
constructor op_const_const(op : tasmop;_op1,_op2 : longint);
constructor op_const_const(op : tasmop;_op1,_op2 : aint);
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_const(op : tasmop;_op1,_op2 : tregister; _op3: aint);
constructor op_reg_reg_sym_ofs(op : tasmop;_op1,_op2 : tregister; _op3: tasmsymbol;_op3ofs: aint);
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_const_const_const(op : tasmop;_op1 : longint;_op2 : longint;_op3 : longint);
constructor op_const_reg_reg(op : tasmop;_op1 : aint;_op2, _op3 : tregister);
constructor op_const_reg_const(op : tasmop;_op1 : aint;_op2 : tregister;_op3 : aint);
constructor op_const_const_const(op : tasmop;_op1 : aint;_op2 : aint;_op3 : aint);
constructor op_reg_reg_reg_reg(op : tasmop;_op1,_op2,_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: aint);
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_reg_const_const(op : tasmop;_op1,_op2,_op3 : tregister;_op4,_op5 : aint);
constructor op_reg_reg_const_const_const(op : tasmop;_op1,_op2 : tregister;_op3,_op4,_op5 : aint);
{ 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_const_const_sym(op : tasmop;_op1,_op2 : aint;_op3: tasmsymbol);
constructor op_sym(op : tasmop;_op1 : tasmsymbol);
constructor op_sym_ofs(op : tasmop;_op1 : tasmsymbol;_op1ofs:longint);
constructor op_reg_sym_ofs(op : tasmop;_op1 : tregister;_op2:tasmsymbol;_op2ofs : longint);
constructor op_sym_ofs_ref(op : tasmop;_op1 : tasmsymbol;_op1ofs:longint;const _op2 : treference);
constructor op_sym_ofs(op : tasmop;_op1 : tasmsymbol;_op1ofs:aint);
constructor op_reg_sym_ofs(op : tasmop;_op1 : tregister;_op2:tasmsymbol;_op2ofs : aint);
constructor op_sym_ofs_ref(op : tasmop;_op1 : tasmsymbol;_op1ofs:aint;const _op2 : treference);
procedure loadbool(opidx:longint;_b:boolean);
procedure loadbool(opidx:aint;_b:boolean);
function is_same_reg_move(regtype: Tregistertype):boolean; override;
{ register spilling code }
function spilling_get_operation_type(opnr: longint): topertype;override;
function spilling_create_load(const ref:treference;r:tregister): tai;override;
function spilling_create_store(r:tregister; const ref:treference): tai;override;
function spilling_get_operation_type(opnr: aint): topertype;override;
end;
tai_align = class(tai_align_abstract)
@ -97,6 +96,9 @@ uses
procedure DoneAsm;
function spilling_create_load(const ref:treference;r:tregister): tai;
function spilling_create_store(r:tregister; const ref:treference): tai;
implementation
uses cutils,rgobj;
@ -105,7 +107,7 @@ uses cutils,rgobj;
taicpu Constructors
*****************************************************************************}
procedure taicpu.loadbool(opidx:longint;_b:boolean);
procedure taicpu.loadbool(opidx:aint;_b:boolean);
begin
if opidx>=ops then
ops:=opidx+1;
@ -133,11 +135,11 @@ uses cutils,rgobj;
end;
constructor taicpu.op_const(op : tasmop;_op1 : longint);
constructor taicpu.op_const(op : tasmop;_op1 : aint);
begin
inherited create(op);
ops:=1;
loadconst(0,aword(_op1));
loadconst(0,_op1);
end;
@ -149,19 +151,19 @@ uses cutils,rgobj;
loadreg(1,_op2);
end;
constructor taicpu.op_reg_const(op:tasmop; _op1: tregister; _op2: longint);
constructor taicpu.op_reg_const(op:tasmop; _op1: tregister; _op2: aint);
begin
inherited create(op);
ops:=2;
loadreg(0,_op1);
loadconst(1,aword(_op2));
loadconst(1,_op2);
end;
constructor taicpu.op_const_reg(op:tasmop; _op1: longint; _op2: tregister);
constructor taicpu.op_const_reg(op:tasmop; _op1: aint; _op2: tregister);
begin
inherited create(op);
ops:=2;
loadconst(0,aword(_op1));
loadconst(0,_op1);
loadreg(1,_op2);
end;
@ -175,12 +177,12 @@ uses cutils,rgobj;
end;
constructor taicpu.op_const_const(op : tasmop;_op1,_op2 : longint);
constructor taicpu.op_const_const(op : tasmop;_op1,_op2 : aint);
begin
inherited create(op);
ops:=2;
loadconst(0,aword(_op1));
loadconst(1,aword(_op2));
loadconst(0,_op1);
loadconst(1,_op2);
end;
@ -193,16 +195,16 @@ uses cutils,rgobj;
loadreg(2,_op3);
end;
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: aint);
begin
inherited create(op);
ops:=3;
loadreg(0,_op1);
loadreg(1,_op2);
loadconst(2,aword(_op3));
loadconst(2,_op3);
end;
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: aint);
begin
inherited create(op);
ops:=3;
@ -220,32 +222,32 @@ uses cutils,rgobj;
loadref(2,_op3);
end;
constructor taicpu.op_const_reg_reg(op : tasmop;_op1 : longint;_op2, _op3 : tregister);
constructor taicpu.op_const_reg_reg(op : tasmop;_op1 : aint;_op2, _op3 : tregister);
begin
inherited create(op);
ops:=3;
loadconst(0,aword(_op1));
loadconst(0,_op1);
loadreg(1,_op2);
loadreg(2,_op3);
end;
constructor taicpu.op_const_reg_const(op : tasmop;_op1 : longint;_op2 : tregister;_op3 : longint);
constructor taicpu.op_const_reg_const(op : tasmop;_op1 : aint;_op2 : tregister;_op3 : aint);
begin
inherited create(op);
ops:=3;
loadconst(0,aword(_op1));
loadconst(0,_op1);
loadreg(1,_op2);
loadconst(2,aword(_op3));
loadconst(2,_op3);
end;
constructor taicpu.op_const_const_const(op : tasmop;_op1 : longint;_op2 : longint;_op3 : longint);
constructor taicpu.op_const_const_const(op : tasmop;_op1 : aint;_op2 : aint;_op3 : aint);
begin
inherited create(op);
ops:=3;
loadconst(0,aword(_op1));
loadconst(1,aword(_op2));
loadconst(2,aword(_op3));
loadconst(0,_op1);
loadconst(1,_op2);
loadconst(2,_op3);
end;
@ -269,7 +271,7 @@ uses cutils,rgobj;
loadreg(3,_op4);
end;
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: aint);
begin
inherited create(op);
ops:=4;
@ -280,7 +282,7 @@ uses cutils,rgobj;
end;
constructor taicpu.op_reg_reg_reg_const_const(op : tasmop;_op1,_op2,_op3 : tregister;_op4,_op5 : Longint);
constructor taicpu.op_reg_reg_reg_const_const(op : tasmop;_op1,_op2,_op3 : tregister;_op4,_op5 : aint);
begin
inherited create(op);
ops:=5;
@ -291,15 +293,15 @@ uses cutils,rgobj;
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 : aint);
begin
inherited create(op);
ops:=5;
loadreg(0,_op1);
loadreg(1,_op2);
loadconst(2,aword(_op3));
loadconst(3,cardinal(_op4));
loadconst(4,cardinal(_op5));
loadconst(2,_op3);
loadconst(3,_op4);
loadconst(4,_op5);
end;
constructor taicpu.op_cond_sym(op : tasmop;cond:TAsmCond;_op1 : tasmsymbol);
@ -310,12 +312,12 @@ uses cutils,rgobj;
loadsymbol(0,_op1,0);
end;
constructor taicpu.op_const_const_sym(op : tasmop;_op1,_op2 : longint; _op3: tasmsymbol);
constructor taicpu.op_const_const_sym(op : tasmop;_op1,_op2 : aint; _op3: tasmsymbol);
begin
inherited create(op);
ops:=3;
loadconst(0,aword(_op1));
loadconst(1,aword(_op2));
loadconst(0,_op1);
loadconst(1,_op2);
loadsymbol(2,_op3,0);
end;
@ -328,7 +330,7 @@ uses cutils,rgobj;
end;
constructor taicpu.op_sym_ofs(op : tasmop;_op1 : tasmsymbol;_op1ofs:longint);
constructor taicpu.op_sym_ofs(op : tasmop;_op1 : tasmsymbol;_op1ofs:aint);
begin
inherited create(op);
ops:=1;
@ -336,7 +338,7 @@ uses cutils,rgobj;
end;
constructor taicpu.op_reg_sym_ofs(op : tasmop;_op1 : tregister;_op2:tasmsymbol;_op2ofs : longint);
constructor taicpu.op_reg_sym_ofs(op : tasmop;_op1 : tregister;_op2:tasmsymbol;_op2ofs : aint);
begin
inherited create(op);
ops:=2;
@ -345,7 +347,7 @@ uses cutils,rgobj;
end;
constructor taicpu.op_sym_ofs_ref(op : tasmop;_op1 : tasmsymbol;_op1ofs:longint;const _op2 : treference);
constructor taicpu.op_sym_ofs_ref(op : tasmop;_op1 : tasmsymbol;_op1ofs:aint;const _op2 : treference);
begin
inherited create(op);
ops:=2;
@ -368,7 +370,7 @@ uses cutils,rgobj;
end;
function taicpu.spilling_get_operation_type(opnr: longint): topertype;
function taicpu.spilling_get_operation_type(opnr: aint): topertype;
begin
result := operand_read;
case opcode of
@ -384,13 +386,13 @@ uses cutils,rgobj;
end;
function taicpu.spilling_create_load(const ref:treference;r:tregister): tai;
function spilling_create_load(const ref:treference;r:tregister): tai;
begin
result:=taicpu.op_reg_ref(A_LWZ,r,ref);
end;
function taicpu.spilling_create_store(r:tregister; const ref:treference): tai;
function spilling_create_store(r:tregister; const ref:treference): tai;
begin
result:=taicpu.op_reg_ref(A_STW,r,ref);
end;
@ -408,7 +410,10 @@ uses cutils,rgobj;
end.
{
$Log$
Revision 1.25 2004-02-08 23:10:21 jonas
Revision 1.26 2004-06-17 16:55:46 peter
* powerpc compiles again
Revision 1.25 2004/02/08 23:10:21 jonas
* taicpu.is_same_reg_move() now gets a regtype parameter so it only
removes moves of that particular register type. This is necessary so
we don't remove the live_start instruction of a register before it

View File

@ -73,16 +73,9 @@ unit agppcgas;
asmbin : 'as';
asmcmd : '-o $OBJ $ASM';
supported_target : system_any;
outputbinary: false;
allowdirect : true;
needar : true;
labelprefix_only_inside_procedure : false;
flags : [af_allowdirect,af_needar,af_smartlink_sections];
labelprefix : '.L';
comment : '# ';
secnames : ('',
'.text','.data','.text',
'','','','','','',
'.stab','.stabstr','COMMON')
);
@ -94,16 +87,9 @@ unit agppcgas;
asmbin : 'as';
asmcmd : '-o $OBJ $ASM';
supported_target : system_any;
outputbinary: false;
allowdirect : true;
needar : true;
labelprefix_only_inside_procedure : false;
flags : [af_allowdirect,af_needar,af_smartlink_sections];
labelprefix : 'L';
comment : '# ';
secnames : ('',
'.text','.data','.text',
'','','','','','',
'.stab','.stabstr','COMMON')
);
@ -379,7 +365,10 @@ begin
end.
{
$Log$
Revision 1.42 2004-03-02 17:32:12 florian
Revision 1.43 2004-06-17 16:55:46 peter
* powerpc compiles again
Revision 1.42 2004/03/02 17:32:12 florian
* make cycle fixed
+ pic support for darwin
+ support of importing vars from shared libs on darwin implemented

View File

@ -72,7 +72,10 @@ interface
const_storage_class = '[RW]';
secnames : array[TAsmSectionType] of string[10] = ('',
'csect','csect [TC]','csect [TC]', {TODO: Perhaps use other section types.}
'','','','','','','','','','','','',''
);
{$ifdef GDB}
var
@ -624,7 +627,7 @@ var
end;
var
LasTSec : TSection;
LasTSec : TAsmSectionType;
lastfileinfo : tfileposinfo;
infile,
lastinfile : tinputfile;
@ -834,15 +837,15 @@ var
begin
{if LasTSec<>sec_none then
AsmWriteLn('_'+target_asm.secnames[LasTSec]+#9#9'ENDS');}
if tai_section(hp).sec<>sec_none then
if tai_section(hp).sectype<>sec_none then
begin
AsmLn;
AsmWriteLn(#9+target_asm.secnames[tai_section(hp).sec]);
AsmWriteLn(#9+secnames[tai_section(hp).sectype]);
{$ifdef GDB}
lastfileinfo.line:=-1;
{$endif GDB}
end;
LasTSec:=tai_section(hp).sec;
LasTSec:=tai_section(hp).sectype;
end;
ait_align:
begin
@ -869,64 +872,49 @@ var
{TODO: ? PadTabs(s,#0) }
end;
end;
ait_const_32bit,
ait_const_8bit,
ait_const_16bit :
begin
AsmWrite(ait_const2str[hp.typ]+tostr(tai_const(hp).value));
consttyp:=hp.typ;
l:=0;
repeat
found:=(not (tai(hp.next)=nil)) and (tai(hp.next).typ=consttyp);
if found then
begin
hp:=tai(hp.next);
s:=','+tostr(tai_const(hp).value);
AsmWrite(s);
inc(l,length(s));
end;
until (not found) or (l>line_length);
AsmLn;
end;
ait_const_symbol:
begin
s:= tai_const_symbol(hp).sym.name;
ReplaceForbiddenChars(s);
ait_const_uleb128bit,
ait_const_sleb128bit,
ait_const_128bit,
ait_const_64bit,
ait_const_32bit,
ait_const_16bit,
ait_const_8bit,
ait_const_rva_symbol,
ait_const_indirect_symbol :
begin
AsmWrite(ait_const2str[hp.typ]);
consttyp:=hp.typ;
l:=0;
repeat
if assigned(tai_const(hp).sym) then
begin
if use_PR then
AsmWrite('.');
if assigned(tai_const(hp).endsym) then
s:=tai_const(hp).endsym.name+'-'+tai_const(hp).sym.name
else
s:=tai_const(hp).sym.name;
ReplaceForbiddenChars(s);
if tai_const(hp).value<>0 then
InternalError(2002110101);
if use_PR then
AsmWriteLn('[PR]')
else
AsmWriteLn('[DS]');
end
else
s:=tostr(tai_const(hp).value);
AsmWrite(s);
if (l>line_length) or
(hp.next=nil) or
(tai(hp.next).typ<>consttyp) then
break;
hp:=tai(hp.next);
AsmWrite(',');
until false;
AsmLn;
end;
AsmWrite(#9'dc.l'#9);
if tai_const_symbol(hp).sym.typ = AT_FUNCTION then
begin
if use_PR then
AsmWrite('.');
AsmWrite(s);
if use_PR then
AsmWriteLn('[PR]')
else
AsmWriteLn('[DS]')
end
else
begin
AsmWrite(s);
if not macos_direct_globals then
AsmWriteLn(const_storage_class);
end;
(* TODO: the following might need to be included. Temporaily we
generate an error
if tai_const_symbol(hp).offset>0 then
AsmWrite('+'+tostr(tai_const_symbol(hp).offset))
else if tai_const_symbol(hp).offset<0 then
AsmWrite(tostr(tai_const_symbol(hp).offset));
*)
if tai_const_symbol(hp).offset <> 0 then
InternalError(2002110101);
AsmLn;
end;
ait_real_32bit:
AsmWriteLn(#9'dc.l'#9'"'+single2str(tai_real_32bit(hp).value)+'"');
ait_real_64bit:
@ -1094,7 +1082,7 @@ var
ait_stab_function_name: ;
{$endif GDB}
ait_cut :
ait_cutobject :
begin
{ only reset buffer if nothing has changed }
if AsmSize=AsmStartSize then
@ -1109,21 +1097,21 @@ var
AsmWriteLn(#9'end');
AsmClose;
DoAssemble;
AsmCreate(tai_cut(hp).place);
AsmCreate(tai_cutobject(hp).place);
end;
{ avoid empty files }
while assigned(hp.next) and (tai(hp.next).typ in [ait_cut,ait_section,ait_comment]) do
while assigned(hp.next) and (tai(hp.next).typ in [ait_cutobject,ait_section,ait_comment]) do
begin
if tai(hp.next).typ=ait_section then
begin
lasTSec:=tai_section(hp.next).sec;
lasTSec:=tai_section(hp.next).sectype;
end;
hp:=tai(hp.next);
end;
WriteAsmFileHeader;
if lasTSec<>sec_none then
AsmWriteLn(#9+target_asm.secnames[lasTSec]);
AsmWriteLn(#9+secnames[lasTSec]);
{ AsmWriteLn('_'+target_asm.secnames[lasTSec]+#9#9+
'SEGMENT'#9'PARA PUBLIC USE32 '''+
target_asm.secnames[lasTSec]+'''');
@ -1345,16 +1333,9 @@ var
asmbin : 'PPCAsm';
asmcmd : '-case on $ASM -o $OBJ';
supported_target : system_any; { what should I write here ?? }
outputbinary: false;
allowdirect : true;
needar : true;
labelprefix_only_inside_procedure : true;
flags : [af_allowdirect,af_needar,af_smartlink_sections,af_labelprefix_only_inside_procedure];
labelprefix : '@';
comment : '; ';
secnames : ('',
'csect','csect [TC]','csect [TC]', {TODO: Perhaps use other section types.}
'','','','','','',
'','','')
);
initialization
@ -1362,7 +1343,10 @@ initialization
end.
{
$Log$
Revision 1.34 2004-03-17 12:03:31 olle
Revision 1.35 2004-06-17 16:55:46 peter
* powerpc compiles again
Revision 1.34 2004/03/17 12:03:31 olle
* bugfix for multiline string constants
Revision 1.33 2004/03/02 00:57:01 olle

View File

@ -27,7 +27,7 @@ unit cgcpu;
interface
uses
symtype,
globtype,symtype,
cgbase,cgobj,
aasmbase,aasmcpu,aasmtai,
cpubase,cpuinfo,node,cg64f32,rgcpu;
@ -44,7 +44,7 @@ unit cgcpu;
{ left to right), this allows to move the parameter to }
{ register, if the cpu supports register calling }
{ conventions }
procedure a_param_const(list : taasmoutput;size : tcgsize;a : aword;const locpara : tparalocation);override;
procedure a_param_const(list : taasmoutput;size : tcgsize;a : aint;const locpara : tparalocation);override;
procedure a_param_ref(list : taasmoutput;size : tcgsize;const r : treference;const locpara : tparalocation);override;
procedure a_paramaddr_ref(list : taasmoutput;const r : treference;const locpara : tparalocation);override;
@ -52,16 +52,16 @@ unit cgcpu;
procedure a_call_name(list : taasmoutput;const s : string);override;
procedure a_call_reg(list : taasmoutput;reg: tregister); override;
procedure a_op_const_reg(list : taasmoutput; Op: TOpCG; size: TCGSize; a: AWord; reg: TRegister); override;
procedure a_op_const_reg(list : taasmoutput; Op: TOpCG; size: TCGSize; a: aint; reg: TRegister); override;
procedure a_op_reg_reg(list : taasmoutput; Op: TOpCG; size: TCGSize; src, dst: TRegister); override;
procedure a_op_const_reg_reg(list: taasmoutput; op: TOpCg;
size: tcgsize; a: aword; src, dst: tregister); override;
size: tcgsize; a: aint; src, dst: tregister); override;
procedure a_op_reg_reg_reg(list: taasmoutput; op: TOpCg;
size: tcgsize; src1, src2, dst: tregister); override;
{ move instructions }
procedure a_load_const_reg(list : taasmoutput; size: tcgsize; a : aword;reg : tregister);override;
procedure a_load_const_reg(list : taasmoutput; size: tcgsize; a : aint;reg : tregister);override;
procedure a_load_reg_ref(list : taasmoutput; fromsize, tosize: tcgsize; reg : tregister;const ref : treference);override;
procedure a_load_ref_reg(list : taasmoutput; fromsize, tosize : tcgsize;const Ref : treference;reg : tregister);override;
procedure a_load_reg_reg(list : taasmoutput; fromsize, tosize : tcgsize;reg1,reg2 : tregister);override;
@ -72,7 +72,7 @@ unit cgcpu;
procedure a_loadfpu_reg_ref(list: taasmoutput; size: tcgsize; reg: tregister; const ref: treference); override;
{ comparison operations }
procedure a_cmp_const_reg_label(list : taasmoutput;size : tcgsize;cmp_op : topcmp;a : aword;reg : tregister;
procedure a_cmp_const_reg_label(list : taasmoutput;size : tcgsize;cmp_op : topcmp;a : aint;reg : tregister;
l : tasmlabel);override;
procedure a_cmp_reg_reg_label(list : taasmoutput;size : tcgsize;cmp_op : topcmp;reg1,reg2 : tregister;l : tasmlabel); override;
@ -82,18 +82,17 @@ unit cgcpu;
procedure g_flags2reg(list: taasmoutput; size: TCgSize; const f: TResFlags; reg: TRegister); override;
procedure g_stackframe_entry(list : taasmoutput;localsize : longint);override;
procedure g_return_from_proc(list : taasmoutput;parasize : aword); override;
procedure g_restore_frame_pointer(list : taasmoutput);override;
procedure g_proc_entry(list : taasmoutput;localsize : longint;nostackframe:boolean);override;
procedure g_proc_exit(list : taasmoutput;parasize : longint;nostackframe:boolean); override;
procedure a_loadaddr_ref_reg(list : taasmoutput;const ref : treference;r : tregister);override;
procedure g_concatcopy(list : taasmoutput;const source,dest : treference;len : aword; delsource,loadref : boolean);override;
procedure g_concatcopy(list : taasmoutput;const source,dest : treference;len : aint; delsource,loadref : boolean);override;
procedure g_overflowcheck(list: taasmoutput; const l: tlocation; def: tdef); override;
{ find out whether a is of the form 11..00..11b or 00..11...00. If }
{ that's the case, we can use rlwinm to do an AND operation }
function get_rlwi_const(a: aword; var l1, l2: longint): boolean;
function get_rlwi_const(a: aint; var l1, l2: longint): boolean;
procedure g_save_standard_registers(list:Taasmoutput);override;
procedure g_restore_standard_registers(list:Taasmoutput);override;
@ -107,7 +106,7 @@ unit cgcpu;
(* NOT IN USE: *)
procedure g_stackframe_entry_mac(list : taasmoutput;localsize : longint);
(* NOT IN USE: *)
procedure g_return_from_proc_mac(list : taasmoutput;parasize : aword);
procedure g_return_from_proc_mac(list : taasmoutput;parasize : aint);
{ Make sure ref is a valid reference for the PowerPC and sets the }
@ -133,14 +132,14 @@ unit cgcpu;
function save_regs(list : taasmoutput):longint;
procedure restore_regs(list : taasmoutput);
function get_darwin_call_stub(const s: string): tasmsymbol;
end;
tcg64fppc = class(tcg64f32)
procedure a_op64_reg_reg(list : taasmoutput;op:TOpCG;regsrc,regdst : tregister64);override;
procedure a_op64_const_reg(list : taasmoutput;op:TOpCG;value : qword;reg : tregister64);override;
procedure a_op64_const_reg_reg(list: taasmoutput;op:TOpCG;value : qword;regsrc,regdst : tregister64);override;
procedure a_op64_const_reg(list : taasmoutput;op:TOpCG;value : int64;reg : tregister64);override;
procedure a_op64_const_reg_reg(list: taasmoutput;op:TOpCG;value : int64;regsrc,regdst : tregister64);override;
procedure a_op64_reg_reg_reg(list: taasmoutput;op:TOpCG;regsrc1,regsrc2,regdst : tregister64);override;
end;
@ -159,7 +158,7 @@ const
implementation
uses
globtype,globals,verbose,systems,cutils,
globals,verbose,systems,cutils,
symconst,symdef,symsym,
rgobj,tgobj,cpupi,procinfo,paramgr,
cgutils;
@ -235,7 +234,7 @@ const
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 : aint;const locpara : tparalocation);
var
ref: treference;
begin
@ -332,7 +331,7 @@ const
if not(assigned(importssection)) then
importssection:=TAAsmoutput.create;
importsSection.concat(Tai_section.Create(sec_data));
importsSection.concat(Tai_section.Create(sec_data,'',0));
importsSection.concat(Tai_direct.create(strpnew('.section __TEXT,__symbol_stub1,symbol_stubs,pure_instructions,16')));
importsSection.concat(Tai_align.Create(4));
result := objectlibrary.newasmsymbol(stubname,AB_EXTERNAL,AT_FUNCTION);
@ -351,11 +350,11 @@ const
{$else powerpc}
internalerror(2004010502);
{$endif powerpc}
importsSection.concat(Tai_section.Create(sec_data));
importsSection.concat(Tai_section.Create(sec_data,'',0));
importsSection.concat(Tai_direct.create(strpnew('.lazy_symbol_pointer')));
importsSection.concat(Tai_symbol.Create(l1,0));
importsSection.concat(Tai_direct.create(strpnew((#9+'.indirect_symbol ')+s)));
importsSection.concat(tai_const_symbol.createname(strpnew('dyld_stub_binding_helper'),AT_FUNCTION,0));
importsSection.concat(tai_const.createname(strpnew('dyld_stub_binding_helper'),AT_FUNCTION,0));
end;
@ -417,7 +416,7 @@ const
{********************** load instructions ********************}
procedure tcgppc.a_load_const_reg(list : taasmoutput; size: TCGSize; a : aword; reg : TRegister);
procedure tcgppc.a_load_const_reg(list : taasmoutput; size: TCGSize; a : aint; reg : TRegister);
begin
if not(size in [OS_8,OS_S8,OS_16,OS_S16,OS_32,OS_S32]) then
@ -602,7 +601,7 @@ const
end;
procedure tcgppc.a_op_const_reg(list : taasmoutput; Op: TOpCG; size: TCGSize; a: AWord; reg: TRegister);
procedure tcgppc.a_op_const_reg(list : taasmoutput; Op: TOpCG; size: TCGSize; a: aint; reg: TRegister);
begin
a_op_const_reg_reg(list,op,size,a,reg,reg);
@ -617,7 +616,7 @@ const
procedure tcgppc.a_op_const_reg_reg(list: taasmoutput; op: TOpCg;
size: tcgsize; a: aword; src, dst: tregister);
size: tcgsize; a: aint; src, dst: tregister);
var
l1,l2: longint;
oplo, ophi: tasmop;
@ -634,15 +633,7 @@ const
begin
if op = OP_SUB then
begin
{$ifopt q+}
{$q-}
{$define overflowon}
{$endif}
a_op_const_reg_reg(list,OP_ADD,size,aword(-longint(a)),src,dst);
{$ifdef overflowon}
{$q+}
{$undef overflowon}
{$endif}
a_op_const_reg_reg(list,OP_ADD,size,-a,src,dst);
exit;
end;
ophi := TOpCG2AsmOpConstHi[op];
@ -658,7 +649,7 @@ const
a_load_reg_reg(list,size,size,src,dst);
exit;
end
else if (a = high(aword)) then
else if (a = high(aint)) then
begin
case op of
OP_OR:
@ -822,7 +813,7 @@ const
{*************** compare instructructions ****************}
procedure tcgppc.a_cmp_const_reg_label(list : taasmoutput;size : tcgsize;cmp_op : topcmp;a : aword;reg : tregister;
procedure tcgppc.a_cmp_const_reg_label(list : taasmoutput;size : tcgsize;cmp_op : topcmp;a : aint;reg : tregister;
l : tasmlabel);
var
@ -1025,7 +1016,7 @@ const
{ *********** entry/exit code and address loading ************ }
procedure tcgppc.g_stackframe_entry(list : taasmoutput;localsize : longint);
procedure tcgppc.g_proc_entry(list : taasmoutput;localsize : longint;nostackframe:boolean);
{ generated the entry code of a procedure/function. Note: localsize is the }
{ 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 }
@ -1038,7 +1029,7 @@ const
var regcounter,firstregfpu,firstreggpr: TSuperRegister;
href,href2 : treference;
usesfpr,usesgpr,gotgot : boolean;
parastart : aword;
parastart : aint;
// r,r2,rsp:Tregister;
l : tasmlabel;
regcounter2, firstfpureg: Tsuperregister;
@ -1173,7 +1164,7 @@ const
end;
{ compute end of gpr save area }
a_op_const_reg(list,OP_ADD,OS_ADDR,aword(href.offset+8),NR_R12);
a_op_const_reg(list,OP_ADD,OS_ADDR,href.offset+8,NR_R12);
end;
{ save gprs and fetch GOT pointer }
@ -1284,7 +1275,7 @@ const
end;
procedure tcgppc.g_return_from_proc(list : taasmoutput;parasize : aword);
procedure tcgppc.g_proc_exit(list : taasmoutput;parasize : longint;nostackframe:boolean);
{ This procedure may be called before, as well as after g_stackframe_entry }
{ is called. NOTE registers are not to be allocated through the register }
{ allocator here, because the register colouring has already occured !! }
@ -1294,7 +1285,7 @@ const
href : treference;
usesfpr,usesgpr,genret : boolean;
regcounter2, firstfpureg:Tsuperregister;
localsize: aword;
localsize: aint;
begin
{ AltiVec context restore, not yet implemented !!! }
@ -1677,7 +1668,7 @@ const
end;
end;
procedure tcgppc.g_return_from_proc_mac(list : taasmoutput;parasize : aword);
procedure tcgppc.g_return_from_proc_mac(list : taasmoutput;parasize : aint);
(* NOT IN USE *)
var
@ -1724,13 +1715,6 @@ const
end;
procedure tcgppc.g_restore_frame_pointer(list : taasmoutput);
begin
{ no frame pointer on the PowerPC (maybe there is one in the SystemV ABI?)}
end;
procedure tcgppc.a_loadaddr_ref_reg(list : taasmoutput;const ref : treference;r : tregister);
var
@ -1806,7 +1790,7 @@ const
end
else if ref2.offset <> 0 Then
if ref2.base <> NR_NO then
a_op_const_reg_reg(list,OP_ADD,OS_32,aword(ref2.offset),ref2.base,r)
a_op_const_reg_reg(list,OP_ADD,OS_32,ref2.offset,ref2.base,r)
{ FixRef makes sure that "(ref.index <> R_NO) and (ref.offset <> 0)" never}
{ occurs, so now only ref.offset has to be loaded }
else
@ -1832,13 +1816,13 @@ const
maxmoveunit = 4;
{$endif ppc603}
procedure tcgppc.g_concatcopy(list : taasmoutput;const source,dest : treference;len : aword; delsource,loadref : boolean);
procedure tcgppc.g_concatcopy(list : taasmoutput;const source,dest : treference;len : aint; delsource,loadref : boolean);
var
countreg: TRegister;
src, dst: TReference;
lab: tasmlabel;
count, count2: aword;
count, count2: aint;
orgsrc, orgdst: boolean;
size: tcgsize;
@ -2122,11 +2106,11 @@ const
{ find out whether a is of the form 11..00..11b or 00..11...00. If }
{ that's the case, we can use rlwinm to do an AND operation }
function tcgppc.get_rlwi_const(a: aword; var l1, l2: longint): boolean;
function tcgppc.get_rlwi_const(a: aint; var l1, l2: longint): boolean;
var
temp : longint;
testbit : aword;
testbit : aint;
compare: boolean;
begin
@ -2224,7 +2208,7 @@ const
if Smallint(Lo(ref.offset)) < 0 then
tmpref.offset := Hi(ref.offset) + 1 {Compensate when lo part is negative}
else
else
tmpref.offset := Hi(ref.offset);
if (tmpreg <> NR_NO) then
@ -2305,7 +2289,7 @@ const
end;
procedure tcg64fppc.a_op64_const_reg(list : taasmoutput;op:TOpCG;value : qword;reg : tregister64);
procedure tcg64fppc.a_op64_const_reg(list : taasmoutput;op:TOpCG;value : int64;reg : tregister64);
begin
a_op64_const_reg_reg(list,op,value,reg,reg);
end;
@ -2335,7 +2319,7 @@ const
end;
procedure tcg64fppc.a_op64_const_reg_reg(list: taasmoutput;op:TOpCG;value : qword;regsrc,regdst : tregister64);
procedure tcg64fppc.a_op64_const_reg_reg(list: taasmoutput;op:TOpCG;value : int64;regsrc,regdst : tregister64);
const
ops: array[boolean,1..3] of tasmop = ((A_ADDIC,A_ADDC,A_ADDZE),
@ -2348,25 +2332,25 @@ const
case op of
OP_AND,OP_OR,OP_XOR:
begin
cg.a_op_const_reg_reg(list,op,OS_32,aword(value),regsrc.reglo,regdst.reglo);
cg.a_op_const_reg_reg(list,op,OS_32,aword(value shr 32),regsrc.reghi,
cg.a_op_const_reg_reg(list,op,OS_32,aint(value),regsrc.reglo,regdst.reglo);
cg.a_op_const_reg_reg(list,op,OS_32,aint(value shr 32),regsrc.reghi,
regdst.reghi);
end;
OP_ADD, OP_SUB:
begin
if (int64(value) < 0) then
if (value < 0) then
begin
if op = OP_ADD then
op := OP_SUB
else
op := OP_ADD;
int64(value) := -int64(value);
value := -value;
end;
if (longint(value) <> 0) then
begin
issub := op = OP_SUB;
if (int64(value) > 0) and
(int64(value)-ord(issub) <= 32767) then
if (value > 0) and
(value-ord(issub) <= 32767) then
begin
list.concat(taicpu.op_reg_reg_const(ops[issub,1],
regdst.reglo,regsrc.reglo,longint(value)));
@ -2396,7 +2380,7 @@ const
else
begin
cg.a_load_reg_reg(list,OS_INT,OS_INT,regsrc.reglo,regdst.reglo);
cg.a_op_const_reg_reg(list,op,OS_32,aword(value shr 32),regsrc.reghi,
cg.a_op_const_reg_reg(list,op,OS_32,aint(value shr 32),regsrc.reghi,
regdst.reghi);
end;
end;
@ -2412,7 +2396,10 @@ begin
end.
{
$Log$
Revision 1.171 2004-06-02 17:18:10 jonas
Revision 1.172 2004-06-17 16:55:46 peter
* powerpc compiles again
Revision 1.171 2004/06/02 17:18:10 jonas
* parameters passed on the stack now also work as register variables
Revision 1.170 2004/05/31 18:08:41 jonas

View File

@ -29,7 +29,8 @@ unit cpubase;
interface
uses
strings,cutils,cclasses,aasmbase,cpuinfo,cgbase;
strings,globtype,
cutils,cclasses,aasmbase,cpuinfo,cgbase;
{*****************************************************************************
@ -137,6 +138,10 @@ uses
{$i rppcstab.inc}
);
regdwarf_table : array[tregisterindex] of shortint = (
{$i rppcdwrf.inc}
);
{ registers which may be destroyed by calls }
VOLATILE_INTREGISTERS = [RS_R3..RS_R12];
{$warning FIXME!!}
@ -333,19 +338,13 @@ uses
{$else FPC_BIG_ENDIAN}
1 : (value : AWord);
{$endif FPC_BIG_ENDIAN}
{ can't do this, this layout depends on the host cpu. Use }
{ lo(valueqword)/hi(valueqword) instead (JM) }
{ 2 : (valuelow, valuehigh:AWord); }
{ overlay a complete 64 Bit value }
3 : (valueqword : qword);
2 : (value64 : int64);
);
LOC_FPUREGISTER, LOC_CFPUREGISTER, LOC_MMREGISTER, LOC_CMMREGISTER,
LOC_REGISTER,LOC_CREGISTER : (
case longint of
1 : (registerlow,registerhigh : tregister);
2 : (register : tregister);
{ overlay a 64 Bit register type }
3 : (reg64 : tregister64);
4 : (register64 : tregister64);
);
LOC_FLAGS : (resflags : tresflags);
@ -409,6 +408,8 @@ uses
}
{$warning As indicated in rs6000.h, but can't find it anywhere else!}
NR_PIC_OFFSET_REG = NR_R30;
{ Return address of a function }
NR_RETURN_ADDRESS_REG = NR_R0;
{ Results are returned in this register (32-bit values) }
NR_FUNCTION_RETURN_REG = NR_R3;
RS_FUNCTION_RETURN_REG = RS_R3;
@ -487,7 +488,7 @@ uses
function cgsize2subreg(s:Tcgsize):Tsubregister;
{ Returns the tcgsize corresponding with the size of reg.}
function reg_cgsize(const reg: tregister) : tcgsize; virtual;
function reg_cgsize(const reg: tregister) : tcgsize;
function findreg_by_number(r:Tregister):tregisterindex;
function std_regnum_search(const s:string):Tregister;
@ -594,6 +595,19 @@ implementation
end;
function reg_cgsize(const reg: tregister): tcgsize;
begin
case getregtype(reg) of
R_MMREGISTER,
R_FPUREGISTER,
R_INTREGISTER :
result:=OS_32;
else
internalerror(200303181);
end;
end;
function cgsize2subreg(s:Tcgsize):Tsubregister;
begin
cgsize2subreg:=R_SUBWHOLE;
@ -627,7 +641,10 @@ implementation
end.
{
$Log$
Revision 1.87 2004-06-16 20:07:10 florian
Revision 1.88 2004-06-17 16:55:46 peter
* powerpc compiles again
Revision 1.87 2004/06/16 20:07:10 florian
* dwarf branch merged
Revision 1.86.2.1 2004/05/01 11:12:24 florian

View File

@ -205,7 +205,7 @@ interface
if (right.location.loc = LOC_CONSTANT) then
begin
{$ifdef dummy}
if (right.location.size in [OS_64,OS_S64]) and (hi(right.location.valueqword)<>0) and ((hi(right.location.valueqword)<>$ffffffff) or unsigned) then
if (right.location.size in [OS_64,OS_S64]) and (hi(right.location.value64)<>0) and ((hi(right.location.value64)<>$ffffffff) or unsigned) then
internalerror(2002080301);
{$endif extdebug}
if (nodetype in [equaln,unequaln]) then
@ -688,11 +688,11 @@ interface
location_copy(oldleft,left.location);
location_copy(oldright,right.location);
if left.location.loc = LOC_CONSTANT then
left.location.valueqword := left.location.valueqword shr 32
left.location.value64 := left.location.value64 shr 32
else
left.location.registerlow := left.location.registerhigh;
if right.location.loc = LOC_CONSTANT then
right.location.valueqword := right.location.valueqword shr 32
right.location.value64 := right.location.value64 shr 32
else
right.location.registerlow := right.location.registerhigh;
@ -865,38 +865,38 @@ interface
end
else
begin
if (aword(right.location.valueqword) <> 0) then
if (aword(right.location.value64) <> 0) then
tempreg64.reglo := cg.getintregister(exprasmlist,OS_32)
else
tempreg64.reglo := left.location.registerlow;
if ((right.location.valueqword shr 32) <> 0) then
if ((right.location.value64 shr 32) <> 0) then
tempreg64.reghi := cg.getintregister(exprasmlist,OS_32)
else
tempreg64.reghi := left.location.registerhigh;
end;
if (aword(right.location.valueqword) <> 0) then
if (aword(right.location.value64) <> 0) then
{ negative values can be handled using SUB, }
{ positive values < 65535 using XOR. }
if (longint(right.location.valueqword) >= -32767) and
(longint(right.location.valueqword) < 0) then
if (longint(right.location.value64) >= -32767) and
(longint(right.location.value64) < 0) then
cg.a_op_const_reg_reg(exprasmlist,OP_SUB,OS_INT,
aword(right.location.valueqword),
aword(right.location.value64),
left.location.registerlow,tempreg64.reglo)
else
cg.a_op_const_reg_reg(exprasmlist,OP_XOR,OS_INT,
aword(right.location.valueqword),
aword(right.location.value64),
left.location.registerlow,tempreg64.reglo);
if ((right.location.valueqword shr 32) <> 0) then
if (longint(right.location.valueqword shr 32) >= -32767) and
(longint(right.location.valueqword shr 32) < 0) then
if ((right.location.value64 shr 32) <> 0) then
if (longint(right.location.value64 shr 32) >= -32767) and
(longint(right.location.value64 shr 32) < 0) then
cg.a_op_const_reg_reg(exprasmlist,OP_SUB,OS_INT,
aword(right.location.valueqword shr 32),
aword(right.location.value64 shr 32),
left.location.registerhigh,tempreg64.reghi)
else
cg.a_op_const_reg_reg(exprasmlist,OP_XOR,OS_INT,
aword(right.location.valueqword shr 32),
aword(right.location.value64 shr 32),
left.location.registerhigh,tempreg64.reghi);
end
else
@ -931,7 +931,7 @@ interface
if (left.location.loc = LOC_CONSTANT) then
swapleftright;
if (right.location.loc = LOC_CONSTANT) then
cg64.a_op64_const_reg_reg(exprasmlist,op,right.location.valueqword,
cg64.a_op64_const_reg_reg(exprasmlist,op,right.location.value64,
left.location.register64,location.register64)
else
cg64.a_op64_reg_reg_reg(exprasmlist,op,right.location.register64,
@ -957,18 +957,18 @@ interface
else
// reg64 - const64
cg64.a_op64_const_reg_reg(exprasmlist,OP_SUB,
right.location.valueqword,left.location.register64,
right.location.value64,left.location.register64,
location.register64)
end
else if ((left.location.valueqword shr 32) = 0) then
else if ((left.location.value64 shr 32) = 0) then
begin
if (location.registerlow = NR_NO) then
begin
location.registerlow := cg.getintregister(exprasmlist,OS_INT);
location.registerhigh := cg.getintregister(exprasmlist,OS_INT);
end;
if (int64(left.location.valueqword) >= low(smallint)) and
(int64(left.location.valueqword) <= high(smallint)) then
if (int64(left.location.value64) >= low(smallint)) and
(int64(left.location.value64) <= high(smallint)) then
begin
// consts16 - reg64
exprasmlist.concat(taicpu.op_reg_reg_const(A_SUBFIC,
@ -987,7 +987,7 @@ interface
exprasmlist.concat(taicpu.op_reg_reg(A_SUBFZE,
location.registerhigh,right.location.registerhigh));
end
else if (aword(left.location.valueqword) = 0) then
else if (aword(left.location.value64) = 0) then
begin
// (const32 shl 32) - reg64
if (location.registerlow = NR_NO) then
@ -997,7 +997,7 @@ interface
end;
exprasmlist.concat(taicpu.op_reg_reg_const(A_SUBFIC,
location.registerlow,right.location.registerlow,0));
left.location.valueqword := left.location.valueqword shr 32;
left.location.value64 := left.location.value64 shr 32;
location_force_reg(exprasmlist,left.location,OS_32,true);
exprasmlist.concat(taicpu.op_reg_reg_reg(A_SUBFE,
location.registerhigh,right.location.registerhigh,
@ -1494,7 +1494,10 @@ begin
end.
{
$Log$
Revision 1.43 2004-03-18 16:19:03 peter
Revision 1.44 2004-06-17 16:55:46 peter
* powerpc compiles again
Revision 1.43 2004/03/18 16:19:03 peter
* fixed operator overload allowing for pointer-string
* replaced some type_e_mismatch with more informational messages
@ -1617,8 +1620,8 @@ end.
Revision 1.12 2002/08/14 18:41:48 jonas
- remove valuelow/valuehigh fields from tlocation, because they depend
on the endianess of the host operating system -> difficult to get
right. Use lo/hi(location.valueqword) instead (remember to use
valueqword and not value!!)
right. Use lo/hi(location.value64) instead (remember to use
value64 and not value!!)
Revision 1.11 2002/08/11 14:32:32 peter
* renamed current_library to objectlibrary

View File

@ -63,7 +63,7 @@ unit nppcld;
begin
l:=objectlibrary.newasmsymbol('L'+tvarsym(symtableentry).mangledname+'$non_lazy_ptr',AB_COMMON,AT_DATA);
picdata.concat(tai_symbol.create(l,0));
picdata.concat(tai_const_symbol.create_indirect(objectlibrary.newasmsymbol(tvarsym(symtableentry).mangledname,AB_EXTERNAL,AT_DATA)));
picdata.concat(tai_const.create_indirect_sym(objectlibrary.newasmsymbol(tvarsym(symtableentry).mangledname,AB_EXTERNAL,AT_DATA)));
picdata.concat(tai_const.create_32bit(0));
end;
@ -87,7 +87,10 @@ begin
end.
{
$Log$
Revision 1.2 2004-03-05 22:17:11 jonas
Revision 1.3 2004-06-17 16:55:46 peter
* powerpc compiles again
Revision 1.2 2004/03/05 22:17:11 jonas
* fixed importing of variables from shared libraries, but disabled
PIC support for now. You have to save/restore r31 when you us it! :)
Also, it's not necessary to support the imported variables

View File

@ -6,124 +6,127 @@
; layout
; <name>,<value>,<stdname>,<gasname>,<gasshortname>,<motname>,<stabidx>
;
NO,$00,$00,INVALID,INVALID,INVALID,INVALID,-1
NO,$00,$00,INVALID,INVALID,INVALID,INVALID,-1,-1
R0,$01,$00,r0,r0,0,r0,0
R1,$01,$01,r1,r1,1,r1,1
R2,$01,$02,r2,r2,2,r2,2
R3,$01,$03,r3,r3,3,r3,3
R4,$01,$04,r4,r4,4,r4,4
R5,$01,$05,r5,r5,5,r5,5
R6,$01,$06,r6,r6,6,r6,6
R7,$01,$07,r7,r7,7,r7,7
R8,$01,$08,r8,r8,8,r8,8
R9,$01,$09,r9,r9,9,r9,9
R10,$01,$0a,r10,r10,10,r10,10
R11,$01,$0b,r11,r11,11,r11,11
R12,$01,$0c,r12,r12,12,r12,12
R13,$01,$0d,r13,r13,13,r13,13
R14,$01,$0e,r14,r14,14,r14,14
R15,$01,$0f,r15,r15,15,r15,15
R16,$01,$10,r16,r16,16,r16,16
R17,$01,$11,r17,r17,17,r17,17
R18,$01,$12,r18,r18,18,r18,18
R19,$01,$13,r19,r19,19,r19,19
R20,$01,$14,r20,r20,20,r20,20
R21,$01,$15,r21,r21,21,r21,21
R22,$01,$16,r22,r22,22,r22,22
R23,$01,$17,r23,r23,23,r23,23
R24,$01,$18,r24,r24,24,r24,24
R25,$01,$19,r25,r25,25,r25,25
R26,$01,$1a,r26,r26,26,r26,26
R27,$01,$1b,r27,r27,27,r27,27
R28,$01,$1c,r28,r28,28,r28,28
R29,$01,$1d,r29,r29,29,r29,29
R30,$01,$1e,r30,r30,30,r30,30
R31,$01,$1f,r31,r31,31,r31,31
R0,$01,$00,r0,r0,0,r0,0,0
R1,$01,$01,r1,r1,1,r1,1,1
R2,$01,$02,r2,r2,2,r2,2,2
R3,$01,$03,r3,r3,3,r3,3,3
R4,$01,$04,r4,r4,4,r4,4,4
R5,$01,$05,r5,r5,5,r5,5,5
R6,$01,$06,r6,r6,6,r6,6,6
R7,$01,$07,r7,r7,7,r7,7,7
R8,$01,$08,r8,r8,8,r8,8,8
R9,$01,$09,r9,r9,9,r9,9,9
R10,$01,$0a,r10,r10,10,r10,10,10
R11,$01,$0b,r11,r11,11,r11,11,11
R12,$01,$0c,r12,r12,12,r12,12,12
R13,$01,$0d,r13,r13,13,r13,13,13
R14,$01,$0e,r14,r14,14,r14,14,14
R15,$01,$0f,r15,r15,15,r15,15,15
R16,$01,$10,r16,r16,16,r16,16,16
R17,$01,$11,r17,r17,17,r17,17,17
R18,$01,$12,r18,r18,18,r18,18,18
R19,$01,$13,r19,r19,19,r19,19,19
R20,$01,$14,r20,r20,20,r20,20,20
R21,$01,$15,r21,r21,21,r21,21,21
R22,$01,$16,r22,r22,22,r22,22,22
R23,$01,$17,r23,r23,23,r23,23,23
R24,$01,$18,r24,r24,24,r24,24,24
R25,$01,$19,r25,r25,25,r25,25,25
R26,$01,$1a,r26,r26,26,r26,26,26
R27,$01,$1b,r27,r27,27,r27,27,27
R28,$01,$1c,r28,r28,28,r28,28,28
R29,$01,$1d,r29,r29,29,r29,29,29
R30,$01,$1e,r30,r30,30,r30,30,30
R31,$01,$1f,r31,r31,31,r31,31,31
F0,$02,$00,F0,f0,0,F0,32
F1,$02,$01,F1,f1,1,F1,33
F2,$02,$02,F2,f2,2,F2,34
F3,$02,$03,F3,f3,3,F3,35
F4,$02,$04,F4,f4,4,F4,36
F5,$02,$05,F5,f5,5,F5,37
F6,$02,$06,F6,f6,6,F6,38
F7,$02,$07,F7,f7,7,F7,39
F8,$02,$08,F8,f8,8,F8,40
F9,$02,$09,F9,f9,9,F9,41
F10,$02,$0a,F10,f10,10,F10,42
F11,$02,$0b,F11,f11,11,F11,43
F12,$02,$0c,F12,f12,12,F12,44
F13,$02,$0d,F13,f13,13,F13,45
F14,$02,$0e,F14,f14,14,F14,46
F15,$02,$0f,F15,f15,15,F15,47
F16,$02,$10,F16,f16,16,F16,48
F17,$02,$11,F17,f17,17,F17,49
F18,$02,$12,F18,f18,18,F18,50
F19,$02,$13,F19,f19,19,F19,51
F20,$02,$14,F20,f20,20,F20,52
F21,$02,$15,F21,f21,21,F21,53
F22,$02,$16,F22,f22,22,F22,54
F23,$02,$17,F23,f23,23,F23,55
F24,$02,$18,F24,f24,24,F24,56
F25,$02,$19,F25,f25,25,F25,57
F26,$02,$1a,F26,f26,26,F26,58
F27,$02,$1b,F27,f27,27,F27,59
F28,$02,$1c,F28,f28,28,F28,60
F29,$02,$1d,F29,f29,29,F29,61
F30,$02,$1e,F30,f30,30,F30,62
F31,$02,$1f,F31,f31,31,F31,63
F0,$02,$00,F0,f0,0,F0,32,32
F1,$02,$01,F1,f1,1,F1,33,33
F2,$02,$02,F2,f2,2,F2,34,34
F3,$02,$03,F3,f3,3,F3,35,35
F4,$02,$04,F4,f4,4,F4,36,36
F5,$02,$05,F5,f5,5,F5,37,37
F6,$02,$06,F6,f6,6,F6,38,38
F7,$02,$07,F7,f7,7,F7,39,39
F8,$02,$08,F8,f8,8,F8,40,40
F9,$02,$09,F9,f9,9,F9,41,41
F10,$02,$0a,F10,f10,10,F10,42,42
F11,$02,$0b,F11,f11,11,F11,43,43
F12,$02,$0c,F12,f12,12,F12,44,44
F13,$02,$0d,F13,f13,13,F13,45,45
F14,$02,$0e,F14,f14,14,F14,46,46
F15,$02,$0f,F15,f15,15,F15,47,47
F16,$02,$10,F16,f16,16,F16,48,48
F17,$02,$11,F17,f17,17,F17,49,49
F18,$02,$12,F18,f18,18,F18,50,50
F19,$02,$13,F19,f19,19,F19,51,51
F20,$02,$14,F20,f20,20,F20,52,52
F21,$02,$15,F21,f21,21,F21,53,53
F22,$02,$16,F22,f22,22,F22,54,54
F23,$02,$17,F23,f23,23,F23,55,55
F24,$02,$18,F24,f24,24,F24,56,56
F25,$02,$19,F25,f25,25,F25,57,57
F26,$02,$1a,F26,f26,26,F26,58,58
F27,$02,$1b,F27,f27,27,F27,59,59
F28,$02,$1c,F28,f28,28,F28,60,60
F29,$02,$1d,F29,f29,29,F29,61,61
F30,$02,$1e,F30,f30,30,F30,62,62
F31,$02,$1f,F31,f31,31,F31,63,63
M0,$03,$00,M0,v0,0,M0,-1
M1,$03,$01,M1,v1,1,M1,-1
M2,$03,$02,M2,v2,2,M2,-1
M3,$03,$03,M3,v3,3,M3,-1
M4,$03,$04,M4,v4,4,M4,-1
M5,$03,$05,M5,v5,5,M5,-1
M6,$03,$06,M6,v6,6,M6,-1
M7,$03,$07,M7,v7,7,M7,-1
M8,$03,$08,M8,v8,8,M8,-1
M9,$03,$09,M9,v9,9,M9,-1
M10,$03,$0a,M10,v10,10,M10,-1
M11,$03,$0b,M11,v11,11,M11,-1
M12,$03,$0c,M12,v12,12,M12,-1
M13,$03,$0d,M13,v13,13,M13,-1
M14,$03,$0e,M14,v14,14,M14,-1
M15,$03,$0f,M15,v15,15,M15,-1
M16,$03,$10,M16,v16,16,M16,-1
M17,$03,$11,M17,v17,17,M17,-1
M18,$03,$12,M18,v18,18,M18,-1
M19,$03,$13,M19,v19,19,M19,-1
M20,$03,$14,M20,v20,20,M20,-1
M21,$03,$15,M21,v21,21,M21,-1
M22,$03,$16,M22,v22,22,M22,-1
M23,$03,$17,M23,v23,23,M23,-1
M24,$03,$18,M24,v24,24,M24,-1
M25,$03,$19,M25,v25,25,M25,-1
M26,$03,$1a,M26,v26,26,M26,-1
M27,$03,$1b,M27,v27,27,M27,-1
M28,$03,$1c,M28,v28,28,M28,-1
M29,$03,$1d,M29,v29,29,M29,-1
M30,$03,$1e,M30,v30,30,M30,-1
M31,$03,$1f,M31,v31,31,M31,-1
M0,$03,$00,M0,v0,0,M0,-1,-1
M1,$03,$01,M1,v1,1,M1,-1,-1
M2,$03,$02,M2,v2,2,M2,-1,-1
M3,$03,$03,M3,v3,3,M3,-1,-1
M4,$03,$04,M4,v4,4,M4,-1,-1
M5,$03,$05,M5,v5,5,M5,-1,-1
M6,$03,$06,M6,v6,6,M6,-1,-1
M7,$03,$07,M7,v7,7,M7,-1,-1
M8,$03,$08,M8,v8,8,M8,-1,-1
M9,$03,$09,M9,v9,9,M9,-1,-1
M10,$03,$0a,M10,v10,10,M10,-1,-1
M11,$03,$0b,M11,v11,11,M11,-1,-1
M12,$03,$0c,M12,v12,12,M12,-1,-1
M13,$03,$0d,M13,v13,13,M13,-1,-1
M14,$03,$0e,M14,v14,14,M14,-1,-1
M15,$03,$0f,M15,v15,15,M15,-1,-1
M16,$03,$10,M16,v16,16,M16,-1,-1
M17,$03,$11,M17,v17,17,M17,-1,-1
M18,$03,$12,M18,v18,18,M18,-1,-1
M19,$03,$13,M19,v19,19,M19,-1,-1
M20,$03,$14,M20,v20,20,M20,-1,-1
M21,$03,$15,M21,v21,21,M21,-1,-1
M22,$03,$16,M22,v22,22,M22,-1,-1
M23,$03,$17,M23,v23,23,M23,-1,-1
M24,$03,$18,M24,v24,24,M24,-1,-1
M25,$03,$19,M25,v25,25,M25,-1,-1
M26,$03,$1a,M26,v26,26,M26,-1,-1
M27,$03,$1b,M27,v27,27,M27,-1,-1
M28,$03,$1c,M28,v28,28,M28,-1,-1
M29,$03,$1d,M29,v29,29,M29,-1,-1
M30,$03,$1e,M30,v30,30,M30,-1,-1
M31,$03,$1f,M31,v31,31,M31,-1,-1
CR,$05,$00,CR,cr,cr,CR,-1
CR0,$05,$01,CR0,cr0,cr0,CR0,68
CR1,$05,$02,CR1,cr1,cr1,CR1,69
CR2,$05,$03,CR2,cr2,cr2,CR2,70
CR3,$05,$04,CR3,cr3,cr3,CR3,71
CR4,$05,$05,CR4,cr4,cr4,CR4,72
CR5,$05,$06,CR5,cr5,cr5,CR5,73
CR6,$05,$07,CR6,cr6,cr5,CR6,74
CR7,$05,$08,CR7,cr7,cr6,CR7,75
XER,$05,$09,XER,xer,xer,XER,76
LR,$05,$0a,LR,lr,lr,LR,65
CTR,$05,$0b,CTR,ctr,ctr,CTR,66
FPSCR,$05,$0c,FPSCR,fpscr,fpscr,FPSCR,-1
CR,$05,$00,CR,cr,cr,CR,-1,-1
CR0,$05,$01,CR0,cr0,cr0,CR0,68,68
CR1,$05,$02,CR1,cr1,cr1,CR1,69,69
CR2,$05,$03,CR2,cr2,cr2,CR2,70,70
CR3,$05,$04,CR3,cr3,cr3,CR3,71,71
CR4,$05,$05,CR4,cr4,cr4,CR4,72,72
CR5,$05,$06,CR5,cr5,cr5,CR5,73,73
CR6,$05,$07,CR6,cr6,cr5,CR6,74,74
CR7,$05,$08,CR7,cr7,cr6,CR7,75,75
XER,$05,$09,XER,xer,xer,XER,76,76
LR,$05,$0a,LR,lr,lr,LR,65,65
CTR,$05,$0b,CTR,ctr,ctr,CTR,66,66
FPSCR,$05,$0c,FPSCR,fpscr,fpscr,FPSCR,-1,-1
;
; $Log$
; Revision 1.5 2003-12-10 22:19:27 florian
; Revision 1.6 2004-06-17 16:55:46 peter
; * powerpc compiles again
;
; Revision 1.5 2003/12/10 22:19:27 florian
; + short gas register names for smartlinking added
;
; Revision 1.4 2003/09/04 21:07:03 florian

View File

@ -0,0 +1,111 @@
{ don't edit, this file is generated from ppcreg.dat }
-1,
0,
1,
2,
3,
4,
5,
6,
7,
8,
9,
10,
11,
12,
13,
14,
15,
16,
17,
18,
19,
20,
21,
22,
23,
24,
25,
26,
27,
28,
29,
30,
31,
32,
33,
34,
35,
36,
37,
38,
39,
40,
41,
42,
43,
44,
45,
46,
47,
48,
49,
50,
51,
52,
53,
54,
55,
56,
57,
58,
59,
60,
61,
62,
63,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
-1,
68,
69,
70,
71,
72,
73,
74,
75,
76,
65,
66,
-1

View File

@ -655,7 +655,7 @@ implementation
if assigned(fpuregvars[i]) then
begin
reg:=tvarsym(fpuregvars[i]).localloc.register;
size:=cg.reg_cgsize(reg);
size:=reg_cgsize(reg);
cg.a_loadfpu_reg_reg(list,size,reg,reg);
cg.ungetregister(list,reg);
end;
@ -670,7 +670,10 @@ end.
{
$Log$
Revision 1.75 2004-05-30 15:36:55 jonas
Revision 1.76 2004-06-17 16:55:46 peter
* powerpc compiles again
Revision 1.75 2004/05/30 15:36:55 jonas
* fixed regvars compilation
Revision 1.74 2004/02/08 20:15:42 jonas

View File

@ -31,6 +31,7 @@ var s : string;
gasnames,
gssnames,
motnames,
dwarfs,
stabs : array[0..max_regcount-1] of string[63];
regnumber_index,
std_regname_index,
@ -277,6 +278,8 @@ begin
motnames[regcount]:=readstr;
readcomma;
stabs[regcount]:=readstr;
readcomma;
dwarfs[regcount]:=readstr;
{ Create register number }
if supregs[regcount][1]<>'$' then
begin
@ -305,7 +308,7 @@ procedure write_inc_files;
var
norfile,stdfile,motfile,supfile,
numfile,stabfile,confile,gasfile,gssfile,
numfile,stabfile,confile,gasfile,gssfile,dwarffile,
rnifile,srifile,mrifile,grifile : text;
first:boolean;
@ -319,6 +322,7 @@ begin
openinc(gssfile,'rppcgss.inc');
openinc(motfile,'rppcmot.inc');
openinc(stabfile,'rppcstab.inc');
openinc(dwarffile,'rppcdwrf.inc');
openinc(norfile,'rppcnor.inc');
openinc(rnifile,'rppcrni.inc');
openinc(srifile,'rppcsri.inc');
@ -335,6 +339,7 @@ begin
writeln(gssfile,',');
writeln(motfile,',');
writeln(stabfile,',');
writeln(dwarffile,',');
writeln(rnifile,',');
writeln(srifile,',');
writeln(grifile,',');
@ -350,6 +355,7 @@ begin
write(gssfile,'''',gssnames[i],'''');
write(motfile,'''',motnames[i],'''');
write(stabfile,stabs[i]);
write(dwarffile,dwarfs[i]);
write(rnifile,regnumber_index[i]);
write(srifile,std_regname_index[i]);
write(grifile,gas_regname_index[i]);
@ -364,6 +370,7 @@ begin
closeinc(gssfile);
closeinc(motfile);
closeinc(stabfile);
closeinc(dwarffile);
closeinc(norfile);
closeinc(rnifile);
closeinc(srifile);
@ -390,7 +397,10 @@ begin
end.
{
$Log$
Revision 1.7 2003-12-16 21:49:47 florian
Revision 1.8 2004-06-17 16:55:46 peter
* powerpc compiles again
Revision 1.7 2003/12/16 21:49:47 florian
* fixed ppc compilation
Revision 1.6 2003/12/10 22:19:28 florian