From 2a2ec67e6ebeb1dc4aea950487072bc9713a4d31 Mon Sep 17 00:00:00 2001 From: Jeffrey Yasskin Date: Sun, 18 Jul 2010 13:37:50 +0800 Subject: Fix opeq.rs for LLVM by implementing simple augmented-assignment operators. --- src/Makefile | 1 - src/boot/fe/ast.ml | 1 + src/boot/llvm/lltrans.ml | 48 +++++++++++++++++++++++++++++++----------------- 3 files changed, 32 insertions(+), 18 deletions(-) (limited to 'src') diff --git a/src/Makefile b/src/Makefile index f2edb62d..d94e3e25 100644 --- a/src/Makefile +++ b/src/Makefile @@ -433,7 +433,6 @@ TEST_XFAILS_LLVM := $(addprefix test/run-pass/, \ obj-recursion.rs \ obj-return-polytypes.rs \ obj-with-vec.rs \ - opeq.rs \ output-slot-variants.rs \ pred.rs \ preempt.rs \ diff --git a/src/boot/fe/ast.ml b/src/boot/fe/ast.ml index 1697bf22..b70b2b88 100644 --- a/src/boot/fe/ast.ml +++ b/src/boot/fe/ast.ml @@ -1377,6 +1377,7 @@ let ty_children (ty:ty) : ty array = [| |] ;; +let sprintf_binop = sprintf_fmt fmt_binop;; let sprintf_expr = sprintf_fmt fmt_expr;; let sprintf_name = sprintf_fmt fmt_name;; let sprintf_name_component = sprintf_fmt fmt_name_component;; diff --git a/src/boot/llvm/lltrans.ml b/src/boot/llvm/lltrans.ml index 91311555..a0569b4c 100644 --- a/src/boot/llvm/lltrans.ml +++ b/src/boot/llvm/lltrans.ml @@ -731,6 +731,25 @@ let trans_crate Llvm.build_load (trans_lval lval) (anon_llid "tmp") llbuilder in + let build_binop (op:Ast.binop) (lllhs:Llvm.llvalue) (llrhs:Llvm.llvalue) + : Llvm.llvalue = + let llid = anon_llid "expr" in + match op with + Ast.BINOP_eq -> + (* TODO: equality works on more than just integers *) + Llvm.build_icmp Llvm.Icmp.Eq lllhs llrhs llid llbuilder + + (* TODO: signed/unsigned distinction, floating point *) + | Ast.BINOP_add -> Llvm.build_add lllhs llrhs llid llbuilder + | Ast.BINOP_sub -> Llvm.build_sub lllhs llrhs llid llbuilder + | Ast.BINOP_mul -> Llvm.build_mul lllhs llrhs llid llbuilder + | Ast.BINOP_div -> Llvm.build_sdiv lllhs llrhs llid llbuilder + | Ast.BINOP_mod -> Llvm.build_srem lllhs llrhs llid llbuilder + + | _ -> raise + (Not_implemented ("build_binop " ^ (Ast.sprintf_binop() op))) + in + let trans_binary_expr ((op:Ast.binop), (lhs:Ast.atom), (rhs:Ast.atom)) : Llvm.llvalue = @@ -748,23 +767,7 @@ let trans_crate let lllhs = trans_atom lhs in (lllhs, llrhs) in - let llid = anon_llid "expr" in - match op with - Ast.BINOP_eq -> - (* TODO: equality works on more than just integers *) - Llvm.build_icmp Llvm.Icmp.Eq lllhs llrhs llid llbuilder - - (* TODO: signed/unsigned distinction, floating point *) - | Ast.BINOP_add -> Llvm.build_add lllhs llrhs llid llbuilder - | Ast.BINOP_sub -> Llvm.build_sub lllhs llrhs llid llbuilder - | Ast.BINOP_mul -> Llvm.build_mul lllhs llrhs llid llbuilder - | Ast.BINOP_div -> Llvm.build_sdiv lllhs llrhs llid llbuilder - | Ast.BINOP_mod -> Llvm.build_srem lllhs llrhs llid llbuilder - - | _ -> raise - (Not_implemented - ("trans_binary_expr " ^ - (Ast.sprintf_expr() (Ast.EXPR_binary (op,lhs,rhs))))) + build_binop op lllhs llrhs in let trans_unary_expr e = raise @@ -854,6 +857,17 @@ let trans_crate ignore (Llvm.build_store llsrc lldest llbuilder); trans_tail () + | Ast.STMT_copy_binop (dest, op, src) -> + let lldest = trans_lval dest in + let llsrc = trans_atom src in + (* FIXME: Handle vecs and strs. *) + let lldest_deref = + Llvm.build_load lldest (anon_llid "dest_init") llbuilder + in + let llres = build_binop op lldest_deref llsrc in + ignore (Llvm.build_store llres lldest llbuilder); + trans_tail () + | Ast.STMT_call (dest, fn, args) -> let llargs = Array.map trans_atom args in let lldest = trans_lval dest in -- cgit v1.2.3