| OLD | NEW |
| 1 // Copyright (c) 1994-2006 Sun Microsystems Inc. | 1 // Copyright (c) 1994-2006 Sun Microsystems Inc. |
| 2 // All Rights Reserved. | 2 // All Rights Reserved. |
| 3 // | 3 // |
| 4 // Redistribution and use in source and binary forms, with or without | 4 // Redistribution and use in source and binary forms, with or without |
| 5 // modification, are permitted provided that the following conditions are | 5 // modification, are permitted provided that the following conditions are |
| 6 // met: | 6 // met: |
| 7 // | 7 // |
| 8 // - Redistributions of source code must retain the above copyright notice, | 8 // - Redistributions of source code must retain the above copyright notice, |
| 9 // this list of conditions and the following disclaimer. | 9 // this list of conditions and the following disclaimer. |
| 10 // | 10 // |
| (...skipping 249 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 260 | 260 |
| 261 const Instr kSwRegFpNegOffsetPattern = SW | (kRegister_fp_Code << kRsShift) | 261 const Instr kSwRegFpNegOffsetPattern = SW | (kRegister_fp_Code << kRsShift) |
| 262 | (kNegOffset & kImm16Mask); | 262 | (kNegOffset & kImm16Mask); |
| 263 // A mask for the Rt register for push, pop, lw, sw instructions. | 263 // A mask for the Rt register for push, pop, lw, sw instructions. |
| 264 const Instr kRtMask = kRtFieldMask; | 264 const Instr kRtMask = kRtFieldMask; |
| 265 const Instr kLwSwInstrTypeMask = 0xffe00000; | 265 const Instr kLwSwInstrTypeMask = 0xffe00000; |
| 266 const Instr kLwSwInstrArgumentMask = ~kLwSwInstrTypeMask; | 266 const Instr kLwSwInstrArgumentMask = ~kLwSwInstrTypeMask; |
| 267 const Instr kLwSwOffsetMask = kImm16Mask; | 267 const Instr kLwSwOffsetMask = kImm16Mask; |
| 268 | 268 |
| 269 | 269 |
| 270 // Spare buffer. | 270 Assembler::Assembler(Isolate* isolate, void* buffer, int buffer_size) |
| 271 static const int kMinimalBufferSize = 4 * KB; | 271 : AssemblerBase(isolate, buffer, buffer_size), |
| 272 | |
| 273 | |
| 274 Assembler::Assembler(Isolate* arg_isolate, void* buffer, int buffer_size) | |
| 275 : AssemblerBase(arg_isolate), | |
| 276 recorded_ast_id_(TypeFeedbackId::None()), | 272 recorded_ast_id_(TypeFeedbackId::None()), |
| 277 positions_recorder_(this) { | 273 positions_recorder_(this) { |
| 278 if (buffer == NULL) { | 274 reloc_info_writer.Reposition(buffer_ + buffer_size_, pc_); |
| 279 // Do our own buffer management. | |
| 280 if (buffer_size <= kMinimalBufferSize) { | |
| 281 buffer_size = kMinimalBufferSize; | |
| 282 | |
| 283 if (isolate()->assembler_spare_buffer() != NULL) { | |
| 284 buffer = isolate()->assembler_spare_buffer(); | |
| 285 isolate()->set_assembler_spare_buffer(NULL); | |
| 286 } | |
| 287 } | |
| 288 if (buffer == NULL) { | |
| 289 buffer_ = NewArray<byte>(buffer_size); | |
| 290 } else { | |
| 291 buffer_ = static_cast<byte*>(buffer); | |
| 292 } | |
| 293 buffer_size_ = buffer_size; | |
| 294 own_buffer_ = true; | |
| 295 | |
| 296 } else { | |
| 297 // Use externally provided buffer instead. | |
| 298 ASSERT(buffer_size > 0); | |
| 299 buffer_ = static_cast<byte*>(buffer); | |
| 300 buffer_size_ = buffer_size; | |
| 301 own_buffer_ = false; | |
| 302 } | |
| 303 | |
| 304 // Set up buffer pointers. | |
| 305 ASSERT(buffer_ != NULL); | |
| 306 pc_ = buffer_; | |
| 307 reloc_info_writer.Reposition(buffer_ + buffer_size, pc_); | |
| 308 | 275 |
| 309 last_trampoline_pool_end_ = 0; | 276 last_trampoline_pool_end_ = 0; |
| 310 no_trampoline_pool_before_ = 0; | 277 no_trampoline_pool_before_ = 0; |
| 311 trampoline_pool_blocked_nesting_ = 0; | 278 trampoline_pool_blocked_nesting_ = 0; |
| 312 // We leave space (16 * kTrampolineSlotsSize) | 279 // We leave space (16 * kTrampolineSlotsSize) |
| 313 // for BlockTrampolinePoolScope buffer. | 280 // for BlockTrampolinePoolScope buffer. |
| 314 next_buffer_check_ = kMaxBranchOffset - kTrampolineSlotsSize * 16; | 281 next_buffer_check_ = kMaxBranchOffset - kTrampolineSlotsSize * 16; |
| 315 internal_trampoline_exception_ = false; | 282 internal_trampoline_exception_ = false; |
| 316 last_bound_pos_ = 0; | 283 last_bound_pos_ = 0; |
| 317 | 284 |
| 318 trampoline_emitted_ = false; | 285 trampoline_emitted_ = false; |
| 319 unbound_labels_count_ = 0; | 286 unbound_labels_count_ = 0; |
| 320 block_buffer_growth_ = false; | 287 block_buffer_growth_ = false; |
| 321 | 288 |
| 322 ClearRecordedAstId(); | 289 ClearRecordedAstId(); |
| 323 } | 290 } |
| 324 | 291 |
| 325 | 292 |
| 326 Assembler::~Assembler() { | |
| 327 if (own_buffer_) { | |
| 328 if (isolate()->assembler_spare_buffer() == NULL && | |
| 329 buffer_size_ == kMinimalBufferSize) { | |
| 330 isolate()->set_assembler_spare_buffer(buffer_); | |
| 331 } else { | |
| 332 DeleteArray(buffer_); | |
| 333 } | |
| 334 } | |
| 335 } | |
| 336 | |
| 337 | |
| 338 void Assembler::GetCode(CodeDesc* desc) { | 293 void Assembler::GetCode(CodeDesc* desc) { |
| 339 ASSERT(pc_ <= reloc_info_writer.pos()); // No overlap. | 294 ASSERT(pc_ <= reloc_info_writer.pos()); // No overlap. |
| 340 // Set up code descriptor. | 295 // Set up code descriptor. |
| 341 desc->buffer = buffer_; | 296 desc->buffer = buffer_; |
| 342 desc->buffer_size = buffer_size_; | 297 desc->buffer_size = buffer_size_; |
| 343 desc->instr_size = pc_offset(); | 298 desc->instr_size = pc_offset(); |
| 344 desc->reloc_size = (buffer_ + buffer_size_) - reloc_info_writer.pos(); | 299 desc->reloc_size = (buffer_ + buffer_size_) - reloc_info_writer.pos(); |
| 345 } | 300 } |
| 346 | 301 |
| 347 | 302 |
| (...skipping 1937 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2285 } | 2240 } |
| 2286 | 2241 |
| 2287 if (patched) { | 2242 if (patched) { |
| 2288 CPU::FlushICache(pc+2, sizeof(Address)); | 2243 CPU::FlushICache(pc+2, sizeof(Address)); |
| 2289 } | 2244 } |
| 2290 } | 2245 } |
| 2291 | 2246 |
| 2292 } } // namespace v8::internal | 2247 } } // namespace v8::internal |
| 2293 | 2248 |
| 2294 #endif // V8_TARGET_ARCH_MIPS | 2249 #endif // V8_TARGET_ARCH_MIPS |
| OLD | NEW |