mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-02-05 21:20:25 +01:00
r600/sfn: Add address and index registers creation to ValueFactory
Signed-off-by: Gert Wollny <gert.wollny@collabora.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/21347>
This commit is contained in:
parent
a40c1c9d5c
commit
5579263368
2 changed files with 54 additions and 6 deletions
|
|
@ -346,6 +346,29 @@ ValueFactory::dest_vec4(const nir_dest& dst, Pin pin)
|
|||
unreachable("unsupported");
|
||||
}
|
||||
|
||||
PRegister ValueFactory::addr()
|
||||
{
|
||||
if (!m_ar)
|
||||
m_ar = new AddressRegister(AddressRegister::addr);
|
||||
return m_ar;
|
||||
}
|
||||
|
||||
PRegister ValueFactory::idx_reg(unsigned idx)
|
||||
{
|
||||
|
||||
if (idx == 0) {
|
||||
if (!m_idx0)
|
||||
m_idx0 = new AddressRegister(AddressRegister::idx0);
|
||||
return m_idx0;
|
||||
} else {
|
||||
assert(idx == 1);
|
||||
if (!m_idx1)
|
||||
m_idx1 = new AddressRegister(AddressRegister::idx1);
|
||||
return m_idx1;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
PVirtualValue
|
||||
ValueFactory::src(const nir_alu_src& alu_src, int chan)
|
||||
{
|
||||
|
|
@ -649,11 +672,17 @@ PRegister
|
|||
ValueFactory::dest_from_string(const std::string& s)
|
||||
{
|
||||
if (s == "AR") {
|
||||
return new AddressRegister(AddressRegister::addr);
|
||||
if (!m_ar)
|
||||
m_ar = new AddressRegister(AddressRegister::addr);
|
||||
return m_ar;
|
||||
} else if (s == "IDX0") {
|
||||
return new AddressRegister(AddressRegister::idx0);
|
||||
if (!m_idx0)
|
||||
m_idx0 = new AddressRegister(AddressRegister::idx0);
|
||||
return m_idx0;
|
||||
} else if (s == "IDX1") {
|
||||
return new AddressRegister(AddressRegister::idx1);
|
||||
if (!m_idx1)
|
||||
m_idx1 = new AddressRegister(AddressRegister::idx1);
|
||||
return m_idx1;
|
||||
}
|
||||
|
||||
string index_str;
|
||||
|
|
@ -723,7 +752,8 @@ ValueFactory::dest_from_string(const std::string& s)
|
|||
auto array = static_cast<LocalArray *>(ireg->second);
|
||||
PVirtualValue addr = nullptr;
|
||||
int offset = 0;
|
||||
if (size_str[0] == 'S' || size_str[0] == 'R') {
|
||||
if (size_str[0] == 'S' || size_str[0] == 'R' ||
|
||||
size_str == "AR" || size_str.substr(0,3) == "IDX") {
|
||||
addr = src_from_string(size_str);
|
||||
} else {
|
||||
istringstream num_str(size_str);
|
||||
|
|
@ -739,6 +769,17 @@ ValueFactory::dest_from_string(const std::string& s)
|
|||
PVirtualValue
|
||||
ValueFactory::src_from_string(const std::string& s)
|
||||
{
|
||||
if (s == "AR") {
|
||||
assert(m_ar);
|
||||
return m_ar;
|
||||
} else if (s == "IDX0") {
|
||||
assert(m_idx0);
|
||||
return m_idx0;
|
||||
} else if (s == "IDX1") {
|
||||
assert(m_idx1);
|
||||
return m_idx1;
|
||||
}
|
||||
|
||||
switch (s[0]) {
|
||||
case 'A':
|
||||
case 'S':
|
||||
|
|
@ -804,7 +845,8 @@ ValueFactory::src_from_string(const std::string& s)
|
|||
auto array = static_cast<LocalArray *>(ireg->second);
|
||||
PVirtualValue addr = nullptr;
|
||||
int offset = 0;
|
||||
if (size_str[0] == 'S' || size_str[0] == 'R') {
|
||||
if (size_str[0] == 'S' || size_str[0] == 'R' ||
|
||||
size_str == "AR" || size_str.substr(0,3) == "IDX") {
|
||||
addr = src_from_string(size_str);
|
||||
} else {
|
||||
istringstream num_str(size_str);
|
||||
|
|
|
|||
|
|
@ -284,9 +284,11 @@ public:
|
|||
void clear_pins();
|
||||
|
||||
int next_register_index() const { return m_next_register_index; }
|
||||
|
||||
uint32_t array_registers() const { return m_required_array_registers; }
|
||||
|
||||
PRegister addr();
|
||||
PRegister idx_reg(unsigned idx);
|
||||
|
||||
private:
|
||||
PVirtualValue ssa_src(const nir_ssa_def& dest, int chan);
|
||||
|
||||
|
|
@ -329,6 +331,10 @@ private:
|
|||
};
|
||||
ChannelCounts m_channel_counts;
|
||||
uint32_t m_required_array_registers{0};
|
||||
|
||||
AddressRegister *m_ar{nullptr};
|
||||
AddressRegister *m_idx0{nullptr};
|
||||
AddressRegister *m_idx1{nullptr};
|
||||
};
|
||||
|
||||
} // namespace r600
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue