shader_ir: Add immediate node constructors
This commit is contained in:
parent
15a0e1481d
commit
4aaa2192b9
|
@ -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) {
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
Reference in New Issue