diff options
author | Christoph Bumiller <[email protected]> | 2012-01-07 00:21:57 +0100 |
---|---|---|
committer | Christoph Bumiller <[email protected]> | 2012-01-10 00:36:59 +0100 |
commit | 7c6ca0367bb6e9141e00fa19faabc8441dc05816 (patch) | |
tree | bc08baf6fd2a90682d14e515404afecb87001f31 /src/gallium | |
parent | 405bd00f3c98cb78d1dda1f3bf5d74155b18cd57 (diff) |
nvc0/ir/emit: fix modifiers of f32 add with long immediate
Diffstat (limited to 'src/gallium')
-rw-r--r-- | src/gallium/drivers/nvc0/codegen/nv50_ir_emit_nvc0.cpp | 16 |
1 files changed, 11 insertions, 5 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 ecff42106da..da2c885eb87 100644 --- a/src/gallium/drivers/nvc0/codegen/nv50_ir_emit_nvc0.cpp +++ b/src/gallium/drivers/nvc0/codegen/nv50_ir_emit_nvc0.cpp @@ -511,20 +511,26 @@ CodeEmitterNVC0::emitFADD(const Instruction *i) { if (i->encSize == 8) { if (isLIMM(i->src[1], TYPE_F32)) { + assert(!i->saturate); emitForm_A(i, HEX64(28000000, 00000002)); - assert(!i->src[1].mod.neg() && !i->src[1].mod.abs() && !i->saturate); + code[0] |= i->src[0].mod.abs() << 7; + code[0] |= i->src[0].mod.neg() << 9; + + if (i->src[1].mod.abs()) + code[1] &= 0xfdffffff; + if ((i->op == OP_SUB) != static_cast<bool>(i->src[1].mod.neg())) + code[1] ^= 0x02000000; } else { emitForm_A(i, HEX64(50000000, 00000000)); roundMode_A(i); if (i->saturate) code[1] |= 1 << 17; - } - emitNegAbs12(i); - - if (i->op == OP_SUB) code[0] ^= 1 << 8; + emitNegAbs12(i); + if (i->op == OP_SUB) code[0] ^= 1 << 8; + } if (i->ftz) code[0] |= 1 << 5; } else { |