1; RUN: llc %s -o - | FileCheck %s 2 3target triple = "spirv32-unknown-unknown" 4 5; CHECK-DAG: OpName [[TRUNC32_16:%.*]] "i32toi16" 6; CHECK-DAG: OpName [[TRUNC32_8:%.*]] "i32toi8" 7; CHECK-DAG: OpName [[TRUNC16_8:%.*]] "i16toi8" 8; CHECK-DAG: OpName [[SEXT8_32:%.*]] "s8tos32" 9; CHECK-DAG: OpName [[SEXT8_16:%.*]] "s8tos16" 10; CHECK-DAG: OpName [[SEXT16_32:%.*]] "s16tos32" 11; CHECK-DAG: OpName [[ZEXT8_32:%.*]] "u8tou32" 12; CHECK-DAG: OpName [[ZEXT8_16:%.*]] "u8tou16" 13; CHECK-DAG: OpName [[ZEXT16_32:%.*]] "u16tou32" 14 15; CHECK-DAG: OpName [[TRUNC32_16v4:%.*]] "i32toi16v4" 16; CHECK-DAG: OpName [[TRUNC32_8v4:%.*]] "i32toi8v4" 17; CHECK-DAG: OpName [[TRUNC16_8v4:%.*]] "i16toi8v4" 18; CHECK-DAG: OpName [[SEXT8_32v4:%.*]] "s8tos32v4" 19; CHECK-DAG: OpName [[SEXT8_16v4:%.*]] "s8tos16v4" 20; CHECK-DAG: OpName [[SEXT16_32v4:%.*]] "s16tos32v4" 21; CHECK-DAG: OpName [[ZEXT8_32v4:%.*]] "u8tou32v4" 22; CHECK-DAG: OpName [[ZEXT8_16v4:%.*]] "u8tou16v4" 23; CHECK-DAG: OpName [[ZEXT16_32v4:%.*]] "u16tou32v4" 24 25; CHECK-DAG: [[U32:%.*]] = OpTypeInt 32 0 26; CHECK-DAG: [[U16:%.*]] = OpTypeInt 16 0 27; CHECK-DAG: [[U8:%.*]] = OpTypeInt 8 0 28; CHECK-DAG: [[U32v4:%.*]] = OpTypeVector [[U32]] 4 29; CHECK-DAG: [[U16v4:%.*]] = OpTypeVector [[U16]] 4 30; CHECK-DAG: [[U8v4:%.*]] = OpTypeVector [[U8]] 4 31 32 33; CHECK: [[TRUNC32_16]] = OpFunction [[U16]] 34; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[U32]] 35; CHECK: OpLabel 36; CHECK: [[R:%.*]] = OpUConvert [[U16]] [[A]] 37; CHECK: OpReturnValue [[R]] 38; CHECK-NEXT: OpFunctionEnd 39define i16 @i32toi16(i32 %a) { 40 %r = trunc i32 %a to i16 41 ret i16 %r 42} 43 44; CHECK: [[TRUNC32_8]] = OpFunction [[U8]] 45; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[U32]] 46; CHECK: OpLabel 47; CHECK: [[R:%.*]] = OpUConvert [[U8]] [[A]] 48; CHECK: OpReturnValue [[R]] 49; CHECK-NEXT: OpFunctionEnd 50define i8 @i32toi8(i32 %a) { 51 %r = trunc i32 %a to i8 52 ret i8 %r 53} 54 55; CHECK: [[TRUNC16_8]] = OpFunction [[U8]] 56; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[U16]] 57; CHECK: OpLabel 58; CHECK: [[R:%.*]] = OpUConvert [[U8]] [[A]] 59; CHECK: OpReturnValue [[R]] 60; CHECK-NEXT: OpFunctionEnd 61define i8 @i16toi8(i16 %a) { 62 %r = trunc i16 %a to i8 63 ret i8 %r 64} 65 66 67; CHECK: [[SEXT8_32]] = OpFunction [[U32]] 68; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[U8]] 69; CHECK: OpLabel 70; CHECK: [[R:%.*]] = OpSConvert [[U32]] [[A]] 71; CHECK: OpReturnValue [[R]] 72; CHECK-NEXT: OpFunctionEnd 73define i32 @s8tos32(i8 %a) { 74 %r = sext i8 %a to i32 75 ret i32 %r 76} 77 78; CHECK: [[SEXT8_16]] = OpFunction [[U16]] 79; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[U8]] 80; CHECK: OpLabel 81; CHECK: [[R:%.*]] = OpSConvert [[U16]] [[A]] 82; CHECK: OpReturnValue [[R]] 83; CHECK-NEXT: OpFunctionEnd 84define i16 @s8tos16(i8 %a) { 85 %r = sext i8 %a to i16 86 ret i16 %r 87} 88 89; CHECK: [[SEXT16_32]] = OpFunction [[U32]] 90; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[U16]] 91; CHECK: OpLabel 92; CHECK: [[R:%.*]] = OpSConvert [[U32]] [[A]] 93; CHECK: OpReturnValue [[R]] 94; CHECK-NEXT: OpFunctionEnd 95define i32 @s16tos32(i16 %a) { 96 %r = sext i16 %a to i32 97 ret i32 %r 98} 99 100; CHECK: [[ZEXT8_32]] = OpFunction [[U32]] 101; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[U8]] 102; CHECK: OpLabel 103; CHECK: [[R:%.*]] = OpUConvert [[U32]] [[A]] 104; CHECK: OpReturnValue [[R]] 105; CHECK-NEXT: OpFunctionEnd 106define i32 @u8tou32(i8 %a) { 107 %r = zext i8 %a to i32 108 ret i32 %r 109} 110 111; CHECK: [[ZEXT8_16]] = OpFunction [[U16]] 112; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[U8]] 113; CHECK: OpLabel 114; CHECK: [[R:%.*]] = OpUConvert [[U16]] [[A]] 115; CHECK: OpReturnValue [[R]] 116; CHECK-NEXT: OpFunctionEnd 117define i16 @u8tou16(i8 %a) { 118 %r = zext i8 %a to i16 119 ret i16 %r 120} 121 122; CHECK: [[ZEXT16_32]] = OpFunction [[U32]] 123; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[U16]] 124; CHECK: OpLabel 125; CHECK: [[R:%.*]] = OpUConvert [[U32]] [[A]] 126; CHECK: OpReturnValue [[R]] 127; CHECK-NEXT: OpFunctionEnd 128define i32 @u16tou32(i16 %a) { 129 %r = zext i16 %a to i32 130 ret i32 %r 131} 132 133; CHECK: [[TRUNC32_16v4]] = OpFunction [[U16v4]] 134; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[U32v4]] 135; CHECK: OpLabel 136; CHECK: [[R:%.*]] = OpUConvert [[U16v4]] [[A]] 137; CHECK: OpReturnValue [[R]] 138; CHECK-NEXT: OpFunctionEnd 139define <4 x i16> @i32toi16v4(<4 x i32> %a) { 140 %r = trunc <4 x i32> %a to <4 x i16> 141 ret <4 x i16> %r 142} 143 144; CHECK: [[TRUNC32_8v4]] = OpFunction [[U8v4]] 145; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[U32v4]] 146; CHECK: OpLabel 147; CHECK: [[R:%.*]] = OpUConvert [[U8v4]] [[A]] 148; CHECK: OpReturnValue [[R]] 149; CHECK-NEXT: OpFunctionEnd 150define <4 x i8> @i32toi8v4(<4 x i32> %a) { 151 %r = trunc <4 x i32> %a to <4 x i8> 152 ret <4 x i8> %r 153} 154 155; CHECK: [[TRUNC16_8v4]] = OpFunction [[U8v4]] 156; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[U16v4]] 157; CHECK: OpLabel 158; CHECK: [[R:%.*]] = OpUConvert [[U8v4]] [[A]] 159; CHECK: OpReturnValue [[R]] 160; CHECK-NEXT: OpFunctionEnd 161define <4 x i8> @i16toi8v4(<4 x i16> %a) { 162 %r = trunc <4 x i16> %a to <4 x i8> 163 ret <4 x i8> %r 164} 165 166 167; CHECK: [[SEXT8_32v4]] = OpFunction [[U32v4]] 168; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[U8v4]] 169; CHECK: OpLabel 170; CHECK: [[R:%.*]] = OpSConvert [[U32v4]] [[A]] 171; CHECK: OpReturnValue [[R]] 172; CHECK-NEXT: OpFunctionEnd 173define <4 x i32> @s8tos32v4(<4 x i8> %a) { 174 %r = sext <4 x i8> %a to <4 x i32> 175 ret <4 x i32> %r 176} 177 178; CHECK: [[SEXT8_16v4]] = OpFunction [[U16v4]] 179; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[U8v4]] 180; CHECK: OpLabel 181; CHECK: [[R:%.*]] = OpSConvert [[U16v4]] [[A]] 182; CHECK: OpReturnValue [[R]] 183; CHECK-NEXT: OpFunctionEnd 184define <4 x i16> @s8tos16v4(<4 x i8> %a) { 185 %r = sext <4 x i8> %a to <4 x i16> 186 ret <4 x i16> %r 187} 188 189; CHECK: [[SEXT16_32v4]] = OpFunction [[U32v4]] 190; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[U16v4]] 191; CHECK: OpLabel 192; CHECK: [[R:%.*]] = OpSConvert [[U32v4]] [[A]] 193; CHECK: OpReturnValue [[R]] 194; CHECK-NEXT: OpFunctionEnd 195define <4 x i32> @s16tos32v4(<4 x i16> %a) { 196 %r = sext <4 x i16> %a to <4 x i32> 197 ret <4 x i32> %r 198} 199 200; CHECK: [[ZEXT8_32v4]] = OpFunction [[U32v4]] 201; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[U8v4]] 202; CHECK: OpLabel 203; CHECK: [[R:%.*]] = OpUConvert [[U32v4]] [[A]] 204; CHECK: OpReturnValue [[R]] 205; CHECK-NEXT: OpFunctionEnd 206define <4 x i32> @u8tou32v4(<4 x i8> %a) { 207 %r = zext <4 x i8> %a to <4 x i32> 208 ret <4 x i32> %r 209} 210 211; CHECK: [[ZEXT8_16v4]] = OpFunction [[U16v4]] 212; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[U8v4]] 213; CHECK: OpLabel 214; CHECK: [[R:%.*]] = OpUConvert [[U16v4]] [[A]] 215; CHECK: OpReturnValue [[R]] 216; CHECK-NEXT: OpFunctionEnd 217define <4 x i16> @u8tou16v4(<4 x i8> %a) { 218 %r = zext <4 x i8> %a to <4 x i16> 219 ret <4 x i16> %r 220} 221 222; CHECK: [[ZEXT16_32v4]] = OpFunction [[U32v4]] 223; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[U16v4]] 224; CHECK: OpLabel 225; CHECK: [[R:%.*]] = OpUConvert [[U32v4]] [[A]] 226; CHECK: OpReturnValue [[R]] 227; CHECK-NEXT: OpFunctionEnd 228define <4 x i32> @u16tou32v4(<4 x i16> %a) { 229 %r = zext <4 x i16> %a to <4 x i32> 230 ret <4 x i32> %r 231} 232