162 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+avx512dq | FileCheck %s --check-prefixes=CHECK,X863; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512dq | FileCheck %s --check-prefixes=CHECK,X644 5; NOTE: This should use IR equivalent to what is generated by clang/test/CodeGen/avx512dq-builtins.c6 7define zeroext i8 @test_mm512_mask_fpclass_pd_mask(i8 zeroext %__U, <8 x double> %__A) {8; X86-LABEL: test_mm512_mask_fpclass_pd_mask:9; X86: # %bb.0: # %entry10; X86-NEXT: vfpclasspd $4, %zmm0, %k0 # k0 = isNegativeZero(zmm0)11; X86-NEXT: kmovw %k0, %eax12; X86-NEXT: andb {{[0-9]+}}(%esp), %al13; X86-NEXT: # kill: def $al killed $al killed $eax14; X86-NEXT: vzeroupper15; X86-NEXT: retl16;17; X64-LABEL: test_mm512_mask_fpclass_pd_mask:18; X64: # %bb.0: # %entry19; X64-NEXT: vfpclasspd $4, %zmm0, %k0 # k0 = isNegativeZero(zmm0)20; X64-NEXT: kmovw %k0, %eax21; X64-NEXT: andb %dil, %al22; X64-NEXT: # kill: def $al killed $al killed $eax23; X64-NEXT: vzeroupper24; X64-NEXT: retq25entry:26 %0 = tail call <8 x i1> @llvm.x86.avx512.fpclass.pd.512(<8 x double> %__A, i32 4)27 %1 = bitcast i8 %__U to <8 x i1>28 %2 = and <8 x i1> %0, %129 %3 = bitcast <8 x i1> %2 to i830 ret i8 %331}32 33declare <8 x i1> @llvm.x86.avx512.fpclass.pd.512(<8 x double>, i32)34 35define zeroext i8 @test_mm512_fpclass_pd_mask(<8 x double> %__A) {36; CHECK-LABEL: test_mm512_fpclass_pd_mask:37; CHECK: # %bb.0: # %entry38; CHECK-NEXT: vfpclasspd $4, %zmm0, %k0 # k0 = isNegativeZero(zmm0)39; CHECK-NEXT: kmovw %k0, %eax40; CHECK-NEXT: # kill: def $al killed $al killed $eax41; CHECK-NEXT: vzeroupper42; CHECK-NEXT: ret{{[l|q]}}43entry:44 %0 = tail call <8 x i1> @llvm.x86.avx512.fpclass.pd.512(<8 x double> %__A, i32 4)45 %1 = bitcast <8 x i1> %0 to i846 ret i8 %147}48 49define zeroext i16 @test_mm512_mask_fpclass_ps_mask(i16 zeroext %__U, <16 x float> %__A) {50; X86-LABEL: test_mm512_mask_fpclass_ps_mask:51; X86: # %bb.0: # %entry52; X86-NEXT: vfpclassps $4, %zmm0, %k0 # k0 = isNegativeZero(zmm0)53; X86-NEXT: kmovw %k0, %eax54; X86-NEXT: andw {{[0-9]+}}(%esp), %ax55; X86-NEXT: # kill: def $ax killed $ax killed $eax56; X86-NEXT: vzeroupper57; X86-NEXT: retl58;59; X64-LABEL: test_mm512_mask_fpclass_ps_mask:60; X64: # %bb.0: # %entry61; X64-NEXT: vfpclassps $4, %zmm0, %k0 # k0 = isNegativeZero(zmm0)62; X64-NEXT: kmovw %k0, %eax63; X64-NEXT: andl %edi, %eax64; X64-NEXT: # kill: def $ax killed $ax killed $eax65; X64-NEXT: vzeroupper66; X64-NEXT: retq67entry:68 %0 = tail call <16 x i1> @llvm.x86.avx512.fpclass.ps.512(<16 x float> %__A, i32 4)69 %1 = bitcast i16 %__U to <16 x i1>70 %2 = and <16 x i1> %0, %171 %3 = bitcast <16 x i1> %2 to i1672 ret i16 %373}74 75declare <16 x i1> @llvm.x86.avx512.fpclass.ps.512(<16 x float>, i32)76 77define zeroext i16 @test_mm512_fpclass_ps_mask(<16 x float> %__A) {78; CHECK-LABEL: test_mm512_fpclass_ps_mask:79; CHECK: # %bb.0: # %entry80; CHECK-NEXT: vfpclassps $4, %zmm0, %k0 # k0 = isNegativeZero(zmm0)81; CHECK-NEXT: kmovw %k0, %eax82; CHECK-NEXT: # kill: def $ax killed $ax killed $eax83; CHECK-NEXT: vzeroupper84; CHECK-NEXT: ret{{[l|q]}}85entry:86 %0 = tail call <16 x i1> @llvm.x86.avx512.fpclass.ps.512(<16 x float> %__A, i32 4)87 %1 = bitcast <16 x i1> %0 to i1688 ret i16 %189}90 91define zeroext i8 @test_mm_fpclass_sd_mask(<4 x float> %__A) {92; CHECK-LABEL: test_mm_fpclass_sd_mask:93; CHECK: # %bb.0: # %entry94; CHECK-NEXT: vfpclasssd $2, %xmm0, %k0 # k0 = isPositiveZero(xmm0)95; CHECK-NEXT: kmovw %k0, %eax96; CHECK-NEXT: # kill: def $al killed $al killed $eax97; CHECK-NEXT: ret{{[l|q]}}98entry:99 %0 = bitcast <4 x float> %__A to <2 x double>100 %1 = tail call i8 @llvm.x86.avx512.mask.fpclass.sd(<2 x double> %0, i32 2, i8 -1)101 ret i8 %1102}103 104declare i8 @llvm.x86.avx512.mask.fpclass.sd(<2 x double>, i32, i8)105 106define zeroext i8 @test_mm_mask_fpclass_sd_mask(i8 zeroext %__U, <4 x float> %__A) {107; X86-LABEL: test_mm_mask_fpclass_sd_mask:108; X86: # %bb.0: # %entry109; X86-NEXT: kmovb {{[0-9]+}}(%esp), %k1110; X86-NEXT: vfpclasssd $2, %xmm0, %k0 {%k1} # k0 {%k1} = isPositiveZero(xmm0)111; X86-NEXT: kmovw %k0, %eax112; X86-NEXT: # kill: def $al killed $al killed $eax113; X86-NEXT: retl114;115; X64-LABEL: test_mm_mask_fpclass_sd_mask:116; X64: # %bb.0: # %entry117; X64-NEXT: kmovw %edi, %k1118; X64-NEXT: vfpclasssd $2, %xmm0, %k0 {%k1} # k0 {%k1} = isPositiveZero(xmm0)119; X64-NEXT: kmovw %k0, %eax120; X64-NEXT: # kill: def $al killed $al killed $eax121; X64-NEXT: retq122entry:123 %0 = bitcast <4 x float> %__A to <2 x double>124 %1 = tail call i8 @llvm.x86.avx512.mask.fpclass.sd(<2 x double> %0, i32 2, i8 %__U)125 ret i8 %1126}127 128define zeroext i8 @test_mm_fpclass_ss_mask(<4 x float> %__A) {129; CHECK-LABEL: test_mm_fpclass_ss_mask:130; CHECK: # %bb.0: # %entry131; CHECK-NEXT: vfpclassss $2, %xmm0, %k0 # k0 = isPositiveZero(xmm0)132; CHECK-NEXT: kmovw %k0, %eax133; CHECK-NEXT: # kill: def $al killed $al killed $eax134; CHECK-NEXT: ret{{[l|q]}}135entry:136 %0 = tail call i8 @llvm.x86.avx512.mask.fpclass.ss(<4 x float> %__A, i32 2, i8 -1)137 ret i8 %0138}139 140declare i8 @llvm.x86.avx512.mask.fpclass.ss(<4 x float>, i32, i8)141 142define zeroext i8 @test_mm_mask_fpclass_ss_mask(i8 zeroext %__U, <4 x float> %__A) {143; X86-LABEL: test_mm_mask_fpclass_ss_mask:144; X86: # %bb.0: # %entry145; X86-NEXT: kmovb {{[0-9]+}}(%esp), %k1146; X86-NEXT: vfpclassss $2, %xmm0, %k0 {%k1} # k0 {%k1} = isPositiveZero(xmm0)147; X86-NEXT: kmovw %k0, %eax148; X86-NEXT: # kill: def $al killed $al killed $eax149; X86-NEXT: retl150;151; X64-LABEL: test_mm_mask_fpclass_ss_mask:152; X64: # %bb.0: # %entry153; X64-NEXT: kmovw %edi, %k1154; X64-NEXT: vfpclassss $2, %xmm0, %k0 {%k1} # k0 {%k1} = isPositiveZero(xmm0)155; X64-NEXT: kmovw %k0, %eax156; X64-NEXT: # kill: def $al killed $al killed $eax157; X64-NEXT: retq158entry:159 %0 = tail call i8 @llvm.x86.avx512.mask.fpclass.ss(<4 x float> %__A, i32 2, i8 %__U)160 ret i8 %0161}162