Add intrinsics.simd_pairwise_(add|sub)

This commit is contained in:
gingerBill
2026-04-07 15:45:50 +01:00
parent 6e09ce9a04
commit 6f7226e692
5 changed files with 52 additions and 2 deletions

View File

@@ -2143,6 +2143,41 @@ gb_internal lbValue lb_build_builtin_simd_proc(lbProcedure *p, Ast *expr, TypeAn
} break;
case BuiltinProc_simd_pairwise_add:
case BuiltinProc_simd_pairwise_sub:
if (is_float) {
switch (builtin_id) {
case BuiltinProc_simd_pairwise_add: op_code = LLVMFAdd; break;
case BuiltinProc_simd_pairwise_sub: op_code = LLVMFSub; break;
}
} else {
switch (builtin_id) {
case BuiltinProc_simd_pairwise_add: op_code = LLVMAdd; break;
case BuiltinProc_simd_pairwise_sub: op_code = LLVMSub; break;
}
}
if (op_code) {
LLVMValueRef a = arg0.value;
LLVMValueRef b = arg1.value;
unsigned count = LLVMGetVectorSize(LLVMTypeOf(a));
LLVMValueRef *evens = gb_alloc_array(temporary_allocator(), LLVMValueRef, count);
LLVMValueRef *odds = gb_alloc_array(temporary_allocator(), LLVMValueRef, count);
LLVMTypeRef llvm_u32 = lb_type(m, t_u32);
for (unsigned i = 0; i < count; i++) {
evens[i] = LLVMConstInt(llvm_u32, 2*i, false);
odds[i] = LLVMConstInt(llvm_u32, 2*i + 1, false);
}
LLVMValueRef x = LLVMBuildShuffleVector(p->builder, a, b, LLVMConstVector(evens, count), "");
LLVMValueRef y = LLVMBuildShuffleVector(p->builder, a, b, LLVMConstVector(odds, count), "");
res.value = LLVMBuildBinOp(p->builder, op_code, x, y, "");
return res;
}
break;
case BuiltinProc_simd_ceil:
case BuiltinProc_simd_floor:
case BuiltinProc_simd_trunc: