233 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f | FileCheck %s --check-prefix=CHECK --check-prefix=X643; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+avx512f | FileCheck %s --check-prefix=CHECK --check-prefix=X864 5; Function Attrs: norecurse nounwind readnone6define zeroext i8 @TEST_mm512_test_epi64_mask(<8 x i64> %__A, <8 x i64> %__B) local_unnamed_addr #0 {7; CHECK-LABEL: TEST_mm512_test_epi64_mask:8; CHECK: # %bb.0: # %entry9; CHECK-NEXT: vptestmq %zmm0, %zmm1, %k010; CHECK-NEXT: kmovw %k0, %eax11; CHECK-NEXT: # kill: def $al killed $al killed $eax12; CHECK-NEXT: vzeroupper13; CHECK-NEXT: ret{{[l|q]}}14entry:15 %and.i.i = and <8 x i64> %__B, %__A16 %0 = icmp ne <8 x i64> %and.i.i, zeroinitializer17 %1 = bitcast <8 x i1> %0 to i818 ret i8 %119}20 21; Similar to the above, but the compare is reversed to have the zeros on the LHS22define zeroext i8 @TEST_mm512_test_epi64_mask_2(<8 x i64> %__A, <8 x i64> %__B) local_unnamed_addr #0 {23; CHECK-LABEL: TEST_mm512_test_epi64_mask_2:24; CHECK: # %bb.0: # %entry25; CHECK-NEXT: vptestmq %zmm0, %zmm1, %k026; CHECK-NEXT: kmovw %k0, %eax27; CHECK-NEXT: # kill: def $al killed $al killed $eax28; CHECK-NEXT: vzeroupper29; CHECK-NEXT: ret{{[l|q]}}30entry:31 %and.i.i = and <8 x i64> %__B, %__A32 %0 = icmp ne <8 x i64> zeroinitializer, %and.i.i33 %1 = bitcast <8 x i1> %0 to i834 ret i8 %135}36 37; Function Attrs: norecurse nounwind readnone38define zeroext i16 @TEST_mm512_test_epi32_mask(<8 x i64> %__A, <8 x i64> %__B) local_unnamed_addr #0 {39; CHECK-LABEL: TEST_mm512_test_epi32_mask:40; CHECK: # %bb.0: # %entry41; CHECK-NEXT: vptestmd %zmm0, %zmm1, %k042; CHECK-NEXT: kmovw %k0, %eax43; CHECK-NEXT: # kill: def $ax killed $ax killed $eax44; CHECK-NEXT: vzeroupper45; CHECK-NEXT: ret{{[l|q]}}46entry:47 %and.i.i = and <8 x i64> %__B, %__A48 %0 = bitcast <8 x i64> %and.i.i to <16 x i32>49 %1 = icmp ne <16 x i32> %0, zeroinitializer50 %2 = bitcast <16 x i1> %1 to i1651 ret i16 %252}53 54; Function Attrs: norecurse nounwind readnone55define zeroext i8 @TEST_mm512_mask_test_epi64_mask(i8 %__U, <8 x i64> %__A, <8 x i64> %__B) local_unnamed_addr #0 {56; X64-LABEL: TEST_mm512_mask_test_epi64_mask:57; X64: # %bb.0: # %entry58; X64-NEXT: vptestmq %zmm0, %zmm1, %k059; X64-NEXT: kmovw %k0, %eax60; X64-NEXT: andb %dil, %al61; X64-NEXT: # kill: def $al killed $al killed $eax62; X64-NEXT: vzeroupper63; X64-NEXT: retq64;65; X86-LABEL: TEST_mm512_mask_test_epi64_mask:66; X86: # %bb.0: # %entry67; X86-NEXT: vptestmq %zmm0, %zmm1, %k068; X86-NEXT: kmovw %k0, %eax69; X86-NEXT: andb {{[0-9]+}}(%esp), %al70; X86-NEXT: # kill: def $al killed $al killed $eax71; X86-NEXT: vzeroupper72; X86-NEXT: retl73entry:74 %and.i.i = and <8 x i64> %__B, %__A75 %0 = icmp ne <8 x i64> %and.i.i, zeroinitializer76 %1 = bitcast i8 %__U to <8 x i1>77 %2 = and <8 x i1> %0, %178 %3 = bitcast <8 x i1> %2 to i879 ret i8 %380}81 82; Function Attrs: norecurse nounwind readnone83define zeroext i16 @TEST_mm512_mask_test_epi32_mask(i16 %__U, <8 x i64> %__A, <8 x i64> %__B) local_unnamed_addr #0 {84; X64-LABEL: TEST_mm512_mask_test_epi32_mask:85; X64: # %bb.0: # %entry86; X64-NEXT: vptestmd %zmm0, %zmm1, %k087; X64-NEXT: kmovw %k0, %eax88; X64-NEXT: andl %edi, %eax89; X64-NEXT: # kill: def $ax killed $ax killed $eax90; X64-NEXT: vzeroupper91; X64-NEXT: retq92;93; X86-LABEL: TEST_mm512_mask_test_epi32_mask:94; X86: # %bb.0: # %entry95; X86-NEXT: vptestmd %zmm0, %zmm1, %k096; X86-NEXT: kmovw %k0, %eax97; X86-NEXT: andw {{[0-9]+}}(%esp), %ax98; X86-NEXT: # kill: def $ax killed $ax killed $eax99; X86-NEXT: vzeroupper100; X86-NEXT: retl101entry:102 %and.i.i = and <8 x i64> %__B, %__A103 %0 = bitcast <8 x i64> %and.i.i to <16 x i32>104 %1 = icmp ne <16 x i32> %0, zeroinitializer105 %2 = bitcast i16 %__U to <16 x i1>106 %3 = and <16 x i1> %1, %2107 %4 = bitcast <16 x i1> %3 to i16108 ret i16 %4109}110 111; Function Attrs: norecurse nounwind readnone112define zeroext i8 @TEST_mm512_testn_epi64_mask(<8 x i64> %__A, <8 x i64> %__B) local_unnamed_addr #0 {113; CHECK-LABEL: TEST_mm512_testn_epi64_mask:114; CHECK: # %bb.0: # %entry115; CHECK-NEXT: vptestnmq %zmm0, %zmm1, %k0116; CHECK-NEXT: kmovw %k0, %eax117; CHECK-NEXT: # kill: def $al killed $al killed $eax118; CHECK-NEXT: vzeroupper119; CHECK-NEXT: ret{{[l|q]}}120entry:121 %and.i.i = and <8 x i64> %__B, %__A122 %0 = icmp eq <8 x i64> %and.i.i, zeroinitializer123 %1 = bitcast <8 x i1> %0 to i8124 ret i8 %1125}126 127; Similar to the above, but the compare is reversed to have the zeros on the LHS128define zeroext i8 @TEST_mm512_testn_epi64_mask_2(<8 x i64> %__A, <8 x i64> %__B) local_unnamed_addr #0 {129; CHECK-LABEL: TEST_mm512_testn_epi64_mask_2:130; CHECK: # %bb.0: # %entry131; CHECK-NEXT: vptestnmq %zmm0, %zmm1, %k0132; CHECK-NEXT: kmovw %k0, %eax133; CHECK-NEXT: # kill: def $al killed $al killed $eax134; CHECK-NEXT: vzeroupper135; CHECK-NEXT: ret{{[l|q]}}136entry:137 %and.i.i = and <8 x i64> %__B, %__A138 %0 = icmp eq <8 x i64> zeroinitializer, %and.i.i139 %1 = bitcast <8 x i1> %0 to i8140 ret i8 %1141}142 143; Function Attrs: norecurse nounwind readnone144define zeroext i16 @TEST_mm512_testn_epi32_mask(<8 x i64> %__A, <8 x i64> %__B) local_unnamed_addr #0 {145; CHECK-LABEL: TEST_mm512_testn_epi32_mask:146; CHECK: # %bb.0: # %entry147; CHECK-NEXT: vptestnmd %zmm0, %zmm1, %k0148; CHECK-NEXT: kmovw %k0, %eax149; CHECK-NEXT: # kill: def $ax killed $ax killed $eax150; CHECK-NEXT: vzeroupper151; CHECK-NEXT: ret{{[l|q]}}152entry:153 %and.i.i = and <8 x i64> %__B, %__A154 %0 = bitcast <8 x i64> %and.i.i to <16 x i32>155 %1 = icmp eq <16 x i32> %0, zeroinitializer156 %2 = bitcast <16 x i1> %1 to i16157 ret i16 %2158}159 160; Function Attrs: norecurse nounwind readnone161define zeroext i8 @TEST_mm512_mask_testn_epi64_mask(i8 %__U, <8 x i64> %__A, <8 x i64> %__B) local_unnamed_addr #0 {162; X64-LABEL: TEST_mm512_mask_testn_epi64_mask:163; X64: # %bb.0: # %entry164; X64-NEXT: vptestnmq %zmm0, %zmm1, %k0165; X64-NEXT: kmovw %k0, %eax166; X64-NEXT: andb %dil, %al167; X64-NEXT: # kill: def $al killed $al killed $eax168; X64-NEXT: vzeroupper169; X64-NEXT: retq170;171; X86-LABEL: TEST_mm512_mask_testn_epi64_mask:172; X86: # %bb.0: # %entry173; X86-NEXT: vptestnmq %zmm0, %zmm1, %k0174; X86-NEXT: kmovw %k0, %eax175; X86-NEXT: andb {{[0-9]+}}(%esp), %al176; X86-NEXT: # kill: def $al killed $al killed $eax177; X86-NEXT: vzeroupper178; X86-NEXT: retl179entry:180 %and.i.i = and <8 x i64> %__B, %__A181 %0 = icmp eq <8 x i64> %and.i.i, zeroinitializer182 %1 = bitcast i8 %__U to <8 x i1>183 %2 = and <8 x i1> %0, %1184 %3 = bitcast <8 x i1> %2 to i8185 ret i8 %3186}187 188; Function Attrs: norecurse nounwind readnone189define zeroext i16 @TEST_mm512_mask_testn_epi32_mask(i16 %__U, <8 x i64> %__A, <8 x i64> %__B) local_unnamed_addr #0 {190; X64-LABEL: TEST_mm512_mask_testn_epi32_mask:191; X64: # %bb.0: # %entry192; X64-NEXT: vptestnmd %zmm0, %zmm1, %k0193; X64-NEXT: kmovw %k0, %eax194; X64-NEXT: andl %edi, %eax195; X64-NEXT: # kill: def $ax killed $ax killed $eax196; X64-NEXT: vzeroupper197; X64-NEXT: retq198;199; X86-LABEL: TEST_mm512_mask_testn_epi32_mask:200; X86: # %bb.0: # %entry201; X86-NEXT: vptestnmd %zmm0, %zmm1, %k0202; X86-NEXT: kmovw %k0, %eax203; X86-NEXT: andw {{[0-9]+}}(%esp), %ax204; X86-NEXT: # kill: def $ax killed $ax killed $eax205; X86-NEXT: vzeroupper206; X86-NEXT: retl207entry:208 %and.i.i = and <8 x i64> %__B, %__A209 %0 = bitcast <8 x i64> %and.i.i to <16 x i32>210 %1 = icmp eq <16 x i32> %0, zeroinitializer211 %2 = bitcast i16 %__U to <16 x i1>212 %3 = and <16 x i1> %1, %2213 %4 = bitcast <16 x i1> %3 to i16214 ret i16 %4215}216 217define <2 x i64> @setcc_commute(<2 x i64> %a) {218; CHECK-LABEL: setcc_commute:219; CHECK: # %bb.0:220; CHECK-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0221; CHECK-NEXT: vpxor %xmm1, %xmm1, %xmm1222; CHECK-NEXT: vpsubq %xmm0, %xmm1, %xmm1223; CHECK-NEXT: vptestmq %zmm0, %zmm0, %k1224; CHECK-NEXT: vmovdqa64 %zmm1, %zmm0 {%k1}225; CHECK-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm0226; CHECK-NEXT: vzeroupper227; CHECK-NEXT: ret{{[l|q]}}228 %1 = sub <2 x i64> zeroinitializer, %a229 %2 = icmp eq <2 x i64> %a, zeroinitializer230 %3 = select <2 x i1> %2, <2 x i64> %a, <2 x i64> %1231 ret <2 x i64> %3232}233