Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(11)

Side by Side Diff: src/compiler/change-lowering.cc

Issue 1922443002: [turbofan] Introduce Oddball::to_number_raw and use it for change lowering. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « include/v8.h ('k') | src/objects.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 "src/compiler/change-lowering.h" 5 #include "src/compiler/change-lowering.h"
6 6
7 #include "src/address-map.h" 7 #include "src/address-map.h"
8 #include "src/code-factory.h" 8 #include "src/code-factory.h"
9 #include "src/compiler/js-graph.h" 9 #include "src/compiler/js-graph.h"
10 #include "src/compiler/linkage.h" 10 #include "src/compiler/linkage.h"
(...skipping 276 matching lines...) Expand 10 before | Expand all | Expand 10 after
287 NodeProperties::GetType(value)->Is(Type::Number())) { 287 NodeProperties::GetType(value)->Is(Type::Number())) {
288 return Replace(graph()->NewNode(op, LoadHeapNumberValue(value, control))); 288 return Replace(graph()->NewNode(op, LoadHeapNumberValue(value, control)));
289 } 289 }
290 290
291 Node* check = TestNotSmi(value); 291 Node* check = TestNotSmi(value);
292 Node* branch = 292 Node* branch =
293 graph()->NewNode(common()->Branch(BranchHint::kFalse), check, control); 293 graph()->NewNode(common()->Branch(BranchHint::kFalse), check, control);
294 294
295 Node* if_not_smi = graph()->NewNode(common()->IfTrue(), branch); 295 Node* if_not_smi = graph()->NewNode(common()->IfTrue(), branch);
296 296
297 Node* vnot_smi; 297 STATIC_ASSERT(HeapNumber::kValueOffset == Oddball::kToNumberRawOffset);
298 if (NodeProperties::GetType(value)->Maybe(Type::Undefined())) { 298 Node* vnot_smi = graph()->NewNode(op, LoadHeapNumberValue(value, if_not_smi));
299 Node* check_undefined = graph()->NewNode(machine()->WordEqual(), value,
300 jsgraph()->UndefinedConstant());
301 Node* branch_undefined = graph()->NewNode(
302 common()->Branch(BranchHint::kFalse), check_undefined, if_not_smi);
303
304 Node* if_undefined = graph()->NewNode(common()->IfTrue(), branch_undefined);
305 Node* vundefined = jsgraph()->Int32Constant(0);
306
307 Node* if_not_undefined =
308 graph()->NewNode(common()->IfFalse(), branch_undefined);
309 Node* vheap_number =
310 graph()->NewNode(op, LoadHeapNumberValue(value, if_not_undefined));
311
312 if_not_smi =
313 graph()->NewNode(common()->Merge(2), if_undefined, if_not_undefined);
314 vnot_smi =
315 graph()->NewNode(common()->Phi(MachineRepresentation::kWord32, 2),
316 vundefined, vheap_number, if_not_smi);
317 } else {
318 vnot_smi = graph()->NewNode(op, LoadHeapNumberValue(value, if_not_smi));
319 }
320 299
321 Node* if_smi = graph()->NewNode(common()->IfFalse(), branch); 300 Node* if_smi = graph()->NewNode(common()->IfFalse(), branch);
322 Node* vfrom_smi = ChangeSmiToWord32(value); 301 Node* vfrom_smi = ChangeSmiToWord32(value);
323 302
324 Node* merge = graph()->NewNode(common()->Merge(2), if_not_smi, if_smi); 303 Node* merge = graph()->NewNode(common()->Merge(2), if_not_smi, if_smi);
325 Node* phi = graph()->NewNode(common()->Phi(MachineRepresentation::kWord32, 2), 304 Node* phi = graph()->NewNode(common()->Phi(MachineRepresentation::kWord32, 2),
326 vnot_smi, vfrom_smi, merge); 305 vnot_smi, vfrom_smi, merge);
327 306
328 return Replace(phi); 307 return Replace(phi);
329 } 308 }
330 309
331 310
332 Reduction ChangeLowering::ChangeTaggedToFloat64(Node* value, Node* control) { 311 Reduction ChangeLowering::ChangeTaggedToFloat64(Node* value, Node* control) {
333 Node* check = TestNotSmi(value); 312 Node* check = TestNotSmi(value);
334 Node* branch = 313 Node* branch =
335 graph()->NewNode(common()->Branch(BranchHint::kFalse), check, control); 314 graph()->NewNode(common()->Branch(BranchHint::kFalse), check, control);
336 315
337 Node* if_not_smi = graph()->NewNode(common()->IfTrue(), branch); 316 Node* if_not_smi = graph()->NewNode(common()->IfTrue(), branch);
338 317
339 Node* vnot_smi; 318 STATIC_ASSERT(HeapNumber::kValueOffset == Oddball::kToNumberRawOffset);
340 if (NodeProperties::GetType(value)->Maybe(Type::Undefined())) { 319 Node* vnot_smi = LoadHeapNumberValue(value, if_not_smi);
341 Node* check_undefined = graph()->NewNode(machine()->WordEqual(), value,
342 jsgraph()->UndefinedConstant());
343 Node* branch_undefined = graph()->NewNode(
344 common()->Branch(BranchHint::kFalse), check_undefined, if_not_smi);
345
346 Node* if_undefined = graph()->NewNode(common()->IfTrue(), branch_undefined);
347 Node* vundefined =
348 jsgraph()->Float64Constant(std::numeric_limits<double>::quiet_NaN());
349
350 Node* if_not_undefined =
351 graph()->NewNode(common()->IfFalse(), branch_undefined);
352 Node* vheap_number = LoadHeapNumberValue(value, if_not_undefined);
353
354 if_not_smi =
355 graph()->NewNode(common()->Merge(2), if_undefined, if_not_undefined);
356 vnot_smi =
357 graph()->NewNode(common()->Phi(MachineRepresentation::kFloat64, 2),
358 vundefined, vheap_number, if_not_smi);
359 } else {
360 vnot_smi = LoadHeapNumberValue(value, if_not_smi);
361 }
362 320
363 Node* if_smi = graph()->NewNode(common()->IfFalse(), branch); 321 Node* if_smi = graph()->NewNode(common()->IfFalse(), branch);
364 Node* vfrom_smi = ChangeSmiToFloat64(value); 322 Node* vfrom_smi = ChangeSmiToFloat64(value);
365 323
366 Node* merge = graph()->NewNode(common()->Merge(2), if_not_smi, if_smi); 324 Node* merge = graph()->NewNode(common()->Merge(2), if_not_smi, if_smi);
367 Node* phi = 325 Node* phi =
368 graph()->NewNode(common()->Phi(MachineRepresentation::kFloat64, 2), 326 graph()->NewNode(common()->Phi(MachineRepresentation::kFloat64, 2),
369 vnot_smi, vfrom_smi, merge); 327 vnot_smi, vfrom_smi, merge);
370 328
371 return Replace(phi); 329 return Replace(phi);
(...skipping 20 matching lines...) Expand all
392 return Replace(phi); 350 return Replace(phi);
393 } 351 }
394 352
395 Reduction ChangeLowering::TruncateTaggedToWord32(Node* value, Node* control) { 353 Reduction ChangeLowering::TruncateTaggedToWord32(Node* value, Node* control) {
396 Node* check = TestNotSmi(value); 354 Node* check = TestNotSmi(value);
397 Node* branch = 355 Node* branch =
398 graph()->NewNode(common()->Branch(BranchHint::kFalse), check, control); 356 graph()->NewNode(common()->Branch(BranchHint::kFalse), check, control);
399 357
400 Node* if_not_smi = graph()->NewNode(common()->IfTrue(), branch); 358 Node* if_not_smi = graph()->NewNode(common()->IfTrue(), branch);
401 359
402 Node* vnot_smi; 360 STATIC_ASSERT(HeapNumber::kValueOffset == Oddball::kToNumberRawOffset);
403 if (NodeProperties::GetType(value)->Maybe(Type::Undefined())) { 361 Node* vnot_smi = graph()->NewNode(machine()->TruncateFloat64ToWord32(),
404 Node* check_undefined = graph()->NewNode(machine()->WordEqual(), value, 362 LoadHeapNumberValue(value, if_not_smi));
405 jsgraph()->UndefinedConstant());
406 Node* branch_undefined = graph()->NewNode(
407 common()->Branch(BranchHint::kFalse), check_undefined, if_not_smi);
408
409 Node* if_undefined = graph()->NewNode(common()->IfTrue(), branch_undefined);
410 Node* vundefined = jsgraph()->Int32Constant(0);
411
412 Node* if_not_undefined =
413 graph()->NewNode(common()->IfFalse(), branch_undefined);
414 Node* vheap_number =
415 graph()->NewNode(machine()->TruncateFloat64ToWord32(),
416 LoadHeapNumberValue(value, if_not_undefined));
417
418 if_not_smi =
419 graph()->NewNode(common()->Merge(2), if_undefined, if_not_undefined);
420 vnot_smi =
421 graph()->NewNode(common()->Phi(MachineRepresentation::kWord32, 2),
422 vundefined, vheap_number, if_not_smi);
423 } else {
424 vnot_smi = graph()->NewNode(machine()->TruncateFloat64ToWord32(),
425 LoadHeapNumberValue(value, if_not_smi));
426 }
427 363
428 Node* if_smi = graph()->NewNode(common()->IfFalse(), branch); 364 Node* if_smi = graph()->NewNode(common()->IfFalse(), branch);
429 Node* vfrom_smi = ChangeSmiToWord32(value); 365 Node* vfrom_smi = ChangeSmiToWord32(value);
430 366
431 Node* merge = graph()->NewNode(common()->Merge(2), if_not_smi, if_smi); 367 Node* merge = graph()->NewNode(common()->Merge(2), if_not_smi, if_smi);
432 Node* phi = graph()->NewNode(common()->Phi(MachineRepresentation::kWord32, 2), 368 Node* phi = graph()->NewNode(common()->Phi(MachineRepresentation::kWord32, 2),
433 vnot_smi, vfrom_smi, merge); 369 vnot_smi, vfrom_smi, merge);
434 370
435 return Replace(phi); 371 return Replace(phi);
436 } 372 }
(...skipping 299 matching lines...) Expand 10 before | Expand all | Expand 10 after
736 } 672 }
737 673
738 674
739 MachineOperatorBuilder* ChangeLowering::machine() const { 675 MachineOperatorBuilder* ChangeLowering::machine() const {
740 return jsgraph()->machine(); 676 return jsgraph()->machine();
741 } 677 }
742 678
743 } // namespace compiler 679 } // namespace compiler
744 } // namespace internal 680 } // namespace internal
745 } // namespace v8 681 } // namespace v8
OLDNEW
« no previous file with comments | « include/v8.h ('k') | src/objects.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698