blob: ec8330c16c8fd27e6b7b5f3a1b5047f7c8234ee9 [file] [log] [blame]
; 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)