1 // RUN: %clang_cc1 -O3 -triple arm64-apple-ios7 -target-feature +neon -ffreestanding -S -o - %s | FileCheck %s
2 // RUN: %clang_cc1 -O3 -triple arm64-apple-ios7 -target-feature +neon -ffreestanding -S -o - -emit-llvm %s | \
3 // RUN: FileCheck -check-prefix=CHECK-IR %s
4 // REQUIRES: aarch64-registered-target
5
6 /// Test vdupq_n_f64 and vmovq_nf64 ARM64 intrinsics
7 // <rdar://problem/11778405> ARM64: vdupq_n_f64 and vdupq_lane_f64 intrinsics
8 // missing
9
10
11 #include <arm_neon.h>
12
13 // vdupq_n_f64 -> dup.2d v0, v0[0]
14 //
test_vdupq_n_f64(float64_t w)15 float64x2_t test_vdupq_n_f64(float64_t w)
16 {
17 return vdupq_n_f64(w);
18 // CHECK-LABEL: test_vdupq_n_f64:
19 // CHECK: dup.2d v0, v0[0]
20 // CHECK-NEXT: ret
21 }
22
23 // might as well test this while we're here
24 // vdupq_n_f32 -> dup.4s v0, v0[0]
test_vdupq_n_f32(float32_t w)25 float32x4_t test_vdupq_n_f32(float32_t w)
26 {
27 return vdupq_n_f32(w);
28 // CHECK-LABEL: test_vdupq_n_f32:
29 // CHECK: dup.4s v0, v0[0]
30 // CHECK-NEXT: ret
31 }
32
33 // vdupq_lane_f64 -> dup.2d v0, v0[0]
34 // this was in <rdar://problem/11778405>, but had already been implemented,
35 // test anyway
test_vdupq_lane_f64(float64x1_t V)36 float64x2_t test_vdupq_lane_f64(float64x1_t V)
37 {
38 return vdupq_lane_f64(V, 0);
39 // CHECK-LABEL: test_vdupq_lane_f64:
40 // CHECK: dup.2d v0, v0[0]
41 // CHECK-NEXT: ret
42 }
43
44 // vmovq_n_f64 -> dup Vd.2d,X0
45 // this wasn't in <rdar://problem/11778405>, but it was between the vdups
test_vmovq_n_f64(float64_t w)46 float64x2_t test_vmovq_n_f64(float64_t w)
47 {
48 return vmovq_n_f64(w);
49 // CHECK-LABEL: test_vmovq_n_f64:
50 // CHECK: dup.2d v0, v0[0]
51 // CHECK-NEXT: ret
52 }
53
test_vmov_n_f16(float16_t * a1)54 float16x4_t test_vmov_n_f16(float16_t *a1)
55 {
56 // CHECK-IR-LABEL: test_vmov_n_f16
57 return vmov_n_f16(*a1);
58 // CHECK-IR: insertelement {{.*}} i32 0{{ *$}}
59 // CHECK-IR: insertelement {{.*}} i32 1{{ *$}}
60 // CHECK-IR: insertelement {{.*}} i32 2{{ *$}}
61 // CHECK-IR: insertelement {{.*}} i32 3{{ *$}}
62 }
63
64 // Disable until scalar problem in backend is fixed. Change CHECK-IR@ to
65 // CHECK-IR<colon>
66 /*
67 float64x1_t test_vmov_n_f64(float64_t a1)
68 {
69 // CHECK-IR@ test_vmov_n_f64
70 return vmov_n_f64(a1);
71 // CHECK-IR@ insertelement {{.*}} i32 0{{ *$}}
72 }
73 */
74
test_vmovq_n_f16(float16_t * a1)75 float16x8_t test_vmovq_n_f16(float16_t *a1)
76 {
77 // CHECK-IR-LABEL: test_vmovq_n_f16
78 return vmovq_n_f16(*a1);
79 // CHECK-IR: insertelement {{.*}} i32 0{{ *$}}
80 // CHECK-IR: insertelement {{.*}} i32 1{{ *$}}
81 // CHECK-IR: insertelement {{.*}} i32 2{{ *$}}
82 // CHECK-IR: insertelement {{.*}} i32 3{{ *$}}
83 // CHECK-IR: insertelement {{.*}} i32 4{{ *$}}
84 // CHECK-IR: insertelement {{.*}} i32 5{{ *$}}
85 // CHECK-IR: insertelement {{.*}} i32 6{{ *$}}
86 // CHECK-IR: insertelement {{.*}} i32 7{{ *$}}
87 }
88
89