Add intrinsics.simd_odd_even; More core:simd operations

This commit is contained in:
gingerBill
2026-04-07 11:35:20 +01:00
parent 4dd884bba2
commit ac1b5aea0f
4 changed files with 142 additions and 1 deletions

View File

@@ -1738,6 +1738,30 @@ gb_internal lbValue lb_build_builtin_simd_proc(lbProcedure *p, Ast *expr, TypeAn
return res;
}
case BuiltinProc_simd_odd_even:
{
Type *vt = arg0.type;
GB_ASSERT(vt->kind == Type_SimdVector);
u64 indices_count = cast(u64)vt->SimdVector.count;
LLVMValueRef *vals = gb_alloc_array(temporary_allocator(), LLVMValueRef, indices_count);
for (u64 i = 0; i < indices_count/2; i++) {
u64 val = 2*i + 1;
vals[i] = LLVMConstInt(lb_type(p->module, t_u32), val, false);
}
for (u64 i = 0; i < indices_count/2; i++) {
u64 val = 2*i + indices_count;
vals[i+indices_count/2] = LLVMConstInt(lb_type(p->module, t_u32), val, false);
}
LLVMValueRef indices = LLVMConstVector(vals, cast(unsigned)indices_count);
res.value = LLVMBuildShuffleVector(p->builder, arg0.value, arg1.value, indices, "");
return res;
}
case BuiltinProc_simd_select:
{
LLVMValueRef cond = arg0.value;