aboutsummaryrefslogtreecommitdiff
path: root/src/stage1/codegen.cpp
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2020-11-01 14:39:56 -0700
committerAndrew Kelley <andrew@ziglang.org>2020-11-01 14:39:56 -0700
commit2e1cef75086a0b606fd8f1f7a0cda4ab2f0b7a49 (patch)
treef7c21db843acab17d344a7dfa2bf4be21d5facb1 /src/stage1/codegen.cpp
parentd530e7f9c7e19b2c9d9117c3120cd75855f4023b (diff)
parentf4ed5d7d480db29d5b3142bacb9d0b98eee0fa2b (diff)
downloadzig-2e1cef75086a0b606fd8f1f7a0cda4ab2f0b7a49.tar.gz
zig-2e1cef75086a0b606fd8f1f7a0cda4ab2f0b7a49.zip
Merge branch 'LemonBoy-morereduce'
Diffstat (limited to 'src/stage1/codegen.cpp')
-rw-r--r--src/stage1/codegen.cpp20
1 files changed, 20 insertions, 0 deletions
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();
}