mirror of
https://github.com/odin-lang/Odin.git
synced 2026-05-25 21:28:13 +00:00
Add intrinsics.simd_odd_even; More core:simd operations
This commit is contained in:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user