1 // Copyright (c) 1994-2006 Sun Microsystems Inc. 2 // All Rights Reserved. 3 // 4 // Redistribution and use in source and binary forms, with or without 5 // modification, are permitted provided that the following conditions are 6 // met: 7 // 8 // - Redistributions of source code must retain the above copyright notice, 9 // this list of conditions and the following disclaimer. 10 // 11 // - Redistribution in binary form must reproduce the above copyright 12 // notice, this list of conditions and the following disclaimer in the 13 // documentation and/or other materials provided with the distribution. 14 // 15 // - Neither the name of Sun Microsystems or the names of contributors may 16 // be used to endorse or promote products derived from this software without 17 // specific prior written permission. 18 // 19 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS 20 // IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 21 // THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 22 // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 23 // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 24 // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 25 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 26 // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 27 // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 28 // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 29 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30 31 // The original source code covered by the above license above has been 32 // modified significantly by Google Inc. 33 // Copyright 2012 the V8 project authors. All rights reserved. 34 35 // A lightweight X64 Assembler. 36 37 #ifndef V8_X64_ASSEMBLER_X64_H_ 38 #define V8_X64_ASSEMBLER_X64_H_ 39 40 #include "serialize.h" 41 42 namespace v8 { 43 namespace internal { 44 45 // Utility functions 46 47 // Test whether a 64-bit value is in a specific range. 48 inline bool is_uint32(int64_t x) { 49 static const uint64_t kMaxUInt32 = V8_UINT64_C(0xffffffff); 50 return static_cast<uint64_t>(x) <= kMaxUInt32; 51 } 52 53 inline bool is_int32(int64_t x) { 54 static const int64_t kMinInt32 = -V8_INT64_C(0x80000000); 55 return is_uint32(x - kMinInt32); 56 } 57 58 inline bool uint_is_int32(uint64_t x) { 59 static const uint64_t kMaxInt32 = V8_UINT64_C(0x7fffffff); 60 return x <= kMaxInt32; 61 } 62 63 inline bool is_uint32(uint64_t x) { 64 static const uint64_t kMaxUInt32 = V8_UINT64_C(0xffffffff); 65 return x <= kMaxUInt32; 66 } 67 68 // CPU Registers. 69 // 70 // 1) We would prefer to use an enum, but enum values are assignment- 71 // compatible with int, which has caused code-generation bugs. 72 // 73 // 2) We would prefer to use a class instead of a struct but we don't like 74 // the register initialization to depend on the particular initialization 75 // order (which appears to be different on OS X, Linux, and Windows for the 76 // installed versions of C++ we tried). Using a struct permits C-style 77 // "initialization". Also, the Register objects cannot be const as this 78 // forces initialization stubs in MSVC, making us dependent on initialization 79 // order. 80 // 81 // 3) By not using an enum, we are possibly preventing the compiler from 82 // doing certain constant folds, which may significantly reduce the 83 // code generated for some assembly instructions (because they boil down 84 // to a few constants). If this is a problem, we could change the code 85 // such that we use an enum in optimized mode, and the struct in debug 86 // mode. This way we get the compile-time error checking in debug mode 87 // and best performance in optimized code. 88 // 89 90 struct Register { 91 // The non-allocatable registers are: 92 // rsp - stack pointer 93 // rbp - frame pointer 94 // r10 - fixed scratch register 95 // r12 - smi constant register 96 // r13 - root register 97 static const int kMaxNumAllocatableRegisters = 11; 98 static int NumAllocatableRegisters() { 99 return kMaxNumAllocatableRegisters; 100 } 101 static const int kNumRegisters = 16; 102 103 static int ToAllocationIndex(Register reg) { 104 return kAllocationIndexByRegisterCode[reg.code()]; 105 } 106 107 static Register FromAllocationIndex(int index) { 108 ASSERT(index >= 0 && index < kMaxNumAllocatableRegisters); 109 Register result = { kRegisterCodeByAllocationIndex[index] }; 110 return result; 111 } 112 113 static const char* AllocationIndexToString(int index) { 114 ASSERT(index >= 0 && index < kMaxNumAllocatableRegisters); 115 const char* const names[] = { 116 "rax", 117 "rbx", 118 "rdx", 119 "rcx", 120 "rsi", 121 "rdi", 122 "r8", 123 "r9", 124 "r11", 125 "r14", 126 "r15" 127 }; 128 return names[index]; 129 } 130 131 static Register from_code(int code) { 132 Register r = { code }; 133 return r; 134 } 135 bool is_valid() const { return 0 <= code_ && code_ < kNumRegisters; } 136 bool is(Register reg) const { return code_ == reg.code_; } 137 // rax, rbx, rcx and rdx are byte registers, the rest are not. 138 bool is_byte_register() const { return code_ <= 3; } 139 int code() const { 140 ASSERT(is_valid()); 141 return code_; 142 } 143 int bit() const { 144 return 1 << code_; 145 } 146 147 // Return the high bit of the register code as a 0 or 1. Used often 148 // when constructing the REX prefix byte. 149 int high_bit() const { 150 return code_ >> 3; 151 } 152 // Return the 3 low bits of the register code. Used when encoding registers 153 // in modR/M, SIB, and opcode bytes. 154 int low_bits() const { 155 return code_ & 0x7; 156 } 157 158 // Unfortunately we can't make this private in a struct when initializing 159 // by assignment. 160 int code_; 161 162 private: 163 static const int kRegisterCodeByAllocationIndex[kMaxNumAllocatableRegisters]; 164 static const int kAllocationIndexByRegisterCode[kNumRegisters]; 165 }; 166 167 const int kRegister_rax_Code = 0; 168 const int kRegister_rcx_Code = 1; 169 const int kRegister_rdx_Code = 2; 170 const int kRegister_rbx_Code = 3; 171 const int kRegister_rsp_Code = 4; 172 const int kRegister_rbp_Code = 5; 173 const int kRegister_rsi_Code = 6; 174 const int kRegister_rdi_Code = 7; 175 const int kRegister_r8_Code = 8; 176 const int kRegister_r9_Code = 9; 177 const int kRegister_r10_Code = 10; 178 const int kRegister_r11_Code = 11; 179 const int kRegister_r12_Code = 12; 180 const int kRegister_r13_Code = 13; 181 const int kRegister_r14_Code = 14; 182 const int kRegister_r15_Code = 15; 183 const int kRegister_no_reg_Code = -1; 184 185 const Register rax = { kRegister_rax_Code }; 186 const Register rcx = { kRegister_rcx_Code }; 187 const Register rdx = { kRegister_rdx_Code }; 188 const Register rbx = { kRegister_rbx_Code }; 189 const Register rsp = { kRegister_rsp_Code }; 190 const Register rbp = { kRegister_rbp_Code }; 191 const Register rsi = { kRegister_rsi_Code }; 192 const Register rdi = { kRegister_rdi_Code }; 193 const Register r8 = { kRegister_r8_Code }; 194 const Register r9 = { kRegister_r9_Code }; 195 const Register r10 = { kRegister_r10_Code }; 196 const Register r11 = { kRegister_r11_Code }; 197 const Register r12 = { kRegister_r12_Code }; 198 const Register r13 = { kRegister_r13_Code }; 199 const Register r14 = { kRegister_r14_Code }; 200 const Register r15 = { kRegister_r15_Code }; 201 const Register no_reg = { kRegister_no_reg_Code }; 202 203 #ifdef _WIN64 204 // Windows calling convention 205 const Register arg_reg_1 = { kRegister_rcx_Code }; 206 const Register arg_reg_2 = { kRegister_rdx_Code }; 207 const Register arg_reg_3 = { kRegister_r8_Code }; 208 const Register arg_reg_4 = { kRegister_r9_Code }; 209 #else 210 // AMD64 calling convention 211 const Register arg_reg_1 = { kRegister_rdi_Code }; 212 const Register arg_reg_2 = { kRegister_rsi_Code }; 213 const Register arg_reg_3 = { kRegister_rdx_Code }; 214 const Register arg_reg_4 = { kRegister_rcx_Code }; 215 #endif // _WIN64 216 217 struct XMMRegister { 218 static const int kMaxNumRegisters = 16; 219 static const int kMaxNumAllocatableRegisters = 15; 220 static int NumAllocatableRegisters() { 221 return kMaxNumAllocatableRegisters; 222 } 223 224 static int ToAllocationIndex(XMMRegister reg) { 225 ASSERT(reg.code() != 0); 226 return reg.code() - 1; 227 } 228 229 static XMMRegister FromAllocationIndex(int index) { 230 ASSERT(0 <= index && index < kMaxNumAllocatableRegisters); 231 XMMRegister result = { index + 1 }; 232 return result; 233 } 234 235 static const char* AllocationIndexToString(int index) { 236 ASSERT(index >= 0 && index < kMaxNumAllocatableRegisters); 237 const char* const names[] = { 238 "xmm1", 239 "xmm2", 240 "xmm3", 241 "xmm4", 242 "xmm5", 243 "xmm6", 244 "xmm7", 245 "xmm8", 246 "xmm9", 247 "xmm10", 248 "xmm11", 249 "xmm12", 250 "xmm13", 251 "xmm14", 252 "xmm15" 253 }; 254 return names[index]; 255 } 256 257 static XMMRegister from_code(int code) { 258 ASSERT(code >= 0); 259 ASSERT(code < kMaxNumRegisters); 260 XMMRegister r = { code }; 261 return r; 262 } 263 bool is_valid() const { return 0 <= code_ && code_ < kMaxNumRegisters; } 264 bool is(XMMRegister reg) const { return code_ == reg.code_; } 265 int code() const { 266 ASSERT(is_valid()); 267 return code_; 268 } 269 270 // Return the high bit of the register code as a 0 or 1. Used often 271 // when constructing the REX prefix byte. 272 int high_bit() const { 273 return code_ >> 3; 274 } 275 // Return the 3 low bits of the register code. Used when encoding registers 276 // in modR/M, SIB, and opcode bytes. 277 int low_bits() const { 278 return code_ & 0x7; 279 } 280 281 int code_; 282 }; 283 284 const XMMRegister xmm0 = { 0 }; 285 const XMMRegister xmm1 = { 1 }; 286 const XMMRegister xmm2 = { 2 }; 287 const XMMRegister xmm3 = { 3 }; 288 const XMMRegister xmm4 = { 4 }; 289 const XMMRegister xmm5 = { 5 }; 290 const XMMRegister xmm6 = { 6 }; 291 const XMMRegister xmm7 = { 7 }; 292 const XMMRegister xmm8 = { 8 }; 293 const XMMRegister xmm9 = { 9 }; 294 const XMMRegister xmm10 = { 10 }; 295 const XMMRegister xmm11 = { 11 }; 296 const XMMRegister xmm12 = { 12 }; 297 const XMMRegister xmm13 = { 13 }; 298 const XMMRegister xmm14 = { 14 }; 299 const XMMRegister xmm15 = { 15 }; 300 301 302 typedef XMMRegister DoubleRegister; 303 304 305 enum Condition { 306 // any value < 0 is considered no_condition 307 no_condition = -1, 308 309 overflow = 0, 310 no_overflow = 1, 311 below = 2, 312 above_equal = 3, 313 equal = 4, 314 not_equal = 5, 315 below_equal = 6, 316 above = 7, 317 negative = 8, 318 positive = 9, 319 parity_even = 10, 320 parity_odd = 11, 321 less = 12, 322 greater_equal = 13, 323 less_equal = 14, 324 greater = 15, 325 326 // Fake conditions that are handled by the 327 // opcodes using them. 328 always = 16, 329 never = 17, 330 // aliases 331 carry = below, 332 not_carry = above_equal, 333 zero = equal, 334 not_zero = not_equal, 335 sign = negative, 336 not_sign = positive, 337 last_condition = greater 338 }; 339 340 341 // Returns the equivalent of !cc. 342 // Negation of the default no_condition (-1) results in a non-default 343 // no_condition value (-2). As long as tests for no_condition check 344 // for condition < 0, this will work as expected. 345 inline Condition NegateCondition(Condition cc) { 346 return static_cast<Condition>(cc ^ 1); 347 } 348 349 350 // Corresponds to transposing the operands of a comparison. 351 inline Condition ReverseCondition(Condition cc) { 352 switch (cc) { 353 case below: 354 return above; 355 case above: 356 return below; 357 case above_equal: 358 return below_equal; 359 case below_equal: 360 return above_equal; 361 case less: 362 return greater; 363 case greater: 364 return less; 365 case greater_equal: 366 return less_equal; 367 case less_equal: 368 return greater_equal; 369 default: 370 return cc; 371 }; 372 } 373 374 375 // ----------------------------------------------------------------------------- 376 // Machine instruction Immediates 377 378 class Immediate BASE_EMBEDDED { 379 public: 380 explicit Immediate(int32_t value) : value_(value) {} 381 382 private: 383 int32_t value_; 384 385 friend class Assembler; 386 }; 387 388 389 // ----------------------------------------------------------------------------- 390 // Machine instruction Operands 391 392 enum ScaleFactor { 393 times_1 = 0, 394 times_2 = 1, 395 times_4 = 2, 396 times_8 = 3, 397 times_int_size = times_4, 398 times_pointer_size = times_8 399 }; 400 401 402 class Operand BASE_EMBEDDED { 403 public: 404 // [base + disp/r] 405 Operand(Register base, int32_t disp); 406 407 // [base + index*scale + disp/r] 408 Operand(Register base, 409 Register index, 410 ScaleFactor scale, 411 int32_t disp); 412 413 // [index*scale + disp/r] 414 Operand(Register index, 415 ScaleFactor scale, 416 int32_t disp); 417 418 // Offset from existing memory operand. 419 // Offset is added to existing displacement as 32-bit signed values and 420 // this must not overflow. 421 Operand(const Operand& base, int32_t offset); 422 423 // Checks whether either base or index register is the given register. 424 // Does not check the "reg" part of the Operand. 425 bool AddressUsesRegister(Register reg) const; 426 427 // Queries related to the size of the generated instruction. 428 // Whether the generated instruction will have a REX prefix. 429 bool requires_rex() const { return rex_ != 0; } 430 // Size of the ModR/M, SIB and displacement parts of the generated 431 // instruction. 432 int operand_size() const { return len_; } 433 434 private: 435 byte rex_; 436 byte buf_[6]; 437 // The number of bytes of buf_ in use. 438 byte len_; 439 440 // Set the ModR/M byte without an encoded 'reg' register. The 441 // register is encoded later as part of the emit_operand operation. 442 // set_modrm can be called before or after set_sib and set_disp*. 443 inline void set_modrm(int mod, Register rm); 444 445 // Set the SIB byte if one is needed. Sets the length to 2 rather than 1. 446 inline void set_sib(ScaleFactor scale, Register index, Register base); 447 448 // Adds operand displacement fields (offsets added to the memory address). 449 // Needs to be called after set_sib, not before it. 450 inline void set_disp8(int disp); 451 inline void set_disp32(int disp); 452 453 friend class Assembler; 454 }; 455 456 457 // CpuFeatures keeps track of which features are supported by the target CPU. 458 // Supported features must be enabled by a CpuFeatureScope before use. 459 // Example: 460 // if (assembler->IsSupported(SSE3)) { 461 // CpuFeatureScope fscope(assembler, SSE3); 462 // // Generate SSE3 floating point code. 463 // } else { 464 // // Generate standard SSE2 floating point code. 465 // } 466 class CpuFeatures : public AllStatic { 467 public: 468 // Detect features of the target CPU. Set safe defaults if the serializer 469 // is enabled (snapshots must be portable). 470 static void Probe(); 471 472 // Check whether a feature is supported by the target CPU. 473 static bool IsSupported(CpuFeature f) { 474 if (Check(f, cross_compile_)) return true; 475 ASSERT(initialized_); 476 if (f == SSE3 && !FLAG_enable_sse3) return false; 477 if (f == SSE4_1 && !FLAG_enable_sse4_1) return false; 478 if (f == CMOV && !FLAG_enable_cmov) return false; 479 if (f == SAHF && !FLAG_enable_sahf) return false; 480 return Check(f, supported_); 481 } 482 483 static bool IsFoundByRuntimeProbingOnly(CpuFeature f) { 484 ASSERT(initialized_); 485 return Check(f, found_by_runtime_probing_only_); 486 } 487 488 static bool IsSafeForSnapshot(CpuFeature f) { 489 return Check(f, cross_compile_) || 490 (IsSupported(f) && 491 (!Serializer::enabled() || !IsFoundByRuntimeProbingOnly(f))); 492 } 493 494 static bool VerifyCrossCompiling() { 495 return cross_compile_ == 0; 496 } 497 498 static bool VerifyCrossCompiling(CpuFeature f) { 499 uint64_t mask = flag2set(f); 500 return cross_compile_ == 0 || 501 (cross_compile_ & mask) == mask; 502 } 503 504 private: 505 static bool Check(CpuFeature f, uint64_t set) { 506 return (set & flag2set(f)) != 0; 507 } 508 509 static uint64_t flag2set(CpuFeature f) { 510 return static_cast<uint64_t>(1) << f; 511 } 512 513 // Safe defaults include CMOV for X64. It is always available, if 514 // anyone checks, but they shouldn't need to check. 515 // The required user mode extensions in X64 are (from AMD64 ABI Table A.1): 516 // fpu, tsc, cx8, cmov, mmx, sse, sse2, fxsr, syscall 517 static const uint64_t kDefaultCpuFeatures = (1 << CMOV); 518 519 #ifdef DEBUG 520 static bool initialized_; 521 #endif 522 static uint64_t supported_; 523 static uint64_t found_by_runtime_probing_only_; 524 525 static uint64_t cross_compile_; 526 527 friend class ExternalReference; 528 friend class PlatformFeatureScope; 529 DISALLOW_COPY_AND_ASSIGN(CpuFeatures); 530 }; 531 532 533 #define ASSEMBLER_INSTRUCTION_LIST(V) \ 534 V(mov) 535 536 537 class Assembler : public AssemblerBase { 538 private: 539 // We check before assembling an instruction that there is sufficient 540 // space to write an instruction and its relocation information. 541 // The relocation writer's position must be kGap bytes above the end of 542 // the generated instructions. This leaves enough space for the 543 // longest possible x64 instruction, 15 bytes, and the longest possible 544 // relocation information encoding, RelocInfoWriter::kMaxLength == 16. 545 // (There is a 15 byte limit on x64 instruction length that rules out some 546 // otherwise valid instructions.) 547 // This allows for a single, fast space check per instruction. 548 static const int kGap = 32; 549 550 public: 551 // Create an assembler. Instructions and relocation information are emitted 552 // into a buffer, with the instructions starting from the beginning and the 553 // relocation information starting from the end of the buffer. See CodeDesc 554 // for a detailed comment on the layout (globals.h). 555 // 556 // If the provided buffer is NULL, the assembler allocates and grows its own 557 // buffer, and buffer_size determines the initial buffer size. The buffer is 558 // owned by the assembler and deallocated upon destruction of the assembler. 559 // 560 // If the provided buffer is not NULL, the assembler uses the provided buffer 561 // for code generation and assumes its size to be buffer_size. If the buffer 562 // is too small, a fatal error occurs. No deallocation of the buffer is done 563 // upon destruction of the assembler. 564 Assembler(Isolate* isolate, void* buffer, int buffer_size); 565 virtual ~Assembler() { } 566 567 // GetCode emits any pending (non-emitted) code and fills the descriptor 568 // desc. GetCode() is idempotent; it returns the same result if no other 569 // Assembler functions are invoked in between GetCode() calls. 570 void GetCode(CodeDesc* desc); 571 572 // Read/Modify the code target in the relative branch/call instruction at pc. 573 // On the x64 architecture, we use relative jumps with a 32-bit displacement 574 // to jump to other Code objects in the Code space in the heap. 575 // Jumps to C functions are done indirectly through a 64-bit register holding 576 // the absolute address of the target. 577 // These functions convert between absolute Addresses of Code objects and 578 // the relative displacements stored in the code. 579 static inline Address target_address_at(Address pc); 580 static inline void set_target_address_at(Address pc, Address target); 581 582 // Return the code target address at a call site from the return address 583 // of that call in the instruction stream. 584 static inline Address target_address_from_return_address(Address pc); 585 586 // This sets the branch destination (which is in the instruction on x64). 587 // This is for calls and branches within generated code. 588 inline static void deserialization_set_special_target_at( 589 Address instruction_payload, Address target) { 590 set_target_address_at(instruction_payload, target); 591 } 592 593 inline Handle<Object> code_target_object_handle_at(Address pc); 594 inline Address runtime_entry_at(Address pc); 595 // Number of bytes taken up by the branch target in the code. 596 static const int kSpecialTargetSize = 4; // Use 32-bit displacement. 597 // Distance between the address of the code target in the call instruction 598 // and the return address pushed on the stack. 599 static const int kCallTargetAddressOffset = 4; // Use 32-bit displacement. 600 // The length of call(kScratchRegister). 601 static const int kCallScratchRegisterInstructionLength = 3; 602 // The length of call(Immediate32). 603 static const int kShortCallInstructionLength = 5; 604 // The length of movq(kScratchRegister, address). 605 static const int kMoveAddressIntoScratchRegisterInstructionLength = 606 2 + kPointerSize; 607 // The length of movq(kScratchRegister, address) and call(kScratchRegister). 608 static const int kCallSequenceLength = 609 kMoveAddressIntoScratchRegisterInstructionLength + 610 kCallScratchRegisterInstructionLength; 611 612 // The js return and debug break slot must be able to contain an indirect 613 // call sequence, some x64 JS code is padded with int3 to make it large 614 // enough to hold an instruction when the debugger patches it. 615 static const int kJSReturnSequenceLength = kCallSequenceLength; 616 static const int kDebugBreakSlotLength = kCallSequenceLength; 617 static const int kPatchDebugBreakSlotReturnOffset = kCallTargetAddressOffset; 618 // Distance between the start of the JS return sequence and where the 619 // 32-bit displacement of a short call would be. The short call is from 620 // SetDebugBreakAtIC from debug-x64.cc. 621 static const int kPatchReturnSequenceAddressOffset = 622 kJSReturnSequenceLength - kPatchDebugBreakSlotReturnOffset; 623 // Distance between the start of the JS return sequence and where the 624 // 32-bit displacement of a short call would be. The short call is from 625 // SetDebugBreakAtIC from debug-x64.cc. 626 static const int kPatchDebugBreakSlotAddressOffset = 627 kDebugBreakSlotLength - kPatchDebugBreakSlotReturnOffset; 628 static const int kRealPatchReturnSequenceAddressOffset = 629 kMoveAddressIntoScratchRegisterInstructionLength - kPointerSize; 630 631 // One byte opcode for test eax,0xXXXXXXXX. 632 static const byte kTestEaxByte = 0xA9; 633 // One byte opcode for test al, 0xXX. 634 static const byte kTestAlByte = 0xA8; 635 // One byte opcode for nop. 636 static const byte kNopByte = 0x90; 637 638 // One byte prefix for a short conditional jump. 639 static const byte kJccShortPrefix = 0x70; 640 static const byte kJncShortOpcode = kJccShortPrefix | not_carry; 641 static const byte kJcShortOpcode = kJccShortPrefix | carry; 642 static const byte kJnzShortOpcode = kJccShortPrefix | not_zero; 643 static const byte kJzShortOpcode = kJccShortPrefix | zero; 644 645 646 // --------------------------------------------------------------------------- 647 // Code generation 648 // 649 // Function names correspond one-to-one to x64 instruction mnemonics. 650 // Unless specified otherwise, instructions operate on 64-bit operands. 651 // 652 // If we need versions of an assembly instruction that operate on different 653 // width arguments, we add a single-letter suffix specifying the width. 654 // This is done for the following instructions: mov, cmp, inc, dec, 655 // add, sub, and test. 656 // There are no versions of these instructions without the suffix. 657 // - Instructions on 8-bit (byte) operands/registers have a trailing 'b'. 658 // - Instructions on 16-bit (word) operands/registers have a trailing 'w'. 659 // - Instructions on 32-bit (doubleword) operands/registers use 'l'. 660 // - Instructions on 64-bit (quadword) operands/registers use 'q'. 661 // 662 // Some mnemonics, such as "and", are the same as C++ keywords. 663 // Naming conflicts with C++ keywords are resolved by adding a trailing '_'. 664 665 #define DECLARE_INSTRUCTION(instruction) \ 666 template<class P1, class P2> \ 667 void instruction##p(P1 p1, P2 p2) { \ 668 emit_##instruction(p1, p2, kPointerSize); \ 669 } \ 670 \ 671 template<class P1, class P2> \ 672 void instruction##l(P1 p1, P2 p2) { \ 673 emit_##instruction(p1, p2, kInt32Size); \ 674 } \ 675 \ 676 template<class P1, class P2> \ 677 void instruction##q(P1 p1, P2 p2) { \ 678 emit_##instruction(p1, p2, kInt64Size); \ 679 } 680 ASSEMBLER_INSTRUCTION_LIST(DECLARE_INSTRUCTION) 681 #undef DECLARE_INSTRUCTION 682 683 // Insert the smallest number of nop instructions 684 // possible to align the pc offset to a multiple 685 // of m, where m must be a power of 2. 686 void Align(int m); 687 void Nop(int bytes = 1); 688 // Aligns code to something that's optimal for a jump target for the platform. 689 void CodeTargetAlign(); 690 691 // Stack 692 void pushfq(); 693 void popfq(); 694 695 void push(Immediate value); 696 // Push a 32 bit integer, and guarantee that it is actually pushed as a 697 // 32 bit value, the normal push will optimize the 8 bit case. 698 void push_imm32(int32_t imm32); 699 void push(Register src); 700 void push(const Operand& src); 701 702 void pop(Register dst); 703 void pop(const Operand& dst); 704 705 void enter(Immediate size); 706 void leave(); 707 708 // Moves 709 void movb(Register dst, const Operand& src); 710 void movb(Register dst, Immediate imm); 711 void movb(const Operand& dst, Register src); 712 void movb(const Operand& dst, Immediate imm); 713 714 // Move the low 16 bits of a 64-bit register value to a 16-bit 715 // memory location. 716 void movw(Register dst, const Operand& src); 717 void movw(const Operand& dst, Register src); 718 void movw(const Operand& dst, Immediate imm); 719 720 // Move the offset of the label location relative to the current 721 // position (after the move) to the destination. 722 void movl(const Operand& dst, Label* src); 723 724 // Loads a pointer into a register with a relocation mode. 725 void movq(Register dst, void* ptr, RelocInfo::Mode rmode); 726 // Loads a 64-bit immediate into a register. 727 void movq(Register dst, int64_t value); 728 void movq(Register dst, uint64_t value); 729 void movq(Register dst, Handle<Object> handle, RelocInfo::Mode rmode); 730 731 void movsxbq(Register dst, const Operand& src); 732 void movsxwq(Register dst, const Operand& src); 733 void movsxlq(Register dst, Register src); 734 void movsxlq(Register dst, const Operand& src); 735 void movzxbq(Register dst, const Operand& src); 736 void movzxbl(Register dst, const Operand& src); 737 void movzxwq(Register dst, const Operand& src); 738 void movzxwl(Register dst, const Operand& src); 739 void movzxwl(Register dst, Register src); 740 741 // Repeated moves. 742 743 void repmovsb(); 744 void repmovsw(); 745 void repmovsl(); 746 void repmovsq(); 747 748 // Instruction to load from an immediate 64-bit pointer into RAX. 749 void load_rax(void* ptr, RelocInfo::Mode rmode); 750 void load_rax(ExternalReference ext); 751 752 // Conditional moves. 753 void cmovq(Condition cc, Register dst, Register src); 754 void cmovq(Condition cc, Register dst, const Operand& src); 755 void cmovl(Condition cc, Register dst, Register src); 756 void cmovl(Condition cc, Register dst, const Operand& src); 757 758 // Exchange two registers 759 void xchgq(Register dst, Register src); 760 void xchgl(Register dst, Register src); 761 762 // Arithmetics 763 void addl(Register dst, Register src) { 764 arithmetic_op_32(0x03, dst, src); 765 } 766 767 void addl(Register dst, Immediate src) { 768 immediate_arithmetic_op_32(0x0, dst, src); 769 } 770 771 void addl(Register dst, const Operand& src) { 772 arithmetic_op_32(0x03, dst, src); 773 } 774 775 void addl(const Operand& dst, Immediate src) { 776 immediate_arithmetic_op_32(0x0, dst, src); 777 } 778 779 void addl(const Operand& dst, Register src) { 780 arithmetic_op_32(0x01, src, dst); 781 } 782 783 void addq(Register dst, Register src) { 784 arithmetic_op(0x03, dst, src); 785 } 786 787 void addq(Register dst, const Operand& src) { 788 arithmetic_op(0x03, dst, src); 789 } 790 791 void addq(const Operand& dst, Register src) { 792 arithmetic_op(0x01, src, dst); 793 } 794 795 void addq(Register dst, Immediate src) { 796 immediate_arithmetic_op(0x0, dst, src); 797 } 798 799 void addq(const Operand& dst, Immediate src) { 800 immediate_arithmetic_op(0x0, dst, src); 801 } 802 803 void sbbl(Register dst, Register src) { 804 arithmetic_op_32(0x1b, dst, src); 805 } 806 807 void sbbq(Register dst, Register src) { 808 arithmetic_op(0x1b, dst, src); 809 } 810 811 void cmpb(Register dst, Immediate src) { 812 immediate_arithmetic_op_8(0x7, dst, src); 813 } 814 815 void cmpb_al(Immediate src); 816 817 void cmpb(Register dst, Register src) { 818 arithmetic_op(0x3A, dst, src); 819 } 820 821 void cmpb(Register dst, const Operand& src) { 822 arithmetic_op(0x3A, dst, src); 823 } 824 825 void cmpb(const Operand& dst, Register src) { 826 arithmetic_op(0x38, src, dst); 827 } 828 829 void cmpb(const Operand& dst, Immediate src) { 830 immediate_arithmetic_op_8(0x7, dst, src); 831 } 832 833 void cmpw(const Operand& dst, Immediate src) { 834 immediate_arithmetic_op_16(0x7, dst, src); 835 } 836 837 void cmpw(Register dst, Immediate src) { 838 immediate_arithmetic_op_16(0x7, dst, src); 839 } 840 841 void cmpw(Register dst, const Operand& src) { 842 arithmetic_op_16(0x3B, dst, src); 843 } 844 845 void cmpw(Register dst, Register src) { 846 arithmetic_op_16(0x3B, dst, src); 847 } 848 849 void cmpw(const Operand& dst, Register src) { 850 arithmetic_op_16(0x39, src, dst); 851 } 852 853 void cmpl(Register dst, Register src) { 854 arithmetic_op_32(0x3B, dst, src); 855 } 856 857 void cmpl(Register dst, const Operand& src) { 858 arithmetic_op_32(0x3B, dst, src); 859 } 860 861 void cmpl(const Operand& dst, Register src) { 862 arithmetic_op_32(0x39, src, dst); 863 } 864 865 void cmpl(Register dst, Immediate src) { 866 immediate_arithmetic_op_32(0x7, dst, src); 867 } 868 869 void cmpl(const Operand& dst, Immediate src) { 870 immediate_arithmetic_op_32(0x7, dst, src); 871 } 872 873 void cmpq(Register dst, Register src) { 874 arithmetic_op(0x3B, dst, src); 875 } 876 877 void cmpq(Register dst, const Operand& src) { 878 arithmetic_op(0x3B, dst, src); 879 } 880 881 void cmpq(const Operand& dst, Register src) { 882 arithmetic_op(0x39, src, dst); 883 } 884 885 void cmpq(Register dst, Immediate src) { 886 immediate_arithmetic_op(0x7, dst, src); 887 } 888 889 void cmpq(const Operand& dst, Immediate src) { 890 immediate_arithmetic_op(0x7, dst, src); 891 } 892 893 void and_(Register dst, Register src) { 894 arithmetic_op(0x23, dst, src); 895 } 896 897 void and_(Register dst, const Operand& src) { 898 arithmetic_op(0x23, dst, src); 899 } 900 901 void and_(const Operand& dst, Register src) { 902 arithmetic_op(0x21, src, dst); 903 } 904 905 void and_(Register dst, Immediate src) { 906 immediate_arithmetic_op(0x4, dst, src); 907 } 908 909 void and_(const Operand& dst, Immediate src) { 910 immediate_arithmetic_op(0x4, dst, src); 911 } 912 913 void andl(Register dst, Immediate src) { 914 immediate_arithmetic_op_32(0x4, dst, src); 915 } 916 917 void andl(Register dst, Register src) { 918 arithmetic_op_32(0x23, dst, src); 919 } 920 921 void andl(Register dst, const Operand& src) { 922 arithmetic_op_32(0x23, dst, src); 923 } 924 925 void andb(Register dst, Immediate src) { 926 immediate_arithmetic_op_8(0x4, dst, src); 927 } 928 929 void decq(Register dst); 930 void decq(const Operand& dst); 931 void decl(Register dst); 932 void decl(const Operand& dst); 933 void decb(Register dst); 934 void decb(const Operand& dst); 935 936 // Sign-extends rax into rdx:rax. 937 void cqo(); 938 // Sign-extends eax into edx:eax. 939 void cdq(); 940 941 // Divide rdx:rax by src. Quotient in rax, remainder in rdx. 942 void idivq(Register src); 943 // Divide edx:eax by lower 32 bits of src. Quotient in eax, rem. in edx. 944 void idivl(Register src); 945 946 // Signed multiply instructions. 947 void imul(Register src); // rdx:rax = rax * src. 948 void imul(Register dst, Register src); // dst = dst * src. 949 void imul(Register dst, const Operand& src); // dst = dst * src. 950 void imul(Register dst, Register src, Immediate imm); // dst = src * imm. 951 // Signed 32-bit multiply instructions. 952 void imull(Register dst, Register src); // dst = dst * src. 953 void imull(Register dst, const Operand& src); // dst = dst * src. 954 void imull(Register dst, Register src, Immediate imm); // dst = src * imm. 955 956 void incq(Register dst); 957 void incq(const Operand& dst); 958 void incl(Register dst); 959 void incl(const Operand& dst); 960 961 void lea(Register dst, const Operand& src); 962 void leal(Register dst, const Operand& src); 963 964 // Multiply rax by src, put the result in rdx:rax. 965 void mul(Register src); 966 967 void neg(Register dst); 968 void neg(const Operand& dst); 969 void negl(Register dst); 970 971 void not_(Register dst); 972 void not_(const Operand& dst); 973 void notl(Register dst); 974 975 void or_(Register dst, Register src) { 976 arithmetic_op(0x0B, dst, src); 977 } 978 979 void orl(Register dst, Register src) { 980 arithmetic_op_32(0x0B, dst, src); 981 } 982 983 void or_(Register dst, const Operand& src) { 984 arithmetic_op(0x0B, dst, src); 985 } 986 987 void orl(Register dst, const Operand& src) { 988 arithmetic_op_32(0x0B, dst, src); 989 } 990 991 void or_(const Operand& dst, Register src) { 992 arithmetic_op(0x09, src, dst); 993 } 994 995 void orl(const Operand& dst, Register src) { 996 arithmetic_op_32(0x09, src, dst); 997 } 998 999 void or_(Register dst, Immediate src) { 1000 immediate_arithmetic_op(0x1, dst, src); 1001 } 1002 1003 void orl(Register dst, Immediate src) { 1004 immediate_arithmetic_op_32(0x1, dst, src); 1005 } 1006 1007 void or_(const Operand& dst, Immediate src) { 1008 immediate_arithmetic_op(0x1, dst, src); 1009 } 1010 1011 void orl(const Operand& dst, Immediate src) { 1012 immediate_arithmetic_op_32(0x1, dst, src); 1013 } 1014 1015 1016 void rcl(Register dst, Immediate imm8) { 1017 shift(dst, imm8, 0x2); 1018 } 1019 1020 void rol(Register dst, Immediate imm8) { 1021 shift(dst, imm8, 0x0); 1022 } 1023 1024 void roll(Register dst, Immediate imm8) { 1025 shift_32(dst, imm8, 0x0); 1026 } 1027 1028 void rcr(Register dst, Immediate imm8) { 1029 shift(dst, imm8, 0x3); 1030 } 1031 1032 void ror(Register dst, Immediate imm8) { 1033 shift(dst, imm8, 0x1); 1034 } 1035 1036 void rorl(Register dst, Immediate imm8) { 1037 shift_32(dst, imm8, 0x1); 1038 } 1039 1040 void rorl_cl(Register dst) { 1041 shift_32(dst, 0x1); 1042 } 1043 1044 // Shifts dst:src left by cl bits, affecting only dst. 1045 void shld(Register dst, Register src); 1046 1047 // Shifts src:dst right by cl bits, affecting only dst. 1048 void shrd(Register dst, Register src); 1049 1050 // Shifts dst right, duplicating sign bit, by shift_amount bits. 1051 // Shifting by 1 is handled efficiently. 1052 void sar(Register dst, Immediate shift_amount) { 1053 shift(dst, shift_amount, 0x7); 1054 } 1055 1056 // Shifts dst right, duplicating sign bit, by shift_amount bits. 1057 // Shifting by 1 is handled efficiently. 1058 void sarl(Register dst, Immediate shift_amount) { 1059 shift_32(dst, shift_amount, 0x7); 1060 } 1061 1062 // Shifts dst right, duplicating sign bit, by cl % 64 bits. 1063 void sar_cl(Register dst) { 1064 shift(dst, 0x7); 1065 } 1066 1067 // Shifts dst right, duplicating sign bit, by cl % 64 bits. 1068 void sarl_cl(Register dst) { 1069 shift_32(dst, 0x7); 1070 } 1071 1072 void shl(Register dst, Immediate shift_amount) { 1073 shift(dst, shift_amount, 0x4); 1074 } 1075 1076 void shl_cl(Register dst) { 1077 shift(dst, 0x4); 1078 } 1079 1080 void shll_cl(Register dst) { 1081 shift_32(dst, 0x4); 1082 } 1083 1084 void shll(Register dst, Immediate shift_amount) { 1085 shift_32(dst, shift_amount, 0x4); 1086 } 1087 1088 void shr(Register dst, Immediate shift_amount) { 1089 shift(dst, shift_amount, 0x5); 1090 } 1091 1092 void shr_cl(Register dst) { 1093 shift(dst, 0x5); 1094 } 1095 1096 void shrl_cl(Register dst) { 1097 shift_32(dst, 0x5); 1098 } 1099 1100 void shrl(Register dst, Immediate shift_amount) { 1101 shift_32(dst, shift_amount, 0x5); 1102 } 1103 1104 void store_rax(void* dst, RelocInfo::Mode mode); 1105 void store_rax(ExternalReference ref); 1106 1107 void subq(Register dst, Register src) { 1108 arithmetic_op(0x2B, dst, src); 1109 } 1110 1111 void subq(Register dst, const Operand& src) { 1112 arithmetic_op(0x2B, dst, src); 1113 } 1114 1115 void subq(const Operand& dst, Register src) { 1116 arithmetic_op(0x29, src, dst); 1117 } 1118 1119 void subq(Register dst, Immediate src) { 1120 immediate_arithmetic_op(0x5, dst, src); 1121 } 1122 1123 void subq(const Operand& dst, Immediate src) { 1124 immediate_arithmetic_op(0x5, dst, src); 1125 } 1126 1127 void subl(Register dst, Register src) { 1128 arithmetic_op_32(0x2B, dst, src); 1129 } 1130 1131 void subl(Register dst, const Operand& src) { 1132 arithmetic_op_32(0x2B, dst, src); 1133 } 1134 1135 void subl(const Operand& dst, Register src) { 1136 arithmetic_op_32(0x29, src, dst); 1137 } 1138 1139 void subl(const Operand& dst, Immediate src) { 1140 immediate_arithmetic_op_32(0x5, dst, src); 1141 } 1142 1143 void subl(Register dst, Immediate src) { 1144 immediate_arithmetic_op_32(0x5, dst, src); 1145 } 1146 1147 void subb(Register dst, Immediate src) { 1148 immediate_arithmetic_op_8(0x5, dst, src); 1149 } 1150 1151 void testb(Register dst, Register src); 1152 void testb(Register reg, Immediate mask); 1153 void testb(const Operand& op, Immediate mask); 1154 void testb(const Operand& op, Register reg); 1155 void testl(Register dst, Register src); 1156 void testl(Register reg, Immediate mask); 1157 void testl(const Operand& op, Register reg); 1158 void testl(const Operand& op, Immediate mask); 1159 void testq(const Operand& op, Register reg); 1160 void testq(Register dst, Register src); 1161 void testq(Register dst, Immediate mask); 1162 1163 void xor_(Register dst, Register src) { 1164 if (dst.code() == src.code()) { 1165 arithmetic_op_32(0x33, dst, src); 1166 } else { 1167 arithmetic_op(0x33, dst, src); 1168 } 1169 } 1170 1171 void xorl(Register dst, Register src) { 1172 arithmetic_op_32(0x33, dst, src); 1173 } 1174 1175 void xorl(Register dst, const Operand& src) { 1176 arithmetic_op_32(0x33, dst, src); 1177 } 1178 1179 void xorl(Register dst, Immediate src) { 1180 immediate_arithmetic_op_32(0x6, dst, src); 1181 } 1182 1183 void xorl(const Operand& dst, Register src) { 1184 arithmetic_op_32(0x31, src, dst); 1185 } 1186 1187 void xorl(const Operand& dst, Immediate src) { 1188 immediate_arithmetic_op_32(0x6, dst, src); 1189 } 1190 1191 void xor_(Register dst, const Operand& src) { 1192 arithmetic_op(0x33, dst, src); 1193 } 1194 1195 void xor_(const Operand& dst, Register src) { 1196 arithmetic_op(0x31, src, dst); 1197 } 1198 1199 void xor_(Register dst, Immediate src) { 1200 immediate_arithmetic_op(0x6, dst, src); 1201 } 1202 1203 void xor_(const Operand& dst, Immediate src) { 1204 immediate_arithmetic_op(0x6, dst, src); 1205 } 1206 1207 // Bit operations. 1208 void bt(const Operand& dst, Register src); 1209 void bts(const Operand& dst, Register src); 1210 1211 // Miscellaneous 1212 void clc(); 1213 void cld(); 1214 void cpuid(); 1215 void hlt(); 1216 void int3(); 1217 void nop(); 1218 void ret(int imm16); 1219 void setcc(Condition cc, Register reg); 1220 1221 // Label operations & relative jumps (PPUM Appendix D) 1222 // 1223 // Takes a branch opcode (cc) and a label (L) and generates 1224 // either a backward branch or a forward branch and links it 1225 // to the label fixup chain. Usage: 1226 // 1227 // Label L; // unbound label 1228 // j(cc, &L); // forward branch to unbound label 1229 // bind(&L); // bind label to the current pc 1230 // j(cc, &L); // backward branch to bound label 1231 // bind(&L); // illegal: a label may be bound only once 1232 // 1233 // Note: The same Label can be used for forward and backward branches 1234 // but it may be bound only once. 1235 1236 void bind(Label* L); // binds an unbound label L to the current code position 1237 1238 // Calls 1239 // Call near relative 32-bit displacement, relative to next instruction. 1240 void call(Label* L); 1241 void call(Address entry, RelocInfo::Mode rmode); 1242 void call(Handle<Code> target, 1243 RelocInfo::Mode rmode = RelocInfo::CODE_TARGET, 1244 TypeFeedbackId ast_id = TypeFeedbackId::None()); 1245 1246 // Calls directly to the given address using a relative offset. 1247 // Should only ever be used in Code objects for calls within the 1248 // same Code object. Should not be used when generating new code (use labels), 1249 // but only when patching existing code. 1250 void call(Address target); 1251 1252 // Call near absolute indirect, address in register 1253 void call(Register adr); 1254 1255 // Call near indirect 1256 void call(const Operand& operand); 1257 1258 // Jumps 1259 // Jump short or near relative. 1260 // Use a 32-bit signed displacement. 1261 // Unconditional jump to L 1262 void jmp(Label* L, Label::Distance distance = Label::kFar); 1263 void jmp(Address entry, RelocInfo::Mode rmode); 1264 void jmp(Handle<Code> target, RelocInfo::Mode rmode); 1265 1266 // Jump near absolute indirect (r64) 1267 void jmp(Register adr); 1268 1269 // Jump near absolute indirect (m64) 1270 void jmp(const Operand& src); 1271 1272 // Conditional jumps 1273 void j(Condition cc, 1274 Label* L, 1275 Label::Distance distance = Label::kFar); 1276 void j(Condition cc, Address entry, RelocInfo::Mode rmode); 1277 void j(Condition cc, Handle<Code> target, RelocInfo::Mode rmode); 1278 1279 // Floating-point operations 1280 void fld(int i); 1281 1282 void fld1(); 1283 void fldz(); 1284 void fldpi(); 1285 void fldln2(); 1286 1287 void fld_s(const Operand& adr); 1288 void fld_d(const Operand& adr); 1289 1290 void fstp_s(const Operand& adr); 1291 void fstp_d(const Operand& adr); 1292 void fstp(int index); 1293 1294 void fild_s(const Operand& adr); 1295 void fild_d(const Operand& adr); 1296 1297 void fist_s(const Operand& adr); 1298 1299 void fistp_s(const Operand& adr); 1300 void fistp_d(const Operand& adr); 1301 1302 void fisttp_s(const Operand& adr); 1303 void fisttp_d(const Operand& adr); 1304 1305 void fabs(); 1306 void fchs(); 1307 1308 void fadd(int i); 1309 void fsub(int i); 1310 void fmul(int i); 1311 void fdiv(int i); 1312 1313 void fisub_s(const Operand& adr); 1314 1315 void faddp(int i = 1); 1316 void fsubp(int i = 1); 1317 void fsubrp(int i = 1); 1318 void fmulp(int i = 1); 1319 void fdivp(int i = 1); 1320 void fprem(); 1321 void fprem1(); 1322 1323 void fxch(int i = 1); 1324 void fincstp(); 1325 void ffree(int i = 0); 1326 1327 void ftst(); 1328 void fucomp(int i); 1329 void fucompp(); 1330 void fucomi(int i); 1331 void fucomip(); 1332 1333 void fcompp(); 1334 void fnstsw_ax(); 1335 void fwait(); 1336 void fnclex(); 1337 1338 void fsin(); 1339 void fcos(); 1340 void fptan(); 1341 void fyl2x(); 1342 void f2xm1(); 1343 void fscale(); 1344 void fninit(); 1345 1346 void frndint(); 1347 1348 void sahf(); 1349 1350 // SSE instructions 1351 void movaps(XMMRegister dst, XMMRegister src); 1352 void movss(XMMRegister dst, const Operand& src); 1353 void movss(const Operand& dst, XMMRegister src); 1354 void shufps(XMMRegister dst, XMMRegister src, byte imm8); 1355 1356 void cvttss2si(Register dst, const Operand& src); 1357 void cvttss2si(Register dst, XMMRegister src); 1358 void cvtlsi2ss(XMMRegister dst, Register src); 1359 1360 void andps(XMMRegister dst, XMMRegister src); 1361 void andps(XMMRegister dst, const Operand& src); 1362 void orps(XMMRegister dst, XMMRegister src); 1363 void orps(XMMRegister dst, const Operand& src); 1364 void xorps(XMMRegister dst, XMMRegister src); 1365 void xorps(XMMRegister dst, const Operand& src); 1366 1367 void addps(XMMRegister dst, XMMRegister src); 1368 void addps(XMMRegister dst, const Operand& src); 1369 void subps(XMMRegister dst, XMMRegister src); 1370 void subps(XMMRegister dst, const Operand& src); 1371 void mulps(XMMRegister dst, XMMRegister src); 1372 void mulps(XMMRegister dst, const Operand& src); 1373 void divps(XMMRegister dst, XMMRegister src); 1374 void divps(XMMRegister dst, const Operand& src); 1375 1376 void movmskps(Register dst, XMMRegister src); 1377 1378 // SSE2 instructions 1379 void movd(XMMRegister dst, Register src); 1380 void movd(Register dst, XMMRegister src); 1381 void movq(XMMRegister dst, Register src); 1382 void movq(Register dst, XMMRegister src); 1383 void movq(XMMRegister dst, XMMRegister src); 1384 1385 // Don't use this unless it's important to keep the 1386 // top half of the destination register unchanged. 1387 // Used movaps when moving double values and movq for integer 1388 // values in xmm registers. 1389 void movsd(XMMRegister dst, XMMRegister src); 1390 1391 void movsd(const Operand& dst, XMMRegister src); 1392 void movsd(XMMRegister dst, const Operand& src); 1393 1394 void movdqa(const Operand& dst, XMMRegister src); 1395 void movdqa(XMMRegister dst, const Operand& src); 1396 1397 void movdqu(const Operand& dst, XMMRegister src); 1398 void movdqu(XMMRegister dst, const Operand& src); 1399 1400 void movapd(XMMRegister dst, XMMRegister src); 1401 1402 void cvttsd2si(Register dst, const Operand& src); 1403 void cvttsd2si(Register dst, XMMRegister src); 1404 void cvttsd2siq(Register dst, XMMRegister src); 1405 1406 void cvtlsi2sd(XMMRegister dst, const Operand& src); 1407 void cvtlsi2sd(XMMRegister dst, Register src); 1408 void cvtqsi2sd(XMMRegister dst, const Operand& src); 1409 void cvtqsi2sd(XMMRegister dst, Register src); 1410 1411 1412 void cvtss2sd(XMMRegister dst, XMMRegister src); 1413 void cvtss2sd(XMMRegister dst, const Operand& src); 1414 void cvtsd2ss(XMMRegister dst, XMMRegister src); 1415 1416 void cvtsd2si(Register dst, XMMRegister src); 1417 void cvtsd2siq(Register dst, XMMRegister src); 1418 1419 void addsd(XMMRegister dst, XMMRegister src); 1420 void addsd(XMMRegister dst, const Operand& src); 1421 void subsd(XMMRegister dst, XMMRegister src); 1422 void mulsd(XMMRegister dst, XMMRegister src); 1423 void mulsd(XMMRegister dst, const Operand& src); 1424 void divsd(XMMRegister dst, XMMRegister src); 1425 1426 void andpd(XMMRegister dst, XMMRegister src); 1427 void orpd(XMMRegister dst, XMMRegister src); 1428 void xorpd(XMMRegister dst, XMMRegister src); 1429 void sqrtsd(XMMRegister dst, XMMRegister src); 1430 1431 void ucomisd(XMMRegister dst, XMMRegister src); 1432 void ucomisd(XMMRegister dst, const Operand& src); 1433 void cmpltsd(XMMRegister dst, XMMRegister src); 1434 1435 void movmskpd(Register dst, XMMRegister src); 1436 1437 // SSE 4.1 instruction 1438 void extractps(Register dst, XMMRegister src, byte imm8); 1439 1440 enum RoundingMode { 1441 kRoundToNearest = 0x0, 1442 kRoundDown = 0x1, 1443 kRoundUp = 0x2, 1444 kRoundToZero = 0x3 1445 }; 1446 1447 void roundsd(XMMRegister dst, XMMRegister src, RoundingMode mode); 1448 1449 // Debugging 1450 void Print(); 1451 1452 // Check the code size generated from label to here. 1453 int SizeOfCodeGeneratedSince(Label* label) { 1454 return pc_offset() - label->pos(); 1455 } 1456 1457 // Mark address of the ExitJSFrame code. 1458 void RecordJSReturn(); 1459 1460 // Mark address of a debug break slot. 1461 void RecordDebugBreakSlot(); 1462 1463 // Record a comment relocation entry that can be used by a disassembler. 1464 // Use --code-comments to enable. 1465 void RecordComment(const char* msg, bool force = false); 1466 1467 // Writes a single word of data in the code stream. 1468 // Used for inline tables, e.g., jump-tables. 1469 void db(uint8_t data); 1470 void dd(uint32_t data); 1471 1472 PositionsRecorder* positions_recorder() { return &positions_recorder_; } 1473 1474 // Check if there is less than kGap bytes available in the buffer. 1475 // If this is the case, we need to grow the buffer before emitting 1476 // an instruction or relocation information. 1477 inline bool buffer_overflow() const { 1478 return pc_ >= reloc_info_writer.pos() - kGap; 1479 } 1480 1481 // Get the number of bytes available in the buffer. 1482 inline int available_space() const { 1483 return static_cast<int>(reloc_info_writer.pos() - pc_); 1484 } 1485 1486 static bool IsNop(Address addr); 1487 1488 // Avoid overflows for displacements etc. 1489 static const int kMaximalBufferSize = 512*MB; 1490 1491 byte byte_at(int pos) { return buffer_[pos]; } 1492 void set_byte_at(int pos, byte value) { buffer_[pos] = value; } 1493 1494 private: 1495 byte* addr_at(int pos) { return buffer_ + pos; } 1496 uint32_t long_at(int pos) { 1497 return *reinterpret_cast<uint32_t*>(addr_at(pos)); 1498 } 1499 void long_at_put(int pos, uint32_t x) { 1500 *reinterpret_cast<uint32_t*>(addr_at(pos)) = x; 1501 } 1502 1503 // code emission 1504 void GrowBuffer(); 1505 1506 void emit(byte x) { *pc_++ = x; } 1507 inline void emitl(uint32_t x); 1508 inline void emitp(void* x, RelocInfo::Mode rmode); 1509 inline void emitq(uint64_t x); 1510 inline void emitw(uint16_t x); 1511 inline void emit_code_target(Handle<Code> target, 1512 RelocInfo::Mode rmode, 1513 TypeFeedbackId ast_id = TypeFeedbackId::None()); 1514 inline void emit_runtime_entry(Address entry, RelocInfo::Mode rmode); 1515 void emit(Immediate x) { emitl(x.value_); } 1516 1517 // Emits a REX prefix that encodes a 64-bit operand size and 1518 // the top bit of both register codes. 1519 // High bit of reg goes to REX.R, high bit of rm_reg goes to REX.B. 1520 // REX.W is set. 1521 inline void emit_rex_64(XMMRegister reg, Register rm_reg); 1522 inline void emit_rex_64(Register reg, XMMRegister rm_reg); 1523 inline void emit_rex_64(Register reg, Register rm_reg); 1524 1525 // Emits a REX prefix that encodes a 64-bit operand size and 1526 // the top bit of the destination, index, and base register codes. 1527 // The high bit of reg is used for REX.R, the high bit of op's base 1528 // register is used for REX.B, and the high bit of op's index register 1529 // is used for REX.X. REX.W is set. 1530 inline void emit_rex_64(Register reg, const Operand& op); 1531 inline void emit_rex_64(XMMRegister reg, const Operand& op); 1532 1533 // Emits a REX prefix that encodes a 64-bit operand size and 1534 // the top bit of the register code. 1535 // The high bit of register is used for REX.B. 1536 // REX.W is set and REX.R and REX.X are clear. 1537 inline void emit_rex_64(Register rm_reg); 1538 1539 // Emits a REX prefix that encodes a 64-bit operand size and 1540 // the top bit of the index and base register codes. 1541 // The high bit of op's base register is used for REX.B, and the high 1542 // bit of op's index register is used for REX.X. 1543 // REX.W is set and REX.R clear. 1544 inline void emit_rex_64(const Operand& op); 1545 1546 // Emit a REX prefix that only sets REX.W to choose a 64-bit operand size. 1547 void emit_rex_64() { emit(0x48); } 1548 1549 // High bit of reg goes to REX.R, high bit of rm_reg goes to REX.B. 1550 // REX.W is clear. 1551 inline void emit_rex_32(Register reg, Register rm_reg); 1552 1553 // The high bit of reg is used for REX.R, the high bit of op's base 1554 // register is used for REX.B, and the high bit of op's index register 1555 // is used for REX.X. REX.W is cleared. 1556 inline void emit_rex_32(Register reg, const Operand& op); 1557 1558 // High bit of rm_reg goes to REX.B. 1559 // REX.W, REX.R and REX.X are clear. 1560 inline void emit_rex_32(Register rm_reg); 1561 1562 // High bit of base goes to REX.B and high bit of index to REX.X. 1563 // REX.W and REX.R are clear. 1564 inline void emit_rex_32(const Operand& op); 1565 1566 // High bit of reg goes to REX.R, high bit of rm_reg goes to REX.B. 1567 // REX.W is cleared. If no REX bits are set, no byte is emitted. 1568 inline void emit_optional_rex_32(Register reg, Register rm_reg); 1569 1570 // The high bit of reg is used for REX.R, the high bit of op's base 1571 // register is used for REX.B, and the high bit of op's index register 1572 // is used for REX.X. REX.W is cleared. If no REX bits are set, nothing 1573 // is emitted. 1574 inline void emit_optional_rex_32(Register reg, const Operand& op); 1575 1576 // As for emit_optional_rex_32(Register, Register), except that 1577 // the registers are XMM registers. 1578 inline void emit_optional_rex_32(XMMRegister reg, XMMRegister base); 1579 1580 // As for emit_optional_rex_32(Register, Register), except that 1581 // one of the registers is an XMM registers. 1582 inline void emit_optional_rex_32(XMMRegister reg, Register base); 1583 1584 // As for emit_optional_rex_32(Register, Register), except that 1585 // one of the registers is an XMM registers. 1586 inline void emit_optional_rex_32(Register reg, XMMRegister base); 1587 1588 // As for emit_optional_rex_32(Register, const Operand&), except that 1589 // the register is an XMM register. 1590 inline void emit_optional_rex_32(XMMRegister reg, const Operand& op); 1591 1592 // Optionally do as emit_rex_32(Register) if the register number has 1593 // the high bit set. 1594 inline void emit_optional_rex_32(Register rm_reg); 1595 1596 // Optionally do as emit_rex_32(const Operand&) if the operand register 1597 // numbers have a high bit set. 1598 inline void emit_optional_rex_32(const Operand& op); 1599 1600 template<class P1> 1601 void emit_rex(P1 p1, int size) { 1602 if (size == kInt64Size) { 1603 emit_rex_64(p1); 1604 } else { 1605 ASSERT(size == kInt32Size); 1606 emit_optional_rex_32(p1); 1607 } 1608 } 1609 1610 template<class P1, class P2> 1611 void emit_rex(P1 p1, P2 p2, int size) { 1612 if (size == kInt64Size) { 1613 emit_rex_64(p1, p2); 1614 } else { 1615 ASSERT(size == kInt32Size); 1616 emit_optional_rex_32(p1, p2); 1617 } 1618 } 1619 1620 // Emit the ModR/M byte, and optionally the SIB byte and 1621 // 1- or 4-byte offset for a memory operand. Also encodes 1622 // the second operand of the operation, a register or operation 1623 // subcode, into the reg field of the ModR/M byte. 1624 void emit_operand(Register reg, const Operand& adr) { 1625 emit_operand(reg.low_bits(), adr); 1626 } 1627 1628 // Emit the ModR/M byte, and optionally the SIB byte and 1629 // 1- or 4-byte offset for a memory operand. Also used to encode 1630 // a three-bit opcode extension into the ModR/M byte. 1631 void emit_operand(int rm, const Operand& adr); 1632 1633 // Emit a ModR/M byte with registers coded in the reg and rm_reg fields. 1634 void emit_modrm(Register reg, Register rm_reg) { 1635 emit(0xC0 | reg.low_bits() << 3 | rm_reg.low_bits()); 1636 } 1637 1638 // Emit a ModR/M byte with an operation subcode in the reg field and 1639 // a register in the rm_reg field. 1640 void emit_modrm(int code, Register rm_reg) { 1641 ASSERT(is_uint3(code)); 1642 emit(0xC0 | code << 3 | rm_reg.low_bits()); 1643 } 1644 1645 // Emit the code-object-relative offset of the label's position 1646 inline void emit_code_relative_offset(Label* label); 1647 1648 // The first argument is the reg field, the second argument is the r/m field. 1649 void emit_sse_operand(XMMRegister dst, XMMRegister src); 1650 void emit_sse_operand(XMMRegister reg, const Operand& adr); 1651 void emit_sse_operand(XMMRegister dst, Register src); 1652 void emit_sse_operand(Register dst, XMMRegister src); 1653 1654 // Emit machine code for one of the operations ADD, ADC, SUB, SBC, 1655 // AND, OR, XOR, or CMP. The encodings of these operations are all 1656 // similar, differing just in the opcode or in the reg field of the 1657 // ModR/M byte. 1658 void arithmetic_op_16(byte opcode, Register reg, Register rm_reg); 1659 void arithmetic_op_16(byte opcode, Register reg, const Operand& rm_reg); 1660 void arithmetic_op_32(byte opcode, Register reg, Register rm_reg); 1661 void arithmetic_op_32(byte opcode, Register reg, const Operand& rm_reg); 1662 void arithmetic_op(byte opcode, Register reg, Register rm_reg); 1663 void arithmetic_op(byte opcode, Register reg, const Operand& rm_reg); 1664 void immediate_arithmetic_op(byte subcode, Register dst, Immediate src); 1665 void immediate_arithmetic_op(byte subcode, const Operand& dst, Immediate src); 1666 // Operate on a byte in memory or register. 1667 void immediate_arithmetic_op_8(byte subcode, 1668 Register dst, 1669 Immediate src); 1670 void immediate_arithmetic_op_8(byte subcode, 1671 const Operand& dst, 1672 Immediate src); 1673 // Operate on a word in memory or register. 1674 void immediate_arithmetic_op_16(byte subcode, 1675 Register dst, 1676 Immediate src); 1677 void immediate_arithmetic_op_16(byte subcode, 1678 const Operand& dst, 1679 Immediate src); 1680 // Operate on a 32-bit word in memory or register. 1681 void immediate_arithmetic_op_32(byte subcode, 1682 Register dst, 1683 Immediate src); 1684 void immediate_arithmetic_op_32(byte subcode, 1685 const Operand& dst, 1686 Immediate src); 1687 1688 // Emit machine code for a shift operation. 1689 void shift(Register dst, Immediate shift_amount, int subcode); 1690 void shift_32(Register dst, Immediate shift_amount, int subcode); 1691 // Shift dst by cl % 64 bits. 1692 void shift(Register dst, int subcode); 1693 void shift_32(Register dst, int subcode); 1694 1695 void emit_farith(int b1, int b2, int i); 1696 1697 // labels 1698 // void print(Label* L); 1699 void bind_to(Label* L, int pos); 1700 1701 // record reloc info for current pc_ 1702 void RecordRelocInfo(RelocInfo::Mode rmode, intptr_t data = 0); 1703 1704 void emit_mov(Register dst, const Operand& src, int size); 1705 void emit_mov(Register dst, Register src, int size); 1706 void emit_mov(const Operand& dst, Register src, int size); 1707 void emit_mov(Register dst, Immediate value, int size); 1708 void emit_mov(const Operand& dst, Immediate value, int size); 1709 1710 friend class CodePatcher; 1711 friend class EnsureSpace; 1712 friend class RegExpMacroAssemblerX64; 1713 1714 // code generation 1715 RelocInfoWriter reloc_info_writer; 1716 1717 List< Handle<Code> > code_targets_; 1718 1719 PositionsRecorder positions_recorder_; 1720 friend class PositionsRecorder; 1721 }; 1722 1723 1724 // Helper class that ensures that there is enough space for generating 1725 // instructions and relocation information. The constructor makes 1726 // sure that there is enough space and (in debug mode) the destructor 1727 // checks that we did not generate too much. 1728 class EnsureSpace BASE_EMBEDDED { 1729 public: 1730 explicit EnsureSpace(Assembler* assembler) : assembler_(assembler) { 1731 if (assembler_->buffer_overflow()) assembler_->GrowBuffer(); 1732 #ifdef DEBUG 1733 space_before_ = assembler_->available_space(); 1734 #endif 1735 } 1736 1737 #ifdef DEBUG 1738 ~EnsureSpace() { 1739 int bytes_generated = space_before_ - assembler_->available_space(); 1740 ASSERT(bytes_generated < assembler_->kGap); 1741 } 1742 #endif 1743 1744 private: 1745 Assembler* assembler_; 1746 #ifdef DEBUG 1747 int space_before_; 1748 #endif 1749 }; 1750 1751 } } // namespace v8::internal 1752 1753 #endif // V8_X64_ASSEMBLER_X64_H_ 1754