i965/fs: Remove extract virtual opcodes.
authorFrancisco Jerez <currojerez@riseup.net>
Thu, 19 May 2016 01:43:54 +0000 (18:43 -0700)
committerFrancisco Jerez <currojerez@riseup.net>
Sat, 28 May 2016 06:22:09 +0000 (23:22 -0700)
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>
src/mesa/drivers/dri/i965/brw_defines.h
src/mesa/drivers/dri/i965/brw_fs_cse.cpp
src/mesa/drivers/dri/i965/brw_fs_generator.cpp
src/mesa/drivers/dri/i965/brw_fs_nir.cpp
src/mesa/drivers/dri/i965/brw_shader.cpp

index e02c23075933c21ba0400f7cdfe140aee176e130..91194713ef86f4725950582573ac3c4d1102104a 100644 (file)
@@ -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,
index 99121c503f0524ff971c9a00dc55582c3c4f59d4..9c39106bbc2cb680d656cd0bf7d51b5140aeabdb 100644 (file)
@@ -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;
index a95f74842557f8c8febe7618956d9384283348eb..6919a9c023fd8e74e6a5583fb9707a32f3d447a0 100644 (file)
@@ -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;
index 72b149c270ba7ddfd9b1137eea9aa74fd1e95dbb..b4aeea86f9b1c50000e814d58edef9994cba2edb 100644 (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);
    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;
    }
 
index 2259bc9645a659ac8657124fa37c0ae798796645..a9051a89aa6590c10c947a561189a6bda0d08588 100644 (file)
@@ -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: