xref: /aosp_15_r20/external/llvm/test/CodeGen/X86/promote-vec3.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 -mtriple=i686-unknown-unknown -mattr=+sse3 | FileCheck %s --check-prefix=SSE3
3*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefix=SSE41
4*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+avx | FileCheck %s --check-prefix=AVX_ANY
5*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefix=AVX_ANY
6*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefix=AVX_X86_64
7*9880d681SAndroid Build Coastguard Worker
8*9880d681SAndroid Build Coastguard Workerdefine <3 x i16> @zext_i8(<3 x i8>) {
9*9880d681SAndroid Build Coastguard Worker; SSE3-LABEL: zext_i8:
10*9880d681SAndroid Build Coastguard Worker; SSE3:       # BB#0:
11*9880d681SAndroid Build Coastguard Worker; SSE3-NEXT:    movzbl {{[0-9]+}}(%esp), %eax
12*9880d681SAndroid Build Coastguard Worker; SSE3-NEXT:    pxor %xmm0, %xmm0
13*9880d681SAndroid Build Coastguard Worker; SSE3-NEXT:    pxor %xmm1, %xmm1
14*9880d681SAndroid Build Coastguard Worker; SSE3-NEXT:    pinsrw $0, %eax, %xmm1
15*9880d681SAndroid Build Coastguard Worker; SSE3-NEXT:    movzbl {{[0-9]+}}(%esp), %eax
16*9880d681SAndroid Build Coastguard Worker; SSE3-NEXT:    pinsrw $1, %eax, %xmm1
17*9880d681SAndroid Build Coastguard Worker; SSE3-NEXT:    movzbl {{[0-9]+}}(%esp), %eax
18*9880d681SAndroid Build Coastguard Worker; SSE3-NEXT:    pinsrw $2, %eax, %xmm1
19*9880d681SAndroid Build Coastguard Worker; SSE3-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
20*9880d681SAndroid Build Coastguard Worker; SSE3-NEXT:    movd %xmm1, %eax
21*9880d681SAndroid Build Coastguard Worker; SSE3-NEXT:    pextrw $2, %xmm1, %edx
22*9880d681SAndroid Build Coastguard Worker; SSE3-NEXT:    pextrw $4, %xmm1, %ecx
23*9880d681SAndroid Build Coastguard Worker; SSE3-NEXT:    # kill: %AX<def> %AX<kill> %EAX<kill>
24*9880d681SAndroid Build Coastguard Worker; SSE3-NEXT:    # kill: %DX<def> %DX<kill> %EDX<kill>
25*9880d681SAndroid Build Coastguard Worker; SSE3-NEXT:    # kill: %CX<def> %CX<kill> %ECX<kill>
26*9880d681SAndroid Build Coastguard Worker; SSE3-NEXT:    retl
27*9880d681SAndroid Build Coastguard Worker;
28*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: zext_i8:
29*9880d681SAndroid Build Coastguard Worker; SSE41:       # BB#0:
30*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pxor %xmm0, %xmm0
31*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pinsrb $0, {{[0-9]+}}(%esp), %xmm0
32*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pinsrb $4, {{[0-9]+}}(%esp), %xmm0
33*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pinsrb $8, {{[0-9]+}}(%esp), %xmm0
34*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    movd %xmm0, %eax
35*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pextrw $2, %xmm0, %edx
36*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pextrw $4, %xmm0, %ecx
37*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    # kill: %AX<def> %AX<kill> %EAX<kill>
38*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    # kill: %DX<def> %DX<kill> %EDX<kill>
39*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    # kill: %CX<def> %CX<kill> %ECX<kill>
40*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    retl
41*9880d681SAndroid Build Coastguard Worker;
42*9880d681SAndroid Build Coastguard Worker; AVX_ANY-LABEL: zext_i8:
43*9880d681SAndroid Build Coastguard Worker; AVX_ANY:       # BB#0:
44*9880d681SAndroid Build Coastguard Worker; AVX_ANY-NEXT:    vpxor %xmm0, %xmm0, %xmm0
45*9880d681SAndroid Build Coastguard Worker; AVX_ANY-NEXT:    vpinsrb $0, {{[0-9]+}}(%esp), %xmm0, %xmm0
46*9880d681SAndroid Build Coastguard Worker; AVX_ANY-NEXT:    vpinsrb $4, {{[0-9]+}}(%esp), %xmm0, %xmm0
47*9880d681SAndroid Build Coastguard Worker; AVX_ANY-NEXT:    vpinsrb $8, {{[0-9]+}}(%esp), %xmm0, %xmm0
48*9880d681SAndroid Build Coastguard Worker; AVX_ANY-NEXT:    vmovd %xmm0, %eax
49*9880d681SAndroid Build Coastguard Worker; AVX_ANY-NEXT:    vpextrw $2, %xmm0, %edx
50*9880d681SAndroid Build Coastguard Worker; AVX_ANY-NEXT:    vpextrw $4, %xmm0, %ecx
51*9880d681SAndroid Build Coastguard Worker; AVX_ANY-NEXT:    # kill: %AX<def> %AX<kill> %EAX<kill>
52*9880d681SAndroid Build Coastguard Worker; AVX_ANY-NEXT:    # kill: %DX<def> %DX<kill> %EDX<kill>
53*9880d681SAndroid Build Coastguard Worker; AVX_ANY-NEXT:    # kill: %CX<def> %CX<kill> %ECX<kill>
54*9880d681SAndroid Build Coastguard Worker; AVX_ANY-NEXT:    retl
55*9880d681SAndroid Build Coastguard Worker;
56*9880d681SAndroid Build Coastguard Worker; AVX_X86_64-LABEL: zext_i8:
57*9880d681SAndroid Build Coastguard Worker; AVX_X86_64:       # BB#0:
58*9880d681SAndroid Build Coastguard Worker; AVX_X86_64-NEXT:    vmovd %edi, %xmm0
59*9880d681SAndroid Build Coastguard Worker; AVX_X86_64-NEXT:    vpinsrd $1, %esi, %xmm0, %xmm0
60*9880d681SAndroid Build Coastguard Worker; AVX_X86_64-NEXT:    vpinsrd $2, %edx, %xmm0, %xmm0
61*9880d681SAndroid Build Coastguard Worker; AVX_X86_64-NEXT:    vpand {{.*}}(%rip), %xmm0, %xmm0
62*9880d681SAndroid Build Coastguard Worker; AVX_X86_64-NEXT:    vmovd %xmm0, %eax
63*9880d681SAndroid Build Coastguard Worker; AVX_X86_64-NEXT:    vpextrw $2, %xmm0, %edx
64*9880d681SAndroid Build Coastguard Worker; AVX_X86_64-NEXT:    vpextrw $4, %xmm0, %ecx
65*9880d681SAndroid Build Coastguard Worker; AVX_X86_64-NEXT:    # kill: %AX<def> %AX<kill> %EAX<kill>
66*9880d681SAndroid Build Coastguard Worker; AVX_X86_64-NEXT:    # kill: %DX<def> %DX<kill> %EDX<kill>
67*9880d681SAndroid Build Coastguard Worker; AVX_X86_64-NEXT:    # kill: %CX<def> %CX<kill> %ECX<kill>
68*9880d681SAndroid Build Coastguard Worker; AVX_X86_64-NEXT:    retq
69*9880d681SAndroid Build Coastguard Worker  %2 = zext <3 x i8> %0 to <3 x i16>
70*9880d681SAndroid Build Coastguard Worker  ret <3 x i16> %2
71*9880d681SAndroid Build Coastguard Worker}
72*9880d681SAndroid Build Coastguard Worker
73*9880d681SAndroid Build Coastguard Workerdefine <3 x i16> @sext_i8(<3 x i8>) {
74*9880d681SAndroid Build Coastguard Worker; SSE3-LABEL: sext_i8:
75*9880d681SAndroid Build Coastguard Worker; SSE3:       # BB#0:
76*9880d681SAndroid Build Coastguard Worker; SSE3-NEXT:    movzbl {{[0-9]+}}(%esp), %eax
77*9880d681SAndroid Build Coastguard Worker; SSE3-NEXT:    pinsrw $0, %eax, %xmm0
78*9880d681SAndroid Build Coastguard Worker; SSE3-NEXT:    movzbl {{[0-9]+}}(%esp), %eax
79*9880d681SAndroid Build Coastguard Worker; SSE3-NEXT:    pinsrw $1, %eax, %xmm0
80*9880d681SAndroid Build Coastguard Worker; SSE3-NEXT:    movzbl {{[0-9]+}}(%esp), %eax
81*9880d681SAndroid Build Coastguard Worker; SSE3-NEXT:    pinsrw $2, %eax, %xmm0
82*9880d681SAndroid Build Coastguard Worker; SSE3-NEXT:    psllw $8, %xmm0
83*9880d681SAndroid Build Coastguard Worker; SSE3-NEXT:    psraw $8, %xmm0
84*9880d681SAndroid Build Coastguard Worker; SSE3-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]
85*9880d681SAndroid Build Coastguard Worker; SSE3-NEXT:    psrad $16, %xmm0
86*9880d681SAndroid Build Coastguard Worker; SSE3-NEXT:    movd %xmm0, %eax
87*9880d681SAndroid Build Coastguard Worker; SSE3-NEXT:    pextrw $2, %xmm0, %edx
88*9880d681SAndroid Build Coastguard Worker; SSE3-NEXT:    pextrw $4, %xmm0, %ecx
89*9880d681SAndroid Build Coastguard Worker; SSE3-NEXT:    # kill: %AX<def> %AX<kill> %EAX<kill>
90*9880d681SAndroid Build Coastguard Worker; SSE3-NEXT:    # kill: %DX<def> %DX<kill> %EDX<kill>
91*9880d681SAndroid Build Coastguard Worker; SSE3-NEXT:    # kill: %CX<def> %CX<kill> %ECX<kill>
92*9880d681SAndroid Build Coastguard Worker; SSE3-NEXT:    retl
93*9880d681SAndroid Build Coastguard Worker;
94*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: sext_i8:
95*9880d681SAndroid Build Coastguard Worker; SSE41:       # BB#0:
96*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pinsrb $0, {{[0-9]+}}(%esp), %xmm0
97*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pinsrb $4, {{[0-9]+}}(%esp), %xmm0
98*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pinsrb $8, {{[0-9]+}}(%esp), %xmm0
99*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pslld $24, %xmm0
100*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    psrad $24, %xmm0
101*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    movd %xmm0, %eax
102*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pextrw $2, %xmm0, %edx
103*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    pextrw $4, %xmm0, %ecx
104*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    # kill: %AX<def> %AX<kill> %EAX<kill>
105*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    # kill: %DX<def> %DX<kill> %EDX<kill>
106*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    # kill: %CX<def> %CX<kill> %ECX<kill>
107*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT:    retl
108*9880d681SAndroid Build Coastguard Worker;
109*9880d681SAndroid Build Coastguard Worker; AVX_ANY-LABEL: sext_i8:
110*9880d681SAndroid Build Coastguard Worker; AVX_ANY:       # BB#0:
111*9880d681SAndroid Build Coastguard Worker; AVX_ANY-NEXT:    vpinsrb $0, {{[0-9]+}}(%esp), %xmm0, %xmm0
112*9880d681SAndroid Build Coastguard Worker; AVX_ANY-NEXT:    vpinsrb $4, {{[0-9]+}}(%esp), %xmm0, %xmm0
113*9880d681SAndroid Build Coastguard Worker; AVX_ANY-NEXT:    vpinsrb $8, {{[0-9]+}}(%esp), %xmm0, %xmm0
114*9880d681SAndroid Build Coastguard Worker; AVX_ANY-NEXT:    vpslld $24, %xmm0, %xmm0
115*9880d681SAndroid Build Coastguard Worker; AVX_ANY-NEXT:    vpsrad $24, %xmm0, %xmm0
116*9880d681SAndroid Build Coastguard Worker; AVX_ANY-NEXT:    vmovd %xmm0, %eax
117*9880d681SAndroid Build Coastguard Worker; AVX_ANY-NEXT:    vpextrw $2, %xmm0, %edx
118*9880d681SAndroid Build Coastguard Worker; AVX_ANY-NEXT:    vpextrw $4, %xmm0, %ecx
119*9880d681SAndroid Build Coastguard Worker; AVX_ANY-NEXT:    # kill: %AX<def> %AX<kill> %EAX<kill>
120*9880d681SAndroid Build Coastguard Worker; AVX_ANY-NEXT:    # kill: %DX<def> %DX<kill> %EDX<kill>
121*9880d681SAndroid Build Coastguard Worker; AVX_ANY-NEXT:    # kill: %CX<def> %CX<kill> %ECX<kill>
122*9880d681SAndroid Build Coastguard Worker; AVX_ANY-NEXT:    retl
123*9880d681SAndroid Build Coastguard Worker;
124*9880d681SAndroid Build Coastguard Worker; AVX_X86_64-LABEL: sext_i8:
125*9880d681SAndroid Build Coastguard Worker; AVX_X86_64:       # BB#0:
126*9880d681SAndroid Build Coastguard Worker; AVX_X86_64-NEXT:    vmovd %edi, %xmm0
127*9880d681SAndroid Build Coastguard Worker; AVX_X86_64-NEXT:    vpinsrd $1, %esi, %xmm0, %xmm0
128*9880d681SAndroid Build Coastguard Worker; AVX_X86_64-NEXT:    vpinsrd $2, %edx, %xmm0, %xmm0
129*9880d681SAndroid Build Coastguard Worker; AVX_X86_64-NEXT:    vpslld $24, %xmm0, %xmm0
130*9880d681SAndroid Build Coastguard Worker; AVX_X86_64-NEXT:    vpsrad $24, %xmm0, %xmm0
131*9880d681SAndroid Build Coastguard Worker; AVX_X86_64-NEXT:    vmovd %xmm0, %eax
132*9880d681SAndroid Build Coastguard Worker; AVX_X86_64-NEXT:    vpextrw $2, %xmm0, %edx
133*9880d681SAndroid Build Coastguard Worker; AVX_X86_64-NEXT:    vpextrw $4, %xmm0, %ecx
134*9880d681SAndroid Build Coastguard Worker; AVX_X86_64-NEXT:    # kill: %AX<def> %AX<kill> %EAX<kill>
135*9880d681SAndroid Build Coastguard Worker; AVX_X86_64-NEXT:    # kill: %DX<def> %DX<kill> %EDX<kill>
136*9880d681SAndroid Build Coastguard Worker; AVX_X86_64-NEXT:    # kill: %CX<def> %CX<kill> %ECX<kill>
137*9880d681SAndroid Build Coastguard Worker; AVX_X86_64-NEXT:    retq
138*9880d681SAndroid Build Coastguard Worker  %2 = sext <3 x i8> %0 to <3 x i16>
139*9880d681SAndroid Build Coastguard Worker  ret <3 x i16> %2
140*9880d681SAndroid Build Coastguard Worker}
141