235 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 6 7declare <4 x i64> @llvm.experimental.constrained.fptosi.v4i64.v4f16(<4 x half>, metadata)8declare <4 x i64> @llvm.experimental.constrained.fptoui.v4i64.v4f16(<4 x half>, metadata)9declare <8 x i32> @llvm.experimental.constrained.fptosi.v8i32.v8f16(<8 x half>, metadata)10declare <8 x i32> @llvm.experimental.constrained.fptoui.v8i32.v8f16(<8 x half>, metadata)11declare <16 x i16> @llvm.experimental.constrained.fptosi.v16i16.v16f16(<16 x half>, metadata)12declare <16 x i16> @llvm.experimental.constrained.fptoui.v16i16.v16f16(<16 x half>, metadata)13declare <16 x i8> @llvm.experimental.constrained.fptosi.v16i8.v16f16(<16 x half>, metadata)14declare <16 x i8> @llvm.experimental.constrained.fptoui.v16i8.v16f16(<16 x half>, metadata)15declare <16 x i1> @llvm.experimental.constrained.fptosi.v16i1.v16f16(<16 x half>, metadata)16declare <16 x i1> @llvm.experimental.constrained.fptoui.v16i1.v16f16(<16 x half>, metadata)17 18define <4 x i64> @strict_vector_fptosi_v4f16_to_v4i64(<4 x half> %a) #0 {19; CHECK-LABEL: strict_vector_fptosi_v4f16_to_v4i64:20; CHECK: # %bb.0:21; CHECK-NEXT: vmovq {{.*#+}} xmm0 = xmm0[0],zero22; CHECK-NEXT: vcvttph2qq %xmm0, %ymm023; CHECK-NEXT: ret{{[l|q]}}24;25; NOVL-LABEL: strict_vector_fptosi_v4f16_to_v4i64:26; NOVL: # %bb.0:27; NOVL-NEXT: vpsrlq $48, %xmm0, %xmm128; NOVL-NEXT: vcvttsh2si %xmm1, %rax29; NOVL-NEXT: vmovq %rax, %xmm130; NOVL-NEXT: vmovshdup {{.*#+}} xmm2 = xmm0[1,1,3,3]31; NOVL-NEXT: vcvttsh2si %xmm2, %rax32; NOVL-NEXT: vmovq %rax, %xmm233; NOVL-NEXT: vpunpcklqdq {{.*#+}} xmm1 = xmm2[0],xmm1[0]34; NOVL-NEXT: vcvttsh2si %xmm0, %rax35; NOVL-NEXT: vmovq %rax, %xmm236; NOVL-NEXT: vpsrld $16, %xmm0, %xmm037; NOVL-NEXT: vcvttsh2si %xmm0, %rax38; NOVL-NEXT: vmovq %rax, %xmm039; NOVL-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm0[0]40; NOVL-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm041; NOVL-NEXT: retq42 %ret = call <4 x i64> @llvm.experimental.constrained.fptosi.v4i64.v4f16(<4 x half> %a,43 metadata !"fpexcept.strict") #044 ret <4 x i64> %ret45}46 47define <4 x i64> @strict_vector_fptoui_v4f16_to_v4i64(<4 x half> %a) #0 {48; CHECK-LABEL: strict_vector_fptoui_v4f16_to_v4i64:49; CHECK: # %bb.0:50; CHECK-NEXT: vmovq {{.*#+}} xmm0 = xmm0[0],zero51; CHECK-NEXT: vcvttph2uqq %xmm0, %ymm052; CHECK-NEXT: ret{{[l|q]}}53;54; NOVL-LABEL: strict_vector_fptoui_v4f16_to_v4i64:55; NOVL: # %bb.0:56; NOVL-NEXT: vpsrlq $48, %xmm0, %xmm157; NOVL-NEXT: vcvttsh2usi %xmm1, %rax58; NOVL-NEXT: vmovq %rax, %xmm159; NOVL-NEXT: vmovshdup {{.*#+}} xmm2 = xmm0[1,1,3,3]60; NOVL-NEXT: vcvttsh2usi %xmm2, %rax61; NOVL-NEXT: vmovq %rax, %xmm262; NOVL-NEXT: vpunpcklqdq {{.*#+}} xmm1 = xmm2[0],xmm1[0]63; NOVL-NEXT: vcvttsh2usi %xmm0, %rax64; NOVL-NEXT: vmovq %rax, %xmm265; NOVL-NEXT: vpsrld $16, %xmm0, %xmm066; NOVL-NEXT: vcvttsh2usi %xmm0, %rax67; NOVL-NEXT: vmovq %rax, %xmm068; NOVL-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm2[0],xmm0[0]69; NOVL-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm070; NOVL-NEXT: retq71 %ret = call <4 x i64> @llvm.experimental.constrained.fptoui.v4i64.v4f16(<4 x half> %a,72 metadata !"fpexcept.strict") #073 ret <4 x i64> %ret74}75 76define <8 x i32> @strict_vector_fptosi_v8f16_to_v8i32(<8 x half> %a) #0 {77; CHECK-LABEL: strict_vector_fptosi_v8f16_to_v8i32:78; CHECK: # %bb.0:79; CHECK-NEXT: vcvttph2dq %xmm0, %ymm080; CHECK-NEXT: ret{{[l|q]}}81;82; NOVL-LABEL: strict_vector_fptosi_v8f16_to_v8i32:83; NOVL: # %bb.0:84; NOVL-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm085; NOVL-NEXT: vxorps %xmm1, %xmm1, %xmm186; NOVL-NEXT: vblendps {{.*#+}} ymm0 = ymm0[0,1,2,3],ymm1[4,5,6,7]87; NOVL-NEXT: vcvttph2dq %ymm0, %zmm088; NOVL-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm089; NOVL-NEXT: retq90 %ret = call <8 x i32> @llvm.experimental.constrained.fptosi.v8i32.v8f16(<8 x half> %a,91 metadata !"fpexcept.strict") #092 ret <8 x i32> %ret93}94 95define <8 x i32> @strict_vector_fptoui_v8f16_to_v8i32(<8 x half> %a) #0 {96; CHECK-LABEL: strict_vector_fptoui_v8f16_to_v8i32:97; CHECK: # %bb.0:98; CHECK-NEXT: vcvttph2udq %xmm0, %ymm099; CHECK-NEXT: ret{{[l|q]}}100;101; NOVL-LABEL: strict_vector_fptoui_v8f16_to_v8i32:102; NOVL: # %bb.0:103; NOVL-NEXT: # kill: def $xmm0 killed $xmm0 def $ymm0104; NOVL-NEXT: vxorps %xmm1, %xmm1, %xmm1105; NOVL-NEXT: vblendps {{.*#+}} ymm0 = ymm0[0,1,2,3],ymm1[4,5,6,7]106; NOVL-NEXT: vcvttph2udq %ymm0, %zmm0107; NOVL-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm0108; NOVL-NEXT: retq109 %ret = call <8 x i32> @llvm.experimental.constrained.fptoui.v8i32.v8f16(<8 x half> %a,110 metadata !"fpexcept.strict") #0111 ret <8 x i32> %ret112}113 114define <16 x i16> @strict_vector_fptosi_v16f16_to_v16i16(<16 x half> %a) #0 {115; CHECK-LABEL: strict_vector_fptosi_v16f16_to_v16i16:116; CHECK: # %bb.0:117; CHECK-NEXT: vcvttph2w %ymm0, %ymm0118; CHECK-NEXT: ret{{[l|q]}}119;120; NOVL-LABEL: strict_vector_fptosi_v16f16_to_v16i16:121; NOVL: # %bb.0:122; NOVL-NEXT: vxorps %xmm1, %xmm1, %xmm1123; NOVL-NEXT: vinsertf64x4 $0, %ymm0, %zmm1, %zmm0124; NOVL-NEXT: vcvttph2w %zmm0, %zmm0125; NOVL-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm0126; NOVL-NEXT: retq127 %ret = call <16 x i16> @llvm.experimental.constrained.fptosi.v16i16.v16f16(<16 x half> %a,128 metadata !"fpexcept.strict") #0129 ret <16 x i16> %ret130}131 132define <16 x i16> @strict_vector_fptoui_v16f16_to_v16i16(<16 x half> %a) #0 {133; CHECK-LABEL: strict_vector_fptoui_v16f16_to_v16i16:134; CHECK: # %bb.0:135; CHECK-NEXT: vcvttph2uw %ymm0, %ymm0136; CHECK-NEXT: ret{{[l|q]}}137;138; NOVL-LABEL: strict_vector_fptoui_v16f16_to_v16i16:139; NOVL: # %bb.0:140; NOVL-NEXT: vxorps %xmm1, %xmm1, %xmm1141; NOVL-NEXT: vinsertf64x4 $0, %ymm0, %zmm1, %zmm0142; NOVL-NEXT: vcvttph2uw %zmm0, %zmm0143; NOVL-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm0144; NOVL-NEXT: retq145 %ret = call <16 x i16> @llvm.experimental.constrained.fptoui.v16i16.v16f16(<16 x half> %a,146 metadata !"fpexcept.strict") #0147 ret <16 x i16> %ret148}149 150define <16 x i8> @strict_vector_fptosi_v16f16_to_v16i8(<16 x half> %a) #0 {151; CHECK-LABEL: strict_vector_fptosi_v16f16_to_v16i8:152; CHECK: # %bb.0:153; CHECK-NEXT: vcvttph2dq %ymm0, %zmm0154; CHECK-NEXT: vpmovdb %zmm0, %xmm0155; CHECK-NEXT: vzeroupper156; CHECK-NEXT: ret{{[l|q]}}157;158; NOVL-LABEL: strict_vector_fptosi_v16f16_to_v16i8:159; NOVL: # %bb.0:160; NOVL-NEXT: vcvttph2dq %ymm0, %zmm0161; NOVL-NEXT: vpmovdb %zmm0, %xmm0162; NOVL-NEXT: vzeroupper163; NOVL-NEXT: retq164 %ret = call <16 x i8> @llvm.experimental.constrained.fptosi.v16i8.v16f16(<16 x half> %a,165 metadata !"fpexcept.strict") #0166 ret <16 x i8> %ret167}168 169define <16 x i8> @strict_vector_fptoui_v16f16_to_v16i8(<16 x half> %a) #0 {170; CHECK-LABEL: strict_vector_fptoui_v16f16_to_v16i8:171; CHECK: # %bb.0:172; CHECK-NEXT: vcvttph2dq %ymm0, %zmm0173; CHECK-NEXT: vpmovdb %zmm0, %xmm0174; CHECK-NEXT: vzeroupper175; CHECK-NEXT: ret{{[l|q]}}176;177; NOVL-LABEL: strict_vector_fptoui_v16f16_to_v16i8:178; NOVL: # %bb.0:179; NOVL-NEXT: vcvttph2dq %ymm0, %zmm0180; NOVL-NEXT: vpmovdb %zmm0, %xmm0181; NOVL-NEXT: vzeroupper182; NOVL-NEXT: retq183 %ret = call <16 x i8> @llvm.experimental.constrained.fptoui.v16i8.v16f16(<16 x half> %a,184 metadata !"fpexcept.strict") #0185 ret <16 x i8> %ret186}187 188define <16 x i1> @strict_vector_fptosi_v16f16_to_v16i1(<16 x half> %a) #0 {189; CHECK-LABEL: strict_vector_fptosi_v16f16_to_v16i1:190; CHECK: # %bb.0:191; CHECK-NEXT: vcvttph2dq %ymm0, %zmm0192; CHECK-NEXT: vptestmd %zmm0, %zmm0, %k0193; CHECK-NEXT: vpmovm2b %k0, %xmm0194; CHECK-NEXT: vzeroupper195; CHECK-NEXT: ret{{[l|q]}}196;197; NOVL-LABEL: strict_vector_fptosi_v16f16_to_v16i1:198; NOVL: # %bb.0:199; NOVL-NEXT: vcvttph2dq %ymm0, %zmm0200; NOVL-NEXT: vptestmd %zmm0, %zmm0, %k0201; NOVL-NEXT: vpmovm2b %k0, %zmm0202; NOVL-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm0203; NOVL-NEXT: vzeroupper204; NOVL-NEXT: retq205 %ret = call <16 x i1> @llvm.experimental.constrained.fptosi.v16i1.v16f16(<16 x half> %a,206 metadata !"fpexcept.strict") #0207 ret <16 x i1> %ret208}209 210define <16 x i1> @strict_vector_fptoui_v16f16_to_v16i1(<16 x half> %a) #0 {211; CHECK-LABEL: strict_vector_fptoui_v16f16_to_v16i1:212; CHECK: # %bb.0:213; CHECK-NEXT: vcvttph2dq %ymm0, %zmm0214; CHECK-NEXT: vpslld $31, %zmm0, %zmm0215; CHECK-NEXT: vptestmd %zmm0, %zmm0, %k0216; CHECK-NEXT: vpmovm2b %k0, %xmm0217; CHECK-NEXT: vzeroupper218; CHECK-NEXT: ret{{[l|q]}}219;220; NOVL-LABEL: strict_vector_fptoui_v16f16_to_v16i1:221; NOVL: # %bb.0:222; NOVL-NEXT: vcvttph2dq %ymm0, %zmm0223; NOVL-NEXT: vpslld $31, %zmm0, %zmm0224; NOVL-NEXT: vptestmd %zmm0, %zmm0, %k0225; NOVL-NEXT: vpmovm2b %k0, %zmm0226; NOVL-NEXT: # kill: def $xmm0 killed $xmm0 killed $zmm0227; NOVL-NEXT: vzeroupper228; NOVL-NEXT: retq229 %ret = call <16 x i1> @llvm.experimental.constrained.fptoui.v16i1.v16f16(<16 x half> %a,230 metadata !"fpexcept.strict") #0231 ret <16 x i1> %ret232}233 234attributes #0 = { strictfp }235