2 module MachOp ( MachOp(..), pprMachOp,
3 isDefinitelyInlineMachOp,
10 #include "HsVersions.h"
12 import PrimRep ( PrimRep(..) )
16 {- Machine-level primops; ones which we can reasonably delegate to the
17 native code generators to handle. Basically contains C's primops
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 native word size. Signedness: S means signed, U
23 means unsigned. For operations where signedness is irrelevant or
24 makes no difference (for example integer add), the signedness
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
35 -- OPS at the native word size
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 -
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)
69 -- OPS at 32 bits regardless of word size
133 -- Conversions. Some of these are NOPs, in which case they
134 -- are here usually to placate the C code generator.
162 -- Reading/writing arrays
163 | MO_ReadOSBI Int PrimRep -- [base_ptr, index_value]
164 | MO_WriteOSBI Int PrimRep -- [base_ptr, index_value, value_to_write]
165 -- Read/write a value :: the PrimRep
167 -- sizeof(machine_word)*Int + base_ptr + sizeof(PrimRep)*index_value
172 -- Almost, but not quite == text . derived show
173 pprMachOp :: MachOp -> SDoc
175 pprMachOp MO_Nat_Add = text "MO_Nat_Add"
176 pprMachOp MO_Nat_Sub = text "MO_Nat_Sub"
177 pprMachOp MO_Nat_Eq = text "MO_Nat_Eq"
178 pprMachOp MO_Nat_Ne = text "MO_Nat_Ne"
180 pprMachOp MO_NatS_Ge = text "MO_NatS_Ge"
181 pprMachOp MO_NatS_Le = text "MO_NatS_Le"
182 pprMachOp MO_NatS_Gt = text "MO_NatS_Gt"
183 pprMachOp MO_NatS_Lt = text "MO_NatS_Lt"
185 pprMachOp MO_NatU_Ge = text "MO_NatU_Ge"
186 pprMachOp MO_NatU_Le = text "MO_NatU_Le"
187 pprMachOp MO_NatU_Gt = text "MO_NatU_Gt"
188 pprMachOp MO_NatU_Lt = text "MO_NatU_Lt"
190 pprMachOp MO_NatS_Mul = text "MO_NatS_Mul"
191 pprMachOp MO_NatS_MulMayOflo = text "MO_NatS_MulMayOflo"
192 pprMachOp MO_NatS_Quot = text "MO_NatS_Quot"
193 pprMachOp MO_NatS_Rem = text "MO_NatS_Rem"
194 pprMachOp MO_NatS_Neg = text "MO_NatS_Neg"
196 pprMachOp MO_NatU_Mul = text "MO_NatU_Mul"
197 pprMachOp MO_NatU_Quot = text "MO_NatU_Quot"
198 pprMachOp MO_NatU_Rem = text "MO_NatU_Rem"
200 pprMachOp MO_Nat_And = text "MO_Nat_And"
201 pprMachOp MO_Nat_Or = text "MO_Nat_Or"
202 pprMachOp MO_Nat_Xor = text "MO_Nat_Xor"
203 pprMachOp MO_Nat_Not = text "MO_Nat_Not"
204 pprMachOp MO_Nat_Shl = text "MO_Nat_Shl"
205 pprMachOp MO_Nat_Shr = text "MO_Nat_Shr"
206 pprMachOp MO_Nat_Sar = text "MO_Nat_Sar"
208 pprMachOp MO_32U_Eq = text "MO_32U_Eq"
209 pprMachOp MO_32U_Ne = text "MO_32U_Ne"
210 pprMachOp MO_32U_Ge = text "MO_32U_Ge"
211 pprMachOp MO_32U_Le = text "MO_32U_Le"
212 pprMachOp MO_32U_Gt = text "MO_32U_Gt"
213 pprMachOp MO_32U_Lt = text "MO_32U_Lt"
215 pprMachOp MO_Dbl_Eq = text "MO_Dbl_Eq"
216 pprMachOp MO_Dbl_Ne = text "MO_Dbl_Ne"
217 pprMachOp MO_Dbl_Ge = text "MO_Dbl_Ge"
218 pprMachOp MO_Dbl_Le = text "MO_Dbl_Le"
219 pprMachOp MO_Dbl_Gt = text "MO_Dbl_Gt"
220 pprMachOp MO_Dbl_Lt = text "MO_Dbl_Lt"
222 pprMachOp MO_Dbl_Add = text "MO_Dbl_Add"
223 pprMachOp MO_Dbl_Sub = text "MO_Dbl_Sub"
224 pprMachOp MO_Dbl_Mul = text "MO_Dbl_Mul"
225 pprMachOp MO_Dbl_Div = text "MO_Dbl_Div"
226 pprMachOp MO_Dbl_Pwr = text "MO_Dbl_Pwr"
228 pprMachOp MO_Dbl_Sin = text "MO_Dbl_Sin"
229 pprMachOp MO_Dbl_Cos = text "MO_Dbl_Cos"
230 pprMachOp MO_Dbl_Tan = text "MO_Dbl_Tan"
231 pprMachOp MO_Dbl_Sinh = text "MO_Dbl_Sinh"
232 pprMachOp MO_Dbl_Cosh = text "MO_Dbl_Cosh"
233 pprMachOp MO_Dbl_Tanh = text "MO_Dbl_Tanh"
234 pprMachOp MO_Dbl_Asin = text "MO_Dbl_Asin"
235 pprMachOp MO_Dbl_Acos = text "MO_Dbl_Acos"
236 pprMachOp MO_Dbl_Atan = text "MO_Dbl_Atan"
237 pprMachOp MO_Dbl_Log = text "MO_Dbl_Log"
238 pprMachOp MO_Dbl_Exp = text "MO_Dbl_Exp"
239 pprMachOp MO_Dbl_Sqrt = text "MO_Dbl_Sqrt"
240 pprMachOp MO_Dbl_Neg = text "MO_Dbl_Neg"
242 pprMachOp MO_Flt_Add = text "MO_Flt_Add"
243 pprMachOp MO_Flt_Sub = text "MO_Flt_Sub"
244 pprMachOp MO_Flt_Mul = text "MO_Flt_Mul"
245 pprMachOp MO_Flt_Div = text "MO_Flt_Div"
246 pprMachOp MO_Flt_Pwr = text "MO_Flt_Pwr"
248 pprMachOp MO_Flt_Eq = text "MO_Flt_Eq"
249 pprMachOp MO_Flt_Ne = text "MO_Flt_Ne"
250 pprMachOp MO_Flt_Ge = text "MO_Flt_Ge"
251 pprMachOp MO_Flt_Le = text "MO_Flt_Le"
252 pprMachOp MO_Flt_Gt = text "MO_Flt_Gt"
253 pprMachOp MO_Flt_Lt = text "MO_Flt_Lt"
255 pprMachOp MO_Flt_Sin = text "MO_Flt_Sin"
256 pprMachOp MO_Flt_Cos = text "MO_Flt_Cos"
257 pprMachOp MO_Flt_Tan = text "MO_Flt_Tan"
258 pprMachOp MO_Flt_Sinh = text "MO_Flt_Sinh"
259 pprMachOp MO_Flt_Cosh = text "MO_Flt_Cosh"
260 pprMachOp MO_Flt_Tanh = text "MO_Flt_Tanh"
261 pprMachOp MO_Flt_Asin = text "MO_Flt_Asin"
262 pprMachOp MO_Flt_Acos = text "MO_Flt_Acos"
263 pprMachOp MO_Flt_Atan = text "MO_Flt_Atan"
264 pprMachOp MO_Flt_Log = text "MO_Flt_Log"
265 pprMachOp MO_Flt_Exp = text "MO_Flt_Exp"
266 pprMachOp MO_Flt_Sqrt = text "MO_Flt_Sqrt"
267 pprMachOp MO_Flt_Neg = text "MO_Flt_Neg"
269 pprMachOp MO_32U_to_NatS = text "MO_32U_to_NatS"
270 pprMachOp MO_NatS_to_32U = text "MO_NatS_to_32U"
272 pprMachOp MO_NatS_to_Dbl = text "MO_NatS_to_Dbl"
273 pprMachOp MO_Dbl_to_NatS = text "MO_Dbl_to_NatS"
275 pprMachOp MO_NatS_to_Flt = text "MO_NatS_to_Flt"
276 pprMachOp MO_Flt_to_NatS = text "MO_Flt_to_NatS"
278 pprMachOp MO_NatS_to_NatU = text "MO_NatS_to_NatU"
279 pprMachOp MO_NatU_to_NatS = text "MO_NatU_to_NatS"
281 pprMachOp MO_NatS_to_NatP = text "MO_NatS_to_NatP"
282 pprMachOp MO_NatP_to_NatS = text "MO_NatP_to_NatS"
283 pprMachOp MO_NatU_to_NatP = text "MO_NatU_to_NatP"
284 pprMachOp MO_NatP_to_NatU = text "MO_NatP_to_NatU"
286 pprMachOp MO_Dbl_to_Flt = text "MO_Dbl_to_Flt"
287 pprMachOp MO_Flt_to_Dbl = text "MO_Flt_to_Dbl"
289 pprMachOp MO_8S_to_NatS = text "MO_8S_to_NatS"
290 pprMachOp MO_16S_to_NatS = text "MO_16S_to_NatS"
291 pprMachOp MO_32S_to_NatS = text "MO_32S_to_NatS"
293 pprMachOp MO_8U_to_NatU = text "MO_8U_to_NatU"
294 pprMachOp MO_16U_to_NatU = text "MO_16U_to_NatU"
295 pprMachOp MO_32U_to_NatU = text "MO_32U_to_NatU"
297 pprMachOp (MO_ReadOSBI offset rep)
298 = text "MO_ReadOSBI" <> parens (int offset <> comma <> ppr rep)
299 pprMachOp (MO_WriteOSBI offset rep)
300 = text "MO_WriteOSBI" <> parens (int offset <> comma <> ppr rep)
304 -- Non-exported helper enumeration:
307 | MO_DefinitelyInline
312 inline = MO_DefinitelyInline
316 -- If in doubt, return False. This generates worse code on the
317 -- via-C route, but has no effect on the native code routes.
318 -- Remember that claims about definitely inline have to be true
319 -- regardless of what the C compiler does, so we need to be
320 -- careful about boundary cases like sqrt which are sometimes
321 -- implemented in software and sometimes in hardware.
322 isDefinitelyInlineMachOp :: MachOp -> Bool
323 isDefinitelyInlineMachOp mop = inline `elem` snd (machOpProps mop)
325 -- If in doubt, return False. This generates worse code on the
326 -- native routes, but is otherwise harmless.
327 isCommutableMachOp :: MachOp -> Bool
328 isCommutableMachOp mop = comm `elem` snd (machOpProps mop)
330 -- If in doubt, return False. This generates worse code on the
331 -- native routes, but is otherwise harmless.
332 isComparisonMachOp :: MachOp -> Bool
333 isComparisonMachOp mop = comp `elem` snd (machOpProps mop)
335 -- Find the PrimReps for the returned value(s) of the MachOp.
336 resultRepsOfMachOp :: MachOp -> Maybe PrimRep
337 resultRepsOfMachOp mop = fst (machOpProps mop)
339 -- This bit does the real work.
340 machOpProps :: MachOp -> (Maybe PrimRep, [MO_Prop])
342 machOpProps MO_Nat_Add = (Just IntRep, [inline, comm])
343 machOpProps MO_Nat_Sub = (Just IntRep, [inline])
344 machOpProps MO_Nat_Eq = (Just IntRep, [inline, comp, comm])
345 machOpProps MO_Nat_Ne = (Just IntRep, [inline, comp, comm])
347 machOpProps MO_NatS_Ge = (Just IntRep, [inline, comp])
348 machOpProps MO_NatS_Le = (Just IntRep, [inline, comp])
349 machOpProps MO_NatS_Gt = (Just IntRep, [inline, comp])
350 machOpProps MO_NatS_Lt = (Just IntRep, [inline, comp])
352 machOpProps MO_NatU_Ge = (Just IntRep, [inline, comp])
353 machOpProps MO_NatU_Le = (Just IntRep, [inline, comp])
354 machOpProps MO_NatU_Gt = (Just IntRep, [inline, comp])
355 machOpProps MO_NatU_Lt = (Just IntRep, [inline, comp])
357 machOpProps MO_NatS_Mul = (Just IntRep, [inline, comm])
358 machOpProps MO_NatS_MulMayOflo = (Just IntRep, [inline, comm])
359 machOpProps MO_NatS_Quot = (Just IntRep, [inline])
360 machOpProps MO_NatS_Rem = (Just IntRep, [inline])
361 machOpProps MO_NatS_Neg = (Just IntRep, [inline])
363 machOpProps MO_NatU_Mul = (Just WordRep, [inline, comm])
364 machOpProps MO_NatU_Quot = (Just WordRep, [inline])
365 machOpProps MO_NatU_Rem = (Just WordRep, [inline])
367 machOpProps MO_Nat_And = (Just IntRep, [inline, comm])
368 machOpProps MO_Nat_Or = (Just IntRep, [inline, comm])
369 machOpProps MO_Nat_Xor = (Just IntRep, [inline, comm])
370 machOpProps MO_Nat_Not = (Just IntRep, [inline])
371 machOpProps MO_Nat_Shl = (Just IntRep, [inline])
372 machOpProps MO_Nat_Shr = (Just IntRep, [inline])
373 machOpProps MO_Nat_Sar = (Just IntRep, [inline])
375 machOpProps MO_32U_Eq = (Just IntRep, [inline, comp, comm])
376 machOpProps MO_32U_Ne = (Just IntRep, [inline, comp, comm])
377 machOpProps MO_32U_Ge = (Just IntRep, [inline, comp])
378 machOpProps MO_32U_Le = (Just IntRep, [inline, comp])
379 machOpProps MO_32U_Gt = (Just IntRep, [inline, comp])
380 machOpProps MO_32U_Lt = (Just IntRep, [inline, comp])
382 machOpProps MO_Dbl_Eq = (Just IntRep, [inline, comp, comm])
383 machOpProps MO_Dbl_Ne = (Just IntRep, [inline, comp, comm])
384 machOpProps MO_Dbl_Ge = (Just IntRep, [inline, comp])
385 machOpProps MO_Dbl_Le = (Just IntRep, [inline, comp])
386 machOpProps MO_Dbl_Gt = (Just IntRep, [inline, comp])
387 machOpProps MO_Dbl_Lt = (Just IntRep, [inline, comp])
389 machOpProps MO_Dbl_Add = (Just DoubleRep, [inline, comm])
390 machOpProps MO_Dbl_Sub = (Just DoubleRep, [inline])
391 machOpProps MO_Dbl_Mul = (Just DoubleRep, [inline, comm])
392 machOpProps MO_Dbl_Div = (Just DoubleRep, [inline])
393 machOpProps MO_Dbl_Pwr = (Just DoubleRep, [])
395 machOpProps MO_Dbl_Sin = (Just DoubleRep, [])
396 machOpProps MO_Dbl_Cos = (Just DoubleRep, [])
397 machOpProps MO_Dbl_Tan = (Just DoubleRep, [])
398 machOpProps MO_Dbl_Sinh = (Just DoubleRep, [])
399 machOpProps MO_Dbl_Cosh = (Just DoubleRep, [])
400 machOpProps MO_Dbl_Tanh = (Just DoubleRep, [])
401 machOpProps MO_Dbl_Asin = (Just DoubleRep, [])
402 machOpProps MO_Dbl_Acos = (Just DoubleRep, [])
403 machOpProps MO_Dbl_Atan = (Just DoubleRep, [])
404 machOpProps MO_Dbl_Log = (Just DoubleRep, [])
405 machOpProps MO_Dbl_Exp = (Just DoubleRep, [])
406 machOpProps MO_Dbl_Sqrt = (Just DoubleRep, [])
407 machOpProps MO_Dbl_Neg = (Just DoubleRep, [inline])
409 machOpProps MO_Flt_Add = (Just FloatRep, [inline, comm])
410 machOpProps MO_Flt_Sub = (Just FloatRep, [inline])
411 machOpProps MO_Flt_Mul = (Just FloatRep, [inline, comm])
412 machOpProps MO_Flt_Div = (Just FloatRep, [inline])
413 machOpProps MO_Flt_Pwr = (Just FloatRep, [])
415 machOpProps MO_Flt_Eq = (Just IntRep, [inline, comp, comm])
416 machOpProps MO_Flt_Ne = (Just IntRep, [inline, comp, comm])
417 machOpProps MO_Flt_Ge = (Just IntRep, [inline, comp])
418 machOpProps MO_Flt_Le = (Just IntRep, [inline, comp])
419 machOpProps MO_Flt_Gt = (Just IntRep, [inline, comp])
420 machOpProps MO_Flt_Lt = (Just IntRep, [inline, comp])
422 machOpProps MO_Flt_Sin = (Just FloatRep, [])
423 machOpProps MO_Flt_Cos = (Just FloatRep, [])
424 machOpProps MO_Flt_Tan = (Just FloatRep, [])
425 machOpProps MO_Flt_Sinh = (Just FloatRep, [])
426 machOpProps MO_Flt_Cosh = (Just FloatRep, [])
427 machOpProps MO_Flt_Tanh = (Just FloatRep, [])
428 machOpProps MO_Flt_Asin = (Just FloatRep, [])
429 machOpProps MO_Flt_Acos = (Just FloatRep, [])
430 machOpProps MO_Flt_Atan = (Just FloatRep, [])
431 machOpProps MO_Flt_Log = (Just FloatRep, [])
432 machOpProps MO_Flt_Exp = (Just FloatRep, [])
433 machOpProps MO_Flt_Sqrt = (Just FloatRep, [])
434 machOpProps MO_Flt_Neg = (Just FloatRep, [inline])
436 machOpProps MO_32U_to_NatS = (Just IntRep, [inline])
437 machOpProps MO_NatS_to_32U = (Just WordRep, [inline])
439 machOpProps MO_NatS_to_Dbl = (Just DoubleRep, [inline])
440 machOpProps MO_Dbl_to_NatS = (Just IntRep, [inline])
442 machOpProps MO_NatS_to_Flt = (Just FloatRep, [inline])
443 machOpProps MO_Flt_to_NatS = (Just IntRep, [inline])
445 machOpProps MO_NatS_to_NatU = (Just WordRep, [inline])
446 machOpProps MO_NatU_to_NatS = (Just IntRep, [inline])
448 machOpProps MO_NatS_to_NatP = (Just PtrRep, [inline])
449 machOpProps MO_NatP_to_NatS = (Just IntRep, [inline])
450 machOpProps MO_NatU_to_NatP = (Just PtrRep, [inline])
451 machOpProps MO_NatP_to_NatU = (Just WordRep, [inline])
453 machOpProps MO_Dbl_to_Flt = (Just FloatRep, [inline])
454 machOpProps MO_Flt_to_Dbl = (Just DoubleRep, [inline])
456 machOpProps MO_8S_to_NatS = (Just IntRep, [inline])
457 machOpProps MO_16S_to_NatS = (Just IntRep, [inline])
458 machOpProps MO_32S_to_NatS = (Just IntRep, [inline])
460 machOpProps MO_8U_to_NatU = (Just WordRep, [inline])
461 machOpProps MO_16U_to_NatU = (Just WordRep, [inline])
462 machOpProps MO_32U_to_NatU = (Just WordRep, [inline])
464 machOpProps (MO_ReadOSBI offset rep) = (Just rep, [inline])
465 machOpProps (MO_WriteOSBI offset rep) = (Nothing, [inline])