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 = 262143;
59f(0, 0);
60f(262143, 1);
61f(524286, 2);
62f(786429, 3);
63f(1048572, 4);
64f(1310715, 5);
65f(1835001, 7);
66f(2097144, 8);
67f(2359287, 9);
68f(3932145, 15);
69f(4194288, 16);
70f(4456431, 17);
71f(8126433, 31);
72f(8388576, 32);
73f(8650719, 33);
74f(16515009, 63);
75f(16777152, 64);
76f(17039295, 65);
77f(33292161, 127);
78f(33554304, 128);
79f(33816447, 129);
80f(66846465, 255);
81f(67108608, 256);
82f(67370751, 257);
83f(133955073, 511);
84f(134217216, 512);
85f(134479359, 513);
86f(268172289, 1023);
87f(268434432, 1024);
88f(268696575, 1025);
89f(536606721, 2047);
90f(536868864, 2048);
91f(537131007, 2049);
92f(1073475585, 4095);
93f(1073737728, 4096);
94f(1073999871, 4097);
95f(2147213313, 8191);
96f(2147475456, 8192);
97f(2147737599, 8193);
98f(4294688769, 16383);
99f(4294950912, 16384);
100f(4295213055, 16385);
101f(8589639681, 32767);
102f(8589901824, 32768);
103f(8590163967, 32769);
104f(17179541505, 65535);
105f(17179803648, 65536);
106f(17180065791, 65537);
107f(34359345153, 131071);
108f(34359607296, 131072);
109f(34359869439, 131073);
110f(68718952449, 262143);
111x = 262144;
112f(0, 0);
113f(262144, 1);
114f(524288, 2);
115f(786432, 3);
116f(1048576, 4);
117f(1310720, 5);
118f(1835008, 7);
119f(2097152, 8);
120f(2359296, 9);
121f(3932160, 15);
122f(4194304, 16);
123f(4456448, 17);
124f(8126464, 31);
125f(8388608, 32);
126f(8650752, 33);
127f(16515072, 63);
128f(16777216, 64);
129f(17039360, 65);
130f(33292288, 127);
131f(33554432, 128);
132f(33816576, 129);
133f(66846720, 255);
134f(67108864, 256);
135f(67371008, 257);
136f(133955584, 511);
137f(134217728, 512);
138f(134479872, 513);
139f(268173312, 1023);
140f(268435456, 1024);
141f(268697600, 1025);
142f(536608768, 2047);
143f(536870912, 2048);
144f(537133056, 2049);
145f(1073479680, 4095);
146f(1073741824, 4096);
147f(1074003968, 4097);
148f(2147221504, 8191);
149f(2147483648, 8192);
150f(2147745792, 8193);
151f(4294705152, 16383);
152f(4294967296, 16384);
153f(4295229440, 16385);
154f(8589672448, 32767);
155f(8589934592, 32768);
156f(8590196736, 32769);
157f(17179607040, 65535);
158f(17179869184, 65536);
159f(17180131328, 65537);
160f(34359476224, 131071);
161f(34359738368, 131072);
162f(34360000512, 131073);
163f(68719214592, 262143);
164f(68719476736, 262144);
165x = 262145;
166f(0, 0);
167f(262145, 1);
168f(524290, 2);
169f(786435, 3);
170f(1048580, 4);
171f(1310725, 5);
172f(1835015, 7);
173f(2097160, 8);
174f(2359305, 9);
175f(3932175, 15);
176f(4194320, 16);
177f(4456465, 17);
178f(8126495, 31);
179f(8388640, 32);
180f(8650785, 33);
181f(16515135, 63);
182f(16777280, 64);
183f(17039425, 65);
184f(33292415, 127);
185f(33554560, 128);
186f(33816705, 129);
187f(66846975, 255);
188f(67109120, 256);
189f(67371265, 257);
190f(133956095, 511);
191f(134218240, 512);
192f(134480385, 513);
193f(268174335, 1023);
194f(268436480, 1024);
195f(268698625, 1025);
196f(536610815, 2047);
197f(536872960, 2048);
198f(537135105, 2049);
199f(1073483775, 4095);
200f(1073745920, 4096);
201f(1074008065, 4097);
202f(2147229695, 8191);
203f(2147491840, 8192);
204f(2147753985, 8193);
205f(4294721535, 16383);
206f(4294983680, 16384);
207f(4295245825, 16385);
208f(8589705215, 32767);
209f(8589967360, 32768);
210f(8590229505, 32769);
211f(17179672575, 65535);
212f(17179934720, 65536);
213f(17180196865, 65537);
214f(34359607295, 131071);
215f(34359869440, 131072);
216f(34360131585, 131073);
217f(68719476735, 262143);
218f(68719738880, 262144);
219f(68720001025, 262145);
220x = 524287;
221f(0, 0);
222f(524287, 1);
223f(1048574, 2);
224f(1572861, 3);
225f(2097148, 4);
226f(2621435, 5);
227f(3670009, 7);
228f(4194296, 8);
229f(4718583, 9);
230f(7864305, 15);
231f(8388592, 16);
232f(8912879, 17);
233f(16252897, 31);
234f(16777184, 32);
235f(17301471, 33);
236f(33030081, 63);
237f(33554368, 64);
238f(34078655, 65);
239f(66584449, 127);
240f(67108736, 128);
241f(67633023, 129);
242f(133693185, 255);
243f(134217472, 256);
244f(134741759, 257);
245f(267910657, 511);
246f(268434944, 512);
247f(268959231, 513);
248f(536345601, 1023);
249f(536869888, 1024);
250f(537394175, 1025);
251f(1073215489, 2047);
252f(1073739776, 2048);
253f(1074264063, 2049);
254f(2146955265, 4095);
255f(2147479552, 4096);
256f(2148003839, 4097);
257f(4294434817, 8191);
258f(4294959104, 8192);
259f(4295483391, 8193);
260f(8589393921, 16383);
261f(8589918208, 16384);
262f(8590442495, 16385);
263f(17179312129, 32767);
264f(17179836416, 32768);
265f(17180360703, 32769);
266f(34359148545, 65535);
267f(34359672832, 65536);
268f(34360197119, 65537);
269f(68718821377, 131071);
270f(68719345664, 131072);
271f(68719869951, 131073);
272f(137438167041, 262143);
273f(137438691328, 262144);
274f(137439215615, 262145);
275f(274876858369, 524287);
276x = 524288;
277f(0, 0);
278f(524288, 1);
279f(1048576, 2);
280f(1572864, 3);
281f(2097152, 4);
282f(2621440, 5);
283f(3670016, 7);
284f(4194304, 8);
285f(4718592, 9);
286f(7864320, 15);
287f(8388608, 16);
288f(8912896, 17);
289f(16252928, 31);
290f(16777216, 32);
291f(17301504, 33);
292f(33030144, 63);
293f(33554432, 64);
294f(34078720, 65);
295f(66584576, 127);
296f(67108864, 128);
297f(67633152, 129);
298f(133693440, 255);
299f(134217728, 256);
300f(134742016, 257);
301f(267911168, 511);
302f(268435456, 512);
303f(268959744, 513);
304f(536346624, 1023);
305f(536870912, 1024);
306f(537395200, 1025);
307f(1073217536, 2047);
308f(1073741824, 2048);
309f(1074266112, 2049);
310f(2146959360, 4095);
311f(2147483648, 4096);
312f(2148007936, 4097);
313f(4294443008, 8191);
314f(4294967296, 8192);
315f(4295491584, 8193);
316f(8589410304, 16383);
317f(8589934592, 16384);
318f(8590458880, 16385);
319f(17179344896, 32767);
320f(17179869184, 32768);
321f(17180393472, 32769);
322f(34359214080, 65535);
323f(34359738368, 65536);
324f(34360262656, 65537);
325f(68718952448, 131071);
326f(68719476736, 131072);
327f(68720001024, 131073);
328f(137438429184, 262143);
329f(137438953472, 262144);
330f(137439477760, 262145);
331f(274877382656, 524287);
332f(274877906944, 524288);
333x = 524289;
334f(0, 0);
335f(524289, 1);
336f(1048578, 2);
337f(1572867, 3);
338f(2097156, 4);
339f(2621445, 5);
340f(3670023, 7);
341f(4194312, 8);
342f(4718601, 9);
343f(7864335, 15);
344f(8388624, 16);
345f(8912913, 17);
346f(16252959, 31);
347f(16777248, 32);
348f(17301537, 33);
349f(33030207, 63);
350f(33554496, 64);
351f(34078785, 65);
352f(66584703, 127);
353f(67108992, 128);
354f(67633281, 129);
355f(133693695, 255);
356f(134217984, 256);
357f(134742273, 257);
358f(267911679, 511);
359f(268435968, 512);
360f(268960257, 513);
361f(536347647, 1023);
362f(536871936, 1024);
363f(537396225, 1025);
364f(1073219583, 2047);
365f(1073743872, 2048);
366f(1074268161, 2049);
367f(2146963455, 4095);
368f(2147487744, 4096);
369f(2148012033, 4097);
370f(4294451199, 8191);
371f(4294975488, 8192);
372f(4295499777, 8193);
373f(8589426687, 16383);
374f(8589950976, 16384);
375f(8590475265, 16385);
376f(17179377663, 32767);
377f(17179901952, 32768);
378f(17180426241, 32769);
379f(34359279615, 65535);
380f(34359803904, 65536);
381f(34360328193, 65537);
382f(68719083519, 131071);
383f(68719607808, 131072);
384f(68720132097, 131073);
385f(137438691327, 262143);
386f(137439215616, 262144);
387f(137439739905, 262145);
388f(274877906943, 524287);
389f(274878431232, 524288);
390f(274878955521, 524289);
391x = 1048575;
392f(0, 0);
393f(1048575, 1);
394f(2097150, 2);
395f(3145725, 3);
396f(4194300, 4);
397f(5242875, 5);
398f(7340025, 7);
399f(8388600, 8);
400f(9437175, 9);
401f(15728625, 15);
402f(16777200, 16);
403f(17825775, 17);
404f(32505825, 31);
405f(33554400, 32);
406f(34602975, 33);
407f(66060225, 63);
408f(67108800, 64);
409f(68157375, 65);
410f(133169025, 127);
411f(134217600, 128);
412f(135266175, 129);
413f(267386625, 255);
414f(268435200, 256);
415f(269483775, 257);
416f(535821825, 511);
417f(536870400, 512);
418f(537918975, 513);
419f(1072692225, 1023);
420f(1073740800, 1024);
421f(1074789375, 1025);
422f(2146433025, 2047);
423f(2147481600, 2048);
424f(2148530175, 2049);
425f(4293914625, 4095);
426f(4294963200, 4096);
427f(4296011775, 4097);
428f(8588877825, 8191);
429f(8589926400, 8192);
430f(8590974975, 8193);
431f(17178804225, 16383);
432f(17179852800, 16384);
433f(17180901375, 16385);
434f(34358657025, 32767);
435f(34359705600, 32768);
436f(34360754175, 32769);
437f(68718362625, 65535);
438f(68719411200, 65536);
439f(68720459775, 65537);
440f(137437773825, 131071);
441f(137438822400, 131072);
442f(137439870975, 131073);
443f(274876596225, 262143);
444f(274877644800, 262144);
445f(274878693375, 262145);
446f(549754241025, 524287);
447f(549755289600, 524288);
448f(549756338175, 524289);
449f(1099509530625, 1048575);
450x = 1048576;
451f(0, 0);
452f(1048576, 1);
453f(2097152, 2);
454f(3145728, 3);
455f(4194304, 4);
456f(5242880, 5);
457f(7340032, 7);
458f(8388608, 8);
459f(9437184, 9);
460f(15728640, 15);
461f(16777216, 16);
462f(17825792, 17);
463f(32505856, 31);
464f(33554432, 32);
465f(34603008, 33);
466f(66060288, 63);
467f(67108864, 64);
468f(68157440, 65);
469f(133169152, 127);
470f(134217728, 128);
471f(135266304, 129);
472f(267386880, 255);
473f(268435456, 256);
474f(269484032, 257);
475f(535822336, 511);
476f(536870912, 512);
477f(537919488, 513);
478f(1072693248, 1023);
479f(1073741824, 1024);
480f(1074790400, 1025);
481f(2146435072, 2047);
482f(2147483648, 2048);
483f(2148532224, 2049);
484f(4293918720, 4095);
485f(4294967296, 4096);
486f(4296015872, 4097);
487f(8588886016, 8191);
488f(8589934592, 8192);
489f(8590983168, 8193);
490f(17178820608, 16383);
491f(17179869184, 16384);
492f(17180917760, 16385);
493f(34358689792, 32767);
494f(34359738368, 32768);
495f(34360786944, 32769);
496f(68718428160, 65535);
497f(68719476736, 65536);
498f(68720525312, 65537);
499f(137437904896, 131071);
500f(137438953472, 131072);
501f(137440002048, 131073);
502f(274876858368, 262143);
503f(274877906944, 262144);
504f(274878955520, 262145);
505f(549754765312, 524287);
506f(549755813888, 524288);
507f(549756862464, 524289);
508f(1099510579200, 1048575);
509f(1099511627776, 1048576);
510