OLD | NEW |
| (Empty) |
1 // Copyright 2014 the V8 project authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 #include "src/v8.h" | |
6 | |
7 #include "test/cctest/cctest.h" | |
8 #include "test/cctest/compiler/codegen-tester.h" | |
9 #include "test/cctest/compiler/value-helper.h" | |
10 | |
11 using namespace v8::internal; | |
12 using namespace v8::internal::compiler; | |
13 | |
14 TEST(CompareWrapper) { | |
15 // Who tests the testers? | |
16 // If CompareWrapper is broken, then test expectations will be broken. | |
17 RawMachineAssemblerTester<int32_t> m; | |
18 CompareWrapper wWord32Equal(IrOpcode::kWord32Equal); | |
19 CompareWrapper wInt32LessThan(IrOpcode::kInt32LessThan); | |
20 CompareWrapper wInt32LessThanOrEqual(IrOpcode::kInt32LessThanOrEqual); | |
21 CompareWrapper wUint32LessThan(IrOpcode::kUint32LessThan); | |
22 CompareWrapper wUint32LessThanOrEqual(IrOpcode::kUint32LessThanOrEqual); | |
23 | |
24 { | |
25 FOR_INT32_INPUTS(pl) { | |
26 FOR_INT32_INPUTS(pr) { | |
27 int32_t a = *pl; | |
28 int32_t b = *pr; | |
29 CHECK_EQ(a == b, wWord32Equal.Int32Compare(a, b)); | |
30 CHECK_EQ(a < b, wInt32LessThan.Int32Compare(a, b)); | |
31 CHECK_EQ(a <= b, wInt32LessThanOrEqual.Int32Compare(a, b)); | |
32 } | |
33 } | |
34 } | |
35 | |
36 { | |
37 FOR_UINT32_INPUTS(pl) { | |
38 FOR_UINT32_INPUTS(pr) { | |
39 uint32_t a = *pl; | |
40 uint32_t b = *pr; | |
41 CHECK_EQ(a == b, wWord32Equal.Int32Compare(a, b)); | |
42 CHECK_EQ(a < b, wUint32LessThan.Int32Compare(a, b)); | |
43 CHECK_EQ(a <= b, wUint32LessThanOrEqual.Int32Compare(a, b)); | |
44 } | |
45 } | |
46 } | |
47 | |
48 CHECK_EQ(true, wWord32Equal.Int32Compare(0, 0)); | |
49 CHECK_EQ(true, wWord32Equal.Int32Compare(257, 257)); | |
50 CHECK_EQ(true, wWord32Equal.Int32Compare(65539, 65539)); | |
51 CHECK_EQ(true, wWord32Equal.Int32Compare(-1, -1)); | |
52 CHECK_EQ(true, wWord32Equal.Int32Compare(0xffffffff, 0xffffffff)); | |
53 | |
54 CHECK_EQ(false, wWord32Equal.Int32Compare(0, 1)); | |
55 CHECK_EQ(false, wWord32Equal.Int32Compare(257, 256)); | |
56 CHECK_EQ(false, wWord32Equal.Int32Compare(65539, 65537)); | |
57 CHECK_EQ(false, wWord32Equal.Int32Compare(-1, -2)); | |
58 CHECK_EQ(false, wWord32Equal.Int32Compare(0xffffffff, 0xfffffffe)); | |
59 | |
60 CHECK_EQ(false, wInt32LessThan.Int32Compare(0, 0)); | |
61 CHECK_EQ(false, wInt32LessThan.Int32Compare(357, 357)); | |
62 CHECK_EQ(false, wInt32LessThan.Int32Compare(75539, 75539)); | |
63 CHECK_EQ(false, wInt32LessThan.Int32Compare(-1, -1)); | |
64 CHECK_EQ(false, wInt32LessThan.Int32Compare(0xffffffff, 0xffffffff)); | |
65 | |
66 CHECK_EQ(true, wInt32LessThan.Int32Compare(0, 1)); | |
67 CHECK_EQ(true, wInt32LessThan.Int32Compare(456, 457)); | |
68 CHECK_EQ(true, wInt32LessThan.Int32Compare(85537, 85539)); | |
69 CHECK_EQ(true, wInt32LessThan.Int32Compare(-2, -1)); | |
70 CHECK_EQ(true, wInt32LessThan.Int32Compare(0xfffffffe, 0xffffffff)); | |
71 | |
72 CHECK_EQ(false, wInt32LessThan.Int32Compare(1, 0)); | |
73 CHECK_EQ(false, wInt32LessThan.Int32Compare(457, 456)); | |
74 CHECK_EQ(false, wInt32LessThan.Int32Compare(85539, 85537)); | |
75 CHECK_EQ(false, wInt32LessThan.Int32Compare(-1, -2)); | |
76 CHECK_EQ(false, wInt32LessThan.Int32Compare(0xffffffff, 0xfffffffe)); | |
77 | |
78 CHECK_EQ(true, wInt32LessThanOrEqual.Int32Compare(0, 0)); | |
79 CHECK_EQ(true, wInt32LessThanOrEqual.Int32Compare(357, 357)); | |
80 CHECK_EQ(true, wInt32LessThanOrEqual.Int32Compare(75539, 75539)); | |
81 CHECK_EQ(true, wInt32LessThanOrEqual.Int32Compare(-1, -1)); | |
82 CHECK_EQ(true, wInt32LessThanOrEqual.Int32Compare(0xffffffff, 0xffffffff)); | |
83 | |
84 CHECK_EQ(true, wInt32LessThanOrEqual.Int32Compare(0, 1)); | |
85 CHECK_EQ(true, wInt32LessThanOrEqual.Int32Compare(456, 457)); | |
86 CHECK_EQ(true, wInt32LessThanOrEqual.Int32Compare(85537, 85539)); | |
87 CHECK_EQ(true, wInt32LessThanOrEqual.Int32Compare(-2, -1)); | |
88 CHECK_EQ(true, wInt32LessThanOrEqual.Int32Compare(0xfffffffe, 0xffffffff)); | |
89 | |
90 CHECK_EQ(false, wInt32LessThanOrEqual.Int32Compare(1, 0)); | |
91 CHECK_EQ(false, wInt32LessThanOrEqual.Int32Compare(457, 456)); | |
92 CHECK_EQ(false, wInt32LessThanOrEqual.Int32Compare(85539, 85537)); | |
93 CHECK_EQ(false, wInt32LessThanOrEqual.Int32Compare(-1, -2)); | |
94 CHECK_EQ(false, wInt32LessThanOrEqual.Int32Compare(0xffffffff, 0xfffffffe)); | |
95 | |
96 // Unsigned comparisons. | |
97 CHECK_EQ(false, wUint32LessThan.Int32Compare(0, 0)); | |
98 CHECK_EQ(false, wUint32LessThan.Int32Compare(357, 357)); | |
99 CHECK_EQ(false, wUint32LessThan.Int32Compare(75539, 75539)); | |
100 CHECK_EQ(false, wUint32LessThan.Int32Compare(-1, -1)); | |
101 CHECK_EQ(false, wUint32LessThan.Int32Compare(0xffffffff, 0xffffffff)); | |
102 CHECK_EQ(false, wUint32LessThan.Int32Compare(0xffffffff, 0)); | |
103 CHECK_EQ(false, wUint32LessThan.Int32Compare(-2999, 0)); | |
104 | |
105 CHECK_EQ(true, wUint32LessThan.Int32Compare(0, 1)); | |
106 CHECK_EQ(true, wUint32LessThan.Int32Compare(456, 457)); | |
107 CHECK_EQ(true, wUint32LessThan.Int32Compare(85537, 85539)); | |
108 CHECK_EQ(true, wUint32LessThan.Int32Compare(-11, -10)); | |
109 CHECK_EQ(true, wUint32LessThan.Int32Compare(0xfffffffe, 0xffffffff)); | |
110 CHECK_EQ(true, wUint32LessThan.Int32Compare(0, 0xffffffff)); | |
111 CHECK_EQ(true, wUint32LessThan.Int32Compare(0, -2996)); | |
112 | |
113 CHECK_EQ(false, wUint32LessThan.Int32Compare(1, 0)); | |
114 CHECK_EQ(false, wUint32LessThan.Int32Compare(457, 456)); | |
115 CHECK_EQ(false, wUint32LessThan.Int32Compare(85539, 85537)); | |
116 CHECK_EQ(false, wUint32LessThan.Int32Compare(-10, -21)); | |
117 CHECK_EQ(false, wUint32LessThan.Int32Compare(0xffffffff, 0xfffffffe)); | |
118 | |
119 CHECK_EQ(true, wUint32LessThanOrEqual.Int32Compare(0, 0)); | |
120 CHECK_EQ(true, wUint32LessThanOrEqual.Int32Compare(357, 357)); | |
121 CHECK_EQ(true, wUint32LessThanOrEqual.Int32Compare(75539, 75539)); | |
122 CHECK_EQ(true, wUint32LessThanOrEqual.Int32Compare(-1, -1)); | |
123 CHECK_EQ(true, wUint32LessThanOrEqual.Int32Compare(0xffffffff, 0xffffffff)); | |
124 | |
125 CHECK_EQ(true, wUint32LessThanOrEqual.Int32Compare(0, 1)); | |
126 CHECK_EQ(true, wUint32LessThanOrEqual.Int32Compare(456, 457)); | |
127 CHECK_EQ(true, wUint32LessThanOrEqual.Int32Compare(85537, 85539)); | |
128 CHECK_EQ(true, wUint32LessThanOrEqual.Int32Compare(-300, -299)); | |
129 CHECK_EQ(true, wUint32LessThanOrEqual.Int32Compare(-300, -300)); | |
130 CHECK_EQ(true, wUint32LessThanOrEqual.Int32Compare(0xfffffffe, 0xffffffff)); | |
131 CHECK_EQ(true, wUint32LessThanOrEqual.Int32Compare(0, -2995)); | |
132 | |
133 CHECK_EQ(false, wUint32LessThanOrEqual.Int32Compare(1, 0)); | |
134 CHECK_EQ(false, wUint32LessThanOrEqual.Int32Compare(457, 456)); | |
135 CHECK_EQ(false, wUint32LessThanOrEqual.Int32Compare(85539, 85537)); | |
136 CHECK_EQ(false, wUint32LessThanOrEqual.Int32Compare(-130, -170)); | |
137 CHECK_EQ(false, wUint32LessThanOrEqual.Int32Compare(0xffffffff, 0xfffffffe)); | |
138 CHECK_EQ(false, wUint32LessThanOrEqual.Int32Compare(-2997, 0)); | |
139 | |
140 CompareWrapper wFloat64Equal(IrOpcode::kFloat64Equal); | |
141 CompareWrapper wFloat64LessThan(IrOpcode::kFloat64LessThan); | |
142 CompareWrapper wFloat64LessThanOrEqual(IrOpcode::kFloat64LessThanOrEqual); | |
143 | |
144 // Check NaN handling. | |
145 double nan = v8::base::OS::nan_value(); | |
146 double inf = V8_INFINITY; | |
147 CHECK_EQ(false, wFloat64Equal.Float64Compare(nan, 0.0)); | |
148 CHECK_EQ(false, wFloat64Equal.Float64Compare(nan, 1.0)); | |
149 CHECK_EQ(false, wFloat64Equal.Float64Compare(nan, inf)); | |
150 CHECK_EQ(false, wFloat64Equal.Float64Compare(nan, -inf)); | |
151 CHECK_EQ(false, wFloat64Equal.Float64Compare(nan, nan)); | |
152 | |
153 CHECK_EQ(false, wFloat64Equal.Float64Compare(0.0, nan)); | |
154 CHECK_EQ(false, wFloat64Equal.Float64Compare(1.0, nan)); | |
155 CHECK_EQ(false, wFloat64Equal.Float64Compare(inf, nan)); | |
156 CHECK_EQ(false, wFloat64Equal.Float64Compare(-inf, nan)); | |
157 CHECK_EQ(false, wFloat64Equal.Float64Compare(nan, nan)); | |
158 | |
159 CHECK_EQ(false, wFloat64LessThan.Float64Compare(nan, 0.0)); | |
160 CHECK_EQ(false, wFloat64LessThan.Float64Compare(nan, 1.0)); | |
161 CHECK_EQ(false, wFloat64LessThan.Float64Compare(nan, inf)); | |
162 CHECK_EQ(false, wFloat64LessThan.Float64Compare(nan, -inf)); | |
163 CHECK_EQ(false, wFloat64LessThan.Float64Compare(nan, nan)); | |
164 | |
165 CHECK_EQ(false, wFloat64LessThan.Float64Compare(0.0, nan)); | |
166 CHECK_EQ(false, wFloat64LessThan.Float64Compare(1.0, nan)); | |
167 CHECK_EQ(false, wFloat64LessThan.Float64Compare(inf, nan)); | |
168 CHECK_EQ(false, wFloat64LessThan.Float64Compare(-inf, nan)); | |
169 CHECK_EQ(false, wFloat64LessThan.Float64Compare(nan, nan)); | |
170 | |
171 CHECK_EQ(false, wFloat64LessThanOrEqual.Float64Compare(nan, 0.0)); | |
172 CHECK_EQ(false, wFloat64LessThanOrEqual.Float64Compare(nan, 1.0)); | |
173 CHECK_EQ(false, wFloat64LessThanOrEqual.Float64Compare(nan, inf)); | |
174 CHECK_EQ(false, wFloat64LessThanOrEqual.Float64Compare(nan, -inf)); | |
175 CHECK_EQ(false, wFloat64LessThanOrEqual.Float64Compare(nan, nan)); | |
176 | |
177 CHECK_EQ(false, wFloat64LessThanOrEqual.Float64Compare(0.0, nan)); | |
178 CHECK_EQ(false, wFloat64LessThanOrEqual.Float64Compare(1.0, nan)); | |
179 CHECK_EQ(false, wFloat64LessThanOrEqual.Float64Compare(inf, nan)); | |
180 CHECK_EQ(false, wFloat64LessThanOrEqual.Float64Compare(-inf, nan)); | |
181 CHECK_EQ(false, wFloat64LessThanOrEqual.Float64Compare(nan, nan)); | |
182 | |
183 // Check inf handling. | |
184 CHECK_EQ(false, wFloat64Equal.Float64Compare(inf, 0.0)); | |
185 CHECK_EQ(false, wFloat64Equal.Float64Compare(inf, 1.0)); | |
186 CHECK_EQ(true, wFloat64Equal.Float64Compare(inf, inf)); | |
187 CHECK_EQ(false, wFloat64Equal.Float64Compare(inf, -inf)); | |
188 | |
189 CHECK_EQ(false, wFloat64Equal.Float64Compare(0.0, inf)); | |
190 CHECK_EQ(false, wFloat64Equal.Float64Compare(1.0, inf)); | |
191 CHECK_EQ(true, wFloat64Equal.Float64Compare(inf, inf)); | |
192 CHECK_EQ(false, wFloat64Equal.Float64Compare(-inf, inf)); | |
193 | |
194 CHECK_EQ(false, wFloat64LessThan.Float64Compare(inf, 0.0)); | |
195 CHECK_EQ(false, wFloat64LessThan.Float64Compare(inf, 1.0)); | |
196 CHECK_EQ(false, wFloat64LessThan.Float64Compare(inf, inf)); | |
197 CHECK_EQ(false, wFloat64LessThan.Float64Compare(inf, -inf)); | |
198 | |
199 CHECK_EQ(true, wFloat64LessThan.Float64Compare(0.0, inf)); | |
200 CHECK_EQ(true, wFloat64LessThan.Float64Compare(1.0, inf)); | |
201 CHECK_EQ(false, wFloat64LessThan.Float64Compare(inf, inf)); | |
202 CHECK_EQ(true, wFloat64LessThan.Float64Compare(-inf, inf)); | |
203 | |
204 CHECK_EQ(false, wFloat64LessThanOrEqual.Float64Compare(inf, 0.0)); | |
205 CHECK_EQ(false, wFloat64LessThanOrEqual.Float64Compare(inf, 1.0)); | |
206 CHECK_EQ(true, wFloat64LessThanOrEqual.Float64Compare(inf, inf)); | |
207 CHECK_EQ(false, wFloat64LessThanOrEqual.Float64Compare(inf, -inf)); | |
208 | |
209 CHECK_EQ(true, wFloat64LessThanOrEqual.Float64Compare(0.0, inf)); | |
210 CHECK_EQ(true, wFloat64LessThanOrEqual.Float64Compare(1.0, inf)); | |
211 CHECK_EQ(true, wFloat64LessThanOrEqual.Float64Compare(inf, inf)); | |
212 CHECK_EQ(true, wFloat64LessThanOrEqual.Float64Compare(-inf, inf)); | |
213 | |
214 // Check -inf handling. | |
215 CHECK_EQ(false, wFloat64Equal.Float64Compare(-inf, 0.0)); | |
216 CHECK_EQ(false, wFloat64Equal.Float64Compare(-inf, 1.0)); | |
217 CHECK_EQ(false, wFloat64Equal.Float64Compare(-inf, inf)); | |
218 CHECK_EQ(true, wFloat64Equal.Float64Compare(-inf, -inf)); | |
219 | |
220 CHECK_EQ(false, wFloat64Equal.Float64Compare(0.0, -inf)); | |
221 CHECK_EQ(false, wFloat64Equal.Float64Compare(1.0, -inf)); | |
222 CHECK_EQ(false, wFloat64Equal.Float64Compare(inf, -inf)); | |
223 CHECK_EQ(true, wFloat64Equal.Float64Compare(-inf, -inf)); | |
224 | |
225 CHECK_EQ(true, wFloat64LessThan.Float64Compare(-inf, 0.0)); | |
226 CHECK_EQ(true, wFloat64LessThan.Float64Compare(-inf, 1.0)); | |
227 CHECK_EQ(true, wFloat64LessThan.Float64Compare(-inf, inf)); | |
228 CHECK_EQ(false, wFloat64LessThan.Float64Compare(-inf, -inf)); | |
229 | |
230 CHECK_EQ(false, wFloat64LessThan.Float64Compare(0.0, -inf)); | |
231 CHECK_EQ(false, wFloat64LessThan.Float64Compare(1.0, -inf)); | |
232 CHECK_EQ(false, wFloat64LessThan.Float64Compare(inf, -inf)); | |
233 CHECK_EQ(false, wFloat64LessThan.Float64Compare(-inf, -inf)); | |
234 | |
235 CHECK_EQ(true, wFloat64LessThanOrEqual.Float64Compare(-inf, 0.0)); | |
236 CHECK_EQ(true, wFloat64LessThanOrEqual.Float64Compare(-inf, 1.0)); | |
237 CHECK_EQ(true, wFloat64LessThanOrEqual.Float64Compare(-inf, inf)); | |
238 CHECK_EQ(true, wFloat64LessThanOrEqual.Float64Compare(-inf, -inf)); | |
239 | |
240 CHECK_EQ(false, wFloat64LessThanOrEqual.Float64Compare(0.0, -inf)); | |
241 CHECK_EQ(false, wFloat64LessThanOrEqual.Float64Compare(1.0, -inf)); | |
242 CHECK_EQ(false, wFloat64LessThanOrEqual.Float64Compare(inf, -inf)); | |
243 CHECK_EQ(true, wFloat64LessThanOrEqual.Float64Compare(-inf, -inf)); | |
244 | |
245 // Check basic values. | |
246 CHECK_EQ(true, wFloat64Equal.Float64Compare(0, 0)); | |
247 CHECK_EQ(true, wFloat64Equal.Float64Compare(257.1, 257.1)); | |
248 CHECK_EQ(true, wFloat64Equal.Float64Compare(65539.1, 65539.1)); | |
249 CHECK_EQ(true, wFloat64Equal.Float64Compare(-1.1, -1.1)); | |
250 | |
251 CHECK_EQ(false, wFloat64Equal.Float64Compare(0, 1)); | |
252 CHECK_EQ(false, wFloat64Equal.Float64Compare(257.2, 256.2)); | |
253 CHECK_EQ(false, wFloat64Equal.Float64Compare(65539.2, 65537.2)); | |
254 CHECK_EQ(false, wFloat64Equal.Float64Compare(-1.2, -2.2)); | |
255 | |
256 CHECK_EQ(false, wFloat64LessThan.Float64Compare(0, 0)); | |
257 CHECK_EQ(false, wFloat64LessThan.Float64Compare(357.3, 357.3)); | |
258 CHECK_EQ(false, wFloat64LessThan.Float64Compare(75539.3, 75539.3)); | |
259 CHECK_EQ(false, wFloat64LessThan.Float64Compare(-1.3, -1.3)); | |
260 | |
261 CHECK_EQ(true, wFloat64LessThan.Float64Compare(0, 1)); | |
262 CHECK_EQ(true, wFloat64LessThan.Float64Compare(456.4, 457.4)); | |
263 CHECK_EQ(true, wFloat64LessThan.Float64Compare(85537.4, 85539.4)); | |
264 CHECK_EQ(true, wFloat64LessThan.Float64Compare(-2.4, -1.4)); | |
265 | |
266 CHECK_EQ(false, wFloat64LessThan.Float64Compare(1, 0)); | |
267 CHECK_EQ(false, wFloat64LessThan.Float64Compare(457.5, 456.5)); | |
268 CHECK_EQ(false, wFloat64LessThan.Float64Compare(85539.5, 85537.5)); | |
269 CHECK_EQ(false, wFloat64LessThan.Float64Compare(-1.5, -2.5)); | |
270 | |
271 CHECK_EQ(true, wFloat64LessThanOrEqual.Float64Compare(0, 0)); | |
272 CHECK_EQ(true, wFloat64LessThanOrEqual.Float64Compare(357.6, 357.6)); | |
273 CHECK_EQ(true, wFloat64LessThanOrEqual.Float64Compare(75539.6, 75539.6)); | |
274 CHECK_EQ(true, wFloat64LessThanOrEqual.Float64Compare(-1.6, -1.6)); | |
275 | |
276 CHECK_EQ(true, wFloat64LessThanOrEqual.Float64Compare(0, 1)); | |
277 CHECK_EQ(true, wFloat64LessThanOrEqual.Float64Compare(456.7, 457.7)); | |
278 CHECK_EQ(true, wFloat64LessThanOrEqual.Float64Compare(85537.7, 85539.7)); | |
279 CHECK_EQ(true, wFloat64LessThanOrEqual.Float64Compare(-2.7, -1.7)); | |
280 | |
281 CHECK_EQ(false, wFloat64LessThanOrEqual.Float64Compare(1, 0)); | |
282 CHECK_EQ(false, wFloat64LessThanOrEqual.Float64Compare(457.8, 456.8)); | |
283 CHECK_EQ(false, wFloat64LessThanOrEqual.Float64Compare(85539.8, 85537.8)); | |
284 CHECK_EQ(false, wFloat64LessThanOrEqual.Float64Compare(-1.8, -2.8)); | |
285 } | |
286 | |
287 | |
288 void Int32BinopInputShapeTester::TestAllInputShapes() { | |
289 std::vector<int32_t> inputs = ValueHelper::int32_vector(); | |
290 int num_int_inputs = static_cast<int>(inputs.size()); | |
291 if (num_int_inputs > 16) num_int_inputs = 16; // limit to 16 inputs | |
292 | |
293 for (int i = -2; i < num_int_inputs; i++) { // for all left shapes | |
294 for (int j = -2; j < num_int_inputs; j++) { // for all right shapes | |
295 if (i >= 0 && j >= 0) break; // No constant/constant combos | |
296 RawMachineAssemblerTester<int32_t> m(kMachineWord32, kMachineWord32); | |
297 Node* p0 = m.Parameter(0); | |
298 Node* p1 = m.Parameter(1); | |
299 Node* n0; | |
300 Node* n1; | |
301 | |
302 // left = Parameter | Load | Constant | |
303 if (i == -2) { | |
304 n0 = p0; | |
305 } else if (i == -1) { | |
306 n0 = m.LoadFromPointer(&input_a, kMachineWord32); | |
307 } else { | |
308 n0 = m.Int32Constant(inputs[i]); | |
309 } | |
310 | |
311 // right = Parameter | Load | Constant | |
312 if (j == -2) { | |
313 n1 = p1; | |
314 } else if (j == -1) { | |
315 n1 = m.LoadFromPointer(&input_b, kMachineWord32); | |
316 } else { | |
317 n1 = m.Int32Constant(inputs[j]); | |
318 } | |
319 | |
320 gen->gen(&m, n0, n1); | |
321 | |
322 if (false) printf("Int32BinopInputShapeTester i=%d, j=%d\n", i, j); | |
323 if (i >= 0) { | |
324 input_a = inputs[i]; | |
325 RunRight(&m); | |
326 } else if (j >= 0) { | |
327 input_b = inputs[j]; | |
328 RunLeft(&m); | |
329 } else { | |
330 Run(&m); | |
331 } | |
332 } | |
333 } | |
334 } | |
335 | |
336 | |
337 void Int32BinopInputShapeTester::Run(RawMachineAssemblerTester<int32_t>* m) { | |
338 FOR_INT32_INPUTS(pl) { | |
339 FOR_INT32_INPUTS(pr) { | |
340 input_a = *pl; | |
341 input_b = *pr; | |
342 int32_t expect = gen->expected(input_a, input_b); | |
343 if (false) printf(" cmp(a=%d, b=%d) ?== %d\n", input_a, input_b, expect); | |
344 CHECK_EQ(expect, m->Call(input_a, input_b)); | |
345 } | |
346 } | |
347 } | |
348 | |
349 | |
350 void Int32BinopInputShapeTester::RunLeft( | |
351 RawMachineAssemblerTester<int32_t>* m) { | |
352 FOR_UINT32_INPUTS(i) { | |
353 input_a = *i; | |
354 int32_t expect = gen->expected(input_a, input_b); | |
355 if (false) printf(" cmp(a=%d, b=%d) ?== %d\n", input_a, input_b, expect); | |
356 CHECK_EQ(expect, m->Call(input_a, input_b)); | |
357 } | |
358 } | |
359 | |
360 | |
361 void Int32BinopInputShapeTester::RunRight( | |
362 RawMachineAssemblerTester<int32_t>* m) { | |
363 FOR_UINT32_INPUTS(i) { | |
364 input_b = *i; | |
365 int32_t expect = gen->expected(input_a, input_b); | |
366 if (false) printf(" cmp(a=%d, b=%d) ?== %d\n", input_a, input_b, expect); | |
367 CHECK_EQ(expect, m->Call(input_a, input_b)); | |
368 } | |
369 } | |
370 | |
371 | |
372 TEST(ParametersEqual) { | |
373 RawMachineAssemblerTester<int32_t> m(kMachineWord32, kMachineWord32); | |
374 Node* p1 = m.Parameter(1); | |
375 CHECK_NE(NULL, p1); | |
376 Node* p0 = m.Parameter(0); | |
377 CHECK_NE(NULL, p0); | |
378 CHECK_EQ(p0, m.Parameter(0)); | |
379 CHECK_EQ(p1, m.Parameter(1)); | |
380 } | |
381 | |
382 | |
383 #if V8_TURBOFAN_TARGET | |
384 | |
385 void RunSmiConstant(int32_t v) { | |
386 // TODO(dcarney): on x64 Smis are generated with the SmiConstantRegister | |
387 #if !V8_TARGET_ARCH_X64 | |
388 if (Smi::IsValid(v)) { | |
389 RawMachineAssemblerTester<Object*> m; | |
390 m.Return(m.NumberConstant(v)); | |
391 CHECK_EQ(Smi::FromInt(v), m.Call()); | |
392 } | |
393 #endif | |
394 } | |
395 | |
396 | |
397 void RunNumberConstant(double v) { | |
398 RawMachineAssemblerTester<Object*> m; | |
399 #if V8_TARGET_ARCH_X64 | |
400 // TODO(dcarney): on x64 Smis are generated with the SmiConstantRegister | |
401 Handle<Object> number = m.isolate()->factory()->NewNumber(v); | |
402 if (number->IsSmi()) return; | |
403 #endif | |
404 m.Return(m.NumberConstant(v)); | |
405 Object* result = m.Call(); | |
406 m.CheckNumber(v, result); | |
407 } | |
408 | |
409 | |
410 TEST(RunEmpty) { | |
411 RawMachineAssemblerTester<int32_t> m; | |
412 m.Return(m.Int32Constant(0)); | |
413 CHECK_EQ(0, m.Call()); | |
414 } | |
415 | |
416 | |
417 TEST(RunInt32Constants) { | |
418 FOR_INT32_INPUTS(i) { | |
419 RawMachineAssemblerTester<int32_t> m; | |
420 m.Return(m.Int32Constant(*i)); | |
421 CHECK_EQ(*i, m.Call()); | |
422 } | |
423 } | |
424 | |
425 | |
426 TEST(RunSmiConstants) { | |
427 for (int32_t i = 1; i < Smi::kMaxValue && i != 0; i = i << 1) { | |
428 RunSmiConstant(i); | |
429 RunSmiConstant(3 * i); | |
430 RunSmiConstant(5 * i); | |
431 RunSmiConstant(-i); | |
432 RunSmiConstant(i | 1); | |
433 RunSmiConstant(i | 3); | |
434 } | |
435 RunSmiConstant(Smi::kMaxValue); | |
436 RunSmiConstant(Smi::kMaxValue - 1); | |
437 RunSmiConstant(Smi::kMinValue); | |
438 RunSmiConstant(Smi::kMinValue + 1); | |
439 | |
440 FOR_INT32_INPUTS(i) { RunSmiConstant(*i); } | |
441 } | |
442 | |
443 | |
444 TEST(RunNumberConstants) { | |
445 { | |
446 FOR_FLOAT64_INPUTS(i) { RunNumberConstant(*i); } | |
447 } | |
448 { | |
449 FOR_INT32_INPUTS(i) { RunNumberConstant(*i); } | |
450 } | |
451 | |
452 for (int32_t i = 1; i < Smi::kMaxValue && i != 0; i = i << 1) { | |
453 RunNumberConstant(i); | |
454 RunNumberConstant(-i); | |
455 RunNumberConstant(i | 1); | |
456 RunNumberConstant(i | 3); | |
457 } | |
458 RunNumberConstant(Smi::kMaxValue); | |
459 RunNumberConstant(Smi::kMaxValue - 1); | |
460 RunNumberConstant(Smi::kMinValue); | |
461 RunNumberConstant(Smi::kMinValue + 1); | |
462 } | |
463 | |
464 | |
465 TEST(RunEmptyString) { | |
466 RawMachineAssemblerTester<Object*> m; | |
467 m.Return(m.StringConstant("empty")); | |
468 m.CheckString("empty", m.Call()); | |
469 } | |
470 | |
471 | |
472 TEST(RunHeapConstant) { | |
473 RawMachineAssemblerTester<Object*> m; | |
474 m.Return(m.StringConstant("empty")); | |
475 m.CheckString("empty", m.Call()); | |
476 } | |
477 | |
478 | |
479 TEST(RunHeapNumberConstant) { | |
480 RawMachineAssemblerTester<Object*> m; | |
481 Handle<Object> number = m.isolate()->factory()->NewHeapNumber(100.5); | |
482 m.Return(m.HeapConstant(number)); | |
483 Object* result = m.Call(); | |
484 CHECK_EQ(result, *number); | |
485 } | |
486 | |
487 | |
488 TEST(RunParam1) { | |
489 RawMachineAssemblerTester<int32_t> m(kMachineWord32); | |
490 m.Return(m.Parameter(0)); | |
491 | |
492 FOR_INT32_INPUTS(i) { | |
493 int32_t result = m.Call(*i); | |
494 CHECK_EQ(*i, result); | |
495 } | |
496 } | |
497 | |
498 | |
499 TEST(RunParam2_1) { | |
500 RawMachineAssemblerTester<int32_t> m(kMachineWord32, kMachineWord32); | |
501 Node* p0 = m.Parameter(0); | |
502 Node* p1 = m.Parameter(1); | |
503 m.Return(p0); | |
504 USE(p1); | |
505 | |
506 FOR_INT32_INPUTS(i) { | |
507 int32_t result = m.Call(*i, -9999); | |
508 CHECK_EQ(*i, result); | |
509 } | |
510 } | |
511 | |
512 | |
513 TEST(RunParam2_2) { | |
514 RawMachineAssemblerTester<int32_t> m(kMachineWord32, kMachineWord32); | |
515 Node* p0 = m.Parameter(0); | |
516 Node* p1 = m.Parameter(1); | |
517 m.Return(p1); | |
518 USE(p0); | |
519 | |
520 FOR_INT32_INPUTS(i) { | |
521 int32_t result = m.Call(-7777, *i); | |
522 CHECK_EQ(*i, result); | |
523 } | |
524 } | |
525 | |
526 | |
527 TEST(RunParam3) { | |
528 for (int i = 0; i < 3; i++) { | |
529 RawMachineAssemblerTester<int32_t> m(kMachineWord32, kMachineWord32, | |
530 kMachineWord32); | |
531 Node* nodes[] = {m.Parameter(0), m.Parameter(1), m.Parameter(2)}; | |
532 m.Return(nodes[i]); | |
533 | |
534 int p[] = {-99, -77, -88}; | |
535 FOR_INT32_INPUTS(j) { | |
536 p[i] = *j; | |
537 int32_t result = m.Call(p[0], p[1], p[2]); | |
538 CHECK_EQ(*j, result); | |
539 } | |
540 } | |
541 } | |
542 | |
543 | |
544 TEST(RunBinopTester) { | |
545 { | |
546 RawMachineAssemblerTester<int32_t> m; | |
547 Int32BinopTester bt(&m); | |
548 bt.AddReturn(bt.param0); | |
549 | |
550 FOR_INT32_INPUTS(i) { CHECK_EQ(*i, bt.call(*i, 777)); } | |
551 } | |
552 | |
553 { | |
554 RawMachineAssemblerTester<int32_t> m; | |
555 Int32BinopTester bt(&m); | |
556 bt.AddReturn(bt.param1); | |
557 | |
558 FOR_INT32_INPUTS(i) { CHECK_EQ(*i, bt.call(666, *i)); } | |
559 } | |
560 | |
561 { | |
562 RawMachineAssemblerTester<int32_t> m; | |
563 Float64BinopTester bt(&m); | |
564 bt.AddReturn(bt.param0); | |
565 | |
566 FOR_FLOAT64_INPUTS(i) { CHECK_EQ(*i, bt.call(*i, 9.0)); } | |
567 } | |
568 | |
569 { | |
570 RawMachineAssemblerTester<int32_t> m; | |
571 Float64BinopTester bt(&m); | |
572 bt.AddReturn(bt.param1); | |
573 | |
574 FOR_FLOAT64_INPUTS(i) { CHECK_EQ(*i, bt.call(-11.25, *i)); } | |
575 } | |
576 } | |
577 | |
578 #endif // V8_TURBOFAN_TARGET | |
OLD | NEW |