1 /* 2 * Copyright (C) 2014 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #include "assembler_x86_64.h" 18 19 #include "base/casts.h" 20 #include "entrypoints/quick/quick_entrypoints.h" 21 #include "memory_region.h" 22 #include "thread.h" 23 24 namespace art { 25 namespace x86_64 { 26 27 std::ostream& operator<<(std::ostream& os, const CpuRegister& reg) { 28 return os << reg.AsRegister(); 29 } 30 31 std::ostream& operator<<(std::ostream& os, const XmmRegister& reg) { 32 return os << reg.AsFloatRegister(); 33 } 34 35 std::ostream& operator<<(std::ostream& os, const X87Register& reg) { 36 return os << "ST" << static_cast<int>(reg); 37 } 38 39 std::ostream& operator<<(std::ostream& os, const Address& addr) { 40 switch (addr.mod()) { 41 case 0: 42 if (addr.rm() != RSP || addr.cpu_index().AsRegister() == RSP) { 43 return os << "(%" << addr.cpu_rm() << ")"; 44 } else if (addr.base() == RBP) { 45 return os << static_cast<int>(addr.disp32()) << "(,%" << addr.cpu_index() 46 << "," << (1 << addr.scale()) << ")"; 47 } 48 return os << "(%" << addr.cpu_base() << ",%" 49 << addr.cpu_index() << "," << (1 << addr.scale()) << ")"; 50 case 1: 51 if (addr.rm() != RSP || addr.cpu_index().AsRegister() == RSP) { 52 return os << static_cast<int>(addr.disp8()) << "(%" << addr.cpu_rm() << ")"; 53 } 54 return os << static_cast<int>(addr.disp8()) << "(%" << addr.cpu_base() << ",%" 55 << addr.cpu_index() << "," << (1 << addr.scale()) << ")"; 56 case 2: 57 if (addr.rm() != RSP || addr.cpu_index().AsRegister() == RSP) { 58 return os << static_cast<int>(addr.disp32()) << "(%" << addr.cpu_rm() << ")"; 59 } 60 return os << static_cast<int>(addr.disp32()) << "(%" << addr.cpu_base() << ",%" 61 << addr.cpu_index() << "," << (1 << addr.scale()) << ")"; 62 default: 63 return os << "<address?>"; 64 } 65 } 66 67 void X86_64Assembler::call(CpuRegister reg) { 68 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 69 EmitOptionalRex32(reg); 70 EmitUint8(0xFF); 71 EmitRegisterOperand(2, reg.LowBits()); 72 } 73 74 75 void X86_64Assembler::call(const Address& address) { 76 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 77 EmitOptionalRex32(address); 78 EmitUint8(0xFF); 79 EmitOperand(2, address); 80 } 81 82 83 void X86_64Assembler::call(Label* label) { 84 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 85 EmitUint8(0xE8); 86 static const int kSize = 5; 87 // Offset by one because we already have emitted the opcode. 88 EmitLabel(label, kSize - 1); 89 } 90 91 void X86_64Assembler::pushq(CpuRegister reg) { 92 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 93 EmitOptionalRex32(reg); 94 EmitUint8(0x50 + reg.LowBits()); 95 } 96 97 98 void X86_64Assembler::pushq(const Address& address) { 99 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 100 EmitOptionalRex32(address); 101 EmitUint8(0xFF); 102 EmitOperand(6, address); 103 } 104 105 106 void X86_64Assembler::pushq(const Immediate& imm) { 107 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 108 CHECK(imm.is_int32()); // pushq only supports 32b immediate. 109 if (imm.is_int8()) { 110 EmitUint8(0x6A); 111 EmitUint8(imm.value() & 0xFF); 112 } else { 113 EmitUint8(0x68); 114 EmitImmediate(imm); 115 } 116 } 117 118 119 void X86_64Assembler::popq(CpuRegister reg) { 120 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 121 EmitOptionalRex32(reg); 122 EmitUint8(0x58 + reg.LowBits()); 123 } 124 125 126 void X86_64Assembler::popq(const Address& address) { 127 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 128 EmitOptionalRex32(address); 129 EmitUint8(0x8F); 130 EmitOperand(0, address); 131 } 132 133 134 void X86_64Assembler::movq(CpuRegister dst, const Immediate& imm) { 135 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 136 if (imm.is_int32()) { 137 // 32 bit. Note: sign-extends. 138 EmitRex64(dst); 139 EmitUint8(0xC7); 140 EmitRegisterOperand(0, dst.LowBits()); 141 EmitInt32(static_cast<int32_t>(imm.value())); 142 } else { 143 EmitRex64(dst); 144 EmitUint8(0xB8 + dst.LowBits()); 145 EmitInt64(imm.value()); 146 } 147 } 148 149 150 void X86_64Assembler::movl(CpuRegister dst, const Immediate& imm) { 151 CHECK(imm.is_int32()); 152 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 153 EmitOptionalRex32(dst); 154 EmitUint8(0xB8 + dst.LowBits()); 155 EmitImmediate(imm); 156 } 157 158 159 void X86_64Assembler::movq(const Address& dst, const Immediate& imm) { 160 CHECK(imm.is_int32()); 161 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 162 EmitRex64(dst); 163 EmitUint8(0xC7); 164 EmitOperand(0, dst); 165 EmitImmediate(imm); 166 } 167 168 169 void X86_64Assembler::movq(CpuRegister dst, CpuRegister src) { 170 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 171 // 0x89 is movq r/m64 <- r64, with op1 in r/m and op2 in reg: so reverse EmitRex64 172 EmitRex64(src, dst); 173 EmitUint8(0x89); 174 EmitRegisterOperand(src.LowBits(), dst.LowBits()); 175 } 176 177 178 void X86_64Assembler::movl(CpuRegister dst, CpuRegister src) { 179 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 180 EmitOptionalRex32(dst, src); 181 EmitUint8(0x8B); 182 EmitRegisterOperand(dst.LowBits(), src.LowBits()); 183 } 184 185 186 void X86_64Assembler::movq(CpuRegister dst, const Address& src) { 187 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 188 EmitRex64(dst, src); 189 EmitUint8(0x8B); 190 EmitOperand(dst.LowBits(), src); 191 } 192 193 194 void X86_64Assembler::movl(CpuRegister dst, const Address& src) { 195 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 196 EmitOptionalRex32(dst, src); 197 EmitUint8(0x8B); 198 EmitOperand(dst.LowBits(), src); 199 } 200 201 202 void X86_64Assembler::movq(const Address& dst, CpuRegister src) { 203 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 204 EmitRex64(src, dst); 205 EmitUint8(0x89); 206 EmitOperand(src.LowBits(), dst); 207 } 208 209 210 void X86_64Assembler::movl(const Address& dst, CpuRegister src) { 211 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 212 EmitOptionalRex32(src, dst); 213 EmitUint8(0x89); 214 EmitOperand(src.LowBits(), dst); 215 } 216 217 void X86_64Assembler::movl(const Address& dst, const Immediate& imm) { 218 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 219 EmitOptionalRex32(dst); 220 EmitUint8(0xC7); 221 EmitOperand(0, dst); 222 EmitImmediate(imm); 223 } 224 225 void X86_64Assembler::movntl(const Address& dst, CpuRegister src) { 226 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 227 EmitOptionalRex32(src, dst); 228 EmitUint8(0x0F); 229 EmitUint8(0xC3); 230 EmitOperand(src.LowBits(), dst); 231 } 232 233 void X86_64Assembler::movntq(const Address& dst, CpuRegister src) { 234 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 235 EmitRex64(src, dst); 236 EmitUint8(0x0F); 237 EmitUint8(0xC3); 238 EmitOperand(src.LowBits(), dst); 239 } 240 241 void X86_64Assembler::cmov(Condition c, CpuRegister dst, CpuRegister src) { 242 cmov(c, dst, src, true); 243 } 244 245 void X86_64Assembler::cmov(Condition c, CpuRegister dst, CpuRegister src, bool is64bit) { 246 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 247 EmitOptionalRex(false, is64bit, dst.NeedsRex(), false, src.NeedsRex()); 248 EmitUint8(0x0F); 249 EmitUint8(0x40 + c); 250 EmitRegisterOperand(dst.LowBits(), src.LowBits()); 251 } 252 253 254 void X86_64Assembler::cmov(Condition c, CpuRegister dst, const Address& src, bool is64bit) { 255 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 256 if (is64bit) { 257 EmitRex64(dst, src); 258 } else { 259 EmitOptionalRex32(dst, src); 260 } 261 EmitUint8(0x0F); 262 EmitUint8(0x40 + c); 263 EmitOperand(dst.LowBits(), src); 264 } 265 266 267 void X86_64Assembler::movzxb(CpuRegister dst, CpuRegister src) { 268 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 269 EmitOptionalByteRegNormalizingRex32(dst, src); 270 EmitUint8(0x0F); 271 EmitUint8(0xB6); 272 EmitRegisterOperand(dst.LowBits(), src.LowBits()); 273 } 274 275 276 void X86_64Assembler::movzxb(CpuRegister dst, const Address& src) { 277 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 278 // Byte register is only in the source register form, so we don't use 279 // EmitOptionalByteRegNormalizingRex32(dst, src); 280 EmitOptionalRex32(dst, src); 281 EmitUint8(0x0F); 282 EmitUint8(0xB6); 283 EmitOperand(dst.LowBits(), src); 284 } 285 286 287 void X86_64Assembler::movsxb(CpuRegister dst, CpuRegister src) { 288 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 289 EmitOptionalByteRegNormalizingRex32(dst, src); 290 EmitUint8(0x0F); 291 EmitUint8(0xBE); 292 EmitRegisterOperand(dst.LowBits(), src.LowBits()); 293 } 294 295 296 void X86_64Assembler::movsxb(CpuRegister dst, const Address& src) { 297 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 298 // Byte register is only in the source register form, so we don't use 299 // EmitOptionalByteRegNormalizingRex32(dst, src); 300 EmitOptionalRex32(dst, src); 301 EmitUint8(0x0F); 302 EmitUint8(0xBE); 303 EmitOperand(dst.LowBits(), src); 304 } 305 306 307 void X86_64Assembler::movb(CpuRegister /*dst*/, const Address& /*src*/) { 308 LOG(FATAL) << "Use movzxb or movsxb instead."; 309 } 310 311 312 void X86_64Assembler::movb(const Address& dst, CpuRegister src) { 313 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 314 EmitOptionalByteRegNormalizingRex32(src, dst); 315 EmitUint8(0x88); 316 EmitOperand(src.LowBits(), dst); 317 } 318 319 320 void X86_64Assembler::movb(const Address& dst, const Immediate& imm) { 321 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 322 EmitOptionalRex32(dst); 323 EmitUint8(0xC6); 324 EmitOperand(Register::RAX, dst); 325 CHECK(imm.is_int8()); 326 EmitUint8(imm.value() & 0xFF); 327 } 328 329 330 void X86_64Assembler::movzxw(CpuRegister dst, CpuRegister src) { 331 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 332 EmitOptionalRex32(dst, src); 333 EmitUint8(0x0F); 334 EmitUint8(0xB7); 335 EmitRegisterOperand(dst.LowBits(), src.LowBits()); 336 } 337 338 339 void X86_64Assembler::movzxw(CpuRegister dst, const Address& src) { 340 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 341 EmitOptionalRex32(dst, src); 342 EmitUint8(0x0F); 343 EmitUint8(0xB7); 344 EmitOperand(dst.LowBits(), src); 345 } 346 347 348 void X86_64Assembler::movsxw(CpuRegister dst, CpuRegister src) { 349 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 350 EmitOptionalRex32(dst, src); 351 EmitUint8(0x0F); 352 EmitUint8(0xBF); 353 EmitRegisterOperand(dst.LowBits(), src.LowBits()); 354 } 355 356 357 void X86_64Assembler::movsxw(CpuRegister dst, const Address& src) { 358 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 359 EmitOptionalRex32(dst, src); 360 EmitUint8(0x0F); 361 EmitUint8(0xBF); 362 EmitOperand(dst.LowBits(), src); 363 } 364 365 366 void X86_64Assembler::movw(CpuRegister /*dst*/, const Address& /*src*/) { 367 LOG(FATAL) << "Use movzxw or movsxw instead."; 368 } 369 370 371 void X86_64Assembler::movw(const Address& dst, CpuRegister src) { 372 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 373 EmitOperandSizeOverride(); 374 EmitOptionalRex32(src, dst); 375 EmitUint8(0x89); 376 EmitOperand(src.LowBits(), dst); 377 } 378 379 380 void X86_64Assembler::movw(const Address& dst, const Immediate& imm) { 381 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 382 EmitOperandSizeOverride(); 383 EmitOptionalRex32(dst); 384 EmitUint8(0xC7); 385 EmitOperand(Register::RAX, dst); 386 CHECK(imm.is_uint16() || imm.is_int16()); 387 EmitUint8(imm.value() & 0xFF); 388 EmitUint8(imm.value() >> 8); 389 } 390 391 392 void X86_64Assembler::leaq(CpuRegister dst, const Address& src) { 393 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 394 EmitRex64(dst, src); 395 EmitUint8(0x8D); 396 EmitOperand(dst.LowBits(), src); 397 } 398 399 400 void X86_64Assembler::leal(CpuRegister dst, const Address& src) { 401 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 402 EmitOptionalRex32(dst, src); 403 EmitUint8(0x8D); 404 EmitOperand(dst.LowBits(), src); 405 } 406 407 408 void X86_64Assembler::movaps(XmmRegister dst, XmmRegister src) { 409 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 410 EmitOptionalRex32(dst, src); 411 EmitUint8(0x0F); 412 EmitUint8(0x28); 413 EmitXmmRegisterOperand(dst.LowBits(), src); 414 } 415 416 417 void X86_64Assembler::movaps(XmmRegister dst, const Address& src) { 418 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 419 EmitOptionalRex32(dst, src); 420 EmitUint8(0x0F); 421 EmitUint8(0x28); 422 EmitOperand(dst.LowBits(), src); 423 } 424 425 426 void X86_64Assembler::movups(XmmRegister dst, const Address& src) { 427 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 428 EmitOptionalRex32(dst, src); 429 EmitUint8(0x0F); 430 EmitUint8(0x10); 431 EmitOperand(dst.LowBits(), src); 432 } 433 434 435 void X86_64Assembler::movaps(const Address& dst, XmmRegister src) { 436 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 437 EmitOptionalRex32(src, dst); 438 EmitUint8(0x0F); 439 EmitUint8(0x29); 440 EmitOperand(src.LowBits(), dst); 441 } 442 443 444 void X86_64Assembler::movups(const Address& dst, XmmRegister src) { 445 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 446 EmitOptionalRex32(src, dst); 447 EmitUint8(0x0F); 448 EmitUint8(0x11); 449 EmitOperand(src.LowBits(), dst); 450 } 451 452 453 void X86_64Assembler::movss(XmmRegister dst, const Address& src) { 454 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 455 EmitUint8(0xF3); 456 EmitOptionalRex32(dst, src); 457 EmitUint8(0x0F); 458 EmitUint8(0x10); 459 EmitOperand(dst.LowBits(), src); 460 } 461 462 463 void X86_64Assembler::movss(const Address& dst, XmmRegister src) { 464 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 465 EmitUint8(0xF3); 466 EmitOptionalRex32(src, dst); 467 EmitUint8(0x0F); 468 EmitUint8(0x11); 469 EmitOperand(src.LowBits(), dst); 470 } 471 472 473 void X86_64Assembler::movss(XmmRegister dst, XmmRegister src) { 474 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 475 EmitUint8(0xF3); 476 EmitOptionalRex32(src, dst); // Movss is MR encoding instead of the usual RM. 477 EmitUint8(0x0F); 478 EmitUint8(0x11); 479 EmitXmmRegisterOperand(src.LowBits(), dst); 480 } 481 482 483 void X86_64Assembler::movsxd(CpuRegister dst, CpuRegister src) { 484 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 485 EmitRex64(dst, src); 486 EmitUint8(0x63); 487 EmitRegisterOperand(dst.LowBits(), src.LowBits()); 488 } 489 490 491 void X86_64Assembler::movsxd(CpuRegister dst, const Address& src) { 492 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 493 EmitRex64(dst, src); 494 EmitUint8(0x63); 495 EmitOperand(dst.LowBits(), src); 496 } 497 498 499 void X86_64Assembler::movd(XmmRegister dst, CpuRegister src) { 500 movd(dst, src, true); 501 } 502 503 void X86_64Assembler::movd(CpuRegister dst, XmmRegister src) { 504 movd(dst, src, true); 505 } 506 507 void X86_64Assembler::movd(XmmRegister dst, CpuRegister src, bool is64bit) { 508 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 509 EmitUint8(0x66); 510 EmitOptionalRex(false, is64bit, dst.NeedsRex(), false, src.NeedsRex()); 511 EmitUint8(0x0F); 512 EmitUint8(0x6E); 513 EmitOperand(dst.LowBits(), Operand(src)); 514 } 515 516 void X86_64Assembler::movd(CpuRegister dst, XmmRegister src, bool is64bit) { 517 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 518 EmitUint8(0x66); 519 EmitOptionalRex(false, is64bit, src.NeedsRex(), false, dst.NeedsRex()); 520 EmitUint8(0x0F); 521 EmitUint8(0x7E); 522 EmitOperand(src.LowBits(), Operand(dst)); 523 } 524 525 526 void X86_64Assembler::addss(XmmRegister dst, XmmRegister src) { 527 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 528 EmitUint8(0xF3); 529 EmitOptionalRex32(dst, src); 530 EmitUint8(0x0F); 531 EmitUint8(0x58); 532 EmitXmmRegisterOperand(dst.LowBits(), src); 533 } 534 535 536 void X86_64Assembler::addss(XmmRegister dst, const Address& src) { 537 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 538 EmitUint8(0xF3); 539 EmitOptionalRex32(dst, src); 540 EmitUint8(0x0F); 541 EmitUint8(0x58); 542 EmitOperand(dst.LowBits(), src); 543 } 544 545 546 void X86_64Assembler::subss(XmmRegister dst, XmmRegister src) { 547 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 548 EmitUint8(0xF3); 549 EmitOptionalRex32(dst, src); 550 EmitUint8(0x0F); 551 EmitUint8(0x5C); 552 EmitXmmRegisterOperand(dst.LowBits(), src); 553 } 554 555 556 void X86_64Assembler::subss(XmmRegister dst, const Address& src) { 557 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 558 EmitUint8(0xF3); 559 EmitOptionalRex32(dst, src); 560 EmitUint8(0x0F); 561 EmitUint8(0x5C); 562 EmitOperand(dst.LowBits(), src); 563 } 564 565 566 void X86_64Assembler::mulss(XmmRegister dst, XmmRegister src) { 567 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 568 EmitUint8(0xF3); 569 EmitOptionalRex32(dst, src); 570 EmitUint8(0x0F); 571 EmitUint8(0x59); 572 EmitXmmRegisterOperand(dst.LowBits(), src); 573 } 574 575 576 void X86_64Assembler::mulss(XmmRegister dst, const Address& src) { 577 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 578 EmitUint8(0xF3); 579 EmitOptionalRex32(dst, src); 580 EmitUint8(0x0F); 581 EmitUint8(0x59); 582 EmitOperand(dst.LowBits(), src); 583 } 584 585 586 void X86_64Assembler::divss(XmmRegister dst, XmmRegister src) { 587 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 588 EmitUint8(0xF3); 589 EmitOptionalRex32(dst, src); 590 EmitUint8(0x0F); 591 EmitUint8(0x5E); 592 EmitXmmRegisterOperand(dst.LowBits(), src); 593 } 594 595 596 void X86_64Assembler::divss(XmmRegister dst, const Address& src) { 597 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 598 EmitUint8(0xF3); 599 EmitOptionalRex32(dst, src); 600 EmitUint8(0x0F); 601 EmitUint8(0x5E); 602 EmitOperand(dst.LowBits(), src); 603 } 604 605 606 void X86_64Assembler::addps(XmmRegister dst, XmmRegister src) { 607 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 608 EmitOptionalRex32(dst, src); 609 EmitUint8(0x0F); 610 EmitUint8(0x58); 611 EmitXmmRegisterOperand(dst.LowBits(), src); 612 } 613 614 615 void X86_64Assembler::subps(XmmRegister dst, XmmRegister src) { 616 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 617 EmitOptionalRex32(dst, src); 618 EmitUint8(0x0F); 619 EmitUint8(0x5C); 620 EmitXmmRegisterOperand(dst.LowBits(), src); 621 } 622 623 624 void X86_64Assembler::mulps(XmmRegister dst, XmmRegister src) { 625 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 626 EmitOptionalRex32(dst, src); 627 EmitUint8(0x0F); 628 EmitUint8(0x59); 629 EmitXmmRegisterOperand(dst.LowBits(), src); 630 } 631 632 633 void X86_64Assembler::divps(XmmRegister dst, XmmRegister src) { 634 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 635 EmitOptionalRex32(dst, src); 636 EmitUint8(0x0F); 637 EmitUint8(0x5E); 638 EmitXmmRegisterOperand(dst.LowBits(), src); 639 } 640 641 642 void X86_64Assembler::flds(const Address& src) { 643 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 644 EmitUint8(0xD9); 645 EmitOperand(0, src); 646 } 647 648 649 void X86_64Assembler::fsts(const Address& dst) { 650 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 651 EmitUint8(0xD9); 652 EmitOperand(2, dst); 653 } 654 655 656 void X86_64Assembler::fstps(const Address& dst) { 657 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 658 EmitUint8(0xD9); 659 EmitOperand(3, dst); 660 } 661 662 663 void X86_64Assembler::movapd(XmmRegister dst, XmmRegister src) { 664 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 665 EmitUint8(0x66); 666 EmitOptionalRex32(dst, src); 667 EmitUint8(0x0F); 668 EmitUint8(0x28); 669 EmitXmmRegisterOperand(dst.LowBits(), src); 670 } 671 672 673 void X86_64Assembler::movapd(XmmRegister dst, const Address& src) { 674 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 675 EmitUint8(0x66); 676 EmitOptionalRex32(dst, src); 677 EmitUint8(0x0F); 678 EmitUint8(0x28); 679 EmitOperand(dst.LowBits(), src); 680 } 681 682 683 void X86_64Assembler::movupd(XmmRegister dst, const Address& src) { 684 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 685 EmitUint8(0x66); 686 EmitOptionalRex32(dst, src); 687 EmitUint8(0x0F); 688 EmitUint8(0x10); 689 EmitOperand(dst.LowBits(), src); 690 } 691 692 693 void X86_64Assembler::movapd(const Address& dst, XmmRegister src) { 694 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 695 EmitUint8(0x66); 696 EmitOptionalRex32(src, dst); 697 EmitUint8(0x0F); 698 EmitUint8(0x29); 699 EmitOperand(src.LowBits(), dst); 700 } 701 702 703 void X86_64Assembler::movupd(const Address& dst, XmmRegister src) { 704 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 705 EmitUint8(0x66); 706 EmitOptionalRex32(src, dst); 707 EmitUint8(0x0F); 708 EmitUint8(0x11); 709 EmitOperand(src.LowBits(), dst); 710 } 711 712 713 void X86_64Assembler::movsd(XmmRegister dst, const Address& src) { 714 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 715 EmitUint8(0xF2); 716 EmitOptionalRex32(dst, src); 717 EmitUint8(0x0F); 718 EmitUint8(0x10); 719 EmitOperand(dst.LowBits(), src); 720 } 721 722 723 void X86_64Assembler::movsd(const Address& dst, XmmRegister src) { 724 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 725 EmitUint8(0xF2); 726 EmitOptionalRex32(src, dst); 727 EmitUint8(0x0F); 728 EmitUint8(0x11); 729 EmitOperand(src.LowBits(), dst); 730 } 731 732 733 void X86_64Assembler::movsd(XmmRegister dst, XmmRegister src) { 734 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 735 EmitUint8(0xF2); 736 EmitOptionalRex32(src, dst); // Movsd is MR encoding instead of the usual RM. 737 EmitUint8(0x0F); 738 EmitUint8(0x11); 739 EmitXmmRegisterOperand(src.LowBits(), dst); 740 } 741 742 743 void X86_64Assembler::addsd(XmmRegister dst, XmmRegister src) { 744 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 745 EmitUint8(0xF2); 746 EmitOptionalRex32(dst, src); 747 EmitUint8(0x0F); 748 EmitUint8(0x58); 749 EmitXmmRegisterOperand(dst.LowBits(), src); 750 } 751 752 753 void X86_64Assembler::addsd(XmmRegister dst, const Address& src) { 754 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 755 EmitUint8(0xF2); 756 EmitOptionalRex32(dst, src); 757 EmitUint8(0x0F); 758 EmitUint8(0x58); 759 EmitOperand(dst.LowBits(), src); 760 } 761 762 763 void X86_64Assembler::subsd(XmmRegister dst, XmmRegister src) { 764 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 765 EmitUint8(0xF2); 766 EmitOptionalRex32(dst, src); 767 EmitUint8(0x0F); 768 EmitUint8(0x5C); 769 EmitXmmRegisterOperand(dst.LowBits(), src); 770 } 771 772 773 void X86_64Assembler::subsd(XmmRegister dst, const Address& src) { 774 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 775 EmitUint8(0xF2); 776 EmitOptionalRex32(dst, src); 777 EmitUint8(0x0F); 778 EmitUint8(0x5C); 779 EmitOperand(dst.LowBits(), src); 780 } 781 782 783 void X86_64Assembler::mulsd(XmmRegister dst, XmmRegister src) { 784 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 785 EmitUint8(0xF2); 786 EmitOptionalRex32(dst, src); 787 EmitUint8(0x0F); 788 EmitUint8(0x59); 789 EmitXmmRegisterOperand(dst.LowBits(), src); 790 } 791 792 793 void X86_64Assembler::mulsd(XmmRegister dst, const Address& src) { 794 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 795 EmitUint8(0xF2); 796 EmitOptionalRex32(dst, src); 797 EmitUint8(0x0F); 798 EmitUint8(0x59); 799 EmitOperand(dst.LowBits(), src); 800 } 801 802 803 void X86_64Assembler::divsd(XmmRegister dst, XmmRegister src) { 804 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 805 EmitUint8(0xF2); 806 EmitOptionalRex32(dst, src); 807 EmitUint8(0x0F); 808 EmitUint8(0x5E); 809 EmitXmmRegisterOperand(dst.LowBits(), src); 810 } 811 812 813 void X86_64Assembler::divsd(XmmRegister dst, const Address& src) { 814 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 815 EmitUint8(0xF2); 816 EmitOptionalRex32(dst, src); 817 EmitUint8(0x0F); 818 EmitUint8(0x5E); 819 EmitOperand(dst.LowBits(), src); 820 } 821 822 823 void X86_64Assembler::addpd(XmmRegister dst, XmmRegister src) { 824 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 825 EmitUint8(0x66); 826 EmitOptionalRex32(dst, src); 827 EmitUint8(0x0F); 828 EmitUint8(0x58); 829 EmitXmmRegisterOperand(dst.LowBits(), src); 830 } 831 832 833 void X86_64Assembler::subpd(XmmRegister dst, XmmRegister src) { 834 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 835 EmitUint8(0x66); 836 EmitOptionalRex32(dst, src); 837 EmitUint8(0x0F); 838 EmitUint8(0x5C); 839 EmitXmmRegisterOperand(dst.LowBits(), src); 840 } 841 842 843 void X86_64Assembler::mulpd(XmmRegister dst, XmmRegister src) { 844 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 845 EmitUint8(0x66); 846 EmitOptionalRex32(dst, src); 847 EmitUint8(0x0F); 848 EmitUint8(0x59); 849 EmitXmmRegisterOperand(dst.LowBits(), src); 850 } 851 852 853 void X86_64Assembler::divpd(XmmRegister dst, XmmRegister src) { 854 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 855 EmitUint8(0x66); 856 EmitOptionalRex32(dst, src); 857 EmitUint8(0x0F); 858 EmitUint8(0x5E); 859 EmitXmmRegisterOperand(dst.LowBits(), src); 860 } 861 862 863 void X86_64Assembler::movdqa(XmmRegister dst, XmmRegister src) { 864 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 865 EmitUint8(0x66); 866 EmitOptionalRex32(dst, src); 867 EmitUint8(0x0F); 868 EmitUint8(0x6F); 869 EmitXmmRegisterOperand(dst.LowBits(), src); 870 } 871 872 873 void X86_64Assembler::movdqa(XmmRegister dst, const Address& src) { 874 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 875 EmitUint8(0x66); 876 EmitOptionalRex32(dst, src); 877 EmitUint8(0x0F); 878 EmitUint8(0x6F); 879 EmitOperand(dst.LowBits(), src); 880 } 881 882 883 void X86_64Assembler::movdqu(XmmRegister dst, const Address& src) { 884 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 885 EmitUint8(0xF3); 886 EmitOptionalRex32(dst, src); 887 EmitUint8(0x0F); 888 EmitUint8(0x6F); 889 EmitOperand(dst.LowBits(), src); 890 } 891 892 893 void X86_64Assembler::movdqa(const Address& dst, XmmRegister src) { 894 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 895 EmitUint8(0x66); 896 EmitOptionalRex32(src, dst); 897 EmitUint8(0x0F); 898 EmitUint8(0x7F); 899 EmitOperand(src.LowBits(), dst); 900 } 901 902 903 void X86_64Assembler::movdqu(const Address& dst, XmmRegister src) { 904 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 905 EmitUint8(0xF3); 906 EmitOptionalRex32(src, dst); 907 EmitUint8(0x0F); 908 EmitUint8(0x7F); 909 EmitOperand(src.LowBits(), dst); 910 } 911 912 913 void X86_64Assembler::paddb(XmmRegister dst, XmmRegister src) { 914 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 915 EmitUint8(0x66); 916 EmitOptionalRex32(dst, src); 917 EmitUint8(0x0F); 918 EmitUint8(0xFC); 919 EmitXmmRegisterOperand(dst.LowBits(), src); 920 } 921 922 923 void X86_64Assembler::psubb(XmmRegister dst, XmmRegister src) { 924 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 925 EmitUint8(0x66); 926 EmitOptionalRex32(dst, src); 927 EmitUint8(0x0F); 928 EmitUint8(0xF8); 929 EmitXmmRegisterOperand(dst.LowBits(), src); 930 } 931 932 933 void X86_64Assembler::paddw(XmmRegister dst, XmmRegister src) { 934 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 935 EmitUint8(0x66); 936 EmitOptionalRex32(dst, src); 937 EmitUint8(0x0F); 938 EmitUint8(0xFD); 939 EmitXmmRegisterOperand(dst.LowBits(), src); 940 } 941 942 943 void X86_64Assembler::psubw(XmmRegister dst, XmmRegister src) { 944 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 945 EmitUint8(0x66); 946 EmitOptionalRex32(dst, src); 947 EmitUint8(0x0F); 948 EmitUint8(0xF9); 949 EmitXmmRegisterOperand(dst.LowBits(), src); 950 } 951 952 953 void X86_64Assembler::pmullw(XmmRegister dst, XmmRegister src) { 954 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 955 EmitUint8(0x66); 956 EmitOptionalRex32(dst, src); 957 EmitUint8(0x0F); 958 EmitUint8(0xD5); 959 EmitXmmRegisterOperand(dst.LowBits(), src); 960 } 961 962 963 void X86_64Assembler::paddd(XmmRegister dst, XmmRegister src) { 964 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 965 EmitUint8(0x66); 966 EmitOptionalRex32(dst, src); 967 EmitUint8(0x0F); 968 EmitUint8(0xFE); 969 EmitXmmRegisterOperand(dst.LowBits(), src); 970 } 971 972 973 void X86_64Assembler::psubd(XmmRegister dst, XmmRegister src) { 974 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 975 EmitUint8(0x66); 976 EmitOptionalRex32(dst, src); 977 EmitUint8(0x0F); 978 EmitUint8(0xFA); 979 EmitXmmRegisterOperand(dst.LowBits(), src); 980 } 981 982 983 void X86_64Assembler::pmulld(XmmRegister dst, XmmRegister src) { 984 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 985 EmitUint8(0x66); 986 EmitOptionalRex32(dst, src); 987 EmitUint8(0x0F); 988 EmitUint8(0x38); 989 EmitUint8(0x40); 990 EmitXmmRegisterOperand(dst.LowBits(), src); 991 } 992 993 994 void X86_64Assembler::paddq(XmmRegister dst, XmmRegister src) { 995 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 996 EmitUint8(0x66); 997 EmitOptionalRex32(dst, src); 998 EmitUint8(0x0F); 999 EmitUint8(0xD4); 1000 EmitXmmRegisterOperand(dst.LowBits(), src); 1001 } 1002 1003 1004 void X86_64Assembler::psubq(XmmRegister dst, XmmRegister src) { 1005 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1006 EmitUint8(0x66); 1007 EmitOptionalRex32(dst, src); 1008 EmitUint8(0x0F); 1009 EmitUint8(0xFB); 1010 EmitXmmRegisterOperand(dst.LowBits(), src); 1011 } 1012 1013 1014 void X86_64Assembler::cvtsi2ss(XmmRegister dst, CpuRegister src) { 1015 cvtsi2ss(dst, src, false); 1016 } 1017 1018 1019 void X86_64Assembler::cvtsi2ss(XmmRegister dst, CpuRegister src, bool is64bit) { 1020 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1021 EmitUint8(0xF3); 1022 if (is64bit) { 1023 // Emit a REX.W prefix if the operand size is 64 bits. 1024 EmitRex64(dst, src); 1025 } else { 1026 EmitOptionalRex32(dst, src); 1027 } 1028 EmitUint8(0x0F); 1029 EmitUint8(0x2A); 1030 EmitOperand(dst.LowBits(), Operand(src)); 1031 } 1032 1033 1034 void X86_64Assembler::cvtsi2ss(XmmRegister dst, const Address& src, bool is64bit) { 1035 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1036 EmitUint8(0xF3); 1037 if (is64bit) { 1038 // Emit a REX.W prefix if the operand size is 64 bits. 1039 EmitRex64(dst, src); 1040 } else { 1041 EmitOptionalRex32(dst, src); 1042 } 1043 EmitUint8(0x0F); 1044 EmitUint8(0x2A); 1045 EmitOperand(dst.LowBits(), src); 1046 } 1047 1048 1049 void X86_64Assembler::cvtsi2sd(XmmRegister dst, CpuRegister src) { 1050 cvtsi2sd(dst, src, false); 1051 } 1052 1053 1054 void X86_64Assembler::cvtsi2sd(XmmRegister dst, CpuRegister src, bool is64bit) { 1055 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1056 EmitUint8(0xF2); 1057 if (is64bit) { 1058 // Emit a REX.W prefix if the operand size is 64 bits. 1059 EmitRex64(dst, src); 1060 } else { 1061 EmitOptionalRex32(dst, src); 1062 } 1063 EmitUint8(0x0F); 1064 EmitUint8(0x2A); 1065 EmitOperand(dst.LowBits(), Operand(src)); 1066 } 1067 1068 1069 void X86_64Assembler::cvtsi2sd(XmmRegister dst, const Address& src, bool is64bit) { 1070 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1071 EmitUint8(0xF2); 1072 if (is64bit) { 1073 // Emit a REX.W prefix if the operand size is 64 bits. 1074 EmitRex64(dst, src); 1075 } else { 1076 EmitOptionalRex32(dst, src); 1077 } 1078 EmitUint8(0x0F); 1079 EmitUint8(0x2A); 1080 EmitOperand(dst.LowBits(), src); 1081 } 1082 1083 1084 void X86_64Assembler::cvtss2si(CpuRegister dst, XmmRegister src) { 1085 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1086 EmitUint8(0xF3); 1087 EmitOptionalRex32(dst, src); 1088 EmitUint8(0x0F); 1089 EmitUint8(0x2D); 1090 EmitXmmRegisterOperand(dst.LowBits(), src); 1091 } 1092 1093 1094 void X86_64Assembler::cvtss2sd(XmmRegister dst, XmmRegister src) { 1095 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1096 EmitUint8(0xF3); 1097 EmitOptionalRex32(dst, src); 1098 EmitUint8(0x0F); 1099 EmitUint8(0x5A); 1100 EmitXmmRegisterOperand(dst.LowBits(), src); 1101 } 1102 1103 1104 void X86_64Assembler::cvtss2sd(XmmRegister dst, const Address& src) { 1105 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1106 EmitUint8(0xF3); 1107 EmitOptionalRex32(dst, src); 1108 EmitUint8(0x0F); 1109 EmitUint8(0x5A); 1110 EmitOperand(dst.LowBits(), src); 1111 } 1112 1113 1114 void X86_64Assembler::cvtsd2si(CpuRegister dst, XmmRegister src) { 1115 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1116 EmitUint8(0xF2); 1117 EmitOptionalRex32(dst, src); 1118 EmitUint8(0x0F); 1119 EmitUint8(0x2D); 1120 EmitXmmRegisterOperand(dst.LowBits(), src); 1121 } 1122 1123 1124 void X86_64Assembler::cvttss2si(CpuRegister dst, XmmRegister src) { 1125 cvttss2si(dst, src, false); 1126 } 1127 1128 1129 void X86_64Assembler::cvttss2si(CpuRegister dst, XmmRegister src, bool is64bit) { 1130 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1131 EmitUint8(0xF3); 1132 if (is64bit) { 1133 // Emit a REX.W prefix if the operand size is 64 bits. 1134 EmitRex64(dst, src); 1135 } else { 1136 EmitOptionalRex32(dst, src); 1137 } 1138 EmitUint8(0x0F); 1139 EmitUint8(0x2C); 1140 EmitXmmRegisterOperand(dst.LowBits(), src); 1141 } 1142 1143 1144 void X86_64Assembler::cvttsd2si(CpuRegister dst, XmmRegister src) { 1145 cvttsd2si(dst, src, false); 1146 } 1147 1148 1149 void X86_64Assembler::cvttsd2si(CpuRegister dst, XmmRegister src, bool is64bit) { 1150 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1151 EmitUint8(0xF2); 1152 if (is64bit) { 1153 // Emit a REX.W prefix if the operand size is 64 bits. 1154 EmitRex64(dst, src); 1155 } else { 1156 EmitOptionalRex32(dst, src); 1157 } 1158 EmitUint8(0x0F); 1159 EmitUint8(0x2C); 1160 EmitXmmRegisterOperand(dst.LowBits(), src); 1161 } 1162 1163 1164 void X86_64Assembler::cvtsd2ss(XmmRegister dst, XmmRegister src) { 1165 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1166 EmitUint8(0xF2); 1167 EmitOptionalRex32(dst, src); 1168 EmitUint8(0x0F); 1169 EmitUint8(0x5A); 1170 EmitXmmRegisterOperand(dst.LowBits(), src); 1171 } 1172 1173 1174 void X86_64Assembler::cvtsd2ss(XmmRegister dst, const Address& src) { 1175 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1176 EmitUint8(0xF2); 1177 EmitOptionalRex32(dst, src); 1178 EmitUint8(0x0F); 1179 EmitUint8(0x5A); 1180 EmitOperand(dst.LowBits(), src); 1181 } 1182 1183 1184 void X86_64Assembler::cvtdq2ps(XmmRegister dst, XmmRegister src) { 1185 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1186 EmitOptionalRex32(dst, src); 1187 EmitUint8(0x0F); 1188 EmitUint8(0x5B); 1189 EmitXmmRegisterOperand(dst.LowBits(), src); 1190 } 1191 1192 1193 void X86_64Assembler::cvtdq2pd(XmmRegister dst, XmmRegister src) { 1194 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1195 EmitUint8(0xF3); 1196 EmitOptionalRex32(dst, src); 1197 EmitUint8(0x0F); 1198 EmitUint8(0xE6); 1199 EmitXmmRegisterOperand(dst.LowBits(), src); 1200 } 1201 1202 1203 void X86_64Assembler::comiss(XmmRegister a, XmmRegister b) { 1204 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1205 EmitOptionalRex32(a, b); 1206 EmitUint8(0x0F); 1207 EmitUint8(0x2F); 1208 EmitXmmRegisterOperand(a.LowBits(), b); 1209 } 1210 1211 1212 void X86_64Assembler::comiss(XmmRegister a, const Address& b) { 1213 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1214 EmitOptionalRex32(a, b); 1215 EmitUint8(0x0F); 1216 EmitUint8(0x2F); 1217 EmitOperand(a.LowBits(), b); 1218 } 1219 1220 1221 void X86_64Assembler::comisd(XmmRegister a, XmmRegister b) { 1222 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1223 EmitUint8(0x66); 1224 EmitOptionalRex32(a, b); 1225 EmitUint8(0x0F); 1226 EmitUint8(0x2F); 1227 EmitXmmRegisterOperand(a.LowBits(), b); 1228 } 1229 1230 1231 void X86_64Assembler::comisd(XmmRegister a, const Address& b) { 1232 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1233 EmitUint8(0x66); 1234 EmitOptionalRex32(a, b); 1235 EmitUint8(0x0F); 1236 EmitUint8(0x2F); 1237 EmitOperand(a.LowBits(), b); 1238 } 1239 1240 1241 void X86_64Assembler::ucomiss(XmmRegister a, XmmRegister b) { 1242 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1243 EmitOptionalRex32(a, b); 1244 EmitUint8(0x0F); 1245 EmitUint8(0x2E); 1246 EmitXmmRegisterOperand(a.LowBits(), b); 1247 } 1248 1249 1250 void X86_64Assembler::ucomiss(XmmRegister a, const Address& b) { 1251 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1252 EmitOptionalRex32(a, b); 1253 EmitUint8(0x0F); 1254 EmitUint8(0x2E); 1255 EmitOperand(a.LowBits(), b); 1256 } 1257 1258 1259 void X86_64Assembler::ucomisd(XmmRegister a, XmmRegister b) { 1260 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1261 EmitUint8(0x66); 1262 EmitOptionalRex32(a, b); 1263 EmitUint8(0x0F); 1264 EmitUint8(0x2E); 1265 EmitXmmRegisterOperand(a.LowBits(), b); 1266 } 1267 1268 1269 void X86_64Assembler::ucomisd(XmmRegister a, const Address& b) { 1270 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1271 EmitUint8(0x66); 1272 EmitOptionalRex32(a, b); 1273 EmitUint8(0x0F); 1274 EmitUint8(0x2E); 1275 EmitOperand(a.LowBits(), b); 1276 } 1277 1278 1279 void X86_64Assembler::roundsd(XmmRegister dst, XmmRegister src, const Immediate& imm) { 1280 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1281 EmitUint8(0x66); 1282 EmitOptionalRex32(dst, src); 1283 EmitUint8(0x0F); 1284 EmitUint8(0x3A); 1285 EmitUint8(0x0B); 1286 EmitXmmRegisterOperand(dst.LowBits(), src); 1287 EmitUint8(imm.value()); 1288 } 1289 1290 1291 void X86_64Assembler::roundss(XmmRegister dst, XmmRegister src, const Immediate& imm) { 1292 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1293 EmitUint8(0x66); 1294 EmitOptionalRex32(dst, src); 1295 EmitUint8(0x0F); 1296 EmitUint8(0x3A); 1297 EmitUint8(0x0A); 1298 EmitXmmRegisterOperand(dst.LowBits(), src); 1299 EmitUint8(imm.value()); 1300 } 1301 1302 1303 void X86_64Assembler::sqrtsd(XmmRegister dst, XmmRegister src) { 1304 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1305 EmitUint8(0xF2); 1306 EmitOptionalRex32(dst, src); 1307 EmitUint8(0x0F); 1308 EmitUint8(0x51); 1309 EmitXmmRegisterOperand(dst.LowBits(), src); 1310 } 1311 1312 1313 void X86_64Assembler::sqrtss(XmmRegister dst, XmmRegister src) { 1314 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1315 EmitUint8(0xF3); 1316 EmitOptionalRex32(dst, src); 1317 EmitUint8(0x0F); 1318 EmitUint8(0x51); 1319 EmitXmmRegisterOperand(dst.LowBits(), src); 1320 } 1321 1322 1323 void X86_64Assembler::xorpd(XmmRegister dst, const Address& src) { 1324 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1325 EmitUint8(0x66); 1326 EmitOptionalRex32(dst, src); 1327 EmitUint8(0x0F); 1328 EmitUint8(0x57); 1329 EmitOperand(dst.LowBits(), src); 1330 } 1331 1332 1333 void X86_64Assembler::xorpd(XmmRegister dst, XmmRegister src) { 1334 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1335 EmitUint8(0x66); 1336 EmitOptionalRex32(dst, src); 1337 EmitUint8(0x0F); 1338 EmitUint8(0x57); 1339 EmitXmmRegisterOperand(dst.LowBits(), src); 1340 } 1341 1342 1343 void X86_64Assembler::xorps(XmmRegister dst, const Address& src) { 1344 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1345 EmitOptionalRex32(dst, src); 1346 EmitUint8(0x0F); 1347 EmitUint8(0x57); 1348 EmitOperand(dst.LowBits(), src); 1349 } 1350 1351 1352 void X86_64Assembler::xorps(XmmRegister dst, XmmRegister src) { 1353 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1354 EmitOptionalRex32(dst, src); 1355 EmitUint8(0x0F); 1356 EmitUint8(0x57); 1357 EmitXmmRegisterOperand(dst.LowBits(), src); 1358 } 1359 1360 1361 void X86_64Assembler::pxor(XmmRegister dst, XmmRegister src) { 1362 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1363 EmitUint8(0x66); 1364 EmitOptionalRex32(dst, src); 1365 EmitUint8(0x0F); 1366 EmitUint8(0xEF); 1367 EmitXmmRegisterOperand(dst.LowBits(), src); 1368 } 1369 1370 1371 void X86_64Assembler::andpd(XmmRegister dst, const Address& src) { 1372 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1373 EmitUint8(0x66); 1374 EmitOptionalRex32(dst, src); 1375 EmitUint8(0x0F); 1376 EmitUint8(0x54); 1377 EmitOperand(dst.LowBits(), src); 1378 } 1379 1380 void X86_64Assembler::andpd(XmmRegister dst, XmmRegister src) { 1381 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1382 EmitUint8(0x66); 1383 EmitOptionalRex32(dst, src); 1384 EmitUint8(0x0F); 1385 EmitUint8(0x54); 1386 EmitXmmRegisterOperand(dst.LowBits(), src); 1387 } 1388 1389 void X86_64Assembler::andps(XmmRegister dst, XmmRegister src) { 1390 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1391 EmitOptionalRex32(dst, src); 1392 EmitUint8(0x0F); 1393 EmitUint8(0x54); 1394 EmitXmmRegisterOperand(dst.LowBits(), src); 1395 } 1396 1397 void X86_64Assembler::pand(XmmRegister dst, XmmRegister src) { 1398 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1399 EmitUint8(0x66); 1400 EmitOptionalRex32(dst, src); 1401 EmitUint8(0x0F); 1402 EmitUint8(0xDB); 1403 EmitXmmRegisterOperand(dst.LowBits(), src); 1404 } 1405 1406 void X86_64Assembler::andnpd(XmmRegister dst, XmmRegister src) { 1407 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1408 EmitUint8(0x66); 1409 EmitOptionalRex32(dst, src); 1410 EmitUint8(0x0F); 1411 EmitUint8(0x55); 1412 EmitXmmRegisterOperand(dst.LowBits(), src); 1413 } 1414 1415 void X86_64Assembler::andnps(XmmRegister dst, XmmRegister src) { 1416 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1417 EmitOptionalRex32(dst, src); 1418 EmitUint8(0x0F); 1419 EmitUint8(0x55); 1420 EmitXmmRegisterOperand(dst.LowBits(), src); 1421 } 1422 1423 void X86_64Assembler::pandn(XmmRegister dst, XmmRegister src) { 1424 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1425 EmitUint8(0x66); 1426 EmitOptionalRex32(dst, src); 1427 EmitUint8(0x0F); 1428 EmitUint8(0xDF); 1429 EmitXmmRegisterOperand(dst.LowBits(), src); 1430 } 1431 1432 void X86_64Assembler::orpd(XmmRegister dst, XmmRegister src) { 1433 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1434 EmitUint8(0x66); 1435 EmitOptionalRex32(dst, src); 1436 EmitUint8(0x0F); 1437 EmitUint8(0x56); 1438 EmitXmmRegisterOperand(dst.LowBits(), src); 1439 } 1440 1441 void X86_64Assembler::orps(XmmRegister dst, XmmRegister src) { 1442 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1443 EmitOptionalRex32(dst, src); 1444 EmitUint8(0x0F); 1445 EmitUint8(0x56); 1446 EmitXmmRegisterOperand(dst.LowBits(), src); 1447 } 1448 1449 void X86_64Assembler::por(XmmRegister dst, XmmRegister src) { 1450 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1451 EmitUint8(0x66); 1452 EmitOptionalRex32(dst, src); 1453 EmitUint8(0x0F); 1454 EmitUint8(0xEB); 1455 EmitXmmRegisterOperand(dst.LowBits(), src); 1456 } 1457 1458 void X86_64Assembler::pavgb(XmmRegister dst, XmmRegister src) { 1459 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1460 EmitUint8(0x66); 1461 EmitOptionalRex32(dst, src); 1462 EmitUint8(0x0F); 1463 EmitUint8(0xE0); 1464 EmitXmmRegisterOperand(dst.LowBits(), src); 1465 } 1466 1467 void X86_64Assembler::pavgw(XmmRegister dst, XmmRegister src) { 1468 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1469 EmitUint8(0x66); 1470 EmitOptionalRex32(dst, src); 1471 EmitUint8(0x0F); 1472 EmitUint8(0xE3); 1473 EmitXmmRegisterOperand(dst.LowBits(), src); 1474 } 1475 1476 void X86_64Assembler::psadbw(XmmRegister dst, XmmRegister src) { 1477 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1478 EmitUint8(0x66); 1479 EmitOptionalRex32(dst, src); 1480 EmitUint8(0x0F); 1481 EmitUint8(0xF6); 1482 EmitXmmRegisterOperand(dst.LowBits(), src); 1483 } 1484 1485 void X86_64Assembler::pmaddwd(XmmRegister dst, XmmRegister src) { 1486 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1487 EmitUint8(0x66); 1488 EmitOptionalRex32(dst, src); 1489 EmitUint8(0x0F); 1490 EmitUint8(0xF5); 1491 EmitXmmRegisterOperand(dst.LowBits(), src); 1492 } 1493 1494 void X86_64Assembler::phaddw(XmmRegister dst, XmmRegister src) { 1495 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1496 EmitUint8(0x66); 1497 EmitOptionalRex32(dst, src); 1498 EmitUint8(0x0F); 1499 EmitUint8(0x38); 1500 EmitUint8(0x01); 1501 EmitXmmRegisterOperand(dst.LowBits(), src); 1502 } 1503 1504 void X86_64Assembler::phaddd(XmmRegister dst, XmmRegister src) { 1505 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1506 EmitUint8(0x66); 1507 EmitOptionalRex32(dst, src); 1508 EmitUint8(0x0F); 1509 EmitUint8(0x38); 1510 EmitUint8(0x02); 1511 EmitXmmRegisterOperand(dst.LowBits(), src); 1512 } 1513 1514 void X86_64Assembler::haddps(XmmRegister dst, XmmRegister src) { 1515 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1516 EmitUint8(0xF2); 1517 EmitOptionalRex32(dst, src); 1518 EmitUint8(0x0F); 1519 EmitUint8(0x7C); 1520 EmitXmmRegisterOperand(dst.LowBits(), src); 1521 } 1522 1523 void X86_64Assembler::haddpd(XmmRegister dst, XmmRegister src) { 1524 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1525 EmitUint8(0x66); 1526 EmitOptionalRex32(dst, src); 1527 EmitUint8(0x0F); 1528 EmitUint8(0x7C); 1529 EmitXmmRegisterOperand(dst.LowBits(), src); 1530 } 1531 1532 void X86_64Assembler::phsubw(XmmRegister dst, XmmRegister src) { 1533 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1534 EmitUint8(0x66); 1535 EmitOptionalRex32(dst, src); 1536 EmitUint8(0x0F); 1537 EmitUint8(0x38); 1538 EmitUint8(0x05); 1539 EmitXmmRegisterOperand(dst.LowBits(), src); 1540 } 1541 1542 void X86_64Assembler::phsubd(XmmRegister dst, XmmRegister src) { 1543 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1544 EmitUint8(0x66); 1545 EmitOptionalRex32(dst, src); 1546 EmitUint8(0x0F); 1547 EmitUint8(0x38); 1548 EmitUint8(0x06); 1549 EmitXmmRegisterOperand(dst.LowBits(), src); 1550 } 1551 1552 void X86_64Assembler::hsubps(XmmRegister dst, XmmRegister src) { 1553 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1554 EmitUint8(0xF2); 1555 EmitOptionalRex32(dst, src); 1556 EmitUint8(0x0F); 1557 EmitUint8(0x7D); 1558 EmitXmmRegisterOperand(dst.LowBits(), src); 1559 } 1560 1561 void X86_64Assembler::hsubpd(XmmRegister dst, XmmRegister src) { 1562 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1563 EmitUint8(0x66); 1564 EmitOptionalRex32(dst, src); 1565 EmitUint8(0x0F); 1566 EmitUint8(0x7D); 1567 EmitXmmRegisterOperand(dst.LowBits(), src); 1568 } 1569 1570 void X86_64Assembler::pminsb(XmmRegister dst, XmmRegister src) { 1571 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1572 EmitUint8(0x66); 1573 EmitOptionalRex32(dst, src); 1574 EmitUint8(0x0F); 1575 EmitUint8(0x38); 1576 EmitUint8(0x38); 1577 EmitXmmRegisterOperand(dst.LowBits(), src); 1578 } 1579 1580 void X86_64Assembler::pmaxsb(XmmRegister dst, XmmRegister src) { 1581 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1582 EmitUint8(0x66); 1583 EmitOptionalRex32(dst, src); 1584 EmitUint8(0x0F); 1585 EmitUint8(0x38); 1586 EmitUint8(0x3C); 1587 EmitXmmRegisterOperand(dst.LowBits(), src); 1588 } 1589 1590 void X86_64Assembler::pminsw(XmmRegister dst, XmmRegister src) { 1591 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1592 EmitUint8(0x66); 1593 EmitOptionalRex32(dst, src); 1594 EmitUint8(0x0F); 1595 EmitUint8(0xEA); 1596 EmitXmmRegisterOperand(dst.LowBits(), src); 1597 } 1598 1599 void X86_64Assembler::pmaxsw(XmmRegister dst, XmmRegister src) { 1600 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1601 EmitUint8(0x66); 1602 EmitOptionalRex32(dst, src); 1603 EmitUint8(0x0F); 1604 EmitUint8(0xEE); 1605 EmitXmmRegisterOperand(dst.LowBits(), src); 1606 } 1607 1608 void X86_64Assembler::pminsd(XmmRegister dst, XmmRegister src) { 1609 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1610 EmitUint8(0x66); 1611 EmitOptionalRex32(dst, src); 1612 EmitUint8(0x0F); 1613 EmitUint8(0x38); 1614 EmitUint8(0x39); 1615 EmitXmmRegisterOperand(dst.LowBits(), src); 1616 } 1617 1618 void X86_64Assembler::pmaxsd(XmmRegister dst, XmmRegister src) { 1619 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1620 EmitUint8(0x66); 1621 EmitOptionalRex32(dst, src); 1622 EmitUint8(0x0F); 1623 EmitUint8(0x38); 1624 EmitUint8(0x3D); 1625 EmitXmmRegisterOperand(dst.LowBits(), src); 1626 } 1627 1628 void X86_64Assembler::pminub(XmmRegister dst, XmmRegister src) { 1629 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1630 EmitUint8(0x66); 1631 EmitOptionalRex32(dst, src); 1632 EmitUint8(0x0F); 1633 EmitUint8(0xDA); 1634 EmitXmmRegisterOperand(dst.LowBits(), src); 1635 } 1636 1637 void X86_64Assembler::pmaxub(XmmRegister dst, XmmRegister src) { 1638 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1639 EmitUint8(0x66); 1640 EmitOptionalRex32(dst, src); 1641 EmitUint8(0x0F); 1642 EmitUint8(0xDE); 1643 EmitXmmRegisterOperand(dst.LowBits(), src); 1644 } 1645 1646 void X86_64Assembler::pminuw(XmmRegister dst, XmmRegister src) { 1647 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1648 EmitUint8(0x66); 1649 EmitOptionalRex32(dst, src); 1650 EmitUint8(0x0F); 1651 EmitUint8(0x38); 1652 EmitUint8(0x3A); 1653 EmitXmmRegisterOperand(dst.LowBits(), src); 1654 } 1655 1656 void X86_64Assembler::pmaxuw(XmmRegister dst, XmmRegister src) { 1657 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1658 EmitUint8(0x66); 1659 EmitOptionalRex32(dst, src); 1660 EmitUint8(0x0F); 1661 EmitUint8(0x38); 1662 EmitUint8(0x3E); 1663 EmitXmmRegisterOperand(dst.LowBits(), src); 1664 } 1665 1666 void X86_64Assembler::pminud(XmmRegister dst, XmmRegister src) { 1667 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1668 EmitUint8(0x66); 1669 EmitOptionalRex32(dst, src); 1670 EmitUint8(0x0F); 1671 EmitUint8(0x38); 1672 EmitUint8(0x3B); 1673 EmitXmmRegisterOperand(dst.LowBits(), src); 1674 } 1675 1676 void X86_64Assembler::pmaxud(XmmRegister dst, XmmRegister src) { 1677 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1678 EmitUint8(0x66); 1679 EmitOptionalRex32(dst, src); 1680 EmitUint8(0x0F); 1681 EmitUint8(0x38); 1682 EmitUint8(0x3F); 1683 EmitXmmRegisterOperand(dst.LowBits(), src); 1684 } 1685 1686 void X86_64Assembler::minps(XmmRegister dst, XmmRegister src) { 1687 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1688 EmitOptionalRex32(dst, src); 1689 EmitUint8(0x0F); 1690 EmitUint8(0x5D); 1691 EmitXmmRegisterOperand(dst.LowBits(), src); 1692 } 1693 1694 void X86_64Assembler::maxps(XmmRegister dst, XmmRegister src) { 1695 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1696 EmitOptionalRex32(dst, src); 1697 EmitUint8(0x0F); 1698 EmitUint8(0x5F); 1699 EmitXmmRegisterOperand(dst.LowBits(), src); 1700 } 1701 1702 void X86_64Assembler::minpd(XmmRegister dst, XmmRegister src) { 1703 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1704 EmitUint8(0x66); 1705 EmitOptionalRex32(dst, src); 1706 EmitUint8(0x0F); 1707 EmitUint8(0x5D); 1708 EmitXmmRegisterOperand(dst.LowBits(), src); 1709 } 1710 1711 void X86_64Assembler::maxpd(XmmRegister dst, XmmRegister src) { 1712 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1713 EmitUint8(0x66); 1714 EmitOptionalRex32(dst, src); 1715 EmitUint8(0x0F); 1716 EmitUint8(0x5F); 1717 EmitXmmRegisterOperand(dst.LowBits(), src); 1718 } 1719 1720 void X86_64Assembler::pcmpeqb(XmmRegister dst, XmmRegister src) { 1721 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1722 EmitUint8(0x66); 1723 EmitOptionalRex32(dst, src); 1724 EmitUint8(0x0F); 1725 EmitUint8(0x74); 1726 EmitXmmRegisterOperand(dst.LowBits(), src); 1727 } 1728 1729 void X86_64Assembler::pcmpeqw(XmmRegister dst, XmmRegister src) { 1730 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1731 EmitUint8(0x66); 1732 EmitOptionalRex32(dst, src); 1733 EmitUint8(0x0F); 1734 EmitUint8(0x75); 1735 EmitXmmRegisterOperand(dst.LowBits(), src); 1736 } 1737 1738 void X86_64Assembler::pcmpeqd(XmmRegister dst, XmmRegister src) { 1739 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1740 EmitUint8(0x66); 1741 EmitOptionalRex32(dst, src); 1742 EmitUint8(0x0F); 1743 EmitUint8(0x76); 1744 EmitXmmRegisterOperand(dst.LowBits(), src); 1745 } 1746 1747 void X86_64Assembler::pcmpeqq(XmmRegister dst, XmmRegister src) { 1748 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1749 EmitUint8(0x66); 1750 EmitOptionalRex32(dst, src); 1751 EmitUint8(0x0F); 1752 EmitUint8(0x38); 1753 EmitUint8(0x29); 1754 EmitXmmRegisterOperand(dst.LowBits(), src); 1755 } 1756 1757 void X86_64Assembler::pcmpgtb(XmmRegister dst, XmmRegister src) { 1758 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1759 EmitUint8(0x66); 1760 EmitOptionalRex32(dst, src); 1761 EmitUint8(0x0F); 1762 EmitUint8(0x64); 1763 EmitXmmRegisterOperand(dst.LowBits(), src); 1764 } 1765 1766 void X86_64Assembler::pcmpgtw(XmmRegister dst, XmmRegister src) { 1767 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1768 EmitUint8(0x66); 1769 EmitOptionalRex32(dst, src); 1770 EmitUint8(0x0F); 1771 EmitUint8(0x65); 1772 EmitXmmRegisterOperand(dst.LowBits(), src); 1773 } 1774 1775 void X86_64Assembler::pcmpgtd(XmmRegister dst, XmmRegister src) { 1776 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1777 EmitUint8(0x66); 1778 EmitOptionalRex32(dst, src); 1779 EmitUint8(0x0F); 1780 EmitUint8(0x66); 1781 EmitXmmRegisterOperand(dst.LowBits(), src); 1782 } 1783 1784 void X86_64Assembler::pcmpgtq(XmmRegister dst, XmmRegister src) { 1785 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1786 EmitUint8(0x66); 1787 EmitOptionalRex32(dst, src); 1788 EmitUint8(0x0F); 1789 EmitUint8(0x38); 1790 EmitUint8(0x37); 1791 EmitXmmRegisterOperand(dst.LowBits(), src); 1792 } 1793 1794 void X86_64Assembler::shufpd(XmmRegister dst, XmmRegister src, const Immediate& imm) { 1795 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1796 EmitUint8(0x66); 1797 EmitOptionalRex32(dst, src); 1798 EmitUint8(0x0F); 1799 EmitUint8(0xC6); 1800 EmitXmmRegisterOperand(dst.LowBits(), src); 1801 EmitUint8(imm.value()); 1802 } 1803 1804 1805 void X86_64Assembler::shufps(XmmRegister dst, XmmRegister src, const Immediate& imm) { 1806 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1807 EmitOptionalRex32(dst, src); 1808 EmitUint8(0x0F); 1809 EmitUint8(0xC6); 1810 EmitXmmRegisterOperand(dst.LowBits(), src); 1811 EmitUint8(imm.value()); 1812 } 1813 1814 1815 void X86_64Assembler::pshufd(XmmRegister dst, XmmRegister src, const Immediate& imm) { 1816 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1817 EmitUint8(0x66); 1818 EmitOptionalRex32(dst, src); 1819 EmitUint8(0x0F); 1820 EmitUint8(0x70); 1821 EmitXmmRegisterOperand(dst.LowBits(), src); 1822 EmitUint8(imm.value()); 1823 } 1824 1825 1826 void X86_64Assembler::punpcklbw(XmmRegister dst, XmmRegister src) { 1827 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1828 EmitUint8(0x66); 1829 EmitOptionalRex32(dst, src); 1830 EmitUint8(0x0F); 1831 EmitUint8(0x60); 1832 EmitXmmRegisterOperand(dst.LowBits(), src); 1833 } 1834 1835 1836 void X86_64Assembler::punpcklwd(XmmRegister dst, XmmRegister src) { 1837 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1838 EmitUint8(0x66); 1839 EmitOptionalRex32(dst, src); 1840 EmitUint8(0x0F); 1841 EmitUint8(0x61); 1842 EmitXmmRegisterOperand(dst.LowBits(), src); 1843 } 1844 1845 1846 void X86_64Assembler::punpckldq(XmmRegister dst, XmmRegister src) { 1847 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1848 EmitUint8(0x66); 1849 EmitOptionalRex32(dst, src); 1850 EmitUint8(0x0F); 1851 EmitUint8(0x62); 1852 EmitXmmRegisterOperand(dst.LowBits(), src); 1853 } 1854 1855 1856 void X86_64Assembler::punpcklqdq(XmmRegister dst, XmmRegister src) { 1857 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1858 EmitUint8(0x66); 1859 EmitOptionalRex32(dst, src); 1860 EmitUint8(0x0F); 1861 EmitUint8(0x6C); 1862 EmitXmmRegisterOperand(dst.LowBits(), src); 1863 } 1864 1865 1866 void X86_64Assembler::punpckhbw(XmmRegister dst, XmmRegister src) { 1867 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1868 EmitUint8(0x66); 1869 EmitOptionalRex32(dst, src); 1870 EmitUint8(0x0F); 1871 EmitUint8(0x68); 1872 EmitXmmRegisterOperand(dst.LowBits(), src); 1873 } 1874 1875 1876 void X86_64Assembler::punpckhwd(XmmRegister dst, XmmRegister src) { 1877 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1878 EmitUint8(0x66); 1879 EmitOptionalRex32(dst, src); 1880 EmitUint8(0x0F); 1881 EmitUint8(0x69); 1882 EmitXmmRegisterOperand(dst.LowBits(), src); 1883 } 1884 1885 1886 void X86_64Assembler::punpckhdq(XmmRegister dst, XmmRegister src) { 1887 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1888 EmitUint8(0x66); 1889 EmitOptionalRex32(dst, src); 1890 EmitUint8(0x0F); 1891 EmitUint8(0x6A); 1892 EmitXmmRegisterOperand(dst.LowBits(), src); 1893 } 1894 1895 1896 void X86_64Assembler::punpckhqdq(XmmRegister dst, XmmRegister src) { 1897 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1898 EmitUint8(0x66); 1899 EmitOptionalRex32(dst, src); 1900 EmitUint8(0x0F); 1901 EmitUint8(0x6D); 1902 EmitXmmRegisterOperand(dst.LowBits(), src); 1903 } 1904 1905 1906 void X86_64Assembler::psllw(XmmRegister reg, const Immediate& shift_count) { 1907 DCHECK(shift_count.is_uint8()); 1908 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1909 EmitUint8(0x66); 1910 EmitOptionalRex(false, false, false, false, reg.NeedsRex()); 1911 EmitUint8(0x0F); 1912 EmitUint8(0x71); 1913 EmitXmmRegisterOperand(6, reg); 1914 EmitUint8(shift_count.value()); 1915 } 1916 1917 1918 void X86_64Assembler::pslld(XmmRegister reg, const Immediate& shift_count) { 1919 DCHECK(shift_count.is_uint8()); 1920 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1921 EmitUint8(0x66); 1922 EmitOptionalRex(false, false, false, false, reg.NeedsRex()); 1923 EmitUint8(0x0F); 1924 EmitUint8(0x72); 1925 EmitXmmRegisterOperand(6, reg); 1926 EmitUint8(shift_count.value()); 1927 } 1928 1929 1930 void X86_64Assembler::psllq(XmmRegister reg, const Immediate& shift_count) { 1931 DCHECK(shift_count.is_uint8()); 1932 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1933 EmitUint8(0x66); 1934 EmitOptionalRex(false, false, false, false, reg.NeedsRex()); 1935 EmitUint8(0x0F); 1936 EmitUint8(0x73); 1937 EmitXmmRegisterOperand(6, reg); 1938 EmitUint8(shift_count.value()); 1939 } 1940 1941 1942 void X86_64Assembler::psraw(XmmRegister reg, const Immediate& shift_count) { 1943 DCHECK(shift_count.is_uint8()); 1944 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1945 EmitUint8(0x66); 1946 EmitOptionalRex(false, false, false, false, reg.NeedsRex()); 1947 EmitUint8(0x0F); 1948 EmitUint8(0x71); 1949 EmitXmmRegisterOperand(4, reg); 1950 EmitUint8(shift_count.value()); 1951 } 1952 1953 1954 void X86_64Assembler::psrad(XmmRegister reg, const Immediate& shift_count) { 1955 DCHECK(shift_count.is_uint8()); 1956 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1957 EmitUint8(0x66); 1958 EmitOptionalRex(false, false, false, false, reg.NeedsRex()); 1959 EmitUint8(0x0F); 1960 EmitUint8(0x72); 1961 EmitXmmRegisterOperand(4, reg); 1962 EmitUint8(shift_count.value()); 1963 } 1964 1965 1966 void X86_64Assembler::psrlw(XmmRegister reg, const Immediate& shift_count) { 1967 DCHECK(shift_count.is_uint8()); 1968 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1969 EmitUint8(0x66); 1970 EmitOptionalRex(false, false, false, false, reg.NeedsRex()); 1971 EmitUint8(0x0F); 1972 EmitUint8(0x71); 1973 EmitXmmRegisterOperand(2, reg); 1974 EmitUint8(shift_count.value()); 1975 } 1976 1977 1978 void X86_64Assembler::psrld(XmmRegister reg, const Immediate& shift_count) { 1979 DCHECK(shift_count.is_uint8()); 1980 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1981 EmitUint8(0x66); 1982 EmitOptionalRex(false, false, false, false, reg.NeedsRex()); 1983 EmitUint8(0x0F); 1984 EmitUint8(0x72); 1985 EmitXmmRegisterOperand(2, reg); 1986 EmitUint8(shift_count.value()); 1987 } 1988 1989 1990 void X86_64Assembler::psrlq(XmmRegister reg, const Immediate& shift_count) { 1991 DCHECK(shift_count.is_uint8()); 1992 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 1993 EmitUint8(0x66); 1994 EmitOptionalRex(false, false, false, false, reg.NeedsRex()); 1995 EmitUint8(0x0F); 1996 EmitUint8(0x73); 1997 EmitXmmRegisterOperand(2, reg); 1998 EmitUint8(shift_count.value()); 1999 } 2000 2001 2002 void X86_64Assembler::psrldq(XmmRegister reg, const Immediate& shift_count) { 2003 DCHECK(shift_count.is_uint8()); 2004 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2005 EmitUint8(0x66); 2006 EmitOptionalRex(false, false, false, false, reg.NeedsRex()); 2007 EmitUint8(0x0F); 2008 EmitUint8(0x73); 2009 EmitXmmRegisterOperand(3, reg); 2010 EmitUint8(shift_count.value()); 2011 } 2012 2013 2014 void X86_64Assembler::fldl(const Address& src) { 2015 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2016 EmitUint8(0xDD); 2017 EmitOperand(0, src); 2018 } 2019 2020 2021 void X86_64Assembler::fstl(const Address& dst) { 2022 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2023 EmitUint8(0xDD); 2024 EmitOperand(2, dst); 2025 } 2026 2027 2028 void X86_64Assembler::fstpl(const Address& dst) { 2029 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2030 EmitUint8(0xDD); 2031 EmitOperand(3, dst); 2032 } 2033 2034 2035 void X86_64Assembler::fstsw() { 2036 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2037 EmitUint8(0x9B); 2038 EmitUint8(0xDF); 2039 EmitUint8(0xE0); 2040 } 2041 2042 2043 void X86_64Assembler::fnstcw(const Address& dst) { 2044 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2045 EmitUint8(0xD9); 2046 EmitOperand(7, dst); 2047 } 2048 2049 2050 void X86_64Assembler::fldcw(const Address& src) { 2051 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2052 EmitUint8(0xD9); 2053 EmitOperand(5, src); 2054 } 2055 2056 2057 void X86_64Assembler::fistpl(const Address& dst) { 2058 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2059 EmitUint8(0xDF); 2060 EmitOperand(7, dst); 2061 } 2062 2063 2064 void X86_64Assembler::fistps(const Address& dst) { 2065 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2066 EmitUint8(0xDB); 2067 EmitOperand(3, dst); 2068 } 2069 2070 2071 void X86_64Assembler::fildl(const Address& src) { 2072 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2073 EmitUint8(0xDF); 2074 EmitOperand(5, src); 2075 } 2076 2077 2078 void X86_64Assembler::filds(const Address& src) { 2079 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2080 EmitUint8(0xDB); 2081 EmitOperand(0, src); 2082 } 2083 2084 2085 void X86_64Assembler::fincstp() { 2086 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2087 EmitUint8(0xD9); 2088 EmitUint8(0xF7); 2089 } 2090 2091 2092 void X86_64Assembler::ffree(const Immediate& index) { 2093 CHECK_LT(index.value(), 7); 2094 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2095 EmitUint8(0xDD); 2096 EmitUint8(0xC0 + index.value()); 2097 } 2098 2099 2100 void X86_64Assembler::fsin() { 2101 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2102 EmitUint8(0xD9); 2103 EmitUint8(0xFE); 2104 } 2105 2106 2107 void X86_64Assembler::fcos() { 2108 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2109 EmitUint8(0xD9); 2110 EmitUint8(0xFF); 2111 } 2112 2113 2114 void X86_64Assembler::fptan() { 2115 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2116 EmitUint8(0xD9); 2117 EmitUint8(0xF2); 2118 } 2119 2120 void X86_64Assembler::fucompp() { 2121 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2122 EmitUint8(0xDA); 2123 EmitUint8(0xE9); 2124 } 2125 2126 2127 void X86_64Assembler::fprem() { 2128 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2129 EmitUint8(0xD9); 2130 EmitUint8(0xF8); 2131 } 2132 2133 2134 void X86_64Assembler::xchgl(CpuRegister dst, CpuRegister src) { 2135 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2136 // There is a short version for rax. 2137 // It's a bit awkward, as CpuRegister has a const field, so assignment and thus swapping doesn't 2138 // work. 2139 const bool src_rax = src.AsRegister() == RAX; 2140 const bool dst_rax = dst.AsRegister() == RAX; 2141 if (src_rax || dst_rax) { 2142 EmitOptionalRex32(src_rax ? dst : src); 2143 EmitUint8(0x90 + (src_rax ? dst.LowBits() : src.LowBits())); 2144 return; 2145 } 2146 2147 // General case. 2148 EmitOptionalRex32(src, dst); 2149 EmitUint8(0x87); 2150 EmitRegisterOperand(src.LowBits(), dst.LowBits()); 2151 } 2152 2153 2154 void X86_64Assembler::xchgq(CpuRegister dst, CpuRegister src) { 2155 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2156 // There is a short version for rax. 2157 // It's a bit awkward, as CpuRegister has a const field, so assignment and thus swapping doesn't 2158 // work. 2159 const bool src_rax = src.AsRegister() == RAX; 2160 const bool dst_rax = dst.AsRegister() == RAX; 2161 if (src_rax || dst_rax) { 2162 // If src == target, emit a nop instead. 2163 if (src_rax && dst_rax) { 2164 EmitUint8(0x90); 2165 } else { 2166 EmitRex64(src_rax ? dst : src); 2167 EmitUint8(0x90 + (src_rax ? dst.LowBits() : src.LowBits())); 2168 } 2169 return; 2170 } 2171 2172 // General case. 2173 EmitRex64(src, dst); 2174 EmitUint8(0x87); 2175 EmitRegisterOperand(src.LowBits(), dst.LowBits()); 2176 } 2177 2178 2179 void X86_64Assembler::xchgl(CpuRegister reg, const Address& address) { 2180 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2181 EmitOptionalRex32(reg, address); 2182 EmitUint8(0x87); 2183 EmitOperand(reg.LowBits(), address); 2184 } 2185 2186 2187 void X86_64Assembler::cmpb(const Address& address, const Immediate& imm) { 2188 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2189 CHECK(imm.is_int32()); 2190 EmitOptionalRex32(address); 2191 EmitUint8(0x80); 2192 EmitOperand(7, address); 2193 EmitUint8(imm.value() & 0xFF); 2194 } 2195 2196 2197 void X86_64Assembler::cmpw(const Address& address, const Immediate& imm) { 2198 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2199 CHECK(imm.is_int32()); 2200 EmitOperandSizeOverride(); 2201 EmitOptionalRex32(address); 2202 EmitComplex(7, address, imm, /* is_16_op */ true); 2203 } 2204 2205 2206 void X86_64Assembler::cmpl(CpuRegister reg, const Immediate& imm) { 2207 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2208 CHECK(imm.is_int32()); 2209 EmitOptionalRex32(reg); 2210 EmitComplex(7, Operand(reg), imm); 2211 } 2212 2213 2214 void X86_64Assembler::cmpl(CpuRegister reg0, CpuRegister reg1) { 2215 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2216 EmitOptionalRex32(reg0, reg1); 2217 EmitUint8(0x3B); 2218 EmitOperand(reg0.LowBits(), Operand(reg1)); 2219 } 2220 2221 2222 void X86_64Assembler::cmpl(CpuRegister reg, const Address& address) { 2223 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2224 EmitOptionalRex32(reg, address); 2225 EmitUint8(0x3B); 2226 EmitOperand(reg.LowBits(), address); 2227 } 2228 2229 2230 void X86_64Assembler::cmpl(const Address& address, CpuRegister reg) { 2231 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2232 EmitOptionalRex32(reg, address); 2233 EmitUint8(0x39); 2234 EmitOperand(reg.LowBits(), address); 2235 } 2236 2237 2238 void X86_64Assembler::cmpl(const Address& address, const Immediate& imm) { 2239 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2240 CHECK(imm.is_int32()); 2241 EmitOptionalRex32(address); 2242 EmitComplex(7, address, imm); 2243 } 2244 2245 2246 void X86_64Assembler::cmpq(CpuRegister reg0, CpuRegister reg1) { 2247 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2248 EmitRex64(reg0, reg1); 2249 EmitUint8(0x3B); 2250 EmitOperand(reg0.LowBits(), Operand(reg1)); 2251 } 2252 2253 2254 void X86_64Assembler::cmpq(CpuRegister reg, const Immediate& imm) { 2255 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2256 CHECK(imm.is_int32()); // cmpq only supports 32b immediate. 2257 EmitRex64(reg); 2258 EmitComplex(7, Operand(reg), imm); 2259 } 2260 2261 2262 void X86_64Assembler::cmpq(CpuRegister reg, const Address& address) { 2263 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2264 EmitRex64(reg, address); 2265 EmitUint8(0x3B); 2266 EmitOperand(reg.LowBits(), address); 2267 } 2268 2269 2270 void X86_64Assembler::cmpq(const Address& address, const Immediate& imm) { 2271 CHECK(imm.is_int32()); // cmpq only supports 32b immediate. 2272 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2273 EmitRex64(address); 2274 EmitComplex(7, address, imm); 2275 } 2276 2277 2278 void X86_64Assembler::addl(CpuRegister dst, CpuRegister src) { 2279 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2280 EmitOptionalRex32(dst, src); 2281 EmitUint8(0x03); 2282 EmitRegisterOperand(dst.LowBits(), src.LowBits()); 2283 } 2284 2285 2286 void X86_64Assembler::addl(CpuRegister reg, const Address& address) { 2287 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2288 EmitOptionalRex32(reg, address); 2289 EmitUint8(0x03); 2290 EmitOperand(reg.LowBits(), address); 2291 } 2292 2293 2294 void X86_64Assembler::testl(CpuRegister reg1, CpuRegister reg2) { 2295 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2296 EmitOptionalRex32(reg1, reg2); 2297 EmitUint8(0x85); 2298 EmitRegisterOperand(reg1.LowBits(), reg2.LowBits()); 2299 } 2300 2301 2302 void X86_64Assembler::testl(CpuRegister reg, const Address& address) { 2303 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2304 EmitOptionalRex32(reg, address); 2305 EmitUint8(0x85); 2306 EmitOperand(reg.LowBits(), address); 2307 } 2308 2309 2310 void X86_64Assembler::testl(CpuRegister reg, const Immediate& immediate) { 2311 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2312 // For registers that have a byte variant (RAX, RBX, RCX, and RDX) 2313 // we only test the byte CpuRegister to keep the encoding short. 2314 if (immediate.is_uint8() && reg.AsRegister() < 4) { 2315 // Use zero-extended 8-bit immediate. 2316 if (reg.AsRegister() == RAX) { 2317 EmitUint8(0xA8); 2318 } else { 2319 EmitUint8(0xF6); 2320 EmitUint8(0xC0 + reg.AsRegister()); 2321 } 2322 EmitUint8(immediate.value() & 0xFF); 2323 } else if (reg.AsRegister() == RAX) { 2324 // Use short form if the destination is RAX. 2325 EmitUint8(0xA9); 2326 EmitImmediate(immediate); 2327 } else { 2328 EmitOptionalRex32(reg); 2329 EmitUint8(0xF7); 2330 EmitOperand(0, Operand(reg)); 2331 EmitImmediate(immediate); 2332 } 2333 } 2334 2335 2336 void X86_64Assembler::testq(CpuRegister reg1, CpuRegister reg2) { 2337 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2338 EmitRex64(reg1, reg2); 2339 EmitUint8(0x85); 2340 EmitRegisterOperand(reg1.LowBits(), reg2.LowBits()); 2341 } 2342 2343 2344 void X86_64Assembler::testq(CpuRegister reg, const Address& address) { 2345 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2346 EmitRex64(reg, address); 2347 EmitUint8(0x85); 2348 EmitOperand(reg.LowBits(), address); 2349 } 2350 2351 2352 void X86_64Assembler::testb(const Address& dst, const Immediate& imm) { 2353 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2354 EmitOptionalRex32(dst); 2355 EmitUint8(0xF6); 2356 EmitOperand(Register::RAX, dst); 2357 CHECK(imm.is_int8()); 2358 EmitUint8(imm.value() & 0xFF); 2359 } 2360 2361 2362 void X86_64Assembler::testl(const Address& dst, const Immediate& imm) { 2363 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2364 EmitOptionalRex32(dst); 2365 EmitUint8(0xF7); 2366 EmitOperand(0, dst); 2367 EmitImmediate(imm); 2368 } 2369 2370 2371 void X86_64Assembler::andl(CpuRegister dst, CpuRegister src) { 2372 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2373 EmitOptionalRex32(dst, src); 2374 EmitUint8(0x23); 2375 EmitOperand(dst.LowBits(), Operand(src)); 2376 } 2377 2378 2379 void X86_64Assembler::andl(CpuRegister reg, const Address& address) { 2380 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2381 EmitOptionalRex32(reg, address); 2382 EmitUint8(0x23); 2383 EmitOperand(reg.LowBits(), address); 2384 } 2385 2386 2387 void X86_64Assembler::andl(CpuRegister dst, const Immediate& imm) { 2388 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2389 EmitOptionalRex32(dst); 2390 EmitComplex(4, Operand(dst), imm); 2391 } 2392 2393 2394 void X86_64Assembler::andq(CpuRegister reg, const Immediate& imm) { 2395 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2396 CHECK(imm.is_int32()); // andq only supports 32b immediate. 2397 EmitRex64(reg); 2398 EmitComplex(4, Operand(reg), imm); 2399 } 2400 2401 2402 void X86_64Assembler::andq(CpuRegister dst, CpuRegister src) { 2403 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2404 EmitRex64(dst, src); 2405 EmitUint8(0x23); 2406 EmitOperand(dst.LowBits(), Operand(src)); 2407 } 2408 2409 2410 void X86_64Assembler::andq(CpuRegister dst, const Address& src) { 2411 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2412 EmitRex64(dst, src); 2413 EmitUint8(0x23); 2414 EmitOperand(dst.LowBits(), src); 2415 } 2416 2417 2418 void X86_64Assembler::orl(CpuRegister dst, CpuRegister src) { 2419 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2420 EmitOptionalRex32(dst, src); 2421 EmitUint8(0x0B); 2422 EmitOperand(dst.LowBits(), Operand(src)); 2423 } 2424 2425 2426 void X86_64Assembler::orl(CpuRegister reg, const Address& address) { 2427 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2428 EmitOptionalRex32(reg, address); 2429 EmitUint8(0x0B); 2430 EmitOperand(reg.LowBits(), address); 2431 } 2432 2433 2434 void X86_64Assembler::orl(CpuRegister dst, const Immediate& imm) { 2435 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2436 EmitOptionalRex32(dst); 2437 EmitComplex(1, Operand(dst), imm); 2438 } 2439 2440 2441 void X86_64Assembler::orq(CpuRegister dst, const Immediate& imm) { 2442 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2443 CHECK(imm.is_int32()); // orq only supports 32b immediate. 2444 EmitRex64(dst); 2445 EmitComplex(1, Operand(dst), imm); 2446 } 2447 2448 2449 void X86_64Assembler::orq(CpuRegister dst, CpuRegister src) { 2450 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2451 EmitRex64(dst, src); 2452 EmitUint8(0x0B); 2453 EmitOperand(dst.LowBits(), Operand(src)); 2454 } 2455 2456 2457 void X86_64Assembler::orq(CpuRegister dst, const Address& src) { 2458 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2459 EmitRex64(dst, src); 2460 EmitUint8(0x0B); 2461 EmitOperand(dst.LowBits(), src); 2462 } 2463 2464 2465 void X86_64Assembler::xorl(CpuRegister dst, CpuRegister src) { 2466 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2467 EmitOptionalRex32(dst, src); 2468 EmitUint8(0x33); 2469 EmitOperand(dst.LowBits(), Operand(src)); 2470 } 2471 2472 2473 void X86_64Assembler::xorl(CpuRegister reg, const Address& address) { 2474 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2475 EmitOptionalRex32(reg, address); 2476 EmitUint8(0x33); 2477 EmitOperand(reg.LowBits(), address); 2478 } 2479 2480 2481 void X86_64Assembler::xorl(CpuRegister dst, const Immediate& imm) { 2482 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2483 EmitOptionalRex32(dst); 2484 EmitComplex(6, Operand(dst), imm); 2485 } 2486 2487 2488 void X86_64Assembler::xorq(CpuRegister dst, CpuRegister src) { 2489 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2490 EmitRex64(dst, src); 2491 EmitUint8(0x33); 2492 EmitOperand(dst.LowBits(), Operand(src)); 2493 } 2494 2495 2496 void X86_64Assembler::xorq(CpuRegister dst, const Immediate& imm) { 2497 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2498 CHECK(imm.is_int32()); // xorq only supports 32b immediate. 2499 EmitRex64(dst); 2500 EmitComplex(6, Operand(dst), imm); 2501 } 2502 2503 void X86_64Assembler::xorq(CpuRegister dst, const Address& src) { 2504 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2505 EmitRex64(dst, src); 2506 EmitUint8(0x33); 2507 EmitOperand(dst.LowBits(), src); 2508 } 2509 2510 2511 #if 0 2512 void X86_64Assembler::rex(bool force, bool w, Register* r, Register* x, Register* b) { 2513 // REX.WRXB 2514 // W - 64-bit operand 2515 // R - MODRM.reg 2516 // X - SIB.index 2517 // B - MODRM.rm/SIB.base 2518 uint8_t rex = force ? 0x40 : 0; 2519 if (w) { 2520 rex |= 0x48; // REX.W000 2521 } 2522 if (r != nullptr && *r >= Register::R8 && *r < Register::kNumberOfCpuRegisters) { 2523 rex |= 0x44; // REX.0R00 2524 *r = static_cast<Register>(*r - 8); 2525 } 2526 if (x != nullptr && *x >= Register::R8 && *x < Register::kNumberOfCpuRegisters) { 2527 rex |= 0x42; // REX.00X0 2528 *x = static_cast<Register>(*x - 8); 2529 } 2530 if (b != nullptr && *b >= Register::R8 && *b < Register::kNumberOfCpuRegisters) { 2531 rex |= 0x41; // REX.000B 2532 *b = static_cast<Register>(*b - 8); 2533 } 2534 if (rex != 0) { 2535 EmitUint8(rex); 2536 } 2537 } 2538 2539 void X86_64Assembler::rex_reg_mem(bool force, bool w, Register* dst, const Address& mem) { 2540 // REX.WRXB 2541 // W - 64-bit operand 2542 // R - MODRM.reg 2543 // X - SIB.index 2544 // B - MODRM.rm/SIB.base 2545 uint8_t rex = mem->rex(); 2546 if (force) { 2547 rex |= 0x40; // REX.0000 2548 } 2549 if (w) { 2550 rex |= 0x48; // REX.W000 2551 } 2552 if (dst != nullptr && *dst >= Register::R8 && *dst < Register::kNumberOfCpuRegisters) { 2553 rex |= 0x44; // REX.0R00 2554 *dst = static_cast<Register>(*dst - 8); 2555 } 2556 if (rex != 0) { 2557 EmitUint8(rex); 2558 } 2559 } 2560 2561 void rex_mem_reg(bool force, bool w, Address* mem, Register* src); 2562 #endif 2563 2564 void X86_64Assembler::addl(CpuRegister reg, const Immediate& imm) { 2565 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2566 EmitOptionalRex32(reg); 2567 EmitComplex(0, Operand(reg), imm); 2568 } 2569 2570 2571 void X86_64Assembler::addq(CpuRegister reg, const Immediate& imm) { 2572 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2573 CHECK(imm.is_int32()); // addq only supports 32b immediate. 2574 EmitRex64(reg); 2575 EmitComplex(0, Operand(reg), imm); 2576 } 2577 2578 2579 void X86_64Assembler::addq(CpuRegister dst, const Address& address) { 2580 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2581 EmitRex64(dst, address); 2582 EmitUint8(0x03); 2583 EmitOperand(dst.LowBits(), address); 2584 } 2585 2586 2587 void X86_64Assembler::addq(CpuRegister dst, CpuRegister src) { 2588 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2589 // 0x01 is addq r/m64 <- r/m64 + r64, with op1 in r/m and op2 in reg: so reverse EmitRex64 2590 EmitRex64(src, dst); 2591 EmitUint8(0x01); 2592 EmitRegisterOperand(src.LowBits(), dst.LowBits()); 2593 } 2594 2595 2596 void X86_64Assembler::addl(const Address& address, CpuRegister reg) { 2597 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2598 EmitOptionalRex32(reg, address); 2599 EmitUint8(0x01); 2600 EmitOperand(reg.LowBits(), address); 2601 } 2602 2603 2604 void X86_64Assembler::addl(const Address& address, const Immediate& imm) { 2605 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2606 EmitOptionalRex32(address); 2607 EmitComplex(0, address, imm); 2608 } 2609 2610 2611 void X86_64Assembler::addw(const Address& address, const Immediate& imm) { 2612 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2613 CHECK(imm.is_uint16() || imm.is_int16()) << imm.value(); 2614 EmitUint8(0x66); 2615 EmitOptionalRex32(address); 2616 EmitComplex(0, address, imm, /* is_16_op */ true); 2617 } 2618 2619 2620 void X86_64Assembler::subl(CpuRegister dst, CpuRegister src) { 2621 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2622 EmitOptionalRex32(dst, src); 2623 EmitUint8(0x2B); 2624 EmitOperand(dst.LowBits(), Operand(src)); 2625 } 2626 2627 2628 void X86_64Assembler::subl(CpuRegister reg, const Immediate& imm) { 2629 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2630 EmitOptionalRex32(reg); 2631 EmitComplex(5, Operand(reg), imm); 2632 } 2633 2634 2635 void X86_64Assembler::subq(CpuRegister reg, const Immediate& imm) { 2636 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2637 CHECK(imm.is_int32()); // subq only supports 32b immediate. 2638 EmitRex64(reg); 2639 EmitComplex(5, Operand(reg), imm); 2640 } 2641 2642 2643 void X86_64Assembler::subq(CpuRegister dst, CpuRegister src) { 2644 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2645 EmitRex64(dst, src); 2646 EmitUint8(0x2B); 2647 EmitRegisterOperand(dst.LowBits(), src.LowBits()); 2648 } 2649 2650 2651 void X86_64Assembler::subq(CpuRegister reg, const Address& address) { 2652 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2653 EmitRex64(reg, address); 2654 EmitUint8(0x2B); 2655 EmitOperand(reg.LowBits() & 7, address); 2656 } 2657 2658 2659 void X86_64Assembler::subl(CpuRegister reg, const Address& address) { 2660 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2661 EmitOptionalRex32(reg, address); 2662 EmitUint8(0x2B); 2663 EmitOperand(reg.LowBits(), address); 2664 } 2665 2666 2667 void X86_64Assembler::cdq() { 2668 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2669 EmitUint8(0x99); 2670 } 2671 2672 2673 void X86_64Assembler::cqo() { 2674 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2675 EmitRex64(); 2676 EmitUint8(0x99); 2677 } 2678 2679 2680 void X86_64Assembler::idivl(CpuRegister reg) { 2681 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2682 EmitOptionalRex32(reg); 2683 EmitUint8(0xF7); 2684 EmitUint8(0xF8 | reg.LowBits()); 2685 } 2686 2687 2688 void X86_64Assembler::idivq(CpuRegister reg) { 2689 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2690 EmitRex64(reg); 2691 EmitUint8(0xF7); 2692 EmitUint8(0xF8 | reg.LowBits()); 2693 } 2694 2695 2696 void X86_64Assembler::imull(CpuRegister dst, CpuRegister src) { 2697 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2698 EmitOptionalRex32(dst, src); 2699 EmitUint8(0x0F); 2700 EmitUint8(0xAF); 2701 EmitOperand(dst.LowBits(), Operand(src)); 2702 } 2703 2704 void X86_64Assembler::imull(CpuRegister dst, CpuRegister src, const Immediate& imm) { 2705 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2706 CHECK(imm.is_int32()); // imull only supports 32b immediate. 2707 2708 EmitOptionalRex32(dst, src); 2709 2710 // See whether imm can be represented as a sign-extended 8bit value. 2711 int32_t v32 = static_cast<int32_t>(imm.value()); 2712 if (IsInt<8>(v32)) { 2713 // Sign-extension works. 2714 EmitUint8(0x6B); 2715 EmitOperand(dst.LowBits(), Operand(src)); 2716 EmitUint8(static_cast<uint8_t>(v32 & 0xFF)); 2717 } else { 2718 // Not representable, use full immediate. 2719 EmitUint8(0x69); 2720 EmitOperand(dst.LowBits(), Operand(src)); 2721 EmitImmediate(imm); 2722 } 2723 } 2724 2725 2726 void X86_64Assembler::imull(CpuRegister reg, const Immediate& imm) { 2727 imull(reg, reg, imm); 2728 } 2729 2730 2731 void X86_64Assembler::imull(CpuRegister reg, const Address& address) { 2732 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2733 EmitOptionalRex32(reg, address); 2734 EmitUint8(0x0F); 2735 EmitUint8(0xAF); 2736 EmitOperand(reg.LowBits(), address); 2737 } 2738 2739 2740 void X86_64Assembler::imulq(CpuRegister dst, CpuRegister src) { 2741 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2742 EmitRex64(dst, src); 2743 EmitUint8(0x0F); 2744 EmitUint8(0xAF); 2745 EmitRegisterOperand(dst.LowBits(), src.LowBits()); 2746 } 2747 2748 2749 void X86_64Assembler::imulq(CpuRegister reg, const Immediate& imm) { 2750 imulq(reg, reg, imm); 2751 } 2752 2753 void X86_64Assembler::imulq(CpuRegister dst, CpuRegister reg, const Immediate& imm) { 2754 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2755 CHECK(imm.is_int32()); // imulq only supports 32b immediate. 2756 2757 EmitRex64(dst, reg); 2758 2759 // See whether imm can be represented as a sign-extended 8bit value. 2760 int64_t v64 = imm.value(); 2761 if (IsInt<8>(v64)) { 2762 // Sign-extension works. 2763 EmitUint8(0x6B); 2764 EmitOperand(dst.LowBits(), Operand(reg)); 2765 EmitUint8(static_cast<uint8_t>(v64 & 0xFF)); 2766 } else { 2767 // Not representable, use full immediate. 2768 EmitUint8(0x69); 2769 EmitOperand(dst.LowBits(), Operand(reg)); 2770 EmitImmediate(imm); 2771 } 2772 } 2773 2774 void X86_64Assembler::imulq(CpuRegister reg, const Address& address) { 2775 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2776 EmitRex64(reg, address); 2777 EmitUint8(0x0F); 2778 EmitUint8(0xAF); 2779 EmitOperand(reg.LowBits(), address); 2780 } 2781 2782 2783 void X86_64Assembler::imull(CpuRegister reg) { 2784 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2785 EmitOptionalRex32(reg); 2786 EmitUint8(0xF7); 2787 EmitOperand(5, Operand(reg)); 2788 } 2789 2790 2791 void X86_64Assembler::imulq(CpuRegister reg) { 2792 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2793 EmitRex64(reg); 2794 EmitUint8(0xF7); 2795 EmitOperand(5, Operand(reg)); 2796 } 2797 2798 2799 void X86_64Assembler::imull(const Address& address) { 2800 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2801 EmitOptionalRex32(address); 2802 EmitUint8(0xF7); 2803 EmitOperand(5, address); 2804 } 2805 2806 2807 void X86_64Assembler::mull(CpuRegister reg) { 2808 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2809 EmitOptionalRex32(reg); 2810 EmitUint8(0xF7); 2811 EmitOperand(4, Operand(reg)); 2812 } 2813 2814 2815 void X86_64Assembler::mull(const Address& address) { 2816 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2817 EmitOptionalRex32(address); 2818 EmitUint8(0xF7); 2819 EmitOperand(4, address); 2820 } 2821 2822 2823 void X86_64Assembler::shll(CpuRegister reg, const Immediate& imm) { 2824 EmitGenericShift(false, 4, reg, imm); 2825 } 2826 2827 2828 void X86_64Assembler::shlq(CpuRegister reg, const Immediate& imm) { 2829 EmitGenericShift(true, 4, reg, imm); 2830 } 2831 2832 2833 void X86_64Assembler::shll(CpuRegister operand, CpuRegister shifter) { 2834 EmitGenericShift(false, 4, operand, shifter); 2835 } 2836 2837 2838 void X86_64Assembler::shlq(CpuRegister operand, CpuRegister shifter) { 2839 EmitGenericShift(true, 4, operand, shifter); 2840 } 2841 2842 2843 void X86_64Assembler::shrl(CpuRegister reg, const Immediate& imm) { 2844 EmitGenericShift(false, 5, reg, imm); 2845 } 2846 2847 2848 void X86_64Assembler::shrq(CpuRegister reg, const Immediate& imm) { 2849 EmitGenericShift(true, 5, reg, imm); 2850 } 2851 2852 2853 void X86_64Assembler::shrl(CpuRegister operand, CpuRegister shifter) { 2854 EmitGenericShift(false, 5, operand, shifter); 2855 } 2856 2857 2858 void X86_64Assembler::shrq(CpuRegister operand, CpuRegister shifter) { 2859 EmitGenericShift(true, 5, operand, shifter); 2860 } 2861 2862 2863 void X86_64Assembler::sarl(CpuRegister reg, const Immediate& imm) { 2864 EmitGenericShift(false, 7, reg, imm); 2865 } 2866 2867 2868 void X86_64Assembler::sarl(CpuRegister operand, CpuRegister shifter) { 2869 EmitGenericShift(false, 7, operand, shifter); 2870 } 2871 2872 2873 void X86_64Assembler::sarq(CpuRegister reg, const Immediate& imm) { 2874 EmitGenericShift(true, 7, reg, imm); 2875 } 2876 2877 2878 void X86_64Assembler::sarq(CpuRegister operand, CpuRegister shifter) { 2879 EmitGenericShift(true, 7, operand, shifter); 2880 } 2881 2882 2883 void X86_64Assembler::roll(CpuRegister reg, const Immediate& imm) { 2884 EmitGenericShift(false, 0, reg, imm); 2885 } 2886 2887 2888 void X86_64Assembler::roll(CpuRegister operand, CpuRegister shifter) { 2889 EmitGenericShift(false, 0, operand, shifter); 2890 } 2891 2892 2893 void X86_64Assembler::rorl(CpuRegister reg, const Immediate& imm) { 2894 EmitGenericShift(false, 1, reg, imm); 2895 } 2896 2897 2898 void X86_64Assembler::rorl(CpuRegister operand, CpuRegister shifter) { 2899 EmitGenericShift(false, 1, operand, shifter); 2900 } 2901 2902 2903 void X86_64Assembler::rolq(CpuRegister reg, const Immediate& imm) { 2904 EmitGenericShift(true, 0, reg, imm); 2905 } 2906 2907 2908 void X86_64Assembler::rolq(CpuRegister operand, CpuRegister shifter) { 2909 EmitGenericShift(true, 0, operand, shifter); 2910 } 2911 2912 2913 void X86_64Assembler::rorq(CpuRegister reg, const Immediate& imm) { 2914 EmitGenericShift(true, 1, reg, imm); 2915 } 2916 2917 2918 void X86_64Assembler::rorq(CpuRegister operand, CpuRegister shifter) { 2919 EmitGenericShift(true, 1, operand, shifter); 2920 } 2921 2922 2923 void X86_64Assembler::negl(CpuRegister reg) { 2924 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2925 EmitOptionalRex32(reg); 2926 EmitUint8(0xF7); 2927 EmitOperand(3, Operand(reg)); 2928 } 2929 2930 2931 void X86_64Assembler::negq(CpuRegister reg) { 2932 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2933 EmitRex64(reg); 2934 EmitUint8(0xF7); 2935 EmitOperand(3, Operand(reg)); 2936 } 2937 2938 2939 void X86_64Assembler::notl(CpuRegister reg) { 2940 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2941 EmitOptionalRex32(reg); 2942 EmitUint8(0xF7); 2943 EmitUint8(0xD0 | reg.LowBits()); 2944 } 2945 2946 2947 void X86_64Assembler::notq(CpuRegister reg) { 2948 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2949 EmitRex64(reg); 2950 EmitUint8(0xF7); 2951 EmitOperand(2, Operand(reg)); 2952 } 2953 2954 2955 void X86_64Assembler::enter(const Immediate& imm) { 2956 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2957 EmitUint8(0xC8); 2958 CHECK(imm.is_uint16()) << imm.value(); 2959 EmitUint8(imm.value() & 0xFF); 2960 EmitUint8((imm.value() >> 8) & 0xFF); 2961 EmitUint8(0x00); 2962 } 2963 2964 2965 void X86_64Assembler::leave() { 2966 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2967 EmitUint8(0xC9); 2968 } 2969 2970 2971 void X86_64Assembler::ret() { 2972 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2973 EmitUint8(0xC3); 2974 } 2975 2976 2977 void X86_64Assembler::ret(const Immediate& imm) { 2978 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2979 EmitUint8(0xC2); 2980 CHECK(imm.is_uint16()); 2981 EmitUint8(imm.value() & 0xFF); 2982 EmitUint8((imm.value() >> 8) & 0xFF); 2983 } 2984 2985 2986 2987 void X86_64Assembler::nop() { 2988 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2989 EmitUint8(0x90); 2990 } 2991 2992 2993 void X86_64Assembler::int3() { 2994 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 2995 EmitUint8(0xCC); 2996 } 2997 2998 2999 void X86_64Assembler::hlt() { 3000 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 3001 EmitUint8(0xF4); 3002 } 3003 3004 3005 void X86_64Assembler::j(Condition condition, Label* label) { 3006 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 3007 if (label->IsBound()) { 3008 static const int kShortSize = 2; 3009 static const int kLongSize = 6; 3010 int offset = label->Position() - buffer_.Size(); 3011 CHECK_LE(offset, 0); 3012 if (IsInt<8>(offset - kShortSize)) { 3013 EmitUint8(0x70 + condition); 3014 EmitUint8((offset - kShortSize) & 0xFF); 3015 } else { 3016 EmitUint8(0x0F); 3017 EmitUint8(0x80 + condition); 3018 EmitInt32(offset - kLongSize); 3019 } 3020 } else { 3021 EmitUint8(0x0F); 3022 EmitUint8(0x80 + condition); 3023 EmitLabelLink(label); 3024 } 3025 } 3026 3027 3028 void X86_64Assembler::j(Condition condition, NearLabel* label) { 3029 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 3030 if (label->IsBound()) { 3031 static const int kShortSize = 2; 3032 int offset = label->Position() - buffer_.Size(); 3033 CHECK_LE(offset, 0); 3034 CHECK(IsInt<8>(offset - kShortSize)); 3035 EmitUint8(0x70 + condition); 3036 EmitUint8((offset - kShortSize) & 0xFF); 3037 } else { 3038 EmitUint8(0x70 + condition); 3039 EmitLabelLink(label); 3040 } 3041 } 3042 3043 3044 void X86_64Assembler::jrcxz(NearLabel* label) { 3045 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 3046 if (label->IsBound()) { 3047 static const int kShortSize = 2; 3048 int offset = label->Position() - buffer_.Size(); 3049 CHECK_LE(offset, 0); 3050 CHECK(IsInt<8>(offset - kShortSize)); 3051 EmitUint8(0xE3); 3052 EmitUint8((offset - kShortSize) & 0xFF); 3053 } else { 3054 EmitUint8(0xE3); 3055 EmitLabelLink(label); 3056 } 3057 } 3058 3059 3060 void X86_64Assembler::jmp(CpuRegister reg) { 3061 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 3062 EmitOptionalRex32(reg); 3063 EmitUint8(0xFF); 3064 EmitRegisterOperand(4, reg.LowBits()); 3065 } 3066 3067 void X86_64Assembler::jmp(const Address& address) { 3068 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 3069 EmitOptionalRex32(address); 3070 EmitUint8(0xFF); 3071 EmitOperand(4, address); 3072 } 3073 3074 void X86_64Assembler::jmp(Label* label) { 3075 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 3076 if (label->IsBound()) { 3077 static const int kShortSize = 2; 3078 static const int kLongSize = 5; 3079 int offset = label->Position() - buffer_.Size(); 3080 CHECK_LE(offset, 0); 3081 if (IsInt<8>(offset - kShortSize)) { 3082 EmitUint8(0xEB); 3083 EmitUint8((offset - kShortSize) & 0xFF); 3084 } else { 3085 EmitUint8(0xE9); 3086 EmitInt32(offset - kLongSize); 3087 } 3088 } else { 3089 EmitUint8(0xE9); 3090 EmitLabelLink(label); 3091 } 3092 } 3093 3094 3095 void X86_64Assembler::jmp(NearLabel* label) { 3096 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 3097 if (label->IsBound()) { 3098 static const int kShortSize = 2; 3099 int offset = label->Position() - buffer_.Size(); 3100 CHECK_LE(offset, 0); 3101 CHECK(IsInt<8>(offset - kShortSize)); 3102 EmitUint8(0xEB); 3103 EmitUint8((offset - kShortSize) & 0xFF); 3104 } else { 3105 EmitUint8(0xEB); 3106 EmitLabelLink(label); 3107 } 3108 } 3109 3110 3111 void X86_64Assembler::rep_movsw() { 3112 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 3113 EmitUint8(0x66); 3114 EmitUint8(0xF3); 3115 EmitUint8(0xA5); 3116 } 3117 3118 3119 X86_64Assembler* X86_64Assembler::lock() { 3120 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 3121 EmitUint8(0xF0); 3122 return this; 3123 } 3124 3125 3126 void X86_64Assembler::cmpxchgl(const Address& address, CpuRegister reg) { 3127 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 3128 EmitOptionalRex32(reg, address); 3129 EmitUint8(0x0F); 3130 EmitUint8(0xB1); 3131 EmitOperand(reg.LowBits(), address); 3132 } 3133 3134 3135 void X86_64Assembler::cmpxchgq(const Address& address, CpuRegister reg) { 3136 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 3137 EmitRex64(reg, address); 3138 EmitUint8(0x0F); 3139 EmitUint8(0xB1); 3140 EmitOperand(reg.LowBits(), address); 3141 } 3142 3143 3144 void X86_64Assembler::mfence() { 3145 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 3146 EmitUint8(0x0F); 3147 EmitUint8(0xAE); 3148 EmitUint8(0xF0); 3149 } 3150 3151 3152 X86_64Assembler* X86_64Assembler::gs() { 3153 // TODO: gs is a prefix and not an instruction 3154 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 3155 EmitUint8(0x65); 3156 return this; 3157 } 3158 3159 3160 void X86_64Assembler::AddImmediate(CpuRegister reg, const Immediate& imm) { 3161 int value = imm.value(); 3162 if (value != 0) { 3163 if (value > 0) { 3164 addl(reg, imm); 3165 } else { 3166 subl(reg, Immediate(value)); 3167 } 3168 } 3169 } 3170 3171 3172 void X86_64Assembler::setcc(Condition condition, CpuRegister dst) { 3173 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 3174 // RSP, RBP, RDI, RSI need rex prefix (else the pattern encodes ah/bh/ch/dh). 3175 if (dst.NeedsRex() || dst.AsRegister() > 3) { 3176 EmitOptionalRex(true, false, false, false, dst.NeedsRex()); 3177 } 3178 EmitUint8(0x0F); 3179 EmitUint8(0x90 + condition); 3180 EmitUint8(0xC0 + dst.LowBits()); 3181 } 3182 3183 void X86_64Assembler::bswapl(CpuRegister dst) { 3184 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 3185 EmitOptionalRex(false, false, false, false, dst.NeedsRex()); 3186 EmitUint8(0x0F); 3187 EmitUint8(0xC8 + dst.LowBits()); 3188 } 3189 3190 void X86_64Assembler::bswapq(CpuRegister dst) { 3191 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 3192 EmitOptionalRex(false, true, false, false, dst.NeedsRex()); 3193 EmitUint8(0x0F); 3194 EmitUint8(0xC8 + dst.LowBits()); 3195 } 3196 3197 void X86_64Assembler::bsfl(CpuRegister dst, CpuRegister src) { 3198 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 3199 EmitOptionalRex32(dst, src); 3200 EmitUint8(0x0F); 3201 EmitUint8(0xBC); 3202 EmitRegisterOperand(dst.LowBits(), src.LowBits()); 3203 } 3204 3205 void X86_64Assembler::bsfl(CpuRegister dst, const Address& src) { 3206 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 3207 EmitOptionalRex32(dst, src); 3208 EmitUint8(0x0F); 3209 EmitUint8(0xBC); 3210 EmitOperand(dst.LowBits(), src); 3211 } 3212 3213 void X86_64Assembler::bsfq(CpuRegister dst, CpuRegister src) { 3214 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 3215 EmitRex64(dst, src); 3216 EmitUint8(0x0F); 3217 EmitUint8(0xBC); 3218 EmitRegisterOperand(dst.LowBits(), src.LowBits()); 3219 } 3220 3221 void X86_64Assembler::bsfq(CpuRegister dst, const Address& src) { 3222 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 3223 EmitRex64(dst, src); 3224 EmitUint8(0x0F); 3225 EmitUint8(0xBC); 3226 EmitOperand(dst.LowBits(), src); 3227 } 3228 3229 void X86_64Assembler::bsrl(CpuRegister dst, CpuRegister src) { 3230 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 3231 EmitOptionalRex32(dst, src); 3232 EmitUint8(0x0F); 3233 EmitUint8(0xBD); 3234 EmitRegisterOperand(dst.LowBits(), src.LowBits()); 3235 } 3236 3237 void X86_64Assembler::bsrl(CpuRegister dst, const Address& src) { 3238 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 3239 EmitOptionalRex32(dst, src); 3240 EmitUint8(0x0F); 3241 EmitUint8(0xBD); 3242 EmitOperand(dst.LowBits(), src); 3243 } 3244 3245 void X86_64Assembler::bsrq(CpuRegister dst, CpuRegister src) { 3246 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 3247 EmitRex64(dst, src); 3248 EmitUint8(0x0F); 3249 EmitUint8(0xBD); 3250 EmitRegisterOperand(dst.LowBits(), src.LowBits()); 3251 } 3252 3253 void X86_64Assembler::bsrq(CpuRegister dst, const Address& src) { 3254 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 3255 EmitRex64(dst, src); 3256 EmitUint8(0x0F); 3257 EmitUint8(0xBD); 3258 EmitOperand(dst.LowBits(), src); 3259 } 3260 3261 void X86_64Assembler::popcntl(CpuRegister dst, CpuRegister src) { 3262 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 3263 EmitUint8(0xF3); 3264 EmitOptionalRex32(dst, src); 3265 EmitUint8(0x0F); 3266 EmitUint8(0xB8); 3267 EmitRegisterOperand(dst.LowBits(), src.LowBits()); 3268 } 3269 3270 void X86_64Assembler::popcntl(CpuRegister dst, const Address& src) { 3271 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 3272 EmitUint8(0xF3); 3273 EmitOptionalRex32(dst, src); 3274 EmitUint8(0x0F); 3275 EmitUint8(0xB8); 3276 EmitOperand(dst.LowBits(), src); 3277 } 3278 3279 void X86_64Assembler::popcntq(CpuRegister dst, CpuRegister src) { 3280 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 3281 EmitUint8(0xF3); 3282 EmitRex64(dst, src); 3283 EmitUint8(0x0F); 3284 EmitUint8(0xB8); 3285 EmitRegisterOperand(dst.LowBits(), src.LowBits()); 3286 } 3287 3288 void X86_64Assembler::popcntq(CpuRegister dst, const Address& src) { 3289 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 3290 EmitUint8(0xF3); 3291 EmitRex64(dst, src); 3292 EmitUint8(0x0F); 3293 EmitUint8(0xB8); 3294 EmitOperand(dst.LowBits(), src); 3295 } 3296 3297 void X86_64Assembler::repne_scasb() { 3298 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 3299 EmitUint8(0xF2); 3300 EmitUint8(0xAE); 3301 } 3302 3303 void X86_64Assembler::repne_scasw() { 3304 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 3305 EmitUint8(0x66); 3306 EmitUint8(0xF2); 3307 EmitUint8(0xAF); 3308 } 3309 3310 void X86_64Assembler::repe_cmpsw() { 3311 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 3312 EmitUint8(0x66); 3313 EmitUint8(0xF3); 3314 EmitUint8(0xA7); 3315 } 3316 3317 3318 void X86_64Assembler::repe_cmpsl() { 3319 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 3320 EmitUint8(0xF3); 3321 EmitUint8(0xA7); 3322 } 3323 3324 3325 void X86_64Assembler::repe_cmpsq() { 3326 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 3327 EmitUint8(0xF3); 3328 EmitRex64(); 3329 EmitUint8(0xA7); 3330 } 3331 3332 3333 void X86_64Assembler::LoadDoubleConstant(XmmRegister dst, double value) { 3334 // TODO: Need to have a code constants table. 3335 int64_t constant = bit_cast<int64_t, double>(value); 3336 pushq(Immediate(High32Bits(constant))); 3337 pushq(Immediate(Low32Bits(constant))); 3338 movsd(dst, Address(CpuRegister(RSP), 0)); 3339 addq(CpuRegister(RSP), Immediate(2 * sizeof(intptr_t))); 3340 } 3341 3342 3343 void X86_64Assembler::Align(int alignment, int offset) { 3344 CHECK(IsPowerOfTwo(alignment)); 3345 // Emit nop instruction until the real position is aligned. 3346 while (((offset + buffer_.GetPosition()) & (alignment-1)) != 0) { 3347 nop(); 3348 } 3349 } 3350 3351 3352 void X86_64Assembler::Bind(Label* label) { 3353 int bound = buffer_.Size(); 3354 CHECK(!label->IsBound()); // Labels can only be bound once. 3355 while (label->IsLinked()) { 3356 int position = label->LinkPosition(); 3357 int next = buffer_.Load<int32_t>(position); 3358 buffer_.Store<int32_t>(position, bound - (position + 4)); 3359 label->position_ = next; 3360 } 3361 label->BindTo(bound); 3362 } 3363 3364 3365 void X86_64Assembler::Bind(NearLabel* label) { 3366 int bound = buffer_.Size(); 3367 CHECK(!label->IsBound()); // Labels can only be bound once. 3368 while (label->IsLinked()) { 3369 int position = label->LinkPosition(); 3370 uint8_t delta = buffer_.Load<uint8_t>(position); 3371 int offset = bound - (position + 1); 3372 CHECK(IsInt<8>(offset)); 3373 buffer_.Store<int8_t>(position, offset); 3374 label->position_ = delta != 0u ? label->position_ - delta : 0; 3375 } 3376 label->BindTo(bound); 3377 } 3378 3379 3380 void X86_64Assembler::EmitOperand(uint8_t reg_or_opcode, const Operand& operand) { 3381 CHECK_GE(reg_or_opcode, 0); 3382 CHECK_LT(reg_or_opcode, 8); 3383 const int length = operand.length_; 3384 CHECK_GT(length, 0); 3385 // Emit the ModRM byte updated with the given reg value. 3386 CHECK_EQ(operand.encoding_[0] & 0x38, 0); 3387 EmitUint8(operand.encoding_[0] + (reg_or_opcode << 3)); 3388 // Emit the rest of the encoded operand. 3389 for (int i = 1; i < length; i++) { 3390 EmitUint8(operand.encoding_[i]); 3391 } 3392 AssemblerFixup* fixup = operand.GetFixup(); 3393 if (fixup != nullptr) { 3394 EmitFixup(fixup); 3395 } 3396 } 3397 3398 3399 void X86_64Assembler::EmitImmediate(const Immediate& imm, bool is_16_op) { 3400 if (is_16_op) { 3401 EmitUint8(imm.value() & 0xFF); 3402 EmitUint8(imm.value() >> 8); 3403 } else if (imm.is_int32()) { 3404 EmitInt32(static_cast<int32_t>(imm.value())); 3405 } else { 3406 EmitInt64(imm.value()); 3407 } 3408 } 3409 3410 3411 void X86_64Assembler::EmitComplex(uint8_t reg_or_opcode, 3412 const Operand& operand, 3413 const Immediate& immediate, 3414 bool is_16_op) { 3415 CHECK_GE(reg_or_opcode, 0); 3416 CHECK_LT(reg_or_opcode, 8); 3417 if (immediate.is_int8()) { 3418 // Use sign-extended 8-bit immediate. 3419 EmitUint8(0x83); 3420 EmitOperand(reg_or_opcode, operand); 3421 EmitUint8(immediate.value() & 0xFF); 3422 } else if (operand.IsRegister(CpuRegister(RAX))) { 3423 // Use short form if the destination is eax. 3424 EmitUint8(0x05 + (reg_or_opcode << 3)); 3425 EmitImmediate(immediate, is_16_op); 3426 } else { 3427 EmitUint8(0x81); 3428 EmitOperand(reg_or_opcode, operand); 3429 EmitImmediate(immediate, is_16_op); 3430 } 3431 } 3432 3433 3434 void X86_64Assembler::EmitLabel(Label* label, int instruction_size) { 3435 if (label->IsBound()) { 3436 int offset = label->Position() - buffer_.Size(); 3437 CHECK_LE(offset, 0); 3438 EmitInt32(offset - instruction_size); 3439 } else { 3440 EmitLabelLink(label); 3441 } 3442 } 3443 3444 3445 void X86_64Assembler::EmitLabelLink(Label* label) { 3446 CHECK(!label->IsBound()); 3447 int position = buffer_.Size(); 3448 EmitInt32(label->position_); 3449 label->LinkTo(position); 3450 } 3451 3452 3453 void X86_64Assembler::EmitLabelLink(NearLabel* label) { 3454 CHECK(!label->IsBound()); 3455 int position = buffer_.Size(); 3456 if (label->IsLinked()) { 3457 // Save the delta in the byte that we have to play with. 3458 uint32_t delta = position - label->LinkPosition(); 3459 CHECK(IsUint<8>(delta)); 3460 EmitUint8(delta & 0xFF); 3461 } else { 3462 EmitUint8(0); 3463 } 3464 label->LinkTo(position); 3465 } 3466 3467 3468 void X86_64Assembler::EmitGenericShift(bool wide, 3469 int reg_or_opcode, 3470 CpuRegister reg, 3471 const Immediate& imm) { 3472 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 3473 CHECK(imm.is_int8()); 3474 if (wide) { 3475 EmitRex64(reg); 3476 } else { 3477 EmitOptionalRex32(reg); 3478 } 3479 if (imm.value() == 1) { 3480 EmitUint8(0xD1); 3481 EmitOperand(reg_or_opcode, Operand(reg)); 3482 } else { 3483 EmitUint8(0xC1); 3484 EmitOperand(reg_or_opcode, Operand(reg)); 3485 EmitUint8(imm.value() & 0xFF); 3486 } 3487 } 3488 3489 3490 void X86_64Assembler::EmitGenericShift(bool wide, 3491 int reg_or_opcode, 3492 CpuRegister operand, 3493 CpuRegister shifter) { 3494 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 3495 CHECK_EQ(shifter.AsRegister(), RCX); 3496 if (wide) { 3497 EmitRex64(operand); 3498 } else { 3499 EmitOptionalRex32(operand); 3500 } 3501 EmitUint8(0xD3); 3502 EmitOperand(reg_or_opcode, Operand(operand)); 3503 } 3504 3505 void X86_64Assembler::EmitOptionalRex(bool force, bool w, bool r, bool x, bool b) { 3506 // REX.WRXB 3507 // W - 64-bit operand 3508 // R - MODRM.reg 3509 // X - SIB.index 3510 // B - MODRM.rm/SIB.base 3511 uint8_t rex = force ? 0x40 : 0; 3512 if (w) { 3513 rex |= 0x48; // REX.W000 3514 } 3515 if (r) { 3516 rex |= 0x44; // REX.0R00 3517 } 3518 if (x) { 3519 rex |= 0x42; // REX.00X0 3520 } 3521 if (b) { 3522 rex |= 0x41; // REX.000B 3523 } 3524 if (rex != 0) { 3525 EmitUint8(rex); 3526 } 3527 } 3528 3529 void X86_64Assembler::EmitOptionalRex32(CpuRegister reg) { 3530 EmitOptionalRex(false, false, false, false, reg.NeedsRex()); 3531 } 3532 3533 void X86_64Assembler::EmitOptionalRex32(CpuRegister dst, CpuRegister src) { 3534 EmitOptionalRex(false, false, dst.NeedsRex(), false, src.NeedsRex()); 3535 } 3536 3537 void X86_64Assembler::EmitOptionalRex32(XmmRegister dst, XmmRegister src) { 3538 EmitOptionalRex(false, false, dst.NeedsRex(), false, src.NeedsRex()); 3539 } 3540 3541 void X86_64Assembler::EmitOptionalRex32(CpuRegister dst, XmmRegister src) { 3542 EmitOptionalRex(false, false, dst.NeedsRex(), false, src.NeedsRex()); 3543 } 3544 3545 void X86_64Assembler::EmitOptionalRex32(XmmRegister dst, CpuRegister src) { 3546 EmitOptionalRex(false, false, dst.NeedsRex(), false, src.NeedsRex()); 3547 } 3548 3549 void X86_64Assembler::EmitOptionalRex32(const Operand& operand) { 3550 uint8_t rex = operand.rex(); 3551 if (rex != 0) { 3552 EmitUint8(rex); 3553 } 3554 } 3555 3556 void X86_64Assembler::EmitOptionalRex32(CpuRegister dst, const Operand& operand) { 3557 uint8_t rex = operand.rex(); 3558 if (dst.NeedsRex()) { 3559 rex |= 0x44; // REX.0R00 3560 } 3561 if (rex != 0) { 3562 EmitUint8(rex); 3563 } 3564 } 3565 3566 void X86_64Assembler::EmitOptionalRex32(XmmRegister dst, const Operand& operand) { 3567 uint8_t rex = operand.rex(); 3568 if (dst.NeedsRex()) { 3569 rex |= 0x44; // REX.0R00 3570 } 3571 if (rex != 0) { 3572 EmitUint8(rex); 3573 } 3574 } 3575 3576 void X86_64Assembler::EmitRex64() { 3577 EmitOptionalRex(false, true, false, false, false); 3578 } 3579 3580 void X86_64Assembler::EmitRex64(CpuRegister reg) { 3581 EmitOptionalRex(false, true, false, false, reg.NeedsRex()); 3582 } 3583 3584 void X86_64Assembler::EmitRex64(const Operand& operand) { 3585 uint8_t rex = operand.rex(); 3586 rex |= 0x48; // REX.W000 3587 EmitUint8(rex); 3588 } 3589 3590 void X86_64Assembler::EmitRex64(CpuRegister dst, CpuRegister src) { 3591 EmitOptionalRex(false, true, dst.NeedsRex(), false, src.NeedsRex()); 3592 } 3593 3594 void X86_64Assembler::EmitRex64(XmmRegister dst, CpuRegister src) { 3595 EmitOptionalRex(false, true, dst.NeedsRex(), false, src.NeedsRex()); 3596 } 3597 3598 void X86_64Assembler::EmitRex64(CpuRegister dst, XmmRegister src) { 3599 EmitOptionalRex(false, true, dst.NeedsRex(), false, src.NeedsRex()); 3600 } 3601 3602 void X86_64Assembler::EmitRex64(CpuRegister dst, const Operand& operand) { 3603 uint8_t rex = 0x48 | operand.rex(); // REX.W000 3604 if (dst.NeedsRex()) { 3605 rex |= 0x44; // REX.0R00 3606 } 3607 EmitUint8(rex); 3608 } 3609 3610 void X86_64Assembler::EmitRex64(XmmRegister dst, const Operand& operand) { 3611 uint8_t rex = 0x48 | operand.rex(); // REX.W000 3612 if (dst.NeedsRex()) { 3613 rex |= 0x44; // REX.0R00 3614 } 3615 EmitUint8(rex); 3616 } 3617 3618 void X86_64Assembler::EmitOptionalByteRegNormalizingRex32(CpuRegister dst, CpuRegister src) { 3619 // For src, SPL, BPL, SIL, DIL need the rex prefix. 3620 bool force = src.AsRegister() > 3; 3621 EmitOptionalRex(force, false, dst.NeedsRex(), false, src.NeedsRex()); 3622 } 3623 3624 void X86_64Assembler::EmitOptionalByteRegNormalizingRex32(CpuRegister dst, const Operand& operand) { 3625 uint8_t rex = operand.rex(); 3626 // For dst, SPL, BPL, SIL, DIL need the rex prefix. 3627 bool force = dst.AsRegister() > 3; 3628 if (force) { 3629 rex |= 0x40; // REX.0000 3630 } 3631 if (dst.NeedsRex()) { 3632 rex |= 0x44; // REX.0R00 3633 } 3634 if (rex != 0) { 3635 EmitUint8(rex); 3636 } 3637 } 3638 3639 void X86_64Assembler::AddConstantArea() { 3640 ArrayRef<const int32_t> area = constant_area_.GetBuffer(); 3641 for (size_t i = 0, e = area.size(); i < e; i++) { 3642 AssemblerBuffer::EnsureCapacity ensured(&buffer_); 3643 EmitInt32(area[i]); 3644 } 3645 } 3646 3647 size_t ConstantArea::AppendInt32(int32_t v) { 3648 size_t result = buffer_.size() * elem_size_; 3649 buffer_.push_back(v); 3650 return result; 3651 } 3652 3653 size_t ConstantArea::AddInt32(int32_t v) { 3654 // Look for an existing match. 3655 for (size_t i = 0, e = buffer_.size(); i < e; i++) { 3656 if (v == buffer_[i]) { 3657 return i * elem_size_; 3658 } 3659 } 3660 3661 // Didn't match anything. 3662 return AppendInt32(v); 3663 } 3664 3665 size_t ConstantArea::AddInt64(int64_t v) { 3666 int32_t v_low = v; 3667 int32_t v_high = v >> 32; 3668 if (buffer_.size() > 1) { 3669 // Ensure we don't pass the end of the buffer. 3670 for (size_t i = 0, e = buffer_.size() - 1; i < e; i++) { 3671 if (v_low == buffer_[i] && v_high == buffer_[i + 1]) { 3672 return i * elem_size_; 3673 } 3674 } 3675 } 3676 3677 // Didn't match anything. 3678 size_t result = buffer_.size() * elem_size_; 3679 buffer_.push_back(v_low); 3680 buffer_.push_back(v_high); 3681 return result; 3682 } 3683 3684 size_t ConstantArea::AddDouble(double v) { 3685 // Treat the value as a 64-bit integer value. 3686 return AddInt64(bit_cast<int64_t, double>(v)); 3687 } 3688 3689 size_t ConstantArea::AddFloat(float v) { 3690 // Treat the value as a 32-bit integer value. 3691 return AddInt32(bit_cast<int32_t, float>(v)); 3692 } 3693 3694 } // namespace x86_64 3695 } // namespace art 3696