i965: Extract can_change_source_types() functions.
authorMatt Turner <mattst88@gmail.com>
Wed, 14 Oct 2015 09:12:09 +0000 (02:12 -0700)
committerMatt Turner <mattst88@gmail.com>
Mon, 19 Oct 2015 17:19:32 +0000 (10:19 -0700)
Make them members of fs_inst/vec4_instruction for use elsewhere.

Also fix the fs version to check that dst.type == src[1].type and for
!saturate.

Reviewed-by: Jason Ekstrand <jason.ekstrand@intel.com>
src/mesa/drivers/dri/i965/brw_fs.cpp
src/mesa/drivers/dri/i965/brw_fs_copy_propagation.cpp
src/mesa/drivers/dri/i965/brw_ir_fs.h
src/mesa/drivers/dri/i965/brw_ir_vec4.h
src/mesa/drivers/dri/i965/brw_vec4.cpp
src/mesa/drivers/dri/i965/brw_vec4_copy_propagation.cpp

index 3c767ce58f017c9c832df07e2ec2634ab3c8f2a2..49323eb790dc9bf2799bb18f627156fafeaa05f1 100644 (file)
@@ -337,6 +337,18 @@ fs_inst::can_do_source_mods(const struct brw_device_info *devinfo)
    return true;
 }
 
+bool
+fs_inst::can_change_types() const
+{
+   return dst.type == src[0].type &&
+          !src[0].abs && !src[0].negate && !saturate &&
+          (opcode == BRW_OPCODE_MOV ||
+           (opcode == BRW_OPCODE_SEL &&
+            dst.type == src[1].type &&
+            predicate != BRW_PREDICATE_NONE &&
+            !src[1].abs && !src[1].negate));
+}
+
 bool
 fs_inst::has_side_effects() const
 {
index 230b0caec47ff6f3b631d6bceb1ab6d18b8be5f4..5589716239afa3418b56f4771f31a49fcf819397 100644 (file)
@@ -275,17 +275,6 @@ is_logic_op(enum opcode opcode)
            opcode == BRW_OPCODE_NOT);
 }
 
-static bool
-can_change_source_types(fs_inst *inst)
-{
-   return !inst->src[0].abs && !inst->src[0].negate &&
-          inst->dst.type == inst->src[0].type &&
-          (inst->opcode == BRW_OPCODE_MOV ||
-           (inst->opcode == BRW_OPCODE_SEL &&
-            inst->predicate != BRW_PREDICATE_NONE &&
-            !inst->src[1].abs && !inst->src[1].negate));
-}
-
 bool
 fs_visitor::try_copy_propagate(fs_inst *inst, int arg, acp_entry *entry)
 {
@@ -368,7 +357,7 @@ fs_visitor::try_copy_propagate(fs_inst *inst, int arg, acp_entry *entry)
 
    if (has_source_modifiers &&
        entry->dst.type != inst->src[arg].type &&
-       !can_change_source_types(inst))
+       !inst->can_change_types())
       return false;
 
    if (devinfo->gen >= 8 && (entry->src.negate || entry->src.abs) &&
@@ -438,7 +427,7 @@ fs_visitor::try_copy_propagate(fs_inst *inst, int arg, acp_entry *entry)
           * type.  If we got here, then we can just change the source and
           * destination types of the instruction and keep going.
           */
-         assert(can_change_source_types(inst));
+         assert(inst->can_change_types());
          for (int i = 0; i < inst->sources; i++) {
             inst->src[i].type = entry->dst.type;
          }
index 97c6f8b25004d2fa47e1e1333803b4c2c27af2fe..7726e4b78a0b995b89e496395cf2ae4241a59aef 100644 (file)
@@ -204,6 +204,7 @@ public:
    unsigned components_read(unsigned i) const;
    int regs_read(int arg) const;
    bool can_do_source_mods(const struct brw_device_info *devinfo);
+   bool can_change_types() const;
    bool has_side_effects() const;
 
    bool reads_flag() const;
index 96dd633e117c405fd65a25a4a3bfdb74405c5b83..1b57b65db27613275e4390f9ca1cf78155175fc8 100644 (file)
@@ -179,6 +179,7 @@ public:
                       int swizzle, int swizzle_mask);
    void reswizzle(int dst_writemask, int swizzle);
    bool can_do_source_mods(const struct brw_device_info *devinfo);
+   bool can_change_types() const;
 
    bool reads_flag()
    {
index 00e2d63804e3a94696f2ece9f9eaaee6e0b1c763..befc92445d37f19af3be5f6f4e51c7db523a4658 100644 (file)
@@ -280,6 +280,18 @@ vec4_instruction::can_do_source_mods(const struct brw_device_info *devinfo)
    return true;
 }
 
+bool
+vec4_instruction::can_change_types() const
+{
+   return dst.type == src[0].type &&
+          !src[0].abs && !src[0].negate && !saturate &&
+          (opcode == BRW_OPCODE_MOV ||
+           (opcode == BRW_OPCODE_SEL &&
+            dst.type == src[1].type &&
+            predicate != BRW_PREDICATE_NONE &&
+            !src[1].abs && !src[1].negate));
+}
+
 /**
  * Returns how many MRFs an opcode will write over.
  *
index 610caef7dcee14bf590896454d8a64248a511c9d..db99ecba35a61d7fed43751cd36c154aa003cce3 100644 (file)
@@ -255,18 +255,6 @@ try_constant_propagate(const struct brw_device_info *devinfo,
    return false;
 }
 
-static bool
-can_change_source_types(vec4_instruction *inst)
-{
-   return inst->dst.type == inst->src[0].type &&
-      !inst->src[0].abs && !inst->src[0].negate && !inst->saturate &&
-      (inst->opcode == BRW_OPCODE_MOV ||
-       (inst->opcode == BRW_OPCODE_SEL &&
-        inst->dst.type == inst->src[1].type &&
-        inst->predicate != BRW_PREDICATE_NONE &&
-        !inst->src[1].abs && !inst->src[1].negate));
-}
-
 static bool
 try_copy_propagate(const struct brw_device_info *devinfo,
                    vec4_instruction *inst,
@@ -325,7 +313,7 @@ try_copy_propagate(const struct brw_device_info *devinfo,
 
    if (has_source_modifiers &&
        value.type != inst->src[arg].type &&
-       !can_change_source_types(inst))
+       !inst->can_change_types())
       return false;
 
    if (has_source_modifiers &&
@@ -394,7 +382,7 @@ try_copy_propagate(const struct brw_device_info *devinfo,
    value.swizzle = composed_swizzle;
    if (has_source_modifiers &&
        value.type != inst->src[arg].type) {
-      assert(can_change_source_types(inst));
+      assert(inst->can_change_types());
       for (int i = 0; i < 3; i++) {
          inst->src[i].type = value.type;
       }