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