OLD | NEW |
1 // Copyright 2014 the V8 project authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include <limits> | 5 #include <limits> |
6 | 6 |
7 #include "test/cctest/cctest.h" | 7 #include "test/cctest/cctest.h" |
8 #include "test/cctest/compiler/codegen-tester.h" | 8 #include "test/cctest/compiler/codegen-tester.h" |
9 #include "test/cctest/compiler/graph-builder-tester.h" | 9 #include "test/cctest/compiler/graph-builder-tester.h" |
10 #include "test/cctest/compiler/value-helper.h" | 10 #include "test/cctest/compiler/value-helper.h" |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
76 CHECK(m.HasValue()); | 76 CHECK(m.HasValue()); |
77 CheckDoubleEq(expected, m.Value()); | 77 CheckDoubleEq(expected, m.Value()); |
78 } | 78 } |
79 | 79 |
80 Node* Parameter(int index = 0) { | 80 Node* Parameter(int index = 0) { |
81 Node* n = graph()->NewNode(common()->Parameter(index), graph()->start()); | 81 Node* n = graph()->NewNode(common()->Parameter(index), graph()->start()); |
82 NodeProperties::SetType(n, Type::Any()); | 82 NodeProperties::SetType(n, Type::Any()); |
83 return n; | 83 return n; |
84 } | 84 } |
85 | 85 |
86 void CheckTypeError(MachineType from, MachineRepresentation to) { | 86 void CheckTypeError(MachineRepresentation from, Type* from_type, |
| 87 MachineRepresentation to) { |
87 changer()->testing_type_errors_ = true; | 88 changer()->testing_type_errors_ = true; |
88 changer()->type_error_ = false; | 89 changer()->type_error_ = false; |
89 Node* n = Parameter(0); | 90 Node* n = Parameter(0); |
90 Node* c = changer()->GetRepresentationFor(n, from, to); | 91 Node* c = changer()->GetRepresentationFor(n, from, from_type, to); |
91 CHECK(changer()->type_error_); | 92 CHECK(changer()->type_error_); |
92 CHECK_EQ(n, c); | 93 CHECK_EQ(n, c); |
93 } | 94 } |
94 | 95 |
95 void CheckNop(MachineType from, MachineRepresentation to) { | 96 void CheckNop(MachineRepresentation from, Type* from_type, |
| 97 MachineRepresentation to) { |
96 Node* n = Parameter(0); | 98 Node* n = Parameter(0); |
97 Node* c = changer()->GetRepresentationFor(n, from, to); | 99 Node* c = changer()->GetRepresentationFor(n, from, from_type, to); |
98 CHECK_EQ(n, c); | 100 CHECK_EQ(n, c); |
99 } | 101 } |
100 }; | 102 }; |
101 | 103 |
102 | 104 |
103 const MachineType kMachineTypes[] = { | 105 const MachineType kMachineTypes[] = { |
104 MachineType::Float32(), MachineType::Float64(), MachineType::Int8(), | 106 MachineType::Float32(), MachineType::Float64(), MachineType::Int8(), |
105 MachineType::Uint8(), MachineType::Int16(), MachineType::Uint16(), | 107 MachineType::Uint8(), MachineType::Int16(), MachineType::Uint16(), |
106 MachineType::Int32(), MachineType::Uint32(), MachineType::Int64(), | 108 MachineType::Int32(), MachineType::Uint32(), MachineType::Int64(), |
107 MachineType::Uint64(), MachineType::AnyTagged()}; | 109 MachineType::Uint64(), MachineType::AnyTagged()}; |
108 | 110 |
109 | 111 |
110 TEST(BoolToBit_constant) { | 112 TEST(BoolToBit_constant) { |
111 RepresentationChangerTester r; | 113 RepresentationChangerTester r; |
112 | 114 |
113 Node* true_node = r.jsgraph()->TrueConstant(); | 115 Node* true_node = r.jsgraph()->TrueConstant(); |
114 Node* true_bit = r.changer()->GetRepresentationFor( | 116 Node* true_bit = r.changer()->GetRepresentationFor( |
115 true_node, MachineType::RepTagged(), MachineRepresentation::kBit); | 117 true_node, MachineRepresentation::kTagged, Type::None(), |
| 118 MachineRepresentation::kBit); |
116 r.CheckInt32Constant(true_bit, 1); | 119 r.CheckInt32Constant(true_bit, 1); |
117 | 120 |
118 Node* false_node = r.jsgraph()->FalseConstant(); | 121 Node* false_node = r.jsgraph()->FalseConstant(); |
119 Node* false_bit = r.changer()->GetRepresentationFor( | 122 Node* false_bit = r.changer()->GetRepresentationFor( |
120 false_node, MachineType::RepTagged(), MachineRepresentation::kBit); | 123 false_node, MachineRepresentation::kTagged, Type::None(), |
| 124 MachineRepresentation::kBit); |
121 r.CheckInt32Constant(false_bit, 0); | 125 r.CheckInt32Constant(false_bit, 0); |
122 } | 126 } |
123 | 127 |
124 | 128 |
125 TEST(BitToBool_constant) { | 129 TEST(BitToBool_constant) { |
126 RepresentationChangerTester r; | 130 RepresentationChangerTester r; |
127 | 131 |
128 for (int i = -5; i < 5; i++) { | 132 for (int i = -5; i < 5; i++) { |
129 Node* node = r.jsgraph()->Int32Constant(i); | 133 Node* node = r.jsgraph()->Int32Constant(i); |
130 Node* val = r.changer()->GetRepresentationFor( | 134 Node* val = r.changer()->GetRepresentationFor( |
131 node, MachineType::RepBit(), MachineRepresentation::kTagged); | 135 node, MachineRepresentation::kBit, Type::Boolean(), |
| 136 MachineRepresentation::kTagged); |
132 r.CheckHeapConstant(val, i == 0 ? r.isolate()->heap()->false_value() | 137 r.CheckHeapConstant(val, i == 0 ? r.isolate()->heap()->false_value() |
133 : r.isolate()->heap()->true_value()); | 138 : r.isolate()->heap()->true_value()); |
134 } | 139 } |
135 } | 140 } |
136 | 141 |
137 | 142 |
138 TEST(ToTagged_constant) { | 143 TEST(ToTagged_constant) { |
139 RepresentationChangerTester r; | 144 RepresentationChangerTester r; |
140 | 145 |
141 { | 146 { |
142 FOR_FLOAT64_INPUTS(i) { | 147 FOR_FLOAT64_INPUTS(i) { |
143 Node* n = r.jsgraph()->Float64Constant(*i); | 148 Node* n = r.jsgraph()->Float64Constant(*i); |
144 Node* c = r.changer()->GetRepresentationFor( | 149 Node* c = r.changer()->GetRepresentationFor( |
145 n, MachineType::RepFloat64(), MachineRepresentation::kTagged); | 150 n, MachineRepresentation::kFloat64, Type::None(), |
| 151 MachineRepresentation::kTagged); |
146 r.CheckNumberConstant(c, *i); | 152 r.CheckNumberConstant(c, *i); |
147 } | 153 } |
148 } | 154 } |
149 | 155 |
150 { | 156 { |
151 FOR_FLOAT64_INPUTS(i) { | 157 FOR_FLOAT64_INPUTS(i) { |
152 Node* n = r.jsgraph()->Constant(*i); | 158 Node* n = r.jsgraph()->Constant(*i); |
153 Node* c = r.changer()->GetRepresentationFor( | 159 Node* c = r.changer()->GetRepresentationFor( |
154 n, MachineType::RepFloat64(), MachineRepresentation::kTagged); | 160 n, MachineRepresentation::kFloat64, Type::None(), |
| 161 MachineRepresentation::kTagged); |
155 r.CheckNumberConstant(c, *i); | 162 r.CheckNumberConstant(c, *i); |
156 } | 163 } |
157 } | 164 } |
158 | 165 |
159 { | 166 { |
160 FOR_FLOAT32_INPUTS(i) { | 167 FOR_FLOAT32_INPUTS(i) { |
161 Node* n = r.jsgraph()->Float32Constant(*i); | 168 Node* n = r.jsgraph()->Float32Constant(*i); |
162 Node* c = r.changer()->GetRepresentationFor( | 169 Node* c = r.changer()->GetRepresentationFor( |
163 n, MachineType::RepFloat32(), MachineRepresentation::kTagged); | 170 n, MachineRepresentation::kFloat32, Type::None(), |
| 171 MachineRepresentation::kTagged); |
164 r.CheckNumberConstant(c, *i); | 172 r.CheckNumberConstant(c, *i); |
165 } | 173 } |
166 } | 174 } |
167 | 175 |
168 { | 176 { |
169 FOR_INT32_INPUTS(i) { | 177 FOR_INT32_INPUTS(i) { |
170 Node* n = r.jsgraph()->Int32Constant(*i); | 178 Node* n = r.jsgraph()->Int32Constant(*i); |
171 Node* c = r.changer()->GetRepresentationFor( | 179 Node* c = r.changer()->GetRepresentationFor( |
172 n, MachineType::Int32(), MachineRepresentation::kTagged); | 180 n, MachineRepresentation::kWord32, Type::Signed32(), |
| 181 MachineRepresentation::kTagged); |
173 r.CheckNumberConstant(c, *i); | 182 r.CheckNumberConstant(c, *i); |
174 } | 183 } |
175 } | 184 } |
176 | 185 |
177 { | 186 { |
178 FOR_UINT32_INPUTS(i) { | 187 FOR_UINT32_INPUTS(i) { |
179 Node* n = r.jsgraph()->Int32Constant(*i); | 188 Node* n = r.jsgraph()->Int32Constant(*i); |
180 Node* c = r.changer()->GetRepresentationFor( | 189 Node* c = r.changer()->GetRepresentationFor( |
181 n, MachineType::Uint32(), MachineRepresentation::kTagged); | 190 n, MachineRepresentation::kWord32, Type::Unsigned32(), |
| 191 MachineRepresentation::kTagged); |
182 r.CheckNumberConstant(c, *i); | 192 r.CheckNumberConstant(c, *i); |
183 } | 193 } |
184 } | 194 } |
185 } | 195 } |
186 | 196 |
187 | 197 |
188 TEST(ToFloat64_constant) { | 198 TEST(ToFloat64_constant) { |
189 RepresentationChangerTester r; | 199 RepresentationChangerTester r; |
190 | 200 |
191 { | 201 { |
192 FOR_FLOAT64_INPUTS(i) { | 202 FOR_FLOAT64_INPUTS(i) { |
193 Node* n = r.jsgraph()->Float64Constant(*i); | 203 Node* n = r.jsgraph()->Float64Constant(*i); |
194 Node* c = r.changer()->GetRepresentationFor( | 204 Node* c = r.changer()->GetRepresentationFor( |
195 n, MachineType::RepFloat64(), MachineRepresentation::kFloat64); | 205 n, MachineRepresentation::kFloat64, Type::None(), |
| 206 MachineRepresentation::kFloat64); |
196 CHECK_EQ(n, c); | 207 CHECK_EQ(n, c); |
197 } | 208 } |
198 } | 209 } |
199 | 210 |
200 { | 211 { |
201 FOR_FLOAT64_INPUTS(i) { | 212 FOR_FLOAT64_INPUTS(i) { |
202 Node* n = r.jsgraph()->Constant(*i); | 213 Node* n = r.jsgraph()->Constant(*i); |
203 Node* c = r.changer()->GetRepresentationFor( | 214 Node* c = r.changer()->GetRepresentationFor( |
204 n, MachineType::RepTagged(), MachineRepresentation::kFloat64); | 215 n, MachineRepresentation::kTagged, Type::None(), |
| 216 MachineRepresentation::kFloat64); |
205 r.CheckFloat64Constant(c, *i); | 217 r.CheckFloat64Constant(c, *i); |
206 } | 218 } |
207 } | 219 } |
208 | 220 |
209 { | 221 { |
210 FOR_FLOAT32_INPUTS(i) { | 222 FOR_FLOAT32_INPUTS(i) { |
211 Node* n = r.jsgraph()->Float32Constant(*i); | 223 Node* n = r.jsgraph()->Float32Constant(*i); |
212 Node* c = r.changer()->GetRepresentationFor( | 224 Node* c = r.changer()->GetRepresentationFor( |
213 n, MachineType::RepFloat32(), MachineRepresentation::kFloat64); | 225 n, MachineRepresentation::kFloat32, Type::None(), |
| 226 MachineRepresentation::kFloat64); |
214 r.CheckFloat64Constant(c, *i); | 227 r.CheckFloat64Constant(c, *i); |
215 } | 228 } |
216 } | 229 } |
217 | 230 |
218 { | 231 { |
219 FOR_INT32_INPUTS(i) { | 232 FOR_INT32_INPUTS(i) { |
220 Node* n = r.jsgraph()->Int32Constant(*i); | 233 Node* n = r.jsgraph()->Int32Constant(*i); |
221 Node* c = r.changer()->GetRepresentationFor( | 234 Node* c = r.changer()->GetRepresentationFor( |
222 n, MachineType::Int32(), MachineRepresentation::kFloat64); | 235 n, MachineRepresentation::kWord32, Type::Signed32(), |
| 236 MachineRepresentation::kFloat64); |
223 r.CheckFloat64Constant(c, *i); | 237 r.CheckFloat64Constant(c, *i); |
224 } | 238 } |
225 } | 239 } |
226 | 240 |
227 { | 241 { |
228 FOR_UINT32_INPUTS(i) { | 242 FOR_UINT32_INPUTS(i) { |
229 Node* n = r.jsgraph()->Int32Constant(*i); | 243 Node* n = r.jsgraph()->Int32Constant(*i); |
230 Node* c = r.changer()->GetRepresentationFor( | 244 Node* c = r.changer()->GetRepresentationFor( |
231 n, MachineType::Uint32(), MachineRepresentation::kFloat64); | 245 n, MachineRepresentation::kWord32, Type::Unsigned32(), |
| 246 MachineRepresentation::kFloat64); |
232 r.CheckFloat64Constant(c, *i); | 247 r.CheckFloat64Constant(c, *i); |
233 } | 248 } |
234 } | 249 } |
235 } | 250 } |
236 | 251 |
237 | 252 |
238 static bool IsFloat32Int32(int32_t val) { | 253 static bool IsFloat32Int32(int32_t val) { |
239 return val >= -(1 << 23) && val <= (1 << 23); | 254 return val >= -(1 << 23) && val <= (1 << 23); |
240 } | 255 } |
241 | 256 |
242 | 257 |
243 static bool IsFloat32Uint32(uint32_t val) { return val <= (1 << 23); } | 258 static bool IsFloat32Uint32(uint32_t val) { return val <= (1 << 23); } |
244 | 259 |
245 | 260 |
246 TEST(ToFloat32_constant) { | 261 TEST(ToFloat32_constant) { |
247 RepresentationChangerTester r; | 262 RepresentationChangerTester r; |
248 | 263 |
249 { | 264 { |
250 FOR_FLOAT32_INPUTS(i) { | 265 FOR_FLOAT32_INPUTS(i) { |
251 Node* n = r.jsgraph()->Float32Constant(*i); | 266 Node* n = r.jsgraph()->Float32Constant(*i); |
252 Node* c = r.changer()->GetRepresentationFor( | 267 Node* c = r.changer()->GetRepresentationFor( |
253 n, MachineType::RepFloat32(), MachineRepresentation::kFloat32); | 268 n, MachineRepresentation::kFloat32, Type::None(), |
| 269 MachineRepresentation::kFloat32); |
254 CHECK_EQ(n, c); | 270 CHECK_EQ(n, c); |
255 } | 271 } |
256 } | 272 } |
257 | 273 |
258 { | 274 { |
259 FOR_FLOAT32_INPUTS(i) { | 275 FOR_FLOAT32_INPUTS(i) { |
260 Node* n = r.jsgraph()->Constant(*i); | 276 Node* n = r.jsgraph()->Constant(*i); |
261 Node* c = r.changer()->GetRepresentationFor( | 277 Node* c = r.changer()->GetRepresentationFor( |
262 n, MachineType::RepTagged(), MachineRepresentation::kFloat32); | 278 n, MachineRepresentation::kTagged, Type::None(), |
| 279 MachineRepresentation::kFloat32); |
263 r.CheckFloat32Constant(c, *i); | 280 r.CheckFloat32Constant(c, *i); |
264 } | 281 } |
265 } | 282 } |
266 | 283 |
267 { | 284 { |
268 FOR_FLOAT32_INPUTS(i) { | 285 FOR_FLOAT32_INPUTS(i) { |
269 Node* n = r.jsgraph()->Float64Constant(*i); | 286 Node* n = r.jsgraph()->Float64Constant(*i); |
270 Node* c = r.changer()->GetRepresentationFor( | 287 Node* c = r.changer()->GetRepresentationFor( |
271 n, MachineType::RepFloat64(), MachineRepresentation::kFloat32); | 288 n, MachineRepresentation::kFloat64, Type::None(), |
| 289 MachineRepresentation::kFloat32); |
272 r.CheckFloat32Constant(c, *i); | 290 r.CheckFloat32Constant(c, *i); |
273 } | 291 } |
274 } | 292 } |
275 | 293 |
276 { | 294 { |
277 FOR_INT32_INPUTS(i) { | 295 FOR_INT32_INPUTS(i) { |
278 if (!IsFloat32Int32(*i)) continue; | 296 if (!IsFloat32Int32(*i)) continue; |
279 Node* n = r.jsgraph()->Int32Constant(*i); | 297 Node* n = r.jsgraph()->Int32Constant(*i); |
280 Node* c = r.changer()->GetRepresentationFor( | 298 Node* c = r.changer()->GetRepresentationFor( |
281 n, MachineType::Int32(), MachineRepresentation::kFloat32); | 299 n, MachineRepresentation::kWord32, Type::Signed32(), |
| 300 MachineRepresentation::kFloat32); |
282 r.CheckFloat32Constant(c, static_cast<float>(*i)); | 301 r.CheckFloat32Constant(c, static_cast<float>(*i)); |
283 } | 302 } |
284 } | 303 } |
285 | 304 |
286 { | 305 { |
287 FOR_UINT32_INPUTS(i) { | 306 FOR_UINT32_INPUTS(i) { |
288 if (!IsFloat32Uint32(*i)) continue; | 307 if (!IsFloat32Uint32(*i)) continue; |
289 Node* n = r.jsgraph()->Int32Constant(*i); | 308 Node* n = r.jsgraph()->Int32Constant(*i); |
290 Node* c = r.changer()->GetRepresentationFor( | 309 Node* c = r.changer()->GetRepresentationFor( |
291 n, MachineType::Uint32(), MachineRepresentation::kFloat32); | 310 n, MachineRepresentation::kWord32, Type::Unsigned32(), |
| 311 MachineRepresentation::kFloat32); |
292 r.CheckFloat32Constant(c, static_cast<float>(*i)); | 312 r.CheckFloat32Constant(c, static_cast<float>(*i)); |
293 } | 313 } |
294 } | 314 } |
295 } | 315 } |
296 | 316 |
297 | 317 |
298 TEST(ToInt32_constant) { | 318 TEST(ToInt32_constant) { |
299 RepresentationChangerTester r; | 319 RepresentationChangerTester r; |
300 | 320 |
301 { | 321 { |
302 FOR_INT32_INPUTS(i) { | 322 FOR_INT32_INPUTS(i) { |
303 Node* n = r.jsgraph()->Int32Constant(*i); | 323 Node* n = r.jsgraph()->Int32Constant(*i); |
304 Node* c = r.changer()->GetRepresentationFor( | 324 Node* c = r.changer()->GetRepresentationFor( |
305 n, MachineType::Int32(), MachineRepresentation::kWord32); | 325 n, MachineRepresentation::kWord32, Type::Signed32(), |
| 326 MachineRepresentation::kWord32); |
306 r.CheckInt32Constant(c, *i); | 327 r.CheckInt32Constant(c, *i); |
307 } | 328 } |
308 } | 329 } |
309 | 330 |
310 { | 331 { |
311 FOR_INT32_INPUTS(i) { | 332 FOR_INT32_INPUTS(i) { |
312 if (!IsFloat32Int32(*i)) continue; | 333 if (!IsFloat32Int32(*i)) continue; |
313 Node* n = r.jsgraph()->Float32Constant(static_cast<float>(*i)); | 334 Node* n = r.jsgraph()->Float32Constant(static_cast<float>(*i)); |
314 Node* c = r.changer()->GetRepresentationFor( | 335 Node* c = r.changer()->GetRepresentationFor( |
315 n, | 336 n, MachineRepresentation::kFloat32, Type::Signed32(), |
316 MachineType(MachineRepresentation::kFloat32, MachineSemantic::kInt32), | |
317 MachineRepresentation::kWord32); | 337 MachineRepresentation::kWord32); |
318 r.CheckInt32Constant(c, *i); | 338 r.CheckInt32Constant(c, *i); |
319 } | 339 } |
320 } | 340 } |
321 | 341 |
322 { | 342 { |
323 FOR_INT32_INPUTS(i) { | 343 FOR_INT32_INPUTS(i) { |
324 Node* n = r.jsgraph()->Float64Constant(*i); | 344 Node* n = r.jsgraph()->Float64Constant(*i); |
325 Node* c = r.changer()->GetRepresentationFor( | 345 Node* c = r.changer()->GetRepresentationFor( |
326 n, | 346 n, MachineRepresentation::kFloat64, Type::Signed32(), |
327 MachineType(MachineRepresentation::kFloat64, MachineSemantic::kInt32), | |
328 MachineRepresentation::kWord32); | 347 MachineRepresentation::kWord32); |
329 r.CheckInt32Constant(c, *i); | 348 r.CheckInt32Constant(c, *i); |
330 } | 349 } |
331 } | 350 } |
332 | 351 |
333 { | 352 { |
334 FOR_INT32_INPUTS(i) { | 353 FOR_INT32_INPUTS(i) { |
335 Node* n = r.jsgraph()->Constant(*i); | 354 Node* n = r.jsgraph()->Constant(*i); |
336 Node* c = r.changer()->GetRepresentationFor( | 355 Node* c = r.changer()->GetRepresentationFor( |
337 n, | 356 n, MachineRepresentation::kTagged, Type::Signed32(), |
338 MachineType(MachineRepresentation::kTagged, MachineSemantic::kInt32), | |
339 MachineRepresentation::kWord32); | 357 MachineRepresentation::kWord32); |
340 r.CheckInt32Constant(c, *i); | 358 r.CheckInt32Constant(c, *i); |
341 } | 359 } |
342 } | 360 } |
343 } | 361 } |
344 | 362 |
345 | 363 |
346 TEST(ToUint32_constant) { | 364 TEST(ToUint32_constant) { |
347 RepresentationChangerTester r; | 365 RepresentationChangerTester r; |
348 | 366 |
349 { | 367 { |
350 FOR_UINT32_INPUTS(i) { | 368 FOR_UINT32_INPUTS(i) { |
351 Node* n = r.jsgraph()->Int32Constant(*i); | 369 Node* n = r.jsgraph()->Int32Constant(*i); |
352 Node* c = r.changer()->GetRepresentationFor( | 370 Node* c = r.changer()->GetRepresentationFor( |
353 n, MachineType::Uint32(), MachineRepresentation::kWord32); | 371 n, MachineRepresentation::kWord32, Type::Unsigned32(), |
| 372 MachineRepresentation::kWord32); |
354 r.CheckUint32Constant(c, *i); | 373 r.CheckUint32Constant(c, *i); |
355 } | 374 } |
356 } | 375 } |
357 | 376 |
358 { | 377 { |
359 FOR_UINT32_INPUTS(i) { | 378 FOR_UINT32_INPUTS(i) { |
360 if (!IsFloat32Uint32(*i)) continue; | 379 if (!IsFloat32Uint32(*i)) continue; |
361 Node* n = r.jsgraph()->Float32Constant(static_cast<float>(*i)); | 380 Node* n = r.jsgraph()->Float32Constant(static_cast<float>(*i)); |
362 Node* c = r.changer()->GetRepresentationFor( | 381 Node* c = r.changer()->GetRepresentationFor( |
363 n, MachineType(MachineRepresentation::kFloat32, | 382 n, MachineRepresentation::kFloat32, Type::Unsigned32(), |
364 MachineSemantic::kUint32), | |
365 MachineRepresentation::kWord32); | 383 MachineRepresentation::kWord32); |
366 r.CheckUint32Constant(c, *i); | 384 r.CheckUint32Constant(c, *i); |
367 } | 385 } |
368 } | 386 } |
369 | 387 |
370 { | 388 { |
371 FOR_UINT32_INPUTS(i) { | 389 FOR_UINT32_INPUTS(i) { |
372 Node* n = r.jsgraph()->Float64Constant(*i); | 390 Node* n = r.jsgraph()->Float64Constant(*i); |
373 Node* c = r.changer()->GetRepresentationFor( | 391 Node* c = r.changer()->GetRepresentationFor( |
374 n, MachineType(MachineRepresentation::kFloat64, | 392 n, MachineRepresentation::kFloat64, Type::Unsigned32(), |
375 MachineSemantic::kUint32), | |
376 MachineRepresentation::kWord32); | 393 MachineRepresentation::kWord32); |
377 r.CheckUint32Constant(c, *i); | 394 r.CheckUint32Constant(c, *i); |
378 } | 395 } |
379 } | 396 } |
380 | 397 |
381 { | 398 { |
382 FOR_UINT32_INPUTS(i) { | 399 FOR_UINT32_INPUTS(i) { |
383 Node* n = r.jsgraph()->Constant(static_cast<double>(*i)); | 400 Node* n = r.jsgraph()->Constant(static_cast<double>(*i)); |
384 Node* c = r.changer()->GetRepresentationFor( | 401 Node* c = r.changer()->GetRepresentationFor( |
385 n, | 402 n, MachineRepresentation::kTagged, Type::Unsigned32(), |
386 MachineType(MachineRepresentation::kTagged, MachineSemantic::kUint32), | |
387 MachineRepresentation::kWord32); | 403 MachineRepresentation::kWord32); |
388 r.CheckUint32Constant(c, *i); | 404 r.CheckUint32Constant(c, *i); |
389 } | 405 } |
390 } | 406 } |
391 } | 407 } |
392 | 408 |
393 | 409 |
394 static void CheckChange(IrOpcode::Value expected, MachineType from, | 410 static void CheckChange(IrOpcode::Value expected, MachineRepresentation from, |
395 MachineRepresentation to) { | 411 Type* from_type, MachineRepresentation to) { |
396 RepresentationChangerTester r; | 412 RepresentationChangerTester r; |
397 | 413 |
398 Node* n = r.Parameter(); | 414 Node* n = r.Parameter(); |
399 Node* c = r.changer()->GetRepresentationFor(n, from, to); | 415 Node* c = r.changer()->GetRepresentationFor(n, from, from_type, to); |
400 | 416 |
401 CHECK_NE(c, n); | 417 CHECK_NE(c, n); |
402 CHECK_EQ(expected, c->opcode()); | 418 CHECK_EQ(expected, c->opcode()); |
403 CHECK_EQ(n, c->InputAt(0)); | 419 CHECK_EQ(n, c->InputAt(0)); |
404 } | 420 } |
405 | 421 |
406 | 422 |
407 static void CheckTwoChanges(IrOpcode::Value expected2, | 423 static void CheckTwoChanges(IrOpcode::Value expected2, |
408 IrOpcode::Value expected1, MachineType from, | 424 IrOpcode::Value expected1, |
| 425 MachineRepresentation from, Type* from_type, |
409 MachineRepresentation to) { | 426 MachineRepresentation to) { |
410 RepresentationChangerTester r; | 427 RepresentationChangerTester r; |
411 | 428 |
412 Node* n = r.Parameter(); | 429 Node* n = r.Parameter(); |
413 Node* c1 = r.changer()->GetRepresentationFor(n, from, to); | 430 Node* c1 = r.changer()->GetRepresentationFor(n, from, from_type, to); |
414 | 431 |
415 CHECK_NE(c1, n); | 432 CHECK_NE(c1, n); |
416 CHECK_EQ(expected1, c1->opcode()); | 433 CHECK_EQ(expected1, c1->opcode()); |
417 Node* c2 = c1->InputAt(0); | 434 Node* c2 = c1->InputAt(0); |
418 CHECK_NE(c2, n); | 435 CHECK_NE(c2, n); |
419 CHECK_EQ(expected2, c2->opcode()); | 436 CHECK_EQ(expected2, c2->opcode()); |
420 CHECK_EQ(n, c2->InputAt(0)); | 437 CHECK_EQ(n, c2->InputAt(0)); |
421 } | 438 } |
422 | 439 |
423 | 440 |
424 TEST(SingleChanges) { | 441 TEST(SingleChanges) { |
425 CheckChange(IrOpcode::kChangeBoolToBit, MachineType::RepTagged(), | 442 CheckChange(IrOpcode::kChangeBoolToBit, MachineRepresentation::kTagged, |
426 MachineRepresentation::kBit); | 443 Type::None(), MachineRepresentation::kBit); |
427 CheckChange(IrOpcode::kChangeBitToBool, MachineType::RepBit(), | 444 CheckChange(IrOpcode::kChangeBitToBool, MachineRepresentation::kBit, |
428 MachineRepresentation::kTagged); | 445 Type::None(), MachineRepresentation::kTagged); |
429 | 446 |
430 CheckChange(IrOpcode::kChangeInt32ToTagged, MachineType::Int32(), | 447 CheckChange(IrOpcode::kChangeInt32ToTagged, MachineRepresentation::kWord32, |
431 MachineRepresentation::kTagged); | 448 Type::Signed32(), MachineRepresentation::kTagged); |
432 CheckChange(IrOpcode::kChangeUint32ToTagged, MachineType::Uint32(), | 449 CheckChange(IrOpcode::kChangeUint32ToTagged, MachineRepresentation::kWord32, |
433 MachineRepresentation::kTagged); | 450 Type::Unsigned32(), MachineRepresentation::kTagged); |
434 CheckChange(IrOpcode::kChangeFloat64ToTagged, MachineType::RepFloat64(), | 451 CheckChange(IrOpcode::kChangeFloat64ToTagged, MachineRepresentation::kFloat64, |
435 MachineRepresentation::kTagged); | 452 Type::None(), MachineRepresentation::kTagged); |
436 | 453 |
437 CheckChange( | 454 CheckChange(IrOpcode::kChangeTaggedToInt32, MachineRepresentation::kTagged, |
438 IrOpcode::kChangeTaggedToInt32, | 455 Type::Signed32(), MachineRepresentation::kWord32); |
439 MachineType(MachineRepresentation::kTagged, MachineSemantic::kInt32), | 456 CheckChange(IrOpcode::kChangeTaggedToUint32, MachineRepresentation::kTagged, |
440 MachineRepresentation::kWord32); | 457 Type::Unsigned32(), MachineRepresentation::kWord32); |
441 CheckChange( | 458 CheckChange(IrOpcode::kChangeTaggedToFloat64, MachineRepresentation::kTagged, |
442 IrOpcode::kChangeTaggedToUint32, | 459 Type::None(), MachineRepresentation::kFloat64); |
443 MachineType(MachineRepresentation::kTagged, MachineSemantic::kUint32), | |
444 MachineRepresentation::kWord32); | |
445 CheckChange(IrOpcode::kChangeTaggedToFloat64, MachineType::RepTagged(), | |
446 MachineRepresentation::kFloat64); | |
447 | 460 |
448 // Int32,Uint32 <-> Float64 are actually machine conversions. | 461 // Int32,Uint32 <-> Float64 are actually machine conversions. |
449 CheckChange(IrOpcode::kChangeInt32ToFloat64, MachineType::Int32(), | 462 CheckChange(IrOpcode::kChangeInt32ToFloat64, MachineRepresentation::kWord32, |
450 MachineRepresentation::kFloat64); | 463 Type::Signed32(), MachineRepresentation::kFloat64); |
451 CheckChange(IrOpcode::kChangeUint32ToFloat64, MachineType::Uint32(), | 464 CheckChange(IrOpcode::kChangeUint32ToFloat64, MachineRepresentation::kWord32, |
452 MachineRepresentation::kFloat64); | 465 Type::Unsigned32(), MachineRepresentation::kFloat64); |
453 CheckChange( | 466 CheckChange(IrOpcode::kChangeFloat64ToInt32, MachineRepresentation::kFloat64, |
454 IrOpcode::kChangeFloat64ToInt32, | 467 Type::Signed32(), MachineRepresentation::kWord32); |
455 MachineType(MachineRepresentation::kFloat64, MachineSemantic::kInt32), | 468 CheckChange(IrOpcode::kChangeFloat64ToUint32, MachineRepresentation::kFloat64, |
456 MachineRepresentation::kWord32); | 469 Type::Unsigned32(), MachineRepresentation::kWord32); |
457 CheckChange( | |
458 IrOpcode::kChangeFloat64ToUint32, | |
459 MachineType(MachineRepresentation::kFloat64, MachineSemantic::kUint32), | |
460 MachineRepresentation::kWord32); | |
461 | 470 |
462 CheckChange(IrOpcode::kTruncateFloat64ToFloat32, MachineType::RepFloat64(), | 471 CheckChange(IrOpcode::kTruncateFloat64ToFloat32, |
| 472 MachineRepresentation::kFloat64, Type::None(), |
463 MachineRepresentation::kFloat32); | 473 MachineRepresentation::kFloat32); |
464 | 474 |
465 // Int32,Uint32 <-> Float32 require two changes. | 475 // Int32,Uint32 <-> Float32 require two changes. |
466 CheckTwoChanges(IrOpcode::kChangeInt32ToFloat64, | 476 CheckTwoChanges(IrOpcode::kChangeInt32ToFloat64, |
467 IrOpcode::kTruncateFloat64ToFloat32, MachineType::Int32(), | 477 IrOpcode::kTruncateFloat64ToFloat32, |
| 478 MachineRepresentation::kWord32, Type::Signed32(), |
468 MachineRepresentation::kFloat32); | 479 MachineRepresentation::kFloat32); |
469 CheckTwoChanges(IrOpcode::kChangeUint32ToFloat64, | 480 CheckTwoChanges(IrOpcode::kChangeUint32ToFloat64, |
470 IrOpcode::kTruncateFloat64ToFloat32, MachineType::Uint32(), | 481 IrOpcode::kTruncateFloat64ToFloat32, |
| 482 MachineRepresentation::kWord32, Type::Unsigned32(), |
471 MachineRepresentation::kFloat32); | 483 MachineRepresentation::kFloat32); |
472 CheckTwoChanges( | 484 CheckTwoChanges(IrOpcode::kChangeFloat32ToFloat64, |
473 IrOpcode::kChangeFloat32ToFloat64, IrOpcode::kChangeFloat64ToInt32, | 485 IrOpcode::kChangeFloat64ToInt32, |
474 MachineType(MachineRepresentation::kFloat32, MachineSemantic::kInt32), | 486 MachineRepresentation::kFloat32, Type::Signed32(), |
475 MachineRepresentation::kWord32); | 487 MachineRepresentation::kWord32); |
476 CheckTwoChanges( | 488 CheckTwoChanges(IrOpcode::kChangeFloat32ToFloat64, |
477 IrOpcode::kChangeFloat32ToFloat64, IrOpcode::kChangeFloat64ToUint32, | 489 IrOpcode::kChangeFloat64ToUint32, |
478 MachineType(MachineRepresentation::kFloat32, MachineSemantic::kUint32), | 490 MachineRepresentation::kFloat32, Type::Unsigned32(), |
479 MachineRepresentation::kWord32); | 491 MachineRepresentation::kWord32); |
480 | 492 |
481 // Float32 <-> Tagged require two changes. | 493 // Float32 <-> Tagged require two changes. |
482 CheckTwoChanges(IrOpcode::kChangeFloat32ToFloat64, | 494 CheckTwoChanges(IrOpcode::kChangeFloat32ToFloat64, |
483 IrOpcode::kChangeFloat64ToTagged, MachineType::RepFloat32(), | 495 IrOpcode::kChangeFloat64ToTagged, |
| 496 MachineRepresentation::kFloat32, Type::None(), |
484 MachineRepresentation::kTagged); | 497 MachineRepresentation::kTagged); |
485 CheckTwoChanges(IrOpcode::kChangeTaggedToFloat64, | 498 CheckTwoChanges(IrOpcode::kChangeTaggedToFloat64, |
486 IrOpcode::kTruncateFloat64ToFloat32, MachineType::RepTagged(), | 499 IrOpcode::kTruncateFloat64ToFloat32, |
| 500 MachineRepresentation::kTagged, Type::None(), |
487 MachineRepresentation::kFloat32); | 501 MachineRepresentation::kFloat32); |
488 } | 502 } |
489 | 503 |
490 | 504 |
491 TEST(SignednessInWord32) { | 505 TEST(SignednessInWord32) { |
492 RepresentationChangerTester r; | 506 RepresentationChangerTester r; |
493 | 507 |
494 CheckChange( | 508 CheckChange(IrOpcode::kChangeTaggedToInt32, MachineRepresentation::kTagged, |
495 IrOpcode::kChangeTaggedToInt32, | 509 Type::Signed32(), MachineRepresentation::kWord32); |
496 MachineType(MachineRepresentation::kTagged, MachineSemantic::kInt32), | 510 CheckChange(IrOpcode::kChangeTaggedToUint32, MachineRepresentation::kTagged, |
497 MachineRepresentation::kWord32); | 511 Type::Unsigned32(), MachineRepresentation::kWord32); |
498 CheckChange( | 512 CheckChange(IrOpcode::kChangeInt32ToFloat64, MachineRepresentation::kWord32, |
499 IrOpcode::kChangeTaggedToUint32, | 513 Type::None(), MachineRepresentation::kFloat64); |
500 MachineType(MachineRepresentation::kTagged, MachineSemantic::kUint32), | 514 CheckChange(IrOpcode::kChangeFloat64ToInt32, MachineRepresentation::kFloat64, |
501 MachineRepresentation::kWord32); | 515 Type::Signed32(), MachineRepresentation::kWord32); |
502 CheckChange(IrOpcode::kChangeInt32ToFloat64, MachineType::RepWord32(), | 516 CheckChange(IrOpcode::kTruncateFloat64ToInt32, |
503 MachineRepresentation::kFloat64); | 517 MachineRepresentation::kFloat64, Type::Number(), |
504 CheckChange( | |
505 IrOpcode::kChangeFloat64ToInt32, | |
506 MachineType(MachineRepresentation::kFloat64, MachineSemantic::kInt32), | |
507 MachineRepresentation::kWord32); | |
508 CheckChange(IrOpcode::kTruncateFloat64ToInt32, MachineType::RepFloat64(), | |
509 MachineRepresentation::kWord32); | 518 MachineRepresentation::kWord32); |
510 | 519 |
511 CheckTwoChanges(IrOpcode::kChangeInt32ToFloat64, | 520 CheckTwoChanges(IrOpcode::kChangeInt32ToFloat64, |
512 IrOpcode::kTruncateFloat64ToFloat32, MachineType::RepWord32(), | 521 IrOpcode::kTruncateFloat64ToFloat32, |
| 522 MachineRepresentation::kWord32, Type::None(), |
513 MachineRepresentation::kFloat32); | 523 MachineRepresentation::kFloat32); |
514 CheckTwoChanges(IrOpcode::kChangeFloat32ToFloat64, | 524 CheckTwoChanges(IrOpcode::kChangeFloat32ToFloat64, |
515 IrOpcode::kTruncateFloat64ToInt32, MachineType::RepFloat32(), | 525 IrOpcode::kTruncateFloat64ToInt32, |
| 526 MachineRepresentation::kFloat32, Type::Number(), |
516 MachineRepresentation::kWord32); | 527 MachineRepresentation::kWord32); |
517 } | 528 } |
518 | 529 |
519 | 530 |
520 TEST(Nops) { | 531 TEST(Nops) { |
521 RepresentationChangerTester r; | 532 RepresentationChangerTester r; |
522 | 533 |
523 // X -> X is always a nop for any single representation X. | 534 // X -> X is always a nop for any single representation X. |
524 for (size_t i = 0; i < arraysize(kMachineTypes); i++) { | 535 for (size_t i = 0; i < arraysize(kMachineTypes); i++) { |
525 r.CheckNop(kMachineTypes[i], kMachineTypes[i].representation()); | 536 r.CheckNop(kMachineTypes[i].representation(), Type::None(), |
| 537 kMachineTypes[i].representation()); |
526 } | 538 } |
527 | 539 |
528 // 32-bit floats. | 540 // 32-bit floats. |
529 r.CheckNop(MachineType::RepFloat32(), MachineRepresentation::kFloat32); | 541 r.CheckNop(MachineRepresentation::kFloat32, Type::None(), |
530 r.CheckNop(MachineType::Float32(), MachineRepresentation::kFloat32); | 542 MachineRepresentation::kFloat32); |
| 543 r.CheckNop(MachineRepresentation::kFloat32, Type::Number(), |
| 544 MachineRepresentation::kFloat32); |
531 | 545 |
532 // 32-bit words can be used as smaller word sizes and vice versa, because | 546 // 32-bit words can be used as smaller word sizes and vice versa, because |
533 // loads from memory implicitly sign or zero extend the value to the | 547 // loads from memory implicitly sign or zero extend the value to the |
534 // full machine word size, and stores implicitly truncate. | 548 // full machine word size, and stores implicitly truncate. |
535 r.CheckNop(MachineType::Int32(), MachineRepresentation::kWord8); | 549 r.CheckNop(MachineRepresentation::kWord32, Type::Signed32(), |
536 r.CheckNop(MachineType::Int32(), MachineRepresentation::kWord16); | 550 MachineRepresentation::kWord8); |
537 r.CheckNop(MachineType::Int32(), MachineRepresentation::kWord32); | 551 r.CheckNop(MachineRepresentation::kWord32, Type::Signed32(), |
538 r.CheckNop(MachineType::Int8(), MachineRepresentation::kWord32); | 552 MachineRepresentation::kWord16); |
539 r.CheckNop(MachineType::Int16(), MachineRepresentation::kWord32); | 553 r.CheckNop(MachineRepresentation::kWord32, Type::Signed32(), |
| 554 MachineRepresentation::kWord32); |
| 555 r.CheckNop(MachineRepresentation::kWord8, Type::Signed32(), |
| 556 MachineRepresentation::kWord32); |
| 557 r.CheckNop(MachineRepresentation::kWord16, Type::Signed32(), |
| 558 MachineRepresentation::kWord32); |
540 | 559 |
541 // kRepBit (result of comparison) is implicitly a wordish thing. | 560 // kRepBit (result of comparison) is implicitly a wordish thing. |
542 r.CheckNop(MachineType::RepBit(), MachineRepresentation::kWord8); | 561 r.CheckNop(MachineRepresentation::kBit, Type::None(), |
543 r.CheckNop(MachineType::RepBit(), MachineRepresentation::kWord16); | 562 MachineRepresentation::kWord8); |
544 r.CheckNop(MachineType::RepBit(), MachineRepresentation::kWord32); | 563 r.CheckNop(MachineRepresentation::kBit, Type::None(), |
545 r.CheckNop(MachineType::RepBit(), MachineRepresentation::kWord64); | 564 MachineRepresentation::kWord16); |
546 r.CheckNop(MachineType::Bool(), MachineRepresentation::kWord8); | 565 r.CheckNop(MachineRepresentation::kBit, Type::None(), |
547 r.CheckNop(MachineType::Bool(), MachineRepresentation::kWord16); | 566 MachineRepresentation::kWord32); |
548 r.CheckNop(MachineType::Bool(), MachineRepresentation::kWord32); | 567 r.CheckNop(MachineRepresentation::kBit, Type::None(), |
549 r.CheckNop(MachineType::Bool(), MachineRepresentation::kWord64); | 568 MachineRepresentation::kWord64); |
| 569 r.CheckNop(MachineRepresentation::kBit, Type::Boolean(), |
| 570 MachineRepresentation::kWord8); |
| 571 r.CheckNop(MachineRepresentation::kBit, Type::Boolean(), |
| 572 MachineRepresentation::kWord16); |
| 573 r.CheckNop(MachineRepresentation::kBit, Type::Boolean(), |
| 574 MachineRepresentation::kWord32); |
| 575 r.CheckNop(MachineRepresentation::kBit, Type::Boolean(), |
| 576 MachineRepresentation::kWord64); |
550 } | 577 } |
551 | 578 |
552 | 579 |
553 TEST(TypeErrors) { | 580 TEST(TypeErrors) { |
554 RepresentationChangerTester r; | 581 RepresentationChangerTester r; |
555 | 582 |
556 // Wordish cannot be implicitly converted to/from comparison conditions. | 583 // Wordish cannot be implicitly converted to/from comparison conditions. |
557 r.CheckTypeError(MachineType::RepWord8(), MachineRepresentation::kBit); | 584 r.CheckTypeError(MachineRepresentation::kWord8, Type::None(), |
558 r.CheckTypeError(MachineType::RepWord16(), MachineRepresentation::kBit); | 585 MachineRepresentation::kBit); |
559 r.CheckTypeError(MachineType::RepWord32(), MachineRepresentation::kBit); | 586 r.CheckTypeError(MachineRepresentation::kWord16, Type::None(), |
560 r.CheckTypeError(MachineType::RepWord64(), MachineRepresentation::kBit); | 587 MachineRepresentation::kBit); |
| 588 r.CheckTypeError(MachineRepresentation::kWord32, Type::None(), |
| 589 MachineRepresentation::kBit); |
| 590 r.CheckTypeError(MachineRepresentation::kWord64, Type::None(), |
| 591 MachineRepresentation::kBit); |
561 | 592 |
562 // Floats cannot be implicitly converted to/from comparison conditions. | 593 // Floats cannot be implicitly converted to/from comparison conditions. |
563 r.CheckTypeError(MachineType::RepFloat64(), MachineRepresentation::kBit); | 594 r.CheckTypeError(MachineRepresentation::kFloat64, Type::None(), |
564 r.CheckTypeError(MachineType::RepBit(), MachineRepresentation::kFloat64); | 595 MachineRepresentation::kBit); |
565 r.CheckTypeError(MachineType::Bool(), MachineRepresentation::kFloat64); | 596 r.CheckTypeError(MachineRepresentation::kBit, Type::None(), |
| 597 MachineRepresentation::kFloat64); |
| 598 r.CheckTypeError(MachineRepresentation::kBit, Type::Boolean(), |
| 599 MachineRepresentation::kFloat64); |
566 | 600 |
567 // Floats cannot be implicitly converted to/from comparison conditions. | 601 // Floats cannot be implicitly converted to/from comparison conditions. |
568 r.CheckTypeError(MachineType::RepFloat32(), MachineRepresentation::kBit); | 602 r.CheckTypeError(MachineRepresentation::kFloat32, Type::None(), |
569 r.CheckTypeError(MachineType::RepBit(), MachineRepresentation::kFloat32); | 603 MachineRepresentation::kBit); |
570 r.CheckTypeError(MachineType::Bool(), MachineRepresentation::kFloat32); | 604 r.CheckTypeError(MachineRepresentation::kBit, Type::None(), |
| 605 MachineRepresentation::kFloat32); |
| 606 r.CheckTypeError(MachineRepresentation::kBit, Type::Boolean(), |
| 607 MachineRepresentation::kFloat32); |
571 | 608 |
572 // Word64 is internal and shouldn't be implicitly converted. | 609 // Word64 is internal and shouldn't be implicitly converted. |
573 r.CheckTypeError(MachineType::RepWord64(), MachineRepresentation::kTagged); | 610 r.CheckTypeError(MachineRepresentation::kWord64, Type::None(), |
574 r.CheckTypeError(MachineType::RepTagged(), MachineRepresentation::kWord64); | 611 MachineRepresentation::kTagged); |
575 r.CheckTypeError(MachineType::TaggedBool(), MachineRepresentation::kWord64); | 612 r.CheckTypeError(MachineRepresentation::kTagged, Type::None(), |
| 613 MachineRepresentation::kWord64); |
| 614 r.CheckTypeError(MachineRepresentation::kTagged, Type::Boolean(), |
| 615 MachineRepresentation::kWord64); |
576 | 616 |
577 // Word64 / Word32 shouldn't be implicitly converted. | 617 // Word64 / Word32 shouldn't be implicitly converted. |
578 r.CheckTypeError(MachineType::RepWord64(), MachineRepresentation::kWord32); | 618 r.CheckTypeError(MachineRepresentation::kWord64, Type::None(), |
579 r.CheckTypeError(MachineType::RepWord32(), MachineRepresentation::kWord64); | 619 MachineRepresentation::kWord32); |
580 r.CheckTypeError(MachineType::Int32(), MachineRepresentation::kWord64); | 620 r.CheckTypeError(MachineRepresentation::kWord32, Type::None(), |
581 r.CheckTypeError(MachineType::Uint32(), MachineRepresentation::kWord64); | 621 MachineRepresentation::kWord64); |
| 622 r.CheckTypeError(MachineRepresentation::kWord32, Type::Signed32(), |
| 623 MachineRepresentation::kWord64); |
| 624 r.CheckTypeError(MachineRepresentation::kWord32, Type::Unsigned32(), |
| 625 MachineRepresentation::kWord64); |
582 } | 626 } |
583 | 627 |
584 } // namespace compiler | 628 } // namespace compiler |
585 } // namespace internal | 629 } // namespace internal |
586 } // namespace v8 | 630 } // namespace v8 |
OLD | NEW |