From: haitao.feng@intel.com Date: Wed, 19 Mar 2014 08:59:04 +0000 (+0000) Subject: Introduce Push and Pop macro instructions for x64 X-Git-Tag: upstream/4.7.83~10183 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=e812aca6b3b8dd462450dfa59d3f6dd9315ea6d1;p=platform%2Fupstream%2Fv8.git Introduce Push and Pop macro instructions for x64 R=verwaest@chromium.org Review URL: https://codereview.chromium.org/199903002 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@20049 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- diff --git a/src/x64/assembler-x64.cc b/src/x64/assembler-x64.cc index 53d45bb..6853d24 100644 --- a/src/x64/assembler-x64.cc +++ b/src/x64/assembler-x64.cc @@ -1769,14 +1769,14 @@ void Assembler::Nop(int n) { } -void Assembler::pop(Register dst) { +void Assembler::popq(Register dst) { EnsureSpace ensure_space(this); emit_optional_rex_32(dst); emit(0x58 | dst.low_bits()); } -void Assembler::pop(const Operand& dst) { +void Assembler::popq(const Operand& dst) { EnsureSpace ensure_space(this); emit_optional_rex_32(dst); emit(0x8F); @@ -1790,14 +1790,14 @@ void Assembler::popfq() { } -void Assembler::push(Register src) { +void Assembler::pushq(Register src) { EnsureSpace ensure_space(this); emit_optional_rex_32(src); emit(0x50 | src.low_bits()); } -void Assembler::push(const Operand& src) { +void Assembler::pushq(const Operand& src) { EnsureSpace ensure_space(this); emit_optional_rex_32(src); emit(0xFF); @@ -1805,7 +1805,7 @@ void Assembler::push(const Operand& src) { } -void Assembler::push(Immediate value) { +void Assembler::pushq(Immediate value) { EnsureSpace ensure_space(this); if (is_int8(value.value_)) { emit(0x6A); @@ -1817,7 +1817,7 @@ void Assembler::push(Immediate value) { } -void Assembler::push_imm32(int32_t imm32) { +void Assembler::pushq_imm32(int32_t imm32) { EnsureSpace ensure_space(this); emit(0x68); emitl(imm32); diff --git a/src/x64/assembler-x64.h b/src/x64/assembler-x64.h index 09d2e70..fa61661 100644 --- a/src/x64/assembler-x64.h +++ b/src/x64/assembler-x64.h @@ -693,15 +693,15 @@ class Assembler : public AssemblerBase { void pushfq(); void popfq(); - void push(Immediate value); + void pushq(Immediate value); // Push a 32 bit integer, and guarantee that it is actually pushed as a // 32 bit value, the normal push will optimize the 8 bit case. - void push_imm32(int32_t imm32); - void push(Register src); - void push(const Operand& src); + void pushq_imm32(int32_t imm32); + void pushq(Register src); + void pushq(const Operand& src); - void pop(Register dst); - void pop(const Operand& dst); + void popq(Register dst); + void popq(const Operand& dst); void enter(Immediate size); void leave(); diff --git a/src/x64/builtins-x64.cc b/src/x64/builtins-x64.cc index d4f5e03..130844e 100644 --- a/src/x64/builtins-x64.cc +++ b/src/x64/builtins-x64.cc @@ -61,7 +61,7 @@ void Builtins::Generate_Adaptor(MacroAssembler* masm, if (extra_args == NEEDS_CALLED_FUNCTION) { num_extra_args = 1; __ PopReturnAddressTo(kScratchRegister); - __ push(rdi); + __ Push(rdi); __ PushReturnAddressFrom(kScratchRegister); } else { ASSERT(extra_args == NO_EXTRA_ARGUMENTS); @@ -78,13 +78,13 @@ static void CallRuntimePassFunction( MacroAssembler* masm, Runtime::FunctionId function_id) { FrameScope scope(masm, StackFrame::INTERNAL); // Push a copy of the function onto the stack. - __ push(rdi); + __ Push(rdi); // Function is also the parameter to the runtime call. - __ push(rdi); + __ Push(rdi); __ CallRuntime(function_id, 1); // Restore receiver. - __ pop(rdi); + __ Pop(rdi); } @@ -139,10 +139,10 @@ static void Generate_JSConstructStubHelper(MacroAssembler* masm, // Store a smi-tagged arguments count on the stack. __ Integer32ToSmi(rax, rax); - __ push(rax); + __ Push(rax); // Push the function to invoke on the stack. - __ push(rdi); + __ Push(rdi); // Try to allocate the object without transitioning into C code. If any of // the preconditions is not met, the code bails out to the runtime call. @@ -186,15 +186,15 @@ static void Generate_JSConstructStubHelper(MacroAssembler* masm, SharedFunctionInfo::kConstructionCountOffset)); __ j(not_zero, &allocate); - __ push(rax); - __ push(rdi); + __ Push(rax); + __ Push(rdi); - __ push(rdi); // constructor + __ Push(rdi); // constructor // The call will replace the stub, so the countdown is only done once. __ CallRuntime(Runtime::kFinalizeInstanceSize, 1); - __ pop(rdi); - __ pop(rax); + __ Pop(rdi); + __ Pop(rax); __ bind(&allocate); } @@ -331,7 +331,7 @@ static void Generate_JSConstructStubHelper(MacroAssembler* masm, __ bind(&rt_call); // Must restore rdi (constructor) before calling runtime. __ movp(rdi, Operand(rsp, 0)); - __ push(rdi); + __ Push(rdi); __ CallRuntime(Runtime::kNewObject, 1); __ movp(rbx, rax); // store result in rbx @@ -339,7 +339,7 @@ static void Generate_JSConstructStubHelper(MacroAssembler* masm, // rbx: newly allocated object __ bind(&allocated); // Retrieve the function from the stack. - __ pop(rdi); + __ Pop(rdi); // Retrieve smi-tagged arguments count from the stack. __ movp(rax, Operand(rsp, 0)); @@ -348,8 +348,8 @@ static void Generate_JSConstructStubHelper(MacroAssembler* masm, // Push the allocated receiver to the stack. We need two copies // because we may have to return the original one and the calling // conventions dictate that the called function pops the receiver. - __ push(rbx); - __ push(rbx); + __ Push(rbx); + __ Push(rbx); // Set up pointer to last argument. __ lea(rbx, Operand(rbp, StandardFrameConstants::kCallerSPOffset)); @@ -359,7 +359,7 @@ static void Generate_JSConstructStubHelper(MacroAssembler* masm, __ movp(rcx, rax); __ jmp(&entry); __ bind(&loop); - __ push(Operand(rbx, rcx, times_pointer_size, 0)); + __ Push(Operand(rbx, rcx, times_pointer_size, 0)); __ bind(&entry); __ decq(rcx); __ j(greater_equal, &loop); @@ -470,8 +470,8 @@ static void Generate_JSEntryTrampolineHelper(MacroAssembler* masm, __ movp(rsi, FieldOperand(rdx, JSFunction::kContextOffset)); // Push the function and the receiver onto the stack. - __ push(rdx); - __ push(r8); + __ Push(rdx); + __ Push(r8); // Load the number of arguments and setup pointer to the arguments. __ movp(rax, r9); @@ -497,8 +497,8 @@ static void Generate_JSEntryTrampolineHelper(MacroAssembler* masm, FrameScope scope(masm, StackFrame::INTERNAL); // Push the function and receiver and setup the context. - __ push(rdi); - __ push(rdx); + __ Push(rdi); + __ Push(rdx); __ movp(rsi, FieldOperand(rdi, JSFunction::kContextOffset)); // Load the number of arguments and setup pointer to the arguments. @@ -524,7 +524,7 @@ static void Generate_JSEntryTrampolineHelper(MacroAssembler* masm, __ jmp(&entry); __ bind(&loop); __ movp(kScratchRegister, Operand(rbx, rcx, times_pointer_size, 0)); - __ push(Operand(kScratchRegister, 0)); // dereference handle + __ Push(Operand(kScratchRegister, 0)); // dereference handle __ addq(rcx, Immediate(1)); __ bind(&entry); __ cmpq(rcx, rax); @@ -574,15 +574,15 @@ static void CallCompileOptimized(MacroAssembler* masm, bool concurrent) { FrameScope scope(masm, StackFrame::INTERNAL); // Push a copy of the function onto the stack. - __ push(rdi); + __ Push(rdi); // Function is also the parameter to the runtime call. - __ push(rdi); + __ Push(rdi); // Whether to compile in a background thread. __ Push(masm->isolate()->factory()->ToBoolean(concurrent)); __ CallRuntime(Runtime::kCompileOptimized, 2); // Restore receiver. - __ pop(rdi); + __ Pop(rdi); } @@ -655,10 +655,10 @@ void Builtins::Generate_MarkCodeAsExecutedOnce(MacroAssembler* masm) { // Perform prologue operations usually performed by the young code stub. __ PopReturnAddressTo(kScratchRegister); - __ 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. __ PushReturnAddressFrom(kScratchRegister); // Jump to point after the code-age stub. @@ -686,7 +686,7 @@ static void Generate_NotifyStubFailureHelper(MacroAssembler* masm, // Tear down internal frame. } - __ pop(MemOperand(rsp, 0)); // Ignore state offset + __ Pop(MemOperand(rsp, 0)); // Ignore state offset __ ret(0); // Return to IC Miss stub, continuation still on stack. } @@ -817,14 +817,14 @@ void Builtins::Generate_FunctionCall(MacroAssembler* masm) { // Enter an internal frame in order to preserve argument count. FrameScope scope(masm, StackFrame::INTERNAL); __ Integer32ToSmi(rax, rax); - __ push(rax); + __ Push(rax); - __ push(rbx); + __ Push(rbx); __ InvokeBuiltin(Builtins::TO_OBJECT, CALL_FUNCTION); __ movp(rbx, rax); __ Set(rdx, 0); // indicate regular JS_FUNCTION - __ pop(rax); + __ Pop(rax); __ SmiToInteger32(rax, rax); } @@ -868,7 +868,7 @@ void Builtins::Generate_FunctionCall(MacroAssembler* masm) { __ movp(Operand(rsp, rcx, times_pointer_size, 1 * kPointerSize), rbx); __ decq(rcx); __ j(not_sign, &loop); // While non-negative (to copy return address). - __ pop(rbx); // Discard copy of return address. + __ popq(rbx); // Discard copy of return address. __ decq(rax); // One fewer argument (first argument is new receiver). } @@ -882,7 +882,7 @@ void Builtins::Generate_FunctionCall(MacroAssembler* masm) { __ j(not_equal, &non_proxy); __ PopReturnAddressTo(rdx); - __ push(rdi); // re-add proxy object as additional argument + __ Push(rdi); // re-add proxy object as additional argument __ PushReturnAddressFrom(rdx); __ incq(rax); __ GetBuiltinEntry(rdx, Builtins::CALL_FUNCTION_PROXY); @@ -932,8 +932,8 @@ void Builtins::Generate_FunctionApply(MacroAssembler* masm) { static const int kReceiverOffset = kArgumentsOffset + kPointerSize; static const int kFunctionOffset = kReceiverOffset + kPointerSize; - __ push(Operand(rbp, kFunctionOffset)); - __ push(Operand(rbp, kArgumentsOffset)); + __ Push(Operand(rbp, kFunctionOffset)); + __ Push(Operand(rbp, kArgumentsOffset)); __ InvokeBuiltin(Builtins::APPLY_PREPARE, CALL_FUNCTION); // Check the stack for overflow. We are not trying to catch @@ -953,8 +953,8 @@ void Builtins::Generate_FunctionApply(MacroAssembler* masm) { __ j(greater, &okay); // Signed comparison. // Out of stack space. - __ push(Operand(rbp, kFunctionOffset)); - __ push(rax); + __ Push(Operand(rbp, kFunctionOffset)); + __ Push(rax); __ InvokeBuiltin(Builtins::APPLY_OVERFLOW, CALL_FUNCTION); __ bind(&okay); // End of stack check. @@ -963,8 +963,8 @@ void Builtins::Generate_FunctionApply(MacroAssembler* masm) { const int kLimitOffset = StandardFrameConstants::kExpressionsOffset - 1 * kPointerSize; const int kIndexOffset = kLimitOffset - 1 * kPointerSize; - __ push(rax); // limit - __ push(Immediate(0)); // index + __ Push(rax); // limit + __ Push(Immediate(0)); // index // Get the receiver. __ movp(rbx, Operand(rbp, kReceiverOffset)); @@ -1005,7 +1005,7 @@ void Builtins::Generate_FunctionApply(MacroAssembler* masm) { // Convert the receiver to an object. __ bind(&call_to_object); - __ push(rbx); + __ Push(rbx); __ InvokeBuiltin(Builtins::TO_OBJECT, CALL_FUNCTION); __ movp(rbx, rax); __ jmp(&push_receiver, Label::kNear); @@ -1017,7 +1017,7 @@ void Builtins::Generate_FunctionApply(MacroAssembler* masm) { // Push the receiver. __ bind(&push_receiver); - __ push(rbx); + __ Push(rbx); // Copy all arguments from the array to the stack. Label entry, loop; @@ -1036,7 +1036,7 @@ void Builtins::Generate_FunctionApply(MacroAssembler* masm) { // case, we know that we are not generating a test instruction next. // Push the nth argument. - __ push(rax); + __ Push(rax); // Update the index on the stack and in register rax. __ movp(rax, Operand(rbp, kIndexOffset)); @@ -1061,7 +1061,7 @@ void Builtins::Generate_FunctionApply(MacroAssembler* masm) { // Call the function proxy. __ bind(&call_proxy); - __ push(rdi); // add function proxy as last argument + __ Push(rdi); // add function proxy as last argument __ incq(rax); __ Set(rbx, 0); __ GetBuiltinEntry(rdx, Builtins::CALL_FUNCTION_PROXY); @@ -1232,10 +1232,10 @@ void Builtins::Generate_StringConstructCode(MacroAssembler* masm) { __ IncrementCounter(counters->string_ctor_conversions(), 1); { FrameScope scope(masm, StackFrame::INTERNAL); - __ push(rdi); // Preserve the function. - __ push(rax); + __ Push(rdi); // Preserve the function. + __ Push(rax); __ InvokeBuiltin(Builtins::TO_STRING, CALL_FUNCTION); - __ pop(rdi); + __ Pop(rdi); } __ movp(rbx, rax); __ jmp(&argument_is_string); @@ -1255,7 +1255,7 @@ void Builtins::Generate_StringConstructCode(MacroAssembler* masm) { __ IncrementCounter(counters->string_ctor_gc_required(), 1); { FrameScope scope(masm, StackFrame::INTERNAL); - __ push(rbx); + __ Push(rbx); __ CallRuntime(Runtime::kNewStringWrapper, 1); } __ ret(0); @@ -1263,20 +1263,20 @@ void Builtins::Generate_StringConstructCode(MacroAssembler* masm) { static void EnterArgumentsAdaptorFrame(MacroAssembler* masm) { - __ push(rbp); + __ pushq(rbp); __ movp(rbp, rsp); // Store the arguments adaptor context sentinel. __ Push(Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR)); // Push the function on the stack. - __ push(rdi); + __ Push(rdi); // Preserve the number of arguments on the stack. Must preserve rax, // rbx and rcx because these registers are used when copying the // arguments and the receiver. __ Integer32ToSmi(r8, rax); - __ push(r8); + __ Push(r8); } @@ -1286,7 +1286,7 @@ static void LeaveArgumentsAdaptorFrame(MacroAssembler* masm) { // Leave the frame. __ movp(rsp, rbp); - __ pop(rbp); + __ popq(rbp); // Remove caller arguments from the stack. __ PopReturnAddressTo(rcx); @@ -1326,7 +1326,7 @@ void Builtins::Generate_ArgumentsAdaptorTrampoline(MacroAssembler* masm) { Label copy; __ bind(©); __ incq(r8); - __ push(Operand(rax, 0)); + __ Push(Operand(rax, 0)); __ subq(rax, Immediate(kPointerSize)); __ cmpq(r8, rbx); __ j(less, ©); @@ -1345,7 +1345,7 @@ void Builtins::Generate_ArgumentsAdaptorTrampoline(MacroAssembler* masm) { Label copy; __ bind(©); __ incq(r8); - __ push(Operand(rdi, 0)); + __ Push(Operand(rdi, 0)); __ subq(rdi, Immediate(kPointerSize)); __ cmpq(r8, rax); __ j(less, ©); @@ -1355,7 +1355,7 @@ void Builtins::Generate_ArgumentsAdaptorTrampoline(MacroAssembler* masm) { __ LoadRoot(kScratchRegister, Heap::kUndefinedValueRootIndex); __ bind(&fill); __ incq(r8); - __ push(kScratchRegister); + __ Push(kScratchRegister); __ cmpq(r8, rbx); __ j(less, &fill); @@ -1388,7 +1388,7 @@ void Builtins::Generate_OnStackReplacement(MacroAssembler* masm) { { FrameScope scope(masm, StackFrame::INTERNAL); // Pass function as argument. - __ push(rax); + __ Push(rax); __ CallRuntime(Runtime::kCompileForOnStackReplacement, 1); } diff --git a/src/x64/code-stubs-x64.cc b/src/x64/code-stubs-x64.cc index 779e77e..b678bed 100644 --- a/src/x64/code-stubs-x64.cc +++ b/src/x64/code-stubs-x64.cc @@ -490,7 +490,7 @@ void HydrogenCodeStub::GenerateLightweightMiss(MacroAssembler* masm) { rax.is(descriptor->register_params_[param_count - 1])); // Push arguments for (int i = 0; i < param_count; ++i) { - __ push(descriptor->register_params_[i]); + __ Push(descriptor->register_params_[i]); } ExternalReference miss = descriptor->miss_handler(); __ CallExternalReference(miss, descriptor->register_param_count_); @@ -541,7 +541,7 @@ void DoubleToIStub::Generate(MacroAssembler* masm) { int double_offset = offset(); // Account for return address and saved regs if input is rsp. - if (input_reg.is(rsp)) double_offset += 3 * kPointerSize; + if (input_reg.is(rsp)) double_offset += 3 * kRegisterSize; MemOperand mantissa_operand(MemOperand(input_reg, double_offset)); MemOperand exponent_operand(MemOperand(input_reg, @@ -561,14 +561,14 @@ void DoubleToIStub::Generate(MacroAssembler* masm) { // is the return register, then save the temp register we use in its stead // for the result. Register save_reg = final_result_reg.is(rcx) ? rax : rcx; - __ push(scratch1); - __ push(save_reg); + __ pushq(scratch1); + __ pushq(save_reg); bool stash_exponent_copy = !input_reg.is(rsp); __ movl(scratch1, mantissa_operand); __ movsd(xmm0, mantissa_operand); __ movl(rcx, exponent_operand); - if (stash_exponent_copy) __ push(rcx); + if (stash_exponent_copy) __ pushq(rcx); __ andl(rcx, Immediate(HeapNumber::kExponentMask)); __ shrl(rcx, Immediate(HeapNumber::kExponentShift)); @@ -609,8 +609,8 @@ void DoubleToIStub::Generate(MacroAssembler* masm) { ASSERT(final_result_reg.is(rcx)); __ movl(final_result_reg, result_reg); } - __ pop(save_reg); - __ pop(scratch1); + __ popq(save_reg); + __ popq(scratch1); __ ret(0); } @@ -983,7 +983,7 @@ void ArgumentsAccessStub::GenerateReadElement(MacroAssembler* masm) { // by calling the runtime system. __ bind(&slow); __ PopReturnAddressTo(rbx); - __ push(rdx); + __ Push(rdx); __ PushReturnAddressFrom(rbx); __ TailCallRuntime(Runtime::kGetArgumentsProperty, 1, 1); } @@ -2064,8 +2064,8 @@ void ICCompareStub::GenerateGeneric(MacroAssembler* masm) { // Push arguments below the return address to prepare jump to builtin. __ PopReturnAddressTo(rcx); - __ push(rdx); - __ push(rax); + __ Push(rdx); + __ Push(rax); // Figure out which native to call and setup the arguments. Builtins::JavaScript builtin; @@ -2154,19 +2154,19 @@ static void GenerateRecordCallTarget(MacroAssembler* masm) { // Arguments register must be smi-tagged to call out. __ Integer32ToSmi(rax, rax); - __ push(rax); - __ push(rdi); + __ Push(rax); + __ Push(rdi); __ Integer32ToSmi(rdx, rdx); - __ push(rdx); - __ push(rbx); + __ Push(rdx); + __ Push(rbx); CreateAllocationSiteStub create_stub; __ CallStub(&create_stub); - __ pop(rbx); - __ pop(rdx); - __ pop(rdi); - __ pop(rax); + __ Pop(rbx); + __ Pop(rdx); + __ Pop(rdi); + __ Pop(rax); __ SmiToInteger32(rax, rax); } __ jmp(&done_no_smi_convert); @@ -2176,14 +2176,14 @@ static void GenerateRecordCallTarget(MacroAssembler* masm) { rdi); // We won't need rdx or rbx anymore, just save rdi - __ push(rdi); - __ push(rbx); - __ push(rdx); + __ Push(rdi); + __ Push(rbx); + __ Push(rdx); __ RecordWriteArray(rbx, rdi, rdx, kDontSaveFPRegs, EMIT_REMEMBERED_SET, OMIT_SMI_CHECK); - __ pop(rdx); - __ pop(rbx); - __ pop(rdi); + __ Pop(rdx); + __ Pop(rbx); + __ Pop(rdi); __ bind(&done); __ Integer32ToSmi(rdx, rdx); @@ -2266,7 +2266,7 @@ void CallFunctionStub::Generate(MacroAssembler* masm) { __ CmpInstanceType(rcx, JS_FUNCTION_PROXY_TYPE); __ j(not_equal, &non_function); __ PopReturnAddressTo(rcx); - __ push(rdi); // put proxy as additional argument under return address + __ Push(rdi); // put proxy as additional argument under return address __ PushReturnAddressFrom(rcx); __ Set(rax, argc_ + 1); __ Set(rbx, 0); @@ -2293,10 +2293,10 @@ void CallFunctionStub::Generate(MacroAssembler* masm) { __ bind(&wrap); // Wrap the receiver and patch it back onto the stack. { FrameScope frame_scope(masm, StackFrame::INTERNAL); - __ push(rdi); - __ push(rax); + __ Push(rdi); + __ Push(rax); __ InvokeBuiltin(Builtins::TO_OBJECT, CALL_FUNCTION); - __ pop(rdi); + __ Pop(rdi); } __ movp(args.GetReceiverOperand(), rax); __ jmp(&cont); @@ -2633,7 +2633,7 @@ void JSEntryStub::GenerateBody(MacroAssembler* masm, bool is_construct) { { // NOLINT. Scope block confuses linter. MacroAssembler::NoRootArrayScope uninitialized_root_register(masm); // Set up frame. - __ push(rbp); + __ pushq(rbp); __ movp(rbp, rsp); // Push the stack frame type marker twice. @@ -2642,18 +2642,18 @@ void JSEntryStub::GenerateBody(MacroAssembler* masm, bool is_construct) { // platform. It's free to use at this point. // Cannot use smi-register for loading yet. __ Move(kScratchRegister, Smi::FromInt(marker), Assembler::RelocInfoNone()); - __ push(kScratchRegister); // context slot - __ push(kScratchRegister); // function slot - // Save callee-saved registers (X64/Win64 calling conventions). - __ push(r12); - __ push(r13); - __ push(r14); - __ push(r15); + __ Push(kScratchRegister); // context slot + __ Push(kScratchRegister); // function slot + // Save callee-saved registers (X64/X32/Win64 calling conventions). + __ pushq(r12); + __ pushq(r13); + __ pushq(r14); + __ pushq(r15); #ifdef _WIN64 - __ push(rdi); // Only callee save in Win64 ABI, argument in AMD64 ABI. - __ push(rsi); // Only callee save in Win64 ABI, argument in AMD64 ABI. + __ pushq(rdi); // Only callee save in Win64 ABI, argument in AMD64 ABI. + __ pushq(rsi); // Only callee save in Win64 ABI, argument in AMD64 ABI. #endif - __ push(rbx); + __ pushq(rbx); #ifdef _WIN64 // On Win64 XMM6-XMM15 are callee-save @@ -2682,7 +2682,7 @@ void JSEntryStub::GenerateBody(MacroAssembler* masm, bool is_construct) { ExternalReference c_entry_fp(Isolate::kCEntryFPAddress, isolate); { Operand c_entry_fp_operand = masm->ExternalOperand(c_entry_fp); - __ push(c_entry_fp_operand); + __ Push(c_entry_fp_operand); } // If this is the outermost JS call, set js_entry_sp value. @@ -2722,7 +2722,7 @@ void JSEntryStub::GenerateBody(MacroAssembler* masm, bool is_construct) { __ Store(pending_exception, rax); // Fake a receiver (NULL). - __ push(Immediate(0)); // receiver + __ Push(Immediate(0)); // receiver // Invoke the function by calling through JS entry trampoline builtin and // pop the faked function when we return. We load the address from an @@ -2745,7 +2745,7 @@ void JSEntryStub::GenerateBody(MacroAssembler* masm, bool is_construct) { __ bind(&exit); // Check if the current stack frame is marked as the outermost JS frame. - __ pop(rbx); + __ Pop(rbx); __ Cmp(rbx, Smi::FromInt(StackFrame::OUTERMOST_JSENTRY_FRAME)); __ j(not_equal, ¬_outermost_js_2); __ Move(kScratchRegister, js_entry_sp); @@ -2754,7 +2754,7 @@ void JSEntryStub::GenerateBody(MacroAssembler* masm, bool is_construct) { // Restore the top frame descriptor from the stack. { Operand c_entry_fp_operand = masm->ExternalOperand(c_entry_fp); - __ pop(c_entry_fp_operand); + __ Pop(c_entry_fp_operand); } // Restore callee-saved registers (X64 conventions). @@ -2773,20 +2773,20 @@ void JSEntryStub::GenerateBody(MacroAssembler* masm, bool is_construct) { __ addq(rsp, Immediate(EntryFrameConstants::kXMMRegistersBlockSize)); #endif - __ pop(rbx); + __ popq(rbx); #ifdef _WIN64 // Callee save on in Win64 ABI, arguments/volatile in AMD64 ABI. - __ pop(rsi); - __ pop(rdi); + __ popq(rsi); + __ popq(rdi); #endif - __ pop(r15); - __ pop(r14); - __ pop(r13); - __ pop(r12); + __ popq(r15); + __ popq(r14); + __ popq(r13); + __ popq(r12); __ addq(rsp, Immediate(2 * kPointerSize)); // remove markers // Restore frame pointer and return. - __ pop(rbp); + __ popq(rbp); __ ret(0); } @@ -2951,7 +2951,7 @@ void InstanceofStub::Generate(MacroAssembler* masm) { if (HasCallSiteInlineCheck()) { // Remove extra value from the stack. __ PopReturnAddressTo(rcx); - __ pop(rax); + __ Pop(rax); __ PushReturnAddressFrom(rcx); } __ InvokeBuiltin(Builtins::INSTANCE_OF, JUMP_FUNCTION); @@ -3016,8 +3016,8 @@ void StringCharCodeAtGenerator::GenerateSlow( index_not_number_, DONT_DO_SMI_CHECK); call_helper.BeforeCall(masm); - __ push(object_); - __ push(index_); // Consumed by runtime conversion function. + __ Push(object_); + __ Push(index_); // Consumed by runtime conversion function. if (index_flags_ == STRING_INDEX_IS_NUMBER) { __ CallRuntime(Runtime::kNumberToIntegerMapMinusZero, 1); } else { @@ -3030,7 +3030,7 @@ void StringCharCodeAtGenerator::GenerateSlow( // have a chance to overwrite it. __ movp(index_, rax); } - __ pop(object_); + __ Pop(object_); // Reload the instance type. __ movp(result_, FieldOperand(object_, HeapObject::kMapOffset)); __ movzxbl(result_, FieldOperand(result_, Map::kInstanceTypeOffset)); @@ -3045,9 +3045,9 @@ void StringCharCodeAtGenerator::GenerateSlow( // is too complex (e.g., when the string needs to be flattened). __ bind(&call_runtime_); call_helper.BeforeCall(masm); - __ push(object_); + __ Push(object_); __ Integer32ToSmi(index_, index_); - __ push(index_); + __ Push(index_); __ CallRuntime(Runtime::kStringCharCodeAt, 2); if (!result_.is(rax)) { __ movp(result_, rax); @@ -3085,7 +3085,7 @@ void StringCharFromCodeGenerator::GenerateSlow( __ bind(&slow_case_); call_helper.BeforeCall(masm); - __ push(code_); + __ Push(code_); __ CallRuntime(Runtime::kCharFromCode, 1); if (!result_.is(rax)) { __ movp(result_, rax); @@ -4109,8 +4109,8 @@ void ICCompareStub::GenerateStrings(MacroAssembler* masm) { // Handle more complex cases in runtime. __ bind(&runtime); __ PopReturnAddressTo(tmp1); - __ push(left); - __ push(right); + __ Push(left); + __ Push(right); __ PushReturnAddressFrom(tmp1); if (equality) { __ TailCallRuntime(Runtime::kStringEquals, 2, 1); @@ -4170,17 +4170,17 @@ void ICCompareStub::GenerateMiss(MacroAssembler* masm) { ExternalReference(IC_Utility(IC::kCompareIC_Miss), masm->isolate()); FrameScope scope(masm, StackFrame::INTERNAL); - __ push(rdx); - __ push(rax); - __ push(rdx); - __ push(rax); + __ Push(rdx); + __ Push(rax); + __ Push(rdx); + __ Push(rax); __ Push(Smi::FromInt(op_)); __ CallExternalReference(miss, 3); // Compute the entry point of the rewritten stub. __ lea(rdi, FieldOperand(rax, Code::kHeaderSize)); - __ pop(rax); - __ pop(rdx); + __ Pop(rax); + __ Pop(rdx); } // Do a tail call to the rewritten stub. @@ -4242,7 +4242,7 @@ void NameDictionaryLookupStub::GenerateNegativeLookup(MacroAssembler* masm, NameDictionaryLookupStub stub(properties, r0, r0, NEGATIVE_LOOKUP); __ Push(Handle(name)); - __ push(Immediate(name->Hash())); + __ Push(Immediate(name->Hash())); __ CallStub(&stub); __ testq(r0, r0); __ j(not_zero, miss); @@ -4291,10 +4291,10 @@ void NameDictionaryLookupStub::GeneratePositiveLookup(MacroAssembler* masm, } NameDictionaryLookupStub stub(elements, r0, r1, POSITIVE_LOOKUP); - __ push(name); + __ Push(name); __ movl(r0, FieldOperand(name, Name::kHashFieldOffset)); __ shrl(r0, Immediate(Name::kHashShift)); - __ push(r0); + __ Push(r0); __ CallStub(&stub); __ testq(r0, r0); @@ -4324,7 +4324,7 @@ void NameDictionaryLookupStub::Generate(MacroAssembler* masm) { __ SmiToInteger32(scratch, FieldOperand(dictionary_, kCapacityOffset)); __ decl(scratch); - __ push(scratch); + __ Push(scratch); // If names of slots in range from 1 to kProbes - 1 for the hash value are // not equal to the name and kProbes-th slot is not used (its name is the @@ -4573,13 +4573,13 @@ void RecordWriteStub::CheckNeedsToInformIncrementalMarker( // We need an extra register for this, so we push the object register // temporarily. - __ push(regs_.object()); + __ Push(regs_.object()); __ EnsureNotWhite(regs_.scratch0(), // The value. regs_.scratch1(), // Scratch. regs_.object(), // Scratch. &need_incremental_pop_object, Label::kNear); - __ pop(regs_.object()); + __ Pop(regs_.object()); regs_.Restore(masm); if (on_no_need == kUpdateRememberedSetOnNoNeedToInformIncrementalMarker) { @@ -4593,7 +4593,7 @@ void RecordWriteStub::CheckNeedsToInformIncrementalMarker( } __ bind(&need_incremental_pop_object); - __ pop(regs_.object()); + __ Pop(regs_.object()); __ bind(&need_incremental); @@ -4634,12 +4634,12 @@ void StoreArrayLiteralElementStub::Generate(MacroAssembler* masm) { __ bind(&slow_elements); __ PopReturnAddressTo(rdi); - __ push(rbx); - __ push(rcx); - __ push(rax); + __ Push(rbx); + __ Push(rcx); + __ Push(rax); __ movp(rbx, Operand(rbp, JavaScriptFrameConstants::kFunctionOffset)); - __ push(FieldOperand(rbx, JSFunction::kLiteralsOffset)); - __ push(rdx); + __ Push(FieldOperand(rbx, JSFunction::kLiteralsOffset)); + __ Push(rdx); __ PushReturnAddressFrom(rdi); __ TailCallRuntime(Runtime::kStoreArrayLiteralElement, 5, 1); @@ -4708,8 +4708,8 @@ void ProfileEntryHookStub::Generate(MacroAssembler* masm) { // This stub can be called from essentially anywhere, so it needs to save // all volatile and callee-save registers. const size_t kNumSavedRegisters = 2; - __ push(arg_reg_1); - __ push(arg_reg_2); + __ pushq(arg_reg_1); + __ pushq(arg_reg_2); // Calculate the original stack pointer and store it in the second arg. __ lea(arg_reg_2, @@ -4734,8 +4734,8 @@ void ProfileEntryHookStub::Generate(MacroAssembler* masm) { // Restore volatile regs. masm->PopCallerSaved(kSaveFPRegs, arg_reg_1, arg_reg_2); - __ pop(arg_reg_2); - __ pop(arg_reg_1); + __ popq(arg_reg_2); + __ popq(arg_reg_1); __ Ret(); } @@ -5116,29 +5116,29 @@ void CallApiFunctionStub::Generate(MacroAssembler* masm) { __ PopReturnAddressTo(return_address); // context save - __ push(context); + __ Push(context); // load context from callee __ movp(context, FieldOperand(callee, JSFunction::kContextOffset)); // callee - __ push(callee); + __ Push(callee); // call data - __ push(call_data); + __ Push(call_data); Register scratch = call_data; if (!call_data_undefined) { __ LoadRoot(scratch, Heap::kUndefinedValueRootIndex); } // return value - __ push(scratch); + __ Push(scratch); // return value default - __ push(scratch); + __ Push(scratch); // isolate __ Move(scratch, ExternalReference::isolate_address(masm->isolate())); - __ push(scratch); + __ Push(scratch); // holder - __ push(holder); + __ Push(holder); __ movp(scratch, rsp); // Push return address back on stack. diff --git a/src/x64/code-stubs-x64.h b/src/x64/code-stubs-x64.h index 8d4592b..8c8ab69 100644 --- a/src/x64/code-stubs-x64.h +++ b/src/x64/code-stubs-x64.h @@ -305,19 +305,19 @@ class RecordWriteStub: public PlatformCodeStub { // We don't have to save scratch0_orig_ because it was given to us as // a scratch register. But if we had to switch to a different reg then // we should save the new scratch0_. - if (!scratch0_.is(scratch0_orig_)) masm->push(scratch0_); + if (!scratch0_.is(scratch0_orig_)) masm->Push(scratch0_); if (!rcx.is(scratch0_orig_) && !rcx.is(object_orig_) && !rcx.is(address_orig_)) { - masm->push(rcx); + masm->Push(rcx); } - masm->push(scratch1_); + masm->Push(scratch1_); if (!address_.is(address_orig_)) { - masm->push(address_); + masm->Push(address_); masm->movp(address_, address_orig_); } if (!object_.is(object_orig_)) { - masm->push(object_); + masm->Push(object_); masm->movp(object_, object_orig_); } } @@ -328,19 +328,19 @@ class RecordWriteStub: public PlatformCodeStub { // one, since only one of them can alias with rcx. if (!object_.is(object_orig_)) { masm->movp(object_orig_, object_); - masm->pop(object_); + masm->Pop(object_); } if (!address_.is(address_orig_)) { masm->movp(address_orig_, address_); - masm->pop(address_); + masm->Pop(address_); } - masm->pop(scratch1_); + masm->Pop(scratch1_); if (!rcx.is(scratch0_orig_) && !rcx.is(object_orig_) && !rcx.is(address_orig_)) { - masm->pop(rcx); + masm->Pop(rcx); } - if (!scratch0_.is(scratch0_orig_)) masm->pop(scratch0_); + if (!scratch0_.is(scratch0_orig_)) masm->Pop(scratch0_); } // If we have to call into C then we need to save and restore all caller- diff --git a/src/x64/codegen-x64.cc b/src/x64/codegen-x64.cc index f292f7d..f338668 100644 --- a/src/x64/codegen-x64.cc +++ b/src/x64/codegen-x64.cc @@ -66,13 +66,13 @@ UnaryMathFunction CreateExpFunction() { // xmm0: raw double input. XMMRegister input = xmm0; XMMRegister result = xmm1; - __ push(rax); - __ push(rbx); + __ pushq(rax); + __ pushq(rbx); MathExpGenerator::EmitMathExp(&masm, input, result, xmm2, rax, rbx); - __ pop(rbx); - __ pop(rax); + __ popq(rbx); + __ popq(rax); __ movsd(xmm0, result); __ Ret(); @@ -381,7 +381,7 @@ void ElementsTransitionGenerator::GenerateDoubleToObject( __ CompareRoot(r8, Heap::kEmptyFixedArrayRootIndex); __ j(equal, &only_change_map); - __ push(rax); + __ Push(rax); __ movp(r8, FieldOperand(rdx, JSObject::kElementsOffset)); __ SmiToInteger32(r9, FieldOperand(r8, FixedDoubleArray::kLengthOffset)); @@ -404,7 +404,7 @@ void ElementsTransitionGenerator::GenerateDoubleToObject( // Call into runtime if GC is required. __ bind(&gc_required); - __ pop(rax); + __ Pop(rax); __ movp(rsi, Operand(rbp, StandardFrameConstants::kContextOffset)); __ jmp(fail); @@ -458,7 +458,7 @@ void ElementsTransitionGenerator::GenerateDoubleToObject( kDontSaveFPRegs, EMIT_REMEMBERED_SET, OMIT_SMI_CHECK); - __ pop(rax); + __ Pop(rax); __ movp(rsi, Operand(rbp, StandardFrameConstants::kContextOffset)); __ bind(&only_change_map); @@ -640,10 +640,10 @@ static byte* GetNoCodeAgeSequence(uint32_t* length) { // following boilerplate stack-building prologue that is found both in // FUNCTION and OPTIMIZED_FUNCTION code: CodePatcher patcher(sequence, kNoCodeAgeSequenceLength); - patcher.masm()->push(rbp); + patcher.masm()->pushq(rbp); patcher.masm()->movp(rbp, rsp); - patcher.masm()->push(rsi); - patcher.masm()->push(rdi); + patcher.masm()->Push(rsi); + patcher.masm()->Push(rdi); initialized = true; } return sequence; diff --git a/src/x64/debug-x64.cc b/src/x64/debug-x64.cc index 938703e..d4126d9 100644 --- a/src/x64/debug-x64.cc +++ b/src/x64/debug-x64.cc @@ -121,7 +121,7 @@ static void Generate_DebugBreakCallHelper(MacroAssembler* masm, Register reg = { r }; ASSERT(!reg.is(kScratchRegister)); if ((object_regs & (1 << r)) != 0) { - __ push(reg); + __ Push(reg); } if ((non_object_regs & (1 << r)) != 0) { __ PushInt64AsTwoSmis(reg); @@ -145,7 +145,7 @@ static void Generate_DebugBreakCallHelper(MacroAssembler* masm, __ Set(reg, kDebugZapValue); } if ((object_regs & (1 << r)) != 0) { - __ pop(reg); + __ Pop(reg); } // Reconstruct the 64-bit value from two smis. if ((non_object_regs & (1 << r)) != 0) { @@ -154,7 +154,7 @@ static void Generate_DebugBreakCallHelper(MacroAssembler* masm, } // Read current padding counter and skip corresponding number of words. - __ pop(kScratchRegister); + __ Pop(kScratchRegister); __ SmiToInteger32(kScratchRegister, kScratchRegister); __ lea(rsp, Operand(rsp, kScratchRegister, times_pointer_size, 0)); @@ -329,8 +329,8 @@ void Debug::GenerateFrameDropperLiveEdit(MacroAssembler* masm) { // We do not know our frame height, but set rsp based on rbp. __ lea(rsp, Operand(rbp, -1 * kPointerSize)); - __ pop(rdi); // Function. - __ pop(rbp); + __ Pop(rdi); // Function. + __ popq(rbp); // Load context from the function. __ movp(rsi, FieldOperand(rdi, JSFunction::kContextOffset)); diff --git a/src/x64/deoptimizer-x64.cc b/src/x64/deoptimizer-x64.cc index e35664a..04f6feb 100644 --- a/src/x64/deoptimizer-x64.cc +++ b/src/x64/deoptimizer-x64.cc @@ -179,7 +179,7 @@ void Deoptimizer::EntryGenerator::Generate() { // to restore all later. for (int i = 0; i < kNumberOfRegisters; i++) { Register r = Register::from_code(i); - __ push(r); + __ pushq(r); } const int kSavedRegistersAreaSize = kNumberOfRegisters * kRegisterSize + @@ -230,14 +230,14 @@ void Deoptimizer::EntryGenerator::Generate() { // Fill in the input registers. for (int i = kNumberOfRegisters -1; i >= 0; i--) { int offset = (i * kPointerSize) + FrameDescription::registers_offset(); - __ pop(Operand(rbx, offset)); + __ Pop(Operand(rbx, offset)); } // Fill in the double input registers. int double_regs_offset = FrameDescription::double_registers_offset(); for (int i = 0; i < XMMRegister::NumAllocatableRegisters(); i++) { int dst_offset = i * kDoubleSize + double_regs_offset; - __ pop(Operand(rbx, dst_offset)); + __ popq(Operand(rbx, dst_offset)); } // Remove the bailout id and return address from the stack. @@ -256,14 +256,14 @@ void Deoptimizer::EntryGenerator::Generate() { __ jmp(&pop_loop_header); Label pop_loop; __ bind(&pop_loop); - __ pop(Operand(rdx, 0)); + __ Pop(Operand(rdx, 0)); __ addq(rdx, Immediate(sizeof(intptr_t))); __ bind(&pop_loop_header); __ cmpq(rcx, rsp); __ j(not_equal, &pop_loop); // Compute the output frame in the deoptimizer. - __ push(rax); + __ pushq(rax); __ PrepareCallCFunction(2); __ movp(arg_reg_1, rax); __ LoadAddress(arg_reg_2, ExternalReference::isolate_address(isolate())); @@ -272,7 +272,7 @@ void Deoptimizer::EntryGenerator::Generate() { __ CallCFunction( ExternalReference::compute_output_frames_function(isolate()), 2); } - __ pop(rax); + __ popq(rax); // Replace the current frame with the output frames. Label outer_push_loop, inner_push_loop, @@ -290,7 +290,7 @@ void Deoptimizer::EntryGenerator::Generate() { __ jmp(&inner_loop_header); __ bind(&inner_push_loop); __ subq(rcx, Immediate(sizeof(intptr_t))); - __ push(Operand(rbx, rcx, times_1, FrameDescription::frame_content_offset())); + __ Push(Operand(rbx, rcx, times_1, FrameDescription::frame_content_offset())); __ bind(&inner_loop_header); __ testq(rcx, rcx); __ j(not_zero, &inner_push_loop); @@ -306,14 +306,14 @@ void Deoptimizer::EntryGenerator::Generate() { } // Push state, pc, and continuation from the last output frame. - __ push(Operand(rbx, FrameDescription::state_offset())); - __ push(Operand(rbx, FrameDescription::pc_offset())); - __ push(Operand(rbx, FrameDescription::continuation_offset())); + __ Push(Operand(rbx, FrameDescription::state_offset())); + __ Push(Operand(rbx, FrameDescription::pc_offset())); + __ Push(Operand(rbx, FrameDescription::continuation_offset())); // Push the registers from the last output frame. for (int i = 0; i < kNumberOfRegisters; i++) { int offset = (i * kPointerSize) + FrameDescription::registers_offset(); - __ push(Operand(rbx, offset)); + __ Push(Operand(rbx, offset)); } // Restore the registers from the stack. @@ -325,7 +325,7 @@ void Deoptimizer::EntryGenerator::Generate() { ASSERT(i > 0); r = Register::from_code(i - 1); } - __ pop(r); + __ popq(r); } // Set up the roots register. @@ -343,7 +343,7 @@ void Deoptimizer::TableEntryGenerator::GeneratePrologue() { for (int i = 0; i < count(); i++) { int start = masm()->pc_offset(); USE(start); - __ push_imm32(i); + __ pushq_imm32(i); __ jmp(&done); ASSERT(masm()->pc_offset() - start == table_entry_size_); } diff --git a/src/x64/full-codegen-x64.cc b/src/x64/full-codegen-x64.cc index 05ec261..1e7cc6c 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 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 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 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 ic = strict_mode() == SLOPPY ? isolate()->builtins()->KeyedStoreIC_Initialize() : isolate()->builtins()->KeyedStoreIC_Initialize_Strict(); @@ -2402,8 +2402,8 @@ void FullCodeGenerator::EmitStoreToStackLocalOrContextSlot( void FullCodeGenerator::EmitCallStoreContextSlot( Handle 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 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 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); diff --git a/src/x64/ic-x64.cc b/src/x64/ic-x64.cc index 40fdc60..f6af561 100644 --- a/src/x64/ic-x64.cc +++ b/src/x64/ic-x64.cc @@ -571,8 +571,8 @@ void KeyedLoadIC::GenerateIndexedInterceptor(MacroAssembler* masm) { // Everything is fine, call runtime. __ PopReturnAddressTo(rcx); - __ push(rdx); // receiver - __ push(rax); // key + __ Push(rdx); // receiver + __ Push(rax); // key __ PushReturnAddressFrom(rcx); // Perform tail call to the entry. @@ -1021,8 +1021,8 @@ void LoadIC::GenerateMiss(MacroAssembler* masm) { __ IncrementCounter(counters->load_miss(), 1); __ PopReturnAddressTo(rbx); - __ push(rax); // receiver - __ push(rcx); // name + __ Push(rax); // receiver + __ Push(rcx); // name __ PushReturnAddressFrom(rbx); // Perform tail call to the entry. @@ -1040,8 +1040,8 @@ void LoadIC::GenerateRuntimeGetProperty(MacroAssembler* masm) { // ----------------------------------- __ PopReturnAddressTo(rbx); - __ push(rax); // receiver - __ push(rcx); // name + __ Push(rax); // receiver + __ Push(rcx); // name __ PushReturnAddressFrom(rbx); // Perform tail call to the entry. @@ -1060,8 +1060,8 @@ void KeyedLoadIC::GenerateMiss(MacroAssembler* masm) { __ IncrementCounter(counters->keyed_load_miss(), 1); __ PopReturnAddressTo(rbx); - __ push(rdx); // receiver - __ push(rax); // name + __ Push(rdx); // receiver + __ Push(rax); // name __ PushReturnAddressFrom(rbx); // Perform tail call to the entry. @@ -1079,8 +1079,8 @@ void KeyedLoadIC::GenerateRuntimeGetProperty(MacroAssembler* masm) { // ----------------------------------- __ PopReturnAddressTo(rbx); - __ push(rdx); // receiver - __ push(rax); // name + __ Push(rdx); // receiver + __ Push(rax); // name __ PushReturnAddressFrom(rbx); // Perform tail call to the entry. @@ -1115,9 +1115,9 @@ void StoreIC::GenerateMiss(MacroAssembler* masm) { // ----------------------------------- __ PopReturnAddressTo(rbx); - __ push(rdx); // receiver - __ push(rcx); // name - __ push(rax); // value + __ Push(rdx); // receiver + __ Push(rcx); // name + __ Push(rax); // value __ PushReturnAddressFrom(rbx); // Perform tail call to the entry. @@ -1159,9 +1159,9 @@ void StoreIC::GenerateRuntimeSetProperty(MacroAssembler* masm, // -- rsp[0] : return address // ----------------------------------- __ PopReturnAddressTo(rbx); - __ push(rdx); - __ push(rcx); - __ push(rax); + __ Push(rdx); + __ Push(rcx); + __ Push(rax); __ Push(Smi::FromInt(NONE)); // PropertyAttributes __ Push(Smi::FromInt(strict_mode)); __ PushReturnAddressFrom(rbx); @@ -1181,9 +1181,9 @@ void KeyedStoreIC::GenerateRuntimeSetProperty(MacroAssembler* masm, // ----------------------------------- __ PopReturnAddressTo(rbx); - __ push(rdx); // receiver - __ push(rcx); // key - __ push(rax); // value + __ Push(rdx); // receiver + __ Push(rcx); // key + __ Push(rax); // value __ Push(Smi::FromInt(NONE)); // PropertyAttributes __ Push(Smi::FromInt(strict_mode)); // Strict mode. __ PushReturnAddressFrom(rbx); @@ -1202,9 +1202,9 @@ void StoreIC::GenerateSlow(MacroAssembler* masm) { // ----------------------------------- __ PopReturnAddressTo(rbx); - __ push(rdx); // receiver - __ push(rcx); // key - __ push(rax); // value + __ Push(rdx); // receiver + __ Push(rcx); // key + __ Push(rax); // value __ PushReturnAddressFrom(rbx); // Do tail-call to runtime routine. @@ -1222,9 +1222,9 @@ void KeyedStoreIC::GenerateSlow(MacroAssembler* masm) { // ----------------------------------- __ PopReturnAddressTo(rbx); - __ push(rdx); // receiver - __ push(rcx); // key - __ push(rax); // value + __ Push(rdx); // receiver + __ Push(rcx); // key + __ Push(rax); // value __ PushReturnAddressFrom(rbx); // Do tail-call to runtime routine. @@ -1242,9 +1242,9 @@ void KeyedStoreIC::GenerateMiss(MacroAssembler* masm) { // ----------------------------------- __ PopReturnAddressTo(rbx); - __ push(rdx); // receiver - __ push(rcx); // key - __ push(rax); // value + __ Push(rdx); // receiver + __ Push(rcx); // key + __ Push(rax); // value __ PushReturnAddressFrom(rbx); // Do tail-call to runtime routine. diff --git a/src/x64/lithium-codegen-x64.cc b/src/x64/lithium-codegen-x64.cc index 7d0d577..b28b89c 100644 --- a/src/x64/lithium-codegen-x64.cc +++ b/src/x64/lithium-codegen-x64.cc @@ -191,7 +191,7 @@ bool LCodeGen::GeneratePrologue() { #ifdef _MSC_VER MakeSureStackPagesMapped(slots * kPointerSize); #endif - __ push(rax); + __ Push(rax); __ Set(rax, slots); __ movq(kScratchRegister, kSlotsZapValue); Label loop; @@ -200,7 +200,7 @@ bool LCodeGen::GeneratePrologue() { kScratchRegister); __ decl(rax); __ j(not_zero, &loop); - __ pop(rax); + __ Pop(rax); } else { __ subq(rsp, Immediate(slots * kPointerSize)); #ifdef _MSC_VER @@ -222,7 +222,7 @@ bool LCodeGen::GeneratePrologue() { FastNewContextStub stub(heap_slots); __ CallStub(&stub); } else { - __ push(rdi); + __ Push(rdi); __ CallRuntime(Runtime::kNewFunctionContext, 1); } RecordSafepoint(Safepoint::kNoLazyDeopt); @@ -303,15 +303,15 @@ bool LCodeGen::GenerateJumpTable() { } else { __ bind(&needs_frame); __ movp(rsi, MemOperand(rbp, StandardFrameConstants::kContextOffset)); - __ push(rbp); + __ pushq(rbp); __ movp(rbp, rsp); - __ push(rsi); + __ Push(rsi); // This variant of deopt can only be used with stubs. Since we don't // have a function pointer to install in the stack frame that we're // building, install a special marker there instead. ASSERT(info()->IsStub()); __ Move(rsi, Smi::FromInt(StackFrame::STUB)); - __ push(rsi); + __ Push(rsi); __ movp(rsi, MemOperand(rsp, kPointerSize)); __ call(kScratchRegister); } @@ -350,8 +350,8 @@ bool LCodeGen::GenerateDeferredCode() { ASSERT(info()->IsStub()); frame_is_built_ = true; // Build the frame in such a way that esi isn't trashed. - __ push(rbp); // Caller's frame pointer. - __ push(Operand(rbp, StandardFrameConstants::kContextOffset)); + __ pushq(rbp); // Caller's frame pointer. + __ Push(Operand(rbp, StandardFrameConstants::kContextOffset)); __ Push(Smi::FromInt(StackFrame::STUB)); __ lea(rbp, Operand(rsp, 2 * kPointerSize)); Comment(";;; Deferred code"); @@ -363,7 +363,7 @@ bool LCodeGen::GenerateDeferredCode() { ASSERT(frame_is_built_); frame_is_built_ = false; __ movp(rsp, rbp); - __ pop(rbp); + __ popq(rbp); } __ jmp(code->exit()); } @@ -722,7 +722,7 @@ void LCodeGen::DeoptimizeIf(Condition cc, ExternalReference count = ExternalReference::stress_deopt_count(isolate()); Label no_deopt; __ pushfq(); - __ push(rax); + __ Push(rax); Operand count_operand = masm()->ExternalOperand(count, kScratchRegister); __ movl(rax, count_operand); __ subl(rax, Immediate(1)); @@ -730,13 +730,13 @@ void LCodeGen::DeoptimizeIf(Condition cc, if (FLAG_trap_on_deopt) __ int3(); __ movl(rax, Immediate(FLAG_deopt_every_n_times)); __ movl(count_operand, rax); - __ pop(rax); + __ Pop(rax); __ popfq(); ASSERT(frame_is_built_); __ call(entry, RelocInfo::RUNTIME_ENTRY); __ bind(&no_deopt); __ movl(count_operand, rax); - __ pop(rax); + __ Pop(rax); __ popfq(); } @@ -1667,7 +1667,7 @@ void LCodeGen::DoSeqStringGetChar(LSeqStringGetChar* instr) { Register string = ToRegister(instr->string()); if (FLAG_debug_code) { - __ push(string); + __ Push(string); __ movp(string, FieldOperand(string, HeapObject::kMapOffset)); __ movzxbq(string, FieldOperand(string, Map::kInstanceTypeOffset)); @@ -1677,7 +1677,7 @@ void LCodeGen::DoSeqStringGetChar(LSeqStringGetChar* instr) { __ cmpq(string, Immediate(encoding == String::ONE_BYTE_ENCODING ? one_byte_seq_type : two_byte_seq_type)); __ Check(equal, kUnexpectedStringType); - __ pop(string); + __ Pop(string); } Operand operand = BuildSeqStringOperand(string, instr->index(), encoding); @@ -2495,8 +2495,8 @@ void LCodeGen::DoCmpMapAndBranch(LCmpMapAndBranch* instr) { void LCodeGen::DoInstanceOf(LInstanceOf* instr) { ASSERT(ToRegister(instr->context()).is(rsi)); InstanceofStub stub(InstanceofStub::kNoFlags); - __ push(ToRegister(instr->left())); - __ push(ToRegister(instr->right())); + __ Push(ToRegister(instr->left())); + __ Push(ToRegister(instr->right())); CallCode(stub.GetCode(isolate()), RelocInfo::CODE_TARGET, instr); Label true_value, done; __ testq(rax, rax); @@ -2582,14 +2582,14 @@ void LCodeGen::DoDeferredInstanceOfKnownGlobal(LInstanceOfKnownGlobal* instr, InstanceofStub::kNoFlags | InstanceofStub::kCallSiteInlineCheck); InstanceofStub stub(flags); - __ push(ToRegister(instr->value())); + __ Push(ToRegister(instr->value())); __ Push(instr->function()); static const int kAdditionalDelta = 10; int delta = masm_->SizeOfCodeGeneratedSince(map_check) + kAdditionalDelta; ASSERT(delta >= 0); - __ push_imm32(delta); + __ PushImm32(delta); // We are pushing three values on the stack but recording a // safepoint with two arguments because stub is going to @@ -2644,7 +2644,7 @@ void LCodeGen::DoReturn(LReturn* instr) { // to return the value in the same register. We're leaving the code // managed by the register allocator and tearing down the frame, it's // safe to write to the context register. - __ push(rax); + __ Push(rax); __ movp(rsi, Operand(rbp, StandardFrameConstants::kContextOffset)); __ CallRuntime(Runtime::kTraceExit, 1); } @@ -2654,7 +2654,7 @@ void LCodeGen::DoReturn(LReturn* instr) { int no_frame_start = -1; if (NeedsEagerFrame()) { __ movp(rsp, rbp); - __ pop(rbp); + __ popq(rbp); no_frame_start = masm_->pc_offset(); } if (instr->has_constant_parameter_count()) { @@ -3266,7 +3266,7 @@ void LCodeGen::DoApplyArguments(LApplyArguments* instr) { __ cmpq(length, Immediate(kArgumentsLimit)); DeoptimizeIf(above, instr->environment()); - __ push(receiver); + __ Push(receiver); __ movp(receiver, length); // Loop through the arguments pushing them onto the execution @@ -3278,7 +3278,7 @@ void LCodeGen::DoApplyArguments(LApplyArguments* instr) { __ bind(&loop); StackArgumentsAccessor args(elements, length, ARGUMENTS_DONT_CONTAIN_RECEIVER); - __ push(args.GetArgumentOperand(0)); + __ Push(args.GetArgumentOperand(0)); __ decl(length); __ j(not_zero, &loop); @@ -3323,7 +3323,7 @@ void LCodeGen::DoContext(LContext* instr) { void LCodeGen::DoDeclareGlobals(LDeclareGlobals* instr) { ASSERT(ToRegister(instr->context()).is(rsi)); - __ push(rsi); // The context is the first argument. + __ Push(rsi); // The context is the first argument. __ Push(instr->hydrogen()->pairs()); __ Push(Smi::FromInt(instr->hydrogen()->flags())); CallRuntime(Runtime::kDeclareGlobals, 3, instr); @@ -4433,7 +4433,7 @@ void LCodeGen::DoDeferredStringCharCodeAt(LStringCharCodeAt* instr) { __ Set(result, 0); PushSafepointRegistersScope scope(this); - __ push(string); + __ Push(string); // Push the index as a smi. This is safe because of the checks in // DoStringCharCodeAt above. STATIC_ASSERT(String::kMaxLength <= Smi::kMaxValue); @@ -4443,7 +4443,7 @@ void LCodeGen::DoDeferredStringCharCodeAt(LStringCharCodeAt* instr) { } else { Register index = ToRegister(instr->index()); __ Integer32ToSmi(index, index); - __ push(index); + __ Push(index); } CallRuntimeFromDeferred( Runtime::kStringCharCodeAt, 2, instr, instr->context()); @@ -4498,7 +4498,7 @@ void LCodeGen::DoDeferredStringCharFromCode(LStringCharFromCode* instr) { PushSafepointRegistersScope scope(this); __ Integer32ToSmi(char_code, char_code); - __ push(char_code); + __ Push(char_code); CallRuntimeFromDeferred(Runtime::kCharFromCode, 1, instr, instr->context()); __ StoreToSafepointRegisterSlot(result, rax); } @@ -4968,7 +4968,7 @@ void LCodeGen::DoCheckValue(LCheckValue* instr) { void LCodeGen::DoDeferredInstanceMigration(LCheckMaps* instr, Register object) { { PushSafepointRegistersScope scope(this); - __ push(object); + __ Push(object); __ Set(rsi, 0); __ CallRuntimeSaveDoubles(Runtime::kTryMigrateInstance); RecordSafepointWithRegisters( @@ -5184,7 +5184,7 @@ void LCodeGen::DoDeferredAllocate(LAllocate* instr) { Register size = ToRegister(instr->size()); ASSERT(!size.is(result)); __ Integer32ToSmi(size, size); - __ push(size); + __ Push(size); } else { int32_t size = ToInteger32(LConstantOperand::cast(instr->size())); __ Push(Smi::FromInt(size)); @@ -5211,7 +5211,7 @@ void LCodeGen::DoDeferredAllocate(LAllocate* instr) { void LCodeGen::DoToFastProperties(LToFastProperties* instr) { ASSERT(ToRegister(instr->value()).is(rax)); - __ push(rax); + __ Push(rax); CallRuntime(Runtime::kToFastProperties, 1, instr); } @@ -5232,7 +5232,7 @@ void LCodeGen::DoRegExpLiteral(LRegExpLiteral* instr) { // Create regexp literal using runtime function // Result will be in rax. - __ push(rcx); + __ Push(rcx); __ Push(Smi::FromInt(instr->hydrogen()->literal_index())); __ Push(instr->hydrogen()->pattern()); __ Push(instr->hydrogen()->flags()); @@ -5246,10 +5246,10 @@ void LCodeGen::DoRegExpLiteral(LRegExpLiteral* instr) { __ jmp(&allocated, Label::kNear); __ bind(&runtime_allocate); - __ push(rbx); + __ Push(rbx); __ Push(Smi::FromInt(size)); CallRuntime(Runtime::kAllocateInNewSpace, 1, instr); - __ pop(rbx); + __ Pop(rbx); __ bind(&allocated); // Copy the content into the newly allocated memory. @@ -5278,7 +5278,7 @@ void LCodeGen::DoFunctionLiteral(LFunctionLiteral* instr) { __ Move(rbx, instr->hydrogen()->shared_info()); CallCode(stub.GetCode(isolate()), RelocInfo::CODE_TARGET, instr); } else { - __ push(rsi); + __ Push(rsi); __ Push(instr->hydrogen()->shared_info()); __ PushRoot(pretenure ? Heap::kTrueValueRootIndex : Heap::kFalseValueRootIndex); @@ -5300,9 +5300,9 @@ void LCodeGen::EmitPushTaggedOperand(LOperand* operand) { if (operand->IsConstantOperand()) { __ Push(ToHandle(LConstantOperand::cast(operand))); } else if (operand->IsRegister()) { - __ push(ToRegister(operand)); + __ Push(ToRegister(operand)); } else { - __ push(ToOperand(operand)); + __ Push(ToOperand(operand)); } } @@ -5575,7 +5575,7 @@ void LCodeGen::DoForInPrepareMap(LForInPrepareMap* instr) { // Get the set of properties to enumerate. __ bind(&call_runtime); - __ push(rax); + __ Push(rax); CallRuntime(Runtime::kGetPropertyNamesFast, 1, instr); __ CompareRoot(FieldOperand(rax, HeapObject::kMapOffset), diff --git a/src/x64/macro-assembler-x64.cc b/src/x64/macro-assembler-x64.cc index fe65f94..48dc16a 100644 --- a/src/x64/macro-assembler-x64.cc +++ b/src/x64/macro-assembler-x64.cc @@ -165,11 +165,11 @@ void MacroAssembler::PushAddress(ExternalReference source) { if (emit_debug_code()) { Move(kScratchRegister, kZapValue, Assembler::RelocInfoNone()); } - push(Immediate(static_cast(address))); + Push(Immediate(static_cast(address))); return; } LoadAddress(kScratchRegister, source); - push(kScratchRegister); + Push(kScratchRegister); } @@ -200,7 +200,7 @@ void MacroAssembler::StoreRoot(Register source, Heap::RootListIndex index) { void MacroAssembler::PushRoot(Heap::RootListIndex index) { ASSERT(root_array_available_); - push(Operand(kRootRegister, (index << kPointerSizeLog2) - kRootRegisterBias)); + Push(Operand(kRootRegister, (index << kPointerSizeLog2) - kRootRegisterBias)); } @@ -518,10 +518,10 @@ void MacroAssembler::Abort(BailoutReason reason) { } #endif - push(rax); + Push(rax); Move(kScratchRegister, Smi::FromInt(static_cast(reason)), Assembler::RelocInfoNone()); - push(kScratchRegister); + Push(kScratchRegister); if (!has_frame_) { // We don't actually want to generate a pile of code for this, so just @@ -881,7 +881,7 @@ void MacroAssembler::PushCallerSaved(SaveFPRegsMode fp_mode, for (int i = 0; i < kNumberOfSavedRegs; i++) { Register reg = saved_regs[i]; if (!reg.is(exclusion1) && !reg.is(exclusion2) && !reg.is(exclusion3)) { - push(reg); + pushq(reg); } } // R12 to r15 are callee save on all platforms. @@ -909,7 +909,7 @@ void MacroAssembler::PopCallerSaved(SaveFPRegsMode fp_mode, for (int i = kNumberOfSavedRegs - 1; i >= 0; i--) { Register reg = saved_regs[i]; if (!reg.is(exclusion1) && !reg.is(exclusion2) && !reg.is(exclusion3)) { - pop(reg); + popq(reg); } } } @@ -2231,10 +2231,10 @@ void MacroAssembler::AddSmiField(Register dst, const Operand& src) { void MacroAssembler::Push(Smi* source) { intptr_t smi = reinterpret_cast(source); if (is_int32(smi)) { - push(Immediate(static_cast(smi))); + Push(Immediate(static_cast(smi))); } else { Register constant = GetSmiConstant(source); - push(constant); + Push(constant); } } @@ -2244,18 +2244,18 @@ void MacroAssembler::PushInt64AsTwoSmis(Register src, Register scratch) { // High bits. shr(src, Immediate(64 - kSmiShift)); shl(src, Immediate(kSmiShift)); - push(src); + Push(src); // Low bits. shl(scratch, Immediate(kSmiShift)); - push(scratch); + Push(scratch); } void MacroAssembler::PopInt64AsTwoSmis(Register dst, Register scratch) { - pop(scratch); + Pop(scratch); // Low bits. shr(scratch, Immediate(kSmiShift)); - pop(dst); + Pop(dst); shr(dst, Immediate(kSmiShift)); // High bits. shl(dst, Immediate(64 - kSmiShift)); @@ -2535,7 +2535,7 @@ void MacroAssembler::Push(Handle source) { Push(Smi::cast(*source)); } else { MoveHeapObject(kScratchRegister, source); - push(kScratchRegister); + Push(kScratchRegister); } } @@ -2572,6 +2572,85 @@ void MacroAssembler::Drop(int stack_elements) { } +void MacroAssembler::Push(Register src) { + if (kPointerSize == kInt64Size) { + pushq(src); + } else { + ASSERT(kPointerSize == kInt32Size); + // x32 uses 64-bit push for rbp in the prologue. + ASSERT(src.code() != rbp.code()); + leal(rsp, Operand(rsp, -4)); + movp(Operand(rsp, 0), src); + } +} + + +void MacroAssembler::Push(const Operand& src) { + if (kPointerSize == kInt64Size) { + pushq(src); + } else { + ASSERT(kPointerSize == kInt32Size); + movp(kScratchRegister, src); + leal(rsp, Operand(rsp, -4)); + movp(Operand(rsp, 0), kScratchRegister); + } +} + + +void MacroAssembler::Push(Immediate value) { + if (kPointerSize == kInt64Size) { + pushq(value); + } else { + ASSERT(kPointerSize == kInt32Size); + leal(rsp, Operand(rsp, -4)); + movp(Operand(rsp, 0), value); + } +} + + +void MacroAssembler::PushImm32(int32_t imm32) { + if (kPointerSize == kInt64Size) { + pushq_imm32(imm32); + } else { + ASSERT(kPointerSize == kInt32Size); + leal(rsp, Operand(rsp, -4)); + movp(Operand(rsp, 0), Immediate(imm32)); + } +} + + +void MacroAssembler::Pop(Register dst) { + if (kPointerSize == kInt64Size) { + popq(dst); + } else { + ASSERT(kPointerSize == kInt32Size); + // x32 uses 64-bit pop for rbp in the epilogue. + ASSERT(dst.code() != rbp.code()); + movp(dst, Operand(rsp, 0)); + leal(rsp, Operand(rsp, 4)); + } +} + + +void MacroAssembler::Pop(const Operand& dst) { + if (kPointerSize == kInt64Size) { + popq(dst); + } else { + ASSERT(kPointerSize == kInt32Size); + Register scratch = dst.AddressUsesRegister(kScratchRegister) + ? kSmiConstantRegister : kScratchRegister; + movp(scratch, Operand(rsp, 0)); + movp(dst, scratch); + leal(rsp, Operand(rsp, 4)); + if (scratch.is(kSmiConstantRegister)) { + // Restore kSmiConstantRegister. + movp(kSmiConstantRegister, Smi::FromInt(kSmiConstantRegisterValue), + Assembler::RelocInfoNone()); + } + } +} + + void MacroAssembler::TestBit(const Operand& src, int bits) { int byte_offset = bits / kBitsPerByte; int bit_in_byte = bits & (kBitsPerByte - 1); @@ -2666,21 +2745,21 @@ void MacroAssembler::Call(Handle code_object, void MacroAssembler::Pushad() { - push(rax); - push(rcx); - push(rdx); - push(rbx); + Push(rax); + Push(rcx); + Push(rdx); + Push(rbx); // Not pushing rsp or rbp. - push(rsi); - push(rdi); - push(r8); - push(r9); + Push(rsi); + Push(rdi); + Push(r8); + Push(r9); // r10 is kScratchRegister. - push(r11); + Push(r11); // r12 is kSmiConstantRegister. // r13 is kRootRegister. - push(r14); - push(r15); + Push(r14); + Push(r15); STATIC_ASSERT(11 == kNumSafepointSavedRegisters); // Use lea for symmetry with Popad. int sp_delta = @@ -2694,17 +2773,17 @@ void MacroAssembler::Popad() { int sp_delta = (kNumSafepointRegisters - kNumSafepointSavedRegisters) * kPointerSize; lea(rsp, Operand(rsp, sp_delta)); - pop(r15); - pop(r14); - pop(r11); - pop(r9); - pop(r8); - pop(rdi); - pop(rsi); - pop(rbx); - pop(rdx); - pop(rcx); - pop(rax); + Pop(r15); + Pop(r14); + Pop(r11); + Pop(r9); + Pop(r8); + Pop(rdi); + Pop(rsi); + Pop(rbx); + Pop(rdx); + Pop(rcx); + Pop(rax); } @@ -2774,23 +2853,23 @@ void MacroAssembler::PushTryHandler(StackHandler::Kind kind, // The frame pointer does not point to a JS frame so we save NULL for // rbp. We expect the code throwing an exception to check rbp before // dereferencing it to restore the context. - push(Immediate(0)); // NULL frame pointer. + pushq(Immediate(0)); // NULL frame pointer. Push(Smi::FromInt(0)); // No context. } else { - push(rbp); - push(rsi); + pushq(rbp); + Push(rsi); } // Push the state and the code object. unsigned state = StackHandler::IndexField::encode(handler_index) | StackHandler::KindField::encode(kind); - push(Immediate(state)); + Push(Immediate(state)); Push(CodeObject()); // Link the current handler as the next handler. ExternalReference handler_address(Isolate::kHandlerAddress, isolate()); - push(ExternalOperand(handler_address)); + Push(ExternalOperand(handler_address)); // Set this new handler as the current one. movp(ExternalOperand(handler_address), rsp); } @@ -2799,7 +2878,7 @@ void MacroAssembler::PushTryHandler(StackHandler::Kind kind, void MacroAssembler::PopTryHandler() { STATIC_ASSERT(StackHandlerConstants::kNextOffset == 0); ExternalReference handler_address(Isolate::kHandlerAddress, isolate()); - pop(ExternalOperand(handler_address)); + Pop(ExternalOperand(handler_address)); addq(rsp, Immediate(StackHandlerConstants::kSize - kPointerSize)); } @@ -2836,15 +2915,15 @@ void MacroAssembler::Throw(Register value) { ExternalReference handler_address(Isolate::kHandlerAddress, isolate()); movp(rsp, ExternalOperand(handler_address)); // Restore the next handler. - pop(ExternalOperand(handler_address)); + Pop(ExternalOperand(handler_address)); // Remove the code object and state, compute the handler address in rdi. - pop(rdi); // Code object. - pop(rdx); // Offset and state. + Pop(rdi); // Code object. + Pop(rdx); // Offset and state. // Restore the context and frame pointer. - pop(rsi); // Context. - pop(rbp); // Frame pointer. + Pop(rsi); // Context. + popq(rbp); // Frame pointer. // If the handler is a JS frame, restore the context to the frame. // (kind == ENTRY) == (rbp == 0) == (rsi == 0), so we could test either @@ -2890,15 +2969,15 @@ void MacroAssembler::ThrowUncatchable(Register value) { j(not_zero, &fetch_next); // Set the top handler address to next handler past the top ENTRY handler. - pop(ExternalOperand(handler_address)); + Pop(ExternalOperand(handler_address)); // Remove the code object and state, compute the handler address in rdi. - pop(rdi); // Code object. - pop(rdx); // Offset and state. + Pop(rdi); // Code object. + Pop(rdx); // Offset and state. // Clear the context pointer and frame pointer (0 was saved in the handler). - pop(rsi); - pop(rbp); + Pop(rsi); + popq(rbp); JumpToHandlerEntry(); } @@ -3219,7 +3298,7 @@ void MacroAssembler::Throw(BailoutReason reason) { } #endif - push(rax); + Push(rax); Push(Smi::FromInt(reason)); if (!has_frame_) { // We don't actually want to generate a pile of code for this, so just @@ -3330,10 +3409,10 @@ void MacroAssembler::AssertString(Register object) { if (emit_debug_code()) { testb(object, Immediate(kSmiTagMask)); Check(not_equal, kOperandIsASmiAndNotAString); - push(object); + Push(object); movp(object, FieldOperand(object, HeapObject::kMapOffset)); CmpInstanceType(object, FIRST_NONSTRING_TYPE); - pop(object); + Pop(object); Check(below, kOperandIsNotAString); } } @@ -3343,10 +3422,10 @@ void MacroAssembler::AssertName(Register object) { if (emit_debug_code()) { testb(object, Immediate(kSmiTagMask)); Check(not_equal, kOperandIsASmiAndNotAName); - push(object); + Push(object); movp(object, FieldOperand(object, HeapObject::kMapOffset)); CmpInstanceType(object, LAST_NAME_TYPE); - pop(object); + Pop(object); Check(below_equal, kOperandIsNotAName); } } @@ -3659,9 +3738,9 @@ void MacroAssembler::InvokePrologue(const ParameterCount& expected, void MacroAssembler::Prologue(PrologueFrameMode frame_mode) { if (frame_mode == BUILD_STUB_FRAME) { - push(rbp); // Caller's frame pointer. + pushq(rbp); // Caller's frame pointer. movp(rbp, rsp); - push(rsi); // Callee's context. + Push(rsi); // Callee's context. Push(Smi::FromInt(StackFrame::STUB)); } else { PredictableCodeSizeScope predictible_code_size_scope(this, @@ -3672,22 +3751,22 @@ void MacroAssembler::Prologue(PrologueFrameMode frame_mode) { RelocInfo::CODE_AGE_SEQUENCE); Nop(kNoCodeAgeSequenceLength - Assembler::kShortCallInstructionLength); } else { - 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. } } } void MacroAssembler::EnterFrame(StackFrame::Type type) { - push(rbp); + pushq(rbp); movp(rbp, rsp); - push(rsi); // Context. + Push(rsi); // Context. Push(Smi::FromInt(type)); Move(kScratchRegister, CodeObject(), RelocInfo::EMBEDDED_OBJECT); - push(kScratchRegister); + Push(kScratchRegister); if (emit_debug_code()) { Move(kScratchRegister, isolate()->factory()->undefined_value(), @@ -3705,7 +3784,7 @@ void MacroAssembler::LeaveFrame(StackFrame::Type type) { Check(equal, kStackFrameTypesMustMatch); } movp(rsp, rbp); - pop(rbp); + popq(rbp); } @@ -3716,14 +3795,14 @@ void MacroAssembler::EnterExitFramePrologue(bool save_rax) { kFPOnStackSize + kPCOnStackSize); ASSERT(ExitFrameConstants::kCallerPCOffset == kFPOnStackSize); ASSERT(ExitFrameConstants::kCallerFPOffset == 0 * kPointerSize); - push(rbp); + pushq(rbp); movp(rbp, rsp); // Reserve room for entry stack pointer and push the code object. ASSERT(ExitFrameConstants::kSPOffset == -1 * kPointerSize); - push(Immediate(0)); // Saved entry sp, patched before call. + Push(Immediate(0)); // Saved entry sp, patched before call. Move(kScratchRegister, CodeObject(), RelocInfo::EMBEDDED_OBJECT); - push(kScratchRegister); // Accessed from EditFrame::code_slot. + Push(kScratchRegister); // Accessed from EditFrame::code_slot. // Save the frame pointer and the context in top. if (save_rax) { @@ -3812,7 +3891,7 @@ void MacroAssembler::LeaveExitFrame(bool save_doubles) { void MacroAssembler::LeaveApiExitFrame(bool restore_context) { movp(rsp, rbp); - pop(rbp); + popq(rbp); LeaveExitFrameEpilogue(restore_context); } @@ -3877,7 +3956,7 @@ void MacroAssembler::CheckAccessGlobalProxy(Register holder_reg, // Check the context is a native context. if (emit_debug_code()) { // Preserve original value of holder_reg. - push(holder_reg); + Push(holder_reg); movp(holder_reg, FieldOperand(holder_reg, JSGlobalProxy::kNativeContextOffset)); CompareRoot(holder_reg, Heap::kNullValueRootIndex); @@ -3887,7 +3966,7 @@ void MacroAssembler::CheckAccessGlobalProxy(Register holder_reg, movp(holder_reg, FieldOperand(holder_reg, HeapObject::kMapOffset)); CompareRoot(holder_reg, Heap::kNativeContextMapRootIndex); Check(equal, kJSGlobalObjectNativeContextShouldBeANativeContext); - pop(holder_reg); + Pop(holder_reg); } movp(kScratchRegister, @@ -4603,13 +4682,13 @@ void MacroAssembler::EmitSeqStringSetCharCheck(Register string, Abort(kNonObject); bind(&is_object); - push(value); + Push(value); movp(value, FieldOperand(string, HeapObject::kMapOffset)); movzxbq(value, FieldOperand(value, Map::kInstanceTypeOffset)); andb(value, Immediate(kStringRepresentationMask | kStringEncodingMask)); cmpq(value, Immediate(encoding_mask)); - pop(value); + Pop(value); Check(equal, kUnexpectedStringType); // The index is assumed to be untagged coming in, tag it to compare with the @@ -4829,14 +4908,14 @@ void MacroAssembler::EnsureNotWhite( if (emit_debug_code()) { // Check for impossible bit pattern. Label ok; - push(mask_scratch); + Push(mask_scratch); // shl. May overflow making the check conservative. addq(mask_scratch, mask_scratch); testq(Operand(bitmap_scratch, MemoryChunk::kHeaderSize), mask_scratch); j(zero, &ok, Label::kNear); int3(); bind(&ok); - pop(mask_scratch); + Pop(mask_scratch); } // Value is white. We check whether it is data that doesn't need scanning. diff --git a/src/x64/macro-assembler-x64.h b/src/x64/macro-assembler-x64.h index d5a028c..fe709c9 100644 --- a/src/x64/macro-assembler-x64.h +++ b/src/x64/macro-assembler-x64.h @@ -837,10 +837,14 @@ class MacroAssembler: public Assembler { void Drop(int stack_elements); void Call(Label* target) { call(target); } - void Push(Register src) { push(src); } - void Pop(Register dst) { pop(dst); } - void PushReturnAddressFrom(Register src) { push(src); } - void PopReturnAddressTo(Register dst) { pop(dst); } + void Push(Register src); + void Push(const Operand& src); + void Push(Immediate value); + void PushImm32(int32_t imm32); + void Pop(Register dst); + void Pop(const Operand& dst); + void PushReturnAddressFrom(Register src) { pushq(src); } + void PopReturnAddressTo(Register dst) { popq(dst); } void Move(Register dst, ExternalReference ext) { movp(dst, reinterpret_cast
(ext.address()), RelocInfo::EXTERNAL_REFERENCE); @@ -1608,9 +1612,9 @@ extern void LogGeneratedCodeCoverage(const char* file_line); Address x64_coverage_function = FUNCTION_ADDR(LogGeneratedCodeCoverage); \ masm->pushfq(); \ masm->Pushad(); \ - masm->push(Immediate(reinterpret_cast(&__FILE_LINE__))); \ + masm->Push(Immediate(reinterpret_cast(&__FILE_LINE__))); \ masm->Call(x64_coverage_function, RelocInfo::EXTERNAL_REFERENCE); \ - masm->pop(rax); \ + masm->Pop(rax); \ masm->Popad(); \ masm->popfq(); \ } \ diff --git a/src/x64/regexp-macro-assembler-x64.cc b/src/x64/regexp-macro-assembler-x64.cc index 75e70c5..208bb60 100644 --- a/src/x64/regexp-macro-assembler-x64.cc +++ b/src/x64/regexp-macro-assembler-x64.cc @@ -322,10 +322,10 @@ void RegExpMacroAssemblerX64::CheckNotBackReferenceIgnoreCase( // Save important/volatile registers before calling C function. #ifndef _WIN64 // Caller save on Linux and callee save in Windows. - __ push(rsi); - __ push(rdi); + __ pushq(rsi); + __ pushq(rdi); #endif - __ push(backtrack_stackpointer()); + __ pushq(backtrack_stackpointer()); static const int num_arguments = 4; __ PrepareCallCFunction(num_arguments); @@ -367,10 +367,10 @@ void RegExpMacroAssemblerX64::CheckNotBackReferenceIgnoreCase( // Restore original values before reacting on result value. __ Move(code_object_pointer(), masm_.CodeObject()); - __ pop(backtrack_stackpointer()); + __ popq(backtrack_stackpointer()); #ifndef _WIN64 - __ pop(rdi); - __ pop(rsi); + __ popq(rdi); + __ popq(rsi); #endif // Check if function returned non-zero for success or zero for failure. @@ -674,7 +674,7 @@ Handle RegExpMacroAssemblerX64::GetCode(Handle source) { FrameScope scope(&masm_, StackFrame::MANUAL); // Actually emit code to start a new stack frame. - __ push(rbp); + __ pushq(rbp); __ movp(rbp, rsp); // Save parameters and callee-save registers. Order here should correspond // to order of kBackup_ebx etc. @@ -686,9 +686,9 @@ Handle RegExpMacroAssemblerX64::GetCode(Handle source) { __ movq(Operand(rbp, kInputStart), r8); __ movq(Operand(rbp, kInputEnd), r9); // Callee-save on Win64. - __ push(rsi); - __ push(rdi); - __ push(rbx); + __ pushq(rsi); + __ pushq(rdi); + __ pushq(rbx); #else // GCC passes arguments in rdi, rsi, rdx, rcx, r8, r9 (and then on stack). // Push register parameters on stack for reference. @@ -698,18 +698,18 @@ Handle RegExpMacroAssemblerX64::GetCode(Handle source) { ASSERT_EQ(kInputEnd, -4 * kPointerSize); ASSERT_EQ(kRegisterOutput, -5 * kPointerSize); ASSERT_EQ(kNumOutputRegisters, -6 * kPointerSize); - __ push(rdi); - __ push(rsi); - __ push(rdx); - __ push(rcx); - __ push(r8); - __ push(r9); - - __ push(rbx); // Callee-save + __ pushq(rdi); + __ pushq(rsi); + __ pushq(rdx); + __ pushq(rcx); + __ pushq(r8); + __ pushq(r9); + + __ pushq(rbx); // Callee-save #endif - __ push(Immediate(0)); // Number of successful matches in a global regexp. - __ push(Immediate(0)); // Make room for "input start - 1" constant. + __ Push(Immediate(0)); // Number of successful matches in a global regexp. + __ Push(Immediate(0)); // Make room for "input start - 1" constant. // Check if we have space on the stack for registers. Label stack_limit_hit; @@ -897,9 +897,9 @@ Handle RegExpMacroAssemblerX64::GetCode(Handle source) { #ifdef _WIN64 // Restore callee save registers. __ lea(rsp, Operand(rbp, kLastCalleeSaveRegister)); - __ pop(rbx); - __ pop(rdi); - __ pop(rsi); + __ popq(rbx); + __ popq(rdi); + __ popq(rsi); // Stack now at rbp. #else // Restore callee save register. @@ -908,7 +908,7 @@ Handle RegExpMacroAssemblerX64::GetCode(Handle source) { __ movp(rsp, rbp); #endif // Exit function frame, restore previous one. - __ pop(rbp); + __ popq(rbp); __ ret(0); // Backtrack code (branch target for conditional backtracks). @@ -923,8 +923,8 @@ Handle RegExpMacroAssemblerX64::GetCode(Handle source) { if (check_preempt_label_.is_linked()) { SafeCallTarget(&check_preempt_label_); - __ push(backtrack_stackpointer()); - __ push(rdi); + __ pushq(backtrack_stackpointer()); + __ pushq(rdi); CallCheckStackGuardState(); __ testq(rax, rax); @@ -934,8 +934,8 @@ Handle RegExpMacroAssemblerX64::GetCode(Handle source) { // Restore registers. __ Move(code_object_pointer(), masm_.CodeObject()); - __ pop(rdi); - __ pop(backtrack_stackpointer()); + __ popq(rdi); + __ popq(backtrack_stackpointer()); // String might have moved: Reload esi from frame. __ movp(rsi, Operand(rbp, kInputEnd)); SafeReturn(); @@ -950,8 +950,8 @@ Handle RegExpMacroAssemblerX64::GetCode(Handle source) { // Save registers before calling C function #ifndef _WIN64 // Callee-save in Microsoft 64-bit ABI, but not in AMD64 ABI. - __ push(rsi); - __ push(rdi); + __ pushq(rsi); + __ pushq(rdi); #endif // Call GrowStack(backtrack_stackpointer()) @@ -980,8 +980,8 @@ Handle RegExpMacroAssemblerX64::GetCode(Handle source) { // Restore saved registers and continue. __ Move(code_object_pointer(), masm_.CodeObject()); #ifndef _WIN64 - __ pop(rdi); - __ pop(rsi); + __ popq(rdi); + __ popq(rsi); #endif SafeReturn(); } diff --git a/src/x64/stub-cache-x64.cc b/src/x64/stub-cache-x64.cc index 6463a37..f783637 100644 --- a/src/x64/stub-cache-x64.cc +++ b/src/x64/stub-cache-x64.cc @@ -49,10 +49,12 @@ static void ProbeTable(Isolate* isolate, // The offset is scaled by 4, based on // kHeapObjectTagSize, which is two bits Register offset) { - // We need to scale up the pointer by 2 because the offset is scaled by less + // We need to scale up the pointer by 2 when the offset is scaled by less // than the pointer size. - ASSERT(kPointerSizeLog2 == kHeapObjectTagSize + 1); - ScaleFactor scale_factor = times_2; + ASSERT(kPointerSize == kInt64Size + ? kPointerSizeLog2 == kHeapObjectTagSize + 1 + : kPointerSizeLog2 == kHeapObjectTagSize); + ScaleFactor scale_factor = kPointerSize == kInt64Size ? times_2 : times_1; ASSERT_EQ(3 * kPointerSize, sizeof(StubCache::Entry)); // The offset register holds the entry offset times four (due to masking @@ -320,13 +322,13 @@ static void PushInterceptorArguments(MacroAssembler* masm, STATIC_ASSERT(StubCache::kInterceptorArgsThisIndex == 2); STATIC_ASSERT(StubCache::kInterceptorArgsHolderIndex == 3); STATIC_ASSERT(StubCache::kInterceptorArgsLength == 4); - __ push(name); + __ Push(name); Handle interceptor(holder_obj->GetNamedInterceptor()); ASSERT(!masm->isolate()->heap()->InNewSpace(*interceptor)); __ Move(kScratchRegister, interceptor); - __ push(kScratchRegister); - __ push(receiver); - __ push(holder); + __ Push(kScratchRegister); + __ Push(receiver); + __ Push(holder); } @@ -357,13 +359,13 @@ void StubCompiler::GenerateFastApiCall(MacroAssembler* masm, __ PopReturnAddressTo(scratch_in); // receiver - __ push(receiver); + __ Push(receiver); // Write the arguments to stack frame. for (int i = 0; i < argc; i++) { Register arg = values[argc-1-i]; ASSERT(!receiver.is(arg)); ASSERT(!scratch_in.is(arg)); - __ push(arg); + __ Push(arg); } __ PushReturnAddressFrom(scratch_in); // Stack now matches JSFunction abi. @@ -521,9 +523,9 @@ void StoreStubCompiler::GenerateStoreTransition(MacroAssembler* masm, // The properties must be extended before we can store the value. // We jump to a runtime call that extends the properties array. __ PopReturnAddressTo(scratch1); - __ push(receiver_reg); + __ Push(receiver_reg); __ Push(transition); - __ push(value_reg); + __ Push(value_reg); __ PushReturnAddressFrom(scratch1); __ TailCallExternalReference( ExternalReference(IC_Utility(IC::kSharedStoreIC_ExtendStorage), @@ -933,22 +935,22 @@ void LoadStubCompiler::GenerateLoadCallback( STATIC_ASSERT(PropertyCallbackArguments::kDataIndex == 4); STATIC_ASSERT(PropertyCallbackArguments::kThisIndex == 5); STATIC_ASSERT(PropertyCallbackArguments::kArgsLength == 6); - __ push(receiver()); // receiver + __ Push(receiver()); // receiver if (heap()->InNewSpace(callback->data())) { ASSERT(!scratch2().is(reg)); __ Move(scratch2(), callback); - __ push(FieldOperand(scratch2(), + __ Push(FieldOperand(scratch2(), ExecutableAccessorInfo::kDataOffset)); // data } else { __ Push(Handle(callback->data(), isolate())); } ASSERT(!kScratchRegister.is(reg)); __ LoadRoot(kScratchRegister, Heap::kUndefinedValueRootIndex); - __ push(kScratchRegister); // return value - __ push(kScratchRegister); // return value default + __ Push(kScratchRegister); // return value + __ Push(kScratchRegister); // return value default __ PushAddress(ExternalReference::isolate_address(isolate())); - __ push(reg); // holder - __ push(name()); // name + __ Push(reg); // holder + __ Push(name()); // name // Save a pointer to where we pushed the arguments pointer. This will be // passed as the const PropertyAccessorInfo& to the C++ callback. @@ -1016,10 +1018,10 @@ void LoadStubCompiler::GenerateLoadInterceptor( FrameScope frame_scope(masm(), StackFrame::INTERNAL); if (must_preserve_receiver_reg) { - __ push(receiver()); + __ Push(receiver()); } - __ push(holder_reg); - __ push(this->name()); + __ Push(holder_reg); + __ Push(this->name()); // Invoke an interceptor. Note: map checks from receiver to // interceptor's holder has been compiled before (see a caller @@ -1037,10 +1039,10 @@ void LoadStubCompiler::GenerateLoadInterceptor( __ ret(0); __ bind(&interceptor_failed); - __ pop(this->name()); - __ pop(holder_reg); + __ Pop(this->name()); + __ Pop(holder_reg); if (must_preserve_receiver_reg) { - __ pop(receiver()); + __ Pop(receiver()); } // Leave the internal frame. @@ -1082,11 +1084,11 @@ Handle StoreStubCompiler::CompileStoreCallback( IC::CurrentTypeOf(object, isolate()), receiver(), holder, name); __ PopReturnAddressTo(scratch1()); - __ push(receiver()); - __ push(holder_reg); + __ Push(receiver()); + __ Push(holder_reg); __ Push(callback); // callback info __ Push(name); - __ push(value()); + __ Push(value()); __ PushReturnAddressFrom(scratch1()); // Do tail-call to the runtime system. @@ -1115,7 +1117,7 @@ void StoreStubCompiler::GenerateStoreViaSetter( FrameScope scope(masm, StackFrame::INTERNAL); // Save value register, so we can restore it later. - __ push(value()); + __ Push(value()); if (!setter.is_null()) { // Call the JavaScript setter with receiver and value on the stack. @@ -1124,8 +1126,8 @@ void StoreStubCompiler::GenerateStoreViaSetter( __ movp(receiver, FieldOperand(receiver, JSGlobalObject::kGlobalReceiverOffset)); } - __ push(receiver); - __ push(value()); + __ Push(receiver); + __ Push(value()); ParameterCount actual(1); ParameterCount expected(setter); __ InvokeFunction(setter, expected, actual, @@ -1137,7 +1139,7 @@ void StoreStubCompiler::GenerateStoreViaSetter( } // We have to return the passed value, not the return value of the setter. - __ pop(rax); + __ Pop(rax); // Restore context register. __ movp(rsi, Operand(rbp, StandardFrameConstants::kContextOffset)); @@ -1154,9 +1156,9 @@ Handle StoreStubCompiler::CompileStoreInterceptor( Handle object, Handle name) { __ PopReturnAddressTo(scratch1()); - __ push(receiver()); - __ push(this->name()); - __ push(value()); + __ Push(receiver()); + __ Push(this->name()); + __ Push(value()); __ PushReturnAddressFrom(scratch1()); // Do tail-call to the runtime system. @@ -1172,8 +1174,8 @@ Handle StoreStubCompiler::CompileStoreInterceptor( void StoreStubCompiler::GenerateStoreArrayLength() { // Prepare tail call to StoreIC_ArrayLength. __ PopReturnAddressTo(scratch1()); - __ push(receiver()); - __ push(value()); + __ Push(receiver()); + __ Push(value()); __ PushReturnAddressFrom(scratch1()); ExternalReference ref = @@ -1289,7 +1291,7 @@ void LoadStubCompiler::GenerateLoadViaGetter(MacroAssembler* masm, __ movp(receiver, FieldOperand(receiver, JSGlobalObject::kGlobalReceiverOffset)); } - __ push(receiver); + __ Push(receiver); ParameterCount actual(0); ParameterCount expected(getter); __ InvokeFunction(getter, expected, actual, diff --git a/test/cctest/test-assembler-x64.cc b/test/cctest/test-assembler-x64.cc index 4fa5ffe..a46770d 100644 --- a/test/cctest/test-assembler-x64.cc +++ b/test/cctest/test-assembler-x64.cc @@ -99,15 +99,15 @@ TEST(AssemblerX64StackOperations) { // Assemble a simple function that copies argument 2 and returns it. // We compile without stack frame pointers, so the gdb debugger shows // incorrect stack frames when debugging this function (which has them). - __ push(rbp); + __ pushq(rbp); __ movq(rbp, rsp); - __ push(arg2); // Value at (rbp - 8) - __ push(arg2); // Value at (rbp - 16) - __ push(arg1); // Value at (rbp - 24) - __ pop(rax); - __ pop(rax); - __ pop(rax); - __ pop(rbp); + __ pushq(arg2); // Value at (rbp - 8) + __ pushq(arg2); // Value at (rbp - 16) + __ pushq(arg1); // Value at (rbp - 24) + __ popq(rax); + __ popq(rax); + __ popq(rax); + __ popq(rbp); __ nop(); __ ret(0); @@ -330,19 +330,19 @@ TEST(AssemblerX64MemoryOperands) { Assembler assm(CcTest::i_isolate(), buffer, static_cast(actual_size)); // Assemble a simple function that copies argument 2 and returns it. - __ push(rbp); + __ pushq(rbp); __ movq(rbp, rsp); - __ push(arg2); // Value at (rbp - 8) - __ push(arg2); // Value at (rbp - 16) - __ push(arg1); // Value at (rbp - 24) + __ pushq(arg2); // Value at (rbp - 8) + __ pushq(arg2); // Value at (rbp - 16) + __ pushq(arg1); // Value at (rbp - 24) const int kStackElementSize = 8; __ movq(rax, Operand(rbp, -3 * kStackElementSize)); - __ pop(arg2); - __ pop(arg2); - __ pop(arg2); - __ pop(rbp); + __ popq(arg2); + __ popq(arg2); + __ popq(arg2); + __ popq(rbp); __ nop(); __ ret(0); @@ -364,7 +364,7 @@ TEST(AssemblerX64ControlFlow) { Assembler assm(CcTest::i_isolate(), buffer, static_cast(actual_size)); // Assemble a simple function that copies argument 1 and returns it. - __ push(rbp); + __ pushq(rbp); __ movq(rbp, rsp); __ movq(rax, arg1); @@ -372,7 +372,7 @@ TEST(AssemblerX64ControlFlow) { __ jmp(&target); __ movq(rax, arg2); __ bind(&target); - __ pop(rbp); + __ popq(rbp); __ ret(0); CodeDesc desc; @@ -496,11 +496,11 @@ TEST(AssemblerMultiByteNop) { byte buffer[1024]; Isolate* isolate = CcTest::i_isolate(); Assembler assm(isolate, buffer, sizeof(buffer)); - __ push(rbx); - __ push(rcx); - __ push(rdx); - __ push(rdi); - __ push(rsi); + __ pushq(rbx); + __ pushq(rcx); + __ pushq(rdx); + __ pushq(rdi); + __ pushq(rsi); __ movq(rax, Immediate(1)); __ movq(rbx, Immediate(2)); __ movq(rcx, Immediate(3)); @@ -527,19 +527,19 @@ TEST(AssemblerMultiByteNop) { __ cmpq(rsi, Immediate(6)); __ j(not_equal, &fail); __ movq(rax, Immediate(42)); - __ pop(rsi); - __ pop(rdi); - __ pop(rdx); - __ pop(rcx); - __ pop(rbx); + __ popq(rsi); + __ popq(rdi); + __ popq(rdx); + __ popq(rcx); + __ popq(rbx); __ ret(0); __ bind(&fail); __ movq(rax, Immediate(13)); - __ pop(rsi); - __ pop(rdi); - __ pop(rdx); - __ pop(rcx); - __ pop(rbx); + __ popq(rsi); + __ popq(rdi); + __ popq(rdx); + __ popq(rcx); + __ popq(rbx); __ ret(0); CodeDesc desc; @@ -571,14 +571,14 @@ void DoSSE2(const v8::FunctionCallbackInfo& args) { Assembler assm(isolate, buffer, sizeof(buffer)); // Remove return address from the stack for fix stack frame alignment. - __ pop(rcx); + __ popq(rcx); // Store input vector on the stack. for (int i = 0; i < ELEMENT_COUNT; i++) { __ movl(rax, Immediate(vec->Get(i)->Int32Value())); __ shl(rax, Immediate(0x20)); __ or_(rax, Immediate(vec->Get(++i)->Int32Value())); - __ push(rax); + __ pushq(rax); } // Read vector into a xmm register. @@ -590,7 +590,7 @@ void DoSSE2(const v8::FunctionCallbackInfo& args) { // Remove unused data from the stack. __ addq(rsp, Immediate(ELEMENT_COUNT * sizeof(int32_t))); // Restore return address. - __ push(rcx); + __ pushq(rcx); __ ret(0); diff --git a/test/cctest/test-code-stubs-x64.cc b/test/cctest/test-code-stubs-x64.cc index 6b3a12c..05fd543 100644 --- a/test/cctest/test-code-stubs-x64.cc +++ b/test/cctest/test-code-stubs-x64.cc @@ -57,11 +57,11 @@ ConvertDToIFunc MakeConvertDToIFuncTrampoline(Isolate* isolate, DoubleToIStub stub(source_reg, destination_reg, offset, true); byte* start = stub.GetCode(isolate)->instruction_start(); - __ push(rbx); - __ push(rcx); - __ push(rdx); - __ push(rsi); - __ push(rdi); + __ pushq(rbx); + __ pushq(rcx); + __ pushq(rdx); + __ pushq(rsi); + __ pushq(rdi); if (!source_reg.is(rsp)) { // The argument we pass to the stub is not a heap number, but instead @@ -78,7 +78,7 @@ ConvertDToIFunc MakeConvertDToIFuncTrampoline(Isolate* isolate, for (;reg_num < Register::NumAllocatableRegisters(); ++reg_num) { Register reg = Register::FromAllocationIndex(reg_num); if (!reg.is(rsp) && !reg.is(rbp) && !reg.is(destination_reg)) { - __ push(reg); + __ pushq(reg); } } @@ -103,11 +103,11 @@ ConvertDToIFunc MakeConvertDToIFuncTrampoline(Isolate* isolate, __ movq(rax, destination_reg); - __ pop(rdi); - __ pop(rsi); - __ pop(rdx); - __ pop(rcx); - __ pop(rbx); + __ popq(rdi); + __ popq(rsi); + __ popq(rdx); + __ popq(rcx); + __ popq(rbx); __ ret(0); diff --git a/test/cctest/test-disasm-x64.cc b/test/cctest/test-disasm-x64.cc index a1f2e4e..ca843c6 100644 --- a/test/cctest/test-disasm-x64.cc +++ b/test/cctest/test-disasm-x64.cc @@ -118,17 +118,17 @@ TEST(DisasmX64) { __ bts(Operand(rdx, 0), rcx); __ bts(Operand(rbx, rcx, times_4, 0), rcx); __ nop(); - __ push(Immediate(12)); - __ push(Immediate(23456)); - __ push(rcx); - __ push(rsi); - __ push(Operand(rbp, JavaScriptFrameConstants::kFunctionOffset)); - __ push(Operand(rbx, rcx, times_4, 0)); - __ push(Operand(rbx, rcx, times_4, 0)); - __ push(Operand(rbx, rcx, times_4, 10000)); - __ pop(rdx); - __ pop(rax); - __ pop(Operand(rbx, rcx, times_4, 0)); + __ pushq(Immediate(12)); + __ pushq(Immediate(23456)); + __ pushq(rcx); + __ pushq(rsi); + __ pushq(Operand(rbp, JavaScriptFrameConstants::kFunctionOffset)); + __ pushq(Operand(rbx, rcx, times_4, 0)); + __ pushq(Operand(rbx, rcx, times_4, 0)); + __ pushq(Operand(rbx, rcx, times_4, 10000)); + __ popq(rdx); + __ popq(rax); + __ popq(Operand(rbx, rcx, times_4, 0)); __ nop(); __ addq(rdx, Operand(rsp, 16)); @@ -168,8 +168,8 @@ TEST(DisasmX64) { __ incq(rdx); __ incq(Operand(rbx, rcx, times_4, 10000)); - __ push(Operand(rbx, rcx, times_4, 10000)); - __ pop(Operand(rbx, rcx, times_4, 10000)); + __ pushq(Operand(rbx, rcx, times_4, 10000)); + __ popq(Operand(rbx, rcx, times_4, 10000)); // TODO(mstarzinger): The following is protected. // __ jmp(Operand(rbx, rcx, times_4, 10000)); diff --git a/test/cctest/test-hashing.cc b/test/cctest/test-hashing.cc index a29d3d1..870df47 100644 --- a/test/cctest/test-hashing.cc +++ b/test/cctest/test-hashing.cc @@ -66,21 +66,21 @@ void generate(MacroAssembler* masm, i::Vector string) { __ pop(ebx); __ Ret(); #elif V8_TARGET_ARCH_X64 - __ push(kRootRegister); + __ pushq(kRootRegister); __ InitializeRootRegister(); - __ push(rbx); - __ push(rcx); - __ movq(rax, Immediate(0)); - __ movq(rbx, Immediate(string.at(0))); + __ pushq(rbx); + __ pushq(rcx); + __ movp(rax, Immediate(0)); + __ movp(rbx, Immediate(string.at(0))); StringHelper::GenerateHashInit(masm, rax, rbx, rcx); for (int i = 1; i < string.length(); i++) { - __ movq(rbx, Immediate(string.at(i))); + __ movp(rbx, Immediate(string.at(i))); StringHelper::GenerateHashAddCharacter(masm, rax, rbx, rcx); } StringHelper::GenerateHashGetHash(masm, rax, rcx); - __ pop(rcx); - __ pop(rbx); - __ pop(kRootRegister); + __ popq(rcx); + __ popq(rbx); + __ popq(kRootRegister); __ Ret(); #elif V8_TARGET_ARCH_ARM __ push(kRootRegister); @@ -143,13 +143,13 @@ void generate(MacroAssembler* masm, uint32_t key) { __ pop(ebx); __ Ret(); #elif V8_TARGET_ARCH_X64 - __ push(kRootRegister); + __ pushq(kRootRegister); __ InitializeRootRegister(); - __ push(rbx); - __ movq(rax, Immediate(key)); + __ pushq(rbx); + __ movp(rax, Immediate(key)); __ GetNumberHash(rax, rbx); - __ pop(rbx); - __ pop(kRootRegister); + __ popq(rbx); + __ popq(kRootRegister); __ Ret(); #elif V8_TARGET_ARCH_ARM __ push(kRootRegister); diff --git a/test/cctest/test-macro-assembler-x64.cc b/test/cctest/test-macro-assembler-x64.cc index 3daed5b..e265760 100644 --- a/test/cctest/test-macro-assembler-x64.cc +++ b/test/cctest/test-macro-assembler-x64.cc @@ -99,8 +99,8 @@ typedef int (*F0)(); static void EntryCode(MacroAssembler* masm) { // Smi constant register is callee save. - __ push(i::kSmiConstantRegister); - __ push(i::kRootRegister); + __ pushq(i::kSmiConstantRegister); + __ pushq(i::kRootRegister); __ InitializeSmiConstantRegister(); __ InitializeRootRegister(); } @@ -112,8 +112,8 @@ static void ExitCode(MacroAssembler* masm) { __ cmpq(rdx, i::kSmiConstantRegister); __ movq(rdx, Immediate(-1)); __ cmovq(not_equal, rax, rdx); - __ pop(i::kRootRegister); - __ pop(i::kSmiConstantRegister); + __ popq(i::kRootRegister); + __ popq(i::kSmiConstantRegister); } @@ -1360,8 +1360,8 @@ TEST(SmiDiv) { EntryCode(masm); Label exit; - __ push(r14); - __ push(r15); + __ pushq(r14); + __ pushq(r15); TestSmiDiv(masm, &exit, 0x10, 1, 1); TestSmiDiv(masm, &exit, 0x20, 1, 0); TestSmiDiv(masm, &exit, 0x30, -1, 0); @@ -1386,8 +1386,8 @@ TEST(SmiDiv) { __ xor_(r15, r15); // Success. __ bind(&exit); __ movq(rax, r15); - __ pop(r15); - __ pop(r14); + __ popq(r15); + __ popq(r14); ExitCode(masm); __ ret(0); @@ -1470,8 +1470,8 @@ TEST(SmiMod) { EntryCode(masm); Label exit; - __ push(r14); - __ push(r15); + __ pushq(r14); + __ pushq(r15); TestSmiMod(masm, &exit, 0x10, 1, 1); TestSmiMod(masm, &exit, 0x20, 1, 0); TestSmiMod(masm, &exit, 0x30, -1, 0); @@ -1496,8 +1496,8 @@ TEST(SmiMod) { __ xor_(r15, r15); // Success. __ bind(&exit); __ movq(rax, r15); - __ pop(r15); - __ pop(r14); + __ popq(r15); + __ popq(r14); ExitCode(masm); __ ret(0); @@ -2324,21 +2324,21 @@ TEST(OperandOffset) { Label exit; EntryCode(masm); - __ push(r13); - __ push(r14); - __ push(rbx); - __ push(rbp); - __ push(Immediate(0x100)); // <-- rbp + __ pushq(r13); + __ pushq(r14); + __ pushq(rbx); + __ pushq(rbp); + __ pushq(Immediate(0x100)); // <-- rbp __ movq(rbp, rsp); - __ push(Immediate(0x101)); - __ push(Immediate(0x102)); - __ push(Immediate(0x103)); - __ push(Immediate(0x104)); - __ push(Immediate(0x105)); // <-- rbx - __ push(Immediate(0x106)); - __ push(Immediate(0x107)); - __ push(Immediate(0x108)); - __ push(Immediate(0x109)); // <-- rsp + __ pushq(Immediate(0x101)); + __ pushq(Immediate(0x102)); + __ pushq(Immediate(0x103)); + __ pushq(Immediate(0x104)); + __ pushq(Immediate(0x105)); // <-- rbx + __ pushq(Immediate(0x106)); + __ pushq(Immediate(0x107)); + __ pushq(Immediate(0x108)); + __ pushq(Immediate(0x109)); // <-- rsp // rbp = rsp[9] // r15 = rsp[3] // rbx = rsp[5] @@ -2644,10 +2644,10 @@ TEST(OperandOffset) { __ movl(rax, Immediate(0)); __ bind(&exit); __ lea(rsp, Operand(rbp, kPointerSize)); - __ pop(rbp); - __ pop(rbx); - __ pop(r14); - __ pop(r13); + __ popq(rbp); + __ popq(rbx); + __ popq(r14); + __ popq(r13); ExitCode(masm); __ ret(0);