brintos

brintos / llvm-project-archived public Read only

0
0
Text · 12.1 KiB · 5fe2cc8 Raw
319 lines · plain
1; RUN: llc -verify-machineinstrs -O0 -mtriple=spirv64-unknown-unknown %s -o - | FileCheck %s2; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv64-unknown-unknown %s -o - -filetype=obj | spirv-val %}3 4; RUN: llc -verify-machineinstrs -O0 -mtriple=spirv32-unknown-unknown %s -o - | FileCheck %s5; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv32-unknown-unknown %s -o - -filetype=obj | spirv-val %}6 7; CHECK-DAG: OpName [[TRUNC32_16:%.*]] "i32toi16"8; CHECK-DAG: OpName [[TRUNC32_8:%.*]] "i32toi8"9; CHECK-DAG: OpName [[TRUNC16_8:%.*]] "i16toi8"10; CHECK-DAG: OpName [[SEXT8_32:%.*]] "s8tos32"11; CHECK-DAG: OpName [[SEXT8_16:%.*]] "s8tos16"12; CHECK-DAG: OpName [[SEXT16_32:%.*]] "s16tos32"13; CHECK-DAG: OpName [[ZEXT8_32:%.*]] "u8tou32"14; CHECK-DAG: OpName [[ZEXT8_16:%.*]] "u8tou16"15; CHECK-DAG: OpName [[ZEXT16_32:%.*]] "u16tou32"16 17; CHECK-DAG: OpName %[[#R16:]] "r16"18; CHECK-DAG: OpName %[[#R17:]] "r17"19; CHECK-DAG: OpName %[[#R18:]] "r18"20; CHECK-DAG: OpName %[[#R19:]] "r19"21; CHECK-DAG: OpName %[[#R20:]] "r20"22 23; CHECK-DAG: OpName [[TRUNC32_16v4:%.*]] "i32toi16v4"24; CHECK-DAG: OpName [[TRUNC32_8v4:%.*]] "i32toi8v4"25; CHECK-DAG: OpName [[TRUNC16_8v4:%.*]] "i16toi8v4"26; CHECK-DAG: OpName [[SEXT8_32v4:%.*]] "s8tos32v4"27; CHECK-DAG: OpName [[SEXT8_16v4:%.*]] "s8tos16v4"28; CHECK-DAG: OpName [[SEXT16_32v4:%.*]] "s16tos32v4"29; CHECK-DAG: OpName [[ZEXT8_32v4:%.*]] "u8tou32v4"30; CHECK-DAG: OpName [[ZEXT8_16v4:%.*]] "u8tou16v4"31; CHECK-DAG: OpName [[ZEXT16_32v4:%.*]] "u16tou32v4"32 33; CHECK-DAG: OpDecorate %[[#R16]] FPRoundingMode RTZ34; CHECK-DAG: OpDecorate %[[#R17]] FPRoundingMode RTE35; CHECK-DAG: OpDecorate %[[#R18]] FPRoundingMode RTP36; CHECK-DAG: OpDecorate %[[#R19]] FPRoundingMode RTN37; CHECK-DAG: OpDecorate %[[#R20]] SaturatedConversion38 39; CHECK-DAG: [[F32:%.*]] = OpTypeFloat 3240; CHECK-DAG: [[F16:%.*]] = OpTypeFloat 1641; CHECK-DAG: [[U64:%.*]] = OpTypeInt 64 042; CHECK-DAG: [[U32:%.*]] = OpTypeInt 32 043; CHECK-DAG: [[U16:%.*]] = OpTypeInt 16 044; CHECK-DAG: [[U8:%.*]] = OpTypeInt 8 045; CHECK-DAG: [[F32v2:%.*]] = OpTypeVector [[F32]] 246; CHECK-DAG: [[U32v4:%.*]] = OpTypeVector [[U32]] 447; CHECK-DAG: [[U16v4:%.*]] = OpTypeVector [[U16]] 448; CHECK-DAG: [[U8v4:%.*]] = OpTypeVector [[U8]] 449 50 51; CHECK:      [[TRUNC32_16]] = OpFunction [[U16]]52; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[U32]]53; CHECK:      OpLabel54; CHECK:      [[R:%.*]] = OpUConvert [[U16]] [[A]]55; CHECK:      OpReturnValue [[R]]56; CHECK-NEXT: OpFunctionEnd57define i16 @i32toi16(i32 %a) {58    %r = trunc i32 %a to i1659    ret i16 %r60}61 62; CHECK:      [[TRUNC32_8]] = OpFunction [[U8]]63; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[U32]]64; CHECK:      OpLabel65; CHECK:      [[R:%.*]] = OpUConvert [[U8]] [[A]]66; CHECK:      OpReturnValue [[R]]67; CHECK-NEXT: OpFunctionEnd68define i8 @i32toi8(i32 %a) {69    %r = trunc i32 %a to i870    ret i8 %r71}72 73; CHECK:      [[TRUNC16_8]] = OpFunction [[U8]]74; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[U16]]75; CHECK:      OpLabel76; CHECK:      [[R:%.*]] = OpUConvert [[U8]] [[A]]77; CHECK:      OpReturnValue [[R]]78; CHECK-NEXT: OpFunctionEnd79define i8 @i16toi8(i16 %a) {80    %r = trunc i16 %a to i881    ret i8 %r82}83 84 85; CHECK:      [[SEXT8_32]] = OpFunction [[U32]]86; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[U8]]87; CHECK:      OpLabel88; CHECK:      [[R:%.*]] = OpSConvert [[U32]] [[A]]89; CHECK:      OpReturnValue [[R]]90; CHECK-NEXT: OpFunctionEnd91define i32 @s8tos32(i8 %a) {92  %r = sext i8 %a to i3293  ret i32 %r94}95 96; CHECK:      [[SEXT8_16]] = OpFunction [[U16]]97; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[U8]]98; CHECK:      OpLabel99; CHECK:      [[R:%.*]] = OpSConvert [[U16]] [[A]]100; CHECK:      OpReturnValue [[R]]101; CHECK-NEXT: OpFunctionEnd102define i16 @s8tos16(i8 %a) {103  %r = sext i8 %a to i16104  ret i16 %r105}106 107; CHECK:      [[SEXT16_32]] = OpFunction [[U32]]108; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[U16]]109; CHECK:      OpLabel110; CHECK:      [[R:%.*]] = OpSConvert [[U32]] [[A]]111; CHECK:      OpReturnValue [[R]]112; CHECK-NEXT: OpFunctionEnd113define i32 @s16tos32(i16 %a) {114  %r = sext i16 %a to i32115  ret i32 %r116}117 118; CHECK:      [[ZEXT8_32]] = OpFunction [[U32]]119; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[U8]]120; CHECK:      OpLabel121; CHECK:      [[R:%.*]] = OpUConvert [[U32]] [[A]]122; CHECK:      OpReturnValue [[R]]123; CHECK-NEXT: OpFunctionEnd124define i32 @u8tou32(i8 %a) {125  %r = zext i8 %a to i32126  ret i32 %r127}128 129; CHECK:      [[ZEXT8_16]] = OpFunction [[U16]]130; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[U8]]131; CHECK:      OpLabel132; CHECK:      [[R:%.*]] = OpUConvert [[U16]] [[A]]133; CHECK:      OpReturnValue [[R]]134; CHECK-NEXT: OpFunctionEnd135define i16 @u8tou16(i8 %a) {136  %r = zext i8 %a to i16137  ret i16 %r138}139 140; CHECK:      [[ZEXT16_32]] = OpFunction [[U32]]141; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[U16]]142; CHECK:      OpLabel143; CHECK:      [[R:%.*]] = OpUConvert [[U32]] [[A]]144; CHECK:      OpReturnValue [[R]]145; CHECK-NEXT: OpFunctionEnd146define i32 @u16tou32(i16 %a) {147  %r = zext i16 %a to i32148  ret i32 %r149}150 151; CHECK:      [[TRUNC32_16v4]] = OpFunction [[U16v4]]152; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[U32v4]]153; CHECK:      OpLabel154; CHECK:      [[R:%.*]] = OpUConvert [[U16v4]] [[A]]155; CHECK:      OpReturnValue [[R]]156; CHECK-NEXT: OpFunctionEnd157define <4 x i16> @i32toi16v4(<4 x i32> %a) {158    %r = trunc <4 x i32> %a to <4 x i16>159    ret <4 x i16> %r160}161 162; CHECK:      [[TRUNC32_8v4]] = OpFunction [[U8v4]]163; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[U32v4]]164; CHECK:      OpLabel165; CHECK:      [[R:%.*]] = OpUConvert [[U8v4]] [[A]]166; CHECK:      OpReturnValue [[R]]167; CHECK-NEXT: OpFunctionEnd168define <4 x i8> @i32toi8v4(<4 x i32> %a) {169    %r = trunc <4 x i32> %a to <4 x i8>170    ret <4 x i8> %r171}172 173; CHECK:      [[TRUNC16_8v4]] = OpFunction [[U8v4]]174; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[U16v4]]175; CHECK:      OpLabel176; CHECK:      [[R:%.*]] = OpUConvert [[U8v4]] [[A]]177; CHECK:      OpReturnValue [[R]]178; CHECK-NEXT: OpFunctionEnd179define <4 x i8> @i16toi8v4(<4 x i16> %a) {180    %r = trunc <4 x i16> %a to <4 x i8>181    ret <4 x i8> %r182}183 184 185; CHECK:      [[SEXT8_32v4]] = OpFunction [[U32v4]]186; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[U8v4]]187; CHECK:      OpLabel188; CHECK:      [[R:%.*]] = OpSConvert [[U32v4]] [[A]]189; CHECK:      OpReturnValue [[R]]190; CHECK-NEXT: OpFunctionEnd191define <4 x i32>  @s8tos32v4(<4 x i8> %a) {192  %r = sext <4 x i8> %a to <4 x i32>193  ret <4 x i32>  %r194}195 196; CHECK:      [[SEXT8_16v4]] = OpFunction [[U16v4]]197; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[U8v4]]198; CHECK:      OpLabel199; CHECK:      [[R:%.*]] = OpSConvert [[U16v4]] [[A]]200; CHECK:      OpReturnValue [[R]]201; CHECK-NEXT: OpFunctionEnd202define <4 x i16> @s8tos16v4(<4 x i8> %a) {203  %r = sext <4 x i8> %a to <4 x i16>204  ret <4 x i16> %r205}206 207; CHECK:      [[SEXT16_32v4]] = OpFunction [[U32v4]]208; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[U16v4]]209; CHECK:      OpLabel210; CHECK:      [[R:%.*]] = OpSConvert [[U32v4]] [[A]]211; CHECK:      OpReturnValue [[R]]212; CHECK-NEXT: OpFunctionEnd213define <4 x i32>  @s16tos32v4(<4 x i16> %a) {214  %r = sext <4 x i16> %a to <4 x i32>215  ret <4 x i32>  %r216}217 218; CHECK:      [[ZEXT8_32v4]] = OpFunction [[U32v4]]219; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[U8v4]]220; CHECK:      OpLabel221; CHECK:      [[R:%.*]] = OpUConvert [[U32v4]] [[A]]222; CHECK:      OpReturnValue [[R]]223; CHECK-NEXT: OpFunctionEnd224define <4 x i32>  @u8tou32v4(<4 x i8> %a) {225  %r = zext <4 x i8> %a to <4 x i32>226  ret <4 x i32>  %r227}228 229; CHECK:      [[ZEXT8_16v4]] = OpFunction [[U16v4]]230; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[U8v4]]231; CHECK:      OpLabel232; CHECK:      [[R:%.*]] = OpUConvert [[U16v4]] [[A]]233; CHECK:      OpReturnValue [[R]]234; CHECK-NEXT: OpFunctionEnd235define <4 x i16> @u8tou16v4(<4 x i8> %a) {236  %r = zext <4 x i8> %a to <4 x i16>237  ret <4 x i16> %r238}239 240; CHECK:      [[ZEXT16_32v4]] = OpFunction [[U32v4]]241; CHECK-NEXT: [[A:%.*]] = OpFunctionParameter [[U16v4]]242; CHECK:      OpLabel243; CHECK:      [[R:%.*]] = OpUConvert [[U32v4]] [[A]]244; CHECK:      OpReturnValue [[R]]245; CHECK-NEXT: OpFunctionEnd246define <4 x i32>  @u16tou32v4(<4 x i16> %a) {247  %r = zext <4 x i16> %a to <4 x i32>248  ret <4 x i32>  %r249}250 251; CHECK: OpFunction252; CHECK: [[Arg1:%.*]] = OpFunctionParameter253; CHECK: [[Arg2:%.*]] = OpFunctionParameter254; CHECK: %[[#]] = OpConvertFToU [[U32]] %[[#]]255; CHECK: %[[#]] = OpConvertFToS [[U32]] %[[#]]256; CHECK: %[[#]] = OpConvertSToF [[F32]] %[[#]]257; CHECK: %[[#]] = OpConvertUToF [[F32]] %[[#]]258; CHECK: %[[#]] = OpUConvert [[U32]] %[[#]]259; CHECK: %[[#]] = OpSConvert [[U32]] %[[#]]260; CHECK: %[[#]] = OpFConvert [[F16]] %[[#]]261; CHECK: %[[#]] = OpSatConvertSToU [[U64]] %[[#]]262; CHECK: %[[#]] = OpSatConvertUToS [[U64]] %[[#]]263; CHECK: %[[#]] = OpConvertPtrToU [[U64]] [[Arg1]]264; CHECK: %[[#]] = OpConvertUToPtr %[[#]] [[Arg2]]265; CHECK: %[[#]] = OpUConvert [[U32v4]] %[[#]]266; CHECK: %[[#]] = OpSConvert [[U32v4]] %[[#]]267; CHECK: %[[#]] = OpConvertUToF [[F32]] %[[#]]268; CHECK: %[[#]] = OpConvertUToF [[F32]] %[[#]]269; CHECK: %[[#R16]] = OpFConvert [[F32v2]] %[[#]]270; CHECK: %[[#R17]] = OpFConvert [[F32v2]] %[[#]]271; CHECK: %[[#R18]] = OpFConvert [[F32v2]] %[[#]]272; CHECK: %[[#R19]] = OpFConvert [[F32v2]] %[[#]]273; CHECK: %[[#R20]] = OpConvertFToU [[U8]] %[[#]]274; CHECK: OpFunctionEnd275define dso_local spir_kernel void @test_wrappers(ptr addrspace(4) %arg, i64 %arg_ptr, <4 x i8> %arg_v2) {276  %r1 = call spir_func i32 @__spirv_ConvertFToU(float 0.000000e+00)277  %r2 = call spir_func i32 @__spirv_ConvertFToS(float 0.000000e+00)278  %r3 = call spir_func float @__spirv_ConvertSToF(i32 1)279  %r4 = call spir_func float @__spirv_ConvertUToF(i32 1)280  %r5 = call spir_func i32 @__spirv_UConvert(i64 1)281  %r6 = call spir_func i32 @__spirv_SConvert(i64 1)282  %r7 = call spir_func half @__spirv_FConvert(float 0.000000e+00)283  %r8 = call spir_func i64 @__spirv_SatConvertSToU(i64 1)284  %r9 = call spir_func i64 @__spirv_SatConvertUToS(i64 1)285  %r10 = call spir_func i64 @__spirv_ConvertPtrToU(ptr addrspace(4) %arg)286  %r11 = call spir_func ptr addrspace(4) @__spirv_ConvertUToPtr(i64 %arg_ptr)287  %r12 = call spir_func <4 x i32> @_Z22__spirv_UConvert_Rint2Dv2_a(<4 x i8> %arg_v2)288  %r13 = call spir_func <4 x i32> @_Z22__spirv_SConvert_Rint2Dv2_a(<4 x i8> %arg_v2)289  %r14 = call spir_func float @_Z30__spirv_ConvertUToF_Rfloat_rtz(i64 %arg_ptr)290  %r15 = call spir_func float @__spirv_ConvertUToF_Rfloat_rtz(i64 %arg_ptr)291  %r16 = call spir_func <2 x float> @_Z28__spirv_FConvert_Rfloat2_rtzDv2_DF16_(<2 x half> noundef <half 0xH409A, half 0xH439A>)292  %r17 = call spir_func <2 x float> @_Z28__spirv_FConvert_Rfloat2_rteDv2_DF16_(<2 x half> noundef <half 0xH409A, half 0xH439A>)293  %r18 = call spir_func <2 x float> @_Z28__spirv_FConvert_Rfloat2_rtpDv2_DF16_(<2 x half> noundef <half 0xH409A, half 0xH439A>)294  %r19 = call spir_func <2 x float> @_Z28__spirv_FConvert_Rfloat2_rtnDv2_DF16_(<2 x half> noundef <half 0xH409A, half 0xH439A>)295  %r20 = call spir_func i8 @_Z30__spirv_ConvertFToU_Ruchar_satf(float noundef 42.0)296  ret void297}298 299declare dso_local spir_func i32 @__spirv_ConvertFToU(float)300declare dso_local spir_func i32 @__spirv_ConvertFToS(float)301declare dso_local spir_func float @__spirv_ConvertSToF(i32)302declare dso_local spir_func float @__spirv_ConvertUToF(i32)303declare dso_local spir_func i32 @__spirv_UConvert(i64)304declare dso_local spir_func i32 @__spirv_SConvert(i64)305declare dso_local spir_func half @__spirv_FConvert(float)306declare dso_local spir_func i64 @__spirv_SatConvertSToU(i64)307declare dso_local spir_func i64 @__spirv_SatConvertUToS(i64)308declare dso_local spir_func i64 @__spirv_ConvertPtrToU(ptr addrspace(4))309declare dso_local spir_func ptr addrspace(4) @__spirv_ConvertUToPtr(i64)310declare dso_local spir_func <4 x i32> @_Z22__spirv_UConvert_Rint2Dv2_a(<4 x i8>)311declare dso_local spir_func <4 x i32> @_Z22__spirv_SConvert_Rint2Dv2_a(<4 x i8>)312declare dso_local spir_func float @_Z30__spirv_ConvertUToF_Rfloat_rtz(i64)313declare dso_local spir_func float @__spirv_ConvertUToF_Rfloat_rtz(i64)314declare dso_local spir_func <2 x float> @_Z28__spirv_FConvert_Rfloat2_rtzDv2_DF16_(<2 x half> noundef)315declare dso_local spir_func <2 x float> @_Z28__spirv_FConvert_Rfloat2_rteDv2_DF16_(<2 x half> noundef)316declare dso_local spir_func <2 x float> @_Z28__spirv_FConvert_Rfloat2_rtpDv2_DF16_(<2 x half> noundef)317declare dso_local spir_func <2 x float> @_Z28__spirv_FConvert_Rfloat2_rtnDv2_DF16_(<2 x half> noundef)318declare dso_local spir_func i8 @_Z30__spirv_ConvertFToU_Ruchar_satf(float)319