llvm.org GIT mirror llvm / bdb4eca
[DAGCombiner] Set the right SDLoc on a newly-created sextload (6/N) This teaches tryToFoldExtOfLoad to set the right location on a newly-created extload. With that in place, the logic for performing a certain ([s|z]ext (load ...)) combine becomes identical for sexts and zexts, and we can get rid of one copy of the logic. The test case churn is due to dependencies on IROrders inherited from the wrong SDLoc. Part of: llvm.org/PR37262 Differential Revision: https://reviews.llvm.org/D46158 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@332118 91177308-0d34-0410-b5e6-96231b3b80d8 Vedant Kumar 1 year, 9 months ago
10 changed file(s) with 406 addition(s) and 339 deletion(s). Raw diff Collapse all Expand all
77817781 return {};
77827782
77837783 LoadSDNode *LN0 = cast(N0);
7784 SDValue ExtLoad =
7785 DAG.getExtLoad(ExtLoadType, DL, VT, LN0->getChain(), LN0->getBasePtr(),
7786 N0.getValueType(), LN0->getMemOperand());
7784 SDValue ExtLoad = DAG.getExtLoad(ExtLoadType, SDLoc(LN0), VT, LN0->getChain(),
7785 LN0->getBasePtr(), N0.getValueType(),
7786 LN0->getMemOperand());
77877787 Combiner.ExtendSetCCUses(SetCCs, N0, ExtLoad, DL, ExtOpc);
77887788 // If the load value is used only by N, replace it via CombineTo N.
77897789 bool NoReplaceTrunc = SDValue(LN0, 0).hasOneUse();
81308130 X, DAG.getConstant(Mask, DL, VT));
81318131 }
81328132
8133 // fold (zext (load x)) -> (zext (truncate (zextload x)))
8134 // Only generate vector extloads when 1) they're legal, and 2) they are
8135 // deemed desirable by the target.
8136 if (ISD::isNON_EXTLoad(N0.getNode()) && ISD::isUNINDEXEDLoad(N0.getNode()) &&
8137 ((!LegalOperations && !VT.isVector() &&
8138 !cast(N0)->isVolatile()) ||
8139 TLI.isLoadExtLegal(ISD::ZEXTLOAD, VT, N0.getValueType()))) {
8140 bool DoXform = true;
8141 SmallVector SetCCs;
8142 if (!N0.hasOneUse())
8143 DoXform = ExtendUsesToFormExtLoad(VT, N, N0, ISD::ZERO_EXTEND, SetCCs,
8144 TLI);
8145 if (VT.isVector())
8146 DoXform &= TLI.isVectorLoadExtDesirable(SDValue(N, 0));
8147 if (DoXform) {
8148 LoadSDNode *LN0 = cast(N0);
8149 SDValue ExtLoad = DAG.getExtLoad(ISD::ZEXTLOAD, SDLoc(LN0), VT,
8150 LN0->getChain(),
8151 LN0->getBasePtr(), N0.getValueType(),
8152 LN0->getMemOperand());
8153
8154 ExtendSetCCUses(SetCCs, N0, ExtLoad, SDLoc(N), ISD::ZERO_EXTEND);
8155 // If the load value is used only by N, replace it via CombineTo N.
8156 bool NoReplaceTrunc = SDValue(LN0, 0).hasOneUse();
8157 CombineTo(N, ExtLoad);
8158 if (NoReplaceTrunc) {
8159 DAG.ReplaceAllUsesOfValueWith(SDValue(LN0, 1), ExtLoad.getValue(1));
8160 } else {
8161 SDValue Trunc = DAG.getNode(ISD::TRUNCATE, SDLoc(N0),
8162 N0.getValueType(), ExtLoad);
8163 CombineTo(LN0, Trunc, ExtLoad.getValue(1));
8164 }
8165 return SDValue(N, 0); // Return N so it doesn't get rechecked!
8166 }
8167 }
8133 // Try to simplify (zext (load x)).
8134 if (SDValue foldedExt =
8135 tryToFoldExtOfLoad(DAG, *this, TLI, VT, LegalOperations, N, N0,
8136 SDLoc(N), ISD::ZEXTLOAD, ISD::ZERO_EXTEND))
8137 return foldedExt;
81688138
81698139 // fold (zext (load x)) to multiple smaller zextloads.
81708140 // Only on illegal but splittable vectors.
6666 ; Test sext + zext clustering.
6767 ; CHECK: ********** MI Scheduling **********
6868 ; CHECK-LABEL: ldp_half_sext_zext_int:%bb.0
69 ; CHECK: Cluster ld/st SU(4) - SU(3)
70 ; CHECK: SU(3): undef %{{[0-9]+}}.sub_32:gpr64 = LDRWui
71 ; CHECK: SU(4): %{{[0-9]+}}:gpr64 = LDRSWui
69 ; CHECK: Cluster ld/st SU(3) - SU(4)
70 ; CHECK: SU(3): %{{[0-9]+}}:gpr64 = LDRSWui
71 ; CHECK: SU(4): undef %{{[0-9]+}}.sub_32:gpr64 = LDRWui
7272 ; EXYNOSM1: ********** MI Scheduling **********
7373 ; EXYNOSM1-LABEL: ldp_half_sext_zext_int:%bb.0
74 ; EXYNOSM1: Cluster ld/st SU(4) - SU(3)
75 ; EXYNOSM1: SU(3): undef %{{[0-9]+}}.sub_32:gpr64 = LDRWui
76 ; EXYNOSM1: SU(4): %{{[0-9]+}}:gpr64 = LDRSWui
74 ; EXYNOSM1: Cluster ld/st SU(3) - SU(4)
75 ; EXYNOSM1: SU(3): %{{[0-9]+}}:gpr64 = LDRSWui
76 ; EXYNOSM1: SU(4): undef %{{[0-9]+}}.sub_32:gpr64 = LDRWui
7777 define i64 @ldp_half_sext_zext_int(i64* %q, i32* %p) nounwind {
7878 %tmp0 = load i64, i64* %q, align 4
7979 %tmp = load i32, i32* %p, align 4
19481948 ; KNL-NEXT: vpinsrb $14, 208(%rbp), %xmm3, %xmm3
19491949 ; KNL-NEXT: vpinsrb $15, 216(%rbp), %xmm3, %xmm3
19501950 ; KNL-NEXT: vinserti128 $1, %xmm3, %ymm2, %ymm2
1951 ; KNL-NEXT: movl 744(%rbp), %eax
1952 ; KNL-NEXT: andl $127, %eax
19511953 ; KNL-NEXT: vpxor %xmm3, %xmm3, %xmm3
19521954 ; KNL-NEXT: vpcmpeqb %ymm3, %ymm2, %ymm2
19531955 ; KNL-NEXT: vpternlogq $15, %zmm2, %zmm2, %zmm2
19551957 ; KNL-NEXT: vpternlogq $15, %zmm1, %zmm1, %zmm1
19561958 ; KNL-NEXT: vpcmpeqb %ymm3, %ymm0, %ymm0
19571959 ; KNL-NEXT: vpternlogq $15, %zmm0, %zmm0, %zmm0
1958 ; KNL-NEXT: movl 744(%rbp), %eax
1959 ; KNL-NEXT: andl $127, %eax
19601960 ; KNL-NEXT: cmpb $0, 736(%rbp)
19611961 ; KNL-NEXT: vmovdqa %ymm3, {{[0-9]+}}(%rsp)
19621962 ; KNL-NEXT: vmovdqa %ymm0, {{[0-9]+}}(%rsp)
21292129 ; SKX-NEXT: vpinsrb $14, 720(%rbp), %xmm2, %xmm2
21302130 ; SKX-NEXT: vpinsrb $15, 728(%rbp), %xmm2, %xmm2
21312131 ; SKX-NEXT: vinserti128 $1, %xmm2, %ymm1, %ymm1
2132 ; SKX-NEXT: movl 744(%rbp), %eax
2133 ; SKX-NEXT: andl $127, %eax
21322134 ; SKX-NEXT: vptestmb %zmm0, %zmm0, %k0
21332135 ; SKX-NEXT: vptestmb %zmm1, %zmm1, %k1
2134 ; SKX-NEXT: movl 744(%rbp), %eax
2135 ; SKX-NEXT: andl $127, %eax
21362136 ; SKX-NEXT: cmpb $0, 736(%rbp)
21372137 ; SKX-NEXT: vpmovm2b %k1, %zmm0
21382138 ; SKX-NEXT: vmovdqa64 %zmm0, {{[0-9]+}}(%rsp)
0 ; RUN: llc < %s -mtriple=x86_64-- | grep movslq | count 1
1 ; RUN: llc < %s -O0 -mtriple=x86_64-unknown-unknown -mcpu=x86-64 -stop-after livedebugvalues -o - | FileCheck %s -check-prefix=MIR
12 ; PR4050
23
3 %0 = type { i64 } ; type %0
4 %struct.S1 = type { i16, i32 }
5 @g_10 = external global %struct.S1 ; <%struct.S1*> [#uses=2]
4 %0 = type { i64 }
5 %struct.S1 = type { i16, i32 }
6
7 @g_10 = external global %struct.S1
68
79 declare void @func_28(i64, i64)
810
9 define void @int322(i32 %foo) nounwind {
11 define void @int322(i32 %foo) !dbg !5 {
1012 entry:
11 %val = load i64, i64* getelementptr (%0, %0* bitcast (%struct.S1* @g_10 to %0*), i32 0, i32 0) ; [#uses=1]
12 %0 = load i32, i32* getelementptr (%struct.S1, %struct.S1* @g_10, i32 0, i32 1), align 4 ; [#uses=1]
13 %1 = sext i32 %0 to i64 ; [#uses=1]
14 %tmp4.i = lshr i64 %val, 32 ; [#uses=1]
15 %tmp5.i = trunc i64 %tmp4.i to i32 ; [#uses=1]
16 %2 = sext i32 %tmp5.i to i64 ; [#uses=1]
17 tail call void @func_28(i64 %2, i64 %1) nounwind
18 ret void
13 %val = load i64, i64* getelementptr (%0, %0* bitcast (%struct.S1* @g_10 to %0*), i32 0, i32 0), !dbg !16
14 %0 = load i32, i32* getelementptr inbounds (%struct.S1, %struct.S1* @g_10, i32 0, i32 1), align 4, !dbg !17
15 ; MIR: renamable $rax = MOVSX64rm32 {{.*}}, @g_10 + 4,{{.*}} debug-location !17 :: (dereferenceable load 4 from `i64* getelementptr (%0, %0* bitcast (%struct.S1* @g_10 to %0*), i32 0, i32 0)` + 4)
16 %1 = sext i32 %0 to i64, !dbg !18
17 %tmp4.i = lshr i64 %val, 32, !dbg !19
18 %tmp5.i = trunc i64 %tmp4.i to i32, !dbg !20
19 %2 = sext i32 %tmp5.i to i64, !dbg !21
20 tail call void @func_28(i64 %2, i64 %1) #0, !dbg !22
21 call void @llvm.dbg.value(metadata i64 %val, metadata !8, metadata !DIExpression()), !dbg !16
22 call void @llvm.dbg.value(metadata i32 %0, metadata !10, metadata !DIExpression()), !dbg !17
23 call void @llvm.dbg.value(metadata i64 %1, metadata !12, metadata !DIExpression()), !dbg !18
24 call void @llvm.dbg.value(metadata i64 %tmp4.i, metadata !13, metadata !DIExpression()), !dbg !19
25 call void @llvm.dbg.value(metadata i32 %tmp5.i, metadata !14, metadata !DIExpression()), !dbg !20
26 call void @llvm.dbg.value(metadata i64 %2, metadata !15, metadata !DIExpression()), !dbg !21
27 ret void, !dbg !23
1928 }
29
30 declare void @llvm.dbg.value(metadata, metadata, metadata)
31
32 !llvm.dbg.cu = !{!0}
33 !llvm.debugify = !{!3, !4}
34
35 !0 = distinct !DICompileUnit(language: DW_LANG_C, file: !1, producer: "debugify", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, enums: !2)
36 !1 = !DIFile(filename: "/Users/vsk/src/llvm.org-master/llvm/test/CodeGen/X86/fold-sext-trunc.ll", directory: "/")
37 !2 = !{}
38 !3 = !{i32 8}
39 !4 = !{i32 6}
40 !5 = distinct !DISubprogram(name: "int322", linkageName: "int322", scope: null, file: !1, line: 1, type: !6, isLocal: false, isDefinition: true, scopeLine: 1, isOptimized: true, unit: !0, retainedNodes: !7)
41 !6 = !DISubroutineType(types: !2)
42 !7 = !{!8, !10, !12, !13, !14, !15}
43 !8 = !DILocalVariable(name: "1", scope: !5, file: !1, line: 1, type: !9)
44 !9 = !DIBasicType(name: "ty64", size: 64, encoding: DW_ATE_unsigned)
45 !10 = !DILocalVariable(name: "2", scope: !5, file: !1, line: 2, type: !11)
46 !11 = !DIBasicType(name: "ty32", size: 32, encoding: DW_ATE_unsigned)
47 !12 = !DILocalVariable(name: "3", scope: !5, file: !1, line: 3, type: !9)
48 !13 = !DILocalVariable(name: "4", scope: !5, file: !1, line: 4, type: !9)
49 !14 = !DILocalVariable(name: "5", scope: !5, file: !1, line: 5, type: !11)
50 !15 = !DILocalVariable(name: "6", scope: !5, file: !1, line: 6, type: !9)
51 !16 = !DILocation(line: 1, column: 1, scope: !5)
52 !17 = !DILocation(line: 2, column: 1, scope: !5)
53 !18 = !DILocation(line: 3, column: 1, scope: !5)
54 !19 = !DILocation(line: 4, column: 1, scope: !5)
55 !20 = !DILocation(line: 5, column: 1, scope: !5)
56 !21 = !DILocation(line: 6, column: 1, scope: !5)
57 !22 = !DILocation(line: 7, column: 1, scope: !5)
58 !23 = !DILocation(line: 8, column: 1, scope: !5)
59 !24 = !{i32 2, !"Debug Info Version", i32 3}
60 !llvm.module.flags = !{!24}
2424 define <4 x float> @signbits_sext_v4i64_sitofp_v4f32(i8 signext %a0, i16 signext %a1, i32 %a2, i32 %a3) nounwind {
2525 ; X32-LABEL: signbits_sext_v4i64_sitofp_v4f32:
2626 ; X32: # %bb.0:
27 ; X32-NEXT: movsbl {{[0-9]+}}(%esp), %eax
28 ; X32-NEXT: movswl {{[0-9]+}}(%esp), %ecx
29 ; X32-NEXT: vmovd %eax, %xmm0
30 ; X32-NEXT: vpinsrd $2, %ecx, %xmm0, %xmm0
27 ; X32-NEXT: movswl {{[0-9]+}}(%esp), %eax
28 ; X32-NEXT: movsbl {{[0-9]+}}(%esp), %ecx
29 ; X32-NEXT: vmovd %ecx, %xmm0
30 ; X32-NEXT: vpinsrd $2, %eax, %xmm0, %xmm0
3131 ; X32-NEXT: vmovd {{.*#+}} xmm1 = mem[0],zero,zero,zero
3232 ; X32-NEXT: vpinsrd $2, {{[0-9]+}}(%esp), %xmm1, %xmm1
3333 ; X32-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2]
269269 ; X32-LABEL: signbits_ashr_sext_sextinreg_and_extract_sitofp:
270270 ; X32: # %bb.0:
271271 ; X32-NEXT: pushl %eax
272 ; X32-NEXT: movl {{[0-9]+}}(%esp), %eax
272273 ; X32-NEXT: vmovdqa {{.*#+}} xmm2 = [0,2147483648,0,2147483648]
273274 ; X32-NEXT: vpsrlq $60, %xmm2, %xmm3
274275 ; X32-NEXT: vpsrlq $61, %xmm2, %xmm2
278279 ; X32-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm3[4,5,6,7]
279280 ; X32-NEXT: vpxor %xmm2, %xmm0, %xmm0
280281 ; X32-NEXT: vpsubq %xmm2, %xmm0, %xmm0
281 ; X32-NEXT: movl {{[0-9]+}}(%esp), %eax
282282 ; X32-NEXT: vpinsrd $0, %eax, %xmm1, %xmm1
283283 ; X32-NEXT: sarl $31, %eax
284284 ; X32-NEXT: vpinsrd $1, %eax, %xmm1, %xmm1
201201 ; 686-O0-NEXT: setne {{[0-9]+}}(%esp)
202202 ; 686-O0-NEXT: movl var_5, %ecx
203203 ; 686-O0-NEXT: movl %ecx, %edx
204 ; 686-O0-NEXT: subl $-1, %edx
204 ; 686-O0-NEXT: sarl $31, %edx
205 ; 686-O0-NEXT: movl %ecx, %esi
206 ; 686-O0-NEXT: subl $-1, %esi
205207 ; 686-O0-NEXT: sete %bl
206 ; 686-O0-NEXT: movzbl %bl, %esi
207 ; 686-O0-NEXT: movl %ecx, %edi
208 ; 686-O0-NEXT: sarl $31, %edi
208 ; 686-O0-NEXT: movzbl %bl, %edi
209209 ; 686-O0-NEXT: xorl %ebp, %ebp
210210 ; 686-O0-NEXT: addl $7093, %ecx # imm = 0x1BB5
211 ; 686-O0-NEXT: adcxl %ebp, %edi
212 ; 686-O0-NEXT: subl %esi, %ecx
213 ; 686-O0-NEXT: sbbl $0, %edi
211 ; 686-O0-NEXT: adcxl %ebp, %edx
212 ; 686-O0-NEXT: subl %edi, %ecx
213 ; 686-O0-NEXT: sbbl $0, %edx
214214 ; 686-O0-NEXT: setl %bl
215 ; 686-O0-NEXT: movzbl %bl, %esi
216 ; 686-O0-NEXT: movl %esi, var_57
215 ; 686-O0-NEXT: movzbl %bl, %edi
216 ; 686-O0-NEXT: movl %edi, var_57
217217 ; 686-O0-NEXT: movl $0, var_57+4
218 ; 686-O0-NEXT: movl var_5, %esi
219 ; 686-O0-NEXT: subl $-1, %esi
218 ; 686-O0-NEXT: movl var_5, %edi
219 ; 686-O0-NEXT: subl $-1, %edi
220220 ; 686-O0-NEXT: sete %bl
221221 ; 686-O0-NEXT: movzbl %bl, %ebp
222222 ; 686-O0-NEXT: movl %ebp, _ZN8struct_210member_2_0E
223223 ; 686-O0-NEXT: movl $0, _ZN8struct_210member_2_0E+4
224 ; 686-O0-NEXT: movl %eax, {{[0-9]+}}(%esp) # 4-byte Spill
225 ; 686-O0-NEXT: movl %ecx, {{[0-9]+}}(%esp) # 4-byte Spill
226 ; 686-O0-NEXT: movl %edx, {{[0-9]+}}(%esp) # 4-byte Spill
227 ; 686-O0-NEXT: movl %edi, {{[0-9]+}}(%esp) # 4-byte Spill
228 ; 686-O0-NEXT: movl %esi, (%esp) # 4-byte Spill
224 ; 686-O0-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
225 ; 686-O0-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
226 ; 686-O0-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
227 ; 686-O0-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
228 ; 686-O0-NEXT: movl %edi, (%esp) # 4-byte Spill
229229 ; 686-O0-NEXT: addl $24, %esp
230230 ; 686-O0-NEXT: .cfi_def_cfa_offset 20
231231 ; 686-O0-NEXT: popl %esi
243243 ; SSE2-NEXT: # kill: def $edx killed $edx def $rdx
244244 ; SSE2-NEXT: # kill: def $esi killed $esi def $rsi
245245 ; SSE2-NEXT: # kill: def $edi killed $edi def $rdi
246 ; SSE2-NEXT: movzwl {{[0-9]+}}(%rsp), %r10d
247 ; SSE2-NEXT: andl $7, %r10d
248 ; SSE2-NEXT: movzwl {{[0-9]+}}(%rsp), %eax
249 ; SSE2-NEXT: andl $7, %eax
246250 ; SSE2-NEXT: andl $7, %edi
247251 ; SSE2-NEXT: andl $7, %esi
248252 ; SSE2-NEXT: andl $7, %edx
250254 ; SSE2-NEXT: andl $7, %r8d
251255 ; SSE2-NEXT: movaps %xmm0, -{{[0-9]+}}(%rsp)
252256 ; SSE2-NEXT: andl $7, %r9d
253 ; SSE2-NEXT: movzwl {{[0-9]+}}(%rsp), %r10d
254 ; SSE2-NEXT: andl $7, %r10d
255 ; SSE2-NEXT: movzwl {{[0-9]+}}(%rsp), %eax
256 ; SSE2-NEXT: andl $7, %eax
257257 ; SSE2-NEXT: movzwl -24(%rsp,%rcx,2), %ecx
258258 ; SSE2-NEXT: movd %ecx, %xmm0
259259 ; SSE2-NEXT: movzwl -24(%rsp,%rdx,2), %ecx
287287 ; SSSE3-NEXT: # kill: def $edx killed $edx def $rdx
288288 ; SSSE3-NEXT: # kill: def $esi killed $esi def $rsi
289289 ; SSSE3-NEXT: # kill: def $edi killed $edi def $rdi
290 ; SSSE3-NEXT: movzwl {{[0-9]+}}(%rsp), %r10d
291 ; SSSE3-NEXT: andl $7, %r10d
292 ; SSSE3-NEXT: movzwl {{[0-9]+}}(%rsp), %eax
293 ; SSSE3-NEXT: andl $7, %eax
290294 ; SSSE3-NEXT: andl $7, %edi
291295 ; SSSE3-NEXT: andl $7, %esi
292296 ; SSSE3-NEXT: andl $7, %edx
294298 ; SSSE3-NEXT: andl $7, %r8d
295299 ; SSSE3-NEXT: movaps %xmm0, -{{[0-9]+}}(%rsp)
296300 ; SSSE3-NEXT: andl $7, %r9d
297 ; SSSE3-NEXT: movzwl {{[0-9]+}}(%rsp), %r10d
298 ; SSSE3-NEXT: andl $7, %r10d
299 ; SSSE3-NEXT: movzwl {{[0-9]+}}(%rsp), %eax
300 ; SSSE3-NEXT: andl $7, %eax
301301 ; SSSE3-NEXT: movzwl -24(%rsp,%rcx,2), %ecx
302302 ; SSSE3-NEXT: movd %ecx, %xmm0
303303 ; SSSE3-NEXT: movzwl -24(%rsp,%rdx,2), %ecx
331331 ; SSE41-NEXT: # kill: def $edx killed $edx def $rdx
332332 ; SSE41-NEXT: # kill: def $esi killed $esi def $rsi
333333 ; SSE41-NEXT: # kill: def $edi killed $edi def $rdi
334 ; SSE41-NEXT: movzwl {{[0-9]+}}(%rsp), %r10d
335 ; SSE41-NEXT: andl $7, %r10d
336 ; SSE41-NEXT: movzwl {{[0-9]+}}(%rsp), %eax
337 ; SSE41-NEXT: andl $7, %eax
334338 ; SSE41-NEXT: andl $7, %edi
335339 ; SSE41-NEXT: andl $7, %esi
336340 ; SSE41-NEXT: andl $7, %edx
338342 ; SSE41-NEXT: andl $7, %r8d
339343 ; SSE41-NEXT: movaps %xmm0, -{{[0-9]+}}(%rsp)
340344 ; SSE41-NEXT: andl $7, %r9d
341 ; SSE41-NEXT: movzwl {{[0-9]+}}(%rsp), %r10d
342 ; SSE41-NEXT: andl $7, %r10d
343 ; SSE41-NEXT: movzwl {{[0-9]+}}(%rsp), %eax
344 ; SSE41-NEXT: andl $7, %eax
345345 ; SSE41-NEXT: movzwl -24(%rsp,%rdi,2), %edi
346346 ; SSE41-NEXT: movd %edi, %xmm0
347347 ; SSE41-NEXT: pinsrw $1, -24(%rsp,%rsi,2), %xmm0
349349 ; SSE41-NEXT: pinsrw $3, -24(%rsp,%rcx,2), %xmm0
350350 ; SSE41-NEXT: pinsrw $4, -24(%rsp,%r8,2), %xmm0
351351 ; SSE41-NEXT: pinsrw $5, -24(%rsp,%r9,2), %xmm0
352 ; SSE41-NEXT: pinsrw $6, -24(%rsp,%r10,2), %xmm0
353 ; SSE41-NEXT: pinsrw $7, -24(%rsp,%rax,2), %xmm0
352 ; SSE41-NEXT: pinsrw $6, -24(%rsp,%rax,2), %xmm0
353 ; SSE41-NEXT: pinsrw $7, -24(%rsp,%r10,2), %xmm0
354354 ; SSE41-NEXT: retq
355355 ;
356356 ; AVX-LABEL: var_shuffle_v8i16_v8i16_xxxxxxxx_i16:
361361 ; AVX-NEXT: # kill: def $edx killed $edx def $rdx
362362 ; AVX-NEXT: # kill: def $esi killed $esi def $rsi
363363 ; AVX-NEXT: # kill: def $edi killed $edi def $rdi
364 ; AVX-NEXT: movzwl {{[0-9]+}}(%rsp), %r10d
365 ; AVX-NEXT: andl $7, %r10d
366 ; AVX-NEXT: movzwl {{[0-9]+}}(%rsp), %eax
367 ; AVX-NEXT: andl $7, %eax
364368 ; AVX-NEXT: andl $7, %edi
365369 ; AVX-NEXT: andl $7, %esi
366370 ; AVX-NEXT: andl $7, %edx
368372 ; AVX-NEXT: andl $7, %r8d
369373 ; AVX-NEXT: vmovaps %xmm0, -{{[0-9]+}}(%rsp)
370374 ; AVX-NEXT: andl $7, %r9d
371 ; AVX-NEXT: movzwl {{[0-9]+}}(%rsp), %r10d
372 ; AVX-NEXT: andl $7, %r10d
373 ; AVX-NEXT: movzwl {{[0-9]+}}(%rsp), %eax
374 ; AVX-NEXT: andl $7, %eax
375375 ; AVX-NEXT: movzwl -24(%rsp,%rdi,2), %edi
376376 ; AVX-NEXT: vmovd %edi, %xmm0
377377 ; AVX-NEXT: vpinsrw $1, -24(%rsp,%rsi,2), %xmm0, %xmm0
379379 ; AVX-NEXT: vpinsrw $3, -24(%rsp,%rcx,2), %xmm0, %xmm0
380380 ; AVX-NEXT: vpinsrw $4, -24(%rsp,%r8,2), %xmm0, %xmm0
381381 ; AVX-NEXT: vpinsrw $5, -24(%rsp,%r9,2), %xmm0, %xmm0
382 ; AVX-NEXT: vpinsrw $6, -24(%rsp,%r10,2), %xmm0, %xmm0
383 ; AVX-NEXT: vpinsrw $7, -24(%rsp,%rax,2), %xmm0, %xmm0
382 ; AVX-NEXT: vpinsrw $6, -24(%rsp,%rax,2), %xmm0, %xmm0
383 ; AVX-NEXT: vpinsrw $7, -24(%rsp,%r10,2), %xmm0, %xmm0
384384 ; AVX-NEXT: retq
385385 %x0 = extractelement <8 x i16> %x, i16 %i0
386386 %x1 = extractelement <8 x i16> %x, i16 %i1
410410 ; SSE2-NEXT: # kill: def $edx killed $edx def $rdx
411411 ; SSE2-NEXT: # kill: def $esi killed $esi def $rsi
412412 ; SSE2-NEXT: # kill: def $edi killed $edi def $rdi
413 ; SSE2-NEXT: movaps %xmm0, -{{[0-9]+}}(%rsp)
414413 ; SSE2-NEXT: movzbl {{[0-9]+}}(%rsp), %eax
415414 ; SSE2-NEXT: andl $15, %eax
415 ; SSE2-NEXT: movaps %xmm0, -{{[0-9]+}}(%rsp)
416416 ; SSE2-NEXT: movzbl -24(%rsp,%rax), %eax
417417 ; SSE2-NEXT: movd %eax, %xmm8
418418 ; SSE2-NEXT: movzbl {{[0-9]+}}(%rsp), %eax
494494 ; SSSE3-NEXT: # kill: def $edx killed $edx def $rdx
495495 ; SSSE3-NEXT: # kill: def $esi killed $esi def $rsi
496496 ; SSSE3-NEXT: # kill: def $edi killed $edi def $rdi
497 ; SSSE3-NEXT: movaps %xmm0, -{{[0-9]+}}(%rsp)
498497 ; SSSE3-NEXT: movzbl {{[0-9]+}}(%rsp), %eax
499498 ; SSSE3-NEXT: andl $15, %eax
499 ; SSSE3-NEXT: movaps %xmm0, -{{[0-9]+}}(%rsp)
500500 ; SSSE3-NEXT: movzbl -24(%rsp,%rax), %eax
501501 ; SSSE3-NEXT: movd %eax, %xmm8
502502 ; SSSE3-NEXT: movzbl {{[0-9]+}}(%rsp), %eax
722722 ; SSE2-NEXT: movl (%rdi), %eax
723723 ; SSE2-NEXT: movl 4(%rdi), %ecx
724724 ; SSE2-NEXT: andl $3, %eax
725 ; SSE2-NEXT: movaps %xmm0, -{{[0-9]+}}(%rsp)
726725 ; SSE2-NEXT: andl $3, %ecx
727726 ; SSE2-NEXT: movl 8(%rdi), %edx
728727 ; SSE2-NEXT: andl $3, %edx
729728 ; SSE2-NEXT: movl 12(%rdi), %esi
730729 ; SSE2-NEXT: andl $3, %esi
730 ; SSE2-NEXT: movaps %xmm0, -{{[0-9]+}}(%rsp)
731731 ; SSE2-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
732732 ; SSE2-NEXT: movss {{.*#+}} xmm1 = mem[0],zero,zero,zero
733733 ; SSE2-NEXT: unpcklps {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
742742 ; SSSE3-NEXT: movl (%rdi), %eax
743743 ; SSSE3-NEXT: movl 4(%rdi), %ecx
744744 ; SSSE3-NEXT: andl $3, %eax
745 ; SSSE3-NEXT: movaps %xmm0, -{{[0-9]+}}(%rsp)
746745 ; SSSE3-NEXT: andl $3, %ecx
747746 ; SSSE3-NEXT: movl 8(%rdi), %edx
748747 ; SSSE3-NEXT: andl $3, %edx
749748 ; SSSE3-NEXT: movl 12(%rdi), %esi
750749 ; SSSE3-NEXT: andl $3, %esi
750 ; SSSE3-NEXT: movaps %xmm0, -{{[0-9]+}}(%rsp)
751751 ; SSSE3-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
752752 ; SSSE3-NEXT: movss {{.*#+}} xmm1 = mem[0],zero,zero,zero
753753 ; SSSE3-NEXT: unpcklps {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
762762 ; SSE41-NEXT: movl (%rdi), %eax
763763 ; SSE41-NEXT: movl 4(%rdi), %ecx
764764 ; SSE41-NEXT: andl $3, %eax
765 ; SSE41-NEXT: movaps %xmm0, -{{[0-9]+}}(%rsp)
766765 ; SSE41-NEXT: andl $3, %ecx
767766 ; SSE41-NEXT: movl 8(%rdi), %edx
768767 ; SSE41-NEXT: andl $3, %edx
769768 ; SSE41-NEXT: movl 12(%rdi), %esi
770769 ; SSE41-NEXT: andl $3, %esi
770 ; SSE41-NEXT: movaps %xmm0, -{{[0-9]+}}(%rsp)
771771 ; SSE41-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
772772 ; SSE41-NEXT: pinsrd $1, -24(%rsp,%rcx,4), %xmm0
773773 ; SSE41-NEXT: pinsrd $2, -24(%rsp,%rdx,4), %xmm0
779779 ; AVX-NEXT: movl (%rdi), %eax
780780 ; AVX-NEXT: movl 4(%rdi), %ecx
781781 ; AVX-NEXT: andl $3, %eax
782 ; AVX-NEXT: vmovaps %xmm0, -{{[0-9]+}}(%rsp)
783782 ; AVX-NEXT: andl $3, %ecx
784783 ; AVX-NEXT: movl 8(%rdi), %edx
785784 ; AVX-NEXT: andl $3, %edx
786785 ; AVX-NEXT: movl 12(%rdi), %esi
787786 ; AVX-NEXT: andl $3, %esi
787 ; AVX-NEXT: vmovaps %xmm0, -{{[0-9]+}}(%rsp)
788788 ; AVX-NEXT: vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero
789789 ; AVX-NEXT: vpinsrd $1, -24(%rsp,%rcx,4), %xmm0, %xmm0
790790 ; AVX-NEXT: vpinsrd $2, -24(%rsp,%rdx,4), %xmm0, %xmm0
812812 define <16 x i8> @mem_shuffle_v16i8_v16i8_xxxxxxxxxxxxxxxx_i8(<16 x i8> %x, i8* %i) nounwind {
813813 ; SSE2-LABEL: mem_shuffle_v16i8_v16i8_xxxxxxxxxxxxxxxx_i8:
814814 ; SSE2: # %bb.0:
815 ; SSE2-NEXT: pushq %rbp
816 ; SSE2-NEXT: pushq %r15
817 ; SSE2-NEXT: pushq %r14
818 ; SSE2-NEXT: pushq %r13
819 ; SSE2-NEXT: pushq %r12
820 ; SSE2-NEXT: pushq %rbx
815821 ; SSE2-NEXT: movzbl (%rdi), %eax
822 ; SSE2-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
823 ; SSE2-NEXT: movzbl 1(%rdi), %r9d
824 ; SSE2-NEXT: movzbl 2(%rdi), %r10d
825 ; SSE2-NEXT: movzbl 3(%rdi), %r11d
826 ; SSE2-NEXT: movzbl 4(%rdi), %r14d
827 ; SSE2-NEXT: movzbl 5(%rdi), %r15d
828 ; SSE2-NEXT: movzbl 6(%rdi), %r12d
829 ; SSE2-NEXT: movzbl 7(%rdi), %r13d
830 ; SSE2-NEXT: movzbl 8(%rdi), %ebx
831 ; SSE2-NEXT: movzbl 9(%rdi), %r8d
832 ; SSE2-NEXT: movzbl 10(%rdi), %ecx
833 ; SSE2-NEXT: movzbl 11(%rdi), %edx
834 ; SSE2-NEXT: movzbl 12(%rdi), %esi
835 ; SSE2-NEXT: movzbl 13(%rdi), %ebp
836 ; SSE2-NEXT: movzbl 14(%rdi), %eax
837 ; SSE2-NEXT: movzbl 15(%rdi), %edi
838 ; SSE2-NEXT: andl $15, %edi
816839 ; SSE2-NEXT: movaps %xmm0, -{{[0-9]+}}(%rsp)
817 ; SSE2-NEXT: movzbl 15(%rdi), %ecx
840 ; SSE2-NEXT: movzbl -24(%rsp,%rdi), %edi
841 ; SSE2-NEXT: movd %edi, %xmm8
842 ; SSE2-NEXT: andl $15, %eax
843 ; SSE2-NEXT: movzbl -24(%rsp,%rax), %eax
844 ; SSE2-NEXT: movd %eax, %xmm15
845 ; SSE2-NEXT: andl $15, %ebp
846 ; SSE2-NEXT: movzbl -24(%rsp,%rbp), %eax
847 ; SSE2-NEXT: movd %eax, %xmm9
848 ; SSE2-NEXT: andl $15, %esi
849 ; SSE2-NEXT: movzbl -24(%rsp,%rsi), %eax
850 ; SSE2-NEXT: movd %eax, %xmm3
851 ; SSE2-NEXT: andl $15, %edx
852 ; SSE2-NEXT: movzbl -24(%rsp,%rdx), %eax
853 ; SSE2-NEXT: movd %eax, %xmm10
818854 ; SSE2-NEXT: andl $15, %ecx
819 ; SSE2-NEXT: movzbl -24(%rsp,%rcx), %ecx
820 ; SSE2-NEXT: movd %ecx, %xmm8
821 ; SSE2-NEXT: movzbl 14(%rdi), %ecx
822 ; SSE2-NEXT: andl $15, %ecx
823 ; SSE2-NEXT: movzbl -24(%rsp,%rcx), %ecx
824 ; SSE2-NEXT: movd %ecx, %xmm15
825 ; SSE2-NEXT: movzbl 13(%rdi), %ecx
826 ; SSE2-NEXT: andl $15, %ecx
827 ; SSE2-NEXT: movzbl -24(%rsp,%rcx), %ecx
828 ; SSE2-NEXT: movd %ecx, %xmm9
829 ; SSE2-NEXT: movzbl 12(%rdi), %ecx
830 ; SSE2-NEXT: andl $15, %ecx
831 ; SSE2-NEXT: movzbl -24(%rsp,%rcx), %ecx
832 ; SSE2-NEXT: movd %ecx, %xmm3
833 ; SSE2-NEXT: movzbl 11(%rdi), %ecx
834 ; SSE2-NEXT: andl $15, %ecx
835 ; SSE2-NEXT: movzbl -24(%rsp,%rcx), %ecx
836 ; SSE2-NEXT: movd %ecx, %xmm10
837 ; SSE2-NEXT: movzbl 10(%rdi), %ecx
838 ; SSE2-NEXT: andl $15, %ecx
839 ; SSE2-NEXT: movzbl -24(%rsp,%rcx), %ecx
840 ; SSE2-NEXT: movd %ecx, %xmm7
841 ; SSE2-NEXT: movzbl 9(%rdi), %ecx
842 ; SSE2-NEXT: andl $15, %ecx
843 ; SSE2-NEXT: movzbl -24(%rsp,%rcx), %ecx
844 ; SSE2-NEXT: movd %ecx, %xmm11
845 ; SSE2-NEXT: movzbl 8(%rdi), %ecx
846 ; SSE2-NEXT: andl $15, %ecx
847 ; SSE2-NEXT: movzbl -24(%rsp,%rcx), %ecx
848 ; SSE2-NEXT: movd %ecx, %xmm6
849 ; SSE2-NEXT: movzbl 7(%rdi), %ecx
850 ; SSE2-NEXT: andl $15, %ecx
851 ; SSE2-NEXT: movzbl -24(%rsp,%rcx), %ecx
852 ; SSE2-NEXT: movd %ecx, %xmm12
853 ; SSE2-NEXT: movzbl 6(%rdi), %ecx
854 ; SSE2-NEXT: andl $15, %ecx
855 ; SSE2-NEXT: movzbl -24(%rsp,%rcx), %ecx
856 ; SSE2-NEXT: movd %ecx, %xmm5
857 ; SSE2-NEXT: movzbl 5(%rdi), %ecx
858 ; SSE2-NEXT: andl $15, %ecx
859 ; SSE2-NEXT: movzbl -24(%rsp,%rcx), %ecx
860 ; SSE2-NEXT: movd %ecx, %xmm13
861 ; SSE2-NEXT: movzbl 4(%rdi), %ecx
862 ; SSE2-NEXT: andl $15, %ecx
863 ; SSE2-NEXT: movzbl -24(%rsp,%rcx), %ecx
864 ; SSE2-NEXT: movd %ecx, %xmm4
865 ; SSE2-NEXT: movzbl 3(%rdi), %ecx
866 ; SSE2-NEXT: andl $15, %ecx
867 ; SSE2-NEXT: movzbl -24(%rsp,%rcx), %ecx
868 ; SSE2-NEXT: movd %ecx, %xmm14
869 ; SSE2-NEXT: movzbl 2(%rdi), %ecx
870 ; SSE2-NEXT: andl $15, %ecx
871 ; SSE2-NEXT: movzbl -24(%rsp,%rcx), %ecx
872 ; SSE2-NEXT: movd %ecx, %xmm1
873 ; SSE2-NEXT: movzbl 1(%rdi), %ecx
874 ; SSE2-NEXT: andl $15, %ecx
875 ; SSE2-NEXT: movzbl -24(%rsp,%rcx), %ecx
876 ; SSE2-NEXT: movd %ecx, %xmm2
855 ; SSE2-NEXT: movzbl -24(%rsp,%rcx), %eax
856 ; SSE2-NEXT: movd %eax, %xmm7
857 ; SSE2-NEXT: andl $15, %r8d
858 ; SSE2-NEXT: movzbl -24(%rsp,%r8), %eax
859 ; SSE2-NEXT: movd %eax, %xmm11
860 ; SSE2-NEXT: andl $15, %ebx
861 ; SSE2-NEXT: movzbl -24(%rsp,%rbx), %eax
862 ; SSE2-NEXT: movd %eax, %xmm6
863 ; SSE2-NEXT: andl $15, %r13d
864 ; SSE2-NEXT: movzbl -24(%rsp,%r13), %eax
865 ; SSE2-NEXT: movd %eax, %xmm12
866 ; SSE2-NEXT: andl $15, %r12d
867 ; SSE2-NEXT: movzbl -24(%rsp,%r12), %eax
868 ; SSE2-NEXT: movd %eax, %xmm5
869 ; SSE2-NEXT: andl $15, %r15d
870 ; SSE2-NEXT: movzbl -24(%rsp,%r15), %eax
871 ; SSE2-NEXT: movd %eax, %xmm13
872 ; SSE2-NEXT: andl $15, %r14d
873 ; SSE2-NEXT: movzbl -24(%rsp,%r14), %eax
874 ; SSE2-NEXT: movd %eax, %xmm4
875 ; SSE2-NEXT: andl $15, %r11d
876 ; SSE2-NEXT: movzbl -24(%rsp,%r11), %eax
877 ; SSE2-NEXT: movd %eax, %xmm14
878 ; SSE2-NEXT: andl $15, %r10d
879 ; SSE2-NEXT: movzbl -24(%rsp,%r10), %eax
880 ; SSE2-NEXT: movd %eax, %xmm1
881 ; SSE2-NEXT: andl $15, %r9d
882 ; SSE2-NEXT: movzbl -24(%rsp,%r9), %eax
883 ; SSE2-NEXT: movd %eax, %xmm2
884 ; SSE2-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
877885 ; SSE2-NEXT: andl $15, %eax
878886 ; SSE2-NEXT: movzbl -24(%rsp,%rax), %eax
879887 ; SSE2-NEXT: movd %eax, %xmm0
892900 ; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
893901 ; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm4[0],xmm0[1],xmm4[1]
894902 ; SSE2-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm6[0]
903 ; SSE2-NEXT: popq %rbx
904 ; SSE2-NEXT: popq %r12
905 ; SSE2-NEXT: popq %r13
906 ; SSE2-NEXT: popq %r14
907 ; SSE2-NEXT: popq %r15
908 ; SSE2-NEXT: popq %rbp
895909 ; SSE2-NEXT: retq
896910 ;
897911 ; SSSE3-LABEL: mem_shuffle_v16i8_v16i8_xxxxxxxxxxxxxxxx_i8:
898912 ; SSSE3: # %bb.0:
913 ; SSSE3-NEXT: pushq %rbp
914 ; SSSE3-NEXT: pushq %r15
915 ; SSSE3-NEXT: pushq %r14
916 ; SSSE3-NEXT: pushq %r13
917 ; SSSE3-NEXT: pushq %r12
918 ; SSSE3-NEXT: pushq %rbx
899919 ; SSSE3-NEXT: movzbl (%rdi), %eax
920 ; SSSE3-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
921 ; SSSE3-NEXT: movzbl 1(%rdi), %r9d
922 ; SSSE3-NEXT: movzbl 2(%rdi), %r10d
923 ; SSSE3-NEXT: movzbl 3(%rdi), %r11d
924 ; SSSE3-NEXT: movzbl 4(%rdi), %r14d
925 ; SSSE3-NEXT: movzbl 5(%rdi), %r15d
926 ; SSSE3-NEXT: movzbl 6(%rdi), %r12d
927 ; SSSE3-NEXT: movzbl 7(%rdi), %r13d
928 ; SSSE3-NEXT: movzbl 8(%rdi), %ebx
929 ; SSSE3-NEXT: movzbl 9(%rdi), %r8d
930 ; SSSE3-NEXT: movzbl 10(%rdi), %ecx
931 ; SSSE3-NEXT: movzbl 11(%rdi), %edx
932 ; SSSE3-NEXT: movzbl 12(%rdi), %esi
933 ; SSSE3-NEXT: movzbl 13(%rdi), %ebp
934 ; SSSE3-NEXT: movzbl 14(%rdi), %eax
935 ; SSSE3-NEXT: movzbl 15(%rdi), %edi
936 ; SSSE3-NEXT: andl $15, %edi
900937 ; SSSE3-NEXT: movaps %xmm0, -{{[0-9]+}}(%rsp)
901 ; SSSE3-NEXT: movzbl 15(%rdi), %ecx
938 ; SSSE3-NEXT: movzbl -24(%rsp,%rdi), %edi
939 ; SSSE3-NEXT: movd %edi, %xmm8
940 ; SSSE3-NEXT: andl $15, %eax
941 ; SSSE3-NEXT: movzbl -24(%rsp,%rax), %eax
942 ; SSSE3-NEXT: movd %eax, %xmm15
943 ; SSSE3-NEXT: andl $15, %ebp
944 ; SSSE3-NEXT: movzbl -24(%rsp,%rbp), %eax
945 ; SSSE3-NEXT: movd %eax, %xmm9
946 ; SSSE3-NEXT: andl $15, %esi
947 ; SSSE3-NEXT: movzbl -24(%rsp,%rsi), %eax
948 ; SSSE3-NEXT: movd %eax, %xmm3
949 ; SSSE3-NEXT: andl $15, %edx
950 ; SSSE3-NEXT: movzbl -24(%rsp,%rdx), %eax
951 ; SSSE3-NEXT: movd %eax, %xmm10
902952 ; SSSE3-NEXT: andl $15, %ecx
903 ; SSSE3-NEXT: movzbl -24(%rsp,%rcx), %ecx
904 ; SSSE3-NEXT: movd %ecx, %xmm8
905 ; SSSE3-NEXT: movzbl 14(%rdi), %ecx
906 ; SSSE3-NEXT: andl $15, %ecx
907 ; SSSE3-NEXT: movzbl -24(%rsp,%rcx), %ecx
908 ; SSSE3-NEXT: movd %ecx, %xmm15
909 ; SSSE3-NEXT: movzbl 13(%rdi), %ecx
910 ; SSSE3-NEXT: andl $15, %ecx
911 ; SSSE3-NEXT: movzbl -24(%rsp,%rcx), %ecx
912 ; SSSE3-NEXT: movd %ecx, %xmm9
913 ; SSSE3-NEXT: movzbl 12(%rdi), %ecx
914 ; SSSE3-NEXT: andl $15, %ecx
915 ; SSSE3-NEXT: movzbl -24(%rsp,%rcx), %ecx
916 ; SSSE3-NEXT: movd %ecx, %xmm3
917 ; SSSE3-NEXT: movzbl 11(%rdi), %ecx
918 ; SSSE3-NEXT: andl $15, %ecx
919 ; SSSE3-NEXT: movzbl -24(%rsp,%rcx), %ecx
920 ; SSSE3-NEXT: movd %ecx, %xmm10
921 ; SSSE3-NEXT: movzbl 10(%rdi), %ecx
922 ; SSSE3-NEXT: andl $15, %ecx
923 ; SSSE3-NEXT: movzbl -24(%rsp,%rcx), %ecx
924 ; SSSE3-NEXT: movd %ecx, %xmm7
925 ; SSSE3-NEXT: movzbl 9(%rdi), %ecx
926 ; SSSE3-NEXT: andl $15, %ecx
927 ; SSSE3-NEXT: movzbl -24(%rsp,%rcx), %ecx
928 ; SSSE3-NEXT: movd %ecx, %xmm11
929 ; SSSE3-NEXT: movzbl 8(%rdi), %ecx
930 ; SSSE3-NEXT: andl $15, %ecx
931 ; SSSE3-NEXT: movzbl -24(%rsp,%rcx), %ecx
932 ; SSSE3-NEXT: movd %ecx, %xmm6
933 ; SSSE3-NEXT: movzbl 7(%rdi), %ecx
934 ; SSSE3-NEXT: andl $15, %ecx
935 ; SSSE3-NEXT: movzbl -24(%rsp,%rcx), %ecx
936 ; SSSE3-NEXT: movd %ecx, %xmm12
937 ; SSSE3-NEXT: movzbl 6(%rdi), %ecx
938 ; SSSE3-NEXT: andl $15, %ecx
939 ; SSSE3-NEXT: movzbl -24(%rsp,%rcx), %ecx
940 ; SSSE3-NEXT: movd %ecx, %xmm5
941 ; SSSE3-NEXT: movzbl 5(%rdi), %ecx
942 ; SSSE3-NEXT: andl $15, %ecx
943 ; SSSE3-NEXT: movzbl -24(%rsp,%rcx), %ecx
944 ; SSSE3-NEXT: movd %ecx, %xmm13
945 ; SSSE3-NEXT: movzbl 4(%rdi), %ecx
946 ; SSSE3-NEXT: andl $15, %ecx
947 ; SSSE3-NEXT: movzbl -24(%rsp,%rcx), %ecx
948 ; SSSE3-NEXT: movd %ecx, %xmm4
949 ; SSSE3-NEXT: movzbl 3(%rdi), %ecx
950 ; SSSE3-NEXT: andl $15, %ecx
951 ; SSSE3-NEXT: movzbl -24(%rsp,%rcx), %ecx
952 ; SSSE3-NEXT: movd %ecx, %xmm14
953 ; SSSE3-NEXT: movzbl 2(%rdi), %ecx
954 ; SSSE3-NEXT: andl $15, %ecx
955 ; SSSE3-NEXT: movzbl -24(%rsp,%rcx), %ecx
956 ; SSSE3-NEXT: movd %ecx, %xmm1
957 ; SSSE3-NEXT: movzbl 1(%rdi), %ecx
958 ; SSSE3-NEXT: andl $15, %ecx
959 ; SSSE3-NEXT: movzbl -24(%rsp,%rcx), %ecx
960 ; SSSE3-NEXT: movd %ecx, %xmm2
953 ; SSSE3-NEXT: movzbl -24(%rsp,%rcx), %eax
954 ; SSSE3-NEXT: movd %eax, %xmm7
955 ; SSSE3-NEXT: andl $15, %r8d
956 ; SSSE3-NEXT: movzbl -24(%rsp,%r8), %eax
957 ; SSSE3-NEXT: movd %eax, %xmm11
958 ; SSSE3-NEXT: andl $15, %ebx
959 ; SSSE3-NEXT: movzbl -24(%rsp,%rbx), %eax
960 ; SSSE3-NEXT: movd %eax, %xmm6
961 ; SSSE3-NEXT: andl $15, %r13d
962 ; SSSE3-NEXT: movzbl -24(%rsp,%r13), %eax
963 ; SSSE3-NEXT: movd %eax, %xmm12
964 ; SSSE3-NEXT: andl $15, %r12d
965 ; SSSE3-NEXT: movzbl -24(%rsp,%r12), %eax
966 ; SSSE3-NEXT: movd %eax, %xmm5
967 ; SSSE3-NEXT: andl $15, %r15d
968 ; SSSE3-NEXT: movzbl -24(%rsp,%r15), %eax
969 ; SSSE3-NEXT: movd %eax, %xmm13
970 ; SSSE3-NEXT: andl $15, %r14d
971 ; SSSE3-NEXT: movzbl -24(%rsp,%r14), %eax
972 ; SSSE3-NEXT: movd %eax, %xmm4
973 ; SSSE3-NEXT: andl $15, %r11d
974 ; SSSE3-NEXT: movzbl -24(%rsp,%r11), %eax
975 ; SSSE3-NEXT: movd %eax, %xmm14
976 ; SSSE3-NEXT: andl $15, %r10d
977 ; SSSE3-NEXT: movzbl -24(%rsp,%r10), %eax
978 ; SSSE3-NEXT: movd %eax, %xmm1
979 ; SSSE3-NEXT: andl $15, %r9d
980 ; SSSE3-NEXT: movzbl -24(%rsp,%r9), %eax
981 ; SSSE3-NEXT: movd %eax, %xmm2
982 ; SSSE3-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rax # 8-byte Reload
961983 ; SSSE3-NEXT: andl $15, %eax
962984 ; SSSE3-NEXT: movzbl -24(%rsp,%rax), %eax
963985 ; SSSE3-NEXT: movd %eax, %xmm0
976998 ; SSSE3-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
977999 ; SSSE3-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm4[0],xmm0[1],xmm4[1]
9781000 ; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm6[0]
1001 ; SSSE3-NEXT: popq %rbx
1002 ; SSSE3-NEXT: popq %r12
1003 ; SSSE3-NEXT: popq %r13
1004 ; SSSE3-NEXT: popq %r14
1005 ; SSSE3-NEXT: popq %r15
1006 ; SSSE3-NEXT: popq %rbp
9791007 ; SSSE3-NEXT: retq
9801008 ;
9811009 ; SSE41-LABEL: mem_shuffle_v16i8_v16i8_xxxxxxxxxxxxxxxx_i8:
9821010 ; SSE41: # %bb.0:
983 ; SSE41-NEXT: movzbl (%rdi), %eax
984 ; SSE41-NEXT: andl $15, %eax
1011 ; SSE41-NEXT: pushq %rbp
1012 ; SSE41-NEXT: pushq %r15
1013 ; SSE41-NEXT: pushq %r14
1014 ; SSE41-NEXT: pushq %r13
1015 ; SSE41-NEXT: pushq %r12
1016 ; SSE41-NEXT: pushq %rbx
1017 ; SSE41-NEXT: movzbl (%rdi), %r9d
1018 ; SSE41-NEXT: andl $15, %r9d
1019 ; SSE41-NEXT: movzbl 1(%rdi), %ebx
1020 ; SSE41-NEXT: movzbl 2(%rdi), %eax
1021 ; SSE41-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
1022 ; SSE41-NEXT: movzbl 3(%rdi), %r11d
1023 ; SSE41-NEXT: movzbl 4(%rdi), %r14d
1024 ; SSE41-NEXT: movzbl 5(%rdi), %r15d
1025 ; SSE41-NEXT: movzbl 6(%rdi), %r12d
1026 ; SSE41-NEXT: movzbl 7(%rdi), %r13d
1027 ; SSE41-NEXT: movzbl 8(%rdi), %r10d
1028 ; SSE41-NEXT: movzbl 9(%rdi), %r8d
1029 ; SSE41-NEXT: movzbl 10(%rdi), %ecx
1030 ; SSE41-NEXT: movzbl 11(%rdi), %edx
1031 ; SSE41-NEXT: movzbl 12(%rdi), %esi
1032 ; SSE41-NEXT: movzbl 13(%rdi), %ebp
1033 ; SSE41-NEXT: movzbl 14(%rdi), %eax
1034 ; SSE41-NEXT: movzbl 15(%rdi), %edi
9851035 ; SSE41-NEXT: movaps %xmm0, -{{[0-9]+}}(%rsp)
986 ; SSE41-NEXT: movzbl -24(%rsp,%rax), %eax
987 ; SSE41-NEXT: movd %eax, %xmm0
988 ; SSE41-NEXT: movzbl 1(%rdi), %eax
989 ; SSE41-NEXT: andl $15, %eax
990 ; SSE41-NEXT: pinsrb $1, -24(%rsp,%rax), %xmm0
991 ; SSE41-NEXT: movzbl 2(%rdi), %eax
992 ; SSE41-NEXT: andl $15, %eax
993 ; SSE41-NEXT: pinsrb $2, -24(%rsp,%rax), %xmm0
994 ; SSE41-NEXT: movzbl 3(%rdi), %eax
995 ; SSE41-NEXT: andl $15, %eax
996 ; SSE41-NEXT: pinsrb $3, -24(%rsp,%rax), %xmm0
997 ; SSE41-NEXT: movzbl 4(%rdi), %eax
998 ; SSE41-NEXT: andl $15, %eax
999 ; SSE41-NEXT: pinsrb $4, -24(%rsp,%rax), %xmm0
1000 ; SSE41-NEXT: movzbl 5(%rdi), %eax
1001 ; SSE41-NEXT: andl $15, %eax
1002 ; SSE41-NEXT: pinsrb $5, -24(%rsp,%rax), %xmm0
1003 ; SSE41-NEXT: movzbl 6(%rdi), %eax
1004 ; SSE41-NEXT: andl $15, %eax
1005 ; SSE41-NEXT: pinsrb $6, -24(%rsp,%rax), %xmm0
1006 ; SSE41-NEXT: movzbl 7(%rdi), %eax
1007 ; SSE41-NEXT: andl $15, %eax
1008 ; SSE41-NEXT: pinsrb $7, -24(%rsp,%rax), %xmm0
1009 ; SSE41-NEXT: movzbl 8(%rdi), %eax
1010 ; SSE41-NEXT: andl $15, %eax
1011 ; SSE41-NEXT: pinsrb $8, -24(%rsp,%rax), %xmm0
1012 ; SSE41-NEXT: movzbl 9(%rdi), %eax
1013 ; SSE41-NEXT: andl $15, %eax
1014 ; SSE41-NEXT: pinsrb $9, -24(%rsp,%rax), %xmm0
1015 ; SSE41-NEXT: movzbl 10(%rdi), %eax
1016 ; SSE41-NEXT: andl $15, %eax
1017 ; SSE41-NEXT: pinsrb $10, -24(%rsp,%rax), %xmm0
1018 ; SSE41-NEXT: movzbl 11(%rdi), %eax
1019 ; SSE41-NEXT: andl $15, %eax
1020 ; SSE41-NEXT: pinsrb $11, -24(%rsp,%rax), %xmm0
1021 ; SSE41-NEXT: movzbl 12(%rdi), %eax
1022 ; SSE41-NEXT: andl $15, %eax
1023 ; SSE41-NEXT: pinsrb $12, -24(%rsp,%rax), %xmm0
1024 ; SSE41-NEXT: movzbl 13(%rdi), %eax
1025 ; SSE41-NEXT: andl $15, %eax
1026 ; SSE41-NEXT: pinsrb $13, -24(%rsp,%rax), %xmm0
1027 ; SSE41-NEXT: movzbl 14(%rdi), %eax
1036 ; SSE41-NEXT: movzbl -24(%rsp,%r9), %r9d
1037 ; SSE41-NEXT: movd %r9d, %xmm0
1038 ; SSE41-NEXT: andl $15, %ebx
1039 ; SSE41-NEXT: pinsrb $1, -24(%rsp,%rbx), %xmm0
1040 ; SSE41-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rbx # 8-byte Reload
1041 ; SSE41-NEXT: andl $15, %ebx
1042 ; SSE41-NEXT: pinsrb $2, -24(%rsp,%rbx), %xmm0
1043 ; SSE41-NEXT: andl $15, %r11d
1044 ; SSE41-NEXT: pinsrb $3, -24(%rsp,%r11), %xmm0
1045 ; SSE41-NEXT: andl $15, %r14d
1046 ; SSE41-NEXT: pinsrb $4, -24(%rsp,%r14), %xmm0
1047 ; SSE41-NEXT: andl $15, %r15d
1048 ; SSE41-NEXT: pinsrb $5, -24(%rsp,%r15), %xmm0
1049 ; SSE41-NEXT: andl $15, %r12d
1050 ; SSE41-NEXT: pinsrb $6, -24(%rsp,%r12), %xmm0
1051 ; SSE41-NEXT: andl $15, %r13d
1052 ; SSE41-NEXT: pinsrb $7, -24(%rsp,%r13), %xmm0
1053 ; SSE41-NEXT: andl $15, %r10d
1054 ; SSE41-NEXT: pinsrb $8, -24(%rsp,%r10), %xmm0
1055 ; SSE41-NEXT: andl $15, %r8d
1056 ; SSE41-NEXT: pinsrb $9, -24(%rsp,%r8), %xmm0
1057 ; SSE41-NEXT: andl $15, %ecx
1058 ; SSE41-NEXT: pinsrb $10, -24(%rsp,%rcx), %xmm0
1059 ; SSE41-NEXT: andl $15, %edx
1060 ; SSE41-NEXT: pinsrb $11, -24(%rsp,%rdx), %xmm0
1061 ; SSE41-NEXT: andl $15, %esi
1062 ; SSE41-NEXT: pinsrb $12, -24(%rsp,%rsi), %xmm0
1063 ; SSE41-NEXT: andl $15, %ebp
1064 ; SSE41-NEXT: pinsrb $13, -24(%rsp,%rbp), %xmm0
10281065 ; SSE41-NEXT: andl $15, %eax
10291066 ; SSE41-NEXT: pinsrb $14, -24(%rsp,%rax), %xmm0
1030 ; SSE41-NEXT: movzbl 15(%rdi), %eax
1031 ; SSE41-NEXT: andl $15, %eax
1032 ; SSE41-NEXT: pinsrb $15, -24(%rsp,%rax), %xmm0
1067 ; SSE41-NEXT: andl $15, %edi
1068 ; SSE41-NEXT: pinsrb $15, -24(%rsp,%rdi), %xmm0
1069 ; SSE41-NEXT: popq %rbx
1070 ; SSE41-NEXT: popq %r12
1071 ; SSE41-NEXT: popq %r13
1072 ; SSE41-NEXT: popq %r14
1073 ; SSE41-NEXT: popq %r15
1074 ; SSE41-NEXT: popq %rbp
10331075 ; SSE41-NEXT: retq
10341076 ;
10351077 ; AVX-LABEL: mem_shuffle_v16i8_v16i8_xxxxxxxxxxxxxxxx_i8:
10361078 ; AVX: # %bb.0:
1037 ; AVX-NEXT: movzbl (%rdi), %eax
1038 ; AVX-NEXT: andl $15, %eax
1079 ; AVX-NEXT: pushq %rbp
1080 ; AVX-NEXT: pushq %r15
1081 ; AVX-NEXT: pushq %r14
1082 ; AVX-NEXT: pushq %r13
1083 ; AVX-NEXT: pushq %r12
1084 ; AVX-NEXT: pushq %rbx
1085 ; AVX-NEXT: movzbl (%rdi), %r9d
1086 ; AVX-NEXT: andl $15, %r9d
1087 ; AVX-NEXT: movzbl 1(%rdi), %ebx
1088 ; AVX-NEXT: movzbl 2(%rdi), %eax
1089 ; AVX-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
1090 ; AVX-NEXT: movzbl 3(%rdi), %r11d
1091 ; AVX-NEXT: movzbl 4(%rdi), %r14d
1092 ; AVX-NEXT: movzbl 5(%rdi), %r15d
1093 ; AVX-NEXT: movzbl 6(%rdi), %r12d
1094 ; AVX-NEXT: movzbl 7(%rdi), %r13d
1095 ; AVX-NEXT: movzbl 8(%rdi), %r10d
1096 ; AVX-NEXT: movzbl 9(%rdi), %r8d
1097 ; AVX-NEXT: movzbl 10(%rdi), %ecx
1098 ; AVX-NEXT: movzbl 11(%rdi), %edx
1099 ; AVX-NEXT: movzbl 12(%rdi), %esi
1100 ; AVX-NEXT: movzbl 13(%rdi), %ebp
1101 ; AVX-NEXT: movzbl 14(%rdi), %eax
1102 ; AVX-NEXT: movzbl 15(%rdi), %edi
10391103 ; AVX-NEXT: vmovaps %xmm0, -{{[0-9]+}}(%rsp)
1040 ; AVX-NEXT: movzbl -24(%rsp,%rax), %eax
1041 ; AVX-NEXT: vmovd %eax, %xmm0
1042 ; AVX-NEXT: movzbl 1(%rdi), %eax
1043 ; AVX-NEXT: andl $15, %eax
1044 ; AVX-NEXT: vpinsrb $1, -24(%rsp,%rax), %xmm0, %xmm0
1045 ; AVX-NEXT: movzbl 2(%rdi), %eax
1046 ; AVX-NEXT: andl $15, %eax
1047 ; AVX-NEXT: vpinsrb $2, -24(%rsp,%rax), %xmm0, %xmm0
1048 ; AVX-NEXT: movzbl 3(%rdi), %eax
1049 ; AVX-NEXT: andl $15, %eax
1050 ; AVX-NEXT: vpinsrb $3, -24(%rsp,%rax), %xmm0, %xmm0
1051 ; AVX-NEXT: movzbl 4(%rdi), %eax
1052 ; AVX-NEXT: andl $15, %eax
1053 ; AVX-NEXT: vpinsrb $4, -24(%rsp,%rax), %xmm0, %xmm0
1054 ; AVX-NEXT: movzbl 5(%rdi), %eax
1055 ; AVX-NEXT: andl $15, %eax
1056 ; AVX-NEXT: vpinsrb $5, -24(%rsp,%rax), %xmm0, %xmm0
1057 ; AVX-NEXT: movzbl 6(%rdi), %eax
1058 ; AVX-NEXT: andl $15, %eax
1059 ; AVX-NEXT: vpinsrb $6, -24(%rsp,%rax), %xmm0, %xmm0
1060 ; AVX-NEXT: movzbl 7(%rdi), %eax
1061 ; AVX-NEXT: andl $15, %eax
1062 ; AVX-NEXT: vpinsrb $7, -24(%rsp,%rax), %xmm0, %xmm0
1063 ; AVX-NEXT: movzbl 8(%rdi), %eax
1064 ; AVX-NEXT: andl $15, %eax
1065 ; AVX-NEXT: vpinsrb $8, -24(%rsp,%rax), %xmm0, %xmm0
1066 ; AVX-NEXT: movzbl 9(%rdi), %eax
1067 ; AVX-NEXT: andl $15, %eax
1068 ; AVX-NEXT: vpinsrb $9, -24(%rsp,%rax), %xmm0, %xmm0
1069 ; AVX-NEXT: movzbl 10(%rdi), %eax
1070 ; AVX-NEXT: andl $15, %eax
1071 ; AVX-NEXT: vpinsrb $10, -24(%rsp,%rax), %xmm0, %xmm0
1072 ; AVX-NEXT: movzbl 11(%rdi), %eax
1073 ; AVX-NEXT: andl $15, %eax
1074 ; AVX-NEXT: vpinsrb $11, -24(%rsp,%rax), %xmm0, %xmm0
1075 ; AVX-NEXT: movzbl 12(%rdi), %eax
1076 ; AVX-NEXT: andl $15, %eax
1077 ; AVX-NEXT: vpinsrb $12, -24(%rsp,%rax), %xmm0, %xmm0
1078 ; AVX-NEXT: movzbl 13(%rdi), %eax
1079 ; AVX-NEXT: andl $15, %eax
1080 ; AVX-NEXT: vpinsrb $13, -24(%rsp,%rax), %xmm0, %xmm0
1081 ; AVX-NEXT: movzbl 14(%rdi), %eax
1104 ; AVX-NEXT: movzbl -24(%rsp,%r9), %r9d
1105 ; AVX-NEXT: vmovd %r9d, %xmm0
1106 ; AVX-NEXT: andl $15, %ebx
1107 ; AVX-NEXT: vpinsrb $1, -24(%rsp,%rbx), %xmm0, %xmm0
1108 ; AVX-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rbx # 8-byte Reload
1109 ; AVX-NEXT: andl $15, %ebx
1110 ; AVX-NEXT: vpinsrb $2, -24(%rsp,%rbx), %xmm0, %xmm0
1111 ; AVX-NEXT: andl $15, %r11d
1112 ; AVX-NEXT: vpinsrb $3, -24(%rsp,%r11), %xmm0, %xmm0
1113 ; AVX-NEXT: andl $15, %r14d
1114 ; AVX-NEXT: vpinsrb $4, -24(%rsp,%r14), %xmm0, %xmm0
1115 ; AVX-NEXT: andl $15, %r15d
1116 ; AVX-NEXT: vpinsrb $5, -24(%rsp,%r15), %xmm0, %xmm0
1117 ; AVX-NEXT: andl $15, %r12d
1118 ; AVX-NEXT: vpinsrb $6, -24(%rsp,%r12), %xmm0, %xmm0
1119 ; AVX-NEXT: andl $15, %r13d
1120 ; AVX-NEXT: vpinsrb $7, -24(%rsp,%r13), %xmm0, %xmm0
1121 ; AVX-NEXT: andl $15, %r10d
1122 ; AVX-NEXT: vpinsrb $8, -24(%rsp,%r10), %xmm0, %xmm0
1123 ; AVX-NEXT: andl $15, %r8d
1124 ; AVX-NEXT: vpinsrb $9, -24(%rsp,%r8), %xmm0, %xmm0
1125 ; AVX-NEXT: andl $15, %ecx
1126 ; AVX-NEXT: vpinsrb $10, -24(%rsp,%rcx), %xmm0, %xmm0
1127 ; AVX-NEXT: andl $15, %edx
1128 ; AVX-NEXT: vpinsrb $11, -24(%rsp,%rdx), %xmm0, %xmm0
1129 ; AVX-NEXT: andl $15, %esi
1130 ; AVX-NEXT: vpinsrb $12, -24(%rsp,%rsi), %xmm0, %xmm0
1131 ; AVX-NEXT: andl $15, %ebp
1132 ; AVX-NEXT: vpinsrb $13, -24(%rsp,%rbp), %xmm0, %xmm0
10821133 ; AVX-NEXT: andl $15, %eax
10831134 ; AVX-NEXT: vpinsrb $14, -24(%rsp,%rax), %xmm0, %xmm0
1084 ; AVX-NEXT: movzbl 15(%rdi), %eax
1085 ; AVX-NEXT: andl $15, %eax
1086 ; AVX-NEXT: vpinsrb $15, -24(%rsp,%rax), %xmm0, %xmm0
1135 ; AVX-NEXT: andl $15, %edi
1136 ; AVX-NEXT: vpinsrb $15, -24(%rsp,%rdi), %xmm0, %xmm0
1137 ; AVX-NEXT: popq %rbx
1138 ; AVX-NEXT: popq %r12
1139 ; AVX-NEXT: popq %r13
1140 ; AVX-NEXT: popq %r14
1141 ; AVX-NEXT: popq %r15
1142 ; AVX-NEXT: popq %rbp
10871143 ; AVX-NEXT: retq
10881144 %p0 = getelementptr inbounds i8, i8* %i, i64 0
10891145 %p1 = getelementptr inbounds i8, i8* %i, i64 1
188188 ; ALL-NEXT: # kill: def $edx killed $edx def $rdx
189189 ; ALL-NEXT: # kill: def $esi killed $esi def $rsi
190190 ; ALL-NEXT: # kill: def $edi killed $edi def $rdi
191 ; ALL-NEXT: movl 24(%rbp), %r10d
192 ; ALL-NEXT: andl $7, %r10d
193 ; ALL-NEXT: movl 16(%rbp), %eax
194 ; ALL-NEXT: andl $7, %eax
191195 ; ALL-NEXT: andl $7, %edi
192196 ; ALL-NEXT: andl $7, %esi
193197 ; ALL-NEXT: andl $7, %edx
195199 ; ALL-NEXT: andl $7, %r8d
196200 ; ALL-NEXT: vmovaps %ymm0, (%rsp)
197201 ; ALL-NEXT: andl $7, %r9d
198 ; ALL-NEXT: movl 16(%rbp), %r10d
199 ; ALL-NEXT: andl $7, %r10d
200 ; ALL-NEXT: movl 24(%rbp), %eax
201 ; ALL-NEXT: andl $7, %eax
202202 ; ALL-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero
203203 ; ALL-NEXT: vinsertps {{.*#+}} xmm0 = xmm0[0],mem[0],xmm0[2,3]
204204 ; ALL-NEXT: vinsertps {{.*#+}} xmm0 = xmm0[0,1],mem[0],xmm0[3]
239239 ; ALL-NEXT: # kill: def $edx killed $edx def $rdx
240240 ; ALL-NEXT: # kill: def $esi killed $esi def $rsi
241241 ; ALL-NEXT: # kill: def $edi killed $edi def $rdi
242 ; ALL-NEXT: movl {{[0-9]+}}(%rsp), %r10d
243 ; ALL-NEXT: andl $3, %r10d
244 ; ALL-NEXT: movl {{[0-9]+}}(%rsp), %eax
245 ; ALL-NEXT: andl $3, %eax
242246 ; ALL-NEXT: andl $3, %edi
243247 ; ALL-NEXT: andl $3, %esi
244248 ; ALL-NEXT: andl $3, %edx
246250 ; ALL-NEXT: andl $3, %r8d
247251 ; ALL-NEXT: vmovaps %xmm0, -{{[0-9]+}}(%rsp)
248252 ; ALL-NEXT: andl $3, %r9d
249 ; ALL-NEXT: movl {{[0-9]+}}(%rsp), %r10d
250 ; ALL-NEXT: andl $3, %r10d
251 ; ALL-NEXT: movl {{[0-9]+}}(%rsp), %eax
252 ; ALL-NEXT: andl $3, %eax
253253 ; ALL-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero
254254 ; ALL-NEXT: vinsertps {{.*#+}} xmm0 = xmm0[0],mem[0],xmm0[2,3]
255255 ; ALL-NEXT: vinsertps {{.*#+}} xmm0 = xmm0[0,1],mem[0],xmm0[3]
1818 ; CHECK-NEXT: .p2align 4, 0x90
1919 ; CHECK-NEXT: .LBB0_2: # %forbody
2020 ; CHECK-NEXT: # in Loop: Header=BB0_1 Depth=1
21 ; CHECK-NEXT: movq -{{[0-9]+}}(%rsp), %rax
22 ; CHECK-NEXT: movslq -{{[0-9]+}}(%rsp), %rcx
23 ; CHECK-NEXT: shlq $4, %rcx
21 ; CHECK-NEXT: movslq -{{[0-9]+}}(%rsp), %rax
22 ; CHECK-NEXT: movq -{{[0-9]+}}(%rsp), %rcx
23 ; CHECK-NEXT: shlq $4, %rax
2424 ; CHECK-NEXT: movq -{{[0-9]+}}(%rsp), %rdx
25 ; CHECK-NEXT: movdqa (%rdx,%rcx), %xmm2
25 ; CHECK-NEXT: movdqa (%rdx,%rax), %xmm2
2626 ; CHECK-NEXT: psubw %xmm0, %xmm2
2727 ; CHECK-NEXT: pmullw %xmm1, %xmm2
28 ; CHECK-NEXT: pextrw $4, %xmm2, 8(%rax,%rcx)
29 ; CHECK-NEXT: movq %xmm2, (%rax,%rcx)
28 ; CHECK-NEXT: pextrw $4, %xmm2, 8(%rcx,%rax)
29 ; CHECK-NEXT: movq %xmm2, (%rcx,%rax)
3030 ; CHECK-NEXT: incl -{{[0-9]+}}(%rsp)
3131 ; CHECK-NEXT: .LBB0_1: # %forcond
3232 ; CHECK-NEXT: # =>This Inner Loop Header: Depth=1
1717 ; CHECK-NEXT: .p2align 4, 0x90
1818 ; CHECK-NEXT: .LBB0_2: # %forbody
1919 ; CHECK-NEXT: # in Loop: Header=BB0_1 Depth=1
20 ; CHECK-NEXT: movq -{{[0-9]+}}(%rsp), %rax
21 ; CHECK-NEXT: movslq -{{[0-9]+}}(%rsp), %rcx
22 ; CHECK-NEXT: shlq $4, %rcx
20 ; CHECK-NEXT: movslq -{{[0-9]+}}(%rsp), %rax
21 ; CHECK-NEXT: movq -{{[0-9]+}}(%rsp), %rcx
22 ; CHECK-NEXT: shlq $4, %rax
2323 ; CHECK-NEXT: movq -{{[0-9]+}}(%rsp), %rdx
24 ; CHECK-NEXT: movdqa (%rdx,%rcx), %xmm1
24 ; CHECK-NEXT: movdqa (%rdx,%rax), %xmm1
2525 ; CHECK-NEXT: pslld $2, %xmm1
2626 ; CHECK-NEXT: psubd %xmm0, %xmm1
27 ; CHECK-NEXT: pextrd $2, %xmm1, 8(%rax,%rcx)
28 ; CHECK-NEXT: movq %xmm1, (%rax,%rcx)
27 ; CHECK-NEXT: pextrd $2, %xmm1, 8(%rcx,%rax)
28 ; CHECK-NEXT: movq %xmm1, (%rcx,%rax)
2929 ; CHECK-NEXT: incl -{{[0-9]+}}(%rsp)
3030 ; CHECK-NEXT: .LBB0_1: # %forcond
3131 ; CHECK-NEXT: # =>This Inner Loop Header: Depth=1