aboutsummaryrefslogtreecommitdiff
path: root/src/llvm_backend_proc.cpp
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2022-05-26 11:24:10 +0100
committergingerBill <bill@gingerbill.org>2022-05-26 11:24:10 +0100
commit35502816c7d53b0b5fd422537d32efb5c34b1811 (patch)
tree63880ffd0b164156b62cacafd94514c337f53d33 /src/llvm_backend_proc.cpp
parent7ec0236fbf55939ef46662a732b00908730f826b (diff)
Add `simd_add_sat` `simd_sub_sat`
Diffstat (limited to 'src/llvm_backend_proc.cpp')
-rw-r--r--src/llvm_backend_proc.cpp24
1 files changed, 24 insertions, 0 deletions
diff --git a/src/llvm_backend_proc.cpp b/src/llvm_backend_proc.cpp
index 42f5a60fa..dbdc51078 100644
--- a/src/llvm_backend_proc.cpp
+++ b/src/llvm_backend_proc.cpp
@@ -1353,6 +1353,30 @@ lbValue lb_build_builtin_simd_proc(lbProcedure *p, Ast *expr, TypeAndValue const
return res;
}
+ case BuiltinProc_simd_add_sat:
+ case BuiltinProc_simd_sub_sat:
+ {
+ arg1 = lb_build_expr(p, ce->args[1]);
+
+ char const *name = nullptr;
+ switch (builtin_id) {
+ case BuiltinProc_simd_add_sat: name = is_signed ? "llvm.sadd.sat" : "llvm.uadd.sat"; break;
+ case BuiltinProc_simd_sub_sat: name = is_signed ? "llvm.ssub.sat" : "llvm.usub.sat"; break;
+ }
+
+ LLVMTypeRef types[1] = {lb_type(p->module, arg0.type)};
+ unsigned id = LLVMLookupIntrinsicID(name, gb_strlen(name));
+ GB_ASSERT_MSG(id != 0, "Unable to find %s.%s", name, LLVMPrintTypeToString(types[0]));
+ LLVMValueRef ip = LLVMGetIntrinsicDeclaration(p->module->mod, id, types, gb_count_of(types));
+
+ LLVMValueRef args[2] = {};
+ args[0] = arg0.value;
+ args[1] = arg1.value;
+
+ res.value = LLVMBuildCall(p->builder, ip, args, gb_count_of(args), "");
+ return res;
+ }
+
}
GB_PANIC("Unhandled simd intrinsic: '%.*s'", LIT(builtin_procs[builtin_id].name));