NCG: Split RegAllocInfo into arch specific modules
[ghc-hetmet.git] / compiler / nativeGen / PPC / 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 PPC.Instr (
13         Cond(..),
14         condNegate,
15         RI(..),
16         Instr(..)
17 )
18
19 where
20
21 import BlockId
22 import PPC.Regs
23 import RegsBase
24 import Cmm
25 import Outputable
26 import FastString
27 import CLabel
28
29 data Cond
30         = ALWAYS
31         | EQQ
32         | GE
33         | GEU
34         | GTT
35         | GU
36         | LE
37         | LEU
38         | LTT
39         | LU
40         | NE
41         deriving Eq
42
43
44 condNegate :: Cond -> Cond
45 condNegate ALWAYS  = panic "condNegate: ALWAYS"
46 condNegate EQQ     = NE
47 condNegate GE      = LTT
48 condNegate GEU     = LU
49 condNegate GTT     = LE
50 condNegate GU      = LEU
51 condNegate LE      = GTT
52 condNegate LEU     = GU
53 condNegate LTT     = GE
54 condNegate LU      = GEU
55 condNegate NE      = EQQ
56
57
58 -- -----------------------------------------------------------------------------
59 -- Machine's assembly language
60
61 -- We have a few common "instructions" (nearly all the pseudo-ops) but
62 -- mostly all of 'Instr' is machine-specific.
63
64 -- Register or immediate
65 data RI 
66         = RIReg Reg
67         | RIImm Imm
68
69 data Instr
70         -- comment pseudo-op
71         = COMMENT FastString            
72
73         -- some static data spat out during code
74         -- generation.  Will be extracted before
75         -- pretty-printing.
76         | LDATA   Section [CmmStatic]   
77
78         -- start a new basic block.  Useful during
79         -- codegen, removed later.  Preceding 
80         -- instruction should be a jump, as per the
81         -- invariants for a BasicBlock (see Cmm).
82         | NEWBLOCK BlockId              
83
84         -- specify current stack offset for
85         -- benefit of subsequent passes
86         | DELTA   Int
87
88         -- | spill this reg to a stack slot
89         | SPILL   Reg Int
90
91         -- | reload this reg from a stack slot
92         | RELOAD  Int Reg
93
94         -- Loads and stores.
95         | LD    Size Reg AddrMode       -- Load size, dst, src
96         | LA      Size Reg AddrMode     -- Load arithmetic size, dst, src
97         | ST    Size Reg AddrMode       -- Store size, src, dst 
98         | STU   Size Reg AddrMode       -- Store with Update size, src, dst 
99         | LIS   Reg Imm                 -- Load Immediate Shifted dst, src
100         | LI    Reg Imm                 -- Load Immediate dst, src
101         | MR    Reg Reg                 -- Move Register dst, src -- also for fmr
102               
103         | CMP     Size Reg RI           --- size, src1, src2
104         | CMPL    Size Reg RI           --- size, src1, src2
105               
106         | BCC     Cond BlockId
107         | BCCFAR  Cond BlockId
108         | JMP     CLabel                -- same as branch,
109                                         -- but with CLabel instead of block ID
110         | MTCTR Reg
111         | BCTR    [BlockId]             -- with list of local destinations
112         | BL    CLabel [Reg]            -- with list of argument regs
113         | BCTRL [Reg]
114               
115         | ADD     Reg Reg RI            -- dst, src1, src2
116         | ADDC    Reg Reg Reg           -- (carrying) dst, src1, src2
117         | ADDE    Reg Reg Reg           -- (extend) dst, src1, src2
118         | ADDIS   Reg Reg Imm           -- Add Immediate Shifted dst, src1, src2
119         | SUBF    Reg Reg Reg           -- dst, src1, src2 ; dst = src2 - src1  
120         | MULLW Reg Reg RI
121         | DIVW  Reg Reg Reg
122         | DIVWU Reg Reg Reg
123
124         | MULLW_MayOflo Reg Reg Reg
125                                         -- dst = 1 if src1 * src2 overflows
126                                         -- pseudo-instruction; pretty-printed as:
127                                         -- mullwo. dst, src1, src2
128                                         -- mfxer dst
129                                         -- rlwinm dst, dst, 2, 31,31
130               
131         | AND   Reg Reg RI              -- dst, src1, src2
132         | OR    Reg Reg RI              -- dst, src1, src2
133         | XOR   Reg Reg RI              -- dst, src1, src2
134         | XORIS Reg Reg Imm             -- XOR Immediate Shifted dst, src1, src2
135               
136         | EXTS    Size Reg Reg
137                   
138         | NEG   Reg Reg
139         | NOT   Reg Reg
140               
141         | SLW   Reg Reg RI              -- shift left word
142         | SRW   Reg Reg RI              -- shift right word
143         | SRAW  Reg Reg RI              -- shift right arithmetic word
144               
145                                         -- Rotate Left Word Immediate then AND with Mask
146         | RLWINM  Reg Reg Int Int Int
147               
148         | FADD  Size Reg Reg Reg
149         | FSUB  Size Reg Reg Reg
150         | FMUL  Size Reg Reg Reg
151         | FDIV  Size Reg Reg Reg
152         | FNEG  Reg Reg                 -- negate is the same for single and double prec.
153               
154         | FCMP  Reg Reg
155               
156         | FCTIWZ        Reg Reg         -- convert to integer word
157         | FRSP          Reg Reg         -- reduce to single precision
158                                         -- (but destination is a FP register)
159               
160         | CRNOR   Int Int Int           -- condition register nor
161         | MFCR    Reg                   -- move from condition register
162               
163         | MFLR    Reg                   -- move from link register
164         | FETCHPC Reg                   -- pseudo-instruction:
165                                         -- bcl to next insn, mflr reg
166               
167         | LWSYNC -- memory barrier