aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2024-08-05 14:54:09 +0100
committergingerBill <bill@gingerbill.org>2024-08-05 14:54:09 +0100
commitf56abf37804240c508f0ca7f249176208d333c72 (patch)
tree7657f8f1e80ca46534c04e85cecde4877a444e98 /src
parent78919f85249a6136929be772319694cf6c1e4df1 (diff)
Add `intrinsics.masked_expand_load` and `intrinsics.masked_compress_store`
Diffstat (limited to 'src')
-rw-r--r--src/check_builtin.cpp7
-rw-r--r--src/checker_builtin_procs.hpp4
-rw-r--r--src/llvm_backend_proc.cpp34
3 files changed, 38 insertions, 7 deletions
diff --git a/src/check_builtin.cpp b/src/check_builtin.cpp
index b5851bc01..bde102a8d 100644
--- a/src/check_builtin.cpp
+++ b/src/check_builtin.cpp
@@ -667,12 +667,16 @@ gb_internal bool check_builtin_simd_operation(CheckerContext *c, Operand *operan
case BuiltinProc_simd_scatter:
case BuiltinProc_simd_masked_load:
case BuiltinProc_simd_masked_store:
+ case BuiltinProc_simd_masked_expand_load:
+ case BuiltinProc_simd_masked_compress_store:
{
// gather (ptr: #simd[N]rawptr, values: #simd[N]T, mask: #simd[N]int_or_bool) -> #simd[N]T
// scatter(ptr: #simd[N]rawptr, values: #simd[N]T, mask: #simd[N]int_or_bool)
// masked_load (ptr: rawptr, values: #simd[N]T, mask: #simd[N]int_or_bool) -> #simd[N]T
// masked_store(ptr: rawptr, values: #simd[N]T, mask: #simd[N]int_or_bool)
+ // masked_expand_load (ptr: rawptr, values: #simd[N]T, mask: #simd[N]int_or_bool) -> #simd[N]T
+ // masked_compress_store(ptr: rawptr, values: #simd[N]T, mask: #simd[N]int_or_bool)
Operand ptr = {};
Operand values = {};
@@ -733,7 +737,8 @@ gb_internal bool check_builtin_simd_operation(CheckerContext *c, Operand *operan
}
if (id == BuiltinProc_simd_gather ||
- id == BuiltinProc_simd_masked_load) {
+ id == BuiltinProc_simd_masked_load ||
+ id == BuiltinProc_simd_masked_expand_load) {
operand->mode = Addressing_Value;
operand->type = values.type;
} else {
diff --git a/src/checker_builtin_procs.hpp b/src/checker_builtin_procs.hpp
index a5f688cd8..6245dadaf 100644
--- a/src/checker_builtin_procs.hpp
+++ b/src/checker_builtin_procs.hpp
@@ -195,6 +195,8 @@ BuiltinProc__simd_begin,
BuiltinProc_simd_scatter,
BuiltinProc_simd_masked_load,
BuiltinProc_simd_masked_store,
+ BuiltinProc_simd_masked_expand_load,
+ BuiltinProc_simd_masked_compress_store,
// Platform specific SIMD intrinsics
BuiltinProc_simd_x86__MM_SHUFFLE,
@@ -530,6 +532,8 @@ gb_global BuiltinProc builtin_procs[BuiltinProc_COUNT] = {
{STR_LIT("simd_scatter"), 3, false, Expr_Stmt, BuiltinProcPkg_intrinsics},
{STR_LIT("simd_masked_load"), 3, false, Expr_Expr, BuiltinProcPkg_intrinsics},
{STR_LIT("simd_masked_store"), 3, false, Expr_Stmt, BuiltinProcPkg_intrinsics},
+ {STR_LIT("simd_masked_expand_load"), 3, false, Expr_Expr, BuiltinProcPkg_intrinsics},
+ {STR_LIT("simd_masked_compress_store"), 3, false, Expr_Stmt, BuiltinProcPkg_intrinsics},
{STR_LIT("simd_x86__MM_SHUFFLE"), 4, false, Expr_Expr, BuiltinProcPkg_intrinsics},
diff --git a/src/llvm_backend_proc.cpp b/src/llvm_backend_proc.cpp
index ce1cc8586..ceaeb1aca 100644
--- a/src/llvm_backend_proc.cpp
+++ b/src/llvm_backend_proc.cpp
@@ -1693,6 +1693,8 @@ gb_internal lbValue lb_build_builtin_simd_proc(lbProcedure *p, Ast *expr, TypeAn
case BuiltinProc_simd_scatter:
case BuiltinProc_simd_masked_load:
case BuiltinProc_simd_masked_store:
+ case BuiltinProc_simd_masked_expand_load:
+ case BuiltinProc_simd_masked_compress_store:
{
LLVMValueRef ptr = arg0.value;
LLVMValueRef val = arg1.value;
@@ -1705,11 +1707,14 @@ gb_internal lbValue lb_build_builtin_simd_proc(lbProcedure *p, Ast *expr, TypeAn
char const *name = nullptr;
switch (builtin_id) {
- case BuiltinProc_simd_gather: name = "llvm.masked.gather"; break;
- case BuiltinProc_simd_scatter: name = "llvm.masked.scatter"; break;
- case BuiltinProc_simd_masked_load: name = "llvm.masked.load"; break;
- case BuiltinProc_simd_masked_store: name = "llvm.masked.store"; break;
- }
+ case BuiltinProc_simd_gather: name = "llvm.masked.gather"; break;
+ case BuiltinProc_simd_scatter: name = "llvm.masked.scatter"; break;
+ case BuiltinProc_simd_masked_load: name = "llvm.masked.load"; break;
+ case BuiltinProc_simd_masked_store: name = "llvm.masked.store"; break;
+ case BuiltinProc_simd_masked_expand_load: name = "llvm.masked.expandload"; break;
+ case BuiltinProc_simd_masked_compress_store: name = "llvm.masked.compressstore"; break;
+ }
+ unsigned type_count = 2;
LLVMTypeRef types[2] = {
lb_type(p->module, arg1.type),
lb_type(p->module, arg0.type)
@@ -1718,6 +1723,7 @@ gb_internal lbValue lb_build_builtin_simd_proc(lbProcedure *p, Ast *expr, TypeAn
auto alignment = cast(unsigned long long)type_align_of(base_array_type(arg1.type));
LLVMValueRef align = LLVMConstInt(LLVMInt32TypeInContext(p->module->ctx), alignment, false);
+ unsigned arg_count = 4;
LLVMValueRef args[4] = {};
switch (builtin_id) {
case BuiltinProc_simd_masked_load:
@@ -1739,9 +1745,25 @@ gb_internal lbValue lb_build_builtin_simd_proc(lbProcedure *p, Ast *expr, TypeAn
args[2] = align;
args[3] = mask;
break;
+
+ case BuiltinProc_simd_masked_expand_load:
+ arg_count = 3;
+ type_count = 1;
+ args[0] = ptr;
+ args[1] = mask;
+ args[2] = val;
+ break;
+
+ case BuiltinProc_simd_masked_compress_store:
+ arg_count = 3;
+ type_count = 1;
+ args[0] = val;
+ args[1] = ptr;
+ args[2] = mask;
+ break;
}
- res.value = lb_call_intrinsic(p, name, args, gb_count_of(args), types, gb_count_of(types));
+ res.value = lb_call_intrinsic(p, name, args, arg_count, types, type_count);
return res;
}