1// RUN: %clang_cc1 -O1 -triple arm64-apple-ios7 -target-feature +neon -ffreestanding -S -o - -emit-llvm %s | FileCheck %s
2
3// Test ARM64 SIMD copy vector element to vector element: vcopyq_lane*
4
5#include <arm_neon.h>
6
7int8x16_t test_vcopyq_laneq_s8(int8x16_t a1, int8x16_t a2) {
8  // CHECK-LABEL: test_vcopyq_laneq_s8
9  return vcopyq_laneq_s8(a1, (int64_t) 3, a2, (int64_t) 13);
10  // CHECK: shufflevector <16 x i8> %a1, <16 x i8> %a2, <16 x i32> <i32 0, i32 1, i32 2, i32 29, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
11}
12
13uint8x16_t test_vcopyq_laneq_u8(uint8x16_t a1, uint8x16_t a2) {
14  // CHECK-LABEL: test_vcopyq_laneq_u8
15  return vcopyq_laneq_u8(a1, (int64_t) 3, a2, (int64_t) 13);
16  // CHECK: shufflevector <16 x i8> %a1, <16 x i8> %a2, <16 x i32> <i32 0, i32 1, i32 2, i32 29, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
17
18}
19
20int16x8_t test_vcopyq_laneq_s16(int16x8_t a1, int16x8_t a2) {
21  // CHECK-LABEL: test_vcopyq_laneq_s16
22  return vcopyq_laneq_s16(a1, (int64_t) 3, a2, (int64_t) 7);
23  // CHECK: shufflevector <8 x i16> %a1, <8 x i16> %a2, <8 x i32> <i32 0, i32 1, i32 2, i32 15, i32 4, i32 5, i32 6, i32 7>
24
25}
26
27uint16x8_t test_vcopyq_laneq_u16(uint16x8_t a1, uint16x8_t a2) {
28  // CHECK-LABEL: test_vcopyq_laneq_u16
29  return vcopyq_laneq_u16(a1, (int64_t) 3, a2, (int64_t) 7);
30  // CHECK: shufflevector <8 x i16> %a1, <8 x i16> %a2, <8 x i32> <i32 0, i32 1, i32 2, i32 15, i32 4, i32 5, i32 6, i32 7>
31
32}
33
34int32x4_t test_vcopyq_laneq_s32(int32x4_t a1, int32x4_t a2) {
35  // CHECK-LABEL: test_vcopyq_laneq_s32
36  return vcopyq_laneq_s32(a1, (int64_t) 3, a2, (int64_t) 3);
37  // CHECK: shufflevector <4 x i32> %a1, <4 x i32> %a2, <4 x i32> <i32 0, i32 1, i32 2, i32 7>
38}
39
40uint32x4_t test_vcopyq_laneq_u32(uint32x4_t a1, uint32x4_t a2) {
41  // CHECK-LABEL: test_vcopyq_laneq_u32
42  return vcopyq_laneq_u32(a1, (int64_t) 3, a2, (int64_t) 3);
43  // CHECK: shufflevector <4 x i32> %a1, <4 x i32> %a2, <4 x i32> <i32 0, i32 1, i32 2, i32 7>
44}
45
46int64x2_t test_vcopyq_laneq_s64(int64x2_t a1, int64x2_t a2) {
47  // CHECK-LABEL: test_vcopyq_laneq_s64
48  return vcopyq_laneq_s64(a1, (int64_t) 0, a2, (int64_t) 1);
49  // CHECK: shufflevector <2 x i64> %a1, <2 x i64> %a2, <2 x i32> <i32 3, i32 1>
50}
51
52uint64x2_t test_vcopyq_laneq_u64(uint64x2_t a1, uint64x2_t a2) {
53  // CHECK-LABEL: test_vcopyq_laneq_u64
54  return vcopyq_laneq_u64(a1, (int64_t) 0, a2, (int64_t) 1);
55  // CHECK: shufflevector <2 x i64> %a1, <2 x i64> %a2, <2 x i32> <i32 3, i32 1>
56}
57
58float32x4_t test_vcopyq_laneq_f32(float32x4_t a1, float32x4_t a2) {
59  // CHECK-LABEL: test_vcopyq_laneq_f32
60  return vcopyq_laneq_f32(a1, 0, a2, 3);
61  // CHECK: shufflevector <4 x float> %a1, <4 x float> %a2, <4 x i32> <i32 7, i32 1, i32 2, i32 3>
62}
63
64float64x2_t test_vcopyq_laneq_f64(float64x2_t a1, float64x2_t a2) {
65  // CHECK-LABEL: test_vcopyq_laneq_f64
66  return vcopyq_laneq_f64(a1, 0, a2, 1);
67  // CHECK: shufflevector <2 x double> %a1, <2 x double> %a2, <2 x i32> <i32 3, i32 1>
68}
69
70