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 = 8388607;
59f(0, 0);
60f(8388607, 1);
61f(16777214, 2);
62f(25165821, 3);
63f(33554428, 4);
64f(41943035, 5);
65f(58720249, 7);
66f(67108856, 8);
67f(75497463, 9);
68f(125829105, 15);
69f(134217712, 16);
70f(142606319, 17);
71f(260046817, 31);
72f(268435424, 32);
73f(276824031, 33);
74f(528482241, 63);
75f(536870848, 64);
76f(545259455, 65);
77f(1065353089, 127);
78f(1073741696, 128);
79f(1082130303, 129);
80f(2139094785, 255);
81f(2147483392, 256);
82f(2155871999, 257);
83f(4286578177, 511);
84f(4294966784, 512);
85f(4303355391, 513);
86f(8581544961, 1023);
87f(8589933568, 1024);
88f(8598322175, 1025);
89f(17171478529, 2047);
90f(17179867136, 2048);
91f(17188255743, 2049);
92f(34351345665, 4095);
93f(34359734272, 4096);
94f(34368122879, 4097);
95f(68711079937, 8191);
96f(68719468544, 8192);
97f(68727857151, 8193);
98f(137430548481, 16383);
99f(137438937088, 16384);
100f(137447325695, 16385);
101f(274869485569, 32767);
102f(274877874176, 32768);
103f(274886262783, 32769);
104f(549747359745, 65535);
105f(549755748352, 65536);
106f(549764136959, 65537);
107f(1099503108097, 131071);
108f(1099511496704, 131072);
109f(1099519885311, 131073);
110f(2199014604801, 262143);
111f(2199022993408, 262144);
112f(2199031382015, 262145);
113f(4398037598209, 524287);
114f(4398045986816, 524288);
115f(4398054375423, 524289);
116f(8796083585025, 1048575);
117f(8796091973632, 1048576);
118f(8796100362239, 1048577);
119f(17592175558657, 2097151);
120f(17592183947264, 2097152);
121f(17592192335871, 2097153);
122f(35184359505921, 4194303);
123f(35184367894528, 4194304);
124f(35184376283135, 4194305);
125f(70368727400449, 8388607);
126x = 8388608;
127f(0, 0);
128f(8388608, 1);
129f(16777216, 2);
130f(25165824, 3);
131f(33554432, 4);
132f(41943040, 5);
133f(58720256, 7);
134f(67108864, 8);
135f(75497472, 9);
136f(125829120, 15);
137f(134217728, 16);
138f(142606336, 17);
139f(260046848, 31);
140f(268435456, 32);
141f(276824064, 33);
142f(528482304, 63);
143f(536870912, 64);
144f(545259520, 65);
145f(1065353216, 127);
146f(1073741824, 128);
147f(1082130432, 129);
148f(2139095040, 255);
149f(2147483648, 256);
150f(2155872256, 257);
151f(4286578688, 511);
152f(4294967296, 512);
153f(4303355904, 513);
154f(8581545984, 1023);
155f(8589934592, 1024);
156f(8598323200, 1025);
157f(17171480576, 2047);
158f(17179869184, 2048);
159f(17188257792, 2049);
160f(34351349760, 4095);
161f(34359738368, 4096);
162f(34368126976, 4097);
163f(68711088128, 8191);
164f(68719476736, 8192);
165f(68727865344, 8193);
166f(137430564864, 16383);
167f(137438953472, 16384);
168f(137447342080, 16385);
169f(274869518336, 32767);
170f(274877906944, 32768);
171f(274886295552, 32769);
172f(549747425280, 65535);
173f(549755813888, 65536);
174f(549764202496, 65537);
175f(1099503239168, 131071);
176f(1099511627776, 131072);
177f(1099520016384, 131073);
178f(2199014866944, 262143);
179f(2199023255552, 262144);
180f(2199031644160, 262145);
181f(4398038122496, 524287);
182f(4398046511104, 524288);
183f(4398054899712, 524289);
184f(8796084633600, 1048575);
185f(8796093022208, 1048576);
186f(8796101410816, 1048577);
187f(17592177655808, 2097151);
188f(17592186044416, 2097152);
189f(17592194433024, 2097153);
190f(35184363700224, 4194303);
191f(35184372088832, 4194304);
192f(35184380477440, 4194305);
193f(70368735789056, 8388607);
194f(70368744177664, 8388608);
195x = 8388609;
196f(0, 0);
197f(8388609, 1);
198f(16777218, 2);
199f(25165827, 3);
200f(33554436, 4);
201f(41943045, 5);
202f(58720263, 7);
203f(67108872, 8);
204f(75497481, 9);
205f(125829135, 15);
206f(134217744, 16);
207f(142606353, 17);
208f(260046879, 31);
209f(268435488, 32);
210f(276824097, 33);
211f(528482367, 63);
212f(536870976, 64);
213f(545259585, 65);
214f(1065353343, 127);
215f(1073741952, 128);
216f(1082130561, 129);
217f(2139095295, 255);
218f(2147483904, 256);
219f(2155872513, 257);
220f(4286579199, 511);
221f(4294967808, 512);
222f(4303356417, 513);
223f(8581547007, 1023);
224f(8589935616, 1024);
225f(8598324225, 1025);
226f(17171482623, 2047);
227f(17179871232, 2048);
228f(17188259841, 2049);
229f(34351353855, 4095);
230f(34359742464, 4096);
231f(34368131073, 4097);
232f(68711096319, 8191);
233f(68719484928, 8192);
234f(68727873537, 8193);
235f(137430581247, 16383);
236f(137438969856, 16384);
237f(137447358465, 16385);
238f(274869551103, 32767);
239f(274877939712, 32768);
240f(274886328321, 32769);
241f(549747490815, 65535);
242f(549755879424, 65536);
243f(549764268033, 65537);
244f(1099503370239, 131071);
245f(1099511758848, 131072);
246f(1099520147457, 131073);
247f(2199015129087, 262143);
248f(2199023517696, 262144);
249f(2199031906305, 262145);
250f(4398038646783, 524287);
251f(4398047035392, 524288);
252f(4398055424001, 524289);
253f(8796085682175, 1048575);
254f(8796094070784, 1048576);
255f(8796102459393, 1048577);
256f(17592179752959, 2097151);
257f(17592188141568, 2097152);
258f(17592196530177, 2097153);
259f(35184367894527, 4194303);
260f(35184376283136, 4194304);
261f(35184384671745, 4194305);
262f(70368744177663, 8388607);
263f(70368752566272, 8388608);
264f(70368760954881, 8388609);
265x = 16777215;
266f(0, 0);
267f(16777215, 1);
268f(33554430, 2);
269f(50331645, 3);
270f(67108860, 4);
271f(83886075, 5);
272f(117440505, 7);
273f(134217720, 8);
274f(150994935, 9);
275f(251658225, 15);
276f(268435440, 16);
277f(285212655, 17);
278f(520093665, 31);
279f(536870880, 32);
280f(553648095, 33);
281f(1056964545, 63);
282f(1073741760, 64);
283f(1090518975, 65);
284f(2130706305, 127);
285f(2147483520, 128);
286f(2164260735, 129);
287f(4278189825, 255);
288f(4294967040, 256);
289f(4311744255, 257);
290f(8573156865, 511);
291f(8589934080, 512);
292f(8606711295, 513);
293f(17163090945, 1023);
294f(17179868160, 1024);
295f(17196645375, 1025);
296f(34342959105, 2047);
297f(34359736320, 2048);
298f(34376513535, 2049);
299f(68702695425, 4095);
300f(68719472640, 4096);
301f(68736249855, 4097);
302f(137422168065, 8191);
303f(137438945280, 8192);
304f(137455722495, 8193);
305f(274861113345, 16383);
306f(274877890560, 16384);
307f(274894667775, 16385);
308f(549739003905, 32767);
309f(549755781120, 32768);
310f(549772558335, 32769);
311f(1099494785025, 65535);
312f(1099511562240, 65536);
313f(1099528339455, 65537);
314f(2199006347265, 131071);
315f(2199023124480, 131072);
316f(2199039901695, 131073);
317f(4398029471745, 262143);
318f(4398046248960, 262144);
319f(4398063026175, 262145);
320f(8796075720705, 524287);
321f(8796092497920, 524288);
322f(8796109275135, 524289);
323f(17592168218625, 1048575);
324f(17592184995840, 1048576);
325f(17592201773055, 1048577);
326f(35184353214465, 2097151);
327f(35184369991680, 2097152);
328f(35184386768895, 2097153);
329f(70368723206145, 4194303);
330f(70368739983360, 4194304);
331f(70368756760575, 4194305);
332f(140737463189505, 8388607);
333f(140737479966720, 8388608);
334f(140737496743935, 8388609);
335f(281474943156225, 16777215);
336x = 16777216;
337f(0, 0);
338f(16777216, 1);
339f(33554432, 2);
340f(50331648, 3);
341f(67108864, 4);
342f(83886080, 5);
343f(117440512, 7);
344f(134217728, 8);
345f(150994944, 9);
346f(251658240, 15);
347f(268435456, 16);
348f(285212672, 17);
349f(520093696, 31);
350f(536870912, 32);
351f(553648128, 33);
352f(1056964608, 63);
353f(1073741824, 64);
354f(1090519040, 65);
355f(2130706432, 127);
356f(2147483648, 128);
357f(2164260864, 129);
358f(4278190080, 255);
359f(4294967296, 256);
360f(4311744512, 257);
361f(8573157376, 511);
362f(8589934592, 512);
363f(8606711808, 513);
364f(17163091968, 1023);
365f(17179869184, 1024);
366f(17196646400, 1025);
367f(34342961152, 2047);
368f(34359738368, 2048);
369f(34376515584, 2049);
370f(68702699520, 4095);
371f(68719476736, 4096);
372f(68736253952, 4097);
373f(137422176256, 8191);
374f(137438953472, 8192);
375f(137455730688, 8193);
376f(274861129728, 16383);
377f(274877906944, 16384);
378f(274894684160, 16385);
379f(549739036672, 32767);
380f(549755813888, 32768);
381f(549772591104, 32769);
382f(1099494850560, 65535);
383f(1099511627776, 65536);
384f(1099528404992, 65537);
385f(2199006478336, 131071);
386f(2199023255552, 131072);
387f(2199040032768, 131073);
388f(4398029733888, 262143);
389f(4398046511104, 262144);
390f(4398063288320, 262145);
391f(8796076244992, 524287);
392f(8796093022208, 524288);
393f(8796109799424, 524289);
394f(17592169267200, 1048575);
395f(17592186044416, 1048576);
396f(17592202821632, 1048577);
397f(35184355311616, 2097151);
398f(35184372088832, 2097152);
399f(35184388866048, 2097153);
400f(70368727400448, 4194303);
401f(70368744177664, 4194304);
402f(70368760954880, 4194305);
403f(140737471578112, 8388607);
404f(140737488355328, 8388608);
405f(140737505132544, 8388609);
406f(281474959933440, 16777215);
407f(281474976710656, 16777216);
408x = 16777217;
409f(0, 0);
410f(16777217, 1);
411f(33554434, 2);
412f(50331651, 3);
413f(67108868, 4);
414f(83886085, 5);
415f(117440519, 7);
416f(134217736, 8);
417f(150994953, 9);
418f(251658255, 15);
419f(268435472, 16);
420f(285212689, 17);
421f(520093727, 31);
422f(536870944, 32);
423f(553648161, 33);
424f(1056964671, 63);
425f(1073741888, 64);
426f(1090519105, 65);
427f(2130706559, 127);
428f(2147483776, 128);
429f(2164260993, 129);
430f(4278190335, 255);
431f(4294967552, 256);
432f(4311744769, 257);
433f(8573157887, 511);
434f(8589935104, 512);
435f(8606712321, 513);
436f(17163092991, 1023);
437f(17179870208, 1024);
438f(17196647425, 1025);
439f(34342963199, 2047);
440f(34359740416, 2048);
441f(34376517633, 2049);
442f(68702703615, 4095);
443f(68719480832, 4096);
444f(68736258049, 4097);
445f(137422184447, 8191);
446f(137438961664, 8192);
447f(137455738881, 8193);
448f(274861146111, 16383);
449f(274877923328, 16384);
450f(274894700545, 16385);
451f(549739069439, 32767);
452f(549755846656, 32768);
453f(549772623873, 32769);
454f(1099494916095, 65535);
455f(1099511693312, 65536);
456f(1099528470529, 65537);
457f(2199006609407, 131071);
458f(2199023386624, 131072);
459f(2199040163841, 131073);
460f(4398029996031, 262143);
461f(4398046773248, 262144);
462f(4398063550465, 262145);
463f(8796076769279, 524287);
464f(8796093546496, 524288);
465f(8796110323713, 524289);
466f(17592170315775, 1048575);
467f(17592187092992, 1048576);
468f(17592203870209, 1048577);
469f(35184357408767, 2097151);
470f(35184374185984, 2097152);
471f(35184390963201, 2097153);
472f(70368731594751, 4194303);
473f(70368748371968, 4194304);
474f(70368765149185, 4194305);
475f(140737479966719, 8388607);
476f(140737496743936, 8388608);
477f(140737513521153, 8388609);
478f(281474976710655, 16777215);
479f(281474993487872, 16777216);
480f(281475010265089, 16777217);
481x = 33554431;
482f(0, 0);
483f(33554431, 1);
484f(67108862, 2);
485f(100663293, 3);
486f(134217724, 4);
487f(167772155, 5);
488f(234881017, 7);
489f(268435448, 8);
490f(301989879, 9);
491f(503316465, 15);
492f(536870896, 16);
493f(570425327, 17);
494f(1040187361, 31);
495f(1073741792, 32);
496f(1107296223, 33);
497f(2113929153, 63);
498f(2147483584, 64);
499f(2181038015, 65);
500f(4261412737, 127);
501f(4294967168, 128);
502f(4328521599, 129);
503f(8556379905, 255);
504f(8589934336, 256);
505f(8623488767, 257);
506f(17146314241, 511);
507f(17179868672, 512);
508f(17213423103, 513);
509f(34326182913, 1023);
510f(34359737344, 1024);
511f(34393291775, 1025);
512f(68685920257, 2047);
513f(68719474688, 2048);
514f(68753029119, 2049);
515f(137405394945, 4095);
516f(137438949376, 4096);
517f(137472503807, 4097);
518f(274844344321, 8191);
519f(274877898752, 8192);
520f(274911453183, 8193);
521f(549722243073, 16383);
522f(549755797504, 16384);
523f(549789351935, 16385);
524f(1099478040577, 32767);
525f(1099511595008, 32768);
526f(1099545149439, 32769);
527f(2198989635585, 65535);
528f(2199023190016, 65536);
529f(2199056744447, 65537);
530f(4398012825601, 131071);
531f(4398046380032, 131072);
532f(4398079934463, 131073);
533f(8796059205633, 262143);
534f(8796092760064, 262144);
535f(8796126314495, 262145);
536f(17592151965697, 524287);
537f(17592185520128, 524288);
538f(17592219074559, 524289);
539f(35184337485825, 1048575);
540f(35184371040256, 1048576);
541f(35184404594687, 1048577);
542f(70368708526081, 2097151);
543f(70368742080512, 2097152);
544f(70368775634943, 2097153);
545f(140737450606593, 4194303);
546f(140737484161024, 4194304);
547f(140737517715455, 4194305);
548f(281474934767617, 8388607);
549f(281474968322048, 8388608);
550f(281475001876479, 8388609);
551f(562949903089665, 16777215);
552f(562949936644096, 16777216);
553f(562949970198527, 16777217);
554f(1125899839733761, 33554431);
555