diff options
Diffstat (limited to 'src/gallium/drivers/nvc0/codegen')
-rw-r--r-- | src/gallium/drivers/nvc0/codegen/nv50_ir_emit_nvc0.cpp | 16 | ||||
-rw-r--r-- | src/gallium/drivers/nvc0/codegen/nv50_ir_target_nvc0.cpp | 2 |
2 files changed, 17 insertions, 1 deletions
diff --git a/src/gallium/drivers/nvc0/codegen/nv50_ir_emit_nvc0.cpp b/src/gallium/drivers/nvc0/codegen/nv50_ir_emit_nvc0.cpp index 026a6a0ee99..2ca4979dc74 100644 --- a/src/gallium/drivers/nvc0/codegen/nv50_ir_emit_nvc0.cpp +++ b/src/gallium/drivers/nvc0/codegen/nv50_ir_emit_nvc0.cpp @@ -87,6 +87,7 @@ private: void emitUMUL(const Instruction *); void emitFMUL(const Instruction *); void emitIMAD(const Instruction *); + void emitISAD(const Instruction *); void emitFMAD(const Instruction *); void emitNOT(Instruction *); @@ -621,6 +622,18 @@ CodeEmitterNVC0::emitIMAD(const Instruction *i) } void +CodeEmitterNVC0::emitISAD(const Instruction *i) +{ + assert(i->dType == TYPE_S32 || i->dType == TYPE_U32); + assert(i->encSize == 8); + + emitForm_A(i, HEX64(38000000, 00000003)); + + if (i->dType == TYPE_S32) + code[0] |= 1 << 5; +} + +void CodeEmitterNVC0::emitNOT(Instruction *i) { assert(i->encSize == 8); @@ -1608,6 +1621,9 @@ CodeEmitterNVC0::emitInstruction(Instruction *insn) else emitIMAD(insn); break; + case OP_SAD: + emitISAD(insn); + break; case OP_NOT: emitNOT(insn); break; diff --git a/src/gallium/drivers/nvc0/codegen/nv50_ir_target_nvc0.cpp b/src/gallium/drivers/nvc0/codegen/nv50_ir_target_nvc0.cpp index ffa40dd93fc..10c2d09d657 100644 --- a/src/gallium/drivers/nvc0/codegen/nv50_ir_target_nvc0.cpp +++ b/src/gallium/drivers/nvc0/codegen/nv50_ir_target_nvc0.cpp @@ -456,7 +456,7 @@ TargetNVC0::isOpSupported(operation op, DataType ty) const { if ((op == OP_MAD || op == OP_FMA) && (ty != TYPE_F32)) return false; - if (op == OP_SAD && ty != TYPE_S32) + if (op == OP_SAD && ty != TYPE_S32 && ty != TYPE_U32) return false; if (op == OP_POW || op == OP_SQRT || op == OP_DIV || op == OP_MOD) return false; |