Skip to content

Commit e97f5d5

Browse files
committed
Add vgetq_lane_s32
The implementation basically matches the existing vgetq_lane_u32
1 parent 8503943 commit e97f5d5

File tree

1 file changed

+22
-0
lines changed
  • crates/core_arch/src/arm/neon

1 file changed

+22
-0
lines changed

crates/core_arch/src/arm/neon/mod.rs

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1368,6 +1368,21 @@ pub unsafe fn vgetq_lane_u32(v: uint32x4_t, imm5: i32) -> u32 {
13681368
simd_extract(v, imm5)
13691369
}
13701370

1371+
/// Move vector element to general-purpose register
1372+
#[inline]
1373+
#[target_feature(enable = "neon")]
1374+
#[cfg_attr(target_arch = "arm", target_feature(enable = "v7"))]
1375+
#[rustc_args_required_const(1)]
1376+
#[cfg_attr(all(test, target_arch = "arm"), assert_instr("vmov.32", imm5 = 2))]
1377+
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(mov, imm5 = 2))]
1378+
pub unsafe fn vgetq_lane_s32(v: int32x4_t, imm5: i32) -> i32 {
1379+
if (imm5) < 0 || (imm5) > 3 {
1380+
unreachable_unchecked()
1381+
}
1382+
let imm5 = (imm5 & 0b11) as u32;
1383+
simd_extract(v, imm5)
1384+
}
1385+
13711386
/// Move vector element to general-purpose register
13721387
#[inline]
13731388
#[target_feature(enable = "neon")]
@@ -1892,6 +1907,13 @@ mod tests {
18921907
assert_eq!(r, 2);
18931908
}
18941909

1910+
#[simd_test(enable = "neon")]
1911+
unsafe fn test_vgetq_lane_s32() {
1912+
let v = i32x4::new(1, 2, 3, 4);
1913+
let r = vgetq_lane_s32(transmute(v), 1);
1914+
assert_eq!(r, 2);
1915+
}
1916+
18951917
#[simd_test(enable = "neon")]
18961918
unsafe fn test_vget_lane_u64() {
18971919
let v: u64 = 1;

0 commit comments

Comments
 (0)