packages feed

ddc-code-0.4.1.1: salt/primitive64/Int.dcs

-- | Int primitives for 64-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# 8#
        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))