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 = 536870913;
59f(0, 0);
60f(536870913, 1);
61f(1073741826, 2);
62f(1610612739, 3);
63f(2147483652, 4);
64f(2684354565, 5);
65f(3758096391, 7);
66f(4294967304, 8);
67f(4831838217, 9);
68f(8053063695, 15);
69f(8589934608, 16);
70f(9126805521, 17);
71f(16642998303, 31);
72f(17179869216, 32);
73f(17716740129, 33);
74f(33822867519, 63);
75f(34359738432, 64);
76f(34896609345, 65);
77f(68182605951, 127);
78f(68719476864, 128);
79f(69256347777, 129);
80f(136902082815, 255);
81f(137438953728, 256);
82f(137975824641, 257);
83f(274341036543, 511);
84f(274877907456, 512);
85f(275414778369, 513);
86f(549218943999, 1023);
87f(549755814912, 1024);
88f(550292685825, 1025);
89f(1098974758911, 2047);
90f(1099511629824, 2048);
91f(1100048500737, 2049);
92f(2198486388735, 4095);
93f(2199023259648, 4096);
94f(2199560130561, 4097);
95f(4397509648383, 8191);
96f(4398046519296, 8192);
97f(4398583390209, 8193);
98f(8795556167679, 16383);
99f(8796093038592, 16384);
100f(8796629909505, 16385);
101f(17591649206271, 32767);
102f(17592186077184, 32768);
103f(17592722948097, 32769);
104f(35183835283455, 65535);
105f(35184372154368, 65536);
106f(35184909025281, 65537);
107f(70368207437823, 131071);
108f(70368744308736, 131072);
109f(70369281179649, 131073);
110f(140736951746559, 262143);
111f(140737488617472, 262144);
112f(140738025488385, 262145);
113f(281474440364031, 524287);
114f(281474977234944, 524288);
115f(281475514105857, 524289);
116f(562949417598975, 1048575);
117f(562949954469888, 1048576);
118f(562950491340801, 1048577);
119f(1125899372068863, 2097151);
120f(1125899908939776, 2097152);
121f(1125900445810689, 2097153);
122x = 1073741823;
123f(0, 0);
124f(1073741823, 1);
125f(2147483646, 2);
126f(3221225469, 3);
127f(4294967292, 4);
128f(5368709115, 5);
129f(7516192761, 7);
130f(8589934584, 8);
131f(9663676407, 9);
132f(16106127345, 15);
133f(17179869168, 16);
134f(18253610991, 17);
135f(33285996513, 31);
136f(34359738336, 32);
137f(35433480159, 33);
138f(67645734849, 63);
139f(68719476672, 64);
140f(69793218495, 65);
141f(136365211521, 127);
142f(137438953344, 128);
143f(138512695167, 129);
144f(273804164865, 255);
145f(274877906688, 256);
146f(275951648511, 257);
147f(548682071553, 511);
148f(549755813376, 512);
149f(550829555199, 513);
150f(1098437884929, 1023);
151f(1099511626752, 1024);
152f(1100585368575, 1025);
153f(2197949511681, 2047);
154f(2199023253504, 2048);
155f(2200096995327, 2049);
156f(4396972765185, 4095);
157f(4398046507008, 4096);
158f(4399120248831, 4097);
159f(8795019272193, 8191);
160f(8796093014016, 8192);
161f(8797166755839, 8193);
162f(17591112286209, 16383);
163f(17592186028032, 16384);
164f(17593259769855, 16385);
165f(35183298314241, 32767);
166f(35184372056064, 32768);
167f(35185445797887, 32769);
168f(70367670370305, 65535);
169f(70368744112128, 65536);
170f(70369817853951, 65537);
171f(140736414482433, 131071);
172f(140737488224256, 131072);
173f(140738561966079, 131073);
174f(281473902706689, 262143);
175f(281474976448512, 262144);
176f(281476050190335, 262145);
177f(562948879155201, 524287);
178f(562949952897024, 524288);
179f(562951026638847, 524289);
180f(1125898832052225, 1048575);
181f(1125899905794048, 1048576);
182f(1125900979535871, 1048577);
183x = 1073741824;
184f(0, 0);
185f(1073741824, 1);
186f(2147483648, 2);
187f(3221225472, 3);
188f(4294967296, 4);
189f(5368709120, 5);
190f(7516192768, 7);
191f(8589934592, 8);
192f(9663676416, 9);
193f(16106127360, 15);
194f(17179869184, 16);
195f(18253611008, 17);
196f(33285996544, 31);
197f(34359738368, 32);
198f(35433480192, 33);
199f(67645734912, 63);
200f(68719476736, 64);
201f(69793218560, 65);
202f(136365211648, 127);
203f(137438953472, 128);
204f(138512695296, 129);
205f(273804165120, 255);
206f(274877906944, 256);
207f(275951648768, 257);
208f(548682072064, 511);
209f(549755813888, 512);
210f(550829555712, 513);
211f(1098437885952, 1023);
212f(1099511627776, 1024);
213f(1100585369600, 1025);
214f(2197949513728, 2047);
215f(2199023255552, 2048);
216f(2200096997376, 2049);
217f(4396972769280, 4095);
218f(4398046511104, 4096);
219f(4399120252928, 4097);
220f(8795019280384, 8191);
221f(8796093022208, 8192);
222f(8797166764032, 8193);
223f(17591112302592, 16383);
224f(17592186044416, 16384);
225f(17593259786240, 16385);
226f(35183298347008, 32767);
227f(35184372088832, 32768);
228f(35185445830656, 32769);
229f(70367670435840, 65535);
230f(70368744177664, 65536);
231f(70369817919488, 65537);
232f(140736414613504, 131071);
233f(140737488355328, 131072);
234f(140738562097152, 131073);
235f(281473902968832, 262143);
236f(281474976710656, 262144);
237f(281476050452480, 262145);
238f(562948879679488, 524287);
239f(562949953421312, 524288);
240f(562951027163136, 524289);
241f(1125898833100800, 1048575);
242f(1125899906842624, 1048576);
243f(1125900980584448, 1048577);
244x = 1073741825;
245f(0, 0);
246f(1073741825, 1);
247f(2147483650, 2);
248f(3221225475, 3);
249f(4294967300, 4);
250f(5368709125, 5);
251f(7516192775, 7);
252f(8589934600, 8);
253f(9663676425, 9);
254f(16106127375, 15);
255f(17179869200, 16);
256f(18253611025, 17);
257f(33285996575, 31);
258f(34359738400, 32);
259f(35433480225, 33);
260f(67645734975, 63);
261f(68719476800, 64);
262f(69793218625, 65);
263f(136365211775, 127);
264f(137438953600, 128);
265f(138512695425, 129);
266f(273804165375, 255);
267f(274877907200, 256);
268f(275951649025, 257);
269f(548682072575, 511);
270f(549755814400, 512);
271f(550829556225, 513);
272f(1098437886975, 1023);
273f(1099511628800, 1024);
274f(1100585370625, 1025);
275f(2197949515775, 2047);
276f(2199023257600, 2048);
277f(2200096999425, 2049);
278f(4396972773375, 4095);
279f(4398046515200, 4096);
280f(4399120257025, 4097);
281f(8795019288575, 8191);
282f(8796093030400, 8192);
283f(8797166772225, 8193);
284f(17591112318975, 16383);
285f(17592186060800, 16384);
286f(17593259802625, 16385);
287f(35183298379775, 32767);
288f(35184372121600, 32768);
289f(35185445863425, 32769);
290f(70367670501375, 65535);
291f(70368744243200, 65536);
292f(70369817985025, 65537);
293f(140736414744575, 131071);
294f(140737488486400, 131072);
295f(140738562228225, 131073);
296f(281473903230975, 262143);
297f(281474976972800, 262144);
298f(281476050714625, 262145);
299f(562948880203775, 524287);
300f(562949953945600, 524288);
301f(562951027687425, 524289);
302f(1125898834149375, 1048575);
303f(1125899907891200, 1048576);
304f(1125900981633025, 1048577);
305x = 2147483647;
306f(0, 0);
307f(2147483647, 1);
308f(4294967294, 2);
309f(6442450941, 3);
310f(8589934588, 4);
311f(10737418235, 5);
312f(15032385529, 7);
313f(17179869176, 8);
314f(19327352823, 9);
315f(32212254705, 15);
316f(34359738352, 16);
317f(36507221999, 17);
318f(66571993057, 31);
319f(68719476704, 32);
320f(70866960351, 33);
321f(135291469761, 63);
322f(137438953408, 64);
323f(139586437055, 65);
324f(272730423169, 127);
325f(274877906816, 128);
326f(277025390463, 129);
327f(547608329985, 255);
328f(549755813632, 256);
329f(551903297279, 257);
330f(1097364143617, 511);
331f(1099511627264, 512);
332f(1101659110911, 513);
333f(2196875770881, 1023);
334f(2199023254528, 1024);
335f(2201170738175, 1025);
336f(4395899025409, 2047);
337f(4398046509056, 2048);
338f(4400193992703, 2049);
339f(8793945534465, 4095);
340f(8796093018112, 4096);
341f(8798240501759, 4097);
342f(17590038552577, 8191);
343f(17592186036224, 8192);
344f(17594333519871, 8193);
345f(35182224588801, 16383);
346f(35184372072448, 16384);
347f(35186519556095, 16385);
348f(70366596661249, 32767);
349f(70368744144896, 32768);
350f(70370891628543, 32769);
351f(140735340806145, 65535);
352f(140737488289792, 65536);
353f(140739635773439, 65537);
354f(281472829095937, 131071);
355f(281474976579584, 131072);
356f(281477124063231, 131073);
357f(562947805675521, 262143);
358f(562949953159168, 262144);
359f(562952100642815, 262145);
360f(1125897758834689, 524287);
361f(1125899906318336, 524288);
362f(1125902053801983, 524289);
363x = 2147483648;
364f(0, 0);
365f(2147483648, 1);
366f(4294967296, 2);
367f(6442450944, 3);
368f(8589934592, 4);
369f(10737418240, 5);
370f(15032385536, 7);
371f(17179869184, 8);
372f(19327352832, 9);
373f(32212254720, 15);
374f(34359738368, 16);
375f(36507222016, 17);
376f(66571993088, 31);
377f(68719476736, 32);
378f(70866960384, 33);
379f(135291469824, 63);
380f(137438953472, 64);
381f(139586437120, 65);
382f(272730423296, 127);
383f(274877906944, 128);
384f(277025390592, 129);
385f(547608330240, 255);
386f(549755813888, 256);
387f(551903297536, 257);
388f(1097364144128, 511);
389f(1099511627776, 512);
390f(1101659111424, 513);
391f(2196875771904, 1023);
392f(2199023255552, 1024);
393f(2201170739200, 1025);
394f(4395899027456, 2047);
395f(4398046511104, 2048);
396f(4400193994752, 2049);
397f(8793945538560, 4095);
398f(8796093022208, 4096);
399f(8798240505856, 4097);
400f(17590038560768, 8191);
401f(17592186044416, 8192);
402f(17594333528064, 8193);
403f(35182224605184, 16383);
404f(35184372088832, 16384);
405f(35186519572480, 16385);
406f(70366596694016, 32767);
407f(70368744177664, 32768);
408f(70370891661312, 32769);
409f(140735340871680, 65535);
410f(140737488355328, 65536);
411f(140739635838976, 65537);
412f(281472829227008, 131071);
413f(281474976710656, 131072);
414f(281477124194304, 131073);
415f(562947805937664, 262143);
416f(562949953421312, 262144);
417f(562952100904960, 262145);
418f(1125897759358976, 524287);
419f(1125899906842624, 524288);
420f(1125902054326272, 524289);
421x = 2147483649;
422f(0, 0);
423f(2147483649, 1);
424f(4294967298, 2);
425f(6442450947, 3);
426f(8589934596, 4);
427f(10737418245, 5);
428f(15032385543, 7);
429f(17179869192, 8);
430f(19327352841, 9);
431f(32212254735, 15);
432f(34359738384, 16);
433f(36507222033, 17);
434f(66571993119, 31);
435f(68719476768, 32);
436f(70866960417, 33);
437f(135291469887, 63);
438f(137438953536, 64);
439f(139586437185, 65);
440f(272730423423, 127);
441f(274877907072, 128);
442f(277025390721, 129);
443f(547608330495, 255);
444f(549755814144, 256);
445f(551903297793, 257);
446f(1097364144639, 511);
447f(1099511628288, 512);
448f(1101659111937, 513);
449f(2196875772927, 1023);
450f(2199023256576, 1024);
451f(2201170740225, 1025);
452f(4395899029503, 2047);
453f(4398046513152, 2048);
454f(4400193996801, 2049);
455f(8793945542655, 4095);
456f(8796093026304, 4096);
457f(8798240509953, 4097);
458f(17590038568959, 8191);
459f(17592186052608, 8192);
460f(17594333536257, 8193);
461f(35182224621567, 16383);
462f(35184372105216, 16384);
463f(35186519588865, 16385);
464f(70366596726783, 32767);
465f(70368744210432, 32768);
466f(70370891694081, 32769);
467f(140735340937215, 65535);
468f(140737488420864, 65536);
469f(140739635904513, 65537);
470f(281472829358079, 131071);
471f(281474976841728, 131072);
472f(281477124325377, 131073);
473f(562947806199807, 262143);
474f(562949953683456, 262144);
475f(562952101167105, 262145);
476f(1125897759883263, 524287);
477f(1125899907366912, 524288);
478f(1125902054850561, 524289);
479x = 4294967295;
480f(0, 0);
481f(4294967295, 1);
482f(8589934590, 2);
483f(12884901885, 3);
484f(17179869180, 4);
485f(21474836475, 5);
486f(30064771065, 7);
487f(34359738360, 8);
488f(38654705655, 9);
489f(64424509425, 15);
490f(68719476720, 16);
491f(73014444015, 17);
492f(133143986145, 31);
493f(137438953440, 32);
494f(141733920735, 33);
495f(270582939585, 63);
496f(274877906880, 64);
497f(279172874175, 65);
498f(545460846465, 127);
499f(549755813760, 128);
500f(554050781055, 129);
501f(1095216660225, 255);
502f(1099511627520, 256);
503f(1103806594815, 257);
504f(2194728287745, 511);
505f(2199023255040, 512);
506f(2203318222335, 513);
507f(4393751542785, 1023);
508f(4398046510080, 1024);
509f(4402341477375, 1025);
510f(8791798052865, 2047);
511f(8796093020160, 2048);
512f(8800387987455, 2049);
513f(17587891073025, 4095);
514f(17592186040320, 4096);
515f(17596481007615, 4097);
516f(35180077113345, 8191);
517f(35184372080640, 8192);
518f(35188667047935, 8193);
519f(70364449193985, 16383);
520f(70368744161280, 16384);
521f(70373039128575, 16385);
522f(140733193355265, 32767);
523f(140737488322560, 32768);
524f(140741783289855, 32769);
525f(281470681677825, 65535);
526f(281474976645120, 65536);
527f(281479271612415, 65537);
528f(562945658322945, 131071);
529f(562949953290240, 131072);
530f(562954248257535, 131073);
531f(1125895611613185, 262143);
532f(1125899906580480, 262144);
533f(1125904201547775, 262145);
534