[project @ 2001-12-05 17:35:12 by sewardj]
[ghc-hetmet.git] / ghc / compiler / absCSyn / MachOp.hs
1
2 module MachOp   ( MachOp(..), pprMachOp,
3                   isDefinitelyInlineMachOp, 
4                   isCommutableMachOp,
5                   isComparisonMachOp,
6                   resultRepsOfMachOp
7                  )
8 where
9
10 #include "HsVersions.h"
11
12 import PrimRep          ( PrimRep(..) )
13 import Maybes           ( Maybe012(..) )
14 import Outputable
15
16
17 {- Machine-level primops; ones which we can reasonably delegate to the
18    native code generators to handle.  Basically contains C's primops
19    and no others.
20
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
26    component is omitted.
27
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
31    right casts.  
32 -}
33
34 data MachOp
35
36   -- OPS at the native word size
37   = MO_Nat_Add          -- +
38   | MO_Nat_Sub          -- -
39   | MO_Nat_Eq
40   | MO_Nat_Ne
41
42   | MO_NatS_Ge
43   | MO_NatS_Le
44   | MO_NatS_Gt
45   | MO_NatS_Lt
46
47   | MO_NatU_Ge
48   | MO_NatU_Le
49   | MO_NatU_Gt
50   | MO_NatU_Lt
51
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 -
56
57   | MO_NatU_Mul         -- unsigned *
58   | MO_NatU_Quot        -- unsigned / (same semantics as WordQuotOp)
59   | MO_NatU_Rem         -- unsigned % (same semantics as WordRemOp)
60
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
64
65   | MO_Nat_And
66   | MO_Nat_Or
67   | MO_Nat_Xor
68   | MO_Nat_Not
69   | MO_Nat_Shl
70   | MO_Nat_Shr
71   | MO_Nat_Sar
72
73   -- OPS at 32 bits regardless of word size
74   | MO_32U_Eq
75   | MO_32U_Ne
76   | MO_32U_Ge
77   | MO_32U_Le
78   | MO_32U_Gt
79   | MO_32U_Lt
80
81   -- IEEE754 Double ops
82   | MO_Dbl_Eq
83   | MO_Dbl_Ne
84   | MO_Dbl_Ge
85   | MO_Dbl_Le
86   | MO_Dbl_Gt
87   | MO_Dbl_Lt
88
89   | MO_Dbl_Add
90   | MO_Dbl_Sub
91   | MO_Dbl_Mul
92   | MO_Dbl_Div
93   | MO_Dbl_Pwr
94
95   | MO_Dbl_Sin
96   | MO_Dbl_Cos
97   | MO_Dbl_Tan
98   | MO_Dbl_Sinh
99   | MO_Dbl_Cosh
100   | MO_Dbl_Tanh
101   | MO_Dbl_Asin
102   | MO_Dbl_Acos
103   | MO_Dbl_Atan
104   | MO_Dbl_Log
105   | MO_Dbl_Exp
106   | MO_Dbl_Sqrt
107   | MO_Dbl_Neg
108
109   -- IEEE754 Float ops
110   | MO_Flt_Add
111   | MO_Flt_Sub
112   | MO_Flt_Mul
113   | MO_Flt_Div
114   | MO_Flt_Pwr
115
116   | MO_Flt_Eq
117   | MO_Flt_Ne
118   | MO_Flt_Ge
119   | MO_Flt_Le
120   | MO_Flt_Gt
121   | MO_Flt_Lt
122
123   | MO_Flt_Sin
124   | MO_Flt_Cos
125   | MO_Flt_Tan
126   | MO_Flt_Sinh
127   | MO_Flt_Cosh
128   | MO_Flt_Tanh
129   | MO_Flt_Asin
130   | MO_Flt_Acos
131   | MO_Flt_Atan
132   | MO_Flt_Log
133   | MO_Flt_Exp
134   | MO_Flt_Neg
135   | MO_Flt_Sqrt
136
137   -- Conversions.  Some of these are NOPs, in which case they
138   -- are here usually to placate the C code generator.
139   | MO_32U_to_NatS
140   | MO_NatS_to_32U
141
142   | MO_NatS_to_Dbl
143   | MO_Dbl_to_NatS
144
145   | MO_NatS_to_Flt
146   | MO_Flt_to_NatS
147
148   | MO_NatS_to_NatU
149   | MO_NatU_to_NatS
150
151   | MO_NatS_to_NatP
152   | MO_NatP_to_NatS
153   | MO_NatU_to_NatP
154   | MO_NatP_to_NatU
155
156   | MO_Dbl_to_Flt
157   | MO_Flt_to_Dbl
158
159   | MO_8S_to_NatS
160   | MO_16S_to_NatS
161   | MO_32S_to_NatS
162   | MO_8U_to_NatU
163   | MO_16U_to_NatU
164   | MO_32U_to_NatU
165
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
170     -- at byte address 
171     --    sizeof(machine_word)*Int + base_ptr + sizeof(PrimRep)*index_value
172     deriving Eq
173
174
175
176 -- Almost, but not quite == text . derived show
177 pprMachOp :: MachOp -> SDoc
178
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"
183
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"
188
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"
193
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"
198
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"
202
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"
206
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"
214
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"
221
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"
228
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"
234
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"
248
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"
254
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"
261
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"
275
276 pprMachOp MO_32U_to_NatS   = text "MO_32U_to_NatS"
277 pprMachOp MO_NatS_to_32U   = text "MO_NatS_to_32U"
278
279 pprMachOp MO_NatS_to_Dbl   = text "MO_NatS_to_Dbl"
280 pprMachOp MO_Dbl_to_NatS   = text "MO_Dbl_to_NatS"
281
282 pprMachOp MO_NatS_to_Flt   = text "MO_NatS_to_Flt"
283 pprMachOp MO_Flt_to_NatS   = text "MO_Flt_to_NatS"
284
285 pprMachOp MO_NatS_to_NatU  = text "MO_NatS_to_NatU"
286 pprMachOp MO_NatU_to_NatS  = text "MO_NatU_to_NatS"
287
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"
292
293 pprMachOp MO_Dbl_to_Flt    = text "MO_Dbl_to_Flt"
294 pprMachOp MO_Flt_to_Dbl    = text "MO_Flt_to_Dbl"
295
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"
299
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"
303
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)
308
309
310
311 -- Non-exported helper enumeration:
312 data MO_Prop 
313    = MO_Commutable 
314    | MO_DefinitelyInline 
315    | MO_Comparison
316      deriving Eq
317
318 comm   = MO_Commutable
319 inline = MO_DefinitelyInline
320 comp   = MO_Comparison
321
322
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)
331
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)
336
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)
341
342 -- Find the PrimReps for the returned value(s) of the MachOp.
343 resultRepsOfMachOp :: MachOp -> Maybe012 PrimRep
344 resultRepsOfMachOp mop = fst (machOpProps mop)
345
346 -- This bit does the real work.
347 machOpProps :: MachOp -> (Maybe012 PrimRep, [MO_Prop])
348
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])
353
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])
358
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])
363
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])
368
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])
372
373 machOpProps MO_NatS_AddC     = (Just2 IntRep IntRep, [])
374 machOpProps MO_NatS_SubC     = (Just2 IntRep IntRep, [])
375 machOpProps MO_NatS_MulC     = (Just2 IntRep IntRep, [])
376
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])
384
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])
391
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])
398
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, [])
404
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])
418
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, [])
424
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])
431
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])
445
446 machOpProps MO_32U_to_NatS   = (Just1 IntRep, [inline])
447 machOpProps MO_NatS_to_32U   = (Just1 WordRep, [inline])
448
449 machOpProps MO_NatS_to_Dbl   = (Just1 DoubleRep, [inline])
450 machOpProps MO_Dbl_to_NatS   = (Just1 IntRep, [inline])
451
452 machOpProps MO_NatS_to_Flt   = (Just1 FloatRep, [inline])
453 machOpProps MO_Flt_to_NatS   = (Just1 IntRep, [inline])
454
455 machOpProps MO_NatS_to_NatU  = (Just1 WordRep, [inline])
456 machOpProps MO_NatU_to_NatS  = (Just1 IntRep, [inline])
457
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])
462
463 machOpProps MO_Dbl_to_Flt    = (Just1 FloatRep, [inline])
464 machOpProps MO_Flt_to_Dbl    = (Just1 DoubleRep, [inline])
465
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])
469
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])
473
474 machOpProps (MO_ReadOSBI offset rep)  = (Just1 rep, [inline])
475 machOpProps (MO_WriteOSBI offset rep) = (Just0, [inline])
476
477
478