OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
156 } | 156 } |
157 // Size of movq(destination, src); | 157 // Size of movq(destination, src); |
158 return Assembler::kMoveAddressIntoScratchRegisterInstructionLength; | 158 return Assembler::kMoveAddressIntoScratchRegisterInstructionLength; |
159 } | 159 } |
160 | 160 |
161 | 161 |
162 void MacroAssembler::PushAddress(ExternalReference source) { | 162 void MacroAssembler::PushAddress(ExternalReference source) { |
163 int64_t address = reinterpret_cast<int64_t>(source.address()); | 163 int64_t address = reinterpret_cast<int64_t>(source.address()); |
164 if (is_int32(address) && !Serializer::enabled()) { | 164 if (is_int32(address) && !Serializer::enabled()) { |
165 if (emit_debug_code()) { | 165 if (emit_debug_code()) { |
166 movq(kScratchRegister, kZapValue, RelocInfo::NONE64); | 166 Move(kScratchRegister, kZapValue, RelocInfo::NONE64); |
167 } | 167 } |
168 push(Immediate(static_cast<int32_t>(address))); | 168 push(Immediate(static_cast<int32_t>(address))); |
169 return; | 169 return; |
170 } | 170 } |
171 LoadAddress(kScratchRegister, source); | 171 LoadAddress(kScratchRegister, source); |
172 push(kScratchRegister); | 172 push(kScratchRegister); |
173 } | 173 } |
174 | 174 |
175 | 175 |
176 void MacroAssembler::LoadRoot(Register destination, Heap::RootListIndex index) { | 176 void MacroAssembler::LoadRoot(Register destination, Heap::RootListIndex index) { |
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
281 Move(scratch, ExternalReference::new_space_mask(isolate())); | 281 Move(scratch, ExternalReference::new_space_mask(isolate())); |
282 and_(scratch, object); | 282 and_(scratch, object); |
283 } | 283 } |
284 Move(kScratchRegister, ExternalReference::new_space_start(isolate())); | 284 Move(kScratchRegister, ExternalReference::new_space_start(isolate())); |
285 cmpq(scratch, kScratchRegister); | 285 cmpq(scratch, kScratchRegister); |
286 j(cc, branch, distance); | 286 j(cc, branch, distance); |
287 } else { | 287 } else { |
288 ASSERT(is_int32(static_cast<int64_t>(isolate()->heap()->NewSpaceMask()))); | 288 ASSERT(is_int32(static_cast<int64_t>(isolate()->heap()->NewSpaceMask()))); |
289 intptr_t new_space_start = | 289 intptr_t new_space_start = |
290 reinterpret_cast<intptr_t>(isolate()->heap()->NewSpaceStart()); | 290 reinterpret_cast<intptr_t>(isolate()->heap()->NewSpaceStart()); |
291 movq(kScratchRegister, reinterpret_cast<Address>(-new_space_start), | 291 Move(kScratchRegister, reinterpret_cast<Address>(-new_space_start), |
292 RelocInfo::NONE64); | 292 RelocInfo::NONE64); |
293 if (scratch.is(object)) { | 293 if (scratch.is(object)) { |
294 addq(scratch, kScratchRegister); | 294 addq(scratch, kScratchRegister); |
295 } else { | 295 } else { |
296 lea(scratch, Operand(object, kScratchRegister, times_1, 0)); | 296 lea(scratch, Operand(object, kScratchRegister, times_1, 0)); |
297 } | 297 } |
298 and_(scratch, | 298 and_(scratch, |
299 Immediate(static_cast<int32_t>(isolate()->heap()->NewSpaceMask()))); | 299 Immediate(static_cast<int32_t>(isolate()->heap()->NewSpaceMask()))); |
300 j(cc, branch, distance); | 300 j(cc, branch, distance); |
301 } | 301 } |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
333 } | 333 } |
334 | 334 |
335 RecordWrite( | 335 RecordWrite( |
336 object, dst, value, save_fp, remembered_set_action, OMIT_SMI_CHECK); | 336 object, dst, value, save_fp, remembered_set_action, OMIT_SMI_CHECK); |
337 | 337 |
338 bind(&done); | 338 bind(&done); |
339 | 339 |
340 // Clobber clobbered input registers when running with the debug-code flag | 340 // Clobber clobbered input registers when running with the debug-code flag |
341 // turned on to provoke errors. | 341 // turned on to provoke errors. |
342 if (emit_debug_code()) { | 342 if (emit_debug_code()) { |
343 movq(value, kZapValue, RelocInfo::NONE64); | 343 Move(value, kZapValue, RelocInfo::NONE64); |
344 movq(dst, kZapValue, RelocInfo::NONE64); | 344 Move(dst, kZapValue, RelocInfo::NONE64); |
345 } | 345 } |
346 } | 346 } |
347 | 347 |
348 | 348 |
349 void MacroAssembler::RecordWriteArray(Register object, | 349 void MacroAssembler::RecordWriteArray(Register object, |
350 Register value, | 350 Register value, |
351 Register index, | 351 Register index, |
352 SaveFPRegsMode save_fp, | 352 SaveFPRegsMode save_fp, |
353 RememberedSetAction remembered_set_action, | 353 RememberedSetAction remembered_set_action, |
354 SmiCheck smi_check) { | 354 SmiCheck smi_check) { |
(...skipping 12 matching lines...) Expand all Loading... |
367 FixedArray::kHeaderSize - kHeapObjectTag)); | 367 FixedArray::kHeaderSize - kHeapObjectTag)); |
368 | 368 |
369 RecordWrite( | 369 RecordWrite( |
370 object, dst, value, save_fp, remembered_set_action, OMIT_SMI_CHECK); | 370 object, dst, value, save_fp, remembered_set_action, OMIT_SMI_CHECK); |
371 | 371 |
372 bind(&done); | 372 bind(&done); |
373 | 373 |
374 // Clobber clobbered input registers when running with the debug-code flag | 374 // Clobber clobbered input registers when running with the debug-code flag |
375 // turned on to provoke errors. | 375 // turned on to provoke errors. |
376 if (emit_debug_code()) { | 376 if (emit_debug_code()) { |
377 movq(value, kZapValue, RelocInfo::NONE64); | 377 Move(value, kZapValue, RelocInfo::NONE64); |
378 movq(index, kZapValue, RelocInfo::NONE64); | 378 Move(index, kZapValue, RelocInfo::NONE64); |
379 } | 379 } |
380 } | 380 } |
381 | 381 |
382 | 382 |
383 void MacroAssembler::RecordWrite(Register object, | 383 void MacroAssembler::RecordWrite(Register object, |
384 Register address, | 384 Register address, |
385 Register value, | 385 Register value, |
386 SaveFPRegsMode fp_mode, | 386 SaveFPRegsMode fp_mode, |
387 RememberedSetAction remembered_set_action, | 387 RememberedSetAction remembered_set_action, |
388 SmiCheck smi_check) { | 388 SmiCheck smi_check) { |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
432 Label::kNear); | 432 Label::kNear); |
433 | 433 |
434 RecordWriteStub stub(object, value, address, remembered_set_action, fp_mode); | 434 RecordWriteStub stub(object, value, address, remembered_set_action, fp_mode); |
435 CallStub(&stub); | 435 CallStub(&stub); |
436 | 436 |
437 bind(&done); | 437 bind(&done); |
438 | 438 |
439 // Clobber clobbered registers when running with the debug-code flag | 439 // Clobber clobbered registers when running with the debug-code flag |
440 // turned on to provoke errors. | 440 // turned on to provoke errors. |
441 if (emit_debug_code()) { | 441 if (emit_debug_code()) { |
442 movq(address, kZapValue, RelocInfo::NONE64); | 442 Move(address, kZapValue, RelocInfo::NONE64); |
443 movq(value, kZapValue, RelocInfo::NONE64); | 443 Move(value, kZapValue, RelocInfo::NONE64); |
444 } | 444 } |
445 } | 445 } |
446 | 446 |
447 | 447 |
448 void MacroAssembler::Assert(Condition cc, BailoutReason reason) { | 448 void MacroAssembler::Assert(Condition cc, BailoutReason reason) { |
449 if (emit_debug_code()) Check(cc, reason); | 449 if (emit_debug_code()) Check(cc, reason); |
450 } | 450 } |
451 | 451 |
452 | 452 |
453 void MacroAssembler::AssertFastElements(Register elements) { | 453 void MacroAssembler::AssertFastElements(Register elements) { |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
521 RecordComment(msg); | 521 RecordComment(msg); |
522 } | 522 } |
523 | 523 |
524 if (FLAG_trap_on_abort) { | 524 if (FLAG_trap_on_abort) { |
525 int3(); | 525 int3(); |
526 return; | 526 return; |
527 } | 527 } |
528 #endif | 528 #endif |
529 | 529 |
530 push(rax); | 530 push(rax); |
531 movq(kScratchRegister, reinterpret_cast<Smi*>(p0), RelocInfo::NONE64); | 531 Move(kScratchRegister, reinterpret_cast<Smi*>(p0), RelocInfo::NONE64); |
532 push(kScratchRegister); | 532 push(kScratchRegister); |
533 movq(kScratchRegister, Smi::FromInt(static_cast<int>(p1 - p0)), | 533 Move(kScratchRegister, Smi::FromInt(static_cast<int>(p1 - p0)), |
534 RelocInfo::NONE64); | 534 RelocInfo::NONE64); |
535 push(kScratchRegister); | 535 push(kScratchRegister); |
536 | 536 |
537 if (!has_frame_) { | 537 if (!has_frame_) { |
538 // We don't actually want to generate a pile of code for this, so just | 538 // We don't actually want to generate a pile of code for this, so just |
539 // claim there is a stack frame, without generating one. | 539 // claim there is a stack frame, without generating one. |
540 FrameScope scope(this, StackFrame::NONE); | 540 FrameScope scope(this, StackFrame::NONE); |
541 CallRuntime(Runtime::kAbort, 2); | 541 CallRuntime(Runtime::kAbort, 2); |
542 } else { | 542 } else { |
543 CallRuntime(Runtime::kAbort, 2); | 543 CallRuntime(Runtime::kAbort, 2); |
(...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
713 CallCFunction(ExternalReference::log_enter_external_function(isolate()), 1); | 713 CallCFunction(ExternalReference::log_enter_external_function(isolate()), 1); |
714 PopSafepointRegisters(); | 714 PopSafepointRegisters(); |
715 } | 715 } |
716 | 716 |
717 | 717 |
718 Label profiler_disabled; | 718 Label profiler_disabled; |
719 Label end_profiler_check; | 719 Label end_profiler_check; |
720 bool* is_profiling_flag = | 720 bool* is_profiling_flag = |
721 isolate()->cpu_profiler()->is_profiling_address(); | 721 isolate()->cpu_profiler()->is_profiling_address(); |
722 STATIC_ASSERT(sizeof(*is_profiling_flag) == 1); | 722 STATIC_ASSERT(sizeof(*is_profiling_flag) == 1); |
723 movq(rax, is_profiling_flag, RelocInfo::EXTERNAL_REFERENCE); | 723 Move(rax, is_profiling_flag, RelocInfo::EXTERNAL_REFERENCE); |
724 cmpb(Operand(rax, 0), Immediate(0)); | 724 cmpb(Operand(rax, 0), Immediate(0)); |
725 j(zero, &profiler_disabled); | 725 j(zero, &profiler_disabled); |
726 | 726 |
727 // Third parameter is the address of the actual getter function. | 727 // Third parameter is the address of the actual getter function. |
728 movq(thunk_last_arg, function_address, RelocInfo::EXTERNAL_REFERENCE); | 728 Move(thunk_last_arg, function_address, RelocInfo::EXTERNAL_REFERENCE); |
729 movq(rax, thunk_address, RelocInfo::EXTERNAL_REFERENCE); | 729 Move(rax, thunk_address, RelocInfo::EXTERNAL_REFERENCE); |
730 jmp(&end_profiler_check); | 730 jmp(&end_profiler_check); |
731 | 731 |
732 bind(&profiler_disabled); | 732 bind(&profiler_disabled); |
733 // Call the api function! | 733 // Call the api function! |
734 movq(rax, reinterpret_cast<Address>(function_address), | 734 Move(rax, reinterpret_cast<Address>(function_address), |
735 RelocInfo::EXTERNAL_REFERENCE); | 735 RelocInfo::EXTERNAL_REFERENCE); |
736 | 736 |
737 bind(&end_profiler_check); | 737 bind(&end_profiler_check); |
738 | 738 |
739 // Call the api function! | 739 // Call the api function! |
740 call(rax); | 740 call(rax); |
741 | 741 |
742 if (FLAG_log_timer_events) { | 742 if (FLAG_log_timer_events) { |
743 FrameScope frame(this, StackFrame::MANUAL); | 743 FrameScope frame(this, StackFrame::MANUAL); |
744 PushSafepointRegisters(); | 744 PushSafepointRegisters(); |
(...skipping 291 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1036 if (value == 1) { | 1036 if (value == 1) { |
1037 return kSmiConstantRegister; | 1037 return kSmiConstantRegister; |
1038 } | 1038 } |
1039 LoadSmiConstant(kScratchRegister, source); | 1039 LoadSmiConstant(kScratchRegister, source); |
1040 return kScratchRegister; | 1040 return kScratchRegister; |
1041 } | 1041 } |
1042 | 1042 |
1043 | 1043 |
1044 void MacroAssembler::LoadSmiConstant(Register dst, Smi* source) { | 1044 void MacroAssembler::LoadSmiConstant(Register dst, Smi* source) { |
1045 if (emit_debug_code()) { | 1045 if (emit_debug_code()) { |
1046 movq(dst, Smi::FromInt(kSmiConstantRegisterValue), RelocInfo::NONE64); | 1046 Move(dst, Smi::FromInt(kSmiConstantRegisterValue), RelocInfo::NONE64); |
1047 cmpq(dst, kSmiConstantRegister); | 1047 cmpq(dst, kSmiConstantRegister); |
1048 Assert(equal, kUninitializedKSmiConstantRegister); | 1048 Assert(equal, kUninitializedKSmiConstantRegister); |
1049 } | 1049 } |
1050 int value = source->value(); | 1050 int value = source->value(); |
1051 if (value == 0) { | 1051 if (value == 0) { |
1052 xorl(dst, dst); | 1052 xorl(dst, dst); |
1053 return; | 1053 return; |
1054 } | 1054 } |
1055 bool negative = value < 0; | 1055 bool negative = value < 0; |
1056 unsigned int uvalue = negative ? -value : value; | 1056 unsigned int uvalue = negative ? -value : value; |
(...skipping 19 matching lines...) Expand all Loading... |
1076 case 2: | 1076 case 2: |
1077 lea(dst, Operand(kSmiConstantRegister, kSmiConstantRegister, times_1, 0)); | 1077 lea(dst, Operand(kSmiConstantRegister, kSmiConstantRegister, times_1, 0)); |
1078 break; | 1078 break; |
1079 case 1: | 1079 case 1: |
1080 movq(dst, kSmiConstantRegister); | 1080 movq(dst, kSmiConstantRegister); |
1081 break; | 1081 break; |
1082 case 0: | 1082 case 0: |
1083 UNREACHABLE(); | 1083 UNREACHABLE(); |
1084 return; | 1084 return; |
1085 default: | 1085 default: |
1086 movq(dst, source, RelocInfo::NONE64); | 1086 Move(dst, source, RelocInfo::NONE64); |
1087 return; | 1087 return; |
1088 } | 1088 } |
1089 if (negative) { | 1089 if (negative) { |
1090 neg(dst); | 1090 neg(dst); |
1091 } | 1091 } |
1092 } | 1092 } |
1093 | 1093 |
1094 | 1094 |
1095 void MacroAssembler::Integer32ToSmi(Register dst, Register src) { | 1095 void MacroAssembler::Integer32ToSmi(Register dst, Register src) { |
1096 STATIC_ASSERT(kSmiTag == 0); | 1096 STATIC_ASSERT(kSmiTag == 0); |
(...skipping 1447 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2544 } | 2544 } |
2545 } | 2545 } |
2546 | 2546 |
2547 | 2547 |
2548 void MacroAssembler::MoveHeapObject(Register result, | 2548 void MacroAssembler::MoveHeapObject(Register result, |
2549 Handle<Object> object) { | 2549 Handle<Object> object) { |
2550 AllowDeferredHandleDereference using_raw_address; | 2550 AllowDeferredHandleDereference using_raw_address; |
2551 ASSERT(object->IsHeapObject()); | 2551 ASSERT(object->IsHeapObject()); |
2552 if (isolate()->heap()->InNewSpace(*object)) { | 2552 if (isolate()->heap()->InNewSpace(*object)) { |
2553 Handle<Cell> cell = isolate()->factory()->NewCell(object); | 2553 Handle<Cell> cell = isolate()->factory()->NewCell(object); |
2554 movq(result, cell, RelocInfo::CELL); | 2554 Move(result, cell, RelocInfo::CELL); |
2555 movq(result, Operand(result, 0)); | 2555 movq(result, Operand(result, 0)); |
2556 } else { | 2556 } else { |
2557 movq(result, object, RelocInfo::EMBEDDED_OBJECT); | 2557 Move(result, object, RelocInfo::EMBEDDED_OBJECT); |
2558 } | 2558 } |
2559 } | 2559 } |
2560 | 2560 |
2561 | 2561 |
2562 void MacroAssembler::LoadGlobalCell(Register dst, Handle<Cell> cell) { | 2562 void MacroAssembler::LoadGlobalCell(Register dst, Handle<Cell> cell) { |
2563 if (dst.is(rax)) { | 2563 if (dst.is(rax)) { |
2564 AllowDeferredHandleDereference embedding_raw_address; | 2564 AllowDeferredHandleDereference embedding_raw_address; |
2565 load_rax(cell.location(), RelocInfo::CELL); | 2565 load_rax(cell.location(), RelocInfo::CELL); |
2566 } else { | 2566 } else { |
2567 movq(dst, cell, RelocInfo::CELL); | 2567 Move(dst, cell, RelocInfo::CELL); |
2568 movq(dst, Operand(dst, 0)); | 2568 movq(dst, Operand(dst, 0)); |
2569 } | 2569 } |
2570 } | 2570 } |
2571 | 2571 |
2572 | 2572 |
2573 void MacroAssembler::Drop(int stack_elements) { | 2573 void MacroAssembler::Drop(int stack_elements) { |
2574 if (stack_elements > 0) { | 2574 if (stack_elements > 0) { |
2575 addq(rsp, Immediate(stack_elements * kPointerSize)); | 2575 addq(rsp, Immediate(stack_elements * kPointerSize)); |
2576 } | 2576 } |
2577 } | 2577 } |
2578 | 2578 |
2579 | 2579 |
2580 void MacroAssembler::TestBit(const Operand& src, int bits) { | 2580 void MacroAssembler::TestBit(const Operand& src, int bits) { |
2581 int byte_offset = bits / kBitsPerByte; | 2581 int byte_offset = bits / kBitsPerByte; |
2582 int bit_in_byte = bits & (kBitsPerByte - 1); | 2582 int bit_in_byte = bits & (kBitsPerByte - 1); |
2583 testb(Operand(src, byte_offset), Immediate(1 << bit_in_byte)); | 2583 testb(Operand(src, byte_offset), Immediate(1 << bit_in_byte)); |
2584 } | 2584 } |
2585 | 2585 |
2586 | 2586 |
2587 void MacroAssembler::Jump(ExternalReference ext) { | 2587 void MacroAssembler::Jump(ExternalReference ext) { |
2588 LoadAddress(kScratchRegister, ext); | 2588 LoadAddress(kScratchRegister, ext); |
2589 jmp(kScratchRegister); | 2589 jmp(kScratchRegister); |
2590 } | 2590 } |
2591 | 2591 |
2592 | 2592 |
2593 void MacroAssembler::Jump(Address destination, RelocInfo::Mode rmode) { | 2593 void MacroAssembler::Jump(Address destination, RelocInfo::Mode rmode) { |
2594 movq(kScratchRegister, destination, rmode); | 2594 Move(kScratchRegister, destination, rmode); |
2595 jmp(kScratchRegister); | 2595 jmp(kScratchRegister); |
2596 } | 2596 } |
2597 | 2597 |
2598 | 2598 |
2599 void MacroAssembler::Jump(Handle<Code> code_object, RelocInfo::Mode rmode) { | 2599 void MacroAssembler::Jump(Handle<Code> code_object, RelocInfo::Mode rmode) { |
2600 // TODO(X64): Inline this | 2600 // TODO(X64): Inline this |
2601 jmp(code_object, rmode); | 2601 jmp(code_object, rmode); |
2602 } | 2602 } |
2603 | 2603 |
2604 | 2604 |
(...skipping 13 matching lines...) Expand all Loading... |
2618 #ifdef DEBUG | 2618 #ifdef DEBUG |
2619 CHECK_EQ(end_position, pc_offset()); | 2619 CHECK_EQ(end_position, pc_offset()); |
2620 #endif | 2620 #endif |
2621 } | 2621 } |
2622 | 2622 |
2623 | 2623 |
2624 void MacroAssembler::Call(Address destination, RelocInfo::Mode rmode) { | 2624 void MacroAssembler::Call(Address destination, RelocInfo::Mode rmode) { |
2625 #ifdef DEBUG | 2625 #ifdef DEBUG |
2626 int end_position = pc_offset() + CallSize(destination, rmode); | 2626 int end_position = pc_offset() + CallSize(destination, rmode); |
2627 #endif | 2627 #endif |
2628 movq(kScratchRegister, destination, rmode); | 2628 Move(kScratchRegister, destination, rmode); |
2629 call(kScratchRegister); | 2629 call(kScratchRegister); |
2630 #ifdef DEBUG | 2630 #ifdef DEBUG |
2631 CHECK_EQ(pc_offset(), end_position); | 2631 CHECK_EQ(pc_offset(), end_position); |
2632 #endif | 2632 #endif |
2633 } | 2633 } |
2634 | 2634 |
2635 | 2635 |
2636 void MacroAssembler::Call(Handle<Code> code_object, | 2636 void MacroAssembler::Call(Handle<Code> code_object, |
2637 RelocInfo::Mode rmode, | 2637 RelocInfo::Mode rmode, |
2638 TypeFeedbackId ast_id) { | 2638 TypeFeedbackId ast_id) { |
(...skipping 1021 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3660 cmpq(expected.reg(), actual.reg()); | 3660 cmpq(expected.reg(), actual.reg()); |
3661 j(equal, &invoke, Label::kNear); | 3661 j(equal, &invoke, Label::kNear); |
3662 ASSERT(actual.reg().is(rax)); | 3662 ASSERT(actual.reg().is(rax)); |
3663 ASSERT(expected.reg().is(rbx)); | 3663 ASSERT(expected.reg().is(rbx)); |
3664 } | 3664 } |
3665 } | 3665 } |
3666 | 3666 |
3667 if (!definitely_matches) { | 3667 if (!definitely_matches) { |
3668 Handle<Code> adaptor = isolate()->builtins()->ArgumentsAdaptorTrampoline(); | 3668 Handle<Code> adaptor = isolate()->builtins()->ArgumentsAdaptorTrampoline(); |
3669 if (!code_constant.is_null()) { | 3669 if (!code_constant.is_null()) { |
3670 movq(rdx, code_constant, RelocInfo::EMBEDDED_OBJECT); | 3670 Move(rdx, code_constant, RelocInfo::EMBEDDED_OBJECT); |
3671 addq(rdx, Immediate(Code::kHeaderSize - kHeapObjectTag)); | 3671 addq(rdx, Immediate(Code::kHeaderSize - kHeapObjectTag)); |
3672 } else if (!code_register.is(rdx)) { | 3672 } else if (!code_register.is(rdx)) { |
3673 movq(rdx, code_register); | 3673 movq(rdx, code_register); |
3674 } | 3674 } |
3675 | 3675 |
3676 if (flag == CALL_FUNCTION) { | 3676 if (flag == CALL_FUNCTION) { |
3677 call_wrapper.BeforeCall(CallSize(adaptor)); | 3677 call_wrapper.BeforeCall(CallSize(adaptor)); |
3678 SetCallKind(rcx, call_kind); | 3678 SetCallKind(rcx, call_kind); |
3679 Call(adaptor, RelocInfo::CODE_TARGET); | 3679 Call(adaptor, RelocInfo::CODE_TARGET); |
3680 call_wrapper.AfterCall(); | 3680 call_wrapper.AfterCall(); |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3712 } | 3712 } |
3713 } | 3713 } |
3714 } | 3714 } |
3715 | 3715 |
3716 | 3716 |
3717 void MacroAssembler::EnterFrame(StackFrame::Type type) { | 3717 void MacroAssembler::EnterFrame(StackFrame::Type type) { |
3718 push(rbp); | 3718 push(rbp); |
3719 movq(rbp, rsp); | 3719 movq(rbp, rsp); |
3720 push(rsi); // Context. | 3720 push(rsi); // Context. |
3721 Push(Smi::FromInt(type)); | 3721 Push(Smi::FromInt(type)); |
3722 movq(kScratchRegister, CodeObject(), RelocInfo::EMBEDDED_OBJECT); | 3722 Move(kScratchRegister, CodeObject(), RelocInfo::EMBEDDED_OBJECT); |
3723 push(kScratchRegister); | 3723 push(kScratchRegister); |
3724 if (emit_debug_code()) { | 3724 if (emit_debug_code()) { |
3725 movq(kScratchRegister, | 3725 Move(kScratchRegister, |
3726 isolate()->factory()->undefined_value(), | 3726 isolate()->factory()->undefined_value(), |
3727 RelocInfo::EMBEDDED_OBJECT); | 3727 RelocInfo::EMBEDDED_OBJECT); |
3728 cmpq(Operand(rsp, 0), kScratchRegister); | 3728 cmpq(Operand(rsp, 0), kScratchRegister); |
3729 Check(not_equal, kCodeObjectNotProperlyPatched); | 3729 Check(not_equal, kCodeObjectNotProperlyPatched); |
3730 } | 3730 } |
3731 } | 3731 } |
3732 | 3732 |
3733 | 3733 |
3734 void MacroAssembler::LeaveFrame(StackFrame::Type type) { | 3734 void MacroAssembler::LeaveFrame(StackFrame::Type type) { |
3735 if (emit_debug_code()) { | 3735 if (emit_debug_code()) { |
(...skipping 12 matching lines...) Expand all Loading... |
3748 ASSERT(ExitFrameConstants::kCallerSPDisplacement == | 3748 ASSERT(ExitFrameConstants::kCallerSPDisplacement == |
3749 kFPOnStackSize + kPCOnStackSize); | 3749 kFPOnStackSize + kPCOnStackSize); |
3750 ASSERT(ExitFrameConstants::kCallerPCOffset == kFPOnStackSize); | 3750 ASSERT(ExitFrameConstants::kCallerPCOffset == kFPOnStackSize); |
3751 ASSERT(ExitFrameConstants::kCallerFPOffset == 0 * kPointerSize); | 3751 ASSERT(ExitFrameConstants::kCallerFPOffset == 0 * kPointerSize); |
3752 push(rbp); | 3752 push(rbp); |
3753 movq(rbp, rsp); | 3753 movq(rbp, rsp); |
3754 | 3754 |
3755 // Reserve room for entry stack pointer and push the code object. | 3755 // Reserve room for entry stack pointer and push the code object. |
3756 ASSERT(ExitFrameConstants::kSPOffset == -1 * kPointerSize); | 3756 ASSERT(ExitFrameConstants::kSPOffset == -1 * kPointerSize); |
3757 push(Immediate(0)); // Saved entry sp, patched before call. | 3757 push(Immediate(0)); // Saved entry sp, patched before call. |
3758 movq(kScratchRegister, CodeObject(), RelocInfo::EMBEDDED_OBJECT); | 3758 Move(kScratchRegister, CodeObject(), RelocInfo::EMBEDDED_OBJECT); |
3759 push(kScratchRegister); // Accessed from EditFrame::code_slot. | 3759 push(kScratchRegister); // Accessed from EditFrame::code_slot. |
3760 | 3760 |
3761 // Save the frame pointer and the context in top. | 3761 // Save the frame pointer and the context in top. |
3762 if (save_rax) { | 3762 if (save_rax) { |
3763 movq(r14, rax); // Backup rax in callee-save register. | 3763 movq(r14, rax); // Backup rax in callee-save register. |
3764 } | 3764 } |
3765 | 3765 |
3766 Store(ExternalReference(Isolate::kCEntryFPAddress, isolate()), rbp); | 3766 Store(ExternalReference(Isolate::kCEntryFPAddress, isolate()), rbp); |
3767 Store(ExternalReference(Isolate::kContextAddress, isolate()), rsi); | 3767 Store(ExternalReference(Isolate::kContextAddress, isolate()), rsi); |
3768 } | 3768 } |
(...skipping 1278 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5047 j(equal, found); | 5047 j(equal, found); |
5048 movq(current, FieldOperand(current, Map::kPrototypeOffset)); | 5048 movq(current, FieldOperand(current, Map::kPrototypeOffset)); |
5049 CompareRoot(current, Heap::kNullValueRootIndex); | 5049 CompareRoot(current, Heap::kNullValueRootIndex); |
5050 j(not_equal, &loop_again); | 5050 j(not_equal, &loop_again); |
5051 } | 5051 } |
5052 | 5052 |
5053 | 5053 |
5054 } } // namespace v8::internal | 5054 } } // namespace v8::internal |
5055 | 5055 |
5056 #endif // V8_TARGET_ARCH_X64 | 5056 #endif // V8_TARGET_ARCH_X64 |
OLD | NEW |