summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristoph Bumiller <[email protected]>2011-10-17 23:02:16 +0200
committerChristoph Bumiller <[email protected]>2011-10-21 23:00:39 +0200
commit0e4e0ca6df52ddecd1bb2fe9a427549d1a82b9f9 (patch)
tree1fe3b90d51d5e39a3ddfe76e7b45ef17461a726b
parent974102c7c27e45b0fb661e9374b2c51c9108922a (diff)
nv50/ir: add wrap mode for shift operations
D3D1x specifies that only the low 5 bit of the shift are used.
-rw-r--r--src/gallium/drivers/nv50/codegen/nv50_ir.h1
-rw-r--r--src/gallium/drivers/nv50/codegen/nv50_ir_print.cpp2
-rw-r--r--src/gallium/drivers/nvc0/codegen/nv50_ir_emit_nvc0.cpp4
3 files changed, 5 insertions, 2 deletions
diff --git a/src/gallium/drivers/nv50/codegen/nv50_ir.h b/src/gallium/drivers/nv50/codegen/nv50_ir.h
index e92b152a83b..88306087a98 100644
--- a/src/gallium/drivers/nv50/codegen/nv50_ir.h
+++ b/src/gallium/drivers/nv50/codegen/nv50_ir.h
@@ -136,6 +136,7 @@ enum operation
#define NV50_IR_SUBOP_LDC_IL 1
#define NV50_IR_SUBOP_LDC_IS 2
#define NV50_IR_SUBOP_LDC_ISL 3
+#define NV50_IR_SUBOP_SHIFT_WRAP 1
enum DataType
{
diff --git a/src/gallium/drivers/nv50/codegen/nv50_ir_print.cpp b/src/gallium/drivers/nv50/codegen/nv50_ir_print.cpp
index a730d2c06ab..4040a4d9c0f 100644
--- a/src/gallium/drivers/nv50/codegen/nv50_ir_print.cpp
+++ b/src/gallium/drivers/nv50/codegen/nv50_ir_print.cpp
@@ -437,6 +437,8 @@ void Instruction::print() const
PRINT(" %sBB:%i", colour[TXT_BRA], asFlow()->target.bb->getId());
} else {
PRINT("%s ", operationStr[op]);
+ if (subOp)
+ PRINT("(SUBOP:%u) ", subOp);
if (perPatch)
PRINT("patch ");
if (asTex())
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 6bcbd625600..13f5d2f7c72 100644
--- a/src/gallium/drivers/nvc0/codegen/nv50_ir_emit_nvc0.cpp
+++ b/src/gallium/drivers/nvc0/codegen/nv50_ir_emit_nvc0.cpp
@@ -665,8 +665,8 @@ CodeEmitterNVC0::emitShift(const Instruction *i)
emitForm_A(i, HEX64(60000000, 00000003));
}
- if (0)
- code[0] |= 1 << 9; // clamp shift amount
+ if (i->subOp == NV50_IR_SUBOP_SHIFT_WRAP)
+ code[0] |= 1 << 9;
}
void