brintos

brintos / llvm-project-archived public Read only

0
0
Text · 26.4 KiB · 6aad9a6 Raw
658 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=avx512fp16,avx512vl -O3 | FileCheck %s --check-prefixes=CHECK3; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=avx512fp16,avx512vl -O3 | FileCheck %s --check-prefixes=CHECK4; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=avx512fp16 -O3 | FileCheck %s --check-prefixes=NOVL5 6declare <2 x i64> @llvm.experimental.constrained.fptosi.v2i64.v2f16(<2 x half>, metadata)7declare <2 x i64> @llvm.experimental.constrained.fptoui.v2i64.v2f16(<2 x half>, metadata)8declare <2 x i32> @llvm.experimental.constrained.fptosi.v2i32.v2f16(<2 x half>, metadata)9declare <2 x i32> @llvm.experimental.constrained.fptoui.v2i32.v2f16(<2 x half>, metadata)10declare <2 x i16> @llvm.experimental.constrained.fptosi.v2i16.v2f16(<2 x half>, metadata)11declare <2 x i16> @llvm.experimental.constrained.fptoui.v2i16.v2f16(<2 x half>, metadata)12declare <2 x i8> @llvm.experimental.constrained.fptosi.v2i8.v2f16(<2 x half>, metadata)13declare <2 x i8> @llvm.experimental.constrained.fptoui.v2i8.v2f16(<2 x half>, metadata)14declare <2 x i1> @llvm.experimental.constrained.fptosi.v2i1.v2f16(<2 x half>, metadata)15declare <2 x i1> @llvm.experimental.constrained.fptoui.v2i1.v2f16(<2 x half>, metadata)16declare <4 x i32> @llvm.experimental.constrained.fptosi.v4i32.v4f16(<4 x half>, metadata)17declare <4 x i32> @llvm.experimental.constrained.fptoui.v4i32.v4f16(<4 x half>, metadata)18declare <4 x i16> @llvm.experimental.constrained.fptosi.v4i16.v4f16(<4 x half>, metadata)19declare <4 x i16> @llvm.experimental.constrained.fptoui.v4i16.v4f16(<4 x half>, metadata)20declare <4 x i8> @llvm.experimental.constrained.fptosi.v4i8.v4f16(<4 x half>, metadata)21declare <4 x i8> @llvm.experimental.constrained.fptoui.v4i8.v4f16(<4 x half>, metadata)22declare <4 x i1> @llvm.experimental.constrained.fptosi.v4i1.v4f16(<4 x half>, metadata)23declare <4 x i1> @llvm.experimental.constrained.fptoui.v4i1.v4f16(<4 x half>, metadata)24declare <8 x i16> @llvm.experimental.constrained.fptosi.v8i16.v8f16(<8 x half>, metadata)25declare <8 x i16> @llvm.experimental.constrained.fptoui.v8i16.v8f16(<8 x half>, metadata)26declare <8 x i8> @llvm.experimental.constrained.fptosi.v8i8.v8f16(<8 x half>, metadata)27declare <8 x i8> @llvm.experimental.constrained.fptoui.v8i8.v8f16(<8 x half>, metadata)28declare <8 x i1> @llvm.experimental.constrained.fptosi.v8i1.v8f16(<8 x half>, metadata)29declare <8 x i1> @llvm.experimental.constrained.fptoui.v8i1.v8f16(<8 x half>, metadata)30 31define <2 x i64> @strict_vector_fptosi_v2f16_to_v2i64(<2 x half> %a) #0 {32; CHECK-LABEL: strict_vector_fptosi_v2f16_to_v2i64:33; CHECK:       # %bb.0:34; CHECK-NEXT:    vxorps %xmm1, %xmm1, %xmm135; CHECK-NEXT:    vmovss {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3]36; CHECK-NEXT:    vcvttph2qq %xmm0, %xmm037; CHECK-NEXT:    ret{{[l|q]}}38;39; NOVL-LABEL: strict_vector_fptosi_v2f16_to_v2i64:40; NOVL:       # %bb.0:41; NOVL-NEXT:    vcvttsh2si %xmm0, %rax42; NOVL-NEXT:    vmovq %rax, %xmm143; NOVL-NEXT:    vpsrld $16, %xmm0, %xmm044; NOVL-NEXT:    vcvttsh2si %xmm0, %rax45; NOVL-NEXT:    vmovq %rax, %xmm046; NOVL-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]47; NOVL-NEXT:    retq48  %ret = call <2 x i64> @llvm.experimental.constrained.fptosi.v2i64.v2f16(<2 x half> %a,49                                              metadata !"fpexcept.strict") #050  ret <2 x i64> %ret51}52 53define <2 x i64> @strict_vector_fptoui_v2f16_to_v2i64(<2 x half> %a) #0 {54; CHECK-LABEL: strict_vector_fptoui_v2f16_to_v2i64:55; CHECK:       # %bb.0:56; CHECK-NEXT:    vxorps %xmm1, %xmm1, %xmm157; CHECK-NEXT:    vmovss {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3]58; CHECK-NEXT:    vcvttph2uqq %xmm0, %xmm059; CHECK-NEXT:    ret{{[l|q]}}60;61; NOVL-LABEL: strict_vector_fptoui_v2f16_to_v2i64:62; NOVL:       # %bb.0:63; NOVL-NEXT:    vcvttsh2usi %xmm0, %rax64; NOVL-NEXT:    vmovq %rax, %xmm165; NOVL-NEXT:    vpsrld $16, %xmm0, %xmm066; NOVL-NEXT:    vcvttsh2usi %xmm0, %rax67; NOVL-NEXT:    vmovq %rax, %xmm068; NOVL-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]69; NOVL-NEXT:    retq70  %ret = call <2 x i64> @llvm.experimental.constrained.fptoui.v2i64.v2f16(<2 x half> %a,71                                              metadata !"fpexcept.strict") #072  ret <2 x i64> %ret73}74 75define <2 x i32> @strict_vector_fptosi_v2f16_to_v2i32(<2 x half> %a) #0 {76; CHECK-LABEL: strict_vector_fptosi_v2f16_to_v2i32:77; CHECK:       # %bb.0:78; CHECK-NEXT:    vxorps %xmm1, %xmm1, %xmm179; CHECK-NEXT:    vmovss {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3]80; CHECK-NEXT:    vcvttph2dq %xmm0, %xmm081; CHECK-NEXT:    ret{{[l|q]}}82;83; NOVL-LABEL: strict_vector_fptosi_v2f16_to_v2i32:84; NOVL:       # %bb.0:85; NOVL-NEXT:    vpsrld $16, %xmm0, %xmm186; NOVL-NEXT:    vcvttsh2si %xmm1, %eax87; NOVL-NEXT:    vcvttsh2si %xmm0, %ecx88; NOVL-NEXT:    vmovd %ecx, %xmm089; NOVL-NEXT:    vpinsrd $1, %eax, %xmm0, %xmm090; NOVL-NEXT:    retq91  %ret = call <2 x i32> @llvm.experimental.constrained.fptosi.v2i32.v2f16(<2 x half> %a,92                                              metadata !"fpexcept.strict") #093  ret <2 x i32> %ret94}95 96define <2 x i32> @strict_vector_fptoui_v2f16_to_v2i32(<2 x half> %a) #0 {97; CHECK-LABEL: strict_vector_fptoui_v2f16_to_v2i32:98; CHECK:       # %bb.0:99; CHECK-NEXT:    vxorps %xmm1, %xmm1, %xmm1100; CHECK-NEXT:    vmovss {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3]101; CHECK-NEXT:    vcvttph2udq %xmm0, %xmm0102; CHECK-NEXT:    ret{{[l|q]}}103;104; NOVL-LABEL: strict_vector_fptoui_v2f16_to_v2i32:105; NOVL:       # %bb.0:106; NOVL-NEXT:    vpsrld $16, %xmm0, %xmm1107; NOVL-NEXT:    vcvttsh2usi %xmm1, %eax108; NOVL-NEXT:    vcvttsh2usi %xmm0, %ecx109; NOVL-NEXT:    vmovd %ecx, %xmm0110; NOVL-NEXT:    vpinsrd $1, %eax, %xmm0, %xmm0111; NOVL-NEXT:    retq112  %ret = call <2 x i32> @llvm.experimental.constrained.fptoui.v2i32.v2f16(<2 x half> %a,113                                              metadata !"fpexcept.strict") #0114  ret <2 x i32> %ret115}116 117define <2 x i16> @strict_vector_fptosi_v2f16_to_v2i16(<2 x half> %a) #0 {118; CHECK-LABEL: strict_vector_fptosi_v2f16_to_v2i16:119; CHECK:       # %bb.0:120; CHECK-NEXT:    vxorps %xmm1, %xmm1, %xmm1121; CHECK-NEXT:    vmovss {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3]122; CHECK-NEXT:    vcvttph2w %xmm0, %xmm0123; CHECK-NEXT:    ret{{[l|q]}}124;125; NOVL-LABEL: strict_vector_fptosi_v2f16_to_v2i16:126; NOVL:       # %bb.0:127; NOVL-NEXT:    vpsrld $16, %xmm0, %xmm1128; NOVL-NEXT:    vcvttsh2si %xmm1, %eax129; NOVL-NEXT:    vcvttsh2si %xmm0, %ecx130; NOVL-NEXT:    vmovd %ecx, %xmm0131; NOVL-NEXT:    vpinsrd $1, %eax, %xmm0, %xmm0132; NOVL-NEXT:    vpackssdw %xmm0, %xmm0, %xmm0133; NOVL-NEXT:    retq134  %ret = call <2 x i16> @llvm.experimental.constrained.fptosi.v2i16.v2f16(<2 x half> %a,135                                              metadata !"fpexcept.strict") #0136  ret <2 x i16> %ret137}138 139define <2 x i16> @strict_vector_fptoui_v2f16_to_v2i16(<2 x half> %a) #0 {140; CHECK-LABEL: strict_vector_fptoui_v2f16_to_v2i16:141; CHECK:       # %bb.0:142; CHECK-NEXT:    vxorps %xmm1, %xmm1, %xmm1143; CHECK-NEXT:    vmovss {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3]144; CHECK-NEXT:    vcvttph2uw %xmm0, %xmm0145; CHECK-NEXT:    ret{{[l|q]}}146;147; NOVL-LABEL: strict_vector_fptoui_v2f16_to_v2i16:148; NOVL:       # %bb.0:149; NOVL-NEXT:    vpsrld $16, %xmm0, %xmm1150; NOVL-NEXT:    vcvttsh2si %xmm1, %eax151; NOVL-NEXT:    vcvttsh2si %xmm0, %ecx152; NOVL-NEXT:    vmovd %ecx, %xmm0153; NOVL-NEXT:    vpinsrd $1, %eax, %xmm0, %xmm0154; NOVL-NEXT:    vpackusdw %xmm0, %xmm0, %xmm0155; NOVL-NEXT:    retq156  %ret = call <2 x i16> @llvm.experimental.constrained.fptoui.v2i16.v2f16(<2 x half> %a,157                                              metadata !"fpexcept.strict") #0158  ret <2 x i16> %ret159}160 161define <2 x i8> @strict_vector_fptosi_v2f16_to_v2i8(<2 x half> %a) #0 {162; CHECK-LABEL: strict_vector_fptosi_v2f16_to_v2i8:163; CHECK:       # %bb.0:164; CHECK-NEXT:    vxorps %xmm1, %xmm1, %xmm1165; CHECK-NEXT:    vmovss {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3]166; CHECK-NEXT:    vcvttph2w %xmm0, %xmm0167; CHECK-NEXT:    vpmovwb %xmm0, %xmm0168; CHECK-NEXT:    ret{{[l|q]}}169;170; NOVL-LABEL: strict_vector_fptosi_v2f16_to_v2i8:171; NOVL:       # %bb.0:172; NOVL-NEXT:    vpsrld $16, %xmm0, %xmm1173; NOVL-NEXT:    vcvttsh2si %xmm1, %eax174; NOVL-NEXT:    vcvttsh2si %xmm0, %ecx175; NOVL-NEXT:    vmovd %ecx, %xmm0176; NOVL-NEXT:    vpinsrd $1, %eax, %xmm0, %xmm0177; NOVL-NEXT:    vpackssdw %xmm0, %xmm0, %xmm0178; NOVL-NEXT:    vpacksswb %xmm0, %xmm0, %xmm0179; NOVL-NEXT:    retq180  %ret = call <2 x i8> @llvm.experimental.constrained.fptosi.v2i8.v2f16(<2 x half> %a,181                                              metadata !"fpexcept.strict") #0182  ret <2 x i8> %ret183}184 185define <2 x i8> @strict_vector_fptoui_v2f16_to_v2i8(<2 x half> %a) #0 {186; CHECK-LABEL: strict_vector_fptoui_v2f16_to_v2i8:187; CHECK:       # %bb.0:188; CHECK-NEXT:    vxorps %xmm1, %xmm1, %xmm1189; CHECK-NEXT:    vmovss {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3]190; CHECK-NEXT:    vcvttph2uw %xmm0, %xmm0191; CHECK-NEXT:    vpmovwb %xmm0, %xmm0192; CHECK-NEXT:    ret{{[l|q]}}193;194; NOVL-LABEL: strict_vector_fptoui_v2f16_to_v2i8:195; NOVL:       # %bb.0:196; NOVL-NEXT:    vpsrld $16, %xmm0, %xmm1197; NOVL-NEXT:    vcvttsh2si %xmm1, %eax198; NOVL-NEXT:    vcvttsh2si %xmm0, %ecx199; NOVL-NEXT:    vmovd %ecx, %xmm0200; NOVL-NEXT:    vpinsrd $1, %eax, %xmm0, %xmm0201; NOVL-NEXT:    vpackusdw %xmm0, %xmm0, %xmm0202; NOVL-NEXT:    vpackuswb %xmm0, %xmm0, %xmm0203; NOVL-NEXT:    retq204  %ret = call <2 x i8> @llvm.experimental.constrained.fptoui.v2i8.v2f16(<2 x half> %a,205                                              metadata !"fpexcept.strict") #0206  ret <2 x i8> %ret207}208 209define <2 x i1> @strict_vector_fptosi_v2f16_to_v2i1(<2 x half> %a) #0 {210; CHECK-LABEL: strict_vector_fptosi_v2f16_to_v2i1:211; CHECK:       # %bb.0:212; CHECK-NEXT:    vxorps %xmm1, %xmm1, %xmm1213; CHECK-NEXT:    vmovss {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3]214; CHECK-NEXT:    vcvttph2w %xmm0, %xmm0215; CHECK-NEXT:    vpsllw $15, %xmm0, %xmm0216; CHECK-NEXT:    vpmovw2m %xmm0, %k1217; CHECK-NEXT:    vpcmpeqd %xmm0, %xmm0, %xmm0218; CHECK-NEXT:    vmovdqa64 %xmm0, %xmm0 {%k1} {z}219; CHECK-NEXT:    ret{{[l|q]}}220;221; NOVL-LABEL: strict_vector_fptosi_v2f16_to_v2i1:222; NOVL:       # %bb.0:223; NOVL-NEXT:    vcvttsh2si %xmm0, %eax224; NOVL-NEXT:    andl $1, %eax225; NOVL-NEXT:    kmovw %eax, %k0226; NOVL-NEXT:    vpsrld $16, %xmm0, %xmm0227; NOVL-NEXT:    vcvttsh2si %xmm0, %eax228; NOVL-NEXT:    kmovd %eax, %k1229; NOVL-NEXT:    kshiftlw $1, %k1, %k1230; NOVL-NEXT:    korw %k1, %k0, %k1231; NOVL-NEXT:    vpternlogq {{.*#+}} zmm0 {%k1} {z} = -1232; NOVL-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0233; NOVL-NEXT:    vzeroupper234; NOVL-NEXT:    retq235  %ret = call <2 x i1> @llvm.experimental.constrained.fptosi.v2i1.v2f16(<2 x half> %a,236                                              metadata !"fpexcept.strict") #0237  ret <2 x i1> %ret238}239 240define <2 x i1> @strict_vector_fptoui_v2f16_to_v2i1(<2 x half> %a) #0 {241; CHECK-LABEL: strict_vector_fptoui_v2f16_to_v2i1:242; CHECK:       # %bb.0:243; CHECK-NEXT:    vxorps %xmm1, %xmm1, %xmm1244; CHECK-NEXT:    vmovss {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3]245; CHECK-NEXT:    vcvttph2uw %xmm0, %xmm0246; CHECK-NEXT:    vpsllw $15, %xmm0, %xmm0247; CHECK-NEXT:    vpmovw2m %xmm0, %k1248; CHECK-NEXT:    vpcmpeqd %xmm0, %xmm0, %xmm0249; CHECK-NEXT:    vmovdqa64 %xmm0, %xmm0 {%k1} {z}250; CHECK-NEXT:    ret{{[l|q]}}251;252; NOVL-LABEL: strict_vector_fptoui_v2f16_to_v2i1:253; NOVL:       # %bb.0:254; NOVL-NEXT:    vcvttsh2si %xmm0, %eax255; NOVL-NEXT:    andl $1, %eax256; NOVL-NEXT:    kmovw %eax, %k0257; NOVL-NEXT:    vpsrld $16, %xmm0, %xmm0258; NOVL-NEXT:    vcvttsh2si %xmm0, %eax259; NOVL-NEXT:    kmovd %eax, %k1260; NOVL-NEXT:    kshiftlw $1, %k1, %k1261; NOVL-NEXT:    korw %k1, %k0, %k1262; NOVL-NEXT:    vpternlogq {{.*#+}} zmm0 {%k1} {z} = -1263; NOVL-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0264; NOVL-NEXT:    vzeroupper265; NOVL-NEXT:    retq266  %ret = call <2 x i1> @llvm.experimental.constrained.fptoui.v2i1.v2f16(<2 x half> %a,267                                              metadata !"fpexcept.strict") #0268  ret <2 x i1> %ret269}270 271define <4 x i32> @strict_vector_fptosi_v4f16_to_v4i32(<4 x half> %a) #0 {272; CHECK-LABEL: strict_vector_fptosi_v4f16_to_v4i32:273; CHECK:       # %bb.0:274; CHECK-NEXT:    vmovq {{.*#+}} xmm0 = xmm0[0],zero275; CHECK-NEXT:    vcvttph2dq %xmm0, %xmm0276; CHECK-NEXT:    ret{{[l|q]}}277;278; NOVL-LABEL: strict_vector_fptosi_v4f16_to_v4i32:279; NOVL:       # %bb.0:280; NOVL-NEXT:    vpsrld $16, %xmm0, %xmm1281; NOVL-NEXT:    vcvttsh2si %xmm1, %eax282; NOVL-NEXT:    vcvttsh2si %xmm0, %ecx283; NOVL-NEXT:    vmovd %ecx, %xmm1284; NOVL-NEXT:    vpinsrd $1, %eax, %xmm1, %xmm1285; NOVL-NEXT:    vmovshdup {{.*#+}} xmm2 = xmm0[1,1,3,3]286; NOVL-NEXT:    vcvttsh2si %xmm2, %eax287; NOVL-NEXT:    vpinsrd $2, %eax, %xmm1, %xmm1288; NOVL-NEXT:    vpsrlq $48, %xmm0, %xmm0289; NOVL-NEXT:    vcvttsh2si %xmm0, %eax290; NOVL-NEXT:    vpinsrd $3, %eax, %xmm1, %xmm0291; NOVL-NEXT:    retq292  %ret = call <4 x i32> @llvm.experimental.constrained.fptosi.v4i32.v4f16(<4 x half> %a,293                                              metadata !"fpexcept.strict") #0294  ret <4 x i32> %ret295}296 297define <4 x i32> @strict_vector_fptoui_v4f16_to_v4i32(<4 x half> %a) #0 {298; CHECK-LABEL: strict_vector_fptoui_v4f16_to_v4i32:299; CHECK:       # %bb.0:300; CHECK-NEXT:    vmovq {{.*#+}} xmm0 = xmm0[0],zero301; CHECK-NEXT:    vcvttph2udq %xmm0, %xmm0302; CHECK-NEXT:    ret{{[l|q]}}303;304; NOVL-LABEL: strict_vector_fptoui_v4f16_to_v4i32:305; NOVL:       # %bb.0:306; NOVL-NEXT:    vpsrld $16, %xmm0, %xmm1307; NOVL-NEXT:    vcvttsh2usi %xmm1, %eax308; NOVL-NEXT:    vcvttsh2usi %xmm0, %ecx309; NOVL-NEXT:    vmovd %ecx, %xmm1310; NOVL-NEXT:    vpinsrd $1, %eax, %xmm1, %xmm1311; NOVL-NEXT:    vmovshdup {{.*#+}} xmm2 = xmm0[1,1,3,3]312; NOVL-NEXT:    vcvttsh2usi %xmm2, %eax313; NOVL-NEXT:    vpinsrd $2, %eax, %xmm1, %xmm1314; NOVL-NEXT:    vpsrlq $48, %xmm0, %xmm0315; NOVL-NEXT:    vcvttsh2usi %xmm0, %eax316; NOVL-NEXT:    vpinsrd $3, %eax, %xmm1, %xmm0317; NOVL-NEXT:    retq318  %ret = call <4 x i32> @llvm.experimental.constrained.fptoui.v4i32.v4f16(<4 x half> %a,319                                              metadata !"fpexcept.strict") #0320  ret <4 x i32> %ret321}322 323define <4 x i16> @strict_vector_fptosi_v4f16_to_v4i16(<4 x half> %a) #0 {324; CHECK-LABEL: strict_vector_fptosi_v4f16_to_v4i16:325; CHECK:       # %bb.0:326; CHECK-NEXT:    vmovq {{.*#+}} xmm0 = xmm0[0],zero327; CHECK-NEXT:    vcvttph2w %xmm0, %xmm0328; CHECK-NEXT:    ret{{[l|q]}}329;330; NOVL-LABEL: strict_vector_fptosi_v4f16_to_v4i16:331; NOVL:       # %bb.0:332; NOVL-NEXT:    vpsrld $16, %xmm0, %xmm1333; NOVL-NEXT:    vcvttsh2si %xmm1, %eax334; NOVL-NEXT:    vcvttsh2si %xmm0, %ecx335; NOVL-NEXT:    vmovd %ecx, %xmm1336; NOVL-NEXT:    vpinsrd $1, %eax, %xmm1, %xmm1337; NOVL-NEXT:    vmovshdup {{.*#+}} xmm2 = xmm0[1,1,3,3]338; NOVL-NEXT:    vcvttsh2si %xmm2, %eax339; NOVL-NEXT:    vpinsrd $2, %eax, %xmm1, %xmm1340; NOVL-NEXT:    vpsrlq $48, %xmm0, %xmm0341; NOVL-NEXT:    vcvttsh2si %xmm0, %eax342; NOVL-NEXT:    vpinsrd $3, %eax, %xmm1, %xmm0343; NOVL-NEXT:    vpackssdw %xmm0, %xmm0, %xmm0344; NOVL-NEXT:    retq345  %ret = call <4 x i16> @llvm.experimental.constrained.fptosi.v4i16.v4f16(<4 x half> %a,346                                              metadata !"fpexcept.strict") #0347  ret <4 x i16> %ret348}349 350define <4 x i16> @strict_vector_fptoui_v4f16_to_v4i16(<4 x half> %a) #0 {351; CHECK-LABEL: strict_vector_fptoui_v4f16_to_v4i16:352; CHECK:       # %bb.0:353; CHECK-NEXT:    vmovq {{.*#+}} xmm0 = xmm0[0],zero354; CHECK-NEXT:    vcvttph2uw %xmm0, %xmm0355; CHECK-NEXT:    ret{{[l|q]}}356;357; NOVL-LABEL: strict_vector_fptoui_v4f16_to_v4i16:358; NOVL:       # %bb.0:359; NOVL-NEXT:    vpsrld $16, %xmm0, %xmm1360; NOVL-NEXT:    vcvttsh2si %xmm1, %eax361; NOVL-NEXT:    vcvttsh2si %xmm0, %ecx362; NOVL-NEXT:    vmovd %ecx, %xmm1363; NOVL-NEXT:    vpinsrd $1, %eax, %xmm1, %xmm1364; NOVL-NEXT:    vmovshdup {{.*#+}} xmm2 = xmm0[1,1,3,3]365; NOVL-NEXT:    vcvttsh2si %xmm2, %eax366; NOVL-NEXT:    vpinsrd $2, %eax, %xmm1, %xmm1367; NOVL-NEXT:    vpsrlq $48, %xmm0, %xmm0368; NOVL-NEXT:    vcvttsh2si %xmm0, %eax369; NOVL-NEXT:    vpinsrd $3, %eax, %xmm1, %xmm0370; NOVL-NEXT:    vpackusdw %xmm0, %xmm0, %xmm0371; NOVL-NEXT:    retq372  %ret = call <4 x i16> @llvm.experimental.constrained.fptoui.v4i16.v4f16(<4 x half> %a,373                                              metadata !"fpexcept.strict") #0374  ret <4 x i16> %ret375}376 377define <4 x i8> @strict_vector_fptosi_v4f16_to_v4i8(<4 x half> %a) #0 {378; CHECK-LABEL: strict_vector_fptosi_v4f16_to_v4i8:379; CHECK:       # %bb.0:380; CHECK-NEXT:    vmovq {{.*#+}} xmm0 = xmm0[0],zero381; CHECK-NEXT:    vcvttph2w %xmm0, %xmm0382; CHECK-NEXT:    vpmovwb %xmm0, %xmm0383; CHECK-NEXT:    ret{{[l|q]}}384;385; NOVL-LABEL: strict_vector_fptosi_v4f16_to_v4i8:386; NOVL:       # %bb.0:387; NOVL-NEXT:    vpsrld $16, %xmm0, %xmm1388; NOVL-NEXT:    vcvttsh2si %xmm1, %eax389; NOVL-NEXT:    vcvttsh2si %xmm0, %ecx390; NOVL-NEXT:    vmovd %ecx, %xmm1391; NOVL-NEXT:    vpinsrd $1, %eax, %xmm1, %xmm1392; NOVL-NEXT:    vmovshdup {{.*#+}} xmm2 = xmm0[1,1,3,3]393; NOVL-NEXT:    vcvttsh2si %xmm2, %eax394; NOVL-NEXT:    vpinsrd $2, %eax, %xmm1, %xmm1395; NOVL-NEXT:    vpsrlq $48, %xmm0, %xmm0396; NOVL-NEXT:    vcvttsh2si %xmm0, %eax397; NOVL-NEXT:    vpinsrd $3, %eax, %xmm1, %xmm0398; NOVL-NEXT:    vpackssdw %xmm0, %xmm0, %xmm0399; NOVL-NEXT:    vpacksswb %xmm0, %xmm0, %xmm0400; NOVL-NEXT:    retq401  %ret = call <4 x i8> @llvm.experimental.constrained.fptosi.v4i8.v4f16(<4 x half> %a,402                                              metadata !"fpexcept.strict") #0403  ret <4 x i8> %ret404}405 406define <4 x i8> @strict_vector_fptoui_v4f16_to_v4i8(<4 x half> %a) #0 {407; CHECK-LABEL: strict_vector_fptoui_v4f16_to_v4i8:408; CHECK:       # %bb.0:409; CHECK-NEXT:    vmovq {{.*#+}} xmm0 = xmm0[0],zero410; CHECK-NEXT:    vcvttph2uw %xmm0, %xmm0411; CHECK-NEXT:    vpmovwb %xmm0, %xmm0412; CHECK-NEXT:    ret{{[l|q]}}413;414; NOVL-LABEL: strict_vector_fptoui_v4f16_to_v4i8:415; NOVL:       # %bb.0:416; NOVL-NEXT:    vpsrld $16, %xmm0, %xmm1417; NOVL-NEXT:    vcvttsh2si %xmm1, %eax418; NOVL-NEXT:    vcvttsh2si %xmm0, %ecx419; NOVL-NEXT:    vmovd %ecx, %xmm1420; NOVL-NEXT:    vpinsrd $1, %eax, %xmm1, %xmm1421; NOVL-NEXT:    vmovshdup {{.*#+}} xmm2 = xmm0[1,1,3,3]422; NOVL-NEXT:    vcvttsh2si %xmm2, %eax423; NOVL-NEXT:    vpinsrd $2, %eax, %xmm1, %xmm1424; NOVL-NEXT:    vpsrlq $48, %xmm0, %xmm0425; NOVL-NEXT:    vcvttsh2si %xmm0, %eax426; NOVL-NEXT:    vpinsrd $3, %eax, %xmm1, %xmm0427; NOVL-NEXT:    vpackusdw %xmm0, %xmm0, %xmm0428; NOVL-NEXT:    vpackuswb %xmm0, %xmm0, %xmm0429; NOVL-NEXT:    retq430  %ret = call <4 x i8> @llvm.experimental.constrained.fptoui.v4i8.v4f16(<4 x half> %a,431                                              metadata !"fpexcept.strict") #0432  ret <4 x i8> %ret433}434 435define <4 x i1> @strict_vector_fptosi_v4f16_to_v4i1(<4 x half> %a) #0 {436; CHECK-LABEL: strict_vector_fptosi_v4f16_to_v4i1:437; CHECK:       # %bb.0:438; CHECK-NEXT:    vmovq {{.*#+}} xmm0 = xmm0[0],zero439; CHECK-NEXT:    vcvttph2w %xmm0, %xmm0440; CHECK-NEXT:    vpsllw $15, %xmm0, %xmm0441; CHECK-NEXT:    vpmovw2m %xmm0, %k1442; CHECK-NEXT:    vpcmpeqd %xmm0, %xmm0, %xmm0443; CHECK-NEXT:    vmovdqa32 %xmm0, %xmm0 {%k1} {z}444; CHECK-NEXT:    ret{{[l|q]}}445;446; NOVL-LABEL: strict_vector_fptosi_v4f16_to_v4i1:447; NOVL:       # %bb.0:448; NOVL-NEXT:    vcvttsh2si %xmm0, %eax449; NOVL-NEXT:    andl $1, %eax450; NOVL-NEXT:    kmovw %eax, %k0451; NOVL-NEXT:    vpsrld $16, %xmm0, %xmm1452; NOVL-NEXT:    vcvttsh2si %xmm1, %eax453; NOVL-NEXT:    kmovd %eax, %k1454; NOVL-NEXT:    kshiftlw $15, %k1, %k1455; NOVL-NEXT:    kshiftrw $14, %k1, %k1456; NOVL-NEXT:    korw %k1, %k0, %k0457; NOVL-NEXT:    movw $-5, %ax458; NOVL-NEXT:    kmovd %eax, %k1459; NOVL-NEXT:    kandw %k1, %k0, %k0460; NOVL-NEXT:    vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3]461; NOVL-NEXT:    vcvttsh2si %xmm1, %eax462; NOVL-NEXT:    kmovd %eax, %k1463; NOVL-NEXT:    kshiftlw $2, %k1, %k1464; NOVL-NEXT:    korw %k1, %k0, %k0465; NOVL-NEXT:    kshiftlw $13, %k0, %k0466; NOVL-NEXT:    kshiftrw $13, %k0, %k0467; NOVL-NEXT:    vpsrlq $48, %xmm0, %xmm0468; NOVL-NEXT:    vcvttsh2si %xmm0, %eax469; NOVL-NEXT:    kmovd %eax, %k1470; NOVL-NEXT:    kshiftlw $3, %k1, %k1471; NOVL-NEXT:    korw %k1, %k0, %k1472; NOVL-NEXT:    vpternlogd {{.*#+}} zmm0 {%k1} {z} = -1473; NOVL-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0474; NOVL-NEXT:    vzeroupper475; NOVL-NEXT:    retq476  %ret = call <4 x i1> @llvm.experimental.constrained.fptosi.v4i1.v4f16(<4 x half> %a,477                                              metadata !"fpexcept.strict") #0478  ret <4 x i1> %ret479}480 481define <4 x i1> @strict_vector_fptoui_v4f16_to_v4i1(<4 x half> %a) #0 {482; CHECK-LABEL: strict_vector_fptoui_v4f16_to_v4i1:483; CHECK:       # %bb.0:484; CHECK-NEXT:    vmovq {{.*#+}} xmm0 = xmm0[0],zero485; CHECK-NEXT:    vcvttph2uw %xmm0, %xmm0486; CHECK-NEXT:    vpsllw $15, %xmm0, %xmm0487; CHECK-NEXT:    vpmovw2m %xmm0, %k1488; CHECK-NEXT:    vpcmpeqd %xmm0, %xmm0, %xmm0489; CHECK-NEXT:    vmovdqa32 %xmm0, %xmm0 {%k1} {z}490; CHECK-NEXT:    ret{{[l|q]}}491;492; NOVL-LABEL: strict_vector_fptoui_v4f16_to_v4i1:493; NOVL:       # %bb.0:494; NOVL-NEXT:    vcvttsh2si %xmm0, %eax495; NOVL-NEXT:    andl $1, %eax496; NOVL-NEXT:    kmovw %eax, %k0497; NOVL-NEXT:    vpsrld $16, %xmm0, %xmm1498; NOVL-NEXT:    vcvttsh2si %xmm1, %eax499; NOVL-NEXT:    kmovd %eax, %k1500; NOVL-NEXT:    kshiftlw $15, %k1, %k1501; NOVL-NEXT:    kshiftrw $14, %k1, %k1502; NOVL-NEXT:    korw %k1, %k0, %k0503; NOVL-NEXT:    movw $-5, %ax504; NOVL-NEXT:    kmovd %eax, %k1505; NOVL-NEXT:    kandw %k1, %k0, %k0506; NOVL-NEXT:    vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3]507; NOVL-NEXT:    vcvttsh2si %xmm1, %eax508; NOVL-NEXT:    kmovd %eax, %k1509; NOVL-NEXT:    kshiftlw $2, %k1, %k1510; NOVL-NEXT:    korw %k1, %k0, %k0511; NOVL-NEXT:    kshiftlw $13, %k0, %k0512; NOVL-NEXT:    kshiftrw $13, %k0, %k0513; NOVL-NEXT:    vpsrlq $48, %xmm0, %xmm0514; NOVL-NEXT:    vcvttsh2si %xmm0, %eax515; NOVL-NEXT:    kmovd %eax, %k1516; NOVL-NEXT:    kshiftlw $3, %k1, %k1517; NOVL-NEXT:    korw %k1, %k0, %k1518; NOVL-NEXT:    vpternlogd {{.*#+}} zmm0 {%k1} {z} = -1519; NOVL-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0520; NOVL-NEXT:    vzeroupper521; NOVL-NEXT:    retq522  %ret = call <4 x i1> @llvm.experimental.constrained.fptoui.v4i1.v4f16(<4 x half> %a,523                                              metadata !"fpexcept.strict") #0524  ret <4 x i1> %ret525}526 527define <8 x i16> @strict_vector_fptosi_v8f16_to_v8i16(<8 x half> %a) #0 {528; CHECK-LABEL: strict_vector_fptosi_v8f16_to_v8i16:529; CHECK:       # %bb.0:530; CHECK-NEXT:    vcvttph2w %xmm0, %xmm0531; CHECK-NEXT:    ret{{[l|q]}}532;533; NOVL-LABEL: strict_vector_fptosi_v8f16_to_v8i16:534; NOVL:       # %bb.0:535; NOVL-NEXT:    vxorps %xmm1, %xmm1, %xmm1536; NOVL-NEXT:    vinsertf32x4 $0, %xmm0, %zmm1, %zmm0537; NOVL-NEXT:    vcvttph2w %zmm0, %zmm0538; NOVL-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0539; NOVL-NEXT:    vzeroupper540; NOVL-NEXT:    retq541  %ret = call <8 x i16> @llvm.experimental.constrained.fptosi.v8i16.v8f16(<8 x half> %a,542                                              metadata !"fpexcept.strict") #0543  ret <8 x i16> %ret544}545 546define <8 x i16> @strict_vector_fptoui_v8f16_to_v8i16(<8 x half> %a) #0 {547; CHECK-LABEL: strict_vector_fptoui_v8f16_to_v8i16:548; CHECK:       # %bb.0:549; CHECK-NEXT:    vcvttph2uw %xmm0, %xmm0550; CHECK-NEXT:    ret{{[l|q]}}551;552; NOVL-LABEL: strict_vector_fptoui_v8f16_to_v8i16:553; NOVL:       # %bb.0:554; NOVL-NEXT:    vxorps %xmm1, %xmm1, %xmm1555; NOVL-NEXT:    vinsertf32x4 $0, %xmm0, %zmm1, %zmm0556; NOVL-NEXT:    vcvttph2uw %zmm0, %zmm0557; NOVL-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0558; NOVL-NEXT:    vzeroupper559; NOVL-NEXT:    retq560  %ret = call <8 x i16> @llvm.experimental.constrained.fptoui.v8i16.v8f16(<8 x half> %a,561                                              metadata !"fpexcept.strict") #0562  ret <8 x i16> %ret563}564 565define <8 x i8> @strict_vector_fptosi_v8f16_to_v8i8(<8 x half> %a) #0 {566; CHECK-LABEL: strict_vector_fptosi_v8f16_to_v8i8:567; CHECK:       # %bb.0:568; CHECK-NEXT:    vcvttph2w %xmm0, %xmm0569; CHECK-NEXT:    vpmovwb %xmm0, %xmm0570; CHECK-NEXT:    ret{{[l|q]}}571;572; NOVL-LABEL: strict_vector_fptosi_v8f16_to_v8i8:573; NOVL:       # %bb.0:574; NOVL-NEXT:    vxorps %xmm1, %xmm1, %xmm1575; NOVL-NEXT:    vinsertf32x4 $0, %xmm0, %zmm1, %zmm0576; NOVL-NEXT:    vcvttph2w %zmm0, %zmm0577; NOVL-NEXT:    vpacksswb %xmm0, %xmm0, %xmm0578; NOVL-NEXT:    vzeroupper579; NOVL-NEXT:    retq580  %ret = call <8 x i8> @llvm.experimental.constrained.fptosi.v8i8.v8f16(<8 x half> %a,581                                              metadata !"fpexcept.strict") #0582  ret <8 x i8> %ret583}584 585define <8 x i8> @strict_vector_fptoui_v8f16_to_v8i8(<8 x half> %a) #0 {586; CHECK-LABEL: strict_vector_fptoui_v8f16_to_v8i8:587; CHECK:       # %bb.0:588; CHECK-NEXT:    vcvttph2uw %xmm0, %xmm0589; CHECK-NEXT:    vpmovwb %xmm0, %xmm0590; CHECK-NEXT:    ret{{[l|q]}}591;592; NOVL-LABEL: strict_vector_fptoui_v8f16_to_v8i8:593; NOVL:       # %bb.0:594; NOVL-NEXT:    vxorps %xmm1, %xmm1, %xmm1595; NOVL-NEXT:    vinsertf32x4 $0, %xmm0, %zmm1, %zmm0596; NOVL-NEXT:    vcvttph2w %zmm0, %zmm0597; NOVL-NEXT:    vpackuswb %xmm0, %xmm0, %xmm0598; NOVL-NEXT:    vzeroupper599; NOVL-NEXT:    retq600  %ret = call <8 x i8> @llvm.experimental.constrained.fptoui.v8i8.v8f16(<8 x half> %a,601                                              metadata !"fpexcept.strict") #0602  ret <8 x i8> %ret603}604 605define <8 x i1> @strict_vector_fptosi_v8f16_to_v8i1(<8 x half> %a) #0 {606; CHECK-LABEL: strict_vector_fptosi_v8f16_to_v8i1:607; CHECK:       # %bb.0:608; CHECK-NEXT:    vcvttph2dq %xmm0, %ymm0609; CHECK-NEXT:    vptestmd %ymm0, %ymm0, %k0610; CHECK-NEXT:    vpmovm2w %k0, %xmm0611; CHECK-NEXT:    vzeroupper612; CHECK-NEXT:    ret{{[l|q]}}613;614; NOVL-LABEL: strict_vector_fptosi_v8f16_to_v8i1:615; NOVL:       # %bb.0:616; NOVL-NEXT:    # kill: def $xmm0 killed $xmm0 def $ymm0617; NOVL-NEXT:    vxorps %xmm1, %xmm1, %xmm1618; NOVL-NEXT:    vblendps {{.*#+}} ymm0 = ymm0[0,1,2,3],ymm1[4,5,6,7]619; NOVL-NEXT:    vcvttph2dq %ymm0, %zmm0620; NOVL-NEXT:    vptestmd %zmm0, %zmm0, %k0621; NOVL-NEXT:    vpmovm2w %k0, %zmm0622; NOVL-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0623; NOVL-NEXT:    vzeroupper624; NOVL-NEXT:    retq625  %ret = call <8 x i1> @llvm.experimental.constrained.fptosi.v8i1.v8f16(<8 x half> %a,626                                              metadata !"fpexcept.strict") #0627  ret <8 x i1> %ret628}629 630define <8 x i1> @strict_vector_fptoui_v8f16_to_v8i1(<8 x half> %a) #0 {631; CHECK-LABEL: strict_vector_fptoui_v8f16_to_v8i1:632; CHECK:       # %bb.0:633; CHECK-NEXT:    vcvttph2dq %xmm0, %ymm0634; CHECK-NEXT:    vpslld $31, %ymm0, %ymm0635; CHECK-NEXT:    vptestmd %ymm0, %ymm0, %k0636; CHECK-NEXT:    vpmovm2w %k0, %xmm0637; CHECK-NEXT:    vzeroupper638; CHECK-NEXT:    ret{{[l|q]}}639;640; NOVL-LABEL: strict_vector_fptoui_v8f16_to_v8i1:641; NOVL:       # %bb.0:642; NOVL-NEXT:    # kill: def $xmm0 killed $xmm0 def $ymm0643; NOVL-NEXT:    vxorps %xmm1, %xmm1, %xmm1644; NOVL-NEXT:    vblendps {{.*#+}} ymm0 = ymm0[0,1,2,3],ymm1[4,5,6,7]645; NOVL-NEXT:    vcvttph2dq %ymm0, %zmm0646; NOVL-NEXT:    vpslld $31, %ymm0, %ymm0647; NOVL-NEXT:    vptestmd %zmm0, %zmm0, %k0648; NOVL-NEXT:    vpmovm2w %k0, %zmm0649; NOVL-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0650; NOVL-NEXT:    vzeroupper651; NOVL-NEXT:    retq652  %ret = call <8 x i1> @llvm.experimental.constrained.fptoui.v8i1.v8f16(<8 x half> %a,653                                              metadata !"fpexcept.strict") #0654  ret <8 x i1> %ret655}656 657attributes #0 = { strictfp }658