212 lines · plain
1; RUN: llc -verify-machineinstrs -O0 -mtriple=spirv32-unknown-unknown %s -o - | FileCheck %s2 3; CHECK-DAG: OpName [[TRUNC32_16:%.*]] "f32tof16"4; CHECK-DAG: OpName [[EXT16_32:%.*]] "f16tof32"5 6; CHECK-DAG: OpName [[TRUNC32_16v3:%.*]] "f32tof16v3"7; CHECK-DAG: OpName [[EXT16_32v3:%.*]] "f16tof32v3"8 9; CHECK-DAG: OpName [[F32toS32:%.*]] "f32tos32"10; CHECK-DAG: OpName [[F32toS16:%.*]] "f32tos16"11; CHECK-DAG: OpName [[F32toS8:%.*]] "f32tos8"12; CHECK-DAG: OpName [[F16toS32:%.*]] "f16tos32"13; CHECK-DAG: OpName [[F16toS16:%.*]] "f16tos16"14; CHECK-DAG: OpName [[F16toS8:%.*]] "f16tos8"15 16; CHECK-DAG: OpName [[F32toU32v2:%.*]] "f32tou32v2"17; CHECK-DAG: OpName [[F32toU16v2:%.*]] "f32tou16v2"18; CHECK-DAG: OpName [[F32toU8v2:%.*]] "f32tou8v2"19; CHECK-DAG: OpName [[F16toU32v2:%.*]] "f16tou32v2"20; CHECK-DAG: OpName [[F16toU16v2:%.*]] "f16tou16v2"21; CHECK-DAG: OpName [[F16toU8v2:%.*]] "f16tou8v2"22 23; CHECK-DAG: [[F32:%.*]] = OpTypeFloat 3224; CHECK-DAG: [[F16:%.*]] = OpTypeFloat 1625; CHECK-DAG: [[F32v2:%.*]] = OpTypeVector [[F32]] 226; CHECK-DAG: [[F16v2:%.*]] = OpTypeVector [[F16]] 227; CHECK-DAG: [[F32v3:%.*]] = OpTypeVector [[F32]] 328; CHECK-DAG: [[F16v3:%.*]] = OpTypeVector [[F16]] 329; CHECK-DAG: [[U32:%.*]] = OpTypeInt 32 030; CHECK-DAG: [[U16:%.*]] = OpTypeInt 16 031; CHECK-DAG: [[U8:%.*]] = OpTypeInt 8 032; CHECK-DAG: [[U32v2:%.*]] = OpTypeVector [[U32]] 233; CHECK-DAG: [[U16v2:%.*]] = OpTypeVector [[U16]] 234; CHECK-DAG: [[U8v2:%.*]] = OpTypeVector [[U8]] 235 36 37; CHECK: [[TRUNC32_16]] = OpFunction [[F16]]38; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[F32]]39; CHECK: OpLabel40; CHECK: [[R:%.*]] = OpFConvert [[F16]] [[A]]41; CHECK: OpReturnValue [[R]]42; CHECK-NEXT: OpFunctionEnd43define half @f32tof16(float %a) {44 %r = fptrunc float %a to half45 ret half %r46}47 48; CHECK: [[EXT16_32]] = OpFunction [[F32]]49; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[F16]]50; CHECK: OpLabel51; CHECK: [[R:%.*]] = OpFConvert [[F32]] [[A]]52; CHECK: OpReturnValue [[R]]53; CHECK-NEXT: OpFunctionEnd54define float @f16tof32(half %a) {55 %r = fpext half %a to float56 ret float %r57}58 59; CHECK: [[TRUNC32_16v3]] = OpFunction [[F16v3]]60; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[F32v3]]61; CHECK: OpLabel62; CHECK: [[R:%.*]] = OpFConvert [[F16v3]] [[A]]63; CHECK: OpReturnValue [[R]]64; CHECK-NEXT: OpFunctionEnd65define <3 x half> @f32tof16v3(<3 x float> %a) {66 %r = fptrunc <3 x float> %a to <3 x half>67 ret <3 x half> %r68}69 70; CHECK: [[EXT16_32v3]] = OpFunction [[F32v3]]71; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[F16v3]]72; CHECK: OpLabel73; CHECK: [[R:%.*]] = OpFConvert [[F32v3]] [[A]]74; CHECK: OpReturnValue [[R]]75; CHECK-NEXT: OpFunctionEnd76define <3 x float> @f16tof32v3(<3 x half> %a) {77 %r = fpext <3 x half> %a to <3 x float>78 ret <3 x float> %r79}80 81; CHECK: [[F32toS32]] = OpFunction [[U32]]82; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[F32]]83; CHECK: OpLabel84; CHECK: [[R:%.*]] = OpConvertFToS [[U32]] [[A]]85; CHECK: OpReturnValue [[R]]86; CHECK-NEXT: OpFunctionEnd87define i32 @f32tos32(float %a) {88 %r = fptosi float %a to i3289 ret i32 %r90}91 92; CHECK: [[F32toS16]] = OpFunction [[U16]]93; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[F32]]94; CHECK: OpLabel95; CHECK: [[R:%.*]] = OpConvertFToS [[U16]] [[A]]96; CHECK: OpReturnValue [[R]]97; CHECK-NEXT: OpFunctionEnd98define i16 @f32tos16(float %a) {99 %r = fptosi float %a to i16100 ret i16 %r101}102 103; CHECK: [[F32toS8]] = OpFunction [[U8]]104; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[F32]]105; CHECK: OpLabel106; CHECK: [[R:%.*]] = OpConvertFToS [[U8]] [[A]]107; CHECK: OpReturnValue [[R]]108; CHECK-NEXT: OpFunctionEnd109define i8 @f32tos8(float %a) {110 %r = fptosi float %a to i8111 ret i8 %r112}113 114; CHECK: [[F16toS32]] = OpFunction [[U32]]115; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[F16]]116; CHECK: OpLabel117; CHECK: [[R:%.*]] = OpConvertFToS [[U32]] [[A]]118; CHECK: OpReturnValue [[R]]119; CHECK-NEXT: OpFunctionEnd120define i32 @f16tos32(half %a) {121 %r = fptosi half %a to i32122 ret i32 %r123}124 125; CHECK: [[F16toS16]] = OpFunction [[U16]]126; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[F16]]127; CHECK: OpLabel128; CHECK: [[R:%.*]] = OpConvertFToS [[U16]] [[A]]129; CHECK: OpReturnValue [[R]]130; CHECK-NEXT: OpFunctionEnd131define i16 @f16tos16(half %a) {132 %r = fptosi half %a to i16133 ret i16 %r134}135 136; CHECK: [[F16toS8]] = OpFunction [[U8]]137; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[F16]]138; CHECK: OpLabel139; CHECK: [[R:%.*]] = OpConvertFToS [[U8]] [[A]]140; CHECK: OpReturnValue [[R]]141; CHECK-NEXT: OpFunctionEnd142define i8 @f16tos8(half %a) {143 %r = fptosi half %a to i8144 ret i8 %r145}146 147; CHECK: [[F32toU32v2]] = OpFunction [[U32v2]]148; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[F32v2]]149; CHECK: OpLabel150; CHECK: [[R:%.*]] = OpConvertFToU [[U32v2]] [[A]]151; CHECK: OpReturnValue [[R]]152; CHECK-NEXT: OpFunctionEnd153define <2 x i32> @f32tou32v2(<2 x float> %a) {154 %r = fptoui <2 x float> %a to <2 x i32>155 ret <2 x i32> %r156}157 158; CHECK: [[F32toU16v2]] = OpFunction [[U16v2]]159; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[F32v2]]160; CHECK: OpLabel161; CHECK: [[R:%.*]] = OpConvertFToU [[U16v2]] [[A]]162; CHECK: OpReturnValue [[R]]163; CHECK-NEXT: OpFunctionEnd164define <2 x i16> @f32tou16v2(<2 x float> %a) {165 %r = fptoui <2 x float> %a to <2 x i16>166 ret <2 x i16> %r167}168 169; CHECK: [[F32toU8v2]] = OpFunction [[U8v2]]170; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[F32v2]]171; CHECK: OpLabel172; CHECK: [[R:%.*]] = OpConvertFToU [[U8v2]] [[A]]173; CHECK: OpReturnValue [[R]]174; CHECK-NEXT: OpFunctionEnd175define <2 x i8> @f32tou8v2(<2 x float> %a) {176 %r = fptoui <2 x float> %a to <2 x i8>177 ret <2 x i8> %r178}179 180; CHECK: [[F16toU32v2]] = OpFunction [[U32v2]]181; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[F16v2]]182; CHECK: OpLabel183; CHECK: [[R:%.*]] = OpConvertFToU [[U32v2]] [[A]]184; CHECK: OpReturnValue [[R]]185; CHECK-NEXT: OpFunctionEnd186define <2 x i32> @f16tou32v2(<2 x half> %a) {187 %r = fptoui <2 x half> %a to <2 x i32>188 ret <2 x i32> %r189}190 191; CHECK: [[F16toU16v2]] = OpFunction [[U16v2]]192; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[F16v2]]193; CHECK: OpLabel194; CHECK: [[R:%.*]] = OpConvertFToU [[U16v2]] [[A]]195; CHECK: OpReturnValue [[R]]196; CHECK-NEXT: OpFunctionEnd197define <2 x i16> @f16tou16v2(<2 x half> %a) {198 %r = fptoui <2 x half> %a to <2 x i16>199 ret <2 x i16> %r200}201 202; CHECK: [[F16toU8v2]] = OpFunction [[U8v2]]203; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[F16v2]]204; CHECK: OpLabel205; CHECK: [[R:%.*]] = OpConvertFToU [[U8v2]] [[A]]206; CHECK: OpReturnValue [[R]]207; CHECK-NEXT: OpFunctionEnd208define <2 x i8> @f16tou8v2(<2 x half> %a) {209 %r = fptoui <2 x half> %a to <2 x i8>210 ret <2 x i8> %r211}212