Skip to content

Commit

Permalink
feat: Add CMOV instruction to brillig and brillig gen (#5308)
Browse files Browse the repository at this point in the history
  • Loading branch information
sirasistant authored and AztecBot committed Mar 21, 2024
1 parent 5739fcc commit 67ba20d
Showing 1 changed file with 74 additions and 0 deletions.
74 changes: 74 additions & 0 deletions cpp/src/barretenberg/dsl/acir_format/serde/acir.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -591,6 +591,17 @@ struct BrilligOpcode {
static Mov bincodeDeserialize(std::vector<uint8_t>);
};

struct ConditionalMov {
Program::MemoryAddress destination;
Program::MemoryAddress source_a;
Program::MemoryAddress source_b;
Program::MemoryAddress condition;

friend bool operator==(const ConditionalMov&, const ConditionalMov&);
std::vector<uint8_t> bincodeSerialize() const;
static ConditionalMov bincodeDeserialize(std::vector<uint8_t>);
};

struct Load {
Program::MemoryAddress destination;
Program::MemoryAddress source_pointer;
Expand Down Expand Up @@ -644,6 +655,7 @@ struct BrilligOpcode {
Return,
ForeignCall,
Mov,
ConditionalMov,
Load,
Store,
BlackBox,
Expand Down Expand Up @@ -5832,6 +5844,68 @@ Program::BrilligOpcode::Mov serde::Deserializable<Program::BrilligOpcode::Mov>::

namespace Program {

inline bool operator==(const BrilligOpcode::ConditionalMov& lhs, const BrilligOpcode::ConditionalMov& rhs)
{
if (!(lhs.destination == rhs.destination)) {
return false;
}
if (!(lhs.source_a == rhs.source_a)) {
return false;
}
if (!(lhs.source_b == rhs.source_b)) {
return false;
}
if (!(lhs.condition == rhs.condition)) {
return false;
}
return true;
}

inline std::vector<uint8_t> BrilligOpcode::ConditionalMov::bincodeSerialize() const
{
auto serializer = serde::BincodeSerializer();
serde::Serializable<BrilligOpcode::ConditionalMov>::serialize(*this, serializer);
return std::move(serializer).bytes();
}

inline BrilligOpcode::ConditionalMov BrilligOpcode::ConditionalMov::bincodeDeserialize(std::vector<uint8_t> input)
{
auto deserializer = serde::BincodeDeserializer(input);
auto value = serde::Deserializable<BrilligOpcode::ConditionalMov>::deserialize(deserializer);
if (deserializer.get_buffer_offset() < input.size()) {
throw_or_abort("Some input bytes were not read");
}
return value;
}

} // end of namespace Program

template <>
template <typename Serializer>
void serde::Serializable<Program::BrilligOpcode::ConditionalMov>::serialize(
const Program::BrilligOpcode::ConditionalMov& obj, Serializer& serializer)
{
serde::Serializable<decltype(obj.destination)>::serialize(obj.destination, serializer);
serde::Serializable<decltype(obj.source_a)>::serialize(obj.source_a, serializer);
serde::Serializable<decltype(obj.source_b)>::serialize(obj.source_b, serializer);
serde::Serializable<decltype(obj.condition)>::serialize(obj.condition, serializer);
}

template <>
template <typename Deserializer>
Program::BrilligOpcode::ConditionalMov serde::Deserializable<Program::BrilligOpcode::ConditionalMov>::deserialize(
Deserializer& deserializer)
{
Program::BrilligOpcode::ConditionalMov obj;
obj.destination = serde::Deserializable<decltype(obj.destination)>::deserialize(deserializer);
obj.source_a = serde::Deserializable<decltype(obj.source_a)>::deserialize(deserializer);
obj.source_b = serde::Deserializable<decltype(obj.source_b)>::deserialize(deserializer);
obj.condition = serde::Deserializable<decltype(obj.condition)>::deserialize(deserializer);
return obj;
}

namespace Program {

inline bool operator==(const BrilligOpcode::Load& lhs, const BrilligOpcode::Load& rhs)
{
if (!(lhs.destination == rhs.destination)) {
Expand Down

0 comments on commit 67ba20d

Please sign in to comment.