1 // RUN: %clang_cc1 -triple aarch64-none-linux-gnu -target-feature +neon -fsyntax-only -verify -emit-llvm -o - %s
2 // REQUIRES: aarch64-registered-target
4 // Test that functions with the correct target attributes can use the correct NEON intrinsics.
8 __attribute__((target("dotprod")))
9 void dotprod(uint32x2_t v2i32
, uint8x16_t v16i8
, uint8x8_t v8i8
) {
10 vdot_u32(v2i32
, v8i8
, v8i8
);
11 vdot_laneq_u32(v2i32
, v8i8
, v16i8
, 1);
14 __attribute__((target("fullfp16")))
15 void fp16(uint32x2_t v2i32
, uint32x4_t v4i32
, uint16x8_t v8i16
, uint8x16_t v16i8
, uint8x8_t v8i8
, float32x2_t v2f32
, float32x4_t v4f32
, float16x4_t v4f16
, bfloat16x4_t v4bf16
) {
18 vmaxnm_f16(v4f16
, v4f16
);
22 __attribute__((target("fp16fml")))
23 void fp16fml(float32x2_t v2f32
, float16x4_t v4f16
) {
24 vfmlal_low_f16(v2f32
, v4f16
, v4f16
);
27 __attribute__((target("i8mm")))
28 void i8mm(uint32x2_t v2i32
, uint32x4_t v4i32
, uint16x8_t v8i16
, uint8x16_t v16i8
, uint8x8_t v8i8
, float32x2_t v2f32
, float32x4_t v4f32
, float16x4_t v4f16
, bfloat16x4_t v4bf16
) {
29 vmmlaq_s32(v4i32
, v8i16
, v8i16
);
30 vusdot_laneq_s32(v2i32
, v8i8
, v8i16
, 0);
33 __attribute__((target("bf16")))
34 void bf16(uint32x2_t v2i32
, uint32x4_t v4i32
, uint16x8_t v8i16
, uint8x16_t v16i8
, uint8x8_t v8i8
, float32x2_t v2f32
, float32x4_t v4f32
, float16x4_t v4f16
, bfloat16x4_t v4bf16
, __bf16 bf16
) {
35 vbfdot_f32(v2f32
, v4bf16
, v4bf16
);
37 vdup_lane_bf16(v4bf16
, 2);
40 vcvt_f32_bf16(v4bf16
);
44 __attribute__((target("arch=armv8.1-a")))
45 void test_v81(int32x2_t d
, int32x4_t v
, int s
) {
46 vqrdmlahq_s32(v
, v
, v
);
47 vqrdmlah_laneq_s32(d
, d
, v
, 1);
48 vqrdmlahh_s16(1, 1, 1);
51 __attribute__((target("arch=armv8.3-a+fp16")))
52 void test_v83(float32x4_t v4f32
, float16x4_t v4f16
, float64x2_t v2f64
) {
53 vcaddq_rot90_f32(v4f32
, v4f32
);
54 vcmla_rot90_f16(v4f16
, v4f16
, v4f16
);
55 vcmlaq_rot270_laneq_f64(v2f64
, v2f64
, v2f64
, 1);
58 __attribute__((target("arch=armv8.5-a")))
59 void test_v85(float32x4_t v4f32
) {
63 void undefined(uint32x2_t v2i32
, uint32x4_t v4i32
, uint16x8_t v8i16
, uint8x16_t v16i8
, uint8x8_t v8i8
, float32x2_t v2f32
, float32x4_t v4f32
, float16x4_t v4f16
, float64x2_t v2f64
, bfloat16x4_t v4bf16
, __bf16 bf16
, poly64_t poly64
, poly64x2_t poly64x2
) {
65 vdot_u32(v2i32
, v8i8
, v8i8
); // expected-error {{always_inline function 'vdot_u32' requires target feature 'dotprod'}}
66 vdot_laneq_u32(v2i32
, v8i8
, v16i8
, 1); // expected-error {{always_inline function 'vdot_u32' requires target feature 'dotprod'}}
68 vceqz_f16(v4f16
); // expected-error {{always_inline function 'vceqz_f16' requires target feature 'fullfp16'}}
69 vrnd_f16(v4f16
); // expected-error {{always_inline function 'vrnd_f16' requires target feature 'fullfp16'}}
70 vmaxnm_f16(v4f16
, v4f16
); // expected-error {{always_inline function 'vmaxnm_f16' requires target feature 'fullfp16'}}
71 vrndi_f16(v4f16
); // expected-error {{always_inline function 'vrndi_f16' requires target feature 'fullfp16'}}
73 vfmlal_low_f16(v2f32
, v4f16
, v4f16
); // expected-error {{always_inline function 'vfmlal_low_f16' requires target feature 'fp16fml'}}
75 vmmlaq_s32(v4i32
, v8i16
, v8i16
); // expected-error {{always_inline function 'vmmlaq_s32' requires target feature 'i8mm'}}
76 vusdot_laneq_s32(v2i32
, v8i8
, v8i16
, 0); // expected-error {{always_inline function 'vusdot_s32' requires target feature 'i8mm'}}
78 vbfdot_f32(v2f32
, v4bf16
, v4bf16
); // expected-error {{always_inline function 'vbfdot_f32' requires target feature 'bf16'}}
80 vdup_lane_bf16(v4bf16
, 2); // expected-error {{'__builtin_neon_splat_lane_bf16' needs target feature bf16}}
81 vdup_n_bf16(bf16
); // expected-error {{always_inline function 'vdup_n_bf16' requires target feature 'bf16'}}
82 vld1_bf16(0); // expected-error {{'__builtin_neon_vld1_bf16' needs target feature bf16}}
83 vcvt_f32_bf16(v4bf16
); // expected-error {{always_inline function 'vcvt_f32_bf16' requires target feature 'bf16'}}
84 vcvt_bf16_f32(v4f32
); // expected-error {{always_inline function 'vcvt_bf16_f32' requires target feature 'bf16'}}
86 vqrdmlahq_s32(v4i32
, v4i32
, v4i32
); // expected-error {{always_inline function 'vqrdmlahq_s32' requires target feature 'v8.1a'}}
87 vqrdmlah_laneq_s32(v2i32
, v2i32
, v4i32
, 1); // expected-error {{always_inline function 'vqrdmlah_s32' requires target feature 'v8.1a'}}
88 vqrdmlahh_s16(1, 1, 1); // expected-error {{always_inline function 'vqrdmlahh_s16' requires target feature 'v8.1a'}}
90 vcaddq_rot90_f32(v4f32
, v4f32
); // expected-error {{always_inline function 'vcaddq_rot90_f32' requires target feature 'v8.3a'}}
91 vcmla_rot90_f16(v4f16
, v4f16
, v4f16
); // expected-error {{always_inline function 'vcmla_rot90_f16' requires target feature 'v8.3a'}}
92 vcmlaq_rot270_laneq_f64(v2f64
, v2f64
, v2f64
, 1); // expected-error {{always_inline function 'vcmlaq_rot270_f64' requires target feature 'v8.3a'}}
94 vrnd32xq_f32(v4f32
); // expected-error {{always_inline function 'vrnd32xq_f32' requires target feature 'v8.5a'}}
96 vmull_p64(poly64
, poly64
); // expected-error {{always_inline function 'vmull_p64' requires target feature 'aes'}}
97 vmull_high_p64(poly64x2
, poly64x2
); // expected-error {{always_inline function 'vmull_high_p64' requires target feature 'aes'}}