motiejus/zig

fork of https://codeberg.org/ziglang/zig
git clone https://git.jakstys.lt/motiejus/zig.git
Log | Tree | Refs | README | LICENSE

commit ceb2d44bfc71074abbe48b3b41a6c05ff39e7267 (tree)
parent a008a81eef80deb8a2756224322a148c61f27af5
Author: Josh Wolfe <thejoshwolfe@gmail.com>
Date:   Sun, 29 Nov 2015 15:08:25 -0700

merge arithmetic binary operator gen functions

Diffstat:
Msrc/codegen.cpp | 116++++++++++++++++++++++++-------------------------------------------------------
1 file changed, 35 insertions(+), 81 deletions(-)

diff --git a/src/codegen.cpp b/src/codegen.cpp @@ -756,57 +756,22 @@ static LLVMValueRef gen_cast_expr(CodeGen *g, AstNode *node) { zig_panic("TODO cast expression"); } -static LLVMValueRef gen_mult_expr(CodeGen *g, AstNode *node) { +static LLVMValueRef gen_arithmetic_bin_op_expr(CodeGen *g, AstNode *node) { assert(node->type == NodeTypeBinOpExpr); LLVMValueRef val1 = gen_expr(g, node->data.bin_op_expr.op1); LLVMValueRef val2 = gen_expr(g, node->data.bin_op_expr.op2); switch (node->data.bin_op_expr.bin_op) { - case BinOpTypeMult: - // TODO types so we know float vs int - add_debug_source_node(g, node); - return LLVMBuildMul(g->builder, val1, val2, ""); - case BinOpTypeDiv: - // TODO types so we know float vs int and signed vs unsigned - add_debug_source_node(g, node); - return LLVMBuildSDiv(g->builder, val1, val2, ""); - case BinOpTypeMod: - // TODO types so we know float vs int and signed vs unsigned + case BinOpTypeBinOr: add_debug_source_node(g, node); - return LLVMBuildSRem(g->builder, val1, val2, ""); - default: - zig_unreachable(); - } - zig_unreachable(); -} - -static LLVMValueRef gen_add_expr(CodeGen *g, AstNode *node) { - assert(node->type == NodeTypeBinOpExpr); - - LLVMValueRef val1 = gen_expr(g, node->data.bin_op_expr.op1); - LLVMValueRef val2 = gen_expr(g, node->data.bin_op_expr.op2); - - switch (node->data.bin_op_expr.bin_op) { - case BinOpTypeAdd: + return LLVMBuildOr(g->builder, val1, val2, ""); + case BinOpTypeBinXor: add_debug_source_node(g, node); - return LLVMBuildAdd(g->builder, val1, val2, ""); - case BinOpTypeSub: + return LLVMBuildXor(g->builder, val1, val2, ""); + case BinOpTypeBinAnd: add_debug_source_node(g, node); - return LLVMBuildSub(g->builder, val1, val2, ""); - default: - zig_unreachable(); - } - zig_unreachable(); -} - -static LLVMValueRef gen_bit_shift_expr(CodeGen *g, AstNode *node) { - assert(node->type == NodeTypeBinOpExpr); - - LLVMValueRef val1 = gen_expr(g, node->data.bin_op_expr.op1); - LLVMValueRef val2 = gen_expr(g, node->data.bin_op_expr.op2); - - switch (node->data.bin_op_expr.bin_op) { + return LLVMBuildAnd(g->builder, val1, val2, ""); case BinOpTypeBitShiftLeft: add_debug_source_node(g, node); return LLVMBuildShl(g->builder, val1, val2, ""); @@ -816,46 +781,40 @@ static LLVMValueRef gen_bit_shift_expr(CodeGen *g, AstNode *node) { // signed -> arithmetic, unsigned -> logical add_debug_source_node(g, node); return LLVMBuildLShr(g->builder, val1, val2, ""); - default: + case BinOpTypeAdd: + add_debug_source_node(g, node); + return LLVMBuildAdd(g->builder, val1, val2, ""); + case BinOpTypeSub: + add_debug_source_node(g, node); + return LLVMBuildSub(g->builder, val1, val2, ""); + case BinOpTypeMult: + // TODO types so we know float vs int + add_debug_source_node(g, node); + return LLVMBuildMul(g->builder, val1, val2, ""); + case BinOpTypeDiv: + // TODO types so we know float vs int and signed vs unsigned + add_debug_source_node(g, node); + return LLVMBuildSDiv(g->builder, val1, val2, ""); + case BinOpTypeMod: + // TODO types so we know float vs int and signed vs unsigned + add_debug_source_node(g, node); + return LLVMBuildSRem(g->builder, val1, val2, ""); + case BinOpTypeBoolOr: + case BinOpTypeBoolAnd: + case BinOpTypeCmpEq: + case BinOpTypeCmpNotEq: + case BinOpTypeCmpLessThan: + case BinOpTypeCmpGreaterThan: + case BinOpTypeCmpLessOrEq: + case BinOpTypeCmpGreaterOrEq: + case BinOpTypeInvalid: zig_unreachable(); } zig_unreachable(); } -static LLVMValueRef gen_bin_and_expr(CodeGen *g, AstNode *node) { - assert(node->type == NodeTypeBinOpExpr); - - LLVMValueRef val1 = gen_expr(g, node->data.bin_op_expr.op1); - LLVMValueRef val2 = gen_expr(g, node->data.bin_op_expr.op2); - - add_debug_source_node(g, node); - return LLVMBuildAnd(g->builder, val1, val2, ""); -} - -static LLVMValueRef gen_bin_xor_expr(CodeGen *g, AstNode *node) { - assert(node->type == NodeTypeBinOpExpr); - - LLVMValueRef val1 = gen_expr(g, node->data.bin_op_expr.op1); - LLVMValueRef val2 = gen_expr(g, node->data.bin_op_expr.op2); - - add_debug_source_node(g, node); - return LLVMBuildXor(g->builder, val1, val2, ""); -} - -static LLVMValueRef gen_bin_or_expr(CodeGen *g, AstNode *node) { - assert(node->type == NodeTypeBinOpExpr); - - LLVMValueRef val1 = gen_expr(g, node->data.bin_op_expr.op1); - LLVMValueRef val2 = gen_expr(g, node->data.bin_op_expr.op2); - - add_debug_source_node(g, node); - return LLVMBuildOr(g->builder, val1, val2, ""); -} - static LLVMIntPredicate cmp_op_to_int_predicate(BinOpType cmp_op, bool is_signed) { switch (cmp_op) { - case BinOpTypeInvalid: - zig_unreachable(); case BinOpTypeCmpEq: return LLVMIntEQ; case BinOpTypeCmpNotEq: @@ -963,21 +922,16 @@ static LLVMValueRef gen_bin_op_expr(CodeGen *g, AstNode *node) { case BinOpTypeCmpGreaterOrEq: return gen_cmp_expr(g, node); case BinOpTypeBinOr: - return gen_bin_or_expr(g, node); case BinOpTypeBinXor: - return gen_bin_xor_expr(g, node); case BinOpTypeBinAnd: - return gen_bin_and_expr(g, node); case BinOpTypeBitShiftLeft: case BinOpTypeBitShiftRight: - return gen_bit_shift_expr(g, node); case BinOpTypeAdd: case BinOpTypeSub: - return gen_add_expr(g, node); case BinOpTypeMult: case BinOpTypeDiv: case BinOpTypeMod: - return gen_mult_expr(g, node); + return gen_arithmetic_bin_op_expr(g, node); } zig_unreachable(); }