X-Git-Url: https://git.lukelau.me/?p=kaleidoscope-hs.git;a=blobdiff_plain;f=Main.hs;h=ca6629ab447cd64b7c8748eec07ffa7fe6b34e9d;hp=816692b758ceb7dce309611947d84935df97e6e8;hb=fb7d66e2e530c51a6a20239f8f2cd644f40fecea;hpb=38600a47841e2c5837b5693b32c35d2093864458 diff --git a/Main.hs b/Main.hs index 816692b..ca6629a 100644 --- a/Main.hs +++ b/Main.hs @@ -1,11 +1,12 @@ {-# LANGUAGE OverloadedStrings #-} -import AST +import AST as K -- K for Kaleidoscope import Utils import Control.Monad.IO.Class import qualified Data.Text.Lazy.IO as Text import LLVM.AST.Constant import LLVM.AST.Float +import LLVM.AST.FloatingPointPredicate hiding (False, True) import LLVM.AST.Operand import LLVM.AST.Type as Type import LLVM.IRBuilder @@ -33,3 +34,20 @@ buildAST (TopLevelExpr x) = function "__anon_expr" [] Type.double $ buildExpr :: Expr -> IRBuilderT ModuleBuilder Operand buildExpr (Num x) = pure $ ConstantOperand (Float (Double x)) +buildExpr (BinOp op a b) = do + opA <- buildExpr a + opB <- buildExpr b + tmp <- instr opA opB + if isCmp + then uitofp tmp Type.double + else return tmp + where isCmp + | Cmp _ <- op = True + | otherwise = False + instr = case op of + K.Add -> fadd + K.Sub -> fsub + K.Mul -> fmul + K.Cmp LT -> fcmp OLT + K.Cmp GT -> fcmp OGT + K.Cmp EQ -> fcmp OEQ