Skip to content

Commit 66c1b0f

Browse files
committed
aarch64: implement vabs using instrinsics::simd
1 parent dfa880a commit 66c1b0f

File tree

2 files changed

+43
-27
lines changed

2 files changed

+43
-27
lines changed

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

Lines changed: 15 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -298,46 +298,40 @@ pub fn vabsq_f64(a: float64x2_t) -> float64x2_t {
298298
#[stable(feature = "neon_intrinsics", since = "1.59.0")]
299299
#[cfg_attr(test, assert_instr(abs))]
300300
pub fn vabs_s64(a: int64x1_t) -> int64x1_t {
301-
unsafe extern "unadjusted" {
302-
#[cfg_attr(
303-
any(target_arch = "aarch64", target_arch = "arm64ec"),
304-
link_name = "llvm.aarch64.neon.abs.v1i64"
305-
)]
306-
fn _vabs_s64(a: int64x1_t) -> int64x1_t;
301+
unsafe {
302+
let neg: int64x1_t = simd_neg(a);
303+
let mask: int64x1_t = simd_ge(a, neg);
304+
simd_select(mask, a, neg)
307305
}
308-
unsafe { _vabs_s64(a) }
309306
}
310307
#[doc = "Absolute Value (wrapping)."]
311-
#[doc = "[Arm's documentation](https://developer.arm.com/architectures/instruction-sets/intrinsics/vabsd_s64)"]
308+
#[doc = "[Arm's documentation](https://developer.arm.com/architectures/instruction-sets/intrinsics/vabsq_s64)"]
312309
#[inline]
313310
#[target_feature(enable = "neon")]
314311
#[stable(feature = "neon_intrinsics", since = "1.59.0")]
315312
#[cfg_attr(test, assert_instr(abs))]
316-
pub fn vabsd_s64(a: i64) -> i64 {
317-
unsafe extern "unadjusted" {
318-
#[cfg_attr(
319-
any(target_arch = "aarch64", target_arch = "arm64ec"),
320-
link_name = "llvm.aarch64.neon.abs.i64"
321-
)]
322-
fn _vabsd_s64(a: i64) -> i64;
313+
pub fn vabsq_s64(a: int64x2_t) -> int64x2_t {
314+
unsafe {
315+
let neg: int64x2_t = simd_neg(a);
316+
let mask: int64x2_t = simd_ge(a, neg);
317+
simd_select(mask, a, neg)
323318
}
324-
unsafe { _vabsd_s64(a) }
325319
}
326320
#[doc = "Absolute Value (wrapping)."]
327-
#[doc = "[Arm's documentation](https://developer.arm.com/architectures/instruction-sets/intrinsics/vabsq_s64)"]
321+
#[doc = "[Arm's documentation](https://developer.arm.com/architectures/instruction-sets/intrinsics/vabsd_s64)"]
328322
#[inline]
329323
#[target_feature(enable = "neon")]
330324
#[stable(feature = "neon_intrinsics", since = "1.59.0")]
331325
#[cfg_attr(test, assert_instr(abs))]
332-
pub fn vabsq_s64(a: int64x2_t) -> int64x2_t {
326+
pub fn vabsd_s64(a: i64) -> i64 {
333327
unsafe extern "unadjusted" {
334328
#[cfg_attr(
335329
any(target_arch = "aarch64", target_arch = "arm64ec"),
336-
link_name = "llvm.aarch64.neon.abs.v2i64"
330+
link_name = "llvm.aarch64.neon.abs.i64"
337331
)]
338-
fn _vabsq_s64(a: int64x2_t) -> int64x2_t;
332+
fn _vabsd_s64(a: i64) -> i64;
339333
}
340-
unsafe { _vabsq_s64(a) }
334+
unsafe { _vabsd_s64(a) }
341335
}
342336
#[doc = "Add"]
343337
#[doc = "[Arm's documentation](https://developer.arm.com/architectures/instruction-sets/intrinsics/vaddd_s64)"]

crates/stdarch-gen-arm/spec/neon/aarch64.spec.yml

Lines changed: 28 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13023,6 +13023,25 @@ intrinsics:
1302313023
- link: "llvm.aarch64.crc32cx"
1302413024
arch: aarch64,arm64ec
1302513025

13026+
- name: "vabsd_s64"
13027+
doc: "Absolute Value (wrapping)."
13028+
arguments: ["a: {type[1]}"]
13029+
return_type: "{type[1]}"
13030+
attr:
13031+
- *neon-stable
13032+
assert_instr: [abs]
13033+
safety: safe
13034+
types:
13035+
- [i64, i64]
13036+
compose:
13037+
# FIXME(llvm): this should be `i64::wrapping_abs` but it optimizes differently.
13038+
# See https://github.com/llvm/llvm-project/issues/148388.
13039+
- LLVMLink:
13040+
name: "vabsd_s64"
13041+
links:
13042+
- link: "llvm.aarch64.neon.abs.i64"
13043+
arch: aarch64,arm64ec
13044+
1302613045
- name: "{type[0]}"
1302713046
doc: "Absolute Value (wrapping)."
1302813047
arguments: ["a: {type[1]}"]
@@ -13032,15 +13051,18 @@ intrinsics:
1303213051
assert_instr: [abs]
1303313052
safety: safe
1303413053
types:
13035-
- ['vabsd_s64', i64, i64]
1303613054
- ['vabs_s64', int64x1_t, v1i64]
1303713055
- ['vabsq_s64', int64x2_t, v2i64]
1303813056
compose:
13039-
- LLVMLink:
13040-
name: "{type[0]}"
13041-
links:
13042-
- link: "llvm.aarch64.neon.abs.{type[2]}"
13043-
arch: aarch64,arm64ec
13057+
- Let:
13058+
- neg
13059+
- "{type[1]}"
13060+
- FnCall: [simd_neg, [a]]
13061+
- Let:
13062+
- mask
13063+
- "{type[1]}"
13064+
- FnCall: [simd_ge, [a, neg]]
13065+
- FnCall: [simd_select, [mask, a, neg]]
1304413066

1304513067
- name: "vuqadd{neon_type[0].no}"
1304613068
doc: "Signed saturating Accumulate of Unsigned value."

0 commit comments

Comments
 (0)