OLD | NEW |
1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, 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" | 5 #include "vm/globals.h" |
6 #if defined(TARGET_ARCH_ARM64) | 6 #if defined(TARGET_ARCH_ARM64) |
7 | 7 |
8 #include "vm/assembler.h" | 8 #include "vm/assembler.h" |
9 #include "vm/code_generator.h" | 9 #include "vm/code_generator.h" |
10 #include "vm/compiler.h" | 10 #include "vm/compiler.h" |
(...skipping 405 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
416 __ ldr(R7, Address(R1)); | 416 __ ldr(R7, Address(R1)); |
417 __ AddImmediate(R1, R1, -kWordSize); | 417 __ AddImmediate(R1, R1, -kWordSize); |
418 __ AddImmediate(R3, R3, kWordSize); | 418 __ AddImmediate(R3, R3, kWordSize); |
419 __ AddImmediateSetFlags(R2, R2, -Smi::RawValue(1)); | 419 __ AddImmediateSetFlags(R2, R2, -Smi::RawValue(1)); |
420 __ str(R7, Address(R3, -kWordSize)); | 420 __ str(R7, Address(R3, -kWordSize)); |
421 __ b(&loop, GE); | 421 __ b(&loop, GE); |
422 __ Bind(&loop_exit); | 422 __ Bind(&loop_exit); |
423 } | 423 } |
424 | 424 |
425 | 425 |
426 DECLARE_LEAF_RUNTIME_ENTRY(intptr_t, DeoptimizeCopyFrame, | |
427 intptr_t deopt_reason, | |
428 uword saved_registers_address); | |
429 | |
430 DECLARE_LEAF_RUNTIME_ENTRY(void, DeoptimizeFillFrame, uword last_fp); | |
431 | |
432 | |
433 // Used by eager and lazy deoptimization. Preserve result in RAX if necessary. | 426 // Used by eager and lazy deoptimization. Preserve result in RAX if necessary. |
434 // This stub translates optimized frame into unoptimized frame. The optimized | 427 // This stub translates optimized frame into unoptimized frame. The optimized |
435 // frame can contain values in registers and on stack, the unoptimized | 428 // frame can contain values in registers and on stack, the unoptimized |
436 // frame contains all values on stack. | 429 // frame contains all values on stack. |
437 // Deoptimization occurs in following steps: | 430 // Deoptimization occurs in following steps: |
438 // - Push all registers that can contain values. | 431 // - Push all registers that can contain values. |
439 // - Call C routine to copy the stack and saved registers into temporary buffer. | 432 // - Call C routine to copy the stack and saved registers into temporary buffer. |
440 // - Adjust caller's frame to correct unoptimized frame size. | 433 // - Adjust caller's frame to correct unoptimized frame size. |
441 // - Fill the unoptimized frame. | 434 // - Fill the unoptimized frame. |
442 // - Materialize objects that require allocation (e.g. Double instances). | 435 // - Materialize objects that require allocation (e.g. Double instances). |
(...skipping 569 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1012 __ CallRuntime(kAllocateContextRuntimeEntry, 1); // Allocate context. | 1005 __ CallRuntime(kAllocateContextRuntimeEntry, 1); // Allocate context. |
1013 __ Drop(1); // Pop number of context variables argument. | 1006 __ Drop(1); // Pop number of context variables argument. |
1014 __ Pop(R0); // Pop the new context object. | 1007 __ Pop(R0); // Pop the new context object. |
1015 // R0: new object | 1008 // R0: new object |
1016 // Restore the frame pointer. | 1009 // Restore the frame pointer. |
1017 __ LeaveStubFrame(); | 1010 __ LeaveStubFrame(); |
1018 __ ret(); | 1011 __ ret(); |
1019 } | 1012 } |
1020 | 1013 |
1021 | 1014 |
1022 DECLARE_LEAF_RUNTIME_ENTRY(void, StoreBufferBlockProcess, Isolate* isolate); | |
1023 | |
1024 // Helper stub to implement Assembler::StoreIntoObject. | 1015 // Helper stub to implement Assembler::StoreIntoObject. |
1025 // Input parameters: | 1016 // Input parameters: |
1026 // R0: Address being stored | 1017 // R0: Address being stored |
1027 void StubCode::GenerateUpdateStoreBufferStub(Assembler* assembler) { | 1018 void StubCode::GenerateUpdateStoreBufferStub(Assembler* assembler) { |
1028 Label add_to_buffer; | 1019 Label add_to_buffer; |
1029 // Check whether this object has already been remembered. Skip adding to the | 1020 // Check whether this object has already been remembered. Skip adding to the |
1030 // store buffer if the object is in the store buffer already. | 1021 // store buffer if the object is in the store buffer already. |
1031 __ LoadFieldFromOffset(TMP, R0, Object::tags_offset()); | 1022 __ LoadFieldFromOffset(TMP, R0, Object::tags_offset()); |
1032 __ tsti(TMP, Immediate(1 << RawObject::kRememberedBit)); | 1023 __ tsti(TMP, Immediate(1 << RawObject::kRememberedBit)); |
1033 __ b(&add_to_buffer, EQ); | 1024 __ b(&add_to_buffer, EQ); |
(...skipping 947 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1981 __ Pop(R0); // Get Code object | 1972 __ Pop(R0); // Get Code object |
1982 __ Pop(R4); // Restore argument descriptor. | 1973 __ Pop(R4); // Restore argument descriptor. |
1983 __ LoadFieldFromOffset(R0, R0, Code::instructions_offset()); | 1974 __ LoadFieldFromOffset(R0, R0, Code::instructions_offset()); |
1984 __ AddImmediate(R0, R0, Instructions::HeaderSize() - kHeapObjectTag); | 1975 __ AddImmediate(R0, R0, Instructions::HeaderSize() - kHeapObjectTag); |
1985 __ LeaveStubFrame(); | 1976 __ LeaveStubFrame(); |
1986 __ br(R0); | 1977 __ br(R0); |
1987 __ brk(0); | 1978 __ brk(0); |
1988 } | 1979 } |
1989 | 1980 |
1990 | 1981 |
1991 DECLARE_LEAF_RUNTIME_ENTRY(intptr_t, | |
1992 BigintCompare, | |
1993 RawBigint* left, | |
1994 RawBigint* right); | |
1995 | |
1996 | |
1997 // Does identical check (object references are equal or not equal) with special | 1982 // Does identical check (object references are equal or not equal) with special |
1998 // checks for boxed numbers. | 1983 // checks for boxed numbers. |
1999 // Left and right are pushed on stack. | 1984 // Left and right are pushed on stack. |
2000 // Return Zero condition flag set if equal. | 1985 // Return Zero condition flag set if equal. |
2001 // Note: A Mint cannot contain a value that would fit in Smi, a Bigint | 1986 // Note: A Mint cannot contain a value that would fit in Smi, a Bigint |
2002 // cannot contain a value that fits in Mint or Smi. | 1987 // cannot contain a value that fits in Mint or Smi. |
2003 static void GenerateIdenticalWithNumberCheckStub(Assembler* assembler, | 1988 static void GenerateIdenticalWithNumberCheckStub(Assembler* assembler, |
2004 const Register left, | 1989 const Register left, |
2005 const Register right) { | 1990 const Register right) { |
2006 Label reference_compare, done, check_mint, check_bigint; | 1991 Label reference_compare, done, check_mint, check_bigint; |
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2151 // Result: | 2136 // Result: |
2152 // R1: entry point. | 2137 // R1: entry point. |
2153 void StubCode::GenerateMegamorphicLookupStub(Assembler* assembler) { | 2138 void StubCode::GenerateMegamorphicLookupStub(Assembler* assembler) { |
2154 EmitMegamorphicLookup(assembler, R0, R1, R1); | 2139 EmitMegamorphicLookup(assembler, R0, R1, R1); |
2155 __ ret(); | 2140 __ ret(); |
2156 } | 2141 } |
2157 | 2142 |
2158 } // namespace dart | 2143 } // namespace dart |
2159 | 2144 |
2160 #endif // defined TARGET_ARCH_ARM64 | 2145 #endif // defined TARGET_ARCH_ARM64 |
OLD | NEW |