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

Side by Side Diff: src/arm/assembler-arm.cc

Issue 304143002: Add support for extended constant pool arrays. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Sync Created 6 years, 6 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 | Annotate | Revision Log
« no previous file with comments | « no previous file | src/factory.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 (c) 1994-2006 Sun Microsystems Inc. 1 // Copyright (c) 1994-2006 Sun Microsystems Inc.
2 // All Rights Reserved. 2 // All Rights Reserved.
3 // 3 //
4 // Redistribution and use in source and binary forms, with or without 4 // Redistribution and use in source and binary forms, with or without
5 // modification, are permitted provided that the following conditions 5 // modification, are permitted provided that the following conditions
6 // are met: 6 // are met:
7 // 7 //
8 // - Redistributions of source code must retain the above copyright notice, 8 // - Redistributions of source code must retain the above copyright notice,
9 // this list of conditions and the following disclaimer. 9 // this list of conditions and the following disclaimer.
10 // 10 //
(...skipping 3536 matching lines...) Expand 10 before | Expand all | Expand 10 after
3547 } else if (IsCodePtrEntry(rmode)) { 3547 } else if (IsCodePtrEntry(rmode)) {
3548 count_of_code_ptr_++; 3548 count_of_code_ptr_++;
3549 } else { 3549 } else {
3550 ASSERT(IsHeapPtrEntry(rmode)); 3550 ASSERT(IsHeapPtrEntry(rmode));
3551 count_of_heap_ptr_++; 3551 count_of_heap_ptr_++;
3552 } 3552 }
3553 } 3553 }
3554 3554
3555 // Check if we still have room for another entry given Arm's ldr and vldr 3555 // Check if we still have room for another entry given Arm's ldr and vldr
3556 // immediate offset range. 3556 // immediate offset range.
3557 if (!(is_uint12(ConstantPoolArray::SizeFor(count_of_64bit_, 3557 // TODO(rmcilroy): Avoid creating a new object here when we support
3558 count_of_code_ptr_, 3558 // extended constant pools.
3559 count_of_heap_ptr_, 3559 ConstantPoolArray::NumberOfEntries total(count_of_64bit_,
3560 count_of_32bit_))) && 3560 count_of_code_ptr_,
3561 is_uint10(ConstantPoolArray::SizeFor(count_of_64bit_, 0, 0, 0))) { 3561 count_of_heap_ptr_,
3562 count_of_32bit_);
3563 ConstantPoolArray::NumberOfEntries int64_counts(count_of_64bit_, 0, 0, 0);
3564 if (!(is_uint12(ConstantPoolArray::SizeFor(total)) &&
3565 is_uint10(ConstantPoolArray::SizeFor(int64_counts)))) {
3562 assm->set_constant_pool_full(); 3566 assm->set_constant_pool_full();
3563 } 3567 }
3564 } 3568 }
3565 3569
3566 3570
3567 void ConstantPoolBuilder::Relocate(int pc_delta) { 3571 void ConstantPoolBuilder::Relocate(int pc_delta) {
3568 for (std::vector<RelocInfo>::iterator rinfo = entries_.begin(); 3572 for (std::vector<RelocInfo>::iterator rinfo = entries_.begin();
3569 rinfo != entries_.end(); rinfo++) { 3573 rinfo != entries_.end(); rinfo++) {
3570 ASSERT(rinfo->rmode() != RelocInfo::JS_RETURN); 3574 ASSERT(rinfo->rmode() != RelocInfo::JS_RETURN);
3571 rinfo->set_pc(rinfo->pc() + pc_delta); 3575 rinfo->set_pc(rinfo->pc() + pc_delta);
3572 } 3576 }
3573 } 3577 }
3574 3578
3575 3579
3576 Handle<ConstantPoolArray> ConstantPoolBuilder::New(Isolate* isolate) { 3580 Handle<ConstantPoolArray> ConstantPoolBuilder::New(Isolate* isolate) {
3577 if (IsEmpty()) { 3581 if (IsEmpty()) {
3578 return isolate->factory()->empty_constant_pool_array(); 3582 return isolate->factory()->empty_constant_pool_array();
3579 } else { 3583 } else {
3580 return isolate->factory()->NewConstantPoolArray(count_of_64bit_, 3584 ConstantPoolArray::NumberOfEntries small(count_of_64bit_,
3581 count_of_code_ptr_, 3585 count_of_code_ptr_,
3582 count_of_heap_ptr_, 3586 count_of_heap_ptr_,
3583 count_of_32bit_); 3587 count_of_32bit_);
3588 return isolate->factory()->NewConstantPoolArray(small);
3584 } 3589 }
3585 } 3590 }
3586 3591
3587 3592
3588 void ConstantPoolBuilder::Populate(Assembler* assm, 3593 void ConstantPoolBuilder::Populate(Assembler* assm,
3589 ConstantPoolArray* constant_pool) { 3594 ConstantPoolArray* constant_pool) {
3590 ASSERT(constant_pool->count_of_int64_entries() == count_of_64bit_); 3595 ConstantPoolArray::LayoutSection section = ConstantPoolArray::SMALL_SECTION;
3591 ASSERT(constant_pool->count_of_code_ptr_entries() == count_of_code_ptr_); 3596 ASSERT(count_of_64bit_ ==
3592 ASSERT(constant_pool->count_of_heap_ptr_entries() == count_of_heap_ptr_); 3597 constant_pool->number_of_entries(ConstantPoolArray::INT64, section));
3593 ASSERT(constant_pool->count_of_int32_entries() == count_of_32bit_); 3598 ASSERT(count_of_code_ptr_ ==
3599 constant_pool->number_of_entries(ConstantPoolArray::CODE_PTR, section));
3600 ASSERT(count_of_heap_ptr_ ==
3601 constant_pool->number_of_entries(ConstantPoolArray::HEAP_PTR, section));
3602 ASSERT(count_of_32bit_ ==
3603 constant_pool->number_of_entries(ConstantPoolArray::INT32, section));
3594 ASSERT(entries_.size() == merged_indexes_.size()); 3604 ASSERT(entries_.size() == merged_indexes_.size());
3595 3605
3596 int index_64bit = 0; 3606 int index_64bit = 0;
3597 int index_code_ptr = count_of_64bit_; 3607 int index_code_ptr = count_of_64bit_;
3598 int index_heap_ptr = count_of_64bit_ + count_of_code_ptr_; 3608 int index_heap_ptr = count_of_64bit_ + count_of_code_ptr_;
3599 int index_32bit = count_of_64bit_ + count_of_code_ptr_ + count_of_heap_ptr_; 3609 int index_32bit = count_of_64bit_ + count_of_code_ptr_ + count_of_heap_ptr_;
3600 3610
3601 size_t i; 3611 size_t i;
3602 std::vector<RelocInfo>::const_iterator rinfo; 3612 std::vector<RelocInfo>::const_iterator rinfo;
3603 for (rinfo = entries_.begin(), i = 0; rinfo != entries_.end(); rinfo++, i++) { 3613 for (rinfo = entries_.begin(), i = 0; rinfo != entries_.end(); rinfo++, i++) {
3604 RelocInfo::Mode rmode = rinfo->rmode(); 3614 RelocInfo::Mode rmode = rinfo->rmode();
3605 3615
3606 // Update constant pool if necessary and get the entry's offset. 3616 // Update constant pool if necessary and get the entry's offset.
3607 int offset; 3617 int offset;
3608 if (merged_indexes_[i] == -1) { 3618 if (merged_indexes_[i] == -1) {
3609 if (Is64BitEntry(rmode)) { 3619 if (Is64BitEntry(rmode)) {
3610 offset = constant_pool->OffsetOfElementAt(index_64bit) - kHeapObjectTag; 3620 offset = constant_pool->OffsetOfElementAt(index_64bit) - kHeapObjectTag;
3611 constant_pool->set(index_64bit++, rinfo->data64()); 3621 constant_pool->set(index_64bit++, rinfo->data64());
3612 } else if (Is32BitEntry(rmode)) { 3622 } else if (Is32BitEntry(rmode)) {
3613 offset = constant_pool->OffsetOfElementAt(index_32bit) - kHeapObjectTag; 3623 offset = constant_pool->OffsetOfElementAt(index_32bit) - kHeapObjectTag;
3614 constant_pool->set(index_32bit++, static_cast<int32_t>(rinfo->data())); 3624 constant_pool->set(index_32bit++, static_cast<int32_t>(rinfo->data()));
3615 } else if (IsCodePtrEntry(rmode)) { 3625 } else if (IsCodePtrEntry(rmode)) {
3616 offset = constant_pool->OffsetOfElementAt(index_code_ptr) - 3626 offset = constant_pool->OffsetOfElementAt(index_code_ptr) -
3617 kHeapObjectTag; 3627 kHeapObjectTag;
3618 constant_pool->set(index_code_ptr++, 3628 constant_pool->set(index_code_ptr++,
3619 reinterpret_cast<Object *>(rinfo->data())); 3629 reinterpret_cast<Address>(rinfo->data()));
3620 } else { 3630 } else {
3621 ASSERT(IsHeapPtrEntry(rmode)); 3631 ASSERT(IsHeapPtrEntry(rmode));
3622 offset = constant_pool->OffsetOfElementAt(index_heap_ptr) - 3632 offset = constant_pool->OffsetOfElementAt(index_heap_ptr) -
3623 kHeapObjectTag; 3633 kHeapObjectTag;
3624 constant_pool->set(index_heap_ptr++, 3634 constant_pool->set(index_heap_ptr++,
3625 reinterpret_cast<Object *>(rinfo->data())); 3635 reinterpret_cast<Object *>(rinfo->data()));
3626 } 3636 }
3627 merged_indexes_[i] = offset; // Stash offset for merged entries. 3637 merged_indexes_[i] = offset; // Stash offset for merged entries.
3628 } else { 3638 } else {
3629 size_t merged_index = static_cast<size_t>(merged_indexes_[i]); 3639 size_t merged_index = static_cast<size_t>(merged_indexes_[i]);
(...skipping 23 matching lines...) Expand all
3653 ASSERT((index_64bit == count_of_64bit_) && 3663 ASSERT((index_64bit == count_of_64bit_) &&
3654 (index_code_ptr == (index_64bit + count_of_code_ptr_)) && 3664 (index_code_ptr == (index_64bit + count_of_code_ptr_)) &&
3655 (index_heap_ptr == (index_code_ptr + count_of_heap_ptr_)) && 3665 (index_heap_ptr == (index_code_ptr + count_of_heap_ptr_)) &&
3656 (index_32bit == (index_heap_ptr + count_of_32bit_))); 3666 (index_32bit == (index_heap_ptr + count_of_32bit_)));
3657 } 3667 }
3658 3668
3659 3669
3660 } } // namespace v8::internal 3670 } } // namespace v8::internal
3661 3671
3662 #endif // V8_TARGET_ARCH_ARM 3672 #endif // V8_TARGET_ARCH_ARM
OLDNEW
« no previous file with comments | « no previous file | src/factory.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698