|
@@ -51,6 +51,7 @@ unit cgcpu;
|
|
procedure a_load_reg_ref(list : taasmoutput; size: tcgsize; reg : tregister;const ref : treference);override;
|
|
procedure a_load_reg_ref(list : taasmoutput; size: tcgsize; reg : tregister;const ref : treference);override;
|
|
procedure a_load_ref_reg(list : taasmoutput;size : tcgsize;const Ref : treference;reg : tregister);override;
|
|
procedure a_load_ref_reg(list : taasmoutput;size : tcgsize;const Ref : treference;reg : tregister);override;
|
|
procedure a_load_reg_reg(list : taasmoutput;size : tcgsize;reg1,reg2 : tregister);override;
|
|
procedure a_load_reg_reg(list : taasmoutput;size : tcgsize;reg1,reg2 : tregister);override;
|
|
|
|
+ procedure a_load_sym_ofs_reg(list: taasmoutput; const sym: tasmsymbol; ofs: longint; reg: tregister); override;
|
|
|
|
|
|
{ comparison operations }
|
|
{ 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 : aword;reg : tregister;
|
|
@@ -261,6 +262,7 @@ const
|
|
list.concat(taicpu.op_reg_const(A_LIS,reg,a shr 16));
|
|
list.concat(taicpu.op_reg_const(A_LIS,reg,a shr 16));
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
+
|
|
procedure tcgppc.a_load_reg_ref(list : taasmoutput; size: TCGSize; reg : tregister;const ref : treference);
|
|
procedure tcgppc.a_load_reg_ref(list : taasmoutput; size: TCGSize; reg : tregister;const ref : treference);
|
|
|
|
|
|
var
|
|
var
|
|
@@ -274,12 +276,13 @@ const
|
|
{ storing is the same for signed and unsigned values }
|
|
{ storing is the same for signed and unsigned values }
|
|
size := tcgsize(ord(size)-(ord(OS_S8)-ord(OS_8)));
|
|
size := tcgsize(ord(size)-(ord(OS_S8)-ord(OS_8)));
|
|
{ 64 bit stuff should be handled separately }
|
|
{ 64 bit stuff should be handled separately }
|
|
- if size = OS_64 then
|
|
|
|
|
|
+ if size in [OS_64,OS_S64] then
|
|
internalerror(200109236);
|
|
internalerror(200109236);
|
|
op := storeinstr[size,ref2.index<>R_NO,false];
|
|
op := storeinstr[size,ref2.index<>R_NO,false];
|
|
a_load_store(list,op,reg,ref2);
|
|
a_load_store(list,op,reg,ref2);
|
|
End;
|
|
End;
|
|
|
|
|
|
|
|
+
|
|
procedure tcgppc.a_load_ref_reg(list : taasmoutput;size : tcgsize;const ref: treference;reg : tregister);
|
|
procedure tcgppc.a_load_ref_reg(list : taasmoutput;size : tcgsize;const ref: treference;reg : tregister);
|
|
|
|
|
|
var
|
|
var
|
|
@@ -303,12 +306,14 @@ const
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
+
|
|
procedure tcgppc.a_load_reg_reg(list : taasmoutput;size : tcgsize;reg1,reg2 : tregister);
|
|
procedure tcgppc.a_load_reg_reg(list : taasmoutput;size : tcgsize;reg1,reg2 : tregister);
|
|
|
|
|
|
begin
|
|
begin
|
|
list.concat(taicpu.op_reg_reg(A_MR,reg2,reg1));
|
|
list.concat(taicpu.op_reg_reg(A_MR,reg2,reg1));
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
+
|
|
procedure tcgppc.a_op_const_reg(list : taasmoutput; Op: TOpCG; a: AWord; reg: TRegister);
|
|
procedure tcgppc.a_op_const_reg(list : taasmoutput; Op: TOpCG; a: AWord; reg: TRegister);
|
|
|
|
|
|
var
|
|
var
|
|
@@ -342,6 +347,7 @@ const
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
+
|
|
procedure tcgppc.a_op_reg_reg(list : taasmoutput; Op: TOpCG; size: TCGSize; src, dst: TRegister);
|
|
procedure tcgppc.a_op_reg_reg(list : taasmoutput; Op: TOpCG; size: TCGSize; src, dst: TRegister);
|
|
|
|
|
|
begin
|
|
begin
|
|
@@ -398,6 +404,7 @@ const
|
|
a_jmp(list,A_BC,TOpCmp2AsmCond[cmp_op],l);
|
|
a_jmp(list,A_BC,TOpCmp2AsmCond[cmp_op],l);
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
+
|
|
procedure tcgppc.a_jmp_cond(list : taasmoutput;cond : TOpCmp;l: pasmlabel);
|
|
procedure tcgppc.a_jmp_cond(list : taasmoutput;cond : TOpCmp;l: pasmlabel);
|
|
|
|
|
|
begin
|
|
begin
|
|
@@ -531,6 +538,7 @@ const
|
|
{ now comes the AltiVec context save, not yet implemented !!! }
|
|
{ now comes the AltiVec context save, not yet implemented !!! }
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
+
|
|
procedure tcgppc.g_stackframe_entry_mac(list : taasmoutput;localsize : longint);
|
|
procedure tcgppc.g_stackframe_entry_mac(list : taasmoutput;localsize : longint);
|
|
{ generated the entry code of a procedure/function. Note: localsize is the }
|
|
{ generated the entry code of a procedure/function. Note: localsize is the }
|
|
{ sum of the size necessary for local variables and the maximum possible }
|
|
{ sum of the size necessary for local variables and the maximum possible }
|
|
@@ -588,6 +596,7 @@ const
|
|
{ no frame pointer on the PowerPC (maybe there is one in the SystemV ABI?)}
|
|
{ no frame pointer on the PowerPC (maybe there is one in the SystemV ABI?)}
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
+
|
|
procedure tcgppc.g_return_from_proc(list : taasmoutput;parasize : aword);
|
|
procedure tcgppc.g_return_from_proc(list : taasmoutput;parasize : aword);
|
|
|
|
|
|
begin
|
|
begin
|
|
@@ -601,6 +610,7 @@ const
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
+
|
|
procedure tcgppc.a_loadaddress_ref_reg(list : taasmoutput;const ref2 : treference;r : tregister);
|
|
procedure tcgppc.a_loadaddress_ref_reg(list : taasmoutput;const ref2 : treference;r : tregister);
|
|
|
|
|
|
var tmpreg: tregister;
|
|
var tmpreg: tregister;
|
|
@@ -780,14 +790,27 @@ const
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
|
|
- procedure tcgppc.fixref(var ref: treference);
|
|
|
|
|
|
+ procedure tcgppc.fixref(list: taasmoutput; var ref: treference);
|
|
|
|
|
|
begin
|
|
begin
|
|
If (ref.base <> R_NO) then
|
|
If (ref.base <> R_NO) then
|
|
begin
|
|
begin
|
|
if (ref.index <> R_NO) and
|
|
if (ref.index <> R_NO) and
|
|
- ((ref.offset <> 0) or assigned(ref.symbol)) Then
|
|
|
|
- Internalerror(58992)
|
|
|
|
|
|
+ ((ref.offset <> 0) or assigned(ref.symbol)) then
|
|
|
|
+ begin
|
|
|
|
+ if not assigned(ref.symbol) and
|
|
|
|
+ (cardinal(ref.offset-low(smallint)) <=
|
|
|
|
+ high(smallint)-low(smallint)) then
|
|
|
|
+ begin
|
|
|
|
+ list.concat(A_ADDI,ref.base,ref.base,ref.offset);
|
|
|
|
+ ref.offset := 0;
|
|
|
|
+ end
|
|
|
|
+ else
|
|
|
|
+ begin
|
|
|
|
+ list.concat(A_ADD,ref.base,ref.base,ref.index);
|
|
|
|
+ ref.index := R_NO;
|
|
|
|
+ end;
|
|
|
|
+ end
|
|
end
|
|
end
|
|
else
|
|
else
|
|
begin
|
|
begin
|
|
@@ -1000,7 +1023,10 @@ const
|
|
end.
|
|
end.
|
|
{
|
|
{
|
|
$Log$
|
|
$Log$
|
|
- Revision 1.7 2001-09-29 21:33:30 jonas
|
|
|
|
|
|
+ Revision 1.8 2001-10-28 14:16:49 jonas
|
|
|
|
+ * small fixes
|
|
|
|
+
|
|
|
|
+ Revision 1.7 2001/09/29 21:33:30 jonas
|
|
* small optimization
|
|
* small optimization
|
|
|
|
|
|
Revision 1.6 2001/09/28 20:40:05 jonas
|
|
Revision 1.6 2001/09/28 20:40:05 jonas
|