From d3c6c4ce0c8dbab03204f79db3f4e36ee8abfe11 Mon Sep 17 00:00:00 2001 From: "haitao.feng@intel.com" Date: Thu, 7 Nov 2013 02:08:53 +0000 Subject: [PATCH] Move movq(Register, ExternalReference) into X64 MacroAssembler R=danno@chromium.org Review URL: https://codereview.chromium.org/43333003 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@17537 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/x64/assembler-x64.cc | 6 ------ src/x64/assembler-x64.h | 2 -- src/x64/builtins-x64.cc | 7 +++---- src/x64/code-stubs-x64.cc | 14 +++++++------- src/x64/codegen-x64.cc | 6 +++--- src/x64/debug-x64.cc | 6 +++--- src/x64/lithium-codegen-x64.cc | 2 +- src/x64/macro-assembler-x64.cc | 20 ++++++++++---------- src/x64/macro-assembler-x64.h | 6 +++++- src/x64/regexp-macro-assembler-x64.cc | 6 +++--- src/x64/stub-cache-x64.cc | 2 +- 11 files changed, 36 insertions(+), 41 deletions(-) diff --git a/src/x64/assembler-x64.cc b/src/x64/assembler-x64.cc index a7fd880..eb1fa2b 100644 --- a/src/x64/assembler-x64.cc +++ b/src/x64/assembler-x64.cc @@ -1501,12 +1501,6 @@ void Assembler::movq(Register dst, int64_t value, RelocInfo::Mode rmode) { } -void Assembler::movq(Register dst, ExternalReference ref) { - Address value = reinterpret_cast
(ref.address()); - movq(dst, value, RelocInfo::EXTERNAL_REFERENCE); -} - - void Assembler::movq(const Operand& dst, Immediate value) { EnsureSpace ensure_space(this); emit_rex_64(dst); diff --git a/src/x64/assembler-x64.h b/src/x64/assembler-x64.h index 4204a8c..dddb55b 100644 --- a/src/x64/assembler-x64.h +++ b/src/x64/assembler-x64.h @@ -725,8 +725,6 @@ class Assembler : public AssemblerBase { // All 64-bit immediates must have a relocation mode. void movq(Register dst, void* ptr, RelocInfo::Mode rmode); void movq(Register dst, int64_t value, RelocInfo::Mode rmode); - // Moves the address of the external reference into the register. - void movq(Register dst, ExternalReference ext); void movq(Register dst, Handle handle, RelocInfo::Mode rmode); void movsxbq(Register dst, const Operand& src); diff --git a/src/x64/builtins-x64.cc b/src/x64/builtins-x64.cc index f65b25c..30cd314 100644 --- a/src/x64/builtins-x64.cc +++ b/src/x64/builtins-x64.cc @@ -158,7 +158,7 @@ static void Generate_JSConstructStubHelper(MacroAssembler* masm, #ifdef ENABLE_DEBUGGER_SUPPORT ExternalReference debug_step_in_fp = ExternalReference::debug_step_in_fp_address(masm->isolate()); - __ movq(kScratchRegister, debug_step_in_fp); + __ Move(kScratchRegister, debug_step_in_fp); __ cmpq(Operand(kScratchRegister, 0), Immediate(0)); __ j(not_equal, &rt_call); #endif @@ -600,8 +600,7 @@ static void GenerateMakeCodeYoungAgainCommon(MacroAssembler* masm) { // the stub returns. __ subq(Operand(rsp, 0), Immediate(5)); __ Pushad(); - __ movq(arg_reg_2, - ExternalReference::isolate_address(masm->isolate())); + __ Move(arg_reg_2, ExternalReference::isolate_address(masm->isolate())); __ movq(arg_reg_1, Operand(rsp, kNumSafepointRegisters * kPointerSize)); { // NOLINT FrameScope scope(masm, StackFrame::MANUAL); @@ -633,7 +632,7 @@ void Builtins::Generate_MarkCodeAsExecutedOnce(MacroAssembler* masm) { // save/restore the registers without worrying about which of them contain // pointers. __ Pushad(); - __ movq(arg_reg_2, ExternalReference::isolate_address(masm->isolate())); + __ Move(arg_reg_2, ExternalReference::isolate_address(masm->isolate())); __ movq(arg_reg_1, Operand(rsp, kNumSafepointRegisters * kPointerSize)); __ subq(arg_reg_1, Immediate(Assembler::kShortCallInstructionLength)); { // NOLINT diff --git a/src/x64/code-stubs-x64.cc b/src/x64/code-stubs-x64.cc index 93bc2b9..062fa81 100644 --- a/src/x64/code-stubs-x64.cc +++ b/src/x64/code-stubs-x64.cc @@ -631,7 +631,7 @@ void TranscendentalCacheStub::Generate(MacroAssembler* masm) { // rcx = TranscendentalCache::hash(double value). ExternalReference cache_array = ExternalReference::transcendental_cache_array_address(masm->isolate()); - __ movq(rax, cache_array); + __ Move(rax, cache_array); int cache_array_index = type_ * sizeof(masm->isolate()->transcendental_cache()->caches_[0]); __ movq(rax, Operand(rax, cache_array_index)); @@ -1873,9 +1873,9 @@ void RegExpExecStub::Generate(MacroAssembler* masm) { Immediate(1)); // Argument 7: Start (high end) of backtracking stack memory area. - __ movq(kScratchRegister, address_of_regexp_stack_memory_address); + __ Move(kScratchRegister, address_of_regexp_stack_memory_address); __ movq(r9, Operand(kScratchRegister, 0)); - __ movq(kScratchRegister, address_of_regexp_stack_memory_size); + __ Move(kScratchRegister, address_of_regexp_stack_memory_size); __ addq(r9, Operand(kScratchRegister, 0)); __ movq(Operand(rsp, (argument_slots_on_stack - 3) * kPointerSize), r9); @@ -2810,9 +2810,9 @@ void CEntryStub::GenerateCore(MacroAssembler* masm, // PerformGC. No need to use PrepareCallCFunction/CallCFunction here as the // stack is known to be aligned. This function takes one argument which is // passed in register. - __ movq(arg_reg_2, ExternalReference::isolate_address(masm->isolate())); + __ Move(arg_reg_2, ExternalReference::isolate_address(masm->isolate())); __ movq(arg_reg_1, rax); - __ movq(kScratchRegister, + __ Move(kScratchRegister, ExternalReference::perform_gc_function(masm->isolate())); __ call(kScratchRegister); } @@ -2849,7 +2849,7 @@ void CEntryStub::GenerateCore(MacroAssembler* masm, // GCC passes arguments in rdi, rsi, rdx, rcx, r8, r9. __ movq(rdi, r14); // argc. __ movq(rsi, r15); // argv. - __ movq(rdx, ExternalReference::isolate_address(masm->isolate())); + __ Move(rdx, ExternalReference::isolate_address(masm->isolate())); #endif __ call(rbx); // Result is in rax - do not destroy this register! @@ -3139,7 +3139,7 @@ void JSEntryStub::GenerateBody(MacroAssembler* masm, bool is_construct) { __ pop(rbx); __ Cmp(rbx, Smi::FromInt(StackFrame::OUTERMOST_JSENTRY_FRAME)); __ j(not_equal, ¬_outermost_js_2); - __ movq(kScratchRegister, js_entry_sp); + __ Move(kScratchRegister, js_entry_sp); __ movq(Operand(kScratchRegister, 0), Immediate(0)); __ bind(¬_outermost_js_2); diff --git a/src/x64/codegen-x64.cc b/src/x64/codegen-x64.cc index 390ec7c..cb7ee12 100644 --- a/src/x64/codegen-x64.cc +++ b/src/x64/codegen-x64.cc @@ -635,7 +635,7 @@ void MathExpGenerator::EmitMathExp(MacroAssembler* masm, Label done; - __ movq(kScratchRegister, ExternalReference::math_exp_constants(0)); + __ Move(kScratchRegister, ExternalReference::math_exp_constants(0)); __ movsd(double_scratch, Operand(kScratchRegister, 0 * kDoubleSize)); __ xorpd(result, result); __ ucomisd(double_scratch, input); @@ -654,10 +654,10 @@ void MathExpGenerator::EmitMathExp(MacroAssembler* masm, __ and_(temp2, Immediate(0x7ff)); __ shr(temp1, Immediate(11)); __ mulsd(double_scratch, Operand(kScratchRegister, 5 * kDoubleSize)); - __ movq(kScratchRegister, ExternalReference::math_exp_log_table()); + __ Move(kScratchRegister, ExternalReference::math_exp_log_table()); __ shl(temp1, Immediate(52)); __ or_(temp1, Operand(kScratchRegister, temp2, times_8, 0)); - __ movq(kScratchRegister, ExternalReference::math_exp_constants(0)); + __ Move(kScratchRegister, ExternalReference::math_exp_constants(0)); __ subsd(double_scratch, input); __ movsd(input, double_scratch); __ subsd(result, double_scratch); diff --git a/src/x64/debug-x64.cc b/src/x64/debug-x64.cc index 6612242..5ddf69a 100644 --- a/src/x64/debug-x64.cc +++ b/src/x64/debug-x64.cc @@ -132,7 +132,7 @@ static void Generate_DebugBreakCallHelper(MacroAssembler* masm, __ RecordComment("// Calling from debug break to runtime - come in - over"); #endif __ Set(rax, 0); // No arguments (argc == 0). - __ movq(rbx, ExternalReference::debug_break(masm->isolate())); + __ Move(rbx, ExternalReference::debug_break(masm->isolate())); CEntryStub ceb(1); __ CallStub(&ceb); @@ -172,7 +172,7 @@ static void Generate_DebugBreakCallHelper(MacroAssembler* masm, // overwritten by the address of DebugBreakXXX. ExternalReference after_break_target = ExternalReference(Debug_Address::AfterBreakTarget(), masm->isolate()); - __ movq(kScratchRegister, after_break_target); + __ Move(kScratchRegister, after_break_target); __ jmp(Operand(kScratchRegister, 0)); } @@ -319,7 +319,7 @@ void Debug::GenerateFrameDropperLiveEdit(MacroAssembler* masm) { ExternalReference restarter_frame_function_slot = ExternalReference(Debug_Address::RestarterFrameFunctionPointer(), masm->isolate()); - __ movq(rax, restarter_frame_function_slot); + __ Move(rax, restarter_frame_function_slot); __ movq(Operand(rax, 0), Immediate(0)); // We do not know our frame height, but set rsp based on rbp. diff --git a/src/x64/lithium-codegen-x64.cc b/src/x64/lithium-codegen-x64.cc index 93eb616..b4a14e1 100644 --- a/src/x64/lithium-codegen-x64.cc +++ b/src/x64/lithium-codegen-x64.cc @@ -261,7 +261,7 @@ bool LCodeGen::GenerateJumpTable() { Comment(";;; jump table entry %d: deoptimization bailout %d.", i, id); } if (jump_table_[i].needs_frame) { - __ movq(kScratchRegister, ExternalReference::ForDeoptEntry(entry)); + __ Move(kScratchRegister, ExternalReference::ForDeoptEntry(entry)); if (needs_frame.is_bound()) { __ jmp(&needs_frame); } else { diff --git a/src/x64/macro-assembler-x64.cc b/src/x64/macro-assembler-x64.cc index d98c719..2cc4a87 100644 --- a/src/x64/macro-assembler-x64.cc +++ b/src/x64/macro-assembler-x64.cc @@ -80,7 +80,7 @@ Operand MacroAssembler::ExternalOperand(ExternalReference target, return Operand(kRootRegister, static_cast(delta)); } } - movq(scratch, target); + Move(scratch, target); return Operand(scratch, 0); } @@ -98,7 +98,7 @@ void MacroAssembler::Load(Register destination, ExternalReference source) { if (destination.is(rax)) { load_rax(source); } else { - movq(kScratchRegister, source); + Move(kScratchRegister, source); movq(destination, Operand(kScratchRegister, 0)); } } @@ -117,7 +117,7 @@ void MacroAssembler::Store(ExternalReference destination, Register source) { if (source.is(rax)) { store_rax(destination); } else { - movq(kScratchRegister, destination); + Move(kScratchRegister, destination); movq(Operand(kScratchRegister, 0), source); } } @@ -134,7 +134,7 @@ void MacroAssembler::LoadAddress(Register destination, } } // Safe code. - movq(destination, source); + Move(destination, source); } @@ -276,13 +276,13 @@ void MacroAssembler::InNewSpace(Register object, // case the size of the new space is different between the snapshot maker // and the running system. if (scratch.is(object)) { - movq(kScratchRegister, ExternalReference::new_space_mask(isolate())); + Move(kScratchRegister, ExternalReference::new_space_mask(isolate())); and_(scratch, kScratchRegister); } else { - movq(scratch, ExternalReference::new_space_mask(isolate())); + Move(scratch, ExternalReference::new_space_mask(isolate())); and_(scratch, object); } - movq(kScratchRegister, ExternalReference::new_space_start(isolate())); + Move(kScratchRegister, ExternalReference::new_space_start(isolate())); cmpq(scratch, kScratchRegister); j(cc, branch, distance); } else { @@ -710,7 +710,7 @@ void MacroAssembler::CallApiFunctionAndReturn( Register prev_next_address_reg = r14; Register prev_limit_reg = rbx; Register base_reg = r15; - movq(base_reg, next_address); + Move(base_reg, next_address); movq(prev_next_address_reg, Operand(base_reg, kNextOffset)); movq(prev_limit_reg, Operand(base_reg, kLimitOffset)); addl(Operand(base_reg, kLevelOffset), Immediate(1)); @@ -771,7 +771,7 @@ void MacroAssembler::CallApiFunctionAndReturn( bind(&leave_exit_frame); // Check if the function scheduled an exception. - movq(rsi, scheduled_exception_address); + Move(rsi, scheduled_exception_address); Cmp(Operand(rsi, 0), factory->the_hole_value()); j(not_equal, &promote_scheduled_exception); bind(&exception_handled); @@ -4927,7 +4927,7 @@ void MacroAssembler::TestJSArrayForAllocationMemento( lea(scratch_reg, Operand(receiver_reg, JSArray::kSize + AllocationMemento::kSize - kHeapObjectTag)); - movq(kScratchRegister, new_space_start); + Move(kScratchRegister, new_space_start); cmpq(scratch_reg, kScratchRegister); j(less, no_memento_found); cmpq(scratch_reg, ExternalOperand(new_space_allocation_top)); diff --git a/src/x64/macro-assembler-x64.h b/src/x64/macro-assembler-x64.h index c0b6afa..887b6d7 100644 --- a/src/x64/macro-assembler-x64.h +++ b/src/x64/macro-assembler-x64.h @@ -319,7 +319,7 @@ class MacroAssembler: public Assembler { void InitializeRootRegister() { ExternalReference roots_array_start = ExternalReference::roots_array_start(isolate()); - movq(kRootRegister, roots_array_start); + Move(kRootRegister, roots_array_start); addq(kRootRegister, Immediate(kRootRegisterBias)); } @@ -831,6 +831,10 @@ class MacroAssembler: public Assembler { void PopReturnAddressTo(Register dst) { pop(dst); } void MoveDouble(Register dst, const Operand& src) { movq(dst, src); } void MoveDouble(const Operand& dst, Register src) { movq(dst, src); } + void Move(Register dst, ExternalReference ext) { + movq(dst, reinterpret_cast
(ext.address()), + RelocInfo::EXTERNAL_REFERENCE); + } // Control Flow void Jump(Address destination, RelocInfo::Mode rmode); diff --git a/src/x64/regexp-macro-assembler-x64.cc b/src/x64/regexp-macro-assembler-x64.cc index ca834e2..3e65a68 100644 --- a/src/x64/regexp-macro-assembler-x64.cc +++ b/src/x64/regexp-macro-assembler-x64.cc @@ -618,7 +618,7 @@ bool RegExpMacroAssemblerX64::CheckSpecialCharacterClass(uc16 type, __ cmpl(current_character(), Immediate('z')); BranchOrBacktrack(above, on_no_match); } - __ movq(rbx, ExternalReference::re_word_character_map()); + __ Move(rbx, ExternalReference::re_word_character_map()); ASSERT_EQ(0, word_character_map[0]); // Character '\0' is not a word char. __ testb(Operand(rbx, current_character(), times_1, 0), current_character()); @@ -632,7 +632,7 @@ bool RegExpMacroAssemblerX64::CheckSpecialCharacterClass(uc16 type, __ cmpl(current_character(), Immediate('z')); __ j(above, &done); } - __ movq(rbx, ExternalReference::re_word_character_map()); + __ Move(rbx, ExternalReference::re_word_character_map()); ASSERT_EQ(0, word_character_map[0]); // Character '\0' is not a word char. __ testb(Operand(rbx, current_character(), times_1, 0), current_character()); @@ -718,7 +718,7 @@ Handle RegExpMacroAssemblerX64::GetCode(Handle source) { ExternalReference stack_limit = ExternalReference::address_of_stack_limit(isolate()); __ movq(rcx, rsp); - __ movq(kScratchRegister, stack_limit); + __ Move(kScratchRegister, stack_limit); __ subq(rcx, Operand(kScratchRegister, 0)); // Handle it if the stack pointer is already below the stack limit. __ j(below_equal, &stack_limit_hit); diff --git a/src/x64/stub-cache-x64.cc b/src/x64/stub-cache-x64.cc index 28e2a89..096b7a6 100644 --- a/src/x64/stub-cache-x64.cc +++ b/src/x64/stub-cache-x64.cc @@ -473,7 +473,7 @@ static void GenerateFastApiCall(MacroAssembler* masm, } else { __ Move(args.GetArgumentOperand(offset - FCA::kDataIndex), call_data); } - __ movq(kScratchRegister, + __ Move(kScratchRegister, ExternalReference::isolate_address(masm->isolate())); __ movq(args.GetArgumentOperand(offset - FCA::kIsolateIndex), kScratchRegister); -- 2.7.4