authorgravatar for thejoshwolfe@gmail.comJosh Wolfe <thejoshwolfe@gmail.com> 2015-11-29 15:08:25-07:00
committergravatar for thejoshwolfe@gmail.comJosh Wolfe <thejoshwolfe@gmail.com> 2015-11-29 15:08:42-07:00
logceb2d44bfc71074abbe48b3b41a6c05ff39e7267
tree31fc5f3a403dd8567a91bb301acd5bf27d58e4f8
parenta008a81eef80deb8a2756224322a148c61f27af5

merge arithmetic binary operator gen functions


1 files changed, 35 insertions(+), 81 deletions(-)

src/codegen.cpp+35-81
......@@ -756,57 +756,22 @@ static LLVMValueRef gen_cast_expr(CodeGen *g, AstNode *node) {
756756 zig_panic("TODO cast expression");
757757}
758758
759static LLVMValueRef gen_mult_expr(CodeGen *g, AstNode *node) {
759static LLVMValueRef gen_arithmetic_bin_op_expr(CodeGen *g, AstNode *node) {
760760 assert(node->type == NodeTypeBinOpExpr);
761761
762762 LLVMValueRef val1 = gen_expr(g, node->data.bin_op_expr.op1);
763763 LLVMValueRef val2 = gen_expr(g, node->data.bin_op_expr.op2);
764764
765765 switch (node->data.bin_op_expr.bin_op) {
766 case BinOpTypeMult:
767 // TODO types so we know float vs int
768 add_debug_source_node(g, node);
769 return LLVMBuildMul(g->builder, val1, val2, "");
770 case BinOpTypeDiv:
771 // TODO types so we know float vs int and signed vs unsigned
772 add_debug_source_node(g, node);
773 return LLVMBuildSDiv(g->builder, val1, val2, "");
774 case BinOpTypeMod:
775 // TODO types so we know float vs int and signed vs unsigned
766 case BinOpTypeBinOr:
776767 add_debug_source_node(g, node);
777 return LLVMBuildSRem(g->builder, val1, val2, "");
778 default:
779 zig_unreachable();
780 }
781 zig_unreachable();
782}
783
784static LLVMValueRef gen_add_expr(CodeGen *g, AstNode *node) {
785 assert(node->type == NodeTypeBinOpExpr);
786
787 LLVMValueRef val1 = gen_expr(g, node->data.bin_op_expr.op1);
788 LLVMValueRef val2 = gen_expr(g, node->data.bin_op_expr.op2);
789
790 switch (node->data.bin_op_expr.bin_op) {
791 case BinOpTypeAdd:
768 return LLVMBuildOr(g->builder, val1, val2, "");
769 case BinOpTypeBinXor:
792770 add_debug_source_node(g, node);
793 return LLVMBuildAdd(g->builder, val1, val2, "");
794 case BinOpTypeSub:
771 return LLVMBuildXor(g->builder, val1, val2, "");
772 case BinOpTypeBinAnd:
795773 add_debug_source_node(g, node);
796 return LLVMBuildSub(g->builder, val1, val2, "");
797 default:
798 zig_unreachable();
799 }
800 zig_unreachable();
801}
802
803static LLVMValueRef gen_bit_shift_expr(CodeGen *g, AstNode *node) {
804 assert(node->type == NodeTypeBinOpExpr);
805
806 LLVMValueRef val1 = gen_expr(g, node->data.bin_op_expr.op1);
807 LLVMValueRef val2 = gen_expr(g, node->data.bin_op_expr.op2);
808
809 switch (node->data.bin_op_expr.bin_op) {
774 return LLVMBuildAnd(g->builder, val1, val2, "");
810775 case BinOpTypeBitShiftLeft:
811776 add_debug_source_node(g, node);
812777 return LLVMBuildShl(g->builder, val1, val2, "");
......@@ -816,46 +781,40 @@ static LLVMValueRef gen_bit_shift_expr(CodeGen *g, AstNode *node) {
816781 // signed -> arithmetic, unsigned -> logical
817782 add_debug_source_node(g, node);
818783 return LLVMBuildLShr(g->builder, val1, val2, "");
819 default:
784 case BinOpTypeAdd:
785 add_debug_source_node(g, node);
786 return LLVMBuildAdd(g->builder, val1, val2, "");
787 case BinOpTypeSub:
788 add_debug_source_node(g, node);
789 return LLVMBuildSub(g->builder, val1, val2, "");
790 case BinOpTypeMult:
791 // TODO types so we know float vs int
792 add_debug_source_node(g, node);
793 return LLVMBuildMul(g->builder, val1, val2, "");
794 case BinOpTypeDiv:
795 // TODO types so we know float vs int and signed vs unsigned
796 add_debug_source_node(g, node);
797 return LLVMBuildSDiv(g->builder, val1, val2, "");
798 case BinOpTypeMod:
799 // TODO types so we know float vs int and signed vs unsigned
800 add_debug_source_node(g, node);
801 return LLVMBuildSRem(g->builder, val1, val2, "");
802 case BinOpTypeBoolOr:
803 case BinOpTypeBoolAnd:
804 case BinOpTypeCmpEq:
805 case BinOpTypeCmpNotEq:
806 case BinOpTypeCmpLessThan:
807 case BinOpTypeCmpGreaterThan:
808 case BinOpTypeCmpLessOrEq:
809 case BinOpTypeCmpGreaterOrEq:
810 case BinOpTypeInvalid:
820811 zig_unreachable();
821812 }
822813 zig_unreachable();
823814}
824815
825static LLVMValueRef gen_bin_and_expr(CodeGen *g, AstNode *node) {
826 assert(node->type == NodeTypeBinOpExpr);
827
828 LLVMValueRef val1 = gen_expr(g, node->data.bin_op_expr.op1);
829 LLVMValueRef val2 = gen_expr(g, node->data.bin_op_expr.op2);
830
831 add_debug_source_node(g, node);
832 return LLVMBuildAnd(g->builder, val1, val2, "");
833}
834
835static LLVMValueRef gen_bin_xor_expr(CodeGen *g, AstNode *node) {
836 assert(node->type == NodeTypeBinOpExpr);
837
838 LLVMValueRef val1 = gen_expr(g, node->data.bin_op_expr.op1);
839 LLVMValueRef val2 = gen_expr(g, node->data.bin_op_expr.op2);
840
841 add_debug_source_node(g, node);
842 return LLVMBuildXor(g->builder, val1, val2, "");
843}
844
845static LLVMValueRef gen_bin_or_expr(CodeGen *g, AstNode *node) {
846 assert(node->type == NodeTypeBinOpExpr);
847
848 LLVMValueRef val1 = gen_expr(g, node->data.bin_op_expr.op1);
849 LLVMValueRef val2 = gen_expr(g, node->data.bin_op_expr.op2);
850
851 add_debug_source_node(g, node);
852 return LLVMBuildOr(g->builder, val1, val2, "");
853}
854
855816static LLVMIntPredicate cmp_op_to_int_predicate(BinOpType cmp_op, bool is_signed) {
856817 switch (cmp_op) {
857 case BinOpTypeInvalid:
858 zig_unreachable();
859818 case BinOpTypeCmpEq:
860819 return LLVMIntEQ;
861820 case BinOpTypeCmpNotEq:
......@@ -963,21 +922,16 @@ static LLVMValueRef gen_bin_op_expr(CodeGen *g, AstNode *node) {
963922 case BinOpTypeCmpGreaterOrEq:
964923 return gen_cmp_expr(g, node);
965924 case BinOpTypeBinOr:
966 return gen_bin_or_expr(g, node);
967925 case BinOpTypeBinXor:
968 return gen_bin_xor_expr(g, node);
969926 case BinOpTypeBinAnd:
970 return gen_bin_and_expr(g, node);
971927 case BinOpTypeBitShiftLeft:
972928 case BinOpTypeBitShiftRight:
973 return gen_bit_shift_expr(g, node);
974929 case BinOpTypeAdd:
975930 case BinOpTypeSub:
976 return gen_add_expr(g, node);
977931 case BinOpTypeMult:
978932 case BinOpTypeDiv:
979933 case BinOpTypeMod:
980 return gen_mult_expr(g, node);
934 return gen_arithmetic_bin_op_expr(g, node);
981935 }
982936 zig_unreachable();
983937}