fpc/compiler/ia64/cpuasm.pas
2002-09-07 15:25:00 +00:00

310 lines
9.4 KiB
ObjectPascal

{
$Id$
Copyright (c) 2000 by Florian Klaempfl
Contains the assembler object for the ia64
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
****************************************************************************
}
unit cpuasm;
{$i fpcdefs.inc}
interface
uses
cobjects,
aasm,globals,verbose,
cpubase;
type
pairegalloc = ^tairegalloc;
tairegalloc = class(tai)
allocation : boolean;
reg : tregister;
constructor alloc(r : tregister);
constructor dealloc(r : tregister);
end;
{ Types of operand }
toptype=(top_none,top_reg,top_ref,top_const,top_symbol,top_qp);
toper=record
case typ : toptype of
top_none : ();
top_reg : (reg:tregister);
top_qp : (qp : tqp);
top_ref : (ref:preference);
top_const : (val:int64);
top_symbol : (sym:pasmsymbol;symofs:longint);
end;
paicpu = ^taicpu;
taicpu = class(tai)
is_jmp : boolean; { is this instruction a jump? (needed for optimizer) }
opcode : tasmop;
ops : array[0..4] of longint;
oper : longint;
qp : tqp;
ldsttype : tldsttype;
hint : thint;
{ ALU instructions }
{ A1,A9: integer ALU }
constructor op_reg_reg_reg(op : tasmop;const r1,r2,r3 : tregister);
{ A2,A10: shift left and add }
constructor op_reg_reg_const_reg(_qp : tqp;op : tasmop;
const r1,r2 : tregister;i : byte;const r3 : tregister);
{ A3,A4,A5: integer ALU - imm.,register }
constructor op_reg_const_reg(_qp : tqp;op : tasmop;
const r1 : tregister;i : longint;const r3 : tregister);
{ A6,A7: integer compare - register,register }
constructor op_preg_preg_reg_reg(_qp : tqp;op : tasmop;
cond : tasmcond;p1,p2 : tqp;const r2,r3 : tregister);
{ A8: integer compare - imm.,register }
constructor op_preg_preg_const_reg(_qp : tqp;op : tasmop;
cond : tasmcond;p1,p2 : tqp;i : longint;const r3 : tregister);
{!!!!!!!
{ multimedia shift and multiply }
constructor op_reg_reg_reg_const(_qp : tqp;
{ multimedia mux }
constructor op_reg_reg_mbtype(_qp : tqp;
{ multimedia shift fixed }
constructor op_reg_reg_const(_qp : tqp;
{ div. }
constructor op_reg_reg(_qp : tqp;
{ mm extract }
constructor op_reg_reg_const_const(_qp : tqp;
{ zero and deposit imm }
constructor op_reg_const_const_const(_qp : tqp;
{ deposit imm }
constructor op_reg_const_reg_const_const(_qp : tqp;
{ deposit }
constructor op_reg_reg_reg_const_const(_qp : tqp;
{ test bit }
{ !!!! here we need also to take care of the postfix }
constructor op_preg_preg_reg_const(_qp : tqp;
{ test NaT }
{ !!!! here we need also to take care of the postfix }
constructor op_preg_preg_reg(_qp : tqp;
{ -------- here are some missed ----------- }
}
{ M1: integer load }
{ M4: integer store }
{ M6: floating-point load }
{ M9: floating-point store }
constructor op_reg_ref(_qp : tqp;op : tasmop;postfix : tldsttype;
_hint : thint;const r1 : tregister;ref : preference);
{ M2: integer load incremented by register }
{ M7: floating-point load incremented by register }
constructor op_reg_ref_reg(_qp : tqp;op : tasmop;postfix : tldsttype;
_hint : thint;const r1 : tregister;const ref : treference;
const r2 : tregister);
{ M3: integer load increment by imm. }
{ M5: integer store increment by imm. }
{ M8: floating-point load increment by imm. }
{ M10: floating-point store increment by imm. }
constructor op_reg_ref_const(_qp : tqp;op : tasmop;postfix : tldsttype;
_hint : thint;const r1 : tregister;ref : preference;i : longint);
{ M11: floating-point load pair}
constructor op_reg_ref(_qp : tqp;op : tasmop;postfix : tldsttype;
_hint : thint;const r1,r2 : tregister;ref : preference);
{ M12: floating-point load pair increment by imm. }
constructor op_reg_ref(_qp : tqp;op : tasmop;postfix : tldsttype;
_hint : thint;const r1,r2 : tregister;ref : preference;i : longint);
{ X1: break/nop }
constructor op_const62(_qp : tqp;op : tasmop;i : int64);
{ X2: move imm64 }
constructor op_reg_const64(_qp : tqp;op : tasmop;const r1 : tregister;
i : int64);
end;
{ the following objects are special for the ia64 }
{ they decribe a stop and the bundles }
paistop = ^taistop;
taistop = class(tai)
constructor init;
end;
{ a second underscro indicates a stop }
tbundletemplate = (but_none,but_mii,but_mii_,
but_mi_i,but_mi_i_,but_mlx,but_mlx_,
but_mmi,but_mmi_,but_m_mi,but_m_mi_,
but_mfi,but_mfi_,but_mmf,but_mmf_,
but_mif,but_mib_,but_mbb,but_mbb_,
but_bbb,but_bbb_,but_mmb,but_mmb_,
but_mfb,but_mfb_);
paibundle = ^taibundle;
taibundle = class(tai)
template : tbundletemplate;
instructions : array[0..1] of paicpu;
end;
implementation
{*****************************************************************************
TaiStop
*****************************************************************************}
constructor taistop.init;
begin
inherited create;
typ:=ait_stop;
end;
{*****************************************************************************
TaiRegAlloc
*****************************************************************************}
constructor tairegalloc.alloc(r : tregister);
begin
inherited create;
typ:=ait_regalloc;
allocation:=true;
reg:=r;
end;
constructor tairegalloc.dealloc(r : tregister);
begin
inherited create;
typ:=ait_regalloc;
allocation:=false;
reg:=r;
end;
{*****************************************************************************
Taicpu
*****************************************************************************}
{ ALU instructions }
{ A1,A9: integer ALU }
constructor taicpu.op_reg_reg_reg(op : tasmop;const r1,r2,r3 : tregister);
begin
end;
{ A2,A10: shift left and add }
constructor taicpu.op_reg_reg_const_reg(_qp : tqp;op : tasmop;
const r1,r2 : tregister;i : byte;const r3 : tregister);
begin
end;
{ A3,A4,A5: integer ALU - imm.,register }
constructor taicpu.op_reg_const_reg(_qp : tqp;op : tasmop;
const r1 : tregister;i : longint;const r3 : tregister);
begin
end;
{ A6,A7: integer compare - register,register }
constructor taicpu.op_preg_preg_reg_reg(_qp : tqp;op : tasmop;
cond : tasmcond;p1,p2 : tqp;const r2,r3 : tregister);
begin
end;
{ A8: integer compare - imm.,register }
constructor taicpu.op_preg_preg_const_reg(_qp : tqp;op : tasmop;
cond : tasmcond;p1,p2 : tqp;i : longint;const r3 : tregister);
begin
end;
{ M1: integer load }
{ M4: integer store }
{ M6: floating-point load }
{ M9: floating-point store }
constructor taicpu.op_reg_ref(_qp : tqp;op : tasmop;postfix : tldsttype;
_hint : thint;const r1 : tregister;ref : preference);
begin
end;
{ M2: integer load incremented by register }
{ M7: floating-point load incremented by register }
constructor taicpu.op_reg_ref_reg(_qp : tqp;op : tasmop;postfix : tldsttype;
_hint : thint;const r1 : tregister;const ref : treference;
const r2 : tregister);
begin
end;
{ M3: integer load increment by imm. }
{ M5: integer store increment by imm. }
{ M8: floating-point load increment by imm. }
{ M10: floating-point store increment by imm. }
constructor taicpu.op_reg_ref_const(_qp : tqp;op : tasmop;postfix : tldsttype;
_hint : thint;const r1 : tregister;ref : preference;i : longint);
begin
end;
{ M11: floating-point load pair}
constructor taicpu.op_reg_ref(_qp : tqp;op : tasmop;postfix : tldsttype;
_hint : thint;const r1,r2 : tregister;ref : preference);
begin
end;
{ M12: floating-point load pair increment by imm. }
constructor taicpu.op_reg_ref(_qp : tqp;op : tasmop;postfix : tldsttype;
_hint : thint;const r1,r2 : tregister;ref : preference;i : longint);
begin
end;
{ X1: break/nop }
constructor taicpu.op_const62(_qp : tqp;op : tasmop;i : int64);
{ X2: move imm64 }
begin
end;
constructor taicpu.op_reg_const64(_qp : tqp;op : tasmop;const r1 : tregister;
i : int64);
begin
end;
end.
{
$Log$
Revision 1.4 2002-09-07 15:25:11 peter
* old logs removed and tabs fixed
Revision 1.3 2002/05/16 19:46:52 carl
+ defines.inc -> fpcdefs.inc to avoid conflicts if compiling by hand
+ try to fix temp allocation (still in ifdef)
+ generic constructor calls
+ start of tassembler / tmodulebase class cleanup
}