nv50/ir: Properly fold constants in SPLIT operation
authorPierre Moreau <pierre.morrow@free.fr>
Mon, 12 Jun 2017 20:53:52 +0000 (22:53 +0200)
committerSamuel Pitoiset <samuel.pitoiset@gmail.com>
Sun, 25 Jun 2017 13:23:46 +0000 (15:23 +0200)
Fixes: b7d9677d ("nv50/ir: constant fold OP_SPLIT")
Cc: mesa-stable@lists.freedesktop.org
Signed-off-by: Pierre Moreau <pierre.morrow@free.fr>
Reviewed-by: Ilia Mirkin <imirkin@alum.mit.edu>
src/gallium/drivers/nouveau/codegen/nv50_ir_peephole.cpp

index 4c92a1efb51172855e670c6081f5406f1064cf81..5dac2f64f0a1e3547fffa39a4a9a68d837d3d9ca 100644 (file)
@@ -938,8 +938,9 @@ ConstantFolding::opnd(Instruction *i, ImmediateValue &imm0, int s)
       bld.setPosition(i, false);
 
       uint8_t size = i->getDef(0)->reg.size;
       bld.setPosition(i, false);
 
       uint8_t size = i->getDef(0)->reg.size;
-      uint32_t mask = (1ULL << size) - 1;
-      assert(size <= 32);
+      uint8_t bitsize = size * 8;
+      uint32_t mask = (1ULL << bitsize) - 1;
+      assert(bitsize <= 32);
 
       uint64_t val = imm0.reg.data.u64;
       for (int8_t d = 0; i->defExists(d); ++d) {
 
       uint64_t val = imm0.reg.data.u64;
       for (int8_t d = 0; i->defExists(d); ++d) {
@@ -947,7 +948,7 @@ ConstantFolding::opnd(Instruction *i, ImmediateValue &imm0, int s)
          assert(def->reg.size == size);
 
          newi = bld.mkMov(def, bld.mkImm((uint32_t)(val & mask)), TYPE_U32);
          assert(def->reg.size == size);
 
          newi = bld.mkMov(def, bld.mkImm((uint32_t)(val & mask)), TYPE_U32);
-         val >>= size;
+         val >>= bitsize;
       }
       delete_Instruction(prog, i);
       break;
       }
       delete_Instruction(prog, i);
       break;