DFG ArithMul power-of-two case does not check for overflow
authorfpizlo@apple.com <fpizlo@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 10 Dec 2011 02:15:39 +0000 (02:15 +0000)
committerfpizlo@apple.com <fpizlo@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 10 Dec 2011 02:15:39 +0000 (02:15 +0000)
https://bugs.webkit.org/show_bug.cgi?id=74230

Source/JavaScriptCore:

Reviewed by Gavin Barraclough.

Disabled power-of-2 peephole optimization for multiplication, because it was wrong,
and any attempt to fix it would likely introduce code bloat and register pressure.

* dfg/DFGSpeculativeJIT.cpp:
(JSC::DFG::SpeculativeJIT::compileArithMul):

LayoutTests:

Reviewed by Gavin Barraclough.

* fast/js/dfg-multiply-expected.txt: Added.
* fast/js/dfg-multiply.html: Added.
* fast/js/script-tests/dfg-multiply.js: Added.
(doMultiplyConstant2):
(doMultiplyConstant3):
(doMultiplyConstant4):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@102509 268f45cc-cd09-0410-ab3c-d52691b4dbfc

LayoutTests/ChangeLog
LayoutTests/fast/js/dfg-multiply-expected.txt [new file with mode: 0644]
LayoutTests/fast/js/dfg-multiply.html [new file with mode: 0644]
LayoutTests/fast/js/script-tests/dfg-multiply.js [new file with mode: 0644]
Source/JavaScriptCore/ChangeLog
Source/JavaScriptCore/dfg/DFGSpeculativeJIT.cpp

index 4ef7d13..db7e4da 100644 (file)
@@ -1,3 +1,17 @@
+2011-12-09  Filip Pizlo  <fpizlo@apple.com>
+
+        DFG ArithMul power-of-two case does not check for overflow
+        https://bugs.webkit.org/show_bug.cgi?id=74230
+
+        Reviewed by Gavin Barraclough.
+
+        * fast/js/dfg-multiply-expected.txt: Added.
+        * fast/js/dfg-multiply.html: Added.
+        * fast/js/script-tests/dfg-multiply.js: Added.
+        (doMultiplyConstant2):
+        (doMultiplyConstant3):
+        (doMultiplyConstant4):
+
 2011-12-09  Zan Dobersek  <zandobersek@gmail.com>
 
         [Gtk] Unskip two passing Shadow DOM tests
