packages feed

llvm-3.2.0.1: examples/Array.hs

module Array where
import Data.Word

import LLVM.Core
--import LLVM.ExecutionEngine
import LLVM.Util.Loop
import LLVM.Util.Optimize

cg :: CodeGenModule (Function (Double -> IO (Ptr Double)))
cg = do
    dotProd <- createFunction InternalLinkage $ \ size aPtr aStride bPtr bStride -> do
        r <- forLoop (valueOf 0) size (valueOf 0) $ \ i s -> do
            ai <- mul aStride i
            bi <- mul bStride i
            ap <- getElementPtr aPtr (ai, ())
            bp <- getElementPtr bPtr (bi, ())
            a <- load ap
            b <- load bp
            ab <- mul a b
            add (s :: Value Double) ab
        ret r
    let _ = dotProd :: Function (Word32 -> Ptr Double -> Word32 -> Ptr Double -> Word32 -> IO Double)

    -- multiply a:[n x m], b:[m x l]
    matMul <- createFunction InternalLinkage $ \ n m l aPtr bPtr cPtr -> do
        forLoop (valueOf 0) n () $ \ ni () -> do
            forLoop (valueOf 0) l () $ \ li () -> do
                ni' <- mul ni m
                row <- getElementPtr aPtr (ni', ())
                col <- getElementPtr bPtr (li, ())
                x <- call dotProd m row (valueOf 1) col m
                j <- add ni' li
                p <- getElementPtr cPtr (j, ())
                store x p
                return ()
        ret ()
    let _ = matMul :: Function (Word32 -> Word32 -> Word32 -> Ptr Double -> Ptr Double -> Ptr Double -> IO ())

    let fillArray _ [] = return ()
        fillArray ptr (x:xs) = do store x ptr; ptr' <- getElementPtr ptr (1::Word32,()); fillArray ptr' xs

    test <- createNamedFunction ExternalLinkage "test" $ \ x -> do
        a <- arrayMalloc (4 :: Word32)
        fillArray a $ map valueOf [1,2,3,4]
        b <- arrayMalloc (4 :: Word32)
        fillArray b [x,x,x,x]
        c <- arrayMalloc (4 :: Word32)
        _ <- call matMul (valueOf 2) (valueOf 2) (valueOf 2) a b c
        ret c
    let _ = test :: Function (Double -> IO (Ptr Double))

    return test

main :: IO ()
main = do
    -- Initialize jitter
    initializeNativeTarget
    m <- newModule
    _f <- defineModule m cg
    writeBitcodeToFile "Arr.bc" m
    _ <- optimizeModule 3 m
    writeBitcodeToFile "Arr-opt.bc" m