1; RUN: llc %s -o - | FileCheck %s 2 3target triple = "spirv32-unknown-unknown" 4 5; CHECK-DAG: OpName [[TRUNC32_16:%.*]] "f32tof16" 6; CHECK-DAG: OpName [[EXT16_32:%.*]] "f16tof32" 7 8; CHECK-DAG: OpName [[TRUNC32_16v3:%.*]] "f32tof16v3" 9; CHECK-DAG: OpName [[EXT16_32v3:%.*]] "f16tof32v3" 10 11; CHECK-DAG: OpName [[F32toS32:%.*]] "f32tos32" 12; CHECK-DAG: OpName [[F32toS16:%.*]] "f32tos16" 13; CHECK-DAG: OpName [[F32toS8:%.*]] "f32tos8" 14; CHECK-DAG: OpName [[F16toS32:%.*]] "f16tos32" 15; CHECK-DAG: OpName [[F16toS16:%.*]] "f16tos16" 16; CHECK-DAG: OpName [[F16toS8:%.*]] "f16tos8" 17 18; CHECK-DAG: OpName [[F32toU32v2:%.*]] "f32tou32v2" 19; CHECK-DAG: OpName [[F32toU16v2:%.*]] "f32tou16v2" 20; CHECK-DAG: OpName [[F32toU8v2:%.*]] "f32tou8v2" 21; CHECK-DAG: OpName [[F16toU32v2:%.*]] "f16tou32v2" 22; CHECK-DAG: OpName [[F16toU16v2:%.*]] "f16tou16v2" 23; CHECK-DAG: OpName [[F16toU8v2:%.*]] "f16tou8v2" 24 25; CHECK-DAG: [[F32:%.*]] = OpTypeFloat 32 26; CHECK-DAG: [[F16:%.*]] = OpTypeFloat 16 27; CHECK-DAG: [[F32v2:%.*]] = OpTypeVector [[F32]] 2 28; CHECK-DAG: [[F16v2:%.*]] = OpTypeVector [[F16]] 2 29; CHECK-DAG: [[F32v3:%.*]] = OpTypeVector [[F32]] 3 30; CHECK-DAG: [[F16v3:%.*]] = OpTypeVector [[F16]] 3 31; CHECK-DAG: [[U32:%.*]] = OpTypeInt 32 0 32; CHECK-DAG: [[U16:%.*]] = OpTypeInt 16 0 33; CHECK-DAG: [[U8:%.*]] = OpTypeInt 8 0 34; CHECK-DAG: [[U32v2:%.*]] = OpTypeVector [[U32]] 2 35; CHECK-DAG: [[U16v2:%.*]] = OpTypeVector [[U16]] 2 36; CHECK-DAG: [[U8v2:%.*]] = OpTypeVector [[U8]] 2 37 38 39; CHECK: [[TRUNC32_16]] = OpFunction [[F16]] 40; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[F32]] 41; CHECK: OpLabel 42; CHECK: [[R:%.*]] = OpFConvert [[F16]] [[A]] 43; CHECK: OpReturnValue [[R]] 44; CHECK-NEXT: OpFunctionEnd 45define half @f32tof16(float %a) { 46 %r = fptrunc float %a to half 47 ret half %r 48} 49 50; CHECK: [[EXT16_32]] = OpFunction [[F32]] 51; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[F16]] 52; CHECK: OpLabel 53; CHECK: [[R:%.*]] = OpFConvert [[F32]] [[A]] 54; CHECK: OpReturnValue [[R]] 55; CHECK-NEXT: OpFunctionEnd 56define float @f16tof32(half %a) { 57 %r = fpext half %a to float 58 ret float %r 59} 60 61; CHECK: [[TRUNC32_16v3]] = OpFunction [[F16v3]] 62; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[F32v3]] 63; CHECK: OpLabel 64; CHECK: [[R:%.*]] = OpFConvert [[F16v3]] [[A]] 65; CHECK: OpReturnValue [[R]] 66; CHECK-NEXT: OpFunctionEnd 67define <3 x half> @f32tof16v3(<3 x float> %a) { 68 %r = fptrunc <3 x float> %a to <3 x half> 69 ret <3 x half> %r 70} 71 72; CHECK: [[EXT16_32v3]] = OpFunction [[F32v3]] 73; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[F16v3]] 74; CHECK: OpLabel 75; CHECK: [[R:%.*]] = OpFConvert [[F32v3]] [[A]] 76; CHECK: OpReturnValue [[R]] 77; CHECK-NEXT: OpFunctionEnd 78define <3 x float> @f16tof32v3(<3 x half> %a) { 79 %r = fpext <3 x half> %a to <3 x float> 80 ret <3 x float> %r 81} 82 83; CHECK: [[F32toS32]] = OpFunction [[U32]] 84; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[F32]] 85; CHECK: OpLabel 86; CHECK: [[R:%.*]] = OpConvertFToS [[U32]] [[A]] 87; CHECK: OpReturnValue [[R]] 88; CHECK-NEXT: OpFunctionEnd 89define i32 @f32tos32(float %a) { 90 %r = fptosi float %a to i32 91 ret i32 %r 92} 93 94; CHECK: [[F32toS16]] = OpFunction [[U16]] 95; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[F32]] 96; CHECK: OpLabel 97; CHECK: [[R:%.*]] = OpConvertFToS [[U16]] [[A]] 98; CHECK: OpReturnValue [[R]] 99; CHECK-NEXT: OpFunctionEnd 100define i16 @f32tos16(float %a) { 101 %r = fptosi float %a to i16 102 ret i16 %r 103} 104 105; CHECK: [[F32toS8]] = OpFunction [[U8]] 106; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[F32]] 107; CHECK: OpLabel 108; CHECK: [[R:%.*]] = OpConvertFToS [[U8]] [[A]] 109; CHECK: OpReturnValue [[R]] 110; CHECK-NEXT: OpFunctionEnd 111define i8 @f32tos8(float %a) { 112 %r = fptosi float %a to i8 113 ret i8 %r 114} 115 116; CHECK: [[F16toS32]] = OpFunction [[U32]] 117; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[F16]] 118; CHECK: OpLabel 119; CHECK: [[R:%.*]] = OpConvertFToS [[U32]] [[A]] 120; CHECK: OpReturnValue [[R]] 121; CHECK-NEXT: OpFunctionEnd 122define i32 @f16tos32(half %a) { 123 %r = fptosi half %a to i32 124 ret i32 %r 125} 126 127; CHECK: [[F16toS16]] = OpFunction [[U16]] 128; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[F16]] 129; CHECK: OpLabel 130; CHECK: [[R:%.*]] = OpConvertFToS [[U16]] [[A]] 131; CHECK: OpReturnValue [[R]] 132; CHECK-NEXT: OpFunctionEnd 133define i16 @f16tos16(half %a) { 134 %r = fptosi half %a to i16 135 ret i16 %r 136} 137 138; CHECK: [[F16toS8]] = OpFunction [[U8]] 139; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[F16]] 140; CHECK: OpLabel 141; CHECK: [[R:%.*]] = OpConvertFToS [[U8]] [[A]] 142; CHECK: OpReturnValue [[R]] 143; CHECK-NEXT: OpFunctionEnd 144define i8 @f16tos8(half %a) { 145 %r = fptosi half %a to i8 146 ret i8 %r 147} 148 149; CHECK: [[F32toU32v2]] = OpFunction [[U32v2]] 150; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[F32v2]] 151; CHECK: OpLabel 152; CHECK: [[R:%.*]] = OpConvertFToU [[U32v2]] [[A]] 153; CHECK: OpReturnValue [[R]] 154; CHECK-NEXT: OpFunctionEnd 155define <2 x i32> @f32tou32v2(<2 x float> %a) { 156 %r = fptoui <2 x float> %a to <2 x i32> 157 ret <2 x i32> %r 158} 159 160; CHECK: [[F32toU16v2]] = OpFunction [[U16v2]] 161; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[F32v2]] 162; CHECK: OpLabel 163; CHECK: [[R:%.*]] = OpConvertFToU [[U16v2]] [[A]] 164; CHECK: OpReturnValue [[R]] 165; CHECK-NEXT: OpFunctionEnd 166define <2 x i16> @f32tou16v2(<2 x float> %a) { 167 %r = fptoui <2 x float> %a to <2 x i16> 168 ret <2 x i16> %r 169} 170 171; CHECK: [[F32toU8v2]] = OpFunction [[U8v2]] 172; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[F32v2]] 173; CHECK: OpLabel 174; CHECK: [[R:%.*]] = OpConvertFToU [[U8v2]] [[A]] 175; CHECK: OpReturnValue [[R]] 176; CHECK-NEXT: OpFunctionEnd 177define <2 x i8> @f32tou8v2(<2 x float> %a) { 178 %r = fptoui <2 x float> %a to <2 x i8> 179 ret <2 x i8> %r 180} 181 182; CHECK: [[F16toU32v2]] = OpFunction [[U32v2]] 183; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[F16v2]] 184; CHECK: OpLabel 185; CHECK: [[R:%.*]] = OpConvertFToU [[U32v2]] [[A]] 186; CHECK: OpReturnValue [[R]] 187; CHECK-NEXT: OpFunctionEnd 188define <2 x i32> @f16tou32v2(<2 x half> %a) { 189 %r = fptoui <2 x half> %a to <2 x i32> 190 ret <2 x i32> %r 191} 192 193; CHECK: [[F16toU16v2]] = OpFunction [[U16v2]] 194; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[F16v2]] 195; CHECK: OpLabel 196; CHECK: [[R:%.*]] = OpConvertFToU [[U16v2]] [[A]] 197; CHECK: OpReturnValue [[R]] 198; CHECK-NEXT: OpFunctionEnd 199define <2 x i16> @f16tou16v2(<2 x half> %a) { 200 %r = fptoui <2 x half> %a to <2 x i16> 201 ret <2 x i16> %r 202} 203 204; CHECK: [[F16toU8v2]] = OpFunction [[U8v2]] 205; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[F16v2]] 206; CHECK: OpLabel 207; CHECK: [[R:%.*]] = OpConvertFToU [[U8v2]] [[A]] 208; CHECK: OpReturnValue [[R]] 209; CHECK-NEXT: OpFunctionEnd 210define <2 x i8> @f16tou8v2(<2 x half> %a) { 211 %r = fptoui <2 x half> %a to <2 x i8> 212 ret <2 x i8> %r 213} 214