| OLD | NEW |
| 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 #include "vm/globals.h" // Needed here to get TARGET_ARCH_X64. | 5 #include "vm/globals.h" // Needed here to get TARGET_ARCH_X64. |
| 6 #if defined(TARGET_ARCH_X64) | 6 #if defined(TARGET_ARCH_X64) |
| 7 | 7 |
| 8 #include "vm/intermediate_language.h" | 8 #include "vm/intermediate_language.h" |
| 9 | 9 |
| 10 #include "lib/error.h" | 10 #include "lib/error.h" |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 74 // that will be overwritten by the patch instruction: a jump). | 74 // that will be overwritten by the patch instruction: a jump). |
| 75 void ReturnInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 75 void ReturnInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
| 76 Register result = locs()->in(0).reg(); | 76 Register result = locs()->in(0).reg(); |
| 77 ASSERT(result == RAX); | 77 ASSERT(result == RAX); |
| 78 #if defined(DEBUG) | 78 #if defined(DEBUG) |
| 79 // TODO(srdjan): Fix for functions with finally clause. | 79 // TODO(srdjan): Fix for functions with finally clause. |
| 80 // A finally clause may leave a previously pushed return value if it | 80 // A finally clause may leave a previously pushed return value if it |
| 81 // has its own return instruction. Method that have finally are currently | 81 // has its own return instruction. Method that have finally are currently |
| 82 // not optimized. | 82 // not optimized. |
| 83 if (!compiler->HasFinally()) { | 83 if (!compiler->HasFinally()) { |
| 84 __ Comment("Stack Check"); |
| 84 Label done; | 85 Label done; |
| 86 const int sp_fp_dist = compiler->StackSize() + (-kFirstLocalSlotIndex - 1); |
| 85 __ movq(RDI, RBP); | 87 __ movq(RDI, RBP); |
| 86 __ subq(RDI, RSP); | 88 __ subq(RDI, RSP); |
| 87 // + 1 for Pc marker. | 89 __ cmpq(RDI, Immediate(sp_fp_dist * kWordSize)); |
| 88 __ cmpq(RDI, Immediate((compiler->StackSize() + 1) * kWordSize)); | |
| 89 __ j(EQUAL, &done, Assembler::kNearJump); | 90 __ j(EQUAL, &done, Assembler::kNearJump); |
| 90 __ int3(); | 91 __ int3(); |
| 91 __ Bind(&done); | 92 __ Bind(&done); |
| 92 } | 93 } |
| 93 #endif | 94 #endif |
| 94 __ LeaveFrame(); | 95 __ LeaveFrame(); |
| 95 __ ret(); | 96 __ ret(); |
| 96 | 97 |
| 97 // Generate 8 bytes of NOPs so that the debugger can patch the | 98 // Generate 8 bytes of NOPs so that the debugger can patch the |
| 98 // return pattern with a call to the debug stub. | 99 // return pattern with a call to the debug stub. |
| (...skipping 802 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 901 void NativeCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 902 void NativeCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
| 902 ASSERT(locs()->temp(0).reg() == RAX); | 903 ASSERT(locs()->temp(0).reg() == RAX); |
| 903 ASSERT(locs()->temp(1).reg() == RBX); | 904 ASSERT(locs()->temp(1).reg() == RBX); |
| 904 ASSERT(locs()->temp(2).reg() == R10); | 905 ASSERT(locs()->temp(2).reg() == R10); |
| 905 Register result = locs()->out().reg(); | 906 Register result = locs()->out().reg(); |
| 906 | 907 |
| 907 // Push the result place holder initialized to NULL. | 908 // Push the result place holder initialized to NULL. |
| 908 __ PushObject(Object::ZoneHandle()); | 909 __ PushObject(Object::ZoneHandle()); |
| 909 // Pass a pointer to the first argument in RAX. | 910 // Pass a pointer to the first argument in RAX. |
| 910 if (!function().HasOptionalParameters()) { | 911 if (!function().HasOptionalParameters()) { |
| 911 __ leaq(RAX, Address(RBP, (1 + function().NumParameters()) * kWordSize)); | 912 __ leaq(RAX, Address(RBP, (kLastParamSlotIndex + |
| 913 function().NumParameters() - 1) * kWordSize)); |
| 912 } else { | 914 } else { |
| 913 __ leaq(RAX, | 915 __ leaq(RAX, |
| 914 Address(RBP, ParsedFunction::kFirstLocalSlotIndex * kWordSize)); | 916 Address(RBP, kFirstLocalSlotIndex * kWordSize)); |
| 915 } | 917 } |
| 916 __ movq(RBX, Immediate(reinterpret_cast<uword>(native_c_function()))); | 918 __ movq(RBX, Immediate(reinterpret_cast<uword>(native_c_function()))); |
| 917 __ movq(R10, Immediate(NativeArguments::ComputeArgcTag(function()))); | 919 __ movq(R10, Immediate(NativeArguments::ComputeArgcTag(function()))); |
| 918 compiler->GenerateCall(token_pos(), | 920 compiler->GenerateCall(token_pos(), |
| 919 &StubCode::CallNativeCFunctionLabel(), | 921 &StubCode::CallNativeCFunctionLabel(), |
| 920 PcDescriptors::kOther, | 922 PcDescriptors::kOther, |
| 921 locs()); | 923 locs()); |
| 922 __ popq(result); | 924 __ popq(result); |
| 923 } | 925 } |
| 924 | 926 |
| (...skipping 2298 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3223 PcDescriptors::kOther, | 3225 PcDescriptors::kOther, |
| 3224 locs()); | 3226 locs()); |
| 3225 __ Drop(2); // Discard type arguments and receiver. | 3227 __ Drop(2); // Discard type arguments and receiver. |
| 3226 } | 3228 } |
| 3227 | 3229 |
| 3228 } // namespace dart | 3230 } // namespace dart |
| 3229 | 3231 |
| 3230 #undef __ | 3232 #undef __ |
| 3231 | 3233 |
| 3232 #endif // defined TARGET_ARCH_X64 | 3234 #endif // defined TARGET_ARCH_X64 |
| OLD | NEW |