Module: Mesa
Branch: master
Commit: 3019afdbd862b86eb26d222d3a1d743faf3693be
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=3019afdbd862b86eb26d222d3a1d743faf3693be

Author: Christoph Bumiller <[email protected]>
Date:   Mon Dec 28 23:17:26 2009 +0100

nv50: don't negate immediates in set_immd

This negation would only be triggered in situations
where it's incorrect.
The caller of set_immd should negate the immediate value
in the instruction itself if desired, and will also know
if it's a float or an int.

ADD TEMP[0], CONST[0], -IMMD[0] would load the immediate
into extra TEMP, negated, and set the negate flag in add
as well - double negation.

---

 src/gallium/drivers/nv50/nv50_program.c |   17 +++++------------
 1 files changed, 5 insertions(+), 12 deletions(-)

diff --git a/src/gallium/drivers/nv50/nv50_program.c 
b/src/gallium/drivers/nv50/nv50_program.c
index b9910b4..8895a92 100644
--- a/src/gallium/drivers/nv50/nv50_program.c
+++ b/src/gallium/drivers/nv50/nv50_program.c
@@ -499,15 +499,6 @@ set_dst(struct nv50_pc *pc, struct nv50_reg *dst, struct 
nv50_program_exec *e)
 static INLINE void
 set_immd(struct nv50_pc *pc, struct nv50_reg *imm, struct nv50_program_exec *e)
 {
-       union {
-               float f;
-               uint32_t ui;
-       } u;
-       u.ui = pc->immd_buf[imm->hw];
-
-       u.f = (imm->mod & NV50_MOD_ABS) ? fabsf(u.f) : u.f;
-       u.f = (imm->mod & NV50_MOD_NEG) ? -u.f : u.f;
-
        set_long(pc, e);
        /* XXX: can't be predicated - bits overlap; cases where both
         * are required should be avoided by using pc->allow32 */
@@ -515,8 +506,8 @@ set_immd(struct nv50_pc *pc, struct nv50_reg *imm, struct 
nv50_program_exec *e)
        set_pred_wr(pc, 0, 0, e);
 
        e->inst[1] |= 0x00000002 | 0x00000001;
-       e->inst[0] |= (u.ui & 0x3f) << 16;
-       e->inst[1] |= (u.ui >> 6) << 2;
+       e->inst[0] |= (pc->immd_buf[imm->hw] & 0x3f) << 16;
+       e->inst[1] |= (pc->immd_buf[imm->hw] >> 6) << 2;
 }
 
 static INLINE void
@@ -888,7 +879,7 @@ emit_mul(struct nv50_pc *pc, struct nv50_reg *dst, struct 
nv50_reg *src0,
        set_dst(pc, dst, e);
        set_src_0(pc, src0, e);
        if (src1->type == P_IMMD && !is_long(e)) {
-               if (src0->mod & NV50_MOD_NEG)
+               if (src0->mod ^ src1->mod)
                        e->inst[0] |= 0x00008000;
                set_immd(pc, src1, e);
        } else {
@@ -999,6 +990,8 @@ emit_bitop2(struct nv50_pc *pc, struct nv50_reg *dst, 
struct nv50_reg *src0,
            op != TGSI_OPCODE_XOR)
                assert(!"invalid bit op");
 
+       assert(!(src0->mod | src1->mod));
+
        if (src1->type == P_IMMD && src0->type == P_TEMP && pc->allow32) {
                set_immd(pc, src1, e);
                if (op == TGSI_OPCODE_OR)

_______________________________________________
mesa-commit mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/mesa-commit

Reply via email to