mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-12 12:05:57 +02:00
+ Added varregs
This commit is contained in:
parent
d14de4009e
commit
d941eee5f6
@ -63,6 +63,20 @@ type
|
|||||||
A_UNPKBL,A_UNPKBW,A_WH64,A_WMB,A_XOR,A_ZAP,
|
A_UNPKBL,A_UNPKBW,A_WH64,A_WMB,A_XOR,A_ZAP,
|
||||||
A_ZAPNOT);
|
A_ZAPNOT);
|
||||||
|
|
||||||
|
Const
|
||||||
|
firstop = low(tasmop);
|
||||||
|
lastop = high(tasmop);
|
||||||
|
|
||||||
|
type
|
||||||
|
TAsmCond =
|
||||||
|
(
|
||||||
|
C_None,C_A,C_AE,C_B,C_BE,C_C,C_E,C_G,C_GE,C_L,C_LE,C_NA,C_NAE,
|
||||||
|
C_NB,C_NBE,C_NC,C_NE,C_NG,C_NGE,C_NL,C_NLE,C_NO,C_NP,C_NS,C_NZ,C_O,C_P,
|
||||||
|
C_PE,C_PO,C_S,C_Z
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
Type
|
||||||
|
|
||||||
{ ALL registers }
|
{ ALL registers }
|
||||||
TRegister = (R_NO, { R_NO is Mandatory, signifies no register }
|
TRegister = (R_NO, { R_NO is Mandatory, signifies no register }
|
||||||
@ -75,10 +89,47 @@ type
|
|||||||
R_F20,R_F21,R_F22,R_F23,R_F24,R_F25,R_F26,R_F27,R_F28,R_F29,
|
R_F20,R_F21,R_F22,R_F23,R_F24,R_F25,R_F26,R_F27,R_F28,R_F29,
|
||||||
R_F30,R_F31);
|
R_F30,R_F31);
|
||||||
|
|
||||||
|
TRegisterset = Set of TRegister;
|
||||||
|
|
||||||
|
{ Constants describing the registers }
|
||||||
|
|
||||||
|
Const
|
||||||
|
Firstreg = R_0;
|
||||||
|
LastReg = R_F31;
|
||||||
|
|
||||||
|
stack_pointer = R_30;
|
||||||
|
frame_pointer = R_15;
|
||||||
|
self_pointer = R_16;
|
||||||
|
accumulator = R_0;
|
||||||
|
|
||||||
|
{ sizes }
|
||||||
|
pointersize = 8;
|
||||||
|
extended_size = 16;
|
||||||
|
|
||||||
|
intregs = [R_0..R_31];
|
||||||
|
fpuregs = [R_F0..R_F31];
|
||||||
|
mmregs = [];
|
||||||
|
|
||||||
|
availabletempregsint = [R_0..R_14,R_16..R_25,R_28];
|
||||||
|
availabletempregsfpu = [R_F0..R_F30];
|
||||||
|
availabletempregsmm = [];
|
||||||
|
|
||||||
|
c_countusableregsint = 26;
|
||||||
|
c_countusableregsfpu = 31;
|
||||||
|
c_countusableregsmm = 0;
|
||||||
|
|
||||||
|
registers_saved_on_cdecl = [R_9..R_14,R_F2..R_F9];
|
||||||
|
maxvarregs = 6;
|
||||||
|
|
||||||
|
varregs : Array [1..maxvarregs] of Tregister =
|
||||||
|
(R_9,R_10,R_11,R_12,R_13,R_14);
|
||||||
|
|
||||||
|
Type
|
||||||
TReference = record
|
TReference = record
|
||||||
offset : aword;
|
offset : aword;
|
||||||
symbol : pasmsymbol;
|
symbol : pasmsymbol;
|
||||||
base : tregister;
|
base : tregister;
|
||||||
|
is_immediate : boolean;
|
||||||
{ the boundary to which the reference is surely aligned }
|
{ the boundary to which the reference is surely aligned }
|
||||||
alignment : byte;
|
alignment : byte;
|
||||||
end;
|
end;
|
||||||
@ -90,8 +141,29 @@ type
|
|||||||
tlocation = record
|
tlocation = record
|
||||||
case loc : tloc of
|
case loc : tloc of
|
||||||
LOC_REFERENCE,LOC_MEM : (reference : treference);
|
LOC_REFERENCE,LOC_MEM : (reference : treference);
|
||||||
|
LOC_REGISTER : (register : tregister);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
{*****************************************************************************
|
||||||
|
Operands
|
||||||
|
*****************************************************************************}
|
||||||
|
|
||||||
|
|
||||||
|
{ Types of operand }
|
||||||
|
toptype=(top_none,top_reg,top_ref,top_const,top_symbol);
|
||||||
|
|
||||||
|
toper=record
|
||||||
|
ot : longint;
|
||||||
|
case typ : toptype of
|
||||||
|
top_none : ();
|
||||||
|
top_reg : (reg:tregister);
|
||||||
|
top_ref : (ref:preference);
|
||||||
|
top_const : (val:longint);
|
||||||
|
top_symbol : (sym:pasmsymbol;symofs:longint);
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Const
|
Const
|
||||||
{ offsets for the integer and floating point registers }
|
{ offsets for the integer and floating point registers }
|
||||||
INT_REG = 0;
|
INT_REG = 0;
|
||||||
@ -106,15 +178,11 @@ Const
|
|||||||
OQ_FLOATING_UNDERFLOW_ENABLE = $20; { /U }
|
OQ_FLOATING_UNDERFLOW_ENABLE = $20; { /U }
|
||||||
OQ_INTEGER_OVERFLOW_ENABLE = $40; { /V }
|
OQ_INTEGER_OVERFLOW_ENABLE = $40; { /V }
|
||||||
|
|
||||||
stack_pointer = R_30;
|
|
||||||
frame_pointer = R_15;
|
|
||||||
self_pointer = R_16;
|
|
||||||
|
|
||||||
{ resets all values of ref to defaults }
|
{ resets all values of ref to defaults }
|
||||||
procedure reset_reference(var ref : treference);
|
procedure reset_reference(var ref : treference);
|
||||||
|
|
||||||
{ set mostly used values of a new reference }
|
{ set mostly used values of a new reference }
|
||||||
function new_reference(base : tregister;offset : longint) : preference;
|
function new_reference(base : tregister;offset : longint) : preference;
|
||||||
|
procedure disposereference(var r : preference);
|
||||||
|
|
||||||
|
|
||||||
implementation
|
implementation
|
||||||
@ -136,11 +204,20 @@ begin
|
|||||||
new_reference:=r;
|
new_reference:=r;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure disposereference(var r : preference);
|
||||||
|
|
||||||
|
begin
|
||||||
|
dispose(r);
|
||||||
|
r:=Nil;
|
||||||
|
end;
|
||||||
|
|
||||||
end.
|
end.
|
||||||
{
|
{
|
||||||
$Log$
|
$Log$
|
||||||
Revision 1.2 1999-08-02 17:16:44 michael
|
Revision 1.3 1999-08-03 00:35:54 michael
|
||||||
|
+ Added varregs
|
||||||
|
|
||||||
|
Revision 1.2 1999/08/02 17:16:44 michael
|
||||||
+ Changes for alpha
|
+ Changes for alpha
|
||||||
|
|
||||||
Revision 1.1 1999/08/01 23:18:36 michael
|
Revision 1.1 1999/08/01 23:18:36 michael
|
||||||
|
Loading…
Reference in New Issue
Block a user