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 = 134217728;
59f(0, 0);
60f(134217728, 1);
61f(268435456, 2);
62f(402653184, 3);
63f(536870912, 4);
64f(671088640, 5);
65f(939524096, 7);
66f(1073741824, 8);
67f(1207959552, 9);
68f(2013265920, 15);
69f(2147483648, 16);
70f(2281701376, 17);
71f(4160749568, 31);
72f(4294967296, 32);
73f(4429185024, 33);
74f(8455716864, 63);
75f(8589934592, 64);
76f(8724152320, 65);
77f(17045651456, 127);
78f(17179869184, 128);
79f(17314086912, 129);
80f(34225520640, 255);
81f(34359738368, 256);
82f(34493956096, 257);
83f(68585259008, 511);
84f(68719476736, 512);
85f(68853694464, 513);
86f(137304735744, 1023);
87f(137438953472, 1024);
88f(137573171200, 1025);
89f(274743689216, 2047);
90f(274877906944, 2048);
91f(275012124672, 2049);
92f(549621596160, 4095);
93f(549755813888, 4096);
94f(549890031616, 4097);
95f(1099377410048, 8191);
96f(1099511627776, 8192);
97f(1099645845504, 8193);
98f(2198889037824, 16383);
99f(2199023255552, 16384);
100f(2199157473280, 16385);
101f(4397912293376, 32767);
102f(4398046511104, 32768);
103f(4398180728832, 32769);
104f(8795958804480, 65535);
105f(8796093022208, 65536);
106f(8796227239936, 65537);
107f(17592051826688, 131071);
108f(17592186044416, 131072);
109f(17592320262144, 131073);
110f(35184237871104, 262143);
111f(35184372088832, 262144);
112f(35184506306560, 262145);
113f(70368609959936, 524287);
114f(70368744177664, 524288);
115f(70368878395392, 524289);
116f(140737354137600, 1048575);
117f(140737488355328, 1048576);
118f(140737622573056, 1048577);
119f(281474842492928, 2097151);
120f(281474976710656, 2097152);
121f(281475110928384, 2097153);
122f(562949819203584, 4194303);
123f(562949953421312, 4194304);
124f(562950087639040, 4194305);
125f(1125899772624896, 8388607);
126f(1125899906842624, 8388608);
127f(1125900041060352, 8388609);
128x = 134217729;
129f(0, 0);
130f(134217729, 1);
131f(268435458, 2);
132f(402653187, 3);
133f(536870916, 4);
134f(671088645, 5);
135f(939524103, 7);
136f(1073741832, 8);
137f(1207959561, 9);
138f(2013265935, 15);
139f(2147483664, 16);
140f(2281701393, 17);
141f(4160749599, 31);
142f(4294967328, 32);
143f(4429185057, 33);
144f(8455716927, 63);
145f(8589934656, 64);
146f(8724152385, 65);
147f(17045651583, 127);
148f(17179869312, 128);
149f(17314087041, 129);
150f(34225520895, 255);
151f(34359738624, 256);
152f(34493956353, 257);
153f(68585259519, 511);
154f(68719477248, 512);
155f(68853694977, 513);
156f(137304736767, 1023);
157f(137438954496, 1024);
158f(137573172225, 1025);
159f(274743691263, 2047);
160f(274877908992, 2048);
161f(275012126721, 2049);
162f(549621600255, 4095);
163f(549755817984, 4096);
164f(549890035713, 4097);
165f(1099377418239, 8191);
166f(1099511635968, 8192);
167f(1099645853697, 8193);
168f(2198889054207, 16383);
169f(2199023271936, 16384);
170f(2199157489665, 16385);
171f(4397912326143, 32767);
172f(4398046543872, 32768);
173f(4398180761601, 32769);
174f(8795958870015, 65535);
175f(8796093087744, 65536);
176f(8796227305473, 65537);
177f(17592051957759, 131071);
178f(17592186175488, 131072);
179f(17592320393217, 131073);
180f(35184238133247, 262143);
181f(35184372350976, 262144);
182f(35184506568705, 262145);
183f(70368610484223, 524287);
184f(70368744701952, 524288);
185f(70368878919681, 524289);
186f(140737355186175, 1048575);
187f(140737489403904, 1048576);
188f(140737623621633, 1048577);
189f(281474844590079, 2097151);
190f(281474978807808, 2097152);
191f(281475113025537, 2097153);
192f(562949823397887, 4194303);
193f(562949957615616, 4194304);
194f(562950091833345, 4194305);
195f(1125899781013503, 8388607);
196f(1125899915231232, 8388608);
197f(1125900049448961, 8388609);
198x = 268435455;
199f(0, 0);
200f(268435455, 1);
201f(536870910, 2);
202f(805306365, 3);
203f(1073741820, 4);
204f(1342177275, 5);
205f(1879048185, 7);
206f(2147483640, 8);
207f(2415919095, 9);
208f(4026531825, 15);
209f(4294967280, 16);
210f(4563402735, 17);
211f(8321499105, 31);
212f(8589934560, 32);
213f(8858370015, 33);
214f(16911433665, 63);
215f(17179869120, 64);
216f(17448304575, 65);
217f(34091302785, 127);
218f(34359738240, 128);
219f(34628173695, 129);
220f(68451041025, 255);
221f(68719476480, 256);
222f(68987911935, 257);
223f(137170517505, 511);
224f(137438952960, 512);
225f(137707388415, 513);
226f(274609470465, 1023);
227f(274877905920, 1024);
228f(275146341375, 1025);
229f(549487376385, 2047);
230f(549755811840, 2048);
231f(550024247295, 2049);
232f(1099243188225, 4095);
233f(1099511623680, 4096);
234f(1099780059135, 4097);
235f(2198754811905, 8191);
236f(2199023247360, 8192);
237f(2199291682815, 8193);
238f(4397778059265, 16383);
239f(4398046494720, 16384);
240f(4398314930175, 16385);
241f(8795824553985, 32767);
242f(8796092989440, 32768);
243f(8796361424895, 32769);
244f(17591917543425, 65535);
245f(17592185978880, 65536);
246f(17592454414335, 65537);
247f(35184103522305, 131071);
248f(35184371957760, 131072);
249f(35184640393215, 131073);
250f(70368475480065, 262143);
251f(70368743915520, 262144);
252f(70369012350975, 262145);
253f(140737219395585, 524287);
254f(140737487831040, 524288);
255f(140737756266495, 524289);
256f(281474707226625, 1048575);
257f(281474975662080, 1048576);
258f(281475244097535, 1048577);
259f(562949682888705, 2097151);
260f(562949951324160, 2097152);
261f(562950219759615, 2097153);
262f(1125899634212865, 4194303);
263f(1125899902648320, 4194304);
264f(1125900171083775, 4194305);
265x = 268435456;
266f(0, 0);
267f(268435456, 1);
268f(536870912, 2);
269f(805306368, 3);
270f(1073741824, 4);
271f(1342177280, 5);
272f(1879048192, 7);
273f(2147483648, 8);
274f(2415919104, 9);
275f(4026531840, 15);
276f(4294967296, 16);
277f(4563402752, 17);
278f(8321499136, 31);
279f(8589934592, 32);
280f(8858370048, 33);
281f(16911433728, 63);
282f(17179869184, 64);
283f(17448304640, 65);
284f(34091302912, 127);
285f(34359738368, 128);
286f(34628173824, 129);
287f(68451041280, 255);
288f(68719476736, 256);
289f(68987912192, 257);
290f(137170518016, 511);
291f(137438953472, 512);
292f(137707388928, 513);
293f(274609471488, 1023);
294f(274877906944, 1024);
295f(275146342400, 1025);
296f(549487378432, 2047);
297f(549755813888, 2048);
298f(550024249344, 2049);
299f(1099243192320, 4095);
300f(1099511627776, 4096);
301f(1099780063232, 4097);
302f(2198754820096, 8191);
303f(2199023255552, 8192);
304f(2199291691008, 8193);
305f(4397778075648, 16383);
306f(4398046511104, 16384);
307f(4398314946560, 16385);
308f(8795824586752, 32767);
309f(8796093022208, 32768);
310f(8796361457664, 32769);
311f(17591917608960, 65535);
312f(17592186044416, 65536);
313f(17592454479872, 65537);
314f(35184103653376, 131071);
315f(35184372088832, 131072);
316f(35184640524288, 131073);
317f(70368475742208, 262143);
318f(70368744177664, 262144);
319f(70369012613120, 262145);
320f(140737219919872, 524287);
321f(140737488355328, 524288);
322f(140737756790784, 524289);
323f(281474708275200, 1048575);
324f(281474976710656, 1048576);
325f(281475245146112, 1048577);
326f(562949684985856, 2097151);
327f(562949953421312, 2097152);
328f(562950221856768, 2097153);
329f(1125899638407168, 4194303);
330f(1125899906842624, 4194304);
331f(1125900175278080, 4194305);
332x = 268435457;
333f(0, 0);
334f(268435457, 1);
335f(536870914, 2);
336f(805306371, 3);
337f(1073741828, 4);
338f(1342177285, 5);
339f(1879048199, 7);
340f(2147483656, 8);
341f(2415919113, 9);
342f(4026531855, 15);
343f(4294967312, 16);
344f(4563402769, 17);
345f(8321499167, 31);
346f(8589934624, 32);
347f(8858370081, 33);
348f(16911433791, 63);
349f(17179869248, 64);
350f(17448304705, 65);
351f(34091303039, 127);
352f(34359738496, 128);
353f(34628173953, 129);
354f(68451041535, 255);
355f(68719476992, 256);
356f(68987912449, 257);
357f(137170518527, 511);
358f(137438953984, 512);
359f(137707389441, 513);
360f(274609472511, 1023);
361f(274877907968, 1024);
362f(275146343425, 1025);
363f(549487380479, 2047);
364f(549755815936, 2048);
365f(550024251393, 2049);
366f(1099243196415, 4095);
367f(1099511631872, 4096);
368f(1099780067329, 4097);
369f(2198754828287, 8191);
370f(2199023263744, 8192);
371f(2199291699201, 8193);
372f(4397778092031, 16383);
373f(4398046527488, 16384);
374f(4398314962945, 16385);
375f(8795824619519, 32767);
376f(8796093054976, 32768);
377f(8796361490433, 32769);
378f(17591917674495, 65535);
379f(17592186109952, 65536);
380f(17592454545409, 65537);
381f(35184103784447, 131071);
382f(35184372219904, 131072);
383f(35184640655361, 131073);
384f(70368476004351, 262143);
385f(70368744439808, 262144);
386f(70369012875265, 262145);
387f(140737220444159, 524287);
388f(140737488879616, 524288);
389f(140737757315073, 524289);
390f(281474709323775, 1048575);
391f(281474977759232, 1048576);
392f(281475246194689, 1048577);
393f(562949687083007, 2097151);
394f(562949955518464, 2097152);
395f(562950223953921, 2097153);
396f(1125899642601471, 4194303);
397f(1125899911036928, 4194304);
398f(1125900179472385, 4194305);
399x = 536870911;
400f(0, 0);
401f(536870911, 1);
402f(1073741822, 2);
403f(1610612733, 3);
404f(2147483644, 4);
405f(2684354555, 5);
406f(3758096377, 7);
407f(4294967288, 8);
408f(4831838199, 9);
409f(8053063665, 15);
410f(8589934576, 16);
411f(9126805487, 17);
412f(16642998241, 31);
413f(17179869152, 32);
414f(17716740063, 33);
415f(33822867393, 63);
416f(34359738304, 64);
417f(34896609215, 65);
418f(68182605697, 127);
419f(68719476608, 128);
420f(69256347519, 129);
421f(136902082305, 255);
422f(137438953216, 256);
423f(137975824127, 257);
424f(274341035521, 511);
425f(274877906432, 512);
426f(275414777343, 513);
427f(549218941953, 1023);
428f(549755812864, 1024);
429f(550292683775, 1025);
430f(1098974754817, 2047);
431f(1099511625728, 2048);
432f(1100048496639, 2049);
433f(2198486380545, 4095);
434f(2199023251456, 4096);
435f(2199560122367, 4097);
436f(4397509632001, 8191);
437f(4398046502912, 8192);
438f(4398583373823, 8193);
439f(8795556134913, 16383);
440f(8796093005824, 16384);
441f(8796629876735, 16385);
442f(17591649140737, 32767);
443f(17592186011648, 32768);
444f(17592722882559, 32769);
445f(35183835152385, 65535);
446f(35184372023296, 65536);
447f(35184908894207, 65537);
448f(70368207175681, 131071);
449f(70368744046592, 131072);
450f(70369280917503, 131073);
451f(140736951222273, 262143);
452f(140737488093184, 262144);
453f(140738024964095, 262145);
454f(281474439315457, 524287);
455f(281474976186368, 524288);
456f(281475513057279, 524289);
457f(562949415501825, 1048575);
458f(562949952372736, 1048576);
459f(562950489243647, 1048577);
460f(1125899367874561, 2097151);
461f(1125899904745472, 2097152);
462f(1125900441616383, 2097153);
463x = 536870912;
464f(0, 0);
465f(536870912, 1);
466f(1073741824, 2);
467f(1610612736, 3);
468f(2147483648, 4);
469f(2684354560, 5);
470f(3758096384, 7);
471f(4294967296, 8);
472f(4831838208, 9);
473f(8053063680, 15);
474f(8589934592, 16);
475f(9126805504, 17);
476f(16642998272, 31);
477f(17179869184, 32);
478f(17716740096, 33);
479f(33822867456, 63);
480f(34359738368, 64);
481f(34896609280, 65);
482f(68182605824, 127);
483f(68719476736, 128);
484f(69256347648, 129);
485f(136902082560, 255);
486f(137438953472, 256);
487f(137975824384, 257);
488f(274341036032, 511);
489f(274877906944, 512);
490f(275414777856, 513);
491f(549218942976, 1023);
492f(549755813888, 1024);
493f(550292684800, 1025);
494f(1098974756864, 2047);
495f(1099511627776, 2048);
496f(1100048498688, 2049);
497f(2198486384640, 4095);
498f(2199023255552, 4096);
499f(2199560126464, 4097);
500f(4397509640192, 8191);
501f(4398046511104, 8192);
502f(4398583382016, 8193);
503f(8795556151296, 16383);
504f(8796093022208, 16384);
505f(8796629893120, 16385);
506f(17591649173504, 32767);
507f(17592186044416, 32768);
508f(17592722915328, 32769);
509f(35183835217920, 65535);
510f(35184372088832, 65536);
511f(35184908959744, 65537);
512f(70368207306752, 131071);
513f(70368744177664, 131072);
514f(70369281048576, 131073);
515f(140736951484416, 262143);
516f(140737488355328, 262144);
517f(140738025226240, 262145);
518f(281474439839744, 524287);
519f(281474976710656, 524288);
520f(281475513581568, 524289);
521f(562949416550400, 1048575);
522f(562949953421312, 1048576);
523f(562950490292224, 1048577);
524f(1125899369971712, 2097151);
525f(1125899906842624, 2097152);
526f(1125900443713536, 2097153);
527