packages feed

ddc-code-0.3.2.1: salt/primitive32/Int.dcs

-- | Int primitives for 32-bit machines.
module Int
exports
        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

imports 
        allocRawSmall :: [r : Region]. Tag# -> Nat# -> Ptr# r Obj

with letrec


boxInt [r : Region] (x : Int#) : Ptr# r Obj
 = do   obj     = allocRawSmall [r] TAG0# 4#
        addr    = takePtr# [r] [Obj] obj
        write#  [Int#] addr 4# x
        obj


unboxInt [r : Region] (obj : Ptr# r Obj) : Int#
 = do   addr    = takePtr# [r] [Obj] obj
        read#   [Int#] addr 4#


addInt [r1 r2 r3 : Region] (x : Ptr# r1 Obj) (y : Ptr# r2 Obj) : Ptr# r3 Obj
 = boxInt [r3] (add# [Int#] (unboxInt [r1] x) (unboxInt [r2] y))


subInt [r1 r2 r3 : Region] (x : Ptr# r1 Obj) (y : Ptr# r2 Obj) : Ptr# r3 Obj
 = boxInt [r3] (sub# [Int#] (unboxInt [r1] x) (unboxInt [r2] y))


mulInt [r1 r2 r3 : Region] (x : Ptr# r1 Obj) (y : Ptr# r2 Obj) : Ptr# r3 Obj
 = boxInt [r3] (mul# [Int#] (unboxInt [r1] x) (unboxInt [r2] y))