@@ -731,6 +731,25 @@ let trans_crate
731
731
Llvm. build_load (trans_lval lval) (anon_llid " tmp" ) llbuilder
732
732
in
733
733
734
+ let build_binop (op :Ast.binop ) (lllhs :Llvm.llvalue ) (llrhs :Llvm.llvalue )
735
+ : Llvm.llvalue =
736
+ let llid = anon_llid " expr" in
737
+ match op with
738
+ Ast. BINOP_eq ->
739
+ (* TODO: equality works on more than just integers *)
740
+ Llvm. build_icmp Llvm.Icmp. Eq lllhs llrhs llid llbuilder
741
+
742
+ (* TODO: signed/unsigned distinction, floating point *)
743
+ | Ast. BINOP_add -> Llvm. build_add lllhs llrhs llid llbuilder
744
+ | Ast. BINOP_sub -> Llvm. build_sub lllhs llrhs llid llbuilder
745
+ | Ast. BINOP_mul -> Llvm. build_mul lllhs llrhs llid llbuilder
746
+ | Ast. BINOP_div -> Llvm. build_sdiv lllhs llrhs llid llbuilder
747
+ | Ast. BINOP_mod -> Llvm. build_srem lllhs llrhs llid llbuilder
748
+
749
+ | _ -> raise
750
+ (Not_implemented (" build_binop " ^ (Ast. sprintf_binop() op)))
751
+ in
752
+
734
753
let trans_binary_expr
735
754
((op :Ast.binop ), (lhs :Ast.atom ), (rhs :Ast.atom ))
736
755
: Llvm.llvalue =
@@ -748,23 +767,7 @@ let trans_crate
748
767
let lllhs = trans_atom lhs in
749
768
(lllhs, llrhs)
750
769
in
751
- let llid = anon_llid " expr" in
752
- match op with
753
- Ast. BINOP_eq ->
754
- (* TODO: equality works on more than just integers *)
755
- Llvm. build_icmp Llvm.Icmp. Eq lllhs llrhs llid llbuilder
756
-
757
- (* TODO: signed/unsigned distinction, floating point *)
758
- | Ast. BINOP_add -> Llvm. build_add lllhs llrhs llid llbuilder
759
- | Ast. BINOP_sub -> Llvm. build_sub lllhs llrhs llid llbuilder
760
- | Ast. BINOP_mul -> Llvm. build_mul lllhs llrhs llid llbuilder
761
- | Ast. BINOP_div -> Llvm. build_sdiv lllhs llrhs llid llbuilder
762
- | Ast. BINOP_mod -> Llvm. build_srem lllhs llrhs llid llbuilder
763
-
764
- | _ -> raise
765
- (Not_implemented
766
- (" trans_binary_expr " ^
767
- (Ast. sprintf_expr() (Ast. EXPR_binary (op,lhs,rhs)))))
770
+ build_binop op lllhs llrhs
768
771
in
769
772
770
773
let trans_unary_expr e = raise
@@ -854,6 +857,17 @@ let trans_crate
854
857
ignore (Llvm. build_store llsrc lldest llbuilder);
855
858
trans_tail ()
856
859
860
+ | Ast. STMT_copy_binop (dest , op , src ) ->
861
+ let lldest = trans_lval dest in
862
+ let llsrc = trans_atom src in
863
+ (* FIXME: Handle vecs and strs. *)
864
+ let lldest_deref =
865
+ Llvm. build_load lldest (anon_llid " dest_init" ) llbuilder
866
+ in
867
+ let llres = build_binop op lldest_deref llsrc in
868
+ ignore (Llvm. build_store llres lldest llbuilder);
869
+ trans_tail ()
870
+
857
871
| Ast. STMT_call (dest , fn , args ) ->
858
872
let llargs = Array. map trans_atom args in
859
873
let lldest = trans_lval dest in
0 commit comments