16bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// RUN: %clang_cc1 -O1 -triple arm64-apple-ios7 -target-feature +neon -ffreestanding -S -o - -emit-llvm %s | FileCheck %s
26bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines// RUN: %clang_cc1 -O1 -triple arm64-apple-ios7 -target-feature +neon -ffreestanding -S -o - %s | \
3651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// RUN:   FileCheck -check-prefix=CHECK_CODEGEN %s
4ef8225444452a1486bd721f3285301fe84643b00Stephen Hines// REQUIRES: aarch64-registered-target
5651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
6651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// Test ARM64 SIMD vector shift right and insert: vsri[q]_n_*
7651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
8651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#include <arm_neon.h>
9651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
10651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesint8x8_t test_vsri_n_s8(int8x8_t a1, int8x8_t a2) {
11651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // CHECK: test_vsri_n_s8
12651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  return vsri_n_s8(a1, a2, 3);
136bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // CHECK: llvm.aarch64.neon.vsri.v8i8
14651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // CHECK_CODEGEN: sri.8b  v0, v1, #3
15651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
16651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
17651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesint16x4_t test_vsri_n_s16(int16x4_t a1, int16x4_t a2) {
18651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // CHECK: test_vsri_n_s16
19651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  return vsri_n_s16(a1, a2, 3);
206bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // CHECK: llvm.aarch64.neon.vsri.v4i16
21651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // CHECK_CODEGEN: sri.4h  v0, v1, #3
22651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
23651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
24651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesint32x2_t test_vsri_n_s32(int32x2_t a1, int32x2_t a2) {
25651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // CHECK: test_vsri_n_s32
26651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  return vsri_n_s32(a1, a2, 1);
276bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // CHECK: llvm.aarch64.neon.vsri.v2i32
28651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // CHECK_CODEGEN: sri.2s  v0, v1, #1
29651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
30651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
31651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesint64x1_t test_vsri_n_s64(int64x1_t a1, int64x1_t a2) {
32651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // CHECK: test_vsri_n_s64
33651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  return vsri_n_s64(a1, a2, 1);
346bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // CHECK: llvm.aarch64.neon.vsri.v1i64
35651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // CHECK_CODEGEN: sri     d0, d1, #1
36651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
37651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
38651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesuint8x8_t test_vsri_n_u8(uint8x8_t a1, uint8x8_t a2) {
39651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // CHECK: test_vsri_n_u8
40651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  return vsri_n_u8(a1, a2, 3);
416bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // CHECK: llvm.aarch64.neon.vsri.v8i8
42651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // CHECK_CODEGEN: sri.8b  v0, v1, #3
43651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
44651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
45651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesuint16x4_t test_vsri_n_u16(uint16x4_t a1, uint16x4_t a2) {
46651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // CHECK: test_vsri_n_u16
47651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  return vsri_n_u16(a1, a2, 3);
486bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // CHECK: llvm.aarch64.neon.vsri.v4i16
49651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // CHECK_CODEGEN: sri.4h  v0, v1, #3
50651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
51651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
52651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesuint32x2_t test_vsri_n_u32(uint32x2_t a1, uint32x2_t a2) {
53651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // CHECK: test_vsri_n_u32
54651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  return vsri_n_u32(a1, a2, 1);
556bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // CHECK: llvm.aarch64.neon.vsri.v2i32
56651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // CHECK_CODEGEN: sri.2s  v0, v1, #1
57651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
58651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
59651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesuint64x1_t test_vsri_n_u64(uint64x1_t a1, uint64x1_t a2) {
60651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // CHECK: test_vsri_n_u64
61651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  return vsri_n_u64(a1, a2, 1);
626bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // CHECK: llvm.aarch64.neon.vsri.v1i64
63651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // CHECK_CODEGEN: sri     d0, d1, #1
64651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
65651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
66651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinespoly8x8_t test_vsri_n_p8(poly8x8_t a1, poly8x8_t a2) {
67651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // CHECK: test_vsri_n_p8
68651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  return vsri_n_p8(a1, a2, 1);
696bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // CHECK: llvm.aarch64.neon.vsri.v8i8
70651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // CHECK_CODEGEN: sri.8b  v0, v1, #1
71651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
72651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
73651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinespoly16x4_t test_vsri_n_p16(poly16x4_t a1, poly16x4_t a2) {
74651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // CHECK: test_vsri_n_p16
75651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  return vsri_n_p16(a1, a2, 1);
766bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // CHECK: llvm.aarch64.neon.vsri.v4i16
77651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // CHECK_CODEGEN: sri.4h  v0, v1, #1
78651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
79651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
80651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesint8x16_t test_vsriq_n_s8(int8x16_t a1, int8x16_t a2) {
81651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // CHECK: test_vsriq_n_s8
82651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  return vsriq_n_s8(a1, a2, 3);
836bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // CHECK: llvm.aarch64.neon.vsri.v16i8
84651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // CHECK_CODEGEN: sri.16b v0, v1, #3
85651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
86651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
87651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesint16x8_t test_vsriq_n_s16(int16x8_t a1, int16x8_t a2) {
88651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // CHECK: test_vsriq_n_s16
89651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  return vsriq_n_s16(a1, a2, 3);
906bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // CHECK: llvm.aarch64.neon.vsri.v8i16
91651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // CHECK_CODEGEN: sri.8h  v0, v1, #3
92651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
93651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
94651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesint32x4_t test_vsriq_n_s32(int32x4_t a1, int32x4_t a2) {
95651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // CHECK: test_vsriq_n_s32
96651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  return vsriq_n_s32(a1, a2, 1);
976bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // CHECK: llvm.aarch64.neon.vsri.v4i32
98651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // CHECK_CODEGEN: sri.4s  v0, v1, #1
99651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
100651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
101651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesint64x2_t test_vsriq_n_s64(int64x2_t a1, int64x2_t a2) {
102651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // CHECK: test_vsriq_n_s64
103651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  return vsriq_n_s64(a1, a2, 1);
1046bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // CHECK: llvm.aarch64.neon.vsri.v2i64
105651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // CHECK_CODEGEN: sri.2d  v0, v1, #1
106651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
107651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
108651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesuint8x16_t test_vsriq_n_u8(uint8x16_t a1, uint8x16_t a2) {
109651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // CHECK: test_vsriq_n_u8
110651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  return vsriq_n_u8(a1, a2, 3);
1116bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // CHECK: llvm.aarch64.neon.vsri.v16i8
112651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // CHECK_CODEGEN: sri.16b v0, v1, #3
113651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
114651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
115651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesuint16x8_t test_vsriq_n_u16(uint16x8_t a1, uint16x8_t a2) {
116651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // CHECK: test_vsriq_n_u16
117651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  return vsriq_n_u16(a1, a2, 3);
1186bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // CHECK: llvm.aarch64.neon.vsri.v8i16
119651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // CHECK_CODEGEN: sri.8h  v0, v1, #3
120651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
121651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
122651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesuint32x4_t test_vsriq_n_u32(uint32x4_t a1, uint32x4_t a2) {
123651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // CHECK: test_vsriq_n_u32
124651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  return vsriq_n_u32(a1, a2, 1);
1256bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // CHECK: llvm.aarch64.neon.vsri.v4i32
126651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // CHECK_CODEGEN: sri.4s  v0, v1, #1
127651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
128651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
129651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesuint64x2_t test_vsriq_n_u64(uint64x2_t a1, uint64x2_t a2) {
130651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // CHECK: test_vsriq_n_u64
131651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  return vsriq_n_u64(a1, a2, 1);
1326bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // CHECK: llvm.aarch64.neon.vsri.v2i64
133651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // CHECK_CODEGEN: sri.2d  v0, v1, #1
134651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
135651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
136651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinespoly8x16_t test_vsriq_n_p8(poly8x16_t a1, poly8x16_t a2) {
137651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // CHECK: test_vsriq_n_p8
138651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  return vsriq_n_p8(a1, a2, 1);
1396bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // CHECK: llvm.aarch64.neon.vsri.v16i8
140651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // CHECK_CODEGEN: sri.16b v0, v1, #1
141651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
142651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
143651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinespoly16x8_t test_vsriq_n_p16(poly16x8_t a1, poly16x8_t a2) {
144651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // CHECK: test_vsriq_n_p16
145651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  return vsriq_n_p16(a1, a2, 1);
1466bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // CHECK: llvm.aarch64.neon.vsri.v8i16
147651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // CHECK_CODEGEN: sri.8h  v0, v1, #1
148651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
149651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
150