Decouple TargetFeature strings.
"arm" and "aarch64" support different sets of `target_feature` and `simd_test` arguments, and for "arm", the set of features that can be dynamically detected is different again. Restructure the generator code to allow this to be expressed accurately (in future patches). This implementation preserves the way that target features are specified for shared intrinsics, because this has an impact on the generated documentation. In particular, rustdoc cannot look inside `cfg_attr(target_arch = ...)` tests, so we use unconditional `target_feature` attributes where possible.
This commit is contained in:
parent
284e7768c9
commit
f966d451b5
2 changed files with 300 additions and 209 deletions
|
|
@ -2793,7 +2793,7 @@ pub unsafe fn vcreate_p16(a: u64) -> poly16x4_t {
|
|||
/// [Arm's documentation](https://developer.arm.com/architectures/instruction-sets/intrinsics/vcreate_p64)
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon,aes")]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "aes,v8"))]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "v8"))]
|
||||
#[cfg_attr(all(test, target_arch = "arm"), assert_instr(nop))]
|
||||
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(nop))]
|
||||
#[cfg_attr(not(target_arch = "arm"), stable(feature = "neon_intrinsics", since = "1.59.0"))]
|
||||
|
|
@ -8341,7 +8341,7 @@ pub unsafe fn vld1q_p16_x4(a: *const p16) -> poly16x8x4_t {
|
|||
/// [Arm's documentation](https://developer.arm.com/architectures/instruction-sets/intrinsics/vld1_p64_x2)
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon,aes")]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "aes,v8"))]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "v8"))]
|
||||
#[cfg_attr(all(test, target_arch = "arm"), assert_instr(vld1))]
|
||||
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(ld1))]
|
||||
#[cfg_attr(not(target_arch = "arm"), stable(feature = "neon_intrinsics", since = "1.59.0"))]
|
||||
|
|
@ -8354,7 +8354,7 @@ pub unsafe fn vld1_p64_x2(a: *const p64) -> poly64x1x2_t {
|
|||
/// [Arm's documentation](https://developer.arm.com/architectures/instruction-sets/intrinsics/vld1_p64_x3)
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon,aes")]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "aes,v8"))]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "v8"))]
|
||||
#[cfg_attr(all(test, target_arch = "arm"), assert_instr(nop))]
|
||||
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(ld1))]
|
||||
#[cfg_attr(not(target_arch = "arm"), stable(feature = "neon_intrinsics", since = "1.59.0"))]
|
||||
|
|
@ -8367,7 +8367,7 @@ pub unsafe fn vld1_p64_x3(a: *const p64) -> poly64x1x3_t {
|
|||
/// [Arm's documentation](https://developer.arm.com/architectures/instruction-sets/intrinsics/vld1_p64_x4)
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon,aes")]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "aes,v8"))]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "v8"))]
|
||||
#[cfg_attr(all(test, target_arch = "arm"), assert_instr(nop))]
|
||||
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(ld1))]
|
||||
#[cfg_attr(not(target_arch = "arm"), stable(feature = "neon_intrinsics", since = "1.59.0"))]
|
||||
|
|
@ -8380,7 +8380,7 @@ pub unsafe fn vld1_p64_x4(a: *const p64) -> poly64x1x4_t {
|
|||
/// [Arm's documentation](https://developer.arm.com/architectures/instruction-sets/intrinsics/vld1q_p64_x2)
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon,aes")]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "aes,v8"))]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "v8"))]
|
||||
#[cfg_attr(all(test, target_arch = "arm"), assert_instr(nop))]
|
||||
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(ld1))]
|
||||
#[cfg_attr(not(target_arch = "arm"), stable(feature = "neon_intrinsics", since = "1.59.0"))]
|
||||
|
|
@ -8393,7 +8393,7 @@ pub unsafe fn vld1q_p64_x2(a: *const p64) -> poly64x2x2_t {
|
|||
/// [Arm's documentation](https://developer.arm.com/architectures/instruction-sets/intrinsics/vld1q_p64_x3)
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon,aes")]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "aes,v8"))]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "v8"))]
|
||||
#[cfg_attr(all(test, target_arch = "arm"), assert_instr(nop))]
|
||||
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(ld1))]
|
||||
#[cfg_attr(not(target_arch = "arm"), stable(feature = "neon_intrinsics", since = "1.59.0"))]
|
||||
|
|
@ -8406,7 +8406,7 @@ pub unsafe fn vld1q_p64_x3(a: *const p64) -> poly64x2x3_t {
|
|||
/// [Arm's documentation](https://developer.arm.com/architectures/instruction-sets/intrinsics/vld1q_p64_x4)
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon,aes")]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "aes,v8"))]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "v8"))]
|
||||
#[cfg_attr(all(test, target_arch = "arm"), assert_instr(nop))]
|
||||
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(ld1))]
|
||||
#[cfg_attr(not(target_arch = "arm"), stable(feature = "neon_intrinsics", since = "1.59.0"))]
|
||||
|
|
@ -8907,7 +8907,7 @@ pub unsafe fn vld2_u64(a: *const u64) -> uint64x1x2_t {
|
|||
/// [Arm's documentation](https://developer.arm.com/architectures/instruction-sets/intrinsics/vld2_p64)
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon,aes")]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "aes,v8"))]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "v8"))]
|
||||
#[cfg_attr(all(test, target_arch = "arm"), assert_instr(nop))]
|
||||
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(nop))]
|
||||
#[cfg_attr(not(target_arch = "arm"), stable(feature = "neon_intrinsics", since = "1.59.0"))]
|
||||
|
|
@ -9360,7 +9360,7 @@ pub unsafe fn vld2_dup_u64(a: *const u64) -> uint64x1x2_t {
|
|||
/// [Arm's documentation](https://developer.arm.com/architectures/instruction-sets/intrinsics/vld2_dup_p64)
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon,aes")]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "aes,v8"))]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "v8"))]
|
||||
#[cfg_attr(all(test, target_arch = "arm"), assert_instr(nop))]
|
||||
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(ld2r))]
|
||||
#[cfg_attr(not(target_arch = "arm"), stable(feature = "neon_intrinsics", since = "1.59.0"))]
|
||||
|
|
@ -10192,7 +10192,7 @@ pub unsafe fn vld3_u64(a: *const u64) -> uint64x1x3_t {
|
|||
/// [Arm's documentation](https://developer.arm.com/architectures/instruction-sets/intrinsics/vld3_p64)
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon,aes")]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "aes,v8"))]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "v8"))]
|
||||
#[cfg_attr(all(test, target_arch = "arm"), assert_instr(nop))]
|
||||
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(nop))]
|
||||
#[cfg_attr(not(target_arch = "arm"), stable(feature = "neon_intrinsics", since = "1.59.0"))]
|
||||
|
|
@ -10645,7 +10645,7 @@ pub unsafe fn vld3_dup_u64(a: *const u64) -> uint64x1x3_t {
|
|||
/// [Arm's documentation](https://developer.arm.com/architectures/instruction-sets/intrinsics/vld3_dup_p64)
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon,aes")]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "aes,v8"))]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "v8"))]
|
||||
#[cfg_attr(all(test, target_arch = "arm"), assert_instr(nop))]
|
||||
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(ld3r))]
|
||||
#[cfg_attr(not(target_arch = "arm"), stable(feature = "neon_intrinsics", since = "1.59.0"))]
|
||||
|
|
@ -11477,7 +11477,7 @@ pub unsafe fn vld4_u64(a: *const u64) -> uint64x1x4_t {
|
|||
/// [Arm's documentation](https://developer.arm.com/architectures/instruction-sets/intrinsics/vld4_p64)
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon,aes")]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "aes,v8"))]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "v8"))]
|
||||
#[cfg_attr(all(test, target_arch = "arm"), assert_instr(nop))]
|
||||
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(nop))]
|
||||
#[cfg_attr(not(target_arch = "arm"), stable(feature = "neon_intrinsics", since = "1.59.0"))]
|
||||
|
|
@ -11930,7 +11930,7 @@ pub unsafe fn vld4_dup_u64(a: *const u64) -> uint64x1x4_t {
|
|||
/// [Arm's documentation](https://developer.arm.com/architectures/instruction-sets/intrinsics/vld4_dup_p64)
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon,aes")]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "aes,v8"))]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "v8"))]
|
||||
#[cfg_attr(all(test, target_arch = "arm"), assert_instr(nop))]
|
||||
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(ld4r))]
|
||||
#[cfg_attr(not(target_arch = "arm"), stable(feature = "neon_intrinsics", since = "1.59.0"))]
|
||||
|
|
@ -12688,7 +12688,7 @@ pub unsafe fn vst1q_lane_p16<const LANE: i32>(a: *mut p16, b: poly16x8_t) {
|
|||
/// [Arm's documentation](https://developer.arm.com/architectures/instruction-sets/intrinsics/vst1_lane_p64)
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon,aes")]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "aes,v8"))]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "v8"))]
|
||||
#[cfg_attr(all(test, target_arch = "arm"), assert_instr(nop, LANE = 0))]
|
||||
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(nop, LANE = 0))]
|
||||
#[rustc_legacy_const_generics(2)]
|
||||
|
|
@ -12703,7 +12703,7 @@ pub unsafe fn vst1_lane_p64<const LANE: i32>(a: *mut p64, b: poly64x1_t) {
|
|||
/// [Arm's documentation](https://developer.arm.com/architectures/instruction-sets/intrinsics/vst1q_lane_p64)
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon,aes")]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "aes,v8"))]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "v8"))]
|
||||
#[cfg_attr(all(test, target_arch = "arm"), assert_instr(nop, LANE = 0))]
|
||||
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(nop, LANE = 0))]
|
||||
#[rustc_legacy_const_generics(2)]
|
||||
|
|
@ -14008,7 +14008,7 @@ pub unsafe fn vst1q_p16_x4(a: *mut p16, b: poly16x8x4_t) {
|
|||
/// [Arm's documentation](https://developer.arm.com/architectures/instruction-sets/intrinsics/vst1_p64_x2)
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon,aes")]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "aes,v8"))]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "v8"))]
|
||||
#[cfg_attr(all(test, target_arch = "arm"), assert_instr(vst1))]
|
||||
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(st1))]
|
||||
#[cfg_attr(not(target_arch = "arm"), stable(feature = "neon_intrinsics", since = "1.59.0"))]
|
||||
|
|
@ -14021,7 +14021,7 @@ pub unsafe fn vst1_p64_x2(a: *mut p64, b: poly64x1x2_t) {
|
|||
/// [Arm's documentation](https://developer.arm.com/architectures/instruction-sets/intrinsics/vst1_p64_x3)
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon,aes")]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "aes,v8"))]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "v8"))]
|
||||
#[cfg_attr(all(test, target_arch = "arm"), assert_instr(nop))]
|
||||
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(st1))]
|
||||
#[cfg_attr(not(target_arch = "arm"), stable(feature = "neon_intrinsics", since = "1.59.0"))]
|
||||
|
|
@ -14034,7 +14034,7 @@ pub unsafe fn vst1_p64_x3(a: *mut p64, b: poly64x1x3_t) {
|
|||
/// [Arm's documentation](https://developer.arm.com/architectures/instruction-sets/intrinsics/vst1_p64_x4)
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon,aes")]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "aes,v8"))]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "v8"))]
|
||||
#[cfg_attr(all(test, target_arch = "arm"), assert_instr(nop))]
|
||||
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(st1))]
|
||||
#[cfg_attr(not(target_arch = "arm"), stable(feature = "neon_intrinsics", since = "1.59.0"))]
|
||||
|
|
@ -14047,7 +14047,7 @@ pub unsafe fn vst1_p64_x4(a: *mut p64, b: poly64x1x4_t) {
|
|||
/// [Arm's documentation](https://developer.arm.com/architectures/instruction-sets/intrinsics/vst1q_p64_x2)
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon,aes")]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "aes,v8"))]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "v8"))]
|
||||
#[cfg_attr(all(test, target_arch = "arm"), assert_instr(nop))]
|
||||
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(st1))]
|
||||
#[cfg_attr(not(target_arch = "arm"), stable(feature = "neon_intrinsics", since = "1.59.0"))]
|
||||
|
|
@ -14060,7 +14060,7 @@ pub unsafe fn vst1q_p64_x2(a: *mut p64, b: poly64x2x2_t) {
|
|||
/// [Arm's documentation](https://developer.arm.com/architectures/instruction-sets/intrinsics/vst1q_p64_x3)
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon,aes")]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "aes,v8"))]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "v8"))]
|
||||
#[cfg_attr(all(test, target_arch = "arm"), assert_instr(nop))]
|
||||
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(st1))]
|
||||
#[cfg_attr(not(target_arch = "arm"), stable(feature = "neon_intrinsics", since = "1.59.0"))]
|
||||
|
|
@ -14073,7 +14073,7 @@ pub unsafe fn vst1q_p64_x3(a: *mut p64, b: poly64x2x3_t) {
|
|||
/// [Arm's documentation](https://developer.arm.com/architectures/instruction-sets/intrinsics/vst1q_p64_x4)
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon,aes")]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "aes,v8"))]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "v8"))]
|
||||
#[cfg_attr(all(test, target_arch = "arm"), assert_instr(nop))]
|
||||
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(st1))]
|
||||
#[cfg_attr(not(target_arch = "arm"), stable(feature = "neon_intrinsics", since = "1.59.0"))]
|
||||
|
|
@ -14658,7 +14658,7 @@ pub unsafe fn vst2_u64(a: *mut u64, b: uint64x1x2_t) {
|
|||
/// [Arm's documentation](https://developer.arm.com/architectures/instruction-sets/intrinsics/vst2_p64)
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon,aes")]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "aes,v8"))]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "v8"))]
|
||||
#[cfg_attr(all(test, target_arch = "arm"), assert_instr(nop))]
|
||||
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(nop))]
|
||||
#[cfg_attr(not(target_arch = "arm"), stable(feature = "neon_intrinsics", since = "1.59.0"))]
|
||||
|
|
@ -15490,7 +15490,7 @@ pub unsafe fn vst3_u64(a: *mut u64, b: uint64x1x3_t) {
|
|||
/// [Arm's documentation](https://developer.arm.com/architectures/instruction-sets/intrinsics/vst3_p64)
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon,aes")]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "aes,v8"))]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "v8"))]
|
||||
#[cfg_attr(all(test, target_arch = "arm"), assert_instr(nop))]
|
||||
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(nop))]
|
||||
#[cfg_attr(not(target_arch = "arm"), stable(feature = "neon_intrinsics", since = "1.59.0"))]
|
||||
|
|
@ -16322,7 +16322,7 @@ pub unsafe fn vst4_u64(a: *mut u64, b: uint64x1x4_t) {
|
|||
/// [Arm's documentation](https://developer.arm.com/architectures/instruction-sets/intrinsics/vst4_p64)
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon,aes")]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "aes,v8"))]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "v8"))]
|
||||
#[cfg_attr(all(test, target_arch = "arm"), assert_instr(nop))]
|
||||
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(nop))]
|
||||
#[cfg_attr(not(target_arch = "arm"), stable(feature = "neon_intrinsics", since = "1.59.0"))]
|
||||
|
|
@ -23196,7 +23196,7 @@ pub unsafe fn vreinterpretq_p16_u32(a: uint32x4_t) -> poly16x8_t {
|
|||
/// [Arm's documentation](https://developer.arm.com/architectures/instruction-sets/intrinsics/vreinterpret_s32_p64)
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon,aes")]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "aes,v8"))]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "v8"))]
|
||||
#[cfg_attr(all(test, target_arch = "arm"), assert_instr(nop))]
|
||||
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(nop))]
|
||||
#[cfg_attr(not(target_arch = "arm"), stable(feature = "neon_intrinsics", since = "1.59.0"))]
|
||||
|
|
@ -23209,7 +23209,7 @@ pub unsafe fn vreinterpret_s32_p64(a: poly64x1_t) -> int32x2_t {
|
|||
/// [Arm's documentation](https://developer.arm.com/architectures/instruction-sets/intrinsics/vreinterpret_u32_p64)
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon,aes")]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "aes,v8"))]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "v8"))]
|
||||
#[cfg_attr(all(test, target_arch = "arm"), assert_instr(nop))]
|
||||
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(nop))]
|
||||
#[cfg_attr(not(target_arch = "arm"), stable(feature = "neon_intrinsics", since = "1.59.0"))]
|
||||
|
|
@ -23222,7 +23222,7 @@ pub unsafe fn vreinterpret_u32_p64(a: poly64x1_t) -> uint32x2_t {
|
|||
/// [Arm's documentation](https://developer.arm.com/architectures/instruction-sets/intrinsics/vreinterpretq_s32_p64)
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon,aes")]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "aes,v8"))]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "v8"))]
|
||||
#[cfg_attr(all(test, target_arch = "arm"), assert_instr(nop))]
|
||||
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(nop))]
|
||||
#[cfg_attr(not(target_arch = "arm"), stable(feature = "neon_intrinsics", since = "1.59.0"))]
|
||||
|
|
@ -23235,7 +23235,7 @@ pub unsafe fn vreinterpretq_s32_p64(a: poly64x2_t) -> int32x4_t {
|
|||
/// [Arm's documentation](https://developer.arm.com/architectures/instruction-sets/intrinsics/vreinterpretq_u32_p64)
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon,aes")]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "aes,v8"))]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "v8"))]
|
||||
#[cfg_attr(all(test, target_arch = "arm"), assert_instr(nop))]
|
||||
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(nop))]
|
||||
#[cfg_attr(not(target_arch = "arm"), stable(feature = "neon_intrinsics", since = "1.59.0"))]
|
||||
|
|
@ -23248,7 +23248,7 @@ pub unsafe fn vreinterpretq_u32_p64(a: poly64x2_t) -> uint32x4_t {
|
|||
/// [Arm's documentation](https://developer.arm.com/architectures/instruction-sets/intrinsics/vreinterpretq_s64_p128)
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon,aes")]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "aes,v8"))]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "v8"))]
|
||||
#[cfg_attr(all(test, target_arch = "arm"), assert_instr(nop))]
|
||||
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(nop))]
|
||||
#[cfg_attr(not(target_arch = "arm"), stable(feature = "neon_intrinsics", since = "1.59.0"))]
|
||||
|
|
@ -23261,7 +23261,7 @@ pub unsafe fn vreinterpretq_s64_p128(a: p128) -> int64x2_t {
|
|||
/// [Arm's documentation](https://developer.arm.com/architectures/instruction-sets/intrinsics/vreinterpretq_u64_p128)
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon,aes")]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "aes,v8"))]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "v8"))]
|
||||
#[cfg_attr(all(test, target_arch = "arm"), assert_instr(nop))]
|
||||
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(nop))]
|
||||
#[cfg_attr(not(target_arch = "arm"), stable(feature = "neon_intrinsics", since = "1.59.0"))]
|
||||
|
|
@ -23274,7 +23274,7 @@ pub unsafe fn vreinterpretq_u64_p128(a: p128) -> uint64x2_t {
|
|||
/// [Arm's documentation](https://developer.arm.com/architectures/instruction-sets/intrinsics/vreinterpretq_p64_p128)
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon,aes")]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "aes,v8"))]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "v8"))]
|
||||
#[cfg_attr(all(test, target_arch = "arm"), assert_instr(nop))]
|
||||
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(nop))]
|
||||
#[cfg_attr(not(target_arch = "arm"), stable(feature = "neon_intrinsics", since = "1.59.0"))]
|
||||
|
|
@ -23781,7 +23781,7 @@ pub unsafe fn vreinterpretq_p16_u8(a: uint8x16_t) -> poly16x8_t {
|
|||
/// [Arm's documentation](https://developer.arm.com/architectures/instruction-sets/intrinsics/vreinterpret_p64_s32)
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon,aes")]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "aes,v8"))]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "v8"))]
|
||||
#[cfg_attr(all(test, target_arch = "arm"), assert_instr(nop))]
|
||||
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(nop))]
|
||||
#[cfg_attr(not(target_arch = "arm"), stable(feature = "neon_intrinsics", since = "1.59.0"))]
|
||||
|
|
@ -23794,7 +23794,7 @@ pub unsafe fn vreinterpret_p64_s32(a: int32x2_t) -> poly64x1_t {
|
|||
/// [Arm's documentation](https://developer.arm.com/architectures/instruction-sets/intrinsics/vreinterpret_p64_u32)
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon,aes")]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "aes,v8"))]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "v8"))]
|
||||
#[cfg_attr(all(test, target_arch = "arm"), assert_instr(nop))]
|
||||
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(nop))]
|
||||
#[cfg_attr(not(target_arch = "arm"), stable(feature = "neon_intrinsics", since = "1.59.0"))]
|
||||
|
|
@ -23807,7 +23807,7 @@ pub unsafe fn vreinterpret_p64_u32(a: uint32x2_t) -> poly64x1_t {
|
|||
/// [Arm's documentation](https://developer.arm.com/architectures/instruction-sets/intrinsics/vreinterpretq_p64_s32)
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon,aes")]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "aes,v8"))]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "v8"))]
|
||||
#[cfg_attr(all(test, target_arch = "arm"), assert_instr(nop))]
|
||||
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(nop))]
|
||||
#[cfg_attr(not(target_arch = "arm"), stable(feature = "neon_intrinsics", since = "1.59.0"))]
|
||||
|
|
@ -23820,7 +23820,7 @@ pub unsafe fn vreinterpretq_p64_s32(a: int32x4_t) -> poly64x2_t {
|
|||
/// [Arm's documentation](https://developer.arm.com/architectures/instruction-sets/intrinsics/vreinterpretq_p64_u32)
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon,aes")]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "aes,v8"))]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "v8"))]
|
||||
#[cfg_attr(all(test, target_arch = "arm"), assert_instr(nop))]
|
||||
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(nop))]
|
||||
#[cfg_attr(not(target_arch = "arm"), stable(feature = "neon_intrinsics", since = "1.59.0"))]
|
||||
|
|
@ -23833,7 +23833,7 @@ pub unsafe fn vreinterpretq_p64_u32(a: uint32x4_t) -> poly64x2_t {
|
|||
/// [Arm's documentation](https://developer.arm.com/architectures/instruction-sets/intrinsics/vreinterpretq_p128_s64)
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon,aes")]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "aes,v8"))]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "v8"))]
|
||||
#[cfg_attr(all(test, target_arch = "arm"), assert_instr(nop))]
|
||||
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(nop))]
|
||||
#[cfg_attr(not(target_arch = "arm"), stable(feature = "neon_intrinsics", since = "1.59.0"))]
|
||||
|
|
@ -23846,7 +23846,7 @@ pub unsafe fn vreinterpretq_p128_s64(a: int64x2_t) -> p128 {
|
|||
/// [Arm's documentation](https://developer.arm.com/architectures/instruction-sets/intrinsics/vreinterpretq_p128_u64)
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon,aes")]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "aes,v8"))]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "v8"))]
|
||||
#[cfg_attr(all(test, target_arch = "arm"), assert_instr(nop))]
|
||||
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(nop))]
|
||||
#[cfg_attr(not(target_arch = "arm"), stable(feature = "neon_intrinsics", since = "1.59.0"))]
|
||||
|
|
@ -23859,7 +23859,7 @@ pub unsafe fn vreinterpretq_p128_u64(a: uint64x2_t) -> p128 {
|
|||
/// [Arm's documentation](https://developer.arm.com/architectures/instruction-sets/intrinsics/vreinterpretq_p128_p64)
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon,aes")]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "aes,v8"))]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "v8"))]
|
||||
#[cfg_attr(all(test, target_arch = "arm"), assert_instr(nop))]
|
||||
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(nop))]
|
||||
#[cfg_attr(not(target_arch = "arm"), stable(feature = "neon_intrinsics", since = "1.59.0"))]
|
||||
|
|
@ -24184,7 +24184,7 @@ pub unsafe fn vreinterpretq_p16_u64(a: uint64x2_t) -> poly16x8_t {
|
|||
/// [Arm's documentation](https://developer.arm.com/architectures/instruction-sets/intrinsics/vreinterpret_s16_p64)
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon,aes")]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "aes,v8"))]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "v8"))]
|
||||
#[cfg_attr(all(test, target_arch = "arm"), assert_instr(nop))]
|
||||
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(nop))]
|
||||
#[cfg_attr(not(target_arch = "arm"), stable(feature = "neon_intrinsics", since = "1.59.0"))]
|
||||
|
|
@ -24197,7 +24197,7 @@ pub unsafe fn vreinterpret_s16_p64(a: poly64x1_t) -> int16x4_t {
|
|||
/// [Arm's documentation](https://developer.arm.com/architectures/instruction-sets/intrinsics/vreinterpret_u16_p64)
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon,aes")]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "aes,v8"))]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "v8"))]
|
||||
#[cfg_attr(all(test, target_arch = "arm"), assert_instr(nop))]
|
||||
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(nop))]
|
||||
#[cfg_attr(not(target_arch = "arm"), stable(feature = "neon_intrinsics", since = "1.59.0"))]
|
||||
|
|
@ -24210,7 +24210,7 @@ pub unsafe fn vreinterpret_u16_p64(a: poly64x1_t) -> uint16x4_t {
|
|||
/// [Arm's documentation](https://developer.arm.com/architectures/instruction-sets/intrinsics/vreinterpret_p16_p64)
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon,aes")]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "aes,v8"))]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "v8"))]
|
||||
#[cfg_attr(all(test, target_arch = "arm"), assert_instr(nop))]
|
||||
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(nop))]
|
||||
#[cfg_attr(not(target_arch = "arm"), stable(feature = "neon_intrinsics", since = "1.59.0"))]
|
||||
|
|
@ -24223,7 +24223,7 @@ pub unsafe fn vreinterpret_p16_p64(a: poly64x1_t) -> poly16x4_t {
|
|||
/// [Arm's documentation](https://developer.arm.com/architectures/instruction-sets/intrinsics/vreinterpretq_s16_p64)
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon,aes")]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "aes,v8"))]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "v8"))]
|
||||
#[cfg_attr(all(test, target_arch = "arm"), assert_instr(nop))]
|
||||
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(nop))]
|
||||
#[cfg_attr(not(target_arch = "arm"), stable(feature = "neon_intrinsics", since = "1.59.0"))]
|
||||
|
|
@ -24236,7 +24236,7 @@ pub unsafe fn vreinterpretq_s16_p64(a: poly64x2_t) -> int16x8_t {
|
|||
/// [Arm's documentation](https://developer.arm.com/architectures/instruction-sets/intrinsics/vreinterpretq_u16_p64)
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon,aes")]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "aes,v8"))]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "v8"))]
|
||||
#[cfg_attr(all(test, target_arch = "arm"), assert_instr(nop))]
|
||||
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(nop))]
|
||||
#[cfg_attr(not(target_arch = "arm"), stable(feature = "neon_intrinsics", since = "1.59.0"))]
|
||||
|
|
@ -24249,7 +24249,7 @@ pub unsafe fn vreinterpretq_u16_p64(a: poly64x2_t) -> uint16x8_t {
|
|||
/// [Arm's documentation](https://developer.arm.com/architectures/instruction-sets/intrinsics/vreinterpretq_p16_p64)
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon,aes")]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "aes,v8"))]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "v8"))]
|
||||
#[cfg_attr(all(test, target_arch = "arm"), assert_instr(nop))]
|
||||
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(nop))]
|
||||
#[cfg_attr(not(target_arch = "arm"), stable(feature = "neon_intrinsics", since = "1.59.0"))]
|
||||
|
|
@ -24262,7 +24262,7 @@ pub unsafe fn vreinterpretq_p16_p64(a: poly64x2_t) -> poly16x8_t {
|
|||
/// [Arm's documentation](https://developer.arm.com/architectures/instruction-sets/intrinsics/vreinterpretq_s32_p128)
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon,aes")]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "aes,v8"))]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "v8"))]
|
||||
#[cfg_attr(all(test, target_arch = "arm"), assert_instr(nop))]
|
||||
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(nop))]
|
||||
#[cfg_attr(not(target_arch = "arm"), stable(feature = "neon_intrinsics", since = "1.59.0"))]
|
||||
|
|
@ -24275,7 +24275,7 @@ pub unsafe fn vreinterpretq_s32_p128(a: p128) -> int32x4_t {
|
|||
/// [Arm's documentation](https://developer.arm.com/architectures/instruction-sets/intrinsics/vreinterpretq_u32_p128)
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon,aes")]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "aes,v8"))]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "v8"))]
|
||||
#[cfg_attr(all(test, target_arch = "arm"), assert_instr(nop))]
|
||||
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(nop))]
|
||||
#[cfg_attr(not(target_arch = "arm"), stable(feature = "neon_intrinsics", since = "1.59.0"))]
|
||||
|
|
@ -24600,7 +24600,7 @@ pub unsafe fn vreinterpretq_u64_u16(a: uint16x8_t) -> uint64x2_t {
|
|||
/// [Arm's documentation](https://developer.arm.com/architectures/instruction-sets/intrinsics/vreinterpret_p64_p16)
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon,aes")]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "aes,v8"))]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "v8"))]
|
||||
#[cfg_attr(all(test, target_arch = "arm"), assert_instr(nop))]
|
||||
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(nop))]
|
||||
#[cfg_attr(not(target_arch = "arm"), stable(feature = "neon_intrinsics", since = "1.59.0"))]
|
||||
|
|
@ -24613,7 +24613,7 @@ pub unsafe fn vreinterpret_p64_p16(a: poly16x4_t) -> poly64x1_t {
|
|||
/// [Arm's documentation](https://developer.arm.com/architectures/instruction-sets/intrinsics/vreinterpret_p64_s16)
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon,aes")]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "aes,v8"))]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "v8"))]
|
||||
#[cfg_attr(all(test, target_arch = "arm"), assert_instr(nop))]
|
||||
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(nop))]
|
||||
#[cfg_attr(not(target_arch = "arm"), stable(feature = "neon_intrinsics", since = "1.59.0"))]
|
||||
|
|
@ -24626,7 +24626,7 @@ pub unsafe fn vreinterpret_p64_s16(a: int16x4_t) -> poly64x1_t {
|
|||
/// [Arm's documentation](https://developer.arm.com/architectures/instruction-sets/intrinsics/vreinterpret_p64_u16)
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon,aes")]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "aes,v8"))]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "v8"))]
|
||||
#[cfg_attr(all(test, target_arch = "arm"), assert_instr(nop))]
|
||||
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(nop))]
|
||||
#[cfg_attr(not(target_arch = "arm"), stable(feature = "neon_intrinsics", since = "1.59.0"))]
|
||||
|
|
@ -24639,7 +24639,7 @@ pub unsafe fn vreinterpret_p64_u16(a: uint16x4_t) -> poly64x1_t {
|
|||
/// [Arm's documentation](https://developer.arm.com/architectures/instruction-sets/intrinsics/vreinterpretq_p64_p16)
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon,aes")]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "aes,v8"))]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "v8"))]
|
||||
#[cfg_attr(all(test, target_arch = "arm"), assert_instr(nop))]
|
||||
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(nop))]
|
||||
#[cfg_attr(not(target_arch = "arm"), stable(feature = "neon_intrinsics", since = "1.59.0"))]
|
||||
|
|
@ -24652,7 +24652,7 @@ pub unsafe fn vreinterpretq_p64_p16(a: poly16x8_t) -> poly64x2_t {
|
|||
/// [Arm's documentation](https://developer.arm.com/architectures/instruction-sets/intrinsics/vreinterpretq_p64_s16)
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon,aes")]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "aes,v8"))]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "v8"))]
|
||||
#[cfg_attr(all(test, target_arch = "arm"), assert_instr(nop))]
|
||||
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(nop))]
|
||||
#[cfg_attr(not(target_arch = "arm"), stable(feature = "neon_intrinsics", since = "1.59.0"))]
|
||||
|
|
@ -24665,7 +24665,7 @@ pub unsafe fn vreinterpretq_p64_s16(a: int16x8_t) -> poly64x2_t {
|
|||
/// [Arm's documentation](https://developer.arm.com/architectures/instruction-sets/intrinsics/vreinterpretq_p64_u16)
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon,aes")]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "aes,v8"))]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "v8"))]
|
||||
#[cfg_attr(all(test, target_arch = "arm"), assert_instr(nop))]
|
||||
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(nop))]
|
||||
#[cfg_attr(not(target_arch = "arm"), stable(feature = "neon_intrinsics", since = "1.59.0"))]
|
||||
|
|
@ -24678,7 +24678,7 @@ pub unsafe fn vreinterpretq_p64_u16(a: uint16x8_t) -> poly64x2_t {
|
|||
/// [Arm's documentation](https://developer.arm.com/architectures/instruction-sets/intrinsics/vreinterpretq_p128_s32)
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon,aes")]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "aes,v8"))]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "v8"))]
|
||||
#[cfg_attr(all(test, target_arch = "arm"), assert_instr(nop))]
|
||||
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(nop))]
|
||||
#[cfg_attr(not(target_arch = "arm"), stable(feature = "neon_intrinsics", since = "1.59.0"))]
|
||||
|
|
@ -24691,7 +24691,7 @@ pub unsafe fn vreinterpretq_p128_s32(a: int32x4_t) -> p128 {
|
|||
/// [Arm's documentation](https://developer.arm.com/architectures/instruction-sets/intrinsics/vreinterpretq_p128_u32)
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon,aes")]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "aes,v8"))]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "v8"))]
|
||||
#[cfg_attr(all(test, target_arch = "arm"), assert_instr(nop))]
|
||||
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(nop))]
|
||||
#[cfg_attr(not(target_arch = "arm"), stable(feature = "neon_intrinsics", since = "1.59.0"))]
|
||||
|
|
@ -24860,7 +24860,7 @@ pub unsafe fn vreinterpretq_p8_u64(a: uint64x2_t) -> poly8x16_t {
|
|||
/// [Arm's documentation](https://developer.arm.com/architectures/instruction-sets/intrinsics/vreinterpret_s8_p64)
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon,aes")]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "aes,v8"))]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "v8"))]
|
||||
#[cfg_attr(all(test, target_arch = "arm"), assert_instr(nop))]
|
||||
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(nop))]
|
||||
#[cfg_attr(not(target_arch = "arm"), stable(feature = "neon_intrinsics", since = "1.59.0"))]
|
||||
|
|
@ -24873,7 +24873,7 @@ pub unsafe fn vreinterpret_s8_p64(a: poly64x1_t) -> int8x8_t {
|
|||
/// [Arm's documentation](https://developer.arm.com/architectures/instruction-sets/intrinsics/vreinterpret_u8_p64)
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon,aes")]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "aes,v8"))]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "v8"))]
|
||||
#[cfg_attr(all(test, target_arch = "arm"), assert_instr(nop))]
|
||||
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(nop))]
|
||||
#[cfg_attr(not(target_arch = "arm"), stable(feature = "neon_intrinsics", since = "1.59.0"))]
|
||||
|
|
@ -24886,7 +24886,7 @@ pub unsafe fn vreinterpret_u8_p64(a: poly64x1_t) -> uint8x8_t {
|
|||
/// [Arm's documentation](https://developer.arm.com/architectures/instruction-sets/intrinsics/vreinterpret_p8_p64)
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon,aes")]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "aes,v8"))]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "v8"))]
|
||||
#[cfg_attr(all(test, target_arch = "arm"), assert_instr(nop))]
|
||||
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(nop))]
|
||||
#[cfg_attr(not(target_arch = "arm"), stable(feature = "neon_intrinsics", since = "1.59.0"))]
|
||||
|
|
@ -24899,7 +24899,7 @@ pub unsafe fn vreinterpret_p8_p64(a: poly64x1_t) -> poly8x8_t {
|
|||
/// [Arm's documentation](https://developer.arm.com/architectures/instruction-sets/intrinsics/vreinterpretq_s8_p64)
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon,aes")]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "aes,v8"))]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "v8"))]
|
||||
#[cfg_attr(all(test, target_arch = "arm"), assert_instr(nop))]
|
||||
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(nop))]
|
||||
#[cfg_attr(not(target_arch = "arm"), stable(feature = "neon_intrinsics", since = "1.59.0"))]
|
||||
|
|
@ -24912,7 +24912,7 @@ pub unsafe fn vreinterpretq_s8_p64(a: poly64x2_t) -> int8x16_t {
|
|||
/// [Arm's documentation](https://developer.arm.com/architectures/instruction-sets/intrinsics/vreinterpretq_u8_p64)
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon,aes")]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "aes,v8"))]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "v8"))]
|
||||
#[cfg_attr(all(test, target_arch = "arm"), assert_instr(nop))]
|
||||
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(nop))]
|
||||
#[cfg_attr(not(target_arch = "arm"), stable(feature = "neon_intrinsics", since = "1.59.0"))]
|
||||
|
|
@ -24925,7 +24925,7 @@ pub unsafe fn vreinterpretq_u8_p64(a: poly64x2_t) -> uint8x16_t {
|
|||
/// [Arm's documentation](https://developer.arm.com/architectures/instruction-sets/intrinsics/vreinterpretq_p8_p64)
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon,aes")]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "aes,v8"))]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "v8"))]
|
||||
#[cfg_attr(all(test, target_arch = "arm"), assert_instr(nop))]
|
||||
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(nop))]
|
||||
#[cfg_attr(not(target_arch = "arm"), stable(feature = "neon_intrinsics", since = "1.59.0"))]
|
||||
|
|
@ -24938,7 +24938,7 @@ pub unsafe fn vreinterpretq_p8_p64(a: poly64x2_t) -> poly8x16_t {
|
|||
/// [Arm's documentation](https://developer.arm.com/architectures/instruction-sets/intrinsics/vreinterpretq_s16_p128)
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon,aes")]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "aes,v8"))]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "v8"))]
|
||||
#[cfg_attr(all(test, target_arch = "arm"), assert_instr(nop))]
|
||||
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(nop))]
|
||||
#[cfg_attr(not(target_arch = "arm"), stable(feature = "neon_intrinsics", since = "1.59.0"))]
|
||||
|
|
@ -24951,7 +24951,7 @@ pub unsafe fn vreinterpretq_s16_p128(a: p128) -> int16x8_t {
|
|||
/// [Arm's documentation](https://developer.arm.com/architectures/instruction-sets/intrinsics/vreinterpretq_u16_p128)
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon,aes")]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "aes,v8"))]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "v8"))]
|
||||
#[cfg_attr(all(test, target_arch = "arm"), assert_instr(nop))]
|
||||
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(nop))]
|
||||
#[cfg_attr(not(target_arch = "arm"), stable(feature = "neon_intrinsics", since = "1.59.0"))]
|
||||
|
|
@ -24964,7 +24964,7 @@ pub unsafe fn vreinterpretq_u16_p128(a: p128) -> uint16x8_t {
|
|||
/// [Arm's documentation](https://developer.arm.com/architectures/instruction-sets/intrinsics/vreinterpretq_p16_p128)
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon,aes")]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "aes,v8"))]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "v8"))]
|
||||
#[cfg_attr(all(test, target_arch = "arm"), assert_instr(nop))]
|
||||
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(nop))]
|
||||
#[cfg_attr(not(target_arch = "arm"), stable(feature = "neon_intrinsics", since = "1.59.0"))]
|
||||
|
|
@ -25133,7 +25133,7 @@ pub unsafe fn vreinterpretq_u64_u8(a: uint8x16_t) -> uint64x2_t {
|
|||
/// [Arm's documentation](https://developer.arm.com/architectures/instruction-sets/intrinsics/vreinterpret_p64_p8)
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon,aes")]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "aes,v8"))]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "v8"))]
|
||||
#[cfg_attr(all(test, target_arch = "arm"), assert_instr(nop))]
|
||||
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(nop))]
|
||||
#[cfg_attr(not(target_arch = "arm"), stable(feature = "neon_intrinsics", since = "1.59.0"))]
|
||||
|
|
@ -25146,7 +25146,7 @@ pub unsafe fn vreinterpret_p64_p8(a: poly8x8_t) -> poly64x1_t {
|
|||
/// [Arm's documentation](https://developer.arm.com/architectures/instruction-sets/intrinsics/vreinterpret_p64_s8)
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon,aes")]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "aes,v8"))]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "v8"))]
|
||||
#[cfg_attr(all(test, target_arch = "arm"), assert_instr(nop))]
|
||||
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(nop))]
|
||||
#[cfg_attr(not(target_arch = "arm"), stable(feature = "neon_intrinsics", since = "1.59.0"))]
|
||||
|
|
@ -25159,7 +25159,7 @@ pub unsafe fn vreinterpret_p64_s8(a: int8x8_t) -> poly64x1_t {
|
|||
/// [Arm's documentation](https://developer.arm.com/architectures/instruction-sets/intrinsics/vreinterpret_p64_u8)
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon,aes")]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "aes,v8"))]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "v8"))]
|
||||
#[cfg_attr(all(test, target_arch = "arm"), assert_instr(nop))]
|
||||
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(nop))]
|
||||
#[cfg_attr(not(target_arch = "arm"), stable(feature = "neon_intrinsics", since = "1.59.0"))]
|
||||
|
|
@ -25172,7 +25172,7 @@ pub unsafe fn vreinterpret_p64_u8(a: uint8x8_t) -> poly64x1_t {
|
|||
/// [Arm's documentation](https://developer.arm.com/architectures/instruction-sets/intrinsics/vreinterpretq_p64_p8)
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon,aes")]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "aes,v8"))]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "v8"))]
|
||||
#[cfg_attr(all(test, target_arch = "arm"), assert_instr(nop))]
|
||||
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(nop))]
|
||||
#[cfg_attr(not(target_arch = "arm"), stable(feature = "neon_intrinsics", since = "1.59.0"))]
|
||||
|
|
@ -25185,7 +25185,7 @@ pub unsafe fn vreinterpretq_p64_p8(a: poly8x16_t) -> poly64x2_t {
|
|||
/// [Arm's documentation](https://developer.arm.com/architectures/instruction-sets/intrinsics/vreinterpretq_p64_s8)
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon,aes")]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "aes,v8"))]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "v8"))]
|
||||
#[cfg_attr(all(test, target_arch = "arm"), assert_instr(nop))]
|
||||
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(nop))]
|
||||
#[cfg_attr(not(target_arch = "arm"), stable(feature = "neon_intrinsics", since = "1.59.0"))]
|
||||
|
|
@ -25198,7 +25198,7 @@ pub unsafe fn vreinterpretq_p64_s8(a: int8x16_t) -> poly64x2_t {
|
|||
/// [Arm's documentation](https://developer.arm.com/architectures/instruction-sets/intrinsics/vreinterpretq_p64_u8)
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon,aes")]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "aes,v8"))]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "v8"))]
|
||||
#[cfg_attr(all(test, target_arch = "arm"), assert_instr(nop))]
|
||||
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(nop))]
|
||||
#[cfg_attr(not(target_arch = "arm"), stable(feature = "neon_intrinsics", since = "1.59.0"))]
|
||||
|
|
@ -25211,7 +25211,7 @@ pub unsafe fn vreinterpretq_p64_u8(a: uint8x16_t) -> poly64x2_t {
|
|||
/// [Arm's documentation](https://developer.arm.com/architectures/instruction-sets/intrinsics/vreinterpretq_p128_s16)
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon,aes")]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "aes,v8"))]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "v8"))]
|
||||
#[cfg_attr(all(test, target_arch = "arm"), assert_instr(nop))]
|
||||
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(nop))]
|
||||
#[cfg_attr(not(target_arch = "arm"), stable(feature = "neon_intrinsics", since = "1.59.0"))]
|
||||
|
|
@ -25224,7 +25224,7 @@ pub unsafe fn vreinterpretq_p128_s16(a: int16x8_t) -> p128 {
|
|||
/// [Arm's documentation](https://developer.arm.com/architectures/instruction-sets/intrinsics/vreinterpretq_p128_u16)
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon,aes")]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "aes,v8"))]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "v8"))]
|
||||
#[cfg_attr(all(test, target_arch = "arm"), assert_instr(nop))]
|
||||
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(nop))]
|
||||
#[cfg_attr(not(target_arch = "arm"), stable(feature = "neon_intrinsics", since = "1.59.0"))]
|
||||
|
|
@ -25237,7 +25237,7 @@ pub unsafe fn vreinterpretq_p128_u16(a: uint16x8_t) -> p128 {
|
|||
/// [Arm's documentation](https://developer.arm.com/architectures/instruction-sets/intrinsics/vreinterpretq_p128_p16)
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon,aes")]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "aes,v8"))]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "v8"))]
|
||||
#[cfg_attr(all(test, target_arch = "arm"), assert_instr(nop))]
|
||||
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(nop))]
|
||||
#[cfg_attr(not(target_arch = "arm"), stable(feature = "neon_intrinsics", since = "1.59.0"))]
|
||||
|
|
@ -25250,7 +25250,7 @@ pub unsafe fn vreinterpretq_p128_p16(a: poly16x8_t) -> p128 {
|
|||
/// [Arm's documentation](https://developer.arm.com/architectures/instruction-sets/intrinsics/vreinterpretq_p128_s8)
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon,aes")]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "aes,v8"))]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "v8"))]
|
||||
#[cfg_attr(all(test, target_arch = "arm"), assert_instr(nop))]
|
||||
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(nop))]
|
||||
#[cfg_attr(not(target_arch = "arm"), stable(feature = "neon_intrinsics", since = "1.59.0"))]
|
||||
|
|
@ -25263,7 +25263,7 @@ pub unsafe fn vreinterpretq_p128_s8(a: int8x16_t) -> p128 {
|
|||
/// [Arm's documentation](https://developer.arm.com/architectures/instruction-sets/intrinsics/vreinterpretq_p128_u8)
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon,aes")]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "aes,v8"))]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "v8"))]
|
||||
#[cfg_attr(all(test, target_arch = "arm"), assert_instr(nop))]
|
||||
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(nop))]
|
||||
#[cfg_attr(not(target_arch = "arm"), stable(feature = "neon_intrinsics", since = "1.59.0"))]
|
||||
|
|
@ -25276,7 +25276,7 @@ pub unsafe fn vreinterpretq_p128_u8(a: uint8x16_t) -> p128 {
|
|||
/// [Arm's documentation](https://developer.arm.com/architectures/instruction-sets/intrinsics/vreinterpretq_p128_p8)
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon,aes")]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "aes,v8"))]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "v8"))]
|
||||
#[cfg_attr(all(test, target_arch = "arm"), assert_instr(nop))]
|
||||
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(nop))]
|
||||
#[cfg_attr(not(target_arch = "arm"), stable(feature = "neon_intrinsics", since = "1.59.0"))]
|
||||
|
|
@ -25289,7 +25289,7 @@ pub unsafe fn vreinterpretq_p128_p8(a: poly8x16_t) -> p128 {
|
|||
/// [Arm's documentation](https://developer.arm.com/architectures/instruction-sets/intrinsics/vreinterpretq_s8_p128)
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon,aes")]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "aes,v8"))]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "v8"))]
|
||||
#[cfg_attr(all(test, target_arch = "arm"), assert_instr(nop))]
|
||||
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(nop))]
|
||||
#[cfg_attr(not(target_arch = "arm"), stable(feature = "neon_intrinsics", since = "1.59.0"))]
|
||||
|
|
@ -25302,7 +25302,7 @@ pub unsafe fn vreinterpretq_s8_p128(a: p128) -> int8x16_t {
|
|||
/// [Arm's documentation](https://developer.arm.com/architectures/instruction-sets/intrinsics/vreinterpretq_u8_p128)
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon,aes")]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "aes,v8"))]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "v8"))]
|
||||
#[cfg_attr(all(test, target_arch = "arm"), assert_instr(nop))]
|
||||
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(nop))]
|
||||
#[cfg_attr(not(target_arch = "arm"), stable(feature = "neon_intrinsics", since = "1.59.0"))]
|
||||
|
|
@ -25315,7 +25315,7 @@ pub unsafe fn vreinterpretq_u8_p128(a: p128) -> uint8x16_t {
|
|||
/// [Arm's documentation](https://developer.arm.com/architectures/instruction-sets/intrinsics/vreinterpretq_p8_p128)
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon,aes")]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "aes,v8"))]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "v8"))]
|
||||
#[cfg_attr(all(test, target_arch = "arm"), assert_instr(nop))]
|
||||
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(nop))]
|
||||
#[cfg_attr(not(target_arch = "arm"), stable(feature = "neon_intrinsics", since = "1.59.0"))]
|
||||
|
|
@ -27060,7 +27060,7 @@ pub unsafe fn vset_lane_p16<const LANE: i32>(a: p16, b: poly16x4_t) -> poly16x4_
|
|||
/// [Arm's documentation](https://developer.arm.com/architectures/instruction-sets/intrinsics/vset_lane_p64)
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon,aes")]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "aes,v8"))]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "v8"))]
|
||||
#[cfg_attr(all(test, target_arch = "arm"), assert_instr(nop, LANE = 0))]
|
||||
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(nop, LANE = 0))]
|
||||
#[rustc_legacy_const_generics(2)]
|
||||
|
|
@ -27225,7 +27225,7 @@ pub unsafe fn vsetq_lane_p16<const LANE: i32>(a: p16, b: poly16x8_t) -> poly16x8
|
|||
/// [Arm's documentation](https://developer.arm.com/architectures/instruction-sets/intrinsics/vsetq_lane_p64)
|
||||
#[inline]
|
||||
#[target_feature(enable = "neon,aes")]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "aes,v8"))]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "v8"))]
|
||||
#[cfg_attr(all(test, target_arch = "arm"), assert_instr(nop, LANE = 0))]
|
||||
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr(nop, LANE = 0))]
|
||||
#[rustc_legacy_const_generics(2)]
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
use self::Suffix::*;
|
||||
use self::TargetFeature::*;
|
||||
use std::env;
|
||||
use std::fmt;
|
||||
use std::fs::File;
|
||||
use std::io::prelude::*;
|
||||
use std::io::{self, BufReader};
|
||||
|
|
@ -470,6 +471,186 @@ enum TargetFeature {
|
|||
FTTS,
|
||||
}
|
||||
|
||||
impl TargetFeature {
|
||||
/// A string for use with `#[target_feature(...)]`.
|
||||
fn as_target_feature_arg_aarch64(&self) -> &str {
|
||||
match *self {
|
||||
// Features included with AArch64 NEON.
|
||||
Self::Default => "neon",
|
||||
Self::ArmV7 => "neon",
|
||||
Self::Vfp4 => "neon",
|
||||
Self::FPArmV8 => "neon",
|
||||
// Optional features.
|
||||
Self::AES => "neon,aes",
|
||||
Self::FCMA => "neon,fcma",
|
||||
Self::Dotprod => "neon,dotprod",
|
||||
Self::I8MM => "neon,i8mm",
|
||||
Self::SHA3 => "neon,sha3",
|
||||
Self::RDM => "rdm",
|
||||
Self::SM4 => "neon,sm4",
|
||||
Self::FTTS => "neon,frintts",
|
||||
}
|
||||
}
|
||||
|
||||
/// A string for use with #[simd_test(...)] (or `is_aarch64_feature_detected!(...)`).
|
||||
fn as_simd_test_arg_aarch64(&self) -> &str {
|
||||
match *self {
|
||||
// Features included with AArch64 NEON.
|
||||
Self::Default => "neon",
|
||||
Self::ArmV7 => "neon",
|
||||
Self::Vfp4 => "neon",
|
||||
Self::FPArmV8 => "neon",
|
||||
// Optional features.
|
||||
Self::AES => "neon", // TODO: Missing "aes".
|
||||
Self::FCMA => "neon", // TODO: Missing "fcma".
|
||||
Self::Dotprod => "neon", // TODO: Missing "dotprod".
|
||||
Self::I8MM => "neon,i8mm",
|
||||
Self::SHA3 => "neon,sha3",
|
||||
Self::RDM => "neon", // TODO: Should be "rdm".
|
||||
Self::SM4 => "neon,sm4",
|
||||
Self::FTTS => "neon,frintts",
|
||||
}
|
||||
}
|
||||
|
||||
/// A string for use with `#[target_feature(...)]`.
|
||||
fn as_target_feature_arg_arm(&self) -> &str {
|
||||
match *self {
|
||||
Self::Default => "neon,v7",
|
||||
Self::ArmV7 => "neon,v7",
|
||||
Self::Vfp4 => "neon,vfp4",
|
||||
Self::FPArmV8 => "neon,fp-armv8,v8",
|
||||
Self::AES => "neon,v8,aes",
|
||||
Self::FCMA => "neon,v8,fcma",
|
||||
Self::Dotprod => "neon,v8,dotprod",
|
||||
Self::I8MM => "neon,v8,i8mm",
|
||||
// Features not supported on 32-bit "arm".
|
||||
Self::SHA3 => unimplemented!(),
|
||||
Self::RDM => unimplemented!(),
|
||||
Self::SM4 => unimplemented!(),
|
||||
Self::FTTS => unimplemented!(),
|
||||
}
|
||||
}
|
||||
|
||||
/// A string for use with #[simd_test(...)] (or `is_arm_feature_detected!(...)`).
|
||||
fn as_simd_test_arg_arm(&self) -> &str {
|
||||
self.as_simd_test_arg_aarch64()
|
||||
}
|
||||
|
||||
fn attr(name: &str, value: impl fmt::Display) -> String {
|
||||
format!(r#"#[{name}(enable = "{value}")]"#)
|
||||
}
|
||||
|
||||
fn attr_for_arch(arch: &str, name: &str, value: impl fmt::Display) -> String {
|
||||
format!(r#"#[cfg_attr(target_arch = "{arch}", {name}(enable = "{value}"))]"#)
|
||||
}
|
||||
|
||||
/// Generate target_feature attributes for a test that will compile for both "arm" and "aarch64".
|
||||
fn to_target_feature_attr_shared(&self) -> Lines {
|
||||
let arm = self.as_target_feature_arg_arm().split(",");
|
||||
let aarch64 = self.as_target_feature_arg_aarch64().split(",");
|
||||
|
||||
// Combine common features into an unconditional `target_feature` annotation, but guard
|
||||
// others behind `cfg_attr`.
|
||||
// TODO: It's much simpler to emit separate, guarded attributes for each architecture (as
|
||||
// for `simd_test`). However, this has an unfortunate impact on documentation, since
|
||||
// rustdoc can't currently look inside `cfg_attr` (stdarch/issues/1268).
|
||||
let mut aarch64: Vec<_> = aarch64.collect();
|
||||
let (both, arm): (Vec<_>, Vec<_>) = arm.partition(|v| aarch64.contains(v));
|
||||
aarch64.retain(|v| !both.contains(v));
|
||||
let mut lines = Vec::new();
|
||||
if !both.is_empty() {
|
||||
lines.push(Self::attr("target_feature", both.join(",")));
|
||||
};
|
||||
if !arm.is_empty() {
|
||||
lines.push(Self::attr_for_arch("arm", "target_feature", arm.join(",")));
|
||||
}
|
||||
if !aarch64.is_empty() {
|
||||
lines.push(Self::attr_for_arch(
|
||||
"aarch64",
|
||||
"target_feature",
|
||||
aarch64.join(","),
|
||||
));
|
||||
}
|
||||
lines.into()
|
||||
}
|
||||
|
||||
/// Generate a target_feature attribute for a test that will compile only for "aarch64".
|
||||
fn to_target_feature_attr_aarch64(&self) -> Lines {
|
||||
Lines::single(Self::attr(
|
||||
"target_feature",
|
||||
self.as_target_feature_arg_aarch64(),
|
||||
))
|
||||
}
|
||||
|
||||
/// Generate a target_feature attribute for a test that will compile only for "arm".
|
||||
fn to_target_feature_attr_arm(&self) -> Lines {
|
||||
Lines::single(Self::attr(
|
||||
"target_feature",
|
||||
self.as_target_feature_arg_arm(),
|
||||
))
|
||||
}
|
||||
|
||||
/// Generate simd_test attributes for a test that will compile for both "arm" and "aarch64".
|
||||
fn to_simd_test_attr_shared(&self) -> Lines {
|
||||
let arm = self.as_simd_test_arg_arm();
|
||||
let aarch64 = self.as_simd_test_arg_aarch64();
|
||||
if arm == aarch64 {
|
||||
Lines::single(Self::attr("simd_test", arm))
|
||||
} else {
|
||||
vec![
|
||||
Self::attr_for_arch("arm", "simd_test", arm),
|
||||
Self::attr_for_arch("aarch64", "simd_test", aarch64),
|
||||
]
|
||||
.into()
|
||||
}
|
||||
}
|
||||
|
||||
/// Generate a simd_test attribute for a test that will compile only for "aarch64".
|
||||
fn to_simd_test_attr_aarch64(&self) -> Lines {
|
||||
Lines::single(Self::attr("simd_test", self.as_simd_test_arg_aarch64()))
|
||||
}
|
||||
}
|
||||
|
||||
/// Complete lines of generated source.
|
||||
///
|
||||
/// This enables common generation tasks to be factored out without precluding basic
|
||||
/// context-specific formatting.
|
||||
///
|
||||
/// The convention in this generator is to prefix (not suffix) lines with a newline, so the
|
||||
/// implementation of `std::fmt::Display` behaves in the same way.
|
||||
struct Lines {
|
||||
indent: usize,
|
||||
lines: Vec<String>,
|
||||
}
|
||||
|
||||
impl Lines {
|
||||
fn indented(self, indent: usize) -> Self {
|
||||
Self {
|
||||
indent: indent + self.indent,
|
||||
..self
|
||||
}
|
||||
}
|
||||
|
||||
fn single(line: String) -> Self {
|
||||
Self::from(vec![line])
|
||||
}
|
||||
}
|
||||
|
||||
impl From<Vec<String>> for Lines {
|
||||
fn from(lines: Vec<String>) -> Self {
|
||||
Self { indent: 0, lines }
|
||||
}
|
||||
}
|
||||
|
||||
impl std::fmt::Display for Lines {
|
||||
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> fmt::Result {
|
||||
for line in self.lines.iter() {
|
||||
write!(f, "\n{:width$}{line}", "", width = self.indent)?;
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Clone, Copy)]
|
||||
enum Fntype {
|
||||
Normal,
|
||||
|
|
@ -1106,20 +1287,6 @@ fn gen_aarch64(
|
|||
Rot => type_to_rot_suffix(current_name, type_to_suffix(out_t)),
|
||||
RotLane => type_to_rot_suffix(current_name, &type_to_lane_suffixes(out_t, in_t[2], false)),
|
||||
};
|
||||
let current_target = match target {
|
||||
Default => "neon",
|
||||
ArmV7 => "neon",
|
||||
Vfp4 => "neon",
|
||||
FPArmV8 => "neon",
|
||||
AES => "neon,aes",
|
||||
FCMA => "neon,fcma",
|
||||
Dotprod => "neon,dotprod",
|
||||
I8MM => "neon,i8mm",
|
||||
SHA3 => "neon,sha3",
|
||||
RDM => "rdm",
|
||||
SM4 => "neon,sm4",
|
||||
FTTS => "neon,frintts",
|
||||
};
|
||||
let current_fn = if let Some(current_fn) = current_fn.clone() {
|
||||
if link_aarch64.is_some() {
|
||||
panic!("[{name}] Can't specify link and fn at the same time.")
|
||||
|
|
@ -1415,33 +1582,18 @@ fn gen_aarch64(
|
|||
RDM => String::from("\n#[stable(feature = \"rdm_intrinsics\", since = \"1.62.0\")]"),
|
||||
_ => String::new(),
|
||||
};
|
||||
let function_doc = create_doc_string(current_comment, &name);
|
||||
let function = format!(
|
||||
r#"
|
||||
{}
|
||||
#[inline]
|
||||
#[target_feature(enable = "{}")]
|
||||
#[cfg_attr(test, assert_instr({}{}))]{}{}
|
||||
{}{{
|
||||
{}
|
||||
{function_doc}
|
||||
#[inline]{target_feature}
|
||||
#[cfg_attr(test, assert_instr({current_aarch64}{const_assert}))]{const_legacy}{stable}
|
||||
{fn_decl}{{
|
||||
{call_params}
|
||||
}}
|
||||
"#,
|
||||
function_doc,
|
||||
current_target,
|
||||
current_aarch64,
|
||||
const_assert,
|
||||
const_legacy,
|
||||
stable,
|
||||
fn_decl,
|
||||
call_params
|
||||
function_doc = create_doc_string(current_comment, &name),
|
||||
target_feature = target.to_target_feature_attr_aarch64()
|
||||
);
|
||||
let test_target = match target {
|
||||
I8MM => "neon,i8mm",
|
||||
SM4 => "neon,sm4",
|
||||
SHA3 => "neon,sha3",
|
||||
FTTS => "neon,frintts",
|
||||
_ => "neon",
|
||||
};
|
||||
let test = match fn_type {
|
||||
Fntype::Normal => gen_test(
|
||||
&name,
|
||||
|
|
@ -1451,7 +1603,7 @@ fn gen_aarch64(
|
|||
[type_len(in_t[0]), type_len(in_t[1]), type_len(in_t[2])],
|
||||
type_len(out_t),
|
||||
para_num,
|
||||
test_target,
|
||||
target.to_simd_test_attr_aarch64(),
|
||||
),
|
||||
Fntype::Load => gen_load_test(&name, in_t, &out_t, current_tests, type_len(out_t)),
|
||||
Fntype::Store => gen_store_test(&name, in_t, &out_t, current_tests, type_len(in_t[1])),
|
||||
|
|
@ -1473,10 +1625,9 @@ fn gen_load_test(
|
|||
type_len: usize,
|
||||
) -> String {
|
||||
let mut test = format!(
|
||||
r#"
|
||||
#[simd_test(enable = "neon")]
|
||||
unsafe fn test_{}() {{"#,
|
||||
name,
|
||||
r#"{simd_test}
|
||||
unsafe fn test_{name}() {{"#,
|
||||
simd_test = Default.to_simd_test_attr_shared().indented(4)
|
||||
);
|
||||
for (a, b, _, n, e) in current_tests {
|
||||
let a: Vec<String> = a.iter().take(type_len + 1).cloned().collect();
|
||||
|
|
@ -1571,10 +1722,9 @@ fn gen_store_test(
|
|||
type_len: usize,
|
||||
) -> String {
|
||||
let mut test = format!(
|
||||
r#"
|
||||
#[simd_test(enable = "neon")]
|
||||
unsafe fn test_{}() {{"#,
|
||||
name,
|
||||
r#"{simd_test}
|
||||
unsafe fn test_{name}() {{"#,
|
||||
simd_test = Default.to_simd_test_attr_shared().indented(4)
|
||||
);
|
||||
for (a, _, _, constn, e) in current_tests {
|
||||
let a: Vec<String> = a.iter().take(type_len + 1).cloned().collect();
|
||||
|
|
@ -1639,14 +1789,10 @@ fn gen_test(
|
|||
len_in: [usize; 3],
|
||||
len_out: usize,
|
||||
para_num: i32,
|
||||
target: &str,
|
||||
attributes: Lines,
|
||||
) -> String {
|
||||
let mut test = format!(
|
||||
r#"
|
||||
#[simd_test(enable = "{}")]
|
||||
unsafe fn test_{}() {{"#,
|
||||
target, name,
|
||||
);
|
||||
let mut test = attributes.indented(4).to_string();
|
||||
test.push_str(&format!("\n unsafe fn test_{name}() {{"));
|
||||
for (a, b, c, n, e) in current_tests {
|
||||
let a: Vec<String> = a.iter().take(len_in[0]).cloned().collect();
|
||||
let b: Vec<String> = b.iter().take(len_in[1]).cloned().collect();
|
||||
|
|
@ -1833,34 +1979,6 @@ fn gen_arm(
|
|||
let current_aarch64 = current_aarch64
|
||||
.clone()
|
||||
.unwrap_or_else(|| current_arm.to_string());
|
||||
let current_target_aarch64 = match target {
|
||||
Default => "neon",
|
||||
ArmV7 => "neon",
|
||||
Vfp4 => "neon",
|
||||
FPArmV8 => "neon",
|
||||
AES => "neon,aes",
|
||||
FCMA => "neon,fcma",
|
||||
Dotprod => "neon,dotprod",
|
||||
I8MM => "neon,i8mm",
|
||||
SHA3 => "neon,sha3",
|
||||
RDM => "rdm",
|
||||
SM4 => "neon,sm4",
|
||||
FTTS => "neon,frintts",
|
||||
};
|
||||
let current_target_arm = match target {
|
||||
Default => "v7",
|
||||
ArmV7 => "v7",
|
||||
Vfp4 => "vfp4",
|
||||
FPArmV8 => "fp-armv8,v8",
|
||||
AES => "aes,v8",
|
||||
FCMA => "v8", // v8.3a
|
||||
Dotprod => "v8", // v8.2a
|
||||
I8MM => "v8,i8mm",
|
||||
RDM => unreachable!(),
|
||||
SM4 => unreachable!(),
|
||||
SHA3 => unreachable!(),
|
||||
FTTS => unreachable!(),
|
||||
};
|
||||
let current_fn = if let Some(current_fn) = current_fn.clone() {
|
||||
if link_aarch64.is_some() || link_arm.is_some() {
|
||||
panic!(
|
||||
|
|
@ -2378,33 +2496,22 @@ fn gen_arm(
|
|||
let function_doc = create_doc_string(current_comment, &name);
|
||||
format!(
|
||||
r#"
|
||||
{}
|
||||
{function_doc}
|
||||
#[inline]
|
||||
#[cfg(target_arch = "arm")]
|
||||
#[target_feature(enable = "neon,{}")]
|
||||
#[cfg_attr(test, assert_instr({}{}))]{}
|
||||
{}
|
||||
#[cfg(target_arch = "arm")]{target_feature_arm}
|
||||
#[cfg_attr(test, assert_instr({assert_arm}{const_assert}))]{const_legacy}
|
||||
{call_arm}
|
||||
|
||||
{}
|
||||
{function_doc}
|
||||
#[inline]
|
||||
#[cfg(target_arch = "aarch64")]
|
||||
#[target_feature(enable = "{}")]
|
||||
#[cfg_attr(test, assert_instr({}{}))]{}{}
|
||||
{}
|
||||
#[cfg(target_arch = "aarch64")]{target_feature_aarch64}
|
||||
#[cfg_attr(test, assert_instr({assert_aarch64}{const_assert}))]{const_legacy}{stable_aarch64}
|
||||
{call_aarch64}
|
||||
"#,
|
||||
function_doc,
|
||||
current_target_arm,
|
||||
expand_intrinsic(¤t_arm, in_t[1]),
|
||||
const_assert,
|
||||
const_legacy,
|
||||
call_arm,
|
||||
function_doc,
|
||||
current_target_aarch64,
|
||||
expand_intrinsic(¤t_aarch64, in_t[1]),
|
||||
const_assert,
|
||||
const_legacy,
|
||||
stable_aarch64,
|
||||
call_aarch64,
|
||||
target_feature_arm = target.to_target_feature_attr_arm(),
|
||||
target_feature_aarch64 = target.to_target_feature_attr_aarch64(),
|
||||
assert_arm = expand_intrinsic(¤t_arm, in_t[1]),
|
||||
assert_aarch64 = expand_intrinsic(¤t_aarch64, in_t[1]),
|
||||
)
|
||||
} else {
|
||||
let call = {
|
||||
|
|
@ -2444,36 +2551,20 @@ fn gen_arm(
|
|||
RDM => String::from("\n#[cfg_attr(not(target_arch = \"arm\"), stable(feature = \"rdm_intrinsics\", since = \"1.62.0\"))]"),
|
||||
_ => String::new(),
|
||||
};
|
||||
let function_doc = create_doc_string(current_comment, &name);
|
||||
format!(
|
||||
r#"
|
||||
{}
|
||||
#[inline]
|
||||
#[target_feature(enable = "{}")]
|
||||
#[cfg_attr(target_arch = "arm", target_feature(enable = "{}"))]
|
||||
#[cfg_attr(all(test, target_arch = "arm"), assert_instr({}{}))]
|
||||
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr({}{}))]{}{}
|
||||
{}
|
||||
{function_doc}
|
||||
#[inline]{target_feature}
|
||||
#[cfg_attr(all(test, target_arch = "arm"), assert_instr({assert_arm}{const_assert}))]
|
||||
#[cfg_attr(all(test, target_arch = "aarch64"), assert_instr({assert_aarch64}{const_assert}))]{const_legacy}{stable_aarch64}
|
||||
{call}
|
||||
"#,
|
||||
function_doc,
|
||||
current_target_aarch64,
|
||||
current_target_arm,
|
||||
expand_intrinsic(¤t_arm, in_t[1]),
|
||||
const_assert,
|
||||
expand_intrinsic(¤t_aarch64, in_t[1]),
|
||||
const_assert,
|
||||
const_legacy,
|
||||
stable_aarch64,
|
||||
call,
|
||||
function_doc = create_doc_string(current_comment, &name),
|
||||
assert_arm = expand_intrinsic(¤t_arm, in_t[1]),
|
||||
assert_aarch64 = expand_intrinsic(¤t_aarch64, in_t[1]),
|
||||
target_feature = target.to_target_feature_attr_shared(),
|
||||
)
|
||||
};
|
||||
let test_target = match target {
|
||||
I8MM => "neon,i8mm",
|
||||
SM4 => "neon,sm4",
|
||||
SHA3 => "neon,sha3",
|
||||
FTTS => "neon,frintts",
|
||||
_ => "neon",
|
||||
};
|
||||
let test = match fn_type {
|
||||
Fntype::Normal => gen_test(
|
||||
&name,
|
||||
|
|
@ -2483,7 +2574,7 @@ fn gen_arm(
|
|||
[type_len(in_t[0]), type_len(in_t[1]), type_len(in_t[2])],
|
||||
type_len(out_t),
|
||||
para_num,
|
||||
test_target,
|
||||
target.to_simd_test_attr_shared(),
|
||||
),
|
||||
Fntype::Load => gen_load_test(&name, in_t, &out_t, current_tests, type_len(out_t)),
|
||||
Fntype::Store => gen_store_test(&name, in_t, &out_t, current_tests, type_len(in_t[1])),
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue