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 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.
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 | MO_8U_to_32U -- zero extend
163 | MO_32U_to_8U -- mask out all but lowest byte
165 -- Reading/writing arrays
166 | MO_ReadOSBI Int PrimRep -- args: [base_ptr, index_value]
167 | MO_WriteOSBI Int PrimRep -- args: [base_ptr, index_value, value_to_write]
168 -- Read/write a value :: the PrimRep
170 -- sizeof(machine_word)*Int + base_ptr + sizeof(PrimRep)*index_value
175 -- Almost, but not quite == text . derived show
176 pprMachOp :: MachOp -> SDoc
178 pprMachOp MO_Nat_Add = text "MO_Nat_Add"
179 pprMachOp MO_Nat_Sub = text "MO_Nat_Sub"
180 pprMachOp MO_Nat_Eq = text "MO_Nat_Eq"
181 pprMachOp MO_Nat_Ne = text "MO_Nat_Ne"
183 pprMachOp MO_NatS_Ge = text "MO_NatS_Ge"
184 pprMachOp MO_NatS_Le = text "MO_NatS_Le"
185 pprMachOp MO_NatS_Gt = text "MO_NatS_Gt"
186 pprMachOp MO_NatS_Lt = text "MO_NatS_Lt"
188 pprMachOp MO_NatU_Ge = text "MO_NatU_Ge"
189 pprMachOp MO_NatU_Le = text "MO_NatU_Le"
190 pprMachOp MO_NatU_Gt = text "MO_NatU_Gt"
191 pprMachOp MO_NatU_Lt = text "MO_NatU_Lt"
193 pprMachOp MO_NatS_Mul = text "MO_NatS_Mul"
194 pprMachOp MO_NatS_MulMayOflo = text "MO_NatS_MulMayOflo"
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_Nat_And = text "MO_Nat_And"
204 pprMachOp MO_Nat_Or = text "MO_Nat_Or"
205 pprMachOp MO_Nat_Xor = text "MO_Nat_Xor"
206 pprMachOp MO_Nat_Not = text "MO_Nat_Not"
207 pprMachOp MO_Nat_Shl = text "MO_Nat_Shl"
208 pprMachOp MO_Nat_Shr = text "MO_Nat_Shr"
209 pprMachOp MO_Nat_Sar = text "MO_Nat_Sar"
211 pprMachOp MO_32U_Eq = text "MO_32U_Eq"
212 pprMachOp MO_32U_Ne = text "MO_32U_Ne"
213 pprMachOp MO_32U_Ge = text "MO_32U_Ge"
214 pprMachOp MO_32U_Le = text "MO_32U_Le"
215 pprMachOp MO_32U_Gt = text "MO_32U_Gt"
216 pprMachOp MO_32U_Lt = text "MO_32U_Lt"
218 pprMachOp MO_Dbl_Eq = text "MO_Dbl_Eq"
219 pprMachOp MO_Dbl_Ne = text "MO_Dbl_Ne"
220 pprMachOp MO_Dbl_Ge = text "MO_Dbl_Ge"
221 pprMachOp MO_Dbl_Le = text "MO_Dbl_Le"
222 pprMachOp MO_Dbl_Gt = text "MO_Dbl_Gt"
223 pprMachOp MO_Dbl_Lt = text "MO_Dbl_Lt"
225 pprMachOp MO_Dbl_Add = text "MO_Dbl_Add"
226 pprMachOp MO_Dbl_Sub = text "MO_Dbl_Sub"
227 pprMachOp MO_Dbl_Mul = text "MO_Dbl_Mul"
228 pprMachOp MO_Dbl_Div = text "MO_Dbl_Div"
229 pprMachOp MO_Dbl_Pwr = text "MO_Dbl_Pwr"
231 pprMachOp MO_Dbl_Sin = text "MO_Dbl_Sin"
232 pprMachOp MO_Dbl_Cos = text "MO_Dbl_Cos"
233 pprMachOp MO_Dbl_Tan = text "MO_Dbl_Tan"
234 pprMachOp MO_Dbl_Sinh = text "MO_Dbl_Sinh"
235 pprMachOp MO_Dbl_Cosh = text "MO_Dbl_Cosh"
236 pprMachOp MO_Dbl_Tanh = text "MO_Dbl_Tanh"
237 pprMachOp MO_Dbl_Asin = text "MO_Dbl_Asin"
238 pprMachOp MO_Dbl_Acos = text "MO_Dbl_Acos"
239 pprMachOp MO_Dbl_Atan = text "MO_Dbl_Atan"
240 pprMachOp MO_Dbl_Log = text "MO_Dbl_Log"
241 pprMachOp MO_Dbl_Exp = text "MO_Dbl_Exp"
242 pprMachOp MO_Dbl_Sqrt = text "MO_Dbl_Sqrt"
243 pprMachOp MO_Dbl_Neg = text "MO_Dbl_Neg"
245 pprMachOp MO_Flt_Add = text "MO_Flt_Add"
246 pprMachOp MO_Flt_Sub = text "MO_Flt_Sub"
247 pprMachOp MO_Flt_Mul = text "MO_Flt_Mul"
248 pprMachOp MO_Flt_Div = text "MO_Flt_Div"
249 pprMachOp MO_Flt_Pwr = text "MO_Flt_Pwr"
251 pprMachOp MO_Flt_Eq = text "MO_Flt_Eq"
252 pprMachOp MO_Flt_Ne = text "MO_Flt_Ne"
253 pprMachOp MO_Flt_Ge = text "MO_Flt_Ge"
254 pprMachOp MO_Flt_Le = text "MO_Flt_Le"
255 pprMachOp MO_Flt_Gt = text "MO_Flt_Gt"
256 pprMachOp MO_Flt_Lt = text "MO_Flt_Lt"
258 pprMachOp MO_Flt_Sin = text "MO_Flt_Sin"
259 pprMachOp MO_Flt_Cos = text "MO_Flt_Cos"
260 pprMachOp MO_Flt_Tan = text "MO_Flt_Tan"
261 pprMachOp MO_Flt_Sinh = text "MO_Flt_Sinh"
262 pprMachOp MO_Flt_Cosh = text "MO_Flt_Cosh"
263 pprMachOp MO_Flt_Tanh = text "MO_Flt_Tanh"
264 pprMachOp MO_Flt_Asin = text "MO_Flt_Asin"
265 pprMachOp MO_Flt_Acos = text "MO_Flt_Acos"
266 pprMachOp MO_Flt_Atan = text "MO_Flt_Atan"
267 pprMachOp MO_Flt_Log = text "MO_Flt_Log"
268 pprMachOp MO_Flt_Exp = text "MO_Flt_Exp"
269 pprMachOp MO_Flt_Sqrt = text "MO_Flt_Sqrt"
270 pprMachOp MO_Flt_Neg = text "MO_Flt_Neg"
272 pprMachOp MO_32U_to_NatS = text "MO_32U_to_NatS"
273 pprMachOp MO_NatS_to_32U = text "MO_NatS_to_32U"
275 pprMachOp MO_NatS_to_Dbl = text "MO_NatS_to_Dbl"
276 pprMachOp MO_Dbl_to_NatS = text "MO_Dbl_to_NatS"
278 pprMachOp MO_NatS_to_Flt = text "MO_NatS_to_Flt"
279 pprMachOp MO_Flt_to_NatS = text "MO_Flt_to_NatS"
281 pprMachOp MO_NatS_to_NatU = text "MO_NatS_to_NatU"
282 pprMachOp MO_NatU_to_NatS = text "MO_NatU_to_NatS"
284 pprMachOp MO_NatS_to_NatP = text "MO_NatS_to_NatP"
285 pprMachOp MO_NatP_to_NatS = text "MO_NatP_to_NatS"
286 pprMachOp MO_NatU_to_NatP = text "MO_NatU_to_NatP"
287 pprMachOp MO_NatP_to_NatU = text "MO_NatP_to_NatU"
289 pprMachOp MO_Dbl_to_Flt = text "MO_Dbl_to_Flt"
290 pprMachOp MO_Flt_to_Dbl = text "MO_Flt_to_Dbl"
292 pprMachOp MO_8S_to_NatS = text "MO_8S_to_NatS"
293 pprMachOp MO_16S_to_NatS = text "MO_16S_to_NatS"
294 pprMachOp MO_32S_to_NatS = text "MO_32S_to_NatS"
296 pprMachOp MO_8U_to_NatU = text "MO_8U_to_NatU"
297 pprMachOp MO_16U_to_NatU = text "MO_16U_to_NatU"
298 pprMachOp MO_32U_to_NatU = text "MO_32U_to_NatU"
300 pprMachOp MO_8U_to_32U = text "MO_8U_to_32U"
301 pprMachOp MO_32U_to_8U = text "MO_32U_to_8U"
303 pprMachOp (MO_ReadOSBI offset rep)
304 = text "MO_ReadOSBI" <> parens (int offset <> comma <> ppr rep)
305 pprMachOp (MO_WriteOSBI offset rep)
306 = text "MO_WriteOSBI" <> parens (int offset <> comma <> ppr rep)
310 -- Non-exported helper enumeration:
313 | MO_DefinitelyInline
318 inline = MO_DefinitelyInline
322 -- If in doubt, return False. This generates worse code on the
323 -- via-C route, but has no effect on the native code routes.
324 -- Remember that claims about definitely inline have to be true
325 -- regardless of what the C compiler does, so we need to be
326 -- careful about boundary cases like sqrt which are sometimes
327 -- implemented in software and sometimes in hardware.
328 isDefinitelyInlineMachOp :: MachOp -> Bool
329 isDefinitelyInlineMachOp mop = inline `elem` snd (machOpProps mop)
331 -- If in doubt, return False. This generates worse code on the
332 -- native routes, but is otherwise harmless.
333 isCommutableMachOp :: MachOp -> Bool
334 isCommutableMachOp mop = comm `elem` snd (machOpProps mop)
336 -- If in doubt, return False. This generates worse code on the
337 -- native routes, but is otherwise harmless.
338 isComparisonMachOp :: MachOp -> Bool
339 isComparisonMachOp mop = comp `elem` snd (machOpProps mop)
341 -- Find the PrimReps for the returned value(s) of the MachOp.
342 resultRepsOfMachOp :: MachOp -> Maybe PrimRep
343 resultRepsOfMachOp mop = fst (machOpProps mop)
345 -- This bit does the real work.
346 machOpProps :: MachOp -> (Maybe PrimRep, [MO_Prop])
348 machOpProps MO_Nat_Add = (Just IntRep, [inline, comm])
349 machOpProps MO_Nat_Sub = (Just IntRep, [inline])
350 machOpProps MO_Nat_Eq = (Just IntRep, [inline, comp, comm])
351 machOpProps MO_Nat_Ne = (Just IntRep, [inline, comp, comm])
353 machOpProps MO_NatS_Ge = (Just IntRep, [inline, comp])
354 machOpProps MO_NatS_Le = (Just IntRep, [inline, comp])
355 machOpProps MO_NatS_Gt = (Just IntRep, [inline, comp])
356 machOpProps MO_NatS_Lt = (Just IntRep, [inline, comp])
358 machOpProps MO_NatU_Ge = (Just IntRep, [inline, comp])
359 machOpProps MO_NatU_Le = (Just IntRep, [inline, comp])
360 machOpProps MO_NatU_Gt = (Just IntRep, [inline, comp])
361 machOpProps MO_NatU_Lt = (Just IntRep, [inline, comp])
363 machOpProps MO_NatS_Mul = (Just IntRep, [inline, comm])
364 machOpProps MO_NatS_MulMayOflo = (Just IntRep, [inline, comm])
365 machOpProps MO_NatS_Quot = (Just IntRep, [inline])
366 machOpProps MO_NatS_Rem = (Just IntRep, [inline])
367 machOpProps MO_NatS_Neg = (Just IntRep, [inline])
369 machOpProps MO_NatU_Mul = (Just WordRep, [inline, comm])
370 machOpProps MO_NatU_Quot = (Just WordRep, [inline])
371 machOpProps MO_NatU_Rem = (Just WordRep, [inline])
373 machOpProps MO_Nat_And = (Just IntRep, [inline, comm])
374 machOpProps MO_Nat_Or = (Just IntRep, [inline, comm])
375 machOpProps MO_Nat_Xor = (Just IntRep, [inline, comm])
376 machOpProps MO_Nat_Not = (Just IntRep, [inline])
377 machOpProps MO_Nat_Shl = (Just IntRep, [inline])
378 machOpProps MO_Nat_Shr = (Just IntRep, [inline])
379 machOpProps MO_Nat_Sar = (Just IntRep, [inline])
381 machOpProps MO_32U_Eq = (Just IntRep, [inline, comp, comm])
382 machOpProps MO_32U_Ne = (Just IntRep, [inline, comp, comm])
383 machOpProps MO_32U_Ge = (Just IntRep, [inline, comp])
384 machOpProps MO_32U_Le = (Just IntRep, [inline, comp])
385 machOpProps MO_32U_Gt = (Just IntRep, [inline, comp])
386 machOpProps MO_32U_Lt = (Just IntRep, [inline, comp])
388 machOpProps MO_Dbl_Eq = (Just IntRep, [inline, comp, comm])
389 machOpProps MO_Dbl_Ne = (Just IntRep, [inline, comp, comm])
390 machOpProps MO_Dbl_Ge = (Just IntRep, [inline, comp])
391 machOpProps MO_Dbl_Le = (Just IntRep, [inline, comp])
392 machOpProps MO_Dbl_Gt = (Just IntRep, [inline, comp])
393 machOpProps MO_Dbl_Lt = (Just IntRep, [inline, comp])
395 machOpProps MO_Dbl_Add = (Just DoubleRep, [inline, comm])
396 machOpProps MO_Dbl_Sub = (Just DoubleRep, [inline])
397 machOpProps MO_Dbl_Mul = (Just DoubleRep, [inline, comm])
398 machOpProps MO_Dbl_Div = (Just DoubleRep, [inline])
399 machOpProps MO_Dbl_Pwr = (Just DoubleRep, [])
401 machOpProps MO_Dbl_Sin = (Just DoubleRep, [])
402 machOpProps MO_Dbl_Cos = (Just DoubleRep, [])
403 machOpProps MO_Dbl_Tan = (Just DoubleRep, [])
404 machOpProps MO_Dbl_Sinh = (Just DoubleRep, [])
405 machOpProps MO_Dbl_Cosh = (Just DoubleRep, [])
406 machOpProps MO_Dbl_Tanh = (Just DoubleRep, [])
407 machOpProps MO_Dbl_Asin = (Just DoubleRep, [])
408 machOpProps MO_Dbl_Acos = (Just DoubleRep, [])
409 machOpProps MO_Dbl_Atan = (Just DoubleRep, [])
410 machOpProps MO_Dbl_Log = (Just DoubleRep, [])
411 machOpProps MO_Dbl_Exp = (Just DoubleRep, [])
412 machOpProps MO_Dbl_Sqrt = (Just DoubleRep, [])
413 machOpProps MO_Dbl_Neg = (Just DoubleRep, [inline])
415 machOpProps MO_Flt_Add = (Just FloatRep, [inline, comm])
416 machOpProps MO_Flt_Sub = (Just FloatRep, [inline])
417 machOpProps MO_Flt_Mul = (Just FloatRep, [inline, comm])
418 machOpProps MO_Flt_Div = (Just FloatRep, [inline])
419 machOpProps MO_Flt_Pwr = (Just FloatRep, [])
421 machOpProps MO_Flt_Eq = (Just IntRep, [inline, comp, comm])
422 machOpProps MO_Flt_Ne = (Just IntRep, [inline, comp, comm])
423 machOpProps MO_Flt_Ge = (Just IntRep, [inline, comp])
424 machOpProps MO_Flt_Le = (Just IntRep, [inline, comp])
425 machOpProps MO_Flt_Gt = (Just IntRep, [inline, comp])
426 machOpProps MO_Flt_Lt = (Just IntRep, [inline, comp])
428 machOpProps MO_Flt_Sin = (Just FloatRep, [])
429 machOpProps MO_Flt_Cos = (Just FloatRep, [])
430 machOpProps MO_Flt_Tan = (Just FloatRep, [])
431 machOpProps MO_Flt_Sinh = (Just FloatRep, [])
432 machOpProps MO_Flt_Cosh = (Just FloatRep, [])
433 machOpProps MO_Flt_Tanh = (Just FloatRep, [])
434 machOpProps MO_Flt_Asin = (Just FloatRep, [])
435 machOpProps MO_Flt_Acos = (Just FloatRep, [])
436 machOpProps MO_Flt_Atan = (Just FloatRep, [])
437 machOpProps MO_Flt_Log = (Just FloatRep, [])
438 machOpProps MO_Flt_Exp = (Just FloatRep, [])
439 machOpProps MO_Flt_Sqrt = (Just FloatRep, [])
440 machOpProps MO_Flt_Neg = (Just FloatRep, [inline])
442 machOpProps MO_32U_to_NatS = (Just IntRep, [inline])
443 machOpProps MO_NatS_to_32U = (Just Word32Rep, [inline])
445 machOpProps MO_NatS_to_Dbl = (Just DoubleRep, [inline])
446 machOpProps MO_Dbl_to_NatS = (Just IntRep, [inline])
448 machOpProps MO_NatS_to_Flt = (Just FloatRep, [inline])
449 machOpProps MO_Flt_to_NatS = (Just IntRep, [inline])
451 machOpProps MO_NatS_to_NatU = (Just WordRep, [inline])
452 machOpProps MO_NatU_to_NatS = (Just IntRep, [inline])
454 machOpProps MO_NatS_to_NatP = (Just PtrRep, [inline])
455 machOpProps MO_NatP_to_NatS = (Just IntRep, [inline])
456 machOpProps MO_NatU_to_NatP = (Just PtrRep, [inline])
457 machOpProps MO_NatP_to_NatU = (Just WordRep, [inline])
459 machOpProps MO_Dbl_to_Flt = (Just FloatRep, [inline])
460 machOpProps MO_Flt_to_Dbl = (Just DoubleRep, [inline])
462 machOpProps MO_8S_to_NatS = (Just IntRep, [inline])
463 machOpProps MO_16S_to_NatS = (Just IntRep, [inline])
464 machOpProps MO_32S_to_NatS = (Just IntRep, [inline])
466 machOpProps MO_8U_to_NatU = (Just WordRep, [inline])
467 machOpProps MO_16U_to_NatU = (Just WordRep, [inline])
468 machOpProps MO_32U_to_NatU = (Just WordRep, [inline])
470 machOpProps MO_8U_to_32U = (Just Word32Rep, [inline])
471 machOpProps MO_32U_to_8U = (Just Word8Rep, [inline])
473 machOpProps (MO_ReadOSBI offset rep) = (Just rep, [inline])
474 machOpProps (MO_WriteOSBI offset rep) = (Nothing, [inline])