namespace r600_sb {
-using std::cerr;
-
int bc_parser::decode() {
dw = bc->bytecode;
}
sh = new shader(ctx, t, bc->debug_id);
+ sh->safe_math = sb_context::safe_math || (t == TARGET_COMPUTE);
+
int r = decode_shader();
delete dec;
int bc_parser::parse_decls() {
if (!pshader) {
- sh->add_gpr_array(0, pshader->bc.ngpr, 0x0F);
+ if (gpr_reladdr)
+ sh->add_gpr_array(0, bc->ngpr, 0x0F);
+
+ // compute shaders have some values preloaded in R0, R1
+ sh->add_input(0 /* GPR */, true /* preloaded */, 0x0F /* mask */);
+ sh->add_input(1 /* GPR */, true /* preloaded */, 0x0F /* mask */);
return 0;
}
if ((r = decode_fetch_clause(cf)))
return r;;
} else if (flags & CF_EXP) {
+ if (cf->bc.rw_rel)
+ gpr_reladdr = true;
assert(!cf->bc.rw_rel);
} else if (flags & (CF_STRM | CF_RAT)) {
+ if (cf->bc.rw_rel)
+ gpr_reladdr = true;
assert(!cf->bc.rw_rel);
} else if (flags & CF_BRANCH) {
if (cf->bc.addr > max_cf)
for (node_iterator I = g->begin(), E = g->end(); I != E; ++I) {
n = static_cast<alu_node*>(*I);
+ if (n->bc.dst_rel)
+ gpr_reladdr = true;
+
for (int k = 0; k < n->bc.op_ptr->src_count; ++k) {
bc_alu_src &src = n->bc.src[k];
+ if (src.rel)
+ gpr_reladdr = true;
if (src.sel == ALU_SRC_LITERAL) {
literal_mask |= (1 << src.chan);
src.value.u = dw[i + src.chan];
} else if (src.sel == ALU_SRC_PS || src.sel == ALU_SRC_PV) {
unsigned pgroup = !cgroup, prev_slot = src.sel == ALU_SRC_PS ?
SLOT_TRANS : src.chan;
+
+ // XXX shouldn't happen but llvm backend uses PS on cayman
+ if (prev_slot == SLOT_TRANS && ctx.is_cayman())
+ prev_slot = SLOT_X;
+
alu_node *prev_alu = slots[pgroup][prev_slot];
assert(prev_alu);
cf->push_back(n);
if ((r = dec->decode_fetch(i, n->bc)))
return r;
+ if (n->bc.src_rel || n->bc.dst_rel)
+ gpr_reladdr = true;
}
return 0;
cf_node *c_else = NULL, *end = cf_map[c->bc.addr];
BCP_DUMP(
- cerr << "parsing JUMP @" << c->bc.id;
- cerr << "\n";
+ sblog << "parsing JUMP @" << c->bc.id;
+ sblog << "\n";
);
if (end->bc.op == CF_OP_ELSE) {
BCP_DUMP(
- cerr << " found ELSE : ";
+ sblog << " found ELSE : ";
dump::dump_op(end);
- cerr << "\n";
+ sblog << "\n";
);
c_else = end;
end = cf_map[c_else->bc.addr];
} else {
BCP_DUMP(
- cerr << " no else\n";
+ sblog << " no else\n";
);
c_else = end;