shader: Add copy constructor to instructions

This commit is contained in:
ReinUsesLisp 2021-07-25 21:34:17 -03:00 committed by Fernando Sahmkow
parent 95761cc6a7
commit c892359d1b
4 changed files with 20 additions and 1 deletions

View File

@ -22,6 +22,11 @@ void Block::AppendNewInst(Opcode op, std::initializer_list<Value> args) {
PrependNewInst(end(), op, args); PrependNewInst(end(), op, args);
} }
Block::iterator Block::PrependNewInst(iterator insertion_point, const Inst& base_inst) {
Inst* const inst{inst_pool->Create(base_inst)};
return instructions.insert(insertion_point, *inst);
}
Block::iterator Block::PrependNewInst(iterator insertion_point, Opcode op, Block::iterator Block::PrependNewInst(iterator insertion_point, Opcode op,
std::initializer_list<Value> args, u32 flags) { std::initializer_list<Value> args, u32 flags) {
Inst* const inst{inst_pool->Create(op, flags)}; Inst* const inst{inst_pool->Create(op, flags)};

View File

@ -40,6 +40,9 @@ public:
/// Appends a new instruction to the end of this basic block. /// Appends a new instruction to the end of this basic block.
void AppendNewInst(Opcode op, std::initializer_list<Value> args); void AppendNewInst(Opcode op, std::initializer_list<Value> args);
/// Prepends a copy of an instruction to this basic block before the insertion point.
iterator PrependNewInst(iterator insertion_point, const Inst& base_inst);
/// Prepends a new instruction to this basic block before the insertion point. /// Prepends a new instruction to this basic block before the insertion point.
iterator PrependNewInst(iterator insertion_point, Opcode op, iterator PrependNewInst(iterator insertion_point, Opcode op,
std::initializer_list<Value> args = {}, u32 flags = 0); std::initializer_list<Value> args = {}, u32 flags = 0);

View File

@ -47,6 +47,17 @@ Inst::Inst(IR::Opcode op_, u32 flags_) noexcept : op{op_}, flags{flags_} {
} }
} }
Inst::Inst(const Inst& base) : op{base.op}, flags{base.flags} {
if (base.op == Opcode::Phi) {
throw NotImplementedException("Copying phi node");
}
std::construct_at(&args);
const size_t num_args{base.NumArgs()};
for (size_t index = 0; index < num_args; ++index) {
SetArg(index, base.Arg(index));
}
}
Inst::~Inst() { Inst::~Inst() {
if (op == Opcode::Phi) { if (op == Opcode::Phi) {
std::destroy_at(&phi_args); std::destroy_at(&phi_args);

View File

@ -116,10 +116,10 @@ public:
class Inst : public boost::intrusive::list_base_hook<> { class Inst : public boost::intrusive::list_base_hook<> {
public: public:
explicit Inst(IR::Opcode op_, u32 flags_) noexcept; explicit Inst(IR::Opcode op_, u32 flags_) noexcept;
explicit Inst(const Inst& base);
~Inst(); ~Inst();
Inst& operator=(const Inst&) = delete; Inst& operator=(const Inst&) = delete;
Inst(const Inst&) = delete;
Inst& operator=(Inst&&) = delete; Inst& operator=(Inst&&) = delete;
Inst(Inst&&) = delete; Inst(Inst&&) = delete;