1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=avx512fp16,avx512vl -O3 | FileCheck %s --check-prefixes=CHECK 3; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=avx512fp16,avx512vl -O3 | FileCheck %s --check-prefixes=CHECK 4 5 6declare <4 x i64> @llvm.experimental.constrained.fptosi.v4i64.v4f16(<4 x half>, metadata) 7declare <4 x i64> @llvm.experimental.constrained.fptoui.v4i64.v4f16(<4 x half>, metadata) 8declare <8 x i32> @llvm.experimental.constrained.fptosi.v8i32.v8f16(<8 x half>, metadata) 9declare <8 x i32> @llvm.experimental.constrained.fptoui.v8i32.v8f16(<8 x half>, metadata) 10declare <16 x i16> @llvm.experimental.constrained.fptosi.v16i16.v16f16(<16 x half>, metadata) 11declare <16 x i16> @llvm.experimental.constrained.fptoui.v16i16.v16f16(<16 x half>, metadata) 12declare <16 x i8> @llvm.experimental.constrained.fptosi.v16i8.v16f16(<16 x half>, metadata) 13declare <16 x i8> @llvm.experimental.constrained.fptoui.v16i8.v16f16(<16 x half>, metadata) 14declare <16 x i1> @llvm.experimental.constrained.fptosi.v16i1.v16f16(<16 x half>, metadata) 15declare <16 x i1> @llvm.experimental.constrained.fptoui.v16i1.v16f16(<16 x half>, metadata) 16 17define <4 x i64> @strict_vector_fptosi_v4f16_to_v4i64(<4 x half> %a) #0 { 18; CHECK-LABEL: strict_vector_fptosi_v4f16_to_v4i64: 19; CHECK: # %bb.0: 20; CHECK-NEXT: vmovq {{.*#+}} xmm0 = xmm0[0],zero 21; CHECK-NEXT: vcvttph2qq %xmm0, %ymm0 22; CHECK-NEXT: ret{{[l|q]}} 23 %ret = call <4 x i64> @llvm.experimental.constrained.fptosi.v4i64.v4f16(<4 x half> %a, 24 metadata !"fpexcept.strict") #0 25 ret <4 x i64> %ret 26} 27 28define <4 x i64> @strict_vector_fptoui_v4f16_to_v4i64(<4 x half> %a) #0 { 29; CHECK-LABEL: strict_vector_fptoui_v4f16_to_v4i64: 30; CHECK: # %bb.0: 31; CHECK-NEXT: vmovq {{.*#+}} xmm0 = xmm0[0],zero 32; CHECK-NEXT: vcvttph2uqq %xmm0, %ymm0 33; CHECK-NEXT: ret{{[l|q]}} 34 %ret = call <4 x i64> @llvm.experimental.constrained.fptoui.v4i64.v4f16(<4 x half> %a, 35 metadata !"fpexcept.strict") #0 36 ret <4 x i64> %ret 37} 38 39define <8 x i32> @strict_vector_fptosi_v8f16_to_v8i32(<8 x half> %a) #0 { 40; CHECK-LABEL: strict_vector_fptosi_v8f16_to_v8i32: 41; CHECK: # %bb.0: 42; CHECK-NEXT: vcvttph2dq %xmm0, %ymm0 43; CHECK-NEXT: ret{{[l|q]}} 44 %ret = call <8 x i32> @llvm.experimental.constrained.fptosi.v8i32.v8f16(<8 x half> %a, 45 metadata !"fpexcept.strict") #0 46 ret <8 x i32> %ret 47} 48 49define <8 x i32> @strict_vector_fptoui_v8f16_to_v8i32(<8 x half> %a) #0 { 50; CHECK-LABEL: strict_vector_fptoui_v8f16_to_v8i32: 51; CHECK: # %bb.0: 52; CHECK-NEXT: vcvttph2udq %xmm0, %ymm0 53; CHECK-NEXT: ret{{[l|q]}} 54 %ret = call <8 x i32> @llvm.experimental.constrained.fptoui.v8i32.v8f16(<8 x half> %a, 55 metadata !"fpexcept.strict") #0 56 ret <8 x i32> %ret 57} 58 59define <16 x i16> @strict_vector_fptosi_v16f16_to_v16i16(<16 x half> %a) #0 { 60; CHECK-LABEL: strict_vector_fptosi_v16f16_to_v16i16: 61; CHECK: # %bb.0: 62; CHECK-NEXT: vcvttph2w %ymm0, %ymm0 63; CHECK-NEXT: ret{{[l|q]}} 64 %ret = call <16 x i16> @llvm.experimental.constrained.fptosi.v16i16.v16f16(<16 x half> %a, 65 metadata !"fpexcept.strict") #0 66 ret <16 x i16> %ret 67} 68 69define <16 x i16> @strict_vector_fptoui_v16f16_to_v16i16(<16 x half> %a) #0 { 70; CHECK-LABEL: strict_vector_fptoui_v16f16_to_v16i16: 71; CHECK: # %bb.0: 72; CHECK-NEXT: vcvttph2uw %ymm0, %ymm0 73; CHECK-NEXT: ret{{[l|q]}} 74 %ret = call <16 x i16> @llvm.experimental.constrained.fptoui.v16i16.v16f16(<16 x half> %a, 75 metadata !"fpexcept.strict") #0 76 ret <16 x i16> %ret 77} 78 79define <16 x i8> @strict_vector_fptosi_v16f16_to_v16i8(<16 x half> %a) #0 { 80; CHECK-LABEL: strict_vector_fptosi_v16f16_to_v16i8: 81; CHECK: # %bb.0: 82; CHECK-NEXT: vcvttph2dq %ymm0, %zmm0 83; CHECK-NEXT: vpmovdb %zmm0, %xmm0 84; CHECK-NEXT: vzeroupper 85; CHECK-NEXT: ret{{[l|q]}} 86 %ret = call <16 x i8> @llvm.experimental.constrained.fptosi.v16i8.v16f16(<16 x half> %a, 87 metadata !"fpexcept.strict") #0 88 ret <16 x i8> %ret 89} 90 91define <16 x i8> @strict_vector_fptoui_v16f16_to_v16i8(<16 x half> %a) #0 { 92; CHECK-LABEL: strict_vector_fptoui_v16f16_to_v16i8: 93; CHECK: # %bb.0: 94; CHECK-NEXT: vcvttph2dq %ymm0, %zmm0 95; CHECK-NEXT: vpmovdb %zmm0, %xmm0 96; CHECK-NEXT: vzeroupper 97; CHECK-NEXT: ret{{[l|q]}} 98 %ret = call <16 x i8> @llvm.experimental.constrained.fptoui.v16i8.v16f16(<16 x half> %a, 99 metadata !"fpexcept.strict") #0 100 ret <16 x i8> %ret 101} 102 103define <16 x i1> @strict_vector_fptosi_v16f16_to_v16i1(<16 x half> %a) #0 { 104; CHECK-LABEL: strict_vector_fptosi_v16f16_to_v16i1: 105; CHECK: # %bb.0: 106; CHECK-NEXT: vcvttph2dq %ymm0, %zmm0 107; CHECK-NEXT: vpmovd2m %zmm0, %k0 108; CHECK-NEXT: vpmovm2b %k0, %xmm0 109; CHECK-NEXT: vzeroupper 110; CHECK-NEXT: ret{{[l|q]}} 111 %ret = call <16 x i1> @llvm.experimental.constrained.fptosi.v16i1.v16f16(<16 x half> %a, 112 metadata !"fpexcept.strict") #0 113 ret <16 x i1> %ret 114} 115 116define <16 x i1> @strict_vector_fptoui_v16f16_to_v16i1(<16 x half> %a) #0 { 117; CHECK-LABEL: strict_vector_fptoui_v16f16_to_v16i1: 118; CHECK: # %bb.0: 119; CHECK-NEXT: vcvttph2dq %ymm0, %zmm0 120; CHECK-NEXT: vpslld $31, %zmm0, %zmm0 121; CHECK-NEXT: vpmovd2m %zmm0, %k0 122; CHECK-NEXT: vpmovm2b %k0, %xmm0 123; CHECK-NEXT: vzeroupper 124; CHECK-NEXT: ret{{[l|q]}} 125 %ret = call <16 x i1> @llvm.experimental.constrained.fptoui.v16i1.v16f16(<16 x half> %a, 126 metadata !"fpexcept.strict") #0 127 ret <16 x i1> %ret 128} 129 130attributes #0 = { strictfp } 131