diff options
author | Christoph Bumiller <e0425955@student.tuwien.ac.at> | 2012-04-28 17:06:59 +0200 |
---|---|---|
committer | Christoph Bumiller <e0425955@student.tuwien.ac.at> | 2012-04-29 18:03:11 +0200 |
commit | 1f4c154f0253ed8fb448402532cfa670f74e69cd (patch) | |
tree | 10c485cfad921e6d962c2146efc468ff0aec63a8 /src/gallium/drivers/nvc0 | |
parent | d6ab3106cf7475cdaddf788a3e650bdd5833f73c (diff) |
nv50/ir/opt: try to convert ABS(SUB) to SAD
Diffstat (limited to 'src/gallium/drivers/nvc0')
-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 026a6a0ee9..2ca4979dc7 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 ffa40dd93f..10c2d09d65 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; |