2 module SPARC.CodeGen.CondCode (
10 import {-# SOURCE #-} SPARC.CodeGen.Gen32
11 import SPARC.CodeGen.Base
26 getCondCode :: CmmExpr -> NatM CondCode
27 getCondCode (CmmMachOp mop [x, y])
30 MO_F_Eq W32 -> condFltCode EQQ x y
31 MO_F_Ne W32 -> condFltCode NE x y
32 MO_F_Gt W32 -> condFltCode GTT x y
33 MO_F_Ge W32 -> condFltCode GE x y
34 MO_F_Lt W32 -> condFltCode LTT x y
35 MO_F_Le W32 -> condFltCode LE x y
37 MO_F_Eq W64 -> condFltCode EQQ x y
38 MO_F_Ne W64 -> condFltCode NE x y
39 MO_F_Gt W64 -> condFltCode GTT x y
40 MO_F_Ge W64 -> condFltCode GE x y
41 MO_F_Lt W64 -> condFltCode LTT x y
42 MO_F_Le W64 -> condFltCode LE x y
44 MO_Eq _ -> condIntCode EQQ x y
45 MO_Ne _ -> condIntCode NE x y
47 MO_S_Gt _ -> condIntCode GTT x y
48 MO_S_Ge _ -> condIntCode GE x y
49 MO_S_Lt _ -> condIntCode LTT x y
50 MO_S_Le _ -> condIntCode LE x y
52 MO_U_Gt _ -> condIntCode GU x y
53 MO_U_Ge _ -> condIntCode GEU x y
54 MO_U_Lt _ -> condIntCode LU x y
55 MO_U_Le _ -> condIntCode LEU x y
57 _ -> pprPanic "SPARC.CodeGen.CondCode.getCondCode" (ppr (CmmMachOp mop [x,y]))
59 getCondCode other = pprPanic "SPARC.CodeGen.CondCode.getCondCode" (ppr other)
65 -- @cond(Int|Flt)Code@: Turn a boolean expression into a condition, to be
66 -- passed back up the tree.
68 condIntCode :: Cond -> CmmExpr -> CmmExpr -> NatM CondCode
69 condIntCode cond x (CmmLit (CmmInt y _))
72 (src1, code) <- getSomeReg x
74 src2 = ImmInt (fromInteger y)
75 code' = code `snocOL` SUB False True src1 (RIImm src2) g0
76 return (CondCode False cond code')
78 condIntCode cond x y = do
79 (src1, code1) <- getSomeReg x
80 (src2, code2) <- getSomeReg y
82 code__2 = code1 `appOL` code2 `snocOL`
83 SUB False True src1 (RIReg src2) g0
84 return (CondCode False cond code__2)
87 condFltCode :: Cond -> CmmExpr -> CmmExpr -> NatM CondCode
88 condFltCode cond x y = do
89 (src1, code1) <- getSomeReg x
90 (src2, code2) <- getSomeReg y
91 tmp <- getNewRegNat FF64
93 promote x = FxTOy FF32 FF64 x tmp
99 if pk1 `cmmEqType` pk2 then
100 code1 `appOL` code2 `snocOL`
101 FCMP True (cmmTypeSize pk1) src1 src2
102 else if typeWidth pk1 == W32 then
103 code1 `snocOL` promote src1 `appOL` code2 `snocOL`
104 FCMP True FF64 tmp src2
106 code1 `appOL` code2 `snocOL` promote src2 `snocOL`
107 FCMP True FF64 src1 tmp
108 return (CondCode True cond code__2)