aco: Missing 8-bit uadd_carry
In file ../mesa-amd-22.1.4/src/amd/compiler/aco_instruction_selection.cpp:1980
Unimplemented NIR instr bit size: vec1 8 div ssa_17 = uadd_carry ssa_13, ssa_15
ACO ERROR:
In file ../mesa-amd-22.1.4/src/amd/compiler/aco_instruction_selection.cpp:1980
Unimplemented NIR instr bit size: vec1 8 div ssa_17 = uadd_carry ssa_13, ssa_15
SPIR-V code
OpCapability Shader
OpCapability Int8
OpExtension "SPV_KHR_non_semantic_info"
%50 = OpExtInstImport "NonSemantic.ClspvReflection.2"
OpMemoryModel Logical GLSL450
OpEntryPoint GLCompute %23 "test_add_sat_uchar" %gl_GlobalInvocationID %13 %18 %19 %20 %5
%25 = OpString "example.cl"
OpSource OpenCL_C 120
%51 = OpString "test_add_sat_uchar"
%53 = OpString "srcA"
%54 = OpString "uchar*"
%59 = OpString "srcB"
%60 = OpString "uchar*"
%63 = OpString "dst"
%64 = OpString "uchar*"
OpMemberDecorate %_struct_3 0 Offset 0
OpMemberDecorate %_struct_3 1 Offset 16
OpDecorate %_struct_3 Block
OpDecorate %gl_GlobalInvocationID BuiltIn GlobalInvocationId
OpDecorate %gl_WorkGroupSize BuiltIn WorkgroupSize
OpDecorate %_runtimearr_uchar ArrayStride 1
OpMemberDecorate %_struct_16 0 Offset 0
OpDecorate %_struct_16 Block
OpDecorate %18 DescriptorSet 0
OpDecorate %18 Binding 0
OpDecorate %19 DescriptorSet 0
OpDecorate %19 Binding 1
OpDecorate %20 DescriptorSet 0
OpDecorate %20 Binding 2
OpDecorate %8 SpecId 0
OpDecorate %9 SpecId 1
OpDecorate %10 SpecId 2
%uint = OpTypeInt 32 0
%v3uint = OpTypeVector %uint 3
%_struct_3 = OpTypeStruct %v3uint %v3uint
%_ptr_PushConstant__struct_3 = OpTypePointer PushConstant %_struct_3
%_ptr_Input_v3uint = OpTypePointer Input %v3uint
%8 = OpSpecConstant %uint 1
%9 = OpSpecConstant %uint 1
%10 = OpSpecConstant %uint 1
%gl_WorkGroupSize = OpSpecConstantComposite %v3uint %8 %9 %10
%_ptr_Private_v3uint = OpTypePointer Private %v3uint
%uchar = OpTypeInt 8 0
%_runtimearr_uchar = OpTypeRuntimeArray %uchar
%_struct_16 = OpTypeStruct %_runtimearr_uchar
%_ptr_StorageBuffer__struct_16 = OpTypePointer StorageBuffer %_struct_16
%void = OpTypeVoid
%22 = OpTypeFunction %void
%_ptr_Input_uint = OpTypePointer Input %uint
%uint_0 = OpConstant %uint 0
%_ptr_PushConstant_uint = OpTypePointer PushConstant %uint
%uint_1 = OpConstant %uint 1
%_ptr_StorageBuffer_uchar = OpTypePointer StorageBuffer %uchar
%_struct_40 = OpTypeStruct %uchar %uchar
%bool = OpTypeBool
%uchar_0 = OpConstant %uchar 0
%uchar_255 = OpConstant %uchar 255
%uint_4507 = OpConstant %uint 4507
%uint_4515 = OpConstant %uint 4515
%uint_2 = OpConstant %uint 2
%uint_12 = OpConstant %uint 12
%uint_16 = OpConstant %uint 16
%5 = OpVariable %_ptr_PushConstant__struct_3 PushConstant
%gl_GlobalInvocationID = OpVariable %_ptr_Input_v3uint Input
%13 = OpVariable %_ptr_Private_v3uint Private %gl_WorkGroupSize
%18 = OpVariable %_ptr_StorageBuffer__struct_16 StorageBuffer
%19 = OpVariable %_ptr_StorageBuffer__struct_16 StorageBuffer
%20 = OpVariable %_ptr_StorageBuffer__struct_16 StorageBuffer
%23 = OpFunction %void None %22
%24 = OpLabel
%28 = OpAccessChain %_ptr_Input_uint %gl_GlobalInvocationID %uint_0
%29 = OpLoad %uint %28
%32 = OpAccessChain %_ptr_PushConstant_uint %5 %uint_1 %uint_0
%33 = OpLoad %uint %32
%34 = OpIAdd %uint %33 %29
%36 = OpAccessChain %_ptr_StorageBuffer_uchar %18 %uint_0 %34
%37 = OpLoad %uchar %36
%38 = OpAccessChain %_ptr_StorageBuffer_uchar %19 %uint_0 %34
%39 = OpLoad %uchar %38
%41 = OpIAddCarry %_struct_40 %37 %39
%42 = OpCompositeExtract %uchar %41 0
%43 = OpCompositeExtract %uchar %41 1
%46 = OpIEqual %bool %43 %uchar_0
%48 = OpSelect %uchar %46 %42 %uchar_255
%49 = OpAccessChain %_ptr_StorageBuffer_uchar %20 %uint_0 %34
OpStore %49 %48
OpReturn
OpFunctionEnd
%69 = OpExtInst %void %50 PushConstantGlobalOffset %uint_0 %uint_12
%71 = OpExtInst %void %50 PushConstantRegionOffset %uint_16 %uint_12
%52 = OpExtInst %void %50 Kernel %23 %51
%57 = OpExtInst %void %50 ArgumentInfo %53 %54 %uint_4507 %uint_4515 %uint_0
%58 = OpExtInst %void %50 ArgumentStorageBuffer %52 %uint_0 %uint_0 %uint_0 %57
%61 = OpExtInst %void %50 ArgumentInfo %59 %60 %uint_4507 %uint_4515 %uint_0
%62 = OpExtInst %void %50 ArgumentStorageBuffer %52 %uint_1 %uint_0 %uint_1 %61
%65 = OpExtInst %void %50 ArgumentInfo %63 %64 %uint_4507 %uint_4515 %uint_0
%67 = OpExtInst %void %50 ArgumentStorageBuffer %52 %uint_2 %uint_0 %uint_2 %65
%72 = OpExtInst %void %50 SpecConstantWorkgroupSize %uint_0 %uint_1 %uint_2
from https://godbolt.org/z/rbM7Y65Px
The SPIR-V contains an OpIAddCarry, so I think we'll just have to implement in ACO/NIR. (Also I don't see int8 handling for a bunch of other opcodes like normal iadd?)