Skip to content

Commit 03e11a2

Browse files
committed
impl simd_ctlz/simd_cttz intrinsic
Signed-off-by: Andy Sadler <[email protected]>
1 parent 8d42a82 commit 03e11a2

File tree

1 file changed

+16
-0
lines changed

1 file changed

+16
-0
lines changed

src/intrinsic/simd.rs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -333,6 +333,22 @@ pub fn generic_simd_intrinsic<'a, 'gcc, 'tcx>(
333333
return Ok(bx.context.new_rvalue_from_vector(None, vector_ty, &new_elements));
334334
}
335335

336+
if name == sym::simd_ctlz || name == sym::simd_cttz {
337+
let vector = args[0].immediate();
338+
let elements: Vec<_> = (0..in_len)
339+
.map(|i| {
340+
let index = bx.context.new_rvalue_from_long(bx.i32_type, i as i64);
341+
let value = bx.extract_element(vector, index).to_rvalue();
342+
if name == sym::simd_ctlz {
343+
bx.count_leading_zeroes(value.get_type().get_size() as u64 * 8, value)
344+
} else {
345+
bx.count_trailing_zeroes(value.get_type().get_size() as u64 * 8, value)
346+
}
347+
})
348+
.collect();
349+
return Ok(bx.context.new_rvalue_from_vector(None, vector.get_type(), &elements));
350+
}
351+
336352
if name == sym::simd_shuffle {
337353
// Make sure this is actually an array, since typeck only checks the length-suffixed
338354
// version of this intrinsic.

0 commit comments

Comments
 (0)