| Index: src/x64/full-codegen-x64.cc
|
| diff --git a/src/x64/full-codegen-x64.cc b/src/x64/full-codegen-x64.cc
|
| index 05ec261823497faf62a92ae23fe770264e6713dd..1e7cc6c66142eaf7b1811c5a7ffb97dab0122d77 100644
|
| --- a/src/x64/full-codegen-x64.cc
|
| +++ b/src/x64/full-codegen-x64.cc
|
| @@ -173,7 +173,7 @@ void FullCodeGenerator::Generate() {
|
| } else if (locals_count > 1) {
|
| __ LoadRoot(rdx, Heap::kUndefinedValueRootIndex);
|
| for (int i = 0; i < locals_count; i++) {
|
| - __ push(rdx);
|
| + __ Push(rdx);
|
| }
|
| }
|
| }
|
| @@ -186,14 +186,14 @@ void FullCodeGenerator::Generate() {
|
| Comment cmnt(masm_, "[ Allocate context");
|
| // Argument to NewContext is the function, which is still in rdi.
|
| if (FLAG_harmony_scoping && info->scope()->is_global_scope()) {
|
| - __ push(rdi);
|
| + __ Push(rdi);
|
| __ Push(info->scope()->GetScopeInfo());
|
| __ CallRuntime(Runtime::kNewGlobalContext, 2);
|
| } else if (heap_slots <= FastNewContextStub::kMaximumSlots) {
|
| FastNewContextStub stub(heap_slots);
|
| __ CallStub(&stub);
|
| } else {
|
| - __ push(rdi);
|
| + __ Push(rdi);
|
| __ CallRuntime(Runtime::kNewFunctionContext, 1);
|
| }
|
| function_in_register = false;
|
| @@ -228,16 +228,16 @@ void FullCodeGenerator::Generate() {
|
| // case the "arguments" or ".arguments" variables are in the context.
|
| Comment cmnt(masm_, "[ Allocate arguments object");
|
| if (function_in_register) {
|
| - __ push(rdi);
|
| + __ Push(rdi);
|
| } else {
|
| - __ push(Operand(rbp, JavaScriptFrameConstants::kFunctionOffset));
|
| + __ Push(Operand(rbp, JavaScriptFrameConstants::kFunctionOffset));
|
| }
|
| // The receiver is just before the parameters on the caller's stack.
|
| int num_parameters = info->scope()->num_parameters();
|
| int offset = num_parameters * kPointerSize;
|
| __ lea(rdx,
|
| Operand(rbp, StandardFrameConstants::kCallerSPOffset + offset));
|
| - __ push(rdx);
|
| + __ Push(rdx);
|
| __ Push(Smi::FromInt(num_parameters));
|
| // Arguments to ArgumentsAccessStub:
|
| // function, receiver address, parameter count.
|
| @@ -363,7 +363,7 @@ void FullCodeGenerator::EmitReturnSequence() {
|
| } else {
|
| __ bind(&return_label_);
|
| if (FLAG_trace) {
|
| - __ push(rax);
|
| + __ Push(rax);
|
| __ CallRuntime(Runtime::kTraceExit, 1);
|
| }
|
| // Pretend that the exit is a backwards jump to the entry.
|
| @@ -378,10 +378,10 @@ void FullCodeGenerator::EmitReturnSequence() {
|
| EmitProfilingCounterDecrement(weight);
|
| Label ok;
|
| __ j(positive, &ok, Label::kNear);
|
| - __ push(rax);
|
| + __ Push(rax);
|
| __ call(isolate()->builtins()->InterruptCheck(),
|
| RelocInfo::CODE_TARGET);
|
| - __ pop(rax);
|
| + __ Pop(rax);
|
| EmitProfilingCounterReset();
|
| __ bind(&ok);
|
| #ifdef DEBUG
|
| @@ -394,7 +394,7 @@ void FullCodeGenerator::EmitReturnSequence() {
|
| // Do not use the leave instruction here because it is too short to
|
| // patch with the code required by the debugger.
|
| __ movp(rsp, rbp);
|
| - __ pop(rbp);
|
| + __ popq(rbp);
|
| int no_frame_start = masm_->pc_offset();
|
|
|
| int arguments_bytes = (info_->scope()->num_parameters() + 1) * kPointerSize;
|
| @@ -432,7 +432,7 @@ void FullCodeGenerator::AccumulatorValueContext::Plug(Variable* var) const {
|
| void FullCodeGenerator::StackValueContext::Plug(Variable* var) const {
|
| ASSERT(var->IsStackAllocated() || var->IsContextSlot());
|
| MemOperand operand = codegen()->VarOperand(var, result_register());
|
| - __ push(operand);
|
| + __ Push(operand);
|
| }
|
|
|
|
|
| @@ -790,7 +790,7 @@ void FullCodeGenerator::VisitVariableDeclaration(
|
|
|
| case Variable::LOOKUP: {
|
| Comment cmnt(masm_, "[ VariableDeclaration");
|
| - __ push(rsi);
|
| + __ Push(rsi);
|
| __ Push(variable->name());
|
| // Declaration nodes are always introduced in one of four modes.
|
| ASSERT(IsDeclaredVariableMode(mode));
|
| @@ -856,7 +856,7 @@ void FullCodeGenerator::VisitFunctionDeclaration(
|
|
|
| case Variable::LOOKUP: {
|
| Comment cmnt(masm_, "[ FunctionDeclaration");
|
| - __ push(rsi);
|
| + __ Push(rsi);
|
| __ Push(variable->name());
|
| __ Push(Smi::FromInt(NONE));
|
| VisitForStackValue(declaration->fun());
|
| @@ -927,7 +927,7 @@ void FullCodeGenerator::VisitExportDeclaration(ExportDeclaration* declaration) {
|
|
|
| void FullCodeGenerator::DeclareGlobals(Handle<FixedArray> pairs) {
|
| // Call the runtime to declare the globals.
|
| - __ push(rsi); // The context is the first argument.
|
| + __ Push(rsi); // The context is the first argument.
|
| __ Push(pairs);
|
| __ Push(Smi::FromInt(DeclareGlobalsFlags()));
|
| __ CallRuntime(Runtime::kDeclareGlobals, 3);
|
| @@ -1063,10 +1063,10 @@ void FullCodeGenerator::VisitForInStatement(ForInStatement* stmt) {
|
| __ CmpObjectType(rax, FIRST_SPEC_OBJECT_TYPE, rcx);
|
| __ j(above_equal, &done_convert);
|
| __ bind(&convert);
|
| - __ push(rax);
|
| + __ Push(rax);
|
| __ InvokeBuiltin(Builtins::TO_OBJECT, CALL_FUNCTION);
|
| __ bind(&done_convert);
|
| - __ push(rax);
|
| + __ Push(rax);
|
|
|
| // Check for proxies.
|
| Label call_runtime;
|
| @@ -1088,7 +1088,7 @@ void FullCodeGenerator::VisitForInStatement(ForInStatement* stmt) {
|
|
|
| // Get the set of properties to enumerate.
|
| __ bind(&call_runtime);
|
| - __ push(rax); // Duplicate the enumerable object on the stack.
|
| + __ Push(rax); // Duplicate the enumerable object on the stack.
|
| __ CallRuntime(Runtime::kGetPropertyNamesFast, 1);
|
|
|
| // If we got a map from the runtime call, we can do a fast
|
| @@ -1113,9 +1113,9 @@ void FullCodeGenerator::VisitForInStatement(ForInStatement* stmt) {
|
| __ movp(rcx, FieldOperand(rcx, DescriptorArray::kEnumCacheBridgeCacheOffset));
|
|
|
| // Set up the four remaining stack slots.
|
| - __ push(rax); // Map.
|
| - __ push(rcx); // Enumeration cache.
|
| - __ push(rdx); // Number of valid entries for the map in the enum cache.
|
| + __ Push(rax); // Map.
|
| + __ Push(rcx); // Enumeration cache.
|
| + __ Push(rdx); // Number of valid entries for the map in the enum cache.
|
| __ Push(Smi::FromInt(0)); // Initial index.
|
| __ jmp(&loop);
|
|
|
| @@ -1143,10 +1143,10 @@ void FullCodeGenerator::VisitForInStatement(ForInStatement* stmt) {
|
| __ j(above, &non_proxy);
|
| __ Move(rbx, Smi::FromInt(0)); // Zero indicates proxy
|
| __ bind(&non_proxy);
|
| - __ push(rbx); // Smi
|
| - __ push(rax); // Array
|
| + __ Push(rbx); // Smi
|
| + __ Push(rax); // Array
|
| __ movp(rax, FieldOperand(rax, FixedArray::kLengthOffset));
|
| - __ push(rax); // Fixed array length (as smi).
|
| + __ Push(rax); // Fixed array length (as smi).
|
| __ Push(Smi::FromInt(0)); // Initial index.
|
|
|
| // Generate code for doing the condition check.
|
| @@ -1183,8 +1183,8 @@ void FullCodeGenerator::VisitForInStatement(ForInStatement* stmt) {
|
| // Convert the entry to a string or null if it isn't a property
|
| // anymore. If the property has been removed while iterating, we
|
| // just skip it.
|
| - __ push(rcx); // Enumerable.
|
| - __ push(rbx); // Current entry.
|
| + __ Push(rcx); // Enumerable.
|
| + __ Push(rbx); // Current entry.
|
| __ InvokeBuiltin(Builtins::FILTER_KEY, CALL_FUNCTION);
|
| __ Cmp(rax, Smi::FromInt(0));
|
| __ j(equal, loop_statement.continue_label());
|
| @@ -1243,7 +1243,7 @@ void FullCodeGenerator::VisitForOfStatement(ForOfStatement* stmt) {
|
| __ CmpObjectType(rax, FIRST_SPEC_OBJECT_TYPE, rcx);
|
| __ j(above_equal, &done_convert);
|
| __ bind(&convert);
|
| - __ push(rax);
|
| + __ Push(rax);
|
| __ InvokeBuiltin(Builtins::TO_OBJECT, CALL_FUNCTION);
|
| __ bind(&done_convert);
|
|
|
| @@ -1296,7 +1296,7 @@ void FullCodeGenerator::EmitNewClosure(Handle<SharedFunctionInfo> info,
|
| __ Move(rbx, info);
|
| __ CallStub(&stub);
|
| } else {
|
| - __ push(rsi);
|
| + __ Push(rsi);
|
| __ Push(info);
|
| __ Push(pretenure
|
| ? isolate()->factory()->true_value()
|
| @@ -1525,7 +1525,7 @@ void FullCodeGenerator::EmitVariableLoad(VariableProxy* proxy) {
|
| // by eval-introduced variables.
|
| EmitDynamicLookupFastCase(var, NOT_INSIDE_TYPEOF, &slow, &done);
|
| __ bind(&slow);
|
| - __ push(rsi); // Context.
|
| + __ Push(rsi); // Context.
|
| __ Push(var->name());
|
| __ CallRuntime(Runtime::kLoadContextSlot, 2);
|
| __ bind(&done);
|
| @@ -1554,7 +1554,7 @@ void FullCodeGenerator::VisitRegExpLiteral(RegExpLiteral* expr) {
|
|
|
| // Create regexp literal using runtime function
|
| // Result will be in rax.
|
| - __ push(rcx);
|
| + __ Push(rcx);
|
| __ Push(Smi::FromInt(expr->literal_index()));
|
| __ Push(expr->pattern());
|
| __ Push(expr->flags());
|
| @@ -1568,10 +1568,10 @@ void FullCodeGenerator::VisitRegExpLiteral(RegExpLiteral* expr) {
|
| __ jmp(&allocated);
|
|
|
| __ bind(&runtime_allocate);
|
| - __ push(rbx);
|
| + __ Push(rbx);
|
| __ Push(Smi::FromInt(size));
|
| __ CallRuntime(Runtime::kAllocateInNewSpace, 1);
|
| - __ pop(rbx);
|
| + __ Pop(rbx);
|
|
|
| __ bind(&allocated);
|
| // Copy the content into the newly allocated memory.
|
| @@ -1615,7 +1615,7 @@ void FullCodeGenerator::VisitObjectLiteral(ObjectLiteral* expr) {
|
| flags != ObjectLiteral::kFastElements ||
|
| properties_count > FastCloneShallowObjectStub::kMaximumClonedProperties) {
|
| __ movp(rdi, Operand(rbp, JavaScriptFrameConstants::kFunctionOffset));
|
| - __ push(FieldOperand(rdi, JSFunction::kLiteralsOffset));
|
| + __ Push(FieldOperand(rdi, JSFunction::kLiteralsOffset));
|
| __ Push(Smi::FromInt(expr->literal_index()));
|
| __ Push(constant_properties);
|
| __ Push(Smi::FromInt(flags));
|
| @@ -1647,7 +1647,7 @@ void FullCodeGenerator::VisitObjectLiteral(ObjectLiteral* expr) {
|
| Literal* key = property->key();
|
| Expression* value = property->value();
|
| if (!result_saved) {
|
| - __ push(rax); // Save result on the stack
|
| + __ Push(rax); // Save result on the stack
|
| result_saved = true;
|
| }
|
| switch (property->kind()) {
|
| @@ -1669,7 +1669,7 @@ void FullCodeGenerator::VisitObjectLiteral(ObjectLiteral* expr) {
|
| }
|
| break;
|
| }
|
| - __ push(Operand(rsp, 0)); // Duplicate receiver.
|
| + __ Push(Operand(rsp, 0)); // Duplicate receiver.
|
| VisitForStackValue(key);
|
| VisitForStackValue(value);
|
| if (property->emit_store()) {
|
| @@ -1680,7 +1680,7 @@ void FullCodeGenerator::VisitObjectLiteral(ObjectLiteral* expr) {
|
| }
|
| break;
|
| case ObjectLiteral::Property::PROTOTYPE:
|
| - __ push(Operand(rsp, 0)); // Duplicate receiver.
|
| + __ Push(Operand(rsp, 0)); // Duplicate receiver.
|
| VisitForStackValue(value);
|
| if (property->emit_store()) {
|
| __ CallRuntime(Runtime::kSetPrototype, 2);
|
| @@ -1702,7 +1702,7 @@ void FullCodeGenerator::VisitObjectLiteral(ObjectLiteral* expr) {
|
| for (AccessorTable::Iterator it = accessor_table.begin();
|
| it != accessor_table.end();
|
| ++it) {
|
| - __ push(Operand(rsp, 0)); // Duplicate receiver.
|
| + __ Push(Operand(rsp, 0)); // Duplicate receiver.
|
| VisitForStackValue(it->first);
|
| EmitAccessor(it->second->getter);
|
| EmitAccessor(it->second->setter);
|
| @@ -1712,7 +1712,7 @@ void FullCodeGenerator::VisitObjectLiteral(ObjectLiteral* expr) {
|
|
|
| if (expr->has_function()) {
|
| ASSERT(result_saved);
|
| - __ push(Operand(rsp, 0));
|
| + __ Push(Operand(rsp, 0));
|
| __ CallRuntime(Runtime::kToFastProperties, 1);
|
| }
|
|
|
| @@ -1768,7 +1768,7 @@ void FullCodeGenerator::VisitArrayLiteral(ArrayLiteral* expr) {
|
| } else if (expr->depth() > 1 || Serializer::enabled() ||
|
| length > FastCloneShallowArrayStub::kMaximumClonedLength) {
|
| __ movp(rbx, Operand(rbp, JavaScriptFrameConstants::kFunctionOffset));
|
| - __ push(FieldOperand(rbx, JSFunction::kLiteralsOffset));
|
| + __ Push(FieldOperand(rbx, JSFunction::kLiteralsOffset));
|
| __ Push(Smi::FromInt(expr->literal_index()));
|
| __ Push(constant_elements);
|
| __ Push(Smi::FromInt(flags));
|
| @@ -1804,7 +1804,7 @@ void FullCodeGenerator::VisitArrayLiteral(ArrayLiteral* expr) {
|
| if (CompileTimeValue::IsCompileTimeValue(subexpr)) continue;
|
|
|
| if (!result_saved) {
|
| - __ push(rax); // array literal
|
| + __ Push(rax); // array literal
|
| __ Push(Smi::FromInt(expr->literal_index()));
|
| result_saved = true;
|
| }
|
| @@ -1867,7 +1867,7 @@ void FullCodeGenerator::VisitAssignment(Assignment* expr) {
|
| if (expr->is_compound()) {
|
| // We need the receiver both on the stack and in the accumulator.
|
| VisitForAccumulatorValue(property->obj());
|
| - __ push(result_register());
|
| + __ Push(result_register());
|
| } else {
|
| VisitForStackValue(property->obj());
|
| }
|
| @@ -1877,7 +1877,7 @@ void FullCodeGenerator::VisitAssignment(Assignment* expr) {
|
| VisitForStackValue(property->obj());
|
| VisitForAccumulatorValue(property->key());
|
| __ movp(rdx, Operand(rsp, 0));
|
| - __ push(rax);
|
| + __ Push(rax);
|
| } else {
|
| VisitForStackValue(property->obj());
|
| VisitForStackValue(property->key());
|
| @@ -1907,7 +1907,7 @@ void FullCodeGenerator::VisitAssignment(Assignment* expr) {
|
| }
|
|
|
| Token::Value op = expr->binary_op();
|
| - __ push(rax); // Left operand goes on the stack.
|
| + __ Push(rax); // Left operand goes on the stack.
|
| VisitForAccumulatorValue(expr->value());
|
|
|
| OverwriteMode mode = expr->value()->ResultOverwriteAllowed()
|
| @@ -1961,7 +1961,7 @@ void FullCodeGenerator::VisitYield(Yield* expr) {
|
| case Yield::SUSPEND:
|
| // Pop value from top-of-stack slot; box result into result register.
|
| EmitCreateIteratorResult(false);
|
| - __ push(result_register());
|
| + __ Push(result_register());
|
| // Fall through.
|
| case Yield::INITIAL: {
|
| Label suspend, continuation, post_runtime, resume;
|
| @@ -1983,13 +1983,13 @@ void FullCodeGenerator::VisitYield(Yield* expr) {
|
| __ lea(rbx, Operand(rbp, StandardFrameConstants::kExpressionsOffset));
|
| __ cmpq(rsp, rbx);
|
| __ j(equal, &post_runtime);
|
| - __ push(rax); // generator object
|
| + __ Push(rax); // generator object
|
| __ CallRuntime(Runtime::kSuspendJSGeneratorObject, 1);
|
| __ movp(context_register(),
|
| Operand(rbp, StandardFrameConstants::kContextOffset));
|
| __ bind(&post_runtime);
|
|
|
| - __ pop(result_register());
|
| + __ Pop(result_register());
|
| EmitReturnSequence();
|
|
|
| __ bind(&resume);
|
| @@ -2026,26 +2026,26 @@ void FullCodeGenerator::VisitYield(Yield* expr) {
|
| __ bind(&l_catch);
|
| handler_table()->set(expr->index(), Smi::FromInt(l_catch.pos()));
|
| __ LoadRoot(rcx, Heap::kthrow_stringRootIndex); // "throw"
|
| - __ push(rcx);
|
| - __ push(Operand(rsp, 2 * kPointerSize)); // iter
|
| - __ push(rax); // exception
|
| + __ Push(rcx);
|
| + __ Push(Operand(rsp, 2 * kPointerSize)); // iter
|
| + __ Push(rax); // exception
|
| __ jmp(&l_call);
|
|
|
| // try { received = %yield result }
|
| // Shuffle the received result above a try handler and yield it without
|
| // re-boxing.
|
| __ bind(&l_try);
|
| - __ pop(rax); // result
|
| + __ Pop(rax); // result
|
| __ PushTryHandler(StackHandler::CATCH, expr->index());
|
| const int handler_size = StackHandlerConstants::kSize;
|
| - __ push(rax); // result
|
| + __ Push(rax); // result
|
| __ jmp(&l_suspend);
|
| __ bind(&l_continuation);
|
| __ jmp(&l_resume);
|
| __ bind(&l_suspend);
|
| const int generator_object_depth = kPointerSize + handler_size;
|
| __ movp(rax, Operand(rsp, generator_object_depth));
|
| - __ push(rax); // g
|
| + __ Push(rax); // g
|
| ASSERT(l_continuation.pos() > 0 && Smi::IsValid(l_continuation.pos()));
|
| __ Move(FieldOperand(rax, JSGeneratorObject::kContinuationOffset),
|
| Smi::FromInt(l_continuation.pos()));
|
| @@ -2056,7 +2056,7 @@ void FullCodeGenerator::VisitYield(Yield* expr) {
|
| __ CallRuntime(Runtime::kSuspendJSGeneratorObject, 1);
|
| __ movp(context_register(),
|
| Operand(rbp, StandardFrameConstants::kContextOffset));
|
| - __ pop(rax); // result
|
| + __ Pop(rax); // result
|
| EmitReturnSequence();
|
| __ bind(&l_resume); // received in rax
|
| __ PopTryHandler();
|
| @@ -2064,9 +2064,9 @@ void FullCodeGenerator::VisitYield(Yield* expr) {
|
| // receiver = iter; f = 'next'; arg = received;
|
| __ bind(&l_next);
|
| __ LoadRoot(rcx, Heap::knext_stringRootIndex); // "next"
|
| - __ push(rcx);
|
| - __ push(Operand(rsp, 2 * kPointerSize)); // iter
|
| - __ push(rax); // received
|
| + __ Push(rcx);
|
| + __ Push(Operand(rsp, 2 * kPointerSize)); // iter
|
| + __ Push(rax); // received
|
|
|
| // result = receiver[f](arg);
|
| __ bind(&l_call);
|
| @@ -2084,7 +2084,7 @@ void FullCodeGenerator::VisitYield(Yield* expr) {
|
|
|
| // if (!result.done) goto l_try;
|
| __ bind(&l_loop);
|
| - __ push(rax); // save result
|
| + __ Push(rax); // save result
|
| __ LoadRoot(rcx, Heap::kdone_stringRootIndex); // "done"
|
| CallLoadIC(NOT_CONTEXTUAL); // result.done in rax
|
| Handle<Code> bool_ic = ToBooleanStub::GetUninitialized(isolate());
|
| @@ -2093,7 +2093,7 @@ void FullCodeGenerator::VisitYield(Yield* expr) {
|
| __ j(zero, &l_try);
|
|
|
| // result.value
|
| - __ pop(rax); // result
|
| + __ Pop(rax); // result
|
| __ LoadRoot(rcx, Heap::kvalue_stringRootIndex); // "value"
|
| CallLoadIC(NOT_CONTEXTUAL); // result.value in rax
|
| context()->DropAndPlug(2, rax); // drop iter and g
|
| @@ -2112,7 +2112,7 @@ void FullCodeGenerator::EmitGeneratorResume(Expression *generator,
|
| // rbx will hold the generator object until the activation has been resumed.
|
| VisitForStackValue(generator);
|
| VisitForAccumulatorValue(value);
|
| - __ pop(rbx);
|
| + __ Pop(rbx);
|
|
|
| // Check generator state.
|
| Label wrong_state, closed_state, done;
|
| @@ -2128,7 +2128,7 @@ void FullCodeGenerator::EmitGeneratorResume(Expression *generator,
|
| __ movp(rdi, FieldOperand(rbx, JSGeneratorObject::kFunctionOffset));
|
|
|
| // Push receiver.
|
| - __ push(FieldOperand(rbx, JSGeneratorObject::kReceiverOffset));
|
| + __ Push(FieldOperand(rbx, JSGeneratorObject::kReceiverOffset));
|
|
|
| // Push holes for arguments to generator function.
|
| __ movp(rdx, FieldOperand(rdi, JSFunction::kSharedFunctionInfoOffset));
|
| @@ -2140,7 +2140,7 @@ void FullCodeGenerator::EmitGeneratorResume(Expression *generator,
|
| __ bind(&push_argument_holes);
|
| __ subq(rdx, Immediate(1));
|
| __ j(carry, &push_frame);
|
| - __ push(rcx);
|
| + __ Push(rcx);
|
| __ jmp(&push_argument_holes);
|
|
|
| // Enter a new JavaScript frame, and initialize its slots as they were when
|
| @@ -2150,10 +2150,10 @@ void FullCodeGenerator::EmitGeneratorResume(Expression *generator,
|
| __ call(&resume_frame);
|
| __ jmp(&done);
|
| __ bind(&resume_frame);
|
| - __ push(rbp); // Caller's frame pointer.
|
| + __ pushq(rbp); // Caller's frame pointer.
|
| __ movp(rbp, rsp);
|
| - __ push(rsi); // Callee's context.
|
| - __ push(rdi); // Callee's JS Function.
|
| + __ Push(rsi); // Callee's context.
|
| + __ Push(rdi); // Callee's JS Function.
|
|
|
| // Load the operand stack size.
|
| __ movp(rdx, FieldOperand(rbx, JSGeneratorObject::kOperandStackOffset));
|
| @@ -2182,11 +2182,11 @@ void FullCodeGenerator::EmitGeneratorResume(Expression *generator,
|
| __ bind(&push_operand_holes);
|
| __ subq(rdx, Immediate(1));
|
| __ j(carry, &call_resume);
|
| - __ push(rcx);
|
| + __ Push(rcx);
|
| __ jmp(&push_operand_holes);
|
| __ bind(&call_resume);
|
| - __ push(rbx);
|
| - __ push(result_register());
|
| + __ Push(rbx);
|
| + __ Push(result_register());
|
| __ Push(Smi::FromInt(resume_mode));
|
| __ CallRuntime(Runtime::kResumeJSGeneratorObject, 3);
|
| // Not reached: the runtime call returns elsewhere.
|
| @@ -2201,14 +2201,14 @@ void FullCodeGenerator::EmitGeneratorResume(Expression *generator,
|
| EmitCreateIteratorResult(true);
|
| } else {
|
| // Throw the provided value.
|
| - __ push(rax);
|
| + __ Push(rax);
|
| __ CallRuntime(Runtime::kThrow, 1);
|
| }
|
| __ jmp(&done);
|
|
|
| // Throw error if we attempt to operate on a running generator.
|
| __ bind(&wrong_state);
|
| - __ push(rbx);
|
| + __ Push(rbx);
|
| __ CallRuntime(Runtime::kThrowGeneratorStateError, 1);
|
|
|
| __ bind(&done);
|
| @@ -2233,7 +2233,7 @@ void FullCodeGenerator::EmitCreateIteratorResult(bool done) {
|
|
|
| __ bind(&allocated);
|
| __ Move(rbx, map);
|
| - __ pop(rcx);
|
| + __ Pop(rcx);
|
| __ Move(rdx, isolate()->factory()->ToBoolean(done));
|
| ASSERT_EQ(map->instance_size(), 5 * kPointerSize);
|
| __ movp(FieldOperand(rax, HeapObject::kMapOffset), rbx);
|
| @@ -2277,7 +2277,7 @@ void FullCodeGenerator::EmitInlineSmiBinaryOp(BinaryOperation* expr,
|
| // stack (popped into rdx). Right operand is in rax but moved into
|
| // rcx to make the shifts easier.
|
| Label done, stub_call, smi_case;
|
| - __ pop(rdx);
|
| + __ Pop(rdx);
|
| __ movp(rcx, rax);
|
| __ or_(rax, rdx);
|
| JumpPatchSite patch_site(masm_);
|
| @@ -2332,7 +2332,7 @@ void FullCodeGenerator::EmitInlineSmiBinaryOp(BinaryOperation* expr,
|
| void FullCodeGenerator::EmitBinaryOp(BinaryOperation* expr,
|
| Token::Value op,
|
| OverwriteMode mode) {
|
| - __ pop(rdx);
|
| + __ Pop(rdx);
|
| BinaryOpICStub stub(op, mode);
|
| JumpPatchSite patch_site(masm_); // unbound, signals no inlined smi code.
|
| CallIC(stub.GetCode(isolate()), expr->BinaryOperationFeedbackId());
|
| @@ -2363,21 +2363,21 @@ void FullCodeGenerator::EmitAssignment(Expression* expr) {
|
| break;
|
| }
|
| case NAMED_PROPERTY: {
|
| - __ push(rax); // Preserve value.
|
| + __ Push(rax); // Preserve value.
|
| VisitForAccumulatorValue(prop->obj());
|
| __ movp(rdx, rax);
|
| - __ pop(rax); // Restore value.
|
| + __ Pop(rax); // Restore value.
|
| __ Move(rcx, prop->key()->AsLiteral()->value());
|
| CallStoreIC();
|
| break;
|
| }
|
| case KEYED_PROPERTY: {
|
| - __ push(rax); // Preserve value.
|
| + __ Push(rax); // Preserve value.
|
| VisitForStackValue(prop->obj());
|
| VisitForAccumulatorValue(prop->key());
|
| __ movp(rcx, rax);
|
| - __ pop(rdx);
|
| - __ pop(rax); // Restore value.
|
| + __ Pop(rdx);
|
| + __ Pop(rax); // Restore value.
|
| Handle<Code> ic = strict_mode() == SLOPPY
|
| ? isolate()->builtins()->KeyedStoreIC_Initialize()
|
| : isolate()->builtins()->KeyedStoreIC_Initialize_Strict();
|
| @@ -2402,8 +2402,8 @@ void FullCodeGenerator::EmitStoreToStackLocalOrContextSlot(
|
|
|
| void FullCodeGenerator::EmitCallStoreContextSlot(
|
| Handle<String> name, StrictMode strict_mode) {
|
| - __ push(rax); // Value.
|
| - __ push(rsi); // Context.
|
| + __ Push(rax); // Value.
|
| + __ Push(rsi); // Context.
|
| __ Push(name);
|
| __ Push(Smi::FromInt(strict_mode));
|
| __ CallRuntime(Runtime::kStoreContextSlot, 4);
|
| @@ -2422,8 +2422,8 @@ void FullCodeGenerator::EmitVariableAssignment(Variable* var,
|
| // Const initializers need a write barrier.
|
| ASSERT(!var->IsParameter()); // No const parameters.
|
| if (var->IsLookupSlot()) {
|
| - __ push(rax);
|
| - __ push(rsi);
|
| + __ Push(rax);
|
| + __ Push(rsi);
|
| __ Push(var->name());
|
| __ CallRuntime(Runtime::kInitializeConstContextSlot, 3);
|
| } else {
|
| @@ -2484,7 +2484,7 @@ void FullCodeGenerator::EmitNamedPropertyAssignment(Assignment* expr) {
|
| // Record source code position before IC call.
|
| SetSourcePosition(expr->position());
|
| __ Move(rcx, prop->key()->AsLiteral()->value());
|
| - __ pop(rdx);
|
| + __ Pop(rdx);
|
| CallStoreIC(expr->AssignmentFeedbackId());
|
|
|
| PrepareForBailoutForId(expr->AssignmentId(), TOS_REG);
|
| @@ -2495,8 +2495,8 @@ void FullCodeGenerator::EmitNamedPropertyAssignment(Assignment* expr) {
|
| void FullCodeGenerator::EmitKeyedPropertyAssignment(Assignment* expr) {
|
| // Assignment to a property, using a keyed store IC.
|
|
|
| - __ pop(rcx);
|
| - __ pop(rdx);
|
| + __ Pop(rcx);
|
| + __ Pop(rdx);
|
| // Record source code position before IC call.
|
| SetSourcePosition(expr->position());
|
| Handle<Code> ic = strict_mode() == SLOPPY
|
| @@ -2521,7 +2521,7 @@ void FullCodeGenerator::VisitProperty(Property* expr) {
|
| } else {
|
| VisitForStackValue(expr->obj());
|
| VisitForAccumulatorValue(expr->key());
|
| - __ pop(rdx);
|
| + __ Pop(rdx);
|
| EmitKeyedPropertyLoad(expr);
|
| context()->Plug(rax);
|
| }
|
| @@ -2559,7 +2559,7 @@ void FullCodeGenerator::EmitCallWithIC(Call* expr) {
|
| EmitNamedPropertyLoad(callee->AsProperty());
|
| PrepareForBailoutForId(callee->AsProperty()->LoadId(), TOS_REG);
|
| // Push the target function under the receiver.
|
| - __ push(Operand(rsp, 0));
|
| + __ Push(Operand(rsp, 0));
|
| __ movp(Operand(rsp, kPointerSize), rax);
|
| flags = CALL_AS_METHOD;
|
| }
|
| @@ -2603,7 +2603,7 @@ void FullCodeGenerator::EmitKeyedCallWithIC(Call* expr,
|
| PrepareForBailoutForId(callee->AsProperty()->LoadId(), TOS_REG);
|
|
|
| // Push the target function under the receiver.
|
| - __ push(Operand(rsp, 0));
|
| + __ Push(Operand(rsp, 0));
|
| __ movp(Operand(rsp, kPointerSize), rax);
|
|
|
| // Load the arguments.
|
| @@ -2660,14 +2660,14 @@ void FullCodeGenerator::EmitCallWithStub(Call* expr) {
|
| void FullCodeGenerator::EmitResolvePossiblyDirectEval(int arg_count) {
|
| // Push copy of the first argument or undefined if it doesn't exist.
|
| if (arg_count > 0) {
|
| - __ push(Operand(rsp, arg_count * kPointerSize));
|
| + __ Push(Operand(rsp, arg_count * kPointerSize));
|
| } else {
|
| __ PushRoot(Heap::kUndefinedValueRootIndex);
|
| }
|
|
|
| // Push the receiver of the enclosing function and do runtime call.
|
| StackArgumentsAccessor args(rbp, info_->scope()->num_parameters());
|
| - __ push(args.GetReceiverOperand());
|
| + __ Push(args.GetReceiverOperand());
|
|
|
| // Push the language mode.
|
| __ Push(Smi::FromInt(strict_mode()));
|
| @@ -2708,7 +2708,7 @@ void FullCodeGenerator::VisitCall(Call* expr) {
|
|
|
| // Push a copy of the function (found below the arguments) and resolve
|
| // eval.
|
| - __ push(Operand(rsp, (arg_count + 1) * kPointerSize));
|
| + __ Push(Operand(rsp, (arg_count + 1) * kPointerSize));
|
| EmitResolvePossiblyDirectEval(arg_count);
|
|
|
| // The runtime call returns a pair of values in rax (function) and
|
| @@ -2741,11 +2741,11 @@ void FullCodeGenerator::VisitCall(Call* expr) {
|
| __ bind(&slow);
|
| // Call the runtime to find the function to call (returned in rax) and
|
| // the object holding it (returned in rdx).
|
| - __ push(context_register());
|
| + __ Push(context_register());
|
| __ Push(proxy->name());
|
| __ CallRuntime(Runtime::kLoadContextSlot, 2);
|
| - __ push(rax); // Function.
|
| - __ push(rdx); // Receiver.
|
| + __ Push(rax); // Function.
|
| + __ Push(rdx); // Receiver.
|
|
|
| // If fast case code has been generated, emit code to push the function
|
| // and receiver and have the slow path jump around this code.
|
| @@ -2754,7 +2754,7 @@ void FullCodeGenerator::VisitCall(Call* expr) {
|
| __ jmp(&call, Label::kNear);
|
| __ bind(&done);
|
| // Push function.
|
| - __ push(rax);
|
| + __ Push(rax);
|
| // The receiver is implicitly the global receiver. Indicate this by
|
| // passing the hole to the call function stub.
|
| __ PushRoot(Heap::kUndefinedValueRootIndex);
|
| @@ -3179,7 +3179,7 @@ void FullCodeGenerator::EmitObjectEquals(CallRuntime* expr) {
|
| context()->PrepareTest(&materialize_true, &materialize_false,
|
| &if_true, &if_false, &fall_through);
|
|
|
| - __ pop(rbx);
|
| + __ Pop(rbx);
|
| __ cmpq(rax, rbx);
|
| PrepareForBailoutBeforeSplit(expr, true, if_true, if_false);
|
| Split(equal, if_true, if_false, fall_through);
|
| @@ -3412,8 +3412,8 @@ void FullCodeGenerator::EmitOneByteSeqStringSetChar(CallRuntime* expr) {
|
| VisitForStackValue(args->at(1)); // index
|
| VisitForStackValue(args->at(2)); // value
|
| VisitForAccumulatorValue(args->at(0)); // string
|
| - __ pop(value);
|
| - __ pop(index);
|
| + __ Pop(value);
|
| + __ Pop(index);
|
|
|
| if (FLAG_debug_code) {
|
| __ Check(__ CheckSmi(value), kNonSmiValue);
|
| @@ -3445,8 +3445,8 @@ void FullCodeGenerator::EmitTwoByteSeqStringSetChar(CallRuntime* expr) {
|
| VisitForStackValue(args->at(1)); // index
|
| VisitForStackValue(args->at(2)); // value
|
| VisitForAccumulatorValue(args->at(0)); // string
|
| - __ pop(value);
|
| - __ pop(index);
|
| + __ Pop(value);
|
| + __ Pop(index);
|
|
|
| if (FLAG_debug_code) {
|
| __ Check(__ CheckSmi(value), kNonSmiValue);
|
| @@ -3485,7 +3485,7 @@ void FullCodeGenerator::EmitSetValueOf(CallRuntime* expr) {
|
|
|
| VisitForStackValue(args->at(0)); // Load the object.
|
| VisitForAccumulatorValue(args->at(1)); // Load the value.
|
| - __ pop(rbx); // rax = value. rbx = object.
|
| + __ Pop(rbx); // rax = value. rbx = object.
|
|
|
| Label done;
|
| // If the object is a smi, return the value.
|
| @@ -3550,7 +3550,7 @@ void FullCodeGenerator::EmitStringCharCodeAt(CallRuntime* expr) {
|
| Register index = rax;
|
| Register result = rdx;
|
|
|
| - __ pop(object);
|
| + __ Pop(object);
|
|
|
| Label need_conversion;
|
| Label index_out_of_range;
|
| @@ -3597,7 +3597,7 @@ void FullCodeGenerator::EmitStringCharAt(CallRuntime* expr) {
|
| Register scratch = rdx;
|
| Register result = rax;
|
|
|
| - __ pop(object);
|
| + __ Pop(object);
|
|
|
| Label need_conversion;
|
| Label index_out_of_range;
|
| @@ -3639,7 +3639,7 @@ void FullCodeGenerator::EmitStringAdd(CallRuntime* expr) {
|
| VisitForStackValue(args->at(0));
|
| VisitForAccumulatorValue(args->at(1));
|
|
|
| - __ pop(rdx);
|
| + __ Pop(rdx);
|
| StringAddStub stub(STRING_ADD_CHECK_BOTH, NOT_TENURED);
|
| __ CallStub(&stub);
|
| context()->Plug(rax);
|
| @@ -3703,7 +3703,7 @@ void FullCodeGenerator::EmitCallFunction(CallRuntime* expr) {
|
| __ jmp(&done);
|
|
|
| __ bind(&runtime);
|
| - __ push(rax);
|
| + __ Push(rax);
|
| __ CallRuntime(Runtime::kCall, args->length());
|
| __ bind(&done);
|
|
|
| @@ -3718,8 +3718,8 @@ void FullCodeGenerator::EmitRegExpConstructResult(CallRuntime* expr) {
|
| VisitForStackValue(args->at(0));
|
| VisitForStackValue(args->at(1));
|
| VisitForAccumulatorValue(args->at(2));
|
| - __ pop(rbx);
|
| - __ pop(rcx);
|
| + __ Pop(rbx);
|
| + __ Pop(rcx);
|
| __ CallStub(&stub);
|
| context()->Plug(rax);
|
| }
|
| @@ -3773,8 +3773,8 @@ void FullCodeGenerator::EmitGetFromCache(CallRuntime* expr) {
|
|
|
| __ bind(¬_found);
|
| // Call runtime to perform the lookup.
|
| - __ push(cache);
|
| - __ push(key);
|
| + __ Push(cache);
|
| + __ Push(key);
|
| __ CallRuntime(Runtime::kGetFromCache, 2);
|
|
|
| __ bind(&done);
|
| @@ -4120,7 +4120,7 @@ void FullCodeGenerator::VisitCallRuntime(CallRuntime* expr) {
|
| if (expr->is_jsruntime()) {
|
| // Push the builtins object as receiver.
|
| __ movp(rax, GlobalObjectOperand());
|
| - __ push(FieldOperand(rax, GlobalObject::kBuiltinsOffset));
|
| + __ Push(FieldOperand(rax, GlobalObject::kBuiltinsOffset));
|
|
|
| // Load the function from the receiver.
|
| __ movp(rax, Operand(rsp, 0));
|
| @@ -4128,7 +4128,7 @@ void FullCodeGenerator::VisitCallRuntime(CallRuntime* expr) {
|
| CallLoadIC(NOT_CONTEXTUAL, expr->CallRuntimeFeedbackId());
|
|
|
| // Push the target function under the receiver.
|
| - __ push(Operand(rsp, 0));
|
| + __ Push(Operand(rsp, 0));
|
| __ movp(Operand(rsp, kPointerSize), rax);
|
|
|
| // Push the arguments ("left-to-right").
|
| @@ -4178,7 +4178,7 @@ void FullCodeGenerator::VisitUnaryOperation(UnaryOperation* expr) {
|
| // but "delete this" is allowed.
|
| ASSERT(strict_mode() == SLOPPY || var->is_this());
|
| if (var->IsUnallocated()) {
|
| - __ push(GlobalObjectOperand());
|
| + __ Push(GlobalObjectOperand());
|
| __ Push(var->name());
|
| __ Push(Smi::FromInt(SLOPPY));
|
| __ InvokeBuiltin(Builtins::DELETE, CALL_FUNCTION);
|
| @@ -4191,7 +4191,7 @@ void FullCodeGenerator::VisitUnaryOperation(UnaryOperation* expr) {
|
| } else {
|
| // Non-global variable. Call the runtime to try to delete from the
|
| // context where the variable was introduced.
|
| - __ push(context_register());
|
| + __ Push(context_register());
|
| __ Push(var->name());
|
| __ CallRuntime(Runtime::kDeleteContextSlot, 2);
|
| context()->Plug(rax);
|
| @@ -4303,13 +4303,13 @@ void FullCodeGenerator::VisitCountOperation(CountOperation* expr) {
|
| }
|
| if (assign_type == NAMED_PROPERTY) {
|
| VisitForAccumulatorValue(prop->obj());
|
| - __ push(rax); // Copy of receiver, needed for later store.
|
| + __ Push(rax); // Copy of receiver, needed for later store.
|
| EmitNamedPropertyLoad(prop);
|
| } else {
|
| VisitForStackValue(prop->obj());
|
| VisitForAccumulatorValue(prop->key());
|
| __ movp(rdx, Operand(rsp, 0)); // Leave receiver on stack
|
| - __ push(rax); // Copy of key, needed for later store.
|
| + __ Push(rax); // Copy of key, needed for later store.
|
| EmitKeyedPropertyLoad(prop);
|
| }
|
| }
|
| @@ -4337,7 +4337,7 @@ void FullCodeGenerator::VisitCountOperation(CountOperation* expr) {
|
| // of the stack.
|
| switch (assign_type) {
|
| case VARIABLE:
|
| - __ push(rax);
|
| + __ Push(rax);
|
| break;
|
| case NAMED_PROPERTY:
|
| __ movp(Operand(rsp, kPointerSize), rax);
|
| @@ -4372,7 +4372,7 @@ void FullCodeGenerator::VisitCountOperation(CountOperation* expr) {
|
| // of the stack.
|
| switch (assign_type) {
|
| case VARIABLE:
|
| - __ push(rax);
|
| + __ Push(rax);
|
| break;
|
| case NAMED_PROPERTY:
|
| __ movp(Operand(rsp, kPointerSize), rax);
|
| @@ -4422,7 +4422,7 @@ void FullCodeGenerator::VisitCountOperation(CountOperation* expr) {
|
| break;
|
| case NAMED_PROPERTY: {
|
| __ Move(rcx, prop->key()->AsLiteral()->value());
|
| - __ pop(rdx);
|
| + __ Pop(rdx);
|
| CallStoreIC(expr->CountStoreFeedbackId());
|
| PrepareForBailoutForId(expr->AssignmentId(), TOS_REG);
|
| if (expr->is_postfix()) {
|
| @@ -4435,8 +4435,8 @@ void FullCodeGenerator::VisitCountOperation(CountOperation* expr) {
|
| break;
|
| }
|
| case KEYED_PROPERTY: {
|
| - __ pop(rcx);
|
| - __ pop(rdx);
|
| + __ Pop(rcx);
|
| + __ Pop(rdx);
|
| Handle<Code> ic = strict_mode() == SLOPPY
|
| ? isolate()->builtins()->KeyedStoreIC_Initialize()
|
| : isolate()->builtins()->KeyedStoreIC_Initialize_Strict();
|
| @@ -4478,7 +4478,7 @@ void FullCodeGenerator::VisitForTypeofValue(Expression* expr) {
|
| EmitDynamicLookupFastCase(proxy->var(), INSIDE_TYPEOF, &slow, &done);
|
|
|
| __ bind(&slow);
|
| - __ push(rsi);
|
| + __ Push(rsi);
|
| __ Push(proxy->name());
|
| __ CallRuntime(Runtime::kLoadContextSlotNoReferenceError, 2);
|
| PrepareForBailout(expr, TOS_REG);
|
| @@ -4612,7 +4612,7 @@ void FullCodeGenerator::VisitCompareOperation(CompareOperation* expr) {
|
| default: {
|
| VisitForAccumulatorValue(expr->right());
|
| Condition cc = CompareIC::ComputeCondition(op);
|
| - __ pop(rdx);
|
| + __ Pop(rdx);
|
|
|
| bool inline_smi_code = ShouldInlineSmiCase(op);
|
| JumpPatchSite patch_site(masm_);
|
| @@ -4712,10 +4712,10 @@ void FullCodeGenerator::PushFunctionArgumentForContextAllocation() {
|
| // Contexts created by a call to eval have the same closure as the
|
| // context calling eval, not the anonymous closure containing the eval
|
| // code. Fetch it from the context.
|
| - __ push(ContextOperand(rsi, Context::CLOSURE_INDEX));
|
| + __ Push(ContextOperand(rsi, Context::CLOSURE_INDEX));
|
| } else {
|
| ASSERT(declaration_scope->is_function_scope());
|
| - __ push(Operand(rbp, JavaScriptFrameConstants::kFunctionOffset));
|
| + __ Push(Operand(rbp, JavaScriptFrameConstants::kFunctionOffset));
|
| }
|
| }
|
|
|
| @@ -4732,27 +4732,27 @@ void FullCodeGenerator::EnterFinallyBlock() {
|
| __ Move(rcx, masm_->CodeObject());
|
| __ subq(rdx, rcx);
|
| __ Integer32ToSmi(rdx, rdx);
|
| - __ push(rdx);
|
| + __ Push(rdx);
|
|
|
| // Store result register while executing finally block.
|
| - __ push(result_register());
|
| + __ Push(result_register());
|
|
|
| // Store pending message while executing finally block.
|
| ExternalReference pending_message_obj =
|
| ExternalReference::address_of_pending_message_obj(isolate());
|
| __ Load(rdx, pending_message_obj);
|
| - __ push(rdx);
|
| + __ Push(rdx);
|
|
|
| ExternalReference has_pending_message =
|
| ExternalReference::address_of_has_pending_message(isolate());
|
| __ Load(rdx, has_pending_message);
|
| __ Integer32ToSmi(rdx, rdx);
|
| - __ push(rdx);
|
| + __ Push(rdx);
|
|
|
| ExternalReference pending_message_script =
|
| ExternalReference::address_of_pending_message_script(isolate());
|
| __ Load(rdx, pending_message_script);
|
| - __ push(rdx);
|
| + __ Push(rdx);
|
| }
|
|
|
|
|
| @@ -4760,27 +4760,27 @@ void FullCodeGenerator::ExitFinallyBlock() {
|
| ASSERT(!result_register().is(rdx));
|
| ASSERT(!result_register().is(rcx));
|
| // Restore pending message from stack.
|
| - __ pop(rdx);
|
| + __ Pop(rdx);
|
| ExternalReference pending_message_script =
|
| ExternalReference::address_of_pending_message_script(isolate());
|
| __ Store(pending_message_script, rdx);
|
|
|
| - __ pop(rdx);
|
| + __ Pop(rdx);
|
| __ SmiToInteger32(rdx, rdx);
|
| ExternalReference has_pending_message =
|
| ExternalReference::address_of_has_pending_message(isolate());
|
| __ Store(has_pending_message, rdx);
|
|
|
| - __ pop(rdx);
|
| + __ Pop(rdx);
|
| ExternalReference pending_message_obj =
|
| ExternalReference::address_of_pending_message_obj(isolate());
|
| __ Store(pending_message_obj, rdx);
|
|
|
| // Restore result register from stack.
|
| - __ pop(result_register());
|
| + __ Pop(result_register());
|
|
|
| // Uncook return address.
|
| - __ pop(rdx);
|
| + __ Pop(rdx);
|
| __ SmiToInteger32(rdx, rdx);
|
| __ Move(rcx, masm_->CodeObject());
|
| __ addq(rdx, rcx);
|
|
|