1 // Copyright 2015, VIXL authors 2 // All rights reserved. 3 // 4 // Redistribution and use in source and binary forms, with or without 5 // modification, are permitted provided that the following conditions are met: 6 // 7 // * Redistributions of source code must retain the above copyright notice, 8 // this list of conditions and the following disclaimer. 9 // * Redistributions in binary form must reproduce the above copyright notice, 10 // this list of conditions and the following disclaimer in the documentation 11 // and/or other materials provided with the distribution. 12 // * Neither the name of ARM Limited nor the names of its contributors may be 13 // used to endorse or promote products derived from this software without 14 // specific prior written permission. 15 // 16 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS CONTRIBUTORS "AS IS" AND 17 // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 18 // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 19 // DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE 20 // FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 21 // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 22 // SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 23 // CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 24 // OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 25 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26 27 extern "C" { 28 #include <stdint.h> 29 } 30 31 #include <cassert> 32 #include <cstdio> 33 #include <cstdlib> 34 #include <cstring> 35 #include <iomanip> 36 #include <iostream> 37 38 #include "utils-vixl.h" 39 #include "aarch32/constants-aarch32.h" 40 #include "aarch32/instructions-aarch32.h" 41 #include "aarch32/operands-aarch32.h" 42 #include "aarch32/disasm-aarch32.h" 43 44 namespace vixl { 45 namespace aarch32 { 46 47 class T32CodeAddressIncrementer { 48 uint32_t* code_address_; 49 uint32_t increment_; 50 51 public: 52 T32CodeAddressIncrementer(uint32_t instr, uint32_t* code_address) 53 : code_address_(code_address), 54 increment_(Disassembler::Is16BitEncoding(instr) ? 2 : 4) {} 55 ~T32CodeAddressIncrementer() { *code_address_ += increment_; } 56 }; 57 58 class A32CodeAddressIncrementer { 59 uint32_t* code_address_; 60 61 public: 62 explicit A32CodeAddressIncrementer(uint32_t* code_address) 63 : code_address_(code_address) {} 64 ~A32CodeAddressIncrementer() { *code_address_ += 4; } 65 }; 66 67 class DecodeNeon { 68 int lane_; 69 SpacingType spacing_; 70 bool valid_; 71 72 public: 73 DecodeNeon(int lane, SpacingType spacing) 74 : lane_(lane), spacing_(spacing), valid_(true) {} 75 DecodeNeon() : lane_(0), spacing_(kSingle), valid_(false) {} 76 int GetLane() const { return lane_; } 77 SpacingType GetSpacing() const { return spacing_; } 78 bool IsValid() const { return valid_; } 79 }; 80 81 class DecodeNeonAndAlign : public DecodeNeon { 82 public: 83 Alignment align_; 84 DecodeNeonAndAlign(int lanes, SpacingType spacing, Alignment align) 85 : DecodeNeon(lanes, spacing), align_(align) {} 86 DecodeNeonAndAlign() : align_(kBadAlignment) {} 87 Alignment GetAlign() const { return align_; } 88 }; 89 90 // Start of generated code. 91 DataTypeValue Dt_L_imm6_1_Decode(uint32_t value, uint32_t type_value) { 92 if ((value & 0xf) == 0x1) { 93 switch (type_value) { 94 case 0x0: 95 return S8; 96 case 0x1: 97 return U8; 98 } 99 } else if ((value & 0xe) == 0x2) { 100 switch (type_value) { 101 case 0x0: 102 return S16; 103 case 0x1: 104 return U16; 105 } 106 } else if ((value & 0xc) == 0x4) { 107 switch (type_value) { 108 case 0x0: 109 return S32; 110 case 0x1: 111 return U32; 112 } 113 } else if ((value & 0x8) == 0x8) { 114 switch (type_value) { 115 case 0x0: 116 return S64; 117 case 0x1: 118 return U64; 119 } 120 } 121 return kDataTypeValueInvalid; 122 } 123 124 DataTypeValue Dt_L_imm6_2_Decode(uint32_t value, uint32_t type_value) { 125 if ((value & 0xf) == 0x1) { 126 if (type_value == 0x1) return S8; 127 } else if ((value & 0xe) == 0x2) { 128 if (type_value == 0x1) return S16; 129 } else if ((value & 0xc) == 0x4) { 130 if (type_value == 0x1) return S32; 131 } else if ((value & 0x8) == 0x8) { 132 if (type_value == 0x1) return S64; 133 } 134 return kDataTypeValueInvalid; 135 } 136 137 DataTypeValue Dt_L_imm6_3_Decode(uint32_t value) { 138 if ((value & 0xf) == 0x1) { 139 return I8; 140 } else if ((value & 0xe) == 0x2) { 141 return I16; 142 } else if ((value & 0xc) == 0x4) { 143 return I32; 144 } else if ((value & 0x8) == 0x8) { 145 return I64; 146 } 147 return kDataTypeValueInvalid; 148 } 149 150 DataTypeValue Dt_L_imm6_4_Decode(uint32_t value) { 151 if ((value & 0xf) == 0x1) { 152 return Untyped8; 153 } else if ((value & 0xe) == 0x2) { 154 return Untyped16; 155 } else if ((value & 0xc) == 0x4) { 156 return Untyped32; 157 } else if ((value & 0x8) == 0x8) { 158 return Untyped64; 159 } 160 return kDataTypeValueInvalid; 161 } 162 163 DataTypeValue Dt_imm6_1_Decode(uint32_t value, uint32_t type_value) { 164 if ((value & 0x7) == 0x1) { 165 switch (type_value) { 166 case 0x0: 167 return S16; 168 case 0x1: 169 return U16; 170 } 171 } else if ((value & 0x6) == 0x2) { 172 switch (type_value) { 173 case 0x0: 174 return S32; 175 case 0x1: 176 return U32; 177 } 178 } else if ((value & 0x4) == 0x4) { 179 switch (type_value) { 180 case 0x0: 181 return S64; 182 case 0x1: 183 return U64; 184 } 185 } 186 return kDataTypeValueInvalid; 187 } 188 189 DataTypeValue Dt_imm6_2_Decode(uint32_t value, uint32_t type_value) { 190 if ((value & 0x7) == 0x1) { 191 if (type_value == 0x1) return S16; 192 } else if ((value & 0x6) == 0x2) { 193 if (type_value == 0x1) return S32; 194 } else if ((value & 0x4) == 0x4) { 195 if (type_value == 0x1) return S64; 196 } 197 return kDataTypeValueInvalid; 198 } 199 200 DataTypeValue Dt_imm6_3_Decode(uint32_t value) { 201 if ((value & 0x7) == 0x1) { 202 return I16; 203 } else if ((value & 0x6) == 0x2) { 204 return I32; 205 } else if ((value & 0x4) == 0x4) { 206 return I64; 207 } 208 return kDataTypeValueInvalid; 209 } 210 211 DataTypeValue Dt_imm6_4_Decode(uint32_t value, uint32_t type_value) { 212 if ((value & 0x7) == 0x1) { 213 switch (type_value) { 214 case 0x0: 215 return S8; 216 case 0x1: 217 return U8; 218 } 219 } else if ((value & 0x6) == 0x2) { 220 switch (type_value) { 221 case 0x0: 222 return S16; 223 case 0x1: 224 return U16; 225 } 226 } else if ((value & 0x4) == 0x4) { 227 switch (type_value) { 228 case 0x0: 229 return S32; 230 case 0x1: 231 return U32; 232 } 233 } 234 return kDataTypeValueInvalid; 235 } 236 237 DataTypeValue Dt_op_U_size_1_Decode(uint32_t value) { 238 switch (value) { 239 case 0x0: 240 return S8; 241 case 0x1: 242 return S16; 243 case 0x2: 244 return S32; 245 case 0x4: 246 return U8; 247 case 0x5: 248 return U16; 249 case 0x6: 250 return U32; 251 case 0x8: 252 return P8; 253 case 0xa: 254 return P64; 255 } 256 return kDataTypeValueInvalid; 257 } 258 259 DataTypeValue Dt_op_size_1_Decode(uint32_t value) { 260 switch (value) { 261 case 0x0: 262 return I8; 263 case 0x1: 264 return I16; 265 case 0x2: 266 return I32; 267 case 0x4: 268 return P8; 269 } 270 return kDataTypeValueInvalid; 271 } 272 273 DataTypeValue Dt_op_size_2_Decode(uint32_t value) { 274 switch (value) { 275 case 0x0: 276 return S8; 277 case 0x1: 278 return S16; 279 case 0x2: 280 return S32; 281 case 0x4: 282 return U8; 283 case 0x5: 284 return U16; 285 case 0x6: 286 return U32; 287 } 288 return kDataTypeValueInvalid; 289 } 290 291 DataTypeValue Dt_op_size_3_Decode(uint32_t value) { 292 switch (value) { 293 case 0x0: 294 return S16; 295 case 0x1: 296 return S32; 297 case 0x2: 298 return S64; 299 case 0x4: 300 return U16; 301 case 0x5: 302 return U32; 303 case 0x6: 304 return U64; 305 } 306 return kDataTypeValueInvalid; 307 } 308 309 DataTypeValue Dt_U_imm3H_1_Decode(uint32_t value) { 310 switch (value) { 311 case 0x1: 312 return S8; 313 case 0x2: 314 return S16; 315 case 0x4: 316 return S32; 317 case 0x9: 318 return U8; 319 case 0xa: 320 return U16; 321 case 0xc: 322 return U32; 323 } 324 return kDataTypeValueInvalid; 325 } 326 327 DataTypeValue Dt_U_opc1_opc2_1_Decode(uint32_t value, unsigned* lane) { 328 if ((value & 0x18) == 0x8) { 329 *lane = value & 7; 330 return S8; 331 } 332 if ((value & 0x19) == 0x1) { 333 *lane = (value >> 1) & 3; 334 return S16; 335 } 336 if ((value & 0x18) == 0x18) { 337 *lane = value & 7; 338 return U8; 339 } 340 if ((value & 0x19) == 0x11) { 341 *lane = (value >> 1) & 3; 342 return U16; 343 } 344 if ((value & 0x1b) == 0x0) { 345 *lane = (value >> 2) & 1; 346 return Untyped32; 347 } 348 *lane = -1; 349 return kDataTypeValueInvalid; 350 } 351 352 DataTypeValue Dt_opc1_opc2_1_Decode(uint32_t value, unsigned* lane) { 353 if ((value & 0x8) == 0x8) { 354 *lane = value & 7; 355 return Untyped8; 356 } 357 if ((value & 0x9) == 0x1) { 358 *lane = (value >> 1) & 3; 359 return Untyped16; 360 } 361 if ((value & 0xb) == 0x0) { 362 *lane = (value >> 2) & 1; 363 return Untyped32; 364 } 365 *lane = -1; 366 return kDataTypeValueInvalid; 367 } 368 369 DataTypeValue Dt_imm4_1_Decode(uint32_t value, unsigned* lane) { 370 if ((value & 0x1) == 0x1) { 371 *lane = (value >> 1) & 7; 372 return Untyped8; 373 } 374 if ((value & 0x3) == 0x2) { 375 *lane = (value >> 2) & 3; 376 return Untyped16; 377 } 378 if ((value & 0x7) == 0x4) { 379 *lane = (value >> 3) & 1; 380 return Untyped32; 381 } 382 *lane = -1; 383 return kDataTypeValueInvalid; 384 } 385 386 DataTypeValue Dt_B_E_1_Decode(uint32_t value) { 387 switch (value) { 388 case 0x2: 389 return Untyped8; 390 case 0x1: 391 return Untyped16; 392 case 0x0: 393 return Untyped32; 394 } 395 return kDataTypeValueInvalid; 396 } 397 398 DataTypeValue Dt_op_1_Decode1(uint32_t value) { 399 switch (value) { 400 case 0x0: 401 return F32; 402 case 0x1: 403 return F32; 404 case 0x2: 405 return S32; 406 case 0x3: 407 return U32; 408 } 409 return kDataTypeValueInvalid; 410 } 411 412 DataTypeValue Dt_op_1_Decode2(uint32_t value) { 413 switch (value) { 414 case 0x0: 415 return S32; 416 case 0x1: 417 return U32; 418 case 0x2: 419 return F32; 420 case 0x3: 421 return F32; 422 } 423 return kDataTypeValueInvalid; 424 } 425 426 DataTypeValue Dt_op_2_Decode(uint32_t value) { 427 switch (value) { 428 case 0x0: 429 return U32; 430 case 0x1: 431 return S32; 432 } 433 return kDataTypeValueInvalid; 434 } 435 436 DataTypeValue Dt_op_3_Decode(uint32_t value) { 437 switch (value) { 438 case 0x0: 439 return S32; 440 case 0x1: 441 return U32; 442 } 443 return kDataTypeValueInvalid; 444 } 445 446 DataTypeValue Dt_U_sx_1_Decode(uint32_t value) { 447 switch (value) { 448 case 0x0: 449 return S16; 450 case 0x1: 451 return S32; 452 case 0x2: 453 return U16; 454 case 0x3: 455 return U32; 456 } 457 return kDataTypeValueInvalid; 458 } 459 460 DataTypeValue Dt_op_U_1_Decode1(uint32_t value) { 461 switch (value) { 462 case 0x0: 463 return F32; 464 case 0x1: 465 return F32; 466 case 0x2: 467 return S32; 468 case 0x3: 469 return U32; 470 } 471 return kDataTypeValueInvalid; 472 } 473 474 DataTypeValue Dt_op_U_1_Decode2(uint32_t value) { 475 switch (value) { 476 case 0x0: 477 return S32; 478 case 0x1: 479 return U32; 480 case 0x2: 481 return F32; 482 case 0x3: 483 return F32; 484 } 485 return kDataTypeValueInvalid; 486 } 487 488 DataTypeValue Dt_sz_1_Decode(uint32_t value) { 489 switch (value) { 490 case 0x0: 491 return F32; 492 } 493 return kDataTypeValueInvalid; 494 } 495 496 DataTypeValue Dt_F_size_1_Decode(uint32_t value) { 497 switch (value) { 498 case 0x0: 499 return S8; 500 case 0x1: 501 return S16; 502 case 0x2: 503 return S32; 504 case 0x6: 505 return F32; 506 } 507 return kDataTypeValueInvalid; 508 } 509 510 DataTypeValue Dt_F_size_2_Decode(uint32_t value) { 511 switch (value) { 512 case 0x0: 513 return I8; 514 case 0x1: 515 return I16; 516 case 0x2: 517 return I32; 518 case 0x6: 519 return F32; 520 } 521 return kDataTypeValueInvalid; 522 } 523 524 DataTypeValue Dt_F_size_3_Decode(uint32_t value) { 525 switch (value) { 526 case 0x1: 527 return I16; 528 case 0x2: 529 return I32; 530 case 0x6: 531 return F32; 532 } 533 return kDataTypeValueInvalid; 534 } 535 536 DataTypeValue Dt_F_size_4_Decode(uint32_t value) { 537 switch (value) { 538 case 0x2: 539 return U32; 540 case 0x6: 541 return F32; 542 } 543 return kDataTypeValueInvalid; 544 } 545 546 DataTypeValue Dt_U_size_1_Decode(uint32_t value) { 547 switch (value) { 548 case 0x0: 549 return S8; 550 case 0x1: 551 return S16; 552 case 0x2: 553 return S32; 554 case 0x4: 555 return U8; 556 case 0x5: 557 return U16; 558 case 0x6: 559 return U32; 560 } 561 return kDataTypeValueInvalid; 562 } 563 564 DataTypeValue Dt_U_size_2_Decode(uint32_t value) { 565 switch (value) { 566 case 0x1: 567 return S16; 568 case 0x2: 569 return S32; 570 case 0x5: 571 return U16; 572 case 0x6: 573 return U32; 574 } 575 return kDataTypeValueInvalid; 576 } 577 578 DataTypeValue Dt_U_size_3_Decode(uint32_t value) { 579 switch (value) { 580 case 0x0: 581 return S8; 582 case 0x1: 583 return S16; 584 case 0x2: 585 return S32; 586 case 0x3: 587 return S64; 588 case 0x4: 589 return U8; 590 case 0x5: 591 return U16; 592 case 0x6: 593 return U32; 594 case 0x7: 595 return U64; 596 } 597 return kDataTypeValueInvalid; 598 } 599 600 DataTypeValue Dt_size_1_Decode(uint32_t value) { 601 switch (value) { 602 case 0x0: 603 return Untyped8; 604 } 605 return kDataTypeValueInvalid; 606 } 607 608 DataTypeValue Dt_size_2_Decode(uint32_t value) { 609 switch (value) { 610 case 0x0: 611 return I8; 612 case 0x1: 613 return I16; 614 case 0x2: 615 return I32; 616 case 0x3: 617 return I64; 618 } 619 return kDataTypeValueInvalid; 620 } 621 622 DataTypeValue Dt_size_3_Decode(uint32_t value) { 623 switch (value) { 624 case 0x0: 625 return I16; 626 case 0x1: 627 return I32; 628 case 0x2: 629 return I64; 630 } 631 return kDataTypeValueInvalid; 632 } 633 634 DataTypeValue Dt_size_4_Decode(uint32_t value) { 635 switch (value) { 636 case 0x0: 637 return I8; 638 case 0x1: 639 return I16; 640 case 0x2: 641 return I32; 642 } 643 return kDataTypeValueInvalid; 644 } 645 646 DataTypeValue Dt_size_5_Decode(uint32_t value) { 647 switch (value) { 648 case 0x0: 649 return S8; 650 case 0x1: 651 return S16; 652 case 0x2: 653 return S32; 654 } 655 return kDataTypeValueInvalid; 656 } 657 658 DataTypeValue Dt_size_6_Decode(uint32_t value) { 659 switch (value) { 660 case 0x0: 661 return Untyped8; 662 case 0x1: 663 return Untyped16; 664 case 0x2: 665 return Untyped32; 666 case 0x3: 667 return Untyped64; 668 } 669 return kDataTypeValueInvalid; 670 } 671 672 DataTypeValue Dt_size_7_Decode(uint32_t value) { 673 switch (value) { 674 case 0x0: 675 return Untyped8; 676 case 0x1: 677 return Untyped16; 678 case 0x2: 679 return Untyped32; 680 } 681 return kDataTypeValueInvalid; 682 } 683 684 DataTypeValue Dt_size_8_Decode(uint32_t value) { 685 switch (value) { 686 case 0x0: 687 return Untyped8; 688 case 0x1: 689 return Untyped16; 690 case 0x2: 691 return Untyped32; 692 case 0x3: 693 return Untyped32; 694 } 695 return kDataTypeValueInvalid; 696 } 697 698 DataTypeValue Dt_size_9_Decode(uint32_t value, uint32_t type_value) { 699 switch (value) { 700 case 0x1: 701 switch (type_value) { 702 case 0x0: 703 return I16; 704 } 705 break; 706 case 0x2: 707 switch (type_value) { 708 case 0x0: 709 return I32; 710 case 0x1: 711 return F32; 712 } 713 break; 714 } 715 return kDataTypeValueInvalid; 716 } 717 718 DataTypeValue Dt_size_10_Decode(uint32_t value) { 719 switch (value) { 720 case 0x0: 721 return I8; 722 case 0x1: 723 return I16; 724 case 0x2: 725 return I32; 726 } 727 return kDataTypeValueInvalid; 728 } 729 730 DataTypeValue Dt_size_11_Decode(uint32_t value, uint32_t type_value) { 731 switch (value) { 732 case 0x1: 733 switch (type_value) { 734 case 0x0: 735 return S16; 736 case 0x1: 737 return U16; 738 } 739 break; 740 case 0x2: 741 switch (type_value) { 742 case 0x0: 743 return S32; 744 case 0x1: 745 return U32; 746 } 747 break; 748 } 749 return kDataTypeValueInvalid; 750 } 751 752 DataTypeValue Dt_size_12_Decode(uint32_t value, uint32_t type_value) { 753 switch (value) { 754 case 0x0: 755 switch (type_value) { 756 case 0x0: 757 return S8; 758 case 0x1: 759 return U8; 760 } 761 break; 762 case 0x1: 763 switch (type_value) { 764 case 0x0: 765 return S16; 766 case 0x1: 767 return U16; 768 } 769 break; 770 case 0x2: 771 switch (type_value) { 772 case 0x0: 773 return S32; 774 case 0x1: 775 return U32; 776 } 777 break; 778 } 779 return kDataTypeValueInvalid; 780 } 781 782 DataTypeValue Dt_size_13_Decode(uint32_t value) { 783 switch (value) { 784 case 0x1: 785 return S16; 786 case 0x2: 787 return S32; 788 } 789 return kDataTypeValueInvalid; 790 } 791 792 DataTypeValue Dt_size_14_Decode(uint32_t value) { 793 switch (value) { 794 case 0x0: 795 return S16; 796 case 0x1: 797 return S32; 798 case 0x2: 799 return S64; 800 } 801 return kDataTypeValueInvalid; 802 } 803 804 DataTypeValue Dt_size_15_Decode(uint32_t value) { 805 switch (value) { 806 case 0x0: 807 return Untyped8; 808 case 0x1: 809 return Untyped16; 810 } 811 return kDataTypeValueInvalid; 812 } 813 814 DataTypeValue Dt_size_16_Decode(uint32_t value) { 815 switch (value) { 816 case 0x0: 817 return I8; 818 case 0x1: 819 return I16; 820 case 0x2: 821 return I32; 822 } 823 return kDataTypeValueInvalid; 824 } 825 826 DecodeNeon Index_1_Decode(uint32_t value, DataType dt) { 827 switch (dt.GetValue()) { 828 case Untyped8: { 829 int lane = (value >> 1) & 0x7; 830 if ((value & 1) != 0) break; 831 SpacingType spacing = kSingle; 832 return DecodeNeon(lane, spacing); 833 } 834 case Untyped16: { 835 int lane = (value >> 2) & 0x3; 836 if ((value & 1) != 0) break; 837 SpacingType spacing = ((value & 3) == 2) ? kDouble : kSingle; 838 return DecodeNeon(lane, spacing); 839 } 840 case Untyped32: { 841 int lane = (value >> 3) & 0x1; 842 if ((value & 3) != 0) break; 843 SpacingType spacing = ((value & 7) == 4) ? kDouble : kSingle; 844 return DecodeNeon(lane, spacing); 845 } 846 default: 847 break; 848 } 849 return DecodeNeon(); 850 } 851 852 DecodeNeonAndAlign Align_index_align_1_Decode(uint32_t value, DataType dt) { 853 switch (dt.GetValue()) { 854 case Untyped8: { 855 AlignmentType align; 856 if ((value & 1) == 0) { 857 align = kNoAlignment; 858 } else { 859 break; 860 } 861 int lane = (value >> 1) & 0x7; 862 SpacingType spacing = kSingle; 863 return DecodeNeonAndAlign(lane, spacing, align); 864 } 865 case Untyped16: { 866 AlignmentType align; 867 if ((value & 3) == 1) { 868 align = k16BitAlign; 869 } else if ((value & 3) == 0) { 870 align = kNoAlignment; 871 } else { 872 break; 873 } 874 int lane = (value >> 2) & 0x3; 875 SpacingType spacing = kSingle; 876 return DecodeNeonAndAlign(lane, spacing, align); 877 } 878 case Untyped32: { 879 AlignmentType align; 880 if ((value & 7) == 3) { 881 align = k32BitAlign; 882 } else if ((value & 7) == 0) { 883 align = kNoAlignment; 884 } else { 885 break; 886 } 887 int lane = (value >> 3) & 0x1; 888 SpacingType spacing = kSingle; 889 return DecodeNeonAndAlign(lane, spacing, align); 890 } 891 default: 892 break; 893 } 894 return DecodeNeonAndAlign(); 895 } 896 897 DecodeNeonAndAlign Align_index_align_2_Decode(uint32_t value, DataType dt) { 898 switch (dt.GetValue()) { 899 case Untyped8: { 900 AlignmentType align; 901 if ((value & 1) == 1) { 902 align = k16BitAlign; 903 } else if ((value & 1) == 0) { 904 align = kNoAlignment; 905 } else { 906 break; 907 } 908 int lane = (value >> 1) & 0x7; 909 SpacingType spacing = kSingle; 910 return DecodeNeonAndAlign(lane, spacing, align); 911 } 912 case Untyped16: { 913 AlignmentType align; 914 if ((value & 1) == 1) { 915 align = k32BitAlign; 916 } else if ((value & 1) == 0) { 917 align = kNoAlignment; 918 } else { 919 break; 920 } 921 int lane = (value >> 2) & 0x3; 922 SpacingType spacing = ((value & 2) == 2) ? kDouble : kSingle; 923 return DecodeNeonAndAlign(lane, spacing, align); 924 } 925 case Untyped32: { 926 AlignmentType align; 927 if ((value & 3) == 1) { 928 align = k64BitAlign; 929 } else if ((value & 3) == 0) { 930 align = kNoAlignment; 931 } else { 932 break; 933 } 934 int lane = (value >> 3) & 0x1; 935 SpacingType spacing = ((value & 4) == 4) ? kDouble : kSingle; 936 return DecodeNeonAndAlign(lane, spacing, align); 937 } 938 default: 939 break; 940 } 941 return DecodeNeonAndAlign(); 942 } 943 944 DecodeNeonAndAlign Align_index_align_3_Decode(uint32_t value, DataType dt) { 945 switch (dt.GetValue()) { 946 case Untyped8: { 947 AlignmentType align; 948 if ((value & 1) == 1) { 949 align = k32BitAlign; 950 } else if ((value & 1) == 0) { 951 align = kNoAlignment; 952 } else { 953 break; 954 } 955 int lane = (value >> 1) & 0x7; 956 SpacingType spacing = kSingle; 957 return DecodeNeonAndAlign(lane, spacing, align); 958 } 959 case Untyped16: { 960 AlignmentType align; 961 if ((value & 1) == 1) { 962 align = k64BitAlign; 963 } else if ((value & 1) == 0) { 964 align = kNoAlignment; 965 } else { 966 break; 967 } 968 int lane = (value >> 2) & 0x3; 969 SpacingType spacing = ((value & 2) == 2) ? kDouble : kSingle; 970 return DecodeNeonAndAlign(lane, spacing, align); 971 } 972 case Untyped32: { 973 AlignmentType align; 974 if ((value & 3) == 1) { 975 align = k64BitAlign; 976 } else if ((value & 3) == 2) { 977 align = k128BitAlign; 978 } else if ((value & 3) == 0) { 979 align = kNoAlignment; 980 } else { 981 break; 982 } 983 int lane = (value >> 3) & 0x1; 984 SpacingType spacing = ((value & 4) == 4) ? kDouble : kSingle; 985 return DecodeNeonAndAlign(lane, spacing, align); 986 } 987 default: 988 break; 989 } 990 return DecodeNeonAndAlign(); 991 } 992 993 Alignment Align_a_1_Decode(uint32_t value, DataType dt) { 994 switch (value) { 995 case 0: 996 return kNoAlignment; 997 case 1: 998 if (dt.Is(Untyped16)) return k16BitAlign; 999 if (dt.Is(Untyped32)) return k32BitAlign; 1000 break; 1001 default: 1002 break; 1003 } 1004 return kBadAlignment; 1005 } 1006 1007 Alignment Align_a_2_Decode(uint32_t value, DataType dt) { 1008 switch (value) { 1009 case 0: 1010 return kNoAlignment; 1011 case 1: 1012 if (dt.Is(Untyped8)) return k16BitAlign; 1013 if (dt.Is(Untyped16)) return k32BitAlign; 1014 if (dt.Is(Untyped32)) return k64BitAlign; 1015 break; 1016 default: 1017 break; 1018 } 1019 return kBadAlignment; 1020 } 1021 1022 Alignment Align_a_3_Decode(uint32_t value, DataType dt, uint32_t size) { 1023 switch (value) { 1024 case 0: 1025 if (size != 3) return kNoAlignment; 1026 break; 1027 case 1: 1028 if (dt.Is(Untyped8)) return k32BitAlign; 1029 if (dt.Is(Untyped16)) return k64BitAlign; 1030 if (size == 2) return k64BitAlign; 1031 if (size == 3) return k128BitAlign; 1032 break; 1033 default: 1034 break; 1035 } 1036 return kBadAlignment; 1037 } 1038 1039 Alignment Align_align_1_Decode(uint32_t value) { 1040 switch (value) { 1041 case 0: 1042 return kNoAlignment; 1043 case 1: 1044 return k64BitAlign; 1045 case 2: 1046 return k128BitAlign; 1047 case 3: 1048 return k256BitAlign; 1049 default: 1050 break; 1051 } 1052 return kBadAlignment; 1053 } 1054 1055 Alignment Align_align_2_Decode(uint32_t value) { 1056 switch (value) { 1057 case 0: 1058 return kNoAlignment; 1059 case 1: 1060 return k64BitAlign; 1061 case 2: 1062 return k128BitAlign; 1063 case 3: 1064 return k256BitAlign; 1065 default: 1066 break; 1067 } 1068 return kBadAlignment; 1069 } 1070 1071 Alignment Align_align_3_Decode(uint32_t value) { 1072 switch (value) { 1073 case 0: 1074 return kNoAlignment; 1075 case 1: 1076 return k64BitAlign; 1077 default: 1078 break; 1079 } 1080 return kBadAlignment; 1081 } 1082 1083 Alignment Align_align_4_Decode(uint32_t value) { 1084 switch (value) { 1085 case 0: 1086 return kNoAlignment; 1087 case 1: 1088 return k64BitAlign; 1089 case 2: 1090 return k128BitAlign; 1091 case 3: 1092 return k256BitAlign; 1093 default: 1094 break; 1095 } 1096 return kBadAlignment; 1097 } 1098 1099 Alignment Align_align_5_Decode(uint32_t value) { 1100 switch (value) { 1101 case 0: 1102 return kNoAlignment; 1103 case 1: 1104 return k64BitAlign; 1105 case 2: 1106 return k128BitAlign; 1107 case 3: 1108 return k256BitAlign; 1109 default: 1110 break; 1111 } 1112 return kBadAlignment; 1113 } 1114 1115 1116 void Disassembler::adc(Condition cond, 1117 EncodingSize size, 1118 Register rd, 1119 Register rn, 1120 const Operand& operand) { 1121 os().SetCurrentInstruction(kAdc, kArithmetic); 1122 os() << ToCString(kAdc) << ConditionPrinter(it_block_, cond) << size; 1123 os() << " "; 1124 if (!rd.Is(rn)) { 1125 os() << rd << ", "; 1126 } 1127 os() << rn << ", " << operand; 1128 } 1129 1130 void Disassembler::adcs(Condition cond, 1131 EncodingSize size, 1132 Register rd, 1133 Register rn, 1134 const Operand& operand) { 1135 os().SetCurrentInstruction(kAdcs, kArithmetic); 1136 os() << ToCString(kAdcs) << ConditionPrinter(it_block_, cond) << size; 1137 os() << " "; 1138 if (!rd.Is(rn)) { 1139 os() << rd << ", "; 1140 } 1141 os() << rn << ", " << operand; 1142 } 1143 1144 void Disassembler::add(Condition cond, 1145 EncodingSize size, 1146 Register rd, 1147 Register rn, 1148 const Operand& operand) { 1149 os().SetCurrentInstruction(kAdd, kArithmetic); 1150 os() << ToCString(kAdd) << ConditionPrinter(it_block_, cond) << size; 1151 os() << " "; 1152 if (!rd.Is(rn)) { 1153 os() << rd << ", "; 1154 } 1155 os() << rn << ", " << operand; 1156 } 1157 1158 void Disassembler::add(Condition cond, Register rd, const Operand& operand) { 1159 os().SetCurrentInstruction(kAdd, kArithmetic); 1160 os() << ToCString(kAdd) << ConditionPrinter(it_block_, cond) << " " << rd 1161 << ", " << operand; 1162 } 1163 1164 void Disassembler::adds(Condition cond, 1165 EncodingSize size, 1166 Register rd, 1167 Register rn, 1168 const Operand& operand) { 1169 os().SetCurrentInstruction(kAdds, kArithmetic); 1170 os() << ToCString(kAdds) << ConditionPrinter(it_block_, cond) << size; 1171 os() << " "; 1172 if (!rd.Is(rn)) { 1173 os() << rd << ", "; 1174 } 1175 os() << rn << ", " << operand; 1176 } 1177 1178 void Disassembler::adds(Register rd, const Operand& operand) { 1179 os().SetCurrentInstruction(kAdds, kArithmetic); 1180 os() << ToCString(kAdds) << " " << rd << ", " << operand; 1181 } 1182 1183 void Disassembler::addw(Condition cond, 1184 Register rd, 1185 Register rn, 1186 const Operand& operand) { 1187 os().SetCurrentInstruction(kAddw, kArithmetic); 1188 os() << ToCString(kAddw) << ConditionPrinter(it_block_, cond); 1189 os() << " "; 1190 if (!rd.Is(rn)) { 1191 os() << rd << ", "; 1192 } 1193 os() << rn << ", " << operand; 1194 } 1195 1196 void Disassembler::adr(Condition cond, 1197 EncodingSize size, 1198 Register rd, 1199 Label* label) { 1200 os().SetCurrentInstruction(kAdr, kAddress); 1201 os() << ToCString(kAdr) << ConditionPrinter(it_block_, cond) << size << " " 1202 << rd << ", " << PrintLabel(kAnyLocation, label, GetCodeAddress() & ~3); 1203 } 1204 1205 void Disassembler::and_(Condition cond, 1206 EncodingSize size, 1207 Register rd, 1208 Register rn, 1209 const Operand& operand) { 1210 os().SetCurrentInstruction(kAnd, kBitwise); 1211 os() << ToCString(kAnd) << ConditionPrinter(it_block_, cond) << size; 1212 os() << " "; 1213 if (!rd.Is(rn)) { 1214 os() << rd << ", "; 1215 } 1216 os() << rn << ", " << operand; 1217 } 1218 1219 void Disassembler::ands(Condition cond, 1220 EncodingSize size, 1221 Register rd, 1222 Register rn, 1223 const Operand& operand) { 1224 os().SetCurrentInstruction(kAnds, kBitwise); 1225 os() << ToCString(kAnds) << ConditionPrinter(it_block_, cond) << size; 1226 os() << " "; 1227 if (!rd.Is(rn)) { 1228 os() << rd << ", "; 1229 } 1230 os() << rn << ", " << operand; 1231 } 1232 1233 void Disassembler::asr(Condition cond, 1234 EncodingSize size, 1235 Register rd, 1236 Register rm, 1237 const Operand& operand) { 1238 os().SetCurrentInstruction(kAsr, kShift); 1239 os() << ToCString(kAsr) << ConditionPrinter(it_block_, cond) << size; 1240 os() << " "; 1241 if (!rd.Is(rm)) { 1242 os() << rd << ", "; 1243 } 1244 os() << rm << ", " << operand; 1245 } 1246 1247 void Disassembler::asrs(Condition cond, 1248 EncodingSize size, 1249 Register rd, 1250 Register rm, 1251 const Operand& operand) { 1252 os().SetCurrentInstruction(kAsrs, kShift); 1253 os() << ToCString(kAsrs) << ConditionPrinter(it_block_, cond) << size; 1254 os() << " "; 1255 if (!rd.Is(rm)) { 1256 os() << rd << ", "; 1257 } 1258 os() << rm << ", " << operand; 1259 } 1260 1261 void Disassembler::b(Condition cond, EncodingSize size, Label* label) { 1262 os().SetCurrentInstruction(kB, kAddress | kBranch); 1263 os() << ToCString(kB) << ConditionPrinter(it_block_, cond) << size << " " 1264 << PrintLabel(kCodeLocation, label, GetCodeAddress()); 1265 } 1266 1267 void Disassembler::bfc(Condition cond, 1268 Register rd, 1269 uint32_t lsb, 1270 const Operand& operand) { 1271 os().SetCurrentInstruction(kBfc, kShift); 1272 os() << ToCString(kBfc) << ConditionPrinter(it_block_, cond) << " " << rd 1273 << ", " 1274 << "#" << lsb << ", " << operand; 1275 } 1276 1277 void Disassembler::bfi(Condition cond, 1278 Register rd, 1279 Register rn, 1280 uint32_t lsb, 1281 const Operand& operand) { 1282 os().SetCurrentInstruction(kBfi, kShift); 1283 os() << ToCString(kBfi) << ConditionPrinter(it_block_, cond) << " " << rd 1284 << ", " << rn << ", " 1285 << "#" << lsb << ", " << operand; 1286 } 1287 1288 void Disassembler::bic(Condition cond, 1289 EncodingSize size, 1290 Register rd, 1291 Register rn, 1292 const Operand& operand) { 1293 os().SetCurrentInstruction(kBic, kBitwise); 1294 os() << ToCString(kBic) << ConditionPrinter(it_block_, cond) << size; 1295 os() << " "; 1296 if (!rd.Is(rn)) { 1297 os() << rd << ", "; 1298 } 1299 os() << rn << ", " << operand; 1300 } 1301 1302 void Disassembler::bics(Condition cond, 1303 EncodingSize size, 1304 Register rd, 1305 Register rn, 1306 const Operand& operand) { 1307 os().SetCurrentInstruction(kBics, kBitwise); 1308 os() << ToCString(kBics) << ConditionPrinter(it_block_, cond) << size; 1309 os() << " "; 1310 if (!rd.Is(rn)) { 1311 os() << rd << ", "; 1312 } 1313 os() << rn << ", " << operand; 1314 } 1315 1316 void Disassembler::bkpt(Condition cond, uint32_t imm) { 1317 os().SetCurrentInstruction(kBkpt, kSystem); 1318 os() << ToCString(kBkpt) << ConditionPrinter(it_block_, cond) << " " << imm; 1319 } 1320 1321 void Disassembler::bl(Condition cond, Label* label) { 1322 os().SetCurrentInstruction(kBl, kAddress | kBranch); 1323 os() << ToCString(kBl) << ConditionPrinter(it_block_, cond) << " " 1324 << PrintLabel(kCodeLocation, label, GetCodeAddress()); 1325 } 1326 1327 void Disassembler::blx(Condition cond, Label* label) { 1328 os().SetCurrentInstruction(kBlx, kAddress | kBranch); 1329 os() << ToCString(kBlx) << ConditionPrinter(it_block_, cond) << " " 1330 << PrintLabel(kCodeLocation, label, GetCodeAddress() & ~3); 1331 } 1332 1333 void Disassembler::blx(Condition cond, Register rm) { 1334 os().SetCurrentInstruction(kBlx, kAddress | kBranch); 1335 os() << ToCString(kBlx) << ConditionPrinter(it_block_, cond) << " " << rm; 1336 } 1337 1338 void Disassembler::bx(Condition cond, Register rm) { 1339 os().SetCurrentInstruction(kBx, kAddress | kBranch); 1340 os() << ToCString(kBx) << ConditionPrinter(it_block_, cond) << " " << rm; 1341 } 1342 1343 void Disassembler::bxj(Condition cond, Register rm) { 1344 os().SetCurrentInstruction(kBxj, kAddress | kBranch); 1345 os() << ToCString(kBxj) << ConditionPrinter(it_block_, cond) << " " << rm; 1346 } 1347 1348 void Disassembler::cbnz(Register rn, Label* label) { 1349 os().SetCurrentInstruction(kCbnz, kAddress | kBranch); 1350 os() << ToCString(kCbnz) << " " << rn << ", " 1351 << PrintLabel(kCodeLocation, label, GetCodeAddress()); 1352 } 1353 1354 void Disassembler::cbz(Register rn, Label* label) { 1355 os().SetCurrentInstruction(kCbz, kAddress | kBranch); 1356 os() << ToCString(kCbz) << " " << rn << ", " 1357 << PrintLabel(kCodeLocation, label, GetCodeAddress()); 1358 } 1359 1360 void Disassembler::clrex(Condition cond) { 1361 os().SetCurrentInstruction(kClrex, kNoAttribute); 1362 os() << ToCString(kClrex) << ConditionPrinter(it_block_, cond); 1363 } 1364 1365 void Disassembler::clz(Condition cond, Register rd, Register rm) { 1366 os().SetCurrentInstruction(kClz, kNoAttribute); 1367 os() << ToCString(kClz) << ConditionPrinter(it_block_, cond) << " " << rd 1368 << ", " << rm; 1369 } 1370 1371 void Disassembler::cmn(Condition cond, 1372 EncodingSize size, 1373 Register rn, 1374 const Operand& operand) { 1375 os().SetCurrentInstruction(kCmn, kArithmetic); 1376 os() << ToCString(kCmn) << ConditionPrinter(it_block_, cond) << size << " " 1377 << rn << ", " << operand; 1378 } 1379 1380 void Disassembler::cmp(Condition cond, 1381 EncodingSize size, 1382 Register rn, 1383 const Operand& operand) { 1384 os().SetCurrentInstruction(kCmp, kArithmetic); 1385 os() << ToCString(kCmp) << ConditionPrinter(it_block_, cond) << size << " " 1386 << rn << ", " << operand; 1387 } 1388 1389 void Disassembler::crc32b(Condition cond, 1390 Register rd, 1391 Register rn, 1392 Register rm) { 1393 os().SetCurrentInstruction(kCrc32b, kNoAttribute); 1394 os() << ToCString(kCrc32b) << ConditionPrinter(it_block_, cond) << " " << rd 1395 << ", " << rn << ", " << rm; 1396 } 1397 1398 void Disassembler::crc32cb(Condition cond, 1399 Register rd, 1400 Register rn, 1401 Register rm) { 1402 os().SetCurrentInstruction(kCrc32cb, kNoAttribute); 1403 os() << ToCString(kCrc32cb) << ConditionPrinter(it_block_, cond) << " " << rd 1404 << ", " << rn << ", " << rm; 1405 } 1406 1407 void Disassembler::crc32ch(Condition cond, 1408 Register rd, 1409 Register rn, 1410 Register rm) { 1411 os().SetCurrentInstruction(kCrc32ch, kNoAttribute); 1412 os() << ToCString(kCrc32ch) << ConditionPrinter(it_block_, cond) << " " << rd 1413 << ", " << rn << ", " << rm; 1414 } 1415 1416 void Disassembler::crc32cw(Condition cond, 1417 Register rd, 1418 Register rn, 1419 Register rm) { 1420 os().SetCurrentInstruction(kCrc32cw, kNoAttribute); 1421 os() << ToCString(kCrc32cw) << ConditionPrinter(it_block_, cond) << " " << rd 1422 << ", " << rn << ", " << rm; 1423 } 1424 1425 void Disassembler::crc32h(Condition cond, 1426 Register rd, 1427 Register rn, 1428 Register rm) { 1429 os().SetCurrentInstruction(kCrc32h, kNoAttribute); 1430 os() << ToCString(kCrc32h) << ConditionPrinter(it_block_, cond) << " " << rd 1431 << ", " << rn << ", " << rm; 1432 } 1433 1434 void Disassembler::crc32w(Condition cond, 1435 Register rd, 1436 Register rn, 1437 Register rm) { 1438 os().SetCurrentInstruction(kCrc32w, kNoAttribute); 1439 os() << ToCString(kCrc32w) << ConditionPrinter(it_block_, cond) << " " << rd 1440 << ", " << rn << ", " << rm; 1441 } 1442 1443 void Disassembler::dmb(Condition cond, MemoryBarrier option) { 1444 os().SetCurrentInstruction(kDmb, kNoAttribute); 1445 os() << ToCString(kDmb) << ConditionPrinter(it_block_, cond) << " " << option; 1446 } 1447 1448 void Disassembler::dsb(Condition cond, MemoryBarrier option) { 1449 os().SetCurrentInstruction(kDsb, kNoAttribute); 1450 os() << ToCString(kDsb) << ConditionPrinter(it_block_, cond) << " " << option; 1451 } 1452 1453 void Disassembler::eor(Condition cond, 1454 EncodingSize size, 1455 Register rd, 1456 Register rn, 1457 const Operand& operand) { 1458 os().SetCurrentInstruction(kEor, kBitwise); 1459 os() << ToCString(kEor) << ConditionPrinter(it_block_, cond) << size; 1460 os() << " "; 1461 if (!rd.Is(rn)) { 1462 os() << rd << ", "; 1463 } 1464 os() << rn << ", " << operand; 1465 } 1466 1467 void Disassembler::eors(Condition cond, 1468 EncodingSize size, 1469 Register rd, 1470 Register rn, 1471 const Operand& operand) { 1472 os().SetCurrentInstruction(kEors, kBitwise); 1473 os() << ToCString(kEors) << ConditionPrinter(it_block_, cond) << size; 1474 os() << " "; 1475 if (!rd.Is(rn)) { 1476 os() << rd << ", "; 1477 } 1478 os() << rn << ", " << operand; 1479 } 1480 1481 void Disassembler::fldmdbx(Condition cond, 1482 Register rn, 1483 WriteBack write_back, 1484 DRegisterList dreglist) { 1485 os().SetCurrentInstruction(kFldmdbx, 1486 kLoadStore | kLoadStoreMultiple | kFpNeon); 1487 os() << ToCString(kFldmdbx) << ConditionPrinter(it_block_, cond) << " " << rn 1488 << write_back << ", " << dreglist; 1489 } 1490 1491 void Disassembler::fldmiax(Condition cond, 1492 Register rn, 1493 WriteBack write_back, 1494 DRegisterList dreglist) { 1495 os().SetCurrentInstruction(kFldmiax, 1496 kLoadStore | kLoadStoreMultiple | kFpNeon); 1497 os() << ToCString(kFldmiax) << ConditionPrinter(it_block_, cond) << " " << rn 1498 << write_back << ", " << dreglist; 1499 } 1500 1501 void Disassembler::fstmdbx(Condition cond, 1502 Register rn, 1503 WriteBack write_back, 1504 DRegisterList dreglist) { 1505 os().SetCurrentInstruction(kFstmdbx, 1506 kLoadStore | kLoadStoreMultiple | kFpNeon); 1507 os() << ToCString(kFstmdbx) << ConditionPrinter(it_block_, cond) << " " << rn 1508 << write_back << ", " << dreglist; 1509 } 1510 1511 void Disassembler::fstmiax(Condition cond, 1512 Register rn, 1513 WriteBack write_back, 1514 DRegisterList dreglist) { 1515 os().SetCurrentInstruction(kFstmiax, 1516 kLoadStore | kLoadStoreMultiple | kFpNeon); 1517 os() << ToCString(kFstmiax) << ConditionPrinter(it_block_, cond) << " " << rn 1518 << write_back << ", " << dreglist; 1519 } 1520 1521 void Disassembler::hlt(Condition cond, uint32_t imm) { 1522 os().SetCurrentInstruction(kHlt, kSystem); 1523 os() << ToCString(kHlt) << ConditionPrinter(it_block_, cond) << " " << imm; 1524 } 1525 1526 void Disassembler::hvc(Condition cond, uint32_t imm) { 1527 os().SetCurrentInstruction(kHvc, kSystem); 1528 os() << ToCString(kHvc) << ConditionPrinter(it_block_, cond) << " " << imm; 1529 } 1530 1531 void Disassembler::isb(Condition cond, MemoryBarrier option) { 1532 os().SetCurrentInstruction(kIsb, kNoAttribute); 1533 os() << ToCString(kIsb) << ConditionPrinter(it_block_, cond) << " " << option; 1534 } 1535 1536 void Disassembler::it(Condition cond, uint16_t mask) { 1537 os().SetCurrentInstruction(kIt, kNoAttribute); 1538 os() << ToCString(kIt); 1539 int count; 1540 if ((mask & 0x1) != 0) { 1541 count = 3; 1542 } else if ((mask & 0x2) != 0) { 1543 count = 2; 1544 } else if ((mask & 0x4) != 0) { 1545 count = 1; 1546 } else { 1547 count = 0; 1548 } 1549 uint16_t tmp = 0x8; 1550 uint16_t ref = (cond.GetCondition() & 0x1) << 3; 1551 while (count-- > 0) { 1552 os() << (((mask & tmp) == ref) ? "t" : "e"); 1553 tmp >>= 1; 1554 ref >>= 1; 1555 } 1556 if (cond.Is(al)) { 1557 os() << " al"; 1558 } else { 1559 os() << " " << cond; 1560 } 1561 } 1562 1563 void Disassembler::lda(Condition cond, Register rt, const MemOperand& operand) { 1564 os().SetCurrentInstruction(kLda, kAddress | kLoadStore); 1565 os() << ToCString(kLda) << ConditionPrinter(it_block_, cond) << " " << rt 1566 << ", " << PrintMemOperand(kLoadWordLocation, operand); 1567 } 1568 1569 void Disassembler::ldab(Condition cond, 1570 Register rt, 1571 const MemOperand& operand) { 1572 os().SetCurrentInstruction(kLdab, kAddress | kLoadStore); 1573 os() << ToCString(kLdab) << ConditionPrinter(it_block_, cond) << " " << rt 1574 << ", " << PrintMemOperand(kLoadByteLocation, operand); 1575 } 1576 1577 void Disassembler::ldaex(Condition cond, 1578 Register rt, 1579 const MemOperand& operand) { 1580 os().SetCurrentInstruction(kLdaex, kAddress | kLoadStore); 1581 os() << ToCString(kLdaex) << ConditionPrinter(it_block_, cond) << " " << rt 1582 << ", " << PrintMemOperand(kLoadWordLocation, operand); 1583 } 1584 1585 void Disassembler::ldaexb(Condition cond, 1586 Register rt, 1587 const MemOperand& operand) { 1588 os().SetCurrentInstruction(kLdaexb, kAddress | kLoadStore); 1589 os() << ToCString(kLdaexb) << ConditionPrinter(it_block_, cond) << " " << rt 1590 << ", " << PrintMemOperand(kLoadByteLocation, operand); 1591 } 1592 1593 void Disassembler::ldaexd(Condition cond, 1594 Register rt, 1595 Register rt2, 1596 const MemOperand& operand) { 1597 os().SetCurrentInstruction(kLdaexd, kAddress | kLoadStore); 1598 os() << ToCString(kLdaexd) << ConditionPrinter(it_block_, cond) << " " << rt 1599 << ", " << rt2 << ", " 1600 << PrintMemOperand(kLoadDoubleWordLocation, operand); 1601 } 1602 1603 void Disassembler::ldaexh(Condition cond, 1604 Register rt, 1605 const MemOperand& operand) { 1606 os().SetCurrentInstruction(kLdaexh, kAddress | kLoadStore); 1607 os() << ToCString(kLdaexh) << ConditionPrinter(it_block_, cond) << " " << rt 1608 << ", " << PrintMemOperand(kLoadHalfWordLocation, operand); 1609 } 1610 1611 void Disassembler::ldah(Condition cond, 1612 Register rt, 1613 const MemOperand& operand) { 1614 os().SetCurrentInstruction(kLdah, kAddress | kLoadStore); 1615 os() << ToCString(kLdah) << ConditionPrinter(it_block_, cond) << " " << rt 1616 << ", " << PrintMemOperand(kLoadHalfWordLocation, operand); 1617 } 1618 1619 void Disassembler::ldm(Condition cond, 1620 EncodingSize size, 1621 Register rn, 1622 WriteBack write_back, 1623 RegisterList registers) { 1624 os().SetCurrentInstruction(kLdm, kLoadStore | kLoadStoreMultiple); 1625 os() << ToCString(kLdm) << ConditionPrinter(it_block_, cond) << size << " " 1626 << rn << write_back << ", " << registers; 1627 } 1628 1629 void Disassembler::ldmda(Condition cond, 1630 Register rn, 1631 WriteBack write_back, 1632 RegisterList registers) { 1633 os().SetCurrentInstruction(kLdmda, kLoadStore | kLoadStoreMultiple); 1634 os() << ToCString(kLdmda) << ConditionPrinter(it_block_, cond) << " " << rn 1635 << write_back << ", " << registers; 1636 } 1637 1638 void Disassembler::ldmdb(Condition cond, 1639 Register rn, 1640 WriteBack write_back, 1641 RegisterList registers) { 1642 os().SetCurrentInstruction(kLdmdb, kLoadStore | kLoadStoreMultiple); 1643 os() << ToCString(kLdmdb) << ConditionPrinter(it_block_, cond) << " " << rn 1644 << write_back << ", " << registers; 1645 } 1646 1647 void Disassembler::ldmea(Condition cond, 1648 Register rn, 1649 WriteBack write_back, 1650 RegisterList registers) { 1651 os().SetCurrentInstruction(kLdmea, kLoadStore | kLoadStoreMultiple); 1652 os() << ToCString(kLdmea) << ConditionPrinter(it_block_, cond) << " " << rn 1653 << write_back << ", " << registers; 1654 } 1655 1656 void Disassembler::ldmed(Condition cond, 1657 Register rn, 1658 WriteBack write_back, 1659 RegisterList registers) { 1660 os().SetCurrentInstruction(kLdmed, kLoadStore | kLoadStoreMultiple); 1661 os() << ToCString(kLdmed) << ConditionPrinter(it_block_, cond) << " " << rn 1662 << write_back << ", " << registers; 1663 } 1664 1665 void Disassembler::ldmfa(Condition cond, 1666 Register rn, 1667 WriteBack write_back, 1668 RegisterList registers) { 1669 os().SetCurrentInstruction(kLdmfa, kLoadStore | kLoadStoreMultiple); 1670 os() << ToCString(kLdmfa) << ConditionPrinter(it_block_, cond) << " " << rn 1671 << write_back << ", " << registers; 1672 } 1673 1674 void Disassembler::ldmfd(Condition cond, 1675 EncodingSize size, 1676 Register rn, 1677 WriteBack write_back, 1678 RegisterList registers) { 1679 os().SetCurrentInstruction(kLdmfd, kLoadStore | kLoadStoreMultiple); 1680 os() << ToCString(kLdmfd) << ConditionPrinter(it_block_, cond) << size << " " 1681 << rn << write_back << ", " << registers; 1682 } 1683 1684 void Disassembler::ldmib(Condition cond, 1685 Register rn, 1686 WriteBack write_back, 1687 RegisterList registers) { 1688 os().SetCurrentInstruction(kLdmib, kLoadStore | kLoadStoreMultiple); 1689 os() << ToCString(kLdmib) << ConditionPrinter(it_block_, cond) << " " << rn 1690 << write_back << ", " << registers; 1691 } 1692 1693 void Disassembler::ldr(Condition cond, 1694 EncodingSize size, 1695 Register rt, 1696 const MemOperand& operand) { 1697 os().SetCurrentInstruction(kLdr, kAddress | kLoadStore); 1698 os() << ToCString(kLdr) << ConditionPrinter(it_block_, cond) << size << " " 1699 << rt << ", " << PrintMemOperand(kLoadWordLocation, operand); 1700 } 1701 1702 void Disassembler::ldr(Condition cond, 1703 EncodingSize size, 1704 Register rt, 1705 Label* label) { 1706 os().SetCurrentInstruction(kLdr, kAddress | kLoadStore); 1707 os() << ToCString(kLdr) << ConditionPrinter(it_block_, cond) << size << " " 1708 << rt << ", " 1709 << PrintLabel(kLoadWordLocation, label, GetCodeAddress() & ~3); 1710 } 1711 1712 void Disassembler::ldrb(Condition cond, 1713 EncodingSize size, 1714 Register rt, 1715 const MemOperand& operand) { 1716 os().SetCurrentInstruction(kLdrb, kAddress | kLoadStore); 1717 os() << ToCString(kLdrb) << ConditionPrinter(it_block_, cond) << size << " " 1718 << rt << ", " << PrintMemOperand(kLoadByteLocation, operand); 1719 } 1720 1721 void Disassembler::ldrb(Condition cond, Register rt, Label* label) { 1722 os().SetCurrentInstruction(kLdrb, kAddress | kLoadStore); 1723 os() << ToCString(kLdrb) << ConditionPrinter(it_block_, cond) << " " << rt 1724 << ", " << PrintLabel(kLoadByteLocation, label, GetCodeAddress() & ~3); 1725 } 1726 1727 void Disassembler::ldrd(Condition cond, 1728 Register rt, 1729 Register rt2, 1730 const MemOperand& operand) { 1731 os().SetCurrentInstruction(kLdrd, kAddress | kLoadStore); 1732 os() << ToCString(kLdrd) << ConditionPrinter(it_block_, cond) << " " << rt 1733 << ", " << rt2 << ", " 1734 << PrintMemOperand(kLoadDoubleWordLocation, operand); 1735 } 1736 1737 void Disassembler::ldrd(Condition cond, 1738 Register rt, 1739 Register rt2, 1740 Label* label) { 1741 os().SetCurrentInstruction(kLdrd, kAddress | kLoadStore); 1742 os() << ToCString(kLdrd) << ConditionPrinter(it_block_, cond) << " " << rt 1743 << ", " << rt2 << ", " 1744 << PrintLabel(kLoadDoubleWordLocation, label, GetCodeAddress() & ~3); 1745 } 1746 1747 void Disassembler::ldrex(Condition cond, 1748 Register rt, 1749 const MemOperand& operand) { 1750 os().SetCurrentInstruction(kLdrex, kAddress | kLoadStore); 1751 os() << ToCString(kLdrex) << ConditionPrinter(it_block_, cond) << " " << rt 1752 << ", " << PrintMemOperand(kLoadWordLocation, operand); 1753 } 1754 1755 void Disassembler::ldrexb(Condition cond, 1756 Register rt, 1757 const MemOperand& operand) { 1758 os().SetCurrentInstruction(kLdrexb, kAddress | kLoadStore); 1759 os() << ToCString(kLdrexb) << ConditionPrinter(it_block_, cond) << " " << rt 1760 << ", " << PrintMemOperand(kLoadByteLocation, operand); 1761 } 1762 1763 void Disassembler::ldrexd(Condition cond, 1764 Register rt, 1765 Register rt2, 1766 const MemOperand& operand) { 1767 os().SetCurrentInstruction(kLdrexd, kAddress | kLoadStore); 1768 os() << ToCString(kLdrexd) << ConditionPrinter(it_block_, cond) << " " << rt 1769 << ", " << rt2 << ", " 1770 << PrintMemOperand(kLoadDoubleWordLocation, operand); 1771 } 1772 1773 void Disassembler::ldrexh(Condition cond, 1774 Register rt, 1775 const MemOperand& operand) { 1776 os().SetCurrentInstruction(kLdrexh, kAddress | kLoadStore); 1777 os() << ToCString(kLdrexh) << ConditionPrinter(it_block_, cond) << " " << rt 1778 << ", " << PrintMemOperand(kLoadHalfWordLocation, operand); 1779 } 1780 1781 void Disassembler::ldrh(Condition cond, 1782 EncodingSize size, 1783 Register rt, 1784 const MemOperand& operand) { 1785 os().SetCurrentInstruction(kLdrh, kAddress | kLoadStore); 1786 os() << ToCString(kLdrh) << ConditionPrinter(it_block_, cond) << size << " " 1787 << rt << ", " << PrintMemOperand(kLoadHalfWordLocation, operand); 1788 } 1789 1790 void Disassembler::ldrh(Condition cond, Register rt, Label* label) { 1791 os().SetCurrentInstruction(kLdrh, kAddress | kLoadStore); 1792 os() << ToCString(kLdrh) << ConditionPrinter(it_block_, cond) << " " << rt 1793 << ", " 1794 << PrintLabel(kLoadHalfWordLocation, label, GetCodeAddress() & ~3); 1795 } 1796 1797 void Disassembler::ldrsb(Condition cond, 1798 EncodingSize size, 1799 Register rt, 1800 const MemOperand& operand) { 1801 os().SetCurrentInstruction(kLdrsb, kAddress | kLoadStore); 1802 os() << ToCString(kLdrsb) << ConditionPrinter(it_block_, cond) << size << " " 1803 << rt << ", " << PrintMemOperand(kLoadSignedByteLocation, operand); 1804 } 1805 1806 void Disassembler::ldrsb(Condition cond, Register rt, Label* label) { 1807 os().SetCurrentInstruction(kLdrsb, kAddress | kLoadStore); 1808 os() << ToCString(kLdrsb) << ConditionPrinter(it_block_, cond) << " " << rt 1809 << ", " 1810 << PrintLabel(kLoadSignedByteLocation, label, GetCodeAddress() & ~3); 1811 } 1812 1813 void Disassembler::ldrsh(Condition cond, 1814 EncodingSize size, 1815 Register rt, 1816 const MemOperand& operand) { 1817 os().SetCurrentInstruction(kLdrsh, kAddress | kLoadStore); 1818 os() << ToCString(kLdrsh) << ConditionPrinter(it_block_, cond) << size << " " 1819 << rt << ", " << PrintMemOperand(kLoadSignedHalfWordLocation, operand); 1820 } 1821 1822 void Disassembler::ldrsh(Condition cond, Register rt, Label* label) { 1823 os().SetCurrentInstruction(kLdrsh, kAddress | kLoadStore); 1824 os() << ToCString(kLdrsh) << ConditionPrinter(it_block_, cond) << " " << rt 1825 << ", " 1826 << PrintLabel(kLoadSignedHalfWordLocation, label, GetCodeAddress() & ~3); 1827 } 1828 1829 void Disassembler::lsl(Condition cond, 1830 EncodingSize size, 1831 Register rd, 1832 Register rm, 1833 const Operand& operand) { 1834 os().SetCurrentInstruction(kLsl, kShift); 1835 os() << ToCString(kLsl) << ConditionPrinter(it_block_, cond) << size; 1836 os() << " "; 1837 if (!rd.Is(rm)) { 1838 os() << rd << ", "; 1839 } 1840 os() << rm << ", " << operand; 1841 } 1842 1843 void Disassembler::lsls(Condition cond, 1844 EncodingSize size, 1845 Register rd, 1846 Register rm, 1847 const Operand& operand) { 1848 os().SetCurrentInstruction(kLsls, kShift); 1849 os() << ToCString(kLsls) << ConditionPrinter(it_block_, cond) << size; 1850 os() << " "; 1851 if (!rd.Is(rm)) { 1852 os() << rd << ", "; 1853 } 1854 os() << rm << ", " << operand; 1855 } 1856 1857 void Disassembler::lsr(Condition cond, 1858 EncodingSize size, 1859 Register rd, 1860 Register rm, 1861 const Operand& operand) { 1862 os().SetCurrentInstruction(kLsr, kShift); 1863 os() << ToCString(kLsr) << ConditionPrinter(it_block_, cond) << size; 1864 os() << " "; 1865 if (!rd.Is(rm)) { 1866 os() << rd << ", "; 1867 } 1868 os() << rm << ", " << operand; 1869 } 1870 1871 void Disassembler::lsrs(Condition cond, 1872 EncodingSize size, 1873 Register rd, 1874 Register rm, 1875 const Operand& operand) { 1876 os().SetCurrentInstruction(kLsrs, kShift); 1877 os() << ToCString(kLsrs) << ConditionPrinter(it_block_, cond) << size; 1878 os() << " "; 1879 if (!rd.Is(rm)) { 1880 os() << rd << ", "; 1881 } 1882 os() << rm << ", " << operand; 1883 } 1884 1885 void Disassembler::mla( 1886 Condition cond, Register rd, Register rn, Register rm, Register ra) { 1887 os().SetCurrentInstruction(kMla, kArithmetic); 1888 os() << ToCString(kMla) << ConditionPrinter(it_block_, cond) << " " << rd 1889 << ", " << rn << ", " << rm << ", " << ra; 1890 } 1891 1892 void Disassembler::mlas( 1893 Condition cond, Register rd, Register rn, Register rm, Register ra) { 1894 os().SetCurrentInstruction(kMlas, kArithmetic); 1895 os() << ToCString(kMlas) << ConditionPrinter(it_block_, cond) << " " << rd 1896 << ", " << rn << ", " << rm << ", " << ra; 1897 } 1898 1899 void Disassembler::mls( 1900 Condition cond, Register rd, Register rn, Register rm, Register ra) { 1901 os().SetCurrentInstruction(kMls, kArithmetic); 1902 os() << ToCString(kMls) << ConditionPrinter(it_block_, cond) << " " << rd 1903 << ", " << rn << ", " << rm << ", " << ra; 1904 } 1905 1906 void Disassembler::mov(Condition cond, 1907 EncodingSize size, 1908 Register rd, 1909 const Operand& operand) { 1910 os().SetCurrentInstruction(kMov, kNoAttribute); 1911 os() << ToCString(kMov) << ConditionPrinter(it_block_, cond) << size << " " 1912 << rd << ", " << operand; 1913 } 1914 1915 void Disassembler::movs(Condition cond, 1916 EncodingSize size, 1917 Register rd, 1918 const Operand& operand) { 1919 os().SetCurrentInstruction(kMovs, kNoAttribute); 1920 os() << ToCString(kMovs) << ConditionPrinter(it_block_, cond) << size << " " 1921 << rd << ", " << operand; 1922 } 1923 1924 void Disassembler::movt(Condition cond, Register rd, const Operand& operand) { 1925 os().SetCurrentInstruction(kMovt, kNoAttribute); 1926 os() << ToCString(kMovt) << ConditionPrinter(it_block_, cond) << " " << rd 1927 << ", " << operand; 1928 } 1929 1930 void Disassembler::movw(Condition cond, Register rd, const Operand& operand) { 1931 os().SetCurrentInstruction(kMovw, kNoAttribute); 1932 os() << ToCString(kMovw) << ConditionPrinter(it_block_, cond) << " " << rd 1933 << ", " << operand; 1934 } 1935 1936 void Disassembler::mrs(Condition cond, Register rd, SpecialRegister spec_reg) { 1937 os().SetCurrentInstruction(kMrs, kNoAttribute); 1938 os() << ToCString(kMrs) << ConditionPrinter(it_block_, cond) << " " << rd 1939 << ", " << spec_reg; 1940 } 1941 1942 void Disassembler::msr(Condition cond, 1943 MaskedSpecialRegister spec_reg, 1944 const Operand& operand) { 1945 os().SetCurrentInstruction(kMsr, kNoAttribute); 1946 os() << ToCString(kMsr) << ConditionPrinter(it_block_, cond) << " " 1947 << spec_reg << ", " << operand; 1948 } 1949 1950 void Disassembler::mul( 1951 Condition cond, EncodingSize size, Register rd, Register rn, Register rm) { 1952 os().SetCurrentInstruction(kMul, kArithmetic); 1953 os() << ToCString(kMul) << ConditionPrinter(it_block_, cond) << size << " " 1954 << rd << ", " << rn << ", " << rm; 1955 } 1956 1957 void Disassembler::muls(Condition cond, Register rd, Register rn, Register rm) { 1958 os().SetCurrentInstruction(kMuls, kArithmetic); 1959 os() << ToCString(kMuls) << ConditionPrinter(it_block_, cond) << " " << rd 1960 << ", " << rn << ", " << rm; 1961 } 1962 1963 void Disassembler::mvn(Condition cond, 1964 EncodingSize size, 1965 Register rd, 1966 const Operand& operand) { 1967 os().SetCurrentInstruction(kMvn, kNoAttribute); 1968 os() << ToCString(kMvn) << ConditionPrinter(it_block_, cond) << size << " " 1969 << rd << ", " << operand; 1970 } 1971 1972 void Disassembler::mvns(Condition cond, 1973 EncodingSize size, 1974 Register rd, 1975 const Operand& operand) { 1976 os().SetCurrentInstruction(kMvns, kNoAttribute); 1977 os() << ToCString(kMvns) << ConditionPrinter(it_block_, cond) << size << " " 1978 << rd << ", " << operand; 1979 } 1980 1981 void Disassembler::nop(Condition cond, EncodingSize size) { 1982 os().SetCurrentInstruction(kNop, kNoAttribute); 1983 os() << ToCString(kNop) << ConditionPrinter(it_block_, cond) << size; 1984 } 1985 1986 void Disassembler::orn(Condition cond, 1987 Register rd, 1988 Register rn, 1989 const Operand& operand) { 1990 os().SetCurrentInstruction(kOrn, kBitwise); 1991 os() << ToCString(kOrn) << ConditionPrinter(it_block_, cond); 1992 os() << " "; 1993 if (!rd.Is(rn)) { 1994 os() << rd << ", "; 1995 } 1996 os() << rn << ", " << operand; 1997 } 1998 1999 void Disassembler::orns(Condition cond, 2000 Register rd, 2001 Register rn, 2002 const Operand& operand) { 2003 os().SetCurrentInstruction(kOrns, kBitwise); 2004 os() << ToCString(kOrns) << ConditionPrinter(it_block_, cond); 2005 os() << " "; 2006 if (!rd.Is(rn)) { 2007 os() << rd << ", "; 2008 } 2009 os() << rn << ", " << operand; 2010 } 2011 2012 void Disassembler::orr(Condition cond, 2013 EncodingSize size, 2014 Register rd, 2015 Register rn, 2016 const Operand& operand) { 2017 os().SetCurrentInstruction(kOrr, kBitwise); 2018 os() << ToCString(kOrr) << ConditionPrinter(it_block_, cond) << size; 2019 os() << " "; 2020 if (!rd.Is(rn)) { 2021 os() << rd << ", "; 2022 } 2023 os() << rn << ", " << operand; 2024 } 2025 2026 void Disassembler::orrs(Condition cond, 2027 EncodingSize size, 2028 Register rd, 2029 Register rn, 2030 const Operand& operand) { 2031 os().SetCurrentInstruction(kOrrs, kBitwise); 2032 os() << ToCString(kOrrs) << ConditionPrinter(it_block_, cond) << size; 2033 os() << " "; 2034 if (!rd.Is(rn)) { 2035 os() << rd << ", "; 2036 } 2037 os() << rn << ", " << operand; 2038 } 2039 2040 void Disassembler::pkhbt(Condition cond, 2041 Register rd, 2042 Register rn, 2043 const Operand& operand) { 2044 os().SetCurrentInstruction(kPkhbt, kNoAttribute); 2045 os() << ToCString(kPkhbt) << ConditionPrinter(it_block_, cond); 2046 os() << " "; 2047 if (!rd.Is(rn)) { 2048 os() << rd << ", "; 2049 } 2050 os() << rn << ", " << operand; 2051 } 2052 2053 void Disassembler::pkhtb(Condition cond, 2054 Register rd, 2055 Register rn, 2056 const Operand& operand) { 2057 os().SetCurrentInstruction(kPkhtb, kNoAttribute); 2058 os() << ToCString(kPkhtb) << ConditionPrinter(it_block_, cond); 2059 os() << " "; 2060 if (!rd.Is(rn)) { 2061 os() << rd << ", "; 2062 } 2063 os() << rn << ", " << operand; 2064 } 2065 2066 void Disassembler::pld(Condition cond, Label* label) { 2067 os().SetCurrentInstruction(kPld, kAddress); 2068 os() << ToCString(kPld) << ConditionPrinter(it_block_, cond) << " " 2069 << PrintLabel(kDataLocation, label, GetCodeAddress() & ~3); 2070 } 2071 2072 void Disassembler::pld(Condition cond, const MemOperand& operand) { 2073 os().SetCurrentInstruction(kPld, kAddress); 2074 os() << ToCString(kPld) << ConditionPrinter(it_block_, cond) << " " 2075 << PrintMemOperand(kDataLocation, operand); 2076 } 2077 2078 void Disassembler::pldw(Condition cond, const MemOperand& operand) { 2079 os().SetCurrentInstruction(kPldw, kAddress); 2080 os() << ToCString(kPldw) << ConditionPrinter(it_block_, cond) << " " 2081 << PrintMemOperand(kDataLocation, operand); 2082 } 2083 2084 void Disassembler::pli(Condition cond, const MemOperand& operand) { 2085 os().SetCurrentInstruction(kPli, kAddress); 2086 os() << ToCString(kPli) << ConditionPrinter(it_block_, cond) << " " 2087 << PrintMemOperand(kCodeLocation, operand); 2088 } 2089 2090 void Disassembler::pli(Condition cond, Label* label) { 2091 os().SetCurrentInstruction(kPli, kAddress); 2092 os() << ToCString(kPli) << ConditionPrinter(it_block_, cond) << " " 2093 << PrintLabel(kCodeLocation, label, GetCodeAddress() & ~3); 2094 } 2095 2096 void Disassembler::pop(Condition cond, 2097 EncodingSize size, 2098 RegisterList registers) { 2099 os().SetCurrentInstruction(kPop, kLoadStore | kLoadStoreMultiple); 2100 os() << ToCString(kPop) << ConditionPrinter(it_block_, cond) << size << " " 2101 << registers; 2102 } 2103 2104 void Disassembler::pop(Condition cond, EncodingSize size, Register rt) { 2105 os().SetCurrentInstruction(kPop, kLoadStore | kLoadStoreMultiple); 2106 os() << ToCString(kPop) << ConditionPrinter(it_block_, cond) << size << " " 2107 << "{" << rt << "}"; 2108 } 2109 2110 void Disassembler::push(Condition cond, 2111 EncodingSize size, 2112 RegisterList registers) { 2113 os().SetCurrentInstruction(kPush, kLoadStore | kLoadStoreMultiple); 2114 os() << ToCString(kPush) << ConditionPrinter(it_block_, cond) << size << " " 2115 << registers; 2116 } 2117 2118 void Disassembler::push(Condition cond, EncodingSize size, Register rt) { 2119 os().SetCurrentInstruction(kPush, kLoadStore | kLoadStoreMultiple); 2120 os() << ToCString(kPush) << ConditionPrinter(it_block_, cond) << size << " " 2121 << "{" << rt << "}"; 2122 } 2123 2124 void Disassembler::qadd(Condition cond, Register rd, Register rm, Register rn) { 2125 os().SetCurrentInstruction(kQadd, kArithmetic); 2126 os() << ToCString(kQadd) << ConditionPrinter(it_block_, cond); 2127 os() << " "; 2128 if (!rd.Is(rm)) { 2129 os() << rd << ", "; 2130 } 2131 os() << rm << ", " << rn; 2132 } 2133 2134 void Disassembler::qadd16(Condition cond, 2135 Register rd, 2136 Register rn, 2137 Register rm) { 2138 os().SetCurrentInstruction(kQadd16, kArithmetic); 2139 os() << ToCString(kQadd16) << ConditionPrinter(it_block_, cond); 2140 os() << " "; 2141 if (!rd.Is(rn)) { 2142 os() << rd << ", "; 2143 } 2144 os() << rn << ", " << rm; 2145 } 2146 2147 void Disassembler::qadd8(Condition cond, 2148 Register rd, 2149 Register rn, 2150 Register rm) { 2151 os().SetCurrentInstruction(kQadd8, kArithmetic); 2152 os() << ToCString(kQadd8) << ConditionPrinter(it_block_, cond); 2153 os() << " "; 2154 if (!rd.Is(rn)) { 2155 os() << rd << ", "; 2156 } 2157 os() << rn << ", " << rm; 2158 } 2159 2160 void Disassembler::qasx(Condition cond, Register rd, Register rn, Register rm) { 2161 os().SetCurrentInstruction(kQasx, kArithmetic); 2162 os() << ToCString(kQasx) << ConditionPrinter(it_block_, cond); 2163 os() << " "; 2164 if (!rd.Is(rn)) { 2165 os() << rd << ", "; 2166 } 2167 os() << rn << ", " << rm; 2168 } 2169 2170 void Disassembler::qdadd(Condition cond, 2171 Register rd, 2172 Register rm, 2173 Register rn) { 2174 os().SetCurrentInstruction(kQdadd, kArithmetic); 2175 os() << ToCString(kQdadd) << ConditionPrinter(it_block_, cond); 2176 os() << " "; 2177 if (!rd.Is(rm)) { 2178 os() << rd << ", "; 2179 } 2180 os() << rm << ", " << rn; 2181 } 2182 2183 void Disassembler::qdsub(Condition cond, 2184 Register rd, 2185 Register rm, 2186 Register rn) { 2187 os().SetCurrentInstruction(kQdsub, kArithmetic); 2188 os() << ToCString(kQdsub) << ConditionPrinter(it_block_, cond); 2189 os() << " "; 2190 if (!rd.Is(rm)) { 2191 os() << rd << ", "; 2192 } 2193 os() << rm << ", " << rn; 2194 } 2195 2196 void Disassembler::qsax(Condition cond, Register rd, Register rn, Register rm) { 2197 os().SetCurrentInstruction(kQsax, kArithmetic); 2198 os() << ToCString(kQsax) << ConditionPrinter(it_block_, cond); 2199 os() << " "; 2200 if (!rd.Is(rn)) { 2201 os() << rd << ", "; 2202 } 2203 os() << rn << ", " << rm; 2204 } 2205 2206 void Disassembler::qsub(Condition cond, Register rd, Register rm, Register rn) { 2207 os().SetCurrentInstruction(kQsub, kArithmetic); 2208 os() << ToCString(kQsub) << ConditionPrinter(it_block_, cond); 2209 os() << " "; 2210 if (!rd.Is(rm)) { 2211 os() << rd << ", "; 2212 } 2213 os() << rm << ", " << rn; 2214 } 2215 2216 void Disassembler::qsub16(Condition cond, 2217 Register rd, 2218 Register rn, 2219 Register rm) { 2220 os().SetCurrentInstruction(kQsub16, kArithmetic); 2221 os() << ToCString(kQsub16) << ConditionPrinter(it_block_, cond); 2222 os() << " "; 2223 if (!rd.Is(rn)) { 2224 os() << rd << ", "; 2225 } 2226 os() << rn << ", " << rm; 2227 } 2228 2229 void Disassembler::qsub8(Condition cond, 2230 Register rd, 2231 Register rn, 2232 Register rm) { 2233 os().SetCurrentInstruction(kQsub8, kArithmetic); 2234 os() << ToCString(kQsub8) << ConditionPrinter(it_block_, cond); 2235 os() << " "; 2236 if (!rd.Is(rn)) { 2237 os() << rd << ", "; 2238 } 2239 os() << rn << ", " << rm; 2240 } 2241 2242 void Disassembler::rbit(Condition cond, Register rd, Register rm) { 2243 os().SetCurrentInstruction(kRbit, kNoAttribute); 2244 os() << ToCString(kRbit) << ConditionPrinter(it_block_, cond) << " " << rd 2245 << ", " << rm; 2246 } 2247 2248 void Disassembler::rev(Condition cond, 2249 EncodingSize size, 2250 Register rd, 2251 Register rm) { 2252 os().SetCurrentInstruction(kRev, kNoAttribute); 2253 os() << ToCString(kRev) << ConditionPrinter(it_block_, cond) << size << " " 2254 << rd << ", " << rm; 2255 } 2256 2257 void Disassembler::rev16(Condition cond, 2258 EncodingSize size, 2259 Register rd, 2260 Register rm) { 2261 os().SetCurrentInstruction(kRev16, kNoAttribute); 2262 os() << ToCString(kRev16) << ConditionPrinter(it_block_, cond) << size << " " 2263 << rd << ", " << rm; 2264 } 2265 2266 void Disassembler::revsh(Condition cond, 2267 EncodingSize size, 2268 Register rd, 2269 Register rm) { 2270 os().SetCurrentInstruction(kRevsh, kNoAttribute); 2271 os() << ToCString(kRevsh) << ConditionPrinter(it_block_, cond) << size << " " 2272 << rd << ", " << rm; 2273 } 2274 2275 void Disassembler::ror(Condition cond, 2276 EncodingSize size, 2277 Register rd, 2278 Register rm, 2279 const Operand& operand) { 2280 os().SetCurrentInstruction(kRor, kShift); 2281 os() << ToCString(kRor) << ConditionPrinter(it_block_, cond) << size; 2282 os() << " "; 2283 if (!rd.Is(rm)) { 2284 os() << rd << ", "; 2285 } 2286 os() << rm << ", " << operand; 2287 } 2288 2289 void Disassembler::rors(Condition cond, 2290 EncodingSize size, 2291 Register rd, 2292 Register rm, 2293 const Operand& operand) { 2294 os().SetCurrentInstruction(kRors, kShift); 2295 os() << ToCString(kRors) << ConditionPrinter(it_block_, cond) << size; 2296 os() << " "; 2297 if (!rd.Is(rm)) { 2298 os() << rd << ", "; 2299 } 2300 os() << rm << ", " << operand; 2301 } 2302 2303 void Disassembler::rrx(Condition cond, Register rd, Register rm) { 2304 os().SetCurrentInstruction(kRrx, kShift); 2305 os() << ToCString(kRrx) << ConditionPrinter(it_block_, cond); 2306 os() << " "; 2307 if (!rd.Is(rm)) { 2308 os() << rd << ", "; 2309 } 2310 os() << rm; 2311 } 2312 2313 void Disassembler::rrxs(Condition cond, Register rd, Register rm) { 2314 os().SetCurrentInstruction(kRrxs, kShift); 2315 os() << ToCString(kRrxs) << ConditionPrinter(it_block_, cond); 2316 os() << " "; 2317 if (!rd.Is(rm)) { 2318 os() << rd << ", "; 2319 } 2320 os() << rm; 2321 } 2322 2323 void Disassembler::rsb(Condition cond, 2324 EncodingSize size, 2325 Register rd, 2326 Register rn, 2327 const Operand& operand) { 2328 os().SetCurrentInstruction(kRsb, kArithmetic); 2329 os() << ToCString(kRsb) << ConditionPrinter(it_block_, cond) << size; 2330 os() << " "; 2331 if (!rd.Is(rn)) { 2332 os() << rd << ", "; 2333 } 2334 os() << rn << ", " << operand; 2335 } 2336 2337 void Disassembler::rsbs(Condition cond, 2338 EncodingSize size, 2339 Register rd, 2340 Register rn, 2341 const Operand& operand) { 2342 os().SetCurrentInstruction(kRsbs, kArithmetic); 2343 os() << ToCString(kRsbs) << ConditionPrinter(it_block_, cond) << size; 2344 os() << " "; 2345 if (!rd.Is(rn)) { 2346 os() << rd << ", "; 2347 } 2348 os() << rn << ", " << operand; 2349 } 2350 2351 void Disassembler::rsc(Condition cond, 2352 Register rd, 2353 Register rn, 2354 const Operand& operand) { 2355 os().SetCurrentInstruction(kRsc, kArithmetic); 2356 os() << ToCString(kRsc) << ConditionPrinter(it_block_, cond); 2357 os() << " "; 2358 if (!rd.Is(rn)) { 2359 os() << rd << ", "; 2360 } 2361 os() << rn << ", " << operand; 2362 } 2363 2364 void Disassembler::rscs(Condition cond, 2365 Register rd, 2366 Register rn, 2367 const Operand& operand) { 2368 os().SetCurrentInstruction(kRscs, kArithmetic); 2369 os() << ToCString(kRscs) << ConditionPrinter(it_block_, cond); 2370 os() << " "; 2371 if (!rd.Is(rn)) { 2372 os() << rd << ", "; 2373 } 2374 os() << rn << ", " << operand; 2375 } 2376 2377 void Disassembler::sadd16(Condition cond, 2378 Register rd, 2379 Register rn, 2380 Register rm) { 2381 os().SetCurrentInstruction(kSadd16, kArithmetic); 2382 os() << ToCString(kSadd16) << ConditionPrinter(it_block_, cond); 2383 os() << " "; 2384 if (!rd.Is(rn)) { 2385 os() << rd << ", "; 2386 } 2387 os() << rn << ", " << rm; 2388 } 2389 2390 void Disassembler::sadd8(Condition cond, 2391 Register rd, 2392 Register rn, 2393 Register rm) { 2394 os().SetCurrentInstruction(kSadd8, kArithmetic); 2395 os() << ToCString(kSadd8) << ConditionPrinter(it_block_, cond); 2396 os() << " "; 2397 if (!rd.Is(rn)) { 2398 os() << rd << ", "; 2399 } 2400 os() << rn << ", " << rm; 2401 } 2402 2403 void Disassembler::sasx(Condition cond, Register rd, Register rn, Register rm) { 2404 os().SetCurrentInstruction(kSasx, kArithmetic); 2405 os() << ToCString(kSasx) << ConditionPrinter(it_block_, cond); 2406 os() << " "; 2407 if (!rd.Is(rn)) { 2408 os() << rd << ", "; 2409 } 2410 os() << rn << ", " << rm; 2411 } 2412 2413 void Disassembler::sbc(Condition cond, 2414 EncodingSize size, 2415 Register rd, 2416 Register rn, 2417 const Operand& operand) { 2418 os().SetCurrentInstruction(kSbc, kArithmetic); 2419 os() << ToCString(kSbc) << ConditionPrinter(it_block_, cond) << size; 2420 os() << " "; 2421 if (!rd.Is(rn)) { 2422 os() << rd << ", "; 2423 } 2424 os() << rn << ", " << operand; 2425 } 2426 2427 void Disassembler::sbcs(Condition cond, 2428 EncodingSize size, 2429 Register rd, 2430 Register rn, 2431 const Operand& operand) { 2432 os().SetCurrentInstruction(kSbcs, kArithmetic); 2433 os() << ToCString(kSbcs) << ConditionPrinter(it_block_, cond) << size; 2434 os() << " "; 2435 if (!rd.Is(rn)) { 2436 os() << rd << ", "; 2437 } 2438 os() << rn << ", " << operand; 2439 } 2440 2441 void Disassembler::sbfx(Condition cond, 2442 Register rd, 2443 Register rn, 2444 uint32_t lsb, 2445 const Operand& operand) { 2446 os().SetCurrentInstruction(kSbfx, kShift); 2447 os() << ToCString(kSbfx) << ConditionPrinter(it_block_, cond) << " " << rd 2448 << ", " << rn << ", " 2449 << "#" << lsb << ", " << operand; 2450 } 2451 2452 void Disassembler::sdiv(Condition cond, Register rd, Register rn, Register rm) { 2453 os().SetCurrentInstruction(kSdiv, kArithmetic); 2454 os() << ToCString(kSdiv) << ConditionPrinter(it_block_, cond); 2455 os() << " "; 2456 if (!rd.Is(rn)) { 2457 os() << rd << ", "; 2458 } 2459 os() << rn << ", " << rm; 2460 } 2461 2462 void Disassembler::sel(Condition cond, Register rd, Register rn, Register rm) { 2463 os().SetCurrentInstruction(kSel, kNoAttribute); 2464 os() << ToCString(kSel) << ConditionPrinter(it_block_, cond); 2465 os() << " "; 2466 if (!rd.Is(rn)) { 2467 os() << rd << ", "; 2468 } 2469 os() << rn << ", " << rm; 2470 } 2471 2472 void Disassembler::shadd16(Condition cond, 2473 Register rd, 2474 Register rn, 2475 Register rm) { 2476 os().SetCurrentInstruction(kShadd16, kArithmetic); 2477 os() << ToCString(kShadd16) << ConditionPrinter(it_block_, cond); 2478 os() << " "; 2479 if (!rd.Is(rn)) { 2480 os() << rd << ", "; 2481 } 2482 os() << rn << ", " << rm; 2483 } 2484 2485 void Disassembler::shadd8(Condition cond, 2486 Register rd, 2487 Register rn, 2488 Register rm) { 2489 os().SetCurrentInstruction(kShadd8, kArithmetic); 2490 os() << ToCString(kShadd8) << ConditionPrinter(it_block_, cond); 2491 os() << " "; 2492 if (!rd.Is(rn)) { 2493 os() << rd << ", "; 2494 } 2495 os() << rn << ", " << rm; 2496 } 2497 2498 void Disassembler::shasx(Condition cond, 2499 Register rd, 2500 Register rn, 2501 Register rm) { 2502 os().SetCurrentInstruction(kShasx, kArithmetic); 2503 os() << ToCString(kShasx) << ConditionPrinter(it_block_, cond); 2504 os() << " "; 2505 if (!rd.Is(rn)) { 2506 os() << rd << ", "; 2507 } 2508 os() << rn << ", " << rm; 2509 } 2510 2511 void Disassembler::shsax(Condition cond, 2512 Register rd, 2513 Register rn, 2514 Register rm) { 2515 os().SetCurrentInstruction(kShsax, kArithmetic); 2516 os() << ToCString(kShsax) << ConditionPrinter(it_block_, cond); 2517 os() << " "; 2518 if (!rd.Is(rn)) { 2519 os() << rd << ", "; 2520 } 2521 os() << rn << ", " << rm; 2522 } 2523 2524 void Disassembler::shsub16(Condition cond, 2525 Register rd, 2526 Register rn, 2527 Register rm) { 2528 os().SetCurrentInstruction(kShsub16, kArithmetic); 2529 os() << ToCString(kShsub16) << ConditionPrinter(it_block_, cond); 2530 os() << " "; 2531 if (!rd.Is(rn)) { 2532 os() << rd << ", "; 2533 } 2534 os() << rn << ", " << rm; 2535 } 2536 2537 void Disassembler::shsub8(Condition cond, 2538 Register rd, 2539 Register rn, 2540 Register rm) { 2541 os().SetCurrentInstruction(kShsub8, kArithmetic); 2542 os() << ToCString(kShsub8) << ConditionPrinter(it_block_, cond); 2543 os() << " "; 2544 if (!rd.Is(rn)) { 2545 os() << rd << ", "; 2546 } 2547 os() << rn << ", " << rm; 2548 } 2549 2550 void Disassembler::smlabb( 2551 Condition cond, Register rd, Register rn, Register rm, Register ra) { 2552 os().SetCurrentInstruction(kSmlabb, kArithmetic); 2553 os() << ToCString(kSmlabb) << ConditionPrinter(it_block_, cond) << " " << rd 2554 << ", " << rn << ", " << rm << ", " << ra; 2555 } 2556 2557 void Disassembler::smlabt( 2558 Condition cond, Register rd, Register rn, Register rm, Register ra) { 2559 os().SetCurrentInstruction(kSmlabt, kArithmetic); 2560 os() << ToCString(kSmlabt) << ConditionPrinter(it_block_, cond) << " " << rd 2561 << ", " << rn << ", " << rm << ", " << ra; 2562 } 2563 2564 void Disassembler::smlad( 2565 Condition cond, Register rd, Register rn, Register rm, Register ra) { 2566 os().SetCurrentInstruction(kSmlad, kArithmetic); 2567 os() << ToCString(kSmlad) << ConditionPrinter(it_block_, cond) << " " << rd 2568 << ", " << rn << ", " << rm << ", " << ra; 2569 } 2570 2571 void Disassembler::smladx( 2572 Condition cond, Register rd, Register rn, Register rm, Register ra) { 2573 os().SetCurrentInstruction(kSmladx, kArithmetic); 2574 os() << ToCString(kSmladx) << ConditionPrinter(it_block_, cond) << " " << rd 2575 << ", " << rn << ", " << rm << ", " << ra; 2576 } 2577 2578 void Disassembler::smlal( 2579 Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) { 2580 os().SetCurrentInstruction(kSmlal, kArithmetic); 2581 os() << ToCString(kSmlal) << ConditionPrinter(it_block_, cond) << " " << rdlo 2582 << ", " << rdhi << ", " << rn << ", " << rm; 2583 } 2584 2585 void Disassembler::smlalbb( 2586 Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) { 2587 os().SetCurrentInstruction(kSmlalbb, kArithmetic); 2588 os() << ToCString(kSmlalbb) << ConditionPrinter(it_block_, cond) << " " 2589 << rdlo << ", " << rdhi << ", " << rn << ", " << rm; 2590 } 2591 2592 void Disassembler::smlalbt( 2593 Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) { 2594 os().SetCurrentInstruction(kSmlalbt, kArithmetic); 2595 os() << ToCString(kSmlalbt) << ConditionPrinter(it_block_, cond) << " " 2596 << rdlo << ", " << rdhi << ", " << rn << ", " << rm; 2597 } 2598 2599 void Disassembler::smlald( 2600 Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) { 2601 os().SetCurrentInstruction(kSmlald, kArithmetic); 2602 os() << ToCString(kSmlald) << ConditionPrinter(it_block_, cond) << " " << rdlo 2603 << ", " << rdhi << ", " << rn << ", " << rm; 2604 } 2605 2606 void Disassembler::smlaldx( 2607 Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) { 2608 os().SetCurrentInstruction(kSmlaldx, kArithmetic); 2609 os() << ToCString(kSmlaldx) << ConditionPrinter(it_block_, cond) << " " 2610 << rdlo << ", " << rdhi << ", " << rn << ", " << rm; 2611 } 2612 2613 void Disassembler::smlals( 2614 Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) { 2615 os().SetCurrentInstruction(kSmlals, kArithmetic); 2616 os() << ToCString(kSmlals) << ConditionPrinter(it_block_, cond) << " " << rdlo 2617 << ", " << rdhi << ", " << rn << ", " << rm; 2618 } 2619 2620 void Disassembler::smlaltb( 2621 Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) { 2622 os().SetCurrentInstruction(kSmlaltb, kArithmetic); 2623 os() << ToCString(kSmlaltb) << ConditionPrinter(it_block_, cond) << " " 2624 << rdlo << ", " << rdhi << ", " << rn << ", " << rm; 2625 } 2626 2627 void Disassembler::smlaltt( 2628 Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) { 2629 os().SetCurrentInstruction(kSmlaltt, kArithmetic); 2630 os() << ToCString(kSmlaltt) << ConditionPrinter(it_block_, cond) << " " 2631 << rdlo << ", " << rdhi << ", " << rn << ", " << rm; 2632 } 2633 2634 void Disassembler::smlatb( 2635 Condition cond, Register rd, Register rn, Register rm, Register ra) { 2636 os().SetCurrentInstruction(kSmlatb, kArithmetic); 2637 os() << ToCString(kSmlatb) << ConditionPrinter(it_block_, cond) << " " << rd 2638 << ", " << rn << ", " << rm << ", " << ra; 2639 } 2640 2641 void Disassembler::smlatt( 2642 Condition cond, Register rd, Register rn, Register rm, Register ra) { 2643 os().SetCurrentInstruction(kSmlatt, kArithmetic); 2644 os() << ToCString(kSmlatt) << ConditionPrinter(it_block_, cond) << " " << rd 2645 << ", " << rn << ", " << rm << ", " << ra; 2646 } 2647 2648 void Disassembler::smlawb( 2649 Condition cond, Register rd, Register rn, Register rm, Register ra) { 2650 os().SetCurrentInstruction(kSmlawb, kArithmetic); 2651 os() << ToCString(kSmlawb) << ConditionPrinter(it_block_, cond) << " " << rd 2652 << ", " << rn << ", " << rm << ", " << ra; 2653 } 2654 2655 void Disassembler::smlawt( 2656 Condition cond, Register rd, Register rn, Register rm, Register ra) { 2657 os().SetCurrentInstruction(kSmlawt, kArithmetic); 2658 os() << ToCString(kSmlawt) << ConditionPrinter(it_block_, cond) << " " << rd 2659 << ", " << rn << ", " << rm << ", " << ra; 2660 } 2661 2662 void Disassembler::smlsd( 2663 Condition cond, Register rd, Register rn, Register rm, Register ra) { 2664 os().SetCurrentInstruction(kSmlsd, kArithmetic); 2665 os() << ToCString(kSmlsd) << ConditionPrinter(it_block_, cond) << " " << rd 2666 << ", " << rn << ", " << rm << ", " << ra; 2667 } 2668 2669 void Disassembler::smlsdx( 2670 Condition cond, Register rd, Register rn, Register rm, Register ra) { 2671 os().SetCurrentInstruction(kSmlsdx, kArithmetic); 2672 os() << ToCString(kSmlsdx) << ConditionPrinter(it_block_, cond) << " " << rd 2673 << ", " << rn << ", " << rm << ", " << ra; 2674 } 2675 2676 void Disassembler::smlsld( 2677 Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) { 2678 os().SetCurrentInstruction(kSmlsld, kArithmetic); 2679 os() << ToCString(kSmlsld) << ConditionPrinter(it_block_, cond) << " " << rdlo 2680 << ", " << rdhi << ", " << rn << ", " << rm; 2681 } 2682 2683 void Disassembler::smlsldx( 2684 Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) { 2685 os().SetCurrentInstruction(kSmlsldx, kArithmetic); 2686 os() << ToCString(kSmlsldx) << ConditionPrinter(it_block_, cond) << " " 2687 << rdlo << ", " << rdhi << ", " << rn << ", " << rm; 2688 } 2689 2690 void Disassembler::smmla( 2691 Condition cond, Register rd, Register rn, Register rm, Register ra) { 2692 os().SetCurrentInstruction(kSmmla, kArithmetic); 2693 os() << ToCString(kSmmla) << ConditionPrinter(it_block_, cond) << " " << rd 2694 << ", " << rn << ", " << rm << ", " << ra; 2695 } 2696 2697 void Disassembler::smmlar( 2698 Condition cond, Register rd, Register rn, Register rm, Register ra) { 2699 os().SetCurrentInstruction(kSmmlar, kArithmetic); 2700 os() << ToCString(kSmmlar) << ConditionPrinter(it_block_, cond) << " " << rd 2701 << ", " << rn << ", " << rm << ", " << ra; 2702 } 2703 2704 void Disassembler::smmls( 2705 Condition cond, Register rd, Register rn, Register rm, Register ra) { 2706 os().SetCurrentInstruction(kSmmls, kArithmetic); 2707 os() << ToCString(kSmmls) << ConditionPrinter(it_block_, cond) << " " << rd 2708 << ", " << rn << ", " << rm << ", " << ra; 2709 } 2710 2711 void Disassembler::smmlsr( 2712 Condition cond, Register rd, Register rn, Register rm, Register ra) { 2713 os().SetCurrentInstruction(kSmmlsr, kArithmetic); 2714 os() << ToCString(kSmmlsr) << ConditionPrinter(it_block_, cond) << " " << rd 2715 << ", " << rn << ", " << rm << ", " << ra; 2716 } 2717 2718 void Disassembler::smmul(Condition cond, 2719 Register rd, 2720 Register rn, 2721 Register rm) { 2722 os().SetCurrentInstruction(kSmmul, kArithmetic); 2723 os() << ToCString(kSmmul) << ConditionPrinter(it_block_, cond); 2724 os() << " "; 2725 if (!rd.Is(rn)) { 2726 os() << rd << ", "; 2727 } 2728 os() << rn << ", " << rm; 2729 } 2730 2731 void Disassembler::smmulr(Condition cond, 2732 Register rd, 2733 Register rn, 2734 Register rm) { 2735 os().SetCurrentInstruction(kSmmulr, kArithmetic); 2736 os() << ToCString(kSmmulr) << ConditionPrinter(it_block_, cond); 2737 os() << " "; 2738 if (!rd.Is(rn)) { 2739 os() << rd << ", "; 2740 } 2741 os() << rn << ", " << rm; 2742 } 2743 2744 void Disassembler::smuad(Condition cond, 2745 Register rd, 2746 Register rn, 2747 Register rm) { 2748 os().SetCurrentInstruction(kSmuad, kArithmetic); 2749 os() << ToCString(kSmuad) << ConditionPrinter(it_block_, cond); 2750 os() << " "; 2751 if (!rd.Is(rn)) { 2752 os() << rd << ", "; 2753 } 2754 os() << rn << ", " << rm; 2755 } 2756 2757 void Disassembler::smuadx(Condition cond, 2758 Register rd, 2759 Register rn, 2760 Register rm) { 2761 os().SetCurrentInstruction(kSmuadx, kArithmetic); 2762 os() << ToCString(kSmuadx) << ConditionPrinter(it_block_, cond); 2763 os() << " "; 2764 if (!rd.Is(rn)) { 2765 os() << rd << ", "; 2766 } 2767 os() << rn << ", " << rm; 2768 } 2769 2770 void Disassembler::smulbb(Condition cond, 2771 Register rd, 2772 Register rn, 2773 Register rm) { 2774 os().SetCurrentInstruction(kSmulbb, kArithmetic); 2775 os() << ToCString(kSmulbb) << ConditionPrinter(it_block_, cond); 2776 os() << " "; 2777 if (!rd.Is(rn)) { 2778 os() << rd << ", "; 2779 } 2780 os() << rn << ", " << rm; 2781 } 2782 2783 void Disassembler::smulbt(Condition cond, 2784 Register rd, 2785 Register rn, 2786 Register rm) { 2787 os().SetCurrentInstruction(kSmulbt, kArithmetic); 2788 os() << ToCString(kSmulbt) << ConditionPrinter(it_block_, cond); 2789 os() << " "; 2790 if (!rd.Is(rn)) { 2791 os() << rd << ", "; 2792 } 2793 os() << rn << ", " << rm; 2794 } 2795 2796 void Disassembler::smull( 2797 Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) { 2798 os().SetCurrentInstruction(kSmull, kArithmetic); 2799 os() << ToCString(kSmull) << ConditionPrinter(it_block_, cond) << " " << rdlo 2800 << ", " << rdhi << ", " << rn << ", " << rm; 2801 } 2802 2803 void Disassembler::smulls( 2804 Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) { 2805 os().SetCurrentInstruction(kSmulls, kArithmetic); 2806 os() << ToCString(kSmulls) << ConditionPrinter(it_block_, cond) << " " << rdlo 2807 << ", " << rdhi << ", " << rn << ", " << rm; 2808 } 2809 2810 void Disassembler::smultb(Condition cond, 2811 Register rd, 2812 Register rn, 2813 Register rm) { 2814 os().SetCurrentInstruction(kSmultb, kArithmetic); 2815 os() << ToCString(kSmultb) << ConditionPrinter(it_block_, cond); 2816 os() << " "; 2817 if (!rd.Is(rn)) { 2818 os() << rd << ", "; 2819 } 2820 os() << rn << ", " << rm; 2821 } 2822 2823 void Disassembler::smultt(Condition cond, 2824 Register rd, 2825 Register rn, 2826 Register rm) { 2827 os().SetCurrentInstruction(kSmultt, kArithmetic); 2828 os() << ToCString(kSmultt) << ConditionPrinter(it_block_, cond); 2829 os() << " "; 2830 if (!rd.Is(rn)) { 2831 os() << rd << ", "; 2832 } 2833 os() << rn << ", " << rm; 2834 } 2835 2836 void Disassembler::smulwb(Condition cond, 2837 Register rd, 2838 Register rn, 2839 Register rm) { 2840 os().SetCurrentInstruction(kSmulwb, kArithmetic); 2841 os() << ToCString(kSmulwb) << ConditionPrinter(it_block_, cond); 2842 os() << " "; 2843 if (!rd.Is(rn)) { 2844 os() << rd << ", "; 2845 } 2846 os() << rn << ", " << rm; 2847 } 2848 2849 void Disassembler::smulwt(Condition cond, 2850 Register rd, 2851 Register rn, 2852 Register rm) { 2853 os().SetCurrentInstruction(kSmulwt, kArithmetic); 2854 os() << ToCString(kSmulwt) << ConditionPrinter(it_block_, cond); 2855 os() << " "; 2856 if (!rd.Is(rn)) { 2857 os() << rd << ", "; 2858 } 2859 os() << rn << ", " << rm; 2860 } 2861 2862 void Disassembler::smusd(Condition cond, 2863 Register rd, 2864 Register rn, 2865 Register rm) { 2866 os().SetCurrentInstruction(kSmusd, kArithmetic); 2867 os() << ToCString(kSmusd) << ConditionPrinter(it_block_, cond); 2868 os() << " "; 2869 if (!rd.Is(rn)) { 2870 os() << rd << ", "; 2871 } 2872 os() << rn << ", " << rm; 2873 } 2874 2875 void Disassembler::smusdx(Condition cond, 2876 Register rd, 2877 Register rn, 2878 Register rm) { 2879 os().SetCurrentInstruction(kSmusdx, kArithmetic); 2880 os() << ToCString(kSmusdx) << ConditionPrinter(it_block_, cond); 2881 os() << " "; 2882 if (!rd.Is(rn)) { 2883 os() << rd << ", "; 2884 } 2885 os() << rn << ", " << rm; 2886 } 2887 2888 void Disassembler::ssat(Condition cond, 2889 Register rd, 2890 uint32_t imm, 2891 const Operand& operand) { 2892 os().SetCurrentInstruction(kSsat, kArithmetic); 2893 os() << ToCString(kSsat) << ConditionPrinter(it_block_, cond) << " " << rd 2894 << ", " 2895 << "#" << imm << ", " << operand; 2896 } 2897 2898 void Disassembler::ssat16(Condition cond, 2899 Register rd, 2900 uint32_t imm, 2901 Register rn) { 2902 os().SetCurrentInstruction(kSsat16, kArithmetic); 2903 os() << ToCString(kSsat16) << ConditionPrinter(it_block_, cond) << " " << rd 2904 << ", " 2905 << "#" << imm << ", " << rn; 2906 } 2907 2908 void Disassembler::ssax(Condition cond, Register rd, Register rn, Register rm) { 2909 os().SetCurrentInstruction(kSsax, kArithmetic); 2910 os() << ToCString(kSsax) << ConditionPrinter(it_block_, cond); 2911 os() << " "; 2912 if (!rd.Is(rn)) { 2913 os() << rd << ", "; 2914 } 2915 os() << rn << ", " << rm; 2916 } 2917 2918 void Disassembler::ssub16(Condition cond, 2919 Register rd, 2920 Register rn, 2921 Register rm) { 2922 os().SetCurrentInstruction(kSsub16, kArithmetic); 2923 os() << ToCString(kSsub16) << ConditionPrinter(it_block_, cond); 2924 os() << " "; 2925 if (!rd.Is(rn)) { 2926 os() << rd << ", "; 2927 } 2928 os() << rn << ", " << rm; 2929 } 2930 2931 void Disassembler::ssub8(Condition cond, 2932 Register rd, 2933 Register rn, 2934 Register rm) { 2935 os().SetCurrentInstruction(kSsub8, kArithmetic); 2936 os() << ToCString(kSsub8) << ConditionPrinter(it_block_, cond); 2937 os() << " "; 2938 if (!rd.Is(rn)) { 2939 os() << rd << ", "; 2940 } 2941 os() << rn << ", " << rm; 2942 } 2943 2944 void Disassembler::stl(Condition cond, Register rt, const MemOperand& operand) { 2945 os().SetCurrentInstruction(kStl, kAddress | kLoadStore); 2946 os() << ToCString(kStl) << ConditionPrinter(it_block_, cond) << " " << rt 2947 << ", " << PrintMemOperand(kStoreWordLocation, operand); 2948 } 2949 2950 void Disassembler::stlb(Condition cond, 2951 Register rt, 2952 const MemOperand& operand) { 2953 os().SetCurrentInstruction(kStlb, kAddress | kLoadStore); 2954 os() << ToCString(kStlb) << ConditionPrinter(it_block_, cond) << " " << rt 2955 << ", " << PrintMemOperand(kStoreByteLocation, operand); 2956 } 2957 2958 void Disassembler::stlex(Condition cond, 2959 Register rd, 2960 Register rt, 2961 const MemOperand& operand) { 2962 os().SetCurrentInstruction(kStlex, kAddress | kLoadStore); 2963 os() << ToCString(kStlex) << ConditionPrinter(it_block_, cond) << " " << rd 2964 << ", " << rt << ", " << PrintMemOperand(kStoreWordLocation, operand); 2965 } 2966 2967 void Disassembler::stlexb(Condition cond, 2968 Register rd, 2969 Register rt, 2970 const MemOperand& operand) { 2971 os().SetCurrentInstruction(kStlexb, kAddress | kLoadStore); 2972 os() << ToCString(kStlexb) << ConditionPrinter(it_block_, cond) << " " << rd 2973 << ", " << rt << ", " << PrintMemOperand(kStoreByteLocation, operand); 2974 } 2975 2976 void Disassembler::stlexd(Condition cond, 2977 Register rd, 2978 Register rt, 2979 Register rt2, 2980 const MemOperand& operand) { 2981 os().SetCurrentInstruction(kStlexd, kAddress | kLoadStore); 2982 os() << ToCString(kStlexd) << ConditionPrinter(it_block_, cond) << " " << rd 2983 << ", " << rt << ", " << rt2 << ", " 2984 << PrintMemOperand(kStoreDoubleWordLocation, operand); 2985 } 2986 2987 void Disassembler::stlexh(Condition cond, 2988 Register rd, 2989 Register rt, 2990 const MemOperand& operand) { 2991 os().SetCurrentInstruction(kStlexh, kAddress | kLoadStore); 2992 os() << ToCString(kStlexh) << ConditionPrinter(it_block_, cond) << " " << rd 2993 << ", " << rt << ", " 2994 << PrintMemOperand(kStoreHalfWordLocation, operand); 2995 } 2996 2997 void Disassembler::stlh(Condition cond, 2998 Register rt, 2999 const MemOperand& operand) { 3000 os().SetCurrentInstruction(kStlh, kAddress | kLoadStore); 3001 os() << ToCString(kStlh) << ConditionPrinter(it_block_, cond) << " " << rt 3002 << ", " << PrintMemOperand(kStoreHalfWordLocation, operand); 3003 } 3004 3005 void Disassembler::stm(Condition cond, 3006 EncodingSize size, 3007 Register rn, 3008 WriteBack write_back, 3009 RegisterList registers) { 3010 os().SetCurrentInstruction(kStm, kLoadStore | kLoadStoreMultiple); 3011 os() << ToCString(kStm) << ConditionPrinter(it_block_, cond) << size << " " 3012 << rn << write_back << ", " << registers; 3013 } 3014 3015 void Disassembler::stmda(Condition cond, 3016 Register rn, 3017 WriteBack write_back, 3018 RegisterList registers) { 3019 os().SetCurrentInstruction(kStmda, kLoadStore | kLoadStoreMultiple); 3020 os() << ToCString(kStmda) << ConditionPrinter(it_block_, cond) << " " << rn 3021 << write_back << ", " << registers; 3022 } 3023 3024 void Disassembler::stmdb(Condition cond, 3025 EncodingSize size, 3026 Register rn, 3027 WriteBack write_back, 3028 RegisterList registers) { 3029 os().SetCurrentInstruction(kStmdb, kLoadStore | kLoadStoreMultiple); 3030 os() << ToCString(kStmdb) << ConditionPrinter(it_block_, cond) << size << " " 3031 << rn << write_back << ", " << registers; 3032 } 3033 3034 void Disassembler::stmea(Condition cond, 3035 EncodingSize size, 3036 Register rn, 3037 WriteBack write_back, 3038 RegisterList registers) { 3039 os().SetCurrentInstruction(kStmea, kLoadStore | kLoadStoreMultiple); 3040 os() << ToCString(kStmea) << ConditionPrinter(it_block_, cond) << size << " " 3041 << rn << write_back << ", " << registers; 3042 } 3043 3044 void Disassembler::stmed(Condition cond, 3045 Register rn, 3046 WriteBack write_back, 3047 RegisterList registers) { 3048 os().SetCurrentInstruction(kStmed, kLoadStore | kLoadStoreMultiple); 3049 os() << ToCString(kStmed) << ConditionPrinter(it_block_, cond) << " " << rn 3050 << write_back << ", " << registers; 3051 } 3052 3053 void Disassembler::stmfa(Condition cond, 3054 Register rn, 3055 WriteBack write_back, 3056 RegisterList registers) { 3057 os().SetCurrentInstruction(kStmfa, kLoadStore | kLoadStoreMultiple); 3058 os() << ToCString(kStmfa) << ConditionPrinter(it_block_, cond) << " " << rn 3059 << write_back << ", " << registers; 3060 } 3061 3062 void Disassembler::stmfd(Condition cond, 3063 Register rn, 3064 WriteBack write_back, 3065 RegisterList registers) { 3066 os().SetCurrentInstruction(kStmfd, kLoadStore | kLoadStoreMultiple); 3067 os() << ToCString(kStmfd) << ConditionPrinter(it_block_, cond) << " " << rn 3068 << write_back << ", " << registers; 3069 } 3070 3071 void Disassembler::stmib(Condition cond, 3072 Register rn, 3073 WriteBack write_back, 3074 RegisterList registers) { 3075 os().SetCurrentInstruction(kStmib, kLoadStore | kLoadStoreMultiple); 3076 os() << ToCString(kStmib) << ConditionPrinter(it_block_, cond) << " " << rn 3077 << write_back << ", " << registers; 3078 } 3079 3080 void Disassembler::str(Condition cond, 3081 EncodingSize size, 3082 Register rt, 3083 const MemOperand& operand) { 3084 os().SetCurrentInstruction(kStr, kAddress | kLoadStore); 3085 os() << ToCString(kStr) << ConditionPrinter(it_block_, cond) << size << " " 3086 << rt << ", " << PrintMemOperand(kStoreWordLocation, operand); 3087 } 3088 3089 void Disassembler::strb(Condition cond, 3090 EncodingSize size, 3091 Register rt, 3092 const MemOperand& operand) { 3093 os().SetCurrentInstruction(kStrb, kAddress | kLoadStore); 3094 os() << ToCString(kStrb) << ConditionPrinter(it_block_, cond) << size << " " 3095 << rt << ", " << PrintMemOperand(kStoreByteLocation, operand); 3096 } 3097 3098 void Disassembler::strd(Condition cond, 3099 Register rt, 3100 Register rt2, 3101 const MemOperand& operand) { 3102 os().SetCurrentInstruction(kStrd, kAddress | kLoadStore); 3103 os() << ToCString(kStrd) << ConditionPrinter(it_block_, cond) << " " << rt 3104 << ", " << rt2 << ", " 3105 << PrintMemOperand(kStoreDoubleWordLocation, operand); 3106 } 3107 3108 void Disassembler::strex(Condition cond, 3109 Register rd, 3110 Register rt, 3111 const MemOperand& operand) { 3112 os().SetCurrentInstruction(kStrex, kAddress | kLoadStore); 3113 os() << ToCString(kStrex) << ConditionPrinter(it_block_, cond) << " " << rd 3114 << ", " << rt << ", " << PrintMemOperand(kStoreWordLocation, operand); 3115 } 3116 3117 void Disassembler::strexb(Condition cond, 3118 Register rd, 3119 Register rt, 3120 const MemOperand& operand) { 3121 os().SetCurrentInstruction(kStrexb, kAddress | kLoadStore); 3122 os() << ToCString(kStrexb) << ConditionPrinter(it_block_, cond) << " " << rd 3123 << ", " << rt << ", " << PrintMemOperand(kStoreByteLocation, operand); 3124 } 3125 3126 void Disassembler::strexd(Condition cond, 3127 Register rd, 3128 Register rt, 3129 Register rt2, 3130 const MemOperand& operand) { 3131 os().SetCurrentInstruction(kStrexd, kAddress | kLoadStore); 3132 os() << ToCString(kStrexd) << ConditionPrinter(it_block_, cond) << " " << rd 3133 << ", " << rt << ", " << rt2 << ", " 3134 << PrintMemOperand(kStoreDoubleWordLocation, operand); 3135 } 3136 3137 void Disassembler::strexh(Condition cond, 3138 Register rd, 3139 Register rt, 3140 const MemOperand& operand) { 3141 os().SetCurrentInstruction(kStrexh, kAddress | kLoadStore); 3142 os() << ToCString(kStrexh) << ConditionPrinter(it_block_, cond) << " " << rd 3143 << ", " << rt << ", " 3144 << PrintMemOperand(kStoreHalfWordLocation, operand); 3145 } 3146 3147 void Disassembler::strh(Condition cond, 3148 EncodingSize size, 3149 Register rt, 3150 const MemOperand& operand) { 3151 os().SetCurrentInstruction(kStrh, kAddress | kLoadStore); 3152 os() << ToCString(kStrh) << ConditionPrinter(it_block_, cond) << size << " " 3153 << rt << ", " << PrintMemOperand(kStoreHalfWordLocation, operand); 3154 } 3155 3156 void Disassembler::sub(Condition cond, 3157 EncodingSize size, 3158 Register rd, 3159 Register rn, 3160 const Operand& operand) { 3161 os().SetCurrentInstruction(kSub, kArithmetic); 3162 os() << ToCString(kSub) << ConditionPrinter(it_block_, cond) << size; 3163 os() << " "; 3164 if (!rd.Is(rn)) { 3165 os() << rd << ", "; 3166 } 3167 os() << rn << ", " << operand; 3168 } 3169 3170 void Disassembler::sub(Condition cond, Register rd, const Operand& operand) { 3171 os().SetCurrentInstruction(kSub, kArithmetic); 3172 os() << ToCString(kSub) << ConditionPrinter(it_block_, cond) << " " << rd 3173 << ", " << operand; 3174 } 3175 3176 void Disassembler::subs(Condition cond, 3177 EncodingSize size, 3178 Register rd, 3179 Register rn, 3180 const Operand& operand) { 3181 os().SetCurrentInstruction(kSubs, kArithmetic); 3182 os() << ToCString(kSubs) << ConditionPrinter(it_block_, cond) << size; 3183 os() << " "; 3184 if (!rd.Is(rn)) { 3185 os() << rd << ", "; 3186 } 3187 os() << rn << ", " << operand; 3188 } 3189 3190 void Disassembler::subs(Register rd, const Operand& operand) { 3191 os().SetCurrentInstruction(kSubs, kArithmetic); 3192 os() << ToCString(kSubs) << " " << rd << ", " << operand; 3193 } 3194 3195 void Disassembler::subw(Condition cond, 3196 Register rd, 3197 Register rn, 3198 const Operand& operand) { 3199 os().SetCurrentInstruction(kSubw, kArithmetic); 3200 os() << ToCString(kSubw) << ConditionPrinter(it_block_, cond); 3201 os() << " "; 3202 if (!rd.Is(rn)) { 3203 os() << rd << ", "; 3204 } 3205 os() << rn << ", " << operand; 3206 } 3207 3208 void Disassembler::svc(Condition cond, uint32_t imm) { 3209 os().SetCurrentInstruction(kSvc, kSystem); 3210 os() << ToCString(kSvc) << ConditionPrinter(it_block_, cond) << " " << imm; 3211 } 3212 3213 void Disassembler::sxtab(Condition cond, 3214 Register rd, 3215 Register rn, 3216 const Operand& operand) { 3217 os().SetCurrentInstruction(kSxtab, kArithmetic); 3218 os() << ToCString(kSxtab) << ConditionPrinter(it_block_, cond); 3219 os() << " "; 3220 if (!rd.Is(rn)) { 3221 os() << rd << ", "; 3222 } 3223 os() << rn << ", " << operand; 3224 } 3225 3226 void Disassembler::sxtab16(Condition cond, 3227 Register rd, 3228 Register rn, 3229 const Operand& operand) { 3230 os().SetCurrentInstruction(kSxtab16, kArithmetic); 3231 os() << ToCString(kSxtab16) << ConditionPrinter(it_block_, cond); 3232 os() << " "; 3233 if (!rd.Is(rn)) { 3234 os() << rd << ", "; 3235 } 3236 os() << rn << ", " << operand; 3237 } 3238 3239 void Disassembler::sxtah(Condition cond, 3240 Register rd, 3241 Register rn, 3242 const Operand& operand) { 3243 os().SetCurrentInstruction(kSxtah, kArithmetic); 3244 os() << ToCString(kSxtah) << ConditionPrinter(it_block_, cond); 3245 os() << " "; 3246 if (!rd.Is(rn)) { 3247 os() << rd << ", "; 3248 } 3249 os() << rn << ", " << operand; 3250 } 3251 3252 void Disassembler::sxtb(Condition cond, 3253 EncodingSize size, 3254 Register rd, 3255 const Operand& operand) { 3256 os().SetCurrentInstruction(kSxtb, kArithmetic); 3257 os() << ToCString(kSxtb) << ConditionPrinter(it_block_, cond) << size; 3258 os() << " "; 3259 if (!rd.Is(operand.GetBaseRegister())) { 3260 os() << rd << ", "; 3261 } 3262 os() << operand; 3263 } 3264 3265 void Disassembler::sxtb16(Condition cond, Register rd, const Operand& operand) { 3266 os().SetCurrentInstruction(kSxtb16, kArithmetic); 3267 os() << ToCString(kSxtb16) << ConditionPrinter(it_block_, cond); 3268 os() << " "; 3269 if (!rd.Is(operand.GetBaseRegister())) { 3270 os() << rd << ", "; 3271 } 3272 os() << operand; 3273 } 3274 3275 void Disassembler::sxth(Condition cond, 3276 EncodingSize size, 3277 Register rd, 3278 const Operand& operand) { 3279 os().SetCurrentInstruction(kSxth, kArithmetic); 3280 os() << ToCString(kSxth) << ConditionPrinter(it_block_, cond) << size; 3281 os() << " "; 3282 if (!rd.Is(operand.GetBaseRegister())) { 3283 os() << rd << ", "; 3284 } 3285 os() << operand; 3286 } 3287 3288 void Disassembler::tbb(Condition cond, Register rn, Register rm) { 3289 os().SetCurrentInstruction(kTbb, kBranch); 3290 os() << ToCString(kTbb) << ConditionPrinter(it_block_, cond) << " " 3291 << MemOperand(rn, rm); 3292 } 3293 3294 void Disassembler::tbh(Condition cond, Register rn, Register rm) { 3295 os().SetCurrentInstruction(kTbh, kBranch); 3296 os() << ToCString(kTbh) << ConditionPrinter(it_block_, cond) << " " 3297 << MemOperand(rn, plus, rm, LSL, 1); 3298 } 3299 3300 void Disassembler::teq(Condition cond, Register rn, const Operand& operand) { 3301 os().SetCurrentInstruction(kTeq, kBitwise); 3302 os() << ToCString(kTeq) << ConditionPrinter(it_block_, cond) << " " << rn 3303 << ", " << operand; 3304 } 3305 3306 void Disassembler::tst(Condition cond, 3307 EncodingSize size, 3308 Register rn, 3309 const Operand& operand) { 3310 os().SetCurrentInstruction(kTst, kBitwise); 3311 os() << ToCString(kTst) << ConditionPrinter(it_block_, cond) << size << " " 3312 << rn << ", " << operand; 3313 } 3314 3315 void Disassembler::uadd16(Condition cond, 3316 Register rd, 3317 Register rn, 3318 Register rm) { 3319 os().SetCurrentInstruction(kUadd16, kArithmetic); 3320 os() << ToCString(kUadd16) << ConditionPrinter(it_block_, cond); 3321 os() << " "; 3322 if (!rd.Is(rn)) { 3323 os() << rd << ", "; 3324 } 3325 os() << rn << ", " << rm; 3326 } 3327 3328 void Disassembler::uadd8(Condition cond, 3329 Register rd, 3330 Register rn, 3331 Register rm) { 3332 os().SetCurrentInstruction(kUadd8, kArithmetic); 3333 os() << ToCString(kUadd8) << ConditionPrinter(it_block_, cond); 3334 os() << " "; 3335 if (!rd.Is(rn)) { 3336 os() << rd << ", "; 3337 } 3338 os() << rn << ", " << rm; 3339 } 3340 3341 void Disassembler::uasx(Condition cond, Register rd, Register rn, Register rm) { 3342 os().SetCurrentInstruction(kUasx, kArithmetic); 3343 os() << ToCString(kUasx) << ConditionPrinter(it_block_, cond); 3344 os() << " "; 3345 if (!rd.Is(rn)) { 3346 os() << rd << ", "; 3347 } 3348 os() << rn << ", " << rm; 3349 } 3350 3351 void Disassembler::ubfx(Condition cond, 3352 Register rd, 3353 Register rn, 3354 uint32_t lsb, 3355 const Operand& operand) { 3356 os().SetCurrentInstruction(kUbfx, kShift); 3357 os() << ToCString(kUbfx) << ConditionPrinter(it_block_, cond) << " " << rd 3358 << ", " << rn << ", " 3359 << "#" << lsb << ", " << operand; 3360 } 3361 3362 void Disassembler::udf(Condition cond, EncodingSize size, uint32_t imm) { 3363 os().SetCurrentInstruction(kUdf, kNoAttribute); 3364 os() << ToCString(kUdf) << ConditionPrinter(it_block_, cond) << size << " " 3365 << imm; 3366 } 3367 3368 void Disassembler::udiv(Condition cond, Register rd, Register rn, Register rm) { 3369 os().SetCurrentInstruction(kUdiv, kArithmetic); 3370 os() << ToCString(kUdiv) << ConditionPrinter(it_block_, cond); 3371 os() << " "; 3372 if (!rd.Is(rn)) { 3373 os() << rd << ", "; 3374 } 3375 os() << rn << ", " << rm; 3376 } 3377 3378 void Disassembler::uhadd16(Condition cond, 3379 Register rd, 3380 Register rn, 3381 Register rm) { 3382 os().SetCurrentInstruction(kUhadd16, kArithmetic); 3383 os() << ToCString(kUhadd16) << ConditionPrinter(it_block_, cond); 3384 os() << " "; 3385 if (!rd.Is(rn)) { 3386 os() << rd << ", "; 3387 } 3388 os() << rn << ", " << rm; 3389 } 3390 3391 void Disassembler::uhadd8(Condition cond, 3392 Register rd, 3393 Register rn, 3394 Register rm) { 3395 os().SetCurrentInstruction(kUhadd8, kArithmetic); 3396 os() << ToCString(kUhadd8) << ConditionPrinter(it_block_, cond); 3397 os() << " "; 3398 if (!rd.Is(rn)) { 3399 os() << rd << ", "; 3400 } 3401 os() << rn << ", " << rm; 3402 } 3403 3404 void Disassembler::uhasx(Condition cond, 3405 Register rd, 3406 Register rn, 3407 Register rm) { 3408 os().SetCurrentInstruction(kUhasx, kArithmetic); 3409 os() << ToCString(kUhasx) << ConditionPrinter(it_block_, cond); 3410 os() << " "; 3411 if (!rd.Is(rn)) { 3412 os() << rd << ", "; 3413 } 3414 os() << rn << ", " << rm; 3415 } 3416 3417 void Disassembler::uhsax(Condition cond, 3418 Register rd, 3419 Register rn, 3420 Register rm) { 3421 os().SetCurrentInstruction(kUhsax, kArithmetic); 3422 os() << ToCString(kUhsax) << ConditionPrinter(it_block_, cond); 3423 os() << " "; 3424 if (!rd.Is(rn)) { 3425 os() << rd << ", "; 3426 } 3427 os() << rn << ", " << rm; 3428 } 3429 3430 void Disassembler::uhsub16(Condition cond, 3431 Register rd, 3432 Register rn, 3433 Register rm) { 3434 os().SetCurrentInstruction(kUhsub16, kArithmetic); 3435 os() << ToCString(kUhsub16) << ConditionPrinter(it_block_, cond); 3436 os() << " "; 3437 if (!rd.Is(rn)) { 3438 os() << rd << ", "; 3439 } 3440 os() << rn << ", " << rm; 3441 } 3442 3443 void Disassembler::uhsub8(Condition cond, 3444 Register rd, 3445 Register rn, 3446 Register rm) { 3447 os().SetCurrentInstruction(kUhsub8, kArithmetic); 3448 os() << ToCString(kUhsub8) << ConditionPrinter(it_block_, cond); 3449 os() << " "; 3450 if (!rd.Is(rn)) { 3451 os() << rd << ", "; 3452 } 3453 os() << rn << ", " << rm; 3454 } 3455 3456 void Disassembler::umaal( 3457 Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) { 3458 os().SetCurrentInstruction(kUmaal, kArithmetic); 3459 os() << ToCString(kUmaal) << ConditionPrinter(it_block_, cond) << " " << rdlo 3460 << ", " << rdhi << ", " << rn << ", " << rm; 3461 } 3462 3463 void Disassembler::umlal( 3464 Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) { 3465 os().SetCurrentInstruction(kUmlal, kArithmetic); 3466 os() << ToCString(kUmlal) << ConditionPrinter(it_block_, cond) << " " << rdlo 3467 << ", " << rdhi << ", " << rn << ", " << rm; 3468 } 3469 3470 void Disassembler::umlals( 3471 Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) { 3472 os().SetCurrentInstruction(kUmlals, kArithmetic); 3473 os() << ToCString(kUmlals) << ConditionPrinter(it_block_, cond) << " " << rdlo 3474 << ", " << rdhi << ", " << rn << ", " << rm; 3475 } 3476 3477 void Disassembler::umull( 3478 Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) { 3479 os().SetCurrentInstruction(kUmull, kArithmetic); 3480 os() << ToCString(kUmull) << ConditionPrinter(it_block_, cond) << " " << rdlo 3481 << ", " << rdhi << ", " << rn << ", " << rm; 3482 } 3483 3484 void Disassembler::umulls( 3485 Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) { 3486 os().SetCurrentInstruction(kUmulls, kArithmetic); 3487 os() << ToCString(kUmulls) << ConditionPrinter(it_block_, cond) << " " << rdlo 3488 << ", " << rdhi << ", " << rn << ", " << rm; 3489 } 3490 3491 void Disassembler::uqadd16(Condition cond, 3492 Register rd, 3493 Register rn, 3494 Register rm) { 3495 os().SetCurrentInstruction(kUqadd16, kArithmetic); 3496 os() << ToCString(kUqadd16) << ConditionPrinter(it_block_, cond); 3497 os() << " "; 3498 if (!rd.Is(rn)) { 3499 os() << rd << ", "; 3500 } 3501 os() << rn << ", " << rm; 3502 } 3503 3504 void Disassembler::uqadd8(Condition cond, 3505 Register rd, 3506 Register rn, 3507 Register rm) { 3508 os().SetCurrentInstruction(kUqadd8, kArithmetic); 3509 os() << ToCString(kUqadd8) << ConditionPrinter(it_block_, cond); 3510 os() << " "; 3511 if (!rd.Is(rn)) { 3512 os() << rd << ", "; 3513 } 3514 os() << rn << ", " << rm; 3515 } 3516 3517 void Disassembler::uqasx(Condition cond, 3518 Register rd, 3519 Register rn, 3520 Register rm) { 3521 os().SetCurrentInstruction(kUqasx, kArithmetic); 3522 os() << ToCString(kUqasx) << ConditionPrinter(it_block_, cond); 3523 os() << " "; 3524 if (!rd.Is(rn)) { 3525 os() << rd << ", "; 3526 } 3527 os() << rn << ", " << rm; 3528 } 3529 3530 void Disassembler::uqsax(Condition cond, 3531 Register rd, 3532 Register rn, 3533 Register rm) { 3534 os().SetCurrentInstruction(kUqsax, kArithmetic); 3535 os() << ToCString(kUqsax) << ConditionPrinter(it_block_, cond); 3536 os() << " "; 3537 if (!rd.Is(rn)) { 3538 os() << rd << ", "; 3539 } 3540 os() << rn << ", " << rm; 3541 } 3542 3543 void Disassembler::uqsub16(Condition cond, 3544 Register rd, 3545 Register rn, 3546 Register rm) { 3547 os().SetCurrentInstruction(kUqsub16, kArithmetic); 3548 os() << ToCString(kUqsub16) << ConditionPrinter(it_block_, cond); 3549 os() << " "; 3550 if (!rd.Is(rn)) { 3551 os() << rd << ", "; 3552 } 3553 os() << rn << ", " << rm; 3554 } 3555 3556 void Disassembler::uqsub8(Condition cond, 3557 Register rd, 3558 Register rn, 3559 Register rm) { 3560 os().SetCurrentInstruction(kUqsub8, kArithmetic); 3561 os() << ToCString(kUqsub8) << ConditionPrinter(it_block_, cond); 3562 os() << " "; 3563 if (!rd.Is(rn)) { 3564 os() << rd << ", "; 3565 } 3566 os() << rn << ", " << rm; 3567 } 3568 3569 void Disassembler::usad8(Condition cond, 3570 Register rd, 3571 Register rn, 3572 Register rm) { 3573 os().SetCurrentInstruction(kUsad8, kArithmetic); 3574 os() << ToCString(kUsad8) << ConditionPrinter(it_block_, cond); 3575 os() << " "; 3576 if (!rd.Is(rn)) { 3577 os() << rd << ", "; 3578 } 3579 os() << rn << ", " << rm; 3580 } 3581 3582 void Disassembler::usada8( 3583 Condition cond, Register rd, Register rn, Register rm, Register ra) { 3584 os().SetCurrentInstruction(kUsada8, kArithmetic); 3585 os() << ToCString(kUsada8) << ConditionPrinter(it_block_, cond) << " " << rd 3586 << ", " << rn << ", " << rm << ", " << ra; 3587 } 3588 3589 void Disassembler::usat(Condition cond, 3590 Register rd, 3591 uint32_t imm, 3592 const Operand& operand) { 3593 os().SetCurrentInstruction(kUsat, kArithmetic); 3594 os() << ToCString(kUsat) << ConditionPrinter(it_block_, cond) << " " << rd 3595 << ", " 3596 << "#" << imm << ", " << operand; 3597 } 3598 3599 void Disassembler::usat16(Condition cond, 3600 Register rd, 3601 uint32_t imm, 3602 Register rn) { 3603 os().SetCurrentInstruction(kUsat16, kArithmetic); 3604 os() << ToCString(kUsat16) << ConditionPrinter(it_block_, cond) << " " << rd 3605 << ", " 3606 << "#" << imm << ", " << rn; 3607 } 3608 3609 void Disassembler::usax(Condition cond, Register rd, Register rn, Register rm) { 3610 os().SetCurrentInstruction(kUsax, kArithmetic); 3611 os() << ToCString(kUsax) << ConditionPrinter(it_block_, cond); 3612 os() << " "; 3613 if (!rd.Is(rn)) { 3614 os() << rd << ", "; 3615 } 3616 os() << rn << ", " << rm; 3617 } 3618 3619 void Disassembler::usub16(Condition cond, 3620 Register rd, 3621 Register rn, 3622 Register rm) { 3623 os().SetCurrentInstruction(kUsub16, kArithmetic); 3624 os() << ToCString(kUsub16) << ConditionPrinter(it_block_, cond); 3625 os() << " "; 3626 if (!rd.Is(rn)) { 3627 os() << rd << ", "; 3628 } 3629 os() << rn << ", " << rm; 3630 } 3631 3632 void Disassembler::usub8(Condition cond, 3633 Register rd, 3634 Register rn, 3635 Register rm) { 3636 os().SetCurrentInstruction(kUsub8, kArithmetic); 3637 os() << ToCString(kUsub8) << ConditionPrinter(it_block_, cond); 3638 os() << " "; 3639 if (!rd.Is(rn)) { 3640 os() << rd << ", "; 3641 } 3642 os() << rn << ", " << rm; 3643 } 3644 3645 void Disassembler::uxtab(Condition cond, 3646 Register rd, 3647 Register rn, 3648 const Operand& operand) { 3649 os().SetCurrentInstruction(kUxtab, kArithmetic); 3650 os() << ToCString(kUxtab) << ConditionPrinter(it_block_, cond); 3651 os() << " "; 3652 if (!rd.Is(rn)) { 3653 os() << rd << ", "; 3654 } 3655 os() << rn << ", " << operand; 3656 } 3657 3658 void Disassembler::uxtab16(Condition cond, 3659 Register rd, 3660 Register rn, 3661 const Operand& operand) { 3662 os().SetCurrentInstruction(kUxtab16, kArithmetic); 3663 os() << ToCString(kUxtab16) << ConditionPrinter(it_block_, cond); 3664 os() << " "; 3665 if (!rd.Is(rn)) { 3666 os() << rd << ", "; 3667 } 3668 os() << rn << ", " << operand; 3669 } 3670 3671 void Disassembler::uxtah(Condition cond, 3672 Register rd, 3673 Register rn, 3674 const Operand& operand) { 3675 os().SetCurrentInstruction(kUxtah, kArithmetic); 3676 os() << ToCString(kUxtah) << ConditionPrinter(it_block_, cond); 3677 os() << " "; 3678 if (!rd.Is(rn)) { 3679 os() << rd << ", "; 3680 } 3681 os() << rn << ", " << operand; 3682 } 3683 3684 void Disassembler::uxtb(Condition cond, 3685 EncodingSize size, 3686 Register rd, 3687 const Operand& operand) { 3688 os().SetCurrentInstruction(kUxtb, kArithmetic); 3689 os() << ToCString(kUxtb) << ConditionPrinter(it_block_, cond) << size; 3690 os() << " "; 3691 if (!rd.Is(operand.GetBaseRegister())) { 3692 os() << rd << ", "; 3693 } 3694 os() << operand; 3695 } 3696 3697 void Disassembler::uxtb16(Condition cond, Register rd, const Operand& operand) { 3698 os().SetCurrentInstruction(kUxtb16, kArithmetic); 3699 os() << ToCString(kUxtb16) << ConditionPrinter(it_block_, cond); 3700 os() << " "; 3701 if (!rd.Is(operand.GetBaseRegister())) { 3702 os() << rd << ", "; 3703 } 3704 os() << operand; 3705 } 3706 3707 void Disassembler::uxth(Condition cond, 3708 EncodingSize size, 3709 Register rd, 3710 const Operand& operand) { 3711 os().SetCurrentInstruction(kUxth, kArithmetic); 3712 os() << ToCString(kUxth) << ConditionPrinter(it_block_, cond) << size; 3713 os() << " "; 3714 if (!rd.Is(operand.GetBaseRegister())) { 3715 os() << rd << ", "; 3716 } 3717 os() << operand; 3718 } 3719 3720 void Disassembler::vaba( 3721 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { 3722 os().SetCurrentInstruction(kVaba, kFpNeon); 3723 os() << ToCString(kVaba) << ConditionPrinter(it_block_, cond) << dt << " " 3724 << rd << ", " << rn << ", " << rm; 3725 } 3726 3727 void Disassembler::vaba( 3728 Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { 3729 os().SetCurrentInstruction(kVaba, kFpNeon); 3730 os() << ToCString(kVaba) << ConditionPrinter(it_block_, cond) << dt << " " 3731 << rd << ", " << rn << ", " << rm; 3732 } 3733 3734 void Disassembler::vabal( 3735 Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) { 3736 os().SetCurrentInstruction(kVabal, kFpNeon); 3737 os() << ToCString(kVabal) << ConditionPrinter(it_block_, cond) << dt << " " 3738 << rd << ", " << rn << ", " << rm; 3739 } 3740 3741 void Disassembler::vabd( 3742 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { 3743 os().SetCurrentInstruction(kVabd, kFpNeon); 3744 os() << ToCString(kVabd) << ConditionPrinter(it_block_, cond) << dt; 3745 os() << " "; 3746 if (!rd.Is(rn)) { 3747 os() << rd << ", "; 3748 } 3749 os() << rn << ", " << rm; 3750 } 3751 3752 void Disassembler::vabd( 3753 Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { 3754 os().SetCurrentInstruction(kVabd, kFpNeon); 3755 os() << ToCString(kVabd) << ConditionPrinter(it_block_, cond) << dt; 3756 os() << " "; 3757 if (!rd.Is(rn)) { 3758 os() << rd << ", "; 3759 } 3760 os() << rn << ", " << rm; 3761 } 3762 3763 void Disassembler::vabdl( 3764 Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) { 3765 os().SetCurrentInstruction(kVabdl, kFpNeon); 3766 os() << ToCString(kVabdl) << ConditionPrinter(it_block_, cond) << dt << " " 3767 << rd << ", " << rn << ", " << rm; 3768 } 3769 3770 void Disassembler::vabs(Condition cond, 3771 DataType dt, 3772 DRegister rd, 3773 DRegister rm) { 3774 os().SetCurrentInstruction(kVabs, kFpNeon); 3775 os() << ToCString(kVabs) << ConditionPrinter(it_block_, cond) << dt << " " 3776 << rd << ", " << rm; 3777 } 3778 3779 void Disassembler::vabs(Condition cond, 3780 DataType dt, 3781 QRegister rd, 3782 QRegister rm) { 3783 os().SetCurrentInstruction(kVabs, kFpNeon); 3784 os() << ToCString(kVabs) << ConditionPrinter(it_block_, cond) << dt << " " 3785 << rd << ", " << rm; 3786 } 3787 3788 void Disassembler::vabs(Condition cond, 3789 DataType dt, 3790 SRegister rd, 3791 SRegister rm) { 3792 os().SetCurrentInstruction(kVabs, kFpNeon); 3793 os() << ToCString(kVabs) << ConditionPrinter(it_block_, cond) << dt << " " 3794 << rd << ", " << rm; 3795 } 3796 3797 void Disassembler::vacge( 3798 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { 3799 os().SetCurrentInstruction(kVacge, kFpNeon); 3800 os() << ToCString(kVacge) << ConditionPrinter(it_block_, cond) << dt; 3801 os() << " "; 3802 if (!rd.Is(rn)) { 3803 os() << rd << ", "; 3804 } 3805 os() << rn << ", " << rm; 3806 } 3807 3808 void Disassembler::vacge( 3809 Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { 3810 os().SetCurrentInstruction(kVacge, kFpNeon); 3811 os() << ToCString(kVacge) << ConditionPrinter(it_block_, cond) << dt; 3812 os() << " "; 3813 if (!rd.Is(rn)) { 3814 os() << rd << ", "; 3815 } 3816 os() << rn << ", " << rm; 3817 } 3818 3819 void Disassembler::vacgt( 3820 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { 3821 os().SetCurrentInstruction(kVacgt, kFpNeon); 3822 os() << ToCString(kVacgt) << ConditionPrinter(it_block_, cond) << dt; 3823 os() << " "; 3824 if (!rd.Is(rn)) { 3825 os() << rd << ", "; 3826 } 3827 os() << rn << ", " << rm; 3828 } 3829 3830 void Disassembler::vacgt( 3831 Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { 3832 os().SetCurrentInstruction(kVacgt, kFpNeon); 3833 os() << ToCString(kVacgt) << ConditionPrinter(it_block_, cond) << dt; 3834 os() << " "; 3835 if (!rd.Is(rn)) { 3836 os() << rd << ", "; 3837 } 3838 os() << rn << ", " << rm; 3839 } 3840 3841 void Disassembler::vacle( 3842 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { 3843 os().SetCurrentInstruction(kVacle, kFpNeon); 3844 os() << ToCString(kVacle) << ConditionPrinter(it_block_, cond) << dt; 3845 os() << " "; 3846 if (!rd.Is(rn)) { 3847 os() << rd << ", "; 3848 } 3849 os() << rn << ", " << rm; 3850 } 3851 3852 void Disassembler::vacle( 3853 Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { 3854 os().SetCurrentInstruction(kVacle, kFpNeon); 3855 os() << ToCString(kVacle) << ConditionPrinter(it_block_, cond) << dt; 3856 os() << " "; 3857 if (!rd.Is(rn)) { 3858 os() << rd << ", "; 3859 } 3860 os() << rn << ", " << rm; 3861 } 3862 3863 void Disassembler::vaclt( 3864 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { 3865 os().SetCurrentInstruction(kVaclt, kFpNeon); 3866 os() << ToCString(kVaclt) << ConditionPrinter(it_block_, cond) << dt; 3867 os() << " "; 3868 if (!rd.Is(rn)) { 3869 os() << rd << ", "; 3870 } 3871 os() << rn << ", " << rm; 3872 } 3873 3874 void Disassembler::vaclt( 3875 Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { 3876 os().SetCurrentInstruction(kVaclt, kFpNeon); 3877 os() << ToCString(kVaclt) << ConditionPrinter(it_block_, cond) << dt; 3878 os() << " "; 3879 if (!rd.Is(rn)) { 3880 os() << rd << ", "; 3881 } 3882 os() << rn << ", " << rm; 3883 } 3884 3885 void Disassembler::vadd( 3886 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { 3887 os().SetCurrentInstruction(kVadd, kFpNeon); 3888 os() << ToCString(kVadd) << ConditionPrinter(it_block_, cond) << dt; 3889 os() << " "; 3890 if (!rd.Is(rn)) { 3891 os() << rd << ", "; 3892 } 3893 os() << rn << ", " << rm; 3894 } 3895 3896 void Disassembler::vadd( 3897 Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { 3898 os().SetCurrentInstruction(kVadd, kFpNeon); 3899 os() << ToCString(kVadd) << ConditionPrinter(it_block_, cond) << dt; 3900 os() << " "; 3901 if (!rd.Is(rn)) { 3902 os() << rd << ", "; 3903 } 3904 os() << rn << ", " << rm; 3905 } 3906 3907 void Disassembler::vadd( 3908 Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) { 3909 os().SetCurrentInstruction(kVadd, kFpNeon); 3910 os() << ToCString(kVadd) << ConditionPrinter(it_block_, cond) << dt; 3911 os() << " "; 3912 if (!rd.Is(rn)) { 3913 os() << rd << ", "; 3914 } 3915 os() << rn << ", " << rm; 3916 } 3917 3918 void Disassembler::vaddhn( 3919 Condition cond, DataType dt, DRegister rd, QRegister rn, QRegister rm) { 3920 os().SetCurrentInstruction(kVaddhn, kFpNeon); 3921 os() << ToCString(kVaddhn) << ConditionPrinter(it_block_, cond) << dt << " " 3922 << rd << ", " << rn << ", " << rm; 3923 } 3924 3925 void Disassembler::vaddl( 3926 Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) { 3927 os().SetCurrentInstruction(kVaddl, kFpNeon); 3928 os() << ToCString(kVaddl) << ConditionPrinter(it_block_, cond) << dt << " " 3929 << rd << ", " << rn << ", " << rm; 3930 } 3931 3932 void Disassembler::vaddw( 3933 Condition cond, DataType dt, QRegister rd, QRegister rn, DRegister rm) { 3934 os().SetCurrentInstruction(kVaddw, kFpNeon); 3935 os() << ToCString(kVaddw) << ConditionPrinter(it_block_, cond) << dt; 3936 os() << " "; 3937 if (!rd.Is(rn)) { 3938 os() << rd << ", "; 3939 } 3940 os() << rn << ", " << rm; 3941 } 3942 3943 void Disassembler::vand(Condition cond, 3944 DataType dt, 3945 DRegister rd, 3946 DRegister rn, 3947 const DOperand& operand) { 3948 os().SetCurrentInstruction(kVand, kFpNeon); 3949 os() << ToCString(kVand) << ConditionPrinter(it_block_, cond) << dt; 3950 os() << " "; 3951 if (!rd.Is(rn)) { 3952 os() << rd << ", "; 3953 } 3954 os() << rn << ", " << operand; 3955 } 3956 3957 void Disassembler::vand(Condition cond, 3958 DataType dt, 3959 QRegister rd, 3960 QRegister rn, 3961 const QOperand& operand) { 3962 os().SetCurrentInstruction(kVand, kFpNeon); 3963 os() << ToCString(kVand) << ConditionPrinter(it_block_, cond) << dt; 3964 os() << " "; 3965 if (!rd.Is(rn)) { 3966 os() << rd << ", "; 3967 } 3968 os() << rn << ", " << operand; 3969 } 3970 3971 void Disassembler::vbic(Condition cond, 3972 DataType dt, 3973 DRegister rd, 3974 DRegister rn, 3975 const DOperand& operand) { 3976 os().SetCurrentInstruction(kVbic, kFpNeon); 3977 os() << ToCString(kVbic) << ConditionPrinter(it_block_, cond) << dt; 3978 os() << " "; 3979 if (!rd.Is(rn)) { 3980 os() << rd << ", "; 3981 } 3982 os() << rn << ", " << operand; 3983 } 3984 3985 void Disassembler::vbic(Condition cond, 3986 DataType dt, 3987 QRegister rd, 3988 QRegister rn, 3989 const QOperand& operand) { 3990 os().SetCurrentInstruction(kVbic, kFpNeon); 3991 os() << ToCString(kVbic) << ConditionPrinter(it_block_, cond) << dt; 3992 os() << " "; 3993 if (!rd.Is(rn)) { 3994 os() << rd << ", "; 3995 } 3996 os() << rn << ", " << operand; 3997 } 3998 3999 void Disassembler::vbif( 4000 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { 4001 os().SetCurrentInstruction(kVbif, kFpNeon); 4002 os() << ToCString(kVbif) << ConditionPrinter(it_block_, cond) << dt; 4003 os() << " "; 4004 if (!rd.Is(rn)) { 4005 os() << rd << ", "; 4006 } 4007 os() << rn << ", " << rm; 4008 } 4009 4010 void Disassembler::vbif( 4011 Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { 4012 os().SetCurrentInstruction(kVbif, kFpNeon); 4013 os() << ToCString(kVbif) << ConditionPrinter(it_block_, cond) << dt; 4014 os() << " "; 4015 if (!rd.Is(rn)) { 4016 os() << rd << ", "; 4017 } 4018 os() << rn << ", " << rm; 4019 } 4020 4021 void Disassembler::vbit( 4022 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { 4023 os().SetCurrentInstruction(kVbit, kFpNeon); 4024 os() << ToCString(kVbit) << ConditionPrinter(it_block_, cond) << dt; 4025 os() << " "; 4026 if (!rd.Is(rn)) { 4027 os() << rd << ", "; 4028 } 4029 os() << rn << ", " << rm; 4030 } 4031 4032 void Disassembler::vbit( 4033 Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { 4034 os().SetCurrentInstruction(kVbit, kFpNeon); 4035 os() << ToCString(kVbit) << ConditionPrinter(it_block_, cond) << dt; 4036 os() << " "; 4037 if (!rd.Is(rn)) { 4038 os() << rd << ", "; 4039 } 4040 os() << rn << ", " << rm; 4041 } 4042 4043 void Disassembler::vbsl( 4044 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { 4045 os().SetCurrentInstruction(kVbsl, kFpNeon); 4046 os() << ToCString(kVbsl) << ConditionPrinter(it_block_, cond) << dt; 4047 os() << " "; 4048 if (!rd.Is(rn)) { 4049 os() << rd << ", "; 4050 } 4051 os() << rn << ", " << rm; 4052 } 4053 4054 void Disassembler::vbsl( 4055 Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { 4056 os().SetCurrentInstruction(kVbsl, kFpNeon); 4057 os() << ToCString(kVbsl) << ConditionPrinter(it_block_, cond) << dt; 4058 os() << " "; 4059 if (!rd.Is(rn)) { 4060 os() << rd << ", "; 4061 } 4062 os() << rn << ", " << rm; 4063 } 4064 4065 void Disassembler::vceq(Condition cond, 4066 DataType dt, 4067 DRegister rd, 4068 DRegister rm, 4069 const DOperand& operand) { 4070 os().SetCurrentInstruction(kVceq, kFpNeon); 4071 os() << ToCString(kVceq) << ConditionPrinter(it_block_, cond) << dt; 4072 os() << " "; 4073 if (!rd.Is(rm)) { 4074 os() << rd << ", "; 4075 } 4076 os() << rm << ", " << operand; 4077 } 4078 4079 void Disassembler::vceq(Condition cond, 4080 DataType dt, 4081 QRegister rd, 4082 QRegister rm, 4083 const QOperand& operand) { 4084 os().SetCurrentInstruction(kVceq, kFpNeon); 4085 os() << ToCString(kVceq) << ConditionPrinter(it_block_, cond) << dt; 4086 os() << " "; 4087 if (!rd.Is(rm)) { 4088 os() << rd << ", "; 4089 } 4090 os() << rm << ", " << operand; 4091 } 4092 4093 void Disassembler::vceq( 4094 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { 4095 os().SetCurrentInstruction(kVceq, kFpNeon); 4096 os() << ToCString(kVceq) << ConditionPrinter(it_block_, cond) << dt; 4097 os() << " "; 4098 if (!rd.Is(rn)) { 4099 os() << rd << ", "; 4100 } 4101 os() << rn << ", " << rm; 4102 } 4103 4104 void Disassembler::vceq( 4105 Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { 4106 os().SetCurrentInstruction(kVceq, kFpNeon); 4107 os() << ToCString(kVceq) << ConditionPrinter(it_block_, cond) << dt; 4108 os() << " "; 4109 if (!rd.Is(rn)) { 4110 os() << rd << ", "; 4111 } 4112 os() << rn << ", " << rm; 4113 } 4114 4115 void Disassembler::vcge(Condition cond, 4116 DataType dt, 4117 DRegister rd, 4118 DRegister rm, 4119 const DOperand& operand) { 4120 os().SetCurrentInstruction(kVcge, kFpNeon); 4121 os() << ToCString(kVcge) << ConditionPrinter(it_block_, cond) << dt; 4122 os() << " "; 4123 if (!rd.Is(rm)) { 4124 os() << rd << ", "; 4125 } 4126 os() << rm << ", " << operand; 4127 } 4128 4129 void Disassembler::vcge(Condition cond, 4130 DataType dt, 4131 QRegister rd, 4132 QRegister rm, 4133 const QOperand& operand) { 4134 os().SetCurrentInstruction(kVcge, kFpNeon); 4135 os() << ToCString(kVcge) << ConditionPrinter(it_block_, cond) << dt; 4136 os() << " "; 4137 if (!rd.Is(rm)) { 4138 os() << rd << ", "; 4139 } 4140 os() << rm << ", " << operand; 4141 } 4142 4143 void Disassembler::vcge( 4144 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { 4145 os().SetCurrentInstruction(kVcge, kFpNeon); 4146 os() << ToCString(kVcge) << ConditionPrinter(it_block_, cond) << dt; 4147 os() << " "; 4148 if (!rd.Is(rn)) { 4149 os() << rd << ", "; 4150 } 4151 os() << rn << ", " << rm; 4152 } 4153 4154 void Disassembler::vcge( 4155 Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { 4156 os().SetCurrentInstruction(kVcge, kFpNeon); 4157 os() << ToCString(kVcge) << ConditionPrinter(it_block_, cond) << dt; 4158 os() << " "; 4159 if (!rd.Is(rn)) { 4160 os() << rd << ", "; 4161 } 4162 os() << rn << ", " << rm; 4163 } 4164 4165 void Disassembler::vcgt(Condition cond, 4166 DataType dt, 4167 DRegister rd, 4168 DRegister rm, 4169 const DOperand& operand) { 4170 os().SetCurrentInstruction(kVcgt, kFpNeon); 4171 os() << ToCString(kVcgt) << ConditionPrinter(it_block_, cond) << dt; 4172 os() << " "; 4173 if (!rd.Is(rm)) { 4174 os() << rd << ", "; 4175 } 4176 os() << rm << ", " << operand; 4177 } 4178 4179 void Disassembler::vcgt(Condition cond, 4180 DataType dt, 4181 QRegister rd, 4182 QRegister rm, 4183 const QOperand& operand) { 4184 os().SetCurrentInstruction(kVcgt, kFpNeon); 4185 os() << ToCString(kVcgt) << ConditionPrinter(it_block_, cond) << dt; 4186 os() << " "; 4187 if (!rd.Is(rm)) { 4188 os() << rd << ", "; 4189 } 4190 os() << rm << ", " << operand; 4191 } 4192 4193 void Disassembler::vcgt( 4194 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { 4195 os().SetCurrentInstruction(kVcgt, kFpNeon); 4196 os() << ToCString(kVcgt) << ConditionPrinter(it_block_, cond) << dt; 4197 os() << " "; 4198 if (!rd.Is(rn)) { 4199 os() << rd << ", "; 4200 } 4201 os() << rn << ", " << rm; 4202 } 4203 4204 void Disassembler::vcgt( 4205 Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { 4206 os().SetCurrentInstruction(kVcgt, kFpNeon); 4207 os() << ToCString(kVcgt) << ConditionPrinter(it_block_, cond) << dt; 4208 os() << " "; 4209 if (!rd.Is(rn)) { 4210 os() << rd << ", "; 4211 } 4212 os() << rn << ", " << rm; 4213 } 4214 4215 void Disassembler::vcle(Condition cond, 4216 DataType dt, 4217 DRegister rd, 4218 DRegister rm, 4219 const DOperand& operand) { 4220 os().SetCurrentInstruction(kVcle, kFpNeon); 4221 os() << ToCString(kVcle) << ConditionPrinter(it_block_, cond) << dt; 4222 os() << " "; 4223 if (!rd.Is(rm)) { 4224 os() << rd << ", "; 4225 } 4226 os() << rm << ", " << operand; 4227 } 4228 4229 void Disassembler::vcle(Condition cond, 4230 DataType dt, 4231 QRegister rd, 4232 QRegister rm, 4233 const QOperand& operand) { 4234 os().SetCurrentInstruction(kVcle, kFpNeon); 4235 os() << ToCString(kVcle) << ConditionPrinter(it_block_, cond) << dt; 4236 os() << " "; 4237 if (!rd.Is(rm)) { 4238 os() << rd << ", "; 4239 } 4240 os() << rm << ", " << operand; 4241 } 4242 4243 void Disassembler::vcle( 4244 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { 4245 os().SetCurrentInstruction(kVcle, kFpNeon); 4246 os() << ToCString(kVcle) << ConditionPrinter(it_block_, cond) << dt; 4247 os() << " "; 4248 if (!rd.Is(rn)) { 4249 os() << rd << ", "; 4250 } 4251 os() << rn << ", " << rm; 4252 } 4253 4254 void Disassembler::vcle( 4255 Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { 4256 os().SetCurrentInstruction(kVcle, kFpNeon); 4257 os() << ToCString(kVcle) << ConditionPrinter(it_block_, cond) << dt; 4258 os() << " "; 4259 if (!rd.Is(rn)) { 4260 os() << rd << ", "; 4261 } 4262 os() << rn << ", " << rm; 4263 } 4264 4265 void Disassembler::vcls(Condition cond, 4266 DataType dt, 4267 DRegister rd, 4268 DRegister rm) { 4269 os().SetCurrentInstruction(kVcls, kFpNeon); 4270 os() << ToCString(kVcls) << ConditionPrinter(it_block_, cond) << dt << " " 4271 << rd << ", " << rm; 4272 } 4273 4274 void Disassembler::vcls(Condition cond, 4275 DataType dt, 4276 QRegister rd, 4277 QRegister rm) { 4278 os().SetCurrentInstruction(kVcls, kFpNeon); 4279 os() << ToCString(kVcls) << ConditionPrinter(it_block_, cond) << dt << " " 4280 << rd << ", " << rm; 4281 } 4282 4283 void Disassembler::vclt(Condition cond, 4284 DataType dt, 4285 DRegister rd, 4286 DRegister rm, 4287 const DOperand& operand) { 4288 os().SetCurrentInstruction(kVclt, kFpNeon); 4289 os() << ToCString(kVclt) << ConditionPrinter(it_block_, cond) << dt; 4290 os() << " "; 4291 if (!rd.Is(rm)) { 4292 os() << rd << ", "; 4293 } 4294 os() << rm << ", " << operand; 4295 } 4296 4297 void Disassembler::vclt(Condition cond, 4298 DataType dt, 4299 QRegister rd, 4300 QRegister rm, 4301 const QOperand& operand) { 4302 os().SetCurrentInstruction(kVclt, kFpNeon); 4303 os() << ToCString(kVclt) << ConditionPrinter(it_block_, cond) << dt; 4304 os() << " "; 4305 if (!rd.Is(rm)) { 4306 os() << rd << ", "; 4307 } 4308 os() << rm << ", " << operand; 4309 } 4310 4311 void Disassembler::vclt( 4312 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { 4313 os().SetCurrentInstruction(kVclt, kFpNeon); 4314 os() << ToCString(kVclt) << ConditionPrinter(it_block_, cond) << dt; 4315 os() << " "; 4316 if (!rd.Is(rn)) { 4317 os() << rd << ", "; 4318 } 4319 os() << rn << ", " << rm; 4320 } 4321 4322 void Disassembler::vclt( 4323 Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { 4324 os().SetCurrentInstruction(kVclt, kFpNeon); 4325 os() << ToCString(kVclt) << ConditionPrinter(it_block_, cond) << dt; 4326 os() << " "; 4327 if (!rd.Is(rn)) { 4328 os() << rd << ", "; 4329 } 4330 os() << rn << ", " << rm; 4331 } 4332 4333 void Disassembler::vclz(Condition cond, 4334 DataType dt, 4335 DRegister rd, 4336 DRegister rm) { 4337 os().SetCurrentInstruction(kVclz, kFpNeon); 4338 os() << ToCString(kVclz) << ConditionPrinter(it_block_, cond) << dt << " " 4339 << rd << ", " << rm; 4340 } 4341 4342 void Disassembler::vclz(Condition cond, 4343 DataType dt, 4344 QRegister rd, 4345 QRegister rm) { 4346 os().SetCurrentInstruction(kVclz, kFpNeon); 4347 os() << ToCString(kVclz) << ConditionPrinter(it_block_, cond) << dt << " " 4348 << rd << ", " << rm; 4349 } 4350 4351 void Disassembler::vcmp(Condition cond, 4352 DataType dt, 4353 SRegister rd, 4354 SRegister rm) { 4355 os().SetCurrentInstruction(kVcmp, kFpNeon); 4356 os() << ToCString(kVcmp) << ConditionPrinter(it_block_, cond) << dt << " " 4357 << rd << ", " << rm; 4358 } 4359 4360 void Disassembler::vcmp(Condition cond, 4361 DataType dt, 4362 DRegister rd, 4363 DRegister rm) { 4364 os().SetCurrentInstruction(kVcmp, kFpNeon); 4365 os() << ToCString(kVcmp) << ConditionPrinter(it_block_, cond) << dt << " " 4366 << rd << ", " << rm; 4367 } 4368 4369 void Disassembler::vcmp(Condition cond, DataType dt, SRegister rd, double imm) { 4370 os().SetCurrentInstruction(kVcmp, kFpNeon); 4371 os() << ToCString(kVcmp) << ConditionPrinter(it_block_, cond) << dt << " " 4372 << rd << ", " 4373 << "#" << std::fixed << std::setprecision(1) << imm 4374 << std::resetiosflags(std::ios_base::floatfield); 4375 } 4376 4377 void Disassembler::vcmp(Condition cond, DataType dt, DRegister rd, double imm) { 4378 os().SetCurrentInstruction(kVcmp, kFpNeon); 4379 os() << ToCString(kVcmp) << ConditionPrinter(it_block_, cond) << dt << " " 4380 << rd << ", " 4381 << "#" << std::fixed << std::setprecision(1) << imm 4382 << std::resetiosflags(std::ios_base::floatfield); 4383 } 4384 4385 void Disassembler::vcmpe(Condition cond, 4386 DataType dt, 4387 SRegister rd, 4388 SRegister rm) { 4389 os().SetCurrentInstruction(kVcmpe, kFpNeon); 4390 os() << ToCString(kVcmpe) << ConditionPrinter(it_block_, cond) << dt << " " 4391 << rd << ", " << rm; 4392 } 4393 4394 void Disassembler::vcmpe(Condition cond, 4395 DataType dt, 4396 DRegister rd, 4397 DRegister rm) { 4398 os().SetCurrentInstruction(kVcmpe, kFpNeon); 4399 os() << ToCString(kVcmpe) << ConditionPrinter(it_block_, cond) << dt << " " 4400 << rd << ", " << rm; 4401 } 4402 4403 void Disassembler::vcmpe(Condition cond, 4404 DataType dt, 4405 SRegister rd, 4406 double imm) { 4407 os().SetCurrentInstruction(kVcmpe, kFpNeon); 4408 os() << ToCString(kVcmpe) << ConditionPrinter(it_block_, cond) << dt << " " 4409 << rd << ", " 4410 << "#" << std::fixed << std::setprecision(1) << imm 4411 << std::resetiosflags(std::ios_base::floatfield); 4412 } 4413 4414 void Disassembler::vcmpe(Condition cond, 4415 DataType dt, 4416 DRegister rd, 4417 double imm) { 4418 os().SetCurrentInstruction(kVcmpe, kFpNeon); 4419 os() << ToCString(kVcmpe) << ConditionPrinter(it_block_, cond) << dt << " " 4420 << rd << ", " 4421 << "#" << std::fixed << std::setprecision(1) << imm 4422 << std::resetiosflags(std::ios_base::floatfield); 4423 } 4424 4425 void Disassembler::vcnt(Condition cond, 4426 DataType dt, 4427 DRegister rd, 4428 DRegister rm) { 4429 os().SetCurrentInstruction(kVcnt, kFpNeon); 4430 os() << ToCString(kVcnt) << ConditionPrinter(it_block_, cond) << dt << " " 4431 << rd << ", " << rm; 4432 } 4433 4434 void Disassembler::vcnt(Condition cond, 4435 DataType dt, 4436 QRegister rd, 4437 QRegister rm) { 4438 os().SetCurrentInstruction(kVcnt, kFpNeon); 4439 os() << ToCString(kVcnt) << ConditionPrinter(it_block_, cond) << dt << " " 4440 << rd << ", " << rm; 4441 } 4442 4443 void Disassembler::vcvt( 4444 Condition cond, DataType dt1, DataType dt2, DRegister rd, SRegister rm) { 4445 os().SetCurrentInstruction(kVcvt, kFpNeon); 4446 os() << ToCString(kVcvt) << ConditionPrinter(it_block_, cond) << dt1 << dt2 4447 << " " << rd << ", " << rm; 4448 } 4449 4450 void Disassembler::vcvt( 4451 Condition cond, DataType dt1, DataType dt2, SRegister rd, DRegister rm) { 4452 os().SetCurrentInstruction(kVcvt, kFpNeon); 4453 os() << ToCString(kVcvt) << ConditionPrinter(it_block_, cond) << dt1 << dt2 4454 << " " << rd << ", " << rm; 4455 } 4456 4457 void Disassembler::vcvt(Condition cond, 4458 DataType dt1, 4459 DataType dt2, 4460 DRegister rd, 4461 DRegister rm, 4462 int32_t fbits) { 4463 os().SetCurrentInstruction(kVcvt, kFpNeon); 4464 os() << ToCString(kVcvt) << ConditionPrinter(it_block_, cond) << dt1 << dt2 4465 << " " << rd << ", " << rm << ", " 4466 << "#" << fbits; 4467 } 4468 4469 void Disassembler::vcvt(Condition cond, 4470 DataType dt1, 4471 DataType dt2, 4472 QRegister rd, 4473 QRegister rm, 4474 int32_t fbits) { 4475 os().SetCurrentInstruction(kVcvt, kFpNeon); 4476 os() << ToCString(kVcvt) << ConditionPrinter(it_block_, cond) << dt1 << dt2 4477 << " " << rd << ", " << rm << ", " 4478 << "#" << fbits; 4479 } 4480 4481 void Disassembler::vcvt(Condition cond, 4482 DataType dt1, 4483 DataType dt2, 4484 SRegister rd, 4485 SRegister rm, 4486 int32_t fbits) { 4487 os().SetCurrentInstruction(kVcvt, kFpNeon); 4488 os() << ToCString(kVcvt) << ConditionPrinter(it_block_, cond) << dt1 << dt2 4489 << " " << rd << ", " << rm << ", " 4490 << "#" << fbits; 4491 } 4492 4493 void Disassembler::vcvt( 4494 Condition cond, DataType dt1, DataType dt2, DRegister rd, DRegister rm) { 4495 os().SetCurrentInstruction(kVcvt, kFpNeon); 4496 os() << ToCString(kVcvt) << ConditionPrinter(it_block_, cond) << dt1 << dt2 4497 << " " << rd << ", " << rm; 4498 } 4499 4500 void Disassembler::vcvt( 4501 Condition cond, DataType dt1, DataType dt2, QRegister rd, QRegister rm) { 4502 os().SetCurrentInstruction(kVcvt, kFpNeon); 4503 os() << ToCString(kVcvt) << ConditionPrinter(it_block_, cond) << dt1 << dt2 4504 << " " << rd << ", " << rm; 4505 } 4506 4507 void Disassembler::vcvt( 4508 Condition cond, DataType dt1, DataType dt2, DRegister rd, QRegister rm) { 4509 os().SetCurrentInstruction(kVcvt, kFpNeon); 4510 os() << ToCString(kVcvt) << ConditionPrinter(it_block_, cond) << dt1 << dt2 4511 << " " << rd << ", " << rm; 4512 } 4513 4514 void Disassembler::vcvt( 4515 Condition cond, DataType dt1, DataType dt2, QRegister rd, DRegister rm) { 4516 os().SetCurrentInstruction(kVcvt, kFpNeon); 4517 os() << ToCString(kVcvt) << ConditionPrinter(it_block_, cond) << dt1 << dt2 4518 << " " << rd << ", " << rm; 4519 } 4520 4521 void Disassembler::vcvt( 4522 Condition cond, DataType dt1, DataType dt2, SRegister rd, SRegister rm) { 4523 os().SetCurrentInstruction(kVcvt, kFpNeon); 4524 os() << ToCString(kVcvt) << ConditionPrinter(it_block_, cond) << dt1 << dt2 4525 << " " << rd << ", " << rm; 4526 } 4527 4528 void Disassembler::vcvta(DataType dt1, 4529 DataType dt2, 4530 DRegister rd, 4531 DRegister rm) { 4532 os().SetCurrentInstruction(kVcvta, kFpNeon); 4533 os() << ToCString(kVcvta) << dt1 << dt2 << " " << rd << ", " << rm; 4534 } 4535 4536 void Disassembler::vcvta(DataType dt1, 4537 DataType dt2, 4538 QRegister rd, 4539 QRegister rm) { 4540 os().SetCurrentInstruction(kVcvta, kFpNeon); 4541 os() << ToCString(kVcvta) << dt1 << dt2 << " " << rd << ", " << rm; 4542 } 4543 4544 void Disassembler::vcvta(DataType dt1, 4545 DataType dt2, 4546 SRegister rd, 4547 SRegister rm) { 4548 os().SetCurrentInstruction(kVcvta, kFpNeon); 4549 os() << ToCString(kVcvta) << dt1 << dt2 << " " << rd << ", " << rm; 4550 } 4551 4552 void Disassembler::vcvta(DataType dt1, 4553 DataType dt2, 4554 SRegister rd, 4555 DRegister rm) { 4556 os().SetCurrentInstruction(kVcvta, kFpNeon); 4557 os() << ToCString(kVcvta) << dt1 << dt2 << " " << rd << ", " << rm; 4558 } 4559 4560 void Disassembler::vcvtb( 4561 Condition cond, DataType dt1, DataType dt2, SRegister rd, SRegister rm) { 4562 os().SetCurrentInstruction(kVcvtb, kFpNeon); 4563 os() << ToCString(kVcvtb) << ConditionPrinter(it_block_, cond) << dt1 << dt2 4564 << " " << rd << ", " << rm; 4565 } 4566 4567 void Disassembler::vcvtb( 4568 Condition cond, DataType dt1, DataType dt2, DRegister rd, SRegister rm) { 4569 os().SetCurrentInstruction(kVcvtb, kFpNeon); 4570 os() << ToCString(kVcvtb) << ConditionPrinter(it_block_, cond) << dt1 << dt2 4571 << " " << rd << ", " << rm; 4572 } 4573 4574 void Disassembler::vcvtb( 4575 Condition cond, DataType dt1, DataType dt2, SRegister rd, DRegister rm) { 4576 os().SetCurrentInstruction(kVcvtb, kFpNeon); 4577 os() << ToCString(kVcvtb) << ConditionPrinter(it_block_, cond) << dt1 << dt2 4578 << " " << rd << ", " << rm; 4579 } 4580 4581 void Disassembler::vcvtm(DataType dt1, 4582 DataType dt2, 4583 DRegister rd, 4584 DRegister rm) { 4585 os().SetCurrentInstruction(kVcvtm, kFpNeon); 4586 os() << ToCString(kVcvtm) << dt1 << dt2 << " " << rd << ", " << rm; 4587 } 4588 4589 void Disassembler::vcvtm(DataType dt1, 4590 DataType dt2, 4591 QRegister rd, 4592 QRegister rm) { 4593 os().SetCurrentInstruction(kVcvtm, kFpNeon); 4594 os() << ToCString(kVcvtm) << dt1 << dt2 << " " << rd << ", " << rm; 4595 } 4596 4597 void Disassembler::vcvtm(DataType dt1, 4598 DataType dt2, 4599 SRegister rd, 4600 SRegister rm) { 4601 os().SetCurrentInstruction(kVcvtm, kFpNeon); 4602 os() << ToCString(kVcvtm) << dt1 << dt2 << " " << rd << ", " << rm; 4603 } 4604 4605 void Disassembler::vcvtm(DataType dt1, 4606 DataType dt2, 4607 SRegister rd, 4608 DRegister rm) { 4609 os().SetCurrentInstruction(kVcvtm, kFpNeon); 4610 os() << ToCString(kVcvtm) << dt1 << dt2 << " " << rd << ", " << rm; 4611 } 4612 4613 void Disassembler::vcvtn(DataType dt1, 4614 DataType dt2, 4615 DRegister rd, 4616 DRegister rm) { 4617 os().SetCurrentInstruction(kVcvtn, kFpNeon); 4618 os() << ToCString(kVcvtn) << dt1 << dt2 << " " << rd << ", " << rm; 4619 } 4620 4621 void Disassembler::vcvtn(DataType dt1, 4622 DataType dt2, 4623 QRegister rd, 4624 QRegister rm) { 4625 os().SetCurrentInstruction(kVcvtn, kFpNeon); 4626 os() << ToCString(kVcvtn) << dt1 << dt2 << " " << rd << ", " << rm; 4627 } 4628 4629 void Disassembler::vcvtn(DataType dt1, 4630 DataType dt2, 4631 SRegister rd, 4632 SRegister rm) { 4633 os().SetCurrentInstruction(kVcvtn, kFpNeon); 4634 os() << ToCString(kVcvtn) << dt1 << dt2 << " " << rd << ", " << rm; 4635 } 4636 4637 void Disassembler::vcvtn(DataType dt1, 4638 DataType dt2, 4639 SRegister rd, 4640 DRegister rm) { 4641 os().SetCurrentInstruction(kVcvtn, kFpNeon); 4642 os() << ToCString(kVcvtn) << dt1 << dt2 << " " << rd << ", " << rm; 4643 } 4644 4645 void Disassembler::vcvtp(DataType dt1, 4646 DataType dt2, 4647 DRegister rd, 4648 DRegister rm) { 4649 os().SetCurrentInstruction(kVcvtp, kFpNeon); 4650 os() << ToCString(kVcvtp) << dt1 << dt2 << " " << rd << ", " << rm; 4651 } 4652 4653 void Disassembler::vcvtp(DataType dt1, 4654 DataType dt2, 4655 QRegister rd, 4656 QRegister rm) { 4657 os().SetCurrentInstruction(kVcvtp, kFpNeon); 4658 os() << ToCString(kVcvtp) << dt1 << dt2 << " " << rd << ", " << rm; 4659 } 4660 4661 void Disassembler::vcvtp(DataType dt1, 4662 DataType dt2, 4663 SRegister rd, 4664 SRegister rm) { 4665 os().SetCurrentInstruction(kVcvtp, kFpNeon); 4666 os() << ToCString(kVcvtp) << dt1 << dt2 << " " << rd << ", " << rm; 4667 } 4668 4669 void Disassembler::vcvtp(DataType dt1, 4670 DataType dt2, 4671 SRegister rd, 4672 DRegister rm) { 4673 os().SetCurrentInstruction(kVcvtp, kFpNeon); 4674 os() << ToCString(kVcvtp) << dt1 << dt2 << " " << rd << ", " << rm; 4675 } 4676 4677 void Disassembler::vcvtr( 4678 Condition cond, DataType dt1, DataType dt2, SRegister rd, SRegister rm) { 4679 os().SetCurrentInstruction(kVcvtr, kFpNeon); 4680 os() << ToCString(kVcvtr) << ConditionPrinter(it_block_, cond) << dt1 << dt2 4681 << " " << rd << ", " << rm; 4682 } 4683 4684 void Disassembler::vcvtr( 4685 Condition cond, DataType dt1, DataType dt2, SRegister rd, DRegister rm) { 4686 os().SetCurrentInstruction(kVcvtr, kFpNeon); 4687 os() << ToCString(kVcvtr) << ConditionPrinter(it_block_, cond) << dt1 << dt2 4688 << " " << rd << ", " << rm; 4689 } 4690 4691 void Disassembler::vcvtt( 4692 Condition cond, DataType dt1, DataType dt2, SRegister rd, SRegister rm) { 4693 os().SetCurrentInstruction(kVcvtt, kFpNeon); 4694 os() << ToCString(kVcvtt) << ConditionPrinter(it_block_, cond) << dt1 << dt2 4695 << " " << rd << ", " << rm; 4696 } 4697 4698 void Disassembler::vcvtt( 4699 Condition cond, DataType dt1, DataType dt2, DRegister rd, SRegister rm) { 4700 os().SetCurrentInstruction(kVcvtt, kFpNeon); 4701 os() << ToCString(kVcvtt) << ConditionPrinter(it_block_, cond) << dt1 << dt2 4702 << " " << rd << ", " << rm; 4703 } 4704 4705 void Disassembler::vcvtt( 4706 Condition cond, DataType dt1, DataType dt2, SRegister rd, DRegister rm) { 4707 os().SetCurrentInstruction(kVcvtt, kFpNeon); 4708 os() << ToCString(kVcvtt) << ConditionPrinter(it_block_, cond) << dt1 << dt2 4709 << " " << rd << ", " << rm; 4710 } 4711 4712 void Disassembler::vdiv( 4713 Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) { 4714 os().SetCurrentInstruction(kVdiv, kFpNeon); 4715 os() << ToCString(kVdiv) << ConditionPrinter(it_block_, cond) << dt; 4716 os() << " "; 4717 if (!rd.Is(rn)) { 4718 os() << rd << ", "; 4719 } 4720 os() << rn << ", " << rm; 4721 } 4722 4723 void Disassembler::vdiv( 4724 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { 4725 os().SetCurrentInstruction(kVdiv, kFpNeon); 4726 os() << ToCString(kVdiv) << ConditionPrinter(it_block_, cond) << dt; 4727 os() << " "; 4728 if (!rd.Is(rn)) { 4729 os() << rd << ", "; 4730 } 4731 os() << rn << ", " << rm; 4732 } 4733 4734 void Disassembler::vdup(Condition cond, 4735 DataType dt, 4736 QRegister rd, 4737 Register rt) { 4738 os().SetCurrentInstruction(kVdup, kFpNeon); 4739 os() << ToCString(kVdup) << ConditionPrinter(it_block_, cond) << dt << " " 4740 << rd << ", " << rt; 4741 } 4742 4743 void Disassembler::vdup(Condition cond, 4744 DataType dt, 4745 DRegister rd, 4746 Register rt) { 4747 os().SetCurrentInstruction(kVdup, kFpNeon); 4748 os() << ToCString(kVdup) << ConditionPrinter(it_block_, cond) << dt << " " 4749 << rd << ", " << rt; 4750 } 4751 4752 void Disassembler::vdup(Condition cond, 4753 DataType dt, 4754 DRegister rd, 4755 DRegisterLane rm) { 4756 os().SetCurrentInstruction(kVdup, kFpNeon); 4757 os() << ToCString(kVdup) << ConditionPrinter(it_block_, cond) << dt << " " 4758 << rd << ", " << rm; 4759 } 4760 4761 void Disassembler::vdup(Condition cond, 4762 DataType dt, 4763 QRegister rd, 4764 DRegisterLane rm) { 4765 os().SetCurrentInstruction(kVdup, kFpNeon); 4766 os() << ToCString(kVdup) << ConditionPrinter(it_block_, cond) << dt << " " 4767 << rd << ", " << rm; 4768 } 4769 4770 void Disassembler::veor( 4771 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { 4772 os().SetCurrentInstruction(kVeor, kFpNeon); 4773 os() << ToCString(kVeor) << ConditionPrinter(it_block_, cond) << dt; 4774 os() << " "; 4775 if (!rd.Is(rn)) { 4776 os() << rd << ", "; 4777 } 4778 os() << rn << ", " << rm; 4779 } 4780 4781 void Disassembler::veor( 4782 Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { 4783 os().SetCurrentInstruction(kVeor, kFpNeon); 4784 os() << ToCString(kVeor) << ConditionPrinter(it_block_, cond) << dt; 4785 os() << " "; 4786 if (!rd.Is(rn)) { 4787 os() << rd << ", "; 4788 } 4789 os() << rn << ", " << rm; 4790 } 4791 4792 void Disassembler::vext(Condition cond, 4793 DataType dt, 4794 DRegister rd, 4795 DRegister rn, 4796 DRegister rm, 4797 const DOperand& operand) { 4798 os().SetCurrentInstruction(kVext, kFpNeon); 4799 os() << ToCString(kVext) << ConditionPrinter(it_block_, cond) << dt; 4800 os() << " "; 4801 if (!rd.Is(rn)) { 4802 os() << rd << ", "; 4803 } 4804 os() << rn << ", " << rm << ", " << operand; 4805 } 4806 4807 void Disassembler::vext(Condition cond, 4808 DataType dt, 4809 QRegister rd, 4810 QRegister rn, 4811 QRegister rm, 4812 const QOperand& operand) { 4813 os().SetCurrentInstruction(kVext, kFpNeon); 4814 os() << ToCString(kVext) << ConditionPrinter(it_block_, cond) << dt; 4815 os() << " "; 4816 if (!rd.Is(rn)) { 4817 os() << rd << ", "; 4818 } 4819 os() << rn << ", " << rm << ", " << operand; 4820 } 4821 4822 void Disassembler::vfma( 4823 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { 4824 os().SetCurrentInstruction(kVfma, kFpNeon); 4825 os() << ToCString(kVfma) << ConditionPrinter(it_block_, cond) << dt << " " 4826 << rd << ", " << rn << ", " << rm; 4827 } 4828 4829 void Disassembler::vfma( 4830 Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { 4831 os().SetCurrentInstruction(kVfma, kFpNeon); 4832 os() << ToCString(kVfma) << ConditionPrinter(it_block_, cond) << dt << " " 4833 << rd << ", " << rn << ", " << rm; 4834 } 4835 4836 void Disassembler::vfma( 4837 Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) { 4838 os().SetCurrentInstruction(kVfma, kFpNeon); 4839 os() << ToCString(kVfma) << ConditionPrinter(it_block_, cond) << dt << " " 4840 << rd << ", " << rn << ", " << rm; 4841 } 4842 4843 void Disassembler::vfms( 4844 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { 4845 os().SetCurrentInstruction(kVfms, kFpNeon); 4846 os() << ToCString(kVfms) << ConditionPrinter(it_block_, cond) << dt << " " 4847 << rd << ", " << rn << ", " << rm; 4848 } 4849 4850 void Disassembler::vfms( 4851 Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { 4852 os().SetCurrentInstruction(kVfms, kFpNeon); 4853 os() << ToCString(kVfms) << ConditionPrinter(it_block_, cond) << dt << " " 4854 << rd << ", " << rn << ", " << rm; 4855 } 4856 4857 void Disassembler::vfms( 4858 Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) { 4859 os().SetCurrentInstruction(kVfms, kFpNeon); 4860 os() << ToCString(kVfms) << ConditionPrinter(it_block_, cond) << dt << " " 4861 << rd << ", " << rn << ", " << rm; 4862 } 4863 4864 void Disassembler::vfnma( 4865 Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) { 4866 os().SetCurrentInstruction(kVfnma, kFpNeon); 4867 os() << ToCString(kVfnma) << ConditionPrinter(it_block_, cond) << dt << " " 4868 << rd << ", " << rn << ", " << rm; 4869 } 4870 4871 void Disassembler::vfnma( 4872 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { 4873 os().SetCurrentInstruction(kVfnma, kFpNeon); 4874 os() << ToCString(kVfnma) << ConditionPrinter(it_block_, cond) << dt << " " 4875 << rd << ", " << rn << ", " << rm; 4876 } 4877 4878 void Disassembler::vfnms( 4879 Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) { 4880 os().SetCurrentInstruction(kVfnms, kFpNeon); 4881 os() << ToCString(kVfnms) << ConditionPrinter(it_block_, cond) << dt << " " 4882 << rd << ", " << rn << ", " << rm; 4883 } 4884 4885 void Disassembler::vfnms( 4886 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { 4887 os().SetCurrentInstruction(kVfnms, kFpNeon); 4888 os() << ToCString(kVfnms) << ConditionPrinter(it_block_, cond) << dt << " " 4889 << rd << ", " << rn << ", " << rm; 4890 } 4891 4892 void Disassembler::vhadd( 4893 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { 4894 os().SetCurrentInstruction(kVhadd, kFpNeon); 4895 os() << ToCString(kVhadd) << ConditionPrinter(it_block_, cond) << dt; 4896 os() << " "; 4897 if (!rd.Is(rn)) { 4898 os() << rd << ", "; 4899 } 4900 os() << rn << ", " << rm; 4901 } 4902 4903 void Disassembler::vhadd( 4904 Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { 4905 os().SetCurrentInstruction(kVhadd, kFpNeon); 4906 os() << ToCString(kVhadd) << ConditionPrinter(it_block_, cond) << dt; 4907 os() << " "; 4908 if (!rd.Is(rn)) { 4909 os() << rd << ", "; 4910 } 4911 os() << rn << ", " << rm; 4912 } 4913 4914 void Disassembler::vhsub( 4915 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { 4916 os().SetCurrentInstruction(kVhsub, kFpNeon); 4917 os() << ToCString(kVhsub) << ConditionPrinter(it_block_, cond) << dt; 4918 os() << " "; 4919 if (!rd.Is(rn)) { 4920 os() << rd << ", "; 4921 } 4922 os() << rn << ", " << rm; 4923 } 4924 4925 void Disassembler::vhsub( 4926 Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { 4927 os().SetCurrentInstruction(kVhsub, kFpNeon); 4928 os() << ToCString(kVhsub) << ConditionPrinter(it_block_, cond) << dt; 4929 os() << " "; 4930 if (!rd.Is(rn)) { 4931 os() << rd << ", "; 4932 } 4933 os() << rn << ", " << rm; 4934 } 4935 4936 void Disassembler::vld1(Condition cond, 4937 DataType dt, 4938 const NeonRegisterList& nreglist, 4939 const AlignedMemOperand& operand) { 4940 os().SetCurrentInstruction(kVld1, kFpNeon); 4941 os() << ToCString(kVld1) << ConditionPrinter(it_block_, cond) << dt << " " 4942 << nreglist << ", " << PrintAlignedMemOperand(kVld1Location, operand); 4943 } 4944 4945 void Disassembler::vld2(Condition cond, 4946 DataType dt, 4947 const NeonRegisterList& nreglist, 4948 const AlignedMemOperand& operand) { 4949 os().SetCurrentInstruction(kVld2, kFpNeon); 4950 os() << ToCString(kVld2) << ConditionPrinter(it_block_, cond) << dt << " " 4951 << nreglist << ", " << PrintAlignedMemOperand(kVld2Location, operand); 4952 } 4953 4954 void Disassembler::vld3(Condition cond, 4955 DataType dt, 4956 const NeonRegisterList& nreglist, 4957 const AlignedMemOperand& operand) { 4958 os().SetCurrentInstruction(kVld3, kFpNeon); 4959 os() << ToCString(kVld3) << ConditionPrinter(it_block_, cond) << dt << " " 4960 << nreglist << ", " << PrintAlignedMemOperand(kVld3Location, operand); 4961 } 4962 4963 void Disassembler::vld3(Condition cond, 4964 DataType dt, 4965 const NeonRegisterList& nreglist, 4966 const MemOperand& operand) { 4967 os().SetCurrentInstruction(kVld3, kFpNeon); 4968 os() << ToCString(kVld3) << ConditionPrinter(it_block_, cond) << dt << " " 4969 << nreglist << ", " << PrintMemOperand(kVld3Location, operand); 4970 } 4971 4972 void Disassembler::vld4(Condition cond, 4973 DataType dt, 4974 const NeonRegisterList& nreglist, 4975 const AlignedMemOperand& operand) { 4976 os().SetCurrentInstruction(kVld4, kFpNeon); 4977 os() << ToCString(kVld4) << ConditionPrinter(it_block_, cond) << dt << " " 4978 << nreglist << ", " << PrintAlignedMemOperand(kVld4Location, operand); 4979 } 4980 4981 void Disassembler::vldm(Condition cond, 4982 DataType dt, 4983 Register rn, 4984 WriteBack write_back, 4985 DRegisterList dreglist) { 4986 os().SetCurrentInstruction(kVldm, kLoadStore | kLoadStoreMultiple | kFpNeon); 4987 os() << ToCString(kVldm) << ConditionPrinter(it_block_, cond) << dt << " " 4988 << rn << write_back << ", " << dreglist; 4989 } 4990 4991 void Disassembler::vldm(Condition cond, 4992 DataType dt, 4993 Register rn, 4994 WriteBack write_back, 4995 SRegisterList sreglist) { 4996 os().SetCurrentInstruction(kVldm, kLoadStore | kLoadStoreMultiple | kFpNeon); 4997 os() << ToCString(kVldm) << ConditionPrinter(it_block_, cond) << dt << " " 4998 << rn << write_back << ", " << sreglist; 4999 } 5000 5001 void Disassembler::vldmdb(Condition cond, 5002 DataType dt, 5003 Register rn, 5004 WriteBack write_back, 5005 DRegisterList dreglist) { 5006 os().SetCurrentInstruction(kVldmdb, 5007 kLoadStore | kLoadStoreMultiple | kFpNeon); 5008 os() << ToCString(kVldmdb) << ConditionPrinter(it_block_, cond) << dt << " " 5009 << rn << write_back << ", " << dreglist; 5010 } 5011 5012 void Disassembler::vldmdb(Condition cond, 5013 DataType dt, 5014 Register rn, 5015 WriteBack write_back, 5016 SRegisterList sreglist) { 5017 os().SetCurrentInstruction(kVldmdb, 5018 kLoadStore | kLoadStoreMultiple | kFpNeon); 5019 os() << ToCString(kVldmdb) << ConditionPrinter(it_block_, cond) << dt << " " 5020 << rn << write_back << ", " << sreglist; 5021 } 5022 5023 void Disassembler::vldmia(Condition cond, 5024 DataType dt, 5025 Register rn, 5026 WriteBack write_back, 5027 DRegisterList dreglist) { 5028 os().SetCurrentInstruction(kVldmia, 5029 kLoadStore | kLoadStoreMultiple | kFpNeon); 5030 os() << ToCString(kVldmia) << ConditionPrinter(it_block_, cond) << dt << " " 5031 << rn << write_back << ", " << dreglist; 5032 } 5033 5034 void Disassembler::vldmia(Condition cond, 5035 DataType dt, 5036 Register rn, 5037 WriteBack write_back, 5038 SRegisterList sreglist) { 5039 os().SetCurrentInstruction(kVldmia, 5040 kLoadStore | kLoadStoreMultiple | kFpNeon); 5041 os() << ToCString(kVldmia) << ConditionPrinter(it_block_, cond) << dt << " " 5042 << rn << write_back << ", " << sreglist; 5043 } 5044 5045 void Disassembler::vldr(Condition cond, 5046 DataType dt, 5047 DRegister rd, 5048 Label* label) { 5049 os().SetCurrentInstruction(kVldr, kFpNeon); 5050 os() << ToCString(kVldr) << ConditionPrinter(it_block_, cond) << dt << " " 5051 << rd << ", " << PrintLabel(kLoadDoublePrecisionLocation, 5052 label, 5053 GetCodeAddress() & ~3); 5054 } 5055 5056 void Disassembler::vldr(Condition cond, 5057 DataType dt, 5058 DRegister rd, 5059 const MemOperand& operand) { 5060 os().SetCurrentInstruction(kVldr, kFpNeon); 5061 os() << ToCString(kVldr) << ConditionPrinter(it_block_, cond) << dt << " " 5062 << rd << ", " << PrintMemOperand(kLoadDoublePrecisionLocation, operand); 5063 } 5064 5065 void Disassembler::vldr(Condition cond, 5066 DataType dt, 5067 SRegister rd, 5068 Label* label) { 5069 os().SetCurrentInstruction(kVldr, kFpNeon); 5070 os() << ToCString(kVldr) << ConditionPrinter(it_block_, cond) << dt << " " 5071 << rd << ", " << PrintLabel(kLoadSinglePrecisionLocation, 5072 label, 5073 GetCodeAddress() & ~3); 5074 } 5075 5076 void Disassembler::vldr(Condition cond, 5077 DataType dt, 5078 SRegister rd, 5079 const MemOperand& operand) { 5080 os().SetCurrentInstruction(kVldr, kFpNeon); 5081 os() << ToCString(kVldr) << ConditionPrinter(it_block_, cond) << dt << " " 5082 << rd << ", " << PrintMemOperand(kLoadSinglePrecisionLocation, operand); 5083 } 5084 5085 void Disassembler::vmax( 5086 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { 5087 os().SetCurrentInstruction(kVmax, kFpNeon); 5088 os() << ToCString(kVmax) << ConditionPrinter(it_block_, cond) << dt; 5089 os() << " "; 5090 if (!rd.Is(rn)) { 5091 os() << rd << ", "; 5092 } 5093 os() << rn << ", " << rm; 5094 } 5095 5096 void Disassembler::vmax( 5097 Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { 5098 os().SetCurrentInstruction(kVmax, kFpNeon); 5099 os() << ToCString(kVmax) << ConditionPrinter(it_block_, cond) << dt; 5100 os() << " "; 5101 if (!rd.Is(rn)) { 5102 os() << rd << ", "; 5103 } 5104 os() << rn << ", " << rm; 5105 } 5106 5107 void Disassembler::vmaxnm(DataType dt, 5108 DRegister rd, 5109 DRegister rn, 5110 DRegister rm) { 5111 os().SetCurrentInstruction(kVmaxnm, kFpNeon); 5112 os() << ToCString(kVmaxnm) << dt << " " << rd << ", " << rn << ", " << rm; 5113 } 5114 5115 void Disassembler::vmaxnm(DataType dt, 5116 QRegister rd, 5117 QRegister rn, 5118 QRegister rm) { 5119 os().SetCurrentInstruction(kVmaxnm, kFpNeon); 5120 os() << ToCString(kVmaxnm) << dt << " " << rd << ", " << rn << ", " << rm; 5121 } 5122 5123 void Disassembler::vmaxnm(DataType dt, 5124 SRegister rd, 5125 SRegister rn, 5126 SRegister rm) { 5127 os().SetCurrentInstruction(kVmaxnm, kFpNeon); 5128 os() << ToCString(kVmaxnm) << dt << " " << rd << ", " << rn << ", " << rm; 5129 } 5130 5131 void Disassembler::vmin( 5132 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { 5133 os().SetCurrentInstruction(kVmin, kFpNeon); 5134 os() << ToCString(kVmin) << ConditionPrinter(it_block_, cond) << dt; 5135 os() << " "; 5136 if (!rd.Is(rn)) { 5137 os() << rd << ", "; 5138 } 5139 os() << rn << ", " << rm; 5140 } 5141 5142 void Disassembler::vmin( 5143 Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { 5144 os().SetCurrentInstruction(kVmin, kFpNeon); 5145 os() << ToCString(kVmin) << ConditionPrinter(it_block_, cond) << dt; 5146 os() << " "; 5147 if (!rd.Is(rn)) { 5148 os() << rd << ", "; 5149 } 5150 os() << rn << ", " << rm; 5151 } 5152 5153 void Disassembler::vminnm(DataType dt, 5154 DRegister rd, 5155 DRegister rn, 5156 DRegister rm) { 5157 os().SetCurrentInstruction(kVminnm, kFpNeon); 5158 os() << ToCString(kVminnm) << dt << " " << rd << ", " << rn << ", " << rm; 5159 } 5160 5161 void Disassembler::vminnm(DataType dt, 5162 QRegister rd, 5163 QRegister rn, 5164 QRegister rm) { 5165 os().SetCurrentInstruction(kVminnm, kFpNeon); 5166 os() << ToCString(kVminnm) << dt << " " << rd << ", " << rn << ", " << rm; 5167 } 5168 5169 void Disassembler::vminnm(DataType dt, 5170 SRegister rd, 5171 SRegister rn, 5172 SRegister rm) { 5173 os().SetCurrentInstruction(kVminnm, kFpNeon); 5174 os() << ToCString(kVminnm) << dt << " " << rd << ", " << rn << ", " << rm; 5175 } 5176 5177 void Disassembler::vmla( 5178 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegisterLane rm) { 5179 os().SetCurrentInstruction(kVmla, kFpNeon); 5180 os() << ToCString(kVmla) << ConditionPrinter(it_block_, cond) << dt << " " 5181 << rd << ", " << rn << ", " << rm; 5182 } 5183 5184 void Disassembler::vmla( 5185 Condition cond, DataType dt, QRegister rd, QRegister rn, DRegisterLane rm) { 5186 os().SetCurrentInstruction(kVmla, kFpNeon); 5187 os() << ToCString(kVmla) << ConditionPrinter(it_block_, cond) << dt << " " 5188 << rd << ", " << rn << ", " << rm; 5189 } 5190 5191 void Disassembler::vmla( 5192 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { 5193 os().SetCurrentInstruction(kVmla, kFpNeon); 5194 os() << ToCString(kVmla) << ConditionPrinter(it_block_, cond) << dt << " " 5195 << rd << ", " << rn << ", " << rm; 5196 } 5197 5198 void Disassembler::vmla( 5199 Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { 5200 os().SetCurrentInstruction(kVmla, kFpNeon); 5201 os() << ToCString(kVmla) << ConditionPrinter(it_block_, cond) << dt << " " 5202 << rd << ", " << rn << ", " << rm; 5203 } 5204 5205 void Disassembler::vmla( 5206 Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) { 5207 os().SetCurrentInstruction(kVmla, kFpNeon); 5208 os() << ToCString(kVmla) << ConditionPrinter(it_block_, cond) << dt << " " 5209 << rd << ", " << rn << ", " << rm; 5210 } 5211 5212 void Disassembler::vmlal( 5213 Condition cond, DataType dt, QRegister rd, DRegister rn, DRegisterLane rm) { 5214 os().SetCurrentInstruction(kVmlal, kFpNeon); 5215 os() << ToCString(kVmlal) << ConditionPrinter(it_block_, cond) << dt << " " 5216 << rd << ", " << rn << ", " << rm; 5217 } 5218 5219 void Disassembler::vmlal( 5220 Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) { 5221 os().SetCurrentInstruction(kVmlal, kFpNeon); 5222 os() << ToCString(kVmlal) << ConditionPrinter(it_block_, cond) << dt << " " 5223 << rd << ", " << rn << ", " << rm; 5224 } 5225 5226 void Disassembler::vmls( 5227 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegisterLane rm) { 5228 os().SetCurrentInstruction(kVmls, kFpNeon); 5229 os() << ToCString(kVmls) << ConditionPrinter(it_block_, cond) << dt << " " 5230 << rd << ", " << rn << ", " << rm; 5231 } 5232 5233 void Disassembler::vmls( 5234 Condition cond, DataType dt, QRegister rd, QRegister rn, DRegisterLane rm) { 5235 os().SetCurrentInstruction(kVmls, kFpNeon); 5236 os() << ToCString(kVmls) << ConditionPrinter(it_block_, cond) << dt << " " 5237 << rd << ", " << rn << ", " << rm; 5238 } 5239 5240 void Disassembler::vmls( 5241 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { 5242 os().SetCurrentInstruction(kVmls, kFpNeon); 5243 os() << ToCString(kVmls) << ConditionPrinter(it_block_, cond) << dt << " " 5244 << rd << ", " << rn << ", " << rm; 5245 } 5246 5247 void Disassembler::vmls( 5248 Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { 5249 os().SetCurrentInstruction(kVmls, kFpNeon); 5250 os() << ToCString(kVmls) << ConditionPrinter(it_block_, cond) << dt << " " 5251 << rd << ", " << rn << ", " << rm; 5252 } 5253 5254 void Disassembler::vmls( 5255 Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) { 5256 os().SetCurrentInstruction(kVmls, kFpNeon); 5257 os() << ToCString(kVmls) << ConditionPrinter(it_block_, cond) << dt << " " 5258 << rd << ", " << rn << ", " << rm; 5259 } 5260 5261 void Disassembler::vmlsl( 5262 Condition cond, DataType dt, QRegister rd, DRegister rn, DRegisterLane rm) { 5263 os().SetCurrentInstruction(kVmlsl, kFpNeon); 5264 os() << ToCString(kVmlsl) << ConditionPrinter(it_block_, cond) << dt << " " 5265 << rd << ", " << rn << ", " << rm; 5266 } 5267 5268 void Disassembler::vmlsl( 5269 Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) { 5270 os().SetCurrentInstruction(kVmlsl, kFpNeon); 5271 os() << ToCString(kVmlsl) << ConditionPrinter(it_block_, cond) << dt << " " 5272 << rd << ", " << rn << ", " << rm; 5273 } 5274 5275 void Disassembler::vmov(Condition cond, Register rt, SRegister rn) { 5276 os().SetCurrentInstruction(kVmov, kFpNeon); 5277 os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << " " << rt 5278 << ", " << rn; 5279 } 5280 5281 void Disassembler::vmov(Condition cond, SRegister rn, Register rt) { 5282 os().SetCurrentInstruction(kVmov, kFpNeon); 5283 os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << " " << rn 5284 << ", " << rt; 5285 } 5286 5287 void Disassembler::vmov(Condition cond, 5288 Register rt, 5289 Register rt2, 5290 DRegister rm) { 5291 os().SetCurrentInstruction(kVmov, kFpNeon); 5292 os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << " " << rt 5293 << ", " << rt2 << ", " << rm; 5294 } 5295 5296 void Disassembler::vmov(Condition cond, 5297 DRegister rm, 5298 Register rt, 5299 Register rt2) { 5300 os().SetCurrentInstruction(kVmov, kFpNeon); 5301 os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << " " << rm 5302 << ", " << rt << ", " << rt2; 5303 } 5304 5305 void Disassembler::vmov( 5306 Condition cond, Register rt, Register rt2, SRegister rm, SRegister rm1) { 5307 os().SetCurrentInstruction(kVmov, kFpNeon); 5308 os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << " " << rt 5309 << ", " << rt2 << ", " << rm << ", " << rm1; 5310 } 5311 5312 void Disassembler::vmov( 5313 Condition cond, SRegister rm, SRegister rm1, Register rt, Register rt2) { 5314 os().SetCurrentInstruction(kVmov, kFpNeon); 5315 os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << " " << rm 5316 << ", " << rm1 << ", " << rt << ", " << rt2; 5317 } 5318 5319 void Disassembler::vmov(Condition cond, 5320 DataType dt, 5321 DRegisterLane rd, 5322 Register rt) { 5323 os().SetCurrentInstruction(kVmov, kFpNeon); 5324 os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << dt << " " 5325 << rd << ", " << rt; 5326 } 5327 5328 void Disassembler::vmov(Condition cond, 5329 DataType dt, 5330 DRegister rd, 5331 const DOperand& operand) { 5332 os().SetCurrentInstruction(kVmov, kFpNeon); 5333 os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << dt << " " 5334 << rd << ", " << operand; 5335 } 5336 5337 void Disassembler::vmov(Condition cond, 5338 DataType dt, 5339 QRegister rd, 5340 const QOperand& operand) { 5341 os().SetCurrentInstruction(kVmov, kFpNeon); 5342 os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << dt << " " 5343 << rd << ", " << operand; 5344 } 5345 5346 void Disassembler::vmov(Condition cond, 5347 DataType dt, 5348 SRegister rd, 5349 const SOperand& operand) { 5350 os().SetCurrentInstruction(kVmov, kFpNeon); 5351 os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << dt << " " 5352 << rd << ", " << operand; 5353 } 5354 5355 void Disassembler::vmov(Condition cond, 5356 DataType dt, 5357 Register rt, 5358 DRegisterLane rn) { 5359 os().SetCurrentInstruction(kVmov, kFpNeon); 5360 os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << dt << " " 5361 << rt << ", " << rn; 5362 } 5363 5364 void Disassembler::vmovl(Condition cond, 5365 DataType dt, 5366 QRegister rd, 5367 DRegister rm) { 5368 os().SetCurrentInstruction(kVmovl, kFpNeon); 5369 os() << ToCString(kVmovl) << ConditionPrinter(it_block_, cond) << dt << " " 5370 << rd << ", " << rm; 5371 } 5372 5373 void Disassembler::vmovn(Condition cond, 5374 DataType dt, 5375 DRegister rd, 5376 QRegister rm) { 5377 os().SetCurrentInstruction(kVmovn, kFpNeon); 5378 os() << ToCString(kVmovn) << ConditionPrinter(it_block_, cond) << dt << " " 5379 << rd << ", " << rm; 5380 } 5381 5382 void Disassembler::vmrs(Condition cond, 5383 RegisterOrAPSR_nzcv rt, 5384 SpecialFPRegister spec_reg) { 5385 os().SetCurrentInstruction(kVmrs, kFpNeon); 5386 os() << ToCString(kVmrs) << ConditionPrinter(it_block_, cond) << " " << rt 5387 << ", " << spec_reg; 5388 } 5389 5390 void Disassembler::vmsr(Condition cond, 5391 SpecialFPRegister spec_reg, 5392 Register rt) { 5393 os().SetCurrentInstruction(kVmsr, kFpNeon); 5394 os() << ToCString(kVmsr) << ConditionPrinter(it_block_, cond) << " " 5395 << spec_reg << ", " << rt; 5396 } 5397 5398 void Disassembler::vmul(Condition cond, 5399 DataType dt, 5400 DRegister rd, 5401 DRegister rn, 5402 DRegister dm, 5403 unsigned index) { 5404 os().SetCurrentInstruction(kVmul, kFpNeon); 5405 os() << ToCString(kVmul) << ConditionPrinter(it_block_, cond) << dt; 5406 os() << " "; 5407 if (!rd.Is(rn)) { 5408 os() << rd << ", "; 5409 } 5410 os() << rn << ", " << dm << "[" << index << "]"; 5411 } 5412 5413 void Disassembler::vmul(Condition cond, 5414 DataType dt, 5415 QRegister rd, 5416 QRegister rn, 5417 DRegister dm, 5418 unsigned index) { 5419 os().SetCurrentInstruction(kVmul, kFpNeon); 5420 os() << ToCString(kVmul) << ConditionPrinter(it_block_, cond) << dt; 5421 os() << " "; 5422 if (!rd.Is(rn)) { 5423 os() << rd << ", "; 5424 } 5425 os() << rn << ", " << dm << "[" << index << "]"; 5426 } 5427 5428 void Disassembler::vmul( 5429 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { 5430 os().SetCurrentInstruction(kVmul, kFpNeon); 5431 os() << ToCString(kVmul) << ConditionPrinter(it_block_, cond) << dt; 5432 os() << " "; 5433 if (!rd.Is(rn)) { 5434 os() << rd << ", "; 5435 } 5436 os() << rn << ", " << rm; 5437 } 5438 5439 void Disassembler::vmul( 5440 Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { 5441 os().SetCurrentInstruction(kVmul, kFpNeon); 5442 os() << ToCString(kVmul) << ConditionPrinter(it_block_, cond) << dt; 5443 os() << " "; 5444 if (!rd.Is(rn)) { 5445 os() << rd << ", "; 5446 } 5447 os() << rn << ", " << rm; 5448 } 5449 5450 void Disassembler::vmul( 5451 Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) { 5452 os().SetCurrentInstruction(kVmul, kFpNeon); 5453 os() << ToCString(kVmul) << ConditionPrinter(it_block_, cond) << dt; 5454 os() << " "; 5455 if (!rd.Is(rn)) { 5456 os() << rd << ", "; 5457 } 5458 os() << rn << ", " << rm; 5459 } 5460 5461 void Disassembler::vmull(Condition cond, 5462 DataType dt, 5463 QRegister rd, 5464 DRegister rn, 5465 DRegister dm, 5466 unsigned index) { 5467 os().SetCurrentInstruction(kVmull, kFpNeon); 5468 os() << ToCString(kVmull) << ConditionPrinter(it_block_, cond) << dt << " " 5469 << rd << ", " << rn << ", " << dm << "[" << index << "]"; 5470 } 5471 5472 void Disassembler::vmull( 5473 Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) { 5474 os().SetCurrentInstruction(kVmull, kFpNeon); 5475 os() << ToCString(kVmull) << ConditionPrinter(it_block_, cond) << dt << " " 5476 << rd << ", " << rn << ", " << rm; 5477 } 5478 5479 void Disassembler::vmvn(Condition cond, 5480 DataType dt, 5481 DRegister rd, 5482 const DOperand& operand) { 5483 os().SetCurrentInstruction(kVmvn, kFpNeon); 5484 os() << ToCString(kVmvn) << ConditionPrinter(it_block_, cond) << dt << " " 5485 << rd << ", " << operand; 5486 } 5487 5488 void Disassembler::vmvn(Condition cond, 5489 DataType dt, 5490 QRegister rd, 5491 const QOperand& operand) { 5492 os().SetCurrentInstruction(kVmvn, kFpNeon); 5493 os() << ToCString(kVmvn) << ConditionPrinter(it_block_, cond) << dt << " " 5494 << rd << ", " << operand; 5495 } 5496 5497 void Disassembler::vneg(Condition cond, 5498 DataType dt, 5499 DRegister rd, 5500 DRegister rm) { 5501 os().SetCurrentInstruction(kVneg, kFpNeon); 5502 os() << ToCString(kVneg) << ConditionPrinter(it_block_, cond) << dt << " " 5503 << rd << ", " << rm; 5504 } 5505 5506 void Disassembler::vneg(Condition cond, 5507 DataType dt, 5508 QRegister rd, 5509 QRegister rm) { 5510 os().SetCurrentInstruction(kVneg, kFpNeon); 5511 os() << ToCString(kVneg) << ConditionPrinter(it_block_, cond) << dt << " " 5512 << rd << ", " << rm; 5513 } 5514 5515 void Disassembler::vneg(Condition cond, 5516 DataType dt, 5517 SRegister rd, 5518 SRegister rm) { 5519 os().SetCurrentInstruction(kVneg, kFpNeon); 5520 os() << ToCString(kVneg) << ConditionPrinter(it_block_, cond) << dt << " " 5521 << rd << ", " << rm; 5522 } 5523 5524 void Disassembler::vnmla( 5525 Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) { 5526 os().SetCurrentInstruction(kVnmla, kFpNeon); 5527 os() << ToCString(kVnmla) << ConditionPrinter(it_block_, cond) << dt << " " 5528 << rd << ", " << rn << ", " << rm; 5529 } 5530 5531 void Disassembler::vnmla( 5532 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { 5533 os().SetCurrentInstruction(kVnmla, kFpNeon); 5534 os() << ToCString(kVnmla) << ConditionPrinter(it_block_, cond) << dt << " " 5535 << rd << ", " << rn << ", " << rm; 5536 } 5537 5538 void Disassembler::vnmls( 5539 Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) { 5540 os().SetCurrentInstruction(kVnmls, kFpNeon); 5541 os() << ToCString(kVnmls) << ConditionPrinter(it_block_, cond) << dt << " " 5542 << rd << ", " << rn << ", " << rm; 5543 } 5544 5545 void Disassembler::vnmls( 5546 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { 5547 os().SetCurrentInstruction(kVnmls, kFpNeon); 5548 os() << ToCString(kVnmls) << ConditionPrinter(it_block_, cond) << dt << " " 5549 << rd << ", " << rn << ", " << rm; 5550 } 5551 5552 void Disassembler::vnmul( 5553 Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) { 5554 os().SetCurrentInstruction(kVnmul, kFpNeon); 5555 os() << ToCString(kVnmul) << ConditionPrinter(it_block_, cond) << dt; 5556 os() << " "; 5557 if (!rd.Is(rn)) { 5558 os() << rd << ", "; 5559 } 5560 os() << rn << ", " << rm; 5561 } 5562 5563 void Disassembler::vnmul( 5564 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { 5565 os().SetCurrentInstruction(kVnmul, kFpNeon); 5566 os() << ToCString(kVnmul) << ConditionPrinter(it_block_, cond) << dt; 5567 os() << " "; 5568 if (!rd.Is(rn)) { 5569 os() << rd << ", "; 5570 } 5571 os() << rn << ", " << rm; 5572 } 5573 5574 void Disassembler::vorn(Condition cond, 5575 DataType dt, 5576 DRegister rd, 5577 DRegister rn, 5578 const DOperand& operand) { 5579 os().SetCurrentInstruction(kVorn, kFpNeon); 5580 os() << ToCString(kVorn) << ConditionPrinter(it_block_, cond) << dt; 5581 os() << " "; 5582 if (!rd.Is(rn)) { 5583 os() << rd << ", "; 5584 } 5585 os() << rn << ", " << operand; 5586 } 5587 5588 void Disassembler::vorn(Condition cond, 5589 DataType dt, 5590 QRegister rd, 5591 QRegister rn, 5592 const QOperand& operand) { 5593 os().SetCurrentInstruction(kVorn, kFpNeon); 5594 os() << ToCString(kVorn) << ConditionPrinter(it_block_, cond) << dt; 5595 os() << " "; 5596 if (!rd.Is(rn)) { 5597 os() << rd << ", "; 5598 } 5599 os() << rn << ", " << operand; 5600 } 5601 5602 void Disassembler::vorr(Condition cond, 5603 DataType dt, 5604 DRegister rd, 5605 DRegister rn, 5606 const DOperand& operand) { 5607 os().SetCurrentInstruction(kVorr, kFpNeon); 5608 os() << ToCString(kVorr) << ConditionPrinter(it_block_, cond) << dt; 5609 os() << " "; 5610 if (!rd.Is(rn)) { 5611 os() << rd << ", "; 5612 } 5613 os() << rn << ", " << operand; 5614 } 5615 5616 void Disassembler::vorr(Condition cond, 5617 DataType dt, 5618 QRegister rd, 5619 QRegister rn, 5620 const QOperand& operand) { 5621 os().SetCurrentInstruction(kVorr, kFpNeon); 5622 os() << ToCString(kVorr) << ConditionPrinter(it_block_, cond) << dt; 5623 os() << " "; 5624 if (!rd.Is(rn)) { 5625 os() << rd << ", "; 5626 } 5627 os() << rn << ", " << operand; 5628 } 5629 5630 void Disassembler::vpadal(Condition cond, 5631 DataType dt, 5632 DRegister rd, 5633 DRegister rm) { 5634 os().SetCurrentInstruction(kVpadal, kFpNeon); 5635 os() << ToCString(kVpadal) << ConditionPrinter(it_block_, cond) << dt << " " 5636 << rd << ", " << rm; 5637 } 5638 5639 void Disassembler::vpadal(Condition cond, 5640 DataType dt, 5641 QRegister rd, 5642 QRegister rm) { 5643 os().SetCurrentInstruction(kVpadal, kFpNeon); 5644 os() << ToCString(kVpadal) << ConditionPrinter(it_block_, cond) << dt << " " 5645 << rd << ", " << rm; 5646 } 5647 5648 void Disassembler::vpadd( 5649 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { 5650 os().SetCurrentInstruction(kVpadd, kFpNeon); 5651 os() << ToCString(kVpadd) << ConditionPrinter(it_block_, cond) << dt; 5652 os() << " "; 5653 if (!rd.Is(rn)) { 5654 os() << rd << ", "; 5655 } 5656 os() << rn << ", " << rm; 5657 } 5658 5659 void Disassembler::vpaddl(Condition cond, 5660 DataType dt, 5661 DRegister rd, 5662 DRegister rm) { 5663 os().SetCurrentInstruction(kVpaddl, kFpNeon); 5664 os() << ToCString(kVpaddl) << ConditionPrinter(it_block_, cond) << dt << " " 5665 << rd << ", " << rm; 5666 } 5667 5668 void Disassembler::vpaddl(Condition cond, 5669 DataType dt, 5670 QRegister rd, 5671 QRegister rm) { 5672 os().SetCurrentInstruction(kVpaddl, kFpNeon); 5673 os() << ToCString(kVpaddl) << ConditionPrinter(it_block_, cond) << dt << " " 5674 << rd << ", " << rm; 5675 } 5676 5677 void Disassembler::vpmax( 5678 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { 5679 os().SetCurrentInstruction(kVpmax, kFpNeon); 5680 os() << ToCString(kVpmax) << ConditionPrinter(it_block_, cond) << dt; 5681 os() << " "; 5682 if (!rd.Is(rn)) { 5683 os() << rd << ", "; 5684 } 5685 os() << rn << ", " << rm; 5686 } 5687 5688 void Disassembler::vpmin( 5689 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { 5690 os().SetCurrentInstruction(kVpmin, kFpNeon); 5691 os() << ToCString(kVpmin) << ConditionPrinter(it_block_, cond) << dt; 5692 os() << " "; 5693 if (!rd.Is(rn)) { 5694 os() << rd << ", "; 5695 } 5696 os() << rn << ", " << rm; 5697 } 5698 5699 void Disassembler::vpop(Condition cond, DataType dt, DRegisterList dreglist) { 5700 os().SetCurrentInstruction(kVpop, kLoadStore | kLoadStoreMultiple | kFpNeon); 5701 os() << ToCString(kVpop) << ConditionPrinter(it_block_, cond) << dt << " " 5702 << dreglist; 5703 } 5704 5705 void Disassembler::vpop(Condition cond, DataType dt, SRegisterList sreglist) { 5706 os().SetCurrentInstruction(kVpop, kLoadStore | kLoadStoreMultiple | kFpNeon); 5707 os() << ToCString(kVpop) << ConditionPrinter(it_block_, cond) << dt << " " 5708 << sreglist; 5709 } 5710 5711 void Disassembler::vpush(Condition cond, DataType dt, DRegisterList dreglist) { 5712 os().SetCurrentInstruction(kVpush, kLoadStore | kLoadStoreMultiple | kFpNeon); 5713 os() << ToCString(kVpush) << ConditionPrinter(it_block_, cond) << dt << " " 5714 << dreglist; 5715 } 5716 5717 void Disassembler::vpush(Condition cond, DataType dt, SRegisterList sreglist) { 5718 os().SetCurrentInstruction(kVpush, kLoadStore | kLoadStoreMultiple | kFpNeon); 5719 os() << ToCString(kVpush) << ConditionPrinter(it_block_, cond) << dt << " " 5720 << sreglist; 5721 } 5722 5723 void Disassembler::vqabs(Condition cond, 5724 DataType dt, 5725 DRegister rd, 5726 DRegister rm) { 5727 os().SetCurrentInstruction(kVqabs, kFpNeon); 5728 os() << ToCString(kVqabs) << ConditionPrinter(it_block_, cond) << dt << " " 5729 << rd << ", " << rm; 5730 } 5731 5732 void Disassembler::vqabs(Condition cond, 5733 DataType dt, 5734 QRegister rd, 5735 QRegister rm) { 5736 os().SetCurrentInstruction(kVqabs, kFpNeon); 5737 os() << ToCString(kVqabs) << ConditionPrinter(it_block_, cond) << dt << " " 5738 << rd << ", " << rm; 5739 } 5740 5741 void Disassembler::vqadd( 5742 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { 5743 os().SetCurrentInstruction(kVqadd, kFpNeon); 5744 os() << ToCString(kVqadd) << ConditionPrinter(it_block_, cond) << dt; 5745 os() << " "; 5746 if (!rd.Is(rn)) { 5747 os() << rd << ", "; 5748 } 5749 os() << rn << ", " << rm; 5750 } 5751 5752 void Disassembler::vqadd( 5753 Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { 5754 os().SetCurrentInstruction(kVqadd, kFpNeon); 5755 os() << ToCString(kVqadd) << ConditionPrinter(it_block_, cond) << dt; 5756 os() << " "; 5757 if (!rd.Is(rn)) { 5758 os() << rd << ", "; 5759 } 5760 os() << rn << ", " << rm; 5761 } 5762 5763 void Disassembler::vqdmlal( 5764 Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) { 5765 os().SetCurrentInstruction(kVqdmlal, kFpNeon); 5766 os() << ToCString(kVqdmlal) << ConditionPrinter(it_block_, cond) << dt << " " 5767 << rd << ", " << rn << ", " << rm; 5768 } 5769 5770 void Disassembler::vqdmlal(Condition cond, 5771 DataType dt, 5772 QRegister rd, 5773 DRegister rn, 5774 DRegister dm, 5775 unsigned index) { 5776 os().SetCurrentInstruction(kVqdmlal, kFpNeon); 5777 os() << ToCString(kVqdmlal) << ConditionPrinter(it_block_, cond) << dt << " " 5778 << rd << ", " << rn << ", " << dm << "[" << index << "]"; 5779 } 5780 5781 void Disassembler::vqdmlsl( 5782 Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) { 5783 os().SetCurrentInstruction(kVqdmlsl, kFpNeon); 5784 os() << ToCString(kVqdmlsl) << ConditionPrinter(it_block_, cond) << dt << " " 5785 << rd << ", " << rn << ", " << rm; 5786 } 5787 5788 void Disassembler::vqdmlsl(Condition cond, 5789 DataType dt, 5790 QRegister rd, 5791 DRegister rn, 5792 DRegister dm, 5793 unsigned index) { 5794 os().SetCurrentInstruction(kVqdmlsl, kFpNeon); 5795 os() << ToCString(kVqdmlsl) << ConditionPrinter(it_block_, cond) << dt << " " 5796 << rd << ", " << rn << ", " << dm << "[" << index << "]"; 5797 } 5798 5799 void Disassembler::vqdmulh( 5800 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { 5801 os().SetCurrentInstruction(kVqdmulh, kFpNeon); 5802 os() << ToCString(kVqdmulh) << ConditionPrinter(it_block_, cond) << dt; 5803 os() << " "; 5804 if (!rd.Is(rn)) { 5805 os() << rd << ", "; 5806 } 5807 os() << rn << ", " << rm; 5808 } 5809 5810 void Disassembler::vqdmulh( 5811 Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { 5812 os().SetCurrentInstruction(kVqdmulh, kFpNeon); 5813 os() << ToCString(kVqdmulh) << ConditionPrinter(it_block_, cond) << dt; 5814 os() << " "; 5815 if (!rd.Is(rn)) { 5816 os() << rd << ", "; 5817 } 5818 os() << rn << ", " << rm; 5819 } 5820 5821 void Disassembler::vqdmulh( 5822 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegisterLane rm) { 5823 os().SetCurrentInstruction(kVqdmulh, kFpNeon); 5824 os() << ToCString(kVqdmulh) << ConditionPrinter(it_block_, cond) << dt; 5825 os() << " "; 5826 if (!rd.Is(rn)) { 5827 os() << rd << ", "; 5828 } 5829 os() << rn << ", " << rm; 5830 } 5831 5832 void Disassembler::vqdmulh( 5833 Condition cond, DataType dt, QRegister rd, QRegister rn, DRegisterLane rm) { 5834 os().SetCurrentInstruction(kVqdmulh, kFpNeon); 5835 os() << ToCString(kVqdmulh) << ConditionPrinter(it_block_, cond) << dt; 5836 os() << " "; 5837 if (!rd.Is(rn)) { 5838 os() << rd << ", "; 5839 } 5840 os() << rn << ", " << rm; 5841 } 5842 5843 void Disassembler::vqdmull( 5844 Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) { 5845 os().SetCurrentInstruction(kVqdmull, kFpNeon); 5846 os() << ToCString(kVqdmull) << ConditionPrinter(it_block_, cond) << dt << " " 5847 << rd << ", " << rn << ", " << rm; 5848 } 5849 5850 void Disassembler::vqdmull( 5851 Condition cond, DataType dt, QRegister rd, DRegister rn, DRegisterLane rm) { 5852 os().SetCurrentInstruction(kVqdmull, kFpNeon); 5853 os() << ToCString(kVqdmull) << ConditionPrinter(it_block_, cond) << dt << " " 5854 << rd << ", " << rn << ", " << rm; 5855 } 5856 5857 void Disassembler::vqmovn(Condition cond, 5858 DataType dt, 5859 DRegister rd, 5860 QRegister rm) { 5861 os().SetCurrentInstruction(kVqmovn, kFpNeon); 5862 os() << ToCString(kVqmovn) << ConditionPrinter(it_block_, cond) << dt << " " 5863 << rd << ", " << rm; 5864 } 5865 5866 void Disassembler::vqmovun(Condition cond, 5867 DataType dt, 5868 DRegister rd, 5869 QRegister rm) { 5870 os().SetCurrentInstruction(kVqmovun, kFpNeon); 5871 os() << ToCString(kVqmovun) << ConditionPrinter(it_block_, cond) << dt << " " 5872 << rd << ", " << rm; 5873 } 5874 5875 void Disassembler::vqneg(Condition cond, 5876 DataType dt, 5877 DRegister rd, 5878 DRegister rm) { 5879 os().SetCurrentInstruction(kVqneg, kFpNeon); 5880 os() << ToCString(kVqneg) << ConditionPrinter(it_block_, cond) << dt << " " 5881 << rd << ", " << rm; 5882 } 5883 5884 void Disassembler::vqneg(Condition cond, 5885 DataType dt, 5886 QRegister rd, 5887 QRegister rm) { 5888 os().SetCurrentInstruction(kVqneg, kFpNeon); 5889 os() << ToCString(kVqneg) << ConditionPrinter(it_block_, cond) << dt << " " 5890 << rd << ", " << rm; 5891 } 5892 5893 void Disassembler::vqrdmulh( 5894 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { 5895 os().SetCurrentInstruction(kVqrdmulh, kFpNeon); 5896 os() << ToCString(kVqrdmulh) << ConditionPrinter(it_block_, cond) << dt; 5897 os() << " "; 5898 if (!rd.Is(rn)) { 5899 os() << rd << ", "; 5900 } 5901 os() << rn << ", " << rm; 5902 } 5903 5904 void Disassembler::vqrdmulh( 5905 Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { 5906 os().SetCurrentInstruction(kVqrdmulh, kFpNeon); 5907 os() << ToCString(kVqrdmulh) << ConditionPrinter(it_block_, cond) << dt; 5908 os() << " "; 5909 if (!rd.Is(rn)) { 5910 os() << rd << ", "; 5911 } 5912 os() << rn << ", " << rm; 5913 } 5914 5915 void Disassembler::vqrdmulh( 5916 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegisterLane rm) { 5917 os().SetCurrentInstruction(kVqrdmulh, kFpNeon); 5918 os() << ToCString(kVqrdmulh) << ConditionPrinter(it_block_, cond) << dt; 5919 os() << " "; 5920 if (!rd.Is(rn)) { 5921 os() << rd << ", "; 5922 } 5923 os() << rn << ", " << rm; 5924 } 5925 5926 void Disassembler::vqrdmulh( 5927 Condition cond, DataType dt, QRegister rd, QRegister rn, DRegisterLane rm) { 5928 os().SetCurrentInstruction(kVqrdmulh, kFpNeon); 5929 os() << ToCString(kVqrdmulh) << ConditionPrinter(it_block_, cond) << dt; 5930 os() << " "; 5931 if (!rd.Is(rn)) { 5932 os() << rd << ", "; 5933 } 5934 os() << rn << ", " << rm; 5935 } 5936 5937 void Disassembler::vqrshl( 5938 Condition cond, DataType dt, DRegister rd, DRegister rm, DRegister rn) { 5939 os().SetCurrentInstruction(kVqrshl, kFpNeon); 5940 os() << ToCString(kVqrshl) << ConditionPrinter(it_block_, cond) << dt; 5941 os() << " "; 5942 if (!rd.Is(rm)) { 5943 os() << rd << ", "; 5944 } 5945 os() << rm << ", " << rn; 5946 } 5947 5948 void Disassembler::vqrshl( 5949 Condition cond, DataType dt, QRegister rd, QRegister rm, QRegister rn) { 5950 os().SetCurrentInstruction(kVqrshl, kFpNeon); 5951 os() << ToCString(kVqrshl) << ConditionPrinter(it_block_, cond) << dt; 5952 os() << " "; 5953 if (!rd.Is(rm)) { 5954 os() << rd << ", "; 5955 } 5956 os() << rm << ", " << rn; 5957 } 5958 5959 void Disassembler::vqrshrn(Condition cond, 5960 DataType dt, 5961 DRegister rd, 5962 QRegister rm, 5963 const QOperand& operand) { 5964 os().SetCurrentInstruction(kVqrshrn, kFpNeon); 5965 os() << ToCString(kVqrshrn) << ConditionPrinter(it_block_, cond) << dt << " " 5966 << rd << ", " << rm << ", " << operand; 5967 } 5968 5969 void Disassembler::vqrshrun(Condition cond, 5970 DataType dt, 5971 DRegister rd, 5972 QRegister rm, 5973 const QOperand& operand) { 5974 os().SetCurrentInstruction(kVqrshrun, kFpNeon); 5975 os() << ToCString(kVqrshrun) << ConditionPrinter(it_block_, cond) << dt << " " 5976 << rd << ", " << rm << ", " << operand; 5977 } 5978 5979 void Disassembler::vqshl(Condition cond, 5980 DataType dt, 5981 DRegister rd, 5982 DRegister rm, 5983 const DOperand& operand) { 5984 os().SetCurrentInstruction(kVqshl, kFpNeon); 5985 os() << ToCString(kVqshl) << ConditionPrinter(it_block_, cond) << dt; 5986 os() << " "; 5987 if (!rd.Is(rm)) { 5988 os() << rd << ", "; 5989 } 5990 os() << rm << ", " << operand; 5991 } 5992 5993 void Disassembler::vqshl(Condition cond, 5994 DataType dt, 5995 QRegister rd, 5996 QRegister rm, 5997 const QOperand& operand) { 5998 os().SetCurrentInstruction(kVqshl, kFpNeon); 5999 os() << ToCString(kVqshl) << ConditionPrinter(it_block_, cond) << dt; 6000 os() << " "; 6001 if (!rd.Is(rm)) { 6002 os() << rd << ", "; 6003 } 6004 os() << rm << ", " << operand; 6005 } 6006 6007 void Disassembler::vqshlu(Condition cond, 6008 DataType dt, 6009 DRegister rd, 6010 DRegister rm, 6011 const DOperand& operand) { 6012 os().SetCurrentInstruction(kVqshlu, kFpNeon); 6013 os() << ToCString(kVqshlu) << ConditionPrinter(it_block_, cond) << dt; 6014 os() << " "; 6015 if (!rd.Is(rm)) { 6016 os() << rd << ", "; 6017 } 6018 os() << rm << ", " << operand; 6019 } 6020 6021 void Disassembler::vqshlu(Condition cond, 6022 DataType dt, 6023 QRegister rd, 6024 QRegister rm, 6025 const QOperand& operand) { 6026 os().SetCurrentInstruction(kVqshlu, kFpNeon); 6027 os() << ToCString(kVqshlu) << ConditionPrinter(it_block_, cond) << dt; 6028 os() << " "; 6029 if (!rd.Is(rm)) { 6030 os() << rd << ", "; 6031 } 6032 os() << rm << ", " << operand; 6033 } 6034 6035 void Disassembler::vqshrn(Condition cond, 6036 DataType dt, 6037 DRegister rd, 6038 QRegister rm, 6039 const QOperand& operand) { 6040 os().SetCurrentInstruction(kVqshrn, kFpNeon); 6041 os() << ToCString(kVqshrn) << ConditionPrinter(it_block_, cond) << dt << " " 6042 << rd << ", " << rm << ", " << operand; 6043 } 6044 6045 void Disassembler::vqshrun(Condition cond, 6046 DataType dt, 6047 DRegister rd, 6048 QRegister rm, 6049 const QOperand& operand) { 6050 os().SetCurrentInstruction(kVqshrun, kFpNeon); 6051 os() << ToCString(kVqshrun) << ConditionPrinter(it_block_, cond) << dt << " " 6052 << rd << ", " << rm << ", " << operand; 6053 } 6054 6055 void Disassembler::vqsub( 6056 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { 6057 os().SetCurrentInstruction(kVqsub, kFpNeon); 6058 os() << ToCString(kVqsub) << ConditionPrinter(it_block_, cond) << dt; 6059 os() << " "; 6060 if (!rd.Is(rn)) { 6061 os() << rd << ", "; 6062 } 6063 os() << rn << ", " << rm; 6064 } 6065 6066 void Disassembler::vqsub( 6067 Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { 6068 os().SetCurrentInstruction(kVqsub, kFpNeon); 6069 os() << ToCString(kVqsub) << ConditionPrinter(it_block_, cond) << dt; 6070 os() << " "; 6071 if (!rd.Is(rn)) { 6072 os() << rd << ", "; 6073 } 6074 os() << rn << ", " << rm; 6075 } 6076 6077 void Disassembler::vraddhn( 6078 Condition cond, DataType dt, DRegister rd, QRegister rn, QRegister rm) { 6079 os().SetCurrentInstruction(kVraddhn, kFpNeon); 6080 os() << ToCString(kVraddhn) << ConditionPrinter(it_block_, cond) << dt << " " 6081 << rd << ", " << rn << ", " << rm; 6082 } 6083 6084 void Disassembler::vrecpe(Condition cond, 6085 DataType dt, 6086 DRegister rd, 6087 DRegister rm) { 6088 os().SetCurrentInstruction(kVrecpe, kFpNeon); 6089 os() << ToCString(kVrecpe) << ConditionPrinter(it_block_, cond) << dt << " " 6090 << rd << ", " << rm; 6091 } 6092 6093 void Disassembler::vrecpe(Condition cond, 6094 DataType dt, 6095 QRegister rd, 6096 QRegister rm) { 6097 os().SetCurrentInstruction(kVrecpe, kFpNeon); 6098 os() << ToCString(kVrecpe) << ConditionPrinter(it_block_, cond) << dt << " " 6099 << rd << ", " << rm; 6100 } 6101 6102 void Disassembler::vrecps( 6103 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { 6104 os().SetCurrentInstruction(kVrecps, kFpNeon); 6105 os() << ToCString(kVrecps) << ConditionPrinter(it_block_, cond) << dt; 6106 os() << " "; 6107 if (!rd.Is(rn)) { 6108 os() << rd << ", "; 6109 } 6110 os() << rn << ", " << rm; 6111 } 6112 6113 void Disassembler::vrecps( 6114 Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { 6115 os().SetCurrentInstruction(kVrecps, kFpNeon); 6116 os() << ToCString(kVrecps) << ConditionPrinter(it_block_, cond) << dt; 6117 os() << " "; 6118 if (!rd.Is(rn)) { 6119 os() << rd << ", "; 6120 } 6121 os() << rn << ", " << rm; 6122 } 6123 6124 void Disassembler::vrev16(Condition cond, 6125 DataType dt, 6126 DRegister rd, 6127 DRegister rm) { 6128 os().SetCurrentInstruction(kVrev16, kFpNeon); 6129 os() << ToCString(kVrev16) << ConditionPrinter(it_block_, cond) << dt << " " 6130 << rd << ", " << rm; 6131 } 6132 6133 void Disassembler::vrev16(Condition cond, 6134 DataType dt, 6135 QRegister rd, 6136 QRegister rm) { 6137 os().SetCurrentInstruction(kVrev16, kFpNeon); 6138 os() << ToCString(kVrev16) << ConditionPrinter(it_block_, cond) << dt << " " 6139 << rd << ", " << rm; 6140 } 6141 6142 void Disassembler::vrev32(Condition cond, 6143 DataType dt, 6144 DRegister rd, 6145 DRegister rm) { 6146 os().SetCurrentInstruction(kVrev32, kFpNeon); 6147 os() << ToCString(kVrev32) << ConditionPrinter(it_block_, cond) << dt << " " 6148 << rd << ", " << rm; 6149 } 6150 6151 void Disassembler::vrev32(Condition cond, 6152 DataType dt, 6153 QRegister rd, 6154 QRegister rm) { 6155 os().SetCurrentInstruction(kVrev32, kFpNeon); 6156 os() << ToCString(kVrev32) << ConditionPrinter(it_block_, cond) << dt << " " 6157 << rd << ", " << rm; 6158 } 6159 6160 void Disassembler::vrev64(Condition cond, 6161 DataType dt, 6162 DRegister rd, 6163 DRegister rm) { 6164 os().SetCurrentInstruction(kVrev64, kFpNeon); 6165 os() << ToCString(kVrev64) << ConditionPrinter(it_block_, cond) << dt << " " 6166 << rd << ", " << rm; 6167 } 6168 6169 void Disassembler::vrev64(Condition cond, 6170 DataType dt, 6171 QRegister rd, 6172 QRegister rm) { 6173 os().SetCurrentInstruction(kVrev64, kFpNeon); 6174 os() << ToCString(kVrev64) << ConditionPrinter(it_block_, cond) << dt << " " 6175 << rd << ", " << rm; 6176 } 6177 6178 void Disassembler::vrhadd( 6179 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { 6180 os().SetCurrentInstruction(kVrhadd, kFpNeon); 6181 os() << ToCString(kVrhadd) << ConditionPrinter(it_block_, cond) << dt; 6182 os() << " "; 6183 if (!rd.Is(rn)) { 6184 os() << rd << ", "; 6185 } 6186 os() << rn << ", " << rm; 6187 } 6188 6189 void Disassembler::vrhadd( 6190 Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { 6191 os().SetCurrentInstruction(kVrhadd, kFpNeon); 6192 os() << ToCString(kVrhadd) << ConditionPrinter(it_block_, cond) << dt; 6193 os() << " "; 6194 if (!rd.Is(rn)) { 6195 os() << rd << ", "; 6196 } 6197 os() << rn << ", " << rm; 6198 } 6199 6200 void Disassembler::vrinta(DataType dt1, 6201 DataType dt2, 6202 DRegister rd, 6203 DRegister rm) { 6204 os().SetCurrentInstruction(kVrinta, kFpNeon); 6205 os() << ToCString(kVrinta) << dt1 << dt2 << " " << rd << ", " << rm; 6206 } 6207 6208 void Disassembler::vrinta(DataType dt1, 6209 DataType dt2, 6210 QRegister rd, 6211 QRegister rm) { 6212 os().SetCurrentInstruction(kVrinta, kFpNeon); 6213 os() << ToCString(kVrinta) << dt1 << dt2 << " " << rd << ", " << rm; 6214 } 6215 6216 void Disassembler::vrinta(DataType dt1, 6217 DataType dt2, 6218 SRegister rd, 6219 SRegister rm) { 6220 os().SetCurrentInstruction(kVrinta, kFpNeon); 6221 os() << ToCString(kVrinta) << dt1 << dt2 << " " << rd << ", " << rm; 6222 } 6223 6224 void Disassembler::vrintm(DataType dt1, 6225 DataType dt2, 6226 DRegister rd, 6227 DRegister rm) { 6228 os().SetCurrentInstruction(kVrintm, kFpNeon); 6229 os() << ToCString(kVrintm) << dt1 << dt2 << " " << rd << ", " << rm; 6230 } 6231 6232 void Disassembler::vrintm(DataType dt1, 6233 DataType dt2, 6234 QRegister rd, 6235 QRegister rm) { 6236 os().SetCurrentInstruction(kVrintm, kFpNeon); 6237 os() << ToCString(kVrintm) << dt1 << dt2 << " " << rd << ", " << rm; 6238 } 6239 6240 void Disassembler::vrintm(DataType dt1, 6241 DataType dt2, 6242 SRegister rd, 6243 SRegister rm) { 6244 os().SetCurrentInstruction(kVrintm, kFpNeon); 6245 os() << ToCString(kVrintm) << dt1 << dt2 << " " << rd << ", " << rm; 6246 } 6247 6248 void Disassembler::vrintn(DataType dt1, 6249 DataType dt2, 6250 DRegister rd, 6251 DRegister rm) { 6252 os().SetCurrentInstruction(kVrintn, kFpNeon); 6253 os() << ToCString(kVrintn) << dt1 << dt2 << " " << rd << ", " << rm; 6254 } 6255 6256 void Disassembler::vrintn(DataType dt1, 6257 DataType dt2, 6258 QRegister rd, 6259 QRegister rm) { 6260 os().SetCurrentInstruction(kVrintn, kFpNeon); 6261 os() << ToCString(kVrintn) << dt1 << dt2 << " " << rd << ", " << rm; 6262 } 6263 6264 void Disassembler::vrintn(DataType dt1, 6265 DataType dt2, 6266 SRegister rd, 6267 SRegister rm) { 6268 os().SetCurrentInstruction(kVrintn, kFpNeon); 6269 os() << ToCString(kVrintn) << dt1 << dt2 << " " << rd << ", " << rm; 6270 } 6271 6272 void Disassembler::vrintp(DataType dt1, 6273 DataType dt2, 6274 DRegister rd, 6275 DRegister rm) { 6276 os().SetCurrentInstruction(kVrintp, kFpNeon); 6277 os() << ToCString(kVrintp) << dt1 << dt2 << " " << rd << ", " << rm; 6278 } 6279 6280 void Disassembler::vrintp(DataType dt1, 6281 DataType dt2, 6282 QRegister rd, 6283 QRegister rm) { 6284 os().SetCurrentInstruction(kVrintp, kFpNeon); 6285 os() << ToCString(kVrintp) << dt1 << dt2 << " " << rd << ", " << rm; 6286 } 6287 6288 void Disassembler::vrintp(DataType dt1, 6289 DataType dt2, 6290 SRegister rd, 6291 SRegister rm) { 6292 os().SetCurrentInstruction(kVrintp, kFpNeon); 6293 os() << ToCString(kVrintp) << dt1 << dt2 << " " << rd << ", " << rm; 6294 } 6295 6296 void Disassembler::vrintr( 6297 Condition cond, DataType dt1, DataType dt2, SRegister rd, SRegister rm) { 6298 os().SetCurrentInstruction(kVrintr, kFpNeon); 6299 os() << ToCString(kVrintr) << ConditionPrinter(it_block_, cond) << dt1 << dt2 6300 << " " << rd << ", " << rm; 6301 } 6302 6303 void Disassembler::vrintr( 6304 Condition cond, DataType dt1, DataType dt2, DRegister rd, DRegister rm) { 6305 os().SetCurrentInstruction(kVrintr, kFpNeon); 6306 os() << ToCString(kVrintr) << ConditionPrinter(it_block_, cond) << dt1 << dt2 6307 << " " << rd << ", " << rm; 6308 } 6309 6310 void Disassembler::vrintx( 6311 Condition cond, DataType dt1, DataType dt2, DRegister rd, DRegister rm) { 6312 os().SetCurrentInstruction(kVrintx, kFpNeon); 6313 os() << ToCString(kVrintx) << ConditionPrinter(it_block_, cond) << dt1 << dt2 6314 << " " << rd << ", " << rm; 6315 } 6316 6317 void Disassembler::vrintx(DataType dt1, 6318 DataType dt2, 6319 QRegister rd, 6320 QRegister rm) { 6321 os().SetCurrentInstruction(kVrintx, kFpNeon); 6322 os() << ToCString(kVrintx) << dt1 << dt2 << " " << rd << ", " << rm; 6323 } 6324 6325 void Disassembler::vrintx( 6326 Condition cond, DataType dt1, DataType dt2, SRegister rd, SRegister rm) { 6327 os().SetCurrentInstruction(kVrintx, kFpNeon); 6328 os() << ToCString(kVrintx) << ConditionPrinter(it_block_, cond) << dt1 << dt2 6329 << " " << rd << ", " << rm; 6330 } 6331 6332 void Disassembler::vrintz( 6333 Condition cond, DataType dt1, DataType dt2, DRegister rd, DRegister rm) { 6334 os().SetCurrentInstruction(kVrintz, kFpNeon); 6335 os() << ToCString(kVrintz) << ConditionPrinter(it_block_, cond) << dt1 << dt2 6336 << " " << rd << ", " << rm; 6337 } 6338 6339 void Disassembler::vrintz(DataType dt1, 6340 DataType dt2, 6341 QRegister rd, 6342 QRegister rm) { 6343 os().SetCurrentInstruction(kVrintz, kFpNeon); 6344 os() << ToCString(kVrintz) << dt1 << dt2 << " " << rd << ", " << rm; 6345 } 6346 6347 void Disassembler::vrintz( 6348 Condition cond, DataType dt1, DataType dt2, SRegister rd, SRegister rm) { 6349 os().SetCurrentInstruction(kVrintz, kFpNeon); 6350 os() << ToCString(kVrintz) << ConditionPrinter(it_block_, cond) << dt1 << dt2 6351 << " " << rd << ", " << rm; 6352 } 6353 6354 void Disassembler::vrshl( 6355 Condition cond, DataType dt, DRegister rd, DRegister rm, DRegister rn) { 6356 os().SetCurrentInstruction(kVrshl, kFpNeon); 6357 os() << ToCString(kVrshl) << ConditionPrinter(it_block_, cond) << dt; 6358 os() << " "; 6359 if (!rd.Is(rm)) { 6360 os() << rd << ", "; 6361 } 6362 os() << rm << ", " << rn; 6363 } 6364 6365 void Disassembler::vrshl( 6366 Condition cond, DataType dt, QRegister rd, QRegister rm, QRegister rn) { 6367 os().SetCurrentInstruction(kVrshl, kFpNeon); 6368 os() << ToCString(kVrshl) << ConditionPrinter(it_block_, cond) << dt; 6369 os() << " "; 6370 if (!rd.Is(rm)) { 6371 os() << rd << ", "; 6372 } 6373 os() << rm << ", " << rn; 6374 } 6375 6376 void Disassembler::vrshr(Condition cond, 6377 DataType dt, 6378 DRegister rd, 6379 DRegister rm, 6380 const DOperand& operand) { 6381 os().SetCurrentInstruction(kVrshr, kFpNeon); 6382 os() << ToCString(kVrshr) << ConditionPrinter(it_block_, cond) << dt; 6383 os() << " "; 6384 if (!rd.Is(rm)) { 6385 os() << rd << ", "; 6386 } 6387 os() << rm << ", " << operand; 6388 } 6389 6390 void Disassembler::vrshr(Condition cond, 6391 DataType dt, 6392 QRegister rd, 6393 QRegister rm, 6394 const QOperand& operand) { 6395 os().SetCurrentInstruction(kVrshr, kFpNeon); 6396 os() << ToCString(kVrshr) << ConditionPrinter(it_block_, cond) << dt; 6397 os() << " "; 6398 if (!rd.Is(rm)) { 6399 os() << rd << ", "; 6400 } 6401 os() << rm << ", " << operand; 6402 } 6403 6404 void Disassembler::vrshrn(Condition cond, 6405 DataType dt, 6406 DRegister rd, 6407 QRegister rm, 6408 const QOperand& operand) { 6409 os().SetCurrentInstruction(kVrshrn, kFpNeon); 6410 os() << ToCString(kVrshrn) << ConditionPrinter(it_block_, cond) << dt << " " 6411 << rd << ", " << rm << ", " << operand; 6412 } 6413 6414 void Disassembler::vrsqrte(Condition cond, 6415 DataType dt, 6416 DRegister rd, 6417 DRegister rm) { 6418 os().SetCurrentInstruction(kVrsqrte, kFpNeon); 6419 os() << ToCString(kVrsqrte) << ConditionPrinter(it_block_, cond) << dt << " " 6420 << rd << ", " << rm; 6421 } 6422 6423 void Disassembler::vrsqrte(Condition cond, 6424 DataType dt, 6425 QRegister rd, 6426 QRegister rm) { 6427 os().SetCurrentInstruction(kVrsqrte, kFpNeon); 6428 os() << ToCString(kVrsqrte) << ConditionPrinter(it_block_, cond) << dt << " " 6429 << rd << ", " << rm; 6430 } 6431 6432 void Disassembler::vrsqrts( 6433 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { 6434 os().SetCurrentInstruction(kVrsqrts, kFpNeon); 6435 os() << ToCString(kVrsqrts) << ConditionPrinter(it_block_, cond) << dt; 6436 os() << " "; 6437 if (!rd.Is(rn)) { 6438 os() << rd << ", "; 6439 } 6440 os() << rn << ", " << rm; 6441 } 6442 6443 void Disassembler::vrsqrts( 6444 Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { 6445 os().SetCurrentInstruction(kVrsqrts, kFpNeon); 6446 os() << ToCString(kVrsqrts) << ConditionPrinter(it_block_, cond) << dt; 6447 os() << " "; 6448 if (!rd.Is(rn)) { 6449 os() << rd << ", "; 6450 } 6451 os() << rn << ", " << rm; 6452 } 6453 6454 void Disassembler::vrsra(Condition cond, 6455 DataType dt, 6456 DRegister rd, 6457 DRegister rm, 6458 const DOperand& operand) { 6459 os().SetCurrentInstruction(kVrsra, kFpNeon); 6460 os() << ToCString(kVrsra) << ConditionPrinter(it_block_, cond) << dt; 6461 os() << " "; 6462 if (!rd.Is(rm)) { 6463 os() << rd << ", "; 6464 } 6465 os() << rm << ", " << operand; 6466 } 6467 6468 void Disassembler::vrsra(Condition cond, 6469 DataType dt, 6470 QRegister rd, 6471 QRegister rm, 6472 const QOperand& operand) { 6473 os().SetCurrentInstruction(kVrsra, kFpNeon); 6474 os() << ToCString(kVrsra) << ConditionPrinter(it_block_, cond) << dt; 6475 os() << " "; 6476 if (!rd.Is(rm)) { 6477 os() << rd << ", "; 6478 } 6479 os() << rm << ", " << operand; 6480 } 6481 6482 void Disassembler::vrsubhn( 6483 Condition cond, DataType dt, DRegister rd, QRegister rn, QRegister rm) { 6484 os().SetCurrentInstruction(kVrsubhn, kFpNeon); 6485 os() << ToCString(kVrsubhn) << ConditionPrinter(it_block_, cond) << dt << " " 6486 << rd << ", " << rn << ", " << rm; 6487 } 6488 6489 void Disassembler::vseleq(DataType dt, 6490 DRegister rd, 6491 DRegister rn, 6492 DRegister rm) { 6493 os().SetCurrentInstruction(kVseleq, kFpNeon); 6494 os() << ToCString(kVseleq) << dt << " " << rd << ", " << rn << ", " << rm; 6495 } 6496 6497 void Disassembler::vseleq(DataType dt, 6498 SRegister rd, 6499 SRegister rn, 6500 SRegister rm) { 6501 os().SetCurrentInstruction(kVseleq, kFpNeon); 6502 os() << ToCString(kVseleq) << dt << " " << rd << ", " << rn << ", " << rm; 6503 } 6504 6505 void Disassembler::vselge(DataType dt, 6506 DRegister rd, 6507 DRegister rn, 6508 DRegister rm) { 6509 os().SetCurrentInstruction(kVselge, kFpNeon); 6510 os() << ToCString(kVselge) << dt << " " << rd << ", " << rn << ", " << rm; 6511 } 6512 6513 void Disassembler::vselge(DataType dt, 6514 SRegister rd, 6515 SRegister rn, 6516 SRegister rm) { 6517 os().SetCurrentInstruction(kVselge, kFpNeon); 6518 os() << ToCString(kVselge) << dt << " " << rd << ", " << rn << ", " << rm; 6519 } 6520 6521 void Disassembler::vselgt(DataType dt, 6522 DRegister rd, 6523 DRegister rn, 6524 DRegister rm) { 6525 os().SetCurrentInstruction(kVselgt, kFpNeon); 6526 os() << ToCString(kVselgt) << dt << " " << rd << ", " << rn << ", " << rm; 6527 } 6528 6529 void Disassembler::vselgt(DataType dt, 6530 SRegister rd, 6531 SRegister rn, 6532 SRegister rm) { 6533 os().SetCurrentInstruction(kVselgt, kFpNeon); 6534 os() << ToCString(kVselgt) << dt << " " << rd << ", " << rn << ", " << rm; 6535 } 6536 6537 void Disassembler::vselvs(DataType dt, 6538 DRegister rd, 6539 DRegister rn, 6540 DRegister rm) { 6541 os().SetCurrentInstruction(kVselvs, kFpNeon); 6542 os() << ToCString(kVselvs) << dt << " " << rd << ", " << rn << ", " << rm; 6543 } 6544 6545 void Disassembler::vselvs(DataType dt, 6546 SRegister rd, 6547 SRegister rn, 6548 SRegister rm) { 6549 os().SetCurrentInstruction(kVselvs, kFpNeon); 6550 os() << ToCString(kVselvs) << dt << " " << rd << ", " << rn << ", " << rm; 6551 } 6552 6553 void Disassembler::vshl(Condition cond, 6554 DataType dt, 6555 DRegister rd, 6556 DRegister rm, 6557 const DOperand& operand) { 6558 os().SetCurrentInstruction(kVshl, kFpNeon); 6559 os() << ToCString(kVshl) << ConditionPrinter(it_block_, cond) << dt; 6560 os() << " "; 6561 if (!rd.Is(rm)) { 6562 os() << rd << ", "; 6563 } 6564 os() << rm << ", " << operand; 6565 } 6566 6567 void Disassembler::vshl(Condition cond, 6568 DataType dt, 6569 QRegister rd, 6570 QRegister rm, 6571 const QOperand& operand) { 6572 os().SetCurrentInstruction(kVshl, kFpNeon); 6573 os() << ToCString(kVshl) << ConditionPrinter(it_block_, cond) << dt; 6574 os() << " "; 6575 if (!rd.Is(rm)) { 6576 os() << rd << ", "; 6577 } 6578 os() << rm << ", " << operand; 6579 } 6580 6581 void Disassembler::vshll(Condition cond, 6582 DataType dt, 6583 QRegister rd, 6584 DRegister rm, 6585 const DOperand& operand) { 6586 os().SetCurrentInstruction(kVshll, kFpNeon); 6587 os() << ToCString(kVshll) << ConditionPrinter(it_block_, cond) << dt << " " 6588 << rd << ", " << rm << ", " << operand; 6589 } 6590 6591 void Disassembler::vshr(Condition cond, 6592 DataType dt, 6593 DRegister rd, 6594 DRegister rm, 6595 const DOperand& operand) { 6596 os().SetCurrentInstruction(kVshr, kFpNeon); 6597 os() << ToCString(kVshr) << ConditionPrinter(it_block_, cond) << dt; 6598 os() << " "; 6599 if (!rd.Is(rm)) { 6600 os() << rd << ", "; 6601 } 6602 os() << rm << ", " << operand; 6603 } 6604 6605 void Disassembler::vshr(Condition cond, 6606 DataType dt, 6607 QRegister rd, 6608 QRegister rm, 6609 const QOperand& operand) { 6610 os().SetCurrentInstruction(kVshr, kFpNeon); 6611 os() << ToCString(kVshr) << ConditionPrinter(it_block_, cond) << dt; 6612 os() << " "; 6613 if (!rd.Is(rm)) { 6614 os() << rd << ", "; 6615 } 6616 os() << rm << ", " << operand; 6617 } 6618 6619 void Disassembler::vshrn(Condition cond, 6620 DataType dt, 6621 DRegister rd, 6622 QRegister rm, 6623 const QOperand& operand) { 6624 os().SetCurrentInstruction(kVshrn, kFpNeon); 6625 os() << ToCString(kVshrn) << ConditionPrinter(it_block_, cond) << dt << " " 6626 << rd << ", " << rm << ", " << operand; 6627 } 6628 6629 void Disassembler::vsli(Condition cond, 6630 DataType dt, 6631 DRegister rd, 6632 DRegister rm, 6633 const DOperand& operand) { 6634 os().SetCurrentInstruction(kVsli, kFpNeon); 6635 os() << ToCString(kVsli) << ConditionPrinter(it_block_, cond) << dt; 6636 os() << " "; 6637 if (!rd.Is(rm)) { 6638 os() << rd << ", "; 6639 } 6640 os() << rm << ", " << operand; 6641 } 6642 6643 void Disassembler::vsli(Condition cond, 6644 DataType dt, 6645 QRegister rd, 6646 QRegister rm, 6647 const QOperand& operand) { 6648 os().SetCurrentInstruction(kVsli, kFpNeon); 6649 os() << ToCString(kVsli) << ConditionPrinter(it_block_, cond) << dt; 6650 os() << " "; 6651 if (!rd.Is(rm)) { 6652 os() << rd << ", "; 6653 } 6654 os() << rm << ", " << operand; 6655 } 6656 6657 void Disassembler::vsqrt(Condition cond, 6658 DataType dt, 6659 SRegister rd, 6660 SRegister rm) { 6661 os().SetCurrentInstruction(kVsqrt, kFpNeon); 6662 os() << ToCString(kVsqrt) << ConditionPrinter(it_block_, cond) << dt << " " 6663 << rd << ", " << rm; 6664 } 6665 6666 void Disassembler::vsqrt(Condition cond, 6667 DataType dt, 6668 DRegister rd, 6669 DRegister rm) { 6670 os().SetCurrentInstruction(kVsqrt, kFpNeon); 6671 os() << ToCString(kVsqrt) << ConditionPrinter(it_block_, cond) << dt << " " 6672 << rd << ", " << rm; 6673 } 6674 6675 void Disassembler::vsra(Condition cond, 6676 DataType dt, 6677 DRegister rd, 6678 DRegister rm, 6679 const DOperand& operand) { 6680 os().SetCurrentInstruction(kVsra, kFpNeon); 6681 os() << ToCString(kVsra) << ConditionPrinter(it_block_, cond) << dt; 6682 os() << " "; 6683 if (!rd.Is(rm)) { 6684 os() << rd << ", "; 6685 } 6686 os() << rm << ", " << operand; 6687 } 6688 6689 void Disassembler::vsra(Condition cond, 6690 DataType dt, 6691 QRegister rd, 6692 QRegister rm, 6693 const QOperand& operand) { 6694 os().SetCurrentInstruction(kVsra, kFpNeon); 6695 os() << ToCString(kVsra) << ConditionPrinter(it_block_, cond) << dt; 6696 os() << " "; 6697 if (!rd.Is(rm)) { 6698 os() << rd << ", "; 6699 } 6700 os() << rm << ", " << operand; 6701 } 6702 6703 void Disassembler::vsri(Condition cond, 6704 DataType dt, 6705 DRegister rd, 6706 DRegister rm, 6707 const DOperand& operand) { 6708 os().SetCurrentInstruction(kVsri, kFpNeon); 6709 os() << ToCString(kVsri) << ConditionPrinter(it_block_, cond) << dt; 6710 os() << " "; 6711 if (!rd.Is(rm)) { 6712 os() << rd << ", "; 6713 } 6714 os() << rm << ", " << operand; 6715 } 6716 6717 void Disassembler::vsri(Condition cond, 6718 DataType dt, 6719 QRegister rd, 6720 QRegister rm, 6721 const QOperand& operand) { 6722 os().SetCurrentInstruction(kVsri, kFpNeon); 6723 os() << ToCString(kVsri) << ConditionPrinter(it_block_, cond) << dt; 6724 os() << " "; 6725 if (!rd.Is(rm)) { 6726 os() << rd << ", "; 6727 } 6728 os() << rm << ", " << operand; 6729 } 6730 6731 void Disassembler::vst1(Condition cond, 6732 DataType dt, 6733 const NeonRegisterList& nreglist, 6734 const AlignedMemOperand& operand) { 6735 os().SetCurrentInstruction(kVst1, kFpNeon); 6736 os() << ToCString(kVst1) << ConditionPrinter(it_block_, cond) << dt << " " 6737 << nreglist << ", " << PrintAlignedMemOperand(kVst1Location, operand); 6738 } 6739 6740 void Disassembler::vst2(Condition cond, 6741 DataType dt, 6742 const NeonRegisterList& nreglist, 6743 const AlignedMemOperand& operand) { 6744 os().SetCurrentInstruction(kVst2, kFpNeon); 6745 os() << ToCString(kVst2) << ConditionPrinter(it_block_, cond) << dt << " " 6746 << nreglist << ", " << PrintAlignedMemOperand(kVst2Location, operand); 6747 } 6748 6749 void Disassembler::vst3(Condition cond, 6750 DataType dt, 6751 const NeonRegisterList& nreglist, 6752 const AlignedMemOperand& operand) { 6753 os().SetCurrentInstruction(kVst3, kFpNeon); 6754 os() << ToCString(kVst3) << ConditionPrinter(it_block_, cond) << dt << " " 6755 << nreglist << ", " << PrintAlignedMemOperand(kVst3Location, operand); 6756 } 6757 6758 void Disassembler::vst3(Condition cond, 6759 DataType dt, 6760 const NeonRegisterList& nreglist, 6761 const MemOperand& operand) { 6762 os().SetCurrentInstruction(kVst3, kFpNeon); 6763 os() << ToCString(kVst3) << ConditionPrinter(it_block_, cond) << dt << " " 6764 << nreglist << ", " << PrintMemOperand(kVst3Location, operand); 6765 } 6766 6767 void Disassembler::vst4(Condition cond, 6768 DataType dt, 6769 const NeonRegisterList& nreglist, 6770 const AlignedMemOperand& operand) { 6771 os().SetCurrentInstruction(kVst4, kFpNeon); 6772 os() << ToCString(kVst4) << ConditionPrinter(it_block_, cond) << dt << " " 6773 << nreglist << ", " << PrintAlignedMemOperand(kVst4Location, operand); 6774 } 6775 6776 void Disassembler::vstm(Condition cond, 6777 DataType dt, 6778 Register rn, 6779 WriteBack write_back, 6780 DRegisterList dreglist) { 6781 os().SetCurrentInstruction(kVstm, kLoadStore | kLoadStoreMultiple | kFpNeon); 6782 os() << ToCString(kVstm) << ConditionPrinter(it_block_, cond) << dt << " " 6783 << rn << write_back << ", " << dreglist; 6784 } 6785 6786 void Disassembler::vstm(Condition cond, 6787 DataType dt, 6788 Register rn, 6789 WriteBack write_back, 6790 SRegisterList sreglist) { 6791 os().SetCurrentInstruction(kVstm, kLoadStore | kLoadStoreMultiple | kFpNeon); 6792 os() << ToCString(kVstm) << ConditionPrinter(it_block_, cond) << dt << " " 6793 << rn << write_back << ", " << sreglist; 6794 } 6795 6796 void Disassembler::vstmdb(Condition cond, 6797 DataType dt, 6798 Register rn, 6799 WriteBack write_back, 6800 DRegisterList dreglist) { 6801 os().SetCurrentInstruction(kVstmdb, 6802 kLoadStore | kLoadStoreMultiple | kFpNeon); 6803 os() << ToCString(kVstmdb) << ConditionPrinter(it_block_, cond) << dt << " " 6804 << rn << write_back << ", " << dreglist; 6805 } 6806 6807 void Disassembler::vstmdb(Condition cond, 6808 DataType dt, 6809 Register rn, 6810 WriteBack write_back, 6811 SRegisterList sreglist) { 6812 os().SetCurrentInstruction(kVstmdb, 6813 kLoadStore | kLoadStoreMultiple | kFpNeon); 6814 os() << ToCString(kVstmdb) << ConditionPrinter(it_block_, cond) << dt << " " 6815 << rn << write_back << ", " << sreglist; 6816 } 6817 6818 void Disassembler::vstmia(Condition cond, 6819 DataType dt, 6820 Register rn, 6821 WriteBack write_back, 6822 DRegisterList dreglist) { 6823 os().SetCurrentInstruction(kVstmia, 6824 kLoadStore | kLoadStoreMultiple | kFpNeon); 6825 os() << ToCString(kVstmia) << ConditionPrinter(it_block_, cond) << dt << " " 6826 << rn << write_back << ", " << dreglist; 6827 } 6828 6829 void Disassembler::vstmia(Condition cond, 6830 DataType dt, 6831 Register rn, 6832 WriteBack write_back, 6833 SRegisterList sreglist) { 6834 os().SetCurrentInstruction(kVstmia, 6835 kLoadStore | kLoadStoreMultiple | kFpNeon); 6836 os() << ToCString(kVstmia) << ConditionPrinter(it_block_, cond) << dt << " " 6837 << rn << write_back << ", " << sreglist; 6838 } 6839 6840 void Disassembler::vstr(Condition cond, 6841 DataType dt, 6842 DRegister rd, 6843 const MemOperand& operand) { 6844 os().SetCurrentInstruction(kVstr, kFpNeon); 6845 os() << ToCString(kVstr) << ConditionPrinter(it_block_, cond) << dt << " " 6846 << rd << ", " << PrintMemOperand(kStoreDoublePrecisionLocation, operand); 6847 } 6848 6849 void Disassembler::vstr(Condition cond, 6850 DataType dt, 6851 SRegister rd, 6852 const MemOperand& operand) { 6853 os().SetCurrentInstruction(kVstr, kFpNeon); 6854 os() << ToCString(kVstr) << ConditionPrinter(it_block_, cond) << dt << " " 6855 << rd << ", " << PrintMemOperand(kStoreSinglePrecisionLocation, operand); 6856 } 6857 6858 void Disassembler::vsub( 6859 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { 6860 os().SetCurrentInstruction(kVsub, kFpNeon); 6861 os() << ToCString(kVsub) << ConditionPrinter(it_block_, cond) << dt; 6862 os() << " "; 6863 if (!rd.Is(rn)) { 6864 os() << rd << ", "; 6865 } 6866 os() << rn << ", " << rm; 6867 } 6868 6869 void Disassembler::vsub( 6870 Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { 6871 os().SetCurrentInstruction(kVsub, kFpNeon); 6872 os() << ToCString(kVsub) << ConditionPrinter(it_block_, cond) << dt; 6873 os() << " "; 6874 if (!rd.Is(rn)) { 6875 os() << rd << ", "; 6876 } 6877 os() << rn << ", " << rm; 6878 } 6879 6880 void Disassembler::vsub( 6881 Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) { 6882 os().SetCurrentInstruction(kVsub, kFpNeon); 6883 os() << ToCString(kVsub) << ConditionPrinter(it_block_, cond) << dt; 6884 os() << " "; 6885 if (!rd.Is(rn)) { 6886 os() << rd << ", "; 6887 } 6888 os() << rn << ", " << rm; 6889 } 6890 6891 void Disassembler::vsubhn( 6892 Condition cond, DataType dt, DRegister rd, QRegister rn, QRegister rm) { 6893 os().SetCurrentInstruction(kVsubhn, kFpNeon); 6894 os() << ToCString(kVsubhn) << ConditionPrinter(it_block_, cond) << dt << " " 6895 << rd << ", " << rn << ", " << rm; 6896 } 6897 6898 void Disassembler::vsubl( 6899 Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) { 6900 os().SetCurrentInstruction(kVsubl, kFpNeon); 6901 os() << ToCString(kVsubl) << ConditionPrinter(it_block_, cond) << dt << " " 6902 << rd << ", " << rn << ", " << rm; 6903 } 6904 6905 void Disassembler::vsubw( 6906 Condition cond, DataType dt, QRegister rd, QRegister rn, DRegister rm) { 6907 os().SetCurrentInstruction(kVsubw, kFpNeon); 6908 os() << ToCString(kVsubw) << ConditionPrinter(it_block_, cond) << dt; 6909 os() << " "; 6910 if (!rd.Is(rn)) { 6911 os() << rd << ", "; 6912 } 6913 os() << rn << ", " << rm; 6914 } 6915 6916 void Disassembler::vswp(Condition cond, 6917 DataType dt, 6918 DRegister rd, 6919 DRegister rm) { 6920 os().SetCurrentInstruction(kVswp, kFpNeon); 6921 os() << ToCString(kVswp) << ConditionPrinter(it_block_, cond) << dt << " " 6922 << rd << ", " << rm; 6923 } 6924 6925 void Disassembler::vswp(Condition cond, 6926 DataType dt, 6927 QRegister rd, 6928 QRegister rm) { 6929 os().SetCurrentInstruction(kVswp, kFpNeon); 6930 os() << ToCString(kVswp) << ConditionPrinter(it_block_, cond) << dt << " " 6931 << rd << ", " << rm; 6932 } 6933 6934 void Disassembler::vtbl(Condition cond, 6935 DataType dt, 6936 DRegister rd, 6937 const NeonRegisterList& nreglist, 6938 DRegister rm) { 6939 os().SetCurrentInstruction(kVtbl, kFpNeon); 6940 os() << ToCString(kVtbl) << ConditionPrinter(it_block_, cond) << dt << " " 6941 << rd << ", " << nreglist << ", " << rm; 6942 } 6943 6944 void Disassembler::vtbx(Condition cond, 6945 DataType dt, 6946 DRegister rd, 6947 const NeonRegisterList& nreglist, 6948 DRegister rm) { 6949 os().SetCurrentInstruction(kVtbx, kFpNeon); 6950 os() << ToCString(kVtbx) << ConditionPrinter(it_block_, cond) << dt << " " 6951 << rd << ", " << nreglist << ", " << rm; 6952 } 6953 6954 void Disassembler::vtrn(Condition cond, 6955 DataType dt, 6956 DRegister rd, 6957 DRegister rm) { 6958 os().SetCurrentInstruction(kVtrn, kFpNeon); 6959 os() << ToCString(kVtrn) << ConditionPrinter(it_block_, cond) << dt << " " 6960 << rd << ", " << rm; 6961 } 6962 6963 void Disassembler::vtrn(Condition cond, 6964 DataType dt, 6965 QRegister rd, 6966 QRegister rm) { 6967 os().SetCurrentInstruction(kVtrn, kFpNeon); 6968 os() << ToCString(kVtrn) << ConditionPrinter(it_block_, cond) << dt << " " 6969 << rd << ", " << rm; 6970 } 6971 6972 void Disassembler::vtst( 6973 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { 6974 os().SetCurrentInstruction(kVtst, kFpNeon); 6975 os() << ToCString(kVtst) << ConditionPrinter(it_block_, cond) << dt; 6976 os() << " "; 6977 if (!rd.Is(rn)) { 6978 os() << rd << ", "; 6979 } 6980 os() << rn << ", " << rm; 6981 } 6982 6983 void Disassembler::vtst( 6984 Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { 6985 os().SetCurrentInstruction(kVtst, kFpNeon); 6986 os() << ToCString(kVtst) << ConditionPrinter(it_block_, cond) << dt; 6987 os() << " "; 6988 if (!rd.Is(rn)) { 6989 os() << rd << ", "; 6990 } 6991 os() << rn << ", " << rm; 6992 } 6993 6994 void Disassembler::vuzp(Condition cond, 6995 DataType dt, 6996 DRegister rd, 6997 DRegister rm) { 6998 os().SetCurrentInstruction(kVuzp, kFpNeon); 6999 os() << ToCString(kVuzp) << ConditionPrinter(it_block_, cond) << dt << " " 7000 << rd << ", " << rm; 7001 } 7002 7003 void Disassembler::vuzp(Condition cond, 7004 DataType dt, 7005 QRegister rd, 7006 QRegister rm) { 7007 os().SetCurrentInstruction(kVuzp, kFpNeon); 7008 os() << ToCString(kVuzp) << ConditionPrinter(it_block_, cond) << dt << " " 7009 << rd << ", " << rm; 7010 } 7011 7012 void Disassembler::vzip(Condition cond, 7013 DataType dt, 7014 DRegister rd, 7015 DRegister rm) { 7016 os().SetCurrentInstruction(kVzip, kFpNeon); 7017 os() << ToCString(kVzip) << ConditionPrinter(it_block_, cond) << dt << " " 7018 << rd << ", " << rm; 7019 } 7020 7021 void Disassembler::vzip(Condition cond, 7022 DataType dt, 7023 QRegister rd, 7024 QRegister rm) { 7025 os().SetCurrentInstruction(kVzip, kFpNeon); 7026 os() << ToCString(kVzip) << ConditionPrinter(it_block_, cond) << dt << " " 7027 << rd << ", " << rm; 7028 } 7029 7030 void Disassembler::yield(Condition cond, EncodingSize size) { 7031 os().SetCurrentInstruction(kYield, kNoAttribute); 7032 os() << ToCString(kYield) << ConditionPrinter(it_block_, cond) << size; 7033 } 7034 7035 int Disassembler::T32Size(uint32_t instr) { 7036 if ((instr & 0xe0000000) == 0xe0000000) { 7037 switch (instr & 0x08000000) { 7038 case 0x00000000: 7039 if ((instr & 0x10000000) == 0x10000000) return 4; 7040 return 2; 7041 case 0x08000000: 7042 return 4; 7043 default: 7044 return 2; 7045 } 7046 } 7047 return 2; 7048 } 7049 7050 void Disassembler::DecodeT32(uint32_t instr) { 7051 T32CodeAddressIncrementer incrementer(instr, &code_address_); 7052 ITBlockScope it_scope(&it_block_); 7053 7054 switch (instr & 0xe0000000) { 7055 case 0x00000000: { 7056 // 0x00000000 7057 switch (instr & 0x18000000) { 7058 case 0x18000000: { 7059 // 0x18000000 7060 switch (instr & 0x06000000) { 7061 case 0x00000000: { 7062 // 0x18000000 7063 unsigned rd = (instr >> 16) & 0x7; 7064 unsigned rn = (instr >> 19) & 0x7; 7065 unsigned rm = (instr >> 22) & 0x7; 7066 if (InITBlock()) { 7067 // ADD<c>{<q>} <Rd>, <Rn>, <Rm> ; T1 7068 add(CurrentCond(), 7069 Best, 7070 Register(rd), 7071 Register(rn), 7072 Register(rm)); 7073 } else { 7074 VIXL_ASSERT(OutsideITBlock()); 7075 // ADDS{<q>} {<Rd>}, <Rn>, <Rm> ; T1 7076 adds(Condition::None(), 7077 Best, 7078 Register(rd), 7079 Register(rn), 7080 Register(rm)); 7081 } 7082 break; 7083 } 7084 case 0x02000000: { 7085 // 0x1a000000 7086 unsigned rd = (instr >> 16) & 0x7; 7087 unsigned rn = (instr >> 19) & 0x7; 7088 unsigned rm = (instr >> 22) & 0x7; 7089 if (InITBlock()) { 7090 // SUB<c>{<q>} <Rd>, <Rn>, <Rm> ; T1 7091 sub(CurrentCond(), 7092 Best, 7093 Register(rd), 7094 Register(rn), 7095 Register(rm)); 7096 } else { 7097 VIXL_ASSERT(OutsideITBlock()); 7098 // SUBS{<q>} {<Rd>}, <Rn>, <Rm> ; T1 7099 subs(Condition::None(), 7100 Best, 7101 Register(rd), 7102 Register(rn), 7103 Register(rm)); 7104 } 7105 break; 7106 } 7107 case 0x04000000: { 7108 // 0x1c000000 7109 unsigned rd = (instr >> 16) & 0x7; 7110 unsigned rn = (instr >> 19) & 0x7; 7111 uint32_t imm = (instr >> 22) & 0x7; 7112 if (InITBlock()) { 7113 // ADD<c>{<q>} <Rd>, <Rn>, #<imm3> ; T1 7114 add(CurrentCond(), Best, Register(rd), Register(rn), imm); 7115 } else { 7116 VIXL_ASSERT(OutsideITBlock()); 7117 // ADDS{<q>} <Rd>, <Rn>, #<imm3> ; T1 7118 adds(Condition::None(), Best, Register(rd), Register(rn), imm); 7119 } 7120 break; 7121 } 7122 case 0x06000000: { 7123 // 0x1e000000 7124 unsigned rd = (instr >> 16) & 0x7; 7125 unsigned rn = (instr >> 19) & 0x7; 7126 uint32_t imm = (instr >> 22) & 0x7; 7127 if (InITBlock()) { 7128 // SUB<c>{<q>} <Rd>, <Rn>, #<imm3> ; T1 7129 sub(CurrentCond(), Best, Register(rd), Register(rn), imm); 7130 } else { 7131 VIXL_ASSERT(OutsideITBlock()); 7132 // SUBS{<q>} <Rd>, <Rn>, #<imm3> ; T1 7133 subs(Condition::None(), Best, Register(rd), Register(rn), imm); 7134 } 7135 break; 7136 } 7137 } 7138 break; 7139 } 7140 default: { 7141 if (((instr & 0x18000000) == 0x18000000)) { 7142 UnallocatedT32(instr); 7143 return; 7144 } 7145 if (((Uint32((instr >> 27)) & Uint32(0x3)) == Uint32(0x2)) && 7146 InITBlock()) { 7147 unsigned rd = (instr >> 16) & 0x7; 7148 unsigned rm = (instr >> 19) & 0x7; 7149 uint32_t amount = (instr >> 22) & 0x1f; 7150 if (amount == 0) amount = 32; 7151 // ASR<c>{<q>} {<Rd>}, <Rm>, #<imm> ; T2 7152 asr(CurrentCond(), Best, Register(rd), Register(rm), amount); 7153 return; 7154 } 7155 if (((Uint32((instr >> 27)) & Uint32(0x3)) == Uint32(0x2)) && 7156 !InITBlock()) { 7157 unsigned rd = (instr >> 16) & 0x7; 7158 unsigned rm = (instr >> 19) & 0x7; 7159 uint32_t amount = (instr >> 22) & 0x1f; 7160 if (amount == 0) amount = 32; 7161 // ASRS{<q>} {<Rd>}, <Rm>, #<imm> ; T2 7162 asrs(Condition::None(), Best, Register(rd), Register(rm), amount); 7163 return; 7164 } 7165 if (((Uint32((instr >> 27)) & Uint32(0x3)) == Uint32(0x0)) && 7166 ((instr & 0x07c00000) != 0x00000000) && InITBlock()) { 7167 unsigned rd = (instr >> 16) & 0x7; 7168 unsigned rm = (instr >> 19) & 0x7; 7169 uint32_t amount = (instr >> 22) & 0x1f; 7170 // LSL<c>{<q>} {<Rd>}, <Rm>, #<imm> ; T2 7171 lsl(CurrentCond(), Best, Register(rd), Register(rm), amount); 7172 return; 7173 } 7174 if (((Uint32((instr >> 27)) & Uint32(0x3)) == Uint32(0x0)) && 7175 ((instr & 0x07c00000) != 0x00000000) && !InITBlock()) { 7176 unsigned rd = (instr >> 16) & 0x7; 7177 unsigned rm = (instr >> 19) & 0x7; 7178 uint32_t amount = (instr >> 22) & 0x1f; 7179 // LSLS{<q>} {<Rd>}, <Rm>, #<imm> ; T2 7180 lsls(Condition::None(), Best, Register(rd), Register(rm), amount); 7181 return; 7182 } 7183 if (((Uint32((instr >> 27)) & Uint32(0x3)) == Uint32(0x1)) && 7184 InITBlock()) { 7185 unsigned rd = (instr >> 16) & 0x7; 7186 unsigned rm = (instr >> 19) & 0x7; 7187 uint32_t amount = (instr >> 22) & 0x1f; 7188 if (amount == 0) amount = 32; 7189 // LSR<c>{<q>} {<Rd>}, <Rm>, #<imm> ; T2 7190 lsr(CurrentCond(), Best, Register(rd), Register(rm), amount); 7191 return; 7192 } 7193 if (((Uint32((instr >> 27)) & Uint32(0x3)) == Uint32(0x1)) && 7194 !InITBlock()) { 7195 unsigned rd = (instr >> 16) & 0x7; 7196 unsigned rm = (instr >> 19) & 0x7; 7197 uint32_t amount = (instr >> 22) & 0x1f; 7198 if (amount == 0) amount = 32; 7199 // LSRS{<q>} {<Rd>}, <Rm>, #<imm> ; T2 7200 lsrs(Condition::None(), Best, Register(rd), Register(rm), amount); 7201 return; 7202 } 7203 unsigned rd = (instr >> 16) & 0x7; 7204 unsigned rm = (instr >> 19) & 0x7; 7205 ImmediateShiftOperand shift_operand((instr >> 27) & 0x3, 7206 (instr >> 22) & 0x1f); 7207 if (InITBlock()) { 7208 // MOV<c>{<q>} <Rd>, <Rm> {, <shift> #<amount> } ; T2 7209 mov(CurrentCond(), 7210 Best, 7211 Register(rd), 7212 Operand(Register(rm), 7213 shift_operand.GetType(), 7214 shift_operand.GetAmount())); 7215 } else { 7216 VIXL_ASSERT(OutsideITBlock()); 7217 // MOVS{<q>} <Rd>, <Rm> {, <shift> #<amount> } ; T2 7218 movs(Condition::None(), 7219 Best, 7220 Register(rd), 7221 Operand(Register(rm), 7222 shift_operand.GetType(), 7223 shift_operand.GetAmount())); 7224 } 7225 break; 7226 } 7227 } 7228 break; 7229 } 7230 case 0x20000000: { 7231 // 0x20000000 7232 switch (instr & 0x18000000) { 7233 case 0x00000000: { 7234 // 0x20000000 7235 unsigned rd = (instr >> 24) & 0x7; 7236 uint32_t imm = (instr >> 16) & 0xff; 7237 if (InITBlock()) { 7238 // MOV<c>{<q>} <Rd>, #<imm8> ; T1 7239 mov(CurrentCond(), Best, Register(rd), imm); 7240 } else { 7241 VIXL_ASSERT(OutsideITBlock()); 7242 // MOVS{<q>} <Rd>, #<imm8> ; T1 7243 movs(Condition::None(), Best, Register(rd), imm); 7244 } 7245 break; 7246 } 7247 case 0x08000000: { 7248 // 0x28000000 7249 unsigned rn = (instr >> 24) & 0x7; 7250 uint32_t imm = (instr >> 16) & 0xff; 7251 // CMP{<c>}{<q>} <Rn>, #<imm8> ; T1 7252 cmp(CurrentCond(), Best, Register(rn), imm); 7253 break; 7254 } 7255 case 0x10000000: { 7256 // 0x30000000 7257 unsigned rd = (instr >> 24) & 0x7; 7258 uint32_t imm = (instr >> 16) & 0xff; 7259 if (InITBlock() && ((imm <= 7))) { 7260 // ADD<c>{<q>} <Rdn>, #<imm8> ; T2 7261 add(CurrentCond(), Register(rd), imm); 7262 } else if (InITBlock() && ((imm > 7))) { 7263 // ADD<c>{<q>} {<Rdn>}, <Rdn>, #<imm8> ; T2 7264 add(CurrentCond(), Best, Register(rd), Register(rd), imm); 7265 } else if (OutsideITBlock() && ((imm <= 7))) { 7266 // ADDS{<q>} <Rdn>, #<imm8> ; T2 7267 adds(Register(rd), imm); 7268 } else { 7269 VIXL_ASSERT(OutsideITBlock() && ((imm > 7))); 7270 // ADDS{<q>} {<Rdn>}, <Rdn>, #<imm8> ; T2 7271 adds(Condition::None(), Best, Register(rd), Register(rd), imm); 7272 } 7273 break; 7274 } 7275 case 0x18000000: { 7276 // 0x38000000 7277 unsigned rd = (instr >> 24) & 0x7; 7278 uint32_t imm = (instr >> 16) & 0xff; 7279 if (InITBlock() && ((imm <= 7))) { 7280 // SUB<c>{<q>} <Rdn>, #<imm8> ; T2 7281 sub(CurrentCond(), Register(rd), imm); 7282 } else if (InITBlock() && ((imm > 7))) { 7283 // SUB<c>{<q>} {<Rdn>}, <Rdn>, #<imm8> ; T2 7284 sub(CurrentCond(), Best, Register(rd), Register(rd), imm); 7285 } else if (OutsideITBlock() && ((imm <= 7))) { 7286 // SUBS{<q>} <Rdn>, #<imm8> ; T2 7287 subs(Register(rd), imm); 7288 } else { 7289 VIXL_ASSERT(OutsideITBlock() && ((imm > 7))); 7290 // SUBS{<q>} {<Rdn>}, <Rdn>, #<imm8> ; T2 7291 subs(Condition::None(), Best, Register(rd), Register(rd), imm); 7292 } 7293 break; 7294 } 7295 } 7296 break; 7297 } 7298 case 0x40000000: { 7299 // 0x40000000 7300 switch (instr & 0x18000000) { 7301 case 0x00000000: { 7302 // 0x40000000 7303 switch (instr & 0x07000000) { 7304 case 0x00000000: { 7305 // 0x40000000 7306 switch (instr & 0x00c00000) { 7307 case 0x00000000: { 7308 // 0x40000000 7309 unsigned rd = (instr >> 16) & 0x7; 7310 unsigned rm = (instr >> 19) & 0x7; 7311 if (InITBlock()) { 7312 // AND<c>{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1 7313 and_(CurrentCond(), 7314 Best, 7315 Register(rd), 7316 Register(rd), 7317 Register(rm)); 7318 } else { 7319 VIXL_ASSERT(OutsideITBlock()); 7320 // ANDS{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1 7321 ands(Condition::None(), 7322 Best, 7323 Register(rd), 7324 Register(rd), 7325 Register(rm)); 7326 } 7327 break; 7328 } 7329 case 0x00400000: { 7330 // 0x40400000 7331 unsigned rd = (instr >> 16) & 0x7; 7332 unsigned rm = (instr >> 19) & 0x7; 7333 if (InITBlock()) { 7334 // EOR<c>{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1 7335 eor(CurrentCond(), 7336 Best, 7337 Register(rd), 7338 Register(rd), 7339 Register(rm)); 7340 } else { 7341 VIXL_ASSERT(OutsideITBlock()); 7342 // EORS{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1 7343 eors(Condition::None(), 7344 Best, 7345 Register(rd), 7346 Register(rd), 7347 Register(rm)); 7348 } 7349 break; 7350 } 7351 case 0x00800000: { 7352 // 0x40800000 7353 if (InITBlock()) { 7354 unsigned rd = (instr >> 16) & 0x7; 7355 unsigned rs = (instr >> 19) & 0x7; 7356 // LSL<c>{<q>} {<Rdm>}, <Rdm>, <Rs> ; T1 7357 lsl(CurrentCond(), 7358 Best, 7359 Register(rd), 7360 Register(rd), 7361 Register(rs)); 7362 return; 7363 } 7364 if (!InITBlock()) { 7365 unsigned rd = (instr >> 16) & 0x7; 7366 unsigned rs = (instr >> 19) & 0x7; 7367 // LSLS{<q>} {<Rdm>}, <Rdm>, <Rs> ; T1 7368 lsls(Condition::None(), 7369 Best, 7370 Register(rd), 7371 Register(rd), 7372 Register(rs)); 7373 return; 7374 } 7375 unsigned rd = (instr >> 16) & 0x7; 7376 unsigned rm = (instr >> 16) & 0x7; 7377 unsigned rs = (instr >> 19) & 0x7; 7378 if (InITBlock()) { 7379 // MOV<c>{<q>} <Rdm>, <Rdm>, LSL <Rs> ; T1 7380 mov(CurrentCond(), 7381 Best, 7382 Register(rd), 7383 Operand(Register(rm), LSL, Register(rs))); 7384 } else { 7385 VIXL_ASSERT(OutsideITBlock()); 7386 // MOVS{<q>} <Rdm>, <Rdm>, LSL <Rs> ; T1 7387 movs(Condition::None(), 7388 Best, 7389 Register(rd), 7390 Operand(Register(rm), LSL, Register(rs))); 7391 } 7392 break; 7393 } 7394 case 0x00c00000: { 7395 // 0x40c00000 7396 if (InITBlock()) { 7397 unsigned rd = (instr >> 16) & 0x7; 7398 unsigned rs = (instr >> 19) & 0x7; 7399 // LSR<c>{<q>} {<Rdm>}, <Rdm>, <Rs> ; T1 7400 lsr(CurrentCond(), 7401 Best, 7402 Register(rd), 7403 Register(rd), 7404 Register(rs)); 7405 return; 7406 } 7407 if (!InITBlock()) { 7408 unsigned rd = (instr >> 16) & 0x7; 7409 unsigned rs = (instr >> 19) & 0x7; 7410 // LSRS{<q>} {<Rdm>}, <Rdm>, <Rs> ; T1 7411 lsrs(Condition::None(), 7412 Best, 7413 Register(rd), 7414 Register(rd), 7415 Register(rs)); 7416 return; 7417 } 7418 unsigned rd = (instr >> 16) & 0x7; 7419 unsigned rm = (instr >> 16) & 0x7; 7420 unsigned rs = (instr >> 19) & 0x7; 7421 if (InITBlock()) { 7422 // MOV<c>{<q>} <Rdm>, <Rdm>, LSR <Rs> ; T1 7423 mov(CurrentCond(), 7424 Best, 7425 Register(rd), 7426 Operand(Register(rm), LSR, Register(rs))); 7427 } else { 7428 VIXL_ASSERT(OutsideITBlock()); 7429 // MOVS{<q>} <Rdm>, <Rdm>, LSR <Rs> ; T1 7430 movs(Condition::None(), 7431 Best, 7432 Register(rd), 7433 Operand(Register(rm), LSR, Register(rs))); 7434 } 7435 break; 7436 } 7437 } 7438 break; 7439 } 7440 case 0x01000000: { 7441 // 0x41000000 7442 switch (instr & 0x00c00000) { 7443 case 0x00000000: { 7444 // 0x41000000 7445 if (InITBlock()) { 7446 unsigned rd = (instr >> 16) & 0x7; 7447 unsigned rs = (instr >> 19) & 0x7; 7448 // ASR<c>{<q>} {<Rdm>}, <Rdm>, <Rs> ; T1 7449 asr(CurrentCond(), 7450 Best, 7451 Register(rd), 7452 Register(rd), 7453 Register(rs)); 7454 return; 7455 } 7456 if (!InITBlock()) { 7457 unsigned rd = (instr >> 16) & 0x7; 7458 unsigned rs = (instr >> 19) & 0x7; 7459 // ASRS{<q>} {<Rdm>}, <Rdm>, <Rs> ; T1 7460 asrs(Condition::None(), 7461 Best, 7462 Register(rd), 7463 Register(rd), 7464 Register(rs)); 7465 return; 7466 } 7467 unsigned rd = (instr >> 16) & 0x7; 7468 unsigned rm = (instr >> 16) & 0x7; 7469 unsigned rs = (instr >> 19) & 0x7; 7470 if (InITBlock()) { 7471 // MOV<c>{<q>} <Rdm>, <Rdm>, ASR <Rs> ; T1 7472 mov(CurrentCond(), 7473 Best, 7474 Register(rd), 7475 Operand(Register(rm), ASR, Register(rs))); 7476 } else { 7477 VIXL_ASSERT(OutsideITBlock()); 7478 // MOVS{<q>} <Rdm>, <Rdm>, ASR <Rs> ; T1 7479 movs(Condition::None(), 7480 Best, 7481 Register(rd), 7482 Operand(Register(rm), ASR, Register(rs))); 7483 } 7484 break; 7485 } 7486 case 0x00400000: { 7487 // 0x41400000 7488 unsigned rd = (instr >> 16) & 0x7; 7489 unsigned rm = (instr >> 19) & 0x7; 7490 if (InITBlock()) { 7491 // ADC<c>{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1 7492 adc(CurrentCond(), 7493 Best, 7494 Register(rd), 7495 Register(rd), 7496 Register(rm)); 7497 } else { 7498 VIXL_ASSERT(OutsideITBlock()); 7499 // ADCS{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1 7500 adcs(Condition::None(), 7501 Best, 7502 Register(rd), 7503 Register(rd), 7504 Register(rm)); 7505 } 7506 break; 7507 } 7508 case 0x00800000: { 7509 // 0x41800000 7510 unsigned rd = (instr >> 16) & 0x7; 7511 unsigned rm = (instr >> 19) & 0x7; 7512 if (InITBlock()) { 7513 // SBC<c>{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1 7514 sbc(CurrentCond(), 7515 Best, 7516 Register(rd), 7517 Register(rd), 7518 Register(rm)); 7519 } else { 7520 VIXL_ASSERT(OutsideITBlock()); 7521 // SBCS{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1 7522 sbcs(Condition::None(), 7523 Best, 7524 Register(rd), 7525 Register(rd), 7526 Register(rm)); 7527 } 7528 break; 7529 } 7530 case 0x00c00000: { 7531 // 0x41c00000 7532 if (InITBlock()) { 7533 unsigned rd = (instr >> 16) & 0x7; 7534 unsigned rs = (instr >> 19) & 0x7; 7535 // ROR<c>{<q>} {<Rdm>}, <Rdm>, <Rs> ; T1 7536 ror(CurrentCond(), 7537 Best, 7538 Register(rd), 7539 Register(rd), 7540 Register(rs)); 7541 return; 7542 } 7543 if (!InITBlock()) { 7544 unsigned rd = (instr >> 16) & 0x7; 7545 unsigned rs = (instr >> 19) & 0x7; 7546 // RORS{<q>} {<Rdm>}, <Rdm>, <Rs> ; T1 7547 rors(Condition::None(), 7548 Best, 7549 Register(rd), 7550 Register(rd), 7551 Register(rs)); 7552 return; 7553 } 7554 unsigned rd = (instr >> 16) & 0x7; 7555 unsigned rm = (instr >> 16) & 0x7; 7556 unsigned rs = (instr >> 19) & 0x7; 7557 if (InITBlock()) { 7558 // MOV<c>{<q>} <Rdm>, <Rdm>, ROR <Rs> ; T1 7559 mov(CurrentCond(), 7560 Best, 7561 Register(rd), 7562 Operand(Register(rm), ROR, Register(rs))); 7563 } else { 7564 VIXL_ASSERT(OutsideITBlock()); 7565 // MOVS{<q>} <Rdm>, <Rdm>, ROR <Rs> ; T1 7566 movs(Condition::None(), 7567 Best, 7568 Register(rd), 7569 Operand(Register(rm), ROR, Register(rs))); 7570 } 7571 break; 7572 } 7573 } 7574 break; 7575 } 7576 case 0x02000000: { 7577 // 0x42000000 7578 switch (instr & 0x00c00000) { 7579 case 0x00000000: { 7580 // 0x42000000 7581 unsigned rn = (instr >> 16) & 0x7; 7582 unsigned rm = (instr >> 19) & 0x7; 7583 // TST{<c>}{<q>} <Rn>, <Rm> ; T1 7584 tst(CurrentCond(), Best, Register(rn), Register(rm)); 7585 break; 7586 } 7587 case 0x00400000: { 7588 // 0x42400000 7589 unsigned rd = (instr >> 16) & 0x7; 7590 unsigned rn = (instr >> 19) & 0x7; 7591 if (InITBlock()) { 7592 // RSB<c>{<q>} {<Rd>}, <Rn>, #0 ; T1 7593 rsb(CurrentCond(), 7594 Best, 7595 Register(rd), 7596 Register(rn), 7597 UINT32_C(0)); 7598 } else { 7599 VIXL_ASSERT(OutsideITBlock()); 7600 // RSBS{<q>} {<Rd>}, <Rn>, #0 ; T1 7601 rsbs(Condition::None(), 7602 Best, 7603 Register(rd), 7604 Register(rn), 7605 UINT32_C(0)); 7606 } 7607 break; 7608 } 7609 case 0x00800000: { 7610 // 0x42800000 7611 unsigned rn = (instr >> 16) & 0x7; 7612 unsigned rm = (instr >> 19) & 0x7; 7613 // CMP{<c>}{<q>} <Rn>, <Rm> ; T1 7614 cmp(CurrentCond(), Best, Register(rn), Register(rm)); 7615 break; 7616 } 7617 case 0x00c00000: { 7618 // 0x42c00000 7619 unsigned rn = (instr >> 16) & 0x7; 7620 unsigned rm = (instr >> 19) & 0x7; 7621 // CMN{<c>}{<q>} <Rn>, <Rm> ; T1 7622 cmn(CurrentCond(), Best, Register(rn), Register(rm)); 7623 break; 7624 } 7625 } 7626 break; 7627 } 7628 case 0x03000000: { 7629 // 0x43000000 7630 switch (instr & 0x00c00000) { 7631 case 0x00000000: { 7632 // 0x43000000 7633 unsigned rd = (instr >> 16) & 0x7; 7634 unsigned rm = (instr >> 19) & 0x7; 7635 if (InITBlock()) { 7636 // ORR<c>{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1 7637 orr(CurrentCond(), 7638 Best, 7639 Register(rd), 7640 Register(rd), 7641 Register(rm)); 7642 } else { 7643 VIXL_ASSERT(OutsideITBlock()); 7644 // ORRS{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1 7645 orrs(Condition::None(), 7646 Best, 7647 Register(rd), 7648 Register(rd), 7649 Register(rm)); 7650 } 7651 break; 7652 } 7653 case 0x00400000: { 7654 // 0x43400000 7655 unsigned rd = (instr >> 16) & 0x7; 7656 unsigned rn = (instr >> 19) & 0x7; 7657 if (InITBlock()) { 7658 // MUL<c>{<q>} <Rdm>, <Rn>, {<Rdm>} ; T1 7659 mul(CurrentCond(), 7660 Best, 7661 Register(rd), 7662 Register(rn), 7663 Register(rd)); 7664 } else { 7665 VIXL_ASSERT(OutsideITBlock()); 7666 // MULS{<q>} <Rdm>, <Rn>, {<Rdm>} ; T1 7667 muls(Condition::None(), 7668 Register(rd), 7669 Register(rn), 7670 Register(rd)); 7671 } 7672 break; 7673 } 7674 case 0x00800000: { 7675 // 0x43800000 7676 unsigned rd = (instr >> 16) & 0x7; 7677 unsigned rm = (instr >> 19) & 0x7; 7678 if (InITBlock()) { 7679 // BIC<c>{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1 7680 bic(CurrentCond(), 7681 Best, 7682 Register(rd), 7683 Register(rd), 7684 Register(rm)); 7685 } else { 7686 VIXL_ASSERT(OutsideITBlock()); 7687 // BICS{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1 7688 bics(Condition::None(), 7689 Best, 7690 Register(rd), 7691 Register(rd), 7692 Register(rm)); 7693 } 7694 break; 7695 } 7696 case 0x00c00000: { 7697 // 0x43c00000 7698 unsigned rd = (instr >> 16) & 0x7; 7699 unsigned rm = (instr >> 19) & 0x7; 7700 if (InITBlock()) { 7701 // MVN<c>{<q>} <Rd>, <Rm> ; T1 7702 mvn(CurrentCond(), Best, Register(rd), Register(rm)); 7703 } else { 7704 VIXL_ASSERT(OutsideITBlock()); 7705 // MVNS{<q>} <Rd>, <Rm> ; T1 7706 mvns(Condition::None(), Best, Register(rd), Register(rm)); 7707 } 7708 break; 7709 } 7710 } 7711 break; 7712 } 7713 case 0x04000000: { 7714 // 0x44000000 7715 switch (instr & 0x00780000) { 7716 case 0x00680000: { 7717 // 0x44680000 7718 unsigned rd = ((instr >> 16) & 0x7) | ((instr >> 20) & 0x8); 7719 // ADD{<c>}{<q>} {<Rdm>}, SP, <Rdm> ; T1 7720 add(CurrentCond(), Best, Register(rd), sp, Register(rd)); 7721 break; 7722 } 7723 default: { 7724 switch (instr & 0x00870000) { 7725 case 0x00850000: { 7726 // 0x44850000 7727 if (((instr & 0x780000) == 0x680000)) { 7728 UnallocatedT32(instr); 7729 return; 7730 } 7731 unsigned rm = (instr >> 19) & 0xf; 7732 // ADD{<c>}{<q>} {SP}, SP, <Rm> ; T2 7733 add(CurrentCond(), Best, sp, sp, Register(rm)); 7734 break; 7735 } 7736 default: { 7737 if (((instr & 0x780000) == 0x680000) || 7738 ((instr & 0x870000) == 0x850000)) { 7739 UnallocatedT32(instr); 7740 return; 7741 } 7742 unsigned rd = 7743 ((instr >> 16) & 0x7) | ((instr >> 20) & 0x8); 7744 unsigned rm = (instr >> 19) & 0xf; 7745 if (InITBlock()) { 7746 // ADD<c>{<q>} <Rdn>, <Rm> ; T2 7747 add(CurrentCond(), Register(rd), Register(rm)); 7748 } else { 7749 // ADD{<c>}{<q>} {<Rdn>}, <Rdn>, <Rm> ; T2 7750 add(CurrentCond(), 7751 Best, 7752 Register(rd), 7753 Register(rd), 7754 Register(rm)); 7755 } 7756 break; 7757 } 7758 } 7759 break; 7760 } 7761 } 7762 break; 7763 } 7764 case 0x05000000: { 7765 // 0x45000000 7766 unsigned rn = ((instr >> 16) & 0x7) | ((instr >> 20) & 0x8); 7767 unsigned rm = (instr >> 19) & 0xf; 7768 // CMP{<c>}{<q>} <Rn>, <Rm> ; T2 7769 cmp(CurrentCond(), Best, Register(rn), Register(rm)); 7770 break; 7771 } 7772 case 0x06000000: { 7773 // 0x46000000 7774 unsigned rd = ((instr >> 16) & 0x7) | ((instr >> 20) & 0x8); 7775 unsigned rm = (instr >> 19) & 0xf; 7776 // MOV{<c>}{<q>} <Rd>, <Rm> ; T1 7777 mov(CurrentCond(), Best, Register(rd), Register(rm)); 7778 break; 7779 } 7780 case 0x07000000: { 7781 // 0x47000000 7782 switch (instr & 0x00800000) { 7783 case 0x00000000: { 7784 // 0x47000000 7785 unsigned rm = (instr >> 19) & 0xf; 7786 // BX{<c>}{<q>} <Rm> ; T1 7787 bx(CurrentCond(), Register(rm)); 7788 if (((instr & 0xff870000) != 0x47000000)) { 7789 UnpredictableT32(instr); 7790 } 7791 break; 7792 } 7793 case 0x00800000: { 7794 // 0x47800000 7795 unsigned rm = (instr >> 19) & 0xf; 7796 // BLX{<c>}{<q>} <Rm> ; T1 7797 blx(CurrentCond(), Register(rm)); 7798 if (((instr & 0xff870000) != 0x47800000)) { 7799 UnpredictableT32(instr); 7800 } 7801 break; 7802 } 7803 } 7804 break; 7805 } 7806 } 7807 break; 7808 } 7809 case 0x08000000: { 7810 // 0x48000000 7811 unsigned rt = (instr >> 24) & 0x7; 7812 int32_t imm = ((instr >> 16) & 0xff) << 2; 7813 Label label(imm, kT32PcDelta); 7814 // LDR{<c>}{<q>} <Rt>, <label> ; T1 7815 ldr(CurrentCond(), Best, Register(rt), &label); 7816 break; 7817 } 7818 case 0x10000000: { 7819 // 0x50000000 7820 switch (instr & 0x06000000) { 7821 case 0x00000000: { 7822 // 0x50000000 7823 unsigned rt = (instr >> 16) & 0x7; 7824 unsigned rn = (instr >> 19) & 0x7; 7825 Sign sign(plus); 7826 unsigned rm = (instr >> 22) & 0x7; 7827 AddrMode addrmode = Offset; 7828 // STR{<c>}{<q>} <Rt>, [<Rn>, #{+}<Rm>] ; T1 7829 str(CurrentCond(), 7830 Best, 7831 Register(rt), 7832 MemOperand(Register(rn), sign, Register(rm), addrmode)); 7833 break; 7834 } 7835 case 0x02000000: { 7836 // 0x52000000 7837 unsigned rt = (instr >> 16) & 0x7; 7838 unsigned rn = (instr >> 19) & 0x7; 7839 Sign sign(plus); 7840 unsigned rm = (instr >> 22) & 0x7; 7841 AddrMode addrmode = Offset; 7842 // STRH{<c>}{<q>} <Rt>, [<Rn>, #{+}<Rm>] ; T1 7843 strh(CurrentCond(), 7844 Best, 7845 Register(rt), 7846 MemOperand(Register(rn), sign, Register(rm), addrmode)); 7847 break; 7848 } 7849 case 0x04000000: { 7850 // 0x54000000 7851 unsigned rt = (instr >> 16) & 0x7; 7852 unsigned rn = (instr >> 19) & 0x7; 7853 Sign sign(plus); 7854 unsigned rm = (instr >> 22) & 0x7; 7855 AddrMode addrmode = Offset; 7856 // STRB{<c>}{<q>} <Rt>, [<Rn>, #{+}<Rm>] ; T1 7857 strb(CurrentCond(), 7858 Best, 7859 Register(rt), 7860 MemOperand(Register(rn), sign, Register(rm), addrmode)); 7861 break; 7862 } 7863 case 0x06000000: { 7864 // 0x56000000 7865 unsigned rt = (instr >> 16) & 0x7; 7866 unsigned rn = (instr >> 19) & 0x7; 7867 Sign sign(plus); 7868 unsigned rm = (instr >> 22) & 0x7; 7869 AddrMode addrmode = Offset; 7870 // LDRSB{<c>}{<q>} <Rt>, [<Rn>, #{+}<Rm>] ; T1 7871 ldrsb(CurrentCond(), 7872 Best, 7873 Register(rt), 7874 MemOperand(Register(rn), sign, Register(rm), addrmode)); 7875 break; 7876 } 7877 } 7878 break; 7879 } 7880 case 0x18000000: { 7881 // 0x58000000 7882 switch (instr & 0x06000000) { 7883 case 0x00000000: { 7884 // 0x58000000 7885 unsigned rt = (instr >> 16) & 0x7; 7886 unsigned rn = (instr >> 19) & 0x7; 7887 Sign sign(plus); 7888 unsigned rm = (instr >> 22) & 0x7; 7889 AddrMode addrmode = Offset; 7890 // LDR{<c>}{<q>} <Rt>, [<Rn>, #{+}<Rm>] ; T1 7891 ldr(CurrentCond(), 7892 Best, 7893 Register(rt), 7894 MemOperand(Register(rn), sign, Register(rm), addrmode)); 7895 break; 7896 } 7897 case 0x02000000: { 7898 // 0x5a000000 7899 unsigned rt = (instr >> 16) & 0x7; 7900 unsigned rn = (instr >> 19) & 0x7; 7901 Sign sign(plus); 7902 unsigned rm = (instr >> 22) & 0x7; 7903 AddrMode addrmode = Offset; 7904 // LDRH{<c>}{<q>} <Rt>, [<Rn>, #{+}<Rm>] ; T1 7905 ldrh(CurrentCond(), 7906 Best, 7907 Register(rt), 7908 MemOperand(Register(rn), sign, Register(rm), addrmode)); 7909 break; 7910 } 7911 case 0x04000000: { 7912 // 0x5c000000 7913 unsigned rt = (instr >> 16) & 0x7; 7914 unsigned rn = (instr >> 19) & 0x7; 7915 Sign sign(plus); 7916 unsigned rm = (instr >> 22) & 0x7; 7917 AddrMode addrmode = Offset; 7918 // LDRB{<c>}{<q>} <Rt>, [<Rn>, #{+}<Rm>] ; T1 7919 ldrb(CurrentCond(), 7920 Best, 7921 Register(rt), 7922 MemOperand(Register(rn), sign, Register(rm), addrmode)); 7923 break; 7924 } 7925 case 0x06000000: { 7926 // 0x5e000000 7927 unsigned rt = (instr >> 16) & 0x7; 7928 unsigned rn = (instr >> 19) & 0x7; 7929 Sign sign(plus); 7930 unsigned rm = (instr >> 22) & 0x7; 7931 AddrMode addrmode = Offset; 7932 // LDRSH{<c>}{<q>} <Rt>, [<Rn>, #{+}<Rm>] ; T1 7933 ldrsh(CurrentCond(), 7934 Best, 7935 Register(rt), 7936 MemOperand(Register(rn), sign, Register(rm), addrmode)); 7937 break; 7938 } 7939 } 7940 break; 7941 } 7942 } 7943 break; 7944 } 7945 case 0x60000000: { 7946 // 0x60000000 7947 switch (instr & 0x18000000) { 7948 case 0x00000000: { 7949 // 0x60000000 7950 unsigned rt = (instr >> 16) & 0x7; 7951 unsigned rn = (instr >> 19) & 0x7; 7952 int32_t offset = ((instr >> 22) & 0x1f) << 2; 7953 // STR{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm>}] ; T1 7954 str(CurrentCond(), 7955 Best, 7956 Register(rt), 7957 MemOperand(Register(rn), plus, offset, Offset)); 7958 break; 7959 } 7960 case 0x08000000: { 7961 // 0x68000000 7962 unsigned rt = (instr >> 16) & 0x7; 7963 unsigned rn = (instr >> 19) & 0x7; 7964 int32_t offset = ((instr >> 22) & 0x1f) << 2; 7965 // LDR{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm>}] ; T1 7966 ldr(CurrentCond(), 7967 Best, 7968 Register(rt), 7969 MemOperand(Register(rn), plus, offset, Offset)); 7970 break; 7971 } 7972 case 0x10000000: { 7973 // 0x70000000 7974 unsigned rt = (instr >> 16) & 0x7; 7975 unsigned rn = (instr >> 19) & 0x7; 7976 int32_t offset = (instr >> 22) & 0x1f; 7977 // STRB{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm>}] ; T1 7978 strb(CurrentCond(), 7979 Best, 7980 Register(rt), 7981 MemOperand(Register(rn), plus, offset, Offset)); 7982 break; 7983 } 7984 case 0x18000000: { 7985 // 0x78000000 7986 unsigned rt = (instr >> 16) & 0x7; 7987 unsigned rn = (instr >> 19) & 0x7; 7988 int32_t offset = (instr >> 22) & 0x1f; 7989 // LDRB{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm>}] ; T1 7990 ldrb(CurrentCond(), 7991 Best, 7992 Register(rt), 7993 MemOperand(Register(rn), plus, offset, Offset)); 7994 break; 7995 } 7996 } 7997 break; 7998 } 7999 case 0x80000000: { 8000 // 0x80000000 8001 switch (instr & 0x18000000) { 8002 case 0x00000000: { 8003 // 0x80000000 8004 unsigned rt = (instr >> 16) & 0x7; 8005 unsigned rn = (instr >> 19) & 0x7; 8006 int32_t offset = ((instr >> 22) & 0x1f) << 1; 8007 // STRH{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm>}] ; T1 8008 strh(CurrentCond(), 8009 Best, 8010 Register(rt), 8011 MemOperand(Register(rn), plus, offset, Offset)); 8012 break; 8013 } 8014 case 0x08000000: { 8015 // 0x88000000 8016 unsigned rt = (instr >> 16) & 0x7; 8017 unsigned rn = (instr >> 19) & 0x7; 8018 int32_t offset = ((instr >> 22) & 0x1f) << 1; 8019 // LDRH{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm>}] ; T1 8020 ldrh(CurrentCond(), 8021 Best, 8022 Register(rt), 8023 MemOperand(Register(rn), plus, offset, Offset)); 8024 break; 8025 } 8026 case 0x10000000: { 8027 // 0x90000000 8028 unsigned rt = (instr >> 24) & 0x7; 8029 int32_t offset = ((instr >> 16) & 0xff) << 2; 8030 // STR{<c>}{<q>} <Rt>, [SP{, #{+}<imm>}] ; T2 8031 str(CurrentCond(), 8032 Best, 8033 Register(rt), 8034 MemOperand(sp, plus, offset, Offset)); 8035 break; 8036 } 8037 case 0x18000000: { 8038 // 0x98000000 8039 unsigned rt = (instr >> 24) & 0x7; 8040 int32_t offset = ((instr >> 16) & 0xff) << 2; 8041 // LDR{<c>}{<q>} <Rt>, [SP{, #{+}<imm>}] ; T2 8042 ldr(CurrentCond(), 8043 Best, 8044 Register(rt), 8045 MemOperand(sp, plus, offset, Offset)); 8046 break; 8047 } 8048 } 8049 break; 8050 } 8051 case 0xa0000000: { 8052 // 0xa0000000 8053 switch (instr & 0x18000000) { 8054 case 0x00000000: { 8055 // 0xa0000000 8056 unsigned rd = (instr >> 24) & 0x7; 8057 int32_t imm = ((instr >> 16) & 0xff) << 2; 8058 Label label(imm, kT32PcDelta); 8059 // ADR{<c>}{<q>} <Rd>, <label> ; T1 8060 adr(CurrentCond(), Best, Register(rd), &label); 8061 break; 8062 } 8063 case 0x08000000: { 8064 // 0xa8000000 8065 unsigned rd = (instr >> 24) & 0x7; 8066 uint32_t imm = ((instr >> 16) & 0xff) << 2; 8067 // ADD{<c>}{<q>} <Rd>, SP, #<imm8> ; T1 8068 add(CurrentCond(), Best, Register(rd), sp, imm); 8069 break; 8070 } 8071 case 0x10000000: { 8072 // 0xb0000000 8073 switch (instr & 0x04000000) { 8074 case 0x00000000: { 8075 // 0xb0000000 8076 switch (instr & 0x01000000) { 8077 case 0x00000000: { 8078 // 0xb0000000 8079 switch (instr & 0x02800000) { 8080 case 0x00000000: { 8081 // 0xb0000000 8082 uint32_t imm = ((instr >> 16) & 0x7f) << 2; 8083 // ADD{<c>}{<q>} {SP}, SP, #<imm7> ; T2 8084 add(CurrentCond(), Best, sp, sp, imm); 8085 break; 8086 } 8087 case 0x00800000: { 8088 // 0xb0800000 8089 uint32_t imm = ((instr >> 16) & 0x7f) << 2; 8090 // SUB{<c>}{<q>} {SP}, SP, #<imm7> ; T1 8091 sub(CurrentCond(), Best, sp, sp, imm); 8092 break; 8093 } 8094 case 0x02000000: { 8095 // 0xb2000000 8096 switch (instr & 0x00400000) { 8097 case 0x00000000: { 8098 // 0xb2000000 8099 unsigned rd = (instr >> 16) & 0x7; 8100 unsigned rm = (instr >> 19) & 0x7; 8101 // SXTH{<c>}{<q>} {<Rd>}, <Rm> ; T1 8102 sxth(CurrentCond(), Best, Register(rd), Register(rm)); 8103 break; 8104 } 8105 case 0x00400000: { 8106 // 0xb2400000 8107 unsigned rd = (instr >> 16) & 0x7; 8108 unsigned rm = (instr >> 19) & 0x7; 8109 // SXTB{<c>}{<q>} {<Rd>}, <Rm> ; T1 8110 sxtb(CurrentCond(), Best, Register(rd), Register(rm)); 8111 break; 8112 } 8113 } 8114 break; 8115 } 8116 case 0x02800000: { 8117 // 0xb2800000 8118 switch (instr & 0x00400000) { 8119 case 0x00000000: { 8120 // 0xb2800000 8121 unsigned rd = (instr >> 16) & 0x7; 8122 unsigned rm = (instr >> 19) & 0x7; 8123 // UXTH{<c>}{<q>} {<Rd>}, <Rm> ; T1 8124 uxth(CurrentCond(), Best, Register(rd), Register(rm)); 8125 break; 8126 } 8127 case 0x00400000: { 8128 // 0xb2c00000 8129 unsigned rd = (instr >> 16) & 0x7; 8130 unsigned rm = (instr >> 19) & 0x7; 8131 // UXTB{<c>}{<q>} {<Rd>}, <Rm> ; T1 8132 uxtb(CurrentCond(), Best, Register(rd), Register(rm)); 8133 break; 8134 } 8135 } 8136 break; 8137 } 8138 } 8139 break; 8140 } 8141 case 0x01000000: { 8142 // 0xb1000000 8143 unsigned rn = (instr >> 16) & 0x7; 8144 int32_t imm = 8145 (((instr >> 19) & 0x1f) | ((instr >> 20) & 0x20)) << 1; 8146 Label label(imm, kT32PcDelta); 8147 // CBZ{<q>} <Rn>, <label> ; T1 8148 cbz(Register(rn), &label); 8149 break; 8150 } 8151 } 8152 break; 8153 } 8154 case 0x04000000: { 8155 // 0xb4000000 8156 switch (instr & 0x02000000) { 8157 case 0x00000000: { 8158 // 0xb4000000 8159 RegisterList registers((((instr >> 24) & 0x1) << kLRRegNum) | 8160 ((instr >> 16) & 0xff)); 8161 // PUSH{<c>}{<q>} <registers> ; T1 8162 push(CurrentCond(), Best, registers); 8163 break; 8164 } 8165 case 0x02000000: { 8166 // 0xb6000000 8167 switch (instr & 0x01e00000) { 8168 case 0x00400000: { 8169 // 0xb6400000 8170 UnimplementedT32_16("SETEND", instr); 8171 break; 8172 } 8173 case 0x00600000: { 8174 // 0xb6600000 8175 switch (instr & 0x00100000) { 8176 case 0x00000000: { 8177 // 0xb6600000 8178 UnimplementedT32_16("CPSIE", instr); 8179 break; 8180 } 8181 case 0x00100000: { 8182 // 0xb6700000 8183 UnimplementedT32_16("CPSID", instr); 8184 break; 8185 } 8186 } 8187 break; 8188 } 8189 default: 8190 UnallocatedT32(instr); 8191 break; 8192 } 8193 break; 8194 } 8195 } 8196 break; 8197 } 8198 } 8199 break; 8200 } 8201 case 0x18000000: { 8202 // 0xb8000000 8203 switch (instr & 0x04000000) { 8204 case 0x00000000: { 8205 // 0xb8000000 8206 switch (instr & 0x01000000) { 8207 case 0x00000000: { 8208 // 0xb8000000 8209 switch (instr & 0x02c00000) { 8210 case 0x02000000: { 8211 // 0xba000000 8212 unsigned rd = (instr >> 16) & 0x7; 8213 unsigned rm = (instr >> 19) & 0x7; 8214 // REV{<c>}{<q>} <Rd>, <Rm> ; T1 8215 rev(CurrentCond(), Best, Register(rd), Register(rm)); 8216 break; 8217 } 8218 case 0x02400000: { 8219 // 0xba400000 8220 unsigned rd = (instr >> 16) & 0x7; 8221 unsigned rm = (instr >> 19) & 0x7; 8222 // REV16{<c>}{<q>} <Rd>, <Rm> ; T1 8223 rev16(CurrentCond(), Best, Register(rd), Register(rm)); 8224 break; 8225 } 8226 case 0x02800000: { 8227 // 0xba800000 8228 uint32_t imm = (instr >> 16) & 0x3f; 8229 // HLT{<q>} {#}<imm> ; T1 8230 hlt(Condition::None(), imm); 8231 break; 8232 } 8233 case 0x02c00000: { 8234 // 0xbac00000 8235 unsigned rd = (instr >> 16) & 0x7; 8236 unsigned rm = (instr >> 19) & 0x7; 8237 // REVSH{<c>}{<q>} <Rd>, <Rm> ; T1 8238 revsh(CurrentCond(), Best, Register(rd), Register(rm)); 8239 break; 8240 } 8241 default: 8242 UnallocatedT32(instr); 8243 break; 8244 } 8245 break; 8246 } 8247 case 0x01000000: { 8248 // 0xb9000000 8249 unsigned rn = (instr >> 16) & 0x7; 8250 int32_t imm = 8251 (((instr >> 19) & 0x1f) | ((instr >> 20) & 0x20)) << 1; 8252 Label label(imm, kT32PcDelta); 8253 // CBNZ{<q>} <Rn>, <label> ; T1 8254 cbnz(Register(rn), &label); 8255 break; 8256 } 8257 } 8258 break; 8259 } 8260 case 0x04000000: { 8261 // 0xbc000000 8262 switch (instr & 0x02000000) { 8263 case 0x00000000: { 8264 // 0xbc000000 8265 RegisterList registers((((instr >> 24) & 0x1) << kPCRegNum) | 8266 ((instr >> 16) & 0xff)); 8267 // POP{<c>}{<q>} <registers> ; T1 8268 pop(CurrentCond(), Best, registers); 8269 break; 8270 } 8271 case 0x02000000: { 8272 // 0xbe000000 8273 switch (instr & 0x01000000) { 8274 case 0x00000000: { 8275 // 0xbe000000 8276 uint32_t imm = (instr >> 16) & 0xff; 8277 // BKPT{<q>} {#}<imm> ; T1 8278 bkpt(Condition::None(), imm); 8279 break; 8280 } 8281 case 0x01000000: { 8282 // 0xbf000000 8283 switch (instr & 0x000f0000) { 8284 case 0x00000000: { 8285 // 0xbf000000 8286 switch (instr & 0x00f00000) { 8287 case 0x00000000: { 8288 // 0xbf000000 8289 // NOP{<c>}{<q>} ; T1 8290 nop(CurrentCond(), Best); 8291 break; 8292 } 8293 case 0x00100000: { 8294 // 0xbf100000 8295 // YIELD{<c>}{<q>} ; T1 8296 yield(CurrentCond(), Best); 8297 break; 8298 } 8299 case 0x00200000: { 8300 // 0xbf200000 8301 UnimplementedT32_16("WFE", instr); 8302 break; 8303 } 8304 case 0x00300000: { 8305 // 0xbf300000 8306 UnimplementedT32_16("WFI", instr); 8307 break; 8308 } 8309 case 0x00400000: { 8310 // 0xbf400000 8311 UnimplementedT32_16("SEV", instr); 8312 break; 8313 } 8314 case 0x00500000: { 8315 // 0xbf500000 8316 UnimplementedT32_16("SEVL", instr); 8317 break; 8318 } 8319 default: 8320 UnallocatedT32(instr); 8321 break; 8322 } 8323 break; 8324 } 8325 default: { 8326 if (((instr & 0xf0000) == 0x0)) { 8327 UnallocatedT32(instr); 8328 return; 8329 } 8330 unsigned firstcond = (instr >> 20) & 0xf; 8331 unsigned mask = (instr >> 16) & 0xf; 8332 bool wasInITBlock = InITBlock(); 8333 SetIT(Condition(firstcond), mask); 8334 it(Condition(firstcond), mask); 8335 if (wasInITBlock || (firstcond == 15) || 8336 ((firstcond == al) && 8337 (BitCount(Uint32(mask)) != 1))) { 8338 UnpredictableT32(instr); 8339 } 8340 break; 8341 } 8342 } 8343 break; 8344 } 8345 } 8346 break; 8347 } 8348 } 8349 break; 8350 } 8351 } 8352 break; 8353 } 8354 } 8355 break; 8356 } 8357 case 0xc0000000: { 8358 // 0xc0000000 8359 switch (instr & 0x10000000) { 8360 case 0x00000000: { 8361 // 0xc0000000 8362 switch (instr & 0x08000000) { 8363 case 0x00000000: { 8364 // 0xc0000000 8365 unsigned rn = (instr >> 24) & 0x7; 8366 RegisterList registers(((instr >> 16) & 0xff)); 8367 // STM{<c>}{<q>} <Rn>!, <registers> ; T1 8368 stm(CurrentCond(), 8369 Best, 8370 Register(rn), 8371 WriteBack(WRITE_BACK), 8372 registers); 8373 break; 8374 } 8375 case 0x08000000: { 8376 // 0xc8000000 8377 unsigned rn = (instr >> 24) & 0x7; 8378 RegisterList registers(((instr >> 16) & 0xff)); 8379 // LDM{<c>}{<q>} <Rn>{!}, <registers> ; T1 8380 ldm(CurrentCond(), 8381 Best, 8382 Register(rn), 8383 WriteBack(!registers.Includes(Register(rn))), 8384 registers); 8385 break; 8386 } 8387 } 8388 break; 8389 } 8390 case 0x10000000: { 8391 // 0xd0000000 8392 switch (instr & 0x0e000000) { 8393 case 0x0e000000: { 8394 // 0xde000000 8395 switch (instr & 0x01000000) { 8396 case 0x00000000: { 8397 // 0xde000000 8398 uint32_t imm = (instr >> 16) & 0xff; 8399 // UDF{<c>}{<q>} {#}<imm> ; T1 8400 udf(CurrentCond(), Best, imm); 8401 break; 8402 } 8403 case 0x01000000: { 8404 // 0xdf000000 8405 uint32_t imm = (instr >> 16) & 0xff; 8406 // SVC{<c>}{<q>} {#}<imm> ; T1 8407 svc(CurrentCond(), imm); 8408 break; 8409 } 8410 } 8411 break; 8412 } 8413 default: { 8414 if (((instr & 0xe000000) == 0xe000000)) { 8415 UnallocatedT32(instr); 8416 return; 8417 } 8418 Condition condition((instr >> 24) & 0xf); 8419 int32_t imm = SignExtend<int32_t>((instr >> 16) & 0xff, 8) << 1; 8420 Label label(imm, kT32PcDelta); 8421 // B<c>{<q>} <label> ; T1 8422 b(condition, Best, &label); 8423 break; 8424 } 8425 } 8426 break; 8427 } 8428 } 8429 break; 8430 } 8431 case 0xe0000000: { 8432 // 0xe0000000 8433 switch (instr & 0x08000000) { 8434 case 0x00000000: { 8435 // 0xe0000000 8436 switch (instr & 0x10000000) { 8437 case 0x00000000: { 8438 // 0xe0000000 8439 int32_t imm = SignExtend<int32_t>((instr >> 16) & 0x7ff, 11) << 1; 8440 Label label(imm, kT32PcDelta); 8441 // B{<c>}{<q>} <label> ; T2 8442 b(CurrentCond(), Best, &label); 8443 break; 8444 } 8445 case 0x10000000: { 8446 // 0xf0000000 8447 switch (instr & 0x00008000) { 8448 case 0x00000000: { 8449 // 0xf0000000 8450 switch (instr & 0x03f00000) { 8451 case 0x00000000: { 8452 // 0xf0000000 8453 unsigned rd = (instr >> 8) & 0xf; 8454 unsigned rn = (instr >> 16) & 0xf; 8455 uint32_t imm = ImmediateT32::Decode( 8456 (instr & 0xff) | ((instr >> 4) & 0x700) | 8457 ((instr >> 15) & 0x800)); 8458 // AND{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1 8459 and_(CurrentCond(), 8460 Best, 8461 Register(rd), 8462 Register(rn), 8463 imm); 8464 break; 8465 } 8466 case 0x00100000: { 8467 // 0xf0100000 8468 switch (instr & 0x00000f00) { 8469 case 0x00000f00: { 8470 // 0xf0100f00 8471 unsigned rn = (instr >> 16) & 0xf; 8472 uint32_t imm = ImmediateT32::Decode( 8473 (instr & 0xff) | ((instr >> 4) & 0x700) | 8474 ((instr >> 15) & 0x800)); 8475 // TST{<c>}{<q>} <Rn>, #<const> ; T1 8476 tst(CurrentCond(), Best, Register(rn), imm); 8477 break; 8478 } 8479 default: { 8480 if (((instr & 0xf00) == 0xf00)) { 8481 UnallocatedT32(instr); 8482 return; 8483 } 8484 unsigned rd = (instr >> 8) & 0xf; 8485 unsigned rn = (instr >> 16) & 0xf; 8486 uint32_t imm = ImmediateT32::Decode( 8487 (instr & 0xff) | ((instr >> 4) & 0x700) | 8488 ((instr >> 15) & 0x800)); 8489 // ANDS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1 8490 ands(CurrentCond(), 8491 Best, 8492 Register(rd), 8493 Register(rn), 8494 imm); 8495 break; 8496 } 8497 } 8498 break; 8499 } 8500 case 0x00200000: { 8501 // 0xf0200000 8502 unsigned rd = (instr >> 8) & 0xf; 8503 unsigned rn = (instr >> 16) & 0xf; 8504 uint32_t imm = ImmediateT32::Decode( 8505 (instr & 0xff) | ((instr >> 4) & 0x700) | 8506 ((instr >> 15) & 0x800)); 8507 // BIC{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1 8508 bic(CurrentCond(), Best, Register(rd), Register(rn), imm); 8509 break; 8510 } 8511 case 0x00300000: { 8512 // 0xf0300000 8513 unsigned rd = (instr >> 8) & 0xf; 8514 unsigned rn = (instr >> 16) & 0xf; 8515 uint32_t imm = ImmediateT32::Decode( 8516 (instr & 0xff) | ((instr >> 4) & 0x700) | 8517 ((instr >> 15) & 0x800)); 8518 // BICS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1 8519 bics(CurrentCond(), 8520 Best, 8521 Register(rd), 8522 Register(rn), 8523 imm); 8524 break; 8525 } 8526 case 0x00400000: { 8527 // 0xf0400000 8528 switch (instr & 0x000f0000) { 8529 case 0x000f0000: { 8530 // 0xf04f0000 8531 unsigned rd = (instr >> 8) & 0xf; 8532 uint32_t imm = ImmediateT32::Decode( 8533 (instr & 0xff) | ((instr >> 4) & 0x700) | 8534 ((instr >> 15) & 0x800)); 8535 if (InITBlock() && 8536 (instr & 0x00100000) == 0x00000000 && 8537 ((rd < kNumberOfT32LowRegisters) && 8538 (imm <= 255))) { 8539 // MOV<c>.W <Rd>, #<const> ; T2 8540 mov(CurrentCond(), Wide, Register(rd), imm); 8541 } else { 8542 VIXL_ASSERT((instr & 0x00100000) == 0x00000000); 8543 // MOV{<c>}{<q>} <Rd>, #<const> ; T2 8544 mov(CurrentCond(), Best, Register(rd), imm); 8545 } 8546 break; 8547 } 8548 default: { 8549 if (((instr & 0xf0000) == 0xf0000)) { 8550 UnallocatedT32(instr); 8551 return; 8552 } 8553 unsigned rd = (instr >> 8) & 0xf; 8554 unsigned rn = (instr >> 16) & 0xf; 8555 uint32_t imm = ImmediateT32::Decode( 8556 (instr & 0xff) | ((instr >> 4) & 0x700) | 8557 ((instr >> 15) & 0x800)); 8558 // ORR{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1 8559 orr(CurrentCond(), 8560 Best, 8561 Register(rd), 8562 Register(rn), 8563 imm); 8564 break; 8565 } 8566 } 8567 break; 8568 } 8569 case 0x00500000: { 8570 // 0xf0500000 8571 switch (instr & 0x000f0000) { 8572 case 0x000f0000: { 8573 // 0xf05f0000 8574 unsigned rd = (instr >> 8) & 0xf; 8575 uint32_t imm = ImmediateT32::Decode( 8576 (instr & 0xff) | ((instr >> 4) & 0x700) | 8577 ((instr >> 15) & 0x800)); 8578 if (OutsideITBlock() && 8579 (instr & 0x00100000) == 0x00100000 && 8580 ((rd < kNumberOfT32LowRegisters) && 8581 (imm <= 255))) { 8582 // MOVS.W <Rd>, #<const> ; T2 8583 movs(Condition::None(), Wide, Register(rd), imm); 8584 } else { 8585 VIXL_ASSERT((instr & 0x00100000) == 0x00100000); 8586 // MOVS{<c>}{<q>} <Rd>, #<const> ; T2 8587 movs(CurrentCond(), Best, Register(rd), imm); 8588 } 8589 break; 8590 } 8591 default: { 8592 if (((instr & 0xf0000) == 0xf0000)) { 8593 UnallocatedT32(instr); 8594 return; 8595 } 8596 unsigned rd = (instr >> 8) & 0xf; 8597 unsigned rn = (instr >> 16) & 0xf; 8598 uint32_t imm = ImmediateT32::Decode( 8599 (instr & 0xff) | ((instr >> 4) & 0x700) | 8600 ((instr >> 15) & 0x800)); 8601 // ORRS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1 8602 orrs(CurrentCond(), 8603 Best, 8604 Register(rd), 8605 Register(rn), 8606 imm); 8607 break; 8608 } 8609 } 8610 break; 8611 } 8612 case 0x00600000: { 8613 // 0xf0600000 8614 switch (instr & 0x000f0000) { 8615 case 0x000f0000: { 8616 // 0xf06f0000 8617 unsigned rd = (instr >> 8) & 0xf; 8618 uint32_t imm = ImmediateT32::Decode( 8619 (instr & 0xff) | ((instr >> 4) & 0x700) | 8620 ((instr >> 15) & 0x800)); 8621 // MVN{<c>}{<q>} <Rd>, #<const> ; T1 8622 mvn(CurrentCond(), Best, Register(rd), imm); 8623 break; 8624 } 8625 default: { 8626 if (((instr & 0xf0000) == 0xf0000)) { 8627 UnallocatedT32(instr); 8628 return; 8629 } 8630 unsigned rd = (instr >> 8) & 0xf; 8631 unsigned rn = (instr >> 16) & 0xf; 8632 uint32_t imm = ImmediateT32::Decode( 8633 (instr & 0xff) | ((instr >> 4) & 0x700) | 8634 ((instr >> 15) & 0x800)); 8635 // ORN{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1 8636 orn(CurrentCond(), Register(rd), Register(rn), imm); 8637 break; 8638 } 8639 } 8640 break; 8641 } 8642 case 0x00700000: { 8643 // 0xf0700000 8644 switch (instr & 0x000f0000) { 8645 case 0x000f0000: { 8646 // 0xf07f0000 8647 unsigned rd = (instr >> 8) & 0xf; 8648 uint32_t imm = ImmediateT32::Decode( 8649 (instr & 0xff) | ((instr >> 4) & 0x700) | 8650 ((instr >> 15) & 0x800)); 8651 // MVNS{<c>}{<q>} <Rd>, #<const> ; T1 8652 mvns(CurrentCond(), Best, Register(rd), imm); 8653 break; 8654 } 8655 default: { 8656 if (((instr & 0xf0000) == 0xf0000)) { 8657 UnallocatedT32(instr); 8658 return; 8659 } 8660 unsigned rd = (instr >> 8) & 0xf; 8661 unsigned rn = (instr >> 16) & 0xf; 8662 uint32_t imm = ImmediateT32::Decode( 8663 (instr & 0xff) | ((instr >> 4) & 0x700) | 8664 ((instr >> 15) & 0x800)); 8665 // ORNS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1 8666 orns(CurrentCond(), Register(rd), Register(rn), imm); 8667 break; 8668 } 8669 } 8670 break; 8671 } 8672 case 0x00800000: { 8673 // 0xf0800000 8674 unsigned rd = (instr >> 8) & 0xf; 8675 unsigned rn = (instr >> 16) & 0xf; 8676 uint32_t imm = ImmediateT32::Decode( 8677 (instr & 0xff) | ((instr >> 4) & 0x700) | 8678 ((instr >> 15) & 0x800)); 8679 // EOR{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1 8680 eor(CurrentCond(), Best, Register(rd), Register(rn), imm); 8681 break; 8682 } 8683 case 0x00900000: { 8684 // 0xf0900000 8685 switch (instr & 0x00000f00) { 8686 case 0x00000f00: { 8687 // 0xf0900f00 8688 unsigned rn = (instr >> 16) & 0xf; 8689 uint32_t imm = ImmediateT32::Decode( 8690 (instr & 0xff) | ((instr >> 4) & 0x700) | 8691 ((instr >> 15) & 0x800)); 8692 // TEQ{<c>}{<q>} <Rn>, #<const> ; T1 8693 teq(CurrentCond(), Register(rn), imm); 8694 break; 8695 } 8696 default: { 8697 if (((instr & 0xf00) == 0xf00)) { 8698 UnallocatedT32(instr); 8699 return; 8700 } 8701 unsigned rd = (instr >> 8) & 0xf; 8702 unsigned rn = (instr >> 16) & 0xf; 8703 uint32_t imm = ImmediateT32::Decode( 8704 (instr & 0xff) | ((instr >> 4) & 0x700) | 8705 ((instr >> 15) & 0x800)); 8706 // EORS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1 8707 eors(CurrentCond(), 8708 Best, 8709 Register(rd), 8710 Register(rn), 8711 imm); 8712 break; 8713 } 8714 } 8715 break; 8716 } 8717 case 0x01000000: { 8718 // 0xf1000000 8719 switch (instr & 0x000f0000) { 8720 case 0x000d0000: { 8721 // 0xf10d0000 8722 unsigned rd = (instr >> 8) & 0xf; 8723 uint32_t imm = ImmediateT32::Decode( 8724 (instr & 0xff) | ((instr >> 4) & 0x700) | 8725 ((instr >> 15) & 0x800)); 8726 if ((instr & 0x00100000) == 0x00000000 && 8727 (((rd < kNumberOfT32LowRegisters) && 8728 ((imm <= 1020) && ((imm & 3) == 0))) || 8729 ((rd == sp.GetCode()) && 8730 ((imm <= 508) && ((imm & 3) == 0))))) { 8731 // ADD{<c>}.W {<Rd>}, SP, #<const> ; T3 8732 add(CurrentCond(), Wide, Register(rd), sp, imm); 8733 } else { 8734 VIXL_ASSERT((instr & 0x00100000) == 0x00000000); 8735 // ADD{<c>}{<q>} {<Rd>}, SP, #<const> ; T3 8736 add(CurrentCond(), Best, Register(rd), sp, imm); 8737 } 8738 break; 8739 } 8740 default: { 8741 if (((instr & 0xf0000) == 0xd0000)) { 8742 UnallocatedT32(instr); 8743 return; 8744 } 8745 unsigned rd = (instr >> 8) & 0xf; 8746 unsigned rn = (instr >> 16) & 0xf; 8747 uint32_t imm = ImmediateT32::Decode( 8748 (instr & 0xff) | ((instr >> 4) & 0x700) | 8749 ((instr >> 15) & 0x800)); 8750 if (InITBlock() && 8751 (instr & 0x00100000) == 0x00000000 && 8752 (((rd < kNumberOfT32LowRegisters) && 8753 (rn < kNumberOfT32LowRegisters) && 8754 (imm <= 7)) || 8755 ((rd == rn) && (rd < kNumberOfT32LowRegisters) && 8756 (imm <= 255)))) { 8757 // ADD<c>.W {<Rd>}, <Rn>, #<const> ; T3 8758 add(CurrentCond(), 8759 Wide, 8760 Register(rd), 8761 Register(rn), 8762 imm); 8763 } else { 8764 VIXL_ASSERT((instr & 0x00100000) == 0x00000000); 8765 // ADD{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T3 8766 add(CurrentCond(), 8767 Best, 8768 Register(rd), 8769 Register(rn), 8770 imm); 8771 } 8772 break; 8773 } 8774 } 8775 break; 8776 } 8777 case 0x01100000: { 8778 // 0xf1100000 8779 switch (instr & 0x00000f00) { 8780 case 0x00000f00: { 8781 // 0xf1100f00 8782 unsigned rn = (instr >> 16) & 0xf; 8783 uint32_t imm = ImmediateT32::Decode( 8784 (instr & 0xff) | ((instr >> 4) & 0x700) | 8785 ((instr >> 15) & 0x800)); 8786 // CMN{<c>}{<q>} <Rn>, #<const> ; T1 8787 cmn(CurrentCond(), Best, Register(rn), imm); 8788 break; 8789 } 8790 default: { 8791 switch (instr & 0x000f0000) { 8792 case 0x000d0000: { 8793 // 0xf11d0000 8794 if (((instr & 0xf00) == 0xf00)) { 8795 UnallocatedT32(instr); 8796 return; 8797 } 8798 unsigned rd = (instr >> 8) & 0xf; 8799 uint32_t imm = ImmediateT32::Decode( 8800 (instr & 0xff) | ((instr >> 4) & 0x700) | 8801 ((instr >> 15) & 0x800)); 8802 // ADDS{<c>}{<q>} {<Rd>}, SP, #<const> ; T3 8803 adds(CurrentCond(), Best, Register(rd), sp, imm); 8804 break; 8805 } 8806 default: { 8807 if (((instr & 0xf0000) == 0xd0000) || 8808 ((instr & 0xf00) == 0xf00)) { 8809 UnallocatedT32(instr); 8810 return; 8811 } 8812 unsigned rd = (instr >> 8) & 0xf; 8813 unsigned rn = (instr >> 16) & 0xf; 8814 uint32_t imm = ImmediateT32::Decode( 8815 (instr & 0xff) | ((instr >> 4) & 0x700) | 8816 ((instr >> 15) & 0x800)); 8817 if (OutsideITBlock() && 8818 (instr & 0x00100000) == 0x00100000 && 8819 (((rd < kNumberOfT32LowRegisters) && 8820 (rn < kNumberOfT32LowRegisters) && 8821 (imm <= 7)) || 8822 ((rd == rn) && 8823 (rd < kNumberOfT32LowRegisters) && 8824 (imm <= 255)))) { 8825 // ADDS.W {<Rd>}, <Rn>, #<const> ; T3 8826 adds(Condition::None(), 8827 Wide, 8828 Register(rd), 8829 Register(rn), 8830 imm); 8831 } else { 8832 VIXL_ASSERT((instr & 0x00100000) == 0x00100000); 8833 // ADDS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T3 8834 adds(CurrentCond(), 8835 Best, 8836 Register(rd), 8837 Register(rn), 8838 imm); 8839 } 8840 break; 8841 } 8842 } 8843 break; 8844 } 8845 } 8846 break; 8847 } 8848 case 0x01400000: { 8849 // 0xf1400000 8850 unsigned rd = (instr >> 8) & 0xf; 8851 unsigned rn = (instr >> 16) & 0xf; 8852 uint32_t imm = ImmediateT32::Decode( 8853 (instr & 0xff) | ((instr >> 4) & 0x700) | 8854 ((instr >> 15) & 0x800)); 8855 // ADC{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1 8856 adc(CurrentCond(), Best, Register(rd), Register(rn), imm); 8857 break; 8858 } 8859 case 0x01500000: { 8860 // 0xf1500000 8861 unsigned rd = (instr >> 8) & 0xf; 8862 unsigned rn = (instr >> 16) & 0xf; 8863 uint32_t imm = ImmediateT32::Decode( 8864 (instr & 0xff) | ((instr >> 4) & 0x700) | 8865 ((instr >> 15) & 0x800)); 8866 // ADCS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1 8867 adcs(CurrentCond(), 8868 Best, 8869 Register(rd), 8870 Register(rn), 8871 imm); 8872 break; 8873 } 8874 case 0x01600000: { 8875 // 0xf1600000 8876 unsigned rd = (instr >> 8) & 0xf; 8877 unsigned rn = (instr >> 16) & 0xf; 8878 uint32_t imm = ImmediateT32::Decode( 8879 (instr & 0xff) | ((instr >> 4) & 0x700) | 8880 ((instr >> 15) & 0x800)); 8881 // SBC{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1 8882 sbc(CurrentCond(), Best, Register(rd), Register(rn), imm); 8883 break; 8884 } 8885 case 0x01700000: { 8886 // 0xf1700000 8887 unsigned rd = (instr >> 8) & 0xf; 8888 unsigned rn = (instr >> 16) & 0xf; 8889 uint32_t imm = ImmediateT32::Decode( 8890 (instr & 0xff) | ((instr >> 4) & 0x700) | 8891 ((instr >> 15) & 0x800)); 8892 // SBCS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1 8893 sbcs(CurrentCond(), 8894 Best, 8895 Register(rd), 8896 Register(rn), 8897 imm); 8898 break; 8899 } 8900 case 0x01a00000: { 8901 // 0xf1a00000 8902 switch (instr & 0x000f0000) { 8903 case 0x000d0000: { 8904 // 0xf1ad0000 8905 unsigned rd = (instr >> 8) & 0xf; 8906 uint32_t imm = ImmediateT32::Decode( 8907 (instr & 0xff) | ((instr >> 4) & 0x700) | 8908 ((instr >> 15) & 0x800)); 8909 if ((instr & 0x00100000) == 0x00000000 && 8910 ((rd == sp.GetCode()) && 8911 ((imm <= 508) && ((imm & 3) == 0)))) { 8912 // SUB{<c>}.W {<Rd>}, SP, #<const> ; T2 8913 sub(CurrentCond(), Wide, Register(rd), sp, imm); 8914 } else { 8915 VIXL_ASSERT((instr & 0x00100000) == 0x00000000); 8916 // SUB{<c>}{<q>} {<Rd>}, SP, #<const> ; T2 8917 sub(CurrentCond(), Best, Register(rd), sp, imm); 8918 } 8919 break; 8920 } 8921 default: { 8922 if (((instr & 0xf0000) == 0xd0000)) { 8923 UnallocatedT32(instr); 8924 return; 8925 } 8926 unsigned rd = (instr >> 8) & 0xf; 8927 unsigned rn = (instr >> 16) & 0xf; 8928 uint32_t imm = ImmediateT32::Decode( 8929 (instr & 0xff) | ((instr >> 4) & 0x700) | 8930 ((instr >> 15) & 0x800)); 8931 if (InITBlock() && 8932 (instr & 0x00100000) == 0x00000000 && 8933 (((rd < kNumberOfT32LowRegisters) && 8934 (rn < kNumberOfT32LowRegisters) && 8935 (imm <= 7)) || 8936 ((rd == rn) && (rd < kNumberOfT32LowRegisters) && 8937 (imm <= 255)))) { 8938 // SUB<c>.W {<Rd>}, <Rn>, #<const> ; T3 8939 sub(CurrentCond(), 8940 Wide, 8941 Register(rd), 8942 Register(rn), 8943 imm); 8944 } else { 8945 VIXL_ASSERT((instr & 0x00100000) == 0x00000000); 8946 // SUB{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T3 8947 sub(CurrentCond(), 8948 Best, 8949 Register(rd), 8950 Register(rn), 8951 imm); 8952 } 8953 break; 8954 } 8955 } 8956 break; 8957 } 8958 case 0x01b00000: { 8959 // 0xf1b00000 8960 switch (instr & 0x00000f00) { 8961 case 0x00000f00: { 8962 // 0xf1b00f00 8963 unsigned rn = (instr >> 16) & 0xf; 8964 uint32_t imm = ImmediateT32::Decode( 8965 (instr & 0xff) | ((instr >> 4) & 0x700) | 8966 ((instr >> 15) & 0x800)); 8967 if ((rn < kNumberOfT32LowRegisters) && (imm <= 255)) { 8968 // CMP{<c>}.W <Rn>, #<const> ; T2 8969 cmp(CurrentCond(), Wide, Register(rn), imm); 8970 } else { 8971 // CMP{<c>}{<q>} <Rn>, #<const> ; T2 8972 cmp(CurrentCond(), Best, Register(rn), imm); 8973 } 8974 break; 8975 } 8976 default: { 8977 switch (instr & 0x000f0000) { 8978 case 0x000d0000: { 8979 // 0xf1bd0000 8980 if (((instr & 0xf00) == 0xf00)) { 8981 UnallocatedT32(instr); 8982 return; 8983 } 8984 unsigned rd = (instr >> 8) & 0xf; 8985 uint32_t imm = ImmediateT32::Decode( 8986 (instr & 0xff) | ((instr >> 4) & 0x700) | 8987 ((instr >> 15) & 0x800)); 8988 // SUBS{<c>}{<q>} {<Rd>}, SP, #<const> ; T2 8989 subs(CurrentCond(), Best, Register(rd), sp, imm); 8990 break; 8991 } 8992 default: { 8993 if (((instr & 0xf0000) == 0xd0000) || 8994 ((instr & 0xf00) == 0xf00)) { 8995 UnallocatedT32(instr); 8996 return; 8997 } 8998 unsigned rd = (instr >> 8) & 0xf; 8999 unsigned rn = (instr >> 16) & 0xf; 9000 uint32_t imm = ImmediateT32::Decode( 9001 (instr & 0xff) | ((instr >> 4) & 0x700) | 9002 ((instr >> 15) & 0x800)); 9003 if (OutsideITBlock() && 9004 (instr & 0x00100000) == 0x00100000 && 9005 (((rd < kNumberOfT32LowRegisters) && 9006 (rn < kNumberOfT32LowRegisters) && 9007 (imm <= 7)) || 9008 ((rd == rn) && 9009 (rd < kNumberOfT32LowRegisters) && 9010 (imm <= 255)))) { 9011 // SUBS.W {<Rd>}, <Rn>, #<const> ; T3 9012 subs(Condition::None(), 9013 Wide, 9014 Register(rd), 9015 Register(rn), 9016 imm); 9017 } else { 9018 VIXL_ASSERT((instr & 0x00100000) == 0x00100000); 9019 // SUBS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T3 9020 subs(CurrentCond(), 9021 Best, 9022 Register(rd), 9023 Register(rn), 9024 imm); 9025 } 9026 break; 9027 } 9028 } 9029 break; 9030 } 9031 } 9032 break; 9033 } 9034 case 0x01c00000: { 9035 // 0xf1c00000 9036 unsigned rd = (instr >> 8) & 0xf; 9037 unsigned rn = (instr >> 16) & 0xf; 9038 uint32_t imm = ImmediateT32::Decode( 9039 (instr & 0xff) | ((instr >> 4) & 0x700) | 9040 ((instr >> 15) & 0x800)); 9041 if (InITBlock() && (instr & 0x00100000) == 0x00000000 && 9042 (imm == 0) && 9043 ((rd < kNumberOfT32LowRegisters) && 9044 (rn < kNumberOfT32LowRegisters) && (imm == 0))) { 9045 // RSB<c>.W {<Rd>}, <Rn>, #0 ; T2 9046 rsb(CurrentCond(), 9047 Wide, 9048 Register(rd), 9049 Register(rn), 9050 UINT32_C(0)); 9051 } else { 9052 VIXL_ASSERT((instr & 0x00100000) == 0x00000000); 9053 // RSB{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T2 9054 rsb(CurrentCond(), 9055 Best, 9056 Register(rd), 9057 Register(rn), 9058 imm); 9059 } 9060 break; 9061 } 9062 case 0x01d00000: { 9063 // 0xf1d00000 9064 unsigned rd = (instr >> 8) & 0xf; 9065 unsigned rn = (instr >> 16) & 0xf; 9066 uint32_t imm = ImmediateT32::Decode( 9067 (instr & 0xff) | ((instr >> 4) & 0x700) | 9068 ((instr >> 15) & 0x800)); 9069 if (OutsideITBlock() && 9070 (instr & 0x00100000) == 0x00100000 && (imm == 0) && 9071 ((rd < kNumberOfT32LowRegisters) && 9072 (rn < kNumberOfT32LowRegisters) && (imm == 0))) { 9073 // RSBS.W {<Rd>}, <Rn>, #0 ; T2 9074 rsbs(Condition::None(), 9075 Wide, 9076 Register(rd), 9077 Register(rn), 9078 UINT32_C(0)); 9079 } else { 9080 VIXL_ASSERT((instr & 0x00100000) == 0x00100000); 9081 // RSBS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T2 9082 rsbs(CurrentCond(), 9083 Best, 9084 Register(rd), 9085 Register(rn), 9086 imm); 9087 } 9088 break; 9089 } 9090 case 0x02000000: { 9091 // 0xf2000000 9092 switch (instr & 0x000d0000) { 9093 case 0x000d0000: { 9094 // 0xf20d0000 9095 switch (instr & 0x00020000) { 9096 case 0x00000000: { 9097 // 0xf20d0000 9098 unsigned rd = (instr >> 8) & 0xf; 9099 uint32_t imm = (instr & 0xff) | 9100 ((instr >> 4) & 0x700) | 9101 ((instr >> 15) & 0x800); 9102 if (((rd >= kNumberOfT32LowRegisters) || 9103 ((imm > 1020) || ((imm & 3) != 0))) && 9104 ((rd != sp.GetCode()) || 9105 ((imm > 508) || ((imm & 3) != 0))) && 9106 (!ImmediateT32::IsImmediateT32(imm))) { 9107 // ADD{<c>}{<q>} {<Rd>}, SP, #<imm12> ; T4 9108 add(CurrentCond(), Best, Register(rd), sp, imm); 9109 } else { 9110 // ADDW{<c>}{<q>} {<Rd>}, SP, #<imm12> ; T4 9111 addw(CurrentCond(), Register(rd), sp, imm); 9112 } 9113 break; 9114 } 9115 case 0x00020000: { 9116 // 0xf20f0000 9117 unsigned rd = (instr >> 8) & 0xf; 9118 int32_t imm = (instr & 0xff) | 9119 ((instr >> 4) & 0x700) | 9120 ((instr >> 15) & 0x800); 9121 Label label(imm, kT32PcDelta); 9122 if ((imm >= 0) && (imm <= 4095) && 9123 ((rd < kNumberOfT32LowRegisters) && 9124 (imm >= 0) && (imm <= 1020) && 9125 ((imm & 3) == 0))) { 9126 // ADR{<c>}.W <Rd>, <label> ; T3 9127 adr(CurrentCond(), Wide, Register(rd), &label); 9128 } else { 9129 // ADR{<c>}{<q>} <Rd>, <label> ; T3 9130 adr(CurrentCond(), Best, Register(rd), &label); 9131 } 9132 break; 9133 } 9134 } 9135 break; 9136 } 9137 default: { 9138 if (((instr & 0xd0000) == 0xd0000)) { 9139 UnallocatedT32(instr); 9140 return; 9141 } 9142 unsigned rd = (instr >> 8) & 0xf; 9143 unsigned rn = (instr >> 16) & 0xf; 9144 uint32_t imm = (instr & 0xff) | 9145 ((instr >> 4) & 0x700) | 9146 ((instr >> 15) & 0x800); 9147 if ((InITBlock() || 9148 (rd >= kNumberOfT32LowRegisters) || 9149 (rn >= kNumberOfT32LowRegisters) || (imm > 7)) && 9150 (InITBlock() || (rd != rn) || 9151 (rd >= kNumberOfT32LowRegisters) || 9152 (imm > 255)) && 9153 (!ImmediateT32::IsImmediateT32(imm))) { 9154 // ADD{<c>}{<q>} {<Rd>}, <Rn>, #<imm12> ; T4 9155 add(CurrentCond(), 9156 Best, 9157 Register(rd), 9158 Register(rn), 9159 imm); 9160 } else { 9161 // ADDW{<c>}{<q>} {<Rd>}, <Rn>, #<imm12> ; T4 9162 addw(CurrentCond(), 9163 Register(rd), 9164 Register(rn), 9165 imm); 9166 } 9167 break; 9168 } 9169 } 9170 break; 9171 } 9172 case 0x02400000: { 9173 // 0xf2400000 9174 unsigned rd = (instr >> 8) & 0xf; 9175 uint32_t imm = (instr & 0xff) | ((instr >> 4) & 0x700) | 9176 ((instr >> 15) & 0x800) | 9177 ((instr >> 4) & 0xf000); 9178 if ((InITBlock() || (rd >= kNumberOfT32LowRegisters) || 9179 (imm > 255)) && 9180 (!ImmediateT32::IsImmediateT32(imm))) { 9181 // MOV{<c>}{<q>} <Rd>, #<imm16> ; T3 9182 mov(CurrentCond(), Best, Register(rd), imm); 9183 } else { 9184 // MOVW{<c>}{<q>} <Rd>, #<imm16> ; T3 9185 movw(CurrentCond(), Register(rd), imm); 9186 } 9187 break; 9188 } 9189 case 0x02a00000: { 9190 // 0xf2a00000 9191 switch (instr & 0x000d0000) { 9192 case 0x000d0000: { 9193 // 0xf2ad0000 9194 switch (instr & 0x00020000) { 9195 case 0x00000000: { 9196 // 0xf2ad0000 9197 unsigned rd = (instr >> 8) & 0xf; 9198 uint32_t imm = (instr & 0xff) | 9199 ((instr >> 4) & 0x700) | 9200 ((instr >> 15) & 0x800); 9201 if (((rd != sp.GetCode()) || 9202 ((imm > 508) || ((imm & 3) != 0))) && 9203 (!ImmediateT32::IsImmediateT32(imm))) { 9204 // SUB{<c>}{<q>} {<Rd>}, SP, #<imm12> ; T3 9205 sub(CurrentCond(), Best, Register(rd), sp, imm); 9206 } else { 9207 // SUBW{<c>}{<q>} {<Rd>}, SP, #<imm12> ; T3 9208 subw(CurrentCond(), Register(rd), sp, imm); 9209 } 9210 break; 9211 } 9212 case 0x00020000: { 9213 // 0xf2af0000 9214 if (((((Uint32((instr >> 26)) & Uint32(0x1)) 9215 << 11) | 9216 ((Uint32((instr >> 12)) & Uint32(0x7)) 9217 << 8) | 9218 (Uint32(instr) & Uint32(0xff))) == 9219 Uint32(0x0))) { 9220 unsigned rd = (instr >> 8) & 0xf; 9221 uint32_t imm = (instr & 0xff) | 9222 ((instr >> 4) & 0x700) | 9223 ((instr >> 15) & 0x800); 9224 // SUB{<c>}{<q>} <Rd>, PC, #<imm12> ; T2 9225 sub(CurrentCond(), Best, Register(rd), pc, imm); 9226 return; 9227 } 9228 unsigned rd = (instr >> 8) & 0xf; 9229 int32_t imm = (instr & 0xff) | 9230 ((instr >> 4) & 0x700) | 9231 ((instr >> 15) & 0x800); 9232 Label label(-imm, kT32PcDelta); 9233 // ADR{<c>}{<q>} <Rd>, <label> ; T2 9234 adr(CurrentCond(), Best, Register(rd), &label); 9235 break; 9236 } 9237 } 9238 break; 9239 } 9240 default: { 9241 if (((instr & 0xd0000) == 0xd0000)) { 9242 UnallocatedT32(instr); 9243 return; 9244 } 9245 unsigned rd = (instr >> 8) & 0xf; 9246 unsigned rn = (instr >> 16) & 0xf; 9247 uint32_t imm = (instr & 0xff) | 9248 ((instr >> 4) & 0x700) | 9249 ((instr >> 15) & 0x800); 9250 if ((InITBlock() || 9251 (rd >= kNumberOfT32LowRegisters) || 9252 (rn >= kNumberOfT32LowRegisters) || (imm > 7)) && 9253 (InITBlock() || (rd != rn) || 9254 (rd >= kNumberOfT32LowRegisters) || 9255 (imm > 255)) && 9256 (!ImmediateT32::IsImmediateT32(imm))) { 9257 // SUB{<c>}{<q>} {<Rd>}, <Rn>, #<imm12> ; T4 9258 sub(CurrentCond(), 9259 Best, 9260 Register(rd), 9261 Register(rn), 9262 imm); 9263 } else { 9264 // SUBW{<c>}{<q>} {<Rd>}, <Rn>, #<imm12> ; T4 9265 subw(CurrentCond(), 9266 Register(rd), 9267 Register(rn), 9268 imm); 9269 } 9270 break; 9271 } 9272 } 9273 break; 9274 } 9275 case 0x02c00000: { 9276 // 0xf2c00000 9277 unsigned rd = (instr >> 8) & 0xf; 9278 uint32_t imm = (instr & 0xff) | ((instr >> 4) & 0x700) | 9279 ((instr >> 15) & 0x800) | 9280 ((instr >> 4) & 0xf000); 9281 // MOVT{<c>}{<q>} <Rd>, #<imm16> ; T1 9282 movt(CurrentCond(), Register(rd), imm); 9283 break; 9284 } 9285 case 0x03000000: { 9286 // 0xf3000000 9287 unsigned rd = (instr >> 8) & 0xf; 9288 uint32_t imm = (instr & 0x1f) + 1; 9289 unsigned rn = (instr >> 16) & 0xf; 9290 uint32_t amount = 9291 ((instr >> 6) & 0x3) | ((instr >> 10) & 0x1c); 9292 // SSAT{<c>}{<q>} <Rd>, #<imm>, <Rn> {, LSL #<amount> } ; T1 NOLINT(whitespace/line_length) 9293 ssat(CurrentCond(), 9294 Register(rd), 9295 imm, 9296 Operand(Register(rn), LSL, amount)); 9297 if (((instr & 0xfff08020) != 0xf3000000)) { 9298 UnpredictableT32(instr); 9299 } 9300 break; 9301 } 9302 case 0x03200000: { 9303 // 0xf3200000 9304 switch (instr & 0x000070c0) { 9305 case 0x00000000: { 9306 // 0xf3200000 9307 unsigned rd = (instr >> 8) & 0xf; 9308 uint32_t imm = (instr & 0xf) + 1; 9309 unsigned rn = (instr >> 16) & 0xf; 9310 // SSAT16{<c>}{<q>} <Rd>, #<imm>, <Rn> ; T1 9311 ssat16(CurrentCond(), 9312 Register(rd), 9313 imm, 9314 Register(rn)); 9315 if (((instr & 0xfff0f0f0) != 0xf3200000)) { 9316 UnpredictableT32(instr); 9317 } 9318 break; 9319 } 9320 default: { 9321 if (((instr & 0x70c0) == 0x0)) { 9322 UnallocatedT32(instr); 9323 return; 9324 } 9325 unsigned rd = (instr >> 8) & 0xf; 9326 uint32_t imm = (instr & 0x1f) + 1; 9327 unsigned rn = (instr >> 16) & 0xf; 9328 uint32_t amount = 9329 ((instr >> 6) & 0x3) | ((instr >> 10) & 0x1c); 9330 // SSAT{<c>}{<q>} <Rd>, #<imm>, <Rn>, ASR #<amount> ; T1 NOLINT(whitespace/line_length) 9331 ssat(CurrentCond(), 9332 Register(rd), 9333 imm, 9334 Operand(Register(rn), ASR, amount)); 9335 if (((instr & 0xfff08020) != 0xf3200000)) { 9336 UnpredictableT32(instr); 9337 } 9338 break; 9339 } 9340 } 9341 break; 9342 } 9343 case 0x03400000: { 9344 // 0xf3400000 9345 unsigned rd = (instr >> 8) & 0xf; 9346 unsigned rn = (instr >> 16) & 0xf; 9347 uint32_t lsb = 9348 ((instr >> 6) & 0x3) | ((instr >> 10) & 0x1c); 9349 uint32_t widthm1 = instr & 0x1f; 9350 uint32_t width = widthm1 + 1; 9351 // SBFX{<c>}{<q>} <Rd>, <Rn>, #<lsb>, #<width> ; T1 9352 sbfx(CurrentCond(), 9353 Register(rd), 9354 Register(rn), 9355 lsb, 9356 width); 9357 if (((instr & 0xfff08020) != 0xf3400000)) { 9358 UnpredictableT32(instr); 9359 } 9360 break; 9361 } 9362 case 0x03600000: { 9363 // 0xf3600000 9364 switch (instr & 0x000f0000) { 9365 case 0x000f0000: { 9366 // 0xf36f0000 9367 unsigned rd = (instr >> 8) & 0xf; 9368 uint32_t lsb = 9369 ((instr >> 6) & 0x3) | ((instr >> 10) & 0x1c); 9370 uint32_t msb = instr & 0x1f; 9371 uint32_t width = msb - lsb + 1; 9372 // BFC{<c>}{<q>} <Rd>, #<lsb>, #<width> ; T1 9373 bfc(CurrentCond(), Register(rd), lsb, width); 9374 if (((instr & 0xffff8020) != 0xf36f0000)) { 9375 UnpredictableT32(instr); 9376 } 9377 break; 9378 } 9379 default: { 9380 if (((instr & 0xf0000) == 0xf0000)) { 9381 UnallocatedT32(instr); 9382 return; 9383 } 9384 unsigned rd = (instr >> 8) & 0xf; 9385 unsigned rn = (instr >> 16) & 0xf; 9386 uint32_t lsb = 9387 ((instr >> 6) & 0x3) | ((instr >> 10) & 0x1c); 9388 uint32_t msb = instr & 0x1f; 9389 uint32_t width = msb - lsb + 1; 9390 // BFI{<c>}{<q>} <Rd>, <Rn>, #<lsb>, #<width> ; T1 9391 bfi(CurrentCond(), 9392 Register(rd), 9393 Register(rn), 9394 lsb, 9395 width); 9396 if (((instr & 0xfff08020) != 0xf3600000)) { 9397 UnpredictableT32(instr); 9398 } 9399 break; 9400 } 9401 } 9402 break; 9403 } 9404 case 0x03800000: { 9405 // 0xf3800000 9406 unsigned rd = (instr >> 8) & 0xf; 9407 uint32_t imm = instr & 0x1f; 9408 unsigned rn = (instr >> 16) & 0xf; 9409 uint32_t amount = 9410 ((instr >> 6) & 0x3) | ((instr >> 10) & 0x1c); 9411 // USAT{<c>}{<q>} <Rd>, #<imm>, <Rn> {, LSL #<amount> } ; T1 NOLINT(whitespace/line_length) 9412 usat(CurrentCond(), 9413 Register(rd), 9414 imm, 9415 Operand(Register(rn), LSL, amount)); 9416 if (((instr & 0xfff08020) != 0xf3800000)) { 9417 UnpredictableT32(instr); 9418 } 9419 break; 9420 } 9421 case 0x03a00000: { 9422 // 0xf3a00000 9423 switch (instr & 0x000070c0) { 9424 case 0x00000000: { 9425 // 0xf3a00000 9426 unsigned rd = (instr >> 8) & 0xf; 9427 uint32_t imm = instr & 0xf; 9428 unsigned rn = (instr >> 16) & 0xf; 9429 // USAT16{<c>}{<q>} <Rd>, #<imm>, <Rn> ; T1 9430 usat16(CurrentCond(), 9431 Register(rd), 9432 imm, 9433 Register(rn)); 9434 if (((instr & 0xfff0f0f0) != 0xf3a00000)) { 9435 UnpredictableT32(instr); 9436 } 9437 break; 9438 } 9439 default: { 9440 if (((instr & 0x70c0) == 0x0)) { 9441 UnallocatedT32(instr); 9442 return; 9443 } 9444 unsigned rd = (instr >> 8) & 0xf; 9445 uint32_t imm = instr & 0x1f; 9446 unsigned rn = (instr >> 16) & 0xf; 9447 uint32_t amount = 9448 ((instr >> 6) & 0x3) | ((instr >> 10) & 0x1c); 9449 // USAT{<c>}{<q>} <Rd>, #<imm>, <Rn>, ASR #<amount> ; T1 NOLINT(whitespace/line_length) 9450 usat(CurrentCond(), 9451 Register(rd), 9452 imm, 9453 Operand(Register(rn), ASR, amount)); 9454 if (((instr & 0xfff08020) != 0xf3a00000)) { 9455 UnpredictableT32(instr); 9456 } 9457 break; 9458 } 9459 } 9460 break; 9461 } 9462 case 0x03c00000: { 9463 // 0xf3c00000 9464 unsigned rd = (instr >> 8) & 0xf; 9465 unsigned rn = (instr >> 16) & 0xf; 9466 uint32_t lsb = 9467 ((instr >> 6) & 0x3) | ((instr >> 10) & 0x1c); 9468 uint32_t widthm1 = instr & 0x1f; 9469 uint32_t width = widthm1 + 1; 9470 // UBFX{<c>}{<q>} <Rd>, <Rn>, #<lsb>, #<width> ; T1 9471 ubfx(CurrentCond(), 9472 Register(rd), 9473 Register(rn), 9474 lsb, 9475 width); 9476 if (((instr & 0xfff08020) != 0xf3c00000)) { 9477 UnpredictableT32(instr); 9478 } 9479 break; 9480 } 9481 default: 9482 UnallocatedT32(instr); 9483 break; 9484 } 9485 break; 9486 } 9487 case 0x00008000: { 9488 // 0xf0008000 9489 switch (instr & 0x00005000) { 9490 case 0x00000000: { 9491 // 0xf0008000 9492 switch (instr & 0x03800000) { 9493 case 0x03800000: { 9494 // 0xf3808000 9495 switch (instr & 0x04600000) { 9496 case 0x00000000: { 9497 // 0xf3808000 9498 switch (instr & 0x00000020) { 9499 case 0x00000000: { 9500 // 0xf3808000 9501 unsigned spec_reg = ((instr >> 8) & 0xf) | 9502 ((instr >> 16) & 0x10); 9503 unsigned rn = (instr >> 16) & 0xf; 9504 // MSR{<c>}{<q>} <spec_reg>, <Rn> ; T1 9505 msr(CurrentCond(), 9506 MaskedSpecialRegister(spec_reg), 9507 Register(rn)); 9508 if (((instr & 0xffe0f0ff) != 0xf3808000)) { 9509 UnpredictableT32(instr); 9510 } 9511 break; 9512 } 9513 case 0x00000020: { 9514 // 0xf3808020 9515 UnimplementedT32_32("MSR", instr); 9516 break; 9517 } 9518 } 9519 break; 9520 } 9521 case 0x00200000: { 9522 // 0xf3a08000 9523 switch (instr & 0x00100000) { 9524 case 0x00000000: { 9525 // 0xf3a08000 9526 switch (instr & 0x00000700) { 9527 case 0x00000000: { 9528 // 0xf3a08000 9529 switch (instr & 0x000000f0) { 9530 case 0x00000000: { 9531 // 0xf3a08000 9532 switch (instr & 0x0000000f) { 9533 case 0x00000000: { 9534 // 0xf3a08000 9535 // NOP{<c>}.W ; T2 9536 nop(CurrentCond(), Wide); 9537 if (((instr & 0xffffffff) != 9538 0xf3af8000)) { 9539 UnpredictableT32(instr); 9540 } 9541 break; 9542 } 9543 case 0x00000001: { 9544 // 0xf3a08001 9545 // YIELD{<c>}.W ; T2 9546 yield(CurrentCond(), Wide); 9547 if (((instr & 0xffffffff) != 9548 0xf3af8001)) { 9549 UnpredictableT32(instr); 9550 } 9551 break; 9552 } 9553 case 0x00000002: { 9554 // 0xf3a08002 9555 UnimplementedT32_32("WFE", instr); 9556 break; 9557 } 9558 case 0x00000003: { 9559 // 0xf3a08003 9560 UnimplementedT32_32("WFI", instr); 9561 break; 9562 } 9563 case 0x00000004: { 9564 // 0xf3a08004 9565 UnimplementedT32_32("SEV", instr); 9566 break; 9567 } 9568 case 0x00000005: { 9569 // 0xf3a08005 9570 UnimplementedT32_32("SEVL", 9571 instr); 9572 break; 9573 } 9574 default: 9575 UnallocatedT32(instr); 9576 break; 9577 } 9578 break; 9579 } 9580 case 0x000000f0: { 9581 // 0xf3a080f0 9582 UnimplementedT32_32("DBG", instr); 9583 break; 9584 } 9585 default: 9586 UnallocatedT32(instr); 9587 break; 9588 } 9589 break; 9590 } 9591 case 0x00000100: { 9592 // 0xf3a08100 9593 if ((instr & 0x000000e0) == 0x00000000) { 9594 UnimplementedT32_32("CPS", instr); 9595 } else { 9596 UnallocatedT32(instr); 9597 } 9598 break; 9599 } 9600 case 0x00000400: { 9601 // 0xf3a08400 9602 if ((instr & 0x0000001f) == 0x00000000) { 9603 UnimplementedT32_32("CPSIE", instr); 9604 } else { 9605 UnallocatedT32(instr); 9606 } 9607 break; 9608 } 9609 case 0x00000500: { 9610 // 0xf3a08500 9611 UnimplementedT32_32("CPSIE", instr); 9612 break; 9613 } 9614 case 0x00000600: { 9615 // 0xf3a08600 9616 if ((instr & 0x0000001f) == 0x00000000) { 9617 UnimplementedT32_32("CPSID", instr); 9618 } else { 9619 UnallocatedT32(instr); 9620 } 9621 break; 9622 } 9623 case 0x00000700: { 9624 // 0xf3a08700 9625 UnimplementedT32_32("CPSID", instr); 9626 break; 9627 } 9628 default: 9629 UnallocatedT32(instr); 9630 break; 9631 } 9632 break; 9633 } 9634 case 0x00100000: { 9635 // 0xf3b08000 9636 switch (instr & 0x000000f0) { 9637 case 0x00000020: { 9638 // 0xf3b08020 9639 // CLREX{<c>}{<q>} ; T1 9640 clrex(CurrentCond()); 9641 if (((instr & 0xffffffff) != 9642 0xf3bf8f2f)) { 9643 UnpredictableT32(instr); 9644 } 9645 break; 9646 } 9647 case 0x00000040: { 9648 // 0xf3b08040 9649 MemoryBarrier option(instr & 0xf); 9650 // DSB{<c>}{<q>} {<option>} ; T1 9651 dsb(CurrentCond(), option); 9652 if (((instr & 0xfffffff0) != 9653 0xf3bf8f40)) { 9654 UnpredictableT32(instr); 9655 } 9656 break; 9657 } 9658 case 0x00000050: { 9659 // 0xf3b08050 9660 MemoryBarrier option(instr & 0xf); 9661 // DMB{<c>}{<q>} {<option>} ; T1 9662 dmb(CurrentCond(), option); 9663 if (((instr & 0xfffffff0) != 9664 0xf3bf8f50)) { 9665 UnpredictableT32(instr); 9666 } 9667 break; 9668 } 9669 case 0x00000060: { 9670 // 0xf3b08060 9671 MemoryBarrier option(instr & 0xf); 9672 // ISB{<c>}{<q>} {<option>} ; T1 9673 isb(CurrentCond(), option); 9674 if (((instr & 0xfffffff0) != 9675 0xf3bf8f60)) { 9676 UnpredictableT32(instr); 9677 } 9678 break; 9679 } 9680 default: 9681 UnallocatedT32(instr); 9682 break; 9683 } 9684 break; 9685 } 9686 } 9687 break; 9688 } 9689 case 0x00400000: { 9690 // 0xf3c08000 9691 switch (instr & 0x00100000) { 9692 case 0x00000000: { 9693 // 0xf3c08000 9694 unsigned rm = (instr >> 16) & 0xf; 9695 // BXJ{<c>}{<q>} <Rm> ; T1 9696 bxj(CurrentCond(), Register(rm)); 9697 if (((instr & 0xfff0ffff) != 0xf3c08f00)) { 9698 UnpredictableT32(instr); 9699 } 9700 break; 9701 } 9702 case 0x00100000: { 9703 // 0xf3d08000 9704 switch (instr & 0x000000ff) { 9705 case 0x00000000: { 9706 // 0xf3d08000 9707 if ((instr & 0x000f0000) == 0x000e0000) { 9708 UnimplementedT32_32("ERET", instr); 9709 } else { 9710 UnallocatedT32(instr); 9711 } 9712 break; 9713 } 9714 default: { 9715 if (((instr & 0xff) == 0x0)) { 9716 UnallocatedT32(instr); 9717 return; 9718 } 9719 uint32_t imm = instr & 0xff; 9720 // SUBS{<c>}{<q>} PC, LR, #<imm8> ; T5 9721 subs(CurrentCond(), Best, pc, lr, imm); 9722 if (((instr & 0xffffff00) != 9723 0xf3de8f00)) { 9724 UnpredictableT32(instr); 9725 } 9726 break; 9727 } 9728 } 9729 break; 9730 } 9731 } 9732 break; 9733 } 9734 case 0x00600000: { 9735 // 0xf3e08000 9736 switch (instr & 0x00000020) { 9737 case 0x00000000: { 9738 // 0xf3e08000 9739 unsigned rd = (instr >> 8) & 0xf; 9740 unsigned spec_reg = (instr >> 20) & 0x1; 9741 // MRS{<c>}{<q>} <Rd>, <spec_reg> ; T1 9742 mrs(CurrentCond(), 9743 Register(rd), 9744 SpecialRegister(spec_reg)); 9745 if (((instr & 0xffeff0ff) != 0xf3ef8000)) { 9746 UnpredictableT32(instr); 9747 } 9748 break; 9749 } 9750 case 0x00000020: { 9751 // 0xf3e08020 9752 UnimplementedT32_32("MRS", instr); 9753 break; 9754 } 9755 } 9756 break; 9757 } 9758 case 0x04000000: { 9759 // 0xf7808000 9760 switch (instr & 0x001f2fff) { 9761 case 0x000f0001: { 9762 // 0xf78f8001 9763 UnimplementedT32_32("DCPS1", instr); 9764 break; 9765 } 9766 case 0x000f0002: { 9767 // 0xf78f8002 9768 UnimplementedT32_32("DCPS2", instr); 9769 break; 9770 } 9771 case 0x000f0003: { 9772 // 0xf78f8003 9773 UnimplementedT32_32("DCPS3", instr); 9774 break; 9775 } 9776 default: 9777 UnallocatedT32(instr); 9778 break; 9779 } 9780 break; 9781 } 9782 case 0x04600000: { 9783 // 0xf7e08000 9784 switch (instr & 0x00102000) { 9785 case 0x00000000: { 9786 // 0xf7e08000 9787 uint32_t imm = 9788 (instr & 0xfff) | ((instr >> 4) & 0xf000); 9789 // HVC{<q>} {#}<imm16> ; T1 9790 hvc(Condition::None(), imm); 9791 break; 9792 } 9793 case 0x00100000: { 9794 // 0xf7f08000 9795 UnimplementedT32_32("SMC", instr); 9796 break; 9797 } 9798 case 0x00102000: { 9799 // 0xf7f0a000 9800 uint32_t imm = 9801 (instr & 0xfff) | ((instr >> 4) & 0xf000); 9802 if ((imm <= 255)) { 9803 // UDF{<c>}.W {#}<imm> ; T2 9804 udf(CurrentCond(), Wide, imm); 9805 } else { 9806 // UDF{<c>}{<q>} {#}<imm> ; T2 9807 udf(CurrentCond(), Best, imm); 9808 } 9809 break; 9810 } 9811 default: 9812 UnallocatedT32(instr); 9813 break; 9814 } 9815 break; 9816 } 9817 default: 9818 UnallocatedT32(instr); 9819 break; 9820 } 9821 break; 9822 } 9823 default: { 9824 if (((instr & 0x3800000) == 0x3800000)) { 9825 UnallocatedT32(instr); 9826 return; 9827 } 9828 Condition condition((instr >> 22) & 0xf); 9829 int32_t imm = 9830 SignExtend<int32_t>((instr & 0x7ff) | 9831 ((instr >> 5) & 0x1f800) | 9832 ((instr << 4) & 0x20000) | 9833 ((instr << 7) & 0x40000) | 9834 ((instr >> 7) & 0x80000), 9835 20) 9836 << 1; 9837 Label label(imm, kT32PcDelta); 9838 if (OutsideITBlock() && (imm >= -1048576) && 9839 (imm <= 1048574) && ((imm & 1) == 0) && 9840 ((imm >= -256) && (imm <= 254) && 9841 ((imm & 1) == 0))) { 9842 // B<c>.W <label> ; T3 9843 b(condition, Wide, &label); 9844 } else { 9845 VIXL_ASSERT(OutsideITBlock() && (imm >= -1048576) && 9846 (imm <= 1048574) && ((imm & 1) == 0)); 9847 // B<c>{<q>} <label> ; T3 9848 b(condition, Best, &label); 9849 } 9850 break; 9851 } 9852 } 9853 break; 9854 } 9855 case 0x00001000: { 9856 // 0xf0009000 9857 uint32_t encoded_imm = 9858 (instr & 0x7ff) | ((instr >> 5) & 0x1ff800) | 9859 ((instr << 10) & 0x200000) | 9860 ((instr << 9) & 0x400000) | ((instr >> 3) & 0x800000); 9861 uint32_t S = encoded_imm & (1 << 23); 9862 encoded_imm ^= ((S >> 1) | (S >> 2)) ^ (3 << 21); 9863 int32_t imm = SignExtend<int32_t>(encoded_imm << 1, 25); 9864 Label label(imm, kT32PcDelta); 9865 if ((imm >= -16777216) && (imm <= 16777214) && 9866 ((imm & 1) == 0) && 9867 (OutsideITBlockOrLast() && (imm >= -2048) && 9868 (imm <= 2046) && ((imm & 1) == 0))) { 9869 // B{<c>}.W <label> ; T4 9870 b(CurrentCond(), Wide, &label); 9871 } else { 9872 VIXL_ASSERT(OutsideITBlockOrLast() && 9873 (imm >= -16777216) && (imm <= 16777214) && 9874 ((imm & 1) == 0)); 9875 // B{<c>}{<q>} <label> ; T4 9876 b(CurrentCond(), Best, &label); 9877 } 9878 break; 9879 } 9880 case 0x00004000: { 9881 // 0xf000c000 9882 if ((instr & 0x00000001) == 0x00000000) { 9883 uint32_t encoded_imm = ((instr >> 1) & 0x3ff) | 9884 ((instr >> 6) & 0xffc00) | 9885 ((instr << 9) & 0x100000) | 9886 ((instr << 8) & 0x200000) | 9887 ((instr >> 4) & 0x400000); 9888 uint32_t S = encoded_imm & (1 << 22); 9889 encoded_imm ^= ((S >> 1) | (S >> 2)) ^ (3 << 20); 9890 int32_t imm = SignExtend<int32_t>(encoded_imm << 2, 25); 9891 Label label(imm, kT32PcDelta); 9892 // BLX{<c>}{<q>} <label> ; T2 9893 blx(CurrentCond(), &label); 9894 } else { 9895 UnallocatedT32(instr); 9896 } 9897 break; 9898 } 9899 case 0x00005000: { 9900 // 0xf000d000 9901 uint32_t encoded_imm = 9902 (instr & 0x7ff) | ((instr >> 5) & 0x1ff800) | 9903 ((instr << 10) & 0x200000) | 9904 ((instr << 9) & 0x400000) | ((instr >> 3) & 0x800000); 9905 uint32_t S = encoded_imm & (1 << 23); 9906 encoded_imm ^= ((S >> 1) | (S >> 2)) ^ (3 << 21); 9907 int32_t imm = SignExtend<int32_t>(encoded_imm << 1, 25); 9908 Label label(imm, kT32PcDelta); 9909 // BL{<c>}{<q>} <label> ; T1 9910 bl(CurrentCond(), &label); 9911 break; 9912 } 9913 } 9914 break; 9915 } 9916 } 9917 break; 9918 } 9919 } 9920 break; 9921 } 9922 case 0x08000000: { 9923 // 0xe8000000 9924 switch (instr & 0x06000000) { 9925 case 0x00000000: { 9926 // 0xe8000000 9927 switch (instr & 0x10100000) { 9928 case 0x00000000: { 9929 // 0xe8000000 9930 switch (instr & 0x01400000) { 9931 case 0x00000000: { 9932 // 0xe8000000 9933 switch (instr & 0x00800000) { 9934 case 0x00000000: { 9935 // 0xe8000000 9936 UnimplementedT32_32("SRSDB", instr); 9937 break; 9938 } 9939 case 0x00800000: { 9940 // 0xe8800000 9941 unsigned rn = (instr >> 16) & 0xf; 9942 WriteBack write_back((instr >> 21) & 0x1); 9943 RegisterList registers( 9944 (((instr >> 14) & 0x1) << kLRRegNum) | 9945 (instr & 0x1fff)); 9946 if ((rn < kNumberOfT32LowRegisters) && 9947 write_back.DoesWriteBack() && 9948 ((registers.GetList() & ~0xff) == 0)) { 9949 // STM{<c>}.W <Rn>{!}, <registers> ; T2 9950 stm(CurrentCond(), 9951 Wide, 9952 Register(rn), 9953 write_back, 9954 registers); 9955 if (((instr & 0xffd0a000) != 0xe8800000)) { 9956 UnpredictableT32(instr); 9957 } 9958 } else { 9959 // STM{<c>}{<q>} <Rn>{!}, <registers> ; T2 9960 stm(CurrentCond(), 9961 Best, 9962 Register(rn), 9963 write_back, 9964 registers); 9965 if (((instr & 0xffd0a000) != 0xe8800000)) { 9966 UnpredictableT32(instr); 9967 } 9968 } 9969 break; 9970 } 9971 } 9972 break; 9973 } 9974 case 0x00400000: { 9975 // 0xe8400000 9976 switch (instr & 0x00200000) { 9977 case 0x00000000: { 9978 // 0xe8400000 9979 switch (instr & 0x00800000) { 9980 case 0x00000000: { 9981 // 0xe8400000 9982 unsigned rd = (instr >> 8) & 0xf; 9983 unsigned rt = (instr >> 12) & 0xf; 9984 unsigned rn = (instr >> 16) & 0xf; 9985 int32_t offset = (instr & 0xff) << 2; 9986 // STREX{<c>}{<q>} <Rd>, <Rt>, [<Rn>{, #<imm>}] ; T1 NOLINT(whitespace/line_length) 9987 strex(CurrentCond(), 9988 Register(rd), 9989 Register(rt), 9990 MemOperand(Register(rn), 9991 plus, 9992 offset, 9993 Offset)); 9994 break; 9995 } 9996 case 0x00800000: { 9997 // 0xe8c00000 9998 switch (instr & 0x000000f0) { 9999 case 0x00000040: { 10000 // 0xe8c00040 10001 unsigned rd = instr & 0xf; 10002 unsigned rt = (instr >> 12) & 0xf; 10003 unsigned rn = (instr >> 16) & 0xf; 10004 // STREXB{<c>}{<q>} <Rd>, <Rt>, [<Rn>] ; T1 10005 strexb(CurrentCond(), 10006 Register(rd), 10007 Register(rt), 10008 MemOperand(Register(rn), Offset)); 10009 if (((instr & 0xfff00ff0) != 0xe8c00f40)) { 10010 UnpredictableT32(instr); 10011 } 10012 break; 10013 } 10014 case 0x00000050: { 10015 // 0xe8c00050 10016 unsigned rd = instr & 0xf; 10017 unsigned rt = (instr >> 12) & 0xf; 10018 unsigned rn = (instr >> 16) & 0xf; 10019 // STREXH{<c>}{<q>} <Rd>, <Rt>, [<Rn>] ; T1 10020 strexh(CurrentCond(), 10021 Register(rd), 10022 Register(rt), 10023 MemOperand(Register(rn), Offset)); 10024 if (((instr & 0xfff00ff0) != 0xe8c00f50)) { 10025 UnpredictableT32(instr); 10026 } 10027 break; 10028 } 10029 case 0x00000070: { 10030 // 0xe8c00070 10031 unsigned rd = instr & 0xf; 10032 unsigned rt = (instr >> 12) & 0xf; 10033 unsigned rt2 = (instr >> 8) & 0xf; 10034 unsigned rn = (instr >> 16) & 0xf; 10035 // STREXD{<c>}{<q>} <Rd>, <Rt>, <Rt2>, [<Rn>] ; T1 NOLINT(whitespace/line_length) 10036 strexd(CurrentCond(), 10037 Register(rd), 10038 Register(rt), 10039 Register(rt2), 10040 MemOperand(Register(rn), Offset)); 10041 break; 10042 } 10043 case 0x00000080: { 10044 // 0xe8c00080 10045 unsigned rt = (instr >> 12) & 0xf; 10046 unsigned rn = (instr >> 16) & 0xf; 10047 // STLB{<c>}{<q>} <Rt>, [<Rn>] ; T1 10048 stlb(CurrentCond(), 10049 Register(rt), 10050 MemOperand(Register(rn), Offset)); 10051 if (((instr & 0xfff00fff) != 0xe8c00f8f)) { 10052 UnpredictableT32(instr); 10053 } 10054 break; 10055 } 10056 case 0x00000090: { 10057 // 0xe8c00090 10058 unsigned rt = (instr >> 12) & 0xf; 10059 unsigned rn = (instr >> 16) & 0xf; 10060 // STLH{<c>}{<q>} <Rt>, [<Rn>] ; T1 10061 stlh(CurrentCond(), 10062 Register(rt), 10063 MemOperand(Register(rn), Offset)); 10064 if (((instr & 0xfff00fff) != 0xe8c00f9f)) { 10065 UnpredictableT32(instr); 10066 } 10067 break; 10068 } 10069 case 0x000000a0: { 10070 // 0xe8c000a0 10071 unsigned rt = (instr >> 12) & 0xf; 10072 unsigned rn = (instr >> 16) & 0xf; 10073 // STL{<c>}{<q>} <Rt>, [<Rn>] ; T1 10074 stl(CurrentCond(), 10075 Register(rt), 10076 MemOperand(Register(rn), Offset)); 10077 if (((instr & 0xfff00fff) != 0xe8c00faf)) { 10078 UnpredictableT32(instr); 10079 } 10080 break; 10081 } 10082 case 0x000000c0: { 10083 // 0xe8c000c0 10084 unsigned rd = instr & 0xf; 10085 unsigned rt = (instr >> 12) & 0xf; 10086 unsigned rn = (instr >> 16) & 0xf; 10087 // STLEXB{<c>}{<q>} <Rd>, <Rt>, [<Rn>] ; T1 10088 stlexb(CurrentCond(), 10089 Register(rd), 10090 Register(rt), 10091 MemOperand(Register(rn), Offset)); 10092 if (((instr & 0xfff00ff0) != 0xe8c00fc0)) { 10093 UnpredictableT32(instr); 10094 } 10095 break; 10096 } 10097 case 0x000000d0: { 10098 // 0xe8c000d0 10099 unsigned rd = instr & 0xf; 10100 unsigned rt = (instr >> 12) & 0xf; 10101 unsigned rn = (instr >> 16) & 0xf; 10102 // STLEXH{<c>}{<q>} <Rd>, <Rt>, [<Rn>] ; T1 10103 stlexh(CurrentCond(), 10104 Register(rd), 10105 Register(rt), 10106 MemOperand(Register(rn), Offset)); 10107 if (((instr & 0xfff00ff0) != 0xe8c00fd0)) { 10108 UnpredictableT32(instr); 10109 } 10110 break; 10111 } 10112 case 0x000000e0: { 10113 // 0xe8c000e0 10114 unsigned rd = instr & 0xf; 10115 unsigned rt = (instr >> 12) & 0xf; 10116 unsigned rn = (instr >> 16) & 0xf; 10117 // STLEX{<c>}{<q>} <Rd>, <Rt>, [<Rn>] ; T1 10118 stlex(CurrentCond(), 10119 Register(rd), 10120 Register(rt), 10121 MemOperand(Register(rn), Offset)); 10122 if (((instr & 0xfff00ff0) != 0xe8c00fe0)) { 10123 UnpredictableT32(instr); 10124 } 10125 break; 10126 } 10127 case 0x000000f0: { 10128 // 0xe8c000f0 10129 unsigned rd = instr & 0xf; 10130 unsigned rt = (instr >> 12) & 0xf; 10131 unsigned rt2 = (instr >> 8) & 0xf; 10132 unsigned rn = (instr >> 16) & 0xf; 10133 // STLEXD{<c>}{<q>} <Rd>, <Rt>, <Rt2>, [<Rn>] ; T1 NOLINT(whitespace/line_length) 10134 stlexd(CurrentCond(), 10135 Register(rd), 10136 Register(rt), 10137 Register(rt2), 10138 MemOperand(Register(rn), Offset)); 10139 break; 10140 } 10141 default: 10142 UnallocatedT32(instr); 10143 break; 10144 } 10145 break; 10146 } 10147 } 10148 break; 10149 } 10150 case 0x00200000: { 10151 // 0xe8600000 10152 if (((instr & 0xf0000) == 0xf0000)) { 10153 UnallocatedT32(instr); 10154 return; 10155 } 10156 unsigned rt = (instr >> 12) & 0xf; 10157 unsigned rt2 = (instr >> 8) & 0xf; 10158 unsigned rn = (instr >> 16) & 0xf; 10159 Sign sign((((instr >> 23) & 0x1) == 0) ? minus 10160 : plus); 10161 int32_t offset = (instr & 0xff) << 2; 10162 // STRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>], #{+/-}<imm> ; T1 NOLINT(whitespace/line_length) 10163 strd(CurrentCond(), 10164 Register(rt), 10165 Register(rt2), 10166 MemOperand(Register(rn), 10167 sign, 10168 offset, 10169 PostIndex)); 10170 break; 10171 } 10172 } 10173 break; 10174 } 10175 case 0x01000000: { 10176 // 0xe9000000 10177 switch (instr & 0x00800000) { 10178 case 0x00000000: { 10179 // 0xe9000000 10180 if (((Uint32((instr >> 21)) & Uint32(0x1)) == 10181 Uint32(0x1)) && 10182 ((Uint32((instr >> 16)) & Uint32(0xf)) == 10183 Uint32(0xd)) && 10184 (BitCount(((Uint32((instr >> 14)) & Uint32(0x1)) 10185 << 13) | 10186 (Uint32(instr) & Uint32(0x1fff))) > 10187 Int64(1))) { 10188 RegisterList registers( 10189 (((instr >> 14) & 0x1) << kLRRegNum) | 10190 (instr & 0x1fff)); 10191 if (registers.IsR0toR7orLR()) { 10192 // PUSH{<c>}.W <registers> ; T1 10193 push(CurrentCond(), Wide, registers); 10194 if (((instr & 0xffffa000) != 0xe92d0000)) { 10195 UnpredictableT32(instr); 10196 } 10197 } else { 10198 // PUSH{<c>}{<q>} <registers> ; T1 10199 push(CurrentCond(), Best, registers); 10200 if (((instr & 0xffffa000) != 0xe92d0000)) { 10201 UnpredictableT32(instr); 10202 } 10203 } 10204 return; 10205 } 10206 unsigned rn = (instr >> 16) & 0xf; 10207 WriteBack write_back((instr >> 21) & 0x1); 10208 RegisterList registers( 10209 (((instr >> 14) & 0x1) << kLRRegNum) | 10210 (instr & 0x1fff)); 10211 // STMDB{<c>}{<q>} <Rn>{!}, <registers> ; T1 10212 stmdb(CurrentCond(), 10213 Best, 10214 Register(rn), 10215 write_back, 10216 registers); 10217 if (((instr & 0xffd0a000) != 0xe9000000)) { 10218 UnpredictableT32(instr); 10219 } 10220 break; 10221 } 10222 case 0x00800000: { 10223 // 0xe9800000 10224 UnimplementedT32_32("SRS{IA}", instr); 10225 break; 10226 } 10227 } 10228 break; 10229 } 10230 case 0x01400000: { 10231 // 0xe9400000 10232 switch (instr & 0x00200000) { 10233 case 0x00000000: { 10234 // 0xe9400000 10235 if (((instr & 0xf0000) == 0xf0000)) { 10236 UnallocatedT32(instr); 10237 return; 10238 } 10239 unsigned rt = (instr >> 12) & 0xf; 10240 unsigned rt2 = (instr >> 8) & 0xf; 10241 unsigned rn = (instr >> 16) & 0xf; 10242 Sign sign((((instr >> 23) & 0x1) == 0) ? minus 10243 : plus); 10244 int32_t offset = (instr & 0xff) << 2; 10245 // STRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>{, #{+/-}<imm>}] ; T1 NOLINT(whitespace/line_length) 10246 strd(CurrentCond(), 10247 Register(rt), 10248 Register(rt2), 10249 MemOperand(Register(rn), sign, offset, Offset)); 10250 break; 10251 } 10252 case 0x00200000: { 10253 // 0xe9600000 10254 if (((instr & 0xf0000) == 0xf0000)) { 10255 UnallocatedT32(instr); 10256 return; 10257 } 10258 unsigned rt = (instr >> 12) & 0xf; 10259 unsigned rt2 = (instr >> 8) & 0xf; 10260 unsigned rn = (instr >> 16) & 0xf; 10261 Sign sign((((instr >> 23) & 0x1) == 0) ? minus 10262 : plus); 10263 int32_t offset = (instr & 0xff) << 2; 10264 // STRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>{, #{+/-}<imm>}]! ; T1 NOLINT(whitespace/line_length) 10265 strd(CurrentCond(), 10266 Register(rt), 10267 Register(rt2), 10268 MemOperand(Register(rn), 10269 sign, 10270 offset, 10271 PreIndex)); 10272 break; 10273 } 10274 } 10275 break; 10276 } 10277 } 10278 break; 10279 } 10280 case 0x00100000: { 10281 // 0xe8100000 10282 switch (instr & 0x00400000) { 10283 case 0x00000000: { 10284 // 0xe8100000 10285 switch (instr & 0x01800000) { 10286 case 0x00000000: { 10287 // 0xe8100000 10288 UnimplementedT32_32("RFEDB", instr); 10289 break; 10290 } 10291 case 0x00800000: { 10292 // 0xe8900000 10293 if (((Uint32((instr >> 21)) & Uint32(0x1)) == 10294 Uint32(0x1)) && 10295 ((Uint32((instr >> 16)) & Uint32(0xf)) == 10296 Uint32(0xd)) && 10297 (BitCount(((Uint32((instr >> 15)) & Uint32(0x1)) 10298 << 14) | 10299 ((Uint32((instr >> 14)) & Uint32(0x1)) 10300 << 13) | 10301 (Uint32(instr) & Uint32(0x1fff))) > 10302 Int64(1))) { 10303 RegisterList registers( 10304 (((instr >> 15) & 0x1) << kPCRegNum) | 10305 (((instr >> 14) & 0x1) << kLRRegNum) | 10306 (instr & 0x1fff)); 10307 if (registers.IsR0toR7orPC()) { 10308 // POP{<c>}.W <registers> ; T2 10309 pop(CurrentCond(), Wide, registers); 10310 if (((instr & 0xffff2000) != 0xe8bd0000)) { 10311 UnpredictableT32(instr); 10312 } 10313 } else { 10314 // POP{<c>}{<q>} <registers> ; T2 10315 pop(CurrentCond(), Best, registers); 10316 if (((instr & 0xffff2000) != 0xe8bd0000)) { 10317 UnpredictableT32(instr); 10318 } 10319 } 10320 return; 10321 } 10322 unsigned rn = (instr >> 16) & 0xf; 10323 WriteBack write_back((instr >> 21) & 0x1); 10324 RegisterList registers( 10325 (((instr >> 15) & 0x1) << kPCRegNum) | 10326 (((instr >> 14) & 0x1) << kLRRegNum) | 10327 (instr & 0x1fff)); 10328 if ((rn < kNumberOfT32LowRegisters) && 10329 (((registers.GetList() & (1 << rn)) == 0) == 10330 write_back.DoesWriteBack()) && 10331 ((registers.GetList() & ~0xff) == 0)) { 10332 // LDM{<c>}.W <Rn>{!}, <registers> ; T2 10333 ldm(CurrentCond(), 10334 Wide, 10335 Register(rn), 10336 write_back, 10337 registers); 10338 if (((instr & 0xffd02000) != 0xe8900000)) { 10339 UnpredictableT32(instr); 10340 } 10341 } else { 10342 // LDM{<c>}{<q>} <Rn>{!}, <registers> ; T2 10343 ldm(CurrentCond(), 10344 Best, 10345 Register(rn), 10346 write_back, 10347 registers); 10348 if (((instr & 0xffd02000) != 0xe8900000)) { 10349 UnpredictableT32(instr); 10350 } 10351 } 10352 break; 10353 } 10354 case 0x01000000: { 10355 // 0xe9100000 10356 unsigned rn = (instr >> 16) & 0xf; 10357 WriteBack write_back((instr >> 21) & 0x1); 10358 RegisterList registers( 10359 (((instr >> 15) & 0x1) << kPCRegNum) | 10360 (((instr >> 14) & 0x1) << kLRRegNum) | 10361 (instr & 0x1fff)); 10362 // LDMDB{<c>}{<q>} <Rn>{!}, <registers> ; T1 10363 ldmdb(CurrentCond(), 10364 Register(rn), 10365 write_back, 10366 registers); 10367 if (((instr & 0xffd02000) != 0xe9100000)) { 10368 UnpredictableT32(instr); 10369 } 10370 break; 10371 } 10372 case 0x01800000: { 10373 // 0xe9900000 10374 UnimplementedT32_32("RFE{IA}", instr); 10375 break; 10376 } 10377 } 10378 break; 10379 } 10380 case 0x00400000: { 10381 // 0xe8500000 10382 switch (instr & 0x01200000) { 10383 case 0x00000000: { 10384 // 0xe8500000 10385 switch (instr & 0x00800000) { 10386 case 0x00000000: { 10387 // 0xe8500000 10388 unsigned rt = (instr >> 12) & 0xf; 10389 unsigned rn = (instr >> 16) & 0xf; 10390 int32_t offset = (instr & 0xff) << 2; 10391 // LDREX{<c>}{<q>} <Rt>, [<Rn>{, #<imm>}] ; T1 10392 ldrex(CurrentCond(), 10393 Register(rt), 10394 MemOperand(Register(rn), 10395 plus, 10396 offset, 10397 Offset)); 10398 if (((instr & 0xfff00f00) != 0xe8500f00)) { 10399 UnpredictableT32(instr); 10400 } 10401 break; 10402 } 10403 case 0x00800000: { 10404 // 0xe8d00000 10405 switch (instr & 0x000000f0) { 10406 case 0x00000000: { 10407 // 0xe8d00000 10408 unsigned rn = (instr >> 16) & 0xf; 10409 unsigned rm = instr & 0xf; 10410 // TBB{<c>}{<q>} [<Rn>, <Rm>] ; T1 10411 tbb(CurrentCond(), 10412 Register(rn), 10413 Register(rm)); 10414 if (((instr & 0xfff0fff0) != 0xe8d0f000)) { 10415 UnpredictableT32(instr); 10416 } 10417 break; 10418 } 10419 case 0x00000010: { 10420 // 0xe8d00010 10421 unsigned rn = (instr >> 16) & 0xf; 10422 unsigned rm = instr & 0xf; 10423 // TBH{<c>}{<q>} [<Rn>, <Rm>, LSL #1] ; T1 10424 tbh(CurrentCond(), 10425 Register(rn), 10426 Register(rm)); 10427 if (((instr & 0xfff0fff0) != 0xe8d0f010)) { 10428 UnpredictableT32(instr); 10429 } 10430 break; 10431 } 10432 case 0x00000040: { 10433 // 0xe8d00040 10434 unsigned rt = (instr >> 12) & 0xf; 10435 unsigned rn = (instr >> 16) & 0xf; 10436 // LDREXB{<c>}{<q>} <Rt>, [<Rn>] ; T1 10437 ldrexb(CurrentCond(), 10438 Register(rt), 10439 MemOperand(Register(rn), Offset)); 10440 if (((instr & 0xfff00fff) != 0xe8d00f4f)) { 10441 UnpredictableT32(instr); 10442 } 10443 break; 10444 } 10445 case 0x00000050: { 10446 // 0xe8d00050 10447 unsigned rt = (instr >> 12) & 0xf; 10448 unsigned rn = (instr >> 16) & 0xf; 10449 // LDREXH{<c>}{<q>} <Rt>, [<Rn>] ; T1 10450 ldrexh(CurrentCond(), 10451 Register(rt), 10452 MemOperand(Register(rn), Offset)); 10453 if (((instr & 0xfff00fff) != 0xe8d00f5f)) { 10454 UnpredictableT32(instr); 10455 } 10456 break; 10457 } 10458 case 0x00000070: { 10459 // 0xe8d00070 10460 unsigned rt = (instr >> 12) & 0xf; 10461 unsigned rt2 = (instr >> 8) & 0xf; 10462 unsigned rn = (instr >> 16) & 0xf; 10463 // LDREXD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>] ; T1 10464 ldrexd(CurrentCond(), 10465 Register(rt), 10466 Register(rt2), 10467 MemOperand(Register(rn), Offset)); 10468 if (((instr & 0xfff000ff) != 0xe8d0007f)) { 10469 UnpredictableT32(instr); 10470 } 10471 break; 10472 } 10473 case 0x00000080: { 10474 // 0xe8d00080 10475 unsigned rt = (instr >> 12) & 0xf; 10476 unsigned rn = (instr >> 16) & 0xf; 10477 // LDAB{<c>}{<q>} <Rt>, [<Rn>] ; T1 10478 ldab(CurrentCond(), 10479 Register(rt), 10480 MemOperand(Register(rn), Offset)); 10481 if (((instr & 0xfff00fff) != 0xe8d00f8f)) { 10482 UnpredictableT32(instr); 10483 } 10484 break; 10485 } 10486 case 0x00000090: { 10487 // 0xe8d00090 10488 unsigned rt = (instr >> 12) & 0xf; 10489 unsigned rn = (instr >> 16) & 0xf; 10490 // LDAH{<c>}{<q>} <Rt>, [<Rn>] ; T1 10491 ldah(CurrentCond(), 10492 Register(rt), 10493 MemOperand(Register(rn), Offset)); 10494 if (((instr & 0xfff00fff) != 0xe8d00f9f)) { 10495 UnpredictableT32(instr); 10496 } 10497 break; 10498 } 10499 case 0x000000a0: { 10500 // 0xe8d000a0 10501 unsigned rt = (instr >> 12) & 0xf; 10502 unsigned rn = (instr >> 16) & 0xf; 10503 // LDA{<c>}{<q>} <Rt>, [<Rn>] ; T1 10504 lda(CurrentCond(), 10505 Register(rt), 10506 MemOperand(Register(rn), Offset)); 10507 if (((instr & 0xfff00fff) != 0xe8d00faf)) { 10508 UnpredictableT32(instr); 10509 } 10510 break; 10511 } 10512 case 0x000000c0: { 10513 // 0xe8d000c0 10514 unsigned rt = (instr >> 12) & 0xf; 10515 unsigned rn = (instr >> 16) & 0xf; 10516 // LDAEXB{<c>}{<q>} <Rt>, [<Rn>] ; T1 10517 ldaexb(CurrentCond(), 10518 Register(rt), 10519 MemOperand(Register(rn), Offset)); 10520 if (((instr & 0xfff00fff) != 0xe8d00fcf)) { 10521 UnpredictableT32(instr); 10522 } 10523 break; 10524 } 10525 case 0x000000d0: { 10526 // 0xe8d000d0 10527 unsigned rt = (instr >> 12) & 0xf; 10528 unsigned rn = (instr >> 16) & 0xf; 10529 // LDAEXH{<c>}{<q>} <Rt>, [<Rn>] ; T1 10530 ldaexh(CurrentCond(), 10531 Register(rt), 10532 MemOperand(Register(rn), Offset)); 10533 if (((instr & 0xfff00fff) != 0xe8d00fdf)) { 10534 UnpredictableT32(instr); 10535 } 10536 break; 10537 } 10538 case 0x000000e0: { 10539 // 0xe8d000e0 10540 unsigned rt = (instr >> 12) & 0xf; 10541 unsigned rn = (instr >> 16) & 0xf; 10542 // LDAEX{<c>}{<q>} <Rt>, [<Rn>] ; T1 10543 ldaex(CurrentCond(), 10544 Register(rt), 10545 MemOperand(Register(rn), Offset)); 10546 if (((instr & 0xfff00fff) != 0xe8d00fef)) { 10547 UnpredictableT32(instr); 10548 } 10549 break; 10550 } 10551 case 0x000000f0: { 10552 // 0xe8d000f0 10553 unsigned rt = (instr >> 12) & 0xf; 10554 unsigned rt2 = (instr >> 8) & 0xf; 10555 unsigned rn = (instr >> 16) & 0xf; 10556 // LDAEXD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>] ; T1 10557 ldaexd(CurrentCond(), 10558 Register(rt), 10559 Register(rt2), 10560 MemOperand(Register(rn), Offset)); 10561 if (((instr & 0xfff000ff) != 0xe8d000ff)) { 10562 UnpredictableT32(instr); 10563 } 10564 break; 10565 } 10566 default: 10567 UnallocatedT32(instr); 10568 break; 10569 } 10570 break; 10571 } 10572 } 10573 break; 10574 } 10575 case 0x00200000: { 10576 // 0xe8700000 10577 switch (instr & 0x000f0000) { 10578 case 0x000f0000: { 10579 // 0xe87f0000 10580 if (((instr & 0x1200000) == 0x0)) { 10581 UnallocatedT32(instr); 10582 return; 10583 } 10584 unsigned rt = (instr >> 12) & 0xf; 10585 unsigned rt2 = (instr >> 8) & 0xf; 10586 uint32_t U = (instr >> 23) & 0x1; 10587 int32_t imm = instr & 0xff; 10588 imm <<= 2; 10589 if (U == 0) imm = -imm; 10590 bool minus_zero = (imm == 0) && (U == 0); 10591 Label label(imm, kT32PcDelta, minus_zero); 10592 // LDRD{<c>}{<q>} <Rt>, <Rt2>, <label> ; T1 10593 ldrd(CurrentCond(), 10594 Register(rt), 10595 Register(rt2), 10596 &label); 10597 if (((instr & 0xff7f0000) != 0xe95f0000)) { 10598 UnpredictableT32(instr); 10599 } 10600 break; 10601 } 10602 default: { 10603 if (((instr & 0xf0000) == 0xf0000)) { 10604 UnallocatedT32(instr); 10605 return; 10606 } 10607 unsigned rt = (instr >> 12) & 0xf; 10608 unsigned rt2 = (instr >> 8) & 0xf; 10609 unsigned rn = (instr >> 16) & 0xf; 10610 Sign sign((((instr >> 23) & 0x1) == 0) ? minus 10611 : plus); 10612 int32_t offset = (instr & 0xff) << 2; 10613 // LDRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>], #{+/-}<imm> ; T1 NOLINT(whitespace/line_length) 10614 ldrd(CurrentCond(), 10615 Register(rt), 10616 Register(rt2), 10617 MemOperand(Register(rn), 10618 sign, 10619 offset, 10620 PostIndex)); 10621 break; 10622 } 10623 } 10624 break; 10625 } 10626 case 0x01000000: { 10627 // 0xe9500000 10628 switch (instr & 0x000f0000) { 10629 case 0x000f0000: { 10630 // 0xe95f0000 10631 if (((instr & 0x1200000) == 0x0)) { 10632 UnallocatedT32(instr); 10633 return; 10634 } 10635 unsigned rt = (instr >> 12) & 0xf; 10636 unsigned rt2 = (instr >> 8) & 0xf; 10637 uint32_t U = (instr >> 23) & 0x1; 10638 int32_t imm = instr & 0xff; 10639 imm <<= 2; 10640 if (U == 0) imm = -imm; 10641 bool minus_zero = (imm == 0) && (U == 0); 10642 Label label(imm, kT32PcDelta, minus_zero); 10643 // LDRD{<c>}{<q>} <Rt>, <Rt2>, <label> ; T1 10644 ldrd(CurrentCond(), 10645 Register(rt), 10646 Register(rt2), 10647 &label); 10648 if (((instr & 0xff7f0000) != 0xe95f0000)) { 10649 UnpredictableT32(instr); 10650 } 10651 break; 10652 } 10653 default: { 10654 if (((instr & 0xf0000) == 0xf0000)) { 10655 UnallocatedT32(instr); 10656 return; 10657 } 10658 unsigned rt = (instr >> 12) & 0xf; 10659 unsigned rt2 = (instr >> 8) & 0xf; 10660 unsigned rn = (instr >> 16) & 0xf; 10661 Sign sign((((instr >> 23) & 0x1) == 0) ? minus 10662 : plus); 10663 int32_t offset = (instr & 0xff) << 2; 10664 // LDRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>{, #{+/-}<imm>}] ; T1 NOLINT(whitespace/line_length) 10665 ldrd(CurrentCond(), 10666 Register(rt), 10667 Register(rt2), 10668 MemOperand(Register(rn), 10669 sign, 10670 offset, 10671 Offset)); 10672 break; 10673 } 10674 } 10675 break; 10676 } 10677 case 0x01200000: { 10678 // 0xe9700000 10679 switch (instr & 0x000f0000) { 10680 case 0x000f0000: { 10681 // 0xe97f0000 10682 if (((instr & 0x1200000) == 0x0)) { 10683 UnallocatedT32(instr); 10684 return; 10685 } 10686 unsigned rt = (instr >> 12) & 0xf; 10687 unsigned rt2 = (instr >> 8) & 0xf; 10688 uint32_t U = (instr >> 23) & 0x1; 10689 int32_t imm = instr & 0xff; 10690 imm <<= 2; 10691 if (U == 0) imm = -imm; 10692 bool minus_zero = (imm == 0) && (U == 0); 10693 Label label(imm, kT32PcDelta, minus_zero); 10694 // LDRD{<c>}{<q>} <Rt>, <Rt2>, <label> ; T1 10695 ldrd(CurrentCond(), 10696 Register(rt), 10697 Register(rt2), 10698 &label); 10699 if (((instr & 0xff7f0000) != 0xe95f0000)) { 10700 UnpredictableT32(instr); 10701 } 10702 break; 10703 } 10704 default: { 10705 if (((instr & 0xf0000) == 0xf0000)) { 10706 UnallocatedT32(instr); 10707 return; 10708 } 10709 unsigned rt = (instr >> 12) & 0xf; 10710 unsigned rt2 = (instr >> 8) & 0xf; 10711 unsigned rn = (instr >> 16) & 0xf; 10712 Sign sign((((instr >> 23) & 0x1) == 0) ? minus 10713 : plus); 10714 int32_t offset = (instr & 0xff) << 2; 10715 // LDRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>{, #{+/-}<imm>}]! ; T1 NOLINT(whitespace/line_length) 10716 ldrd(CurrentCond(), 10717 Register(rt), 10718 Register(rt2), 10719 MemOperand(Register(rn), 10720 sign, 10721 offset, 10722 PreIndex)); 10723 break; 10724 } 10725 } 10726 break; 10727 } 10728 } 10729 break; 10730 } 10731 } 10732 break; 10733 } 10734 case 0x10000000: { 10735 // 0xf8000000 10736 switch (instr & 0x01a00000) { 10737 case 0x00000000: { 10738 // 0xf8000000 10739 switch (instr & 0x00400d00) { 10740 case 0x00000000: { 10741 // 0xf8000000 10742 if ((instr & 0x000002c0) == 0x00000000) { 10743 if (((instr & 0xf0000) == 0xf0000)) { 10744 UnallocatedT32(instr); 10745 return; 10746 } 10747 unsigned rt = (instr >> 12) & 0xf; 10748 unsigned rn = (instr >> 16) & 0xf; 10749 Sign sign(plus); 10750 unsigned rm = instr & 0xf; 10751 Shift shift = LSL; 10752 uint32_t amount = (instr >> 4) & 0x3; 10753 AddrMode addrmode = Offset; 10754 if ((rt < kNumberOfT32LowRegisters) && 10755 (rn < kNumberOfT32LowRegisters) && 10756 (rm < kNumberOfT32LowRegisters) && 10757 shift.IsLSL() && (amount == 0) && 10758 sign.IsPlus()) { 10759 // STRB{<c>}.W <Rt>, [<Rn>, #{+}<Rm>] ; T2 10760 strb(CurrentCond(), 10761 Wide, 10762 Register(rt), 10763 MemOperand(Register(rn), 10764 sign, 10765 Register(rm), 10766 addrmode)); 10767 } else { 10768 // STRB{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>{, LSL #<imm>}] ; T2 NOLINT(whitespace/line_length) 10769 strb(CurrentCond(), 10770 Best, 10771 Register(rt), 10772 MemOperand(Register(rn), 10773 sign, 10774 Register(rm), 10775 shift, 10776 amount, 10777 addrmode)); 10778 } 10779 } else { 10780 UnallocatedT32(instr); 10781 } 10782 break; 10783 } 10784 case 0x00000900: { 10785 // 0xf8000900 10786 if (((instr & 0xf0000) == 0xf0000)) { 10787 UnallocatedT32(instr); 10788 return; 10789 } 10790 unsigned rt = (instr >> 12) & 0xf; 10791 unsigned rn = (instr >> 16) & 0xf; 10792 Sign sign((((instr >> 9) & 0x1) == 0) ? minus : plus); 10793 int32_t offset = instr & 0xff; 10794 // STRB{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_2> ; T3 10795 strb(CurrentCond(), 10796 Best, 10797 Register(rt), 10798 MemOperand(Register(rn), 10799 sign, 10800 offset, 10801 PostIndex)); 10802 break; 10803 } 10804 case 0x00000c00: { 10805 // 0xf8000c00 10806 switch (instr & 0x00000200) { 10807 case 0x00000000: { 10808 // 0xf8000c00 10809 if (((instr & 0xf0000) == 0xf0000)) { 10810 UnallocatedT32(instr); 10811 return; 10812 } 10813 unsigned rt = (instr >> 12) & 0xf; 10814 unsigned rn = (instr >> 16) & 0xf; 10815 int32_t offset = instr & 0xff; 10816 // STRB{<c>}{<q>} <Rt>, [<Rn>{, #-<imm_2>}] ; T3 10817 strb(CurrentCond(), 10818 Best, 10819 Register(rt), 10820 MemOperand(Register(rn), 10821 minus, 10822 offset, 10823 Offset)); 10824 break; 10825 } 10826 case 0x00000200: { 10827 // 0xf8000e00 10828 if (((instr & 0xf0000) == 0xf0000)) { 10829 UnallocatedT32(instr); 10830 return; 10831 } 10832 UnimplementedT32_32("STRBT", instr); 10833 break; 10834 } 10835 } 10836 break; 10837 } 10838 case 0x00000d00: { 10839 // 0xf8000d00 10840 if (((instr & 0xf0000) == 0xf0000)) { 10841 UnallocatedT32(instr); 10842 return; 10843 } 10844 unsigned rt = (instr >> 12) & 0xf; 10845 unsigned rn = (instr >> 16) & 0xf; 10846 Sign sign((((instr >> 9) & 0x1) == 0) ? minus : plus); 10847 int32_t offset = instr & 0xff; 10848 // STRB{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_2>}]! ; T3 10849 strb(CurrentCond(), 10850 Best, 10851 Register(rt), 10852 MemOperand(Register(rn), 10853 sign, 10854 offset, 10855 PreIndex)); 10856 break; 10857 } 10858 case 0x00400000: { 10859 // 0xf8400000 10860 if ((instr & 0x000002c0) == 0x00000000) { 10861 if (((instr & 0xf0000) == 0xf0000)) { 10862 UnallocatedT32(instr); 10863 return; 10864 } 10865 unsigned rt = (instr >> 12) & 0xf; 10866 unsigned rn = (instr >> 16) & 0xf; 10867 Sign sign(plus); 10868 unsigned rm = instr & 0xf; 10869 Shift shift = LSL; 10870 uint32_t amount = (instr >> 4) & 0x3; 10871 AddrMode addrmode = Offset; 10872 if ((rt < kNumberOfT32LowRegisters) && 10873 (rn < kNumberOfT32LowRegisters) && 10874 (rm < kNumberOfT32LowRegisters) && 10875 shift.IsLSL() && (amount == 0) && 10876 sign.IsPlus()) { 10877 // STR{<c>}.W <Rt>, [<Rn>, #{+}<Rm>] ; T2 10878 str(CurrentCond(), 10879 Wide, 10880 Register(rt), 10881 MemOperand(Register(rn), 10882 sign, 10883 Register(rm), 10884 addrmode)); 10885 } else { 10886 // STR{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>{, LSL #<imm>}] ; T2 NOLINT(whitespace/line_length) 10887 str(CurrentCond(), 10888 Best, 10889 Register(rt), 10890 MemOperand(Register(rn), 10891 sign, 10892 Register(rm), 10893 shift, 10894 amount, 10895 addrmode)); 10896 } 10897 } else { 10898 UnallocatedT32(instr); 10899 } 10900 break; 10901 } 10902 case 0x00400900: { 10903 // 0xf8400900 10904 if (((instr & 0xf0000) == 0xf0000)) { 10905 UnallocatedT32(instr); 10906 return; 10907 } 10908 unsigned rt = (instr >> 12) & 0xf; 10909 unsigned rn = (instr >> 16) & 0xf; 10910 Sign sign((((instr >> 9) & 0x1) == 0) ? minus : plus); 10911 int32_t offset = instr & 0xff; 10912 // STR{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_2> ; T4 10913 str(CurrentCond(), 10914 Best, 10915 Register(rt), 10916 MemOperand(Register(rn), 10917 sign, 10918 offset, 10919 PostIndex)); 10920 break; 10921 } 10922 case 0x00400c00: { 10923 // 0xf8400c00 10924 switch (instr & 0x00000200) { 10925 case 0x00000000: { 10926 // 0xf8400c00 10927 if (((instr & 0xf0000) == 0xf0000)) { 10928 UnallocatedT32(instr); 10929 return; 10930 } 10931 unsigned rt = (instr >> 12) & 0xf; 10932 unsigned rn = (instr >> 16) & 0xf; 10933 int32_t offset = instr & 0xff; 10934 // STR{<c>}{<q>} <Rt>, [<Rn>{, #-<imm_2>}] ; T4 10935 str(CurrentCond(), 10936 Best, 10937 Register(rt), 10938 MemOperand(Register(rn), 10939 minus, 10940 offset, 10941 Offset)); 10942 break; 10943 } 10944 case 0x00000200: { 10945 // 0xf8400e00 10946 if (((instr & 0xf0000) == 0xf0000)) { 10947 UnallocatedT32(instr); 10948 return; 10949 } 10950 UnimplementedT32_32("STRT", instr); 10951 break; 10952 } 10953 } 10954 break; 10955 } 10956 case 0x00400d00: { 10957 // 0xf8400d00 10958 if (((instr & 0xf0000) == 0xf0000)) { 10959 UnallocatedT32(instr); 10960 return; 10961 } 10962 if (((Uint32((instr >> 16)) & Uint32(0xf)) == 10963 Uint32(0xd)) && 10964 ((Uint32((instr >> 9)) & Uint32(0x1)) == 10965 Uint32(0x0)) && 10966 ((Uint32(instr) & Uint32(0xff)) == Uint32(0x4))) { 10967 unsigned rt = (instr >> 12) & 0xf; 10968 if ((rt <= 7) || (rt == kLRRegNum)) { 10969 // PUSH{<c>}.W <single_register_list> ; T4 10970 push(CurrentCond(), Wide, Register(rt)); 10971 } else { 10972 // PUSH{<c>}{<q>} <single_register_list> ; T4 10973 push(CurrentCond(), Best, Register(rt)); 10974 } 10975 return; 10976 } 10977 unsigned rt = (instr >> 12) & 0xf; 10978 unsigned rn = (instr >> 16) & 0xf; 10979 Sign sign((((instr >> 9) & 0x1) == 0) ? minus : plus); 10980 int32_t offset = instr & 0xff; 10981 // STR{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_2>}]! ; T4 10982 str(CurrentCond(), 10983 Best, 10984 Register(rt), 10985 MemOperand(