e2d66d3c0229ef2a4e0ede823875e8b1d57dcde0
[ghc-hetmet.git] / compiler / nativeGen / Alpha / Instr.hs
1 -----------------------------------------------------------------------------
2 --
3 -- Machine-dependent assembly language
4 --
5 -- (c) The University of Glasgow 1993-2004
6 --
7 -----------------------------------------------------------------------------
8
9 #include "HsVersions.h"
10 #include "nativeGen/NCG.h"
11
12 module Alpha.Instr (
13         Cond(..),
14         Instr(..),
15         RI(..)
16 )
17
18 where
19
20 import BlockId
21 import Regs
22 import Cmm
23 import FastString
24 import CLabel
25
26 data Cond
27         = ALWAYS        -- For BI (same as BR)
28         | EQQ           -- For CMP and BI (NB: "EQ" is a 1.3 Prelude name)
29         | GE            -- For BI only
30         | GTT           -- For BI only (NB: "GT" is a 1.3 Prelude name)
31         | LE            -- For CMP and BI
32         | LTT           -- For CMP and BI (NB: "LT" is a 1.3 Prelude name)
33         | NE            -- For BI only
34         | NEVER         -- For BI (null instruction)
35         | ULE           -- For CMP only
36         | ULT           -- For CMP only
37         deriving Eq
38         
39
40 -- -----------------------------------------------------------------------------
41 -- Machine's assembly language
42
43 -- We have a few common "instructions" (nearly all the pseudo-ops) but
44 -- mostly all of 'Instr' is machine-specific.
45
46 -- Register or immediate
47 data RI 
48         = RIReg Reg
49         | RIImm Imm
50
51 data Instr
52         -- comment pseudo-op
53         = COMMENT FastString            
54
55         -- some static data spat out during code
56         -- generation.  Will be extracted before
57         -- pretty-printing.
58         | LDATA   Section [CmmStatic]   
59
60         -- start a new basic block.  Useful during
61         -- codegen, removed later.  Preceding 
62         -- instruction should be a jump, as per the
63         -- invariants for a BasicBlock (see Cmm).
64         | NEWBLOCK BlockId              
65
66         -- specify current stack offset for
67         -- benefit of subsequent passes
68         | DELTA   Int
69
70         -- | spill this reg to a stack slot
71         | SPILL   Reg Int
72
73         -- | reload this reg from a stack slot
74         | RELOAD  Int Reg
75
76         -- Loads and stores.
77         | LD          Size Reg AddrMode         -- size, dst, src
78         | LDA         Reg AddrMode              -- dst, src
79         | LDAH        Reg AddrMode              -- dst, src
80         | LDGP        Reg AddrMode              -- dst, src
81         | LDI         Size Reg Imm              -- size, dst, src
82         | ST          Size Reg AddrMode         -- size, src, dst
83
84         -- Int Arithmetic.
85         | CLR         Reg                       -- dst
86         | ABS         Size RI Reg               -- size, src, dst
87         | NEG         Size Bool RI Reg          -- size, overflow, src, dst
88         | ADD         Size Bool Reg RI Reg      -- size, overflow, src, src, dst
89         | SADD        Size Size Reg RI Reg      -- size, scale, src, src, dst
90         | SUB         Size Bool Reg RI Reg      -- size, overflow, src, src, dst
91         | SSUB        Size Size Reg RI Reg      -- size, scale, src, src, dst
92         | MUL         Size Bool Reg RI Reg      -- size, overflow, src, src, dst
93         | DIV         Size Bool Reg RI Reg      -- size, unsigned, src, src, dst
94         | REM         Size Bool Reg RI Reg      -- size, unsigned, src, src, dst
95
96         -- Simple bit-twiddling.
97         | NOT         RI Reg
98         | AND         Reg RI Reg
99         | ANDNOT      Reg RI Reg
100         | OR          Reg RI Reg
101         | ORNOT       Reg RI Reg
102         | XOR         Reg RI Reg
103         | XORNOT      Reg RI Reg
104         | SLL         Reg RI Reg
105         | SRL         Reg RI Reg
106         | SRA         Reg RI Reg
107
108         | ZAP         Reg RI Reg
109         | ZAPNOT      Reg RI Reg
110
111         | NOP
112
113         -- Comparison
114         | CMP         Cond Reg RI Reg
115
116         -- Float Arithmetic.
117         | FCLR        Reg
118         | FABS        Reg Reg
119         | FNEG        Size Reg Reg
120         | FADD        Size Reg Reg Reg
121         | FDIV        Size Reg Reg Reg
122         | FMUL        Size Reg Reg Reg
123         | FSUB        Size Reg Reg Reg
124         | CVTxy       Size Size Reg Reg
125         | FCMP        Size Cond Reg Reg Reg
126         | FMOV        Reg Reg
127
128         -- Jumping around.
129         | BI          Cond Reg Imm
130         | BF          Cond Reg Imm
131         | BR          Imm
132         | JMP         Reg AddrMode Int
133         | BSR         Imm Int
134         | JSR         Reg AddrMode Int
135
136         -- Alpha-specific pseudo-ops.
137         | FUNBEGIN CLabel
138         | FUNEND CLabel
139
140