From fb7d66e2e530c51a6a20239f8f2cd644f40fecea Mon Sep 17 00:00:00 2001 From: Luke Lau Date: Sat, 18 May 2019 23:43:07 +0100 Subject: [PATCH] Generate code for binary operations Also throw in the rest of the comparisons whilst we're at it. --- AST.hs | 2 ++ Main.hs | 20 +++++++++++++++++++- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/AST.hs b/AST.hs index dfa43b7..9ff555a 100644 --- a/AST.hs +++ b/AST.hs @@ -18,6 +18,8 @@ instance Read Expr where , parseVar , parseCall , parseBinOp "<" 10 (Cmp LT) + , parseBinOp ">" 10 (Cmp GT) + , parseBinOp "==" 10 (Cmp EQ) , parseBinOp "+" 20 Add , parseBinOp "-" 20 Sub , parseBinOp "*" 40 Mul 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 -- 2.30.2