summaryrefslogtreecommitdiffstats
path: root/src/gallium
diff options
context:
space:
mode:
Diffstat (limited to 'src/gallium')
-rw-r--r--src/gallium/drivers/nv50/codegen/nv50_ir.h3
-rw-r--r--src/gallium/drivers/nv50/codegen/nv50_ir_build_util.cpp3
-rw-r--r--src/gallium/drivers/nv50/codegen/nv50_ir_build_util.h6
-rw-r--r--src/gallium/drivers/nv50/codegen/nv50_ir_inlines.h20
4 files changed, 29 insertions, 3 deletions
diff --git a/src/gallium/drivers/nv50/codegen/nv50_ir.h b/src/gallium/drivers/nv50/codegen/nv50_ir.h
index 04ea5e6d5a9..eb9f0ff7e3b 100644
--- a/src/gallium/drivers/nv50/codegen/nv50_ir.h
+++ b/src/gallium/drivers/nv50/codegen/nv50_ir.h
@@ -637,6 +637,9 @@ public:
inline Value *getPredicate() const;
bool writesPredicate() const;
+ inline void setFlagsSrc(int s, Value *);
+ inline void setFlagsDef(int d, Value *);
+
unsigned int defCount(unsigned int mask) const;
unsigned int srcCount(unsigned int mask) const;
diff --git a/src/gallium/drivers/nv50/codegen/nv50_ir_build_util.cpp b/src/gallium/drivers/nv50/codegen/nv50_ir_build_util.cpp
index 53a73b457f4..bdde9eaa904 100644
--- a/src/gallium/drivers/nv50/codegen/nv50_ir_build_util.cpp
+++ b/src/gallium/drivers/nv50/codegen/nv50_ir_build_util.cpp
@@ -221,6 +221,9 @@ BuildUtil::mkCmp(operation op, CondCode cc, DataType ty, Value *dst,
if (src2)
insn->setSrc(2, src2);
+ if (dst->reg.file == FILE_FLAGS)
+ insn->flagsDef = 0;
+
insert(insn);
return insn;
}
diff --git a/src/gallium/drivers/nv50/codegen/nv50_ir_build_util.h b/src/gallium/drivers/nv50/codegen/nv50_ir_build_util.h
index 0bb853a340b..f815cf06759 100644
--- a/src/gallium/drivers/nv50/codegen/nv50_ir_build_util.h
+++ b/src/gallium/drivers/nv50/codegen/nv50_ir_build_util.h
@@ -44,7 +44,7 @@ public:
inline void insert(Instruction *);
inline void remove(Instruction *i) { assert(i->bb == bb); bb->remove(i); }
- inline LValue *getScratch(int size = 4);
+ inline LValue *getScratch(int size = 4, DataFile = FILE_GPR);
inline LValue *getSSA(int size = 4); // scratch value for a single assignment
inline Instruction *mkOp(operation, DataType, Value *);
@@ -186,9 +186,9 @@ BuildUtil::setPosition(Instruction *i, bool after)
}
LValue *
-BuildUtil::getScratch(int size)
+BuildUtil::getScratch(int size, DataFile f)
{
- LValue *lval = new_LValue(func, FILE_GPR);
+ LValue *lval = new_LValue(func, f);
if (size != 4)
lval->reg.size = size;
return lval;
diff --git a/src/gallium/drivers/nv50/codegen/nv50_ir_inlines.h b/src/gallium/drivers/nv50/codegen/nv50_ir_inlines.h
index 0352cafb1ca..6d0848e6e07 100644
--- a/src/gallium/drivers/nv50/codegen/nv50_ir_inlines.h
+++ b/src/gallium/drivers/nv50/codegen/nv50_ir_inlines.h
@@ -215,6 +215,26 @@ Value *Instruction::getPredicate() const
return (predSrc >= 0) ? getSrc(predSrc) : NULL;
}
+void Instruction::setFlagsDef(int d, Value *val)
+{
+ if (val) {
+ if (flagsDef < 0)
+ flagsDef = d;
+ setDef(flagsDef, val);
+ } else {
+ if (flagsDef >= 0) {
+ setDef(flagsDef, NULL);
+ flagsDef = -1;
+ }
+ }
+}
+
+void Instruction::setFlagsSrc(int s, Value *val)
+{
+ flagsSrc = s;
+ setSrc(flagsSrc, val);
+}
+
Value *TexInstruction::getIndirectR() const
{
return tex.rIndirectSrc >= 0 ? getSrc(tex.rIndirectSrc) : NULL;