OLD | NEW |
1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 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 613 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
624 __ xorl(rax, rdi); | 624 __ xorl(rax, rdi); |
625 __ xorl(rcx, rax); | 625 __ xorl(rcx, rax); |
626 ASSERT(IsPowerOf2(TranscendentalCache::SubCache::kCacheSize)); | 626 ASSERT(IsPowerOf2(TranscendentalCache::SubCache::kCacheSize)); |
627 __ andl(rcx, Immediate(TranscendentalCache::SubCache::kCacheSize - 1)); | 627 __ andl(rcx, Immediate(TranscendentalCache::SubCache::kCacheSize - 1)); |
628 | 628 |
629 // ST[0] == double value. | 629 // ST[0] == double value. |
630 // rbx = bits of double value. | 630 // rbx = bits of double value. |
631 // rcx = TranscendentalCache::hash(double value). | 631 // rcx = TranscendentalCache::hash(double value). |
632 ExternalReference cache_array = | 632 ExternalReference cache_array = |
633 ExternalReference::transcendental_cache_array_address(masm->isolate()); | 633 ExternalReference::transcendental_cache_array_address(masm->isolate()); |
634 __ movq(rax, cache_array); | 634 __ Move(rax, cache_array); |
635 int cache_array_index = | 635 int cache_array_index = |
636 type_ * sizeof(masm->isolate()->transcendental_cache()->caches_[0]); | 636 type_ * sizeof(masm->isolate()->transcendental_cache()->caches_[0]); |
637 __ movq(rax, Operand(rax, cache_array_index)); | 637 __ movq(rax, Operand(rax, cache_array_index)); |
638 // rax points to the cache for the type type_. | 638 // rax points to the cache for the type type_. |
639 // If NULL, the cache hasn't been initialized yet, so go through runtime. | 639 // If NULL, the cache hasn't been initialized yet, so go through runtime. |
640 __ testq(rax, rax); | 640 __ testq(rax, rax); |
641 __ j(zero, &runtime_call_clear_stack); // Only clears stack if TAGGED. | 641 __ j(zero, &runtime_call_clear_stack); // Only clears stack if TAGGED. |
642 #ifdef DEBUG | 642 #ifdef DEBUG |
643 // Check that the layout of cache elements match expectations. | 643 // Check that the layout of cache elements match expectations. |
644 { // NOLINT - doesn't like a single brace on a line. | 644 { // NOLINT - doesn't like a single brace on a line. |
(...skipping 1221 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1866 __ LoadAddress(kScratchRegister, | 1866 __ LoadAddress(kScratchRegister, |
1867 ExternalReference::isolate_address(masm->isolate())); | 1867 ExternalReference::isolate_address(masm->isolate())); |
1868 __ movq(Operand(rsp, (argument_slots_on_stack - 1) * kPointerSize), | 1868 __ movq(Operand(rsp, (argument_slots_on_stack - 1) * kPointerSize), |
1869 kScratchRegister); | 1869 kScratchRegister); |
1870 | 1870 |
1871 // Argument 8: Indicate that this is a direct call from JavaScript. | 1871 // Argument 8: Indicate that this is a direct call from JavaScript. |
1872 __ movq(Operand(rsp, (argument_slots_on_stack - 2) * kPointerSize), | 1872 __ movq(Operand(rsp, (argument_slots_on_stack - 2) * kPointerSize), |
1873 Immediate(1)); | 1873 Immediate(1)); |
1874 | 1874 |
1875 // Argument 7: Start (high end) of backtracking stack memory area. | 1875 // Argument 7: Start (high end) of backtracking stack memory area. |
1876 __ movq(kScratchRegister, address_of_regexp_stack_memory_address); | 1876 __ Move(kScratchRegister, address_of_regexp_stack_memory_address); |
1877 __ movq(r9, Operand(kScratchRegister, 0)); | 1877 __ movq(r9, Operand(kScratchRegister, 0)); |
1878 __ movq(kScratchRegister, address_of_regexp_stack_memory_size); | 1878 __ Move(kScratchRegister, address_of_regexp_stack_memory_size); |
1879 __ addq(r9, Operand(kScratchRegister, 0)); | 1879 __ addq(r9, Operand(kScratchRegister, 0)); |
1880 __ movq(Operand(rsp, (argument_slots_on_stack - 3) * kPointerSize), r9); | 1880 __ movq(Operand(rsp, (argument_slots_on_stack - 3) * kPointerSize), r9); |
1881 | 1881 |
1882 // Argument 6: Set the number of capture registers to zero to force global | 1882 // Argument 6: Set the number of capture registers to zero to force global |
1883 // regexps to behave as non-global. This does not affect non-global regexps. | 1883 // regexps to behave as non-global. This does not affect non-global regexps. |
1884 // Argument 6 is passed in r9 on Linux and on the stack on Windows. | 1884 // Argument 6 is passed in r9 on Linux and on the stack on Windows. |
1885 #ifdef _WIN64 | 1885 #ifdef _WIN64 |
1886 __ movq(Operand(rsp, (argument_slots_on_stack - 4) * kPointerSize), | 1886 __ movq(Operand(rsp, (argument_slots_on_stack - 4) * kPointerSize), |
1887 Immediate(0)); | 1887 Immediate(0)); |
1888 #else | 1888 #else |
(...skipping 914 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2803 // Check stack alignment. | 2803 // Check stack alignment. |
2804 if (FLAG_debug_code) { | 2804 if (FLAG_debug_code) { |
2805 __ CheckStackAlignment(); | 2805 __ CheckStackAlignment(); |
2806 } | 2806 } |
2807 | 2807 |
2808 if (do_gc) { | 2808 if (do_gc) { |
2809 // Pass failure code returned from last attempt as first argument to | 2809 // Pass failure code returned from last attempt as first argument to |
2810 // PerformGC. No need to use PrepareCallCFunction/CallCFunction here as the | 2810 // PerformGC. No need to use PrepareCallCFunction/CallCFunction here as the |
2811 // stack is known to be aligned. This function takes one argument which is | 2811 // stack is known to be aligned. This function takes one argument which is |
2812 // passed in register. | 2812 // passed in register. |
2813 __ movq(arg_reg_2, ExternalReference::isolate_address(masm->isolate())); | 2813 __ Move(arg_reg_2, ExternalReference::isolate_address(masm->isolate())); |
2814 __ movq(arg_reg_1, rax); | 2814 __ movq(arg_reg_1, rax); |
2815 __ movq(kScratchRegister, | 2815 __ Move(kScratchRegister, |
2816 ExternalReference::perform_gc_function(masm->isolate())); | 2816 ExternalReference::perform_gc_function(masm->isolate())); |
2817 __ call(kScratchRegister); | 2817 __ call(kScratchRegister); |
2818 } | 2818 } |
2819 | 2819 |
2820 ExternalReference scope_depth = | 2820 ExternalReference scope_depth = |
2821 ExternalReference::heap_always_allocate_scope_depth(masm->isolate()); | 2821 ExternalReference::heap_always_allocate_scope_depth(masm->isolate()); |
2822 if (always_allocate_scope) { | 2822 if (always_allocate_scope) { |
2823 Operand scope_depth_operand = masm->ExternalOperand(scope_depth); | 2823 Operand scope_depth_operand = masm->ExternalOperand(scope_depth); |
2824 __ incl(scope_depth_operand); | 2824 __ incl(scope_depth_operand); |
2825 } | 2825 } |
(...skipping 16 matching lines...) Expand all Loading... |
2842 // Pass a pointer to the Arguments object as the second argument. | 2842 // Pass a pointer to the Arguments object as the second argument. |
2843 __ movq(rdx, r14); // argc. | 2843 __ movq(rdx, r14); // argc. |
2844 __ movq(r8, r15); // argv. | 2844 __ movq(r8, r15); // argv. |
2845 __ movq(r9, ExternalReference::isolate_address(masm->isolate())); | 2845 __ movq(r9, ExternalReference::isolate_address(masm->isolate())); |
2846 } | 2846 } |
2847 | 2847 |
2848 #else // _WIN64 | 2848 #else // _WIN64 |
2849 // GCC passes arguments in rdi, rsi, rdx, rcx, r8, r9. | 2849 // GCC passes arguments in rdi, rsi, rdx, rcx, r8, r9. |
2850 __ movq(rdi, r14); // argc. | 2850 __ movq(rdi, r14); // argc. |
2851 __ movq(rsi, r15); // argv. | 2851 __ movq(rsi, r15); // argv. |
2852 __ movq(rdx, ExternalReference::isolate_address(masm->isolate())); | 2852 __ Move(rdx, ExternalReference::isolate_address(masm->isolate())); |
2853 #endif | 2853 #endif |
2854 __ call(rbx); | 2854 __ call(rbx); |
2855 // Result is in rax - do not destroy this register! | 2855 // Result is in rax - do not destroy this register! |
2856 | 2856 |
2857 if (always_allocate_scope) { | 2857 if (always_allocate_scope) { |
2858 Operand scope_depth_operand = masm->ExternalOperand(scope_depth); | 2858 Operand scope_depth_operand = masm->ExternalOperand(scope_depth); |
2859 __ decl(scope_depth_operand); | 2859 __ decl(scope_depth_operand); |
2860 } | 2860 } |
2861 | 2861 |
2862 // Check for failure result. | 2862 // Check for failure result. |
(...skipping 269 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3132 __ call(kScratchRegister); | 3132 __ call(kScratchRegister); |
3133 | 3133 |
3134 // Unlink this frame from the handler chain. | 3134 // Unlink this frame from the handler chain. |
3135 __ PopTryHandler(); | 3135 __ PopTryHandler(); |
3136 | 3136 |
3137 __ bind(&exit); | 3137 __ bind(&exit); |
3138 // Check if the current stack frame is marked as the outermost JS frame. | 3138 // Check if the current stack frame is marked as the outermost JS frame. |
3139 __ pop(rbx); | 3139 __ pop(rbx); |
3140 __ Cmp(rbx, Smi::FromInt(StackFrame::OUTERMOST_JSENTRY_FRAME)); | 3140 __ Cmp(rbx, Smi::FromInt(StackFrame::OUTERMOST_JSENTRY_FRAME)); |
3141 __ j(not_equal, ¬_outermost_js_2); | 3141 __ j(not_equal, ¬_outermost_js_2); |
3142 __ movq(kScratchRegister, js_entry_sp); | 3142 __ Move(kScratchRegister, js_entry_sp); |
3143 __ movq(Operand(kScratchRegister, 0), Immediate(0)); | 3143 __ movq(Operand(kScratchRegister, 0), Immediate(0)); |
3144 __ bind(¬_outermost_js_2); | 3144 __ bind(¬_outermost_js_2); |
3145 | 3145 |
3146 // Restore the top frame descriptor from the stack. | 3146 // Restore the top frame descriptor from the stack. |
3147 { Operand c_entry_fp_operand = masm->ExternalOperand(c_entry_fp); | 3147 { Operand c_entry_fp_operand = masm->ExternalOperand(c_entry_fp); |
3148 __ pop(c_entry_fp_operand); | 3148 __ pop(c_entry_fp_operand); |
3149 } | 3149 } |
3150 | 3150 |
3151 // Restore callee-saved registers (X64 conventions). | 3151 // Restore callee-saved registers (X64 conventions). |
3152 #ifdef _WIN64 | 3152 #ifdef _WIN64 |
(...skipping 2662 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5815 __ bind(&fast_elements_case); | 5815 __ bind(&fast_elements_case); |
5816 GenerateCase(masm, FAST_ELEMENTS); | 5816 GenerateCase(masm, FAST_ELEMENTS); |
5817 } | 5817 } |
5818 | 5818 |
5819 | 5819 |
5820 #undef __ | 5820 #undef __ |
5821 | 5821 |
5822 } } // namespace v8::internal | 5822 } } // namespace v8::internal |
5823 | 5823 |
5824 #endif // V8_TARGET_ARCH_X64 | 5824 #endif // V8_TARGET_ARCH_X64 |
OLD | NEW |