1// RUN: %clang_cc1 -O1 -triple arm64-apple-ios7 -target-feature +neon -ffreestanding -S -o - -emit-llvm %s | FileCheck %s
2// RUN: %clang_cc1 -O1 -triple arm64-apple-ios7 -target-feature +neon -ffreestanding -S -o - %s | \
3// RUN:   FileCheck -check-prefix=CHECK_CODEGEN %s
4// REQUIRES: aarch64-registered-target
5
6// Test ARM64 SIMD vector shift right and insert: vsri[q]_n_*
7
8#include <arm_neon.h>
9
10int8x8_t test_vsri_n_s8(int8x8_t a1, int8x8_t a2) {
11  // CHECK: test_vsri_n_s8
12  return vsri_n_s8(a1, a2, 3);
13  // CHECK: llvm.aarch64.neon.vsri.v8i8
14  // CHECK_CODEGEN: sri.8b  v0, v1, #3
15}
16
17int16x4_t test_vsri_n_s16(int16x4_t a1, int16x4_t a2) {
18  // CHECK: test_vsri_n_s16
19  return vsri_n_s16(a1, a2, 3);
20  // CHECK: llvm.aarch64.neon.vsri.v4i16
21  // CHECK_CODEGEN: sri.4h  v0, v1, #3
22}
23
24int32x2_t test_vsri_n_s32(int32x2_t a1, int32x2_t a2) {
25  // CHECK: test_vsri_n_s32
26  return vsri_n_s32(a1, a2, 1);
27  // CHECK: llvm.aarch64.neon.vsri.v2i32
28  // CHECK_CODEGEN: sri.2s  v0, v1, #1
29}
30
31int64x1_t test_vsri_n_s64(int64x1_t a1, int64x1_t a2) {
32  // CHECK: test_vsri_n_s64
33  return vsri_n_s64(a1, a2, 1);
34  // CHECK: llvm.aarch64.neon.vsri.v1i64
35  // CHECK_CODEGEN: sri     d0, d1, #1
36}
37
38uint8x8_t test_vsri_n_u8(uint8x8_t a1, uint8x8_t a2) {
39  // CHECK: test_vsri_n_u8
40  return vsri_n_u8(a1, a2, 3);
41  // CHECK: llvm.aarch64.neon.vsri.v8i8
42  // CHECK_CODEGEN: sri.8b  v0, v1, #3
43}
44
45uint16x4_t test_vsri_n_u16(uint16x4_t a1, uint16x4_t a2) {
46  // CHECK: test_vsri_n_u16
47  return vsri_n_u16(a1, a2, 3);
48  // CHECK: llvm.aarch64.neon.vsri.v4i16
49  // CHECK_CODEGEN: sri.4h  v0, v1, #3
50}
51
52uint32x2_t test_vsri_n_u32(uint32x2_t a1, uint32x2_t a2) {
53  // CHECK: test_vsri_n_u32
54  return vsri_n_u32(a1, a2, 1);
55  // CHECK: llvm.aarch64.neon.vsri.v2i32
56  // CHECK_CODEGEN: sri.2s  v0, v1, #1
57}
58
59uint64x1_t test_vsri_n_u64(uint64x1_t a1, uint64x1_t a2) {
60  // CHECK: test_vsri_n_u64
61  return vsri_n_u64(a1, a2, 1);
62  // CHECK: llvm.aarch64.neon.vsri.v1i64
63  // CHECK_CODEGEN: sri     d0, d1, #1
64}
65
66poly8x8_t test_vsri_n_p8(poly8x8_t a1, poly8x8_t a2) {
67  // CHECK: test_vsri_n_p8
68  return vsri_n_p8(a1, a2, 1);
69  // CHECK: llvm.aarch64.neon.vsri.v8i8
70  // CHECK_CODEGEN: sri.8b  v0, v1, #1
71}
72
73poly16x4_t test_vsri_n_p16(poly16x4_t a1, poly16x4_t a2) {
74  // CHECK: test_vsri_n_p16
75  return vsri_n_p16(a1, a2, 1);
76  // CHECK: llvm.aarch64.neon.vsri.v4i16
77  // CHECK_CODEGEN: sri.4h  v0, v1, #1
78}
79
80int8x16_t test_vsriq_n_s8(int8x16_t a1, int8x16_t a2) {
81  // CHECK: test_vsriq_n_s8
82  return vsriq_n_s8(a1, a2, 3);
83  // CHECK: llvm.aarch64.neon.vsri.v16i8
84  // CHECK_CODEGEN: sri.16b v0, v1, #3
85}
86
87int16x8_t test_vsriq_n_s16(int16x8_t a1, int16x8_t a2) {
88  // CHECK: test_vsriq_n_s16
89  return vsriq_n_s16(a1, a2, 3);
90  // CHECK: llvm.aarch64.neon.vsri.v8i16
91  // CHECK_CODEGEN: sri.8h  v0, v1, #3
92}
93
94int32x4_t test_vsriq_n_s32(int32x4_t a1, int32x4_t a2) {
95  // CHECK: test_vsriq_n_s32
96  return vsriq_n_s32(a1, a2, 1);
97  // CHECK: llvm.aarch64.neon.vsri.v4i32
98  // CHECK_CODEGEN: sri.4s  v0, v1, #1
99}
100
101int64x2_t test_vsriq_n_s64(int64x2_t a1, int64x2_t a2) {
102  // CHECK: test_vsriq_n_s64
103  return vsriq_n_s64(a1, a2, 1);
104  // CHECK: llvm.aarch64.neon.vsri.v2i64
105  // CHECK_CODEGEN: sri.2d  v0, v1, #1
106}
107
108uint8x16_t test_vsriq_n_u8(uint8x16_t a1, uint8x16_t a2) {
109  // CHECK: test_vsriq_n_u8
110  return vsriq_n_u8(a1, a2, 3);
111  // CHECK: llvm.aarch64.neon.vsri.v16i8
112  // CHECK_CODEGEN: sri.16b v0, v1, #3
113}
114
115uint16x8_t test_vsriq_n_u16(uint16x8_t a1, uint16x8_t a2) {
116  // CHECK: test_vsriq_n_u16
117  return vsriq_n_u16(a1, a2, 3);
118  // CHECK: llvm.aarch64.neon.vsri.v8i16
119  // CHECK_CODEGEN: sri.8h  v0, v1, #3
120}
121
122uint32x4_t test_vsriq_n_u32(uint32x4_t a1, uint32x4_t a2) {
123  // CHECK: test_vsriq_n_u32
124  return vsriq_n_u32(a1, a2, 1);
125  // CHECK: llvm.aarch64.neon.vsri.v4i32
126  // CHECK_CODEGEN: sri.4s  v0, v1, #1
127}
128
129uint64x2_t test_vsriq_n_u64(uint64x2_t a1, uint64x2_t a2) {
130  // CHECK: test_vsriq_n_u64
131  return vsriq_n_u64(a1, a2, 1);
132  // CHECK: llvm.aarch64.neon.vsri.v2i64
133  // CHECK_CODEGEN: sri.2d  v0, v1, #1
134}
135
136poly8x16_t test_vsriq_n_p8(poly8x16_t a1, poly8x16_t a2) {
137  // CHECK: test_vsriq_n_p8
138  return vsriq_n_p8(a1, a2, 1);
139  // CHECK: llvm.aarch64.neon.vsri.v16i8
140  // CHECK_CODEGEN: sri.16b v0, v1, #1
141}
142
143poly16x8_t test_vsriq_n_p16(poly16x8_t a1, poly16x8_t a2) {
144  // CHECK: test_vsriq_n_p16
145  return vsriq_n_p16(a1, a2, 1);
146  // CHECK: llvm.aarch64.neon.vsri.v8i16
147  // CHECK_CODEGEN: sri.8h  v0, v1, #1
148}
149
150