summaryrefslogtreecommitdiffstats
path: root/src/gallium/drivers/r600/sb
diff options
context:
space:
mode:
Diffstat (limited to 'src/gallium/drivers/r600/sb')
-rw-r--r--src/gallium/drivers/r600/sb/sb_ra_init.cpp25
-rw-r--r--src/gallium/drivers/r600/sb/sb_sched.cpp4
2 files changed, 15 insertions, 14 deletions
diff --git a/src/gallium/drivers/r600/sb/sb_ra_init.cpp b/src/gallium/drivers/r600/sb/sb_ra_init.cpp
index 99ff6ff3ff5..03b8efde4c1 100644
--- a/src/gallium/drivers/r600/sb/sb_ra_init.cpp
+++ b/src/gallium/drivers/r600/sb/sb_ra_init.cpp
@@ -75,7 +75,7 @@ public:
void set(unsigned index, unsigned val);
- sel_chan find_free_bit(unsigned start);
+ sel_chan find_free_bit();
sel_chan find_free_chans(unsigned mask);
sel_chan find_free_array(unsigned size, unsigned mask);
@@ -148,24 +148,21 @@ void regbits::set(unsigned index, unsigned val) {
}
// free register for ra means the bit is set
-sel_chan regbits::find_free_bit(unsigned start) {
- unsigned elt = start >> bt_index_shift;
- unsigned bit = start & bt_index_mask;
-
- unsigned end = start < MAX_GPR - num_temps ? MAX_GPR - num_temps : MAX_GPR;
+sel_chan regbits::find_free_bit() {
+ unsigned elt = 0;
+ unsigned bit = 0;
- while (elt < end && !dta[elt]) {
+ while (elt < size && !dta[elt])
++elt;
- bit = 0;
- }
- if (elt >= end)
+ if (elt >= size)
return 0;
- // FIXME this seems broken when not starting from 0
+ bit = __builtin_ctz(dta[elt]) + (elt << bt_index_shift);
+
+ assert(bit < MAX_GPR - num_temps);
- bit += __builtin_ctz(dta[elt]);
- return ((elt << bt_index_shift) | bit) + 1;
+ return bit + 1;
}
// find free gpr component to use as indirectly addressable array
@@ -482,7 +479,7 @@ void ra_init::color(value* v) {
unsigned mask = 1 << v->pin_gpr.chan();
c = rb.find_free_chans(mask) + v->pin_gpr.chan();
} else {
- c = rb.find_free_bit(0);
+ c = rb.find_free_bit();
}
assert(c && c.sel() < 128 - ctx.alu_temp_gprs && "color failed");
diff --git a/src/gallium/drivers/r600/sb/sb_sched.cpp b/src/gallium/drivers/r600/sb/sb_sched.cpp
index d7c17952a4a..b21b342578d 100644
--- a/src/gallium/drivers/r600/sb/sb_sched.cpp
+++ b/src/gallium/drivers/r600/sb/sb_sched.cpp
@@ -542,6 +542,10 @@ bool alu_group_tracker::try_reserve(alu_node* n) {
assert(first_slot != ~0 && last_slot != ~0);
+ // silence "array subscript is above array bounds" with gcc 4.8
+ if (last_slot >= 5)
+ abort();
+
int i = first_nf;
alu_node *a = slots[i];
bool backtrack = false;