mirror of
https://github.com/odin-lang/Odin.git
synced 2026-05-27 06:08:13 +00:00
Add intrinsics.simd_pairwise_(add|sub)
This commit is contained in:
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user