| OLD | NEW |
| 1 // Copyright 2010 the V8 project authors. All rights reserved. | 1 // Copyright 2010 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 2849 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2860 __ movq(rax, Operand(rsp, 6 * kPointerSize)); | 2860 __ movq(rax, Operand(rsp, 6 * kPointerSize)); |
| 2861 __ movq(rdx, Operand(rsp, 7 * kPointerSize)); | 2861 __ movq(rdx, Operand(rsp, 7 * kPointerSize)); |
| 2862 } | 2862 } |
| 2863 #endif | 2863 #endif |
| 2864 __ lea(rcx, Operand(rax, 1)); | 2864 __ lea(rcx, Operand(rax, 1)); |
| 2865 // Lower 2 bits of rcx are 0 iff rax has failure tag. | 2865 // Lower 2 bits of rcx are 0 iff rax has failure tag. |
| 2866 __ testl(rcx, Immediate(kFailureTagMask)); | 2866 __ testl(rcx, Immediate(kFailureTagMask)); |
| 2867 __ j(zero, &failure_returned); | 2867 __ j(zero, &failure_returned); |
| 2868 | 2868 |
| 2869 // Exit the JavaScript to C++ exit frame. | 2869 // Exit the JavaScript to C++ exit frame. |
| 2870 __ LeaveExitFrame(); | 2870 __ LeaveExitFrame(save_doubles_); |
| 2871 __ ret(0); | 2871 __ ret(0); |
| 2872 | 2872 |
| 2873 // Handling of failure. | 2873 // Handling of failure. |
| 2874 __ bind(&failure_returned); | 2874 __ bind(&failure_returned); |
| 2875 | 2875 |
| 2876 NearLabel retry; | 2876 NearLabel retry; |
| 2877 // If the returned exception is RETRY_AFTER_GC continue at retry label | 2877 // If the returned exception is RETRY_AFTER_GC continue at retry label |
| 2878 STATIC_ASSERT(Failure::RETRY_AFTER_GC == 0); | 2878 STATIC_ASSERT(Failure::RETRY_AFTER_GC == 0); |
| 2879 __ testl(rax, Immediate(((1 << kFailureTypeTagSize) - 1) << kFailureTagSize)); | 2879 __ testl(rax, Immediate(((1 << kFailureTypeTagSize) - 1) << kFailureTagSize)); |
| 2880 __ j(zero, &retry); | 2880 __ j(zero, &retry); |
| (...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2969 // instead of a proper result. The builtin entry handles | 2969 // instead of a proper result. The builtin entry handles |
| 2970 // this by performing a garbage collection and retrying the | 2970 // this by performing a garbage collection and retrying the |
| 2971 // builtin once. | 2971 // builtin once. |
| 2972 | 2972 |
| 2973 // Enter the exit frame that transitions from JavaScript to C++. | 2973 // Enter the exit frame that transitions from JavaScript to C++. |
| 2974 #ifdef _WIN64 | 2974 #ifdef _WIN64 |
| 2975 int arg_stack_space = (result_size_ < 2 ? 2 : 4); | 2975 int arg_stack_space = (result_size_ < 2 ? 2 : 4); |
| 2976 #else | 2976 #else |
| 2977 int arg_stack_space = 0; | 2977 int arg_stack_space = 0; |
| 2978 #endif | 2978 #endif |
| 2979 __ EnterExitFrame(arg_stack_space); | 2979 __ EnterExitFrame(arg_stack_space, save_doubles_); |
| 2980 | 2980 |
| 2981 // rax: Holds the context at this point, but should not be used. | 2981 // rax: Holds the context at this point, but should not be used. |
| 2982 // On entry to code generated by GenerateCore, it must hold | 2982 // On entry to code generated by GenerateCore, it must hold |
| 2983 // a failure result if the collect_garbage argument to GenerateCore | 2983 // a failure result if the collect_garbage argument to GenerateCore |
| 2984 // is true. This failure result can be the result of code | 2984 // is true. This failure result can be the result of code |
| 2985 // generated by a previous call to GenerateCore. The value | 2985 // generated by a previous call to GenerateCore. The value |
| 2986 // of rax is then passed to Runtime::PerformGC. | 2986 // of rax is then passed to Runtime::PerformGC. |
| 2987 // rbx: pointer to builtin function (C callee-saved). | 2987 // rbx: pointer to builtin function (C callee-saved). |
| 2988 // rbp: frame pointer of exit frame (restored after C call). | 2988 // rbp: frame pointer of exit frame (restored after C call). |
| 2989 // rsp: stack pointer (restored after C call). | 2989 // rsp: stack pointer (restored after C call). |
| (...skipping 1400 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4390 | 4390 |
| 4391 // Do a tail call to the rewritten stub. | 4391 // Do a tail call to the rewritten stub. |
| 4392 __ jmp(rdi); | 4392 __ jmp(rdi); |
| 4393 } | 4393 } |
| 4394 | 4394 |
| 4395 #undef __ | 4395 #undef __ |
| 4396 | 4396 |
| 4397 } } // namespace v8::internal | 4397 } } // namespace v8::internal |
| 4398 | 4398 |
| 4399 #endif // V8_TARGET_ARCH_X64 | 4399 #endif // V8_TARGET_ARCH_X64 |
| OLD | NEW |