Skip to content

Commit 37d9253

Browse files
authored
add neon instruction vmov_n_* and vmovq_n_* (rust-lang#1085)
1 parent 9ca5234 commit 37d9253

File tree

3 files changed

+592
-11
lines changed

3 files changed

+592
-11
lines changed

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

Lines changed: 128 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1507,6 +1507,70 @@ pub unsafe fn vcombine_p64(low: poly64x1_t, high: poly64x1_t) -> poly64x2_t {
15071507
simd_shuffle2(low, high, [0, 1])
15081508
}
15091509

1510+
/// Duplicate vector element to vector or scalar
1511+
#[inline]
1512+
#[target_feature(enable = "neon")]
1513+
#[cfg_attr(test, assert_instr(fmov))]
1514+
pub unsafe fn vdup_n_p64(value: p64) -> poly64x1_t {
1515+
transmute(u64x1::new(value))
1516+
}
1517+
1518+
/// Duplicate vector element to vector or scalar
1519+
#[inline]
1520+
#[target_feature(enable = "neon")]
1521+
#[cfg_attr(test, assert_instr(ldr))]
1522+
pub unsafe fn vdup_n_f64(value: f64) -> float64x1_t {
1523+
float64x1_t(value)
1524+
}
1525+
1526+
/// Duplicate vector element to vector or scalar
1527+
#[inline]
1528+
#[target_feature(enable = "neon")]
1529+
#[cfg_attr(test, assert_instr(dup))]
1530+
pub unsafe fn vdupq_n_p64(value: p64) -> poly64x2_t {
1531+
transmute(u64x2::new(value, value))
1532+
}
1533+
1534+
/// Duplicate vector element to vector or scalar
1535+
#[inline]
1536+
#[target_feature(enable = "neon")]
1537+
#[cfg_attr(test, assert_instr(dup))]
1538+
pub unsafe fn vdupq_n_f64(value: f64) -> float64x2_t {
1539+
float64x2_t(value, value)
1540+
}
1541+
1542+
/// Duplicate vector element to vector or scalar
1543+
#[inline]
1544+
#[target_feature(enable = "neon")]
1545+
#[cfg_attr(test, assert_instr(fmov))]
1546+
pub unsafe fn vmov_n_p64(value: p64) -> poly64x1_t {
1547+
vdup_n_p64(value)
1548+
}
1549+
1550+
/// Duplicate vector element to vector or scalar
1551+
#[inline]
1552+
#[target_feature(enable = "neon")]
1553+
#[cfg_attr(test, assert_instr(ldr))]
1554+
pub unsafe fn vmov_n_f64(value: f64) -> float64x1_t {
1555+
vdup_n_f64(value)
1556+
}
1557+
1558+
/// Duplicate vector element to vector or scalar
1559+
#[inline]
1560+
#[target_feature(enable = "neon")]
1561+
#[cfg_attr(test, assert_instr(dup))]
1562+
pub unsafe fn vmovq_n_p64(value: p64) -> poly64x2_t {
1563+
vdupq_n_p64(value)
1564+
}
1565+
1566+
/// Duplicate vector element to vector or scalar
1567+
#[inline]
1568+
#[target_feature(enable = "neon")]
1569+
#[cfg_attr(test, assert_instr(dup))]
1570+
pub unsafe fn vmovq_n_f64(value: f64) -> float64x2_t {
1571+
vdupq_n_f64(value)
1572+
}
1573+
15101574
/// Duplicate vector element to vector or scalar
15111575
#[inline]
15121576
#[target_feature(enable = "neon")]
@@ -3443,6 +3507,70 @@ mod tests {
34433507
test_vcombine!(test_vcombine_p64 => vcombine_p64([3_u64], [13_u64]));
34443508
test_vcombine!(test_vcombine_f64 => vcombine_f64([-3_f64], [13_f64]));
34453509

3510+
#[simd_test(enable = "neon")]
3511+
unsafe fn test_vdup_n_f64() {
3512+
let a: f64 = 3.3;
3513+
let e = f64x1::new(3.3);
3514+
let r: f64x1 = transmute(vdup_n_f64(transmute(a)));
3515+
assert_eq!(r, e);
3516+
}
3517+
3518+
#[simd_test(enable = "neon")]
3519+
unsafe fn test_vdup_n_p64() {
3520+
let a: u64 = 3;
3521+
let e = u64x1::new(3);
3522+
let r: u64x1 = transmute(vdup_n_p64(transmute(a)));
3523+
assert_eq!(r, e);
3524+
}
3525+
3526+
#[simd_test(enable = "neon")]
3527+
unsafe fn test_vdupq_n_f64() {
3528+
let a: f64 = 3.3;
3529+
let e = f64x2::new(3.3, 3.3);
3530+
let r: f64x2 = transmute(vdupq_n_f64(transmute(a)));
3531+
assert_eq!(r, e);
3532+
}
3533+
3534+
#[simd_test(enable = "neon")]
3535+
unsafe fn test_vdupq_n_p64() {
3536+
let a: u64 = 3;
3537+
let e = u64x2::new(3, 3);
3538+
let r: u64x2 = transmute(vdupq_n_p64(transmute(a)));
3539+
assert_eq!(r, e);
3540+
}
3541+
3542+
#[simd_test(enable = "neon")]
3543+
unsafe fn test_vmov_n_p64() {
3544+
let a: u64 = 3;
3545+
let e = u64x1::new(3);
3546+
let r: u64x1 = transmute(vmov_n_p64(transmute(a)));
3547+
assert_eq!(r, e);
3548+
}
3549+
3550+
#[simd_test(enable = "neon")]
3551+
unsafe fn test_vmov_n_f64() {
3552+
let a: f64 = 3.3;
3553+
let e = f64x1::new(3.3);
3554+
let r: f64x1 = transmute(vmov_n_f64(transmute(a)));
3555+
assert_eq!(r, e);
3556+
}
3557+
3558+
#[simd_test(enable = "neon")]
3559+
unsafe fn test_vmovq_n_p64() {
3560+
let a: u64 = 3;
3561+
let e = u64x2::new(3, 3);
3562+
let r: u64x2 = transmute(vmovq_n_p64(transmute(a)));
3563+
assert_eq!(r, e);
3564+
}
3565+
3566+
#[simd_test(enable = "neon")]
3567+
unsafe fn test_vmovq_n_f64() {
3568+
let a: f64 = 3.3;
3569+
let e = f64x2::new(3.3, 3.3);
3570+
let r: f64x2 = transmute(vmovq_n_f64(transmute(a)));
3571+
assert_eq!(r, e);
3572+
}
3573+
34463574
#[simd_test(enable = "neon")]
34473575
unsafe fn test_vget_high_f64() {
34483576
let a = f64x2::new(1.0, 2.0);

0 commit comments

Comments
 (0)