262 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 22; RUN: llc < %s -mtriple=x86_64-- -mattr=+avx512f | FileCheck %s --check-prefixes=AVX512,AVX512F3; RUN: llc < %s -mtriple=x86_64-- -mattr=+avx512f,avx512vl | FileCheck %s --check-prefixes=AVX512,AVX512VL4 5define dso_local <8 x i64> @select_sub(<8 x i64> %src, <8 x i64> %a, <8 x i64> %b, ptr %ptr) {6; AVX512-LABEL: select_sub:7; AVX512: # %bb.0: # %entry8; AVX512-NEXT: vmovdqa64 64(%rdi), %zmm39; AVX512-NEXT: vptestnmq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %zmm3, %k110; AVX512-NEXT: vpsubq %zmm2, %zmm1, %zmm0 {%k1}11; AVX512-NEXT: retq12entry:13 %arrayidx = getelementptr inbounds <8 x i64>, ptr %ptr, i64 114 %0 = load <8 x i64>, ptr %arrayidx, align 6415 %and1 = and <8 x i64> %0, <i64 2251799813685248, i64 2251799813685248, i64 2251799813685248, i64 2251799813685248, i64 2251799813685248, i64 2251799813685248, i64 2251799813685248, i64 2251799813685248>16 %not = icmp ne <8 x i64> %and1, zeroinitializer17 %sub = sub <8 x i64> %a, %b18 %1 = select <8 x i1> %not, <8 x i64> %src, <8 x i64> %sub19 ret <8 x i64> %120}21 22define dso_local <8 x i64> @select_add(<8 x i64> %src, <8 x i64> %a, <8 x i64> %b, ptr %ptr) {23; AVX512-LABEL: select_add:24; AVX512: # %bb.0: # %entry25; AVX512-NEXT: vmovdqa64 64(%rdi), %zmm326; AVX512-NEXT: vptestnmq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %zmm3, %k127; AVX512-NEXT: vpaddq %zmm2, %zmm1, %zmm0 {%k1}28; AVX512-NEXT: retq29entry:30 %arrayidx = getelementptr inbounds <8 x i64>, ptr %ptr, i64 131 %0 = load <8 x i64>, ptr %arrayidx, align 6432 %and1 = and <8 x i64> %0, <i64 2251799813685248, i64 2251799813685248, i64 2251799813685248, i64 2251799813685248, i64 2251799813685248, i64 2251799813685248, i64 2251799813685248, i64 2251799813685248>33 %not = icmp ne <8 x i64> %and1, zeroinitializer34 %add = add <8 x i64> %a, %b35 %1 = select <8 x i1> %not, <8 x i64> %src, <8 x i64> %add36 ret <8 x i64> %137}38 39define dso_local <8 x i64> @select_and(<8 x i64> %src, <8 x i64> %a, <8 x i64> %b, ptr %ptr) {40; AVX512-LABEL: select_and:41; AVX512: # %bb.0: # %entry42; AVX512-NEXT: vmovdqa64 64(%rdi), %zmm343; AVX512-NEXT: vptestnmq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %zmm3, %k144; AVX512-NEXT: vpandq %zmm2, %zmm1, %zmm0 {%k1}45; AVX512-NEXT: retq46entry:47 %arrayidx = getelementptr inbounds <8 x i64>, ptr %ptr, i64 148 %0 = load <8 x i64>, ptr %arrayidx, align 6449 %and1 = and <8 x i64> %0, <i64 2251799813685248, i64 2251799813685248, i64 2251799813685248, i64 2251799813685248, i64 2251799813685248, i64 2251799813685248, i64 2251799813685248, i64 2251799813685248>50 %not = icmp ne <8 x i64> %and1, zeroinitializer51 %and = and <8 x i64> %a, %b52 %1 = select <8 x i1> %not, <8 x i64> %src, <8 x i64> %and53 ret <8 x i64> %154}55 56define dso_local <8 x i64> @select_xor(<8 x i64> %src, <8 x i64> %a, <8 x i64> %b, ptr %ptr) {57; AVX512-LABEL: select_xor:58; AVX512: # %bb.0: # %entry59; AVX512-NEXT: vmovdqa64 64(%rdi), %zmm360; AVX512-NEXT: vptestnmq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %zmm3, %k161; AVX512-NEXT: vpxorq %zmm2, %zmm1, %zmm0 {%k1}62; AVX512-NEXT: retq63entry:64 %arrayidx = getelementptr inbounds <8 x i64>, ptr %ptr, i64 165 %0 = load <8 x i64>, ptr %arrayidx, align 6466 %and1 = and <8 x i64> %0, <i64 2251799813685248, i64 2251799813685248, i64 2251799813685248, i64 2251799813685248, i64 2251799813685248, i64 2251799813685248, i64 2251799813685248, i64 2251799813685248>67 %not = icmp ne <8 x i64> %and1, zeroinitializer68 %xor = xor <8 x i64> %a, %b69 %1 = select <8 x i1> %not, <8 x i64> %src, <8 x i64> %xor70 ret <8 x i64> %171}72 73define dso_local <8 x i64> @select_shl(<8 x i64> %src, <8 x i64> %a, <8 x i64> %b, ptr %ptr) {74; AVX512-LABEL: select_shl:75; AVX512: # %bb.0: # %entry76; AVX512-NEXT: vmovdqa64 64(%rdi), %zmm377; AVX512-NEXT: vptestnmq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %zmm3, %k178; AVX512-NEXT: vpsllvq %zmm2, %zmm1, %zmm0 {%k1}79; AVX512-NEXT: retq80entry:81 %arrayidx = getelementptr inbounds <8 x i64>, ptr %ptr, i64 182 %0 = load <8 x i64>, ptr %arrayidx, align 6483 %and1 = and <8 x i64> %0, <i64 2251799813685248, i64 2251799813685248, i64 2251799813685248, i64 2251799813685248, i64 2251799813685248, i64 2251799813685248, i64 2251799813685248, i64 2251799813685248>84 %not = icmp ne <8 x i64> %and1, zeroinitializer85 %shl = shl <8 x i64> %a, %b86 %1 = select <8 x i1> %not, <8 x i64> %src, <8 x i64> %shl87 ret <8 x i64> %188}89 90define dso_local <8 x i64> @select_srl(<8 x i64> %src, <8 x i64> %a, <8 x i64> %b, ptr %ptr) {91; AVX512-LABEL: select_srl:92; AVX512: # %bb.0: # %entry93; AVX512-NEXT: vmovdqa64 64(%rdi), %zmm394; AVX512-NEXT: vptestnmq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %zmm3, %k195; AVX512-NEXT: vpsrlvq %zmm2, %zmm1, %zmm0 {%k1}96; AVX512-NEXT: retq97entry:98 %arrayidx = getelementptr inbounds <8 x i64>, ptr %ptr, i64 199 %0 = load <8 x i64>, ptr %arrayidx, align 64100 %and1 = and <8 x i64> %0, <i64 2251799813685248, i64 2251799813685248, i64 2251799813685248, i64 2251799813685248, i64 2251799813685248, i64 2251799813685248, i64 2251799813685248, i64 2251799813685248>101 %not = icmp ne <8 x i64> %and1, zeroinitializer102 %srl = lshr <8 x i64> %a, %b103 %1 = select <8 x i1> %not, <8 x i64> %src, <8 x i64> %srl104 ret <8 x i64> %1105}106 107define dso_local <8 x i64> @select_sra(<8 x i64> %src, <8 x i64> %a, <8 x i64> %b, ptr %ptr) {108; AVX512-LABEL: select_sra:109; AVX512: # %bb.0: # %entry110; AVX512-NEXT: vmovdqa64 64(%rdi), %zmm3111; AVX512-NEXT: vptestnmq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %zmm3, %k1112; AVX512-NEXT: vpsravq %zmm2, %zmm1, %zmm0 {%k1}113; AVX512-NEXT: retq114entry:115 %arrayidx = getelementptr inbounds <8 x i64>, ptr %ptr, i64 1116 %0 = load <8 x i64>, ptr %arrayidx, align 64117 %and1 = and <8 x i64> %0, <i64 2251799813685248, i64 2251799813685248, i64 2251799813685248, i64 2251799813685248, i64 2251799813685248, i64 2251799813685248, i64 2251799813685248, i64 2251799813685248>118 %not = icmp ne <8 x i64> %and1, zeroinitializer119 %sra = ashr <8 x i64> %a, %b120 %1 = select <8 x i1> %not, <8 x i64> %src, <8 x i64> %sra121 ret <8 x i64> %1122}123 124define dso_local <8 x i32> @select_mul(<8 x i32> %src, <8 x i32> %a, <8 x i32> %b, ptr %ptr) {125; AVX512F-LABEL: select_mul:126; AVX512F: # %bb.0: # %entry127; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0128; AVX512F-NEXT: vmovdqa 32(%rdi), %ymm3129; AVX512F-NEXT: vptestnmd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm3, %k1130; AVX512F-NEXT: vpmulld %ymm2, %ymm1, %ymm1131; AVX512F-NEXT: vmovdqa32 %zmm1, %zmm0 {%k1}132; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm0133; AVX512F-NEXT: retq134;135; AVX512VL-LABEL: select_mul:136; AVX512VL: # %bb.0: # %entry137; AVX512VL-NEXT: vmovdqa 32(%rdi), %ymm3138; AVX512VL-NEXT: vptestnmd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm3, %k1139; AVX512VL-NEXT: vpmulld %ymm2, %ymm1, %ymm0 {%k1}140; AVX512VL-NEXT: retq141entry:142 %arrayidx = getelementptr inbounds <8 x i32>, ptr %ptr, i32 1143 %0 = load <8 x i32>, ptr %arrayidx, align 64144 %and1 = and <8 x i32> %0, <i32 22517, i32 22517, i32 22517, i32 22517, i32 22517, i32 22517, i32 22517, i32 22517>145 %not = icmp ne <8 x i32> %and1, zeroinitializer146 %mul = mul <8 x i32> %a, %b147 %1 = select <8 x i1> %not, <8 x i32> %src, <8 x i32> %mul148 ret <8 x i32> %1149}150 151define dso_local <8 x i32> @select_smax(<8 x i32> %src, <8 x i32> %a, <8 x i32> %b, ptr %ptr) {152; AVX512F-LABEL: select_smax:153; AVX512F: # %bb.0: # %entry154; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0155; AVX512F-NEXT: vmovdqa 32(%rdi), %ymm3156; AVX512F-NEXT: vptestnmd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm3, %k1157; AVX512F-NEXT: vpmaxsd %ymm2, %ymm1, %ymm1158; AVX512F-NEXT: vmovdqa32 %zmm1, %zmm0 {%k1}159; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm0160; AVX512F-NEXT: retq161;162; AVX512VL-LABEL: select_smax:163; AVX512VL: # %bb.0: # %entry164; AVX512VL-NEXT: vmovdqa 32(%rdi), %ymm3165; AVX512VL-NEXT: vptestnmd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm3, %k1166; AVX512VL-NEXT: vpmaxsd %ymm2, %ymm1, %ymm0 {%k1}167; AVX512VL-NEXT: retq168entry:169 %arrayidx = getelementptr inbounds <8 x i32>, ptr %ptr, i32 1170 %0 = load <8 x i32>, ptr %arrayidx, align 64171 %and1 = and <8 x i32> %0, <i32 22517, i32 22517, i32 22517, i32 22517, i32 22517, i32 22517, i32 22517, i32 22517>172 %not = icmp ne <8 x i32> %and1, zeroinitializer173 %smax = call <8 x i32> @llvm.smax.v4i32(<8 x i32> %a, <8 x i32> %b)174 %1 = select <8 x i1> %not, <8 x i32> %src, <8 x i32> %smax175 ret <8 x i32> %1176}177declare <8 x i32> @llvm.smax.v4i32(<8 x i32> %a, <8 x i32> %b)178 179define dso_local <8 x i32> @select_smin(<8 x i32> %src, <8 x i32> %a, <8 x i32> %b, ptr %ptr) {180; AVX512F-LABEL: select_smin:181; AVX512F: # %bb.0: # %entry182; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0183; AVX512F-NEXT: vmovdqa 32(%rdi), %ymm3184; AVX512F-NEXT: vptestnmd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm3, %k1185; AVX512F-NEXT: vpminsd %ymm2, %ymm1, %ymm1186; AVX512F-NEXT: vmovdqa32 %zmm1, %zmm0 {%k1}187; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm0188; AVX512F-NEXT: retq189;190; AVX512VL-LABEL: select_smin:191; AVX512VL: # %bb.0: # %entry192; AVX512VL-NEXT: vmovdqa 32(%rdi), %ymm3193; AVX512VL-NEXT: vptestnmd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm3, %k1194; AVX512VL-NEXT: vpminsd %ymm2, %ymm1, %ymm0 {%k1}195; AVX512VL-NEXT: retq196entry:197 %arrayidx = getelementptr inbounds <8 x i32>, ptr %ptr, i32 1198 %0 = load <8 x i32>, ptr %arrayidx, align 64199 %and1 = and <8 x i32> %0, <i32 22517, i32 22517, i32 22517, i32 22517, i32 22517, i32 22517, i32 22517, i32 22517>200 %not = icmp ne <8 x i32> %and1, zeroinitializer201 %smin = call <8 x i32> @llvm.smin.v4i32(<8 x i32> %a, <8 x i32> %b)202 %1 = select <8 x i1> %not, <8 x i32> %src, <8 x i32> %smin203 ret <8 x i32> %1204}205declare <8 x i32> @llvm.smin.v4i32(<8 x i32> %a, <8 x i32> %b)206 207define dso_local <8 x i32> @select_umax(<8 x i32> %src, <8 x i32> %a, <8 x i32> %b, ptr %ptr) {208; AVX512F-LABEL: select_umax:209; AVX512F: # %bb.0: # %entry210; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0211; AVX512F-NEXT: vmovdqa 32(%rdi), %ymm3212; AVX512F-NEXT: vptestnmd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm3, %k1213; AVX512F-NEXT: vpmaxud %ymm2, %ymm1, %ymm1214; AVX512F-NEXT: vmovdqa32 %zmm1, %zmm0 {%k1}215; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm0216; AVX512F-NEXT: retq217;218; AVX512VL-LABEL: select_umax:219; AVX512VL: # %bb.0: # %entry220; AVX512VL-NEXT: vmovdqa 32(%rdi), %ymm3221; AVX512VL-NEXT: vptestnmd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm3, %k1222; AVX512VL-NEXT: vpmaxud %ymm2, %ymm1, %ymm0 {%k1}223; AVX512VL-NEXT: retq224entry:225 %arrayidx = getelementptr inbounds <8 x i32>, ptr %ptr, i32 1226 %0 = load <8 x i32>, ptr %arrayidx, align 64227 %and1 = and <8 x i32> %0, <i32 22517, i32 22517, i32 22517, i32 22517, i32 22517, i32 22517, i32 22517, i32 22517>228 %not = icmp ne <8 x i32> %and1, zeroinitializer229 %umax = call <8 x i32> @llvm.umax.v4i32(<8 x i32> %a, <8 x i32> %b)230 %1 = select <8 x i1> %not, <8 x i32> %src, <8 x i32> %umax231 ret <8 x i32> %1232}233declare <8 x i32> @llvm.umax.v4i32(<8 x i32> %a, <8 x i32> %b)234 235define dso_local <8 x i32> @select_umin(<8 x i32> %src, <8 x i32> %a, <8 x i32> %b, ptr %ptr) {236; AVX512F-LABEL: select_umin:237; AVX512F: # %bb.0: # %entry238; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0239; AVX512F-NEXT: vmovdqa 32(%rdi), %ymm3240; AVX512F-NEXT: vptestnmd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm3, %k1241; AVX512F-NEXT: vpminud %ymm2, %ymm1, %ymm1242; AVX512F-NEXT: vmovdqa32 %zmm1, %zmm0 {%k1}243; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm0244; AVX512F-NEXT: retq245;246; AVX512VL-LABEL: select_umin:247; AVX512VL: # %bb.0: # %entry248; AVX512VL-NEXT: vmovdqa 32(%rdi), %ymm3249; AVX512VL-NEXT: vptestnmd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm3, %k1250; AVX512VL-NEXT: vpminud %ymm2, %ymm1, %ymm0 {%k1}251; AVX512VL-NEXT: retq252entry:253 %arrayidx = getelementptr inbounds <8 x i32>, ptr %ptr, i32 1254 %0 = load <8 x i32>, ptr %arrayidx, align 64255 %and1 = and <8 x i32> %0, <i32 22517, i32 22517, i32 22517, i32 22517, i32 22517, i32 22517, i32 22517, i32 22517>256 %not = icmp ne <8 x i32> %and1, zeroinitializer257 %umin = call <8 x i32> @llvm.umin.v4i32(<8 x i32> %a, <8 x i32> %b)258 %1 = select <8 x i1> %not, <8 x i32> %src, <8 x i32> %umin259 ret <8 x i32> %1260}261declare <8 x i32> @llvm.umin.v4i32(<8 x i32> %a, <8 x i32> %b)262