1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefix=SSE2 3; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=AVX,AVX2 4; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f | FileCheck %s --check-prefixes=AVX,AVX512,AVX512F 5; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw | FileCheck %s --check-prefixes=AVX,AVX512,AVX512BW 6 7define <4 x i32> @test1(<8 x i32> %v) { 8; SSE2-LABEL: test1: 9; SSE2: # %bb.0: 10; SSE2-NEXT: retq 11; 12; AVX-LABEL: test1: 13; AVX: # %bb.0: 14; AVX-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0 15; AVX-NEXT: vzeroupper 16; AVX-NEXT: retq 17 %x = sext <8 x i32> %v to <8 x i64> 18 %s = shufflevector <8 x i64> %x, <8 x i64> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3> 19 %t = trunc <4 x i64> %s to <4 x i32> 20 ret <4 x i32> %t 21} 22 23define <4 x i32> @test2(<8 x i32> %v) { 24; SSE2-LABEL: test2: 25; SSE2: # %bb.0: 26; SSE2-NEXT: movaps %xmm1, %xmm0 27; SSE2-NEXT: retq 28; 29; AVX-LABEL: test2: 30; AVX: # %bb.0: 31; AVX-NEXT: vextractf128 $1, %ymm0, %xmm0 32; AVX-NEXT: vzeroupper 33; AVX-NEXT: retq 34 %x = sext <8 x i32> %v to <8 x i64> 35 %s = shufflevector <8 x i64> %x, <8 x i64> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7> 36 %t = trunc <4 x i64> %s to <4 x i32> 37 ret <4 x i32> %t 38} 39 40define <2 x i32> @test3(<8 x i32> %v) { 41; SSE2-LABEL: test3: 42; SSE2: # %bb.0: 43; SSE2-NEXT: movdqa %xmm1, %xmm0 44; SSE2-NEXT: pxor %xmm1, %xmm1 45; SSE2-NEXT: pcmpgtd %xmm0, %xmm1 46; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1] 47; SSE2-NEXT: retq 48; 49; AVX2-LABEL: test3: 50; AVX2: # %bb.0: 51; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm0 52; AVX2-NEXT: vpmovsxdq %xmm0, %xmm0 53; AVX2-NEXT: vzeroupper 54; AVX2-NEXT: retq 55; 56; AVX512-LABEL: test3: 57; AVX512: # %bb.0: 58; AVX512-NEXT: vpmovsxdq %ymm0, %zmm0 59; AVX512-NEXT: vextracti32x4 $2, %zmm0, %xmm0 60; AVX512-NEXT: vzeroupper 61; AVX512-NEXT: retq 62 %x = sext <8 x i32> %v to <8 x i64> 63 %s = shufflevector <8 x i64> %x, <8 x i64> undef, <2 x i32> <i32 4, i32 5> 64 %t = trunc <2 x i64> %s to <2 x i32> 65 ret <2 x i32> %t 66} 67 68define <2 x i32> @test4(<8 x i32> %v) { 69; SSE2-LABEL: test4: 70; SSE2: # %bb.0: 71; SSE2-NEXT: pxor %xmm1, %xmm1 72; SSE2-NEXT: pcmpgtd %xmm0, %xmm1 73; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1] 74; SSE2-NEXT: retq 75; 76; AVX2-LABEL: test4: 77; AVX2: # %bb.0: 78; AVX2-NEXT: vpmovsxdq %xmm0, %xmm0 79; AVX2-NEXT: vzeroupper 80; AVX2-NEXT: retq 81; 82; AVX512-LABEL: test4: 83; AVX512: # %bb.0: 84; AVX512-NEXT: vpmovsxdq %ymm0, %zmm0 85; AVX512-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm0 86; AVX512-NEXT: vzeroupper 87; AVX512-NEXT: retq 88 %x = sext <8 x i32> %v to <8 x i64> 89 %s = shufflevector <8 x i64> %x, <8 x i64> undef, <2 x i32> <i32 0, i32 1> 90 %t = trunc <2 x i64> %s to <2 x i32> 91 ret <2 x i32> %t 92} 93 94define <2 x i32> @test5(<8 x i32> %v) { 95; SSE2-LABEL: test5: 96; SSE2: # %bb.0: 97; SSE2-NEXT: pxor %xmm2, %xmm2 98; SSE2-NEXT: pxor %xmm3, %xmm3 99; SSE2-NEXT: pcmpgtd %xmm1, %xmm3 100; SSE2-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1] 101; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1] 102; SSE2-NEXT: pcmpgtd %xmm0, %xmm2 103; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1] 104; SSE2-NEXT: shufpd {{.*#+}} xmm0 = xmm0[1],xmm1[0] 105; SSE2-NEXT: retq 106; 107; AVX2-LABEL: test5: 108; AVX2: # %bb.0: 109; AVX2-NEXT: vpmovsxdq %xmm0, %ymm1 110; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm0 111; AVX2-NEXT: vpbroadcastd %xmm0, %ymm0 112; AVX2-NEXT: vpmovsxdq %xmm0, %ymm0 113; AVX2-NEXT: vpalignr {{.*#+}} ymm0 = ymm1[8,9,10,11,12,13,14,15],ymm0[0,1,2,3,4,5,6,7],ymm1[24,25,26,27,28,29,30,31],ymm0[16,17,18,19,20,21,22,23] 114; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[2,1,2,3] 115; AVX2-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0 116; AVX2-NEXT: vzeroupper 117; AVX2-NEXT: retq 118; 119; AVX512-LABEL: test5: 120; AVX512: # %bb.0: 121; AVX512-NEXT: vpmovsxdq %ymm0, %zmm0 122; AVX512-NEXT: vextracti32x4 $2, %zmm0, %xmm1 123; AVX512-NEXT: vextracti128 $1, %ymm0, %xmm0 124; AVX512-NEXT: vpalignr {{.*#+}} xmm0 = xmm0[8,9,10,11,12,13,14,15],xmm1[0,1,2,3,4,5,6,7] 125; AVX512-NEXT: vzeroupper 126; AVX512-NEXT: retq 127 %x = sext <8 x i32> %v to <8 x i64> 128 %s = shufflevector <8 x i64> %x, <8 x i64> undef, <2 x i32> <i32 3, i32 4> 129 %t = trunc <2 x i64> %s to <2 x i32> 130 ret <2 x i32> %t 131} 132 133define <4 x i32> @test6(<8 x i32> %v) { 134; SSE2-LABEL: test6: 135; SSE2: # %bb.0: 136; SSE2-NEXT: retq 137; 138; AVX-LABEL: test6: 139; AVX: # %bb.0: 140; AVX-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0 141; AVX-NEXT: vzeroupper 142; AVX-NEXT: retq 143 %x = zext <8 x i32> %v to <8 x i64> 144 %s = shufflevector <8 x i64> %x, <8 x i64> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3> 145 %t = trunc <4 x i64> %s to <4 x i32> 146 ret <4 x i32> %t 147} 148 149define <4 x i32> @test7(<8 x i32> %v) { 150; SSE2-LABEL: test7: 151; SSE2: # %bb.0: 152; SSE2-NEXT: movaps %xmm1, %xmm0 153; SSE2-NEXT: retq 154; 155; AVX-LABEL: test7: 156; AVX: # %bb.0: 157; AVX-NEXT: vextractf128 $1, %ymm0, %xmm0 158; AVX-NEXT: vzeroupper 159; AVX-NEXT: retq 160 %x = zext <8 x i32> %v to <8 x i64> 161 %s = shufflevector <8 x i64> %x, <8 x i64> undef, <4 x i32> <i32 4, i32 5, i32 6, i32 7> 162 %t = trunc <4 x i64> %s to <4 x i32> 163 ret <4 x i32> %t 164} 165 166define <2 x i32> @test8(<8 x i32> %v) { 167; SSE2-LABEL: test8: 168; SSE2: # %bb.0: 169; SSE2-NEXT: movaps %xmm1, %xmm0 170; SSE2-NEXT: xorps %xmm1, %xmm1 171; SSE2-NEXT: unpcklps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1] 172; SSE2-NEXT: retq 173; 174; AVX2-LABEL: test8: 175; AVX2: # %bb.0: 176; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm0 177; AVX2-NEXT: vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero 178; AVX2-NEXT: vzeroupper 179; AVX2-NEXT: retq 180; 181; AVX512-LABEL: test8: 182; AVX512: # %bb.0: 183; AVX512-NEXT: vpmovzxdq {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero 184; AVX512-NEXT: vextracti32x4 $2, %zmm0, %xmm0 185; AVX512-NEXT: vzeroupper 186; AVX512-NEXT: retq 187 %x = zext <8 x i32> %v to <8 x i64> 188 %s = shufflevector <8 x i64> %x, <8 x i64> undef, <2 x i32> <i32 4, i32 5> 189 %t = trunc <2 x i64> %s to <2 x i32> 190 ret <2 x i32> %t 191} 192 193define <2 x i32> @test9(<8 x i32> %v) { 194; SSE2-LABEL: test9: 195; SSE2: # %bb.0: 196; SSE2-NEXT: xorps %xmm1, %xmm1 197; SSE2-NEXT: unpcklps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1] 198; SSE2-NEXT: retq 199; 200; AVX2-LABEL: test9: 201; AVX2: # %bb.0: 202; AVX2-NEXT: vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero 203; AVX2-NEXT: vzeroupper 204; AVX2-NEXT: retq 205; 206; AVX512-LABEL: test9: 207; AVX512: # %bb.0: 208; AVX512-NEXT: vpmovzxdq {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero 209; AVX512-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm0 210; AVX512-NEXT: vzeroupper 211; AVX512-NEXT: retq 212 %x = zext <8 x i32> %v to <8 x i64> 213 %s = shufflevector <8 x i64> %x, <8 x i64> undef, <2 x i32> <i32 0, i32 1> 214 %t = trunc <2 x i64> %s to <2 x i32> 215 ret <2 x i32> %t 216} 217 218define <2 x i32> @test10(<8 x i32> %v) { 219; SSE2-LABEL: test10: 220; SSE2: # %bb.0: 221; SSE2-NEXT: xorpd %xmm2, %xmm2 222; SSE2-NEXT: unpcklps {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1] 223; SSE2-NEXT: unpckhps {{.*#+}} xmm0 = xmm0[2],xmm2[2],xmm0[3],xmm2[3] 224; SSE2-NEXT: shufpd {{.*#+}} xmm0 = xmm0[1],xmm1[0] 225; SSE2-NEXT: retq 226; 227; AVX2-LABEL: test10: 228; AVX2: # %bb.0: 229; AVX2-NEXT: vpmovzxdq {{.*#+}} ymm1 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero 230; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm0 231; AVX2-NEXT: vpbroadcastd %xmm0, %ymm0 232; AVX2-NEXT: vpmovzxdq {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero 233; AVX2-NEXT: vpalignr {{.*#+}} ymm0 = ymm1[8,9,10,11,12,13,14,15],ymm0[0,1,2,3,4,5,6,7],ymm1[24,25,26,27,28,29,30,31],ymm0[16,17,18,19,20,21,22,23] 234; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[2,1,2,3] 235; AVX2-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm0 236; AVX2-NEXT: vzeroupper 237; AVX2-NEXT: retq 238; 239; AVX512-LABEL: test10: 240; AVX512: # %bb.0: 241; AVX512-NEXT: vpmovzxdq {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero 242; AVX512-NEXT: vextracti32x4 $2, %zmm0, %xmm1 243; AVX512-NEXT: vextracti128 $1, %ymm0, %xmm0 244; AVX512-NEXT: vpalignr {{.*#+}} xmm0 = xmm0[8,9,10,11,12,13,14,15],xmm1[0,1,2,3,4,5,6,7] 245; AVX512-NEXT: vzeroupper 246; AVX512-NEXT: retq 247 %x = zext <8 x i32> %v to <8 x i64> 248 %s = shufflevector <8 x i64> %x, <8 x i64> undef, <2 x i32> <i32 3, i32 4> 249 %t = trunc <2 x i64> %s to <2 x i32> 250 ret <2 x i32> %t 251} 252