[spirv-reader][ir] Cleanup duplicate argument code. Add helper to extract the arguments to various SPIR-V operations and provide them as a vector of Value objects. Bug: 42250952 Change-Id: Ia61189e91174474ac23d2695b5ac7ce4d8c40292 Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/225914 Commit-Queue: dan sinclair <dsinclair@chromium.org> Reviewed-by: James Price <jrprice@google.com>
diff --git a/src/tint/lang/spirv/reader/parser/parser.cc b/src/tint/lang/spirv/reader/parser/parser.cc index 5151fbd..a43bbac 100644 --- a/src/tint/lang/spirv/reader/parser/parser.cc +++ b/src/tint/lang/spirv/reader/parser/parser.cc
@@ -620,22 +620,19 @@ EmitKill(inst); break; case spv::Op::OpDot: - Emit(b_.Call(Type(inst.type_id()), core::BuiltinFn::kDot, - Value(inst.GetSingleWordOperand(2)), - Value(inst.GetSingleWordOperand(3))), - inst.result_id()); + EmitBuiltinCall(inst, core::BuiltinFn::kDot); break; case spv::Op::OpBitCount: EmitBitCount(inst); break; case spv::Op::OpBitFieldInsert: - EmitBitFieldInsert(inst); + EmitSpirvBuiltinCall(inst, spirv::BuiltinFn::kBitFieldInsert); break; case spv::Op::OpBitFieldSExtract: - EmitBitFieldSExtract(inst); + EmitSpirvBuiltinCall(inst, spirv::BuiltinFn::kBitFieldSExtract); break; case spv::Op::OpBitFieldUExtract: - EmitBitFieldUExtract(inst); + EmitSpirvBuiltinCall(inst, spirv::BuiltinFn::kBitFieldUExtract); break; case spv::Op::OpBitReverse: EmitBuiltinCall(inst, core::BuiltinFn::kReverseBits); @@ -653,35 +650,20 @@ } } - void EmitBuiltinCall(const spvtools::opt::Instruction& inst, core::BuiltinFn fn) { + Vector<core::ir::Value*, 4> Args(const spvtools::opt::Instruction& inst, uint32_t start) { Vector<core::ir::Value*, 4> args; - for (uint32_t i = 2; i < inst.NumOperandWords(); i++) { + for (uint32_t i = start; i < inst.NumOperandWords(); i++) { args.Push(Value(inst.GetSingleWordOperand(i))); } - Emit(b_.Call(Type(inst.type_id()), fn, std::move(args)), inst.result_id()); + return args; } - void EmitBitFieldSExtract(const spvtools::opt::Instruction& inst) { - Emit(b_.Call<spirv::ir::BuiltinCall>( - Type(inst.type_id()), spirv::BuiltinFn::kBitFieldSExtract, - Value(inst.GetSingleWordOperand(2)), Value(inst.GetSingleWordOperand(3)), - Value(inst.GetSingleWordOperand(4))), - inst.result_id()); + void EmitBuiltinCall(const spvtools::opt::Instruction& inst, core::BuiltinFn fn) { + Emit(b_.Call(Type(inst.type_id()), fn, Args(inst, 2)), inst.result_id()); } - void EmitBitFieldUExtract(const spvtools::opt::Instruction& inst) { - Emit(b_.Call<spirv::ir::BuiltinCall>( - Type(inst.type_id()), spirv::BuiltinFn::kBitFieldUExtract, - Value(inst.GetSingleWordOperand(2)), Value(inst.GetSingleWordOperand(3)), - Value(inst.GetSingleWordOperand(4))), - inst.result_id()); - } - - void EmitBitFieldInsert(const spvtools::opt::Instruction& inst) { - Emit(b_.Call<spirv::ir::BuiltinCall>( - Type(inst.type_id()), spirv::BuiltinFn::kBitFieldInsert, - Value(inst.GetSingleWordOperand(2)), Value(inst.GetSingleWordOperand(3)), - Value(inst.GetSingleWordOperand(4)), Value(inst.GetSingleWordOperand(5))), + void EmitSpirvBuiltinCall(const spvtools::opt::Instruction& inst, spirv::BuiltinFn fn) { + Emit(b_.Call<spirv::ir::BuiltinCall>(Type(inst.type_id()), fn, Args(inst, 2)), inst.result_id()); } @@ -689,8 +671,7 @@ auto* res_ty = Type(inst.type_id()); Emit(b_.CallExplicit<spirv::ir::BuiltinCall>( res_ty, spirv::BuiltinFn::kBitCount, - Vector<const core::type::Type*, 1>{res_ty->DeepestElement()}, - Value(inst.GetSingleWordOperand(2))), + Vector<const core::type::Type*, 1>{res_ty->DeepestElement()}, Args(inst, 2)), inst.result_id()); } @@ -1002,10 +983,7 @@ /// @param inst the SPIR-V instruction for OpAccessChain void EmitAccess(const spvtools::opt::Instruction& inst) { - Vector<core::ir::Value*, 4> indices; - for (uint32_t i = 3; i < inst.NumOperandWords(); i++) { - indices.Push(Value(inst.GetSingleWordOperand(i))); - } + Vector<core::ir::Value*, 4> indices = Args(inst, 3); auto* base = Value(inst.GetSingleWordOperand(2)); if (indices.IsEmpty()) { @@ -1046,22 +1024,13 @@ /// @param inst the SPIR-V instruction for OpCompositeConstruct void EmitConstruct(const spvtools::opt::Instruction& inst) { - Vector<core::ir::Value*, 4> values; - for (uint32_t i = 2; i < inst.NumOperandWords(); i++) { - values.Push(Value(inst.GetSingleWordOperand(i))); - } - auto* construct = b_.Construct(Type(inst.type_id()), std::move(values)); + auto* construct = b_.Construct(Type(inst.type_id()), Args(inst, 2)); Emit(construct, inst.result_id()); } /// @param inst the SPIR-V instruction for OpFunctionCall void EmitFunctionCall(const spvtools::opt::Instruction& inst) { - // TODO(crbug.com/tint/1907): Capture result. - Vector<core::ir::Value*, 4> args; - for (uint32_t i = 3; i < inst.NumOperandWords(); i++) { - args.Push(Value(inst.GetSingleWordOperand(i))); - } - Emit(b_.Call(Function(inst.GetSingleWordInOperand(0)), std::move(args)), inst.result_id()); + Emit(b_.Call(Function(inst.GetSingleWordInOperand(0)), Args(inst, 3)), inst.result_id()); } /// @param inst the SPIR-V instruction for OpVariable