diff --git a/LayoutTests/fast/js/dfg-multiply-expected.txt b/LayoutTests/fast/js/dfg-multiply-expected.txt
new file mode 100644 (file)
index 0000000..57f5d50
--- /dev/null
@@ -0,0 +1,1029 @@
+This tests that the DFG can multiply numbers correctly.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+PASS doMultiplyConstant2(1) is 2
+PASS doMultiplyConstant2(2) is 4
+PASS doMultiplyConstant2(4) is 8
+PASS doMultiplyConstant3(1) is 3
+PASS doMultiplyConstant3(2) is 6
+PASS doMultiplyConstant3(4) is 12
+PASS doMultiplyConstant4(1) is 4
+PASS doMultiplyConstant4(2) is 8
+PASS doMultiplyConstant4(4) is 16
+PASS doMultiplyConstant2(1) is 2
+PASS doMultiplyConstant2(2) is 4
+PASS doMultiplyConstant2(4) is 8
+PASS doMultiplyConstant3(1) is 3
+PASS doMultiplyConstant3(2) is 6
+PASS doMultiplyConstant3(4) is 12
+PASS doMultiplyConstant4(1) is 4
+PASS doMultiplyConstant4(2) is 8
+PASS doMultiplyConstant4(4) is 16
+PASS doMultiplyConstant2(1) is 2
+PASS doMultiplyConstant2(2) is 4
+PASS doMultiplyConstant2(4) is 8
+PASS doMultiplyConstant3(1) is 3
+PASS doMultiplyConstant3(2) is 6
+PASS doMultiplyConstant3(4) is 12
+PASS doMultiplyConstant4(1) is 4
+PASS doMultiplyConstant4(2) is 8
+PASS doMultiplyConstant4(4) is 16
+PASS doMultiplyConstant2(1) is 2
+PASS doMultiplyConstant2(2) is 4
+PASS doMultiplyConstant2(4) is 8
+PASS doMultiplyConstant3(1) is 3
+PASS doMultiplyConstant3(2) is 6
+PASS doMultiplyConstant3(4) is 12
+PASS doMultiplyConstant4(1) is 4
+PASS doMultiplyConstant4(2) is 8
+PASS doMultiplyConstant4(4) is 16
+PASS doMultiplyConstant2(1) is 2
+PASS doMultiplyConstant2(2) is 4
+PASS doMultiplyConstant2(4) is 8
+PASS doMultiplyConstant3(1) is 3
+PASS doMultiplyConstant3(2) is 6
+PASS doMultiplyConstant3(4) is 12
+PASS doMultiplyConstant4(1) is 4
+PASS doMultiplyConstant4(2) is 8
+PASS doMultiplyConstant4(4) is 16
+PASS doMultiplyConstant2(1) is 2
+PASS doMultiplyConstant2(2) is 4
+PASS doMultiplyConstant2(4) is 8
+PASS doMultiplyConstant3(1) is 3
+PASS doMultiplyConstant3(2) is 6
+PASS doMultiplyConstant3(4) is 12
+PASS doMultiplyConstant4(1) is 4
+PASS doMultiplyConstant4(2) is 8
+PASS doMultiplyConstant4(4) is 16
+PASS doMultiplyConstant2(1) is 2
+PASS doMultiplyConstant2(2) is 4
+PASS doMultiplyConstant2(4) is 8
+PASS doMultiplyConstant3(1) is 3
+PASS doMultiplyConstant3(2) is 6
+PASS doMultiplyConstant3(4) is 12
+PASS doMultiplyConstant4(1) is 4
+PASS doMultiplyConstant4(2) is 8
+PASS doMultiplyConstant4(4) is 16
+PASS doMultiplyConstant2(1) is 2
+PASS doMultiplyConstant2(2) is 4
+PASS doMultiplyConstant2(4) is 8
+PASS doMultiplyConstant3(1) is 3
+PASS doMultiplyConstant3(2) is 6
+PASS doMultiplyConstant3(4) is 12
+PASS doMultiplyConstant4(1) is 4
+PASS doMultiplyConstant4(2) is 8
+PASS doMultiplyConstant4(4) is 16
+PASS doMultiplyConstant2(1) is 2
+PASS doMultiplyConstant2(2) is 4
+PASS doMultiplyConstant2(4) is 8
+PASS doMultiplyConstant3(1) is 3
+PASS doMultiplyConstant3(2) is 6
+PASS doMultiplyConstant3(4) is 12
+PASS doMultiplyConstant4(1) is 4
+PASS doMultiplyConstant4(2) is 8
+PASS doMultiplyConstant4(4) is 16
+PASS doMultiplyConstant2(1) is 2
+PASS doMultiplyConstant2(2) is 4
+PASS doMultiplyConstant2(4) is 8
+PASS doMultiplyConstant3(1) is 3
+PASS doMultiplyConstant3(2) is 6
+PASS doMultiplyConstant3(4) is 12
+PASS doMultiplyConstant4(1) is 4
+PASS doMultiplyConstant4(2) is 8
+PASS doMultiplyConstant4(4) is 16
+PASS doMultiplyConstant2(1) is 2
+PASS doMultiplyConstant2(2) is 4
+PASS doMultiplyConstant2(4) is 8
+PASS doMultiplyConstant3(1) is 3
+PASS doMultiplyConstant3(2) is 6
+PASS doMultiplyConstant3(4) is 12
+PASS doMultiplyConstant4(1) is 4
+PASS doMultiplyConstant4(2) is 8
+PASS doMultiplyConstant4(4) is 16
+PASS doMultiplyConstant2(1) is 2
+PASS doMultiplyConstant2(2) is 4
+PASS doMultiplyConstant2(4) is 8
+PASS doMultiplyConstant3(1) is 3
+PASS doMultiplyConstant3(2) is 6
+PASS doMultiplyConstant3(4) is 12
+PASS doMultiplyConstant4(1) is 4
+PASS doMultiplyConstant4(2) is 8
+PASS doMultiplyConstant4(4) is 16
+PASS doMultiplyConstant2(1) is 2
+PASS doMultiplyConstant2(2) is 4
+PASS doMultiplyConstant2(4) is 8
+PASS doMultiplyConstant3(1) is 3
+PASS doMultiplyConstant3(2) is 6
+PASS doMultiplyConstant3(4) is 12
+PASS doMultiplyConstant4(1) is 4
+PASS doMultiplyConstant4(2) is 8
+PASS doMultiplyConstant4(4) is 16
+PASS doMultiplyConstant2(1) is 2
+PASS doMultiplyConstant2(2) is 4
+PASS doMultiplyConstant2(4) is 8
+PASS doMultiplyConstant3(1) is 3
+PASS doMultiplyConstant3(2) is 6
+PASS doMultiplyConstant3(4) is 12
+PASS doMultiplyConstant4(1) is 4
+PASS doMultiplyConstant4(2) is 8
+PASS doMultiplyConstant4(4) is 16
+PASS doMultiplyConstant2(1) is 2
+PASS doMultiplyConstant2(2) is 4
+PASS doMultiplyConstant2(4) is 8
+PASS doMultiplyConstant3(1) is 3
+PASS doMultiplyConstant3(2) is 6
+PASS doMultiplyConstant3(4) is 12
+PASS doMultiplyConstant4(1) is 4
+PASS doMultiplyConstant4(2) is 8
+PASS doMultiplyConstant4(4) is 16
+PASS doMultiplyConstant2(1) is 2
+PASS doMultiplyConstant2(2) is 4
+PASS doMultiplyConstant2(4) is 8
+PASS doMultiplyConstant3(1) is 3
+PASS doMultiplyConstant3(2) is 6
+PASS doMultiplyConstant3(4) is 12
+PASS doMultiplyConstant4(1) is 4
+PASS doMultiplyConstant4(2) is 8
+PASS doMultiplyConstant4(4) is 16
+PASS doMultiplyConstant2(1) is 2
+PASS doMultiplyConstant2(2) is 4
+PASS doMultiplyConstant2(4) is 8
+PASS doMultiplyConstant3(1) is 3
+PASS doMultiplyConstant3(2) is 6
+PASS doMultiplyConstant3(4) is 12
+PASS doMultiplyConstant4(1) is 4
+PASS doMultiplyConstant4(2) is 8
+PASS doMultiplyConstant4(4) is 16
+PASS doMultiplyConstant2(1) is 2
+PASS doMultiplyConstant2(2) is 4
+PASS doMultiplyConstant2(4) is 8
+PASS doMultiplyConstant3(1) is 3
+PASS doMultiplyConstant3(2) is 6
+PASS doMultiplyConstant3(4) is 12
+PASS doMultiplyConstant4(1) is 4
+PASS doMultiplyConstant4(2) is 8
+PASS doMultiplyConstant4(4) is 16
+PASS doMultiplyConstant2(1) is 2
+PASS doMultiplyConstant2(2) is 4
+PASS doMultiplyConstant2(4) is 8
+PASS doMultiplyConstant3(1) is 3
+PASS doMultiplyConstant3(2) is 6
+PASS doMultiplyConstant3(4) is 12
+PASS doMultiplyConstant4(1) is 4
+PASS doMultiplyConstant4(2) is 8
+PASS doMultiplyConstant4(4) is 16
+PASS doMultiplyConstant2(1) is 2
+PASS doMultiplyConstant2(2) is 4
+PASS doMultiplyConstant2(4) is 8
+PASS doMultiplyConstant3(1) is 3
+PASS doMultiplyConstant3(2) is 6
+PASS doMultiplyConstant3(4) is 12
+PASS doMultiplyConstant4(1) is 4
+PASS doMultiplyConstant4(2) is 8
+PASS doMultiplyConstant4(4) is 16
+PASS doMultiplyConstant2(1) is 2
+PASS doMultiplyConstant2(2) is 4
+PASS doMultiplyConstant2(4) is 8
+PASS doMultiplyConstant3(1) is 3
+PASS doMultiplyConstant3(2) is 6
+PASS doMultiplyConstant3(4) is 12
+PASS doMultiplyConstant4(1) is 4
+PASS doMultiplyConstant4(2) is 8
+PASS doMultiplyConstant4(4) is 16
+PASS doMultiplyConstant2(1) is 2
+PASS doMultiplyConstant2(2) is 4
+PASS doMultiplyConstant2(4) is 8
+PASS doMultiplyConstant3(1) is 3
+PASS doMultiplyConstant3(2) is 6
+PASS doMultiplyConstant3(4) is 12
+PASS doMultiplyConstant4(1) is 4
+PASS doMultiplyConstant4(2) is 8
+PASS doMultiplyConstant4(4) is 16
+PASS doMultiplyConstant2(1) is 2
+PASS doMultiplyConstant2(2) is 4
+PASS doMultiplyConstant2(4) is 8
+PASS doMultiplyConstant3(1) is 3
+PASS doMultiplyConstant3(2) is 6
+PASS doMultiplyConstant3(4) is 12
+PASS doMultiplyConstant4(1) is 4
+PASS doMultiplyConstant4(2) is 8
+PASS doMultiplyConstant4(4) is 16
+PASS doMultiplyConstant2(1) is 2
+PASS doMultiplyConstant2(2) is 4
+PASS doMultiplyConstant2(4) is 8
+PASS doMultiplyConstant3(1) is 3
+PASS doMultiplyConstant3(2) is 6
+PASS doMultiplyConstant3(4) is 12
+PASS doMultiplyConstant4(1) is 4
+PASS doMultiplyConstant4(2) is 8
+PASS doMultiplyConstant4(4) is 16
+PASS doMultiplyConstant2(1) is 2
+PASS doMultiplyConstant2(2) is 4
+PASS doMultiplyConstant2(4) is 8
+PASS doMultiplyConstant3(1) is 3
+PASS doMultiplyConstant3(2) is 6
+PASS doMultiplyConstant3(4) is 12
+PASS doMultiplyConstant4(1) is 4
+PASS doMultiplyConstant4(2) is 8
+PASS doMultiplyConstant4(4) is 16
+PASS doMultiplyConstant2(1) is 2
+PASS doMultiplyConstant2(2) is 4
+PASS doMultiplyConstant2(4) is 8
+PASS doMultiplyConstant3(1) is 3
+PASS doMultiplyConstant3(2) is 6
+PASS doMultiplyConstant3(4) is 12
+PASS doMultiplyConstant4(1) is 4
+PASS doMultiplyConstant4(2) is 8
+PASS doMultiplyConstant4(4) is 16
+PASS doMultiplyConstant2(1) is 2
+PASS doMultiplyConstant2(2) is 4
+PASS doMultiplyConstant2(4) is 8
+PASS doMultiplyConstant3(1) is 3
+PASS doMultiplyConstant3(2) is 6
+PASS doMultiplyConstant3(4) is 12
+PASS doMultiplyConstant4(1) is 4
+PASS doMultiplyConstant4(2) is 8
+PASS doMultiplyConstant4(4) is 16
+PASS doMultiplyConstant2(1) is 2
+PASS doMultiplyConstant2(2) is 4
+PASS doMultiplyConstant2(4) is 8
+PASS doMultiplyConstant3(1) is 3
+PASS doMultiplyConstant3(2) is 6
+PASS doMultiplyConstant3(4) is 12
+PASS doMultiplyConstant4(1) is 4
+PASS doMultiplyConstant4(2) is 8
+PASS doMultiplyConstant4(4) is 16
+PASS doMultiplyConstant2(1) is 2
+PASS doMultiplyConstant2(2) is 4
+PASS doMultiplyConstant2(4) is 8
+PASS doMultiplyConstant3(1) is 3
+PASS doMultiplyConstant3(2) is 6
+PASS doMultiplyConstant3(4) is 12
+PASS doMultiplyConstant4(1) is 4
+PASS doMultiplyConstant4(2) is 8
+PASS doMultiplyConstant4(4) is 16
+PASS doMultiplyConstant2(1) is 2
+PASS doMultiplyConstant2(2) is 4
+PASS doMultiplyConstant2(4) is 8
+PASS doMultiplyConstant3(1) is 3
+PASS doMultiplyConstant3(2) is 6
+PASS doMultiplyConstant3(4) is 12
+PASS doMultiplyConstant4(1) is 4
+PASS doMultiplyConstant4(2) is 8
+PASS doMultiplyConstant4(4) is 16
+PASS doMultiplyConstant2(1) is 2
+PASS doMultiplyConstant2(2) is 4
+PASS doMultiplyConstant2(4) is 8
+PASS doMultiplyConstant3(1) is 3
+PASS doMultiplyConstant3(2) is 6
+PASS doMultiplyConstant3(4) is 12
+PASS doMultiplyConstant4(1) is 4
+PASS doMultiplyConstant4(2) is 8
+PASS doMultiplyConstant4(4) is 16
+PASS doMultiplyConstant2(1) is 2
+PASS doMultiplyConstant2(2) is 4
+PASS doMultiplyConstant2(4) is 8
+PASS doMultiplyConstant3(1) is 3
+PASS doMultiplyConstant3(2) is 6
+PASS doMultiplyConstant3(4) is 12
+PASS doMultiplyConstant4(1) is 4
+PASS doMultiplyConstant4(2) is 8
+PASS doMultiplyConstant4(4) is 16
+PASS doMultiplyConstant2(1) is 2
+PASS doMultiplyConstant2(2) is 4
+PASS doMultiplyConstant2(4) is 8
+PASS doMultiplyConstant3(1) is 3
+PASS doMultiplyConstant3(2) is 6
+PASS doMultiplyConstant3(4) is 12
+PASS doMultiplyConstant4(1) is 4
+PASS doMultiplyConstant4(2) is 8
+PASS doMultiplyConstant4(4) is 16
+PASS doMultiplyConstant2(1) is 2
+PASS doMultiplyConstant2(2) is 4
+PASS doMultiplyConstant2(4) is 8
+PASS doMultiplyConstant3(1) is 3
+PASS doMultiplyConstant3(2) is 6
+PASS doMultiplyConstant3(4) is 12
+PASS doMultiplyConstant4(1) is 4
+PASS doMultiplyConstant4(2) is 8
+PASS doMultiplyConstant4(4) is 16
+PASS doMultiplyConstant2(1) is 2
+PASS doMultiplyConstant2(2) is 4
+PASS doMultiplyConstant2(4) is 8
+PASS doMultiplyConstant3(1) is 3
+PASS doMultiplyConstant3(2) is 6
+PASS doMultiplyConstant3(4) is 12
+PASS doMultiplyConstant4(1) is 4
+PASS doMultiplyConstant4(2) is 8
+PASS doMultiplyConstant4(4) is 16
+PASS doMultiplyConstant2(1) is 2
+PASS doMultiplyConstant2(2) is 4
+PASS doMultiplyConstant2(4) is 8
+PASS doMultiplyConstant3(1) is 3
+PASS doMultiplyConstant3(2) is 6
+PASS doMultiplyConstant3(4) is 12
+PASS doMultiplyConstant4(1) is 4
+PASS doMultiplyConstant4(2) is 8
+PASS doMultiplyConstant4(4) is 16
+PASS doMultiplyConstant2(1) is 2
+PASS doMultiplyConstant2(2) is 4
+PASS doMultiplyConstant2(4) is 8
+PASS doMultiplyConstant3(1) is 3
+PASS doMultiplyConstant3(2) is 6
+PASS doMultiplyConstant3(4) is 12
+PASS doMultiplyConstant4(1) is 4
+PASS doMultiplyConstant4(2) is 8
+PASS doMultiplyConstant4(4) is 16
+PASS doMultiplyConstant2(1) is 2
+PASS doMultiplyConstant2(2) is 4
+PASS doMultiplyConstant2(4) is 8
+PASS doMultiplyConstant3(1) is 3
+PASS doMultiplyConstant3(2) is 6
+PASS doMultiplyConstant3(4) is 12
+PASS doMultiplyConstant4(1) is 4
+PASS doMultiplyConstant4(2) is 8
+PASS doMultiplyConstant4(4) is 16
+PASS doMultiplyConstant2(1) is 2
+PASS doMultiplyConstant2(2) is 4
+PASS doMultiplyConstant2(4) is 8
+PASS doMultiplyConstant3(1) is 3
+PASS doMultiplyConstant3(2) is 6
+PASS doMultiplyConstant3(4) is 12
+PASS doMultiplyConstant4(1) is 4
+PASS doMultiplyConstant4(2) is 8
+PASS doMultiplyConstant4(4) is 16
+PASS doMultiplyConstant2(1) is 2
+PASS doMultiplyConstant2(2) is 4
+PASS doMultiplyConstant2(4) is 8
+PASS doMultiplyConstant3(1) is 3
+PASS doMultiplyConstant3(2) is 6
+PASS doMultiplyConstant3(4) is 12
+PASS doMultiplyConstant4(1) is 4
+PASS doMultiplyConstant4(2) is 8
+PASS doMultiplyConstant4(4) is 16
+PASS doMultiplyConstant2(1) is 2
+PASS doMultiplyConstant2(2) is 4
+PASS doMultiplyConstant2(4) is 8
+PASS doMultiplyConstant3(1) is 3
+PASS doMultiplyConstant3(2) is 6
+PASS doMultiplyConstant3(4) is 12
+PASS doMultiplyConstant4(1) is 4
+PASS doMultiplyConstant4(2) is 8
+PASS doMultiplyConstant4(4) is 16
+PASS doMultiplyConstant2(1) is 2
+PASS doMultiplyConstant2(2) is 4
+PASS doMultiplyConstant2(4) is 8
+PASS doMultiplyConstant3(1) is 3
+PASS doMultiplyConstant3(2) is 6
+PASS doMultiplyConstant3(4) is 12
+PASS doMultiplyConstant4(1) is 4
+PASS doMultiplyConstant4(2) is 8
+PASS doMultiplyConstant4(4) is 16
+PASS doMultiplyConstant2(1) is 2
+PASS doMultiplyConstant2(2) is 4
+PASS doMultiplyConstant2(4) is 8
+PASS doMultiplyConstant3(1) is 3
+PASS doMultiplyConstant3(2) is 6
+PASS doMultiplyConstant3(4) is 12
+PASS doMultiplyConstant4(1) is 4
+PASS doMultiplyConstant4(2) is 8
+PASS doMultiplyConstant4(4) is 16
+PASS doMultiplyConstant2(1) is 2
+PASS doMultiplyConstant2(2) is 4
+PASS doMultiplyConstant2(4) is 8
+PASS doMultiplyConstant3(1) is 3
+PASS doMultiplyConstant3(2) is 6
+PASS doMultiplyConstant3(4) is 12
+PASS doMultiplyConstant4(1) is 4
+PASS doMultiplyConstant4(2) is 8
+PASS doMultiplyConstant4(4) is 16
+PASS doMultiplyConstant2(1) is 2
+PASS doMultiplyConstant2(2) is 4
+PASS doMultiplyConstant2(4) is 8
+PASS doMultiplyConstant3(1) is 3
+PASS doMultiplyConstant3(2) is 6
+PASS doMultiplyConstant3(4) is 12
+PASS doMultiplyConstant4(1) is 4
+PASS doMultiplyConstant4(2) is 8
+PASS doMultiplyConstant4(4) is 16
+PASS doMultiplyConstant2(1) is 2
+PASS doMultiplyConstant2(2) is 4
+PASS doMultiplyConstant2(4) is 8
+PASS doMultiplyConstant3(1) is 3
+PASS doMultiplyConstant3(2) is 6
+PASS doMultiplyConstant3(4) is 12
+PASS doMultiplyConstant4(1) is 4
+PASS doMultiplyConstant4(2) is 8
+PASS doMultiplyConstant4(4) is 16
+PASS doMultiplyConstant2(1) is 2
+PASS doMultiplyConstant2(2) is 4
+PASS doMultiplyConstant2(4) is 8
+PASS doMultiplyConstant3(1) is 3
+PASS doMultiplyConstant3(2) is 6
+PASS doMultiplyConstant3(4) is 12
+PASS doMultiplyConstant4(1) is 4
+PASS doMultiplyConstant4(2) is 8
+PASS doMultiplyConstant4(4) is 16
+PASS doMultiplyConstant2(1) is 2
+PASS doMultiplyConstant2(2) is 4
+PASS doMultiplyConstant2(4) is 8
+PASS doMultiplyConstant3(1) is 3
+PASS doMultiplyConstant3(2) is 6
+PASS doMultiplyConstant3(4) is 12
+PASS doMultiplyConstant4(1) is 4
+PASS doMultiplyConstant4(2) is 8
+PASS doMultiplyConstant4(4) is 16
+PASS doMultiplyConstant2(1) is 2
+PASS doMultiplyConstant2(2) is 4
+PASS doMultiplyConstant2(4) is 8
+PASS doMultiplyConstant3(1) is 3
+PASS doMultiplyConstant3(2) is 6
+PASS doMultiplyConstant3(4) is 12
+PASS doMultiplyConstant4(1) is 4
+PASS doMultiplyConstant4(2) is 8
+PASS doMultiplyConstant4(4) is 16
+PASS doMultiplyConstant2(1) is 2
+PASS doMultiplyConstant2(2) is 4
+PASS doMultiplyConstant2(4) is 8
+PASS doMultiplyConstant3(1) is 3
+PASS doMultiplyConstant3(2) is 6
+PASS doMultiplyConstant3(4) is 12
+PASS doMultiplyConstant4(1) is 4
+PASS doMultiplyConstant4(2) is 8
+PASS doMultiplyConstant4(4) is 16
+PASS doMultiplyConstant2(1) is 2
+PASS doMultiplyConstant2(2) is 4
+PASS doMultiplyConstant2(4) is 8
+PASS doMultiplyConstant3(1) is 3
+PASS doMultiplyConstant3(2) is 6
+PASS doMultiplyConstant3(4) is 12
+PASS doMultiplyConstant4(1) is 4
+PASS doMultiplyConstant4(2) is 8
+PASS doMultiplyConstant4(4) is 16
+PASS doMultiplyConstant2(1) is 2
+PASS doMultiplyConstant2(2) is 4
+PASS doMultiplyConstant2(4) is 8
+PASS doMultiplyConstant3(1) is 3
+PASS doMultiplyConstant3(2) is 6
+PASS doMultiplyConstant3(4) is 12
+PASS doMultiplyConstant4(1) is 4
+PASS doMultiplyConstant4(2) is 8
+PASS doMultiplyConstant4(4) is 16
+PASS doMultiplyConstant2(1) is 2
+PASS doMultiplyConstant2(2) is 4
+PASS doMultiplyConstant2(4) is 8
+PASS doMultiplyConstant3(1) is 3
+PASS doMultiplyConstant3(2) is 6
+PASS doMultiplyConstant3(4) is 12
+PASS doMultiplyConstant4(1) is 4
+PASS doMultiplyConstant4(2) is 8
+PASS doMultiplyConstant4(4) is 16
+PASS doMultiplyConstant2(1) is 2
+PASS doMultiplyConstant2(2) is 4
+PASS doMultiplyConstant2(4) is 8
+PASS doMultiplyConstant3(1) is 3
+PASS doMultiplyConstant3(2) is 6
+PASS doMultiplyConstant3(4) is 12
+PASS doMultiplyConstant4(1) is 4
+PASS doMultiplyConstant4(2) is 8
+PASS doMultiplyConstant4(4) is 16
+PASS doMultiplyConstant2(1) is 2
+PASS doMultiplyConstant2(2) is 4
+PASS doMultiplyConstant2(4) is 8
+PASS doMultiplyConstant3(1) is 3
+PASS doMultiplyConstant3(2) is 6
+PASS doMultiplyConstant3(4) is 12
+PASS doMultiplyConstant4(1) is 4
+PASS doMultiplyConstant4(2) is 8
+PASS doMultiplyConstant4(4) is 16
+PASS doMultiplyConstant2(1) is 2
+PASS doMultiplyConstant2(2) is 4
+PASS doMultiplyConstant2(4) is 8
+PASS doMultiplyConstant3(1) is 3
+PASS doMultiplyConstant3(2) is 6
+PASS doMultiplyConstant3(4) is 12
+PASS doMultiplyConstant4(1) is 4
+PASS doMultiplyConstant4(2) is 8
+PASS doMultiplyConstant4(4) is 16
+PASS doMultiplyConstant2(1) is 2
+PASS doMultiplyConstant2(2) is 4
+PASS doMultiplyConstant2(4) is 8
+PASS doMultiplyConstant3(1) is 3
+PASS doMultiplyConstant3(2) is 6
+PASS doMultiplyConstant3(4) is 12
+PASS doMultiplyConstant4(1) is 4
+PASS doMultiplyConstant4(2) is 8
+PASS doMultiplyConstant4(4) is 16
+PASS doMultiplyConstant2(1) is 2
+PASS doMultiplyConstant2(2) is 4
+PASS doMultiplyConstant2(4) is 8
+PASS doMultiplyConstant3(1) is 3
+PASS doMultiplyConstant3(2) is 6
+PASS doMultiplyConstant3(4) is 12
+PASS doMultiplyConstant4(1) is 4
+PASS doMultiplyConstant4(2) is 8
+PASS doMultiplyConstant4(4) is 16
+PASS doMultiplyConstant2(1) is 2
+PASS doMultiplyConstant2(2) is 4
+PASS doMultiplyConstant2(4) is 8
+PASS doMultiplyConstant3(1) is 3
+PASS doMultiplyConstant3(2) is 6
+PASS doMultiplyConstant3(4) is 12
+PASS doMultiplyConstant4(1) is 4
+PASS doMultiplyConstant4(2) is 8
+PASS doMultiplyConstant4(4) is 16
+PASS doMultiplyConstant2(1) is 2
+PASS doMultiplyConstant2(2) is 4
+PASS doMultiplyConstant2(4) is 8
+PASS doMultiplyConstant3(1) is 3
+PASS doMultiplyConstant3(2) is 6
+PASS doMultiplyConstant3(4) is 12
+PASS doMultiplyConstant4(1) is 4
+PASS doMultiplyConstant4(2) is 8
+PASS doMultiplyConstant4(4) is 16
+PASS doMultiplyConstant2(1) is 2
+PASS doMultiplyConstant2(2) is 4
+PASS doMultiplyConstant2(4) is 8
+PASS doMultiplyConstant3(1) is 3
+PASS doMultiplyConstant3(2) is 6
+PASS doMultiplyConstant3(4) is 12
+PASS doMultiplyConstant4(1) is 4
+PASS doMultiplyConstant4(2) is 8
+PASS doMultiplyConstant4(4) is 16
+PASS doMultiplyConstant2(1) is 2
+PASS doMultiplyConstant2(2) is 4
+PASS doMultiplyConstant2(4) is 8
+PASS doMultiplyConstant3(1) is 3
+PASS doMultiplyConstant3(2) is 6
+PASS doMultiplyConstant3(4) is 12
+PASS doMultiplyConstant4(1) is 4
+PASS doMultiplyConstant4(2) is 8
+PASS doMultiplyConstant4(4) is 16
+PASS doMultiplyConstant2(1) is 2
+PASS doMultiplyConstant2(2) is 4
+PASS doMultiplyConstant2(4) is 8
+PASS doMultiplyConstant3(1) is 3
+PASS doMultiplyConstant3(2) is 6
+PASS doMultiplyConstant3(4) is 12
+PASS doMultiplyConstant4(1) is 4
+PASS doMultiplyConstant4(2) is 8
+PASS doMultiplyConstant4(4) is 16
+PASS doMultiplyConstant2(1) is 2
+PASS doMultiplyConstant2(2) is 4
+PASS doMultiplyConstant2(4) is 8
+PASS doMultiplyConstant3(1) is 3
+PASS doMultiplyConstant3(2) is 6
+PASS doMultiplyConstant3(4) is 12
+PASS doMultiplyConstant4(1) is 4
+PASS doMultiplyConstant4(2) is 8
+PASS doMultiplyConstant4(4) is 16
+PASS doMultiplyConstant2(1) is 2
+PASS doMultiplyConstant2(2) is 4
+PASS doMultiplyConstant2(4) is 8
+PASS doMultiplyConstant3(1) is 3
+PASS doMultiplyConstant3(2) is 6
+PASS doMultiplyConstant3(4) is 12
+PASS doMultiplyConstant4(1) is 4
+PASS doMultiplyConstant4(2) is 8
+PASS doMultiplyConstant4(4) is 16
+PASS doMultiplyConstant2(1) is 2
+PASS doMultiplyConstant2(2) is 4
+PASS doMultiplyConstant2(4) is 8
+PASS doMultiplyConstant3(1) is 3
+PASS doMultiplyConstant3(2) is 6
+PASS doMultiplyConstant3(4) is 12
+PASS doMultiplyConstant4(1) is 4
+PASS doMultiplyConstant4(2) is 8
+PASS doMultiplyConstant4(4) is 16
+PASS doMultiplyConstant2(1) is 2
+PASS doMultiplyConstant2(2) is 4
+PASS doMultiplyConstant2(4) is 8
+PASS doMultiplyConstant3(1) is 3
+PASS doMultiplyConstant3(2) is 6
+PASS doMultiplyConstant3(4) is 12
+PASS doMultiplyConstant4(1) is 4
+PASS doMultiplyConstant4(2) is 8
+PASS doMultiplyConstant4(4) is 16
+PASS doMultiplyConstant2(1) is 2
+PASS doMultiplyConstant2(2) is 4
+PASS doMultiplyConstant2(4) is 8
+PASS doMultiplyConstant3(1) is 3
+PASS doMultiplyConstant3(2) is 6
+PASS doMultiplyConstant3(4) is 12
+PASS doMultiplyConstant4(1) is 4
+PASS doMultiplyConstant4(2) is 8
+PASS doMultiplyConstant4(4) is 16
+PASS doMultiplyConstant2(1) is 2
+PASS doMultiplyConstant2(2) is 4
+PASS doMultiplyConstant2(4) is 8
+PASS doMultiplyConstant3(1) is 3
+PASS doMultiplyConstant3(2) is 6
+PASS doMultiplyConstant3(4) is 12
+PASS doMultiplyConstant4(1) is 4
+PASS doMultiplyConstant4(2) is 8
+PASS doMultiplyConstant4(4) is 16
+PASS doMultiplyConstant2(1) is 2
+PASS doMultiplyConstant2(2) is 4
+PASS doMultiplyConstant2(4) is 8
+PASS doMultiplyConstant3(1) is 3
+PASS doMultiplyConstant3(2) is 6
+PASS doMultiplyConstant3(4) is 12
+PASS doMultiplyConstant4(1) is 4
+PASS doMultiplyConstant4(2) is 8
+PASS doMultiplyConstant4(4) is 16
+PASS doMultiplyConstant2(1) is 2
+PASS doMultiplyConstant2(2) is 4
+PASS doMultiplyConstant2(4) is 8
+PASS doMultiplyConstant3(1) is 3
+PASS doMultiplyConstant3(2) is 6
+PASS doMultiplyConstant3(4) is 12
+PASS doMultiplyConstant4(1) is 4
+PASS doMultiplyConstant4(2) is 8
+PASS doMultiplyConstant4(4) is 16
+PASS doMultiplyConstant2(1) is 2
+PASS doMultiplyConstant2(2) is 4
+PASS doMultiplyConstant2(4) is 8
+PASS doMultiplyConstant3(1) is 3
+PASS doMultiplyConstant3(2) is 6
+PASS doMultiplyConstant3(4) is 12
+PASS doMultiplyConstant4(1) is 4
+PASS doMultiplyConstant4(2) is 8
+PASS doMultiplyConstant4(4) is 16
+PASS doMultiplyConstant2(1) is 2
+PASS doMultiplyConstant2(2) is 4
+PASS doMultiplyConstant2(4) is 8
+PASS doMultiplyConstant3(1) is 3
+PASS doMultiplyConstant3(2) is 6
+PASS doMultiplyConstant3(4) is 12
+PASS doMultiplyConstant4(1) is 4
+PASS doMultiplyConstant4(2) is 8
+PASS doMultiplyConstant4(4) is 16
+PASS doMultiplyConstant2(1) is 2
+PASS doMultiplyConstant2(2) is 4
+PASS doMultiplyConstant2(4) is 8
+PASS doMultiplyConstant3(1) is 3
+PASS doMultiplyConstant3(2) is 6
+PASS doMultiplyConstant3(4) is 12
+PASS doMultiplyConstant4(1) is 4
+PASS doMultiplyConstant4(2) is 8
+PASS doMultiplyConstant4(4) is 16
+PASS doMultiplyConstant2(1) is 2
+PASS doMultiplyConstant2(2) is 4
+PASS doMultiplyConstant2(4) is 8
+PASS doMultiplyConstant3(1) is 3
+PASS doMultiplyConstant3(2) is 6
+PASS doMultiplyConstant3(4) is 12
+PASS doMultiplyConstant4(1) is 4
+PASS doMultiplyConstant4(2) is 8
+PASS doMultiplyConstant4(4) is 16
+PASS doMultiplyConstant2(1) is 2
+PASS doMultiplyConstant2(2) is 4
+PASS doMultiplyConstant2(4) is 8
+PASS doMultiplyConstant3(1) is 3
+PASS doMultiplyConstant3(2) is 6
+PASS doMultiplyConstant3(4) is 12
+PASS doMultiplyConstant4(1) is 4
+PASS doMultiplyConstant4(2) is 8
+PASS doMultiplyConstant4(4) is 16
+PASS doMultiplyConstant2(1) is 2
+PASS doMultiplyConstant2(2) is 4
+PASS doMultiplyConstant2(4) is 8
+PASS doMultiplyConstant3(1) is 3
+PASS doMultiplyConstant3(2) is 6
+PASS doMultiplyConstant3(4) is 12
+PASS doMultiplyConstant4(1) is 4
+PASS doMultiplyConstant4(2) is 8
+PASS doMultiplyConstant4(4) is 16
+PASS doMultiplyConstant2(1) is 2
+PASS doMultiplyConstant2(2) is 4
+PASS doMultiplyConstant2(4) is 8
+PASS doMultiplyConstant3(1) is 3
+PASS doMultiplyConstant3(2) is 6
+PASS doMultiplyConstant3(4) is 12
+PASS doMultiplyConstant4(1) is 4
+PASS doMultiplyConstant4(2) is 8
+PASS doMultiplyConstant4(4) is 16
+PASS doMultiplyConstant2(1) is 2
+PASS doMultiplyConstant2(2) is 4
+PASS doMultiplyConstant2(4) is 8
+PASS doMultiplyConstant3(1) is 3
+PASS doMultiplyConstant3(2) is 6
+PASS doMultiplyConstant3(4) is 12
+PASS doMultiplyConstant4(1) is 4
+PASS doMultiplyConstant4(2) is 8
+PASS doMultiplyConstant4(4) is 16
+PASS doMultiplyConstant2(1) is 2
+PASS doMultiplyConstant2(2) is 4
+PASS doMultiplyConstant2(4) is 8
+PASS doMultiplyConstant3(1) is 3
+PASS doMultiplyConstant3(2) is 6
+PASS doMultiplyConstant3(4) is 12
+PASS doMultiplyConstant4(1) is 4
+PASS doMultiplyConstant4(2) is 8
+PASS doMultiplyConstant4(4) is 16
+PASS doMultiplyConstant2(1) is 2
+PASS doMultiplyConstant2(2) is 4
+PASS doMultiplyConstant2(4) is 8
+PASS doMultiplyConstant3(1) is 3
+PASS doMultiplyConstant3(2) is 6
+PASS doMultiplyConstant3(4) is 12
+PASS doMultiplyConstant4(1) is 4
+PASS doMultiplyConstant4(2) is 8
+PASS doMultiplyConstant4(4) is 16
+PASS doMultiplyConstant2(1) is 2
+PASS doMultiplyConstant2(2) is 4
+PASS doMultiplyConstant2(4) is 8
+PASS doMultiplyConstant3(1) is 3
+PASS doMultiplyConstant3(2) is 6
+PASS doMultiplyConstant3(4) is 12
+PASS doMultiplyConstant4(1) is 4
+PASS doMultiplyConstant4(2) is 8
+PASS doMultiplyConstant4(4) is 16
+PASS doMultiplyConstant2(1) is 2
+PASS doMultiplyConstant2(2) is 4
+PASS doMultiplyConstant2(4) is 8
+PASS doMultiplyConstant3(1) is 3
+PASS doMultiplyConstant3(2) is 6
+PASS doMultiplyConstant3(4) is 12
+PASS doMultiplyConstant4(1) is 4
+PASS doMultiplyConstant4(2) is 8
+PASS doMultiplyConstant4(4) is 16
+PASS doMultiplyConstant2(1) is 2
+PASS doMultiplyConstant2(2) is 4
+PASS doMultiplyConstant2(4) is 8
+PASS doMultiplyConstant3(1) is 3
+PASS doMultiplyConstant3(2) is 6
+PASS doMultiplyConstant3(4) is 12
+PASS doMultiplyConstant4(1) is 4
+PASS doMultiplyConstant4(2) is 8
+PASS doMultiplyConstant4(4) is 16
+PASS doMultiplyConstant2(1) is 2
+PASS doMultiplyConstant2(2) is 4
+PASS doMultiplyConstant2(4) is 8
+PASS doMultiplyConstant3(1) is 3
+PASS doMultiplyConstant3(2) is 6
+PASS doMultiplyConstant3(4) is 12
+PASS doMultiplyConstant4(1) is 4
+PASS doMultiplyConstant4(2) is 8
+PASS doMultiplyConstant4(4) is 16
+PASS doMultiplyConstant2(1) is 2
+PASS doMultiplyConstant2(2) is 4
+PASS doMultiplyConstant2(4) is 8
+PASS doMultiplyConstant3(1) is 3
+PASS doMultiplyConstant3(2) is 6
+PASS doMultiplyConstant3(4) is 12
+PASS doMultiplyConstant4(1) is 4
+PASS doMultiplyConstant4(2) is 8
+PASS doMultiplyConstant4(4) is 16
+PASS doMultiplyConstant2(1) is 2
+PASS doMultiplyConstant2(2) is 4
+PASS doMultiplyConstant2(4) is 8
+PASS doMultiplyConstant3(1) is 3
+PASS doMultiplyConstant3(2) is 6
+PASS doMultiplyConstant3(4) is 12
+PASS doMultiplyConstant4(1) is 4
+PASS doMultiplyConstant4(2) is 8
+PASS doMultiplyConstant4(4) is 16
+PASS doMultiplyConstant2(1) is 2
+PASS doMultiplyConstant2(2) is 4
+PASS doMultiplyConstant2(4) is 8
+PASS doMultiplyConstant3(1) is 3
+PASS doMultiplyConstant3(2) is 6
+PASS doMultiplyConstant3(4) is 12
+PASS doMultiplyConstant4(1) is 4
+PASS doMultiplyConstant4(2) is 8
+PASS doMultiplyConstant4(4) is 16
+PASS doMultiplyConstant2(1) is 2
+PASS doMultiplyConstant2(2) is 4
+PASS doMultiplyConstant2(4) is 8
+PASS doMultiplyConstant3(1) is 3
+PASS doMultiplyConstant3(2) is 6
+PASS doMultiplyConstant3(4) is 12
+PASS doMultiplyConstant4(1) is 4
+PASS doMultiplyConstant4(2) is 8
+PASS doMultiplyConstant4(4) is 16
+PASS doMultiplyConstant2(1) is 2
+PASS doMultiplyConstant2(2) is 4
+PASS doMultiplyConstant2(4) is 8
+PASS doMultiplyConstant3(1) is 3
+PASS doMultiplyConstant3(2) is 6
+PASS doMultiplyConstant3(4) is 12
+PASS doMultiplyConstant4(1) is 4
+PASS doMultiplyConstant4(2) is 8
+PASS doMultiplyConstant4(4) is 16
+PASS doMultiplyConstant2(1) is 2
+PASS doMultiplyConstant2(2) is 4
+PASS doMultiplyConstant2(4) is 8
+PASS doMultiplyConstant3(1) is 3
+PASS doMultiplyConstant3(2) is 6
+PASS doMultiplyConstant3(4) is 12
+PASS doMultiplyConstant4(1) is 4
+PASS doMultiplyConstant4(2) is 8
+PASS doMultiplyConstant4(4) is 16
+PASS doMultiplyConstant2(1) is 2
+PASS doMultiplyConstant2(2) is 4
+PASS doMultiplyConstant2(4) is 8
+PASS doMultiplyConstant3(1) is 3
+PASS doMultiplyConstant3(2) is 6
+PASS doMultiplyConstant3(4) is 12
+PASS doMultiplyConstant4(1) is 4
+PASS doMultiplyConstant4(2) is 8
+PASS doMultiplyConstant4(4) is 16
+PASS doMultiplyConstant2(1) is 2
+PASS doMultiplyConstant2(2) is 4
+PASS doMultiplyConstant2(4) is 8
+PASS doMultiplyConstant3(1) is 3
+PASS doMultiplyConstant3(2) is 6
+PASS doMultiplyConstant3(4) is 12
+PASS doMultiplyConstant4(1) is 4
+PASS doMultiplyConstant4(2) is 8
+PASS doMultiplyConstant4(4) is 16
+PASS doMultiplyConstant2(1) is 2
+PASS doMultiplyConstant2(2) is 4
+PASS doMultiplyConstant2(4) is 8
+PASS doMultiplyConstant3(1) is 3
+PASS doMultiplyConstant3(2) is 6
+PASS doMultiplyConstant3(4) is 12
+PASS doMultiplyConstant4(1) is 4
+PASS doMultiplyConstant4(2) is 8
+PASS doMultiplyConstant4(4) is 16
+PASS doMultiplyConstant2(1) is 2
+PASS doMultiplyConstant2(2) is 4
+PASS doMultiplyConstant2(4) is 8
+PASS doMultiplyConstant3(1) is 3
+PASS doMultiplyConstant3(2) is 6
+PASS doMultiplyConstant3(4) is 12
+PASS doMultiplyConstant4(1) is 4
+PASS doMultiplyConstant4(2) is 8
+PASS doMultiplyConstant4(4) is 16
+PASS doMultiplyConstant2(1) is 2
+PASS doMultiplyConstant2(2) is 4
+PASS doMultiplyConstant2(4) is 8
+PASS doMultiplyConstant3(1) is 3
+PASS doMultiplyConstant3(2) is 6
+PASS doMultiplyConstant3(4) is 12
+PASS doMultiplyConstant4(1) is 4
+PASS doMultiplyConstant4(2) is 8
+PASS doMultiplyConstant4(4) is 16
+PASS doMultiplyConstant2(1) is 2
+PASS doMultiplyConstant2(2) is 4
+PASS doMultiplyConstant2(4) is 8
+PASS doMultiplyConstant3(1) is 3
+PASS doMultiplyConstant3(2) is 6
+PASS doMultiplyConstant3(4) is 12
+PASS doMultiplyConstant4(1) is 4
+PASS doMultiplyConstant4(2) is 8
+PASS doMultiplyConstant4(4) is 16
+PASS doMultiplyConstant2(1) is 2
+PASS doMultiplyConstant2(2) is 4
+PASS doMultiplyConstant2(4) is 8
+PASS doMultiplyConstant3(1) is 3
+PASS doMultiplyConstant3(2) is 6
+PASS doMultiplyConstant3(4) is 12
+PASS doMultiplyConstant4(1) is 4
+PASS doMultiplyConstant4(2) is 8
+PASS doMultiplyConstant4(4) is 16
+PASS doMultiplyConstant2(1) is 2
+PASS doMultiplyConstant2(2) is 4
+PASS doMultiplyConstant2(4) is 8
+PASS doMultiplyConstant3(1) is 3
+PASS doMultiplyConstant3(2) is 6
+PASS doMultiplyConstant3(4) is 12
+PASS doMultiplyConstant4(1) is 4
+PASS doMultiplyConstant4(2) is 8
+PASS doMultiplyConstant4(4) is 16
+PASS doMultiplyConstant2(1) is 2
+PASS doMultiplyConstant2(2) is 4
+PASS doMultiplyConstant2(4) is 8
+PASS doMultiplyConstant3(1) is 3
+PASS doMultiplyConstant3(2) is 6
+PASS doMultiplyConstant3(4) is 12
+PASS doMultiplyConstant4(1) is 4
+PASS doMultiplyConstant4(2) is 8
+PASS doMultiplyConstant4(4) is 16
+PASS doMultiplyConstant2(1073741824) is 2147483648
+PASS doMultiplyConstant2(2147483648) is 4294967296
+PASS doMultiplyConstant3(1073741824) is 3221225472
+PASS doMultiplyConstant3(2147483648) is 6442450944
+PASS doMultiplyConstant4(1073741824) is 4294967296
+PASS doMultiplyConstant4(2147483648) is 8589934592
+PASS doMultiplyConstant2(-1073741824) is -2147483648
+PASS doMultiplyConstant2(-2147483648) is -4294967296
+PASS doMultiplyConstant3(-1073741824) is -3221225472
+PASS doMultiplyConstant3(-2147483648) is -6442450944
+PASS doMultiplyConstant4(-1073741824) is -4294967296
+PASS doMultiplyConstant4(-2147483648) is -8589934592
+PASS doMultiplyConstant2(1073741824) is 2147483648
+PASS doMultiplyConstant2(2147483648) is 4294967296
+PASS doMultiplyConstant3(1073741824) is 3221225472
+PASS doMultiplyConstant3(2147483648) is 6442450944
+PASS doMultiplyConstant4(1073741824) is 4294967296
+PASS doMultiplyConstant4(2147483648) is 8589934592
+PASS doMultiplyConstant2(-1073741824) is -2147483648
+PASS doMultiplyConstant2(-2147483648) is -4294967296
+PASS doMultiplyConstant3(-1073741824) is -3221225472
+PASS doMultiplyConstant3(-2147483648) is -6442450944
+PASS doMultiplyConstant4(-1073741824) is -4294967296
+PASS doMultiplyConstant4(-2147483648) is -8589934592
+PASS doMultiplyConstant2(1073741824) is 2147483648
+PASS doMultiplyConstant2(2147483648) is 4294967296
+PASS doMultiplyConstant3(1073741824) is 3221225472
+PASS doMultiplyConstant3(2147483648) is 6442450944
+PASS doMultiplyConstant4(1073741824) is 4294967296
+PASS doMultiplyConstant4(2147483648) is 8589934592
+PASS doMultiplyConstant2(-1073741824) is -2147483648
+PASS doMultiplyConstant2(-2147483648) is -4294967296
+PASS doMultiplyConstant3(-1073741824) is -3221225472
+PASS doMultiplyConstant3(-2147483648) is -6442450944
+PASS doMultiplyConstant4(-1073741824) is -4294967296
+PASS doMultiplyConstant4(-2147483648) is -8589934592
+PASS doMultiplyConstant2(1073741824) is 2147483648
+PASS doMultiplyConstant2(2147483648) is 4294967296
+PASS doMultiplyConstant3(1073741824) is 3221225472
+PASS doMultiplyConstant3(2147483648) is 6442450944
+PASS doMultiplyConstant4(1073741824) is 4294967296
+PASS doMultiplyConstant4(2147483648) is 8589934592
+PASS doMultiplyConstant2(-1073741824) is -2147483648
+PASS doMultiplyConstant2(-2147483648) is -4294967296
+PASS doMultiplyConstant3(-1073741824) is -3221225472
+PASS doMultiplyConstant3(-2147483648) is -6442450944
+PASS doMultiplyConstant4(-1073741824) is -4294967296
+PASS doMultiplyConstant4(-2147483648) is -8589934592
+PASS doMultiplyConstant2(1073741824) is 2147483648
+PASS doMultiplyConstant2(2147483648) is 4294967296
+PASS doMultiplyConstant3(1073741824) is 3221225472
+PASS doMultiplyConstant3(2147483648) is 6442450944
+PASS doMultiplyConstant4(1073741824) is 4294967296
+PASS doMultiplyConstant4(2147483648) is 8589934592
+PASS doMultiplyConstant2(-1073741824) is -2147483648
+PASS doMultiplyConstant2(-2147483648) is -4294967296
+PASS doMultiplyConstant3(-1073741824) is -3221225472
+PASS doMultiplyConstant3(-2147483648) is -6442450944
+PASS doMultiplyConstant4(-1073741824) is -4294967296
+PASS doMultiplyConstant4(-2147483648) is -8589934592
+PASS doMultiplyConstant2(1073741824) is 2147483648
+PASS doMultiplyConstant2(2147483648) is 4294967296
+PASS doMultiplyConstant3(1073741824) is 3221225472
+PASS doMultiplyConstant3(2147483648) is 6442450944
+PASS doMultiplyConstant4(1073741824) is 4294967296
+PASS doMultiplyConstant4(2147483648) is 8589934592
+PASS doMultiplyConstant2(-1073741824) is -2147483648
+PASS doMultiplyConstant2(-2147483648) is -4294967296
+PASS doMultiplyConstant3(-1073741824) is -3221225472
+PASS doMultiplyConstant3(-2147483648) is -6442450944
+PASS doMultiplyConstant4(-1073741824) is -4294967296
+PASS doMultiplyConstant4(-2147483648) is -8589934592
+PASS doMultiplyConstant2(1073741824) is 2147483648
+PASS doMultiplyConstant2(2147483648) is 4294967296
+PASS doMultiplyConstant3(1073741824) is 3221225472
+PASS doMultiplyConstant3(2147483648) is 6442450944
+PASS doMultiplyConstant4(1073741824) is 4294967296
+PASS doMultiplyConstant4(2147483648) is 8589934592
+PASS doMultiplyConstant2(-1073741824) is -2147483648
+PASS doMultiplyConstant2(-2147483648) is -4294967296
+PASS doMultiplyConstant3(-1073741824) is -3221225472
+PASS doMultiplyConstant3(-2147483648) is -6442450944
+PASS doMultiplyConstant4(-1073741824) is -4294967296
+PASS doMultiplyConstant4(-2147483648) is -8589934592
+PASS doMultiplyConstant2(1073741824) is 2147483648
+PASS doMultiplyConstant2(2147483648) is 4294967296
+PASS doMultiplyConstant3(1073741824) is 3221225472
+PASS doMultiplyConstant3(2147483648) is 6442450944
+PASS doMultiplyConstant4(1073741824) is 4294967296
+PASS doMultiplyConstant4(2147483648) is 8589934592
+PASS doMultiplyConstant2(-1073741824) is -2147483648
+PASS doMultiplyConstant2(-2147483648) is -4294967296
+PASS doMultiplyConstant3(-1073741824) is -3221225472
+PASS doMultiplyConstant3(-2147483648) is -6442450944
+PASS doMultiplyConstant4(-1073741824) is -4294967296
+PASS doMultiplyConstant4(-2147483648) is -8589934592
+PASS doMultiplyConstant2(1073741824) is 2147483648
+PASS doMultiplyConstant2(2147483648) is 4294967296
+PASS doMultiplyConstant3(1073741824) is 3221225472
+PASS doMultiplyConstant3(2147483648) is 6442450944
+PASS doMultiplyConstant4(1073741824) is 4294967296
+PASS doMultiplyConstant4(2147483648) is 8589934592
+PASS doMultiplyConstant2(-1073741824) is -2147483648
+PASS doMultiplyConstant2(-2147483648) is -4294967296
+PASS doMultiplyConstant3(-1073741824) is -3221225472
+PASS doMultiplyConstant3(-2147483648) is -6442450944
+PASS doMultiplyConstant4(-1073741824) is -4294967296
+PASS doMultiplyConstant4(-2147483648) is -8589934592
+PASS doMultiplyConstant2(1073741824) is 2147483648
+PASS doMultiplyConstant2(2147483648) is 4294967296
+PASS doMultiplyConstant3(1073741824) is 3221225472
+PASS doMultiplyConstant3(2147483648) is 6442450944
+PASS doMultiplyConstant4(1073741824) is 4294967296
+PASS doMultiplyConstant4(2147483648) is 8589934592
+PASS doMultiplyConstant2(-1073741824) is -2147483648
+PASS doMultiplyConstant2(-2147483648) is -4294967296
+PASS doMultiplyConstant3(-1073741824) is -3221225472
+PASS doMultiplyConstant3(-2147483648) is -6442450944
+PASS doMultiplyConstant4(-1073741824) is -4294967296
+PASS doMultiplyConstant4(-2147483648) is -8589934592
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/LayoutTests/fast/js/dfg-multiply.html b/LayoutTests/fast/js/dfg-multiply.html
new file mode 100644 (file)
index 0000000..6990f1e
--- /dev/null
@@ -0,0 +1,10 @@
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
+<html>
+<head>
+<script src="resources/js-test-pre.js"></script>
+</head>
+<body>
+<script src="script-tests/dfg-multiply.js"></script>
+<script src="resources/js-test-post.js"></script>
+</body>
+</html>
diff --git a/LayoutTests/fast/js/script-tests/dfg-multiply.js b/LayoutTests/fast/js/script-tests/dfg-multiply.js
new file mode 100644 (file)
index 0000000..0fd7521
--- /dev/null
@@ -0,0 +1,45 @@
+description(
+"This tests that the DFG can multiply numbers correctly."
+);
+
+function doMultiplyConstant2(a) {
+    return a * 2;
+}
+
+function doMultiplyConstant3(a) {
+    return a * 3;
+}
+
+function doMultiplyConstant4(a) {
+    return a * 4;
+}
+
+// Get it to compile.
+for (var i = 0; i < 100; ++i) {
+    shouldBe("doMultiplyConstant2(1)", "2");
+    shouldBe("doMultiplyConstant2(2)", "4");
+    shouldBe("doMultiplyConstant2(4)", "8");
+    shouldBe("doMultiplyConstant3(1)", "3");
+    shouldBe("doMultiplyConstant3(2)", "6");
+    shouldBe("doMultiplyConstant3(4)", "12");
+    shouldBe("doMultiplyConstant4(1)", "4");
+    shouldBe("doMultiplyConstant4(2)", "8");
+    shouldBe("doMultiplyConstant4(4)", "16");
+}
+
+// Now do evil.
+for (var i = 0; i < 10; ++i) {
+    shouldBe("doMultiplyConstant2(1073741824)", "2147483648");
+    shouldBe("doMultiplyConstant2(2147483648)", "4294967296");
+    shouldBe("doMultiplyConstant3(1073741824)", "3221225472");
+    shouldBe("doMultiplyConstant3(2147483648)", "6442450944");
+    shouldBe("doMultiplyConstant4(1073741824)", "4294967296");
+    shouldBe("doMultiplyConstant4(2147483648)", "8589934592");
+    shouldBe("doMultiplyConstant2(-1073741824)", "-2147483648");
+    shouldBe("doMultiplyConstant2(-2147483648)", "-4294967296");
+    shouldBe("doMultiplyConstant3(-1073741824)", "-3221225472");
+    shouldBe("doMultiplyConstant3(-2147483648)", "-6442450944");
+    shouldBe("doMultiplyConstant4(-1073741824)", "-4294967296");
+    shouldBe("doMultiplyConstant4(-2147483648)", "-8589934592");
+}
+
index 457e6fd..48989b7 100644 (file)
@@ -1,3 +1,16 @@
+2011-12-09  Filip Pizlo  <fpizlo@apple.com>
+
+        DFG ArithMul power-of-two case does not check for overflow
+        https://bugs.webkit.org/show_bug.cgi?id=74230
+
+        Reviewed by Gavin Barraclough.
+        
+        Disabled power-of-2 peephole optimization for multiplication, because it was wrong,
+        and any attempt to fix it would likely introduce code bloat and register pressure.
+
+        * dfg/DFGSpeculativeJIT.cpp:
+        (JSC::DFG::SpeculativeJIT::compileArithMul):
+
 2011-12-09  David Levin  <levin@chromium.org>
 
         REGRESSION(r101863-r102042): Assertion hit: m_verifier.isSafeToUse() in RefCountedBase::ref in FunctionCodeBlock
