From 0d6a7088dc82cfe686beb5ebfe540ba2b7935cd6 Mon Sep 17 00:00:00 2001 From: LemonBoy Date: Sun, 1 Nov 2020 19:51:42 +0100 Subject: stage1: Implement Add/Mul reduction operators --- src/stage1/codegen.cpp | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) (limited to 'src/stage1/codegen.cpp') diff --git a/src/stage1/codegen.cpp b/src/stage1/codegen.cpp index 8f74536665..c034a79cea 100644 --- a/src/stage1/codegen.cpp +++ b/src/stage1/codegen.cpp @@ -5460,6 +5460,8 @@ static LLVMValueRef ir_render_reduce(CodeGen *g, IrExecutableGen *executable, Ir assert(value_type->id == ZigTypeIdVector); ZigType *scalar_type = value_type->data.vector.elem_type; + ZigLLVMSetFastMath(g->builder, ir_want_fast_math(g, &instruction->base)); + LLVMValueRef result_val; switch (instruction->op) { case ReduceOp_and: @@ -5490,6 +5492,24 @@ static LLVMValueRef ir_render_reduce(CodeGen *g, IrExecutableGen *executable, Ir result_val = ZigLLVMBuildFPMaxReduce(g->builder, value); } else zig_unreachable(); } break; + case ReduceOp_add: { + if (scalar_type->id == ZigTypeIdInt) { + result_val = ZigLLVMBuildAddReduce(g->builder, value); + } else if (scalar_type->id == ZigTypeIdFloat) { + LLVMValueRef neutral_value = LLVMConstReal( + get_llvm_type(g, scalar_type), -0.0); + result_val = ZigLLVMBuildFPAddReduce(g->builder, neutral_value, value); + } else zig_unreachable(); + } break; + case ReduceOp_mul: { + if (scalar_type->id == ZigTypeIdInt) { + result_val = ZigLLVMBuildMulReduce(g->builder, value); + } else if (scalar_type->id == ZigTypeIdFloat) { + LLVMValueRef neutral_value = LLVMConstReal( + get_llvm_type(g, scalar_type), 1.0); + result_val = ZigLLVMBuildFPMulReduce(g->builder, neutral_value, value); + } else zig_unreachable(); + } break; default: zig_unreachable(); } -- cgit v1.2.3