Skip to content

Commit d32ca64

Browse files
committed
Allow isize/usize in simd_cast
1 parent 399ba6b commit d32ca64

File tree

2 files changed

+37
-4
lines changed

2 files changed

+37
-4
lines changed

compiler/rustc_codegen_llvm/src/intrinsic.rs

+16-4
Original file line numberDiff line numberDiff line change
@@ -1715,14 +1715,26 @@ unsupported {} from `{}` with element `{}` of size `{}` to `{}`"#,
17151715
let (in_style, in_width) = match in_elem.kind() {
17161716
// vectors of pointer-sized integers should've been
17171717
// disallowed before here, so this unwrap is safe.
1718-
ty::Int(i) => (Style::Int(true), i.bit_width().unwrap()),
1719-
ty::Uint(u) => (Style::Int(false), u.bit_width().unwrap()),
1718+
ty::Int(i) => (
1719+
Style::Int(true),
1720+
i.normalize(bx.tcx().sess.target.pointer_width).bit_width().unwrap(),
1721+
),
1722+
ty::Uint(u) => (
1723+
Style::Int(false),
1724+
u.normalize(bx.tcx().sess.target.pointer_width).bit_width().unwrap(),
1725+
),
17201726
ty::Float(f) => (Style::Float, f.bit_width()),
17211727
_ => (Style::Unsupported, 0),
17221728
};
17231729
let (out_style, out_width) = match out_elem.kind() {
1724-
ty::Int(i) => (Style::Int(true), i.bit_width().unwrap()),
1725-
ty::Uint(u) => (Style::Int(false), u.bit_width().unwrap()),
1730+
ty::Int(i) => (
1731+
Style::Int(true),
1732+
i.normalize(bx.tcx().sess.target.pointer_width).bit_width().unwrap(),
1733+
),
1734+
ty::Uint(u) => (
1735+
Style::Int(false),
1736+
u.normalize(bx.tcx().sess.target.pointer_width).bit_width().unwrap(),
1737+
),
17261738
ty::Float(f) => (Style::Float, f.bit_width()),
17271739
_ => (Style::Unsupported, 0),
17281740
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
// run-pass
2+
#![feature(repr_simd, platform_intrinsics)]
3+
4+
extern "platform-intrinsic" {
5+
fn simd_cast<T, U>(x: T) -> U;
6+
}
7+
8+
#[derive(Copy, Clone)]
9+
#[repr(simd)]
10+
struct V<T>([T; 4]);
11+
12+
fn main() {
13+
let u = V::<usize>([0, 1, 2, 3]);
14+
let uu32: V<u32> = unsafe { simd_cast(u) };
15+
let ui64: V<i64> = unsafe { simd_cast(u) };
16+
17+
for (u, (uu32, ui64)) in u.0.iter().zip(uu32.0.iter().zip(ui64.0.iter())) {
18+
assert_eq!(*u as u32, *uu32);
19+
assert_eq!(*u as i64, *ui64);
20+
}
21+
}

0 commit comments

Comments
 (0)