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