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 // 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] 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 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 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 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 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