| Index: src/compiler/code-assembler.cc
|
| diff --git a/src/compiler/code-assembler.cc b/src/compiler/code-assembler.cc
|
| index 8ec1b509727eec3c5f27239b9ee0746edf9baa10..b756ac4dea68b0f797a44dd32f173bc0529b419b 100644
|
| --- a/src/compiler/code-assembler.cc
|
| +++ b/src/compiler/code-assembler.cc
|
| @@ -119,34 +119,10 @@ Node* CodeAssembler::Float64Constant(double value) {
|
| return raw_assembler_->Float64Constant(value);
|
| }
|
|
|
| -Node* CodeAssembler::BooleanMapConstant() {
|
| - return HeapConstant(isolate()->factory()->boolean_map());
|
| -}
|
| -
|
| -Node* CodeAssembler::EmptyStringConstant() {
|
| - return LoadRoot(Heap::kempty_stringRootIndex);
|
| -}
|
| -
|
| -Node* CodeAssembler::HeapNumberMapConstant() {
|
| - return HeapConstant(isolate()->factory()->heap_number_map());
|
| -}
|
| -
|
| Node* CodeAssembler::NaNConstant() {
|
| return LoadRoot(Heap::kNanValueRootIndex);
|
| }
|
|
|
| -Node* CodeAssembler::NoContextConstant() {
|
| - return SmiConstant(Smi::FromInt(0));
|
| -}
|
| -
|
| -Node* CodeAssembler::NullConstant() {
|
| - return LoadRoot(Heap::kNullValueRootIndex);
|
| -}
|
| -
|
| -Node* CodeAssembler::UndefinedConstant() {
|
| - return LoadRoot(Heap::kUndefinedValueRootIndex);
|
| -}
|
| -
|
| Node* CodeAssembler::Parameter(int value) {
|
| return raw_assembler_->Parameter(value);
|
| }
|
| @@ -173,14 +149,6 @@ Node* CodeAssembler::SmiShiftBitsConstant() {
|
| return IntPtrConstant(kSmiShiftSize + kSmiTagSize);
|
| }
|
|
|
| -Node* CodeAssembler::SmiTag(Node* value) {
|
| - return raw_assembler_->WordShl(value, SmiShiftBitsConstant());
|
| -}
|
| -
|
| -Node* CodeAssembler::SmiUntag(Node* value) {
|
| - return raw_assembler_->WordSar(value, SmiShiftBitsConstant());
|
| -}
|
| -
|
| #define DEFINE_CODE_ASSEMBLER_BINARY_OP(name) \
|
| Node* CodeAssembler::name(Node* a, Node* b) { \
|
| return raw_assembler_->name(a, b); \
|
| @@ -213,6 +181,18 @@ Node* CodeAssembler::ChangeUint32ToWord(Node* value) {
|
| CODE_ASSEMBLER_UNARY_OP_LIST(DEFINE_CODE_ASSEMBLER_UNARY_OP)
|
| #undef DEFINE_CODE_ASSEMBLER_UNARY_OP
|
|
|
| +Node* CodeAssembler::Load(MachineType rep, Node* base) {
|
| + return raw_assembler_->Load(rep, base);
|
| +}
|
| +
|
| +Node* CodeAssembler::Load(MachineType rep, Node* base, Node* index) {
|
| + return raw_assembler_->Load(rep, base, index);
|
| +}
|
| +
|
| +Node* CodeAssembler::AtomicLoad(MachineType rep, Node* base, Node* index) {
|
| + return raw_assembler_->AtomicLoad(rep, base, index);
|
| +}
|
| +
|
| Node* CodeAssembler::LoadRoot(Heap::RootListIndex root_index) {
|
| if (isolate()->heap()->RootCanBeTreatedAsConstant(root_index)) {
|
| Handle<Object> root = isolate()->heap()->root_handle(root_index);
|
| @@ -227,145 +207,12 @@ Node* CodeAssembler::LoadRoot(Heap::RootListIndex root_index) {
|
| ExternalConstant(ExternalReference::roots_array_start(isolate()));
|
| USE(roots_array_start);
|
|
|
| - // TODO(danno): Implement thee root-access case where the root is not constant
|
| + // TODO(danno): Implement the root-access case where the root is not constant
|
| // and must be loaded from the root array.
|
| UNIMPLEMENTED();
|
| return nullptr;
|
| }
|
|
|
| -Node* CodeAssembler::AllocateRawUnaligned(Node* size_in_bytes,
|
| - AllocationFlags flags,
|
| - Node* top_address,
|
| - Node* limit_address) {
|
| - Node* top = Load(MachineType::Pointer(), top_address);
|
| - Node* limit = Load(MachineType::Pointer(), limit_address);
|
| -
|
| - // If there's not enough space, call the runtime.
|
| - RawMachineLabel runtime_call(RawMachineLabel::kDeferred), no_runtime_call,
|
| - merge_runtime;
|
| - raw_assembler_->Branch(
|
| - raw_assembler_->IntPtrLessThan(IntPtrSub(limit, top), size_in_bytes),
|
| - &runtime_call, &no_runtime_call);
|
| -
|
| - raw_assembler_->Bind(&runtime_call);
|
| - // AllocateInTargetSpace does not use the context.
|
| - Node* context = IntPtrConstant(0);
|
| - Node* runtime_flags = SmiTag(Int32Constant(
|
| - AllocateDoubleAlignFlag::encode(false) |
|
| - AllocateTargetSpace::encode(flags & kPretenured
|
| - ? AllocationSpace::OLD_SPACE
|
| - : AllocationSpace::NEW_SPACE)));
|
| - Node* runtime_result = CallRuntime(Runtime::kAllocateInTargetSpace, context,
|
| - SmiTag(size_in_bytes), runtime_flags);
|
| - raw_assembler_->Goto(&merge_runtime);
|
| -
|
| - // When there is enough space, return `top' and bump it up.
|
| - raw_assembler_->Bind(&no_runtime_call);
|
| - Node* no_runtime_result = top;
|
| - StoreNoWriteBarrier(MachineType::PointerRepresentation(), top_address,
|
| - IntPtrAdd(top, size_in_bytes));
|
| - no_runtime_result =
|
| - IntPtrAdd(no_runtime_result, IntPtrConstant(kHeapObjectTag));
|
| - raw_assembler_->Goto(&merge_runtime);
|
| -
|
| - raw_assembler_->Bind(&merge_runtime);
|
| - return raw_assembler_->Phi(MachineType::PointerRepresentation(),
|
| - runtime_result, no_runtime_result);
|
| -}
|
| -
|
| -Node* CodeAssembler::AllocateRawAligned(Node* size_in_bytes,
|
| - AllocationFlags flags,
|
| - Node* top_address,
|
| - Node* limit_address) {
|
| - Node* top = Load(MachineType::Pointer(), top_address);
|
| - Node* limit = Load(MachineType::Pointer(), limit_address);
|
| - Node* adjusted_size = size_in_bytes;
|
| - if (flags & kDoubleAlignment) {
|
| - // TODO(epertoso): Simd128 alignment.
|
| - RawMachineLabel aligned, not_aligned, merge;
|
| - raw_assembler_->Branch(WordAnd(top, IntPtrConstant(kDoubleAlignmentMask)),
|
| - ¬_aligned, &aligned);
|
| -
|
| - raw_assembler_->Bind(¬_aligned);
|
| - Node* not_aligned_size =
|
| - IntPtrAdd(size_in_bytes, IntPtrConstant(kPointerSize));
|
| - raw_assembler_->Goto(&merge);
|
| -
|
| - raw_assembler_->Bind(&aligned);
|
| - raw_assembler_->Goto(&merge);
|
| -
|
| - raw_assembler_->Bind(&merge);
|
| - adjusted_size = raw_assembler_->Phi(MachineType::PointerRepresentation(),
|
| - not_aligned_size, adjusted_size);
|
| - }
|
| -
|
| - Node* address = AllocateRawUnaligned(adjusted_size, kNone, top, limit);
|
| -
|
| - RawMachineLabel needs_filler, doesnt_need_filler, merge_address;
|
| - raw_assembler_->Branch(
|
| - raw_assembler_->IntPtrEqual(adjusted_size, size_in_bytes),
|
| - &doesnt_need_filler, &needs_filler);
|
| -
|
| - raw_assembler_->Bind(&needs_filler);
|
| - // Store a filler and increase the address by kPointerSize.
|
| - // TODO(epertoso): this code assumes that we only align to kDoubleSize. Change
|
| - // it when Simd128 alignment is supported.
|
| - StoreNoWriteBarrier(MachineType::PointerRepresentation(), top,
|
| - LoadRoot(Heap::kOnePointerFillerMapRootIndex));
|
| - Node* address_with_filler = IntPtrAdd(address, IntPtrConstant(kPointerSize));
|
| - raw_assembler_->Goto(&merge_address);
|
| -
|
| - raw_assembler_->Bind(&doesnt_need_filler);
|
| - Node* address_without_filler = address;
|
| - raw_assembler_->Goto(&merge_address);
|
| -
|
| - raw_assembler_->Bind(&merge_address);
|
| - address = raw_assembler_->Phi(MachineType::PointerRepresentation(),
|
| - address_with_filler, address_without_filler);
|
| - // Update the top.
|
| - StoreNoWriteBarrier(MachineType::PointerRepresentation(), top_address,
|
| - IntPtrAdd(top, adjusted_size));
|
| - return address;
|
| -}
|
| -
|
| -Node* CodeAssembler::Allocate(int size_in_bytes, AllocationFlags flags) {
|
| - bool const new_space = !(flags & kPretenured);
|
| - Node* top_address = ExternalConstant(
|
| - new_space
|
| - ? ExternalReference::new_space_allocation_top_address(isolate())
|
| - : ExternalReference::old_space_allocation_top_address(isolate()));
|
| - Node* limit_address = ExternalConstant(
|
| - new_space
|
| - ? ExternalReference::new_space_allocation_limit_address(isolate())
|
| - : ExternalReference::old_space_allocation_limit_address(isolate()));
|
| -
|
| -#ifdef V8_HOST_ARCH_32_BIT
|
| - if (flags & kDoubleAlignment) {
|
| - return AllocateRawAligned(IntPtrConstant(size_in_bytes), flags, top_address,
|
| - limit_address);
|
| - }
|
| -#endif
|
| -
|
| - return AllocateRawUnaligned(IntPtrConstant(size_in_bytes), flags, top_address,
|
| - limit_address);
|
| -}
|
| -
|
| -Node* CodeAssembler::InnerAllocate(Node* previous, int offset) {
|
| - return IntPtrAdd(previous, IntPtrConstant(offset));
|
| -}
|
| -
|
| -Node* CodeAssembler::Load(MachineType rep, Node* base) {
|
| - return raw_assembler_->Load(rep, base);
|
| -}
|
| -
|
| -Node* CodeAssembler::Load(MachineType rep, Node* base, Node* index) {
|
| - return raw_assembler_->Load(rep, base, index);
|
| -}
|
| -
|
| -Node* CodeAssembler::AtomicLoad(MachineType rep, Node* base, Node* index) {
|
| - return raw_assembler_->AtomicLoad(rep, base, index);
|
| -}
|
| -
|
| Node* CodeAssembler::Store(MachineRepresentation rep, Node* base, Node* value) {
|
| return raw_assembler_->Store(rep, base, value, kFullWriteBarrier);
|
| }
|
|
|