1// Copyright 2008 the V8 project authors. All rights reserved.
2// Redistribution and use in source and binary forms, with or without
3// modification, are permitted provided that the following conditions are
4// met:
5//
6//     * Redistributions of source code must retain the above copyright
7//       notice, this list of conditions and the following disclaimer.
8//     * Redistributions in binary form must reproduce the above
9//       copyright notice, this list of conditions and the following
10//       disclaimer in the documentation and/or other materials provided
11//       with the distribution.
12//     * Neither the name of Google Inc. nor the names of its
13//       contributors may be used to endorse or promote products derived
14//       from this software without specific prior written permission.
15//
16// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27
28var x;
29
30// Converts a number to string respecting -0.
31function stringify(n) {
32  if ((1 / n) === -Infinity) return "-0";
33  return String(n);
34}
35
36function f(expected, y) {
37  function testEval(string, x, y) {
38    var mulFunction = Function("x, y", "return " + string);
39    return mulFunction(x, y);
40  }
41  function mulTest(expected, x, y) {
42    assertEquals(expected, x * y);
43    assertEquals(expected, testEval(stringify(x) + " * y", x, y));
44    assertEquals(expected, testEval("x * " + stringify(y), x, y));
45    assertEquals(expected, testEval(stringify(x) + " * " + stringify(y), x, y));
46  }
47  mulTest(expected, x, y);
48  mulTest(-expected, -x, y);
49  mulTest(-expected, x, -y);
50  mulTest(expected, -x, -y);
51  if (x === y) return;  // Symmetric cases not necessary.
52  mulTest(expected, y, x);
53  mulTest(-expected, -y, x);
54  mulTest(-expected, y, -x);
55  mulTest(expected, -y, -x);
56}
57
58x = 16385;
59f(0, 0);
60f(16385, 1);
61f(32770, 2);
62f(49155, 3);
63f(65540, 4);
64f(81925, 5);
65f(114695, 7);
66f(131080, 8);
67f(147465, 9);
68f(245775, 15);
69f(262160, 16);
70f(278545, 17);
71f(507935, 31);
72f(524320, 32);
73f(540705, 33);
74f(1032255, 63);
75f(1048640, 64);
76f(1065025, 65);
77f(2080895, 127);
78f(2097280, 128);
79f(2113665, 129);
80f(4178175, 255);
81f(4194560, 256);
82f(4210945, 257);
83f(8372735, 511);
84f(8389120, 512);
85f(8405505, 513);
86f(16761855, 1023);
87f(16778240, 1024);
88f(16794625, 1025);
89f(33540095, 2047);
90f(33556480, 2048);
91f(33572865, 2049);
92f(67096575, 4095);
93f(67112960, 4096);
94f(67129345, 4097);
95f(134209535, 8191);
96f(134225920, 8192);
97f(134242305, 8193);
98f(268435455, 16383);
99f(268451840, 16384);
100f(268468225, 16385);
101x = 32767;
102f(0, 0);
103f(32767, 1);
104f(65534, 2);
105f(98301, 3);
106f(131068, 4);
107f(163835, 5);
108f(229369, 7);
109f(262136, 8);
110f(294903, 9);
111f(491505, 15);
112f(524272, 16);
113f(557039, 17);
114f(1015777, 31);
115f(1048544, 32);
116f(1081311, 33);
117f(2064321, 63);
118f(2097088, 64);
119f(2129855, 65);
120f(4161409, 127);
121f(4194176, 128);
122f(4226943, 129);
123f(8355585, 255);
124f(8388352, 256);
125f(8421119, 257);
126f(16743937, 511);
127f(16776704, 512);
128f(16809471, 513);
129f(33520641, 1023);
130f(33553408, 1024);
131f(33586175, 1025);
132f(67074049, 2047);
133f(67106816, 2048);
134f(67139583, 2049);
135f(134180865, 4095);
136f(134213632, 4096);
137f(134246399, 4097);
138f(268394497, 8191);
139f(268427264, 8192);
140f(268460031, 8193);
141f(536821761, 16383);
142f(536854528, 16384);
143f(536887295, 16385);
144f(1073676289, 32767);
145x = 32768;
146f(0, 0);
147f(32768, 1);
148f(65536, 2);
149f(98304, 3);
150f(131072, 4);
151f(163840, 5);
152f(229376, 7);
153f(262144, 8);
154f(294912, 9);
155f(491520, 15);
156f(524288, 16);
157f(557056, 17);
158f(1015808, 31);
159f(1048576, 32);
160f(1081344, 33);
161f(2064384, 63);
162f(2097152, 64);
163f(2129920, 65);
164f(4161536, 127);
165f(4194304, 128);
166f(4227072, 129);
167f(8355840, 255);
168f(8388608, 256);
169f(8421376, 257);
170f(16744448, 511);
171f(16777216, 512);
172f(16809984, 513);
173f(33521664, 1023);
174f(33554432, 1024);
175f(33587200, 1025);
176f(67076096, 2047);
177f(67108864, 2048);
178f(67141632, 2049);
179f(134184960, 4095);
180f(134217728, 4096);
181f(134250496, 4097);
182f(268402688, 8191);
183f(268435456, 8192);
184f(268468224, 8193);
185f(536838144, 16383);
186f(536870912, 16384);
187f(536903680, 16385);
188f(1073709056, 32767);
189f(1073741824, 32768);
190x = 32769;
191f(0, 0);
192f(32769, 1);
193f(65538, 2);
194f(98307, 3);
195f(131076, 4);
196f(163845, 5);
197f(229383, 7);
198f(262152, 8);
199f(294921, 9);
200f(491535, 15);
201f(524304, 16);
202f(557073, 17);
203f(1015839, 31);
204f(1048608, 32);
205f(1081377, 33);
206f(2064447, 63);
207f(2097216, 64);
208f(2129985, 65);
209f(4161663, 127);
210f(4194432, 128);
211f(4227201, 129);
212f(8356095, 255);
213f(8388864, 256);
214f(8421633, 257);
215f(16744959, 511);
216f(16777728, 512);
217f(16810497, 513);
218f(33522687, 1023);
219f(33555456, 1024);
220f(33588225, 1025);
221f(67078143, 2047);
222f(67110912, 2048);
223f(67143681, 2049);
224f(134189055, 4095);
225f(134221824, 4096);
226f(134254593, 4097);
227f(268410879, 8191);
228f(268443648, 8192);
229f(268476417, 8193);
230f(536854527, 16383);
231f(536887296, 16384);
232f(536920065, 16385);
233f(1073741823, 32767);
234f(1073774592, 32768);
235f(1073807361, 32769);
236x = 65535;
237f(0, 0);
238f(65535, 1);
239f(131070, 2);
240f(196605, 3);
241f(262140, 4);
242f(327675, 5);
243f(458745, 7);
244f(524280, 8);
245f(589815, 9);
246f(983025, 15);
247f(1048560, 16);
248f(1114095, 17);
249f(2031585, 31);
250f(2097120, 32);
251f(2162655, 33);
252f(4128705, 63);
253f(4194240, 64);
254f(4259775, 65);
255f(8322945, 127);
256f(8388480, 128);
257f(8454015, 129);
258f(16711425, 255);
259f(16776960, 256);
260f(16842495, 257);
261f(33488385, 511);
262f(33553920, 512);
263f(33619455, 513);
264f(67042305, 1023);
265f(67107840, 1024);
266f(67173375, 1025);
267f(134150145, 2047);
268f(134215680, 2048);
269f(134281215, 2049);
270f(268365825, 4095);
271f(268431360, 4096);
272f(268496895, 4097);
273f(536797185, 8191);
274f(536862720, 8192);
275f(536928255, 8193);
276f(1073659905, 16383);
277f(1073725440, 16384);
278f(1073790975, 16385);
279f(2147385345, 32767);
280f(2147450880, 32768);
281f(2147516415, 32769);
282f(4294836225, 65535);
283x = 65536;
284f(0, 0);
285f(65536, 1);
286f(131072, 2);
287f(196608, 3);
288f(262144, 4);
289f(327680, 5);
290f(458752, 7);
291f(524288, 8);
292f(589824, 9);
293f(983040, 15);
294f(1048576, 16);
295f(1114112, 17);
296f(2031616, 31);
297f(2097152, 32);
298f(2162688, 33);
299f(4128768, 63);
300f(4194304, 64);
301f(4259840, 65);
302f(8323072, 127);
303f(8388608, 128);
304f(8454144, 129);
305f(16711680, 255);
306f(16777216, 256);
307f(16842752, 257);
308f(33488896, 511);
309f(33554432, 512);
310f(33619968, 513);
311f(67043328, 1023);
312f(67108864, 1024);
313f(67174400, 1025);
314f(134152192, 2047);
315f(134217728, 2048);
316f(134283264, 2049);
317f(268369920, 4095);
318f(268435456, 4096);
319f(268500992, 4097);
320f(536805376, 8191);
321f(536870912, 8192);
322f(536936448, 8193);
323f(1073676288, 16383);
324f(1073741824, 16384);
325f(1073807360, 16385);
326f(2147418112, 32767);
327f(2147483648, 32768);
328f(2147549184, 32769);
329f(4294901760, 65535);
330f(4294967296, 65536);
331x = 65537;
332f(0, 0);
333f(65537, 1);
334f(131074, 2);
335f(196611, 3);
336f(262148, 4);
337f(327685, 5);
338f(458759, 7);
339f(524296, 8);
340f(589833, 9);
341f(983055, 15);
342f(1048592, 16);
343f(1114129, 17);
344f(2031647, 31);
345f(2097184, 32);
346f(2162721, 33);
347f(4128831, 63);
348f(4194368, 64);
349f(4259905, 65);
350f(8323199, 127);
351f(8388736, 128);
352f(8454273, 129);
353f(16711935, 255);
354f(16777472, 256);
355f(16843009, 257);
356f(33489407, 511);
357f(33554944, 512);
358f(33620481, 513);
359f(67044351, 1023);
360f(67109888, 1024);
361f(67175425, 1025);
362f(134154239, 2047);
363f(134219776, 2048);
364f(134285313, 2049);
365f(268374015, 4095);
366f(268439552, 4096);
367f(268505089, 4097);
368f(536813567, 8191);
369f(536879104, 8192);
370f(536944641, 8193);
371f(1073692671, 16383);
372f(1073758208, 16384);
373f(1073823745, 16385);
374f(2147450879, 32767);
375f(2147516416, 32768);
376f(2147581953, 32769);
377f(4294967295, 65535);
378f(4295032832, 65536);
379f(4295098369, 65537);
380x = 131071;
381f(0, 0);
382f(131071, 1);
383f(262142, 2);
384f(393213, 3);
385f(524284, 4);
386f(655355, 5);
387f(917497, 7);
388f(1048568, 8);
389f(1179639, 9);
390f(1966065, 15);
391f(2097136, 16);
392f(2228207, 17);
393f(4063201, 31);
394f(4194272, 32);
395f(4325343, 33);
396f(8257473, 63);
397f(8388544, 64);
398f(8519615, 65);
399f(16646017, 127);
400f(16777088, 128);
401f(16908159, 129);
402f(33423105, 255);
403f(33554176, 256);
404f(33685247, 257);
405f(66977281, 511);
406f(67108352, 512);
407f(67239423, 513);
408f(134085633, 1023);
409f(134216704, 1024);
410f(134347775, 1025);
411f(268302337, 2047);
412f(268433408, 2048);
413f(268564479, 2049);
414f(536735745, 4095);
415f(536866816, 4096);
416f(536997887, 4097);
417f(1073602561, 8191);
418f(1073733632, 8192);
419f(1073864703, 8193);
420f(2147336193, 16383);
421f(2147467264, 16384);
422f(2147598335, 16385);
423f(4294803457, 32767);
424f(4294934528, 32768);
425f(4295065599, 32769);
426f(8589737985, 65535);
427f(8589869056, 65536);
428f(8590000127, 65537);
429f(17179607041, 131071);
430x = 131072;
431f(0, 0);
432f(131072, 1);
433f(262144, 2);
434f(393216, 3);
435f(524288, 4);
436f(655360, 5);
437f(917504, 7);
438f(1048576, 8);
439f(1179648, 9);
440f(1966080, 15);
441f(2097152, 16);
442f(2228224, 17);
443f(4063232, 31);
444f(4194304, 32);
445f(4325376, 33);
446f(8257536, 63);
447f(8388608, 64);
448f(8519680, 65);
449f(16646144, 127);
450f(16777216, 128);
451f(16908288, 129);
452f(33423360, 255);
453f(33554432, 256);
454f(33685504, 257);
455f(66977792, 511);
456f(67108864, 512);
457f(67239936, 513);
458f(134086656, 1023);
459f(134217728, 1024);
460f(134348800, 1025);
461f(268304384, 2047);
462f(268435456, 2048);
463f(268566528, 2049);
464f(536739840, 4095);
465f(536870912, 4096);
466f(537001984, 4097);
467f(1073610752, 8191);
468f(1073741824, 8192);
469f(1073872896, 8193);
470f(2147352576, 16383);
471f(2147483648, 16384);
472f(2147614720, 16385);
473f(4294836224, 32767);
474f(4294967296, 32768);
475f(4295098368, 32769);
476f(8589803520, 65535);
477f(8589934592, 65536);
478f(8590065664, 65537);
479f(17179738112, 131071);
480f(17179869184, 131072);
481x = 131073;
482f(0, 0);
483f(131073, 1);
484f(262146, 2);
485f(393219, 3);
486f(524292, 4);
487f(655365, 5);
488f(917511, 7);
489f(1048584, 8);
490f(1179657, 9);
491f(1966095, 15);
492f(2097168, 16);
493f(2228241, 17);
494f(4063263, 31);
495f(4194336, 32);
496f(4325409, 33);
497f(8257599, 63);
498f(8388672, 64);
499f(8519745, 65);
500f(16646271, 127);
501f(16777344, 128);
502f(16908417, 129);
503f(33423615, 255);
504f(33554688, 256);
505f(33685761, 257);
506f(66978303, 511);
507f(67109376, 512);
508f(67240449, 513);
509f(134087679, 1023);
510f(134218752, 1024);
511f(134349825, 1025);
512f(268306431, 2047);
513f(268437504, 2048);
514f(268568577, 2049);
515f(536743935, 4095);
516f(536875008, 4096);
517f(537006081, 4097);
518f(1073618943, 8191);
519f(1073750016, 8192);
520f(1073881089, 8193);
521f(2147368959, 16383);
522f(2147500032, 16384);
523f(2147631105, 16385);
524f(4294868991, 32767);
525f(4295000064, 32768);
526f(4295131137, 32769);
527f(8589869055, 65535);
528f(8590000128, 65536);
529f(8590131201, 65537);
530f(17179869183, 131071);
531f(17180000256, 131072);
532f(17180131329, 131073);
533