i965/fs: Remove extract virtual opcodes.

These can be easily represented in the IR as a MOV instruction with
strided source so they seem rather redundant.

Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
This commit is contained in:
Francisco Jerez 2016-05-18 18:43:54 -07:00
parent 9dcb8ff6a1
commit 29ce110be6
5 changed files with 9 additions and 53 deletions

View file

@ -1086,18 +1086,6 @@ enum opcode {
*/ */
SHADER_OPCODE_BROADCAST, SHADER_OPCODE_BROADCAST,
/**
* Pick the byte from its first source register given by the index
* specified as second source.
*/
SHADER_OPCODE_EXTRACT_BYTE,
/**
* Pick the word from its first source register given by the index
* specified as second source.
*/
SHADER_OPCODE_EXTRACT_WORD,
VEC4_OPCODE_MOV_BYTES, VEC4_OPCODE_MOV_BYTES,
VEC4_OPCODE_PACK_BYTES, VEC4_OPCODE_PACK_BYTES,
VEC4_OPCODE_UNPACK_UNIFORM, VEC4_OPCODE_UNPACK_UNIFORM,

View file

@ -78,8 +78,6 @@ is_expression(const fs_visitor *v, const fs_inst *const inst)
case FS_OPCODE_LINTERP: case FS_OPCODE_LINTERP:
case SHADER_OPCODE_FIND_LIVE_CHANNEL: case SHADER_OPCODE_FIND_LIVE_CHANNEL:
case SHADER_OPCODE_BROADCAST: case SHADER_OPCODE_BROADCAST:
case SHADER_OPCODE_EXTRACT_BYTE:
case SHADER_OPCODE_EXTRACT_WORD:
case SHADER_OPCODE_MOV_INDIRECT: case SHADER_OPCODE_MOV_INDIRECT:
case FS_OPCODE_PACK: case FS_OPCODE_PACK:
return true; return true;

View file

@ -2050,28 +2050,6 @@ fs_generator::generate_code(const cfg_t *cfg, int dispatch_width)
brw_broadcast(p, dst, src[0], src[1]); brw_broadcast(p, dst, src[0], src[1]);
break; break;
case SHADER_OPCODE_EXTRACT_BYTE: {
assert(src[0].type == BRW_REGISTER_TYPE_D ||
src[0].type == BRW_REGISTER_TYPE_UD);
enum brw_reg_type type =
src[0].type == BRW_REGISTER_TYPE_D ? BRW_REGISTER_TYPE_B
: BRW_REGISTER_TYPE_UB;
brw_MOV(p, dst, spread(suboffset(retype(src[0], type), src[1].ud), 4));
break;
}
case SHADER_OPCODE_EXTRACT_WORD: {
assert(src[0].type == BRW_REGISTER_TYPE_D ||
src[0].type == BRW_REGISTER_TYPE_UD);
enum brw_reg_type type =
src[0].type == BRW_REGISTER_TYPE_D ? BRW_REGISTER_TYPE_W
: BRW_REGISTER_TYPE_UW;
brw_MOV(p, dst, spread(suboffset(retype(src[0], type), src[1].ud), 2));
break;
}
case FS_OPCODE_SET_SAMPLE_ID: case FS_OPCODE_SET_SAMPLE_ID:
generate_set_sample_id(inst, dst, src[0], src[1]); generate_set_sample_id(inst, dst, src[0], src[1]);
break; break;

View file

@ -529,14 +529,10 @@ fs_visitor::optimize_extract_to_float(nir_alu_instr *instr,
nir_const_value *element = nir_src_as_const_value(src0->src[1].src); nir_const_value *element = nir_src_as_const_value(src0->src[1].src);
assert(element != NULL); assert(element != NULL);
enum opcode extract_op; /* Element type to extract.*/
if (src0->op == nir_op_extract_u16 || src0->op == nir_op_extract_i16) { const brw_reg_type type = brw_int_type(
assert(element->u32[0] <= 1); src0->op == nir_op_extract_u16 || src0->op == nir_op_extract_i16 ? 2 : 1,
extract_op = SHADER_OPCODE_EXTRACT_WORD; src0->op == nir_op_extract_i16 || src0->op == nir_op_extract_i8);
} else {
assert(element->u32[0] <= 3);
extract_op = SHADER_OPCODE_EXTRACT_BYTE;
}
fs_reg op0 = get_nir_src(src0->src[0].src); fs_reg op0 = get_nir_src(src0->src[0].src);
op0.type = brw_type_for_nir_type( op0.type = brw_type_for_nir_type(
@ -545,7 +541,7 @@ fs_visitor::optimize_extract_to_float(nir_alu_instr *instr,
op0 = offset(op0, bld, src0->src[0].swizzle[0]); op0 = offset(op0, bld, src0->src[0].swizzle[0]);
set_saturate(instr->dest.saturate, set_saturate(instr->dest.saturate,
bld.emit(extract_op, result, op0, brw_imm_ud(element->u32[0]))); bld.MOV(result, subscript(op0, type, element->u32[0])));
return true; return true;
} }
@ -1378,19 +1374,19 @@ fs_visitor::nir_emit_alu(const fs_builder &bld, nir_alu_instr *instr)
case nir_op_extract_u8: case nir_op_extract_u8:
case nir_op_extract_i8: { case nir_op_extract_i8: {
const brw_reg_type type = brw_int_type(1, instr->op == nir_op_extract_i8);
nir_const_value *byte = nir_src_as_const_value(instr->src[1].src); nir_const_value *byte = nir_src_as_const_value(instr->src[1].src);
assert(byte != NULL); assert(byte != NULL);
bld.emit(SHADER_OPCODE_EXTRACT_BYTE, bld.MOV(result, subscript(op[0], type, byte->u32[0]));
result, op[0], brw_imm_ud(byte->u32[0]));
break; break;
} }
case nir_op_extract_u16: case nir_op_extract_u16:
case nir_op_extract_i16: { case nir_op_extract_i16: {
const brw_reg_type type = brw_int_type(2, instr->op == nir_op_extract_i16);
nir_const_value *word = nir_src_as_const_value(instr->src[1].src); nir_const_value *word = nir_src_as_const_value(instr->src[1].src);
assert(word != NULL); assert(word != NULL);
bld.emit(SHADER_OPCODE_EXTRACT_WORD, bld.MOV(result, subscript(op[0], type, word->u32[0]));
result, op[0], brw_imm_ud(word->u32[0]));
break; break;
} }

View file

@ -309,10 +309,6 @@ brw_instruction_name(const struct brw_device_info *devinfo, enum opcode op)
case SHADER_OPCODE_BROADCAST: case SHADER_OPCODE_BROADCAST:
return "broadcast"; return "broadcast";
case SHADER_OPCODE_EXTRACT_BYTE:
return "extract_byte";
case SHADER_OPCODE_EXTRACT_WORD:
return "extract_word";
case VEC4_OPCODE_MOV_BYTES: case VEC4_OPCODE_MOV_BYTES:
return "mov_bytes"; return "mov_bytes";
case VEC4_OPCODE_PACK_BYTES: case VEC4_OPCODE_PACK_BYTES: