intel: Add a new "common" library for more code sharing
[mesa.git] / src / mesa / drivers / dri / i965 / brw_fs_combine_constants.cpp
index 994c699bb5a5d4b6d3bd83b970d6292259073cab..5bd5343b8b4436adf8a20569d92c0466387c4d4b 100644 (file)
@@ -147,8 +147,6 @@ struct table {
 static struct imm *
 find_imm(struct table *table, float val)
 {
-   assert(signbit(val) == 0);
-
    for (int i = 0; i < table->len; i++) {
       if (table->imm[i].val == val) {
          return &table->imm[i];
@@ -220,7 +218,8 @@ fs_visitor::opt_combine_constants()
              inst->src[i].type != BRW_REGISTER_TYPE_F)
             continue;
 
-         float val = fabsf(inst->src[i].f);
+         float val = !inst->can_do_source_mods(devinfo) ? inst->src[i].f :
+                     fabs(inst->src[i].f);
          struct imm *imm = find_imm(&table, val);
 
          if (imm) {
@@ -268,7 +267,7 @@ fs_visitor::opt_combine_constants()
       qsort(table.imm, table.len, sizeof(struct imm), compare);
 
    /* Insert MOVs to load the constant values into GRFs. */
-   fs_reg reg(VGRF, alloc.allocate(dispatch_width / 8));
+   fs_reg reg(VGRF, alloc.allocate(1));
    reg.stride = 0;
    for (int i = 0; i < table.len; i++) {
       struct imm *imm = &table.imm[i];
@@ -284,8 +283,8 @@ fs_visitor::opt_combine_constants()
       imm->subreg_offset = reg.subreg_offset;
 
       reg.subreg_offset += sizeof(float);
-      if ((unsigned)reg.subreg_offset == dispatch_width * sizeof(float)) {
-         reg.nr = alloc.allocate(dispatch_width / 8);
+      if ((unsigned)reg.subreg_offset == 8 * sizeof(float)) {
+         reg.nr = alloc.allocate(1);
          reg.subreg_offset = 0;
       }
    }
@@ -301,7 +300,7 @@ fs_visitor::opt_combine_constants()
          reg->stride = 0;
          reg->negate = signbit(reg->f) != signbit(table.imm[i].val);
          assert((isnan(reg->f) && isnan(table.imm[i].val)) ||
-                fabsf(reg->f) == table.imm[i].val);
+                fabsf(reg->f) == fabs(table.imm[i].val));
       }
    }