xref: /aosp_15_r20/external/llvm/test/CodeGen/X86/palignr.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -march=x86 -mcpu=core2 -mattr=+ssse3 | FileCheck %s
3*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -march=x86 -mcpu=yonah | FileCheck --check-prefix=CHECK-YONAH %s
4*9880d681SAndroid Build Coastguard Worker
5*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test1(<4 x i32> %A, <4 x i32> %B) nounwind {
6*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test1:
7*9880d681SAndroid Build Coastguard Worker; CHECK:       # BB#0:
8*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,2,3,0]
9*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    retl
10*9880d681SAndroid Build Coastguard Worker;
11*9880d681SAndroid Build Coastguard Worker; CHECK-YONAH-LABEL: test1:
12*9880d681SAndroid Build Coastguard Worker; CHECK-YONAH:       # BB#0:
13*9880d681SAndroid Build Coastguard Worker; CHECK-YONAH-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,2,3,0]
14*9880d681SAndroid Build Coastguard Worker; CHECK-YONAH-NEXT:    retl
15*9880d681SAndroid Build Coastguard Worker  %C = shufflevector <4 x i32> %A, <4 x i32> undef, <4 x i32> < i32 1, i32 2, i32 3, i32 0 >
16*9880d681SAndroid Build Coastguard Worker	ret <4 x i32> %C
17*9880d681SAndroid Build Coastguard Worker}
18*9880d681SAndroid Build Coastguard Worker
19*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test2(<4 x i32> %A, <4 x i32> %B) nounwind {
20*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test2:
21*9880d681SAndroid Build Coastguard Worker; CHECK:       # BB#0:
22*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    palignr {{.*#+}} xmm1 = xmm0[4,5,6,7,8,9,10,11,12,13,14,15],xmm1[0,1,2,3]
23*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    movdqa %xmm1, %xmm0
24*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    retl
25*9880d681SAndroid Build Coastguard Worker;
26*9880d681SAndroid Build Coastguard Worker; CHECK-YONAH-LABEL: test2:
27*9880d681SAndroid Build Coastguard Worker; CHECK-YONAH:       # BB#0:
28*9880d681SAndroid Build Coastguard Worker; CHECK-YONAH-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,0],xmm0[3,0]
29*9880d681SAndroid Build Coastguard Worker; CHECK-YONAH-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,2],xmm1[2,0]
30*9880d681SAndroid Build Coastguard Worker; CHECK-YONAH-NEXT:    retl
31*9880d681SAndroid Build Coastguard Worker  %C = shufflevector <4 x i32> %A, <4 x i32> %B, <4 x i32> < i32 1, i32 2, i32 3, i32 4 >
32*9880d681SAndroid Build Coastguard Worker	ret <4 x i32> %C
33*9880d681SAndroid Build Coastguard Worker}
34*9880d681SAndroid Build Coastguard Worker
35*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test3(<4 x i32> %A, <4 x i32> %B) nounwind {
36*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test3:
37*9880d681SAndroid Build Coastguard Worker; CHECK:       # BB#0:
38*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    palignr {{.*#+}} xmm1 = xmm0[4,5,6,7,8,9,10,11,12,13,14,15],xmm1[0,1,2,3]
39*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    movdqa %xmm1, %xmm0
40*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    retl
41*9880d681SAndroid Build Coastguard Worker;
42*9880d681SAndroid Build Coastguard Worker; CHECK-YONAH-LABEL: test3:
43*9880d681SAndroid Build Coastguard Worker; CHECK-YONAH:       # BB#0:
44*9880d681SAndroid Build Coastguard Worker; CHECK-YONAH-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,0,1,1]
45*9880d681SAndroid Build Coastguard Worker; CHECK-YONAH-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,2,2,3]
46*9880d681SAndroid Build Coastguard Worker; CHECK-YONAH-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
47*9880d681SAndroid Build Coastguard Worker; CHECK-YONAH-NEXT:    retl
48*9880d681SAndroid Build Coastguard Worker  %C = shufflevector <4 x i32> %A, <4 x i32> %B, <4 x i32> < i32 1, i32 2, i32 undef, i32 4 >
49*9880d681SAndroid Build Coastguard Worker	ret <4 x i32> %C
50*9880d681SAndroid Build Coastguard Worker}
51*9880d681SAndroid Build Coastguard Worker
52*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test4(<4 x i32> %A, <4 x i32> %B) nounwind {
53*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test4:
54*9880d681SAndroid Build Coastguard Worker; CHECK:       # BB#0:
55*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    palignr {{.*#+}} xmm0 = xmm1[8,9,10,11,12,13,14,15],xmm0[0,1,2,3,4,5,6,7]
56*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    retl
57*9880d681SAndroid Build Coastguard Worker;
58*9880d681SAndroid Build Coastguard Worker; CHECK-YONAH-LABEL: test4:
59*9880d681SAndroid Build Coastguard Worker; CHECK-YONAH:       # BB#0:
60*9880d681SAndroid Build Coastguard Worker; CHECK-YONAH-NEXT:    shufpd {{.*#+}} xmm1 = xmm1[1],xmm0[0]
61*9880d681SAndroid Build Coastguard Worker; CHECK-YONAH-NEXT:    movapd %xmm1, %xmm0
62*9880d681SAndroid Build Coastguard Worker; CHECK-YONAH-NEXT:    retl
63*9880d681SAndroid Build Coastguard Worker  %C = shufflevector <4 x i32> %A, <4 x i32> %B, <4 x i32> < i32 6, i32 7, i32 undef, i32 1 >
64*9880d681SAndroid Build Coastguard Worker	ret <4 x i32> %C
65*9880d681SAndroid Build Coastguard Worker}
66*9880d681SAndroid Build Coastguard Worker
67*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @test5(<4 x float> %A, <4 x float> %B) nounwind {
68*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test5:
69*9880d681SAndroid Build Coastguard Worker; CHECK:       # BB#0:
70*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    shufpd {{.*#+}} xmm1 = xmm1[1],xmm0[0]
71*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    movapd %xmm1, %xmm0
72*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    retl
73*9880d681SAndroid Build Coastguard Worker;
74*9880d681SAndroid Build Coastguard Worker; CHECK-YONAH-LABEL: test5:
75*9880d681SAndroid Build Coastguard Worker; CHECK-YONAH:       # BB#0:
76*9880d681SAndroid Build Coastguard Worker; CHECK-YONAH-NEXT:    shufpd {{.*#+}} xmm1 = xmm1[1],xmm0[0]
77*9880d681SAndroid Build Coastguard Worker; CHECK-YONAH-NEXT:    movapd %xmm1, %xmm0
78*9880d681SAndroid Build Coastguard Worker; CHECK-YONAH-NEXT:    retl
79*9880d681SAndroid Build Coastguard Worker  %C = shufflevector <4 x float> %A, <4 x float> %B, <4 x i32> < i32 6, i32 7, i32 undef, i32 1 >
80*9880d681SAndroid Build Coastguard Worker	ret <4 x float> %C
81*9880d681SAndroid Build Coastguard Worker}
82*9880d681SAndroid Build Coastguard Worker
83*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @test6(<8 x i16> %A, <8 x i16> %B) nounwind {
84*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test6:
85*9880d681SAndroid Build Coastguard Worker; CHECK:       # BB#0:
86*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    palignr {{.*#+}} xmm1 = xmm0[6,7,8,9,10,11,12,13,14,15],xmm1[0,1,2,3,4,5]
87*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    movdqa %xmm1, %xmm0
88*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    retl
89*9880d681SAndroid Build Coastguard Worker;
90*9880d681SAndroid Build Coastguard Worker; CHECK-YONAH-LABEL: test6:
91*9880d681SAndroid Build Coastguard Worker; CHECK-YONAH:       # BB#0:
92*9880d681SAndroid Build Coastguard Worker; CHECK-YONAH-NEXT:    psrldq {{.*#+}} xmm0 = xmm0[6,7,8,9,10,11,12,13,14,15],zero,zero,zero,zero,zero,zero
93*9880d681SAndroid Build Coastguard Worker; CHECK-YONAH-NEXT:    pslldq {{.*#+}} xmm1 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm1[0,1,2,3,4,5]
94*9880d681SAndroid Build Coastguard Worker; CHECK-YONAH-NEXT:    por %xmm1, %xmm0
95*9880d681SAndroid Build Coastguard Worker; CHECK-YONAH-NEXT:    retl
96*9880d681SAndroid Build Coastguard Worker  %C = shufflevector <8 x i16> %A, <8 x i16> %B, <8 x i32> < i32 3, i32 4, i32 undef, i32 6, i32 7, i32 8, i32 9, i32 10 >
97*9880d681SAndroid Build Coastguard Worker	ret <8 x i16> %C
98*9880d681SAndroid Build Coastguard Worker}
99*9880d681SAndroid Build Coastguard Worker
100*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @test7(<8 x i16> %A, <8 x i16> %B) nounwind {
101*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test7:
102*9880d681SAndroid Build Coastguard Worker; CHECK:       # BB#0:
103*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    palignr {{.*#+}} xmm1 = xmm0[10,11,12,13,14,15],xmm1[0,1,2,3,4,5,6,7,8,9]
104*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    movdqa %xmm1, %xmm0
105*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    retl
106*9880d681SAndroid Build Coastguard Worker;
107*9880d681SAndroid Build Coastguard Worker; CHECK-YONAH-LABEL: test7:
108*9880d681SAndroid Build Coastguard Worker; CHECK-YONAH:       # BB#0:
109*9880d681SAndroid Build Coastguard Worker; CHECK-YONAH-NEXT:    psrldq {{.*#+}} xmm0 = xmm0[10,11,12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
110*9880d681SAndroid Build Coastguard Worker; CHECK-YONAH-NEXT:    pslldq {{.*#+}} xmm1 = zero,zero,zero,zero,zero,zero,xmm1[0,1,2,3,4,5,6,7,8,9]
111*9880d681SAndroid Build Coastguard Worker; CHECK-YONAH-NEXT:    por %xmm1, %xmm0
112*9880d681SAndroid Build Coastguard Worker; CHECK-YONAH-NEXT:    retl
113*9880d681SAndroid Build Coastguard Worker  %C = shufflevector <8 x i16> %A, <8 x i16> %B, <8 x i32> < i32 undef, i32 6, i32 undef, i32 8, i32 9, i32 10, i32 11, i32 12 >
114*9880d681SAndroid Build Coastguard Worker	ret <8 x i16> %C
115*9880d681SAndroid Build Coastguard Worker}
116*9880d681SAndroid Build Coastguard Worker
117*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @test8(<16 x i8> %A, <16 x i8> %B) nounwind {
118*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test8:
119*9880d681SAndroid Build Coastguard Worker; CHECK:       # BB#0:
120*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    palignr {{.*#+}} xmm1 = xmm0[5,6,7,8,9,10,11,12,13,14,15],xmm1[0,1,2,3,4]
121*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    movdqa %xmm1, %xmm0
122*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    retl
123*9880d681SAndroid Build Coastguard Worker;
124*9880d681SAndroid Build Coastguard Worker; CHECK-YONAH-LABEL: test8:
125*9880d681SAndroid Build Coastguard Worker; CHECK-YONAH:       # BB#0:
126*9880d681SAndroid Build Coastguard Worker; CHECK-YONAH-NEXT:    psrldq {{.*#+}} xmm0 = xmm0[5,6,7,8,9,10,11,12,13,14,15],zero,zero,zero,zero,zero
127*9880d681SAndroid Build Coastguard Worker; CHECK-YONAH-NEXT:    pslldq {{.*#+}} xmm1 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm1[0,1,2,3,4]
128*9880d681SAndroid Build Coastguard Worker; CHECK-YONAH-NEXT:    por %xmm1, %xmm0
129*9880d681SAndroid Build Coastguard Worker; CHECK-YONAH-NEXT:    retl
130*9880d681SAndroid Build Coastguard Worker  %C = shufflevector <16 x i8> %A, <16 x i8> %B, <16 x i32> < i32 5, i32 6, i32 7, i32 undef, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 16, i32 17, i32 18, i32 19, i32 20 >
131*9880d681SAndroid Build Coastguard Worker	ret <16 x i8> %C
132*9880d681SAndroid Build Coastguard Worker}
133*9880d681SAndroid Build Coastguard Worker
134*9880d681SAndroid Build Coastguard Worker; Check that we don't do unary (circular on single operand) palignr incorrectly.
135*9880d681SAndroid Build Coastguard Worker; (It is possible, but before this testcase was committed, it was being done
136*9880d681SAndroid Build Coastguard Worker; incorrectly.  In particular, one of the operands of the palignr node
137*9880d681SAndroid Build Coastguard Worker; was an UNDEF.)
138*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @test9(<8 x i16> %A, <8 x i16> %B) nounwind {
139*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test9:
140*9880d681SAndroid Build Coastguard Worker; CHECK:       # BB#0:
141*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    palignr {{.*#+}} xmm1 = xmm1[2,3,4,5,6,7,8,9,10,11,12,13,14,15,0,1]
142*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    movdqa %xmm1, %xmm0
143*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    retl
144*9880d681SAndroid Build Coastguard Worker;
145*9880d681SAndroid Build Coastguard Worker; CHECK-YONAH-LABEL: test9:
146*9880d681SAndroid Build Coastguard Worker; CHECK-YONAH:       # BB#0:
147*9880d681SAndroid Build Coastguard Worker; CHECK-YONAH-NEXT:    movdqa %xmm1, %xmm0
148*9880d681SAndroid Build Coastguard Worker; CHECK-YONAH-NEXT:    psrldq {{.*#+}} xmm0 = xmm0[2,3,4,5,6,7,8,9,10,11,12,13,14,15],zero,zero
149*9880d681SAndroid Build Coastguard Worker; CHECK-YONAH-NEXT:    pslldq {{.*#+}} xmm1 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm1[0,1]
150*9880d681SAndroid Build Coastguard Worker; CHECK-YONAH-NEXT:    por %xmm0, %xmm1
151*9880d681SAndroid Build Coastguard Worker; CHECK-YONAH-NEXT:    movdqa %xmm1, %xmm0
152*9880d681SAndroid Build Coastguard Worker; CHECK-YONAH-NEXT:    retl
153*9880d681SAndroid Build Coastguard Worker  %C = shufflevector <8 x i16> %B, <8 x i16> %A, <8 x i32> < i32 undef, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 0 >
154*9880d681SAndroid Build Coastguard Worker	ret <8 x i16> %C
155*9880d681SAndroid Build Coastguard Worker}
156*9880d681SAndroid Build Coastguard Worker
157