i965: Prevent implicit upcasts to brw_reg.
Now that backend_reg inherits from brw_reg, we have to be careful to avoid the object slicing problem. Reviewed-by: Francisco Jerez <currojerez@riseup.net>
This commit is contained in:
@@ -2037,7 +2037,8 @@ fs_visitor::opt_algebraic()
|
||||
if (inst->dst.type != inst->src[0].type)
|
||||
assert(!"unimplemented: saturate mixed types");
|
||||
|
||||
if (brw_saturate_immediate(inst->dst.type, &inst->src[0])) {
|
||||
if (brw_saturate_immediate(inst->dst.type,
|
||||
&inst->src[0].as_brw_reg())) {
|
||||
inst->saturate = false;
|
||||
progress = true;
|
||||
}
|
||||
|
||||
@@ -532,14 +532,14 @@ fs_visitor::try_constant_propagate(fs_inst *inst, acp_entry *entry)
|
||||
|
||||
if (inst->src[i].abs) {
|
||||
if ((devinfo->gen >= 8 && is_logic_op(inst->opcode)) ||
|
||||
!brw_abs_immediate(val.type, &val)) {
|
||||
!brw_abs_immediate(val.type, &val.as_brw_reg())) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
if (inst->src[i].negate) {
|
||||
if ((devinfo->gen >= 8 && is_logic_op(inst->opcode)) ||
|
||||
!brw_negate_immediate(val.type, &val)) {
|
||||
!brw_negate_immediate(val.type, &val.as_brw_reg())) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -92,7 +92,7 @@ brw_reg_from_fs_reg(fs_inst *inst, fs_reg *reg, unsigned gen)
|
||||
case ARF:
|
||||
case FIXED_GRF:
|
||||
case IMM:
|
||||
brw_reg = *static_cast<struct brw_reg *>(reg);
|
||||
brw_reg = reg->as_brw_reg();
|
||||
break;
|
||||
case BAD_FILE:
|
||||
/* Probably unused. */
|
||||
|
||||
@@ -39,11 +39,25 @@
|
||||
#define MAX_VGRF_SIZE 16
|
||||
|
||||
#ifdef __cplusplus
|
||||
struct backend_reg : public brw_reg
|
||||
struct backend_reg : private brw_reg
|
||||
{
|
||||
backend_reg() {}
|
||||
backend_reg(const struct brw_reg ®) : brw_reg(reg) {}
|
||||
|
||||
const brw_reg &as_brw_reg() const
|
||||
{
|
||||
assert(file == ARF || file == FIXED_GRF || file == MRF || file == IMM);
|
||||
assert(reg_offset == 0);
|
||||
return static_cast<const brw_reg &>(*this);
|
||||
}
|
||||
|
||||
brw_reg &as_brw_reg()
|
||||
{
|
||||
assert(file == ARF || file == FIXED_GRF || file == MRF || file == IMM);
|
||||
assert(reg_offset == 0);
|
||||
return static_cast<brw_reg &>(*this);
|
||||
}
|
||||
|
||||
bool equals(const backend_reg &r) const;
|
||||
|
||||
bool is_zero() const;
|
||||
@@ -63,6 +77,25 @@ struct backend_reg : public brw_reg
|
||||
* For uniforms, this is in units of 1 float.
|
||||
*/
|
||||
uint16_t reg_offset;
|
||||
|
||||
using brw_reg::type;
|
||||
using brw_reg::file;
|
||||
using brw_reg::negate;
|
||||
using brw_reg::abs;
|
||||
using brw_reg::address_mode;
|
||||
using brw_reg::subnr;
|
||||
using brw_reg::nr;
|
||||
|
||||
using brw_reg::swizzle;
|
||||
using brw_reg::writemask;
|
||||
using brw_reg::indirect_offset;
|
||||
using brw_reg::vstride;
|
||||
using brw_reg::width;
|
||||
using brw_reg::hstride;
|
||||
|
||||
using brw_reg::f;
|
||||
using brw_reg::d;
|
||||
using brw_reg::ud;
|
||||
};
|
||||
#endif
|
||||
|
||||
|
||||
@@ -583,7 +583,8 @@ vec4_visitor::opt_algebraic()
|
||||
if (inst->dst.type != inst->src[0].type)
|
||||
assert(!"unimplemented: saturate mixed types");
|
||||
|
||||
if (brw_saturate_immediate(inst->dst.type, &inst->src[0])) {
|
||||
if (brw_saturate_immediate(inst->dst.type,
|
||||
&inst->src[0].as_brw_reg())) {
|
||||
inst->saturate = false;
|
||||
progress = true;
|
||||
}
|
||||
@@ -1765,7 +1766,7 @@ vec4_visitor::convert_to_hw_regs()
|
||||
|
||||
case ARF:
|
||||
case FIXED_GRF:
|
||||
reg = dst;
|
||||
reg = dst.as_brw_reg();
|
||||
break;
|
||||
|
||||
case BAD_FILE:
|
||||
|
||||
@@ -134,14 +134,14 @@ try_constant_propagate(const struct brw_device_info *devinfo,
|
||||
|
||||
if (inst->src[arg].abs) {
|
||||
if ((devinfo->gen >= 8 && is_logic_op(inst->opcode)) ||
|
||||
!brw_abs_immediate(value.type, &value)) {
|
||||
!brw_abs_immediate(value.type, &value.as_brw_reg())) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
if (inst->src[arg].negate) {
|
||||
if ((devinfo->gen >= 8 && is_logic_op(inst->opcode)) ||
|
||||
!brw_negate_immediate(value.type, &value)) {
|
||||
!brw_negate_immediate(value.type, &value.as_brw_reg())) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -356,7 +356,7 @@ generate_gs_urb_write_allocate(struct brw_codegen *p, vec4_instruction *inst)
|
||||
|
||||
/* We pass the temporary passed in src0 as the writeback register */
|
||||
brw_urb_WRITE(p,
|
||||
inst->src[0], /* dest */
|
||||
inst->src[0].as_brw_reg(), /* dest */
|
||||
inst->base_mrf, /* starting mrf reg nr */
|
||||
src,
|
||||
BRW_URB_WRITE_ALLOCATE_COMPLETE,
|
||||
@@ -369,8 +369,8 @@ generate_gs_urb_write_allocate(struct brw_codegen *p, vec4_instruction *inst)
|
||||
brw_push_insn_state(p);
|
||||
brw_set_default_access_mode(p, BRW_ALIGN_1);
|
||||
brw_set_default_mask_control(p, BRW_MASK_DISABLE);
|
||||
brw_MOV(p, get_element_ud(inst->dst, 0),
|
||||
get_element_ud(inst->src[0], 0));
|
||||
brw_MOV(p, get_element_ud(inst->dst.as_brw_reg(), 0),
|
||||
get_element_ud(inst->src[0].as_brw_reg(), 0));
|
||||
brw_pop_insn_state(p);
|
||||
}
|
||||
|
||||
@@ -1059,9 +1059,9 @@ generate_code(struct brw_codegen *p,
|
||||
annotate(p->devinfo, &annotation, cfg, inst, p->next_insn_offset);
|
||||
|
||||
for (unsigned int i = 0; i < 3; i++) {
|
||||
src[i] = inst->src[i];
|
||||
src[i] = inst->src[i].as_brw_reg();
|
||||
}
|
||||
dst = inst->dst;
|
||||
dst = inst->dst.as_brw_reg();
|
||||
|
||||
brw_set_default_predicate_control(p, inst->predicate);
|
||||
brw_set_default_predicate_inverse(p, inst->predicate_inverse);
|
||||
|
||||
Reference in New Issue
Block a user