shader_ir: Add immediate node constructors

This commit is contained in:
ReinUsesLisp 2018-12-20 22:36:17 -03:00
parent 15a0e1481d
commit 4aaa2192b9
2 changed files with 33 additions and 0 deletions

View File

@ -35,6 +35,18 @@ Node ShaderIR::Comment(const std::string& text) {
return StoreNode(CommentNode(text)); return StoreNode(CommentNode(text));
} }
Node ShaderIR::Immediate(u32 value) {
return StoreNode(ImmediateNode(value));
}
Node ShaderIR::GetImmediate19(Instruction instr) {
return Immediate(instr.alu.GetImm20_19());
}
Node ShaderIR::GetImmediate32(Instruction instr) {
return Immediate(instr.alu.GetImm20_32());
}
Node ShaderIR::GetPredicate(u64 pred_, bool negated) { Node ShaderIR::GetPredicate(u64 pred_, bool negated) {
const auto pred = static_cast<Pred>(pred_); const auto pred = static_cast<Pred>(pred_);
if (pred != Pred::UnusedIndex && pred != Pred::NeverExecute) { if (pred != Pred::UnusedIndex && pred != Pred::NeverExecute) {
@ -44,6 +56,10 @@ Node ShaderIR::GetPredicate(u64 pred_, bool negated) {
return StoreNode(PredicateNode(pred, negated)); return StoreNode(PredicateNode(pred, negated));
} }
Node ShaderIR::GetPredicate(bool immediate) {
return GetPredicate(static_cast<u64>(immediate ? Pred::UnusedIndex : Pred::NeverExecute));
}
/*static*/ OperationCode ShaderIR::SignedToUnsignedCode(OperationCode operation_code, /*static*/ OperationCode ShaderIR::SignedToUnsignedCode(OperationCode operation_code,
bool is_signed) { bool is_signed) {
if (is_signed) { if (is_signed) {

View File

@ -598,9 +598,26 @@ private:
Node Conditional(Node condition, std::vector<Node>&& code); Node Conditional(Node condition, std::vector<Node>&& code);
/// Creates a commentary /// Creates a commentary
Node Comment(const std::string& text); Node Comment(const std::string& text);
/// Creates an u32 immediate
Node Immediate(u32 value);
/// Creates a s32 immediate
Node Immediate(s32 value) {
return Immediate(static_cast<u32>(value));
}
/// Creates a f32 immediate
Node Immediate(f32 value) {
// TODO(Rodrigo): Replace this with bit_cast when C++20 releases
return Immediate(*reinterpret_cast<const u32*>(&value));
}
/// Generates a node representing a 19-bit immediate value
Node GetImmediate19(Tegra::Shader::Instruction instr);
/// Generates a node representing a 32-bit immediate value
Node GetImmediate32(Tegra::Shader::Instruction instr);
/// Generates a node for a passed predicate. It can be optionally negated /// Generates a node for a passed predicate. It can be optionally negated
Node GetPredicate(u64 pred, bool negated = false); Node GetPredicate(u64 pred, bool negated = false);
/// Generates a predicate node for an immediate true or false value
Node GetPredicate(bool immediate);
template <typename... T> template <typename... T>
inline Node Operation(OperationCode code, const T*... operands) { inline Node Operation(OperationCode code, const T*... operands) {