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 = 4294967296;
59f(0, 0);
60f(4294967296, 1);
61f(8589934592, 2);
62f(12884901888, 3);
63f(17179869184, 4);
64f(21474836480, 5);
65f(30064771072, 7);
66f(34359738368, 8);
67f(38654705664, 9);
68f(64424509440, 15);
69f(68719476736, 16);
70f(73014444032, 17);
71f(133143986176, 31);
72f(137438953472, 32);
73f(141733920768, 33);
74f(270582939648, 63);
75f(274877906944, 64);
76f(279172874240, 65);
77f(545460846592, 127);
78f(549755813888, 128);
79f(554050781184, 129);
80f(1095216660480, 255);
81f(1099511627776, 256);
82f(1103806595072, 257);
83f(2194728288256, 511);
84f(2199023255552, 512);
85f(2203318222848, 513);
86f(4393751543808, 1023);
87f(4398046511104, 1024);
88f(4402341478400, 1025);
89f(8791798054912, 2047);
90f(8796093022208, 2048);
91f(8800387989504, 2049);
92f(17587891077120, 4095);
93f(17592186044416, 4096);
94f(17596481011712, 4097);
95f(35180077121536, 8191);
96f(35184372088832, 8192);
97f(35188667056128, 8193);
98f(70364449210368, 16383);
99f(70368744177664, 16384);
100f(70373039144960, 16385);
101f(140733193388032, 32767);
102f(140737488355328, 32768);
103f(140741783322624, 32769);
104f(281470681743360, 65535);
105f(281474976710656, 65536);
106f(281479271677952, 65537);
107f(562945658454016, 131071);
108f(562949953421312, 131072);
109f(562954248388608, 131073);
110f(1125895611875328, 262143);
111f(1125899906842624, 262144);
112f(1125904201809920, 262145);
113x = 4294967297;
114f(0, 0);
115f(4294967297, 1);
116f(8589934594, 2);
117f(12884901891, 3);
118f(17179869188, 4);
119f(21474836485, 5);
120f(30064771079, 7);
121f(34359738376, 8);
122f(38654705673, 9);
123f(64424509455, 15);
124f(68719476752, 16);
125f(73014444049, 17);
126f(133143986207, 31);
127f(137438953504, 32);
128f(141733920801, 33);
129f(270582939711, 63);
130f(274877907008, 64);
131f(279172874305, 65);
132f(545460846719, 127);
133f(549755814016, 128);
134f(554050781313, 129);
135f(1095216660735, 255);
136f(1099511628032, 256);
137f(1103806595329, 257);
138f(2194728288767, 511);
139f(2199023256064, 512);
140f(2203318223361, 513);
141f(4393751544831, 1023);
142f(4398046512128, 1024);
143f(4402341479425, 1025);
144f(8791798056959, 2047);
145f(8796093024256, 2048);
146f(8800387991553, 2049);
147f(17587891081215, 4095);
148f(17592186048512, 4096);
149f(17596481015809, 4097);
150f(35180077129727, 8191);
151f(35184372097024, 8192);
152f(35188667064321, 8193);
153f(70364449226751, 16383);
154f(70368744194048, 16384);
155f(70373039161345, 16385);
156f(140733193420799, 32767);
157f(140737488388096, 32768);
158f(140741783355393, 32769);
159f(281470681808895, 65535);
160f(281474976776192, 65536);
161f(281479271743489, 65537);
162f(562945658585087, 131071);
163f(562949953552384, 131072);
164f(562954248519681, 131073);
165f(1125895612137471, 262143);
166f(1125899907104768, 262144);
167f(1125904202072065, 262145);
168x = 8589934591;
169f(0, 0);
170f(8589934591, 1);
171f(17179869182, 2);
172f(25769803773, 3);
173f(34359738364, 4);
174f(42949672955, 5);
175f(60129542137, 7);
176f(68719476728, 8);
177f(77309411319, 9);
178f(128849018865, 15);
179f(137438953456, 16);
180f(146028888047, 17);
181f(266287972321, 31);
182f(274877906912, 32);
183f(283467841503, 33);
184f(541165879233, 63);
185f(549755813824, 64);
186f(558345748415, 65);
187f(1090921693057, 127);
188f(1099511627648, 128);
189f(1108101562239, 129);
190f(2190433320705, 255);
191f(2199023255296, 256);
192f(2207613189887, 257);
193f(4389456576001, 511);
194f(4398046510592, 512);
195f(4406636445183, 513);
196f(8787503086593, 1023);
197f(8796093021184, 1024);
198f(8804682955775, 1025);
199f(17583596107777, 2047);
200f(17592186042368, 2048);
201f(17600775976959, 2049);
202f(35175782150145, 4095);
203f(35184372084736, 4096);
204f(35192962019327, 4097);
205f(70360154234881, 8191);
206f(70368744169472, 8192);
207f(70377334104063, 8193);
208f(140728898404353, 16383);
209f(140737488338944, 16384);
210f(140746078273535, 16385);
211f(281466386743297, 32767);
212f(281474976677888, 32768);
213f(281483566612479, 32769);
214f(562941363421185, 65535);
215f(562949953355776, 65536);
216f(562958543290367, 65537);
217f(1125891316776961, 131071);
218f(1125899906711552, 131072);
219f(1125908496646143, 131073);
220x = 8589934592;
221f(0, 0);
222f(8589934592, 1);
223f(17179869184, 2);
224f(25769803776, 3);
225f(34359738368, 4);
226f(42949672960, 5);
227f(60129542144, 7);
228f(68719476736, 8);
229f(77309411328, 9);
230f(128849018880, 15);
231f(137438953472, 16);
232f(146028888064, 17);
233f(266287972352, 31);
234f(274877906944, 32);
235f(283467841536, 33);
236f(541165879296, 63);
237f(549755813888, 64);
238f(558345748480, 65);
239f(1090921693184, 127);
240f(1099511627776, 128);
241f(1108101562368, 129);
242f(2190433320960, 255);
243f(2199023255552, 256);
244f(2207613190144, 257);
245f(4389456576512, 511);
246f(4398046511104, 512);
247f(4406636445696, 513);
248f(8787503087616, 1023);
249f(8796093022208, 1024);
250f(8804682956800, 1025);
251f(17583596109824, 2047);
252f(17592186044416, 2048);
253f(17600775979008, 2049);
254f(35175782154240, 4095);
255f(35184372088832, 4096);
256f(35192962023424, 4097);
257f(70360154243072, 8191);
258f(70368744177664, 8192);
259f(70377334112256, 8193);
260f(140728898420736, 16383);
261f(140737488355328, 16384);
262f(140746078289920, 16385);
263f(281466386776064, 32767);
264f(281474976710656, 32768);
265f(281483566645248, 32769);
266f(562941363486720, 65535);
267f(562949953421312, 65536);
268f(562958543355904, 65537);
269f(1125891316908032, 131071);
270f(1125899906842624, 131072);
271f(1125908496777216, 131073);
272x = 8589934593;
273f(0, 0);
274f(8589934593, 1);
275f(17179869186, 2);
276f(25769803779, 3);
277f(34359738372, 4);
278f(42949672965, 5);
279f(60129542151, 7);
280f(68719476744, 8);
281f(77309411337, 9);
282f(128849018895, 15);
283f(137438953488, 16);
284f(146028888081, 17);
285f(266287972383, 31);
286f(274877906976, 32);
287f(283467841569, 33);
288f(541165879359, 63);
289f(549755813952, 64);
290f(558345748545, 65);
291f(1090921693311, 127);
292f(1099511627904, 128);
293f(1108101562497, 129);
294f(2190433321215, 255);
295f(2199023255808, 256);
296f(2207613190401, 257);
297f(4389456577023, 511);
298f(4398046511616, 512);
299f(4406636446209, 513);
300f(8787503088639, 1023);
301f(8796093023232, 1024);
302f(8804682957825, 1025);
303f(17583596111871, 2047);
304f(17592186046464, 2048);
305f(17600775981057, 2049);
306f(35175782158335, 4095);
307f(35184372092928, 4096);
308f(35192962027521, 4097);
309f(70360154251263, 8191);
310f(70368744185856, 8192);
311f(70377334120449, 8193);
312f(140728898437119, 16383);
313f(140737488371712, 16384);
314f(140746078306305, 16385);
315f(281466386808831, 32767);
316f(281474976743424, 32768);
317f(281483566678017, 32769);
318f(562941363552255, 65535);
319f(562949953486848, 65536);
320f(562958543421441, 65537);
321f(1125891317039103, 131071);
322f(1125899906973696, 131072);
323f(1125908496908289, 131073);
324x = 17179869183;
325f(0, 0);
326f(17179869183, 1);
327f(34359738366, 2);
328f(51539607549, 3);
329f(68719476732, 4);
330f(85899345915, 5);
331f(120259084281, 7);
332f(137438953464, 8);
333f(154618822647, 9);
334f(257698037745, 15);
335f(274877906928, 16);
336f(292057776111, 17);
337f(532575944673, 31);
338f(549755813856, 32);
339f(566935683039, 33);
340f(1082331758529, 63);
341f(1099511627712, 64);
342f(1116691496895, 65);
343f(2181843386241, 127);
344f(2199023255424, 128);
345f(2216203124607, 129);
346f(4380866641665, 255);
347f(4398046510848, 256);
348f(4415226380031, 257);
349f(8778913152513, 511);
350f(8796093021696, 512);
351f(8813272890879, 513);
352f(17575006174209, 1023);
353f(17592186043392, 1024);
354f(17609365912575, 1025);
355f(35167192217601, 2047);
356f(35184372086784, 2048);
357f(35201551955967, 2049);
358f(70351564304385, 4095);
359f(70368744173568, 4096);
360f(70385924042751, 4097);
361f(140720308477953, 8191);
362f(140737488347136, 8192);
363f(140754668216319, 8193);
364f(281457796825089, 16383);
365f(281474976694272, 16384);
366f(281492156563455, 16385);
367f(562932773519361, 32767);
368f(562949953388544, 32768);
369f(562967133257727, 32769);
370f(1125882726907905, 65535);
371f(1125899906777088, 65536);
372f(1125917086646271, 65537);
373x = 17179869184;
374f(0, 0);
375f(17179869184, 1);
376f(34359738368, 2);
377f(51539607552, 3);
378f(68719476736, 4);
379f(85899345920, 5);
380f(120259084288, 7);
381f(137438953472, 8);
382f(154618822656, 9);
383f(257698037760, 15);
384f(274877906944, 16);
385f(292057776128, 17);
386f(532575944704, 31);
387f(549755813888, 32);
388f(566935683072, 33);
389f(1082331758592, 63);
390f(1099511627776, 64);
391f(1116691496960, 65);
392f(2181843386368, 127);
393f(2199023255552, 128);
394f(2216203124736, 129);
395f(4380866641920, 255);
396f(4398046511104, 256);
397f(4415226380288, 257);
398f(8778913153024, 511);
399f(8796093022208, 512);
400f(8813272891392, 513);
401f(17575006175232, 1023);
402f(17592186044416, 1024);
403f(17609365913600, 1025);
404f(35167192219648, 2047);
405f(35184372088832, 2048);
406f(35201551958016, 2049);
407f(70351564308480, 4095);
408f(70368744177664, 4096);
409f(70385924046848, 4097);
410f(140720308486144, 8191);
411f(140737488355328, 8192);
412f(140754668224512, 8193);
413f(281457796841472, 16383);
414f(281474976710656, 16384);
415f(281492156579840, 16385);
416f(562932773552128, 32767);
417f(562949953421312, 32768);
418f(562967133290496, 32769);
419f(1125882726973440, 65535);
420f(1125899906842624, 65536);
421f(1125917086711808, 65537);
422x = 17179869185;
423f(0, 0);
424f(17179869185, 1);
425f(34359738370, 2);
426f(51539607555, 3);
427f(68719476740, 4);
428f(85899345925, 5);
429f(120259084295, 7);
430f(137438953480, 8);
431f(154618822665, 9);
432f(257698037775, 15);
433f(274877906960, 16);
434f(292057776145, 17);
435f(532575944735, 31);
436f(549755813920, 32);
437f(566935683105, 33);
438f(1082331758655, 63);
439f(1099511627840, 64);
440f(1116691497025, 65);
441f(2181843386495, 127);
442f(2199023255680, 128);
443f(2216203124865, 129);
444f(4380866642175, 255);
445f(4398046511360, 256);
446f(4415226380545, 257);
447f(8778913153535, 511);
448f(8796093022720, 512);
449f(8813272891905, 513);
450f(17575006176255, 1023);
451f(17592186045440, 1024);
452f(17609365914625, 1025);
453f(35167192221695, 2047);
454f(35184372090880, 2048);
455f(35201551960065, 2049);
456f(70351564312575, 4095);
457f(70368744181760, 4096);
458f(70385924050945, 4097);
459f(140720308494335, 8191);
460f(140737488363520, 8192);
461f(140754668232705, 8193);
462f(281457796857855, 16383);
463f(281474976727040, 16384);
464f(281492156596225, 16385);
465f(562932773584895, 32767);
466f(562949953454080, 32768);
467f(562967133323265, 32769);
468f(1125882727038975, 65535);
469f(1125899906908160, 65536);
470f(1125917086777345, 65537);
471