summaryrefslogtreecommitdiff
path: root/deps/v8/src/codegen/ia32/macro-assembler-ia32.cc
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/src/codegen/ia32/macro-assembler-ia32.cc')
-rw-r--r--deps/v8/src/codegen/ia32/macro-assembler-ia32.cc139
1 files changed, 78 insertions, 61 deletions
diff --git a/deps/v8/src/codegen/ia32/macro-assembler-ia32.cc b/deps/v8/src/codegen/ia32/macro-assembler-ia32.cc
index 16298ed536..c95ea8ad2c 100644
--- a/deps/v8/src/codegen/ia32/macro-assembler-ia32.cc
+++ b/deps/v8/src/codegen/ia32/macro-assembler-ia32.cc
@@ -81,11 +81,15 @@ void TurboAssembler::InitializeRootRegister() {
Move(kRootRegister, Immediate(isolate_root));
}
+Operand TurboAssembler::RootAsOperand(RootIndex index) {
+ DCHECK(root_array_available());
+ return Operand(kRootRegister, RootRegisterOffsetForRootIndex(index));
+}
+
void TurboAssembler::LoadRoot(Register destination, RootIndex index) {
ASM_CODE_COMMENT(this);
if (root_array_available()) {
- mov(destination,
- Operand(kRootRegister, RootRegisterOffsetForRootIndex(index)));
+ mov(destination, RootAsOperand(index));
return;
}
@@ -123,7 +127,7 @@ void TurboAssembler::CompareRoot(Register with, Register scratch,
void TurboAssembler::CompareRoot(Register with, RootIndex index) {
ASM_CODE_COMMENT(this);
if (root_array_available()) {
- cmp(with, Operand(kRootRegister, RootRegisterOffsetForRootIndex(index)));
+ cmp(with, RootAsOperand(index));
return;
}
@@ -140,7 +144,7 @@ void MacroAssembler::PushRoot(RootIndex index) {
ASM_CODE_COMMENT(this);
if (root_array_available()) {
DCHECK(RootsTable::IsImmortalImmovable(index));
- push(Operand(kRootRegister, RootRegisterOffsetForRootIndex(index)));
+ push(RootAsOperand(index));
return;
}
@@ -195,7 +199,7 @@ void TurboAssembler::PushArray(Register array, Register size, Register scratch,
Operand TurboAssembler::ExternalReferenceAsOperand(ExternalReference reference,
Register scratch) {
- // TODO(jgruber): Add support for enable_root_array_delta_access.
+ // TODO(jgruber): Add support for enable_root_relative_access.
if (root_array_available() && options().isolate_independent_code) {
if (IsAddressableThroughRootRegister(isolate(), reference)) {
// Some external references can be efficiently loaded as an offset from
@@ -234,7 +238,7 @@ Operand TurboAssembler::HeapObjectAsOperand(Handle<HeapObject> object) {
Builtin builtin;
RootIndex root_index;
if (isolate()->roots_table().IsRootHandle(object, &root_index)) {
- return Operand(kRootRegister, RootRegisterOffsetForRootIndex(root_index));
+ return RootAsOperand(root_index);
} else if (isolate()->builtins()->IsBuiltinHandle(object, &builtin)) {
return Operand(kRootRegister, RootRegisterOffsetForBuiltin(builtin));
} else if (object.is_identical_to(code_object_) &&
@@ -276,7 +280,7 @@ void TurboAssembler::LoadRootRelative(Register destination, int32_t offset) {
void TurboAssembler::LoadAddress(Register destination,
ExternalReference source) {
- // TODO(jgruber): Add support for enable_root_array_delta_access.
+ // TODO(jgruber): Add support for enable_root_relative_access.
if (root_array_available() && options().isolate_independent_code) {
IndirectLoadExternalReference(destination, source);
return;
@@ -1157,6 +1161,70 @@ void TurboAssembler::Prologue() {
push(kJavaScriptCallArgCountRegister); // Actual argument count.
}
+void TurboAssembler::DropArguments(Register count, ArgumentsCountType type,
+ ArgumentsCountMode mode) {
+ int receiver_bytes =
+ (mode == kCountExcludesReceiver) ? kSystemPointerSize : 0;
+ switch (type) {
+ case kCountIsInteger: {
+ lea(esp, Operand(esp, count, times_system_pointer_size, receiver_bytes));
+ break;
+ }
+ case kCountIsSmi: {
+ STATIC_ASSERT(kSmiTagSize == 1 && kSmiTag == 0);
+ // SMIs are stored shifted left by 1 byte with the tag being 0.
+ // This is equivalent to multiplying by 2. To convert SMIs to bytes we
+ // can therefore just multiply the stored value by half the system pointer
+ // size.
+ lea(esp,
+ Operand(esp, count, times_half_system_pointer_size, receiver_bytes));
+ break;
+ }
+ case kCountIsBytes: {
+ if (receiver_bytes == 0) {
+ add(esp, count);
+ } else {
+ lea(esp, Operand(esp, count, times_1, receiver_bytes));
+ }
+ break;
+ }
+ }
+}
+
+void TurboAssembler::DropArguments(Register count, Register scratch,
+ ArgumentsCountType type,
+ ArgumentsCountMode mode) {
+ DCHECK(!AreAliased(count, scratch));
+ PopReturnAddressTo(scratch);
+ DropArguments(count, type, mode);
+ PushReturnAddressFrom(scratch);
+}
+
+void TurboAssembler::DropArgumentsAndPushNewReceiver(Register argc,
+ Register receiver,
+ Register scratch,
+ ArgumentsCountType type,
+ ArgumentsCountMode mode) {
+ DCHECK(!AreAliased(argc, receiver, scratch));
+ PopReturnAddressTo(scratch);
+ DropArguments(argc, type, mode);
+ Push(receiver);
+ PushReturnAddressFrom(scratch);
+}
+
+void TurboAssembler::DropArgumentsAndPushNewReceiver(Register argc,
+ Operand receiver,
+ Register scratch,
+ ArgumentsCountType type,
+ ArgumentsCountMode mode) {
+ DCHECK(!AreAliased(argc, scratch));
+ DCHECK(!receiver.is_reg(scratch));
+ PopReturnAddressTo(scratch);
+ DropArguments(argc, type, mode);
+ Push(receiver);
+ PushReturnAddressFrom(scratch);
+}
+
void TurboAssembler::EnterFrame(StackFrame::Type type) {
ASM_CODE_COMMENT(this);
push(ebp);
@@ -1164,6 +1232,9 @@ void TurboAssembler::EnterFrame(StackFrame::Type type) {
if (!StackFrame::IsJavaScript(type)) {
Push(Immediate(StackFrame::TypeToMarker(type)));
}
+#if V8_ENABLE_WEBASSEMBLY
+ if (type == StackFrame::WASM) Push(kWasmInstanceRegister);
+#endif // V8_ENABLE_WEBASSEMBLY
}
void TurboAssembler::LeaveFrame(StackFrame::Type type) {
@@ -1431,60 +1502,6 @@ void MacroAssembler::JumpToInstructionStream(Address entry) {
jmp(entry, RelocInfo::OFF_HEAP_TARGET);
}
-void TurboAssembler::PrepareForTailCall(
- Register callee_args_count, Register caller_args_count, Register scratch0,
- Register scratch1, int number_of_temp_values_after_return_address) {
- ASM_CODE_COMMENT(this);
- DCHECK(!AreAliased(callee_args_count, caller_args_count, scratch0, scratch1));
-
- // Calculate the destination address where we will put the return address
- // after we drop current frame.
- Register new_sp_reg = scratch0;
- sub(caller_args_count, callee_args_count);
- lea(new_sp_reg, Operand(ebp, caller_args_count, times_system_pointer_size,
- StandardFrameConstants::kCallerPCOffset -
- number_of_temp_values_after_return_address *
- kSystemPointerSize));
-
- if (FLAG_debug_code) {
- cmp(esp, new_sp_reg);
- Check(below, AbortReason::kStackAccessBelowStackPointer);
- }
-
- // Copy return address from caller's frame to current frame's return address
- // to avoid its trashing and let the following loop copy it to the right
- // place.
- Register tmp_reg = scratch1;
- mov(tmp_reg, Operand(ebp, StandardFrameConstants::kCallerPCOffset));
- mov(Operand(esp,
- number_of_temp_values_after_return_address * kSystemPointerSize),
- tmp_reg);
-
- // Restore caller's frame pointer now as it could be overwritten by
- // the copying loop.
- mov(ebp, Operand(ebp, StandardFrameConstants::kCallerFPOffset));
-
- // +2 here is to copy both receiver and return address.
- Register count_reg = caller_args_count;
- lea(count_reg, Operand(callee_args_count,
- 2 + number_of_temp_values_after_return_address));
-
- // Now copy callee arguments to the caller frame going backwards to avoid
- // callee arguments corruption (source and destination areas could overlap).
- Label loop, entry;
- jmp(&entry, Label::kNear);
- bind(&loop);
- dec(count_reg);
- mov(tmp_reg, Operand(esp, count_reg, times_system_pointer_size, 0));
- mov(Operand(new_sp_reg, count_reg, times_system_pointer_size, 0), tmp_reg);
- bind(&entry);
- cmp(count_reg, Immediate(0));
- j(not_equal, &loop, Label::kNear);
-
- // Leave current frame.
- mov(esp, new_sp_reg);
-}
-
void MacroAssembler::CompareStackLimit(Register with, StackLimitKind kind) {
ASM_CODE_COMMENT(this);
DCHECK(root_array_available());