1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc < %s -mtriple=x86_64-unknwon -mattr=+sse4.1 | FileCheck %s --check-prefix=SSE41 3; RUN: llc < %s -mtriple=x86_64-unknwon -mattr=+avx | FileCheck %s --check-prefix=AVX --check-prefix=AVX1 4; RUN: llc < %s -mtriple=x86_64-unknwon -mattr=+avx2 | FileCheck %s --check-prefix=AVX --check-prefix=AVX2 5; RUN: llc < %s -mtriple=i686-unknwon -mattr=+avx2 | FileCheck %s --check-prefix=X32-AVX2 6 7; PR14887 8; These tests inject a store into the chain to test the inreg versions of pmovsx 9 10define void @test1(<2 x i8>* %in, <2 x i64>* %out) nounwind { 11; SSE41-LABEL: test1: 12; SSE41: # %bb.0: 13; SSE41-NEXT: pmovsxbq (%rdi), %xmm0 14; SSE41-NEXT: xorps %xmm1, %xmm1 15; SSE41-NEXT: movups %xmm1, (%rax) 16; SSE41-NEXT: movdqu %xmm0, (%rsi) 17; SSE41-NEXT: retq 18; 19; AVX-LABEL: test1: 20; AVX: # %bb.0: 21; AVX-NEXT: vpmovsxbq (%rdi), %xmm0 22; AVX-NEXT: vxorps %xmm1, %xmm1, %xmm1 23; AVX-NEXT: vmovups %xmm1, (%rax) 24; AVX-NEXT: vmovdqu %xmm0, (%rsi) 25; AVX-NEXT: retq 26; 27; X32-AVX2-LABEL: test1: 28; X32-AVX2: # %bb.0: 29; X32-AVX2-NEXT: movl {{[0-9]+}}(%esp), %eax 30; X32-AVX2-NEXT: movl {{[0-9]+}}(%esp), %ecx 31; X32-AVX2-NEXT: vpmovsxbq (%ecx), %xmm0 32; X32-AVX2-NEXT: vxorps %xmm1, %xmm1, %xmm1 33; X32-AVX2-NEXT: vmovups %xmm1, (%eax) 34; X32-AVX2-NEXT: vmovdqu %xmm0, (%eax) 35; X32-AVX2-NEXT: retl 36 %wide.load35 = load <2 x i8>, <2 x i8>* %in, align 1 37 %sext = sext <2 x i8> %wide.load35 to <2 x i64> 38 store <2 x i64> zeroinitializer, <2 x i64>* undef, align 8 39 store <2 x i64> %sext, <2 x i64>* %out, align 8 40 ret void 41} 42 43define void @test2(<4 x i8>* %in, <4 x i64>* %out) nounwind { 44; SSE41-LABEL: test2: 45; SSE41: # %bb.0: 46; SSE41-NEXT: pmovsxbq (%rdi), %xmm0 47; SSE41-NEXT: pmovsxbq 2(%rdi), %xmm1 48; SSE41-NEXT: xorps %xmm2, %xmm2 49; SSE41-NEXT: movups %xmm2, (%rax) 50; SSE41-NEXT: movdqu %xmm1, 16(%rsi) 51; SSE41-NEXT: movdqu %xmm0, (%rsi) 52; SSE41-NEXT: retq 53; 54; AVX1-LABEL: test2: 55; AVX1: # %bb.0: 56; AVX1-NEXT: vpmovsxbq (%rdi), %xmm0 57; AVX1-NEXT: vpmovsxbq 2(%rdi), %xmm1 58; AVX1-NEXT: vxorps %xmm2, %xmm2, %xmm2 59; AVX1-NEXT: vmovups %ymm2, (%rax) 60; AVX1-NEXT: vmovdqu %xmm1, 16(%rsi) 61; AVX1-NEXT: vmovdqu %xmm0, (%rsi) 62; AVX1-NEXT: vzeroupper 63; AVX1-NEXT: retq 64; 65; AVX2-LABEL: test2: 66; AVX2: # %bb.0: 67; AVX2-NEXT: vpmovsxbq (%rdi), %ymm0 68; AVX2-NEXT: vxorps %xmm1, %xmm1, %xmm1 69; AVX2-NEXT: vmovups %ymm1, (%rax) 70; AVX2-NEXT: vmovdqu %ymm0, (%rsi) 71; AVX2-NEXT: vzeroupper 72; AVX2-NEXT: retq 73; 74; X32-AVX2-LABEL: test2: 75; X32-AVX2: # %bb.0: 76; X32-AVX2-NEXT: movl {{[0-9]+}}(%esp), %eax 77; X32-AVX2-NEXT: movl {{[0-9]+}}(%esp), %ecx 78; X32-AVX2-NEXT: vpmovsxbq (%ecx), %ymm0 79; X32-AVX2-NEXT: vxorps %xmm1, %xmm1, %xmm1 80; X32-AVX2-NEXT: vmovups %ymm1, (%eax) 81; X32-AVX2-NEXT: vmovdqu %ymm0, (%eax) 82; X32-AVX2-NEXT: vzeroupper 83; X32-AVX2-NEXT: retl 84 %wide.load35 = load <4 x i8>, <4 x i8>* %in, align 1 85 %sext = sext <4 x i8> %wide.load35 to <4 x i64> 86 store <4 x i64> zeroinitializer, <4 x i64>* undef, align 8 87 store <4 x i64> %sext, <4 x i64>* %out, align 8 88 ret void 89} 90 91define void @test3(<4 x i8>* %in, <4 x i32>* %out) nounwind { 92; SSE41-LABEL: test3: 93; SSE41: # %bb.0: 94; SSE41-NEXT: pmovsxbd (%rdi), %xmm0 95; SSE41-NEXT: xorps %xmm1, %xmm1 96; SSE41-NEXT: movups %xmm1, (%rax) 97; SSE41-NEXT: movdqu %xmm0, (%rsi) 98; SSE41-NEXT: retq 99; 100; AVX-LABEL: test3: 101; AVX: # %bb.0: 102; AVX-NEXT: vpmovsxbd (%rdi), %xmm0 103; AVX-NEXT: vxorps %xmm1, %xmm1, %xmm1 104; AVX-NEXT: vmovups %xmm1, (%rax) 105; AVX-NEXT: vmovdqu %xmm0, (%rsi) 106; AVX-NEXT: retq 107; 108; X32-AVX2-LABEL: test3: 109; X32-AVX2: # %bb.0: 110; X32-AVX2-NEXT: movl {{[0-9]+}}(%esp), %eax 111; X32-AVX2-NEXT: movl {{[0-9]+}}(%esp), %ecx 112; X32-AVX2-NEXT: vpmovsxbd (%ecx), %xmm0 113; X32-AVX2-NEXT: vxorps %xmm1, %xmm1, %xmm1 114; X32-AVX2-NEXT: vmovups %xmm1, (%eax) 115; X32-AVX2-NEXT: vmovdqu %xmm0, (%eax) 116; X32-AVX2-NEXT: retl 117 %wide.load35 = load <4 x i8>, <4 x i8>* %in, align 1 118 %sext = sext <4 x i8> %wide.load35 to <4 x i32> 119 store <4 x i32> zeroinitializer, <4 x i32>* undef, align 8 120 store <4 x i32> %sext, <4 x i32>* %out, align 8 121 ret void 122} 123 124define void @test4(<8 x i8>* %in, <8 x i32>* %out) nounwind { 125; SSE41-LABEL: test4: 126; SSE41: # %bb.0: 127; SSE41-NEXT: pmovsxbd (%rdi), %xmm0 128; SSE41-NEXT: pmovsxbd 4(%rdi), %xmm1 129; SSE41-NEXT: xorps %xmm2, %xmm2 130; SSE41-NEXT: movups %xmm2, (%rax) 131; SSE41-NEXT: movdqu %xmm1, 16(%rsi) 132; SSE41-NEXT: movdqu %xmm0, (%rsi) 133; SSE41-NEXT: retq 134; 135; AVX1-LABEL: test4: 136; AVX1: # %bb.0: 137; AVX1-NEXT: vpmovsxbd (%rdi), %xmm0 138; AVX1-NEXT: vpmovsxbd 4(%rdi), %xmm1 139; AVX1-NEXT: vxorps %xmm2, %xmm2, %xmm2 140; AVX1-NEXT: vmovups %ymm2, (%rax) 141; AVX1-NEXT: vmovdqu %xmm1, 16(%rsi) 142; AVX1-NEXT: vmovdqu %xmm0, (%rsi) 143; AVX1-NEXT: vzeroupper 144; AVX1-NEXT: retq 145; 146; AVX2-LABEL: test4: 147; AVX2: # %bb.0: 148; AVX2-NEXT: vpmovsxbd (%rdi), %ymm0 149; AVX2-NEXT: vxorps %xmm1, %xmm1, %xmm1 150; AVX2-NEXT: vmovups %ymm1, (%rax) 151; AVX2-NEXT: vmovdqu %ymm0, (%rsi) 152; AVX2-NEXT: vzeroupper 153; AVX2-NEXT: retq 154; 155; X32-AVX2-LABEL: test4: 156; X32-AVX2: # %bb.0: 157; X32-AVX2-NEXT: movl {{[0-9]+}}(%esp), %eax 158; X32-AVX2-NEXT: movl {{[0-9]+}}(%esp), %ecx 159; X32-AVX2-NEXT: vpmovsxbd (%ecx), %ymm0 160; X32-AVX2-NEXT: vxorps %xmm1, %xmm1, %xmm1 161; X32-AVX2-NEXT: vmovups %ymm1, (%eax) 162; X32-AVX2-NEXT: vmovdqu %ymm0, (%eax) 163; X32-AVX2-NEXT: vzeroupper 164; X32-AVX2-NEXT: retl 165 %wide.load35 = load <8 x i8>, <8 x i8>* %in, align 1 166 %sext = sext <8 x i8> %wide.load35 to <8 x i32> 167 store <8 x i32> zeroinitializer, <8 x i32>* undef, align 8 168 store <8 x i32> %sext, <8 x i32>* %out, align 8 169 ret void 170} 171 172define void @test5(<8 x i8>* %in, <8 x i16>* %out) nounwind { 173; SSE41-LABEL: test5: 174; SSE41: # %bb.0: 175; SSE41-NEXT: pmovsxbw (%rdi), %xmm0 176; SSE41-NEXT: xorps %xmm1, %xmm1 177; SSE41-NEXT: movups %xmm1, (%rax) 178; SSE41-NEXT: movdqu %xmm0, (%rsi) 179; SSE41-NEXT: retq 180; 181; AVX-LABEL: test5: 182; AVX: # %bb.0: 183; AVX-NEXT: vpmovsxbw (%rdi), %xmm0 184; AVX-NEXT: vxorps %xmm1, %xmm1, %xmm1 185; AVX-NEXT: vmovups %xmm1, (%rax) 186; AVX-NEXT: vmovdqu %xmm0, (%rsi) 187; AVX-NEXT: retq 188; 189; X32-AVX2-LABEL: test5: 190; X32-AVX2: # %bb.0: 191; X32-AVX2-NEXT: movl {{[0-9]+}}(%esp), %eax 192; X32-AVX2-NEXT: movl {{[0-9]+}}(%esp), %ecx 193; X32-AVX2-NEXT: vpmovsxbw (%ecx), %xmm0 194; X32-AVX2-NEXT: vxorps %xmm1, %xmm1, %xmm1 195; X32-AVX2-NEXT: vmovups %xmm1, (%eax) 196; X32-AVX2-NEXT: vmovdqu %xmm0, (%eax) 197; X32-AVX2-NEXT: retl 198 %wide.load35 = load <8 x i8>, <8 x i8>* %in, align 1 199 %sext = sext <8 x i8> %wide.load35 to <8 x i16> 200 store <8 x i16> zeroinitializer, <8 x i16>* undef, align 8 201 store <8 x i16> %sext, <8 x i16>* %out, align 8 202 ret void 203} 204 205define void @test6(<16 x i8>* %in, <16 x i16>* %out) nounwind { 206; SSE41-LABEL: test6: 207; SSE41: # %bb.0: 208; SSE41-NEXT: pmovsxbw (%rdi), %xmm0 209; SSE41-NEXT: pmovsxbw 8(%rdi), %xmm1 210; SSE41-NEXT: xorps %xmm2, %xmm2 211; SSE41-NEXT: movups %xmm2, (%rax) 212; SSE41-NEXT: movdqu %xmm1, 16(%rsi) 213; SSE41-NEXT: movdqu %xmm0, (%rsi) 214; SSE41-NEXT: retq 215; 216; AVX1-LABEL: test6: 217; AVX1: # %bb.0: 218; AVX1-NEXT: vpmovsxbw (%rdi), %xmm0 219; AVX1-NEXT: vpmovsxbw 8(%rdi), %xmm1 220; AVX1-NEXT: vxorps %xmm2, %xmm2, %xmm2 221; AVX1-NEXT: vmovups %ymm2, (%rax) 222; AVX1-NEXT: vmovdqu %xmm1, 16(%rsi) 223; AVX1-NEXT: vmovdqu %xmm0, (%rsi) 224; AVX1-NEXT: vzeroupper 225; AVX1-NEXT: retq 226; 227; AVX2-LABEL: test6: 228; AVX2: # %bb.0: 229; AVX2-NEXT: vpmovsxbw (%rdi), %ymm0 230; AVX2-NEXT: vxorps %xmm1, %xmm1, %xmm1 231; AVX2-NEXT: vmovups %ymm1, (%rax) 232; AVX2-NEXT: vmovdqu %ymm0, (%rsi) 233; AVX2-NEXT: vzeroupper 234; AVX2-NEXT: retq 235; 236; X32-AVX2-LABEL: test6: 237; X32-AVX2: # %bb.0: 238; X32-AVX2-NEXT: movl {{[0-9]+}}(%esp), %eax 239; X32-AVX2-NEXT: movl {{[0-9]+}}(%esp), %ecx 240; X32-AVX2-NEXT: vpmovsxbw (%ecx), %ymm0 241; X32-AVX2-NEXT: vxorps %xmm1, %xmm1, %xmm1 242; X32-AVX2-NEXT: vmovups %ymm1, (%eax) 243; X32-AVX2-NEXT: vmovdqu %ymm0, (%eax) 244; X32-AVX2-NEXT: vzeroupper 245; X32-AVX2-NEXT: retl 246 %wide.load35 = load <16 x i8>, <16 x i8>* %in, align 1 247 %sext = sext <16 x i8> %wide.load35 to <16 x i16> 248 store <16 x i16> zeroinitializer, <16 x i16>* undef, align 8 249 store <16 x i16> %sext, <16 x i16>* %out, align 8 250 ret void 251} 252 253define void @test7(<2 x i16>* %in, <2 x i64>* %out) nounwind { 254; SSE41-LABEL: test7: 255; SSE41: # %bb.0: 256; SSE41-NEXT: pmovsxwq (%rdi), %xmm0 257; SSE41-NEXT: xorps %xmm1, %xmm1 258; SSE41-NEXT: movups %xmm1, (%rax) 259; SSE41-NEXT: movdqu %xmm0, (%rsi) 260; SSE41-NEXT: retq 261; 262; AVX-LABEL: test7: 263; AVX: # %bb.0: 264; AVX-NEXT: vpmovsxwq (%rdi), %xmm0 265; AVX-NEXT: vxorps %xmm1, %xmm1, %xmm1 266; AVX-NEXT: vmovups %xmm1, (%rax) 267; AVX-NEXT: vmovdqu %xmm0, (%rsi) 268; AVX-NEXT: retq 269; 270; X32-AVX2-LABEL: test7: 271; X32-AVX2: # %bb.0: 272; X32-AVX2-NEXT: movl {{[0-9]+}}(%esp), %eax 273; X32-AVX2-NEXT: movl {{[0-9]+}}(%esp), %ecx 274; X32-AVX2-NEXT: vpmovsxwq (%ecx), %xmm0 275; X32-AVX2-NEXT: vxorps %xmm1, %xmm1, %xmm1 276; X32-AVX2-NEXT: vmovups %xmm1, (%eax) 277; X32-AVX2-NEXT: vmovdqu %xmm0, (%eax) 278; X32-AVX2-NEXT: retl 279 %wide.load35 = load <2 x i16>, <2 x i16>* %in, align 1 280 %sext = sext <2 x i16> %wide.load35 to <2 x i64> 281 store <2 x i64> zeroinitializer, <2 x i64>* undef, align 8 282 store <2 x i64> %sext, <2 x i64>* %out, align 8 283 ret void 284} 285 286define void @test8(<4 x i16>* %in, <4 x i64>* %out) nounwind { 287; SSE41-LABEL: test8: 288; SSE41: # %bb.0: 289; SSE41-NEXT: pmovsxwq (%rdi), %xmm0 290; SSE41-NEXT: pmovsxwq 4(%rdi), %xmm1 291; SSE41-NEXT: xorps %xmm2, %xmm2 292; SSE41-NEXT: movups %xmm2, (%rax) 293; SSE41-NEXT: movdqu %xmm1, 16(%rsi) 294; SSE41-NEXT: movdqu %xmm0, (%rsi) 295; SSE41-NEXT: retq 296; 297; AVX1-LABEL: test8: 298; AVX1: # %bb.0: 299; AVX1-NEXT: vpmovsxwq (%rdi), %xmm0 300; AVX1-NEXT: vpmovsxwq 4(%rdi), %xmm1 301; AVX1-NEXT: vxorps %xmm2, %xmm2, %xmm2 302; AVX1-NEXT: vmovups %ymm2, (%rax) 303; AVX1-NEXT: vmovdqu %xmm1, 16(%rsi) 304; AVX1-NEXT: vmovdqu %xmm0, (%rsi) 305; AVX1-NEXT: vzeroupper 306; AVX1-NEXT: retq 307; 308; AVX2-LABEL: test8: 309; AVX2: # %bb.0: 310; AVX2-NEXT: vpmovsxwq (%rdi), %ymm0 311; AVX2-NEXT: vxorps %xmm1, %xmm1, %xmm1 312; AVX2-NEXT: vmovups %ymm1, (%rax) 313; AVX2-NEXT: vmovdqu %ymm0, (%rsi) 314; AVX2-NEXT: vzeroupper 315; AVX2-NEXT: retq 316; 317; X32-AVX2-LABEL: test8: 318; X32-AVX2: # %bb.0: 319; X32-AVX2-NEXT: movl {{[0-9]+}}(%esp), %eax 320; X32-AVX2-NEXT: movl {{[0-9]+}}(%esp), %ecx 321; X32-AVX2-NEXT: vpmovsxwq (%ecx), %ymm0 322; X32-AVX2-NEXT: vxorps %xmm1, %xmm1, %xmm1 323; X32-AVX2-NEXT: vmovups %ymm1, (%eax) 324; X32-AVX2-NEXT: vmovdqu %ymm0, (%eax) 325; X32-AVX2-NEXT: vzeroupper 326; X32-AVX2-NEXT: retl 327 %wide.load35 = load <4 x i16>, <4 x i16>* %in, align 1 328 %sext = sext <4 x i16> %wide.load35 to <4 x i64> 329 store <4 x i64> zeroinitializer, <4 x i64>* undef, align 8 330 store <4 x i64> %sext, <4 x i64>* %out, align 8 331 ret void 332} 333 334define void @test9(<4 x i16>* %in, <4 x i32>* %out) nounwind { 335; SSE41-LABEL: test9: 336; SSE41: # %bb.0: 337; SSE41-NEXT: pmovsxwd (%rdi), %xmm0 338; SSE41-NEXT: xorps %xmm1, %xmm1 339; SSE41-NEXT: movups %xmm1, (%rax) 340; SSE41-NEXT: movdqu %xmm0, (%rsi) 341; SSE41-NEXT: retq 342; 343; AVX-LABEL: test9: 344; AVX: # %bb.0: 345; AVX-NEXT: vpmovsxwd (%rdi), %xmm0 346; AVX-NEXT: vxorps %xmm1, %xmm1, %xmm1 347; AVX-NEXT: vmovups %xmm1, (%rax) 348; AVX-NEXT: vmovdqu %xmm0, (%rsi) 349; AVX-NEXT: retq 350; 351; X32-AVX2-LABEL: test9: 352; X32-AVX2: # %bb.0: 353; X32-AVX2-NEXT: movl {{[0-9]+}}(%esp), %eax 354; X32-AVX2-NEXT: movl {{[0-9]+}}(%esp), %ecx 355; X32-AVX2-NEXT: vpmovsxwd (%ecx), %xmm0 356; X32-AVX2-NEXT: vxorps %xmm1, %xmm1, %xmm1 357; X32-AVX2-NEXT: vmovups %xmm1, (%eax) 358; X32-AVX2-NEXT: vmovdqu %xmm0, (%eax) 359; X32-AVX2-NEXT: retl 360 %wide.load35 = load <4 x i16>, <4 x i16>* %in, align 1 361 %sext = sext <4 x i16> %wide.load35 to <4 x i32> 362 store <4 x i32> zeroinitializer, <4 x i32>* undef, align 8 363 store <4 x i32> %sext, <4 x i32>* %out, align 8 364 ret void 365} 366 367define void @test10(<8 x i16>* %in, <8 x i32>* %out) nounwind { 368; SSE41-LABEL: test10: 369; SSE41: # %bb.0: 370; SSE41-NEXT: pmovsxwd (%rdi), %xmm0 371; SSE41-NEXT: pmovsxwd 8(%rdi), %xmm1 372; SSE41-NEXT: xorps %xmm2, %xmm2 373; SSE41-NEXT: movups %xmm2, (%rax) 374; SSE41-NEXT: movdqu %xmm1, 16(%rsi) 375; SSE41-NEXT: movdqu %xmm0, (%rsi) 376; SSE41-NEXT: retq 377; 378; AVX1-LABEL: test10: 379; AVX1: # %bb.0: 380; AVX1-NEXT: vpmovsxwd (%rdi), %xmm0 381; AVX1-NEXT: vpmovsxwd 8(%rdi), %xmm1 382; AVX1-NEXT: vxorps %xmm2, %xmm2, %xmm2 383; AVX1-NEXT: vmovups %ymm2, (%rax) 384; AVX1-NEXT: vmovdqu %xmm1, 16(%rsi) 385; AVX1-NEXT: vmovdqu %xmm0, (%rsi) 386; AVX1-NEXT: vzeroupper 387; AVX1-NEXT: retq 388; 389; AVX2-LABEL: test10: 390; AVX2: # %bb.0: 391; AVX2-NEXT: vpmovsxwd (%rdi), %ymm0 392; AVX2-NEXT: vxorps %xmm1, %xmm1, %xmm1 393; AVX2-NEXT: vmovups %ymm1, (%rax) 394; AVX2-NEXT: vmovdqu %ymm0, (%rsi) 395; AVX2-NEXT: vzeroupper 396; AVX2-NEXT: retq 397; 398; X32-AVX2-LABEL: test10: 399; X32-AVX2: # %bb.0: 400; X32-AVX2-NEXT: movl {{[0-9]+}}(%esp), %eax 401; X32-AVX2-NEXT: movl {{[0-9]+}}(%esp), %ecx 402; X32-AVX2-NEXT: vpmovsxwd (%ecx), %ymm0 403; X32-AVX2-NEXT: vxorps %xmm1, %xmm1, %xmm1 404; X32-AVX2-NEXT: vmovups %ymm1, (%eax) 405; X32-AVX2-NEXT: vmovdqu %ymm0, (%eax) 406; X32-AVX2-NEXT: vzeroupper 407; X32-AVX2-NEXT: retl 408 %wide.load35 = load <8 x i16>, <8 x i16>* %in, align 1 409 %sext = sext <8 x i16> %wide.load35 to <8 x i32> 410 store <8 x i32> zeroinitializer, <8 x i32>* undef, align 8 411 store <8 x i32> %sext, <8 x i32>* %out, align 8 412 ret void 413} 414 415define void @test11(<2 x i32>* %in, <2 x i64>* %out) nounwind { 416; SSE41-LABEL: test11: 417; SSE41: # %bb.0: 418; SSE41-NEXT: pmovsxdq (%rdi), %xmm0 419; SSE41-NEXT: xorps %xmm1, %xmm1 420; SSE41-NEXT: movups %xmm1, (%rax) 421; SSE41-NEXT: movdqu %xmm0, (%rsi) 422; SSE41-NEXT: retq 423; 424; AVX-LABEL: test11: 425; AVX: # %bb.0: 426; AVX-NEXT: vpmovsxdq (%rdi), %xmm0 427; AVX-NEXT: vxorps %xmm1, %xmm1, %xmm1 428; AVX-NEXT: vmovups %xmm1, (%rax) 429; AVX-NEXT: vmovdqu %xmm0, (%rsi) 430; AVX-NEXT: retq 431; 432; X32-AVX2-LABEL: test11: 433; X32-AVX2: # %bb.0: 434; X32-AVX2-NEXT: movl {{[0-9]+}}(%esp), %eax 435; X32-AVX2-NEXT: movl {{[0-9]+}}(%esp), %ecx 436; X32-AVX2-NEXT: vpmovsxdq (%ecx), %xmm0 437; X32-AVX2-NEXT: vxorps %xmm1, %xmm1, %xmm1 438; X32-AVX2-NEXT: vmovups %xmm1, (%eax) 439; X32-AVX2-NEXT: vmovdqu %xmm0, (%eax) 440; X32-AVX2-NEXT: retl 441 %wide.load35 = load <2 x i32>, <2 x i32>* %in, align 1 442 %sext = sext <2 x i32> %wide.load35 to <2 x i64> 443 store <2 x i64> zeroinitializer, <2 x i64>* undef, align 8 444 store <2 x i64> %sext, <2 x i64>* %out, align 8 445 ret void 446} 447 448define void @test12(<4 x i32>* %in, <4 x i64>* %out) nounwind { 449; SSE41-LABEL: test12: 450; SSE41: # %bb.0: 451; SSE41-NEXT: pmovsxdq (%rdi), %xmm0 452; SSE41-NEXT: pmovsxdq 8(%rdi), %xmm1 453; SSE41-NEXT: xorps %xmm2, %xmm2 454; SSE41-NEXT: movups %xmm2, (%rax) 455; SSE41-NEXT: movdqu %xmm1, 16(%rsi) 456; SSE41-NEXT: movdqu %xmm0, (%rsi) 457; SSE41-NEXT: retq 458; 459; AVX1-LABEL: test12: 460; AVX1: # %bb.0: 461; AVX1-NEXT: vpmovsxdq (%rdi), %xmm0 462; AVX1-NEXT: vpmovsxdq 8(%rdi), %xmm1 463; AVX1-NEXT: vxorps %xmm2, %xmm2, %xmm2 464; AVX1-NEXT: vmovups %ymm2, (%rax) 465; AVX1-NEXT: vmovdqu %xmm1, 16(%rsi) 466; AVX1-NEXT: vmovdqu %xmm0, (%rsi) 467; AVX1-NEXT: vzeroupper 468; AVX1-NEXT: retq 469; 470; AVX2-LABEL: test12: 471; AVX2: # %bb.0: 472; AVX2-NEXT: vpmovsxdq (%rdi), %ymm0 473; AVX2-NEXT: vxorps %xmm1, %xmm1, %xmm1 474; AVX2-NEXT: vmovups %ymm1, (%rax) 475; AVX2-NEXT: vmovdqu %ymm0, (%rsi) 476; AVX2-NEXT: vzeroupper 477; AVX2-NEXT: retq 478; 479; X32-AVX2-LABEL: test12: 480; X32-AVX2: # %bb.0: 481; X32-AVX2-NEXT: movl {{[0-9]+}}(%esp), %eax 482; X32-AVX2-NEXT: movl {{[0-9]+}}(%esp), %ecx 483; X32-AVX2-NEXT: vpmovsxdq (%ecx), %ymm0 484; X32-AVX2-NEXT: vxorps %xmm1, %xmm1, %xmm1 485; X32-AVX2-NEXT: vmovups %ymm1, (%eax) 486; X32-AVX2-NEXT: vmovdqu %ymm0, (%eax) 487; X32-AVX2-NEXT: vzeroupper 488; X32-AVX2-NEXT: retl 489 %wide.load35 = load <4 x i32>, <4 x i32>* %in, align 1 490 %sext = sext <4 x i32> %wide.load35 to <4 x i64> 491 store <4 x i64> zeroinitializer, <4 x i64>* undef, align 8 492 store <4 x i64> %sext, <4 x i64>* %out, align 8 493 ret void 494} 495