nv50/ir: fix s32 x s32 -> high s32 multiply logic
authorIlia Mirkin <imirkin@alum.mit.edu>
Thu, 15 May 2014 03:30:16 +0000 (23:30 -0400)
committerIlia Mirkin <imirkin@alum.mit.edu>
Wed, 21 May 2014 13:31:16 +0000 (09:31 -0400)
commitd3a5cf052c38087b395871b5b46776e2a7d4a7d7
treea2b8dcbbb0b539ec786c980fffd4db19bfef4ffb
parent1472584397f7b5ef70dfdffda0aab4a0a38a4db0
nv50/ir: fix s32 x s32 -> high s32 multiply logic

Retrieving the high 32 bits of a signed multiply is rather annoying. It
appears that the simplest way to do this is to compute the absolute
value of the arguments, and perform a u32 x u32 -> u64 operation. If the
arguments' signs differ, then negate the result. Since there is no u64
support in the cvt instruction, we have the perform the 2's complement
negation "by hand".

This logic can come into use by the IMUL_HI instruction (very unlikely
to be seen), as well as from constant folding of division by a constant.
Fixes dolphin's divisions by 255.

Signed-off-by: Ilia Mirkin <imirkin@alum.mit.edu>
Cc: "10.1 10.2" <mesa-stable@lists.freedesktop.org>
Reviewed-by: Ben Skeggs <bskeggs@redhat.com>
src/gallium/drivers/nouveau/codegen/nv50_ir_lowering_nv50.cpp
src/gallium/drivers/nouveau/codegen/nv50_ir_target_nv50.cpp