mirror of
				https://git.zaroz.cloud/nintendo-back-up/yuzu/yuzu-mainline.git
				synced 2025-03-21 01:53:15 +00:00 
			
		
		
		
	Shader_Ir: Address Feedback and clang format.
This commit is contained in:
		
							parent
							
								
									507a9c6a40
								
							
						
					
					
						commit
						3c09d9abe6
					
				@ -1646,34 +1646,34 @@ private:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
class ExprDecompiler {
 | 
					class ExprDecompiler {
 | 
				
			||||||
public:
 | 
					public:
 | 
				
			||||||
    ExprDecompiler(SPIRVDecompiler& decomp) : decomp{decomp} {}
 | 
					    explicit ExprDecompiler(SPIRVDecompiler& decomp) : decomp{decomp} {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    void operator()(VideoCommon::Shader::ExprAnd& expr) {
 | 
					    Id operator()(VideoCommon::Shader::ExprAnd& expr) {
 | 
				
			||||||
        const Id type_def = decomp.GetTypeDefinition(Type::Bool);
 | 
					        const Id type_def = decomp.GetTypeDefinition(Type::Bool);
 | 
				
			||||||
        const Id op1 = Visit(expr.operand1);
 | 
					        const Id op1 = Visit(expr.operand1);
 | 
				
			||||||
        const Id op2 = Visit(expr.operand2);
 | 
					        const Id op2 = Visit(expr.operand2);
 | 
				
			||||||
        current_id = decomp.Emit(decomp.OpLogicalAnd(type_def, op1, op2));
 | 
					        return decomp.Emit(decomp.OpLogicalAnd(type_def, op1, op2));
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    void operator()(VideoCommon::Shader::ExprOr& expr) {
 | 
					    Id operator()(VideoCommon::Shader::ExprOr& expr) {
 | 
				
			||||||
        const Id type_def = decomp.GetTypeDefinition(Type::Bool);
 | 
					        const Id type_def = decomp.GetTypeDefinition(Type::Bool);
 | 
				
			||||||
        const Id op1 = Visit(expr.operand1);
 | 
					        const Id op1 = Visit(expr.operand1);
 | 
				
			||||||
        const Id op2 = Visit(expr.operand2);
 | 
					        const Id op2 = Visit(expr.operand2);
 | 
				
			||||||
        current_id = decomp.Emit(decomp.OpLogicalOr(type_def, op1, op2));
 | 
					        return decomp.Emit(decomp.OpLogicalOr(type_def, op1, op2));
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    void operator()(VideoCommon::Shader::ExprNot& expr) {
 | 
					    Id operator()(VideoCommon::Shader::ExprNot& expr) {
 | 
				
			||||||
        const Id type_def = decomp.GetTypeDefinition(Type::Bool);
 | 
					        const Id type_def = decomp.GetTypeDefinition(Type::Bool);
 | 
				
			||||||
        const Id op1 = Visit(expr.operand1);
 | 
					        const Id op1 = Visit(expr.operand1);
 | 
				
			||||||
        current_id = decomp.Emit(decomp.OpLogicalNot(type_def, op1));
 | 
					        return decomp.Emit(decomp.OpLogicalNot(type_def, op1));
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    void operator()(VideoCommon::Shader::ExprPredicate& expr) {
 | 
					    Id operator()(VideoCommon::Shader::ExprPredicate& expr) {
 | 
				
			||||||
        const auto pred = static_cast<Tegra::Shader::Pred>(expr.predicate);
 | 
					        const auto pred = static_cast<Tegra::Shader::Pred>(expr.predicate);
 | 
				
			||||||
        current_id = decomp.Emit(decomp.OpLoad(decomp.t_bool, decomp.predicates.at(pred)));
 | 
					        return decomp.Emit(decomp.OpLoad(decomp.t_bool, decomp.predicates.at(pred)));
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    void operator()(VideoCommon::Shader::ExprCondCode& expr) {
 | 
					    Id operator()(VideoCommon::Shader::ExprCondCode& expr) {
 | 
				
			||||||
        const Node cc = decomp.ir.GetConditionCode(expr.cc);
 | 
					        const Node cc = decomp.ir.GetConditionCode(expr.cc);
 | 
				
			||||||
        Id target;
 | 
					        Id target;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -1690,35 +1690,28 @@ public:
 | 
				
			|||||||
        } else if (const auto flag = std::get_if<InternalFlagNode>(&*cc)) {
 | 
					        } else if (const auto flag = std::get_if<InternalFlagNode>(&*cc)) {
 | 
				
			||||||
            target = decomp.internal_flags.at(static_cast<u32>(flag->GetFlag()));
 | 
					            target = decomp.internal_flags.at(static_cast<u32>(flag->GetFlag()));
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        current_id = decomp.Emit(decomp.OpLoad(decomp.t_bool, target));
 | 
					        return decomp.Emit(decomp.OpLoad(decomp.t_bool, target));
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    void operator()(VideoCommon::Shader::ExprVar& expr) {
 | 
					    Id operator()(VideoCommon::Shader::ExprVar& expr) {
 | 
				
			||||||
        current_id =
 | 
					        return decomp.Emit(decomp.OpLoad(decomp.t_bool, decomp.flow_variables.at(expr.var_index)));
 | 
				
			||||||
            decomp.Emit(decomp.OpLoad(decomp.t_bool, decomp.flow_variables.at(expr.var_index)));
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    void operator()(VideoCommon::Shader::ExprBoolean& expr) {
 | 
					    Id operator()(VideoCommon::Shader::ExprBoolean& expr) {
 | 
				
			||||||
        current_id = expr.value ? decomp.v_true : decomp.v_false;
 | 
					        return expr.value ? decomp.v_true : decomp.v_false;
 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    Id GetResult() {
 | 
					 | 
				
			||||||
        return current_id;
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    Id Visit(VideoCommon::Shader::Expr& node) {
 | 
					    Id Visit(VideoCommon::Shader::Expr& node) {
 | 
				
			||||||
        std::visit(*this, *node);
 | 
					        return std::visit(*this, *node);
 | 
				
			||||||
        return current_id;
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
private:
 | 
					private:
 | 
				
			||||||
    Id current_id;
 | 
					 | 
				
			||||||
    SPIRVDecompiler& decomp;
 | 
					    SPIRVDecompiler& decomp;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class ASTDecompiler {
 | 
					class ASTDecompiler {
 | 
				
			||||||
public:
 | 
					public:
 | 
				
			||||||
    ASTDecompiler(SPIRVDecompiler& decomp) : decomp{decomp} {}
 | 
					    explicit ASTDecompiler(SPIRVDecompiler& decomp) : decomp{decomp} {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    void operator()(VideoCommon::Shader::ASTProgram& ast) {
 | 
					    void operator()(VideoCommon::Shader::ASTProgram& ast) {
 | 
				
			||||||
        ASTNode current = ast.nodes.GetFirst();
 | 
					        ASTNode current = ast.nodes.GetFirst();
 | 
				
			||||||
@ -1850,7 +1843,7 @@ public:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
private:
 | 
					private:
 | 
				
			||||||
    SPIRVDecompiler& decomp;
 | 
					    SPIRVDecompiler& decomp;
 | 
				
			||||||
    Id current_loop_exit;
 | 
					    Id current_loop_exit{};
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void SPIRVDecompiler::DecompileAST() {
 | 
					void SPIRVDecompiler::DecompileAST() {
 | 
				
			||||||
 | 
				
			|||||||
@ -442,8 +442,11 @@ void ASTManager::Decompile() {
 | 
				
			|||||||
    auto it = gotos.begin();
 | 
					    auto it = gotos.begin();
 | 
				
			||||||
    while (it != gotos.end()) {
 | 
					    while (it != gotos.end()) {
 | 
				
			||||||
        const ASTNode goto_node = *it;
 | 
					        const ASTNode goto_node = *it;
 | 
				
			||||||
        const u32 label_index = goto_node->GetGotoLabel();
 | 
					        const auto label_index = goto_node->GetGotoLabel();
 | 
				
			||||||
        const ASTNode label = labels[label_index];
 | 
					        if (!label_index) {
 | 
				
			||||||
 | 
					            return;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        const ASTNode label = labels[*label_index];
 | 
				
			||||||
        if (!full_decompile) {
 | 
					        if (!full_decompile) {
 | 
				
			||||||
            // We only decompile backward jumps
 | 
					            // We only decompile backward jumps
 | 
				
			||||||
            if (!IsBackwardsJump(goto_node, label)) {
 | 
					            if (!IsBackwardsJump(goto_node, label)) {
 | 
				
			||||||
@ -498,8 +501,11 @@ void ASTManager::Decompile() {
 | 
				
			|||||||
            bool can_remove = true;
 | 
					            bool can_remove = true;
 | 
				
			||||||
            ASTNode label = *it;
 | 
					            ASTNode label = *it;
 | 
				
			||||||
            for (const ASTNode goto_node : gotos) {
 | 
					            for (const ASTNode goto_node : gotos) {
 | 
				
			||||||
                const u32 label_index = goto_node->GetGotoLabel();
 | 
					                const auto label_index = goto_node->GetGotoLabel();
 | 
				
			||||||
                ASTNode glabel = labels[label_index];
 | 
					                if (!label_index) {
 | 
				
			||||||
 | 
					                    return;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                ASTNode glabel = labels[*label_index];
 | 
				
			||||||
                if (glabel == label) {
 | 
					                if (glabel == label) {
 | 
				
			||||||
                    can_remove = false;
 | 
					                    can_remove = false;
 | 
				
			||||||
                    break;
 | 
					                    break;
 | 
				
			||||||
 | 
				
			|||||||
@ -44,7 +44,7 @@ enum class ASTZipperType : u32 {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
class ASTZipper final {
 | 
					class ASTZipper final {
 | 
				
			||||||
public:
 | 
					public:
 | 
				
			||||||
    ASTZipper();
 | 
					    explicit ASTZipper();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    void Init(ASTNode first, ASTNode parent);
 | 
					    void Init(ASTNode first, ASTNode parent);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -71,74 +71,74 @@ public:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
class ASTProgram {
 | 
					class ASTProgram {
 | 
				
			||||||
public:
 | 
					public:
 | 
				
			||||||
    ASTProgram() : nodes{} {};
 | 
					    explicit ASTProgram() = default;
 | 
				
			||||||
    ASTZipper nodes;
 | 
					    ASTZipper nodes{};
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class ASTIfThen {
 | 
					class ASTIfThen {
 | 
				
			||||||
public:
 | 
					public:
 | 
				
			||||||
    ASTIfThen(Expr condition) : condition(condition), nodes{} {}
 | 
					    explicit ASTIfThen(Expr condition) : condition(condition) {}
 | 
				
			||||||
    Expr condition;
 | 
					    Expr condition;
 | 
				
			||||||
    ASTZipper nodes;
 | 
					    ASTZipper nodes{};
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class ASTIfElse {
 | 
					class ASTIfElse {
 | 
				
			||||||
public:
 | 
					public:
 | 
				
			||||||
    ASTIfElse() : nodes{} {}
 | 
					    explicit ASTIfElse() = default;
 | 
				
			||||||
    ASTZipper nodes;
 | 
					    ASTZipper nodes{};
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class ASTBlockEncoded {
 | 
					class ASTBlockEncoded {
 | 
				
			||||||
public:
 | 
					public:
 | 
				
			||||||
    ASTBlockEncoded(u32 start, u32 end) : start{start}, end{end} {}
 | 
					    explicit ASTBlockEncoded(u32 start, u32 end) : start{start}, end{end} {}
 | 
				
			||||||
    u32 start;
 | 
					    u32 start;
 | 
				
			||||||
    u32 end;
 | 
					    u32 end;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class ASTBlockDecoded {
 | 
					class ASTBlockDecoded {
 | 
				
			||||||
public:
 | 
					public:
 | 
				
			||||||
    ASTBlockDecoded(NodeBlock& new_nodes) : nodes(std::move(new_nodes)) {}
 | 
					    explicit ASTBlockDecoded(NodeBlock& new_nodes) : nodes(std::move(new_nodes)) {}
 | 
				
			||||||
    NodeBlock nodes;
 | 
					    NodeBlock nodes;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class ASTVarSet {
 | 
					class ASTVarSet {
 | 
				
			||||||
public:
 | 
					public:
 | 
				
			||||||
    ASTVarSet(u32 index, Expr condition) : index{index}, condition{condition} {}
 | 
					    explicit ASTVarSet(u32 index, Expr condition) : index{index}, condition{condition} {}
 | 
				
			||||||
    u32 index;
 | 
					    u32 index;
 | 
				
			||||||
    Expr condition;
 | 
					    Expr condition;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class ASTLabel {
 | 
					class ASTLabel {
 | 
				
			||||||
public:
 | 
					public:
 | 
				
			||||||
    ASTLabel(u32 index) : index{index} {}
 | 
					    explicit ASTLabel(u32 index) : index{index} {}
 | 
				
			||||||
    u32 index;
 | 
					    u32 index;
 | 
				
			||||||
    bool unused{};
 | 
					    bool unused{};
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class ASTGoto {
 | 
					class ASTGoto {
 | 
				
			||||||
public:
 | 
					public:
 | 
				
			||||||
    ASTGoto(Expr condition, u32 label) : condition{condition}, label{label} {}
 | 
					    explicit ASTGoto(Expr condition, u32 label) : condition{condition}, label{label} {}
 | 
				
			||||||
    Expr condition;
 | 
					    Expr condition;
 | 
				
			||||||
    u32 label;
 | 
					    u32 label;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class ASTDoWhile {
 | 
					class ASTDoWhile {
 | 
				
			||||||
public:
 | 
					public:
 | 
				
			||||||
    ASTDoWhile(Expr condition) : condition(condition), nodes{} {}
 | 
					    explicit ASTDoWhile(Expr condition) : condition(condition) {}
 | 
				
			||||||
    Expr condition;
 | 
					    Expr condition;
 | 
				
			||||||
    ASTZipper nodes;
 | 
					    ASTZipper nodes{};
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class ASTReturn {
 | 
					class ASTReturn {
 | 
				
			||||||
public:
 | 
					public:
 | 
				
			||||||
    ASTReturn(Expr condition, bool kills) : condition{condition}, kills{kills} {}
 | 
					    explicit ASTReturn(Expr condition, bool kills) : condition{condition}, kills{kills} {}
 | 
				
			||||||
    Expr condition;
 | 
					    Expr condition;
 | 
				
			||||||
    bool kills;
 | 
					    bool kills;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class ASTBreak {
 | 
					class ASTBreak {
 | 
				
			||||||
public:
 | 
					public:
 | 
				
			||||||
    ASTBreak(Expr condition) : condition{condition} {}
 | 
					    explicit ASTBreak(Expr condition) : condition{condition} {}
 | 
				
			||||||
    Expr condition;
 | 
					    Expr condition;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -177,11 +177,11 @@ public:
 | 
				
			|||||||
        return &data;
 | 
					        return &data;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ASTNode GetNext() {
 | 
					    ASTNode GetNext() const {
 | 
				
			||||||
        return next;
 | 
					        return next;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ASTNode GetPrevious() {
 | 
					    ASTNode GetPrevious() const {
 | 
				
			||||||
        return previous;
 | 
					        return previous;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -189,12 +189,12 @@ public:
 | 
				
			|||||||
        return *manager;
 | 
					        return *manager;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    u32 GetGotoLabel() const {
 | 
					    std::optional<u32> GetGotoLabel() const {
 | 
				
			||||||
        auto inner = std::get_if<ASTGoto>(&data);
 | 
					        auto inner = std::get_if<ASTGoto>(&data);
 | 
				
			||||||
        if (inner) {
 | 
					        if (inner) {
 | 
				
			||||||
            return inner->label;
 | 
					            return {inner->label};
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        return -1;
 | 
					        return {};
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    Expr GetGotoCondition() const {
 | 
					    Expr GetGotoCondition() const {
 | 
				
			||||||
@ -220,12 +220,12 @@ public:
 | 
				
			|||||||
        return true;
 | 
					        return true;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    u32 GetLabelIndex() const {
 | 
					    std::optional<u32> GetLabelIndex() const {
 | 
				
			||||||
        auto inner = std::get_if<ASTLabel>(&data);
 | 
					        auto inner = std::get_if<ASTLabel>(&data);
 | 
				
			||||||
        if (inner) {
 | 
					        if (inner) {
 | 
				
			||||||
            return inner->index;
 | 
					            return {inner->index};
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        return -1;
 | 
					        return {};
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    Expr GetIfCondition() const {
 | 
					    Expr GetIfCondition() const {
 | 
				
			||||||
@ -290,7 +290,7 @@ private:
 | 
				
			|||||||
    friend class ASTZipper;
 | 
					    friend class ASTZipper;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ASTData data;
 | 
					    ASTData data;
 | 
				
			||||||
    ASTNode parent;
 | 
					    ASTNode parent{};
 | 
				
			||||||
    ASTNode next{};
 | 
					    ASTNode next{};
 | 
				
			||||||
    ASTNode previous{};
 | 
					    ASTNode previous{};
 | 
				
			||||||
    ASTZipper* manager{};
 | 
					    ASTZipper* manager{};
 | 
				
			||||||
@ -327,13 +327,18 @@ public:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    void SanityCheck();
 | 
					    void SanityCheck();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    void Clear();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    bool IsFullyDecompiled() const {
 | 
					    bool IsFullyDecompiled() const {
 | 
				
			||||||
        if (full_decompile) {
 | 
					        if (full_decompile) {
 | 
				
			||||||
            return gotos.size() == 0;
 | 
					            return gotos.size() == 0;
 | 
				
			||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
            for (ASTNode goto_node : gotos) {
 | 
					            for (ASTNode goto_node : gotos) {
 | 
				
			||||||
                u32 label_index = goto_node->GetGotoLabel();
 | 
					                auto label_index = goto_node->GetGotoLabel();
 | 
				
			||||||
                ASTNode glabel = labels[label_index];
 | 
					                if (!label_index) {
 | 
				
			||||||
 | 
					                    return false;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                ASTNode glabel = labels[*label_index];
 | 
				
			||||||
                if (IsBackwardsJump(goto_node, glabel)) {
 | 
					                if (IsBackwardsJump(goto_node, glabel)) {
 | 
				
			||||||
                    return false;
 | 
					                    return false;
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
@ -346,8 +351,6 @@ public:
 | 
				
			|||||||
        return main_node;
 | 
					        return main_node;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    void Clear();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    u32 GetVariables() const {
 | 
					    u32 GetVariables() const {
 | 
				
			||||||
        return variables;
 | 
					        return variables;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@ -372,9 +375,7 @@ private:
 | 
				
			|||||||
    void MoveOutward(ASTNode goto_node);
 | 
					    void MoveOutward(ASTNode goto_node);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    u32 NewVariable() {
 | 
					    u32 NewVariable() {
 | 
				
			||||||
        u32 new_var = variables;
 | 
					        return variables++;
 | 
				
			||||||
        variables++;
 | 
					 | 
				
			||||||
        return new_var;
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    bool full_decompile{};
 | 
					    bool full_decompile{};
 | 
				
			||||||
 | 
				
			|||||||
@ -28,7 +28,7 @@ using Expr = std::shared_ptr<ExprData>;
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
class ExprAnd final {
 | 
					class ExprAnd final {
 | 
				
			||||||
public:
 | 
					public:
 | 
				
			||||||
    ExprAnd(Expr a, Expr b) : operand1{a}, operand2{b} {}
 | 
					    explicit ExprAnd(Expr a, Expr b) : operand1{a}, operand2{b} {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    bool operator==(const ExprAnd& b) const;
 | 
					    bool operator==(const ExprAnd& b) const;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -38,7 +38,7 @@ public:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
class ExprOr final {
 | 
					class ExprOr final {
 | 
				
			||||||
public:
 | 
					public:
 | 
				
			||||||
    ExprOr(Expr a, Expr b) : operand1{a}, operand2{b} {}
 | 
					    explicit ExprOr(Expr a, Expr b) : operand1{a}, operand2{b} {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    bool operator==(const ExprOr& b) const;
 | 
					    bool operator==(const ExprOr& b) const;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -48,7 +48,7 @@ public:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
class ExprNot final {
 | 
					class ExprNot final {
 | 
				
			||||||
public:
 | 
					public:
 | 
				
			||||||
    ExprNot(Expr a) : operand1{a} {}
 | 
					    explicit ExprNot(Expr a) : operand1{a} {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    bool operator==(const ExprNot& b) const;
 | 
					    bool operator==(const ExprNot& b) const;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -57,7 +57,7 @@ public:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
class ExprVar final {
 | 
					class ExprVar final {
 | 
				
			||||||
public:
 | 
					public:
 | 
				
			||||||
    ExprVar(u32 index) : var_index{index} {}
 | 
					    explicit ExprVar(u32 index) : var_index{index} {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    bool operator==(const ExprVar& b) const {
 | 
					    bool operator==(const ExprVar& b) const {
 | 
				
			||||||
        return var_index == b.var_index;
 | 
					        return var_index == b.var_index;
 | 
				
			||||||
@ -68,7 +68,7 @@ public:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
class ExprPredicate final {
 | 
					class ExprPredicate final {
 | 
				
			||||||
public:
 | 
					public:
 | 
				
			||||||
    ExprPredicate(u32 predicate) : predicate{predicate} {}
 | 
					    explicit ExprPredicate(u32 predicate) : predicate{predicate} {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    bool operator==(const ExprPredicate& b) const {
 | 
					    bool operator==(const ExprPredicate& b) const {
 | 
				
			||||||
        return predicate == b.predicate;
 | 
					        return predicate == b.predicate;
 | 
				
			||||||
@ -79,7 +79,7 @@ public:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
class ExprCondCode final {
 | 
					class ExprCondCode final {
 | 
				
			||||||
public:
 | 
					public:
 | 
				
			||||||
    ExprCondCode(ConditionCode cc) : cc{cc} {}
 | 
					    explicit ExprCondCode(ConditionCode cc) : cc{cc} {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    bool operator==(const ExprCondCode& b) const {
 | 
					    bool operator==(const ExprCondCode& b) const {
 | 
				
			||||||
        return cc == b.cc;
 | 
					        return cc == b.cc;
 | 
				
			||||||
@ -90,7 +90,7 @@ public:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
class ExprBoolean final {
 | 
					class ExprBoolean final {
 | 
				
			||||||
public:
 | 
					public:
 | 
				
			||||||
    ExprBoolean(bool val) : value{val} {}
 | 
					    explicit ExprBoolean(bool val) : value{val} {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    bool operator==(const ExprBoolean& b) const {
 | 
					    bool operator==(const ExprBoolean& b) const {
 | 
				
			||||||
        return value == b.value;
 | 
					        return value == b.value;
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user