Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(614)

Side by Side Diff: src/x64/assembler-x64.cc

Issue 118380: Add statistics operations and long calls and jumps to x64 macro assembler. (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: '' Created 11 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/x64/assembler-x64.h ('k') | src/x64/builtins-x64.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2009 the V8 project authors. All rights reserved. 1 // Copyright 2009 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 433 matching lines...) Expand 10 before | Expand all | Expand 10 after
444 emit_operand(Register::toRegister(subcode), dst); 444 emit_operand(Register::toRegister(subcode), dst);
445 emit(src.value_); 445 emit(src.value_);
446 } else { 446 } else {
447 emit(0x81); 447 emit(0x81);
448 emit_operand(Register::toRegister(subcode), dst); 448 emit_operand(Register::toRegister(subcode), dst);
449 emitl(src.value_); 449 emitl(src.value_);
450 } 450 }
451 } 451 }
452 452
453 453
454 void Assembler::immediate_arithmetic_op_32(byte subcode,
455 const Operand& dst,
456 Immediate src) {
457 EnsureSpace ensure_space(this);
458 last_pc_ = pc_;
459 emit_optional_rex_32(dst);
460 if (is_int8(src.value_)) {
461 emit(0x83);
462 emit_operand(Register::toRegister(subcode), dst);
463 emit(src.value_);
464 } else {
465 emit(0x81);
466 emit_operand(Register::toRegister(subcode), dst);
467 emitl(src.value_);
468 }
469 }
470
471
454 void Assembler::shift(Register dst, Immediate shift_amount, int subcode) { 472 void Assembler::shift(Register dst, Immediate shift_amount, int subcode) {
455 EnsureSpace ensure_space(this); 473 EnsureSpace ensure_space(this);
456 last_pc_ = pc_; 474 last_pc_ = pc_;
457 ASSERT(is_uint6(shift_amount.value_)); // illegal shift count 475 ASSERT(is_uint6(shift_amount.value_)); // illegal shift count
458 if (shift_amount.value_ == 1) { 476 if (shift_amount.value_ == 1) {
459 emit_rex_64(dst); 477 emit_rex_64(dst);
460 emit(0xD1); 478 emit(0xD1);
461 emit_modrm(subcode, dst); 479 emit_modrm(subcode, dst);
462 } else { 480 } else {
463 emit_rex_64(dst); 481 emit_rex_64(dst);
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
523 last_pc_ = pc_; 541 last_pc_ = pc_;
524 // Opcode: FF /2 r64 542 // Opcode: FF /2 r64
525 if (adr.code() > 7) { 543 if (adr.code() > 7) {
526 emit_rex_64(adr); 544 emit_rex_64(adr);
527 } 545 }
528 emit(0xFF); 546 emit(0xFF);
529 emit_modrm(0x2, adr); 547 emit_modrm(0x2, adr);
530 } 548 }
531 549
532 550
533 void Assembler::cpuid() {
534 ASSERT(CpuFeatures::IsEnabled(CpuFeatures::CPUID));
535 EnsureSpace ensure_space(this);
536 last_pc_ = pc_;
537 emit(0x0F);
538 emit(0xA2);
539 }
540
541
542 void Assembler::call(const Operand& op) { 551 void Assembler::call(const Operand& op) {
543 EnsureSpace ensure_space(this); 552 EnsureSpace ensure_space(this);
544 last_pc_ = pc_; 553 last_pc_ = pc_;
545 // Opcode: FF /2 m64 554 // Opcode: FF /2 m64
546 emit_rex_64(op); 555 emit_rex_64(op);
547 emit(0xFF); 556 emit(0xFF);
548 emit_operand(2, op); 557 emit_operand(2, op);
549 } 558 }
550 559
551 560
561 void Assembler::cpuid() {
562 ASSERT(CpuFeatures::IsEnabled(CpuFeatures::CPUID));
563 EnsureSpace ensure_space(this);
564 last_pc_ = pc_;
565 emit(0x0F);
566 emit(0xA2);
567 }
568
569
552 void Assembler::cqo() { 570 void Assembler::cqo() {
553 EnsureSpace ensure_space(this); 571 EnsureSpace ensure_space(this);
554 last_pc_ = pc_; 572 last_pc_ = pc_;
555 emit_rex_64(); 573 emit_rex_64();
556 emit(0x99); 574 emit(0x99);
557 } 575 }
558 576
559 577
560 void Assembler::dec(Register dst) { 578 void Assembler::decq(Register dst) {
561 EnsureSpace ensure_space(this); 579 EnsureSpace ensure_space(this);
562 last_pc_ = pc_; 580 last_pc_ = pc_;
563 emit_rex_64(dst); 581 emit_rex_64(dst);
564 emit(0xFF); 582 emit(0xFF);
565 emit_modrm(0x1, dst); 583 emit_modrm(0x1, dst);
566 } 584 }
567 585
568 586
569 void Assembler::dec(const Operand& dst) { 587 void Assembler::decq(const Operand& dst) {
570 EnsureSpace ensure_space(this); 588 EnsureSpace ensure_space(this);
571 last_pc_ = pc_; 589 last_pc_ = pc_;
572 emit_rex_64(dst); 590 emit_rex_64(dst);
573 emit(0xFF); 591 emit(0xFF);
574 emit_operand(1, dst); 592 emit_operand(1, dst);
575 } 593 }
576 594
577 595
596 void Assembler::decl(const Operand& dst) {
597 EnsureSpace ensure_space(this);
598 last_pc_ = pc_;
599 emit_optional_rex_32(dst);
600 emit(0xFF);
601 emit_operand(1, dst);
602 }
603
604
578 void Assembler::enter(Immediate size) { 605 void Assembler::enter(Immediate size) {
579 EnsureSpace ensure_space(this); 606 EnsureSpace ensure_space(this);
580 last_pc_ = pc_; 607 last_pc_ = pc_;
581 emit(0xC8); 608 emit(0xC8);
582 emitw(size.value_); // 16 bit operand, always. 609 emitw(size.value_); // 16 bit operand, always.
583 emit(0); 610 emit(0);
584 } 611 }
585 612
586 613
587 void Assembler::hlt() { 614 void Assembler::hlt() {
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
619 emit_modrm(dst, src); 646 emit_modrm(dst, src);
620 emit(imm.value_); 647 emit(imm.value_);
621 } else { 648 } else {
622 emit(0x69); 649 emit(0x69);
623 emit_modrm(dst, src); 650 emit_modrm(dst, src);
624 emitl(imm.value_); 651 emitl(imm.value_);
625 } 652 }
626 } 653 }
627 654
628 655
629 void Assembler::inc(Register dst) { 656 void Assembler::incq(Register dst) {
630 EnsureSpace ensure_space(this); 657 EnsureSpace ensure_space(this);
631 last_pc_ = pc_; 658 last_pc_ = pc_;
632 emit_rex_64(dst); 659 emit_rex_64(dst);
633 emit(0xFF); 660 emit(0xFF);
634 emit_modrm(0x0, dst); 661 emit_modrm(0x0, dst);
635 } 662 }
636 663
637 664
638 void Assembler::inc(const Operand& dst) { 665 void Assembler::incq(const Operand& dst) {
639 EnsureSpace ensure_space(this); 666 EnsureSpace ensure_space(this);
640 last_pc_ = pc_; 667 last_pc_ = pc_;
641 emit_rex_64(dst); 668 emit_rex_64(dst);
642 emit(0xFF); 669 emit(0xFF);
643 emit_operand(0, dst); 670 emit_operand(0, dst);
644 } 671 }
645 672
646 673
674 void Assembler::incl(const Operand& dst) {
675 EnsureSpace ensure_space(this);
676 last_pc_ = pc_;
677 emit_optional_rex_32(dst);
678 emit(0xFF);
679 emit_operand(0, dst);
680 }
681
682
647 void Assembler::int3() { 683 void Assembler::int3() {
648 EnsureSpace ensure_space(this); 684 EnsureSpace ensure_space(this);
649 last_pc_ = pc_; 685 last_pc_ = pc_;
650 emit(0xCC); 686 emit(0xCC);
651 } 687 }
652 688
653 689
654 void Assembler::j(Condition cc, Label* L) { 690 void Assembler::j(Condition cc, Label* L) {
655 EnsureSpace ensure_space(this); 691 EnsureSpace ensure_space(this);
656 last_pc_ = pc_; 692 last_pc_ = pc_;
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after
805 841
806 void Assembler::movl(const Operand& dst, Register src) { 842 void Assembler::movl(const Operand& dst, Register src) {
807 EnsureSpace ensure_space(this); 843 EnsureSpace ensure_space(this);
808 last_pc_ = pc_; 844 last_pc_ = pc_;
809 emit_optional_rex_32(src, dst); 845 emit_optional_rex_32(src, dst);
810 emit(0x89); 846 emit(0x89);
811 emit_operand(src, dst); 847 emit_operand(src, dst);
812 } 848 }
813 849
814 850
851 void Assembler::movl(const Operand& dst, Immediate value) {
852 EnsureSpace ensure_space(this);
853 last_pc_ = pc_;
854 emit_optional_rex_32(dst);
855 emit(0xC7);
856 emit_operand(0x0, dst);
857 emit(value); // Only 32-bit immediates are possible, not 8-bit immediates.
858 }
859
860
815 void Assembler::movl(Register dst, Immediate value) { 861 void Assembler::movl(Register dst, Immediate value) {
816 EnsureSpace ensure_space(this); 862 EnsureSpace ensure_space(this);
817 last_pc_ = pc_; 863 last_pc_ = pc_;
818 emit_optional_rex_32(dst); 864 emit_optional_rex_32(dst);
819 emit(0xC7); 865 emit(0xC7);
820 emit_modrm(0x0, dst); 866 emit_modrm(0x0, dst);
821 emit(value); // Only 32-bit immediates are possible, not 8-bit immediates. 867 emit(value); // Only 32-bit immediates are possible, not 8-bit immediates.
822 } 868 }
823 869
824 870
(...skipping 300 matching lines...) Expand 10 before | Expand all | Expand 10 after
1125 emit(0xD1); 1171 emit(0xD1);
1126 emit_modrm(0x2, dst); 1172 emit_modrm(0x2, dst);
1127 } else { 1173 } else {
1128 emit_rex_64(dst); 1174 emit_rex_64(dst);
1129 emit(0xC1); 1175 emit(0xC1);
1130 emit_modrm(0x2, dst); 1176 emit_modrm(0x2, dst);
1131 emit(imm8); 1177 emit(imm8);
1132 } 1178 }
1133 } 1179 }
1134 1180
1181 void Assembler::rdtsc() {
1182 EnsureSpace ensure_space(this);
1183 last_pc_ = pc_;
1184 emit(0x0F);
1185 emit(0x31);
1186 }
1187
1135 1188
1136 void Assembler::ret(int imm16) { 1189 void Assembler::ret(int imm16) {
1137 EnsureSpace ensure_space(this); 1190 EnsureSpace ensure_space(this);
1138 last_pc_ = pc_; 1191 last_pc_ = pc_;
1139 ASSERT(is_uint16(imm16)); 1192 ASSERT(is_uint16(imm16));
1140 if (imm16 == 0) { 1193 if (imm16 == 0) {
1141 emit(0xC3); 1194 emit(0xC3);
1142 } else { 1195 } else {
1143 emit(0xC2); 1196 emit(0xC2);
1144 emit(imm16 & 0xFF); 1197 emit(imm16 & 0xFF);
1145 emit((imm16 >> 8) & 0xFF); 1198 emit((imm16 >> 8) & 0xFF);
1146 } 1199 }
1147 } 1200 }
1148 1201
1149 1202
1203 void Assembler::setcc(Condition cc, Register reg) {
1204 EnsureSpace ensure_space(this);
1205 last_pc_ = pc_;
1206 ASSERT(0 <= cc && cc < 16);
1207 if (reg.code() > 3) { // Use x64 byte registers, where different.
1208 emit_rex_32(reg);
1209 }
1210 emit(0x0F);
1211 emit(0x90 | cc);
1212 emit_modrm(0x0, reg);
1213 }
1214
1215
1150 void Assembler::shld(Register dst, Register src) { 1216 void Assembler::shld(Register dst, Register src) {
1151 EnsureSpace ensure_space(this); 1217 EnsureSpace ensure_space(this);
1152 last_pc_ = pc_; 1218 last_pc_ = pc_;
1153 emit_rex_64(src, dst); 1219 emit_rex_64(src, dst);
1154 emit(0x0F); 1220 emit(0x0F);
1155 emit(0xA5); 1221 emit(0xA5);
1156 emit_modrm(src, dst); 1222 emit_modrm(src, dst);
1157 } 1223 }
1158 1224
1159 1225
(...skipping 465 matching lines...) Expand 10 before | Expand all | Expand 10 after
1625 UNIMPLEMENTED(); 1691 UNIMPLEMENTED();
1626 return NULL; 1692 return NULL;
1627 } 1693 }
1628 1694
1629 byte* JavaScriptFrame::GetCallerStackPointer() const { 1695 byte* JavaScriptFrame::GetCallerStackPointer() const {
1630 UNIMPLEMENTED(); 1696 UNIMPLEMENTED();
1631 return NULL; 1697 return NULL;
1632 } 1698 }
1633 1699
1634 } } // namespace v8::internal 1700 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/x64/assembler-x64.h ('k') | src/x64/builtins-x64.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698