| 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" // NOLINT | 5 #include "vm/globals.h" // NOLINT |
| 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/code_generator.h" | 9 #include "vm/code_generator.h" |
| 10 #include "vm/cpu.h" | 10 #include "vm/cpu.h" |
| (...skipping 2145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2156 } | 2156 } |
| 2157 } | 2157 } |
| 2158 | 2158 |
| 2159 | 2159 |
| 2160 void Assembler::LoadIsolate(Register dst) { | 2160 void Assembler::LoadIsolate(Register dst) { |
| 2161 movl(dst, Address(THR, Thread::isolate_offset())); | 2161 movl(dst, Address(THR, Thread::isolate_offset())); |
| 2162 } | 2162 } |
| 2163 | 2163 |
| 2164 | 2164 |
| 2165 void Assembler::LoadObject(Register dst, const Object& object) { | 2165 void Assembler::LoadObject(Register dst, const Object& object) { |
| 2166 ASSERT(!object.IsICData() || ICData::Cast(object).IsOriginal()); |
| 2166 if (object.IsSmi() || object.InVMHeap()) { | 2167 if (object.IsSmi() || object.InVMHeap()) { |
| 2167 movl(dst, Immediate(reinterpret_cast<int32_t>(object.raw()))); | 2168 movl(dst, Immediate(reinterpret_cast<int32_t>(object.raw()))); |
| 2168 } else { | 2169 } else { |
| 2169 ASSERT(object.IsNotTemporaryScopedHandle()); | 2170 ASSERT(object.IsNotTemporaryScopedHandle()); |
| 2170 ASSERT(object.IsOld()); | 2171 ASSERT(object.IsOld()); |
| 2171 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 2172 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 2172 EmitUint8(0xB8 + dst); | 2173 EmitUint8(0xB8 + dst); |
| 2173 buffer_.EmitObject(object); | 2174 buffer_.EmitObject(object); |
| 2174 } | 2175 } |
| 2175 } | 2176 } |
| 2176 | 2177 |
| 2177 | 2178 |
| 2178 void Assembler::LoadObjectSafely(Register dst, const Object& object) { | 2179 void Assembler::LoadObjectSafely(Register dst, const Object& object) { |
| 2180 ASSERT(!object.IsICData() || ICData::Cast(object).IsOriginal()); |
| 2179 if (Assembler::IsSafe(object)) { | 2181 if (Assembler::IsSafe(object)) { |
| 2180 LoadObject(dst, object); | 2182 LoadObject(dst, object); |
| 2181 } else { | 2183 } else { |
| 2182 int32_t cookie = jit_cookie(); | 2184 int32_t cookie = jit_cookie(); |
| 2183 movl(dst, Immediate(reinterpret_cast<int32_t>(object.raw()) ^ cookie)); | 2185 movl(dst, Immediate(reinterpret_cast<int32_t>(object.raw()) ^ cookie)); |
| 2184 xorl(dst, Immediate(cookie)); | 2186 xorl(dst, Immediate(cookie)); |
| 2185 } | 2187 } |
| 2186 } | 2188 } |
| 2187 | 2189 |
| 2188 | 2190 |
| 2189 void Assembler::PushObject(const Object& object) { | 2191 void Assembler::PushObject(const Object& object) { |
| 2192 ASSERT(!object.IsICData() || ICData::Cast(object).IsOriginal()); |
| 2190 if (object.IsSmi() || object.InVMHeap()) { | 2193 if (object.IsSmi() || object.InVMHeap()) { |
| 2191 pushl(Immediate(reinterpret_cast<int32_t>(object.raw()))); | 2194 pushl(Immediate(reinterpret_cast<int32_t>(object.raw()))); |
| 2192 } else { | 2195 } else { |
| 2193 ASSERT(object.IsNotTemporaryScopedHandle()); | 2196 ASSERT(object.IsNotTemporaryScopedHandle()); |
| 2194 ASSERT(object.IsOld()); | 2197 ASSERT(object.IsOld()); |
| 2195 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 2198 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 2196 EmitUint8(0x68); | 2199 EmitUint8(0x68); |
| 2197 buffer_.EmitObject(object); | 2200 buffer_.EmitObject(object); |
| 2198 } | 2201 } |
| 2199 } | 2202 } |
| 2200 | 2203 |
| 2201 | 2204 |
| 2202 void Assembler::CompareObject(Register reg, const Object& object) { | 2205 void Assembler::CompareObject(Register reg, const Object& object) { |
| 2206 ASSERT(!object.IsICData() || ICData::Cast(object).IsOriginal()); |
| 2203 if (object.IsSmi() || object.InVMHeap()) { | 2207 if (object.IsSmi() || object.InVMHeap()) { |
| 2204 cmpl(reg, Immediate(reinterpret_cast<int32_t>(object.raw()))); | 2208 cmpl(reg, Immediate(reinterpret_cast<int32_t>(object.raw()))); |
| 2205 } else { | 2209 } else { |
| 2206 ASSERT(object.IsNotTemporaryScopedHandle()); | 2210 ASSERT(object.IsNotTemporaryScopedHandle()); |
| 2207 ASSERT(object.IsOld()); | 2211 ASSERT(object.IsOld()); |
| 2208 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 2212 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 2209 if (reg == EAX) { | 2213 if (reg == EAX) { |
| 2210 EmitUint8(0x05 + (7 << 3)); | 2214 EmitUint8(0x05 + (7 << 3)); |
| 2211 buffer_.EmitObject(object); | 2215 buffer_.EmitObject(object); |
| 2212 } else { | 2216 } else { |
| (...skipping 178 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2391 Stop("Store buffer update is required"); | 2395 Stop("Store buffer update is required"); |
| 2392 Bind(&done); | 2396 Bind(&done); |
| 2393 popl(value); | 2397 popl(value); |
| 2394 #endif // defined(DEBUG) | 2398 #endif // defined(DEBUG) |
| 2395 // No store buffer update. | 2399 // No store buffer update. |
| 2396 } | 2400 } |
| 2397 | 2401 |
| 2398 | 2402 |
| 2399 void Assembler::UnverifiedStoreOldObject(const Address& dest, | 2403 void Assembler::UnverifiedStoreOldObject(const Address& dest, |
| 2400 const Object& value) { | 2404 const Object& value) { |
| 2405 ASSERT(!value.IsICData() || ICData::Cast(value).IsOriginal()); |
| 2401 ASSERT(value.IsOld()); | 2406 ASSERT(value.IsOld()); |
| 2402 ASSERT(!value.InVMHeap()); | 2407 ASSERT(!value.InVMHeap()); |
| 2403 AssemblerBuffer::EnsureCapacity ensured(&buffer_); | 2408 AssemblerBuffer::EnsureCapacity ensured(&buffer_); |
| 2404 EmitUint8(0xC7); | 2409 EmitUint8(0xC7); |
| 2405 EmitOperand(0, dest); | 2410 EmitOperand(0, dest); |
| 2406 buffer_.EmitObject(value); | 2411 buffer_.EmitObject(value); |
| 2407 } | 2412 } |
| 2408 | 2413 |
| 2409 | 2414 |
| 2410 void Assembler::StoreIntoObjectNoBarrier(Register object, | 2415 void Assembler::StoreIntoObjectNoBarrier(Register object, |
| 2411 const Address& dest, | 2416 const Address& dest, |
| 2412 const Object& value, | 2417 const Object& value, |
| 2413 FieldContent old_content) { | 2418 FieldContent old_content) { |
| 2419 ASSERT(!value.IsICData() || ICData::Cast(value).IsOriginal()); |
| 2414 VerifyHeapWord(dest, old_content); | 2420 VerifyHeapWord(dest, old_content); |
| 2415 if (value.IsSmi() || value.InVMHeap()) { | 2421 if (value.IsSmi() || value.InVMHeap()) { |
| 2416 Immediate imm_value(reinterpret_cast<int32_t>(value.raw())); | 2422 Immediate imm_value(reinterpret_cast<int32_t>(value.raw())); |
| 2417 movl(dest, imm_value); | 2423 movl(dest, imm_value); |
| 2418 if (VerifiedMemory::enabled()) { | 2424 if (VerifiedMemory::enabled()) { |
| 2419 Register temp = ECX; | 2425 Register temp = ECX; |
| 2420 pushl(temp); | 2426 pushl(temp); |
| 2421 leal(temp, dest); | 2427 leal(temp, dest); |
| 2422 movl(Address(temp, VerifiedMemory::offset()), imm_value); | 2428 movl(Address(temp, VerifiedMemory::offset()), imm_value); |
| 2423 popl(temp); | 2429 popl(temp); |
| (...skipping 788 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3212 | 3218 |
| 3213 const char* Assembler::FpuRegisterName(FpuRegister reg) { | 3219 const char* Assembler::FpuRegisterName(FpuRegister reg) { |
| 3214 ASSERT((0 <= reg) && (reg < kNumberOfXmmRegisters)); | 3220 ASSERT((0 <= reg) && (reg < kNumberOfXmmRegisters)); |
| 3215 return xmm_reg_names[reg]; | 3221 return xmm_reg_names[reg]; |
| 3216 } | 3222 } |
| 3217 | 3223 |
| 3218 | 3224 |
| 3219 } // namespace dart | 3225 } // namespace dart |
| 3220 | 3226 |
| 3221 #endif // defined TARGET_ARCH_IA32 | 3227 #endif // defined TARGET_ARCH_IA32 |
| OLD | NEW |