| ; 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) |