From 5b318ef457b395ebd1a1a0f56f046244fc894f56 Mon Sep 17 00:00:00 2001 From: inglorion Date: Sat, 24 Nov 2012 00:29:40 -0800 Subject: [PATCH] On ARM, don't generate mul with dest equal to first source --- lib/voodoo/generators/arm_gas_generator.rb | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/lib/voodoo/generators/arm_gas_generator.rb b/lib/voodoo/generators/arm_gas_generator.rb index a304322..9b64a4b 100644 --- a/lib/voodoo/generators/arm_gas_generator.rb +++ b/lib/voodoo/generators/arm_gas_generator.rb @@ -421,6 +421,23 @@ module Voodoo emit "lsr #{register}, #{x}, #{y}\n" when :or emit "orr #{register}, #{x}, #{y}\n" + when :mul + # Can't store result in same register as first operand. + if register == x + if x == y + # All using the same register. Move x to a different + # register to make this work. + temp = (x == @TEMPORARY) ? :a4 : @TEMPORARY + emit "cpy #{temp}, #{x}\n" + emit "mul #{register}, #{temp}, #{y}\n" + else + # Multiplication is commutative. Just swap x and y. + emit "mul #{register}, #{y}, #{x}\n" + end + else + # Common case, register and x are different. + emit "mul #{register}, #{x}, #{y}\n" + end when :rol emit "rsb #{y}, #{y}, #32\n" emit "ror #{register}, #{x}, #{y}\n" -- 2.11.4.GIT