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