nv50/ir: allow emission of immediates in imul/imad ops
authorIlia Mirkin <imirkin@alum.mit.edu>
Sat, 7 Nov 2015 05:41:05 +0000 (00:41 -0500)
committerIlia Mirkin <imirkin@alum.mit.edu>
Sat, 7 Nov 2015 05:42:15 +0000 (00:42 -0500)
Nothing actually uses this yet (due to complications), but the emission
logic is right.

Signed-off-by: Ilia Mirkin <imirkin@alum.mit.edu>
src/gallium/drivers/nouveau/codegen/nv50_ir_emit_nv50.cpp

index ee115b581b81cf84b9396d714a5d5ff2a41fd5d4..7e0fb532565e8d179f8ce8e2713c02fcbde10e5e 100644 (file)
@@ -1125,7 +1125,10 @@ CodeEmitterNV50::emitIMUL(const Instruction *i)
 
    if (i->encSize == 8) {
       code[1] = (i->sType == TYPE_S16) ? (0x8000 | 0x4000) : 0x0000;
-      emitForm_MAD(i);
+      if (i->src(1).getFile() == FILE_IMMEDIATE)
+         emitForm_IMM(i);
+      else
+         emitForm_MAD(i);
    } else {
       if (i->sType == TYPE_S16)
          code[0] |= 0x8100;
@@ -1199,7 +1202,10 @@ CodeEmitterNV50::emitIMAD(const Instruction *i)
    code[1] |= neg1 << 27;
    code[1] |= neg2 << 26;
 
-   emitForm_MAD(i);
+   if (i->src(1).getFile() == FILE_IMMEDIATE)
+      emitForm_IMM(i);
+   else
+      emitForm_MAD(i);
 
    if (i->flagsSrc >= 0) {
       // add with carry from $cX