2 module MachOp ( MachOp(..), pprMachOp,
3 isDefinitelyInlineMachOp,
10 #include "HsVersions.h"
12 import PrimRep ( PrimRep(..) )
13 import Maybes ( Maybe012(..) )
17 {- Machine-level primops; ones which we can reasonably delegate to the
18 native code generators to handle. Basically contains C's primops
21 Nomenclature: all ops indicate width and signedness, where
22 appropriate. Widths: 8/16/32/64 means the given size, obviously.
23 Nat means the native word size. Signedness: S means signed, U
24 means unsigned. For operations where signedness is irrelevant or
25 makes no difference (for example integer add), the signedness
28 An exception: NatP is a ptr-typed native word. From the point of
29 view of the native code generators this distinction is irrelevant,
30 but the C code generator sometimes needs this info to emit the
36 -- OPS at the native word size
52 | MO_NatS_Mul -- signed *
53 | MO_NatS_Quot -- signed / (same semantics as IntQuotOp)
54 | MO_NatS_Rem -- signed % (same semantics as IntRemOp)
55 | MO_NatS_Neg -- unary -
57 | MO_NatU_Mul -- unsigned *
58 | MO_NatU_Quot -- unsigned / (same semantics as WordQuotOp)
59 | MO_NatU_Rem -- unsigned % (same semantics as WordRemOp)
61 | MO_NatS_AddC -- signed +, first result sum, second result carry
62 | MO_NatS_SubC -- signed -, first result sum, second result borrow
63 | MO_NatS_MulC -- signed *, first result sum, second result carry
73 -- OPS at 32 bits regardless of word size
137 -- Conversions. Some of these are NOPs, in which case they
138 -- are here usually to placate the C code generator.
166 -- Reading/writing arrays
167 | MO_ReadOSBI Int PrimRep -- [base_ptr, index_value]
168 | MO_WriteOSBI Int PrimRep -- [base_ptr, index_value, value_to_write]
169 -- Read/write a value :: the PrimRep
171 -- sizeof(machine_word)*Int + base_ptr + sizeof(PrimRep)*index_value
176 -- Almost, but not quite == text . derived show
177 pprMachOp :: MachOp -> SDoc
179 pprMachOp MO_Nat_Add = text "MO_Nat_Add"
180 pprMachOp MO_Nat_Sub = text "MO_Nat_Sub"
181 pprMachOp MO_Nat_Eq = text "MO_Nat_Eq"
182 pprMachOp MO_Nat_Ne = text "MO_Nat_Ne"
184 pprMachOp MO_NatS_Ge = text "MO_NatS_Ge"
185 pprMachOp MO_NatS_Le = text "MO_NatS_Le"
186 pprMachOp MO_NatS_Gt = text "MO_NatS_Gt"
187 pprMachOp MO_NatS_Lt = text "MO_NatS_Lt"
189 pprMachOp MO_NatU_Ge = text "MO_NatU_Ge"
190 pprMachOp MO_NatU_Le = text "MO_NatU_Le"
191 pprMachOp MO_NatU_Gt = text "MO_NatU_Gt"
192 pprMachOp MO_NatU_Lt = text "MO_NatU_Lt"
194 pprMachOp MO_NatS_Mul = text "MO_NatS_Mul"
195 pprMachOp MO_NatS_Quot = text "MO_NatS_Quot"
196 pprMachOp MO_NatS_Rem = text "MO_NatS_Rem"
197 pprMachOp MO_NatS_Neg = text "MO_NatS_Neg"
199 pprMachOp MO_NatU_Mul = text "MO_NatU_Mul"
200 pprMachOp MO_NatU_Quot = text "MO_NatU_Quot"
201 pprMachOp MO_NatU_Rem = text "MO_NatU_Rem"
203 pprMachOp MO_NatS_AddC = text "MO_NatS_AddC"
204 pprMachOp MO_NatS_SubC = text "MO_NatS_SubC"
205 pprMachOp MO_NatS_MulC = text "MO_NatS_MulC"
207 pprMachOp MO_Nat_And = text "MO_Nat_And"
208 pprMachOp MO_Nat_Or = text "MO_Nat_Or"
209 pprMachOp MO_Nat_Xor = text "MO_Nat_Xor"
210 pprMachOp MO_Nat_Not = text "MO_Nat_Not"
211 pprMachOp MO_Nat_Shl = text "MO_Nat_Shl"
212 pprMachOp MO_Nat_Shr = text "MO_Nat_Shr"
213 pprMachOp MO_Nat_Sar = text "MO_Nat_Sar"
215 pprMachOp MO_32U_Eq = text "MO_32U_Eq"
216 pprMachOp MO_32U_Ne = text "MO_32U_Ne"
217 pprMachOp MO_32U_Ge = text "MO_32U_Ge"
218 pprMachOp MO_32U_Le = text "MO_32U_Le"
219 pprMachOp MO_32U_Gt = text "MO_32U_Gt"
220 pprMachOp MO_32U_Lt = text "MO_32U_Lt"
222 pprMachOp MO_Dbl_Eq = text "MO_Dbl_Eq"
223 pprMachOp MO_Dbl_Ne = text "MO_Dbl_Ne"
224 pprMachOp MO_Dbl_Ge = text "MO_Dbl_Ge"
225 pprMachOp MO_Dbl_Le = text "MO_Dbl_Le"
226 pprMachOp MO_Dbl_Gt = text "MO_Dbl_Gt"
227 pprMachOp MO_Dbl_Lt = text "MO_Dbl_Lt"
229 pprMachOp MO_Dbl_Add = text "MO_Dbl_Add"
230 pprMachOp MO_Dbl_Sub = text "MO_Dbl_Sub"
231 pprMachOp MO_Dbl_Mul = text "MO_Dbl_Mul"
232 pprMachOp MO_Dbl_Div = text "MO_Dbl_Div"
233 pprMachOp MO_Dbl_Pwr = text "MO_Dbl_Pwr"
235 pprMachOp MO_Dbl_Sin = text "MO_Dbl_Sin"
236 pprMachOp MO_Dbl_Cos = text "MO_Dbl_Cos"
237 pprMachOp MO_Dbl_Tan = text "MO_Dbl_Tan"
238 pprMachOp MO_Dbl_Sinh = text "MO_Dbl_Sinh"
239 pprMachOp MO_Dbl_Cosh = text "MO_Dbl_Cosh"
240 pprMachOp MO_Dbl_Tanh = text "MO_Dbl_Tanh"
241 pprMachOp MO_Dbl_Asin = text "MO_Dbl_Asin"
242 pprMachOp MO_Dbl_Acos = text "MO_Dbl_Acos"
243 pprMachOp MO_Dbl_Atan = text "MO_Dbl_Atan"
244 pprMachOp MO_Dbl_Log = text "MO_Dbl_Log"
245 pprMachOp MO_Dbl_Exp = text "MO_Dbl_Exp"
246 pprMachOp MO_Dbl_Sqrt = text "MO_Dbl_Sqrt"
247 pprMachOp MO_Dbl_Neg = text "MO_Dbl_Neg"
249 pprMachOp MO_Flt_Add = text "MO_Flt_Add"
250 pprMachOp MO_Flt_Sub = text "MO_Flt_Sub"
251 pprMachOp MO_Flt_Mul = text "MO_Flt_Mul"
252 pprMachOp MO_Flt_Div = text "MO_Flt_Div"
253 pprMachOp MO_Flt_Pwr = text "MO_Flt_Pwr"
255 pprMachOp MO_Flt_Eq = text "MO_Flt_Eq"
256 pprMachOp MO_Flt_Ne = text "MO_Flt_Ne"
257 pprMachOp MO_Flt_Ge = text "MO_Flt_Ge"
258 pprMachOp MO_Flt_Le = text "MO_Flt_Le"
259 pprMachOp MO_Flt_Gt = text "MO_Flt_Gt"
260 pprMachOp MO_Flt_Lt = text "MO_Flt_Lt"
262 pprMachOp MO_Flt_Sin = text "MO_Flt_Sin"
263 pprMachOp MO_Flt_Cos = text "MO_Flt_Cos"
264 pprMachOp MO_Flt_Tan = text "MO_Flt_Tan"
265 pprMachOp MO_Flt_Sinh = text "MO_Flt_Sinh"
266 pprMachOp MO_Flt_Cosh = text "MO_Flt_Cosh"
267 pprMachOp MO_Flt_Tanh = text "MO_Flt_Tanh"
268 pprMachOp MO_Flt_Asin = text "MO_Flt_Asin"
269 pprMachOp MO_Flt_Acos = text "MO_Flt_Acos"
270 pprMachOp MO_Flt_Atan = text "MO_Flt_Atan"
271 pprMachOp MO_Flt_Log = text "MO_Flt_Log"
272 pprMachOp MO_Flt_Exp = text "MO_Flt_Exp"
273 pprMachOp MO_Flt_Sqrt = text "MO_Flt_Sqrt"
274 pprMachOp MO_Flt_Neg = text "MO_Flt_Neg"
276 pprMachOp MO_32U_to_NatS = text "MO_32U_to_NatS"
277 pprMachOp MO_NatS_to_32U = text "MO_NatS_to_32U"
279 pprMachOp MO_NatS_to_Dbl = text "MO_NatS_to_Dbl"
280 pprMachOp MO_Dbl_to_NatS = text "MO_Dbl_to_NatS"
282 pprMachOp MO_NatS_to_Flt = text "MO_NatS_to_Flt"
283 pprMachOp MO_Flt_to_NatS = text "MO_Flt_to_NatS"
285 pprMachOp MO_NatS_to_NatU = text "MO_NatS_to_NatU"
286 pprMachOp MO_NatU_to_NatS = text "MO_NatU_to_NatS"
288 pprMachOp MO_NatS_to_NatP = text "MO_NatS_to_NatP"
289 pprMachOp MO_NatP_to_NatS = text "MO_NatP_to_NatS"
290 pprMachOp MO_NatU_to_NatP = text "MO_NatU_to_NatP"
291 pprMachOp MO_NatP_to_NatU = text "MO_NatP_to_NatU"
293 pprMachOp MO_Dbl_to_Flt = text "MO_Dbl_to_Flt"
294 pprMachOp MO_Flt_to_Dbl = text "MO_Flt_to_Dbl"
296 pprMachOp MO_8S_to_NatS = text "MO_8S_to_NatS"
297 pprMachOp MO_16S_to_NatS = text "MO_16S_to_NatS"
298 pprMachOp MO_32S_to_NatS = text "MO_32S_to_NatS"
300 pprMachOp MO_8U_to_NatU = text "MO_8U_to_NatU"
301 pprMachOp MO_16U_to_NatU = text "MO_16U_to_NatU"
302 pprMachOp MO_32U_to_NatU = text "MO_32U_to_NatU"
304 pprMachOp (MO_ReadOSBI offset rep)
305 = text "MO_ReadOSBI" <> parens (int offset <> comma <> ppr rep)
306 pprMachOp (MO_WriteOSBI offset rep)
307 = text "MO_WriteOSBI" <> parens (int offset <> comma <> ppr rep)
311 -- Non-exported helper enumeration:
314 | MO_DefinitelyInline
319 inline = MO_DefinitelyInline
323 -- If in doubt, return False. This generates worse code on the
324 -- via-C route, but has no effect on the native code routes.
325 -- Remember that claims about definitely inline have to be true
326 -- regardless of what the C compiler does, so we need to be
327 -- careful about boundary cases like sqrt which are sometimes
328 -- implemented in software and sometimes in hardware.
329 isDefinitelyInlineMachOp :: MachOp -> Bool
330 isDefinitelyInlineMachOp mop = inline `elem` snd (machOpProps mop)
332 -- If in doubt, return False. This generates worse code on the
333 -- native routes, but is otherwise harmless.
334 isCommutableMachOp :: MachOp -> Bool
335 isCommutableMachOp mop = comm `elem` snd (machOpProps mop)
337 -- If in doubt, return False. This generates worse code on the
338 -- native routes, but is otherwise harmless.
339 isComparisonMachOp :: MachOp -> Bool
340 isComparisonMachOp mop = comp `elem` snd (machOpProps mop)
342 -- Find the PrimReps for the returned value(s) of the MachOp.
343 resultRepsOfMachOp :: MachOp -> Maybe012 PrimRep
344 resultRepsOfMachOp mop = fst (machOpProps mop)
346 -- This bit does the real work.
347 machOpProps :: MachOp -> (Maybe012 PrimRep, [MO_Prop])
349 machOpProps MO_Nat_Add = (Just1 IntRep, [inline, comm])
350 machOpProps MO_Nat_Sub = (Just1 IntRep, [inline])
351 machOpProps MO_Nat_Eq = (Just1 IntRep, [inline, comp, comm])
352 machOpProps MO_Nat_Ne = (Just1 IntRep, [inline, comp, comm])
354 machOpProps MO_NatS_Ge = (Just1 IntRep, [inline, comp])
355 machOpProps MO_NatS_Le = (Just1 IntRep, [inline, comp])
356 machOpProps MO_NatS_Gt = (Just1 IntRep, [inline, comp])
357 machOpProps MO_NatS_Lt = (Just1 IntRep, [inline, comp])
359 machOpProps MO_NatU_Ge = (Just1 IntRep, [inline, comp])
360 machOpProps MO_NatU_Le = (Just1 IntRep, [inline, comp])
361 machOpProps MO_NatU_Gt = (Just1 IntRep, [inline, comp])
362 machOpProps MO_NatU_Lt = (Just1 IntRep, [inline, comp])
364 machOpProps MO_NatS_Mul = (Just1 IntRep, [inline, comm])
365 machOpProps MO_NatS_Quot = (Just1 IntRep, [inline])
366 machOpProps MO_NatS_Rem = (Just1 IntRep, [inline])
367 machOpProps MO_NatS_Neg = (Just1 IntRep, [inline])
369 machOpProps MO_NatU_Mul = (Just1 WordRep, [inline, comm])
370 machOpProps MO_NatU_Quot = (Just1 WordRep, [inline])
371 machOpProps MO_NatU_Rem = (Just1 WordRep, [inline])
373 machOpProps MO_NatS_AddC = (Just2 IntRep IntRep, [])
374 machOpProps MO_NatS_SubC = (Just2 IntRep IntRep, [])
375 machOpProps MO_NatS_MulC = (Just2 IntRep IntRep, [])
377 machOpProps MO_Nat_And = (Just1 IntRep, [inline, comm])
378 machOpProps MO_Nat_Or = (Just1 IntRep, [inline, comm])
379 machOpProps MO_Nat_Xor = (Just1 IntRep, [inline, comm])
380 machOpProps MO_Nat_Not = (Just1 IntRep, [inline])
381 machOpProps MO_Nat_Shl = (Just1 IntRep, [inline])
382 machOpProps MO_Nat_Shr = (Just1 IntRep, [inline])
383 machOpProps MO_Nat_Sar = (Just1 IntRep, [inline])
385 machOpProps MO_32U_Eq = (Just1 IntRep, [inline, comp, comm])
386 machOpProps MO_32U_Ne = (Just1 IntRep, [inline, comp, comm])
387 machOpProps MO_32U_Ge = (Just1 IntRep, [inline, comp])
388 machOpProps MO_32U_Le = (Just1 IntRep, [inline, comp])
389 machOpProps MO_32U_Gt = (Just1 IntRep, [inline, comp])
390 machOpProps MO_32U_Lt = (Just1 IntRep, [inline, comp])
392 machOpProps MO_Dbl_Eq = (Just1 IntRep, [inline, comp, comm])
393 machOpProps MO_Dbl_Ne = (Just1 IntRep, [inline, comp, comm])
394 machOpProps MO_Dbl_Ge = (Just1 IntRep, [inline, comp])
395 machOpProps MO_Dbl_Le = (Just1 IntRep, [inline, comp])
396 machOpProps MO_Dbl_Gt = (Just1 IntRep, [inline, comp])
397 machOpProps MO_Dbl_Lt = (Just1 IntRep, [inline, comp])
399 machOpProps MO_Dbl_Add = (Just1 DoubleRep, [inline, comm])
400 machOpProps MO_Dbl_Sub = (Just1 DoubleRep, [inline])
401 machOpProps MO_Dbl_Mul = (Just1 DoubleRep, [inline, comm])
402 machOpProps MO_Dbl_Div = (Just1 DoubleRep, [inline])
403 machOpProps MO_Dbl_Pwr = (Just1 DoubleRep, [])
405 machOpProps MO_Dbl_Sin = (Just1 DoubleRep, [])
406 machOpProps MO_Dbl_Cos = (Just1 DoubleRep, [])
407 machOpProps MO_Dbl_Tan = (Just1 DoubleRep, [])
408 machOpProps MO_Dbl_Sinh = (Just1 DoubleRep, [])
409 machOpProps MO_Dbl_Cosh = (Just1 DoubleRep, [])
410 machOpProps MO_Dbl_Tanh = (Just1 DoubleRep, [])
411 machOpProps MO_Dbl_Asin = (Just1 DoubleRep, [])
412 machOpProps MO_Dbl_Acos = (Just1 DoubleRep, [])
413 machOpProps MO_Dbl_Atan = (Just1 DoubleRep, [])
414 machOpProps MO_Dbl_Log = (Just1 DoubleRep, [])
415 machOpProps MO_Dbl_Exp = (Just1 DoubleRep, [])
416 machOpProps MO_Dbl_Sqrt = (Just1 DoubleRep, [])
417 machOpProps MO_Dbl_Neg = (Just1 DoubleRep, [inline])
419 machOpProps MO_Flt_Add = (Just1 FloatRep, [inline, comm])
420 machOpProps MO_Flt_Sub = (Just1 FloatRep, [inline])
421 machOpProps MO_Flt_Mul = (Just1 FloatRep, [inline, comm])
422 machOpProps MO_Flt_Div = (Just1 FloatRep, [inline])
423 machOpProps MO_Flt_Pwr = (Just1 FloatRep, [])
425 machOpProps MO_Flt_Eq = (Just1 IntRep, [inline, comp, comm])
426 machOpProps MO_Flt_Ne = (Just1 IntRep, [inline, comp, comm])
427 machOpProps MO_Flt_Ge = (Just1 IntRep, [inline, comp])
428 machOpProps MO_Flt_Le = (Just1 IntRep, [inline, comp])
429 machOpProps MO_Flt_Gt = (Just1 IntRep, [inline, comp])
430 machOpProps MO_Flt_Lt = (Just1 IntRep, [inline, comp])
432 machOpProps MO_Flt_Sin = (Just1 FloatRep, [])
433 machOpProps MO_Flt_Cos = (Just1 FloatRep, [])
434 machOpProps MO_Flt_Tan = (Just1 FloatRep, [])
435 machOpProps MO_Flt_Sinh = (Just1 FloatRep, [])
436 machOpProps MO_Flt_Cosh = (Just1 FloatRep, [])
437 machOpProps MO_Flt_Tanh = (Just1 FloatRep, [])
438 machOpProps MO_Flt_Asin = (Just1 FloatRep, [])
439 machOpProps MO_Flt_Acos = (Just1 FloatRep, [])
440 machOpProps MO_Flt_Atan = (Just1 FloatRep, [])
441 machOpProps MO_Flt_Log = (Just1 FloatRep, [])
442 machOpProps MO_Flt_Exp = (Just1 FloatRep, [])
443 machOpProps MO_Flt_Sqrt = (Just1 FloatRep, [])
444 machOpProps MO_Flt_Neg = (Just1 FloatRep, [inline])
446 machOpProps MO_32U_to_NatS = (Just1 IntRep, [inline])
447 machOpProps MO_NatS_to_32U = (Just1 WordRep, [inline])
449 machOpProps MO_NatS_to_Dbl = (Just1 DoubleRep, [inline])
450 machOpProps MO_Dbl_to_NatS = (Just1 IntRep, [inline])
452 machOpProps MO_NatS_to_Flt = (Just1 FloatRep, [inline])
453 machOpProps MO_Flt_to_NatS = (Just1 IntRep, [inline])
455 machOpProps MO_NatS_to_NatU = (Just1 WordRep, [inline])
456 machOpProps MO_NatU_to_NatS = (Just1 IntRep, [inline])
458 machOpProps MO_NatS_to_NatP = (Just1 PtrRep, [inline])
459 machOpProps MO_NatP_to_NatS = (Just1 IntRep, [inline])
460 machOpProps MO_NatU_to_NatP = (Just1 PtrRep, [inline])
461 machOpProps MO_NatP_to_NatU = (Just1 WordRep, [inline])
463 machOpProps MO_Dbl_to_Flt = (Just1 FloatRep, [inline])
464 machOpProps MO_Flt_to_Dbl = (Just1 DoubleRep, [inline])
466 machOpProps MO_8S_to_NatS = (Just1 IntRep, [inline])
467 machOpProps MO_16S_to_NatS = (Just1 IntRep, [inline])
468 machOpProps MO_32S_to_NatS = (Just1 IntRep, [inline])
470 machOpProps MO_8U_to_NatU = (Just1 WordRep, [inline])
471 machOpProps MO_16U_to_NatU = (Just1 WordRep, [inline])
472 machOpProps MO_32U_to_NatU = (Just1 WordRep, [inline])
474 machOpProps (MO_ReadOSBI offset rep) = (Just1 rep, [inline])
475 machOpProps (MO_WriteOSBI offset rep) = (Just0, [inline])