OLD | NEW |
1 // Copyright 2010 the V8 project authors. All rights reserved. | 1 // Copyright 2010 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 472 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
483 } | 483 } |
484 | 484 |
485 | 485 |
486 void CodeGenerator::LoadInSafeInt32Mode(Expression* expr, | 486 void CodeGenerator::LoadInSafeInt32Mode(Expression* expr, |
487 BreakTarget* unsafe_bailout) { | 487 BreakTarget* unsafe_bailout) { |
488 set_unsafe_bailout(unsafe_bailout); | 488 set_unsafe_bailout(unsafe_bailout); |
489 set_in_safe_int32_mode(true); | 489 set_in_safe_int32_mode(true); |
490 Load(expr); | 490 Load(expr); |
491 Result value = frame_->Pop(); | 491 Result value = frame_->Pop(); |
492 ASSERT(frame_->HasNoUntaggedInt32Elements()); | 492 ASSERT(frame_->HasNoUntaggedInt32Elements()); |
493 ConvertInt32ResultToNumber(&value); | 493 if (expr->GuaranteedSmiResult()) { |
| 494 ConvertInt32ResultToSmi(&value); |
| 495 } else { |
| 496 ConvertInt32ResultToNumber(&value); |
| 497 } |
494 set_in_safe_int32_mode(false); | 498 set_in_safe_int32_mode(false); |
495 set_unsafe_bailout(NULL); | 499 set_unsafe_bailout(NULL); |
496 frame_->Push(&value); | 500 frame_->Push(&value); |
497 } | 501 } |
498 | 502 |
499 | 503 |
500 void CodeGenerator::LoadWithSafeInt32ModeDisabled(Expression* expr) { | 504 void CodeGenerator::LoadWithSafeInt32ModeDisabled(Expression* expr) { |
501 set_safe_int32_mode_enabled(false); | 505 set_safe_int32_mode_enabled(false); |
502 Load(expr); | 506 Load(expr); |
503 set_safe_int32_mode_enabled(true); | 507 set_safe_int32_mode_enabled(true); |
504 } | 508 } |
505 | 509 |
506 | 510 |
| 511 void CodeGenerator::ConvertInt32ResultToSmi(Result* value) { |
| 512 ASSERT(value->is_untagged_int32()); |
| 513 if (value->is_register()) { |
| 514 __ add(value->reg(), Operand(value->reg())); |
| 515 } else { |
| 516 ASSERT(value->is_constant()); |
| 517 ASSERT(value->handle()->IsSmi()); |
| 518 } |
| 519 value->set_untagged_int32(false); |
| 520 value->set_number_info(NumberInfo::Smi()); |
| 521 } |
| 522 |
| 523 |
507 void CodeGenerator::ConvertInt32ResultToNumber(Result* value) { | 524 void CodeGenerator::ConvertInt32ResultToNumber(Result* value) { |
508 ASSERT(value->is_untagged_int32()); | 525 ASSERT(value->is_untagged_int32()); |
509 if (value->is_register()) { | 526 if (value->is_register()) { |
510 Register val = value->reg(); | 527 Register val = value->reg(); |
511 JumpTarget done; | 528 JumpTarget done; |
512 __ add(val, Operand(val)); | 529 __ add(val, Operand(val)); |
513 done.Branch(no_overflow, value); | 530 done.Branch(no_overflow, value); |
514 __ sar(val, 1); | 531 __ sar(val, 1); |
515 // If there was an overflow, bits 30 and 31 of the original number disagree. | 532 // If there was an overflow, bits 30 and 31 of the original number disagree. |
516 __ xor_(val, 0x80000000u); | 533 __ xor_(val, 0x80000000u); |
(...skipping 28 matching lines...) Expand all Loading... |
545 RegisterFile empty_regs; | 562 RegisterFile empty_regs; |
546 SetFrame(clone, &empty_regs); | 563 SetFrame(clone, &empty_regs); |
547 __ bind(&allocation_failed); | 564 __ bind(&allocation_failed); |
548 unsafe_bailout_->Jump(); | 565 unsafe_bailout_->Jump(); |
549 | 566 |
550 done.Bind(value); | 567 done.Bind(value); |
551 } else { | 568 } else { |
552 ASSERT(value->is_constant()); | 569 ASSERT(value->is_constant()); |
553 } | 570 } |
554 value->set_untagged_int32(false); | 571 value->set_untagged_int32(false); |
| 572 value->set_number_info(NumberInfo::Integer32()); |
555 } | 573 } |
556 | 574 |
557 | 575 |
558 void CodeGenerator::Load(Expression* expr) { | 576 void CodeGenerator::Load(Expression* expr) { |
559 #ifdef DEBUG | 577 #ifdef DEBUG |
560 int original_height = frame_->height(); | 578 int original_height = frame_->height(); |
561 #endif | 579 #endif |
562 ASSERT(!in_spilled_code()); | 580 ASSERT(!in_spilled_code()); |
563 | 581 |
564 // If the expression should be a side-effect-free 32-bit int computation, | 582 // If the expression should be a side-effect-free 32-bit int computation, |
(...skipping 11974 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
12539 | 12557 |
12540 // Call the runtime; it returns -1 (less), 0 (equal), or 1 (greater) | 12558 // Call the runtime; it returns -1 (less), 0 (equal), or 1 (greater) |
12541 // tagged as a small integer. | 12559 // tagged as a small integer. |
12542 __ bind(&runtime); | 12560 __ bind(&runtime); |
12543 __ TailCallRuntime(Runtime::kStringCompare, 2, 1); | 12561 __ TailCallRuntime(Runtime::kStringCompare, 2, 1); |
12544 } | 12562 } |
12545 | 12563 |
12546 #undef __ | 12564 #undef __ |
12547 | 12565 |
12548 } } // namespace v8::internal | 12566 } } // namespace v8::internal |
OLD | NEW |