OLD | NEW |
1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 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/crankshaft/arm64/lithium-codegen-arm64.h" | 5 #include "src/crankshaft/arm64/lithium-codegen-arm64.h" |
6 | 6 |
7 #include "src/arm64/frames-arm64.h" | 7 #include "src/arm64/frames-arm64.h" |
8 #include "src/base/bits.h" | 8 #include "src/base/bits.h" |
9 #include "src/code-factory.h" | 9 #include "src/code-factory.h" |
10 #include "src/code-stubs.h" | 10 #include "src/code-stubs.h" |
(...skipping 5546 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5557 | 5557 |
5558 | 5558 |
5559 void LCodeGen::DoToFastProperties(LToFastProperties* instr) { | 5559 void LCodeGen::DoToFastProperties(LToFastProperties* instr) { |
5560 DCHECK(ToRegister(instr->value()).Is(x0)); | 5560 DCHECK(ToRegister(instr->value()).Is(x0)); |
5561 DCHECK(ToRegister(instr->result()).Is(x0)); | 5561 DCHECK(ToRegister(instr->result()).Is(x0)); |
5562 __ Push(x0); | 5562 __ Push(x0); |
5563 CallRuntime(Runtime::kToFastProperties, 1, instr); | 5563 CallRuntime(Runtime::kToFastProperties, 1, instr); |
5564 } | 5564 } |
5565 | 5565 |
5566 | 5566 |
5567 void LCodeGen::DoRegExpLiteral(LRegExpLiteral* instr) { | |
5568 DCHECK(ToRegister(instr->context()).is(cp)); | |
5569 Label materialized; | |
5570 // Registers will be used as follows: | |
5571 // x7 = literals array. | |
5572 // x1 = regexp literal. | |
5573 // x0 = regexp literal clone. | |
5574 // x10-x12 are used as temporaries. | |
5575 int literal_offset = | |
5576 LiteralsArray::OffsetOfLiteralAt(instr->hydrogen()->literal_index()); | |
5577 __ LoadObject(x7, instr->hydrogen()->literals()); | |
5578 __ Ldr(x1, FieldMemOperand(x7, literal_offset)); | |
5579 __ JumpIfNotRoot(x1, Heap::kUndefinedValueRootIndex, &materialized); | |
5580 | |
5581 // Create regexp literal using runtime function | |
5582 // Result will be in x0. | |
5583 __ Mov(x12, Operand(Smi::FromInt(instr->hydrogen()->literal_index()))); | |
5584 __ Mov(x11, Operand(instr->hydrogen()->pattern())); | |
5585 __ Mov(x10, Operand(instr->hydrogen()->flags())); | |
5586 __ Push(x7, x12, x11, x10); | |
5587 CallRuntime(Runtime::kMaterializeRegExpLiteral, 4, instr); | |
5588 __ Mov(x1, x0); | |
5589 | |
5590 __ Bind(&materialized); | |
5591 int size = JSRegExp::kSize + JSRegExp::kInObjectFieldCount * kPointerSize; | |
5592 Label allocated, runtime_allocate; | |
5593 | |
5594 __ Allocate(size, x0, x10, x11, &runtime_allocate, TAG_OBJECT); | |
5595 __ B(&allocated); | |
5596 | |
5597 __ Bind(&runtime_allocate); | |
5598 __ Mov(x0, Smi::FromInt(size)); | |
5599 __ Push(x1, x0); | |
5600 CallRuntime(Runtime::kAllocateInNewSpace, 1, instr); | |
5601 __ Pop(x1); | |
5602 | |
5603 __ Bind(&allocated); | |
5604 // Copy the content into the newly allocated memory. | |
5605 __ CopyFields(x0, x1, CPURegList(x10, x11, x12), size / kPointerSize); | |
5606 } | |
5607 | |
5608 | |
5609 void LCodeGen::DoTransitionElementsKind(LTransitionElementsKind* instr) { | 5567 void LCodeGen::DoTransitionElementsKind(LTransitionElementsKind* instr) { |
5610 Register object = ToRegister(instr->object()); | 5568 Register object = ToRegister(instr->object()); |
5611 | 5569 |
5612 Handle<Map> from_map = instr->original_map(); | 5570 Handle<Map> from_map = instr->original_map(); |
5613 Handle<Map> to_map = instr->transitioned_map(); | 5571 Handle<Map> to_map = instr->transitioned_map(); |
5614 ElementsKind from_kind = instr->from_kind(); | 5572 ElementsKind from_kind = instr->from_kind(); |
5615 ElementsKind to_kind = instr->to_kind(); | 5573 ElementsKind to_kind = instr->to_kind(); |
5616 | 5574 |
5617 Label not_applicable; | 5575 Label not_applicable; |
5618 | 5576 |
(...skipping 318 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5937 Handle<ScopeInfo> scope_info = instr->scope_info(); | 5895 Handle<ScopeInfo> scope_info = instr->scope_info(); |
5938 __ Push(scope_info); | 5896 __ Push(scope_info); |
5939 __ Push(ToRegister(instr->function())); | 5897 __ Push(ToRegister(instr->function())); |
5940 CallRuntime(Runtime::kPushBlockContext, 2, instr); | 5898 CallRuntime(Runtime::kPushBlockContext, 2, instr); |
5941 RecordSafepoint(Safepoint::kNoLazyDeopt); | 5899 RecordSafepoint(Safepoint::kNoLazyDeopt); |
5942 } | 5900 } |
5943 | 5901 |
5944 | 5902 |
5945 } // namespace internal | 5903 } // namespace internal |
5946 } // namespace v8 | 5904 } // namespace v8 |
OLD | NEW |