[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