i965/fs: Remove dead IR construction code from the visitor.

Reviewed-by: Matt Turner <mattst88@gmail.com>
This commit is contained in:
Francisco Jerez 2015-06-08 19:32:18 +03:00
parent 51948085a2
commit 44928b799a
4 changed files with 0 additions and 439 deletions

View file

@ -214,143 +214,6 @@ fs_inst::resize_sources(uint8_t num_sources)
}
}
#define ALU1(op) \
fs_inst * \
fs_visitor::op(const fs_reg &dst, const fs_reg &src0) \
{ \
return new(mem_ctx) fs_inst(BRW_OPCODE_##op, dst, src0); \
}
#define ALU2(op) \
fs_inst * \
fs_visitor::op(const fs_reg &dst, const fs_reg &src0, \
const fs_reg &src1) \
{ \
return new(mem_ctx) fs_inst(BRW_OPCODE_##op, dst, src0, src1); \
}
#define ALU2_ACC(op) \
fs_inst * \
fs_visitor::op(const fs_reg &dst, const fs_reg &src0, \
const fs_reg &src1) \
{ \
fs_inst *inst = new(mem_ctx) fs_inst(BRW_OPCODE_##op, dst, src0, src1);\
inst->writes_accumulator = true; \
return inst; \
}
#define ALU3(op) \
fs_inst * \
fs_visitor::op(const fs_reg &dst, const fs_reg &src0, \
const fs_reg &src1, const fs_reg &src2) \
{ \
return new(mem_ctx) fs_inst(BRW_OPCODE_##op, dst, src0, src1, src2);\
}
ALU1(NOT)
ALU1(MOV)
ALU1(FRC)
ALU1(RNDD)
ALU1(RNDE)
ALU1(RNDZ)
ALU2(ADD)
ALU2(MUL)
ALU2_ACC(MACH)
ALU2(AND)
ALU2(OR)
ALU2(XOR)
ALU2(SHL)
ALU2(SHR)
ALU2(ASR)
ALU3(LRP)
ALU1(BFREV)
ALU3(BFE)
ALU2(BFI1)
ALU3(BFI2)
ALU1(FBH)
ALU1(FBL)
ALU1(CBIT)
ALU3(MAD)
ALU2_ACC(ADDC)
ALU2_ACC(SUBB)
ALU2(SEL)
ALU2(MAC)
/** Gen4 predicated IF. */
fs_inst *
fs_visitor::IF(enum brw_predicate predicate)
{
fs_inst *inst = new(mem_ctx) fs_inst(BRW_OPCODE_IF, dispatch_width);
inst->predicate = predicate;
return inst;
}
/** Gen6 IF with embedded comparison. */
fs_inst *
fs_visitor::IF(const fs_reg &src0, const fs_reg &src1,
enum brw_conditional_mod condition)
{
assert(devinfo->gen == 6);
fs_inst *inst = new(mem_ctx) fs_inst(BRW_OPCODE_IF, dispatch_width,
reg_null_d, src0, src1);
inst->conditional_mod = condition;
return inst;
}
/**
* CMP: Sets the low bit of the destination channels with the result
* of the comparison, while the upper bits are undefined, and updates
* the flag register with the packed 16 bits of the result.
*/
fs_inst *
fs_visitor::CMP(fs_reg dst, fs_reg src0, fs_reg src1,
enum brw_conditional_mod condition)
{
fs_inst *inst;
/* Take the instruction:
*
* CMP null<d> src0<f> src1<f>
*
* Original gen4 does type conversion to the destination type before
* comparison, producing garbage results for floating point comparisons.
*
* The destination type doesn't matter on newer generations, so we set the
* type to match src0 so we can compact the instruction.
*/
dst.type = src0.type;
if (dst.file == HW_REG)
dst.fixed_hw_reg.type = dst.type;
resolve_ud_negate(&src0);
resolve_ud_negate(&src1);
inst = new(mem_ctx) fs_inst(BRW_OPCODE_CMP, dst, src0, src1);
inst->conditional_mod = condition;
return inst;
}
fs_inst *
fs_visitor::LOAD_PAYLOAD(const fs_reg &dst, fs_reg *src, int sources,
int header_size)
{
assert(dst.width % 8 == 0);
fs_inst *inst = new(mem_ctx) fs_inst(SHADER_OPCODE_LOAD_PAYLOAD, dst.width,
dst, src, sources);
inst->header_size = header_size;
for (int i = 0; i < header_size; i++)
assert(src[i].file != GRF || src[i].width * type_sz(src[i].type) == 32);
inst->regs_written = header_size;
for (int i = header_size; i < sources; ++i)
assert(src[i].file != GRF || src[i].width == dst.width);
inst->regs_written += (sources - header_size) * (dst.width / 8);
return inst;
}
void
fs_visitor::VARYING_PULL_CONSTANT_LOAD(const fs_builder &bld,
const fs_reg &dst,
@ -862,45 +725,6 @@ fs_visitor::no16(const char *format, ...)
va_end(va);
}
fs_inst *
fs_visitor::emit(enum opcode opcode)
{
return emit(new(mem_ctx) fs_inst(opcode, dispatch_width));
}
fs_inst *
fs_visitor::emit(enum opcode opcode, const fs_reg &dst)
{
return emit(new(mem_ctx) fs_inst(opcode, dst));
}
fs_inst *
fs_visitor::emit(enum opcode opcode, const fs_reg &dst, const fs_reg &src0)
{
return emit(new(mem_ctx) fs_inst(opcode, dst, src0));
}
fs_inst *
fs_visitor::emit(enum opcode opcode, const fs_reg &dst, const fs_reg &src0,
const fs_reg &src1)
{
return emit(new(mem_ctx) fs_inst(opcode, dst, src0, src1));
}
fs_inst *
fs_visitor::emit(enum opcode opcode, const fs_reg &dst, const fs_reg &src0,
const fs_reg &src1, const fs_reg &src2)
{
return emit(new(mem_ctx) fs_inst(opcode, dst, src0, src1, src2));
}
fs_inst *
fs_visitor::emit(enum opcode opcode, const fs_reg &dst,
fs_reg src[], int sources)
{
return emit(new(mem_ctx) fs_inst(opcode, dst, src, sources));
}
/**
* Returns true if the instruction has a flag that means it won't
* update an entire destination register.
@ -1053,14 +877,6 @@ fs_visitor::vgrf(const glsl_type *const type)
brw_type_for_base_type(type), dispatch_width);
}
fs_reg
fs_visitor::vgrf(int num_components)
{
int reg_width = dispatch_width / 8;
return fs_reg(GRF, alloc.allocate(num_components * reg_width),
BRW_REGISTER_TYPE_F, dispatch_width);
}
/** Fixed HW reg constructor. */
fs_reg::fs_reg(enum register_file file, int reg)
{
@ -1487,106 +1303,6 @@ fs_visitor::resolve_source_modifiers(fs_reg *src)
*src = temp;
}
fs_reg
fs_visitor::fix_math_operand(fs_reg src)
{
/* Can't do hstride == 0 args on gen6 math, so expand it out. We
* might be able to do better by doing execsize = 1 math and then
* expanding that result out, but we would need to be careful with
* masking.
*
* The hardware ignores source modifiers (negate and abs) on math
* instructions, so we also move to a temp to set those up.
*/
if (devinfo->gen == 6 && src.file != UNIFORM && src.file != IMM &&
!src.abs && !src.negate)
return src;
/* Gen7 relaxes most of the above restrictions, but still can't use IMM
* operands to math
*/
if (devinfo->gen >= 7 && src.file != IMM)
return src;
fs_reg expanded = vgrf(glsl_type::float_type);
expanded.type = src.type;
emit(BRW_OPCODE_MOV, expanded, src);
return expanded;
}
fs_inst *
fs_visitor::emit_math(enum opcode opcode, fs_reg dst, fs_reg src)
{
switch (opcode) {
case SHADER_OPCODE_RCP:
case SHADER_OPCODE_RSQ:
case SHADER_OPCODE_SQRT:
case SHADER_OPCODE_EXP2:
case SHADER_OPCODE_LOG2:
case SHADER_OPCODE_SIN:
case SHADER_OPCODE_COS:
break;
default:
unreachable("not reached: bad math opcode");
}
/* Can't do hstride == 0 args to gen6 math, so expand it out. We
* might be able to do better by doing execsize = 1 math and then
* expanding that result out, but we would need to be careful with
* masking.
*
* Gen 6 hardware ignores source modifiers (negate and abs) on math
* instructions, so we also move to a temp to set those up.
*/
if (devinfo->gen == 6 || devinfo->gen == 7)
src = fix_math_operand(src);
fs_inst *inst = emit(opcode, dst, src);
if (devinfo->gen < 6) {
inst->base_mrf = 2;
inst->mlen = dispatch_width / 8;
}
return inst;
}
fs_inst *
fs_visitor::emit_math(enum opcode opcode, fs_reg dst, fs_reg src0, fs_reg src1)
{
int base_mrf = 2;
fs_inst *inst;
if (devinfo->gen >= 8) {
inst = emit(opcode, dst, src0, src1);
} else if (devinfo->gen >= 6) {
src0 = fix_math_operand(src0);
src1 = fix_math_operand(src1);
inst = emit(opcode, dst, src0, src1);
} else {
/* From the Ironlake PRM, Volume 4, Part 1, Section 6.1.13
* "Message Payload":
*
* "Operand0[7]. For the INT DIV functions, this operand is the
* denominator."
* ...
* "Operand1[7]. For the INT DIV functions, this operand is the
* numerator."
*/
bool is_int_div = opcode != SHADER_OPCODE_POW;
fs_reg &op0 = is_int_div ? src1 : src0;
fs_reg &op1 = is_int_div ? src0 : src1;
emit(MOV(fs_reg(MRF, base_mrf + 1, op1.type, dispatch_width), op1));
inst = emit(opcode, dst, op0, reg_null_f);
inst->base_mrf = base_mrf;
inst->mlen = 2 * dispatch_width / 8;
}
return inst;
}
void
fs_visitor::emit_discard_jump()
{

View file

@ -70,10 +70,6 @@ namespace brw {
class fs_visitor : public backend_shader
{
public:
const fs_reg reg_null_f;
const fs_reg reg_null_d;
const fs_reg reg_null_ud;
fs_visitor(struct brw_context *brw,
void *mem_ctx,
gl_shader_stage stage,
@ -86,7 +82,6 @@ public:
~fs_visitor();
fs_reg vgrf(const glsl_type *const type);
fs_reg vgrf(int num_components);
void import_uniforms(fs_visitor *v);
void setup_uniform_clipplane_values();
void compute_clip_distance();
@ -95,65 +90,11 @@ public:
void swizzle_result(ir_texture_opcode op, int dest_components,
fs_reg orig_val, uint32_t sampler);
fs_inst *emit(fs_inst *inst);
void emit(exec_list list);
fs_inst *emit(enum opcode opcode);
fs_inst *emit(enum opcode opcode, const fs_reg &dst);
fs_inst *emit(enum opcode opcode, const fs_reg &dst, const fs_reg &src0);
fs_inst *emit(enum opcode opcode, const fs_reg &dst, const fs_reg &src0,
const fs_reg &src1);
fs_inst *emit(enum opcode opcode, const fs_reg &dst,
const fs_reg &src0, const fs_reg &src1, const fs_reg &src2);
fs_inst *emit(enum opcode opcode, const fs_reg &dst,
fs_reg src[], int sources);
fs_inst *MOV(const fs_reg &dst, const fs_reg &src);
fs_inst *NOT(const fs_reg &dst, const fs_reg &src);
fs_inst *RNDD(const fs_reg &dst, const fs_reg &src);
fs_inst *RNDE(const fs_reg &dst, const fs_reg &src);
fs_inst *RNDZ(const fs_reg &dst, const fs_reg &src);
fs_inst *FRC(const fs_reg &dst, const fs_reg &src);
fs_inst *ADD(const fs_reg &dst, const fs_reg &src0, const fs_reg &src1);
fs_inst *MUL(const fs_reg &dst, const fs_reg &src0, const fs_reg &src1);
fs_inst *MACH(const fs_reg &dst, const fs_reg &src0, const fs_reg &src1);
fs_inst *MAC(const fs_reg &dst, const fs_reg &src0, const fs_reg &src1);
fs_inst *SHL(const fs_reg &dst, const fs_reg &src0, const fs_reg &src1);
fs_inst *SHR(const fs_reg &dst, const fs_reg &src0, const fs_reg &src1);
fs_inst *ASR(const fs_reg &dst, const fs_reg &src0, const fs_reg &src1);
fs_inst *AND(const fs_reg &dst, const fs_reg &src0, const fs_reg &src1);
fs_inst *OR(const fs_reg &dst, const fs_reg &src0, const fs_reg &src1);
fs_inst *XOR(const fs_reg &dst, const fs_reg &src0, const fs_reg &src1);
fs_inst *IF(enum brw_predicate predicate);
fs_inst *IF(const fs_reg &src0, const fs_reg &src1,
enum brw_conditional_mod condition);
fs_inst *CMP(fs_reg dst, fs_reg src0, fs_reg src1,
enum brw_conditional_mod condition);
fs_inst *LRP(const fs_reg &dst, const fs_reg &a, const fs_reg &y,
const fs_reg &x);
fs_inst *BFREV(const fs_reg &dst, const fs_reg &value);
fs_inst *BFE(const fs_reg &dst, const fs_reg &bits, const fs_reg &offset,
const fs_reg &value);
fs_inst *BFI1(const fs_reg &dst, const fs_reg &bits, const fs_reg &offset);
fs_inst *BFI2(const fs_reg &dst, const fs_reg &bfi1_dst,
const fs_reg &insert, const fs_reg &base);
fs_inst *FBH(const fs_reg &dst, const fs_reg &value);
fs_inst *FBL(const fs_reg &dst, const fs_reg &value);
fs_inst *CBIT(const fs_reg &dst, const fs_reg &value);
fs_inst *MAD(const fs_reg &dst, const fs_reg &c, const fs_reg &b,
const fs_reg &a);
fs_inst *ADDC(const fs_reg &dst, const fs_reg &src0, const fs_reg &src1);
fs_inst *SUBB(const fs_reg &dst, const fs_reg &src0, const fs_reg &src1);
fs_inst *SEL(const fs_reg &dst, const fs_reg &src0, const fs_reg &src1);
int type_size(const struct glsl_type *type);
fs_inst *get_instruction_generating_reg(fs_inst *start,
fs_inst *end,
const fs_reg &reg);
fs_inst *LOAD_PAYLOAD(const fs_reg &dst, fs_reg *src, int sources,
int header_size);
void VARYING_PULL_CONSTANT_LOAD(const brw::fs_builder &bld,
const fs_reg &dst,
const fs_reg &surf_index,
@ -284,14 +225,7 @@ public:
fs_reg emit_mcs_fetch(fs_reg coordinate, int components, fs_reg sampler);
void emit_gen6_gather_wa(uint8_t wa, fs_reg dst);
void resolve_source_modifiers(fs_reg *src);
fs_reg fix_math_operand(fs_reg src);
fs_inst *emit_math(enum opcode op, fs_reg dst, fs_reg src0);
fs_inst *emit_math(enum opcode op, fs_reg dst, fs_reg src0, fs_reg src1);
fs_inst *emit_lrp(const fs_reg &dst, const fs_reg &x, const fs_reg &y,
const fs_reg &a);
void emit_discard_jump();
/** Copy any live channel from \p src to the first channel of \p dst. */
void emit_uniformize(const fs_reg &dst, const fs_reg &src);
bool try_replace_with_sel();
bool opt_peephole_sel();
bool opt_peephole_predicated_break();
@ -354,8 +288,6 @@ public:
void emit_untyped_surface_read(unsigned surf_index, fs_reg dst,
fs_reg offset);
void resolve_ud_negate(fs_reg *reg);
fs_reg get_timestamp(const brw::fs_builder &bld);
struct brw_reg interp_reg(int location, int channel);
@ -417,11 +349,6 @@ public:
fs_reg nir_outputs;
fs_reg *nir_system_values;
/** @{ debug annotation info */
const char *current_annotation;
const void *base_ir;
/** @} */
bool failed;
char *fail_msg;
bool simd16_unsupported;

View file

@ -444,7 +444,6 @@ void
fs_visitor::nir_emit_instr(nir_instr *instr)
{
const fs_builder abld = bld.annotate(NULL, instr);
this->base_ir = instr;
switch (instr->type) {
case nir_instr_type_alu:
@ -472,8 +471,6 @@ fs_visitor::nir_emit_instr(nir_instr *instr)
default:
unreachable("unknown instruction type");
}
this->base_ir = NULL;
}
static brw_reg_type

View file

@ -77,44 +77,6 @@ fs_visitor::emit_vs_system_value(int location)
return reg;
}
fs_inst *
fs_visitor::emit_lrp(const fs_reg &dst, const fs_reg &x, const fs_reg &y,
const fs_reg &a)
{
if (devinfo->gen < 6) {
/* We can't use the LRP instruction. Emit x*(1-a) + y*a. */
fs_reg y_times_a = vgrf(glsl_type::float_type);
fs_reg one_minus_a = vgrf(glsl_type::float_type);
fs_reg x_times_one_minus_a = vgrf(glsl_type::float_type);
emit(MUL(y_times_a, y, a));
fs_reg negative_a = a;
negative_a.negate = !a.negate;
emit(ADD(one_minus_a, negative_a, fs_reg(1.0f)));
emit(MUL(x_times_one_minus_a, x, one_minus_a));
return emit(ADD(dst, x_times_one_minus_a, y_times_a));
} else {
/* The LRP instruction actually does op1 * op0 + op2 * (1 - op0), so
* we need to reorder the operands.
*/
return emit(LRP(dst, a, y, x));
}
}
void
fs_visitor::emit_uniformize(const fs_reg &dst, const fs_reg &src)
{
const fs_reg chan_index = vgrf(glsl_type::uint_type);
emit(SHADER_OPCODE_FIND_LIVE_CHANNEL, component(chan_index, 0))
->force_writemask_all = true;
emit(SHADER_OPCODE_BROADCAST, component(dst, 0),
src, component(chan_index, 0))
->force_writemask_all = true;
}
fs_inst *
fs_visitor::emit_texture_gen4(ir_texture_opcode op, fs_reg dst,
fs_reg coordinate, int coord_components,
@ -1264,29 +1226,6 @@ fs_visitor::emit_untyped_surface_read(unsigned surf_index, fs_reg dst,
inst->mlen = mlen;
}
fs_inst *
fs_visitor::emit(fs_inst *inst)
{
if (dispatch_width == 16 && inst->exec_size == 8)
inst->force_uncompressed = true;
inst->annotation = this->current_annotation;
inst->ir = this->base_ir;
this->instructions.push_tail(inst);
return inst;
}
void
fs_visitor::emit(exec_list list)
{
foreach_in_list_safe(fs_inst, inst, &list) {
inst->exec_node::remove();
emit(inst);
}
}
/** Emits a dummy fragment shader consisting of magenta for bringup purposes. */
void
fs_visitor::emit_dummy_fs()
@ -1992,18 +1931,6 @@ fs_visitor::emit_urb_writes()
}
}
void
fs_visitor::resolve_ud_negate(fs_reg *reg)
{
if (reg->type != BRW_REGISTER_TYPE_UD ||
!reg->negate)
return;
fs_reg temp = vgrf(glsl_type::uint_type);
emit(MOV(temp, *reg));
*reg = temp;
}
void
fs_visitor::emit_cs_terminate()
{
@ -2034,9 +1961,6 @@ fs_visitor::fs_visitor(struct brw_context *brw,
struct gl_program *prog,
unsigned dispatch_width)
: backend_shader(brw, shader_prog, prog, prog_data, stage),
reg_null_f(retype(brw_null_vec(dispatch_width), BRW_REGISTER_TYPE_F)),
reg_null_d(retype(brw_null_vec(dispatch_width), BRW_REGISTER_TYPE_D)),
reg_null_ud(retype(brw_null_vec(dispatch_width), BRW_REGISTER_TYPE_UD)),
key(key), prog_data(prog_data),
dispatch_width(dispatch_width), promoted_constants(0),
bld(fs_builder(this, dispatch_width).at_end())
@ -2073,9 +1997,6 @@ fs_visitor::fs_visitor(struct brw_context *brw,
this->first_non_payload_grf = 0;
this->max_grf = devinfo->gen >= 7 ? GEN7_MRF_HACK_START : BRW_MAX_GRF;
this->current_annotation = NULL;
this->base_ir = NULL;
this->virtual_grf_start = NULL;
this->virtual_grf_end = NULL;
this->live_intervals = NULL;