OLD | NEW |
1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 322 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
333 | 333 |
334 | 334 |
335 // ----------------------------------------------------------------------------- | 335 // ----------------------------------------------------------------------------- |
336 // Implementation of Assembler. | 336 // Implementation of Assembler. |
337 | 337 |
338 #ifdef GENERATED_CODE_COVERAGE | 338 #ifdef GENERATED_CODE_COVERAGE |
339 static void InitCoverageLog(); | 339 static void InitCoverageLog(); |
340 #endif | 340 #endif |
341 | 341 |
342 Assembler::Assembler(void* buffer, int buffer_size) | 342 Assembler::Assembler(void* buffer, int buffer_size) |
343 : code_targets_(100), | 343 : AssemblerBase(Isolate::Current()), |
| 344 code_targets_(100), |
344 positions_recorder_(this), | 345 positions_recorder_(this), |
345 emit_debug_code_(FLAG_debug_code) { | 346 emit_debug_code_(FLAG_debug_code) { |
346 Isolate* isolate = Isolate::Current(); | |
347 if (buffer == NULL) { | 347 if (buffer == NULL) { |
348 // Do our own buffer management. | 348 // Do our own buffer management. |
349 if (buffer_size <= kMinimalBufferSize) { | 349 if (buffer_size <= kMinimalBufferSize) { |
350 buffer_size = kMinimalBufferSize; | 350 buffer_size = kMinimalBufferSize; |
351 | 351 |
352 if (isolate->assembler_spare_buffer() != NULL) { | 352 if (isolate()->assembler_spare_buffer() != NULL) { |
353 buffer = isolate->assembler_spare_buffer(); | 353 buffer = isolate()->assembler_spare_buffer(); |
354 isolate->set_assembler_spare_buffer(NULL); | 354 isolate()->set_assembler_spare_buffer(NULL); |
355 } | 355 } |
356 } | 356 } |
357 if (buffer == NULL) { | 357 if (buffer == NULL) { |
358 buffer_ = NewArray<byte>(buffer_size); | 358 buffer_ = NewArray<byte>(buffer_size); |
359 } else { | 359 } else { |
360 buffer_ = static_cast<byte*>(buffer); | 360 buffer_ = static_cast<byte*>(buffer); |
361 } | 361 } |
362 buffer_size_ = buffer_size; | 362 buffer_size_ = buffer_size; |
363 own_buffer_ = true; | 363 own_buffer_ = true; |
364 } else { | 364 } else { |
(...skipping 20 matching lines...) Expand all Loading... |
385 | 385 |
386 last_pc_ = NULL; | 386 last_pc_ = NULL; |
387 | 387 |
388 #ifdef GENERATED_CODE_COVERAGE | 388 #ifdef GENERATED_CODE_COVERAGE |
389 InitCoverageLog(); | 389 InitCoverageLog(); |
390 #endif | 390 #endif |
391 } | 391 } |
392 | 392 |
393 | 393 |
394 Assembler::~Assembler() { | 394 Assembler::~Assembler() { |
395 Isolate* isolate = Isolate::Current(); | |
396 if (own_buffer_) { | 395 if (own_buffer_) { |
397 if (isolate->assembler_spare_buffer() == NULL && | 396 if (isolate()->assembler_spare_buffer() == NULL && |
398 buffer_size_ == kMinimalBufferSize) { | 397 buffer_size_ == kMinimalBufferSize) { |
399 isolate->set_assembler_spare_buffer(buffer_); | 398 isolate()->set_assembler_spare_buffer(buffer_); |
400 } else { | 399 } else { |
401 DeleteArray(buffer_); | 400 DeleteArray(buffer_); |
402 } | 401 } |
403 } | 402 } |
404 } | 403 } |
405 | 404 |
406 | 405 |
407 void Assembler::GetCode(CodeDesc* desc) { | 406 void Assembler::GetCode(CodeDesc* desc) { |
408 // Finalize code (at this point overflow() may be true, but the gap ensures | 407 // Finalize code (at this point overflow() may be true, but the gap ensures |
409 // that we are still not overlapping instructions and relocation info). | 408 // that we are still not overlapping instructions and relocation info). |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
474 int disp = pc_offset() - branch_pos; | 473 int disp = pc_offset() - branch_pos; |
475 ASSERT(is_int8(disp)); | 474 ASSERT(is_int8(disp)); |
476 set_byte_at(branch_pos - sizeof(int8_t), disp); | 475 set_byte_at(branch_pos - sizeof(int8_t), disp); |
477 L->unresolved_branches_--; | 476 L->unresolved_branches_--; |
478 } | 477 } |
479 L->bind_to(pc_offset()); | 478 L->bind_to(pc_offset()); |
480 } | 479 } |
481 | 480 |
482 | 481 |
483 void Assembler::GrowBuffer() { | 482 void Assembler::GrowBuffer() { |
484 Isolate* isolate = Isolate::Current(); | |
485 ASSERT(buffer_overflow()); | 483 ASSERT(buffer_overflow()); |
486 if (!own_buffer_) FATAL("external code buffer is too small"); | 484 if (!own_buffer_) FATAL("external code buffer is too small"); |
487 | 485 |
488 // Compute new buffer size. | 486 // Compute new buffer size. |
489 CodeDesc desc; // the new buffer | 487 CodeDesc desc; // the new buffer |
490 if (buffer_size_ < 4*KB) { | 488 if (buffer_size_ < 4*KB) { |
491 desc.buffer_size = 4*KB; | 489 desc.buffer_size = 4*KB; |
492 } else { | 490 } else { |
493 desc.buffer_size = 2*buffer_size_; | 491 desc.buffer_size = 2*buffer_size_; |
494 } | 492 } |
(...skipping 18 matching lines...) Expand all Loading... |
513 | 511 |
514 // Copy the data. | 512 // Copy the data. |
515 intptr_t pc_delta = desc.buffer - buffer_; | 513 intptr_t pc_delta = desc.buffer - buffer_; |
516 intptr_t rc_delta = (desc.buffer + desc.buffer_size) - | 514 intptr_t rc_delta = (desc.buffer + desc.buffer_size) - |
517 (buffer_ + buffer_size_); | 515 (buffer_ + buffer_size_); |
518 memmove(desc.buffer, buffer_, desc.instr_size); | 516 memmove(desc.buffer, buffer_, desc.instr_size); |
519 memmove(rc_delta + reloc_info_writer.pos(), | 517 memmove(rc_delta + reloc_info_writer.pos(), |
520 reloc_info_writer.pos(), desc.reloc_size); | 518 reloc_info_writer.pos(), desc.reloc_size); |
521 | 519 |
522 // Switch buffers. | 520 // Switch buffers. |
523 if (isolate->assembler_spare_buffer() == NULL && | 521 if (isolate()->assembler_spare_buffer() == NULL && |
524 buffer_size_ == kMinimalBufferSize) { | 522 buffer_size_ == kMinimalBufferSize) { |
525 isolate->set_assembler_spare_buffer(buffer_); | 523 isolate()->set_assembler_spare_buffer(buffer_); |
526 } else { | 524 } else { |
527 DeleteArray(buffer_); | 525 DeleteArray(buffer_); |
528 } | 526 } |
529 buffer_ = desc.buffer; | 527 buffer_ = desc.buffer; |
530 buffer_size_ = desc.buffer_size; | 528 buffer_size_ = desc.buffer_size; |
531 pc_ += pc_delta; | 529 pc_ += pc_delta; |
532 if (last_pc_ != NULL) { | 530 if (last_pc_ != NULL) { |
533 last_pc_ += pc_delta; | 531 last_pc_ += pc_delta; |
534 } | 532 } |
535 reloc_info_writer.Reposition(reloc_info_writer.pos() + rc_delta, | 533 reloc_info_writer.Reposition(reloc_info_writer.pos() + rc_delta, |
(...skipping 492 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1028 void Assembler::cmpb_al(Immediate imm8) { | 1026 void Assembler::cmpb_al(Immediate imm8) { |
1029 ASSERT(is_int8(imm8.value_) || is_uint8(imm8.value_)); | 1027 ASSERT(is_int8(imm8.value_) || is_uint8(imm8.value_)); |
1030 EnsureSpace ensure_space(this); | 1028 EnsureSpace ensure_space(this); |
1031 last_pc_ = pc_; | 1029 last_pc_ = pc_; |
1032 emit(0x3c); | 1030 emit(0x3c); |
1033 emit(imm8.value_); | 1031 emit(imm8.value_); |
1034 } | 1032 } |
1035 | 1033 |
1036 | 1034 |
1037 void Assembler::cpuid() { | 1035 void Assembler::cpuid() { |
1038 ASSERT(Isolate::Current()->cpu_features()->IsEnabled(CPUID)); | 1036 ASSERT(isolate()->cpu_features()->IsEnabled(CPUID)); |
1039 EnsureSpace ensure_space(this); | 1037 EnsureSpace ensure_space(this); |
1040 last_pc_ = pc_; | 1038 last_pc_ = pc_; |
1041 emit(0x0F); | 1039 emit(0x0F); |
1042 emit(0xA2); | 1040 emit(0xA2); |
1043 } | 1041 } |
1044 | 1042 |
1045 | 1043 |
1046 void Assembler::cqo() { | 1044 void Assembler::cqo() { |
1047 EnsureSpace ensure_space(this); | 1045 EnsureSpace ensure_space(this); |
1048 last_pc_ = pc_; | 1046 last_pc_ = pc_; |
(...skipping 1330 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2379 void Assembler::fistp_s(const Operand& adr) { | 2377 void Assembler::fistp_s(const Operand& adr) { |
2380 EnsureSpace ensure_space(this); | 2378 EnsureSpace ensure_space(this); |
2381 last_pc_ = pc_; | 2379 last_pc_ = pc_; |
2382 emit_optional_rex_32(adr); | 2380 emit_optional_rex_32(adr); |
2383 emit(0xDB); | 2381 emit(0xDB); |
2384 emit_operand(3, adr); | 2382 emit_operand(3, adr); |
2385 } | 2383 } |
2386 | 2384 |
2387 | 2385 |
2388 void Assembler::fisttp_s(const Operand& adr) { | 2386 void Assembler::fisttp_s(const Operand& adr) { |
2389 ASSERT(Isolate::Current()->cpu_features()->IsEnabled(SSE3)); | 2387 ASSERT(isolate()->cpu_features()->IsEnabled(SSE3)); |
2390 EnsureSpace ensure_space(this); | 2388 EnsureSpace ensure_space(this); |
2391 last_pc_ = pc_; | 2389 last_pc_ = pc_; |
2392 emit_optional_rex_32(adr); | 2390 emit_optional_rex_32(adr); |
2393 emit(0xDB); | 2391 emit(0xDB); |
2394 emit_operand(1, adr); | 2392 emit_operand(1, adr); |
2395 } | 2393 } |
2396 | 2394 |
2397 | 2395 |
2398 void Assembler::fisttp_d(const Operand& adr) { | 2396 void Assembler::fisttp_d(const Operand& adr) { |
2399 ASSERT(Isolate::Current()->cpu_features()->IsEnabled(SSE3)); | 2397 ASSERT(isolate()->cpu_features()->IsEnabled(SSE3)); |
2400 EnsureSpace ensure_space(this); | 2398 EnsureSpace ensure_space(this); |
2401 last_pc_ = pc_; | 2399 last_pc_ = pc_; |
2402 emit_optional_rex_32(adr); | 2400 emit_optional_rex_32(adr); |
2403 emit(0xDD); | 2401 emit(0xDD); |
2404 emit_operand(1, adr); | 2402 emit_operand(1, adr); |
2405 } | 2403 } |
2406 | 2404 |
2407 | 2405 |
2408 void Assembler::fist_s(const Operand& adr) { | 2406 void Assembler::fist_s(const Operand& adr) { |
2409 EnsureSpace ensure_space(this); | 2407 EnsureSpace ensure_space(this); |
(...skipping 297 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2707 last_pc_ = pc_; | 2705 last_pc_ = pc_; |
2708 emit(0x66); | 2706 emit(0x66); |
2709 emit_rex_64(src, dst); | 2707 emit_rex_64(src, dst); |
2710 emit(0x0F); | 2708 emit(0x0F); |
2711 emit(0x7E); | 2709 emit(0x7E); |
2712 emit_sse_operand(src, dst); | 2710 emit_sse_operand(src, dst); |
2713 } | 2711 } |
2714 | 2712 |
2715 | 2713 |
2716 void Assembler::movdqa(const Operand& dst, XMMRegister src) { | 2714 void Assembler::movdqa(const Operand& dst, XMMRegister src) { |
2717 ASSERT(Isolate::Current()->cpu_features()->IsEnabled(SSE2)); | 2715 ASSERT(isolate()->cpu_features()->IsEnabled(SSE2)); |
2718 EnsureSpace ensure_space(this); | 2716 EnsureSpace ensure_space(this); |
2719 last_pc_ = pc_; | 2717 last_pc_ = pc_; |
2720 emit(0x66); | 2718 emit(0x66); |
2721 emit_rex_64(src, dst); | 2719 emit_rex_64(src, dst); |
2722 emit(0x0F); | 2720 emit(0x0F); |
2723 emit(0x7F); | 2721 emit(0x7F); |
2724 emit_sse_operand(src, dst); | 2722 emit_sse_operand(src, dst); |
2725 } | 2723 } |
2726 | 2724 |
2727 | 2725 |
2728 void Assembler::movdqa(XMMRegister dst, const Operand& src) { | 2726 void Assembler::movdqa(XMMRegister dst, const Operand& src) { |
2729 ASSERT(Isolate::Current()->cpu_features()->IsEnabled(SSE2)); | 2727 ASSERT(isolate()->cpu_features()->IsEnabled(SSE2)); |
2730 EnsureSpace ensure_space(this); | 2728 EnsureSpace ensure_space(this); |
2731 last_pc_ = pc_; | 2729 last_pc_ = pc_; |
2732 emit(0x66); | 2730 emit(0x66); |
2733 emit_rex_64(dst, src); | 2731 emit_rex_64(dst, src); |
2734 emit(0x0F); | 2732 emit(0x0F); |
2735 emit(0x6F); | 2733 emit(0x6F); |
2736 emit_sse_operand(dst, src); | 2734 emit_sse_operand(dst, src); |
2737 } | 2735 } |
2738 | 2736 |
2739 | 2737 |
(...skipping 422 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3162 // specially coded on x64 means that it is a relative 32 bit address, as used | 3160 // specially coded on x64 means that it is a relative 32 bit address, as used |
3163 // by branch instructions. | 3161 // by branch instructions. |
3164 return (1 << rmode_) & kApplyMask; | 3162 return (1 << rmode_) & kApplyMask; |
3165 } | 3163 } |
3166 | 3164 |
3167 | 3165 |
3168 | 3166 |
3169 } } // namespace v8::internal | 3167 } } // namespace v8::internal |
3170 | 3168 |
3171 #endif // V8_TARGET_ARCH_X64 | 3169 #endif // V8_TARGET_ARCH_X64 |
OLD | NEW |