| ; 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: OpName [[TRUNC32_16:%.*]] "f32tof16" | |
| ; CHECK-DAG: OpName [[EXT16_32:%.*]] "f16tof32" | |
| ; CHECK-DAG: OpName [[TRUNC32_16v3:%.*]] "f32tof16v3" | |
| ; CHECK-DAG: OpName [[EXT16_32v3:%.*]] "f16tof32v3" | |
| ; CHECK-DAG: OpName [[F32toS32:%.*]] "f32tos32" | |
| ; CHECK-DAG: OpName [[F32toS16:%.*]] "f32tos16" | |
| ; CHECK-DAG: OpName [[F32toS8:%.*]] "f32tos8" | |
| ; CHECK-DAG: OpName [[F16toS32:%.*]] "f16tos32" | |
| ; CHECK-DAG: OpName [[F16toS16:%.*]] "f16tos16" | |
| ; CHECK-DAG: OpName [[F16toS8:%.*]] "f16tos8" | |
| ; CHECK-DAG: OpName [[F32toU32v2:%.*]] "f32tou32v2" | |
| ; CHECK-DAG: OpName [[F32toU16v2:%.*]] "f32tou16v2" | |
| ; CHECK-DAG: OpName [[F32toU8v2:%.*]] "f32tou8v2" | |
| ; CHECK-DAG: OpName [[F16toU32v2:%.*]] "f16tou32v2" | |
| ; CHECK-DAG: OpName [[F16toU16v2:%.*]] "f16tou16v2" | |
| ; CHECK-DAG: OpName [[F16toU8v2:%.*]] "f16tou8v2" | |
| ; CHECK-DAG: [[F32:%.*]] = OpTypeFloat 32 | |
| ; CHECK-DAG: [[F16:%.*]] = OpTypeFloat 16 | |
| ; CHECK-DAG: [[F32v2:%.*]] = OpTypeVector [[F32]] 2 | |
| ; CHECK-DAG: [[F16v2:%.*]] = OpTypeVector [[F16]] 2 | |
| ; CHECK-DAG: [[F32v3:%.*]] = OpTypeVector [[F32]] 3 | |
| ; CHECK-DAG: [[F16v3:%.*]] = OpTypeVector [[F16]] 3 | |
| ; CHECK-DAG: [[U32:%.*]] = OpTypeInt 32 0 | |
| ; CHECK-DAG: [[U16:%.*]] = OpTypeInt 16 0 | |
| ; CHECK-DAG: [[U8:%.*]] = OpTypeInt 8 0 | |
| ; CHECK-DAG: [[U32v2:%.*]] = OpTypeVector [[U32]] 2 | |
| ; CHECK-DAG: [[U16v2:%.*]] = OpTypeVector [[U16]] 2 | |
| ; CHECK-DAG: [[U8v2:%.*]] = OpTypeVector [[U8]] 2 | |
| ; CHECK: [[TRUNC32_16]] = OpFunction [[F16]] | |
| ; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[F32]] | |
| ; CHECK: OpLabel | |
| ; CHECK: [[R:%.*]] = OpFConvert [[F16]] [[A]] | |
| ; CHECK: OpReturnValue [[R]] | |
| ; CHECK-NEXT: OpFunctionEnd | |
| define half @f32tof16(float %a) { | |
| %r = fptrunc float %a to half | |
| ret half %r | |
| } | |
| ; CHECK: [[EXT16_32]] = OpFunction [[F32]] | |
| ; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[F16]] | |
| ; CHECK: OpLabel | |
| ; CHECK: [[R:%.*]] = OpFConvert [[F32]] [[A]] | |
| ; CHECK: OpReturnValue [[R]] | |
| ; CHECK-NEXT: OpFunctionEnd | |
| define float @f16tof32(half %a) { | |
| %r = fpext half %a to float | |
| ret float %r | |
| } | |
| ; CHECK: [[TRUNC32_16v3]] = OpFunction [[F16v3]] | |
| ; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[F32v3]] | |
| ; CHECK: OpLabel | |
| ; CHECK: [[R:%.*]] = OpFConvert [[F16v3]] [[A]] | |
| ; CHECK: OpReturnValue [[R]] | |
| ; CHECK-NEXT: OpFunctionEnd | |
| define <3 x half> @f32tof16v3(<3 x float> %a) { | |
| %r = fptrunc <3 x float> %a to <3 x half> | |
| ret <3 x half> %r | |
| } | |
| ; CHECK: [[EXT16_32v3]] = OpFunction [[F32v3]] | |
| ; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[F16v3]] | |
| ; CHECK: OpLabel | |
| ; CHECK: [[R:%.*]] = OpFConvert [[F32v3]] [[A]] | |
| ; CHECK: OpReturnValue [[R]] | |
| ; CHECK-NEXT: OpFunctionEnd | |
| define <3 x float> @f16tof32v3(<3 x half> %a) { | |
| %r = fpext <3 x half> %a to <3 x float> | |
| ret <3 x float> %r | |
| } | |
| ; CHECK: [[F32toS32]] = OpFunction [[U32]] | |
| ; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[F32]] | |
| ; CHECK: OpLabel | |
| ; CHECK: [[R:%.*]] = OpConvertFToS [[U32]] [[A]] | |
| ; CHECK: OpReturnValue [[R]] | |
| ; CHECK-NEXT: OpFunctionEnd | |
| define i32 @f32tos32(float %a) { | |
| %r = fptosi float %a to i32 | |
| ret i32 %r | |
| } | |
| ; CHECK: [[F32toS16]] = OpFunction [[U16]] | |
| ; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[F32]] | |
| ; CHECK: OpLabel | |
| ; CHECK: [[R:%.*]] = OpConvertFToS [[U16]] [[A]] | |
| ; CHECK: OpReturnValue [[R]] | |
| ; CHECK-NEXT: OpFunctionEnd | |
| define i16 @f32tos16(float %a) { | |
| %r = fptosi float %a to i16 | |
| ret i16 %r | |
| } | |
| ; CHECK: [[F32toS8]] = OpFunction [[U8]] | |
| ; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[F32]] | |
| ; CHECK: OpLabel | |
| ; CHECK: [[R:%.*]] = OpConvertFToS [[U8]] [[A]] | |
| ; CHECK: OpReturnValue [[R]] | |
| ; CHECK-NEXT: OpFunctionEnd | |
| define i8 @f32tos8(float %a) { | |
| %r = fptosi float %a to i8 | |
| ret i8 %r | |
| } | |
| ; CHECK: [[F16toS32]] = OpFunction [[U32]] | |
| ; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[F16]] | |
| ; CHECK: OpLabel | |
| ; CHECK: [[R:%.*]] = OpConvertFToS [[U32]] [[A]] | |
| ; CHECK: OpReturnValue [[R]] | |
| ; CHECK-NEXT: OpFunctionEnd | |
| define i32 @f16tos32(half %a) { | |
| %r = fptosi half %a to i32 | |
| ret i32 %r | |
| } | |
| ; CHECK: [[F16toS16]] = OpFunction [[U16]] | |
| ; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[F16]] | |
| ; CHECK: OpLabel | |
| ; CHECK: [[R:%.*]] = OpConvertFToS [[U16]] [[A]] | |
| ; CHECK: OpReturnValue [[R]] | |
| ; CHECK-NEXT: OpFunctionEnd | |
| define i16 @f16tos16(half %a) { | |
| %r = fptosi half %a to i16 | |
| ret i16 %r | |
| } | |
| ; CHECK: [[F16toS8]] = OpFunction [[U8]] | |
| ; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[F16]] | |
| ; CHECK: OpLabel | |
| ; CHECK: [[R:%.*]] = OpConvertFToS [[U8]] [[A]] | |
| ; CHECK: OpReturnValue [[R]] | |
| ; CHECK-NEXT: OpFunctionEnd | |
| define i8 @f16tos8(half %a) { | |
| %r = fptosi half %a to i8 | |
| ret i8 %r | |
| } | |
| ; CHECK: [[F32toU32v2]] = OpFunction [[U32v2]] | |
| ; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[F32v2]] | |
| ; CHECK: OpLabel | |
| ; CHECK: [[R:%.*]] = OpConvertFToU [[U32v2]] [[A]] | |
| ; CHECK: OpReturnValue [[R]] | |
| ; CHECK-NEXT: OpFunctionEnd | |
| define <2 x i32> @f32tou32v2(<2 x float> %a) { | |
| %r = fptoui <2 x float> %a to <2 x i32> | |
| ret <2 x i32> %r | |
| } | |
| ; CHECK: [[F32toU16v2]] = OpFunction [[U16v2]] | |
| ; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[F32v2]] | |
| ; CHECK: OpLabel | |
| ; CHECK: [[R:%.*]] = OpConvertFToU [[U16v2]] [[A]] | |
| ; CHECK: OpReturnValue [[R]] | |
| ; CHECK-NEXT: OpFunctionEnd | |
| define <2 x i16> @f32tou16v2(<2 x float> %a) { | |
| %r = fptoui <2 x float> %a to <2 x i16> | |
| ret <2 x i16> %r | |
| } | |
| ; CHECK: [[F32toU8v2]] = OpFunction [[U8v2]] | |
| ; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[F32v2]] | |
| ; CHECK: OpLabel | |
| ; CHECK: [[R:%.*]] = OpConvertFToU [[U8v2]] [[A]] | |
| ; CHECK: OpReturnValue [[R]] | |
| ; CHECK-NEXT: OpFunctionEnd | |
| define <2 x i8> @f32tou8v2(<2 x float> %a) { | |
| %r = fptoui <2 x float> %a to <2 x i8> | |
| ret <2 x i8> %r | |
| } | |
| ; CHECK: [[F16toU32v2]] = OpFunction [[U32v2]] | |
| ; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[F16v2]] | |
| ; CHECK: OpLabel | |
| ; CHECK: [[R:%.*]] = OpConvertFToU [[U32v2]] [[A]] | |
| ; CHECK: OpReturnValue [[R]] | |
| ; CHECK-NEXT: OpFunctionEnd | |
| define <2 x i32> @f16tou32v2(<2 x half> %a) { | |
| %r = fptoui <2 x half> %a to <2 x i32> | |
| ret <2 x i32> %r | |
| } | |
| ; CHECK: [[F16toU16v2]] = OpFunction [[U16v2]] | |
| ; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[F16v2]] | |
| ; CHECK: OpLabel | |
| ; CHECK: [[R:%.*]] = OpConvertFToU [[U16v2]] [[A]] | |
| ; CHECK: OpReturnValue [[R]] | |
| ; CHECK-NEXT: OpFunctionEnd | |
| define <2 x i16> @f16tou16v2(<2 x half> %a) { | |
| %r = fptoui <2 x half> %a to <2 x i16> | |
| ret <2 x i16> %r | |
| } | |
| ; CHECK: [[F16toU8v2]] = OpFunction [[U8v2]] | |
| ; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[F16v2]] | |
| ; CHECK: OpLabel | |
| ; CHECK: [[R:%.*]] = OpConvertFToU [[U8v2]] [[A]] | |
| ; CHECK: OpReturnValue [[R]] | |
| ; CHECK-NEXT: OpFunctionEnd | |
| define <2 x i8> @f16tou8v2(<2 x half> %a) { | |
| %r = fptoui <2 x half> %a to <2 x i8> | |
| ret <2 x i8> %r | |
| } |