CodeQL / Analyze (actions) (push) Canceled after 0s
CodeQL / Analyze (python) (push) Canceled after 0s
pre-commit / pre-commit (push) Canceled after 0s
Multi-Arch CI / setup (push) Canceled after 0s
Publish build_manylinux_x86_64 images / publish_build_manylinux_x86_64 (push) Canceled after 0s
Setup (Multi-Arch) / setup (push) Canceled after 0s
Multi-Arch CI / Linux::${{ fromJSON(needs.setup.outputs.linux_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubi10 image / publish_no_rocm_image_ubi10 (push) Canceled after 0s
Multi-Arch CI / Windows::${{ fromJSON(needs.setup.outputs.windows_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Multi-Arch CI / Manifest Diff (push) Canceled after 0s
TheRock Manifest Diff Report / Generate Manifest Diff Report (push) Canceled after 0s
Multi-Arch CI / CI Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_ocl_rt images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_rocgdb images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Unit Tests / Unit Tests :: ubuntu-24.04 (push) Canceled after 0s
Unit Tests / Unit Tests :: windows-2022 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_media (push) Canceled after 0s
Unit Tests / Unit Tests Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_openmpi (push) Canceled after 0s
409 lines
17 KiB
LLVM
409 lines
17 KiB
LLVM
; RUN: llc -verify-machineinstrs -O0 -mtriple=spirv64-unknown-unknown %s -o - | FileCheck %s
|
|
; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv64-unknown-unknown %s -o - -filetype=obj | spirv-val %}
|
|
|
|
; RUN: llc -verify-machineinstrs -O0 -mtriple=spirv32-unknown-unknown %s -o - | FileCheck %s
|
|
; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv32-unknown-unknown %s -o - -filetype=obj | spirv-val %}
|
|
|
|
; CHECK-DAG: %[[#BoolTy:]] = OpTypeBool
|
|
; CHECK-DAG: %[[#FP32Ty:]] = OpTypeFloat 32
|
|
; CHECK-DAG: %[[#FP64Ty:]] = OpTypeFloat 64
|
|
; CHECK-DAG: %[[#FP16Ty:]] = OpTypeFloat 16
|
|
; CHECK-DAG: %[[#I32Ty:]] = OpTypeInt 32 0
|
|
; CHECK-DAG: %[[#I64Ty:]] = OpTypeInt 64 0
|
|
; CHECK-DAG: %[[#I16Ty:]] = OpTypeInt 16 0
|
|
|
|
; CHECK-DAG: %[[#V4I32Ty:]] = OpTypeVector %[[#I32Ty]] 4
|
|
; CHECK-DAG: %[[#V4FP32Ty:]] = OpTypeVector %[[#FP32Ty]] 4
|
|
; CHECK-DAG: %[[#V4BoolTy:]] = OpTypeVector %[[#BoolTy]] 4
|
|
|
|
; CHECK-DAG: %[[#MaxExpMinus1:]] = OpConstant %[[#I32Ty]] 2130706432
|
|
; CHECK-DAG: %[[#ExpLSB:]] = OpConstant %[[#I32Ty]] 8388608
|
|
; CHECK-DAG: %[[#True:]] = OpConstantTrue %[[#BoolTy]]
|
|
; CHECK-DAG: %[[#False:]] = OpConstantFalse %[[#BoolTy]]
|
|
; CHECK-DAG: %[[#ValueMask:]] = OpConstant %[[#I32Ty]] 2147483647
|
|
; CHECK-DAG: %[[#InfWithQnanBit:]] = OpConstant %[[#I32Ty]] 2143289344
|
|
; CHECK-DAG: %[[#Inf:]] = OpConstant %[[#I32Ty]] 2139095040
|
|
; CHECK-DAG: %[[#NegInf:]] = OpConstant %[[#I32Ty]] 4286578688
|
|
; CHECK-DAG: %[[#One:]] = OpConstant %[[#I32Ty]] 1
|
|
; CHECK-DAG: %[[#Zero:]] = OpConstantNull %[[#I32Ty]]
|
|
; CHECK-DAG: %[[#AllOneMantissa:]] = OpConstant %[[#I32Ty]] 8388607
|
|
; CHECK-DAG: %[[#SignBit:]] = OpConstant %[[#I32Ty]] 2147483648
|
|
|
|
; CHECK-DAG: %[[#ValueMaskFP64:]] = OpConstant %[[#I64Ty]] 9223372036854775807
|
|
; CHECK-DAG: %[[#InfFP64:]] = OpConstant %[[#I64Ty]] 9218868437227405312
|
|
; CHECK-DAG: %[[#NegInfFP64:]] = OpConstant %[[#I64Ty]] 18442240474082181120
|
|
|
|
; CHECK-DAG: %[[#FalseV4:]] = OpConstantComposite %[[#V4BoolTy]] %[[#False]] %[[#False]] %[[#False]] %[[#False]]
|
|
; CHECK-DAG: %[[#ValueMaskV4:]] = OpConstantComposite %[[#V4I32Ty]] %[[#ValueMask]] %[[#ValueMask]] %[[#ValueMask]] %[[#ValueMask]]
|
|
; CHECK-DAG: %[[#InfV4:]] = OpConstantComposite %[[#V4I32Ty]] %[[#Inf]] %[[#Inf]] %[[#Inf]] %[[#Inf]]
|
|
; CHECK-DAG: %[[#InfWithQnanBitV4:]] = OpConstantComposite %[[#V4I32Ty]] %[[#InfWithQnanBit]] %[[#InfWithQnanBit]] %[[#InfWithQnanBit]] %[[#InfWithQnanBit]]
|
|
; CHECK-DAG: %[[#ValueMaskFP16:]] = OpConstant %[[#I16Ty]] 32767
|
|
; CHECK-DAG: %[[#InfFP16:]] = OpConstant %[[#I16Ty]] 31744
|
|
; CHECK-DAG: %[[#NegInfFP16:]] = OpConstant %[[#I16Ty]] 64512
|
|
|
|
; CHECK: OpFunction %[[#BoolTy]]
|
|
; CHECK: %[[#A:]] = OpFunctionParameter %[[#FP32Ty]]
|
|
; CHECK: OpReturnValue %[[#False]]
|
|
; CHECK: OpFunctionEnd
|
|
define i1 @isfpclass_0_none(float %a) {
|
|
%v = call i1 @llvm.is.fpclass.f32(float %a, i32 0)
|
|
ret i1 %v
|
|
}
|
|
|
|
; CHECK: OpFunction %[[#BoolTy]]
|
|
; CHECK: %[[#A:]] = OpFunctionParameter %[[#FP32Ty]]
|
|
; CHECK: %[[#T0:]] = OpBitcast %[[#I32Ty]] %[[#A]]
|
|
; CHECK: %[[#T1:]] = OpBitwiseAnd %[[#I32Ty]] %[[#T0]] %[[#ValueMask]]
|
|
; CHECK: %[[#T2:]] = OpUGreaterThan %[[#BoolTy]] %[[#T1]] %[[#Inf]]
|
|
; CHECK: %[[#T3:]] = OpULessThan %[[#BoolTy]] %[[#T1]] %[[#InfWithQnanBit]]
|
|
; CHECK: %[[#T4:]] = OpLogicalAnd %[[#BoolTy]] %[[#T2]] %[[#T3]]
|
|
; CHECK: %[[#T5:]] = OpLogicalOr %[[#BoolTy]] %[[#False]] %[[#T4]]
|
|
; CHECK: OpReturnValue %[[#T5]]
|
|
; CHECK: OpFunctionEnd
|
|
|
|
define i1 @isfpclass_1_issnan(float %a) {
|
|
%v = call i1 @llvm.is.fpclass.f32(float %a, i32 1)
|
|
ret i1 %v
|
|
}
|
|
|
|
; CHECK: OpFunction %[[#V4BoolTy]]
|
|
; CHECK: %[[#A:]] = OpFunctionParameter %[[#V4FP32Ty]]
|
|
; CHECK: %[[#T0:]] = OpBitcast %[[#V4I32Ty]] %[[#A]]
|
|
; CHECK: %[[#T1:]] = OpBitwiseAnd %[[#V4I32Ty]] %[[#T0]] %[[#ValueMaskV4]]
|
|
; CHECK: %[[#T2:]] = OpUGreaterThan %[[#V4BoolTy]] %[[#T1]] %[[#InfV4]]
|
|
; CHECK: %[[#T3:]] = OpULessThan %[[#V4BoolTy]] %[[#T1]] %[[#InfWithQnanBitV4]]
|
|
; CHECK: %[[#T4:]] = OpLogicalAnd %[[#V4BoolTy]] %[[#T2]] %[[#T3]]
|
|
; CHECK: %[[#T5:]] = OpLogicalOr %[[#V4BoolTy]] %[[#FalseV4]] %[[#T4]]
|
|
; CHECK: OpReturnValue %[[#T5]]
|
|
; CHECK: OpFunctionEnd
|
|
|
|
define <4 x i1> @isfpclass_1_issnan_v4f32(<4 x float> %a) {
|
|
%v = call <4 x i1> @llvm.is.fpclass.v4f32(<4 x float> %a, i32 1)
|
|
ret <4 x i1> %v
|
|
}
|
|
|
|
; CHECK: OpFunction %[[#BoolTy]]
|
|
; CHECK: %[[#A:]] = OpFunctionParameter %[[#FP32Ty]]
|
|
; CHECK: %[[#T0:]] = OpBitcast %[[#I32Ty]] %[[#A]]
|
|
; CHECK: %[[#T1:]] = OpBitwiseAnd %[[#I32Ty]] %[[#T0]] %[[#ValueMask]]
|
|
; CHECK: %[[#T2:]] = OpUGreaterThanEqual %[[#BoolTy]] %[[#T1]] %[[#InfWithQnanBit]]
|
|
; CHECK: %[[#T3:]] = OpLogicalOr %[[#BoolTy]] %[[#False]] %[[#T2]]
|
|
; CHECK: OpReturnValue %[[#T3]]
|
|
; CHECK: OpFunctionEnd
|
|
define i1 @isfpclass_1_isqnan(float %a) {
|
|
%v = call i1 @llvm.is.fpclass.f32(float %a, i32 2)
|
|
ret i1 %v
|
|
}
|
|
|
|
; CHECK: OpFunction %[[#BoolTy]]
|
|
; CHECK: %[[#A:]] = OpFunctionParameter %[[#FP32Ty]]
|
|
; CHECK: %[[#T0:]] = OpBitcast %[[#I32Ty]] %[[#A]]
|
|
; CHECK: %[[#T1:]] = OpBitwiseAnd %[[#I32Ty]] %[[#T0]] %[[#ValueMask]]
|
|
; CHECK: %[[#T2:]] = OpUGreaterThan %[[#BoolTy]] %[[#T1]] %[[#Inf]]
|
|
; CHECK: %[[#T3:]] = OpLogicalOr %[[#BoolTy]] %[[#False]] %[[#T2]]
|
|
; CHECK: OpReturnValue %[[#T3]]
|
|
; CHECK: OpFunctionEnd
|
|
define i1 @isfpclass_1_isnan(float %a) {
|
|
%v = call i1 @llvm.is.fpclass.f32(float %a, i32 3)
|
|
ret i1 %v
|
|
}
|
|
|
|
; CHECK: OpFunction %[[#BoolTy]]
|
|
; CHECK: %[[#A:]] = OpFunctionParameter %[[#FP32Ty]]
|
|
; CHECK: %[[#T0:]] = OpBitcast %[[#I32Ty]] %[[#A]]
|
|
; CHECK: %[[#T1:]] = OpIEqual %[[#BoolTy]] %[[#T0]] %[[#Inf]]
|
|
; CHECK: %[[#T2:]] = OpLogicalOr %[[#BoolTy]] %[[#False]] %[[#T1]]
|
|
; CHECK: OpReturnValue %[[#T2]]
|
|
; CHECK: OpFunctionEnd
|
|
define i1 @isfpclass_1_ispinf(float %a) {
|
|
%v = call i1 @llvm.is.fpclass.f32(float %a, i32 512)
|
|
ret i1 %v
|
|
}
|
|
|
|
; CHECK: OpFunction %[[#BoolTy]]
|
|
; CHECK: %[[#A:]] = OpFunctionParameter %[[#FP32Ty]]
|
|
; CHECK: %[[#T0:]] = OpBitcast %[[#I32Ty]] %[[#A]]
|
|
; CHECK: %[[#T1:]] = OpIEqual %[[#BoolTy]] %[[#T0]] %[[#NegInf]]
|
|
; CHECK: %[[#T2:]] = OpLogicalOr %[[#BoolTy]] %[[#False]] %[[#T1]]
|
|
; CHECK: OpReturnValue %[[#T2]]
|
|
; CHECK: OpFunctionEnd
|
|
define i1 @isfpclass_1_isninf(float %a) {
|
|
%v = call i1 @llvm.is.fpclass.f32(float %a, i32 4)
|
|
ret i1 %v
|
|
}
|
|
|
|
; CHECK: OpFunction %[[#BoolTy]]
|
|
; CHECK: %[[#A:]] = OpFunctionParameter %[[#FP32Ty]]
|
|
; CHECK: %[[#T0:]] = OpBitcast %[[#I32Ty]] %[[#A]]
|
|
; CHECK: %[[#T1:]] = OpBitwiseAnd %[[#I32Ty]] %[[#T0]] %[[#ValueMask]]
|
|
; CHECK: %[[#T2:]] = OpIEqual %[[#BoolTy]] %[[#T1]] %[[#Inf]]
|
|
; CHECK: %[[#T3:]] = OpLogicalOr %[[#BoolTy]] %[[#False]] %[[#T2]]
|
|
; CHECK: OpReturnValue %[[#T3]]
|
|
; CHECK: OpFunctionEnd
|
|
define i1 @isfpclass_1_isinf(float %a) {
|
|
%v = call i1 @llvm.is.fpclass.f32(float %a, i32 516)
|
|
ret i1 %v
|
|
}
|
|
|
|
; CHECK: OpFunction %[[#BoolTy]]
|
|
; CHECK: %[[#A:]] = OpFunctionParameter %[[#FP32Ty]]
|
|
; CHECK: %[[#T0:]] = OpBitcast %[[#I32Ty]] %[[#A]]
|
|
; CHECK: %[[#T1:]] = OpBitwiseAnd %[[#I32Ty]] %[[#T0]] %[[#ValueMask]]
|
|
; CHECK: %[[#T2:]] = OpINotEqual %[[#BoolTy]] %[[#T0]] %[[#T1]]
|
|
; CHECK: %[[#T3:]] = OpISub %[[#I32Ty]] %[[#T1]] %[[#ExpLSB]]
|
|
; CHECK: %[[#T4:]] = OpULessThan %[[#BoolTy]] %[[#T3]] %[[#MaxExpMinus1]]
|
|
; CHECK: %[[#T5:]] = OpLogicalNotEqual %[[#BoolTy]] %[[#T2]] %[[#True]]
|
|
; CHECK: %[[#T6:]] = OpLogicalAnd %[[#BoolTy]] %[[#T4]] %[[#T5]]
|
|
; CHECK: %[[#T7:]] = OpLogicalOr %[[#BoolTy]] %[[#False]] %[[#T6]]
|
|
; CHECK: OpReturnValue %[[#T7]]
|
|
; CHECK: OpFunctionEnd
|
|
define i1 @isfpclass_isposnormal(float %a) {
|
|
%v = call i1 @llvm.is.fpclass.f32(float %a, i32 256)
|
|
ret i1 %v
|
|
}
|
|
|
|
; CHECK: OpFunction %[[#BoolTy]]
|
|
; CHECK: %[[#A:]] = OpFunctionParameter %[[#FP32Ty]]
|
|
; CHECK: %[[#T0:]] = OpBitcast %[[#I32Ty]] %[[#A]]
|
|
; CHECK: %[[#T1:]] = OpBitwiseAnd %[[#I32Ty]] %[[#T0]] %[[#ValueMask]]
|
|
; CHECK: %[[#T2:]] = OpINotEqual %[[#BoolTy]] %[[#T0]] %[[#T1]]
|
|
; CHECK: %[[#T3:]] = OpISub %[[#I32Ty]] %[[#T1]] %[[#ExpLSB]]
|
|
; CHECK: %[[#T4:]] = OpULessThan %[[#BoolTy]] %[[#T3]] %[[#MaxExpMinus1]]
|
|
; CHECK: %[[#T5:]] = OpLogicalAnd %[[#BoolTy]] %[[#T4]] %[[#T2]]
|
|
; CHECK: %[[#T6:]] = OpLogicalOr %[[#BoolTy]] %[[#False]] %[[#T5]]
|
|
; CHECK: OpReturnValue %[[#T6]]
|
|
; CHECK: OpFunctionEnd
|
|
define i1 @isfpclass_isnegnormal(float %a) {
|
|
%v = call i1 @llvm.is.fpclass.f32(float %a, i32 8)
|
|
ret i1 %v
|
|
}
|
|
|
|
; CHECK: OpFunction %[[#BoolTy]]
|
|
; CHECK: %[[#A:]] = OpFunctionParameter %[[#FP32Ty]]
|
|
; CHECK: %[[#T0:]] = OpBitcast %[[#I32Ty]] %[[#A]]
|
|
; CHECK: %[[#T1:]] = OpBitwiseAnd %[[#I32Ty]] %[[#T0]] %[[#ValueMask]]
|
|
; CHECK: %[[#T2:]] = OpISub %[[#I32Ty]] %[[#T1]] %[[#ExpLSB]]
|
|
; CHECK: %[[#T3:]] = OpULessThan %[[#BoolTy]] %[[#T2]] %[[#MaxExpMinus1]]
|
|
; CHECK: %[[#T4:]] = OpLogicalOr %[[#BoolTy]] %[[#False]] %[[#T3]]
|
|
; CHECK: OpReturnValue %[[#T4]]
|
|
; CHECK: OpFunctionEnd
|
|
define i1 @isfpclass_isnormal(float %a) {
|
|
%v = call i1 @llvm.is.fpclass.f32(float %a, i32 264)
|
|
ret i1 %v
|
|
}
|
|
|
|
; CHECK: OpFunction %[[#BoolTy]]
|
|
; CHECK: %[[#A:]] = OpFunctionParameter %[[#FP32Ty]]
|
|
; CHECK: %[[#T0:]] = OpBitcast %[[#I32Ty]] %[[#A]]
|
|
; CHECK: %[[#T1:]] = OpBitwiseAnd %[[#I32Ty]] %[[#T0]] %[[#ValueMask]]
|
|
; CHECK: %[[#T2:]] = OpUGreaterThan %[[#BoolTy]] %[[#T1]] %[[#Inf]]
|
|
; CHECK: %[[#T3:]] = OpLogicalOr %[[#BoolTy]] %[[#False]] %[[#T2]]
|
|
; CHECK: %[[#T4:]] = OpISub %[[#I32Ty]] %[[#T1]] %[[#ExpLSB]]
|
|
; CHECK: %[[#T5:]] = OpULessThan %[[#BoolTy]] %[[#T4]] %[[#MaxExpMinus1]]
|
|
; CHECK: %[[#T6:]] = OpLogicalOr %[[#BoolTy]] %[[#T3]] %[[#T5]]
|
|
; CHECK: OpReturnValue %[[#T6]]
|
|
; CHECK: OpFunctionEnd
|
|
define i1 @isfpclass_1_isnan_or_normal(float %a) {
|
|
%v = call i1 @llvm.is.fpclass.f32(float %a, i32 267)
|
|
ret i1 %v
|
|
}
|
|
|
|
; CHECK: OpFunction %[[#BoolTy]]
|
|
; CHECK: %[[#A:]] = OpFunctionParameter %[[#FP32Ty]]
|
|
; CHECK: %[[#T0:]] = OpBitcast %[[#I32Ty]] %[[#A]]
|
|
; CHECK: %[[#T1:]] = OpISub %[[#I32Ty]] %[[#T0]] %[[#One]]
|
|
; CHECK: %[[#T2:]] = OpULessThan %[[#BoolTy]] %[[#T1]] %[[#AllOneMantissa]]
|
|
; CHECK: %[[#T3:]] = OpLogicalOr %[[#BoolTy]] %[[#False]] %[[#T2]]
|
|
; CHECK: OpReturnValue %[[#T3]]
|
|
; CHECK: OpFunctionEnd
|
|
define i1 @isfpclass_ispsubnormal(float %a) {
|
|
%v = call i1 @llvm.is.fpclass.f32(float %a, i32 128)
|
|
ret i1 %v
|
|
}
|
|
|
|
; CHECK: OpFunction %[[#BoolTy]]
|
|
; CHECK: %[[#A:]] = OpFunctionParameter %[[#FP32Ty]]
|
|
; CHECK: %[[#T0:]] = OpBitcast %[[#I32Ty]] %[[#A]]
|
|
; CHECK: %[[#T1:]] = OpBitwiseAnd %[[#I32Ty]] %[[#T0]] %[[#ValueMask]]
|
|
; CHECK: %[[#T2:]] = OpINotEqual %[[#BoolTy]] %[[#T0]] %[[#T1]]
|
|
; CHECK: %[[#T3:]] = OpISub %[[#I32Ty]] %[[#T1]] %[[#One]]
|
|
; CHECK: %[[#T4:]] = OpULessThan %[[#BoolTy]] %[[#T3]] %[[#AllOneMantissa]]
|
|
; CHECK: %[[#T5:]] = OpLogicalAnd %[[#BoolTy]] %[[#T4]] %[[#T2]]
|
|
; CHECK: %[[#T6:]] = OpLogicalOr %[[#BoolTy]] %[[#False]] %[[#T5]]
|
|
; CHECK: OpReturnValue %[[#T6]]
|
|
; CHECK: OpFunctionEnd
|
|
define i1 @isfpclass_isnsubnormal(float %a) {
|
|
%v = call i1 @llvm.is.fpclass.f32(float %a, i32 16)
|
|
ret i1 %v
|
|
}
|
|
|
|
; CHECK: OpFunction %[[#BoolTy]]
|
|
; CHECK: %[[#A:]] = OpFunctionParameter %[[#FP32Ty]]
|
|
; CHECK: %[[#T0:]] = OpBitcast %[[#I32Ty]] %[[#A]]
|
|
; CHECK: %[[#T1:]] = OpBitwiseAnd %[[#I32Ty]] %[[#T0]] %[[#ValueMask]]
|
|
; CHECK: %[[#T2:]] = OpISub %[[#I32Ty]] %[[#T1]] %[[#One]]
|
|
; CHECK: %[[#T3:]] = OpULessThan %[[#BoolTy]] %[[#T2]] %[[#AllOneMantissa]]
|
|
; CHECK: %[[#T4:]] = OpLogicalOr %[[#BoolTy]] %[[#False]] %[[#T3]]
|
|
; CHECK: OpReturnValue %[[#T4]]
|
|
; CHECK: OpFunctionEnd
|
|
define i1 @isfpclass_issubnormal(float %a) {
|
|
%v = call i1 @llvm.is.fpclass.f32(float %a, i32 144)
|
|
ret i1 %v
|
|
}
|
|
|
|
; CHECK: OpFunction %[[#BoolTy]]
|
|
; CHECK: %[[#A:]] = OpFunctionParameter %[[#FP32Ty]]
|
|
; CHECK: %[[#T0:]] = OpBitcast %[[#I32Ty]] %[[#A]]
|
|
; CHECK: %[[#T1:]] = OpIEqual %[[#BoolTy]] %[[#T0]] %[[#Zero]]
|
|
; CHECK: %[[#T2:]] = OpLogicalOr %[[#BoolTy]] %[[#False]] %[[#T1]]
|
|
; CHECK: OpReturnValue %[[#T2]]
|
|
; CHECK: OpFunctionEnd
|
|
define i1 @isfpclass_ispzero(float %a) {
|
|
%v = call i1 @llvm.is.fpclass.f32(float %a, i32 64)
|
|
ret i1 %v
|
|
}
|
|
|
|
; CHECK: OpFunction %[[#BoolTy]]
|
|
; CHECK: %[[#A:]] = OpFunctionParameter %[[#FP32Ty]]
|
|
; CHECK: %[[#T0:]] = OpBitcast %[[#I32Ty]] %[[#A]]
|
|
; CHECK: %[[#T1:]] = OpIEqual %[[#BoolTy]] %[[#T0]] %[[#SignBit]]
|
|
; CHECK: %[[#T2:]] = OpLogicalOr %[[#BoolTy]] %[[#False]] %[[#T1]]
|
|
; CHECK: OpReturnValue %[[#T2]]
|
|
; CHECK: OpFunctionEnd
|
|
define i1 @isfpclass_isnzero(float %a) {
|
|
%v = call i1 @llvm.is.fpclass.f32(float %a, i32 32)
|
|
ret i1 %v
|
|
}
|
|
|
|
; CHECK: OpFunction %[[#BoolTy]]
|
|
; CHECK: %[[#A:]] = OpFunctionParameter %[[#FP32Ty]]
|
|
; CHECK: %[[#T0:]] = OpBitcast %[[#I32Ty]] %[[#A]]
|
|
; CHECK: %[[#T1:]] = OpBitwiseAnd %[[#I32Ty]] %[[#T0]] %[[#ValueMask]]
|
|
; CHECK: %[[#T2:]] = OpIEqual %[[#BoolTy]] %[[#T1]] %[[#Zero]]
|
|
; CHECK: %[[#T3:]] = OpLogicalOr %[[#BoolTy]] %[[#False]] %[[#T2]]
|
|
; CHECK: OpReturnValue %[[#T3]]
|
|
; CHECK: OpFunctionEnd
|
|
define i1 @isfpclass_iszero(float %a) {
|
|
%v = call i1 @llvm.is.fpclass.f32(float %a, i32 96)
|
|
ret i1 %v
|
|
}
|
|
|
|
; CHECK: OpFunction %[[#BoolTy]]
|
|
; CHECK: %[[#A:]] = OpFunctionParameter %[[#FP32Ty]]
|
|
; CHECK: %[[#T0:]] = OpBitcast %[[#I32Ty]] %[[#A]]
|
|
; CHECK: %[[#T1:]] = OpULessThan %[[#BoolTy]] %[[#T0]] %[[#Inf]]
|
|
; CHECK: %[[#T2:]] = OpLogicalOr %[[#BoolTy]] %[[#False]] %[[#T1]]
|
|
; CHECK: OpReturnValue %[[#T2]]
|
|
; CHECK: OpFunctionEnd
|
|
define i1 @isfpclass_ispfinite(float %a) {
|
|
%v = call i1 @llvm.is.fpclass.f32(float %a, i32 448)
|
|
ret i1 %v
|
|
}
|
|
|
|
; CHECK: OpFunction %[[#BoolTy]]
|
|
; CHECK: %[[#A:]] = OpFunctionParameter %[[#FP32Ty]]
|
|
; CHECK: %[[#T0:]] = OpBitcast %[[#I32Ty]] %[[#A]]
|
|
; CHECK: %[[#T1:]] = OpBitwiseAnd %[[#I32Ty]] %[[#T0]] %[[#ValueMask]]
|
|
; CHECK: %[[#T2:]] = OpINotEqual %[[#BoolTy]] %[[#T0]] %[[#T1]]
|
|
; CHECK: %[[#T3:]] = OpULessThan %[[#BoolTy]] %[[#T1]] %[[#Inf]]
|
|
; CHECK: %[[#T4:]] = OpLogicalAnd %[[#BoolTy]] %[[#T3]] %[[#T2]]
|
|
; CHECK: %[[#T5:]] = OpLogicalOr %[[#BoolTy]] %[[#False]] %[[#T4]]
|
|
; CHECK: OpReturnValue %[[#T5]]
|
|
; CHECK: OpFunctionEnd
|
|
define i1 @isfpclass_isnfinite(float %a) {
|
|
%v = call i1 @llvm.is.fpclass.f32(float %a, i32 56)
|
|
ret i1 %v
|
|
}
|
|
|
|
; CHECK: OpFunction %[[#BoolTy]]
|
|
; CHECK: %[[#A:]] = OpFunctionParameter %[[#FP32Ty]]
|
|
; CHECK: %[[#T0:]] = OpBitcast %[[#I32Ty]] %[[#A]]
|
|
; CHECK: %[[#T1:]] = OpBitwiseAnd %[[#I32Ty]] %[[#T0]] %[[#ValueMask]]
|
|
; CHECK: %[[#T2:]] = OpULessThan %[[#BoolTy]] %[[#T1]] %[[#Inf]]
|
|
; CHECK: %[[#T3:]] = OpLogicalOr %[[#BoolTy]] %[[#False]] %[[#T2]]
|
|
; CHECK: OpReturnValue %[[#T3]]
|
|
; CHECK: OpFunctionEnd
|
|
define i1 @isfpclass_isfinite(float %a) {
|
|
%v = call i1 @llvm.is.fpclass.f32(float %a, i32 504)
|
|
ret i1 %v
|
|
}
|
|
|
|
; CHECK: OpFunction %[[#BoolTy]]
|
|
; CHECK: %[[#A:]] = OpFunctionParameter %[[#FP32Ty]]
|
|
; CHECK: %[[#T0:]] = OpBitcast %[[#I32Ty]] %[[#A]]
|
|
; CHECK: %[[#T1:]] = OpULessThan %[[#BoolTy]] %[[#T0]] %[[#Inf]]
|
|
; CHECK: %[[#T2:]] = OpLogicalOr %[[#BoolTy]] %[[#False]] %[[#T1]]
|
|
; CHECK: %[[#T3:]] = OpIEqual %[[#BoolTy]] %[[#T0]] %[[#Inf]]
|
|
; CHECK: %[[#T4:]] = OpLogicalOr %[[#BoolTy]] %[[#T2]] %[[#T3]]
|
|
; CHECK: OpReturnValue %[[#T4]]
|
|
; CHECK: OpFunctionEnd
|
|
define i1 @isfpclass_ispositive(float %a) {
|
|
%v = call i1 @llvm.is.fpclass.f32(float %a, i32 960)
|
|
ret i1 %v
|
|
}
|
|
|
|
; CHECK: OpFunction %[[#BoolTy]]
|
|
; CHECK: %[[#A:]] = OpFunctionParameter %[[#FP32Ty]]
|
|
; CHECK: %[[#T0:]] = OpBitcast %[[#I32Ty]] %[[#A]]
|
|
; CHECK: %[[#T1:]] = OpBitwiseAnd %[[#I32Ty]] %[[#T0]] %[[#ValueMask]]
|
|
; CHECK: %[[#T2:]] = OpINotEqual %[[#BoolTy]] %[[#T0]] %[[#T1]]
|
|
; CHECK: %[[#T3:]] = OpULessThan %[[#BoolTy]] %[[#T1]] %[[#Inf]]
|
|
; CHECK: %[[#T4:]] = OpLogicalAnd %[[#BoolTy]] %[[#T3]] %[[#T2]]
|
|
; CHECK: %[[#T5:]] = OpLogicalOr %[[#BoolTy]] %[[#False]] %[[#T4]]
|
|
; CHECK: %[[#T6:]] = OpIEqual %[[#BoolTy]] %[[#T0]] %[[#NegInf]]
|
|
; CHECK: %[[#T7:]] = OpLogicalOr %[[#BoolTy]] %[[#T5]] %[[#T6]]
|
|
; CHECK: OpReturnValue %[[#T7]]
|
|
; CHECK: OpFunctionEnd
|
|
define i1 @isfpclass_isnegative(float %a) {
|
|
%v = call i1 @llvm.is.fpclass.f32(float %a, i32 60)
|
|
ret i1 %v
|
|
}
|
|
|
|
; CHECK: OpFunction %[[#BoolTy]]
|
|
; CHECK: %[[#A:]] = OpFunctionParameter %[[#FP32Ty]]
|
|
; CHECK: OpReturnValue %[[#True]]
|
|
; CHECK: OpFunctionEnd
|
|
define i1 @isfpclass_all(float %a) {
|
|
%v = call i1 @llvm.is.fpclass.f32(float %a, i32 1023)
|
|
ret i1 %v
|
|
}
|
|
|
|
; CHECK: OpFunction %[[#BoolTy]]
|
|
; CHECK: %[[#A:]] = OpFunctionParameter %[[#FP64Ty]]
|
|
; CHECK: %[[#T0:]] = OpBitcast %[[#I64Ty]] %[[#A]]
|
|
; CHECK: %[[#T1:]] = OpBitwiseAnd %[[#I64Ty]] %[[#T0]] %[[#ValueMaskFP64]]
|
|
; CHECK: %[[#T2:]] = OpINotEqual %[[#BoolTy]] %[[#T0]] %[[#T1]]
|
|
; CHECK: %[[#T3:]] = OpULessThan %[[#BoolTy]] %[[#T1]] %[[#InfFP64]]
|
|
; CHECK: %[[#T4:]] = OpLogicalAnd %[[#BoolTy]] %[[#T3]] %[[#T2]]
|
|
; CHECK: %[[#T5:]] = OpLogicalOr %[[#BoolTy]] %[[#False]] %[[#T4]]
|
|
; CHECK: %[[#T6:]] = OpIEqual %[[#BoolTy]] %[[#T0]] %[[#NegInfFP64]]
|
|
; CHECK: %[[#T7:]] = OpLogicalOr %[[#BoolTy]] %[[#T5]] %[[#T6]]
|
|
; CHECK: OpReturnValue %[[#T7]]
|
|
; CHECK: OpFunctionEnd
|
|
define i1 @isfpclass_f64_isnegative(double %a) {
|
|
%v = call i1 @llvm.is.fpclass.f64(double %a, i32 60)
|
|
ret i1 %v
|
|
}
|
|
|
|
; CHECK: OpFunction %[[#BoolTy]]
|
|
; CHECK: %[[#A:]] = OpFunctionParameter %[[#FP16Ty]]
|
|
; CHECK: %[[#T0:]] = OpBitcast %[[#I16Ty]] %[[#A]]
|
|
; CHECK: %[[#T1:]] = OpBitwiseAnd %[[#I16Ty]] %[[#T0]] %[[#ValueMaskFP16]]
|
|
; CHECK: %[[#T2:]] = OpINotEqual %[[#BoolTy]] %[[#T0]] %[[#T1]]
|
|
; CHECK: %[[#T3:]] = OpULessThan %[[#BoolTy]] %[[#T1]] %[[#InfFP16]]
|
|
; CHECK: %[[#T4:]] = OpLogicalAnd %[[#BoolTy]] %[[#T3]] %[[#T2]]
|
|
; CHECK: %[[#T5:]] = OpLogicalOr %[[#BoolTy]] %[[#False]] %[[#T4]]
|
|
; CHECK: %[[#T6:]] = OpIEqual %[[#BoolTy]] %[[#T0]] %[[#NegInfFP16]]
|
|
; CHECK: %[[#T7:]] = OpLogicalOr %[[#BoolTy]] %[[#T5]] %[[#T6]]
|
|
; CHECK: OpReturnValue %[[#T7]]
|
|
; CHECK: OpFunctionEnd
|
|
define i1 @isfpclass_f16_isnegative(half %a) {
|
|
%v = call i1 @llvm.is.fpclass.f16(half %a, i32 60)
|
|
ret i1 %v
|
|
}
|
|
|
|
declare i1 @llvm.is.fpclass.f32(float, i32)
|
|
declare <4 x i1> @llvm.is.fpclass.v4f32(<4 x float>, i32)
|
|
declare i1 @llvm.is.fpclass.f64(double, i32)
|
|
declare i1 @llvm.is.fpclass.f16(half, i32)
|