| 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" | 5 #include "vm/globals.h" |
| 6 #if defined(TARGET_ARCH_IA32) | 6 #if defined(TARGET_ARCH_IA32) |
| 7 | 7 |
| 8 #include "vm/assembler.h" | 8 #include "vm/assembler.h" |
| 9 #include "vm/compiler.h" | 9 #include "vm/compiler.h" |
| 10 #include "vm/dart_entry.h" | 10 #include "vm/dart_entry.h" |
| (...skipping 335 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 346 // No generational barrier needed, since array is in new space. | 346 // No generational barrier needed, since array is in new space. |
| 347 __ InitializeFieldNoBarrier(EAX, Address(ECX, 0), EDI); | 347 __ InitializeFieldNoBarrier(EAX, Address(ECX, 0), EDI); |
| 348 __ AddImmediate(ECX, Immediate(kWordSize)); | 348 __ AddImmediate(ECX, Immediate(kWordSize)); |
| 349 __ AddImmediate(EBX, Immediate(-kWordSize)); | 349 __ AddImmediate(EBX, Immediate(-kWordSize)); |
| 350 __ Bind(&loop_condition); | 350 __ Bind(&loop_condition); |
| 351 __ decl(EDX); | 351 __ decl(EDX); |
| 352 __ j(POSITIVE, &loop, Assembler::kNearJump); | 352 __ j(POSITIVE, &loop, Assembler::kNearJump); |
| 353 } | 353 } |
| 354 | 354 |
| 355 | 355 |
| 356 DECLARE_LEAF_RUNTIME_ENTRY(intptr_t, DeoptimizeCopyFrame, | |
| 357 intptr_t deopt_reason, | |
| 358 uword saved_registers_address); | |
| 359 | |
| 360 DECLARE_LEAF_RUNTIME_ENTRY(void, DeoptimizeFillFrame, uword last_fp); | |
| 361 | |
| 362 | |
| 363 // Used by eager and lazy deoptimization. Preserve result in EAX if necessary. | 356 // Used by eager and lazy deoptimization. Preserve result in EAX if necessary. |
| 364 // This stub translates optimized frame into unoptimized frame. The optimized | 357 // This stub translates optimized frame into unoptimized frame. The optimized |
| 365 // frame can contain values in registers and on stack, the unoptimized | 358 // frame can contain values in registers and on stack, the unoptimized |
| 366 // frame contains all values on stack. | 359 // frame contains all values on stack. |
| 367 // Deoptimization occurs in following steps: | 360 // Deoptimization occurs in following steps: |
| 368 // - Push all registers that can contain values. | 361 // - Push all registers that can contain values. |
| 369 // - Call C routine to copy the stack and saved registers into temporary buffer. | 362 // - Call C routine to copy the stack and saved registers into temporary buffer. |
| 370 // - Adjust caller's frame to correct unoptimized frame size. | 363 // - Adjust caller's frame to correct unoptimized frame size. |
| 371 // - Fill the unoptimized frame. | 364 // - Fill the unoptimized frame. |
| 372 // - Materialize objects that require allocation (e.g. Double instances). | 365 // - Materialize objects that require allocation (e.g. Double instances). |
| (...skipping 549 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 922 __ pushl(EDX); | 915 __ pushl(EDX); |
| 923 __ CallRuntime(kAllocateContextRuntimeEntry, 1); // Allocate context. | 916 __ CallRuntime(kAllocateContextRuntimeEntry, 1); // Allocate context. |
| 924 __ popl(EAX); // Pop number of context variables argument. | 917 __ popl(EAX); // Pop number of context variables argument. |
| 925 __ popl(EAX); // Pop the new context object. | 918 __ popl(EAX); // Pop the new context object. |
| 926 // EAX: new object | 919 // EAX: new object |
| 927 // Restore the frame pointer. | 920 // Restore the frame pointer. |
| 928 __ LeaveFrame(); | 921 __ LeaveFrame(); |
| 929 __ ret(); | 922 __ ret(); |
| 930 } | 923 } |
| 931 | 924 |
| 932 DECLARE_LEAF_RUNTIME_ENTRY(void, StoreBufferBlockProcess, Isolate* isolate); | |
| 933 | 925 |
| 934 // Helper stub to implement Assembler::StoreIntoObject. | 926 // Helper stub to implement Assembler::StoreIntoObject. |
| 935 // Input parameters: | 927 // Input parameters: |
| 936 // EDX: Address being stored | 928 // EDX: Address being stored |
| 937 void StubCode::GenerateUpdateStoreBufferStub(Assembler* assembler) { | 929 void StubCode::GenerateUpdateStoreBufferStub(Assembler* assembler) { |
| 938 // Save values being destroyed. | 930 // Save values being destroyed. |
| 939 __ pushl(EAX); | 931 __ pushl(EAX); |
| 940 __ pushl(ECX); | 932 __ pushl(ECX); |
| 941 | 933 |
| 942 Label add_to_buffer; | 934 Label add_to_buffer; |
| (...skipping 974 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1917 __ popl(EAX); // Get Code object | 1909 __ popl(EAX); // Get Code object |
| 1918 __ popl(EDX); // Restore argument descriptor. | 1910 __ popl(EDX); // Restore argument descriptor. |
| 1919 __ movl(EAX, FieldAddress(EAX, Code::instructions_offset())); | 1911 __ movl(EAX, FieldAddress(EAX, Code::instructions_offset())); |
| 1920 __ addl(EAX, Immediate(Instructions::HeaderSize() - kHeapObjectTag)); | 1912 __ addl(EAX, Immediate(Instructions::HeaderSize() - kHeapObjectTag)); |
| 1921 __ LeaveFrame(); | 1913 __ LeaveFrame(); |
| 1922 __ jmp(EAX); | 1914 __ jmp(EAX); |
| 1923 __ int3(); | 1915 __ int3(); |
| 1924 } | 1916 } |
| 1925 | 1917 |
| 1926 | 1918 |
| 1927 DECLARE_LEAF_RUNTIME_ENTRY(intptr_t, | |
| 1928 BigintCompare, | |
| 1929 RawBigint* left, | |
| 1930 RawBigint* right); | |
| 1931 | |
| 1932 | |
| 1933 // Does identical check (object references are equal or not equal) with special | 1919 // Does identical check (object references are equal or not equal) with special |
| 1934 // checks for boxed numbers. | 1920 // checks for boxed numbers. |
| 1935 // Return ZF set. | 1921 // Return ZF set. |
| 1936 // Note: A Mint cannot contain a value that would fit in Smi, a Bigint | 1922 // Note: A Mint cannot contain a value that would fit in Smi, a Bigint |
| 1937 // cannot contain a value that fits in Mint or Smi. | 1923 // cannot contain a value that fits in Mint or Smi. |
| 1938 static void GenerateIdenticalWithNumberCheckStub(Assembler* assembler, | 1924 static void GenerateIdenticalWithNumberCheckStub(Assembler* assembler, |
| 1939 const Register left, | 1925 const Register left, |
| 1940 const Register right, | 1926 const Register right, |
| 1941 const Register temp) { | 1927 const Register temp) { |
| 1942 Label reference_compare, done, check_mint, check_bigint; | 1928 Label reference_compare, done, check_mint, check_bigint; |
| (...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2094 // EBX: entry point. | 2080 // EBX: entry point. |
| 2095 void StubCode::GenerateMegamorphicLookupStub(Assembler* assembler) { | 2081 void StubCode::GenerateMegamorphicLookupStub(Assembler* assembler) { |
| 2096 EmitMegamorphicLookup(assembler, EDI, EBX, EBX); | 2082 EmitMegamorphicLookup(assembler, EDI, EBX, EBX); |
| 2097 __ ret(); | 2083 __ ret(); |
| 2098 } | 2084 } |
| 2099 | 2085 |
| 2100 | 2086 |
| 2101 } // namespace dart | 2087 } // namespace dart |
| 2102 | 2088 |
| 2103 #endif // defined TARGET_ARCH_IA32 | 2089 #endif // defined TARGET_ARCH_IA32 |
| OLD | NEW |