From 29ce110be6d0d4e4df51be635810f528f7dd7f40 Mon Sep 17 00:00:00 2001 From: Francisco Jerez Date: Wed, 18 May 2016 18:43:54 -0700 Subject: [PATCH] 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 --- src/mesa/drivers/dri/i965/brw_defines.h | 12 ---------- src/mesa/drivers/dri/i965/brw_fs_cse.cpp | 2 -- .../drivers/dri/i965/brw_fs_generator.cpp | 22 ------------------- src/mesa/drivers/dri/i965/brw_fs_nir.cpp | 22 ++++++++----------- src/mesa/drivers/dri/i965/brw_shader.cpp | 4 ---- 5 files changed, 9 insertions(+), 53 deletions(-) diff --git a/src/mesa/drivers/dri/i965/brw_defines.h b/src/mesa/drivers/dri/i965/brw_defines.h index e02c2307593..91194713ef8 100644 --- a/src/mesa/drivers/dri/i965/brw_defines.h +++ b/src/mesa/drivers/dri/i965/brw_defines.h @@ -1086,18 +1086,6 @@ enum opcode { */ 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_PACK_BYTES, VEC4_OPCODE_UNPACK_UNIFORM, diff --git a/src/mesa/drivers/dri/i965/brw_fs_cse.cpp b/src/mesa/drivers/dri/i965/brw_fs_cse.cpp index 99121c503f0..9c39106bbc2 100644 --- a/src/mesa/drivers/dri/i965/brw_fs_cse.cpp +++ b/src/mesa/drivers/dri/i965/brw_fs_cse.cpp @@ -78,8 +78,6 @@ is_expression(const fs_visitor *v, const fs_inst *const inst) case FS_OPCODE_LINTERP: case SHADER_OPCODE_FIND_LIVE_CHANNEL: case SHADER_OPCODE_BROADCAST: - case SHADER_OPCODE_EXTRACT_BYTE: - case SHADER_OPCODE_EXTRACT_WORD: case SHADER_OPCODE_MOV_INDIRECT: case FS_OPCODE_PACK: return true; diff --git a/src/mesa/drivers/dri/i965/brw_fs_generator.cpp b/src/mesa/drivers/dri/i965/brw_fs_generator.cpp index a95f7484255..6919a9c023f 100644 --- a/src/mesa/drivers/dri/i965/brw_fs_generator.cpp +++ b/src/mesa/drivers/dri/i965/brw_fs_generator.cpp @@ -2050,28 +2050,6 @@ fs_generator::generate_code(const cfg_t *cfg, int dispatch_width) brw_broadcast(p, dst, src[0], src[1]); 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: generate_set_sample_id(inst, dst, src[0], src[1]); break; diff --git a/src/mesa/drivers/dri/i965/brw_fs_nir.cpp b/src/mesa/drivers/dri/i965/brw_fs_nir.cpp index 72b149c270b..b4aeea86f9b 100644 --- a/src/mesa/drivers/dri/i965/brw_fs_nir.cpp +++ b/src/mesa/drivers/dri/i965/brw_fs_nir.cpp @@ -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); assert(element != NULL); - enum opcode extract_op; - if (src0->op == nir_op_extract_u16 || src0->op == nir_op_extract_i16) { - assert(element->u32[0] <= 1); - extract_op = SHADER_OPCODE_EXTRACT_WORD; - } else { - assert(element->u32[0] <= 3); - extract_op = SHADER_OPCODE_EXTRACT_BYTE; - } + /* Element type to extract.*/ + const brw_reg_type type = brw_int_type( + src0->op == nir_op_extract_u16 || src0->op == nir_op_extract_i16 ? 2 : 1, + src0->op == nir_op_extract_i16 || src0->op == nir_op_extract_i8); fs_reg op0 = get_nir_src(src0->src[0].src); 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]); 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; } @@ -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_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); assert(byte != NULL); - bld.emit(SHADER_OPCODE_EXTRACT_BYTE, - result, op[0], brw_imm_ud(byte->u32[0])); + bld.MOV(result, subscript(op[0], type, byte->u32[0])); break; } case nir_op_extract_u16: 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); assert(word != NULL); - bld.emit(SHADER_OPCODE_EXTRACT_WORD, - result, op[0], brw_imm_ud(word->u32[0])); + bld.MOV(result, subscript(op[0], type, word->u32[0])); break; } diff --git a/src/mesa/drivers/dri/i965/brw_shader.cpp b/src/mesa/drivers/dri/i965/brw_shader.cpp index 2259bc9645a..a9051a89aa6 100644 --- a/src/mesa/drivers/dri/i965/brw_shader.cpp +++ b/src/mesa/drivers/dri/i965/brw_shader.cpp @@ -309,10 +309,6 @@ brw_instruction_name(const struct brw_device_info *devinfo, enum opcode op) case SHADER_OPCODE_BROADCAST: return "broadcast"; - case SHADER_OPCODE_EXTRACT_BYTE: - return "extract_byte"; - case SHADER_OPCODE_EXTRACT_WORD: - return "extract_word"; case VEC4_OPCODE_MOV_BYTES: return "mov_bytes"; case VEC4_OPCODE_PACK_BYTES: -- 2.30.2