| 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 478 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 489 void movb(Register dst, Immediate imm); | 489 void movb(Register dst, Immediate imm); |
| 490 void movb(const Operand& dst, Register src); | 490 void movb(const Operand& dst, Register src); |
| 491 | 491 |
| 492 void movl(Register dst, Register src); | 492 void movl(Register dst, Register src); |
| 493 void movl(Register dst, const Operand& src); | 493 void movl(Register dst, const Operand& src); |
| 494 void movl(const Operand& dst, Register src); | 494 void movl(const Operand& dst, Register src); |
| 495 void movl(const Operand& dst, Immediate imm); | 495 void movl(const Operand& dst, Immediate imm); |
| 496 // Load a 32-bit immediate value, zero-extended to 64 bits. | 496 // Load a 32-bit immediate value, zero-extended to 64 bits. |
| 497 void movl(Register dst, Immediate imm32); | 497 void movl(Register dst, Immediate imm32); |
| 498 | 498 |
| 499 // Move 64 bit register value to 64-bit memory location. |
| 500 void movq(const Operand& dst, Register src); |
| 501 // Move 64 bit memory location to 64-bit register value. |
| 499 void movq(Register dst, const Operand& src); | 502 void movq(Register dst, const Operand& src); |
| 503 void movq(Register dst, Register src); |
| 500 // Sign extends immediate 32-bit value to 64 bits. | 504 // Sign extends immediate 32-bit value to 64 bits. |
| 501 void movq(Register dst, Immediate x); | 505 void movq(Register dst, Immediate x); |
| 502 void movq(Register dst, Register src); | 506 // Move the offset of the label location relative to the current |
| 507 // position (after the move) to the destination. |
| 508 void movl(const Operand& dst, Label* src); |
| 503 | 509 |
| 504 // Move 64 bit register value to 64-bit memory location. | |
| 505 void movq(const Operand& dst, Register src); | |
| 506 // Move sign extended immediate to memory location. | 510 // Move sign extended immediate to memory location. |
| 507 void movq(const Operand& dst, Immediate value); | 511 void movq(const Operand& dst, Immediate value); |
| 508 // New x64 instructions to load a 64-bit immediate into a register. | 512 // New x64 instructions to load a 64-bit immediate into a register. |
| 509 // All 64-bit immediates must have a relocation mode. | 513 // All 64-bit immediates must have a relocation mode. |
| 510 void movq(Register dst, void* ptr, RelocInfo::Mode rmode); | 514 void movq(Register dst, void* ptr, RelocInfo::Mode rmode); |
| 511 void movq(Register dst, int64_t value, RelocInfo::Mode rmode); | 515 void movq(Register dst, int64_t value, RelocInfo::Mode rmode); |
| 512 void movq(Register dst, const char* s, RelocInfo::Mode rmode); | 516 void movq(Register dst, const char* s, RelocInfo::Mode rmode); |
| 513 // Moves the address of the external reference into the register. | 517 // Moves the address of the external reference into the register. |
| 514 void movq(Register dst, ExternalReference ext); | 518 void movq(Register dst, ExternalReference ext); |
| 515 void movq(Register dst, Handle<Object> handle, RelocInfo::Mode rmode); | 519 void movq(Register dst, Handle<Object> handle, RelocInfo::Mode rmode); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 528 void cmovq(Condition cc, Register dst, Register src); | 532 void cmovq(Condition cc, Register dst, Register src); |
| 529 void cmovq(Condition cc, Register dst, const Operand& src); | 533 void cmovq(Condition cc, Register dst, const Operand& src); |
| 530 void cmovl(Condition cc, Register dst, Register src); | 534 void cmovl(Condition cc, Register dst, Register src); |
| 531 void cmovl(Condition cc, Register dst, const Operand& src); | 535 void cmovl(Condition cc, Register dst, const Operand& src); |
| 532 | 536 |
| 533 // Exchange two registers | 537 // Exchange two registers |
| 534 void xchg(Register dst, Register src); | 538 void xchg(Register dst, Register src); |
| 535 | 539 |
| 536 // Arithmetics | 540 // Arithmetics |
| 537 void addl(Register dst, Register src) { | 541 void addl(Register dst, Register src) { |
| 538 arithmetic_op_32(0x03, dst, src); | 542 if (dst.low_bits() == 4) { // Forces SIB byte. |
| 543 arithmetic_op_32(0x01, src, dst); |
| 544 } else { |
| 545 arithmetic_op_32(0x03, dst, src); |
| 546 } |
| 539 } | 547 } |
| 540 | 548 |
| 541 void addl(Register dst, Immediate src) { | 549 void addl(Register dst, Immediate src) { |
| 542 immediate_arithmetic_op_32(0x0, dst, src); | 550 immediate_arithmetic_op_32(0x0, dst, src); |
| 543 } | 551 } |
| 544 | 552 |
| 545 void addl(Register dst, const Operand& src) { | 553 void addl(Register dst, const Operand& src) { |
| 546 arithmetic_op_32(0x03, dst, src); | 554 arithmetic_op_32(0x03, dst, src); |
| 547 } | 555 } |
| 548 | 556 |
| (...skipping 18 matching lines...) Expand all Loading... |
| 567 } | 575 } |
| 568 | 576 |
| 569 void addq(const Operand& dst, Immediate src) { | 577 void addq(const Operand& dst, Immediate src) { |
| 570 immediate_arithmetic_op(0x0, dst, src); | 578 immediate_arithmetic_op(0x0, dst, src); |
| 571 } | 579 } |
| 572 | 580 |
| 573 void cmpb(Register dst, Immediate src) { | 581 void cmpb(Register dst, Immediate src) { |
| 574 immediate_arithmetic_op_8(0x7, dst, src); | 582 immediate_arithmetic_op_8(0x7, dst, src); |
| 575 } | 583 } |
| 576 | 584 |
| 585 void cmpb_al(Immediate src); |
| 586 |
| 587 void cmpb(Register dst, Register src) { |
| 588 arithmetic_op(0x3A, dst, src); |
| 589 } |
| 590 |
| 591 void cmpb(Register dst, const Operand& src) { |
| 592 arithmetic_op(0x3A, dst, src); |
| 593 } |
| 594 |
| 595 void cmpb(const Operand& dst, Register src) { |
| 596 arithmetic_op(0x38, src, dst); |
| 597 } |
| 598 |
| 577 void cmpb(const Operand& dst, Immediate src) { | 599 void cmpb(const Operand& dst, Immediate src) { |
| 578 immediate_arithmetic_op_8(0x7, dst, src); | 600 immediate_arithmetic_op_8(0x7, dst, src); |
| 579 } | 601 } |
| 580 | 602 |
| 603 void cmpw(const Operand& dst, Immediate src) { |
| 604 immediate_arithmetic_op_16(0x7, dst, src); |
| 605 } |
| 606 |
| 607 void cmpw(Register dst, Immediate src) { |
| 608 immediate_arithmetic_op_16(0x7, dst, src); |
| 609 } |
| 610 |
| 611 void cmpw(Register dst, const Operand& src) { |
| 612 arithmetic_op_16(0x3B, dst, src); |
| 613 } |
| 614 |
| 615 void cmpw(Register dst, Register src) { |
| 616 arithmetic_op_16(0x3B, dst, src); |
| 617 } |
| 618 |
| 619 void cmpw(const Operand& dst, Register src) { |
| 620 arithmetic_op_16(0x39, src, dst); |
| 621 } |
| 622 |
| 581 void cmpl(Register dst, Register src) { | 623 void cmpl(Register dst, Register src) { |
| 582 arithmetic_op_32(0x3B, dst, src); | 624 arithmetic_op_32(0x3B, dst, src); |
| 583 } | 625 } |
| 584 | 626 |
| 585 void cmpl(Register dst, const Operand& src) { | 627 void cmpl(Register dst, const Operand& src) { |
| 586 arithmetic_op_32(0x3B, dst, src); | 628 arithmetic_op_32(0x3B, dst, src); |
| 587 } | 629 } |
| 588 | 630 |
| 589 void cmpl(const Operand& dst, Register src) { | 631 void cmpl(const Operand& dst, Register src) { |
| 590 arithmetic_op_32(0x39, src, dst); | 632 arithmetic_op_32(0x39, src, dst); |
| (...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 787 } | 829 } |
| 788 | 830 |
| 789 void subl(const Operand& dst, Immediate src) { | 831 void subl(const Operand& dst, Immediate src) { |
| 790 immediate_arithmetic_op_32(0x5, dst, src); | 832 immediate_arithmetic_op_32(0x5, dst, src); |
| 791 } | 833 } |
| 792 | 834 |
| 793 void subl(Register dst, Immediate src) { | 835 void subl(Register dst, Immediate src) { |
| 794 immediate_arithmetic_op_32(0x5, dst, src); | 836 immediate_arithmetic_op_32(0x5, dst, src); |
| 795 } | 837 } |
| 796 | 838 |
| 839 void subb(Register dst, Immediate src) { |
| 840 immediate_arithmetic_op_8(0x5, dst, src); |
| 841 } |
| 842 |
| 797 void testb(Register reg, Immediate mask); | 843 void testb(Register reg, Immediate mask); |
| 798 void testb(const Operand& op, Immediate mask); | 844 void testb(const Operand& op, Immediate mask); |
| 799 void testl(Register dst, Register src); | 845 void testl(Register dst, Register src); |
| 800 void testl(Register reg, Immediate mask); | 846 void testl(Register reg, Immediate mask); |
| 801 void testl(const Operand& op, Immediate mask); | 847 void testl(const Operand& op, Immediate mask); |
| 802 void testq(const Operand& op, Register reg); | 848 void testq(const Operand& op, Register reg); |
| 803 void testq(Register dst, Register src); | 849 void testq(Register dst, Register src); |
| 804 void testq(Register dst, Immediate mask); | 850 void testq(Register dst, Immediate mask); |
| 805 | 851 |
| 806 void xor_(Register dst, Register src) { | 852 void xor_(Register dst, Register src) { |
| (...skipping 327 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1134 emit(0xC0 | code << 3 | rm_reg.low_bits()); | 1180 emit(0xC0 | code << 3 | rm_reg.low_bits()); |
| 1135 } | 1181 } |
| 1136 | 1182 |
| 1137 // Emit the code-object-relative offset of the label's position | 1183 // Emit the code-object-relative offset of the label's position |
| 1138 inline void emit_code_relative_offset(Label* label); | 1184 inline void emit_code_relative_offset(Label* label); |
| 1139 | 1185 |
| 1140 // Emit machine code for one of the operations ADD, ADC, SUB, SBC, | 1186 // Emit machine code for one of the operations ADD, ADC, SUB, SBC, |
| 1141 // AND, OR, XOR, or CMP. The encodings of these operations are all | 1187 // AND, OR, XOR, or CMP. The encodings of these operations are all |
| 1142 // similar, differing just in the opcode or in the reg field of the | 1188 // similar, differing just in the opcode or in the reg field of the |
| 1143 // ModR/M byte. | 1189 // ModR/M byte. |
| 1144 void arithmetic_op(byte opcode, Register dst, Register src); | 1190 void arithmetic_op_16(byte opcode, Register reg, Register rm_reg); |
| 1145 void arithmetic_op_32(byte opcode, Register dst, Register src); | 1191 void arithmetic_op_16(byte opcode, Register reg, const Operand& rm_reg); |
| 1192 void arithmetic_op_32(byte opcode, Register reg, Register rm_reg); |
| 1146 void arithmetic_op_32(byte opcode, Register reg, const Operand& rm_reg); | 1193 void arithmetic_op_32(byte opcode, Register reg, const Operand& rm_reg); |
| 1194 void arithmetic_op(byte opcode, Register reg, Register rm_reg); |
| 1147 void arithmetic_op(byte opcode, Register reg, const Operand& rm_reg); | 1195 void arithmetic_op(byte opcode, Register reg, const Operand& rm_reg); |
| 1148 void immediate_arithmetic_op(byte subcode, Register dst, Immediate src); | 1196 void immediate_arithmetic_op(byte subcode, Register dst, Immediate src); |
| 1149 void immediate_arithmetic_op(byte subcode, const Operand& dst, Immediate src); | 1197 void immediate_arithmetic_op(byte subcode, const Operand& dst, Immediate src); |
| 1198 // Operate on a byte in memory or register. |
| 1199 void immediate_arithmetic_op_8(byte subcode, |
| 1200 Register dst, |
| 1201 Immediate src); |
| 1202 void immediate_arithmetic_op_8(byte subcode, |
| 1203 const Operand& dst, |
| 1204 Immediate src); |
| 1205 // Operate on a word in memory or register. |
| 1206 void immediate_arithmetic_op_16(byte subcode, |
| 1207 Register dst, |
| 1208 Immediate src); |
| 1209 void immediate_arithmetic_op_16(byte subcode, |
| 1210 const Operand& dst, |
| 1211 Immediate src); |
| 1150 // Operate on a 32-bit word in memory or register. | 1212 // Operate on a 32-bit word in memory or register. |
| 1151 void immediate_arithmetic_op_32(byte subcode, | 1213 void immediate_arithmetic_op_32(byte subcode, |
| 1214 Register dst, |
| 1215 Immediate src); |
| 1216 void immediate_arithmetic_op_32(byte subcode, |
| 1152 const Operand& dst, | 1217 const Operand& dst, |
| 1153 Immediate src); | 1218 Immediate src); |
| 1154 void immediate_arithmetic_op_32(byte subcode, | 1219 |
| 1155 Register dst, | |
| 1156 Immediate src); | |
| 1157 // Operate on a byte in memory or register. | |
| 1158 void immediate_arithmetic_op_8(byte subcode, | |
| 1159 const Operand& dst, | |
| 1160 Immediate src); | |
| 1161 void immediate_arithmetic_op_8(byte subcode, | |
| 1162 Register dst, | |
| 1163 Immediate src); | |
| 1164 // Emit machine code for a shift operation. | 1220 // Emit machine code for a shift operation. |
| 1165 void shift(Register dst, Immediate shift_amount, int subcode); | 1221 void shift(Register dst, Immediate shift_amount, int subcode); |
| 1166 void shift_32(Register dst, Immediate shift_amount, int subcode); | 1222 void shift_32(Register dst, Immediate shift_amount, int subcode); |
| 1167 // Shift dst by cl % 64 bits. | 1223 // Shift dst by cl % 64 bits. |
| 1168 void shift(Register dst, int subcode); | 1224 void shift(Register dst, int subcode); |
| 1169 void shift_32(Register dst, int subcode); | 1225 void shift_32(Register dst, int subcode); |
| 1170 | 1226 |
| 1171 void emit_farith(int b1, int b2, int i); | 1227 void emit_farith(int b1, int b2, int i); |
| 1172 | 1228 |
| 1173 // labels | 1229 // labels |
| 1174 // void print(Label* L); | 1230 // void print(Label* L); |
| 1175 void bind_to(Label* L, int pos); | 1231 void bind_to(Label* L, int pos); |
| 1176 void link_to(Label* L, Label* appendix); | 1232 void link_to(Label* L, Label* appendix); |
| 1177 | 1233 |
| 1178 // record reloc info for current pc_ | 1234 // record reloc info for current pc_ |
| 1179 void RecordRelocInfo(RelocInfo::Mode rmode, intptr_t data = 0); | 1235 void RecordRelocInfo(RelocInfo::Mode rmode, intptr_t data = 0); |
| 1180 | 1236 |
| 1181 friend class CodePatcher; | 1237 friend class CodePatcher; |
| 1182 friend class EnsureSpace; | 1238 friend class EnsureSpace; |
| 1239 friend class RegExpMacroAssemblerX64; |
| 1183 | 1240 |
| 1184 // Code buffer: | 1241 // Code buffer: |
| 1185 // The buffer into which code and relocation info are generated. | 1242 // The buffer into which code and relocation info are generated. |
| 1186 byte* buffer_; | 1243 byte* buffer_; |
| 1187 int buffer_size_; | 1244 int buffer_size_; |
| 1188 // True if the assembler owns the buffer, false if buffer is external. | 1245 // True if the assembler owns the buffer, false if buffer is external. |
| 1189 bool own_buffer_; | 1246 bool own_buffer_; |
| 1190 // A previously allocated buffer of kMinimalBufferSize bytes, or NULL. | 1247 // A previously allocated buffer of kMinimalBufferSize bytes, or NULL. |
| 1191 static byte* spare_buffer_; | 1248 static byte* spare_buffer_; |
| 1192 | 1249 |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1228 private: | 1285 private: |
| 1229 Assembler* assembler_; | 1286 Assembler* assembler_; |
| 1230 #ifdef DEBUG | 1287 #ifdef DEBUG |
| 1231 int space_before_; | 1288 int space_before_; |
| 1232 #endif | 1289 #endif |
| 1233 }; | 1290 }; |
| 1234 | 1291 |
| 1235 } } // namespace v8::internal | 1292 } } // namespace v8::internal |
| 1236 | 1293 |
| 1237 #endif // V8_X64_ASSEMBLER_X64_H_ | 1294 #endif // V8_X64_ASSEMBLER_X64_H_ |
| OLD | NEW |