[Mesa-dev] [PATCH] nv50/ir: Split 64-bit MAD and MUL operations

Pierre Moreau pierre.morrow at free.fr
Sat Mar 19 21:56:40 UTC 2016


Two 32-bit MAD or MUL operations are generated in place of the original 64-bit
operation. All operands can either be signed or unsigned, but they have to be
integers.

Signed-off-by: Pierre Moreau <pierre.morrow at free.fr>
---
 src/gallium/drivers/nouveau/codegen/nv50_ir_build_util.cpp | 11 ++++++++++-
 1 file changed, 10 insertions(+), 1 deletion(-)

diff --git a/src/gallium/drivers/nouveau/codegen/nv50_ir_build_util.cpp b/src/gallium/drivers/nouveau/codegen/nv50_ir_build_util.cpp
index 84ebfdb..0b37fcf 100644
--- a/src/gallium/drivers/nouveau/codegen/nv50_ir_build_util.cpp
+++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_build_util.cpp
@@ -586,6 +586,12 @@ BuildUtil::split64BitOpPostRA(Function *fn, Instruction *i,
       srcNr = 2;
       break;
    case OP_SELP: srcNr = 3; break;
+   case OP_MAD: /* fallthrough */
+   case OP_MUL:
+      if (!carry || isFloatType(i->dType) || isFloatType(i->sType))
+         return NULL;
+      srcNr = (i->op == OP_MAD) ? 3 : 2;
+      break;
    default:
       // TODO when needed
       return NULL;
@@ -600,6 +606,9 @@ BuildUtil::split64BitOpPostRA(Function *fn, Instruction *i,
 
    hi->getDef(0)->reg.data.id++;
 
+   if (i->op == OP_MAD || i->op == OP_MUL)
+      hi->subOp = NV50_IR_SUBOP_MUL_HIGH;
+
    for (int s = 0; s < srcNr; ++s) {
       if (lo->getSrc(s)->reg.size < 8) {
          if (s == 2)
@@ -629,7 +638,7 @@ BuildUtil::split64BitOpPostRA(Function *fn, Instruction *i,
          }
       }
    }
-   if (srcNr == 2) {
+   if (srcNr >= 2) {
       lo->setFlagsDef(1, carry);
       hi->setFlagsSrc(hi->srcCount(), carry);
    }
-- 
2.7.4



More information about the mesa-dev mailing list