| OLD | NEW |
| 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, 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 #ifndef VM_ASSEMBLER_H_ | 5 #ifndef VM_ASSEMBLER_H_ |
| 6 #define VM_ASSEMBLER_H_ | 6 #define VM_ASSEMBLER_H_ |
| 7 | 7 |
| 8 #include "platform/assert.h" | 8 #include "platform/assert.h" |
| 9 #include "vm/allocation.h" | 9 #include "vm/allocation.h" |
| 10 #include "vm/globals.h" | 10 #include "vm/globals.h" |
| (...skipping 198 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 209 void ExtendCapacity(); | 209 void ExtendCapacity(); |
| 210 | 210 |
| 211 friend class AssemblerFixup; | 211 friend class AssemblerFixup; |
| 212 }; | 212 }; |
| 213 | 213 |
| 214 | 214 |
| 215 // Pair type parameter for DirectChainedHashMap used for the constant pool. | 215 // Pair type parameter for DirectChainedHashMap used for the constant pool. |
| 216 class ObjIndexPair { | 216 class ObjIndexPair { |
| 217 public: | 217 public: |
| 218 // Typedefs needed for the DirectChainedHashMap template. | 218 // Typedefs needed for the DirectChainedHashMap template. |
| 219 typedef const Object* Key; | 219 typedef ObjectPool::Entry Key; |
| 220 typedef intptr_t Value; | 220 typedef intptr_t Value; |
| 221 typedef ObjIndexPair Pair; | 221 typedef ObjIndexPair Pair; |
| 222 | 222 |
| 223 static const intptr_t kNoIndex = -1; | 223 static const intptr_t kNoIndex = -1; |
| 224 | 224 |
| 225 ObjIndexPair() : key_(NULL), value_(kNoIndex) { } | 225 ObjIndexPair() : key_(static_cast<uword>(NULL), ObjectPool::kTaggedObject), |
| 226 value_(kNoIndex) { } |
| 226 | 227 |
| 227 ObjIndexPair(Key key, Value value) | 228 ObjIndexPair(Key key, Value value) : value_(value) { |
| 228 : key_(key->IsNotTemporaryScopedHandle() | 229 key_.type_ = key.type_; |
| 229 ? key : &Object::ZoneHandle(key->raw())), | 230 if (key.type_ == ObjectPool::kTaggedObject) { |
| 230 value_(value) { } | 231 if (key.obj_->IsNotTemporaryScopedHandle()) { |
| 232 key_.obj_ = key.obj_; |
| 233 } else { |
| 234 key_.obj_ = &Object::ZoneHandle(key.obj_->raw()); |
| 235 } |
| 236 } else { |
| 237 key_.raw_value_ = key.raw_value_; |
| 238 } |
| 239 } |
| 231 | 240 |
| 232 static Key KeyOf(Pair kv) { return kv.key_; } | 241 static Key KeyOf(Pair kv) { return kv.key_; } |
| 233 | 242 |
| 234 static Value ValueOf(Pair kv) { return kv.value_; } | 243 static Value ValueOf(Pair kv) { return kv.value_; } |
| 235 | 244 |
| 236 static intptr_t Hashcode(Key key) { | 245 static intptr_t Hashcode(Key key) { |
| 237 if (key->IsSmi()) { | 246 if (key.type_ != ObjectPool::kTaggedObject) { |
| 238 return Smi::Cast(*key).Value(); | 247 return key.raw_value_; |
| 239 } | 248 } |
| 240 if (key->IsDouble()) { | 249 if (key.obj_->IsSmi()) { |
| 250 return Smi::Cast(*key.obj_).Value(); |
| 251 } |
| 252 if (key.obj_->IsDouble()) { |
| 241 return static_cast<intptr_t>( | 253 return static_cast<intptr_t>( |
| 242 bit_cast<int32_t, float>( | 254 bit_cast<int32_t, float>( |
| 243 static_cast<float>(Double::Cast(*key).value()))); | 255 static_cast<float>(Double::Cast(*key.obj_).value()))); |
| 244 } | 256 } |
| 245 if (key->IsMint()) { | 257 if (key.obj_->IsMint()) { |
| 246 return static_cast<intptr_t>(Mint::Cast(*key).value()); | 258 return static_cast<intptr_t>(Mint::Cast(*key.obj_).value()); |
| 247 } | 259 } |
| 248 if (key->IsString()) { | 260 if (key.obj_->IsString()) { |
| 249 return String::Cast(*key).Hash(); | 261 return String::Cast(*key.obj_).Hash(); |
| 250 } | 262 } |
| 251 // TODO(fschneider): Add hash function for other classes commonly used as | 263 // TODO(fschneider): Add hash function for other classes commonly used as |
| 252 // compile-time constants. | 264 // compile-time constants. |
| 253 return key->GetClassId(); | 265 return key.obj_->GetClassId(); |
| 254 } | 266 } |
| 255 | 267 |
| 256 static inline bool IsKeyEqual(Pair kv, Key key) { | 268 static inline bool IsKeyEqual(Pair kv, Key key) { |
| 257 return kv.key_->raw() == key->raw(); | 269 if (kv.key_.type_ != key.type_) return false; |
| 270 if (kv.key_.type_ == ObjectPool::kTaggedObject) { |
| 271 return kv.key_.obj_->raw() == key.obj_->raw(); |
| 272 } |
| 273 return kv.key_.raw_value_ == key.raw_value_; |
| 258 } | 274 } |
| 259 | 275 |
| 260 private: | 276 private: |
| 261 Key key_; | 277 Key key_; |
| 262 Value value_; | 278 Value value_; |
| 263 }; | 279 }; |
| 264 | 280 |
| 265 | 281 |
| 266 enum Patchability { | 282 enum Patchability { |
| 267 kPatchable, | 283 kPatchable, |
| 268 kNotPatchable, | 284 kNotPatchable, |
| 269 }; | 285 }; |
| 270 | 286 |
| 271 | 287 |
| 272 class ObjectPool : public ValueObject { | 288 class ObjectPoolWrapper : public ValueObject { |
| 273 public: | 289 public: |
| 274 ObjectPool() : object_pool_(GrowableObjectArray::Handle()) { } | 290 intptr_t AddObject(const Object& obj); |
| 275 | 291 intptr_t AddImmediate(uword imm); |
| 276 intptr_t AddObject(const Object& obj, Patchability patchable); | |
| 277 intptr_t AddExternalLabel(const ExternalLabel* label, | 292 intptr_t AddExternalLabel(const ExternalLabel* label, |
| 278 Patchability patchable); | 293 Patchability patchable); |
| 279 | 294 |
| 280 intptr_t FindObject(const Object& obj, Patchability patchable); | 295 intptr_t FindObject(const Object& obj); |
| 296 intptr_t FindImmediate(uword imm); |
| 281 intptr_t FindExternalLabel(const ExternalLabel* label, | 297 intptr_t FindExternalLabel(const ExternalLabel* label, |
| 282 Patchability patchable); | 298 Patchability patchable); |
| 283 const GrowableObjectArray& data() const { return object_pool_; } | 299 |
| 300 RawObjectPool* MakeObjectPool(); |
| 284 | 301 |
| 285 private: | 302 private: |
| 303 intptr_t AddObject(ObjectPool::Entry entry, Patchability patchable); |
| 304 intptr_t FindObject(ObjectPool::Entry entry, Patchability patchable); |
| 305 |
| 286 // Objects and jump targets. | 306 // Objects and jump targets. |
| 287 GrowableObjectArray& object_pool_; | 307 GrowableArray<ObjectPool::Entry> object_pool_; |
| 288 | |
| 289 // Patchability of pool entries. | |
| 290 GrowableArray<Patchability> patchable_pool_entries_; | |
| 291 | 308 |
| 292 // Hashmap for fast lookup in object pool. | 309 // Hashmap for fast lookup in object pool. |
| 293 DirectChainedHashMap<ObjIndexPair> object_pool_index_table_; | 310 DirectChainedHashMap<ObjIndexPair> object_pool_index_table_; |
| 294 }; | 311 }; |
| 295 | 312 |
| 296 } // namespace dart | 313 } // namespace dart |
| 297 | 314 |
| 298 | 315 |
| 299 #if defined(TARGET_ARCH_IA32) | 316 #if defined(TARGET_ARCH_IA32) |
| 300 #include "vm/assembler_ia32.h" | 317 #include "vm/assembler_ia32.h" |
| 301 #elif defined(TARGET_ARCH_X64) | 318 #elif defined(TARGET_ARCH_X64) |
| 302 #include "vm/assembler_x64.h" | 319 #include "vm/assembler_x64.h" |
| 303 #elif defined(TARGET_ARCH_ARM) | 320 #elif defined(TARGET_ARCH_ARM) |
| 304 #include "vm/assembler_arm.h" | 321 #include "vm/assembler_arm.h" |
| 305 #elif defined(TARGET_ARCH_ARM64) | 322 #elif defined(TARGET_ARCH_ARM64) |
| 306 #include "vm/assembler_arm64.h" | 323 #include "vm/assembler_arm64.h" |
| 307 #elif defined(TARGET_ARCH_MIPS) | 324 #elif defined(TARGET_ARCH_MIPS) |
| 308 #include "vm/assembler_mips.h" | 325 #include "vm/assembler_mips.h" |
| 309 #else | 326 #else |
| 310 #error Unknown architecture. | 327 #error Unknown architecture. |
| 311 #endif | 328 #endif |
| 312 | 329 |
| 313 #endif // VM_ASSEMBLER_H_ | 330 #endif // VM_ASSEMBLER_H_ |
| OLD | NEW |