269 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512vl,+prefer-256-bit | FileCheck %s --check-prefix=AVX2563; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512vl,-prefer-256-bit | FileCheck %s --check-prefix=AVX512VL4; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+prefer-256-bit | FileCheck %s --check-prefix=AVX512F5; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,-prefer-256-bit | FileCheck %s --check-prefix=AVX512F6 7define <8 x i16> @testv8i1_sext_v8i16(ptr %p) {8; AVX256-LABEL: testv8i1_sext_v8i16:9; AVX256: # %bb.0:10; AVX256-NEXT: vmovdqa (%rdi), %ymm011; AVX256-NEXT: vptestnmd %ymm0, %ymm0, %k112; AVX256-NEXT: vpcmpeqd %ymm0, %ymm0, %ymm013; AVX256-NEXT: vmovdqa32 %ymm0, %ymm0 {%k1} {z}14; AVX256-NEXT: vpmovdw %ymm0, %xmm015; AVX256-NEXT: vzeroupper16; AVX256-NEXT: retq17;18; AVX512VL-LABEL: testv8i1_sext_v8i16:19; AVX512VL: # %bb.0:20; AVX512VL-NEXT: vmovdqa (%rdi), %ymm021; AVX512VL-NEXT: vptestnmd %ymm0, %ymm0, %k122; AVX512VL-NEXT: vpcmpeqd %ymm0, %ymm0, %ymm023; AVX512VL-NEXT: vmovdqa32 %ymm0, %ymm0 {%k1} {z}24; AVX512VL-NEXT: vpmovdw %ymm0, %xmm025; AVX512VL-NEXT: vzeroupper26; AVX512VL-NEXT: retq27;28; AVX512F-LABEL: testv8i1_sext_v8i16:29; AVX512F: # %bb.0:30; AVX512F-NEXT: vpxor %xmm0, %xmm0, %xmm031; AVX512F-NEXT: vpcmpeqd (%rdi), %ymm0, %ymm032; AVX512F-NEXT: vpmovdw %zmm0, %ymm033; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 killed $ymm034; AVX512F-NEXT: vzeroupper35; AVX512F-NEXT: retq36 %in = load <8 x i32>, ptr %p37 %cmp = icmp eq <8 x i32> %in, zeroinitializer38 %ext = sext <8 x i1> %cmp to <8 x i16>39 ret <8 x i16> %ext40}41 42define <16 x i8> @testv16i1_sext_v16i8(ptr %p, ptr %q) {43; AVX256-LABEL: testv16i1_sext_v16i8:44; AVX256: # %bb.0:45; AVX256-NEXT: vmovdqa (%rdi), %ymm046; AVX256-NEXT: vptestnmd %ymm0, %ymm0, %k147; AVX256-NEXT: vmovdqa (%rsi), %ymm048; AVX256-NEXT: vptestnmd %ymm0, %ymm0, %k249; AVX256-NEXT: vpcmpeqd %ymm0, %ymm0, %ymm050; AVX256-NEXT: vmovdqa32 %ymm0, %ymm1 {%k2} {z}51; AVX256-NEXT: vpmovdw %ymm1, %xmm152; AVX256-NEXT: vmovdqa32 %ymm0, %ymm0 {%k1} {z}53; AVX256-NEXT: vpmovdw %ymm0, %xmm054; AVX256-NEXT: vpacksswb %xmm1, %xmm0, %xmm055; AVX256-NEXT: vzeroupper56; AVX256-NEXT: retq57;58; AVX512VL-LABEL: testv16i1_sext_v16i8:59; AVX512VL: # %bb.0:60; AVX512VL-NEXT: vmovdqa (%rdi), %ymm061; AVX512VL-NEXT: vptestnmd %ymm0, %ymm0, %k062; AVX512VL-NEXT: vmovdqa (%rsi), %ymm063; AVX512VL-NEXT: vptestnmd %ymm0, %ymm0, %k164; AVX512VL-NEXT: kunpckbw %k0, %k1, %k165; AVX512VL-NEXT: vpternlogd {{.*#+}} zmm0 {%k1} {z} = -166; AVX512VL-NEXT: vpmovdb %zmm0, %xmm067; AVX512VL-NEXT: vzeroupper68; AVX512VL-NEXT: retq69;70; AVX512F-LABEL: testv16i1_sext_v16i8:71; AVX512F: # %bb.0:72; AVX512F-NEXT: vmovdqa (%rdi), %ymm073; AVX512F-NEXT: vptestnmd %zmm0, %zmm0, %k074; AVX512F-NEXT: vmovdqa (%rsi), %ymm075; AVX512F-NEXT: vptestnmd %zmm0, %zmm0, %k176; AVX512F-NEXT: kunpckbw %k0, %k1, %k177; AVX512F-NEXT: vpternlogd {{.*#+}} zmm0 {%k1} {z} = -178; AVX512F-NEXT: vpmovdb %zmm0, %xmm079; AVX512F-NEXT: vzeroupper80; AVX512F-NEXT: retq81 %in = load <8 x i32>, ptr %p82 %cmp = icmp eq <8 x i32> %in, zeroinitializer83 %in2 = load <8 x i32>, ptr %q84 %cmp2 = icmp eq <8 x i32> %in2, zeroinitializer85 %concat = shufflevector <8 x i1> %cmp, <8 x i1> %cmp2, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>86 %ext = sext <16 x i1> %concat to <16 x i8>87 ret <16 x i8> %ext88}89 90define <16 x i16> @testv16i1_sext_v16i16(ptr %p, ptr %q) {91; AVX256-LABEL: testv16i1_sext_v16i16:92; AVX256: # %bb.0:93; AVX256-NEXT: vmovdqa (%rdi), %ymm094; AVX256-NEXT: vptestnmd %ymm0, %ymm0, %k195; AVX256-NEXT: vmovdqa (%rsi), %ymm096; AVX256-NEXT: vptestnmd %ymm0, %ymm0, %k297; AVX256-NEXT: vpcmpeqd %ymm0, %ymm0, %ymm098; AVX256-NEXT: vmovdqa32 %ymm0, %ymm1 {%k1} {z}99; AVX256-NEXT: vpmovdw %ymm1, %xmm1100; AVX256-NEXT: vmovdqa32 %ymm0, %ymm0 {%k2} {z}101; AVX256-NEXT: vpmovdw %ymm0, %xmm0102; AVX256-NEXT: vinserti128 $1, %xmm0, %ymm1, %ymm0103; AVX256-NEXT: retq104;105; AVX512VL-LABEL: testv16i1_sext_v16i16:106; AVX512VL: # %bb.0:107; AVX512VL-NEXT: vmovdqa (%rdi), %ymm0108; AVX512VL-NEXT: vptestnmd %ymm0, %ymm0, %k0109; AVX512VL-NEXT: vmovdqa (%rsi), %ymm0110; AVX512VL-NEXT: vptestnmd %ymm0, %ymm0, %k1111; AVX512VL-NEXT: kunpckbw %k0, %k1, %k1112; AVX512VL-NEXT: vpternlogd {{.*#+}} zmm0 {%k1} {z} = -1113; AVX512VL-NEXT: vpmovdw %zmm0, %ymm0114; AVX512VL-NEXT: retq115;116; AVX512F-LABEL: testv16i1_sext_v16i16:117; AVX512F: # %bb.0:118; AVX512F-NEXT: vmovdqa (%rdi), %ymm0119; AVX512F-NEXT: vptestnmd %zmm0, %zmm0, %k0120; AVX512F-NEXT: vmovdqa (%rsi), %ymm0121; AVX512F-NEXT: vptestnmd %zmm0, %zmm0, %k1122; AVX512F-NEXT: kunpckbw %k0, %k1, %k1123; AVX512F-NEXT: vpternlogd {{.*#+}} zmm0 {%k1} {z} = -1124; AVX512F-NEXT: vpmovdw %zmm0, %ymm0125; AVX512F-NEXT: retq126 %in = load <8 x i32>, ptr %p127 %cmp = icmp eq <8 x i32> %in, zeroinitializer128 %in2 = load <8 x i32>, ptr %q129 %cmp2 = icmp eq <8 x i32> %in2, zeroinitializer130 %concat = shufflevector <8 x i1> %cmp, <8 x i1> %cmp2, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>131 %ext = sext <16 x i1> %concat to <16 x i16>132 ret <16 x i16> %ext133}134 135define <8 x i16> @testv8i1_zext_v8i16(ptr %p) {136; AVX256-LABEL: testv8i1_zext_v8i16:137; AVX256: # %bb.0:138; AVX256-NEXT: vmovdqa (%rdi), %ymm0139; AVX256-NEXT: vptestnmd %ymm0, %ymm0, %k1140; AVX256-NEXT: vpcmpeqd %ymm0, %ymm0, %ymm0141; AVX256-NEXT: vmovdqa32 %ymm0, %ymm0 {%k1} {z}142; AVX256-NEXT: vpmovdw %ymm0, %xmm0143; AVX256-NEXT: vpsrlw $15, %xmm0, %xmm0144; AVX256-NEXT: vzeroupper145; AVX256-NEXT: retq146;147; AVX512VL-LABEL: testv8i1_zext_v8i16:148; AVX512VL: # %bb.0:149; AVX512VL-NEXT: vmovdqa (%rdi), %ymm0150; AVX512VL-NEXT: vptestnmd %ymm0, %ymm0, %k1151; AVX512VL-NEXT: vpcmpeqd %ymm0, %ymm0, %ymm0152; AVX512VL-NEXT: vmovdqa32 %ymm0, %ymm0 {%k1} {z}153; AVX512VL-NEXT: vpmovdw %ymm0, %xmm0154; AVX512VL-NEXT: vpsrlw $15, %xmm0, %xmm0155; AVX512VL-NEXT: vzeroupper156; AVX512VL-NEXT: retq157;158; AVX512F-LABEL: testv8i1_zext_v8i16:159; AVX512F: # %bb.0:160; AVX512F-NEXT: vpxor %xmm0, %xmm0, %xmm0161; AVX512F-NEXT: vpcmpeqd (%rdi), %ymm0, %ymm0162; AVX512F-NEXT: vpmovdw %zmm0, %ymm0163; AVX512F-NEXT: vpsrlw $15, %xmm0, %xmm0164; AVX512F-NEXT: vzeroupper165; AVX512F-NEXT: retq166 %in = load <8 x i32>, ptr %p167 %cmp = icmp eq <8 x i32> %in, zeroinitializer168 %ext = zext <8 x i1> %cmp to <8 x i16>169 ret <8 x i16> %ext170}171 172define <16 x i8> @testv16i1_zext_v16i8(ptr %p, ptr %q) {173; AVX256-LABEL: testv16i1_zext_v16i8:174; AVX256: # %bb.0:175; AVX256-NEXT: vmovdqa (%rdi), %ymm0176; AVX256-NEXT: vptestnmd %ymm0, %ymm0, %k1177; AVX256-NEXT: vmovdqa (%rsi), %ymm0178; AVX256-NEXT: vptestnmd %ymm0, %ymm0, %k2179; AVX256-NEXT: vpcmpeqd %ymm0, %ymm0, %ymm0180; AVX256-NEXT: vmovdqa32 %ymm0, %ymm1 {%k2} {z}181; AVX256-NEXT: vpmovdw %ymm1, %xmm1182; AVX256-NEXT: vpsrlw $15, %xmm1, %xmm1183; AVX256-NEXT: vmovdqa32 %ymm0, %ymm0 {%k1} {z}184; AVX256-NEXT: vpmovdw %ymm0, %xmm0185; AVX256-NEXT: vpsrlw $15, %xmm0, %xmm0186; AVX256-NEXT: vpackuswb %xmm1, %xmm0, %xmm0187; AVX256-NEXT: vzeroupper188; AVX256-NEXT: retq189;190; AVX512VL-LABEL: testv16i1_zext_v16i8:191; AVX512VL: # %bb.0:192; AVX512VL-NEXT: vmovdqa (%rdi), %ymm0193; AVX512VL-NEXT: vptestnmd %ymm0, %ymm0, %k0194; AVX512VL-NEXT: vmovdqa (%rsi), %ymm0195; AVX512VL-NEXT: vptestnmd %ymm0, %ymm0, %k1196; AVX512VL-NEXT: kunpckbw %k0, %k1, %k1197; AVX512VL-NEXT: vpbroadcastd {{.*#+}} zmm0 {%k1} {z} = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]198; AVX512VL-NEXT: vpmovdb %zmm0, %xmm0199; AVX512VL-NEXT: vzeroupper200; AVX512VL-NEXT: retq201;202; AVX512F-LABEL: testv16i1_zext_v16i8:203; AVX512F: # %bb.0:204; AVX512F-NEXT: vmovdqa (%rdi), %ymm0205; AVX512F-NEXT: vptestnmd %zmm0, %zmm0, %k0206; AVX512F-NEXT: vmovdqa (%rsi), %ymm0207; AVX512F-NEXT: vptestnmd %zmm0, %zmm0, %k1208; AVX512F-NEXT: kunpckbw %k0, %k1, %k1209; AVX512F-NEXT: vpbroadcastd {{.*#+}} zmm0 {%k1} {z} = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]210; AVX512F-NEXT: vpmovdb %zmm0, %xmm0211; AVX512F-NEXT: vzeroupper212; AVX512F-NEXT: retq213 %in = load <8 x i32>, ptr %p214 %cmp = icmp eq <8 x i32> %in, zeroinitializer215 %in2 = load <8 x i32>, ptr %q216 %cmp2 = icmp eq <8 x i32> %in2, zeroinitializer217 %concat = shufflevector <8 x i1> %cmp, <8 x i1> %cmp2, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>218 %ext = zext <16 x i1> %concat to <16 x i8>219 ret <16 x i8> %ext220}221 222define <16 x i16> @testv16i1_zext_v16i16(ptr %p, ptr %q) {223; AVX256-LABEL: testv16i1_zext_v16i16:224; AVX256: # %bb.0:225; AVX256-NEXT: vmovdqa (%rdi), %ymm0226; AVX256-NEXT: vptestnmd %ymm0, %ymm0, %k1227; AVX256-NEXT: vmovdqa (%rsi), %ymm0228; AVX256-NEXT: vptestnmd %ymm0, %ymm0, %k2229; AVX256-NEXT: vpcmpeqd %ymm0, %ymm0, %ymm0230; AVX256-NEXT: vmovdqa32 %ymm0, %ymm1 {%k1} {z}231; AVX256-NEXT: vpmovdw %ymm1, %xmm1232; AVX256-NEXT: vmovdqa32 %ymm0, %ymm0 {%k2} {z}233; AVX256-NEXT: vpmovdw %ymm0, %xmm0234; AVX256-NEXT: vinserti128 $1, %xmm0, %ymm1, %ymm0235; AVX256-NEXT: vpsrlw $15, %ymm0, %ymm0236; AVX256-NEXT: retq237;238; AVX512VL-LABEL: testv16i1_zext_v16i16:239; AVX512VL: # %bb.0:240; AVX512VL-NEXT: vmovdqa (%rdi), %ymm0241; AVX512VL-NEXT: vptestnmd %ymm0, %ymm0, %k0242; AVX512VL-NEXT: vmovdqa (%rsi), %ymm0243; AVX512VL-NEXT: vptestnmd %ymm0, %ymm0, %k1244; AVX512VL-NEXT: kunpckbw %k0, %k1, %k1245; AVX512VL-NEXT: vpternlogd {{.*#+}} zmm0 {%k1} {z} = -1246; AVX512VL-NEXT: vpmovdw %zmm0, %ymm0247; AVX512VL-NEXT: vpsrlw $15, %ymm0, %ymm0248; AVX512VL-NEXT: retq249;250; AVX512F-LABEL: testv16i1_zext_v16i16:251; AVX512F: # %bb.0:252; AVX512F-NEXT: vmovdqa (%rdi), %ymm0253; AVX512F-NEXT: vptestnmd %zmm0, %zmm0, %k0254; AVX512F-NEXT: vmovdqa (%rsi), %ymm0255; AVX512F-NEXT: vptestnmd %zmm0, %zmm0, %k1256; AVX512F-NEXT: kunpckbw %k0, %k1, %k1257; AVX512F-NEXT: vpternlogd {{.*#+}} zmm0 {%k1} {z} = -1258; AVX512F-NEXT: vpmovdw %zmm0, %ymm0259; AVX512F-NEXT: vpsrlw $15, %ymm0, %ymm0260; AVX512F-NEXT: retq261 %in = load <8 x i32>, ptr %p262 %cmp = icmp eq <8 x i32> %in, zeroinitializer263 %in2 = load <8 x i32>, ptr %q264 %cmp2 = icmp eq <8 x i32> %in2, zeroinitializer265 %concat = shufflevector <8 x i1> %cmp, <8 x i1> %cmp2, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>266 %ext = zext <16 x i1> %concat to <16 x i16>267 ret <16 x i16> %ext268}269