aboutsummaryrefslogtreecommitdiff
path: root/src/llvm_backend_proc.cpp
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2022-05-25 23:34:41 +0100
committergingerBill <bill@gingerbill.org>2022-05-25 23:34:41 +0100
commit7002c94a63c58aa0ac5a5d74b1fffd1511aeb699 (patch)
tree16e0b4a5d5b41004bf33800da22cc7c02b42be7f /src/llvm_backend_proc.cpp
parent57e69ea3922ce56b3c959e60aeeaa032ab81ff8d (diff)
Add `intrinsics.simd_select`
Diffstat (limited to 'src/llvm_backend_proc.cpp')
-rw-r--r--src/llvm_backend_proc.cpp12
1 files changed, 12 insertions, 0 deletions
diff --git a/src/llvm_backend_proc.cpp b/src/llvm_backend_proc.cpp
index 1b5d15d9b..7a86427d4 100644
--- a/src/llvm_backend_proc.cpp
+++ b/src/llvm_backend_proc.cpp
@@ -1296,6 +1296,18 @@ lbValue lb_build_builtin_simd_proc(lbProcedure *p, Ast *expr, TypeAndValue const
res.value = LLVMBuildShuffleVector(p->builder, arg0.value, arg1.value, mask, "");
return res;
}
+
+ case BuiltinProc_simd_select:
+ {
+ LLVMValueRef cond = arg0.value;
+ LLVMValueRef x = lb_build_expr(p, ce->args[1]).value;
+ LLVMValueRef y = lb_build_expr(p, ce->args[2]).value;
+
+ cond = LLVMBuildICmp(p->builder, LLVMIntNE, cond, LLVMConstNull(LLVMTypeOf(cond)), "");
+ res.value = LLVMBuildSelect(p->builder, cond, x, y, "");
+ return res;
+ }
+
}
GB_PANIC("Unhandled simd intrinsic: '%.*s'", LIT(builtin_procs[builtin_id].name));