= case mop of
MO_NatS_Neg -> trivialUCode NEG x
MO_Nat_Not -> trivialUCode NOT x
- -- MO_32U_to_8U -> trivialUCode (AND (RIImm (ImmInt 255))) x
MO_32U_to_8U -> trivialCode AND x (StInt 255)
MO_Flt_to_NatS -> coerceFP2Int FloatRep x
MO_Dbl_to_NatS -> coerceFP2Int DoubleRep x
MO_NatS_to_Dbl -> coerceInt2FP DoubleRep x
- -- Conversions which are a nop on x86
+ -- Conversions which are a nop on PPC
MO_NatS_to_32U -> conversionNop WordRep x
MO_32U_to_NatS -> conversionNop IntRep x
MO_32U_to_NatU -> conversionNop WordRep x
getRegister src `thenNat` \ registers ->
getNewRegNCG IntRep `thenNat` \ tmp ->
let
+ r_dst = registerName registerd tmp
+ r_src = registerName registers r_dst
+ c_src = registerCode registers r_dst
code = c_src `snocOL`
MOV L (OpReg r_src) (OpReg r_dst)
(argReps,argCodes,vregs) = unzip3 preppedArgs
-- size of linkage area + size of arguments, in bytes
- stackDelta = roundTo16 $ (24 +) $ (4 *) $ sum $ map getPrimRepSize argReps
+ stackDelta = roundTo16 $ (24 +) $ max 32 $ (4 *) $ sum $ map getPrimRepSize argReps
roundTo16 x | x `mod` 16 == 0 = x
| otherwise = x + 16 - (x `mod` 16)
code__2 dst =
if pk1 == pk2 then
code1 `appOL` code2 `snocOL`
- instr (primRepToSize pk) src1 src2 dst
+ instr (primRepToSize pk) dst src1 src2
else panic "###PPC MachCode.trivialFCode: type mismatch"
in
returnNat (Any (if pk1 == pk2 then pk1 else DoubleRep) code__2)