087a403f86ddba05d32f07fdd2b534b65e7a6fc9
[ghc-hetmet.git] / ghc / compiler / absCSyn / MachOp.hs
1
2 module MachOp   ( MachOp(..), pprMachOp,
3                   isDefinitelyInlineMachOp, 
4                   isCommutableMachOp,
5                   isComparisonMachOp,
6                   resultRepOfMachOp
7                  )
8 where
9
10 #include "HsVersions.h"
11
12 import PrimRep          ( PrimRep(..) )
13 import Outputable
14
15
16 {- Machine-level primops; ones which we can reasonably delegate to the
17    native code generators to handle.  Basically contains C's primops
18    and no others.
19
20    Nomenclature: all ops indicate width and signedness, where
21    appropriate.  Widths: 8/16/32/64 means the given size, obviously.
22    Nat means the operation works on STG word sized objects.
23    Signedness: S means signed, U means unsigned.  For operations where
24    signedness is irrelevant or makes no difference (for example
25    integer add), the signedness component is omitted.
26
27    An exception: NatP is a ptr-typed native word.  From the point of
28    view of the native code generators this distinction is irrelevant,
29    but the C code generator sometimes needs this info to emit the
30    right casts.  
31 -}
32
33 data MachOp
34
35   -- OPS at the native word size
36   = MO_Nat_Add          -- +
37   | MO_Nat_Sub          -- -
38   | MO_Nat_Eq
39   | MO_Nat_Ne
40
41   | MO_NatS_Ge
42   | MO_NatS_Le
43   | MO_NatS_Gt
44   | MO_NatS_Lt
45
46   | MO_NatU_Ge
47   | MO_NatU_Le
48   | MO_NatU_Gt
49   | MO_NatU_Lt
50
51   | MO_NatS_Mul         -- low word of signed *
52   | MO_NatS_MulMayOflo  -- nonzero if high word of signed * might contain useful info
53   | MO_NatS_Quot        -- signed / (same semantics as IntQuotOp)
54   | MO_NatS_Rem         -- signed % (same semantics as IntRemOp)
55   | MO_NatS_Neg         -- unary -
56
57   | MO_NatU_Mul         -- low word of unsigned *
58   | MO_NatU_Quot        -- unsigned / (same semantics as WordQuotOp)
59   | MO_NatU_Rem         -- unsigned % (same semantics as WordRemOp)
60
61   | MO_Nat_And
62   | MO_Nat_Or
63   | MO_Nat_Xor
64   | MO_Nat_Not
65   | MO_Nat_Shl
66   | MO_Nat_Shr
67   | MO_Nat_Sar
68
69   -- OPS at 32 bits regardless of word size
70   | MO_32U_Eq
71   | MO_32U_Ne
72   | MO_32U_Ge
73   | MO_32U_Le
74   | MO_32U_Gt
75   | MO_32U_Lt
76
77   -- IEEE754 Double ops
78   | MO_Dbl_Eq
79   | MO_Dbl_Ne
80   | MO_Dbl_Ge
81   | MO_Dbl_Le
82   | MO_Dbl_Gt
83   | MO_Dbl_Lt
84
85   | MO_Dbl_Add
86   | MO_Dbl_Sub
87   | MO_Dbl_Mul
88   | MO_Dbl_Div
89   | MO_Dbl_Pwr
90
91   | MO_Dbl_Sin
92   | MO_Dbl_Cos
93   | MO_Dbl_Tan
94   | MO_Dbl_Sinh
95   | MO_Dbl_Cosh
96   | MO_Dbl_Tanh
97   | MO_Dbl_Asin
98   | MO_Dbl_Acos
99   | MO_Dbl_Atan
100   | MO_Dbl_Log
101   | MO_Dbl_Exp
102   | MO_Dbl_Sqrt
103   | MO_Dbl_Neg
104
105   -- IEEE754 Float ops
106   | MO_Flt_Add
107   | MO_Flt_Sub
108   | MO_Flt_Mul
109   | MO_Flt_Div
110   | MO_Flt_Pwr
111
112   | MO_Flt_Eq
113   | MO_Flt_Ne
114   | MO_Flt_Ge
115   | MO_Flt_Le
116   | MO_Flt_Gt
117   | MO_Flt_Lt
118
119   | MO_Flt_Sin
120   | MO_Flt_Cos
121   | MO_Flt_Tan
122   | MO_Flt_Sinh
123   | MO_Flt_Cosh
124   | MO_Flt_Tanh
125   | MO_Flt_Asin
126   | MO_Flt_Acos
127   | MO_Flt_Atan
128   | MO_Flt_Log
129   | MO_Flt_Exp
130   | MO_Flt_Neg
131   | MO_Flt_Sqrt
132
133   -- Conversions.  Some of these are NOPs, in which case they
134   -- are here usually to placate the C code generator.
135   | MO_32U_to_NatS
136   | MO_NatS_to_32U
137
138   | MO_NatS_to_Dbl
139   | MO_Dbl_to_NatS
140
141   | MO_NatS_to_Flt
142   | MO_Flt_to_NatS
143
144   | MO_NatS_to_NatU
145   | MO_NatU_to_NatS
146
147   | MO_NatS_to_NatP
148   | MO_NatP_to_NatS
149   | MO_NatU_to_NatP
150   | MO_NatP_to_NatU
151
152   | MO_Dbl_to_Flt
153   | MO_Flt_to_Dbl
154
155   | MO_8S_to_NatS
156   | MO_16S_to_NatS
157   | MO_32S_to_NatS
158   | MO_8U_to_NatU
159   | MO_16U_to_NatU
160   | MO_32U_to_NatU
161
162   | MO_8U_to_32U        -- zero extend
163   | MO_32U_to_8U        -- mask out all but lowest byte
164
165     deriving Eq
166
167
168
169 -- Almost, but not quite == text . derived show
170 pprMachOp :: MachOp -> SDoc
171
172 pprMachOp MO_Nat_Add       = text "MO_Nat_Add"
173 pprMachOp MO_Nat_Sub       = text "MO_Nat_Sub"
174 pprMachOp MO_Nat_Eq        = text "MO_Nat_Eq"
175 pprMachOp MO_Nat_Ne        = text "MO_Nat_Ne"
176
177 pprMachOp MO_NatS_Ge       = text "MO_NatS_Ge"
178 pprMachOp MO_NatS_Le       = text "MO_NatS_Le"
179 pprMachOp MO_NatS_Gt       = text "MO_NatS_Gt"
180 pprMachOp MO_NatS_Lt       = text "MO_NatS_Lt"
181
182 pprMachOp MO_NatU_Ge       = text "MO_NatU_Ge"
183 pprMachOp MO_NatU_Le       = text "MO_NatU_Le"
184 pprMachOp MO_NatU_Gt       = text "MO_NatU_Gt"
185 pprMachOp MO_NatU_Lt       = text "MO_NatU_Lt"
186
187 pprMachOp MO_NatS_Mul      = text "MO_NatS_Mul"
188 pprMachOp MO_NatS_MulMayOflo = text "MO_NatS_MulMayOflo"
189 pprMachOp MO_NatS_Quot     = text "MO_NatS_Quot"
190 pprMachOp MO_NatS_Rem      = text "MO_NatS_Rem"
191 pprMachOp MO_NatS_Neg      = text "MO_NatS_Neg"
192
193 pprMachOp MO_NatU_Mul      = text "MO_NatU_Mul"
194 pprMachOp MO_NatU_Quot     = text "MO_NatU_Quot"
195 pprMachOp MO_NatU_Rem      = text "MO_NatU_Rem"
196
197 pprMachOp MO_Nat_And       = text "MO_Nat_And"
198 pprMachOp MO_Nat_Or        = text "MO_Nat_Or"
199 pprMachOp MO_Nat_Xor       = text "MO_Nat_Xor"
200 pprMachOp MO_Nat_Not       = text "MO_Nat_Not"
201 pprMachOp MO_Nat_Shl       = text "MO_Nat_Shl"
202 pprMachOp MO_Nat_Shr       = text "MO_Nat_Shr"
203 pprMachOp MO_Nat_Sar       = text "MO_Nat_Sar"
204
205 pprMachOp MO_32U_Eq        = text "MO_32U_Eq"
206 pprMachOp MO_32U_Ne        = text "MO_32U_Ne"
207 pprMachOp MO_32U_Ge        = text "MO_32U_Ge"
208 pprMachOp MO_32U_Le        = text "MO_32U_Le"
209 pprMachOp MO_32U_Gt        = text "MO_32U_Gt"
210 pprMachOp MO_32U_Lt        = text "MO_32U_Lt"
211
212 pprMachOp MO_Dbl_Eq        = text "MO_Dbl_Eq"
213 pprMachOp MO_Dbl_Ne        = text "MO_Dbl_Ne"
214 pprMachOp MO_Dbl_Ge        = text "MO_Dbl_Ge"
215 pprMachOp MO_Dbl_Le        = text "MO_Dbl_Le"
216 pprMachOp MO_Dbl_Gt        = text "MO_Dbl_Gt"
217 pprMachOp MO_Dbl_Lt        = text "MO_Dbl_Lt"
218
219 pprMachOp MO_Dbl_Add       = text "MO_Dbl_Add"
220 pprMachOp MO_Dbl_Sub       = text "MO_Dbl_Sub"
221 pprMachOp MO_Dbl_Mul       = text "MO_Dbl_Mul"
222 pprMachOp MO_Dbl_Div       = text "MO_Dbl_Div"
223 pprMachOp MO_Dbl_Pwr       = text "MO_Dbl_Pwr"
224
225 pprMachOp MO_Dbl_Sin       = text "MO_Dbl_Sin"
226 pprMachOp MO_Dbl_Cos       = text "MO_Dbl_Cos"
227 pprMachOp MO_Dbl_Tan       = text "MO_Dbl_Tan"
228 pprMachOp MO_Dbl_Sinh      = text "MO_Dbl_Sinh"
229 pprMachOp MO_Dbl_Cosh      = text "MO_Dbl_Cosh"
230 pprMachOp MO_Dbl_Tanh      = text "MO_Dbl_Tanh"
231 pprMachOp MO_Dbl_Asin      = text "MO_Dbl_Asin"
232 pprMachOp MO_Dbl_Acos      = text "MO_Dbl_Acos"
233 pprMachOp MO_Dbl_Atan      = text "MO_Dbl_Atan"
234 pprMachOp MO_Dbl_Log       = text "MO_Dbl_Log"
235 pprMachOp MO_Dbl_Exp       = text "MO_Dbl_Exp"
236 pprMachOp MO_Dbl_Sqrt      = text "MO_Dbl_Sqrt"
237 pprMachOp MO_Dbl_Neg       = text "MO_Dbl_Neg"
238
239 pprMachOp MO_Flt_Add       = text "MO_Flt_Add"
240 pprMachOp MO_Flt_Sub       = text "MO_Flt_Sub"
241 pprMachOp MO_Flt_Mul       = text "MO_Flt_Mul"
242 pprMachOp MO_Flt_Div       = text "MO_Flt_Div"
243 pprMachOp MO_Flt_Pwr       = text "MO_Flt_Pwr"
244
245 pprMachOp MO_Flt_Eq        = text "MO_Flt_Eq"
246 pprMachOp MO_Flt_Ne        = text "MO_Flt_Ne"
247 pprMachOp MO_Flt_Ge        = text "MO_Flt_Ge"
248 pprMachOp MO_Flt_Le        = text "MO_Flt_Le"
249 pprMachOp MO_Flt_Gt        = text "MO_Flt_Gt"
250 pprMachOp MO_Flt_Lt        = text "MO_Flt_Lt"
251
252 pprMachOp MO_Flt_Sin       = text "MO_Flt_Sin"
253 pprMachOp MO_Flt_Cos       = text "MO_Flt_Cos"
254 pprMachOp MO_Flt_Tan       = text "MO_Flt_Tan"
255 pprMachOp MO_Flt_Sinh      = text "MO_Flt_Sinh"
256 pprMachOp MO_Flt_Cosh      = text "MO_Flt_Cosh"
257 pprMachOp MO_Flt_Tanh      = text "MO_Flt_Tanh"
258 pprMachOp MO_Flt_Asin      = text "MO_Flt_Asin"
259 pprMachOp MO_Flt_Acos      = text "MO_Flt_Acos"
260 pprMachOp MO_Flt_Atan      = text "MO_Flt_Atan"
261 pprMachOp MO_Flt_Log       = text "MO_Flt_Log"
262 pprMachOp MO_Flt_Exp       = text "MO_Flt_Exp"
263 pprMachOp MO_Flt_Sqrt      = text "MO_Flt_Sqrt"
264 pprMachOp MO_Flt_Neg       = text "MO_Flt_Neg"
265
266 pprMachOp MO_32U_to_NatS   = text "MO_32U_to_NatS"
267 pprMachOp MO_NatS_to_32U   = text "MO_NatS_to_32U"
268
269 pprMachOp MO_NatS_to_Dbl   = text "MO_NatS_to_Dbl"
270 pprMachOp MO_Dbl_to_NatS   = text "MO_Dbl_to_NatS"
271
272 pprMachOp MO_NatS_to_Flt   = text "MO_NatS_to_Flt"
273 pprMachOp MO_Flt_to_NatS   = text "MO_Flt_to_NatS"
274
275 pprMachOp MO_NatS_to_NatU  = text "MO_NatS_to_NatU"
276 pprMachOp MO_NatU_to_NatS  = text "MO_NatU_to_NatS"
277
278 pprMachOp MO_NatS_to_NatP  = text "MO_NatS_to_NatP"
279 pprMachOp MO_NatP_to_NatS  = text "MO_NatP_to_NatS"
280 pprMachOp MO_NatU_to_NatP  = text "MO_NatU_to_NatP"
281 pprMachOp MO_NatP_to_NatU  = text "MO_NatP_to_NatU"
282
283 pprMachOp MO_Dbl_to_Flt    = text "MO_Dbl_to_Flt"
284 pprMachOp MO_Flt_to_Dbl    = text "MO_Flt_to_Dbl"
285
286 pprMachOp MO_8S_to_NatS    = text "MO_8S_to_NatS"
287 pprMachOp MO_16S_to_NatS   = text "MO_16S_to_NatS"
288 pprMachOp MO_32S_to_NatS   = text "MO_32S_to_NatS"
289
290 pprMachOp MO_8U_to_NatU    = text "MO_8U_to_NatU"
291 pprMachOp MO_16U_to_NatU   = text "MO_16U_to_NatU"
292 pprMachOp MO_32U_to_NatU   = text "MO_32U_to_NatU"
293
294 pprMachOp MO_8U_to_32U     = text "MO_8U_to_32U"
295 pprMachOp MO_32U_to_8U     = text "MO_32U_to_8U"
296
297
298
299 -- Non-exported helper enumeration:
300 data MO_Prop 
301    = MO_Commutable 
302    | MO_DefinitelyInline 
303    | MO_Comparison
304      deriving Eq
305
306 comm   = MO_Commutable
307 inline = MO_DefinitelyInline
308 comp   = MO_Comparison
309
310
311 -- If in doubt, return False.  This generates worse code on the
312 -- via-C route, but has no effect on the native code routes.
313 -- Remember that claims about definitely inline have to be true
314 -- regardless of what the C compiler does, so we need to be 
315 -- careful about boundary cases like sqrt which are sometimes
316 -- implemented in software and sometimes in hardware.
317 isDefinitelyInlineMachOp :: MachOp -> Bool
318 isDefinitelyInlineMachOp mop = inline `elem` snd (machOpProps mop)
319
320 -- If in doubt, return False.  This generates worse code on the
321 -- native routes, but is otherwise harmless.
322 isCommutableMachOp :: MachOp -> Bool
323 isCommutableMachOp mop = comm `elem` snd (machOpProps mop)
324
325 -- If in doubt, return False.  This generates worse code on the
326 -- native routes, but is otherwise harmless.
327 isComparisonMachOp :: MachOp -> Bool
328 isComparisonMachOp mop = comp `elem` snd (machOpProps mop)
329
330 -- Find the PrimRep for the returned value of the MachOp.
331 resultRepOfMachOp :: MachOp -> PrimRep
332 resultRepOfMachOp mop = fst (machOpProps mop)
333
334 -- This bit does the real work.
335 machOpProps :: MachOp -> (PrimRep, [MO_Prop])
336
337 machOpProps MO_Nat_Add       = (IntRep, [inline, comm])
338 machOpProps MO_Nat_Sub       = (IntRep, [inline])
339 machOpProps MO_Nat_Eq        = (IntRep, [inline, comp, comm])
340 machOpProps MO_Nat_Ne        = (IntRep, [inline, comp, comm])
341
342 machOpProps MO_NatS_Ge       = (IntRep, [inline, comp])
343 machOpProps MO_NatS_Le       = (IntRep, [inline, comp])
344 machOpProps MO_NatS_Gt       = (IntRep, [inline, comp])
345 machOpProps MO_NatS_Lt       = (IntRep, [inline, comp])
346
347 machOpProps MO_NatU_Ge       = (IntRep, [inline, comp])
348 machOpProps MO_NatU_Le       = (IntRep, [inline, comp])
349 machOpProps MO_NatU_Gt       = (IntRep, [inline, comp])
350 machOpProps MO_NatU_Lt       = (IntRep, [inline, comp])
351
352 machOpProps MO_NatS_Mul      = (IntRep, [inline, comm])
353 machOpProps MO_NatS_MulMayOflo = (IntRep, [inline, comm])
354 machOpProps MO_NatS_Quot     = (IntRep, [inline])
355 machOpProps MO_NatS_Rem      = (IntRep, [inline])
356 machOpProps MO_NatS_Neg      = (IntRep, [inline])
357
358 machOpProps MO_NatU_Mul      = (WordRep, [inline, comm])
359 machOpProps MO_NatU_Quot     = (WordRep, [inline])
360 machOpProps MO_NatU_Rem      = (WordRep, [inline])
361
362 machOpProps MO_Nat_And       = (IntRep, [inline, comm])
363 machOpProps MO_Nat_Or        = (IntRep, [inline, comm])
364 machOpProps MO_Nat_Xor       = (IntRep, [inline, comm])
365 machOpProps MO_Nat_Not       = (IntRep, [inline])
366 machOpProps MO_Nat_Shl       = (IntRep, [inline])
367 machOpProps MO_Nat_Shr       = (IntRep, [inline])
368 machOpProps MO_Nat_Sar       = (IntRep, [inline])
369
370 machOpProps MO_32U_Eq        = (IntRep, [inline, comp, comm])
371 machOpProps MO_32U_Ne        = (IntRep, [inline, comp, comm])
372 machOpProps MO_32U_Ge        = (IntRep, [inline, comp])
373 machOpProps MO_32U_Le        = (IntRep, [inline, comp])
374 machOpProps MO_32U_Gt        = (IntRep, [inline, comp])
375 machOpProps MO_32U_Lt        = (IntRep, [inline, comp])
376
377 machOpProps MO_Dbl_Eq        = (IntRep, [inline, comp, comm])
378 machOpProps MO_Dbl_Ne        = (IntRep, [inline, comp, comm])
379 machOpProps MO_Dbl_Ge        = (IntRep, [inline, comp])
380 machOpProps MO_Dbl_Le        = (IntRep, [inline, comp])
381 machOpProps MO_Dbl_Gt        = (IntRep, [inline, comp])
382 machOpProps MO_Dbl_Lt        = (IntRep, [inline, comp])
383
384 machOpProps MO_Dbl_Add       = (DoubleRep, [inline, comm])
385 machOpProps MO_Dbl_Sub       = (DoubleRep, [inline])
386 machOpProps MO_Dbl_Mul       = (DoubleRep, [inline, comm])
387 machOpProps MO_Dbl_Div       = (DoubleRep, [inline])
388 machOpProps MO_Dbl_Pwr       = (DoubleRep, [])
389
390 machOpProps MO_Dbl_Sin       = (DoubleRep, [])
391 machOpProps MO_Dbl_Cos       = (DoubleRep, [])
392 machOpProps MO_Dbl_Tan       = (DoubleRep, [])
393 machOpProps MO_Dbl_Sinh      = (DoubleRep, [])
394 machOpProps MO_Dbl_Cosh      = (DoubleRep, [])
395 machOpProps MO_Dbl_Tanh      = (DoubleRep, [])
396 machOpProps MO_Dbl_Asin      = (DoubleRep, [])
397 machOpProps MO_Dbl_Acos      = (DoubleRep, [])
398 machOpProps MO_Dbl_Atan      = (DoubleRep, [])
399 machOpProps MO_Dbl_Log       = (DoubleRep, [])
400 machOpProps MO_Dbl_Exp       = (DoubleRep, [])
401 machOpProps MO_Dbl_Sqrt      = (DoubleRep, [])
402 machOpProps MO_Dbl_Neg       = (DoubleRep, [inline])
403
404 machOpProps MO_Flt_Add       = (FloatRep, [inline, comm])
405 machOpProps MO_Flt_Sub       = (FloatRep, [inline])
406 machOpProps MO_Flt_Mul       = (FloatRep, [inline, comm])
407 machOpProps MO_Flt_Div       = (FloatRep, [inline])
408 machOpProps MO_Flt_Pwr       = (FloatRep, [])
409
410 machOpProps MO_Flt_Eq        = (IntRep, [inline, comp, comm])
411 machOpProps MO_Flt_Ne        = (IntRep, [inline, comp, comm])
412 machOpProps MO_Flt_Ge        = (IntRep, [inline, comp])
413 machOpProps MO_Flt_Le        = (IntRep, [inline, comp])
414 machOpProps MO_Flt_Gt        = (IntRep, [inline, comp])
415 machOpProps MO_Flt_Lt        = (IntRep, [inline, comp])
416
417 machOpProps MO_Flt_Sin       = (FloatRep, [])
418 machOpProps MO_Flt_Cos       = (FloatRep, [])
419 machOpProps MO_Flt_Tan       = (FloatRep, [])
420 machOpProps MO_Flt_Sinh      = (FloatRep, [])
421 machOpProps MO_Flt_Cosh      = (FloatRep, [])
422 machOpProps MO_Flt_Tanh      = (FloatRep, [])
423 machOpProps MO_Flt_Asin      = (FloatRep, [])
424 machOpProps MO_Flt_Acos      = (FloatRep, [])
425 machOpProps MO_Flt_Atan      = (FloatRep, [])
426 machOpProps MO_Flt_Log       = (FloatRep, [])
427 machOpProps MO_Flt_Exp       = (FloatRep, [])
428 machOpProps MO_Flt_Sqrt      = (FloatRep, [])
429 machOpProps MO_Flt_Neg       = (FloatRep, [inline])
430
431 machOpProps MO_32U_to_NatS   = (IntRep, [inline])
432 machOpProps MO_NatS_to_32U   = (Word32Rep, [inline])
433
434 machOpProps MO_NatS_to_Dbl   = (DoubleRep, [inline])
435 machOpProps MO_Dbl_to_NatS   = (IntRep, [inline])
436
437 machOpProps MO_NatS_to_Flt   = (FloatRep, [inline])
438 machOpProps MO_Flt_to_NatS   = (IntRep, [inline])
439
440 machOpProps MO_NatS_to_NatU  = (WordRep, [inline])
441 machOpProps MO_NatU_to_NatS  = (IntRep, [inline])
442
443 machOpProps MO_NatS_to_NatP  = (PtrRep, [inline])
444 machOpProps MO_NatP_to_NatS  = (IntRep, [inline])
445 machOpProps MO_NatU_to_NatP  = (PtrRep, [inline])
446 machOpProps MO_NatP_to_NatU  = (WordRep, [inline])
447
448 machOpProps MO_Dbl_to_Flt    = (FloatRep, [inline])
449 machOpProps MO_Flt_to_Dbl    = (DoubleRep, [inline])
450
451 machOpProps MO_8S_to_NatS    = (IntRep, [inline])
452 machOpProps MO_16S_to_NatS   = (IntRep, [inline])
453 machOpProps MO_32S_to_NatS   = (IntRep, [inline])
454
455 machOpProps MO_8U_to_NatU    = (WordRep, [inline])
456 machOpProps MO_16U_to_NatU   = (WordRep, [inline])
457 machOpProps MO_32U_to_NatU   = (WordRep, [inline])
458
459 machOpProps MO_8U_to_32U     = (Word32Rep, [inline])
460 machOpProps MO_32U_to_8U     = (Word8Rep, [inline])