index 51a64ca..51015d3 100644 (file)
@@ -1910,22 +1910,6 @@ static bool isPowerOfTwo(int32_t num)
     return num && !(num & (num - 1));
 }
 
-// This routine is copied from FastMalloc
-static int32_t logTwo(int32_t num)
-{
-    int32_t log = 0;
-    for (int32_t i = 4; i >= 0; --i) {
-        int32_t shift = (1 << i);
-        int32_t x = num >> shift;
-        if (x) {
-            num = x;
-            log += shift;
-        }
-    }
-    ASSERT(num == 1);
-    return log;
-}
-
 void SpeculativeJIT::compileSoftModulo(Node& node)
 {
     bool shouldGeneratePowerOfTwoCheck = true;
@@ -2092,47 +2076,6 @@ void SpeculativeJIT::compileSoftModulo(Node& node)
 void SpeculativeJIT::compileArithMul(Node& node)
 {
     if (Node::shouldSpeculateInteger(at(node.child1()), at(node.child2())) && node.canSpeculateInteger()) {
-        if (isInt32Constant(node.child2()) && !nodeMayOverflow(node.arithNodeFlags())) {
-            int32_t multiplier = valueOfInt32Constant(node.child2());
-            bool negative = false;
-            if (multiplier < 0) {
-                multiplier = -multiplier;
-                negative = true;
-            }
-
-            if (!multiplier) {
-                GPRTemporary result(this);
-                GPRReg resultGPR = result.gpr();
-
-                if (!nodeCanIgnoreNegativeZero(node.arithNodeFlags())) {
-                    SpeculateIntegerOperand op1(this, node.child1());
-                    speculationCheck(JSValueRegs(), NoNode, m_jit.branch32(MacroAssembler::LessThan, op1.gpr(), TrustedImm32(0)));
-                }
-
-                m_jit.move(TrustedImm32(0), resultGPR);
-                integerResult(resultGPR, m_compileIndex);
-                return;
-            }
-
-            if (isPowerOfTwo(multiplier)) {
-                int log = logTwo(multiplier);
-                SpeculateIntegerOperand op1(this, node.child1());
-                GPRTemporary result(this, op1);
-                GPRReg op1GPR = op1.gpr();
-                GPRReg resultGPR = result.gpr();
-
-                if (negative && !nodeCanIgnoreNegativeZero(node.arithNodeFlags()))
-                    speculationCheck(JSValueRegs(), NoNode, m_jit.branchTest32(MacroAssembler::Zero, op1GPR));
-
-                m_jit.lshift32(op1GPR, TrustedImm32(log), resultGPR);
-                if (negative)
-                    m_jit.neg32(resultGPR);
-
-                integerResult(resultGPR, m_compileIndex);
-                return;
-            }
-        }
-
         SpeculateIntegerOperand op1(this, node.child1());
         SpeculateIntegerOperand op2(this, node.child2());
         GPRTemporary result(this);