nv50: cannot kill branch if immediate is used
authorChristoph Bumiller <e0425955@student.tuwien.ac.at>
Wed, 30 Dec 2009 20:25:13 +0000 (21:25 +0100)
committerChristoph Bumiller <e0425955@student.tuwien.ac.at>
Thu, 31 Dec 2009 13:34:42 +0000 (14:34 +0100)
The immediate's bits eat the condition bits.

src/gallium/drivers/nv50/nv50_program.c

index 7d1b5fd..cc15f45 100644 (file)
@@ -453,6 +453,7 @@ static INLINE void
 set_pred(struct nv50_pc *pc, unsigned pred, unsigned idx,
         struct nv50_program_exec *e)
 {
+       assert(!is_immd(e));
        set_long(pc, e);
        e->inst[1] &= ~((0x1f << 7) | (0x3 << 12));
        e->inst[1] |= (pred << 7) | (idx << 12);
@@ -2118,6 +2119,8 @@ nv50_kill_branch(struct nv50_pc *pc)
 
        if (pc->if_insn[lvl]->next != pc->p->exec_tail)
                return FALSE;
+       if (is_immd(pc->p->exec_tail))
+               return FALSE;
 
        /* if ccode == 'true', the BRA is from an ELSE and the predicate
         * reg may no longer be valid, since we currently always use $p0