-- | Int primitives for 32-bit machines. module Int export value boxInt : [r : Region]. Int# -> Ptr# r Obj unboxInt : [r : Region]. Ptr# r Obj -> Int# addInt : [r1 r2 r3 : Region]. Ptr# r1 Obj -> Ptr# r2 Obj -> Ptr# r3 Obj subInt : [r1 r2 r3 : Region]. Ptr# r1 Obj -> Ptr# r2 Obj -> Ptr# r3 Obj mulInt : [r1 r2 r3 : Region]. Ptr# r1 Obj -> Ptr# r2 Obj -> Ptr# r3 Obj import value allocRawSmall :: [r : Region]. Tag# -> Nat# -> Ptr# r Obj with letrec boxInt [r : Region] (x : Int#) : Ptr# r Obj = do obj = allocRawSmall TAG0# 4# addr = takePtr# obj write# addr 4# x obj unboxInt [r : Region] (obj : Ptr# r Obj) : Int# = do addr = takePtr# obj read# addr 4# addInt [r1 r2 r3 : Region] (x : Ptr# r1 Obj) (y : Ptr# r2 Obj) : Ptr# r3 Obj = boxInt (add# (unboxInt x) (unboxInt y)) subInt [r1 r2 r3 : Region] (x : Ptr# r1 Obj) (y : Ptr# r2 Obj) : Ptr# r3 Obj = boxInt (sub# (unboxInt x) (unboxInt y)) mulInt [r1 r2 r3 : Region] (x : Ptr# r1 Obj) (y : Ptr# r2 Obj) : Ptr# r3 Obj = boxInt (mul# (unboxInt x) (unboxInt y))