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
169 -- Almost, but not quite == text . derived show
170 pprMachOp :: MachOp -> SDoc
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"
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"
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"
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"
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"
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"
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"
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"
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"
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"
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"
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"
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"
266 pprMachOp MO_32U_to_NatS = text "MO_32U_to_NatS"
267 pprMachOp MO_NatS_to_32U = text "MO_NatS_to_32U"
269 pprMachOp MO_NatS_to_Dbl = text "MO_NatS_to_Dbl"
270 pprMachOp MO_Dbl_to_NatS = text "MO_Dbl_to_NatS"
272 pprMachOp MO_NatS_to_Flt = text "MO_NatS_to_Flt"
273 pprMachOp MO_Flt_to_NatS = text "MO_Flt_to_NatS"
275 pprMachOp MO_NatS_to_NatU = text "MO_NatS_to_NatU"
276 pprMachOp MO_NatU_to_NatS = text "MO_NatU_to_NatS"
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"
283 pprMachOp MO_Dbl_to_Flt = text "MO_Dbl_to_Flt"
284 pprMachOp MO_Flt_to_Dbl = text "MO_Flt_to_Dbl"
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"
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"
294 pprMachOp MO_8U_to_32U = text "MO_8U_to_32U"
295 pprMachOp MO_32U_to_8U = text "MO_32U_to_8U"
299 -- Non-exported helper enumeration:
302 | MO_DefinitelyInline
307 inline = MO_DefinitelyInline
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)
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)
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)
330 -- Find the PrimRep for the returned value of the MachOp.
331 resultRepOfMachOp :: MachOp -> PrimRep
332 resultRepOfMachOp mop = fst (machOpProps mop)
334 -- This bit does the real work.
335 machOpProps :: MachOp -> (PrimRep, [MO_Prop])
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])
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])
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])
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])
358 machOpProps MO_NatU_Mul = (WordRep, [inline, comm])
359 machOpProps MO_NatU_Quot = (WordRep, [inline])
360 machOpProps MO_NatU_Rem = (WordRep, [inline])
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])
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])
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])
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, [])
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])
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, [])
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])
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])
431 machOpProps MO_32U_to_NatS = (IntRep, [inline])
432 machOpProps MO_NatS_to_32U = (Word32Rep, [inline])
434 machOpProps MO_NatS_to_Dbl = (DoubleRep, [inline])
435 machOpProps MO_Dbl_to_NatS = (IntRep, [inline])
437 machOpProps MO_NatS_to_Flt = (FloatRep, [inline])
438 machOpProps MO_Flt_to_NatS = (IntRep, [inline])
440 machOpProps MO_NatS_to_NatU = (WordRep, [inline])
441 machOpProps MO_NatU_to_NatS = (IntRep, [inline])
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])
448 machOpProps MO_Dbl_to_Flt = (FloatRep, [inline])
449 machOpProps MO_Flt_to_Dbl = (DoubleRep, [inline])
451 machOpProps MO_8S_to_NatS = (IntRep, [inline])
452 machOpProps MO_16S_to_NatS = (IntRep, [inline])
453 machOpProps MO_32S_to_NatS = (IntRep, [inline])
455 machOpProps MO_8U_to_NatU = (WordRep, [inline])
456 machOpProps MO_16U_to_NatU = (WordRep, [inline])
457 machOpProps MO_32U_to_NatU = (WordRep, [inline])
459 machOpProps MO_8U_to_32U = (Word32Rep, [inline])
460 machOpProps MO_32U_to_8U = (Word8Rep, [inline])