Skip to content

Commit e42468c

Browse files
committed
implement the *_dyn intrinsics in LLVM
1 parent 705169f commit e42468c

File tree

3 files changed

+63
-3
lines changed

3 files changed

+63
-3
lines changed

compiler/rustc_codegen_llvm/src/intrinsic.rs

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1422,6 +1422,33 @@ fn generic_simd_intrinsic<'ll, 'tcx>(
14221422

14231423
return Ok(bx.shuffle_vector(args[0].immediate(), args[1].immediate(), indices));
14241424
}
1425+
if name == sym::simd_shuffle_dyn {
1426+
// Make sure this is actually a SIMD vector.
1427+
let idx_ty = args[2].layout.ty;
1428+
let n: u64 = if idx_ty.is_simd()
1429+
&& matches!(idx_ty.simd_size_and_type(bx.cx.tcx).1.kind(), ty::Uint(ty::UintTy::U32))
1430+
{
1431+
idx_ty.simd_size_and_type(bx.cx.tcx).0
1432+
} else {
1433+
return_error!(InvalidMonomorphization::SimdShuffle { span, name, ty: idx_ty })
1434+
};
1435+
1436+
let (out_len, out_ty) = require_simd!(ret_ty, SimdReturn);
1437+
require!(
1438+
out_len == n,
1439+
InvalidMonomorphization::ReturnLength { span, name, in_len: n, ret_ty, out_len }
1440+
);
1441+
require!(
1442+
in_elem == out_ty,
1443+
InvalidMonomorphization::ReturnElement { span, name, in_elem, in_ty, ret_ty, out_ty }
1444+
);
1445+
1446+
return Ok(bx.shuffle_vector(
1447+
args[0].immediate(),
1448+
args[1].immediate(),
1449+
args[2].immediate(),
1450+
));
1451+
}
14251452

14261453
if name == sym::simd_insert {
14271454
require!(
@@ -1451,6 +1478,23 @@ fn generic_simd_intrinsic<'ll, 'tcx>(
14511478
bx.const_i32(idx as i32),
14521479
));
14531480
}
1481+
if name == sym::simd_insert_dyn {
1482+
require!(
1483+
in_elem == arg_tys[2],
1484+
InvalidMonomorphization::InsertedType {
1485+
span,
1486+
name,
1487+
in_elem,
1488+
in_ty,
1489+
out_ty: arg_tys[2]
1490+
}
1491+
);
1492+
return Ok(bx.insert_element(
1493+
args[0].immediate(),
1494+
args[2].immediate(),
1495+
args[1].immediate(),
1496+
));
1497+
}
14541498
if name == sym::simd_extract {
14551499
require!(
14561500
ret_ty == in_elem,
@@ -1469,6 +1513,13 @@ fn generic_simd_intrinsic<'ll, 'tcx>(
14691513
}
14701514
return Ok(bx.extract_element(args[0].immediate(), bx.const_i32(idx as i32)));
14711515
}
1516+
if name == sym::simd_extract_dyn {
1517+
require!(
1518+
ret_ty == in_elem,
1519+
InvalidMonomorphization::ReturnType { span, name, in_elem, in_ty, ret_ty }
1520+
);
1521+
return Ok(bx.extract_element(args[0].immediate(), args[1].immediate()));
1522+
}
14721523

14731524
if name == sym::simd_select {
14741525
let m_elem_ty = in_elem;

compiler/rustc_hir_analysis/src/check/intrinsic.rs

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -682,8 +682,12 @@ pub fn check_intrinsic_type(
682682
sym::simd_masked_load => (3, 0, vec![param(0), param(1), param(2)], param(2)),
683683
sym::simd_masked_store => (3, 0, vec![param(0), param(1), param(2)], tcx.types.unit),
684684
sym::simd_scatter => (3, 0, vec![param(0), param(1), param(2)], tcx.types.unit),
685-
sym::simd_insert => (2, 0, vec![param(0), tcx.types.u32, param(1)], param(0)),
686-
sym::simd_extract => (2, 0, vec![param(0), tcx.types.u32], param(1)),
685+
sym::simd_insert | sym::simd_insert_dyn => {
686+
(2, 0, vec![param(0), tcx.types.u32, param(1)], param(0))
687+
}
688+
sym::simd_extract | sym::simd_extract_dyn => {
689+
(2, 0, vec![param(0), tcx.types.u32], param(1))
690+
}
687691
sym::simd_cast
688692
| sym::simd_as
689693
| sym::simd_cast_ptr
@@ -704,7 +708,9 @@ pub fn check_intrinsic_type(
704708
| sym::simd_reduce_xor
705709
| sym::simd_reduce_min
706710
| sym::simd_reduce_max => (2, 0, vec![param(0)], param(1)),
707-
sym::simd_shuffle => (3, 0, vec![param(0), param(0), param(1)], param(2)),
711+
sym::simd_shuffle | sym::simd_shuffle_dyn => {
712+
(3, 0, vec![param(0), param(0), param(1)], param(2))
713+
}
708714
sym::simd_shuffle_generic => (2, 1, vec![param(0), param(0)], param(1)),
709715

710716
other => {

library/core/src/intrinsics/simd.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ pub unsafe fn simd_insert<T, U>(_x: T, _idx: u32, _val: U) -> T {
2828
#[rustc_intrinsic]
2929
#[rustc_intrinsic_must_be_overridden]
3030
#[rustc_nounwind]
31+
#[cfg(not(bootstrap))]
3132
pub unsafe fn simd_insert_dyn<T, U>(_x: T, _idx: u32, _val: U) -> T {
3233
unreachable!()
3334
}
@@ -58,6 +59,7 @@ pub unsafe fn simd_extract<T, U>(_x: T, _idx: u32) -> U {
5859
#[rustc_intrinsic]
5960
#[rustc_intrinsic_must_be_overridden]
6061
#[rustc_nounwind]
62+
#[cfg(not(bootstrap))]
6163
pub unsafe fn simd_extract_dyn<T, U>(_x: T, _idx: u32) -> U {
6264
unreachable!()
6365
}
@@ -388,6 +390,7 @@ pub unsafe fn simd_shuffle<T, U, V>(_x: T, _y: T, _idx: U) -> V {
388390
#[rustc_intrinsic]
389391
#[rustc_intrinsic_must_be_overridden]
390392
#[rustc_nounwind]
393+
#[cfg(not(bootstrap))]
391394
pub unsafe fn simd_shuffle_dyn<T, U, V>(_x: T, _y: T, _idx: U) -> V {
392395
unreachable!()
393396
}

0 commit comments

Comments
 (0)