blob: f0c9c95898dd734b32d8b55cb41df91da32763be [file] [log] [blame]
utatane.tea@gmail.com9971c632016-03-01 02:30:46 +00001
2function mathFloorOnIntegers(value)
3{
4 return Math.floor(value);
5}
6noInline(mathFloorOnIntegers);
7
8function mathFloorOnDoubles(value)
9{
10 return Math.floor(value);
11}
12noInline(mathFloorOnDoubles);
13
14function mathFloorOnBooleans(value)
15{
16 return Math.floor(value);
17}
18noInline(mathFloorOnBooleans);
19
20// The trivial cases first.
21for (var i = 1; i < 1e4; ++i) {
22 var flooredValue = mathFloorOnIntegers(i);
23 if (flooredValue !== i)
24 throw new Error("mathFloorOnIntegers(" + i + ") = " + flooredValue);
25
26 var flooredValue = mathFloorOnIntegers(-i);
27 if (flooredValue !== -i)
28 throw new Error("mathFloorOnIntegers(" + -i + ") = " + flooredValue);
29
30 var doubleLow = i + 0.4;
31 var flooredValue = mathFloorOnDoubles(doubleLow);
32 if (flooredValue !== i)
33 throw new Error("mathFloorOnDoubles(" + doubleLow + ") = " + flooredValue);
34
35 var doubleHigh = i + 0.6;
36 var flooredValue = mathFloorOnDoubles(doubleHigh);
37 if (flooredValue !== i)
38 throw new Error("mathFloorOnDoubles(" + doubleHigh + ") = " + flooredValue);
39
40 var doubleMid = i + 0.5;
41 var flooredValue = mathFloorOnDoubles(doubleMid);
42 if (flooredValue !== i)
43 throw new Error("mathFloorOnDoubles(" + doubleMid + ") = " + flooredValue);
44
45 var flooredValue = mathFloorOnDoubles(-0.6);
46 if (flooredValue !== -1.0)
47 throw new Error("mathFloorOnDoubles(-0.6) = " + flooredValue);
48}
49
50// Some more interesting cases, some of them well OSR exit when the return value is zero.
51for (var i = 0; i < 1e4; ++i) {
52 var flooredValue = mathFloorOnIntegers(i);
53 if (flooredValue !== i)
54 throw new Error("mathFloorOnIntegers(" + i + ") = " + flooredValue);
55
56 var flooredValue = mathFloorOnIntegers(-i);
57 if (flooredValue !== -i)
58 throw new Error("mathFloorOnIntegers(-" + i + ") = " + flooredValue);
59
60 var flooredValue = mathFloorOnDoubles(-0.4);
61 if (flooredValue !== -1.00)
62 throw new Error("mathFloorOnDoubles(-0.4) = " + flooredValue);
63
64 var flooredValue = mathFloorOnDoubles(-0.5);
65 if (flooredValue !== -1.0)
66 throw new Error("mathFloorOnDoubles(-0.5) = " + flooredValue);
67
68 var flooredValue = mathFloorOnDoubles(-0);
69 if (!(flooredValue === 0 && (1/flooredValue) === -Infinity))
70 throw new Error("mathFloorOnDoubles(-0) = " + flooredValue);
71
72 var flooredValue = mathFloorOnDoubles(NaN);
73 if (flooredValue === flooredValue)
74 throw new Error("mathFloorOnDoubles(NaN) = " + flooredValue);
75
76 var flooredValue = mathFloorOnDoubles(Number.POSITIVE_INFINITY);
77 if (flooredValue !== Number.POSITIVE_INFINITY)
78 throw new Error("mathFloorOnDoubles(Number.POSITIVE_INFINITY) = " + flooredValue);
79
80 var flooredValue = mathFloorOnDoubles(Number.NEGATIVE_INFINITY);
81 if (flooredValue !== Number.NEGATIVE_INFINITY)
82 throw new Error("mathFloorOnDoubles(Number.NEGATIVE_INFINITY) = " + flooredValue);
83
84 var boolean = !!(i % 2);
85 var flooredBoolean = mathFloorOnBooleans(boolean);
86 if (flooredBoolean != boolean)
87 throw new Error("mathFloorOnDoubles(" + boolean + ") = " + flooredBoolean);
88}
89
90function uselessMathFloor(value)
91{
92 return Math.floor(value|0);
93}
94noInline(uselessMathFloor);
95
96for (var i = 0; i < 1e4; ++i) {
97 var flooredValue = uselessMathFloor(i);
98 if (flooredValue !== i)
99 throw new Error("uselessMathFloor(" + i + ") = " + flooredValue);
100
101 var doubleLow = i + 0.4;
102 var flooredValue = uselessMathFloor(doubleLow);
103 if (flooredValue !== i)
104 throw new Error("uselessMathFloor(" + doubleLow + ") = " + flooredValue);
105
106 var doubleHigh = i + 0.6;
107 var flooredValue = uselessMathFloor(doubleHigh);
108 if (flooredValue !== i)
109 throw new Error("uselessMathFloor(" + doubleHigh + ") = " + flooredValue);
110
111 var doubleMid = i + 0.5;
112 var flooredValue = uselessMathFloor(doubleMid);
113 if (flooredValue !== i)
114 throw new Error("uselessMathFloor(" + doubleMid + ") = " + flooredValue);
115
116 var flooredValue = uselessMathFloor(-0.4);
117 if (flooredValue !== 0)
118 throw new Error("uselessMathFloor(-0.4) = " + flooredValue);
119
120 var flooredValue = uselessMathFloor(-0.5);
121 if (flooredValue !== 0)
122 throw new Error("uselessMathFloor(-0.5) = " + flooredValue);
123
124 var flooredValue = uselessMathFloor(-0.6);
125 if (flooredValue !== 0)
126 throw new Error("uselessMathFloor(-0.6) = " + flooredValue);
127}
128
129function mathFloorWithOverflow(value)
130{
131 return Math.floor(value);
132}
133noInline(mathFloorWithOverflow);
134
135for (var i = 0; i < 1e4; ++i) {
136 var bigValue = 1000000000000;
137 var flooredValue = mathFloorWithOverflow(bigValue);
138 if (flooredValue !== bigValue)
139 throw new Error("mathFloorWithOverflow(" + bigValue + ") = " + flooredValue);
140}
141
142function mathFloorConsumedAsDouble(value)
143{
144 return Math.floor(value) * 0.5;
145}
146noInline(mathFloorConsumedAsDouble);
147
148for (var i = 0; i < 1e4; ++i) {
149 var doubleValue = i + 0.1;
150 var flooredValue = mathFloorConsumedAsDouble(doubleValue);
151 if (flooredValue !== (i * 0.5))
152 throw new Error("mathFloorConsumedAsDouble(" + doubleValue + ") = " + flooredValue);
153
154 var doubleValue = i + 0.6;
155 var flooredValue = mathFloorConsumedAsDouble(doubleValue);
156 if (flooredValue !== (i * 0.5))
157 throw new Error("mathFloorConsumedAsDouble(" + doubleValue + ") = " + flooredValue);
158
159}
160
161function mathFloorDoesNotCareAboutMinusZero(value)
162{
163 return Math.floor(value)|0;
164}
165noInline(mathFloorDoesNotCareAboutMinusZero);
166
167for (var i = 0; i < 1e4; ++i) {
168 var doubleMid = i + 0.5;
169 var flooredValue = mathFloorDoesNotCareAboutMinusZero(doubleMid);
170 if (flooredValue !== i)
171 throw new Error("mathFloorDoesNotCareAboutMinusZero(" + doubleMid + ") = " + flooredValue);
172}
173
174
175// *** Function arguments. ***
176function mathFloorNoArguments()
177{
178 return Math.floor();
179}
180noInline(mathFloorNoArguments);
181
182function mathFloorTooManyArguments(a, b, c)
183{
184 return Math.floor(a, b, c);
185}
186noInline(mathFloorTooManyArguments);
187
188for (var i = 0; i < 1e4; ++i) {
189 var value = mathFloorNoArguments();
190 if (value === value)
191 throw new Error("mathFloorNoArguments() = " + value);
192
193 var value = mathFloorTooManyArguments(2.1, 3, 5);
194 if (value !== 2)
195 throw new Error("mathFloorTooManyArguments() = " + value);
196}
197
198
199// *** Constant as arguments. ***
200function testMathFloorOnConstants()
201{
202 var value = Math.floor(0);
203 if (value !== 0)
204 throw new Error("Math.floor(0) = " + value);
205 var value = Math.floor(-0);
206 if (!(value === 0 && (1/value) === -Infinity))
207 throw new Error("Math.floor(-0) = " + value);
208 var value = Math.floor(1);
209 if (value !== 1)
210 throw new Error("Math.floor(1) = " + value);
211 var value = Math.floor(-1);
212 if (value !== -1)
213 throw new Error("Math.floor(-1) = " + value);
214 var value = Math.floor(42);
215 if (value !== 42)
216 throw new Error("Math.floor(42) = " + value);
217 var value = Math.floor(-42.2);
218 if (value !== -43)
219 throw new Error("Math.floor(-42.2) = " + value);
220 var value = Math.floor(NaN);
221 if (value === value)
222 throw new Error("Math.floor(NaN) = " + value);
benjamin@webkit.org6c172232016-06-03 21:13:34 +0000223 var value = Math.floor(Number.POSITIVE_INFINITY);
224 if (value !== Infinity)
225 throw new Error("Math.floor(Number.POSITIVE_INFINITY) = " + value);
226 var value = Math.floor(Number.NEGATIVE_INFINITY);
227 if (value !== -Infinity)
228 throw new Error("Math.floor(Number.NEGATIVE_INFINITY) = " + value);
utatane.tea@gmail.com9971c632016-03-01 02:30:46 +0000229 var value = Math.floor(Math.E);
230 if (value !== 2)
231 throw new Error("Math.floor(Math.E) = " + value);
232}
233noInline(testMathFloorOnConstants);
234
235for (var i = 0; i < 1e4; ++i) {
236 testMathFloorOnConstants();
237}
238
239
240// *** Struct transition. ***
241function mathFloorStructTransition(value)
242{
243 return Math.floor(value);
244}
245noInline(mathFloorStructTransition);
246
247for (var i = 0; i < 1e4; ++i) {
248 var value = mathFloorStructTransition(42.5);
249 if (value !== 42)
250 throw new Error("mathFloorStructTransition(42.5) = " + value);
251}
252
253Math.floor = function() { return arguments[0] + 5; }
254
255var value = mathFloorStructTransition(42);
256if (value !== 47)
257 throw new Error("mathFloorStructTransition(42) after transition = " + value);