xref: /aosp_15_r20/external/llvm/test/Transforms/InstCombine/x86-sse4a.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -instcombine -S | FileCheck %s
3*9880d681SAndroid Build Coastguard Worker
4*9880d681SAndroid Build Coastguard Worker;
5*9880d681SAndroid Build Coastguard Worker; EXTRQ
6*9880d681SAndroid Build Coastguard Worker;
7*9880d681SAndroid Build Coastguard Worker
8*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test_extrq_call(<2 x i64> %x, <16 x i8> %y) {
9*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_extrq_call(
10*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP1:%.*]] = tail call <2 x i64> @llvm.x86.sse4a.extrq(<2 x i64> %x, <16 x i8> %y) #1
11*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret <2 x i64> [[TMP1]]
12*9880d681SAndroid Build Coastguard Worker;
13*9880d681SAndroid Build Coastguard Worker  %1 = tail call <2 x i64> @llvm.x86.sse4a.extrq(<2 x i64> %x, <16 x i8> %y) nounwind
14*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %1
15*9880d681SAndroid Build Coastguard Worker}
16*9880d681SAndroid Build Coastguard Worker
17*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test_extrq_zero_arg0(<2 x i64> %x, <16 x i8> %y) {
18*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_extrq_zero_arg0(
19*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret <2 x i64> <i64 0, i64 undef>
20*9880d681SAndroid Build Coastguard Worker;
21*9880d681SAndroid Build Coastguard Worker  %1 = tail call <2 x i64> @llvm.x86.sse4a.extrq(<2 x i64> zeroinitializer, <16 x i8> %y) nounwind
22*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %1
23*9880d681SAndroid Build Coastguard Worker}
24*9880d681SAndroid Build Coastguard Worker
25*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test_extrq_zero_arg1(<2 x i64> %x, <16 x i8> %y) {
26*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_extrq_zero_arg1(
27*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret <2 x i64> %x
28*9880d681SAndroid Build Coastguard Worker;
29*9880d681SAndroid Build Coastguard Worker  %1 = tail call <2 x i64> @llvm.x86.sse4a.extrq(<2 x i64> %x, <16 x i8> zeroinitializer) nounwind
30*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %1
31*9880d681SAndroid Build Coastguard Worker}
32*9880d681SAndroid Build Coastguard Worker
33*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test_extrq_to_extqi(<2 x i64> %x, <16 x i8> %y) {
34*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_extrq_to_extqi(
35*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP1:%.*]] = call <2 x i64> @llvm.x86.sse4a.extrqi(<2 x i64> %x, i8 8, i8 15)
36*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret <2 x i64> [[TMP1]]
37*9880d681SAndroid Build Coastguard Worker;
38*9880d681SAndroid Build Coastguard Worker  %1 = tail call <2 x i64> @llvm.x86.sse4a.extrq(<2 x i64> %x, <16 x i8> <i8 8, i8 15, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0>) nounwind
39*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %1
40*9880d681SAndroid Build Coastguard Worker}
41*9880d681SAndroid Build Coastguard Worker
42*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test_extrq_constant(<2 x i64> %x, <16 x i8> %y) {
43*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_extrq_constant(
44*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret <2 x i64> <i64 255, i64 undef>
45*9880d681SAndroid Build Coastguard Worker;
46*9880d681SAndroid Build Coastguard Worker  %1 = tail call <2 x i64> @llvm.x86.sse4a.extrq(<2 x i64> <i64 -1, i64 55>, <16 x i8> <i8 8, i8 15, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0>) nounwind
47*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %1
48*9880d681SAndroid Build Coastguard Worker}
49*9880d681SAndroid Build Coastguard Worker
50*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test_extrq_constant_undef(<2 x i64> %x, <16 x i8> %y) {
51*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_extrq_constant_undef(
52*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret <2 x i64> <i64 65535, i64 undef>
53*9880d681SAndroid Build Coastguard Worker;
54*9880d681SAndroid Build Coastguard Worker  %1 = tail call <2 x i64> @llvm.x86.sse4a.extrq(<2 x i64> <i64 -1, i64 undef>, <16 x i8> <i8 16, i8 15, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0>) nounwind
55*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %1
56*9880d681SAndroid Build Coastguard Worker}
57*9880d681SAndroid Build Coastguard Worker
58*9880d681SAndroid Build Coastguard Worker;
59*9880d681SAndroid Build Coastguard Worker; EXTRQI
60*9880d681SAndroid Build Coastguard Worker;
61*9880d681SAndroid Build Coastguard Worker
62*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test_extrqi_call(<2 x i64> %x) {
63*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_extrqi_call(
64*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP1:%.*]] = tail call <2 x i64> @llvm.x86.sse4a.extrqi(<2 x i64> %x, i8 8, i8 23)
65*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret <2 x i64> [[TMP1]]
66*9880d681SAndroid Build Coastguard Worker;
67*9880d681SAndroid Build Coastguard Worker  %1 = tail call <2 x i64> @llvm.x86.sse4a.extrqi(<2 x i64> %x, i8 8, i8 23)
68*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %1
69*9880d681SAndroid Build Coastguard Worker}
70*9880d681SAndroid Build Coastguard Worker
71*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test_extrqi_shuffle_1zuu(<2 x i64> %x) {
72*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_extrqi_shuffle_1zuu(
73*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP1:%.*]] = bitcast <2 x i64> %x to <16 x i8>
74*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP2:%.*]] = shufflevector <16 x i8> [[TMP1]], <16 x i8> <i8 undef, i8 undef, i8 undef, i8 undef, i8 0, i8 0, i8 0, i8 0, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef>, <16 x i32> <i32 4, i32 5, i32 6, i32 7, i32 20, i32 21, i32 22, i32 23, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
75*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP3:%.*]] = bitcast <16 x i8> [[TMP2]] to <2 x i64>
76*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret <2 x i64> [[TMP3]]
77*9880d681SAndroid Build Coastguard Worker;
78*9880d681SAndroid Build Coastguard Worker  %1 = tail call <2 x i64> @llvm.x86.sse4a.extrqi(<2 x i64> %x, i8 32, i8 32)
79*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %1
80*9880d681SAndroid Build Coastguard Worker}
81*9880d681SAndroid Build Coastguard Worker
82*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test_extrqi_shuffle_2zzzzzzzuuuuuuuu(<2 x i64> %x) {
83*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_extrqi_shuffle_2zzzzzzzuuuuuuuu(
84*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP1:%.*]] = bitcast <2 x i64> %x to <16 x i8>
85*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP2:%.*]] = shufflevector <16 x i8> [[TMP1]], <16 x i8> <i8 undef, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 0, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef, i8 undef>, <16 x i32> <i32 2, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
86*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP3:%.*]] = bitcast <16 x i8> [[TMP2]] to <2 x i64>
87*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret <2 x i64> [[TMP3]]
88*9880d681SAndroid Build Coastguard Worker;
89*9880d681SAndroid Build Coastguard Worker  %1 = tail call <2 x i64> @llvm.x86.sse4a.extrqi(<2 x i64> %x, i8 8, i8 16)
90*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %1
91*9880d681SAndroid Build Coastguard Worker}
92*9880d681SAndroid Build Coastguard Worker
93*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test_extrqi_undef(<2 x i64> %x) {
94*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_extrqi_undef(
95*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret <2 x i64> undef
96*9880d681SAndroid Build Coastguard Worker;
97*9880d681SAndroid Build Coastguard Worker  %1 = tail call <2 x i64> @llvm.x86.sse4a.extrqi(<2 x i64> zeroinitializer, i8 32, i8 33)
98*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %1
99*9880d681SAndroid Build Coastguard Worker}
100*9880d681SAndroid Build Coastguard Worker
101*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test_extrqi_zero(<2 x i64> %x) {
102*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_extrqi_zero(
103*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret <2 x i64> <i64 0, i64 undef>
104*9880d681SAndroid Build Coastguard Worker;
105*9880d681SAndroid Build Coastguard Worker  %1 = tail call <2 x i64> @llvm.x86.sse4a.extrqi(<2 x i64> zeroinitializer, i8 3, i8 18)
106*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %1
107*9880d681SAndroid Build Coastguard Worker}
108*9880d681SAndroid Build Coastguard Worker
109*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test_extrqi_constant(<2 x i64> %x) {
110*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_extrqi_constant(
111*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret <2 x i64> <i64 7, i64 undef>
112*9880d681SAndroid Build Coastguard Worker;
113*9880d681SAndroid Build Coastguard Worker  %1 = tail call <2 x i64> @llvm.x86.sse4a.extrqi(<2 x i64> <i64 -1, i64 55>, i8 3, i8 18)
114*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %1
115*9880d681SAndroid Build Coastguard Worker}
116*9880d681SAndroid Build Coastguard Worker
117*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test_extrqi_constant_undef(<2 x i64> %x) {
118*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_extrqi_constant_undef(
119*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret <2 x i64> <i64 15, i64 undef>
120*9880d681SAndroid Build Coastguard Worker;
121*9880d681SAndroid Build Coastguard Worker  %1 = tail call <2 x i64> @llvm.x86.sse4a.extrqi(<2 x i64> <i64 -1, i64 undef>, i8 4, i8 18)
122*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %1
123*9880d681SAndroid Build Coastguard Worker}
124*9880d681SAndroid Build Coastguard Worker
125*9880d681SAndroid Build Coastguard Worker;
126*9880d681SAndroid Build Coastguard Worker; INSERTQ
127*9880d681SAndroid Build Coastguard Worker;
128*9880d681SAndroid Build Coastguard Worker
129*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test_insertq_call(<2 x i64> %x, <2 x i64> %y) {
130*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_insertq_call(
131*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP1:%.*]] = tail call <2 x i64> @llvm.x86.sse4a.insertq(<2 x i64> %x, <2 x i64> %y) #1
132*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret <2 x i64> [[TMP1]]
133*9880d681SAndroid Build Coastguard Worker;
134*9880d681SAndroid Build Coastguard Worker  %1 = tail call <2 x i64> @llvm.x86.sse4a.insertq(<2 x i64> %x, <2 x i64> %y) nounwind
135*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %1
136*9880d681SAndroid Build Coastguard Worker}
137*9880d681SAndroid Build Coastguard Worker
138*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test_insertq_to_insertqi(<2 x i64> %x, <2 x i64> %y) {
139*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_insertq_to_insertqi(
140*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP1:%.*]] = call <2 x i64> @llvm.x86.sse4a.insertqi(<2 x i64> %x, <2 x i64> <i64 8, i64 undef>, i8 18, i8 2)
141*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret <2 x i64> [[TMP1]]
142*9880d681SAndroid Build Coastguard Worker;
143*9880d681SAndroid Build Coastguard Worker  %1 = tail call <2 x i64> @llvm.x86.sse4a.insertq(<2 x i64> %x, <2 x i64> <i64 8, i64 658>) nounwind
144*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %1
145*9880d681SAndroid Build Coastguard Worker}
146*9880d681SAndroid Build Coastguard Worker
147*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test_insertq_constant(<2 x i64> %x, <2 x i64> %y) {
148*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_insertq_constant(
149*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret <2 x i64> <i64 32, i64 undef>
150*9880d681SAndroid Build Coastguard Worker;
151*9880d681SAndroid Build Coastguard Worker  %1 = tail call <2 x i64> @llvm.x86.sse4a.insertq(<2 x i64> <i64 0, i64 0>, <2 x i64> <i64 8, i64 658>) nounwind
152*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %1
153*9880d681SAndroid Build Coastguard Worker}
154*9880d681SAndroid Build Coastguard Worker
155*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test_insertq_constant_undef(<2 x i64> %x, <2 x i64> %y) {
156*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_insertq_constant_undef(
157*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret <2 x i64> <i64 33, i64 undef>
158*9880d681SAndroid Build Coastguard Worker;
159*9880d681SAndroid Build Coastguard Worker  %1 = tail call <2 x i64> @llvm.x86.sse4a.insertq(<2 x i64> <i64 1, i64 undef>, <2 x i64> <i64 8, i64 658>) nounwind
160*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %1
161*9880d681SAndroid Build Coastguard Worker}
162*9880d681SAndroid Build Coastguard Worker
163*9880d681SAndroid Build Coastguard Worker;
164*9880d681SAndroid Build Coastguard Worker; INSERTQI
165*9880d681SAndroid Build Coastguard Worker;
166*9880d681SAndroid Build Coastguard Worker
167*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @test_insertqi_shuffle_04uu(<16 x i8> %v, <16 x i8> %i) {
168*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_insertqi_shuffle_04uu(
169*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP1:%.*]] = shufflevector <16 x i8> %v, <16 x i8> %i, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 16, i32 17, i32 18, i32 19, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
170*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret <16 x i8> [[TMP1]]
171*9880d681SAndroid Build Coastguard Worker;
172*9880d681SAndroid Build Coastguard Worker  %1 = bitcast <16 x i8> %v to <2 x i64>
173*9880d681SAndroid Build Coastguard Worker  %2 = bitcast <16 x i8> %i to <2 x i64>
174*9880d681SAndroid Build Coastguard Worker  %3 = tail call <2 x i64> @llvm.x86.sse4a.insertqi(<2 x i64> %1, <2 x i64> %2, i8 32, i8 32)
175*9880d681SAndroid Build Coastguard Worker  %4 = bitcast <2 x i64> %3 to <16 x i8>
176*9880d681SAndroid Build Coastguard Worker  ret <16 x i8> %4
177*9880d681SAndroid Build Coastguard Worker}
178*9880d681SAndroid Build Coastguard Worker
179*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @test_insertqi_shuffle_8123uuuu(<16 x i8> %v, <16 x i8> %i) {
180*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_insertqi_shuffle_8123uuuu(
181*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP1:%.*]] = shufflevector <16 x i8> %v, <16 x i8> %i, <16 x i32> <i32 16, i32 17, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
182*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret <16 x i8> [[TMP1]]
183*9880d681SAndroid Build Coastguard Worker;
184*9880d681SAndroid Build Coastguard Worker  %1 = bitcast <16 x i8> %v to <2 x i64>
185*9880d681SAndroid Build Coastguard Worker  %2 = bitcast <16 x i8> %i to <2 x i64>
186*9880d681SAndroid Build Coastguard Worker  %3 = tail call <2 x i64> @llvm.x86.sse4a.insertqi(<2 x i64> %1, <2 x i64> %2, i8 16, i8 0)
187*9880d681SAndroid Build Coastguard Worker  %4 = bitcast <2 x i64> %3 to <16 x i8>
188*9880d681SAndroid Build Coastguard Worker  ret <16 x i8> %4
189*9880d681SAndroid Build Coastguard Worker}
190*9880d681SAndroid Build Coastguard Worker
191*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test_insertqi_constant(<2 x i64> %v, <2 x i64> %i) {
192*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_insertqi_constant(
193*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret <2 x i64> <i64 -131055, i64 undef>
194*9880d681SAndroid Build Coastguard Worker;
195*9880d681SAndroid Build Coastguard Worker  %1 = tail call <2 x i64> @llvm.x86.sse4a.insertqi(<2 x i64> <i64 -1, i64 -1>, <2 x i64> <i64 8, i64 0>, i8 16, i8 1)
196*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %1
197*9880d681SAndroid Build Coastguard Worker}
198*9880d681SAndroid Build Coastguard Worker
199*9880d681SAndroid Build Coastguard Worker; The result of this insert is the second arg, since the top 64 bits of
200*9880d681SAndroid Build Coastguard Worker; the result are undefined, and we copy the bottom 64 bits from the
201*9880d681SAndroid Build Coastguard Worker; second arg
202*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @testInsert64Bits(<2 x i64> %v, <2 x i64> %i) {
203*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @testInsert64Bits(
204*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret <2 x i64> %i
205*9880d681SAndroid Build Coastguard Worker;
206*9880d681SAndroid Build Coastguard Worker  %1 = tail call <2 x i64> @llvm.x86.sse4a.insertqi(<2 x i64> %v, <2 x i64> %i, i8 64, i8 0)
207*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %1
208*9880d681SAndroid Build Coastguard Worker}
209*9880d681SAndroid Build Coastguard Worker
210*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @testZeroLength(<2 x i64> %v, <2 x i64> %i) {
211*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @testZeroLength(
212*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret <2 x i64> %i
213*9880d681SAndroid Build Coastguard Worker;
214*9880d681SAndroid Build Coastguard Worker  %1 = tail call <2 x i64> @llvm.x86.sse4a.insertqi(<2 x i64> %v, <2 x i64> %i, i8 0, i8 0)
215*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %1
216*9880d681SAndroid Build Coastguard Worker}
217*9880d681SAndroid Build Coastguard Worker
218*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @testUndefinedInsertq_1(<2 x i64> %v, <2 x i64> %i) {
219*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @testUndefinedInsertq_1(
220*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret <2 x i64> undef
221*9880d681SAndroid Build Coastguard Worker;
222*9880d681SAndroid Build Coastguard Worker  %1 = tail call <2 x i64> @llvm.x86.sse4a.insertqi(<2 x i64> %v, <2 x i64> %i, i8 0, i8 16)
223*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %1
224*9880d681SAndroid Build Coastguard Worker}
225*9880d681SAndroid Build Coastguard Worker
226*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @testUndefinedInsertq_2(<2 x i64> %v, <2 x i64> %i) {
227*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @testUndefinedInsertq_2(
228*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret <2 x i64> undef
229*9880d681SAndroid Build Coastguard Worker;
230*9880d681SAndroid Build Coastguard Worker  %1 = tail call <2 x i64> @llvm.x86.sse4a.insertqi(<2 x i64> %v, <2 x i64> %i, i8 48, i8 32)
231*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %1
232*9880d681SAndroid Build Coastguard Worker}
233*9880d681SAndroid Build Coastguard Worker
234*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @testUndefinedInsertq_3(<2 x i64> %v, <2 x i64> %i) {
235*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @testUndefinedInsertq_3(
236*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret <2 x i64> undef
237*9880d681SAndroid Build Coastguard Worker;
238*9880d681SAndroid Build Coastguard Worker  %1 = tail call <2 x i64> @llvm.x86.sse4a.insertqi(<2 x i64> %v, <2 x i64> %i, i8 64, i8 16)
239*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %1
240*9880d681SAndroid Build Coastguard Worker}
241*9880d681SAndroid Build Coastguard Worker
242*9880d681SAndroid Build Coastguard Worker;
243*9880d681SAndroid Build Coastguard Worker; Vector Demanded Bits
244*9880d681SAndroid Build Coastguard Worker;
245*9880d681SAndroid Build Coastguard Worker
246*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test_extrq_arg0(<2 x i64> %x, <16 x i8> %y) {
247*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_extrq_arg0(
248*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP1:%.*]] = tail call <2 x i64> @llvm.x86.sse4a.extrq(<2 x i64> %x, <16 x i8> %y) #1
249*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret <2 x i64> [[TMP1]]
250*9880d681SAndroid Build Coastguard Worker;
251*9880d681SAndroid Build Coastguard Worker  %1 = shufflevector <2 x i64> %x, <2 x i64> undef, <2 x i32> <i32 0, i32 0>
252*9880d681SAndroid Build Coastguard Worker  %2 = tail call <2 x i64> @llvm.x86.sse4a.extrq(<2 x i64> %1, <16 x i8> %y) nounwind
253*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %2
254*9880d681SAndroid Build Coastguard Worker}
255*9880d681SAndroid Build Coastguard Worker
256*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test_extrq_arg1(<2 x i64> %x, <16 x i8> %y) {
257*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_extrq_arg1(
258*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP1:%.*]] = tail call <2 x i64> @llvm.x86.sse4a.extrq(<2 x i64> %x, <16 x i8> %y) #1
259*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret <2 x i64> [[TMP1]]
260*9880d681SAndroid Build Coastguard Worker;
261*9880d681SAndroid Build Coastguard Worker  %1 = shufflevector <16 x i8> %y, <16 x i8> undef, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0>
262*9880d681SAndroid Build Coastguard Worker  %2 = tail call <2 x i64> @llvm.x86.sse4a.extrq(<2 x i64> %x, <16 x i8> %1) nounwind
263*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %2
264*9880d681SAndroid Build Coastguard Worker}
265*9880d681SAndroid Build Coastguard Worker
266*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test_extrq_args01(<2 x i64> %x, <16 x i8> %y) {
267*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_extrq_args01(
268*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP1:%.*]] = tail call <2 x i64> @llvm.x86.sse4a.extrq(<2 x i64> %x, <16 x i8> %y) #1
269*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret <2 x i64> [[TMP1]]
270*9880d681SAndroid Build Coastguard Worker;
271*9880d681SAndroid Build Coastguard Worker  %1 = shufflevector <2 x i64> %x, <2 x i64> undef, <2 x i32> <i32 0, i32 0>
272*9880d681SAndroid Build Coastguard Worker  %2 = shufflevector <16 x i8> %y, <16 x i8> undef, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0>
273*9880d681SAndroid Build Coastguard Worker  %3 = tail call <2 x i64> @llvm.x86.sse4a.extrq(<2 x i64> %1, <16 x i8> %2) nounwind
274*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %3
275*9880d681SAndroid Build Coastguard Worker}
276*9880d681SAndroid Build Coastguard Worker
277*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test_extrq_ret(<2 x i64> %x, <16 x i8> %y) {
278*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_extrq_ret(
279*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret <2 x i64> undef
280*9880d681SAndroid Build Coastguard Worker;
281*9880d681SAndroid Build Coastguard Worker  %1 = tail call <2 x i64> @llvm.x86.sse4a.extrq(<2 x i64> %x, <16 x i8> %y) nounwind
282*9880d681SAndroid Build Coastguard Worker  %2 = shufflevector <2 x i64> %1, <2 x i64> undef, <2 x i32> <i32 1, i32 1>
283*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %2
284*9880d681SAndroid Build Coastguard Worker}
285*9880d681SAndroid Build Coastguard Worker
286*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test_extrqi_arg0(<2 x i64> %x) {
287*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_extrqi_arg0(
288*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP1:%.*]] = tail call <2 x i64> @llvm.x86.sse4a.extrqi(<2 x i64> %x, i8 3, i8 2)
289*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret <2 x i64> [[TMP1]]
290*9880d681SAndroid Build Coastguard Worker;
291*9880d681SAndroid Build Coastguard Worker  %1 = shufflevector <2 x i64> %x, <2 x i64> undef, <2 x i32> <i32 0, i32 0>
292*9880d681SAndroid Build Coastguard Worker  %2 = tail call <2 x i64> @llvm.x86.sse4a.extrqi(<2 x i64> %1, i8 3, i8 2)
293*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %2
294*9880d681SAndroid Build Coastguard Worker}
295*9880d681SAndroid Build Coastguard Worker
296*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test_extrqi_ret(<2 x i64> %x) {
297*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_extrqi_ret(
298*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret <2 x i64> undef
299*9880d681SAndroid Build Coastguard Worker;
300*9880d681SAndroid Build Coastguard Worker  %1 = tail call <2 x i64> @llvm.x86.sse4a.extrqi(<2 x i64> %x, i8 3, i8 2) nounwind
301*9880d681SAndroid Build Coastguard Worker  %2 = shufflevector <2 x i64> %1, <2 x i64> undef, <2 x i32> <i32 1, i32 1>
302*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %2
303*9880d681SAndroid Build Coastguard Worker}
304*9880d681SAndroid Build Coastguard Worker
305*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test_insertq_arg0(<2 x i64> %x, <2 x i64> %y) {
306*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_insertq_arg0(
307*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP1:%.*]] = tail call <2 x i64> @llvm.x86.sse4a.insertq(<2 x i64> %x, <2 x i64> %y) #1
308*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret <2 x i64> [[TMP1]]
309*9880d681SAndroid Build Coastguard Worker;
310*9880d681SAndroid Build Coastguard Worker  %1 = shufflevector <2 x i64> %x, <2 x i64> undef, <2 x i32> <i32 0, i32 0>
311*9880d681SAndroid Build Coastguard Worker  %2 = tail call <2 x i64> @llvm.x86.sse4a.insertq(<2 x i64> %1, <2 x i64> %y) nounwind
312*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %2
313*9880d681SAndroid Build Coastguard Worker}
314*9880d681SAndroid Build Coastguard Worker
315*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test_insertq_ret(<2 x i64> %x, <2 x i64> %y) {
316*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_insertq_ret(
317*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret <2 x i64> undef
318*9880d681SAndroid Build Coastguard Worker;
319*9880d681SAndroid Build Coastguard Worker  %1 = tail call <2 x i64> @llvm.x86.sse4a.insertq(<2 x i64> %x, <2 x i64> %y) nounwind
320*9880d681SAndroid Build Coastguard Worker  %2 = shufflevector <2 x i64> %1, <2 x i64> undef, <2 x i32> <i32 1, i32 1>
321*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %2
322*9880d681SAndroid Build Coastguard Worker}
323*9880d681SAndroid Build Coastguard Worker
324*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test_insertqi_arg0(<2 x i64> %x, <2 x i64> %y) {
325*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_insertqi_arg0(
326*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP1:%.*]] = tail call <2 x i64> @llvm.x86.sse4a.insertqi(<2 x i64> %x, <2 x i64> %y, i8 3, i8 2) #1
327*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret <2 x i64> [[TMP1]]
328*9880d681SAndroid Build Coastguard Worker;
329*9880d681SAndroid Build Coastguard Worker  %1 = shufflevector <2 x i64> %x, <2 x i64> undef, <2 x i32> <i32 0, i32 0>
330*9880d681SAndroid Build Coastguard Worker  %2 = tail call <2 x i64> @llvm.x86.sse4a.insertqi(<2 x i64> %1, <2 x i64> %y, i8 3, i8 2) nounwind
331*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %2
332*9880d681SAndroid Build Coastguard Worker}
333*9880d681SAndroid Build Coastguard Worker
334*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test_insertqi_arg1(<2 x i64> %x, <2 x i64> %y) {
335*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_insertqi_arg1(
336*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP1:%.*]] = tail call <2 x i64> @llvm.x86.sse4a.insertqi(<2 x i64> %x, <2 x i64> %y, i8 3, i8 2) #1
337*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret <2 x i64> [[TMP1]]
338*9880d681SAndroid Build Coastguard Worker;
339*9880d681SAndroid Build Coastguard Worker  %1 = shufflevector <2 x i64> %y, <2 x i64> undef, <2 x i32> <i32 0, i32 0>
340*9880d681SAndroid Build Coastguard Worker  %2 = tail call <2 x i64> @llvm.x86.sse4a.insertqi(<2 x i64> %x, <2 x i64> %1, i8 3, i8 2) nounwind
341*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %2
342*9880d681SAndroid Build Coastguard Worker}
343*9880d681SAndroid Build Coastguard Worker
344*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test_insertqi_args01(<2 x i64> %x, <2 x i64> %y) {
345*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_insertqi_args01(
346*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP1:%.*]] = tail call <2 x i64> @llvm.x86.sse4a.insertqi(<2 x i64> %x, <2 x i64> %y, i8 3, i8 2) #1
347*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret <2 x i64> [[TMP1]]
348*9880d681SAndroid Build Coastguard Worker;
349*9880d681SAndroid Build Coastguard Worker  %1 = shufflevector <2 x i64> %x, <2 x i64> undef, <2 x i32> <i32 0, i32 0>
350*9880d681SAndroid Build Coastguard Worker  %2 = shufflevector <2 x i64> %y, <2 x i64> undef, <2 x i32> <i32 0, i32 0>
351*9880d681SAndroid Build Coastguard Worker  %3 = tail call <2 x i64> @llvm.x86.sse4a.insertqi(<2 x i64> %1, <2 x i64> %2, i8 3, i8 2) nounwind
352*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %3
353*9880d681SAndroid Build Coastguard Worker}
354*9880d681SAndroid Build Coastguard Worker
355*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test_insertqi_ret(<2 x i64> %x, <2 x i64> %y) {
356*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_insertqi_ret(
357*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret <2 x i64> undef
358*9880d681SAndroid Build Coastguard Worker;
359*9880d681SAndroid Build Coastguard Worker  %1 = tail call <2 x i64> @llvm.x86.sse4a.insertqi(<2 x i64> %x, <2 x i64> %y, i8 3, i8 2) nounwind
360*9880d681SAndroid Build Coastguard Worker  %2 = shufflevector <2 x i64> %1, <2 x i64> undef, <2 x i32> <i32 1, i32 1>
361*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %2
362*9880d681SAndroid Build Coastguard Worker}
363*9880d681SAndroid Build Coastguard Worker
364*9880d681SAndroid Build Coastguard Worker; CHECK: declare <2 x i64> @llvm.x86.sse4a.extrq
365*9880d681SAndroid Build Coastguard Workerdeclare <2 x i64> @llvm.x86.sse4a.extrq(<2 x i64>, <16 x i8>) nounwind
366*9880d681SAndroid Build Coastguard Worker
367*9880d681SAndroid Build Coastguard Worker; CHECK: declare <2 x i64> @llvm.x86.sse4a.extrqi
368*9880d681SAndroid Build Coastguard Workerdeclare <2 x i64> @llvm.x86.sse4a.extrqi(<2 x i64>, i8, i8) nounwind
369*9880d681SAndroid Build Coastguard Worker
370*9880d681SAndroid Build Coastguard Worker; CHECK: declare <2 x i64> @llvm.x86.sse4a.insertq
371*9880d681SAndroid Build Coastguard Workerdeclare <2 x i64> @llvm.x86.sse4a.insertq(<2 x i64>, <2 x i64>) nounwind
372*9880d681SAndroid Build Coastguard Worker
373*9880d681SAndroid Build Coastguard Worker; CHECK: declare <2 x i64> @llvm.x86.sse4a.insertqi
374*9880d681SAndroid Build Coastguard Workerdeclare <2 x i64> @llvm.x86.sse4a.insertqi(<2 x i64>, <2 x i64>, i8, i8) nounwind
375