disasm-aarch32.cc (3391487B)
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/disasm-aarch32.h" 41 #include "aarch32/instructions-aarch32.h" 42 #include "aarch32/operands-aarch32.h" 43 44 namespace vixl { 45 namespace aarch32 { 46 47 using internal::Int64; 48 using internal::Uint32; 49 50 class T32CodeAddressIncrementer { 51 uint32_t* code_address_; 52 uint32_t increment_; 53 54 public: 55 T32CodeAddressIncrementer(uint32_t instr, uint32_t* code_address) 56 : code_address_(code_address), 57 increment_(Disassembler::Is16BitEncoding(instr) ? 2 : 4) {} 58 ~T32CodeAddressIncrementer() { *code_address_ += increment_; } 59 }; 60 61 class A32CodeAddressIncrementer { 62 uint32_t* code_address_; 63 64 public: 65 explicit A32CodeAddressIncrementer(uint32_t* code_address) 66 : code_address_(code_address) {} 67 ~A32CodeAddressIncrementer() { *code_address_ += 4; } 68 }; 69 70 class DecodeNeon { 71 int lane_; 72 SpacingType spacing_; 73 bool valid_; 74 75 public: 76 DecodeNeon(int lane, SpacingType spacing) 77 : lane_(lane), spacing_(spacing), valid_(true) {} 78 DecodeNeon() : lane_(0), spacing_(kSingle), valid_(false) {} 79 int GetLane() const { return lane_; } 80 SpacingType GetSpacing() const { return spacing_; } 81 bool IsValid() const { return valid_; } 82 }; 83 84 class DecodeNeonAndAlign : public DecodeNeon { 85 public: 86 Alignment align_; 87 DecodeNeonAndAlign(int lanes, SpacingType spacing, Alignment align) 88 : DecodeNeon(lanes, spacing), align_(align) {} 89 DecodeNeonAndAlign() : align_(kBadAlignment) {} 90 Alignment GetAlign() const { return align_; } 91 }; 92 93 // Start of generated code. 94 DataTypeValue Dt_L_imm6_1_Decode(uint32_t value, uint32_t type_value) { 95 if ((value & 0xf) == 0x1) { 96 switch (type_value) { 97 case 0x0: 98 return S8; 99 case 0x1: 100 return U8; 101 } 102 } else if ((value & 0xe) == 0x2) { 103 switch (type_value) { 104 case 0x0: 105 return S16; 106 case 0x1: 107 return U16; 108 } 109 } else if ((value & 0xc) == 0x4) { 110 switch (type_value) { 111 case 0x0: 112 return S32; 113 case 0x1: 114 return U32; 115 } 116 } else if ((value & 0x8) == 0x8) { 117 switch (type_value) { 118 case 0x0: 119 return S64; 120 case 0x1: 121 return U64; 122 } 123 } 124 return kDataTypeValueInvalid; 125 } 126 127 DataTypeValue Dt_L_imm6_2_Decode(uint32_t value, uint32_t type_value) { 128 if ((value & 0xf) == 0x1) { 129 if (type_value == 0x1) return S8; 130 } else if ((value & 0xe) == 0x2) { 131 if (type_value == 0x1) return S16; 132 } else if ((value & 0xc) == 0x4) { 133 if (type_value == 0x1) return S32; 134 } else if ((value & 0x8) == 0x8) { 135 if (type_value == 0x1) return S64; 136 } 137 return kDataTypeValueInvalid; 138 } 139 140 DataTypeValue Dt_L_imm6_3_Decode(uint32_t value) { 141 if ((value & 0xf) == 0x1) { 142 return I8; 143 } else if ((value & 0xe) == 0x2) { 144 return I16; 145 } else if ((value & 0xc) == 0x4) { 146 return I32; 147 } else if ((value & 0x8) == 0x8) { 148 return I64; 149 } 150 return kDataTypeValueInvalid; 151 } 152 153 DataTypeValue Dt_L_imm6_4_Decode(uint32_t value) { 154 if ((value & 0xf) == 0x1) { 155 return Untyped8; 156 } else if ((value & 0xe) == 0x2) { 157 return Untyped16; 158 } else if ((value & 0xc) == 0x4) { 159 return Untyped32; 160 } else if ((value & 0x8) == 0x8) { 161 return Untyped64; 162 } 163 return kDataTypeValueInvalid; 164 } 165 166 DataTypeValue Dt_imm6_1_Decode(uint32_t value, uint32_t type_value) { 167 if ((value & 0x7) == 0x1) { 168 switch (type_value) { 169 case 0x0: 170 return S16; 171 case 0x1: 172 return U16; 173 } 174 } else if ((value & 0x6) == 0x2) { 175 switch (type_value) { 176 case 0x0: 177 return S32; 178 case 0x1: 179 return U32; 180 } 181 } else if ((value & 0x4) == 0x4) { 182 switch (type_value) { 183 case 0x0: 184 return S64; 185 case 0x1: 186 return U64; 187 } 188 } 189 return kDataTypeValueInvalid; 190 } 191 192 DataTypeValue Dt_imm6_2_Decode(uint32_t value, uint32_t type_value) { 193 if ((value & 0x7) == 0x1) { 194 if (type_value == 0x1) return S16; 195 } else if ((value & 0x6) == 0x2) { 196 if (type_value == 0x1) return S32; 197 } else if ((value & 0x4) == 0x4) { 198 if (type_value == 0x1) return S64; 199 } 200 return kDataTypeValueInvalid; 201 } 202 203 DataTypeValue Dt_imm6_3_Decode(uint32_t value) { 204 if ((value & 0x7) == 0x1) { 205 return I16; 206 } else if ((value & 0x6) == 0x2) { 207 return I32; 208 } else if ((value & 0x4) == 0x4) { 209 return I64; 210 } 211 return kDataTypeValueInvalid; 212 } 213 214 DataTypeValue Dt_imm6_4_Decode(uint32_t value, uint32_t type_value) { 215 if ((value & 0x7) == 0x1) { 216 switch (type_value) { 217 case 0x0: 218 return S8; 219 case 0x1: 220 return U8; 221 } 222 } else if ((value & 0x6) == 0x2) { 223 switch (type_value) { 224 case 0x0: 225 return S16; 226 case 0x1: 227 return U16; 228 } 229 } else if ((value & 0x4) == 0x4) { 230 switch (type_value) { 231 case 0x0: 232 return S32; 233 case 0x1: 234 return U32; 235 } 236 } 237 return kDataTypeValueInvalid; 238 } 239 240 DataTypeValue Dt_op_U_size_1_Decode(uint32_t value) { 241 switch (value) { 242 case 0x0: 243 return S8; 244 case 0x1: 245 return S16; 246 case 0x2: 247 return S32; 248 case 0x4: 249 return U8; 250 case 0x5: 251 return U16; 252 case 0x6: 253 return U32; 254 case 0x8: 255 return P8; 256 case 0xa: 257 return P64; 258 } 259 return kDataTypeValueInvalid; 260 } 261 262 DataTypeValue Dt_op_size_1_Decode(uint32_t value) { 263 switch (value) { 264 case 0x0: 265 return I8; 266 case 0x1: 267 return I16; 268 case 0x2: 269 return I32; 270 case 0x4: 271 return P8; 272 } 273 return kDataTypeValueInvalid; 274 } 275 276 DataTypeValue Dt_op_size_2_Decode(uint32_t value) { 277 switch (value) { 278 case 0x0: 279 return S8; 280 case 0x1: 281 return S16; 282 case 0x2: 283 return S32; 284 case 0x4: 285 return U8; 286 case 0x5: 287 return U16; 288 case 0x6: 289 return U32; 290 } 291 return kDataTypeValueInvalid; 292 } 293 294 DataTypeValue Dt_op_size_3_Decode(uint32_t value) { 295 switch (value) { 296 case 0x0: 297 return S16; 298 case 0x1: 299 return S32; 300 case 0x2: 301 return S64; 302 case 0x4: 303 return U16; 304 case 0x5: 305 return U32; 306 case 0x6: 307 return U64; 308 } 309 return kDataTypeValueInvalid; 310 } 311 312 DataTypeValue Dt_U_imm3H_1_Decode(uint32_t value) { 313 switch (value) { 314 case 0x1: 315 return S8; 316 case 0x2: 317 return S16; 318 case 0x4: 319 return S32; 320 case 0x9: 321 return U8; 322 case 0xa: 323 return U16; 324 case 0xc: 325 return U32; 326 } 327 return kDataTypeValueInvalid; 328 } 329 330 DataTypeValue Dt_U_opc1_opc2_1_Decode(uint32_t value, unsigned* lane) { 331 if ((value & 0x18) == 0x8) { 332 *lane = value & 7; 333 return S8; 334 } 335 if ((value & 0x19) == 0x1) { 336 *lane = (value >> 1) & 3; 337 return S16; 338 } 339 if ((value & 0x18) == 0x18) { 340 *lane = value & 7; 341 return U8; 342 } 343 if ((value & 0x19) == 0x11) { 344 *lane = (value >> 1) & 3; 345 return U16; 346 } 347 if ((value & 0x1b) == 0x0) { 348 *lane = (value >> 2) & 1; 349 return Untyped32; 350 } 351 *lane = ~0U; 352 return kDataTypeValueInvalid; 353 } 354 355 DataTypeValue Dt_opc1_opc2_1_Decode(uint32_t value, unsigned* lane) { 356 if ((value & 0x8) == 0x8) { 357 *lane = value & 7; 358 return Untyped8; 359 } 360 if ((value & 0x9) == 0x1) { 361 *lane = (value >> 1) & 3; 362 return Untyped16; 363 } 364 if ((value & 0xb) == 0x0) { 365 *lane = (value >> 2) & 1; 366 return Untyped32; 367 } 368 *lane = ~0U; 369 return kDataTypeValueInvalid; 370 } 371 372 DataTypeValue Dt_imm4_1_Decode(uint32_t value, unsigned* lane) { 373 if ((value & 0x1) == 0x1) { 374 *lane = (value >> 1) & 7; 375 return Untyped8; 376 } 377 if ((value & 0x3) == 0x2) { 378 *lane = (value >> 2) & 3; 379 return Untyped16; 380 } 381 if ((value & 0x7) == 0x4) { 382 *lane = (value >> 3) & 1; 383 return Untyped32; 384 } 385 *lane = ~0U; 386 return kDataTypeValueInvalid; 387 } 388 389 DataTypeValue Dt_B_E_1_Decode(uint32_t value) { 390 switch (value) { 391 case 0x2: 392 return Untyped8; 393 case 0x1: 394 return Untyped16; 395 case 0x0: 396 return Untyped32; 397 } 398 return kDataTypeValueInvalid; 399 } 400 401 DataTypeValue Dt_op_1_Decode1(uint32_t value) { 402 switch (value) { 403 case 0x0: 404 return F32; 405 case 0x1: 406 return F32; 407 case 0x2: 408 return S32; 409 case 0x3: 410 return U32; 411 } 412 return kDataTypeValueInvalid; 413 } 414 415 DataTypeValue Dt_op_1_Decode2(uint32_t value) { 416 switch (value) { 417 case 0x0: 418 return S32; 419 case 0x1: 420 return U32; 421 case 0x2: 422 return F32; 423 case 0x3: 424 return F32; 425 } 426 return kDataTypeValueInvalid; 427 } 428 429 DataTypeValue Dt_op_2_Decode(uint32_t value) { 430 switch (value) { 431 case 0x0: 432 return U32; 433 case 0x1: 434 return S32; 435 } 436 return kDataTypeValueInvalid; 437 } 438 439 DataTypeValue Dt_op_3_Decode(uint32_t value) { 440 switch (value) { 441 case 0x0: 442 return S32; 443 case 0x1: 444 return U32; 445 } 446 return kDataTypeValueInvalid; 447 } 448 449 DataTypeValue Dt_U_sx_1_Decode(uint32_t value) { 450 switch (value) { 451 case 0x0: 452 return S16; 453 case 0x1: 454 return S32; 455 case 0x2: 456 return U16; 457 case 0x3: 458 return U32; 459 } 460 return kDataTypeValueInvalid; 461 } 462 463 DataTypeValue Dt_op_U_1_Decode1(uint32_t value) { 464 switch (value) { 465 case 0x0: 466 return F32; 467 case 0x1: 468 return F32; 469 case 0x2: 470 return S32; 471 case 0x3: 472 return U32; 473 } 474 return kDataTypeValueInvalid; 475 } 476 477 DataTypeValue Dt_op_U_1_Decode2(uint32_t value) { 478 switch (value) { 479 case 0x0: 480 return S32; 481 case 0x1: 482 return U32; 483 case 0x2: 484 return F32; 485 case 0x3: 486 return F32; 487 } 488 return kDataTypeValueInvalid; 489 } 490 491 DataTypeValue Dt_sz_1_Decode(uint32_t value) { 492 switch (value) { 493 case 0x0: 494 return F32; 495 } 496 return kDataTypeValueInvalid; 497 } 498 499 DataTypeValue Dt_F_size_1_Decode(uint32_t value) { 500 switch (value) { 501 case 0x0: 502 return S8; 503 case 0x1: 504 return S16; 505 case 0x2: 506 return S32; 507 case 0x6: 508 return F32; 509 } 510 return kDataTypeValueInvalid; 511 } 512 513 DataTypeValue Dt_F_size_2_Decode(uint32_t value) { 514 switch (value) { 515 case 0x0: 516 return I8; 517 case 0x1: 518 return I16; 519 case 0x2: 520 return I32; 521 case 0x6: 522 return F32; 523 } 524 return kDataTypeValueInvalid; 525 } 526 527 DataTypeValue Dt_F_size_3_Decode(uint32_t value) { 528 switch (value) { 529 case 0x1: 530 return I16; 531 case 0x2: 532 return I32; 533 case 0x6: 534 return F32; 535 } 536 return kDataTypeValueInvalid; 537 } 538 539 DataTypeValue Dt_F_size_4_Decode(uint32_t value) { 540 switch (value) { 541 case 0x2: 542 return U32; 543 case 0x6: 544 return F32; 545 } 546 return kDataTypeValueInvalid; 547 } 548 549 DataTypeValue Dt_U_size_1_Decode(uint32_t value) { 550 switch (value) { 551 case 0x0: 552 return S8; 553 case 0x1: 554 return S16; 555 case 0x2: 556 return S32; 557 case 0x4: 558 return U8; 559 case 0x5: 560 return U16; 561 case 0x6: 562 return U32; 563 } 564 return kDataTypeValueInvalid; 565 } 566 567 DataTypeValue Dt_U_size_2_Decode(uint32_t value) { 568 switch (value) { 569 case 0x1: 570 return S16; 571 case 0x2: 572 return S32; 573 case 0x5: 574 return U16; 575 case 0x6: 576 return U32; 577 } 578 return kDataTypeValueInvalid; 579 } 580 581 DataTypeValue Dt_U_size_3_Decode(uint32_t value) { 582 switch (value) { 583 case 0x0: 584 return S8; 585 case 0x1: 586 return S16; 587 case 0x2: 588 return S32; 589 case 0x3: 590 return S64; 591 case 0x4: 592 return U8; 593 case 0x5: 594 return U16; 595 case 0x6: 596 return U32; 597 case 0x7: 598 return U64; 599 } 600 return kDataTypeValueInvalid; 601 } 602 603 DataTypeValue Dt_size_1_Decode(uint32_t value) { 604 switch (value) { 605 case 0x0: 606 return Untyped8; 607 } 608 return kDataTypeValueInvalid; 609 } 610 611 DataTypeValue Dt_size_2_Decode(uint32_t value) { 612 switch (value) { 613 case 0x0: 614 return I8; 615 case 0x1: 616 return I16; 617 case 0x2: 618 return I32; 619 case 0x3: 620 return I64; 621 } 622 return kDataTypeValueInvalid; 623 } 624 625 DataTypeValue Dt_size_3_Decode(uint32_t value) { 626 switch (value) { 627 case 0x0: 628 return I16; 629 case 0x1: 630 return I32; 631 case 0x2: 632 return I64; 633 } 634 return kDataTypeValueInvalid; 635 } 636 637 DataTypeValue Dt_size_4_Decode(uint32_t value) { 638 switch (value) { 639 case 0x0: 640 return I8; 641 case 0x1: 642 return I16; 643 case 0x2: 644 return I32; 645 } 646 return kDataTypeValueInvalid; 647 } 648 649 DataTypeValue Dt_size_5_Decode(uint32_t value) { 650 switch (value) { 651 case 0x0: 652 return S8; 653 case 0x1: 654 return S16; 655 case 0x2: 656 return S32; 657 } 658 return kDataTypeValueInvalid; 659 } 660 661 DataTypeValue Dt_size_6_Decode(uint32_t value) { 662 switch (value) { 663 case 0x0: 664 return Untyped8; 665 case 0x1: 666 return Untyped16; 667 case 0x2: 668 return Untyped32; 669 case 0x3: 670 return Untyped64; 671 } 672 return kDataTypeValueInvalid; 673 } 674 675 DataTypeValue Dt_size_7_Decode(uint32_t value) { 676 switch (value) { 677 case 0x0: 678 return Untyped8; 679 case 0x1: 680 return Untyped16; 681 case 0x2: 682 return Untyped32; 683 } 684 return kDataTypeValueInvalid; 685 } 686 687 DataTypeValue Dt_size_8_Decode(uint32_t value) { 688 switch (value) { 689 case 0x0: 690 return Untyped8; 691 case 0x1: 692 return Untyped16; 693 case 0x2: 694 return Untyped32; 695 case 0x3: 696 return Untyped32; 697 } 698 return kDataTypeValueInvalid; 699 } 700 701 DataTypeValue Dt_size_9_Decode(uint32_t value, uint32_t type_value) { 702 switch (value) { 703 case 0x1: 704 switch (type_value) { 705 case 0x0: 706 return I16; 707 } 708 break; 709 case 0x2: 710 switch (type_value) { 711 case 0x0: 712 return I32; 713 case 0x1: 714 return F32; 715 } 716 break; 717 } 718 return kDataTypeValueInvalid; 719 } 720 721 DataTypeValue Dt_size_10_Decode(uint32_t value) { 722 switch (value) { 723 case 0x0: 724 return I8; 725 case 0x1: 726 return I16; 727 case 0x2: 728 return I32; 729 } 730 return kDataTypeValueInvalid; 731 } 732 733 DataTypeValue Dt_size_11_Decode(uint32_t value, uint32_t type_value) { 734 switch (value) { 735 case 0x1: 736 switch (type_value) { 737 case 0x0: 738 return S16; 739 case 0x1: 740 return U16; 741 } 742 break; 743 case 0x2: 744 switch (type_value) { 745 case 0x0: 746 return S32; 747 case 0x1: 748 return U32; 749 } 750 break; 751 } 752 return kDataTypeValueInvalid; 753 } 754 755 DataTypeValue Dt_size_12_Decode(uint32_t value, uint32_t type_value) { 756 switch (value) { 757 case 0x0: 758 switch (type_value) { 759 case 0x0: 760 return S8; 761 case 0x1: 762 return U8; 763 } 764 break; 765 case 0x1: 766 switch (type_value) { 767 case 0x0: 768 return S16; 769 case 0x1: 770 return U16; 771 } 772 break; 773 case 0x2: 774 switch (type_value) { 775 case 0x0: 776 return S32; 777 case 0x1: 778 return U32; 779 } 780 break; 781 } 782 return kDataTypeValueInvalid; 783 } 784 785 DataTypeValue Dt_size_13_Decode(uint32_t value) { 786 switch (value) { 787 case 0x1: 788 return S16; 789 case 0x2: 790 return S32; 791 } 792 return kDataTypeValueInvalid; 793 } 794 795 DataTypeValue Dt_size_14_Decode(uint32_t value) { 796 switch (value) { 797 case 0x0: 798 return S16; 799 case 0x1: 800 return S32; 801 case 0x2: 802 return S64; 803 } 804 return kDataTypeValueInvalid; 805 } 806 807 DataTypeValue Dt_size_15_Decode(uint32_t value) { 808 switch (value) { 809 case 0x0: 810 return Untyped8; 811 case 0x1: 812 return Untyped16; 813 } 814 return kDataTypeValueInvalid; 815 } 816 817 DataTypeValue Dt_size_16_Decode(uint32_t value) { 818 switch (value) { 819 case 0x2: 820 return F32; 821 } 822 return kDataTypeValueInvalid; 823 } 824 825 DataTypeValue Dt_size_17_Decode(uint32_t value) { 826 switch (value) { 827 case 0x0: 828 return I8; 829 case 0x1: 830 return I16; 831 case 0x2: 832 return I32; 833 } 834 return kDataTypeValueInvalid; 835 } 836 837 DecodeNeon Index_1_Decode(uint32_t value, DataType dt) { 838 switch (dt.GetValue()) { 839 case Untyped8: { 840 int lane = (value >> 1) & 0x7; 841 if ((value & 1) != 0) break; 842 SpacingType spacing = kSingle; 843 return DecodeNeon(lane, spacing); 844 } 845 case Untyped16: { 846 int lane = (value >> 2) & 0x3; 847 if ((value & 1) != 0) break; 848 SpacingType spacing = ((value & 3) == 2) ? kDouble : kSingle; 849 return DecodeNeon(lane, spacing); 850 } 851 case Untyped32: { 852 int lane = (value >> 3) & 0x1; 853 if ((value & 3) != 0) break; 854 SpacingType spacing = ((value & 7) == 4) ? kDouble : kSingle; 855 return DecodeNeon(lane, spacing); 856 } 857 default: 858 break; 859 } 860 return DecodeNeon(); 861 } 862 863 DecodeNeonAndAlign Align_index_align_1_Decode(uint32_t value, DataType dt) { 864 switch (dt.GetValue()) { 865 case Untyped8: { 866 AlignmentType align; 867 if ((value & 1) == 0) { 868 align = kNoAlignment; 869 } else { 870 break; 871 } 872 int lane = (value >> 1) & 0x7; 873 SpacingType spacing = kSingle; 874 return DecodeNeonAndAlign(lane, spacing, align); 875 } 876 case Untyped16: { 877 AlignmentType align; 878 if ((value & 3) == 1) { 879 align = k16BitAlign; 880 } else if ((value & 3) == 0) { 881 align = kNoAlignment; 882 } else { 883 break; 884 } 885 int lane = (value >> 2) & 0x3; 886 SpacingType spacing = kSingle; 887 return DecodeNeonAndAlign(lane, spacing, align); 888 } 889 case Untyped32: { 890 AlignmentType align; 891 if ((value & 7) == 3) { 892 align = k32BitAlign; 893 } else if ((value & 7) == 0) { 894 align = kNoAlignment; 895 } else { 896 break; 897 } 898 int lane = (value >> 3) & 0x1; 899 SpacingType spacing = kSingle; 900 return DecodeNeonAndAlign(lane, spacing, align); 901 } 902 default: 903 break; 904 } 905 return DecodeNeonAndAlign(); 906 } 907 908 DecodeNeonAndAlign Align_index_align_2_Decode(uint32_t value, DataType dt) { 909 switch (dt.GetValue()) { 910 case Untyped8: { 911 AlignmentType align; 912 if ((value & 1) == 1) { 913 align = k16BitAlign; 914 } else if ((value & 1) == 0) { 915 align = kNoAlignment; 916 } else { 917 break; 918 } 919 int lane = (value >> 1) & 0x7; 920 SpacingType spacing = kSingle; 921 return DecodeNeonAndAlign(lane, spacing, align); 922 } 923 case Untyped16: { 924 AlignmentType align; 925 if ((value & 1) == 1) { 926 align = k32BitAlign; 927 } else if ((value & 1) == 0) { 928 align = kNoAlignment; 929 } else { 930 break; 931 } 932 int lane = (value >> 2) & 0x3; 933 SpacingType spacing = ((value & 2) == 2) ? kDouble : kSingle; 934 return DecodeNeonAndAlign(lane, spacing, align); 935 } 936 case Untyped32: { 937 AlignmentType align; 938 if ((value & 3) == 1) { 939 align = k64BitAlign; 940 } else if ((value & 3) == 0) { 941 align = kNoAlignment; 942 } else { 943 break; 944 } 945 int lane = (value >> 3) & 0x1; 946 SpacingType spacing = ((value & 4) == 4) ? kDouble : kSingle; 947 return DecodeNeonAndAlign(lane, spacing, align); 948 } 949 default: 950 break; 951 } 952 return DecodeNeonAndAlign(); 953 } 954 955 DecodeNeonAndAlign Align_index_align_3_Decode(uint32_t value, DataType dt) { 956 switch (dt.GetValue()) { 957 case Untyped8: { 958 AlignmentType align; 959 if ((value & 1) == 1) { 960 align = k32BitAlign; 961 } else if ((value & 1) == 0) { 962 align = kNoAlignment; 963 } else { 964 break; 965 } 966 int lane = (value >> 1) & 0x7; 967 SpacingType spacing = kSingle; 968 return DecodeNeonAndAlign(lane, spacing, align); 969 } 970 case Untyped16: { 971 AlignmentType align; 972 if ((value & 1) == 1) { 973 align = k64BitAlign; 974 } else if ((value & 1) == 0) { 975 align = kNoAlignment; 976 } else { 977 break; 978 } 979 int lane = (value >> 2) & 0x3; 980 SpacingType spacing = ((value & 2) == 2) ? kDouble : kSingle; 981 return DecodeNeonAndAlign(lane, spacing, align); 982 } 983 case Untyped32: { 984 AlignmentType align; 985 if ((value & 3) == 1) { 986 align = k64BitAlign; 987 } else if ((value & 3) == 2) { 988 align = k128BitAlign; 989 } else if ((value & 3) == 0) { 990 align = kNoAlignment; 991 } else { 992 break; 993 } 994 int lane = (value >> 3) & 0x1; 995 SpacingType spacing = ((value & 4) == 4) ? kDouble : kSingle; 996 return DecodeNeonAndAlign(lane, spacing, align); 997 } 998 default: 999 break; 1000 } 1001 return DecodeNeonAndAlign(); 1002 } 1003 1004 Alignment Align_a_1_Decode(uint32_t value, DataType dt) { 1005 switch (value) { 1006 case 0: 1007 return kNoAlignment; 1008 case 1: 1009 if (dt.Is(Untyped16)) return k16BitAlign; 1010 if (dt.Is(Untyped32)) return k32BitAlign; 1011 break; 1012 default: 1013 break; 1014 } 1015 return kBadAlignment; 1016 } 1017 1018 Alignment Align_a_2_Decode(uint32_t value, DataType dt) { 1019 switch (value) { 1020 case 0: 1021 return kNoAlignment; 1022 case 1: 1023 if (dt.Is(Untyped8)) return k16BitAlign; 1024 if (dt.Is(Untyped16)) return k32BitAlign; 1025 if (dt.Is(Untyped32)) return k64BitAlign; 1026 break; 1027 default: 1028 break; 1029 } 1030 return kBadAlignment; 1031 } 1032 1033 Alignment Align_a_3_Decode(uint32_t value, DataType dt, uint32_t size) { 1034 switch (value) { 1035 case 0: 1036 if (size != 3) return kNoAlignment; 1037 break; 1038 case 1: 1039 if (dt.Is(Untyped8)) return k32BitAlign; 1040 if (dt.Is(Untyped16)) return k64BitAlign; 1041 if (size == 2) return k64BitAlign; 1042 if (size == 3) return k128BitAlign; 1043 break; 1044 default: 1045 break; 1046 } 1047 return kBadAlignment; 1048 } 1049 1050 Alignment Align_align_1_Decode(uint32_t value) { 1051 switch (value) { 1052 case 0: 1053 return kNoAlignment; 1054 case 1: 1055 return k64BitAlign; 1056 case 2: 1057 return k128BitAlign; 1058 case 3: 1059 return k256BitAlign; 1060 default: 1061 break; 1062 } 1063 return kBadAlignment; 1064 } 1065 1066 Alignment Align_align_2_Decode(uint32_t value) { 1067 switch (value) { 1068 case 0: 1069 return kNoAlignment; 1070 case 1: 1071 return k64BitAlign; 1072 case 2: 1073 return k128BitAlign; 1074 case 3: 1075 return k256BitAlign; 1076 default: 1077 break; 1078 } 1079 return kBadAlignment; 1080 } 1081 1082 Alignment Align_align_3_Decode(uint32_t value) { 1083 switch (value) { 1084 case 0: 1085 return kNoAlignment; 1086 case 1: 1087 return k64BitAlign; 1088 default: 1089 break; 1090 } 1091 return kBadAlignment; 1092 } 1093 1094 Alignment Align_align_4_Decode(uint32_t value) { 1095 switch (value) { 1096 case 0: 1097 return kNoAlignment; 1098 case 1: 1099 return k64BitAlign; 1100 case 2: 1101 return k128BitAlign; 1102 case 3: 1103 return k256BitAlign; 1104 default: 1105 break; 1106 } 1107 return kBadAlignment; 1108 } 1109 1110 Alignment Align_align_5_Decode(uint32_t value) { 1111 switch (value) { 1112 case 0: 1113 return kNoAlignment; 1114 case 1: 1115 return k64BitAlign; 1116 case 2: 1117 return k128BitAlign; 1118 case 3: 1119 return k256BitAlign; 1120 default: 1121 break; 1122 } 1123 return kBadAlignment; 1124 } 1125 1126 1127 void Disassembler::adc(Condition cond, 1128 EncodingSize size, 1129 Register rd, 1130 Register rn, 1131 const Operand& operand) { 1132 os().SetCurrentInstruction(kAdc, kArithmetic); 1133 os() << ToCString(kAdc) << ConditionPrinter(it_block_, cond) << size; 1134 os() << " "; 1135 if (!rd.Is(rn) || !use_short_hand_form_) { 1136 os() << rd << ", "; 1137 } 1138 os() << rn << ", " << operand; 1139 } 1140 1141 void Disassembler::adcs(Condition cond, 1142 EncodingSize size, 1143 Register rd, 1144 Register rn, 1145 const Operand& operand) { 1146 os().SetCurrentInstruction(kAdcs, kArithmetic); 1147 os() << ToCString(kAdcs) << ConditionPrinter(it_block_, cond) << size; 1148 os() << " "; 1149 if (!rd.Is(rn) || !use_short_hand_form_) { 1150 os() << rd << ", "; 1151 } 1152 os() << rn << ", " << operand; 1153 } 1154 1155 void Disassembler::add(Condition cond, 1156 EncodingSize size, 1157 Register rd, 1158 Register rn, 1159 const Operand& operand) { 1160 os().SetCurrentInstruction(kAdd, kArithmetic); 1161 os() << ToCString(kAdd) << ConditionPrinter(it_block_, cond) << size; 1162 os() << " "; 1163 if (!rd.Is(rn) || !use_short_hand_form_) { 1164 os() << rd << ", "; 1165 } 1166 os() << rn << ", " << operand; 1167 } 1168 1169 void Disassembler::add(Condition cond, Register rd, const Operand& operand) { 1170 os().SetCurrentInstruction(kAdd, kArithmetic); 1171 os() << ToCString(kAdd) << ConditionPrinter(it_block_, cond) << " " << rd 1172 << ", " << operand; 1173 } 1174 1175 void Disassembler::adds(Condition cond, 1176 EncodingSize size, 1177 Register rd, 1178 Register rn, 1179 const Operand& operand) { 1180 os().SetCurrentInstruction(kAdds, kArithmetic); 1181 os() << ToCString(kAdds) << ConditionPrinter(it_block_, cond) << size; 1182 os() << " "; 1183 if (!rd.Is(rn) || !use_short_hand_form_) { 1184 os() << rd << ", "; 1185 } 1186 os() << rn << ", " << operand; 1187 } 1188 1189 void Disassembler::adds(Register rd, const Operand& operand) { 1190 os().SetCurrentInstruction(kAdds, kArithmetic); 1191 os() << ToCString(kAdds) << " " << rd << ", " << operand; 1192 } 1193 1194 void Disassembler::addw(Condition cond, 1195 Register rd, 1196 Register rn, 1197 const Operand& operand) { 1198 os().SetCurrentInstruction(kAddw, kArithmetic); 1199 os() << ToCString(kAddw) << ConditionPrinter(it_block_, cond); 1200 os() << " "; 1201 if (!rd.Is(rn) || !use_short_hand_form_) { 1202 os() << rd << ", "; 1203 } 1204 os() << rn << ", " << operand; 1205 } 1206 1207 void Disassembler::adr(Condition cond, 1208 EncodingSize size, 1209 Register rd, 1210 Location* location) { 1211 os().SetCurrentInstruction(kAdr, kAddress); 1212 os() << ToCString(kAdr) << ConditionPrinter(it_block_, cond) << size << " " 1213 << rd << ", " 1214 << PrintLabel(kAnyLocation, location, GetCodeAddress() & ~3); 1215 } 1216 1217 void Disassembler::and_(Condition cond, 1218 EncodingSize size, 1219 Register rd, 1220 Register rn, 1221 const Operand& operand) { 1222 os().SetCurrentInstruction(kAnd, kBitwise); 1223 os() << ToCString(kAnd) << ConditionPrinter(it_block_, cond) << size; 1224 os() << " "; 1225 if (!rd.Is(rn) || !use_short_hand_form_) { 1226 os() << rd << ", "; 1227 } 1228 os() << rn << ", " << operand; 1229 } 1230 1231 void Disassembler::ands(Condition cond, 1232 EncodingSize size, 1233 Register rd, 1234 Register rn, 1235 const Operand& operand) { 1236 os().SetCurrentInstruction(kAnds, kBitwise); 1237 os() << ToCString(kAnds) << ConditionPrinter(it_block_, cond) << size; 1238 os() << " "; 1239 if (!rd.Is(rn) || !use_short_hand_form_) { 1240 os() << rd << ", "; 1241 } 1242 os() << rn << ", " << operand; 1243 } 1244 1245 void Disassembler::asr(Condition cond, 1246 EncodingSize size, 1247 Register rd, 1248 Register rm, 1249 const Operand& operand) { 1250 os().SetCurrentInstruction(kAsr, kShift); 1251 os() << ToCString(kAsr) << ConditionPrinter(it_block_, cond) << size; 1252 os() << " "; 1253 if (!rd.Is(rm) || !use_short_hand_form_) { 1254 os() << rd << ", "; 1255 } 1256 os() << rm << ", " << operand; 1257 } 1258 1259 void Disassembler::asrs(Condition cond, 1260 EncodingSize size, 1261 Register rd, 1262 Register rm, 1263 const Operand& operand) { 1264 os().SetCurrentInstruction(kAsrs, kShift); 1265 os() << ToCString(kAsrs) << ConditionPrinter(it_block_, cond) << size; 1266 os() << " "; 1267 if (!rd.Is(rm) || !use_short_hand_form_) { 1268 os() << rd << ", "; 1269 } 1270 os() << rm << ", " << operand; 1271 } 1272 1273 void Disassembler::b(Condition cond, EncodingSize size, Location* location) { 1274 os().SetCurrentInstruction(kB, kAddress | kBranch); 1275 os() << ToCString(kB) << ConditionPrinter(it_block_, cond) << size << " " 1276 << PrintLabel(kCodeLocation, location, GetCodeAddress()); 1277 } 1278 1279 void Disassembler::bfc(Condition cond, 1280 Register rd, 1281 uint32_t lsb, 1282 uint32_t width) { 1283 os().SetCurrentInstruction(kBfc, kShift); 1284 os() << ToCString(kBfc) << ConditionPrinter(it_block_, cond) << " " << rd 1285 << ", " << ImmediatePrinter(lsb) << ", " << ImmediatePrinter(width); 1286 } 1287 1288 void Disassembler::bfi( 1289 Condition cond, Register rd, Register rn, uint32_t lsb, uint32_t width) { 1290 os().SetCurrentInstruction(kBfi, kShift); 1291 os() << ToCString(kBfi) << ConditionPrinter(it_block_, cond) << " " << rd 1292 << ", " << rn << ", " << ImmediatePrinter(lsb) << ", " 1293 << ImmediatePrinter(width); 1294 } 1295 1296 void Disassembler::bic(Condition cond, 1297 EncodingSize size, 1298 Register rd, 1299 Register rn, 1300 const Operand& operand) { 1301 os().SetCurrentInstruction(kBic, kBitwise); 1302 os() << ToCString(kBic) << ConditionPrinter(it_block_, cond) << size; 1303 os() << " "; 1304 if (!rd.Is(rn) || !use_short_hand_form_) { 1305 os() << rd << ", "; 1306 } 1307 os() << rn << ", " << operand; 1308 } 1309 1310 void Disassembler::bics(Condition cond, 1311 EncodingSize size, 1312 Register rd, 1313 Register rn, 1314 const Operand& operand) { 1315 os().SetCurrentInstruction(kBics, kBitwise); 1316 os() << ToCString(kBics) << ConditionPrinter(it_block_, cond) << size; 1317 os() << " "; 1318 if (!rd.Is(rn) || !use_short_hand_form_) { 1319 os() << rd << ", "; 1320 } 1321 os() << rn << ", " << operand; 1322 } 1323 1324 void Disassembler::bkpt(Condition cond, uint32_t imm) { 1325 os().SetCurrentInstruction(kBkpt, kSystem); 1326 os() << ToCString(kBkpt) << ConditionPrinter(it_block_, cond) << " " 1327 << RawImmediatePrinter(imm); 1328 } 1329 1330 void Disassembler::bl(Condition cond, Location* location) { 1331 os().SetCurrentInstruction(kBl, kAddress | kBranch); 1332 os() << ToCString(kBl) << ConditionPrinter(it_block_, cond) << " " 1333 << PrintLabel(kCodeLocation, location, GetCodeAddress()); 1334 } 1335 1336 void Disassembler::blx(Condition cond, Location* location) { 1337 os().SetCurrentInstruction(kBlx, kAddress | kBranch); 1338 os() << ToCString(kBlx) << ConditionPrinter(it_block_, cond) << " " 1339 << PrintLabel(kCodeLocation, location, GetCodeAddress() & ~3); 1340 } 1341 1342 void Disassembler::blx(Condition cond, Register rm) { 1343 os().SetCurrentInstruction(kBlx, kAddress | kBranch); 1344 os() << ToCString(kBlx) << ConditionPrinter(it_block_, cond) << " " << rm; 1345 } 1346 1347 void Disassembler::bx(Condition cond, Register rm) { 1348 os().SetCurrentInstruction(kBx, kAddress | kBranch); 1349 os() << ToCString(kBx) << ConditionPrinter(it_block_, cond) << " " << rm; 1350 } 1351 1352 void Disassembler::bxj(Condition cond, Register rm) { 1353 os().SetCurrentInstruction(kBxj, kAddress | kBranch); 1354 os() << ToCString(kBxj) << ConditionPrinter(it_block_, cond) << " " << rm; 1355 } 1356 1357 void Disassembler::cbnz(Register rn, Location* location) { 1358 os().SetCurrentInstruction(kCbnz, kAddress | kBranch); 1359 os() << ToCString(kCbnz) << " " << rn << ", " 1360 << PrintLabel(kCodeLocation, location, GetCodeAddress()); 1361 } 1362 1363 void Disassembler::cbz(Register rn, Location* location) { 1364 os().SetCurrentInstruction(kCbz, kAddress | kBranch); 1365 os() << ToCString(kCbz) << " " << rn << ", " 1366 << PrintLabel(kCodeLocation, location, GetCodeAddress()); 1367 } 1368 1369 void Disassembler::clrex(Condition cond) { 1370 os().SetCurrentInstruction(kClrex, kNoAttribute); 1371 os() << ToCString(kClrex) << ConditionPrinter(it_block_, cond); 1372 } 1373 1374 void Disassembler::clz(Condition cond, Register rd, Register rm) { 1375 os().SetCurrentInstruction(kClz, kNoAttribute); 1376 os() << ToCString(kClz) << ConditionPrinter(it_block_, cond) << " " << rd 1377 << ", " << rm; 1378 } 1379 1380 void Disassembler::cmn(Condition cond, 1381 EncodingSize size, 1382 Register rn, 1383 const Operand& operand) { 1384 os().SetCurrentInstruction(kCmn, kArithmetic); 1385 os() << ToCString(kCmn) << ConditionPrinter(it_block_, cond) << size << " " 1386 << rn << ", " << operand; 1387 } 1388 1389 void Disassembler::cmp(Condition cond, 1390 EncodingSize size, 1391 Register rn, 1392 const Operand& operand) { 1393 os().SetCurrentInstruction(kCmp, kArithmetic); 1394 os() << ToCString(kCmp) << ConditionPrinter(it_block_, cond) << size << " " 1395 << rn << ", " << operand; 1396 } 1397 1398 void Disassembler::crc32b(Condition cond, 1399 Register rd, 1400 Register rn, 1401 Register rm) { 1402 os().SetCurrentInstruction(kCrc32b, kNoAttribute); 1403 os() << ToCString(kCrc32b) << ConditionPrinter(it_block_, cond) << " " << rd 1404 << ", " << rn << ", " << rm; 1405 } 1406 1407 void Disassembler::crc32cb(Condition cond, 1408 Register rd, 1409 Register rn, 1410 Register rm) { 1411 os().SetCurrentInstruction(kCrc32cb, kNoAttribute); 1412 os() << ToCString(kCrc32cb) << ConditionPrinter(it_block_, cond) << " " << rd 1413 << ", " << rn << ", " << rm; 1414 } 1415 1416 void Disassembler::crc32ch(Condition cond, 1417 Register rd, 1418 Register rn, 1419 Register rm) { 1420 os().SetCurrentInstruction(kCrc32ch, kNoAttribute); 1421 os() << ToCString(kCrc32ch) << ConditionPrinter(it_block_, cond) << " " << rd 1422 << ", " << rn << ", " << rm; 1423 } 1424 1425 void Disassembler::crc32cw(Condition cond, 1426 Register rd, 1427 Register rn, 1428 Register rm) { 1429 os().SetCurrentInstruction(kCrc32cw, kNoAttribute); 1430 os() << ToCString(kCrc32cw) << ConditionPrinter(it_block_, cond) << " " << rd 1431 << ", " << rn << ", " << rm; 1432 } 1433 1434 void Disassembler::crc32h(Condition cond, 1435 Register rd, 1436 Register rn, 1437 Register rm) { 1438 os().SetCurrentInstruction(kCrc32h, kNoAttribute); 1439 os() << ToCString(kCrc32h) << ConditionPrinter(it_block_, cond) << " " << rd 1440 << ", " << rn << ", " << rm; 1441 } 1442 1443 void Disassembler::crc32w(Condition cond, 1444 Register rd, 1445 Register rn, 1446 Register rm) { 1447 os().SetCurrentInstruction(kCrc32w, kNoAttribute); 1448 os() << ToCString(kCrc32w) << ConditionPrinter(it_block_, cond) << " " << rd 1449 << ", " << rn << ", " << rm; 1450 } 1451 1452 void Disassembler::dmb(Condition cond, MemoryBarrier option) { 1453 os().SetCurrentInstruction(kDmb, kNoAttribute); 1454 os() << ToCString(kDmb) << ConditionPrinter(it_block_, cond) << " " << option; 1455 } 1456 1457 void Disassembler::dsb(Condition cond, MemoryBarrier option) { 1458 os().SetCurrentInstruction(kDsb, kNoAttribute); 1459 os() << ToCString(kDsb) << ConditionPrinter(it_block_, cond) << " " << option; 1460 } 1461 1462 void Disassembler::eor(Condition cond, 1463 EncodingSize size, 1464 Register rd, 1465 Register rn, 1466 const Operand& operand) { 1467 os().SetCurrentInstruction(kEor, kBitwise); 1468 os() << ToCString(kEor) << ConditionPrinter(it_block_, cond) << size; 1469 os() << " "; 1470 if (!rd.Is(rn) || !use_short_hand_form_) { 1471 os() << rd << ", "; 1472 } 1473 os() << rn << ", " << operand; 1474 } 1475 1476 void Disassembler::eors(Condition cond, 1477 EncodingSize size, 1478 Register rd, 1479 Register rn, 1480 const Operand& operand) { 1481 os().SetCurrentInstruction(kEors, kBitwise); 1482 os() << ToCString(kEors) << ConditionPrinter(it_block_, cond) << size; 1483 os() << " "; 1484 if (!rd.Is(rn) || !use_short_hand_form_) { 1485 os() << rd << ", "; 1486 } 1487 os() << rn << ", " << operand; 1488 } 1489 1490 void Disassembler::fldmdbx(Condition cond, 1491 Register rn, 1492 WriteBack write_back, 1493 DRegisterList dreglist) { 1494 os().SetCurrentInstruction(kFldmdbx, 1495 kLoadStore | kLoadStoreMultiple | kFpNeon); 1496 os() << ToCString(kFldmdbx) << ConditionPrinter(it_block_, cond) << " " << rn 1497 << write_back << ", " << dreglist; 1498 } 1499 1500 void Disassembler::fldmiax(Condition cond, 1501 Register rn, 1502 WriteBack write_back, 1503 DRegisterList dreglist) { 1504 os().SetCurrentInstruction(kFldmiax, 1505 kLoadStore | kLoadStoreMultiple | kFpNeon); 1506 os() << ToCString(kFldmiax) << ConditionPrinter(it_block_, cond) << " " << rn 1507 << write_back << ", " << dreglist; 1508 } 1509 1510 void Disassembler::fstmdbx(Condition cond, 1511 Register rn, 1512 WriteBack write_back, 1513 DRegisterList dreglist) { 1514 os().SetCurrentInstruction(kFstmdbx, 1515 kLoadStore | kLoadStoreMultiple | kFpNeon); 1516 os() << ToCString(kFstmdbx) << ConditionPrinter(it_block_, cond) << " " << rn 1517 << write_back << ", " << dreglist; 1518 } 1519 1520 void Disassembler::fstmiax(Condition cond, 1521 Register rn, 1522 WriteBack write_back, 1523 DRegisterList dreglist) { 1524 os().SetCurrentInstruction(kFstmiax, 1525 kLoadStore | kLoadStoreMultiple | kFpNeon); 1526 os() << ToCString(kFstmiax) << ConditionPrinter(it_block_, cond) << " " << rn 1527 << write_back << ", " << dreglist; 1528 } 1529 1530 void Disassembler::hlt(Condition cond, uint32_t imm) { 1531 os().SetCurrentInstruction(kHlt, kSystem); 1532 os() << ToCString(kHlt) << ConditionPrinter(it_block_, cond) << " " 1533 << RawImmediatePrinter(imm); 1534 } 1535 1536 void Disassembler::hvc(Condition cond, uint32_t imm) { 1537 os().SetCurrentInstruction(kHvc, kSystem); 1538 os() << ToCString(kHvc) << ConditionPrinter(it_block_, cond) << " " 1539 << RawImmediatePrinter(imm); 1540 } 1541 1542 void Disassembler::isb(Condition cond, MemoryBarrier option) { 1543 os().SetCurrentInstruction(kIsb, kNoAttribute); 1544 os() << ToCString(kIsb) << ConditionPrinter(it_block_, cond) << " " << option; 1545 } 1546 1547 void Disassembler::it(Condition cond, uint16_t mask) { 1548 os().SetCurrentInstruction(kIt, kNoAttribute); 1549 os() << ToCString(kIt); 1550 int count; 1551 if ((mask & 0x1) != 0) { 1552 count = 3; 1553 } else if ((mask & 0x2) != 0) { 1554 count = 2; 1555 } else if ((mask & 0x4) != 0) { 1556 count = 1; 1557 } else { 1558 count = 0; 1559 } 1560 uint16_t tmp = 0x8; 1561 uint16_t ref = (cond.GetCondition() & 0x1) << 3; 1562 while (count-- > 0) { 1563 os() << (((mask & tmp) == ref) ? "t" : "e"); 1564 tmp >>= 1; 1565 ref >>= 1; 1566 } 1567 if (cond.Is(al)) { 1568 os() << " al"; 1569 } else { 1570 os() << " " << cond; 1571 } 1572 } 1573 1574 void Disassembler::lda(Condition cond, Register rt, const MemOperand& operand) { 1575 os().SetCurrentInstruction(kLda, kAddress | kLoadStore); 1576 os() << ToCString(kLda) << ConditionPrinter(it_block_, cond) << " " << rt 1577 << ", " << PrintMemOperand(kLoadWordLocation, operand); 1578 } 1579 1580 void Disassembler::ldab(Condition cond, 1581 Register rt, 1582 const MemOperand& operand) { 1583 os().SetCurrentInstruction(kLdab, kAddress | kLoadStore); 1584 os() << ToCString(kLdab) << ConditionPrinter(it_block_, cond) << " " << rt 1585 << ", " << PrintMemOperand(kLoadByteLocation, operand); 1586 } 1587 1588 void Disassembler::ldaex(Condition cond, 1589 Register rt, 1590 const MemOperand& operand) { 1591 os().SetCurrentInstruction(kLdaex, kAddress | kLoadStore); 1592 os() << ToCString(kLdaex) << ConditionPrinter(it_block_, cond) << " " << rt 1593 << ", " << PrintMemOperand(kLoadWordLocation, operand); 1594 } 1595 1596 void Disassembler::ldaexb(Condition cond, 1597 Register rt, 1598 const MemOperand& operand) { 1599 os().SetCurrentInstruction(kLdaexb, kAddress | kLoadStore); 1600 os() << ToCString(kLdaexb) << ConditionPrinter(it_block_, cond) << " " << rt 1601 << ", " << PrintMemOperand(kLoadByteLocation, operand); 1602 } 1603 1604 void Disassembler::ldaexd(Condition cond, 1605 Register rt, 1606 Register rt2, 1607 const MemOperand& operand) { 1608 os().SetCurrentInstruction(kLdaexd, kAddress | kLoadStore); 1609 os() << ToCString(kLdaexd) << ConditionPrinter(it_block_, cond) << " " << rt 1610 << ", " << rt2 << ", " 1611 << PrintMemOperand(kLoadDoubleWordLocation, operand); 1612 } 1613 1614 void Disassembler::ldaexh(Condition cond, 1615 Register rt, 1616 const MemOperand& operand) { 1617 os().SetCurrentInstruction(kLdaexh, kAddress | kLoadStore); 1618 os() << ToCString(kLdaexh) << ConditionPrinter(it_block_, cond) << " " << rt 1619 << ", " << PrintMemOperand(kLoadHalfWordLocation, operand); 1620 } 1621 1622 void Disassembler::ldah(Condition cond, 1623 Register rt, 1624 const MemOperand& operand) { 1625 os().SetCurrentInstruction(kLdah, kAddress | kLoadStore); 1626 os() << ToCString(kLdah) << ConditionPrinter(it_block_, cond) << " " << rt 1627 << ", " << PrintMemOperand(kLoadHalfWordLocation, operand); 1628 } 1629 1630 void Disassembler::ldm(Condition cond, 1631 EncodingSize size, 1632 Register rn, 1633 WriteBack write_back, 1634 RegisterList registers) { 1635 os().SetCurrentInstruction(kLdm, kLoadStore | kLoadStoreMultiple); 1636 os() << ToCString(kLdm) << ConditionPrinter(it_block_, cond) << size << " " 1637 << rn << write_back << ", " << registers; 1638 } 1639 1640 void Disassembler::ldmda(Condition cond, 1641 Register rn, 1642 WriteBack write_back, 1643 RegisterList registers) { 1644 os().SetCurrentInstruction(kLdmda, kLoadStore | kLoadStoreMultiple); 1645 os() << ToCString(kLdmda) << ConditionPrinter(it_block_, cond) << " " << rn 1646 << write_back << ", " << registers; 1647 } 1648 1649 void Disassembler::ldmdb(Condition cond, 1650 Register rn, 1651 WriteBack write_back, 1652 RegisterList registers) { 1653 os().SetCurrentInstruction(kLdmdb, kLoadStore | kLoadStoreMultiple); 1654 os() << ToCString(kLdmdb) << ConditionPrinter(it_block_, cond) << " " << rn 1655 << write_back << ", " << registers; 1656 } 1657 1658 void Disassembler::ldmea(Condition cond, 1659 Register rn, 1660 WriteBack write_back, 1661 RegisterList registers) { 1662 os().SetCurrentInstruction(kLdmea, kLoadStore | kLoadStoreMultiple); 1663 os() << ToCString(kLdmea) << ConditionPrinter(it_block_, cond) << " " << rn 1664 << write_back << ", " << registers; 1665 } 1666 1667 void Disassembler::ldmed(Condition cond, 1668 Register rn, 1669 WriteBack write_back, 1670 RegisterList registers) { 1671 os().SetCurrentInstruction(kLdmed, kLoadStore | kLoadStoreMultiple); 1672 os() << ToCString(kLdmed) << ConditionPrinter(it_block_, cond) << " " << rn 1673 << write_back << ", " << registers; 1674 } 1675 1676 void Disassembler::ldmfa(Condition cond, 1677 Register rn, 1678 WriteBack write_back, 1679 RegisterList registers) { 1680 os().SetCurrentInstruction(kLdmfa, kLoadStore | kLoadStoreMultiple); 1681 os() << ToCString(kLdmfa) << ConditionPrinter(it_block_, cond) << " " << rn 1682 << write_back << ", " << registers; 1683 } 1684 1685 void Disassembler::ldmfd(Condition cond, 1686 EncodingSize size, 1687 Register rn, 1688 WriteBack write_back, 1689 RegisterList registers) { 1690 os().SetCurrentInstruction(kLdmfd, kLoadStore | kLoadStoreMultiple); 1691 os() << ToCString(kLdmfd) << ConditionPrinter(it_block_, cond) << size << " " 1692 << rn << write_back << ", " << registers; 1693 } 1694 1695 void Disassembler::ldmib(Condition cond, 1696 Register rn, 1697 WriteBack write_back, 1698 RegisterList registers) { 1699 os().SetCurrentInstruction(kLdmib, kLoadStore | kLoadStoreMultiple); 1700 os() << ToCString(kLdmib) << ConditionPrinter(it_block_, cond) << " " << rn 1701 << write_back << ", " << registers; 1702 } 1703 1704 void Disassembler::ldr(Condition cond, 1705 EncodingSize size, 1706 Register rt, 1707 const MemOperand& operand) { 1708 os().SetCurrentInstruction(kLdr, kAddress | kLoadStore); 1709 os() << ToCString(kLdr) << ConditionPrinter(it_block_, cond) << size << " " 1710 << rt << ", " << PrintMemOperand(kLoadWordLocation, operand); 1711 } 1712 1713 void Disassembler::ldr(Condition cond, 1714 EncodingSize size, 1715 Register rt, 1716 Location* location) { 1717 os().SetCurrentInstruction(kLdr, kAddress | kLoadStore); 1718 os() << ToCString(kLdr) << ConditionPrinter(it_block_, cond) << size << " " 1719 << rt << ", " 1720 << PrintLabel(kLoadWordLocation, location, GetCodeAddress() & ~3); 1721 } 1722 1723 void Disassembler::ldrb(Condition cond, 1724 EncodingSize size, 1725 Register rt, 1726 const MemOperand& operand) { 1727 os().SetCurrentInstruction(kLdrb, kAddress | kLoadStore); 1728 os() << ToCString(kLdrb) << ConditionPrinter(it_block_, cond) << size << " " 1729 << rt << ", " << PrintMemOperand(kLoadByteLocation, operand); 1730 } 1731 1732 void Disassembler::ldrb(Condition cond, Register rt, Location* location) { 1733 os().SetCurrentInstruction(kLdrb, kAddress | kLoadStore); 1734 os() << ToCString(kLdrb) << ConditionPrinter(it_block_, cond) << " " << rt 1735 << ", " 1736 << PrintLabel(kLoadByteLocation, location, GetCodeAddress() & ~3); 1737 } 1738 1739 void Disassembler::ldrd(Condition cond, 1740 Register rt, 1741 Register rt2, 1742 const MemOperand& operand) { 1743 os().SetCurrentInstruction(kLdrd, kAddress | kLoadStore); 1744 os() << ToCString(kLdrd) << ConditionPrinter(it_block_, cond) << " " << rt 1745 << ", " << rt2 << ", " 1746 << PrintMemOperand(kLoadDoubleWordLocation, operand); 1747 } 1748 1749 void Disassembler::ldrd(Condition cond, 1750 Register rt, 1751 Register rt2, 1752 Location* location) { 1753 os().SetCurrentInstruction(kLdrd, kAddress | kLoadStore); 1754 os() << ToCString(kLdrd) << ConditionPrinter(it_block_, cond) << " " << rt 1755 << ", " << rt2 << ", " 1756 << PrintLabel(kLoadDoubleWordLocation, location, GetCodeAddress() & ~3); 1757 } 1758 1759 void Disassembler::ldrex(Condition cond, 1760 Register rt, 1761 const MemOperand& operand) { 1762 os().SetCurrentInstruction(kLdrex, kAddress | kLoadStore); 1763 os() << ToCString(kLdrex) << ConditionPrinter(it_block_, cond) << " " << rt 1764 << ", " << PrintMemOperand(kLoadWordLocation, operand); 1765 } 1766 1767 void Disassembler::ldrexb(Condition cond, 1768 Register rt, 1769 const MemOperand& operand) { 1770 os().SetCurrentInstruction(kLdrexb, kAddress | kLoadStore); 1771 os() << ToCString(kLdrexb) << ConditionPrinter(it_block_, cond) << " " << rt 1772 << ", " << PrintMemOperand(kLoadByteLocation, operand); 1773 } 1774 1775 void Disassembler::ldrexd(Condition cond, 1776 Register rt, 1777 Register rt2, 1778 const MemOperand& operand) { 1779 os().SetCurrentInstruction(kLdrexd, kAddress | kLoadStore); 1780 os() << ToCString(kLdrexd) << ConditionPrinter(it_block_, cond) << " " << rt 1781 << ", " << rt2 << ", " 1782 << PrintMemOperand(kLoadDoubleWordLocation, operand); 1783 } 1784 1785 void Disassembler::ldrexh(Condition cond, 1786 Register rt, 1787 const MemOperand& operand) { 1788 os().SetCurrentInstruction(kLdrexh, kAddress | kLoadStore); 1789 os() << ToCString(kLdrexh) << ConditionPrinter(it_block_, cond) << " " << rt 1790 << ", " << PrintMemOperand(kLoadHalfWordLocation, operand); 1791 } 1792 1793 void Disassembler::ldrh(Condition cond, 1794 EncodingSize size, 1795 Register rt, 1796 const MemOperand& operand) { 1797 os().SetCurrentInstruction(kLdrh, kAddress | kLoadStore); 1798 os() << ToCString(kLdrh) << ConditionPrinter(it_block_, cond) << size << " " 1799 << rt << ", " << PrintMemOperand(kLoadHalfWordLocation, operand); 1800 } 1801 1802 void Disassembler::ldrh(Condition cond, Register rt, Location* location) { 1803 os().SetCurrentInstruction(kLdrh, kAddress | kLoadStore); 1804 os() << ToCString(kLdrh) << ConditionPrinter(it_block_, cond) << " " << rt 1805 << ", " 1806 << PrintLabel(kLoadHalfWordLocation, location, GetCodeAddress() & ~3); 1807 } 1808 1809 void Disassembler::ldrsb(Condition cond, 1810 EncodingSize size, 1811 Register rt, 1812 const MemOperand& operand) { 1813 os().SetCurrentInstruction(kLdrsb, kAddress | kLoadStore); 1814 os() << ToCString(kLdrsb) << ConditionPrinter(it_block_, cond) << size << " " 1815 << rt << ", " << PrintMemOperand(kLoadSignedByteLocation, operand); 1816 } 1817 1818 void Disassembler::ldrsb(Condition cond, Register rt, Location* location) { 1819 os().SetCurrentInstruction(kLdrsb, kAddress | kLoadStore); 1820 os() << ToCString(kLdrsb) << ConditionPrinter(it_block_, cond) << " " << rt 1821 << ", " 1822 << PrintLabel(kLoadSignedByteLocation, location, GetCodeAddress() & ~3); 1823 } 1824 1825 void Disassembler::ldrsh(Condition cond, 1826 EncodingSize size, 1827 Register rt, 1828 const MemOperand& operand) { 1829 os().SetCurrentInstruction(kLdrsh, kAddress | kLoadStore); 1830 os() << ToCString(kLdrsh) << ConditionPrinter(it_block_, cond) << size << " " 1831 << rt << ", " << PrintMemOperand(kLoadSignedHalfWordLocation, operand); 1832 } 1833 1834 void Disassembler::ldrsh(Condition cond, Register rt, Location* location) { 1835 os().SetCurrentInstruction(kLdrsh, kAddress | kLoadStore); 1836 os() << ToCString(kLdrsh) << ConditionPrinter(it_block_, cond) << " " << rt 1837 << ", " << PrintLabel(kLoadSignedHalfWordLocation, 1838 location, 1839 GetCodeAddress() & ~3); 1840 } 1841 1842 void Disassembler::lsl(Condition cond, 1843 EncodingSize size, 1844 Register rd, 1845 Register rm, 1846 const Operand& operand) { 1847 os().SetCurrentInstruction(kLsl, kShift); 1848 os() << ToCString(kLsl) << ConditionPrinter(it_block_, cond) << size; 1849 os() << " "; 1850 if (!rd.Is(rm) || !use_short_hand_form_) { 1851 os() << rd << ", "; 1852 } 1853 os() << rm << ", " << operand; 1854 } 1855 1856 void Disassembler::lsls(Condition cond, 1857 EncodingSize size, 1858 Register rd, 1859 Register rm, 1860 const Operand& operand) { 1861 os().SetCurrentInstruction(kLsls, kShift); 1862 os() << ToCString(kLsls) << ConditionPrinter(it_block_, cond) << size; 1863 os() << " "; 1864 if (!rd.Is(rm) || !use_short_hand_form_) { 1865 os() << rd << ", "; 1866 } 1867 os() << rm << ", " << operand; 1868 } 1869 1870 void Disassembler::lsr(Condition cond, 1871 EncodingSize size, 1872 Register rd, 1873 Register rm, 1874 const Operand& operand) { 1875 os().SetCurrentInstruction(kLsr, kShift); 1876 os() << ToCString(kLsr) << ConditionPrinter(it_block_, cond) << size; 1877 os() << " "; 1878 if (!rd.Is(rm) || !use_short_hand_form_) { 1879 os() << rd << ", "; 1880 } 1881 os() << rm << ", " << operand; 1882 } 1883 1884 void Disassembler::lsrs(Condition cond, 1885 EncodingSize size, 1886 Register rd, 1887 Register rm, 1888 const Operand& operand) { 1889 os().SetCurrentInstruction(kLsrs, kShift); 1890 os() << ToCString(kLsrs) << ConditionPrinter(it_block_, cond) << size; 1891 os() << " "; 1892 if (!rd.Is(rm) || !use_short_hand_form_) { 1893 os() << rd << ", "; 1894 } 1895 os() << rm << ", " << operand; 1896 } 1897 1898 void Disassembler::mla( 1899 Condition cond, Register rd, Register rn, Register rm, Register ra) { 1900 os().SetCurrentInstruction(kMla, kArithmetic); 1901 os() << ToCString(kMla) << ConditionPrinter(it_block_, cond) << " " << rd 1902 << ", " << rn << ", " << rm << ", " << ra; 1903 } 1904 1905 void Disassembler::mlas( 1906 Condition cond, Register rd, Register rn, Register rm, Register ra) { 1907 os().SetCurrentInstruction(kMlas, kArithmetic); 1908 os() << ToCString(kMlas) << ConditionPrinter(it_block_, cond) << " " << rd 1909 << ", " << rn << ", " << rm << ", " << ra; 1910 } 1911 1912 void Disassembler::mls( 1913 Condition cond, Register rd, Register rn, Register rm, Register ra) { 1914 os().SetCurrentInstruction(kMls, kArithmetic); 1915 os() << ToCString(kMls) << ConditionPrinter(it_block_, cond) << " " << rd 1916 << ", " << rn << ", " << rm << ", " << ra; 1917 } 1918 1919 void Disassembler::mov(Condition cond, 1920 EncodingSize size, 1921 Register rd, 1922 const Operand& operand) { 1923 os().SetCurrentInstruction(kMov, kNoAttribute); 1924 os() << ToCString(kMov) << ConditionPrinter(it_block_, cond) << size << " " 1925 << rd << ", " << operand; 1926 } 1927 1928 void Disassembler::movs(Condition cond, 1929 EncodingSize size, 1930 Register rd, 1931 const Operand& operand) { 1932 os().SetCurrentInstruction(kMovs, kNoAttribute); 1933 os() << ToCString(kMovs) << ConditionPrinter(it_block_, cond) << size << " " 1934 << rd << ", " << operand; 1935 } 1936 1937 void Disassembler::movt(Condition cond, Register rd, const Operand& operand) { 1938 os().SetCurrentInstruction(kMovt, kNoAttribute); 1939 os() << ToCString(kMovt) << ConditionPrinter(it_block_, cond) << " " << rd 1940 << ", " << operand; 1941 } 1942 1943 void Disassembler::movw(Condition cond, Register rd, const Operand& operand) { 1944 os().SetCurrentInstruction(kMovw, kNoAttribute); 1945 os() << ToCString(kMovw) << ConditionPrinter(it_block_, cond) << " " << rd 1946 << ", " << operand; 1947 } 1948 1949 void Disassembler::mrs(Condition cond, Register rd, SpecialRegister spec_reg) { 1950 os().SetCurrentInstruction(kMrs, kNoAttribute); 1951 os() << ToCString(kMrs) << ConditionPrinter(it_block_, cond) << " " << rd 1952 << ", " << spec_reg; 1953 } 1954 1955 void Disassembler::msr(Condition cond, 1956 MaskedSpecialRegister spec_reg, 1957 const Operand& operand) { 1958 os().SetCurrentInstruction(kMsr, kNoAttribute); 1959 os() << ToCString(kMsr) << ConditionPrinter(it_block_, cond) << " " 1960 << spec_reg << ", " << operand; 1961 } 1962 1963 void Disassembler::mul( 1964 Condition cond, EncodingSize size, Register rd, Register rn, Register rm) { 1965 os().SetCurrentInstruction(kMul, kArithmetic); 1966 os() << ToCString(kMul) << ConditionPrinter(it_block_, cond) << size << " " 1967 << rd << ", " << rn << ", " << rm; 1968 } 1969 1970 void Disassembler::muls(Condition cond, Register rd, Register rn, Register rm) { 1971 os().SetCurrentInstruction(kMuls, kArithmetic); 1972 os() << ToCString(kMuls) << ConditionPrinter(it_block_, cond) << " " << rd 1973 << ", " << rn << ", " << rm; 1974 } 1975 1976 void Disassembler::mvn(Condition cond, 1977 EncodingSize size, 1978 Register rd, 1979 const Operand& operand) { 1980 os().SetCurrentInstruction(kMvn, kNoAttribute); 1981 os() << ToCString(kMvn) << ConditionPrinter(it_block_, cond) << size << " " 1982 << rd << ", " << operand; 1983 } 1984 1985 void Disassembler::mvns(Condition cond, 1986 EncodingSize size, 1987 Register rd, 1988 const Operand& operand) { 1989 os().SetCurrentInstruction(kMvns, kNoAttribute); 1990 os() << ToCString(kMvns) << ConditionPrinter(it_block_, cond) << size << " " 1991 << rd << ", " << operand; 1992 } 1993 1994 void Disassembler::nop(Condition cond, EncodingSize size) { 1995 os().SetCurrentInstruction(kNop, kNoAttribute); 1996 os() << ToCString(kNop) << ConditionPrinter(it_block_, cond) << size; 1997 } 1998 1999 void Disassembler::orn(Condition cond, 2000 Register rd, 2001 Register rn, 2002 const Operand& operand) { 2003 os().SetCurrentInstruction(kOrn, kBitwise); 2004 os() << ToCString(kOrn) << ConditionPrinter(it_block_, cond); 2005 os() << " "; 2006 if (!rd.Is(rn) || !use_short_hand_form_) { 2007 os() << rd << ", "; 2008 } 2009 os() << rn << ", " << operand; 2010 } 2011 2012 void Disassembler::orns(Condition cond, 2013 Register rd, 2014 Register rn, 2015 const Operand& operand) { 2016 os().SetCurrentInstruction(kOrns, kBitwise); 2017 os() << ToCString(kOrns) << ConditionPrinter(it_block_, cond); 2018 os() << " "; 2019 if (!rd.Is(rn) || !use_short_hand_form_) { 2020 os() << rd << ", "; 2021 } 2022 os() << rn << ", " << operand; 2023 } 2024 2025 void Disassembler::orr(Condition cond, 2026 EncodingSize size, 2027 Register rd, 2028 Register rn, 2029 const Operand& operand) { 2030 os().SetCurrentInstruction(kOrr, kBitwise); 2031 os() << ToCString(kOrr) << ConditionPrinter(it_block_, cond) << size; 2032 os() << " "; 2033 if (!rd.Is(rn) || !use_short_hand_form_) { 2034 os() << rd << ", "; 2035 } 2036 os() << rn << ", " << operand; 2037 } 2038 2039 void Disassembler::orrs(Condition cond, 2040 EncodingSize size, 2041 Register rd, 2042 Register rn, 2043 const Operand& operand) { 2044 os().SetCurrentInstruction(kOrrs, kBitwise); 2045 os() << ToCString(kOrrs) << ConditionPrinter(it_block_, cond) << size; 2046 os() << " "; 2047 if (!rd.Is(rn) || !use_short_hand_form_) { 2048 os() << rd << ", "; 2049 } 2050 os() << rn << ", " << operand; 2051 } 2052 2053 void Disassembler::pkhbt(Condition cond, 2054 Register rd, 2055 Register rn, 2056 const Operand& operand) { 2057 os().SetCurrentInstruction(kPkhbt, kNoAttribute); 2058 os() << ToCString(kPkhbt) << ConditionPrinter(it_block_, cond); 2059 os() << " "; 2060 if (!rd.Is(rn) || !use_short_hand_form_) { 2061 os() << rd << ", "; 2062 } 2063 os() << rn << ", " << operand; 2064 } 2065 2066 void Disassembler::pkhtb(Condition cond, 2067 Register rd, 2068 Register rn, 2069 const Operand& operand) { 2070 os().SetCurrentInstruction(kPkhtb, kNoAttribute); 2071 os() << ToCString(kPkhtb) << ConditionPrinter(it_block_, cond); 2072 os() << " "; 2073 if (!rd.Is(rn) || !use_short_hand_form_) { 2074 os() << rd << ", "; 2075 } 2076 os() << rn << ", " << operand; 2077 } 2078 2079 void Disassembler::pld(Condition cond, Location* location) { 2080 os().SetCurrentInstruction(kPld, kAddress); 2081 os() << ToCString(kPld) << ConditionPrinter(it_block_, cond) << " " 2082 << PrintLabel(kDataLocation, location, GetCodeAddress() & ~3); 2083 } 2084 2085 void Disassembler::pld(Condition cond, const MemOperand& operand) { 2086 os().SetCurrentInstruction(kPld, kAddress); 2087 os() << ToCString(kPld) << ConditionPrinter(it_block_, cond) << " " 2088 << PrintMemOperand(kDataLocation, operand); 2089 } 2090 2091 void Disassembler::pldw(Condition cond, const MemOperand& operand) { 2092 os().SetCurrentInstruction(kPldw, kAddress); 2093 os() << ToCString(kPldw) << ConditionPrinter(it_block_, cond) << " " 2094 << PrintMemOperand(kDataLocation, operand); 2095 } 2096 2097 void Disassembler::pli(Condition cond, const MemOperand& operand) { 2098 os().SetCurrentInstruction(kPli, kAddress); 2099 os() << ToCString(kPli) << ConditionPrinter(it_block_, cond) << " " 2100 << PrintMemOperand(kCodeLocation, operand); 2101 } 2102 2103 void Disassembler::pli(Condition cond, Location* location) { 2104 os().SetCurrentInstruction(kPli, kAddress); 2105 os() << ToCString(kPli) << ConditionPrinter(it_block_, cond) << " " 2106 << PrintLabel(kCodeLocation, location, GetCodeAddress() & ~3); 2107 } 2108 2109 void Disassembler::pop(Condition cond, 2110 EncodingSize size, 2111 RegisterList registers) { 2112 os().SetCurrentInstruction(kPop, kLoadStore | kLoadStoreMultiple); 2113 os() << ToCString(kPop) << ConditionPrinter(it_block_, cond) << size << " " 2114 << registers; 2115 } 2116 2117 void Disassembler::pop(Condition cond, EncodingSize size, Register rt) { 2118 os().SetCurrentInstruction(kPop, kLoadStore | kLoadStoreMultiple); 2119 os() << ToCString(kPop) << ConditionPrinter(it_block_, cond) << size << " " 2120 << "{" << rt << "}"; 2121 } 2122 2123 void Disassembler::push(Condition cond, 2124 EncodingSize size, 2125 RegisterList registers) { 2126 os().SetCurrentInstruction(kPush, kLoadStore | kLoadStoreMultiple); 2127 os() << ToCString(kPush) << ConditionPrinter(it_block_, cond) << size << " " 2128 << registers; 2129 } 2130 2131 void Disassembler::push(Condition cond, EncodingSize size, Register rt) { 2132 os().SetCurrentInstruction(kPush, kLoadStore | kLoadStoreMultiple); 2133 os() << ToCString(kPush) << ConditionPrinter(it_block_, cond) << size << " " 2134 << "{" << rt << "}"; 2135 } 2136 2137 void Disassembler::qadd(Condition cond, Register rd, Register rm, Register rn) { 2138 os().SetCurrentInstruction(kQadd, kArithmetic); 2139 os() << ToCString(kQadd) << ConditionPrinter(it_block_, cond); 2140 os() << " "; 2141 if (!rd.Is(rm) || !use_short_hand_form_) { 2142 os() << rd << ", "; 2143 } 2144 os() << rm << ", " << rn; 2145 } 2146 2147 void Disassembler::qadd16(Condition cond, 2148 Register rd, 2149 Register rn, 2150 Register rm) { 2151 os().SetCurrentInstruction(kQadd16, kArithmetic); 2152 os() << ToCString(kQadd16) << ConditionPrinter(it_block_, cond); 2153 os() << " "; 2154 if (!rd.Is(rn) || !use_short_hand_form_) { 2155 os() << rd << ", "; 2156 } 2157 os() << rn << ", " << rm; 2158 } 2159 2160 void Disassembler::qadd8(Condition cond, 2161 Register rd, 2162 Register rn, 2163 Register rm) { 2164 os().SetCurrentInstruction(kQadd8, kArithmetic); 2165 os() << ToCString(kQadd8) << ConditionPrinter(it_block_, cond); 2166 os() << " "; 2167 if (!rd.Is(rn) || !use_short_hand_form_) { 2168 os() << rd << ", "; 2169 } 2170 os() << rn << ", " << rm; 2171 } 2172 2173 void Disassembler::qasx(Condition cond, Register rd, Register rn, Register rm) { 2174 os().SetCurrentInstruction(kQasx, kArithmetic); 2175 os() << ToCString(kQasx) << ConditionPrinter(it_block_, cond); 2176 os() << " "; 2177 if (!rd.Is(rn) || !use_short_hand_form_) { 2178 os() << rd << ", "; 2179 } 2180 os() << rn << ", " << rm; 2181 } 2182 2183 void Disassembler::qdadd(Condition cond, 2184 Register rd, 2185 Register rm, 2186 Register rn) { 2187 os().SetCurrentInstruction(kQdadd, kArithmetic); 2188 os() << ToCString(kQdadd) << ConditionPrinter(it_block_, cond); 2189 os() << " "; 2190 if (!rd.Is(rm) || !use_short_hand_form_) { 2191 os() << rd << ", "; 2192 } 2193 os() << rm << ", " << rn; 2194 } 2195 2196 void Disassembler::qdsub(Condition cond, 2197 Register rd, 2198 Register rm, 2199 Register rn) { 2200 os().SetCurrentInstruction(kQdsub, kArithmetic); 2201 os() << ToCString(kQdsub) << ConditionPrinter(it_block_, cond); 2202 os() << " "; 2203 if (!rd.Is(rm) || !use_short_hand_form_) { 2204 os() << rd << ", "; 2205 } 2206 os() << rm << ", " << rn; 2207 } 2208 2209 void Disassembler::qsax(Condition cond, Register rd, Register rn, Register rm) { 2210 os().SetCurrentInstruction(kQsax, kArithmetic); 2211 os() << ToCString(kQsax) << ConditionPrinter(it_block_, cond); 2212 os() << " "; 2213 if (!rd.Is(rn) || !use_short_hand_form_) { 2214 os() << rd << ", "; 2215 } 2216 os() << rn << ", " << rm; 2217 } 2218 2219 void Disassembler::qsub(Condition cond, Register rd, Register rm, Register rn) { 2220 os().SetCurrentInstruction(kQsub, kArithmetic); 2221 os() << ToCString(kQsub) << ConditionPrinter(it_block_, cond); 2222 os() << " "; 2223 if (!rd.Is(rm) || !use_short_hand_form_) { 2224 os() << rd << ", "; 2225 } 2226 os() << rm << ", " << rn; 2227 } 2228 2229 void Disassembler::qsub16(Condition cond, 2230 Register rd, 2231 Register rn, 2232 Register rm) { 2233 os().SetCurrentInstruction(kQsub16, kArithmetic); 2234 os() << ToCString(kQsub16) << ConditionPrinter(it_block_, cond); 2235 os() << " "; 2236 if (!rd.Is(rn) || !use_short_hand_form_) { 2237 os() << rd << ", "; 2238 } 2239 os() << rn << ", " << rm; 2240 } 2241 2242 void Disassembler::qsub8(Condition cond, 2243 Register rd, 2244 Register rn, 2245 Register rm) { 2246 os().SetCurrentInstruction(kQsub8, kArithmetic); 2247 os() << ToCString(kQsub8) << ConditionPrinter(it_block_, cond); 2248 os() << " "; 2249 if (!rd.Is(rn) || !use_short_hand_form_) { 2250 os() << rd << ", "; 2251 } 2252 os() << rn << ", " << rm; 2253 } 2254 2255 void Disassembler::rbit(Condition cond, Register rd, Register rm) { 2256 os().SetCurrentInstruction(kRbit, kNoAttribute); 2257 os() << ToCString(kRbit) << ConditionPrinter(it_block_, cond) << " " << rd 2258 << ", " << rm; 2259 } 2260 2261 void Disassembler::rev(Condition cond, 2262 EncodingSize size, 2263 Register rd, 2264 Register rm) { 2265 os().SetCurrentInstruction(kRev, kNoAttribute); 2266 os() << ToCString(kRev) << ConditionPrinter(it_block_, cond) << size << " " 2267 << rd << ", " << rm; 2268 } 2269 2270 void Disassembler::rev16(Condition cond, 2271 EncodingSize size, 2272 Register rd, 2273 Register rm) { 2274 os().SetCurrentInstruction(kRev16, kNoAttribute); 2275 os() << ToCString(kRev16) << ConditionPrinter(it_block_, cond) << size << " " 2276 << rd << ", " << rm; 2277 } 2278 2279 void Disassembler::revsh(Condition cond, 2280 EncodingSize size, 2281 Register rd, 2282 Register rm) { 2283 os().SetCurrentInstruction(kRevsh, kNoAttribute); 2284 os() << ToCString(kRevsh) << ConditionPrinter(it_block_, cond) << size << " " 2285 << rd << ", " << rm; 2286 } 2287 2288 void Disassembler::ror(Condition cond, 2289 EncodingSize size, 2290 Register rd, 2291 Register rm, 2292 const Operand& operand) { 2293 os().SetCurrentInstruction(kRor, kShift); 2294 os() << ToCString(kRor) << ConditionPrinter(it_block_, cond) << size; 2295 os() << " "; 2296 if (!rd.Is(rm) || !use_short_hand_form_) { 2297 os() << rd << ", "; 2298 } 2299 os() << rm << ", " << operand; 2300 } 2301 2302 void Disassembler::rors(Condition cond, 2303 EncodingSize size, 2304 Register rd, 2305 Register rm, 2306 const Operand& operand) { 2307 os().SetCurrentInstruction(kRors, kShift); 2308 os() << ToCString(kRors) << ConditionPrinter(it_block_, cond) << size; 2309 os() << " "; 2310 if (!rd.Is(rm) || !use_short_hand_form_) { 2311 os() << rd << ", "; 2312 } 2313 os() << rm << ", " << operand; 2314 } 2315 2316 void Disassembler::rrx(Condition cond, Register rd, Register rm) { 2317 os().SetCurrentInstruction(kRrx, kShift); 2318 os() << ToCString(kRrx) << ConditionPrinter(it_block_, cond); 2319 os() << " "; 2320 if (!rd.Is(rm) || !use_short_hand_form_) { 2321 os() << rd << ", "; 2322 } 2323 os() << rm; 2324 } 2325 2326 void Disassembler::rrxs(Condition cond, Register rd, Register rm) { 2327 os().SetCurrentInstruction(kRrxs, kShift); 2328 os() << ToCString(kRrxs) << ConditionPrinter(it_block_, cond); 2329 os() << " "; 2330 if (!rd.Is(rm) || !use_short_hand_form_) { 2331 os() << rd << ", "; 2332 } 2333 os() << rm; 2334 } 2335 2336 void Disassembler::rsb(Condition cond, 2337 EncodingSize size, 2338 Register rd, 2339 Register rn, 2340 const Operand& operand) { 2341 os().SetCurrentInstruction(kRsb, kArithmetic); 2342 os() << ToCString(kRsb) << ConditionPrinter(it_block_, cond) << size; 2343 os() << " "; 2344 if (!rd.Is(rn) || !use_short_hand_form_) { 2345 os() << rd << ", "; 2346 } 2347 os() << rn << ", " << operand; 2348 } 2349 2350 void Disassembler::rsbs(Condition cond, 2351 EncodingSize size, 2352 Register rd, 2353 Register rn, 2354 const Operand& operand) { 2355 os().SetCurrentInstruction(kRsbs, kArithmetic); 2356 os() << ToCString(kRsbs) << ConditionPrinter(it_block_, cond) << size; 2357 os() << " "; 2358 if (!rd.Is(rn) || !use_short_hand_form_) { 2359 os() << rd << ", "; 2360 } 2361 os() << rn << ", " << operand; 2362 } 2363 2364 void Disassembler::rsc(Condition cond, 2365 Register rd, 2366 Register rn, 2367 const Operand& operand) { 2368 os().SetCurrentInstruction(kRsc, kArithmetic); 2369 os() << ToCString(kRsc) << ConditionPrinter(it_block_, cond); 2370 os() << " "; 2371 if (!rd.Is(rn) || !use_short_hand_form_) { 2372 os() << rd << ", "; 2373 } 2374 os() << rn << ", " << operand; 2375 } 2376 2377 void Disassembler::rscs(Condition cond, 2378 Register rd, 2379 Register rn, 2380 const Operand& operand) { 2381 os().SetCurrentInstruction(kRscs, kArithmetic); 2382 os() << ToCString(kRscs) << ConditionPrinter(it_block_, cond); 2383 os() << " "; 2384 if (!rd.Is(rn) || !use_short_hand_form_) { 2385 os() << rd << ", "; 2386 } 2387 os() << rn << ", " << operand; 2388 } 2389 2390 void Disassembler::sadd16(Condition cond, 2391 Register rd, 2392 Register rn, 2393 Register rm) { 2394 os().SetCurrentInstruction(kSadd16, kArithmetic); 2395 os() << ToCString(kSadd16) << ConditionPrinter(it_block_, cond); 2396 os() << " "; 2397 if (!rd.Is(rn) || !use_short_hand_form_) { 2398 os() << rd << ", "; 2399 } 2400 os() << rn << ", " << rm; 2401 } 2402 2403 void Disassembler::sadd8(Condition cond, 2404 Register rd, 2405 Register rn, 2406 Register rm) { 2407 os().SetCurrentInstruction(kSadd8, kArithmetic); 2408 os() << ToCString(kSadd8) << ConditionPrinter(it_block_, cond); 2409 os() << " "; 2410 if (!rd.Is(rn) || !use_short_hand_form_) { 2411 os() << rd << ", "; 2412 } 2413 os() << rn << ", " << rm; 2414 } 2415 2416 void Disassembler::sasx(Condition cond, Register rd, Register rn, Register rm) { 2417 os().SetCurrentInstruction(kSasx, kArithmetic); 2418 os() << ToCString(kSasx) << ConditionPrinter(it_block_, cond); 2419 os() << " "; 2420 if (!rd.Is(rn) || !use_short_hand_form_) { 2421 os() << rd << ", "; 2422 } 2423 os() << rn << ", " << rm; 2424 } 2425 2426 void Disassembler::sbc(Condition cond, 2427 EncodingSize size, 2428 Register rd, 2429 Register rn, 2430 const Operand& operand) { 2431 os().SetCurrentInstruction(kSbc, kArithmetic); 2432 os() << ToCString(kSbc) << ConditionPrinter(it_block_, cond) << size; 2433 os() << " "; 2434 if (!rd.Is(rn) || !use_short_hand_form_) { 2435 os() << rd << ", "; 2436 } 2437 os() << rn << ", " << operand; 2438 } 2439 2440 void Disassembler::sbcs(Condition cond, 2441 EncodingSize size, 2442 Register rd, 2443 Register rn, 2444 const Operand& operand) { 2445 os().SetCurrentInstruction(kSbcs, kArithmetic); 2446 os() << ToCString(kSbcs) << ConditionPrinter(it_block_, cond) << size; 2447 os() << " "; 2448 if (!rd.Is(rn) || !use_short_hand_form_) { 2449 os() << rd << ", "; 2450 } 2451 os() << rn << ", " << operand; 2452 } 2453 2454 void Disassembler::sbfx( 2455 Condition cond, Register rd, Register rn, uint32_t lsb, uint32_t width) { 2456 os().SetCurrentInstruction(kSbfx, kShift); 2457 os() << ToCString(kSbfx) << ConditionPrinter(it_block_, cond) << " " << rd 2458 << ", " << rn << ", " << ImmediatePrinter(lsb) << ", " 2459 << ImmediatePrinter(width); 2460 } 2461 2462 void Disassembler::sdiv(Condition cond, Register rd, Register rn, Register rm) { 2463 os().SetCurrentInstruction(kSdiv, kArithmetic); 2464 os() << ToCString(kSdiv) << ConditionPrinter(it_block_, cond); 2465 os() << " "; 2466 if (!rd.Is(rn) || !use_short_hand_form_) { 2467 os() << rd << ", "; 2468 } 2469 os() << rn << ", " << rm; 2470 } 2471 2472 void Disassembler::sel(Condition cond, Register rd, Register rn, Register rm) { 2473 os().SetCurrentInstruction(kSel, kNoAttribute); 2474 os() << ToCString(kSel) << ConditionPrinter(it_block_, cond); 2475 os() << " "; 2476 if (!rd.Is(rn) || !use_short_hand_form_) { 2477 os() << rd << ", "; 2478 } 2479 os() << rn << ", " << rm; 2480 } 2481 2482 void Disassembler::shadd16(Condition cond, 2483 Register rd, 2484 Register rn, 2485 Register rm) { 2486 os().SetCurrentInstruction(kShadd16, kArithmetic); 2487 os() << ToCString(kShadd16) << ConditionPrinter(it_block_, cond); 2488 os() << " "; 2489 if (!rd.Is(rn) || !use_short_hand_form_) { 2490 os() << rd << ", "; 2491 } 2492 os() << rn << ", " << rm; 2493 } 2494 2495 void Disassembler::shadd8(Condition cond, 2496 Register rd, 2497 Register rn, 2498 Register rm) { 2499 os().SetCurrentInstruction(kShadd8, kArithmetic); 2500 os() << ToCString(kShadd8) << ConditionPrinter(it_block_, cond); 2501 os() << " "; 2502 if (!rd.Is(rn) || !use_short_hand_form_) { 2503 os() << rd << ", "; 2504 } 2505 os() << rn << ", " << rm; 2506 } 2507 2508 void Disassembler::shasx(Condition cond, 2509 Register rd, 2510 Register rn, 2511 Register rm) { 2512 os().SetCurrentInstruction(kShasx, kArithmetic); 2513 os() << ToCString(kShasx) << ConditionPrinter(it_block_, cond); 2514 os() << " "; 2515 if (!rd.Is(rn) || !use_short_hand_form_) { 2516 os() << rd << ", "; 2517 } 2518 os() << rn << ", " << rm; 2519 } 2520 2521 void Disassembler::shsax(Condition cond, 2522 Register rd, 2523 Register rn, 2524 Register rm) { 2525 os().SetCurrentInstruction(kShsax, kArithmetic); 2526 os() << ToCString(kShsax) << ConditionPrinter(it_block_, cond); 2527 os() << " "; 2528 if (!rd.Is(rn) || !use_short_hand_form_) { 2529 os() << rd << ", "; 2530 } 2531 os() << rn << ", " << rm; 2532 } 2533 2534 void Disassembler::shsub16(Condition cond, 2535 Register rd, 2536 Register rn, 2537 Register rm) { 2538 os().SetCurrentInstruction(kShsub16, kArithmetic); 2539 os() << ToCString(kShsub16) << ConditionPrinter(it_block_, cond); 2540 os() << " "; 2541 if (!rd.Is(rn) || !use_short_hand_form_) { 2542 os() << rd << ", "; 2543 } 2544 os() << rn << ", " << rm; 2545 } 2546 2547 void Disassembler::shsub8(Condition cond, 2548 Register rd, 2549 Register rn, 2550 Register rm) { 2551 os().SetCurrentInstruction(kShsub8, kArithmetic); 2552 os() << ToCString(kShsub8) << ConditionPrinter(it_block_, cond); 2553 os() << " "; 2554 if (!rd.Is(rn) || !use_short_hand_form_) { 2555 os() << rd << ", "; 2556 } 2557 os() << rn << ", " << rm; 2558 } 2559 2560 void Disassembler::smlabb( 2561 Condition cond, Register rd, Register rn, Register rm, Register ra) { 2562 os().SetCurrentInstruction(kSmlabb, kArithmetic); 2563 os() << ToCString(kSmlabb) << ConditionPrinter(it_block_, cond) << " " << rd 2564 << ", " << rn << ", " << rm << ", " << ra; 2565 } 2566 2567 void Disassembler::smlabt( 2568 Condition cond, Register rd, Register rn, Register rm, Register ra) { 2569 os().SetCurrentInstruction(kSmlabt, kArithmetic); 2570 os() << ToCString(kSmlabt) << ConditionPrinter(it_block_, cond) << " " << rd 2571 << ", " << rn << ", " << rm << ", " << ra; 2572 } 2573 2574 void Disassembler::smlad( 2575 Condition cond, Register rd, Register rn, Register rm, Register ra) { 2576 os().SetCurrentInstruction(kSmlad, kArithmetic); 2577 os() << ToCString(kSmlad) << ConditionPrinter(it_block_, cond) << " " << rd 2578 << ", " << rn << ", " << rm << ", " << ra; 2579 } 2580 2581 void Disassembler::smladx( 2582 Condition cond, Register rd, Register rn, Register rm, Register ra) { 2583 os().SetCurrentInstruction(kSmladx, kArithmetic); 2584 os() << ToCString(kSmladx) << ConditionPrinter(it_block_, cond) << " " << rd 2585 << ", " << rn << ", " << rm << ", " << ra; 2586 } 2587 2588 void Disassembler::smlal( 2589 Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) { 2590 os().SetCurrentInstruction(kSmlal, kArithmetic); 2591 os() << ToCString(kSmlal) << ConditionPrinter(it_block_, cond) << " " << rdlo 2592 << ", " << rdhi << ", " << rn << ", " << rm; 2593 } 2594 2595 void Disassembler::smlalbb( 2596 Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) { 2597 os().SetCurrentInstruction(kSmlalbb, kArithmetic); 2598 os() << ToCString(kSmlalbb) << ConditionPrinter(it_block_, cond) << " " 2599 << rdlo << ", " << rdhi << ", " << rn << ", " << rm; 2600 } 2601 2602 void Disassembler::smlalbt( 2603 Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) { 2604 os().SetCurrentInstruction(kSmlalbt, kArithmetic); 2605 os() << ToCString(kSmlalbt) << ConditionPrinter(it_block_, cond) << " " 2606 << rdlo << ", " << rdhi << ", " << rn << ", " << rm; 2607 } 2608 2609 void Disassembler::smlald( 2610 Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) { 2611 os().SetCurrentInstruction(kSmlald, kArithmetic); 2612 os() << ToCString(kSmlald) << ConditionPrinter(it_block_, cond) << " " << rdlo 2613 << ", " << rdhi << ", " << rn << ", " << rm; 2614 } 2615 2616 void Disassembler::smlaldx( 2617 Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) { 2618 os().SetCurrentInstruction(kSmlaldx, kArithmetic); 2619 os() << ToCString(kSmlaldx) << ConditionPrinter(it_block_, cond) << " " 2620 << rdlo << ", " << rdhi << ", " << rn << ", " << rm; 2621 } 2622 2623 void Disassembler::smlals( 2624 Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) { 2625 os().SetCurrentInstruction(kSmlals, kArithmetic); 2626 os() << ToCString(kSmlals) << ConditionPrinter(it_block_, cond) << " " << rdlo 2627 << ", " << rdhi << ", " << rn << ", " << rm; 2628 } 2629 2630 void Disassembler::smlaltb( 2631 Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) { 2632 os().SetCurrentInstruction(kSmlaltb, kArithmetic); 2633 os() << ToCString(kSmlaltb) << ConditionPrinter(it_block_, cond) << " " 2634 << rdlo << ", " << rdhi << ", " << rn << ", " << rm; 2635 } 2636 2637 void Disassembler::smlaltt( 2638 Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) { 2639 os().SetCurrentInstruction(kSmlaltt, kArithmetic); 2640 os() << ToCString(kSmlaltt) << ConditionPrinter(it_block_, cond) << " " 2641 << rdlo << ", " << rdhi << ", " << rn << ", " << rm; 2642 } 2643 2644 void Disassembler::smlatb( 2645 Condition cond, Register rd, Register rn, Register rm, Register ra) { 2646 os().SetCurrentInstruction(kSmlatb, kArithmetic); 2647 os() << ToCString(kSmlatb) << ConditionPrinter(it_block_, cond) << " " << rd 2648 << ", " << rn << ", " << rm << ", " << ra; 2649 } 2650 2651 void Disassembler::smlatt( 2652 Condition cond, Register rd, Register rn, Register rm, Register ra) { 2653 os().SetCurrentInstruction(kSmlatt, kArithmetic); 2654 os() << ToCString(kSmlatt) << ConditionPrinter(it_block_, cond) << " " << rd 2655 << ", " << rn << ", " << rm << ", " << ra; 2656 } 2657 2658 void Disassembler::smlawb( 2659 Condition cond, Register rd, Register rn, Register rm, Register ra) { 2660 os().SetCurrentInstruction(kSmlawb, kArithmetic); 2661 os() << ToCString(kSmlawb) << ConditionPrinter(it_block_, cond) << " " << rd 2662 << ", " << rn << ", " << rm << ", " << ra; 2663 } 2664 2665 void Disassembler::smlawt( 2666 Condition cond, Register rd, Register rn, Register rm, Register ra) { 2667 os().SetCurrentInstruction(kSmlawt, kArithmetic); 2668 os() << ToCString(kSmlawt) << ConditionPrinter(it_block_, cond) << " " << rd 2669 << ", " << rn << ", " << rm << ", " << ra; 2670 } 2671 2672 void Disassembler::smlsd( 2673 Condition cond, Register rd, Register rn, Register rm, Register ra) { 2674 os().SetCurrentInstruction(kSmlsd, kArithmetic); 2675 os() << ToCString(kSmlsd) << ConditionPrinter(it_block_, cond) << " " << rd 2676 << ", " << rn << ", " << rm << ", " << ra; 2677 } 2678 2679 void Disassembler::smlsdx( 2680 Condition cond, Register rd, Register rn, Register rm, Register ra) { 2681 os().SetCurrentInstruction(kSmlsdx, kArithmetic); 2682 os() << ToCString(kSmlsdx) << ConditionPrinter(it_block_, cond) << " " << rd 2683 << ", " << rn << ", " << rm << ", " << ra; 2684 } 2685 2686 void Disassembler::smlsld( 2687 Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) { 2688 os().SetCurrentInstruction(kSmlsld, kArithmetic); 2689 os() << ToCString(kSmlsld) << ConditionPrinter(it_block_, cond) << " " << rdlo 2690 << ", " << rdhi << ", " << rn << ", " << rm; 2691 } 2692 2693 void Disassembler::smlsldx( 2694 Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) { 2695 os().SetCurrentInstruction(kSmlsldx, kArithmetic); 2696 os() << ToCString(kSmlsldx) << ConditionPrinter(it_block_, cond) << " " 2697 << rdlo << ", " << rdhi << ", " << rn << ", " << rm; 2698 } 2699 2700 void Disassembler::smmla( 2701 Condition cond, Register rd, Register rn, Register rm, Register ra) { 2702 os().SetCurrentInstruction(kSmmla, kArithmetic); 2703 os() << ToCString(kSmmla) << ConditionPrinter(it_block_, cond) << " " << rd 2704 << ", " << rn << ", " << rm << ", " << ra; 2705 } 2706 2707 void Disassembler::smmlar( 2708 Condition cond, Register rd, Register rn, Register rm, Register ra) { 2709 os().SetCurrentInstruction(kSmmlar, kArithmetic); 2710 os() << ToCString(kSmmlar) << ConditionPrinter(it_block_, cond) << " " << rd 2711 << ", " << rn << ", " << rm << ", " << ra; 2712 } 2713 2714 void Disassembler::smmls( 2715 Condition cond, Register rd, Register rn, Register rm, Register ra) { 2716 os().SetCurrentInstruction(kSmmls, kArithmetic); 2717 os() << ToCString(kSmmls) << ConditionPrinter(it_block_, cond) << " " << rd 2718 << ", " << rn << ", " << rm << ", " << ra; 2719 } 2720 2721 void Disassembler::smmlsr( 2722 Condition cond, Register rd, Register rn, Register rm, Register ra) { 2723 os().SetCurrentInstruction(kSmmlsr, kArithmetic); 2724 os() << ToCString(kSmmlsr) << ConditionPrinter(it_block_, cond) << " " << rd 2725 << ", " << rn << ", " << rm << ", " << ra; 2726 } 2727 2728 void Disassembler::smmul(Condition cond, 2729 Register rd, 2730 Register rn, 2731 Register rm) { 2732 os().SetCurrentInstruction(kSmmul, kArithmetic); 2733 os() << ToCString(kSmmul) << ConditionPrinter(it_block_, cond); 2734 os() << " "; 2735 if (!rd.Is(rn) || !use_short_hand_form_) { 2736 os() << rd << ", "; 2737 } 2738 os() << rn << ", " << rm; 2739 } 2740 2741 void Disassembler::smmulr(Condition cond, 2742 Register rd, 2743 Register rn, 2744 Register rm) { 2745 os().SetCurrentInstruction(kSmmulr, kArithmetic); 2746 os() << ToCString(kSmmulr) << ConditionPrinter(it_block_, cond); 2747 os() << " "; 2748 if (!rd.Is(rn) || !use_short_hand_form_) { 2749 os() << rd << ", "; 2750 } 2751 os() << rn << ", " << rm; 2752 } 2753 2754 void Disassembler::smuad(Condition cond, 2755 Register rd, 2756 Register rn, 2757 Register rm) { 2758 os().SetCurrentInstruction(kSmuad, kArithmetic); 2759 os() << ToCString(kSmuad) << ConditionPrinter(it_block_, cond); 2760 os() << " "; 2761 if (!rd.Is(rn) || !use_short_hand_form_) { 2762 os() << rd << ", "; 2763 } 2764 os() << rn << ", " << rm; 2765 } 2766 2767 void Disassembler::smuadx(Condition cond, 2768 Register rd, 2769 Register rn, 2770 Register rm) { 2771 os().SetCurrentInstruction(kSmuadx, kArithmetic); 2772 os() << ToCString(kSmuadx) << ConditionPrinter(it_block_, cond); 2773 os() << " "; 2774 if (!rd.Is(rn) || !use_short_hand_form_) { 2775 os() << rd << ", "; 2776 } 2777 os() << rn << ", " << rm; 2778 } 2779 2780 void Disassembler::smulbb(Condition cond, 2781 Register rd, 2782 Register rn, 2783 Register rm) { 2784 os().SetCurrentInstruction(kSmulbb, kArithmetic); 2785 os() << ToCString(kSmulbb) << ConditionPrinter(it_block_, cond); 2786 os() << " "; 2787 if (!rd.Is(rn) || !use_short_hand_form_) { 2788 os() << rd << ", "; 2789 } 2790 os() << rn << ", " << rm; 2791 } 2792 2793 void Disassembler::smulbt(Condition cond, 2794 Register rd, 2795 Register rn, 2796 Register rm) { 2797 os().SetCurrentInstruction(kSmulbt, kArithmetic); 2798 os() << ToCString(kSmulbt) << ConditionPrinter(it_block_, cond); 2799 os() << " "; 2800 if (!rd.Is(rn) || !use_short_hand_form_) { 2801 os() << rd << ", "; 2802 } 2803 os() << rn << ", " << rm; 2804 } 2805 2806 void Disassembler::smull( 2807 Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) { 2808 os().SetCurrentInstruction(kSmull, kArithmetic); 2809 os() << ToCString(kSmull) << ConditionPrinter(it_block_, cond) << " " << rdlo 2810 << ", " << rdhi << ", " << rn << ", " << rm; 2811 } 2812 2813 void Disassembler::smulls( 2814 Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) { 2815 os().SetCurrentInstruction(kSmulls, kArithmetic); 2816 os() << ToCString(kSmulls) << ConditionPrinter(it_block_, cond) << " " << rdlo 2817 << ", " << rdhi << ", " << rn << ", " << rm; 2818 } 2819 2820 void Disassembler::smultb(Condition cond, 2821 Register rd, 2822 Register rn, 2823 Register rm) { 2824 os().SetCurrentInstruction(kSmultb, kArithmetic); 2825 os() << ToCString(kSmultb) << ConditionPrinter(it_block_, cond); 2826 os() << " "; 2827 if (!rd.Is(rn) || !use_short_hand_form_) { 2828 os() << rd << ", "; 2829 } 2830 os() << rn << ", " << rm; 2831 } 2832 2833 void Disassembler::smultt(Condition cond, 2834 Register rd, 2835 Register rn, 2836 Register rm) { 2837 os().SetCurrentInstruction(kSmultt, kArithmetic); 2838 os() << ToCString(kSmultt) << ConditionPrinter(it_block_, cond); 2839 os() << " "; 2840 if (!rd.Is(rn) || !use_short_hand_form_) { 2841 os() << rd << ", "; 2842 } 2843 os() << rn << ", " << rm; 2844 } 2845 2846 void Disassembler::smulwb(Condition cond, 2847 Register rd, 2848 Register rn, 2849 Register rm) { 2850 os().SetCurrentInstruction(kSmulwb, kArithmetic); 2851 os() << ToCString(kSmulwb) << ConditionPrinter(it_block_, cond); 2852 os() << " "; 2853 if (!rd.Is(rn) || !use_short_hand_form_) { 2854 os() << rd << ", "; 2855 } 2856 os() << rn << ", " << rm; 2857 } 2858 2859 void Disassembler::smulwt(Condition cond, 2860 Register rd, 2861 Register rn, 2862 Register rm) { 2863 os().SetCurrentInstruction(kSmulwt, kArithmetic); 2864 os() << ToCString(kSmulwt) << ConditionPrinter(it_block_, cond); 2865 os() << " "; 2866 if (!rd.Is(rn) || !use_short_hand_form_) { 2867 os() << rd << ", "; 2868 } 2869 os() << rn << ", " << rm; 2870 } 2871 2872 void Disassembler::smusd(Condition cond, 2873 Register rd, 2874 Register rn, 2875 Register rm) { 2876 os().SetCurrentInstruction(kSmusd, kArithmetic); 2877 os() << ToCString(kSmusd) << ConditionPrinter(it_block_, cond); 2878 os() << " "; 2879 if (!rd.Is(rn) || !use_short_hand_form_) { 2880 os() << rd << ", "; 2881 } 2882 os() << rn << ", " << rm; 2883 } 2884 2885 void Disassembler::smusdx(Condition cond, 2886 Register rd, 2887 Register rn, 2888 Register rm) { 2889 os().SetCurrentInstruction(kSmusdx, kArithmetic); 2890 os() << ToCString(kSmusdx) << ConditionPrinter(it_block_, cond); 2891 os() << " "; 2892 if (!rd.Is(rn) || !use_short_hand_form_) { 2893 os() << rd << ", "; 2894 } 2895 os() << rn << ", " << rm; 2896 } 2897 2898 void Disassembler::ssat(Condition cond, 2899 Register rd, 2900 uint32_t imm, 2901 const Operand& operand) { 2902 os().SetCurrentInstruction(kSsat, kArithmetic); 2903 os() << ToCString(kSsat) << ConditionPrinter(it_block_, cond) << " " << rd 2904 << ", " << ImmediatePrinter(imm) << ", " << operand; 2905 } 2906 2907 void Disassembler::ssat16(Condition cond, 2908 Register rd, 2909 uint32_t imm, 2910 Register rn) { 2911 os().SetCurrentInstruction(kSsat16, kArithmetic); 2912 os() << ToCString(kSsat16) << ConditionPrinter(it_block_, cond) << " " << rd 2913 << ", " << ImmediatePrinter(imm) << ", " << rn; 2914 } 2915 2916 void Disassembler::ssax(Condition cond, Register rd, Register rn, Register rm) { 2917 os().SetCurrentInstruction(kSsax, kArithmetic); 2918 os() << ToCString(kSsax) << ConditionPrinter(it_block_, cond); 2919 os() << " "; 2920 if (!rd.Is(rn) || !use_short_hand_form_) { 2921 os() << rd << ", "; 2922 } 2923 os() << rn << ", " << rm; 2924 } 2925 2926 void Disassembler::ssub16(Condition cond, 2927 Register rd, 2928 Register rn, 2929 Register rm) { 2930 os().SetCurrentInstruction(kSsub16, kArithmetic); 2931 os() << ToCString(kSsub16) << ConditionPrinter(it_block_, cond); 2932 os() << " "; 2933 if (!rd.Is(rn) || !use_short_hand_form_) { 2934 os() << rd << ", "; 2935 } 2936 os() << rn << ", " << rm; 2937 } 2938 2939 void Disassembler::ssub8(Condition cond, 2940 Register rd, 2941 Register rn, 2942 Register rm) { 2943 os().SetCurrentInstruction(kSsub8, kArithmetic); 2944 os() << ToCString(kSsub8) << ConditionPrinter(it_block_, cond); 2945 os() << " "; 2946 if (!rd.Is(rn) || !use_short_hand_form_) { 2947 os() << rd << ", "; 2948 } 2949 os() << rn << ", " << rm; 2950 } 2951 2952 void Disassembler::stl(Condition cond, Register rt, const MemOperand& operand) { 2953 os().SetCurrentInstruction(kStl, kAddress | kLoadStore); 2954 os() << ToCString(kStl) << ConditionPrinter(it_block_, cond) << " " << rt 2955 << ", " << PrintMemOperand(kStoreWordLocation, operand); 2956 } 2957 2958 void Disassembler::stlb(Condition cond, 2959 Register rt, 2960 const MemOperand& operand) { 2961 os().SetCurrentInstruction(kStlb, kAddress | kLoadStore); 2962 os() << ToCString(kStlb) << ConditionPrinter(it_block_, cond) << " " << rt 2963 << ", " << PrintMemOperand(kStoreByteLocation, operand); 2964 } 2965 2966 void Disassembler::stlex(Condition cond, 2967 Register rd, 2968 Register rt, 2969 const MemOperand& operand) { 2970 os().SetCurrentInstruction(kStlex, kAddress | kLoadStore); 2971 os() << ToCString(kStlex) << ConditionPrinter(it_block_, cond) << " " << rd 2972 << ", " << rt << ", " << PrintMemOperand(kStoreWordLocation, operand); 2973 } 2974 2975 void Disassembler::stlexb(Condition cond, 2976 Register rd, 2977 Register rt, 2978 const MemOperand& operand) { 2979 os().SetCurrentInstruction(kStlexb, kAddress | kLoadStore); 2980 os() << ToCString(kStlexb) << ConditionPrinter(it_block_, cond) << " " << rd 2981 << ", " << rt << ", " << PrintMemOperand(kStoreByteLocation, operand); 2982 } 2983 2984 void Disassembler::stlexd(Condition cond, 2985 Register rd, 2986 Register rt, 2987 Register rt2, 2988 const MemOperand& operand) { 2989 os().SetCurrentInstruction(kStlexd, kAddress | kLoadStore); 2990 os() << ToCString(kStlexd) << ConditionPrinter(it_block_, cond) << " " << rd 2991 << ", " << rt << ", " << rt2 << ", " 2992 << PrintMemOperand(kStoreDoubleWordLocation, operand); 2993 } 2994 2995 void Disassembler::stlexh(Condition cond, 2996 Register rd, 2997 Register rt, 2998 const MemOperand& operand) { 2999 os().SetCurrentInstruction(kStlexh, kAddress | kLoadStore); 3000 os() << ToCString(kStlexh) << ConditionPrinter(it_block_, cond) << " " << rd 3001 << ", " << rt << ", " 3002 << PrintMemOperand(kStoreHalfWordLocation, operand); 3003 } 3004 3005 void Disassembler::stlh(Condition cond, 3006 Register rt, 3007 const MemOperand& operand) { 3008 os().SetCurrentInstruction(kStlh, kAddress | kLoadStore); 3009 os() << ToCString(kStlh) << ConditionPrinter(it_block_, cond) << " " << rt 3010 << ", " << PrintMemOperand(kStoreHalfWordLocation, operand); 3011 } 3012 3013 void Disassembler::stm(Condition cond, 3014 EncodingSize size, 3015 Register rn, 3016 WriteBack write_back, 3017 RegisterList registers) { 3018 os().SetCurrentInstruction(kStm, kLoadStore | kLoadStoreMultiple); 3019 os() << ToCString(kStm) << ConditionPrinter(it_block_, cond) << size << " " 3020 << rn << write_back << ", " << registers; 3021 } 3022 3023 void Disassembler::stmda(Condition cond, 3024 Register rn, 3025 WriteBack write_back, 3026 RegisterList registers) { 3027 os().SetCurrentInstruction(kStmda, kLoadStore | kLoadStoreMultiple); 3028 os() << ToCString(kStmda) << ConditionPrinter(it_block_, cond) << " " << rn 3029 << write_back << ", " << registers; 3030 } 3031 3032 void Disassembler::stmdb(Condition cond, 3033 EncodingSize size, 3034 Register rn, 3035 WriteBack write_back, 3036 RegisterList registers) { 3037 os().SetCurrentInstruction(kStmdb, kLoadStore | kLoadStoreMultiple); 3038 os() << ToCString(kStmdb) << ConditionPrinter(it_block_, cond) << size << " " 3039 << rn << write_back << ", " << registers; 3040 } 3041 3042 void Disassembler::stmea(Condition cond, 3043 EncodingSize size, 3044 Register rn, 3045 WriteBack write_back, 3046 RegisterList registers) { 3047 os().SetCurrentInstruction(kStmea, kLoadStore | kLoadStoreMultiple); 3048 os() << ToCString(kStmea) << ConditionPrinter(it_block_, cond) << size << " " 3049 << rn << write_back << ", " << registers; 3050 } 3051 3052 void Disassembler::stmed(Condition cond, 3053 Register rn, 3054 WriteBack write_back, 3055 RegisterList registers) { 3056 os().SetCurrentInstruction(kStmed, kLoadStore | kLoadStoreMultiple); 3057 os() << ToCString(kStmed) << ConditionPrinter(it_block_, cond) << " " << rn 3058 << write_back << ", " << registers; 3059 } 3060 3061 void Disassembler::stmfa(Condition cond, 3062 Register rn, 3063 WriteBack write_back, 3064 RegisterList registers) { 3065 os().SetCurrentInstruction(kStmfa, kLoadStore | kLoadStoreMultiple); 3066 os() << ToCString(kStmfa) << ConditionPrinter(it_block_, cond) << " " << rn 3067 << write_back << ", " << registers; 3068 } 3069 3070 void Disassembler::stmfd(Condition cond, 3071 Register rn, 3072 WriteBack write_back, 3073 RegisterList registers) { 3074 os().SetCurrentInstruction(kStmfd, kLoadStore | kLoadStoreMultiple); 3075 os() << ToCString(kStmfd) << ConditionPrinter(it_block_, cond) << " " << rn 3076 << write_back << ", " << registers; 3077 } 3078 3079 void Disassembler::stmib(Condition cond, 3080 Register rn, 3081 WriteBack write_back, 3082 RegisterList registers) { 3083 os().SetCurrentInstruction(kStmib, kLoadStore | kLoadStoreMultiple); 3084 os() << ToCString(kStmib) << ConditionPrinter(it_block_, cond) << " " << rn 3085 << write_back << ", " << registers; 3086 } 3087 3088 void Disassembler::str(Condition cond, 3089 EncodingSize size, 3090 Register rt, 3091 const MemOperand& operand) { 3092 os().SetCurrentInstruction(kStr, kAddress | kLoadStore); 3093 os() << ToCString(kStr) << ConditionPrinter(it_block_, cond) << size << " " 3094 << rt << ", " << PrintMemOperand(kStoreWordLocation, operand); 3095 } 3096 3097 void Disassembler::strb(Condition cond, 3098 EncodingSize size, 3099 Register rt, 3100 const MemOperand& operand) { 3101 os().SetCurrentInstruction(kStrb, kAddress | kLoadStore); 3102 os() << ToCString(kStrb) << ConditionPrinter(it_block_, cond) << size << " " 3103 << rt << ", " << PrintMemOperand(kStoreByteLocation, operand); 3104 } 3105 3106 void Disassembler::strd(Condition cond, 3107 Register rt, 3108 Register rt2, 3109 const MemOperand& operand) { 3110 os().SetCurrentInstruction(kStrd, kAddress | kLoadStore); 3111 os() << ToCString(kStrd) << ConditionPrinter(it_block_, cond) << " " << rt 3112 << ", " << rt2 << ", " 3113 << PrintMemOperand(kStoreDoubleWordLocation, operand); 3114 } 3115 3116 void Disassembler::strex(Condition cond, 3117 Register rd, 3118 Register rt, 3119 const MemOperand& operand) { 3120 os().SetCurrentInstruction(kStrex, kAddress | kLoadStore); 3121 os() << ToCString(kStrex) << ConditionPrinter(it_block_, cond) << " " << rd 3122 << ", " << rt << ", " << PrintMemOperand(kStoreWordLocation, operand); 3123 } 3124 3125 void Disassembler::strexb(Condition cond, 3126 Register rd, 3127 Register rt, 3128 const MemOperand& operand) { 3129 os().SetCurrentInstruction(kStrexb, kAddress | kLoadStore); 3130 os() << ToCString(kStrexb) << ConditionPrinter(it_block_, cond) << " " << rd 3131 << ", " << rt << ", " << PrintMemOperand(kStoreByteLocation, operand); 3132 } 3133 3134 void Disassembler::strexd(Condition cond, 3135 Register rd, 3136 Register rt, 3137 Register rt2, 3138 const MemOperand& operand) { 3139 os().SetCurrentInstruction(kStrexd, kAddress | kLoadStore); 3140 os() << ToCString(kStrexd) << ConditionPrinter(it_block_, cond) << " " << rd 3141 << ", " << rt << ", " << rt2 << ", " 3142 << PrintMemOperand(kStoreDoubleWordLocation, operand); 3143 } 3144 3145 void Disassembler::strexh(Condition cond, 3146 Register rd, 3147 Register rt, 3148 const MemOperand& operand) { 3149 os().SetCurrentInstruction(kStrexh, kAddress | kLoadStore); 3150 os() << ToCString(kStrexh) << ConditionPrinter(it_block_, cond) << " " << rd 3151 << ", " << rt << ", " 3152 << PrintMemOperand(kStoreHalfWordLocation, operand); 3153 } 3154 3155 void Disassembler::strh(Condition cond, 3156 EncodingSize size, 3157 Register rt, 3158 const MemOperand& operand) { 3159 os().SetCurrentInstruction(kStrh, kAddress | kLoadStore); 3160 os() << ToCString(kStrh) << ConditionPrinter(it_block_, cond) << size << " " 3161 << rt << ", " << PrintMemOperand(kStoreHalfWordLocation, operand); 3162 } 3163 3164 void Disassembler::sub(Condition cond, 3165 EncodingSize size, 3166 Register rd, 3167 Register rn, 3168 const Operand& operand) { 3169 os().SetCurrentInstruction(kSub, kArithmetic); 3170 os() << ToCString(kSub) << ConditionPrinter(it_block_, cond) << size; 3171 os() << " "; 3172 if (!rd.Is(rn) || !use_short_hand_form_) { 3173 os() << rd << ", "; 3174 } 3175 os() << rn << ", " << operand; 3176 } 3177 3178 void Disassembler::sub(Condition cond, Register rd, const Operand& operand) { 3179 os().SetCurrentInstruction(kSub, kArithmetic); 3180 os() << ToCString(kSub) << ConditionPrinter(it_block_, cond) << " " << rd 3181 << ", " << operand; 3182 } 3183 3184 void Disassembler::subs(Condition cond, 3185 EncodingSize size, 3186 Register rd, 3187 Register rn, 3188 const Operand& operand) { 3189 os().SetCurrentInstruction(kSubs, kArithmetic); 3190 os() << ToCString(kSubs) << ConditionPrinter(it_block_, cond) << size; 3191 os() << " "; 3192 if (!rd.Is(rn) || !use_short_hand_form_) { 3193 os() << rd << ", "; 3194 } 3195 os() << rn << ", " << operand; 3196 } 3197 3198 void Disassembler::subs(Register rd, const Operand& operand) { 3199 os().SetCurrentInstruction(kSubs, kArithmetic); 3200 os() << ToCString(kSubs) << " " << rd << ", " << operand; 3201 } 3202 3203 void Disassembler::subw(Condition cond, 3204 Register rd, 3205 Register rn, 3206 const Operand& operand) { 3207 os().SetCurrentInstruction(kSubw, kArithmetic); 3208 os() << ToCString(kSubw) << ConditionPrinter(it_block_, cond); 3209 os() << " "; 3210 if (!rd.Is(rn) || !use_short_hand_form_) { 3211 os() << rd << ", "; 3212 } 3213 os() << rn << ", " << operand; 3214 } 3215 3216 void Disassembler::svc(Condition cond, uint32_t imm) { 3217 os().SetCurrentInstruction(kSvc, kSystem); 3218 os() << ToCString(kSvc) << ConditionPrinter(it_block_, cond) << " " 3219 << RawImmediatePrinter(imm); 3220 } 3221 3222 void Disassembler::sxtab(Condition cond, 3223 Register rd, 3224 Register rn, 3225 const Operand& operand) { 3226 os().SetCurrentInstruction(kSxtab, kArithmetic); 3227 os() << ToCString(kSxtab) << ConditionPrinter(it_block_, cond); 3228 os() << " "; 3229 if (!rd.Is(rn) || !use_short_hand_form_) { 3230 os() << rd << ", "; 3231 } 3232 os() << rn << ", " << operand; 3233 } 3234 3235 void Disassembler::sxtab16(Condition cond, 3236 Register rd, 3237 Register rn, 3238 const Operand& operand) { 3239 os().SetCurrentInstruction(kSxtab16, kArithmetic); 3240 os() << ToCString(kSxtab16) << ConditionPrinter(it_block_, cond); 3241 os() << " "; 3242 if (!rd.Is(rn) || !use_short_hand_form_) { 3243 os() << rd << ", "; 3244 } 3245 os() << rn << ", " << operand; 3246 } 3247 3248 void Disassembler::sxtah(Condition cond, 3249 Register rd, 3250 Register rn, 3251 const Operand& operand) { 3252 os().SetCurrentInstruction(kSxtah, kArithmetic); 3253 os() << ToCString(kSxtah) << ConditionPrinter(it_block_, cond); 3254 os() << " "; 3255 if (!rd.Is(rn) || !use_short_hand_form_) { 3256 os() << rd << ", "; 3257 } 3258 os() << rn << ", " << operand; 3259 } 3260 3261 void Disassembler::sxtb(Condition cond, 3262 EncodingSize size, 3263 Register rd, 3264 const Operand& operand) { 3265 os().SetCurrentInstruction(kSxtb, kArithmetic); 3266 os() << ToCString(kSxtb) << ConditionPrinter(it_block_, cond) << size; 3267 os() << " "; 3268 if (!rd.Is(operand.GetBaseRegister()) || !use_short_hand_form_) { 3269 os() << rd << ", "; 3270 } 3271 os() << operand; 3272 } 3273 3274 void Disassembler::sxtb16(Condition cond, Register rd, const Operand& operand) { 3275 os().SetCurrentInstruction(kSxtb16, kArithmetic); 3276 os() << ToCString(kSxtb16) << ConditionPrinter(it_block_, cond); 3277 os() << " "; 3278 if (!rd.Is(operand.GetBaseRegister()) || !use_short_hand_form_) { 3279 os() << rd << ", "; 3280 } 3281 os() << operand; 3282 } 3283 3284 void Disassembler::sxth(Condition cond, 3285 EncodingSize size, 3286 Register rd, 3287 const Operand& operand) { 3288 os().SetCurrentInstruction(kSxth, kArithmetic); 3289 os() << ToCString(kSxth) << ConditionPrinter(it_block_, cond) << size; 3290 os() << " "; 3291 if (!rd.Is(operand.GetBaseRegister()) || !use_short_hand_form_) { 3292 os() << rd << ", "; 3293 } 3294 os() << operand; 3295 } 3296 3297 void Disassembler::tbb(Condition cond, Register rn, Register rm) { 3298 os().SetCurrentInstruction(kTbb, kBranch); 3299 os() << ToCString(kTbb) << ConditionPrinter(it_block_, cond) << " " 3300 << MemOperand(rn, rm); 3301 } 3302 3303 void Disassembler::tbh(Condition cond, Register rn, Register rm) { 3304 os().SetCurrentInstruction(kTbh, kBranch); 3305 os() << ToCString(kTbh) << ConditionPrinter(it_block_, cond) << " " 3306 << MemOperand(rn, plus, rm, LSL, 1); 3307 } 3308 3309 void Disassembler::teq(Condition cond, Register rn, const Operand& operand) { 3310 os().SetCurrentInstruction(kTeq, kBitwise); 3311 os() << ToCString(kTeq) << ConditionPrinter(it_block_, cond) << " " << rn 3312 << ", " << operand; 3313 } 3314 3315 void Disassembler::tst(Condition cond, 3316 EncodingSize size, 3317 Register rn, 3318 const Operand& operand) { 3319 os().SetCurrentInstruction(kTst, kBitwise); 3320 os() << ToCString(kTst) << ConditionPrinter(it_block_, cond) << size << " " 3321 << rn << ", " << operand; 3322 } 3323 3324 void Disassembler::uadd16(Condition cond, 3325 Register rd, 3326 Register rn, 3327 Register rm) { 3328 os().SetCurrentInstruction(kUadd16, kArithmetic); 3329 os() << ToCString(kUadd16) << ConditionPrinter(it_block_, cond); 3330 os() << " "; 3331 if (!rd.Is(rn) || !use_short_hand_form_) { 3332 os() << rd << ", "; 3333 } 3334 os() << rn << ", " << rm; 3335 } 3336 3337 void Disassembler::uadd8(Condition cond, 3338 Register rd, 3339 Register rn, 3340 Register rm) { 3341 os().SetCurrentInstruction(kUadd8, kArithmetic); 3342 os() << ToCString(kUadd8) << ConditionPrinter(it_block_, cond); 3343 os() << " "; 3344 if (!rd.Is(rn) || !use_short_hand_form_) { 3345 os() << rd << ", "; 3346 } 3347 os() << rn << ", " << rm; 3348 } 3349 3350 void Disassembler::uasx(Condition cond, Register rd, Register rn, Register rm) { 3351 os().SetCurrentInstruction(kUasx, kArithmetic); 3352 os() << ToCString(kUasx) << ConditionPrinter(it_block_, cond); 3353 os() << " "; 3354 if (!rd.Is(rn) || !use_short_hand_form_) { 3355 os() << rd << ", "; 3356 } 3357 os() << rn << ", " << rm; 3358 } 3359 3360 void Disassembler::ubfx( 3361 Condition cond, Register rd, Register rn, uint32_t lsb, uint32_t width) { 3362 os().SetCurrentInstruction(kUbfx, kShift); 3363 os() << ToCString(kUbfx) << ConditionPrinter(it_block_, cond) << " " << rd 3364 << ", " << rn << ", " << ImmediatePrinter(lsb) << ", " 3365 << ImmediatePrinter(width); 3366 } 3367 3368 void Disassembler::udf(Condition cond, EncodingSize size, uint32_t imm) { 3369 os().SetCurrentInstruction(kUdf, kNoAttribute); 3370 os() << ToCString(kUdf) << ConditionPrinter(it_block_, cond) << size << " " 3371 << RawImmediatePrinter(imm); 3372 } 3373 3374 void Disassembler::udiv(Condition cond, Register rd, Register rn, Register rm) { 3375 os().SetCurrentInstruction(kUdiv, kArithmetic); 3376 os() << ToCString(kUdiv) << ConditionPrinter(it_block_, cond); 3377 os() << " "; 3378 if (!rd.Is(rn) || !use_short_hand_form_) { 3379 os() << rd << ", "; 3380 } 3381 os() << rn << ", " << rm; 3382 } 3383 3384 void Disassembler::uhadd16(Condition cond, 3385 Register rd, 3386 Register rn, 3387 Register rm) { 3388 os().SetCurrentInstruction(kUhadd16, kArithmetic); 3389 os() << ToCString(kUhadd16) << ConditionPrinter(it_block_, cond); 3390 os() << " "; 3391 if (!rd.Is(rn) || !use_short_hand_form_) { 3392 os() << rd << ", "; 3393 } 3394 os() << rn << ", " << rm; 3395 } 3396 3397 void Disassembler::uhadd8(Condition cond, 3398 Register rd, 3399 Register rn, 3400 Register rm) { 3401 os().SetCurrentInstruction(kUhadd8, kArithmetic); 3402 os() << ToCString(kUhadd8) << ConditionPrinter(it_block_, cond); 3403 os() << " "; 3404 if (!rd.Is(rn) || !use_short_hand_form_) { 3405 os() << rd << ", "; 3406 } 3407 os() << rn << ", " << rm; 3408 } 3409 3410 void Disassembler::uhasx(Condition cond, 3411 Register rd, 3412 Register rn, 3413 Register rm) { 3414 os().SetCurrentInstruction(kUhasx, kArithmetic); 3415 os() << ToCString(kUhasx) << ConditionPrinter(it_block_, cond); 3416 os() << " "; 3417 if (!rd.Is(rn) || !use_short_hand_form_) { 3418 os() << rd << ", "; 3419 } 3420 os() << rn << ", " << rm; 3421 } 3422 3423 void Disassembler::uhsax(Condition cond, 3424 Register rd, 3425 Register rn, 3426 Register rm) { 3427 os().SetCurrentInstruction(kUhsax, kArithmetic); 3428 os() << ToCString(kUhsax) << ConditionPrinter(it_block_, cond); 3429 os() << " "; 3430 if (!rd.Is(rn) || !use_short_hand_form_) { 3431 os() << rd << ", "; 3432 } 3433 os() << rn << ", " << rm; 3434 } 3435 3436 void Disassembler::uhsub16(Condition cond, 3437 Register rd, 3438 Register rn, 3439 Register rm) { 3440 os().SetCurrentInstruction(kUhsub16, kArithmetic); 3441 os() << ToCString(kUhsub16) << ConditionPrinter(it_block_, cond); 3442 os() << " "; 3443 if (!rd.Is(rn) || !use_short_hand_form_) { 3444 os() << rd << ", "; 3445 } 3446 os() << rn << ", " << rm; 3447 } 3448 3449 void Disassembler::uhsub8(Condition cond, 3450 Register rd, 3451 Register rn, 3452 Register rm) { 3453 os().SetCurrentInstruction(kUhsub8, kArithmetic); 3454 os() << ToCString(kUhsub8) << ConditionPrinter(it_block_, cond); 3455 os() << " "; 3456 if (!rd.Is(rn) || !use_short_hand_form_) { 3457 os() << rd << ", "; 3458 } 3459 os() << rn << ", " << rm; 3460 } 3461 3462 void Disassembler::umaal( 3463 Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) { 3464 os().SetCurrentInstruction(kUmaal, kArithmetic); 3465 os() << ToCString(kUmaal) << ConditionPrinter(it_block_, cond) << " " << rdlo 3466 << ", " << rdhi << ", " << rn << ", " << rm; 3467 } 3468 3469 void Disassembler::umlal( 3470 Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) { 3471 os().SetCurrentInstruction(kUmlal, kArithmetic); 3472 os() << ToCString(kUmlal) << ConditionPrinter(it_block_, cond) << " " << rdlo 3473 << ", " << rdhi << ", " << rn << ", " << rm; 3474 } 3475 3476 void Disassembler::umlals( 3477 Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) { 3478 os().SetCurrentInstruction(kUmlals, kArithmetic); 3479 os() << ToCString(kUmlals) << ConditionPrinter(it_block_, cond) << " " << rdlo 3480 << ", " << rdhi << ", " << rn << ", " << rm; 3481 } 3482 3483 void Disassembler::umull( 3484 Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) { 3485 os().SetCurrentInstruction(kUmull, kArithmetic); 3486 os() << ToCString(kUmull) << ConditionPrinter(it_block_, cond) << " " << rdlo 3487 << ", " << rdhi << ", " << rn << ", " << rm; 3488 } 3489 3490 void Disassembler::umulls( 3491 Condition cond, Register rdlo, Register rdhi, Register rn, Register rm) { 3492 os().SetCurrentInstruction(kUmulls, kArithmetic); 3493 os() << ToCString(kUmulls) << ConditionPrinter(it_block_, cond) << " " << rdlo 3494 << ", " << rdhi << ", " << rn << ", " << rm; 3495 } 3496 3497 void Disassembler::uqadd16(Condition cond, 3498 Register rd, 3499 Register rn, 3500 Register rm) { 3501 os().SetCurrentInstruction(kUqadd16, kArithmetic); 3502 os() << ToCString(kUqadd16) << ConditionPrinter(it_block_, cond); 3503 os() << " "; 3504 if (!rd.Is(rn) || !use_short_hand_form_) { 3505 os() << rd << ", "; 3506 } 3507 os() << rn << ", " << rm; 3508 } 3509 3510 void Disassembler::uqadd8(Condition cond, 3511 Register rd, 3512 Register rn, 3513 Register rm) { 3514 os().SetCurrentInstruction(kUqadd8, kArithmetic); 3515 os() << ToCString(kUqadd8) << ConditionPrinter(it_block_, cond); 3516 os() << " "; 3517 if (!rd.Is(rn) || !use_short_hand_form_) { 3518 os() << rd << ", "; 3519 } 3520 os() << rn << ", " << rm; 3521 } 3522 3523 void Disassembler::uqasx(Condition cond, 3524 Register rd, 3525 Register rn, 3526 Register rm) { 3527 os().SetCurrentInstruction(kUqasx, kArithmetic); 3528 os() << ToCString(kUqasx) << ConditionPrinter(it_block_, cond); 3529 os() << " "; 3530 if (!rd.Is(rn) || !use_short_hand_form_) { 3531 os() << rd << ", "; 3532 } 3533 os() << rn << ", " << rm; 3534 } 3535 3536 void Disassembler::uqsax(Condition cond, 3537 Register rd, 3538 Register rn, 3539 Register rm) { 3540 os().SetCurrentInstruction(kUqsax, kArithmetic); 3541 os() << ToCString(kUqsax) << ConditionPrinter(it_block_, cond); 3542 os() << " "; 3543 if (!rd.Is(rn) || !use_short_hand_form_) { 3544 os() << rd << ", "; 3545 } 3546 os() << rn << ", " << rm; 3547 } 3548 3549 void Disassembler::uqsub16(Condition cond, 3550 Register rd, 3551 Register rn, 3552 Register rm) { 3553 os().SetCurrentInstruction(kUqsub16, kArithmetic); 3554 os() << ToCString(kUqsub16) << ConditionPrinter(it_block_, cond); 3555 os() << " "; 3556 if (!rd.Is(rn) || !use_short_hand_form_) { 3557 os() << rd << ", "; 3558 } 3559 os() << rn << ", " << rm; 3560 } 3561 3562 void Disassembler::uqsub8(Condition cond, 3563 Register rd, 3564 Register rn, 3565 Register rm) { 3566 os().SetCurrentInstruction(kUqsub8, kArithmetic); 3567 os() << ToCString(kUqsub8) << ConditionPrinter(it_block_, cond); 3568 os() << " "; 3569 if (!rd.Is(rn) || !use_short_hand_form_) { 3570 os() << rd << ", "; 3571 } 3572 os() << rn << ", " << rm; 3573 } 3574 3575 void Disassembler::usad8(Condition cond, 3576 Register rd, 3577 Register rn, 3578 Register rm) { 3579 os().SetCurrentInstruction(kUsad8, kArithmetic); 3580 os() << ToCString(kUsad8) << ConditionPrinter(it_block_, cond); 3581 os() << " "; 3582 if (!rd.Is(rn) || !use_short_hand_form_) { 3583 os() << rd << ", "; 3584 } 3585 os() << rn << ", " << rm; 3586 } 3587 3588 void Disassembler::usada8( 3589 Condition cond, Register rd, Register rn, Register rm, Register ra) { 3590 os().SetCurrentInstruction(kUsada8, kArithmetic); 3591 os() << ToCString(kUsada8) << ConditionPrinter(it_block_, cond) << " " << rd 3592 << ", " << rn << ", " << rm << ", " << ra; 3593 } 3594 3595 void Disassembler::usat(Condition cond, 3596 Register rd, 3597 uint32_t imm, 3598 const Operand& operand) { 3599 os().SetCurrentInstruction(kUsat, kArithmetic); 3600 os() << ToCString(kUsat) << ConditionPrinter(it_block_, cond) << " " << rd 3601 << ", " << ImmediatePrinter(imm) << ", " << operand; 3602 } 3603 3604 void Disassembler::usat16(Condition cond, 3605 Register rd, 3606 uint32_t imm, 3607 Register rn) { 3608 os().SetCurrentInstruction(kUsat16, kArithmetic); 3609 os() << ToCString(kUsat16) << ConditionPrinter(it_block_, cond) << " " << rd 3610 << ", " << ImmediatePrinter(imm) << ", " << rn; 3611 } 3612 3613 void Disassembler::usax(Condition cond, Register rd, Register rn, Register rm) { 3614 os().SetCurrentInstruction(kUsax, kArithmetic); 3615 os() << ToCString(kUsax) << ConditionPrinter(it_block_, cond); 3616 os() << " "; 3617 if (!rd.Is(rn) || !use_short_hand_form_) { 3618 os() << rd << ", "; 3619 } 3620 os() << rn << ", " << rm; 3621 } 3622 3623 void Disassembler::usub16(Condition cond, 3624 Register rd, 3625 Register rn, 3626 Register rm) { 3627 os().SetCurrentInstruction(kUsub16, kArithmetic); 3628 os() << ToCString(kUsub16) << ConditionPrinter(it_block_, cond); 3629 os() << " "; 3630 if (!rd.Is(rn) || !use_short_hand_form_) { 3631 os() << rd << ", "; 3632 } 3633 os() << rn << ", " << rm; 3634 } 3635 3636 void Disassembler::usub8(Condition cond, 3637 Register rd, 3638 Register rn, 3639 Register rm) { 3640 os().SetCurrentInstruction(kUsub8, kArithmetic); 3641 os() << ToCString(kUsub8) << ConditionPrinter(it_block_, cond); 3642 os() << " "; 3643 if (!rd.Is(rn) || !use_short_hand_form_) { 3644 os() << rd << ", "; 3645 } 3646 os() << rn << ", " << rm; 3647 } 3648 3649 void Disassembler::uxtab(Condition cond, 3650 Register rd, 3651 Register rn, 3652 const Operand& operand) { 3653 os().SetCurrentInstruction(kUxtab, kArithmetic); 3654 os() << ToCString(kUxtab) << ConditionPrinter(it_block_, cond); 3655 os() << " "; 3656 if (!rd.Is(rn) || !use_short_hand_form_) { 3657 os() << rd << ", "; 3658 } 3659 os() << rn << ", " << operand; 3660 } 3661 3662 void Disassembler::uxtab16(Condition cond, 3663 Register rd, 3664 Register rn, 3665 const Operand& operand) { 3666 os().SetCurrentInstruction(kUxtab16, kArithmetic); 3667 os() << ToCString(kUxtab16) << ConditionPrinter(it_block_, cond); 3668 os() << " "; 3669 if (!rd.Is(rn) || !use_short_hand_form_) { 3670 os() << rd << ", "; 3671 } 3672 os() << rn << ", " << operand; 3673 } 3674 3675 void Disassembler::uxtah(Condition cond, 3676 Register rd, 3677 Register rn, 3678 const Operand& operand) { 3679 os().SetCurrentInstruction(kUxtah, kArithmetic); 3680 os() << ToCString(kUxtah) << ConditionPrinter(it_block_, cond); 3681 os() << " "; 3682 if (!rd.Is(rn) || !use_short_hand_form_) { 3683 os() << rd << ", "; 3684 } 3685 os() << rn << ", " << operand; 3686 } 3687 3688 void Disassembler::uxtb(Condition cond, 3689 EncodingSize size, 3690 Register rd, 3691 const Operand& operand) { 3692 os().SetCurrentInstruction(kUxtb, kArithmetic); 3693 os() << ToCString(kUxtb) << ConditionPrinter(it_block_, cond) << size; 3694 os() << " "; 3695 if (!rd.Is(operand.GetBaseRegister()) || !use_short_hand_form_) { 3696 os() << rd << ", "; 3697 } 3698 os() << operand; 3699 } 3700 3701 void Disassembler::uxtb16(Condition cond, Register rd, const Operand& operand) { 3702 os().SetCurrentInstruction(kUxtb16, kArithmetic); 3703 os() << ToCString(kUxtb16) << ConditionPrinter(it_block_, cond); 3704 os() << " "; 3705 if (!rd.Is(operand.GetBaseRegister()) || !use_short_hand_form_) { 3706 os() << rd << ", "; 3707 } 3708 os() << operand; 3709 } 3710 3711 void Disassembler::uxth(Condition cond, 3712 EncodingSize size, 3713 Register rd, 3714 const Operand& operand) { 3715 os().SetCurrentInstruction(kUxth, kArithmetic); 3716 os() << ToCString(kUxth) << ConditionPrinter(it_block_, cond) << size; 3717 os() << " "; 3718 if (!rd.Is(operand.GetBaseRegister()) || !use_short_hand_form_) { 3719 os() << rd << ", "; 3720 } 3721 os() << operand; 3722 } 3723 3724 void Disassembler::vaba( 3725 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { 3726 os().SetCurrentInstruction(kVaba, kFpNeon); 3727 os() << ToCString(kVaba) << ConditionPrinter(it_block_, cond) << dt << " " 3728 << rd << ", " << rn << ", " << rm; 3729 } 3730 3731 void Disassembler::vaba( 3732 Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { 3733 os().SetCurrentInstruction(kVaba, kFpNeon); 3734 os() << ToCString(kVaba) << ConditionPrinter(it_block_, cond) << dt << " " 3735 << rd << ", " << rn << ", " << rm; 3736 } 3737 3738 void Disassembler::vabal( 3739 Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) { 3740 os().SetCurrentInstruction(kVabal, kFpNeon); 3741 os() << ToCString(kVabal) << ConditionPrinter(it_block_, cond) << dt << " " 3742 << rd << ", " << rn << ", " << rm; 3743 } 3744 3745 void Disassembler::vabd( 3746 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { 3747 os().SetCurrentInstruction(kVabd, kFpNeon); 3748 os() << ToCString(kVabd) << ConditionPrinter(it_block_, cond) << dt; 3749 os() << " "; 3750 if (!rd.Is(rn) || !use_short_hand_form_) { 3751 os() << rd << ", "; 3752 } 3753 os() << rn << ", " << rm; 3754 } 3755 3756 void Disassembler::vabd( 3757 Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { 3758 os().SetCurrentInstruction(kVabd, kFpNeon); 3759 os() << ToCString(kVabd) << ConditionPrinter(it_block_, cond) << dt; 3760 os() << " "; 3761 if (!rd.Is(rn) || !use_short_hand_form_) { 3762 os() << rd << ", "; 3763 } 3764 os() << rn << ", " << rm; 3765 } 3766 3767 void Disassembler::vabdl( 3768 Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) { 3769 os().SetCurrentInstruction(kVabdl, kFpNeon); 3770 os() << ToCString(kVabdl) << ConditionPrinter(it_block_, cond) << dt << " " 3771 << rd << ", " << rn << ", " << rm; 3772 } 3773 3774 void Disassembler::vabs(Condition cond, 3775 DataType dt, 3776 DRegister rd, 3777 DRegister rm) { 3778 os().SetCurrentInstruction(kVabs, kFpNeon); 3779 os() << ToCString(kVabs) << ConditionPrinter(it_block_, cond) << dt << " " 3780 << rd << ", " << rm; 3781 } 3782 3783 void Disassembler::vabs(Condition cond, 3784 DataType dt, 3785 QRegister rd, 3786 QRegister rm) { 3787 os().SetCurrentInstruction(kVabs, kFpNeon); 3788 os() << ToCString(kVabs) << ConditionPrinter(it_block_, cond) << dt << " " 3789 << rd << ", " << rm; 3790 } 3791 3792 void Disassembler::vabs(Condition cond, 3793 DataType dt, 3794 SRegister rd, 3795 SRegister rm) { 3796 os().SetCurrentInstruction(kVabs, kFpNeon); 3797 os() << ToCString(kVabs) << ConditionPrinter(it_block_, cond) << dt << " " 3798 << rd << ", " << rm; 3799 } 3800 3801 void Disassembler::vacge( 3802 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { 3803 os().SetCurrentInstruction(kVacge, kFpNeon); 3804 os() << ToCString(kVacge) << ConditionPrinter(it_block_, cond) << dt; 3805 os() << " "; 3806 if (!rd.Is(rn) || !use_short_hand_form_) { 3807 os() << rd << ", "; 3808 } 3809 os() << rn << ", " << rm; 3810 } 3811 3812 void Disassembler::vacge( 3813 Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { 3814 os().SetCurrentInstruction(kVacge, kFpNeon); 3815 os() << ToCString(kVacge) << ConditionPrinter(it_block_, cond) << dt; 3816 os() << " "; 3817 if (!rd.Is(rn) || !use_short_hand_form_) { 3818 os() << rd << ", "; 3819 } 3820 os() << rn << ", " << rm; 3821 } 3822 3823 void Disassembler::vacgt( 3824 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { 3825 os().SetCurrentInstruction(kVacgt, kFpNeon); 3826 os() << ToCString(kVacgt) << ConditionPrinter(it_block_, cond) << dt; 3827 os() << " "; 3828 if (!rd.Is(rn) || !use_short_hand_form_) { 3829 os() << rd << ", "; 3830 } 3831 os() << rn << ", " << rm; 3832 } 3833 3834 void Disassembler::vacgt( 3835 Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { 3836 os().SetCurrentInstruction(kVacgt, kFpNeon); 3837 os() << ToCString(kVacgt) << ConditionPrinter(it_block_, cond) << dt; 3838 os() << " "; 3839 if (!rd.Is(rn) || !use_short_hand_form_) { 3840 os() << rd << ", "; 3841 } 3842 os() << rn << ", " << rm; 3843 } 3844 3845 void Disassembler::vacle( 3846 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { 3847 os().SetCurrentInstruction(kVacle, kFpNeon); 3848 os() << ToCString(kVacle) << ConditionPrinter(it_block_, cond) << dt; 3849 os() << " "; 3850 if (!rd.Is(rn) || !use_short_hand_form_) { 3851 os() << rd << ", "; 3852 } 3853 os() << rn << ", " << rm; 3854 } 3855 3856 void Disassembler::vacle( 3857 Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { 3858 os().SetCurrentInstruction(kVacle, kFpNeon); 3859 os() << ToCString(kVacle) << ConditionPrinter(it_block_, cond) << dt; 3860 os() << " "; 3861 if (!rd.Is(rn) || !use_short_hand_form_) { 3862 os() << rd << ", "; 3863 } 3864 os() << rn << ", " << rm; 3865 } 3866 3867 void Disassembler::vaclt( 3868 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { 3869 os().SetCurrentInstruction(kVaclt, kFpNeon); 3870 os() << ToCString(kVaclt) << ConditionPrinter(it_block_, cond) << dt; 3871 os() << " "; 3872 if (!rd.Is(rn) || !use_short_hand_form_) { 3873 os() << rd << ", "; 3874 } 3875 os() << rn << ", " << rm; 3876 } 3877 3878 void Disassembler::vaclt( 3879 Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { 3880 os().SetCurrentInstruction(kVaclt, kFpNeon); 3881 os() << ToCString(kVaclt) << ConditionPrinter(it_block_, cond) << dt; 3882 os() << " "; 3883 if (!rd.Is(rn) || !use_short_hand_form_) { 3884 os() << rd << ", "; 3885 } 3886 os() << rn << ", " << rm; 3887 } 3888 3889 void Disassembler::vadd( 3890 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { 3891 os().SetCurrentInstruction(kVadd, kFpNeon); 3892 os() << ToCString(kVadd) << ConditionPrinter(it_block_, cond) << dt; 3893 os() << " "; 3894 if (!rd.Is(rn) || !use_short_hand_form_) { 3895 os() << rd << ", "; 3896 } 3897 os() << rn << ", " << rm; 3898 } 3899 3900 void Disassembler::vadd( 3901 Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { 3902 os().SetCurrentInstruction(kVadd, kFpNeon); 3903 os() << ToCString(kVadd) << ConditionPrinter(it_block_, cond) << dt; 3904 os() << " "; 3905 if (!rd.Is(rn) || !use_short_hand_form_) { 3906 os() << rd << ", "; 3907 } 3908 os() << rn << ", " << rm; 3909 } 3910 3911 void Disassembler::vadd( 3912 Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) { 3913 os().SetCurrentInstruction(kVadd, kFpNeon); 3914 os() << ToCString(kVadd) << ConditionPrinter(it_block_, cond) << dt; 3915 os() << " "; 3916 if (!rd.Is(rn) || !use_short_hand_form_) { 3917 os() << rd << ", "; 3918 } 3919 os() << rn << ", " << rm; 3920 } 3921 3922 void Disassembler::vaddhn( 3923 Condition cond, DataType dt, DRegister rd, QRegister rn, QRegister rm) { 3924 os().SetCurrentInstruction(kVaddhn, kFpNeon); 3925 os() << ToCString(kVaddhn) << ConditionPrinter(it_block_, cond) << dt << " " 3926 << rd << ", " << rn << ", " << rm; 3927 } 3928 3929 void Disassembler::vaddl( 3930 Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) { 3931 os().SetCurrentInstruction(kVaddl, kFpNeon); 3932 os() << ToCString(kVaddl) << ConditionPrinter(it_block_, cond) << dt << " " 3933 << rd << ", " << rn << ", " << rm; 3934 } 3935 3936 void Disassembler::vaddw( 3937 Condition cond, DataType dt, QRegister rd, QRegister rn, DRegister rm) { 3938 os().SetCurrentInstruction(kVaddw, kFpNeon); 3939 os() << ToCString(kVaddw) << ConditionPrinter(it_block_, cond) << dt; 3940 os() << " "; 3941 if (!rd.Is(rn) || !use_short_hand_form_) { 3942 os() << rd << ", "; 3943 } 3944 os() << rn << ", " << rm; 3945 } 3946 3947 void Disassembler::vand(Condition cond, 3948 DataType dt, 3949 DRegister rd, 3950 DRegister rn, 3951 const DOperand& operand) { 3952 os().SetCurrentInstruction(kVand, kFpNeon); 3953 os() << ToCString(kVand) << ConditionPrinter(it_block_, cond) << dt; 3954 os() << " "; 3955 if (!rd.Is(rn) || !use_short_hand_form_) { 3956 os() << rd << ", "; 3957 } 3958 os() << rn << ", " << operand; 3959 } 3960 3961 void Disassembler::vand(Condition cond, 3962 DataType dt, 3963 QRegister rd, 3964 QRegister rn, 3965 const QOperand& operand) { 3966 os().SetCurrentInstruction(kVand, kFpNeon); 3967 os() << ToCString(kVand) << ConditionPrinter(it_block_, cond) << dt; 3968 os() << " "; 3969 if (!rd.Is(rn) || !use_short_hand_form_) { 3970 os() << rd << ", "; 3971 } 3972 os() << rn << ", " << operand; 3973 } 3974 3975 void Disassembler::vbic(Condition cond, 3976 DataType dt, 3977 DRegister rd, 3978 DRegister rn, 3979 const DOperand& operand) { 3980 os().SetCurrentInstruction(kVbic, kFpNeon); 3981 os() << ToCString(kVbic) << ConditionPrinter(it_block_, cond) << dt; 3982 os() << " "; 3983 if (!rd.Is(rn) || !use_short_hand_form_) { 3984 os() << rd << ", "; 3985 } 3986 os() << rn << ", " << operand; 3987 } 3988 3989 void Disassembler::vbic(Condition cond, 3990 DataType dt, 3991 QRegister rd, 3992 QRegister rn, 3993 const QOperand& operand) { 3994 os().SetCurrentInstruction(kVbic, kFpNeon); 3995 os() << ToCString(kVbic) << ConditionPrinter(it_block_, cond) << dt; 3996 os() << " "; 3997 if (!rd.Is(rn) || !use_short_hand_form_) { 3998 os() << rd << ", "; 3999 } 4000 os() << rn << ", " << operand; 4001 } 4002 4003 void Disassembler::vbif( 4004 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { 4005 os().SetCurrentInstruction(kVbif, kFpNeon); 4006 os() << ToCString(kVbif) << ConditionPrinter(it_block_, cond) << dt; 4007 os() << " "; 4008 if (!rd.Is(rn) || !use_short_hand_form_) { 4009 os() << rd << ", "; 4010 } 4011 os() << rn << ", " << rm; 4012 } 4013 4014 void Disassembler::vbif( 4015 Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { 4016 os().SetCurrentInstruction(kVbif, kFpNeon); 4017 os() << ToCString(kVbif) << ConditionPrinter(it_block_, cond) << dt; 4018 os() << " "; 4019 if (!rd.Is(rn) || !use_short_hand_form_) { 4020 os() << rd << ", "; 4021 } 4022 os() << rn << ", " << rm; 4023 } 4024 4025 void Disassembler::vbit( 4026 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { 4027 os().SetCurrentInstruction(kVbit, kFpNeon); 4028 os() << ToCString(kVbit) << ConditionPrinter(it_block_, cond) << dt; 4029 os() << " "; 4030 if (!rd.Is(rn) || !use_short_hand_form_) { 4031 os() << rd << ", "; 4032 } 4033 os() << rn << ", " << rm; 4034 } 4035 4036 void Disassembler::vbit( 4037 Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { 4038 os().SetCurrentInstruction(kVbit, kFpNeon); 4039 os() << ToCString(kVbit) << ConditionPrinter(it_block_, cond) << dt; 4040 os() << " "; 4041 if (!rd.Is(rn) || !use_short_hand_form_) { 4042 os() << rd << ", "; 4043 } 4044 os() << rn << ", " << rm; 4045 } 4046 4047 void Disassembler::vbsl( 4048 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { 4049 os().SetCurrentInstruction(kVbsl, kFpNeon); 4050 os() << ToCString(kVbsl) << ConditionPrinter(it_block_, cond) << dt; 4051 os() << " "; 4052 if (!rd.Is(rn) || !use_short_hand_form_) { 4053 os() << rd << ", "; 4054 } 4055 os() << rn << ", " << rm; 4056 } 4057 4058 void Disassembler::vbsl( 4059 Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { 4060 os().SetCurrentInstruction(kVbsl, kFpNeon); 4061 os() << ToCString(kVbsl) << ConditionPrinter(it_block_, cond) << dt; 4062 os() << " "; 4063 if (!rd.Is(rn) || !use_short_hand_form_) { 4064 os() << rd << ", "; 4065 } 4066 os() << rn << ", " << rm; 4067 } 4068 4069 void Disassembler::vceq(Condition cond, 4070 DataType dt, 4071 DRegister rd, 4072 DRegister rm, 4073 const DOperand& operand) { 4074 os().SetCurrentInstruction(kVceq, kFpNeon); 4075 os() << ToCString(kVceq) << ConditionPrinter(it_block_, cond) << dt; 4076 os() << " "; 4077 if (!rd.Is(rm) || !use_short_hand_form_) { 4078 os() << rd << ", "; 4079 } 4080 os() << rm << ", " << operand; 4081 } 4082 4083 void Disassembler::vceq(Condition cond, 4084 DataType dt, 4085 QRegister rd, 4086 QRegister rm, 4087 const QOperand& operand) { 4088 os().SetCurrentInstruction(kVceq, kFpNeon); 4089 os() << ToCString(kVceq) << ConditionPrinter(it_block_, cond) << dt; 4090 os() << " "; 4091 if (!rd.Is(rm) || !use_short_hand_form_) { 4092 os() << rd << ", "; 4093 } 4094 os() << rm << ", " << operand; 4095 } 4096 4097 void Disassembler::vceq( 4098 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { 4099 os().SetCurrentInstruction(kVceq, kFpNeon); 4100 os() << ToCString(kVceq) << ConditionPrinter(it_block_, cond) << dt; 4101 os() << " "; 4102 if (!rd.Is(rn) || !use_short_hand_form_) { 4103 os() << rd << ", "; 4104 } 4105 os() << rn << ", " << rm; 4106 } 4107 4108 void Disassembler::vceq( 4109 Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { 4110 os().SetCurrentInstruction(kVceq, kFpNeon); 4111 os() << ToCString(kVceq) << ConditionPrinter(it_block_, cond) << dt; 4112 os() << " "; 4113 if (!rd.Is(rn) || !use_short_hand_form_) { 4114 os() << rd << ", "; 4115 } 4116 os() << rn << ", " << rm; 4117 } 4118 4119 void Disassembler::vcge(Condition cond, 4120 DataType dt, 4121 DRegister rd, 4122 DRegister rm, 4123 const DOperand& operand) { 4124 os().SetCurrentInstruction(kVcge, kFpNeon); 4125 os() << ToCString(kVcge) << ConditionPrinter(it_block_, cond) << dt; 4126 os() << " "; 4127 if (!rd.Is(rm) || !use_short_hand_form_) { 4128 os() << rd << ", "; 4129 } 4130 os() << rm << ", " << operand; 4131 } 4132 4133 void Disassembler::vcge(Condition cond, 4134 DataType dt, 4135 QRegister rd, 4136 QRegister rm, 4137 const QOperand& operand) { 4138 os().SetCurrentInstruction(kVcge, kFpNeon); 4139 os() << ToCString(kVcge) << ConditionPrinter(it_block_, cond) << dt; 4140 os() << " "; 4141 if (!rd.Is(rm) || !use_short_hand_form_) { 4142 os() << rd << ", "; 4143 } 4144 os() << rm << ", " << operand; 4145 } 4146 4147 void Disassembler::vcge( 4148 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { 4149 os().SetCurrentInstruction(kVcge, kFpNeon); 4150 os() << ToCString(kVcge) << ConditionPrinter(it_block_, cond) << dt; 4151 os() << " "; 4152 if (!rd.Is(rn) || !use_short_hand_form_) { 4153 os() << rd << ", "; 4154 } 4155 os() << rn << ", " << rm; 4156 } 4157 4158 void Disassembler::vcge( 4159 Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { 4160 os().SetCurrentInstruction(kVcge, kFpNeon); 4161 os() << ToCString(kVcge) << ConditionPrinter(it_block_, cond) << dt; 4162 os() << " "; 4163 if (!rd.Is(rn) || !use_short_hand_form_) { 4164 os() << rd << ", "; 4165 } 4166 os() << rn << ", " << rm; 4167 } 4168 4169 void Disassembler::vcgt(Condition cond, 4170 DataType dt, 4171 DRegister rd, 4172 DRegister rm, 4173 const DOperand& operand) { 4174 os().SetCurrentInstruction(kVcgt, kFpNeon); 4175 os() << ToCString(kVcgt) << ConditionPrinter(it_block_, cond) << dt; 4176 os() << " "; 4177 if (!rd.Is(rm) || !use_short_hand_form_) { 4178 os() << rd << ", "; 4179 } 4180 os() << rm << ", " << operand; 4181 } 4182 4183 void Disassembler::vcgt(Condition cond, 4184 DataType dt, 4185 QRegister rd, 4186 QRegister rm, 4187 const QOperand& operand) { 4188 os().SetCurrentInstruction(kVcgt, kFpNeon); 4189 os() << ToCString(kVcgt) << ConditionPrinter(it_block_, cond) << dt; 4190 os() << " "; 4191 if (!rd.Is(rm) || !use_short_hand_form_) { 4192 os() << rd << ", "; 4193 } 4194 os() << rm << ", " << operand; 4195 } 4196 4197 void Disassembler::vcgt( 4198 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { 4199 os().SetCurrentInstruction(kVcgt, kFpNeon); 4200 os() << ToCString(kVcgt) << ConditionPrinter(it_block_, cond) << dt; 4201 os() << " "; 4202 if (!rd.Is(rn) || !use_short_hand_form_) { 4203 os() << rd << ", "; 4204 } 4205 os() << rn << ", " << rm; 4206 } 4207 4208 void Disassembler::vcgt( 4209 Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { 4210 os().SetCurrentInstruction(kVcgt, kFpNeon); 4211 os() << ToCString(kVcgt) << ConditionPrinter(it_block_, cond) << dt; 4212 os() << " "; 4213 if (!rd.Is(rn) || !use_short_hand_form_) { 4214 os() << rd << ", "; 4215 } 4216 os() << rn << ", " << rm; 4217 } 4218 4219 void Disassembler::vcle(Condition cond, 4220 DataType dt, 4221 DRegister rd, 4222 DRegister rm, 4223 const DOperand& operand) { 4224 os().SetCurrentInstruction(kVcle, kFpNeon); 4225 os() << ToCString(kVcle) << ConditionPrinter(it_block_, cond) << dt; 4226 os() << " "; 4227 if (!rd.Is(rm) || !use_short_hand_form_) { 4228 os() << rd << ", "; 4229 } 4230 os() << rm << ", " << operand; 4231 } 4232 4233 void Disassembler::vcle(Condition cond, 4234 DataType dt, 4235 QRegister rd, 4236 QRegister rm, 4237 const QOperand& operand) { 4238 os().SetCurrentInstruction(kVcle, kFpNeon); 4239 os() << ToCString(kVcle) << ConditionPrinter(it_block_, cond) << dt; 4240 os() << " "; 4241 if (!rd.Is(rm) || !use_short_hand_form_) { 4242 os() << rd << ", "; 4243 } 4244 os() << rm << ", " << operand; 4245 } 4246 4247 void Disassembler::vcle( 4248 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { 4249 os().SetCurrentInstruction(kVcle, kFpNeon); 4250 os() << ToCString(kVcle) << ConditionPrinter(it_block_, cond) << dt; 4251 os() << " "; 4252 if (!rd.Is(rn) || !use_short_hand_form_) { 4253 os() << rd << ", "; 4254 } 4255 os() << rn << ", " << rm; 4256 } 4257 4258 void Disassembler::vcle( 4259 Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { 4260 os().SetCurrentInstruction(kVcle, kFpNeon); 4261 os() << ToCString(kVcle) << ConditionPrinter(it_block_, cond) << dt; 4262 os() << " "; 4263 if (!rd.Is(rn) || !use_short_hand_form_) { 4264 os() << rd << ", "; 4265 } 4266 os() << rn << ", " << rm; 4267 } 4268 4269 void Disassembler::vcls(Condition cond, 4270 DataType dt, 4271 DRegister rd, 4272 DRegister rm) { 4273 os().SetCurrentInstruction(kVcls, kFpNeon); 4274 os() << ToCString(kVcls) << ConditionPrinter(it_block_, cond) << dt << " " 4275 << rd << ", " << rm; 4276 } 4277 4278 void Disassembler::vcls(Condition cond, 4279 DataType dt, 4280 QRegister rd, 4281 QRegister rm) { 4282 os().SetCurrentInstruction(kVcls, kFpNeon); 4283 os() << ToCString(kVcls) << ConditionPrinter(it_block_, cond) << dt << " " 4284 << rd << ", " << rm; 4285 } 4286 4287 void Disassembler::vclt(Condition cond, 4288 DataType dt, 4289 DRegister rd, 4290 DRegister rm, 4291 const DOperand& operand) { 4292 os().SetCurrentInstruction(kVclt, kFpNeon); 4293 os() << ToCString(kVclt) << ConditionPrinter(it_block_, cond) << dt; 4294 os() << " "; 4295 if (!rd.Is(rm) || !use_short_hand_form_) { 4296 os() << rd << ", "; 4297 } 4298 os() << rm << ", " << operand; 4299 } 4300 4301 void Disassembler::vclt(Condition cond, 4302 DataType dt, 4303 QRegister rd, 4304 QRegister rm, 4305 const QOperand& operand) { 4306 os().SetCurrentInstruction(kVclt, kFpNeon); 4307 os() << ToCString(kVclt) << ConditionPrinter(it_block_, cond) << dt; 4308 os() << " "; 4309 if (!rd.Is(rm) || !use_short_hand_form_) { 4310 os() << rd << ", "; 4311 } 4312 os() << rm << ", " << operand; 4313 } 4314 4315 void Disassembler::vclt( 4316 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { 4317 os().SetCurrentInstruction(kVclt, kFpNeon); 4318 os() << ToCString(kVclt) << ConditionPrinter(it_block_, cond) << dt; 4319 os() << " "; 4320 if (!rd.Is(rn) || !use_short_hand_form_) { 4321 os() << rd << ", "; 4322 } 4323 os() << rn << ", " << rm; 4324 } 4325 4326 void Disassembler::vclt( 4327 Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { 4328 os().SetCurrentInstruction(kVclt, kFpNeon); 4329 os() << ToCString(kVclt) << ConditionPrinter(it_block_, cond) << dt; 4330 os() << " "; 4331 if (!rd.Is(rn) || !use_short_hand_form_) { 4332 os() << rd << ", "; 4333 } 4334 os() << rn << ", " << rm; 4335 } 4336 4337 void Disassembler::vclz(Condition cond, 4338 DataType dt, 4339 DRegister rd, 4340 DRegister rm) { 4341 os().SetCurrentInstruction(kVclz, kFpNeon); 4342 os() << ToCString(kVclz) << ConditionPrinter(it_block_, cond) << dt << " " 4343 << rd << ", " << rm; 4344 } 4345 4346 void Disassembler::vclz(Condition cond, 4347 DataType dt, 4348 QRegister rd, 4349 QRegister rm) { 4350 os().SetCurrentInstruction(kVclz, kFpNeon); 4351 os() << ToCString(kVclz) << ConditionPrinter(it_block_, cond) << dt << " " 4352 << rd << ", " << rm; 4353 } 4354 4355 void Disassembler::vcmp(Condition cond, 4356 DataType dt, 4357 SRegister rd, 4358 const SOperand& operand) { 4359 os().SetCurrentInstruction(kVcmp, kFpNeon); 4360 os() << ToCString(kVcmp) << ConditionPrinter(it_block_, cond) << dt << " " 4361 << rd << ", " << operand; 4362 } 4363 4364 void Disassembler::vcmp(Condition cond, 4365 DataType dt, 4366 DRegister rd, 4367 const DOperand& operand) { 4368 os().SetCurrentInstruction(kVcmp, kFpNeon); 4369 os() << ToCString(kVcmp) << ConditionPrinter(it_block_, cond) << dt << " " 4370 << rd << ", " << operand; 4371 } 4372 4373 void Disassembler::vcmpe(Condition cond, 4374 DataType dt, 4375 SRegister rd, 4376 const SOperand& operand) { 4377 os().SetCurrentInstruction(kVcmpe, kFpNeon); 4378 os() << ToCString(kVcmpe) << ConditionPrinter(it_block_, cond) << dt << " " 4379 << rd << ", " << operand; 4380 } 4381 4382 void Disassembler::vcmpe(Condition cond, 4383 DataType dt, 4384 DRegister rd, 4385 const DOperand& operand) { 4386 os().SetCurrentInstruction(kVcmpe, kFpNeon); 4387 os() << ToCString(kVcmpe) << ConditionPrinter(it_block_, cond) << dt << " " 4388 << rd << ", " << operand; 4389 } 4390 4391 void Disassembler::vcnt(Condition cond, 4392 DataType dt, 4393 DRegister rd, 4394 DRegister rm) { 4395 os().SetCurrentInstruction(kVcnt, kFpNeon); 4396 os() << ToCString(kVcnt) << ConditionPrinter(it_block_, cond) << dt << " " 4397 << rd << ", " << rm; 4398 } 4399 4400 void Disassembler::vcnt(Condition cond, 4401 DataType dt, 4402 QRegister rd, 4403 QRegister rm) { 4404 os().SetCurrentInstruction(kVcnt, kFpNeon); 4405 os() << ToCString(kVcnt) << ConditionPrinter(it_block_, cond) << dt << " " 4406 << rd << ", " << rm; 4407 } 4408 4409 void Disassembler::vcvt( 4410 Condition cond, DataType dt1, DataType dt2, DRegister rd, SRegister rm) { 4411 os().SetCurrentInstruction(kVcvt, kFpNeon); 4412 os() << ToCString(kVcvt) << ConditionPrinter(it_block_, cond) << dt1 << dt2 4413 << " " << rd << ", " << rm; 4414 } 4415 4416 void Disassembler::vcvt( 4417 Condition cond, DataType dt1, DataType dt2, SRegister rd, DRegister rm) { 4418 os().SetCurrentInstruction(kVcvt, kFpNeon); 4419 os() << ToCString(kVcvt) << ConditionPrinter(it_block_, cond) << dt1 << dt2 4420 << " " << rd << ", " << rm; 4421 } 4422 4423 void Disassembler::vcvt(Condition cond, 4424 DataType dt1, 4425 DataType dt2, 4426 DRegister rd, 4427 DRegister rm, 4428 int32_t fbits) { 4429 os().SetCurrentInstruction(kVcvt, kFpNeon); 4430 os() << ToCString(kVcvt) << ConditionPrinter(it_block_, cond) << dt1 << dt2 4431 << " " << rd << ", " << rm << ", " << SignedImmediatePrinter(fbits); 4432 } 4433 4434 void Disassembler::vcvt(Condition cond, 4435 DataType dt1, 4436 DataType dt2, 4437 QRegister rd, 4438 QRegister rm, 4439 int32_t fbits) { 4440 os().SetCurrentInstruction(kVcvt, kFpNeon); 4441 os() << ToCString(kVcvt) << ConditionPrinter(it_block_, cond) << dt1 << dt2 4442 << " " << rd << ", " << rm << ", " << SignedImmediatePrinter(fbits); 4443 } 4444 4445 void Disassembler::vcvt(Condition cond, 4446 DataType dt1, 4447 DataType dt2, 4448 SRegister rd, 4449 SRegister rm, 4450 int32_t fbits) { 4451 os().SetCurrentInstruction(kVcvt, kFpNeon); 4452 os() << ToCString(kVcvt) << ConditionPrinter(it_block_, cond) << dt1 << dt2 4453 << " " << rd << ", " << rm << ", " << SignedImmediatePrinter(fbits); 4454 } 4455 4456 void Disassembler::vcvt( 4457 Condition cond, DataType dt1, DataType dt2, DRegister rd, DRegister rm) { 4458 os().SetCurrentInstruction(kVcvt, kFpNeon); 4459 os() << ToCString(kVcvt) << ConditionPrinter(it_block_, cond) << dt1 << dt2 4460 << " " << rd << ", " << rm; 4461 } 4462 4463 void Disassembler::vcvt( 4464 Condition cond, DataType dt1, DataType dt2, QRegister rd, QRegister rm) { 4465 os().SetCurrentInstruction(kVcvt, kFpNeon); 4466 os() << ToCString(kVcvt) << ConditionPrinter(it_block_, cond) << dt1 << dt2 4467 << " " << rd << ", " << rm; 4468 } 4469 4470 void Disassembler::vcvt( 4471 Condition cond, DataType dt1, DataType dt2, DRegister rd, QRegister rm) { 4472 os().SetCurrentInstruction(kVcvt, kFpNeon); 4473 os() << ToCString(kVcvt) << ConditionPrinter(it_block_, cond) << dt1 << dt2 4474 << " " << rd << ", " << rm; 4475 } 4476 4477 void Disassembler::vcvt( 4478 Condition cond, DataType dt1, DataType dt2, QRegister rd, DRegister rm) { 4479 os().SetCurrentInstruction(kVcvt, kFpNeon); 4480 os() << ToCString(kVcvt) << ConditionPrinter(it_block_, cond) << dt1 << dt2 4481 << " " << rd << ", " << rm; 4482 } 4483 4484 void Disassembler::vcvt( 4485 Condition cond, DataType dt1, DataType dt2, SRegister rd, SRegister rm) { 4486 os().SetCurrentInstruction(kVcvt, kFpNeon); 4487 os() << ToCString(kVcvt) << ConditionPrinter(it_block_, cond) << dt1 << dt2 4488 << " " << rd << ", " << rm; 4489 } 4490 4491 void Disassembler::vcvta(DataType dt1, 4492 DataType dt2, 4493 DRegister rd, 4494 DRegister rm) { 4495 os().SetCurrentInstruction(kVcvta, kFpNeon); 4496 os() << ToCString(kVcvta) << dt1 << dt2 << " " << rd << ", " << rm; 4497 } 4498 4499 void Disassembler::vcvta(DataType dt1, 4500 DataType dt2, 4501 QRegister rd, 4502 QRegister rm) { 4503 os().SetCurrentInstruction(kVcvta, kFpNeon); 4504 os() << ToCString(kVcvta) << dt1 << dt2 << " " << rd << ", " << rm; 4505 } 4506 4507 void Disassembler::vcvta(DataType dt1, 4508 DataType dt2, 4509 SRegister rd, 4510 SRegister rm) { 4511 os().SetCurrentInstruction(kVcvta, kFpNeon); 4512 os() << ToCString(kVcvta) << dt1 << dt2 << " " << rd << ", " << rm; 4513 } 4514 4515 void Disassembler::vcvta(DataType dt1, 4516 DataType dt2, 4517 SRegister rd, 4518 DRegister rm) { 4519 os().SetCurrentInstruction(kVcvta, kFpNeon); 4520 os() << ToCString(kVcvta) << dt1 << dt2 << " " << rd << ", " << rm; 4521 } 4522 4523 void Disassembler::vcvtb( 4524 Condition cond, DataType dt1, DataType dt2, SRegister rd, SRegister rm) { 4525 os().SetCurrentInstruction(kVcvtb, kFpNeon); 4526 os() << ToCString(kVcvtb) << ConditionPrinter(it_block_, cond) << dt1 << dt2 4527 << " " << rd << ", " << rm; 4528 } 4529 4530 void Disassembler::vcvtb( 4531 Condition cond, DataType dt1, DataType dt2, DRegister rd, SRegister rm) { 4532 os().SetCurrentInstruction(kVcvtb, kFpNeon); 4533 os() << ToCString(kVcvtb) << ConditionPrinter(it_block_, cond) << dt1 << dt2 4534 << " " << rd << ", " << rm; 4535 } 4536 4537 void Disassembler::vcvtb( 4538 Condition cond, DataType dt1, DataType dt2, SRegister rd, DRegister rm) { 4539 os().SetCurrentInstruction(kVcvtb, kFpNeon); 4540 os() << ToCString(kVcvtb) << ConditionPrinter(it_block_, cond) << dt1 << dt2 4541 << " " << rd << ", " << rm; 4542 } 4543 4544 void Disassembler::vcvtm(DataType dt1, 4545 DataType dt2, 4546 DRegister rd, 4547 DRegister rm) { 4548 os().SetCurrentInstruction(kVcvtm, kFpNeon); 4549 os() << ToCString(kVcvtm) << dt1 << dt2 << " " << rd << ", " << rm; 4550 } 4551 4552 void Disassembler::vcvtm(DataType dt1, 4553 DataType dt2, 4554 QRegister rd, 4555 QRegister rm) { 4556 os().SetCurrentInstruction(kVcvtm, kFpNeon); 4557 os() << ToCString(kVcvtm) << dt1 << dt2 << " " << rd << ", " << rm; 4558 } 4559 4560 void Disassembler::vcvtm(DataType dt1, 4561 DataType dt2, 4562 SRegister rd, 4563 SRegister rm) { 4564 os().SetCurrentInstruction(kVcvtm, kFpNeon); 4565 os() << ToCString(kVcvtm) << dt1 << dt2 << " " << rd << ", " << rm; 4566 } 4567 4568 void Disassembler::vcvtm(DataType dt1, 4569 DataType dt2, 4570 SRegister rd, 4571 DRegister rm) { 4572 os().SetCurrentInstruction(kVcvtm, kFpNeon); 4573 os() << ToCString(kVcvtm) << dt1 << dt2 << " " << rd << ", " << rm; 4574 } 4575 4576 void Disassembler::vcvtn(DataType dt1, 4577 DataType dt2, 4578 DRegister rd, 4579 DRegister rm) { 4580 os().SetCurrentInstruction(kVcvtn, kFpNeon); 4581 os() << ToCString(kVcvtn) << dt1 << dt2 << " " << rd << ", " << rm; 4582 } 4583 4584 void Disassembler::vcvtn(DataType dt1, 4585 DataType dt2, 4586 QRegister rd, 4587 QRegister rm) { 4588 os().SetCurrentInstruction(kVcvtn, kFpNeon); 4589 os() << ToCString(kVcvtn) << dt1 << dt2 << " " << rd << ", " << rm; 4590 } 4591 4592 void Disassembler::vcvtn(DataType dt1, 4593 DataType dt2, 4594 SRegister rd, 4595 SRegister rm) { 4596 os().SetCurrentInstruction(kVcvtn, kFpNeon); 4597 os() << ToCString(kVcvtn) << dt1 << dt2 << " " << rd << ", " << rm; 4598 } 4599 4600 void Disassembler::vcvtn(DataType dt1, 4601 DataType dt2, 4602 SRegister rd, 4603 DRegister rm) { 4604 os().SetCurrentInstruction(kVcvtn, kFpNeon); 4605 os() << ToCString(kVcvtn) << dt1 << dt2 << " " << rd << ", " << rm; 4606 } 4607 4608 void Disassembler::vcvtp(DataType dt1, 4609 DataType dt2, 4610 DRegister rd, 4611 DRegister rm) { 4612 os().SetCurrentInstruction(kVcvtp, kFpNeon); 4613 os() << ToCString(kVcvtp) << dt1 << dt2 << " " << rd << ", " << rm; 4614 } 4615 4616 void Disassembler::vcvtp(DataType dt1, 4617 DataType dt2, 4618 QRegister rd, 4619 QRegister rm) { 4620 os().SetCurrentInstruction(kVcvtp, kFpNeon); 4621 os() << ToCString(kVcvtp) << dt1 << dt2 << " " << rd << ", " << rm; 4622 } 4623 4624 void Disassembler::vcvtp(DataType dt1, 4625 DataType dt2, 4626 SRegister rd, 4627 SRegister rm) { 4628 os().SetCurrentInstruction(kVcvtp, kFpNeon); 4629 os() << ToCString(kVcvtp) << dt1 << dt2 << " " << rd << ", " << rm; 4630 } 4631 4632 void Disassembler::vcvtp(DataType dt1, 4633 DataType dt2, 4634 SRegister rd, 4635 DRegister rm) { 4636 os().SetCurrentInstruction(kVcvtp, kFpNeon); 4637 os() << ToCString(kVcvtp) << dt1 << dt2 << " " << rd << ", " << rm; 4638 } 4639 4640 void Disassembler::vcvtr( 4641 Condition cond, DataType dt1, DataType dt2, SRegister rd, SRegister rm) { 4642 os().SetCurrentInstruction(kVcvtr, kFpNeon); 4643 os() << ToCString(kVcvtr) << ConditionPrinter(it_block_, cond) << dt1 << dt2 4644 << " " << rd << ", " << rm; 4645 } 4646 4647 void Disassembler::vcvtr( 4648 Condition cond, DataType dt1, DataType dt2, SRegister rd, DRegister rm) { 4649 os().SetCurrentInstruction(kVcvtr, kFpNeon); 4650 os() << ToCString(kVcvtr) << ConditionPrinter(it_block_, cond) << dt1 << dt2 4651 << " " << rd << ", " << rm; 4652 } 4653 4654 void Disassembler::vcvtt( 4655 Condition cond, DataType dt1, DataType dt2, SRegister rd, SRegister rm) { 4656 os().SetCurrentInstruction(kVcvtt, kFpNeon); 4657 os() << ToCString(kVcvtt) << ConditionPrinter(it_block_, cond) << dt1 << dt2 4658 << " " << rd << ", " << rm; 4659 } 4660 4661 void Disassembler::vcvtt( 4662 Condition cond, DataType dt1, DataType dt2, DRegister rd, SRegister rm) { 4663 os().SetCurrentInstruction(kVcvtt, kFpNeon); 4664 os() << ToCString(kVcvtt) << ConditionPrinter(it_block_, cond) << dt1 << dt2 4665 << " " << rd << ", " << rm; 4666 } 4667 4668 void Disassembler::vcvtt( 4669 Condition cond, DataType dt1, DataType dt2, SRegister rd, DRegister rm) { 4670 os().SetCurrentInstruction(kVcvtt, kFpNeon); 4671 os() << ToCString(kVcvtt) << ConditionPrinter(it_block_, cond) << dt1 << dt2 4672 << " " << rd << ", " << rm; 4673 } 4674 4675 void Disassembler::vdiv( 4676 Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) { 4677 os().SetCurrentInstruction(kVdiv, kFpNeon); 4678 os() << ToCString(kVdiv) << ConditionPrinter(it_block_, cond) << dt; 4679 os() << " "; 4680 if (!rd.Is(rn) || !use_short_hand_form_) { 4681 os() << rd << ", "; 4682 } 4683 os() << rn << ", " << rm; 4684 } 4685 4686 void Disassembler::vdiv( 4687 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { 4688 os().SetCurrentInstruction(kVdiv, kFpNeon); 4689 os() << ToCString(kVdiv) << ConditionPrinter(it_block_, cond) << dt; 4690 os() << " "; 4691 if (!rd.Is(rn) || !use_short_hand_form_) { 4692 os() << rd << ", "; 4693 } 4694 os() << rn << ", " << rm; 4695 } 4696 4697 void Disassembler::vdup(Condition cond, 4698 DataType dt, 4699 QRegister rd, 4700 Register rt) { 4701 os().SetCurrentInstruction(kVdup, kFpNeon); 4702 os() << ToCString(kVdup) << ConditionPrinter(it_block_, cond) << dt << " " 4703 << rd << ", " << rt; 4704 } 4705 4706 void Disassembler::vdup(Condition cond, 4707 DataType dt, 4708 DRegister rd, 4709 Register rt) { 4710 os().SetCurrentInstruction(kVdup, kFpNeon); 4711 os() << ToCString(kVdup) << ConditionPrinter(it_block_, cond) << dt << " " 4712 << rd << ", " << rt; 4713 } 4714 4715 void Disassembler::vdup(Condition cond, 4716 DataType dt, 4717 DRegister rd, 4718 DRegisterLane rm) { 4719 os().SetCurrentInstruction(kVdup, kFpNeon); 4720 os() << ToCString(kVdup) << ConditionPrinter(it_block_, cond) << dt << " " 4721 << rd << ", " << rm; 4722 } 4723 4724 void Disassembler::vdup(Condition cond, 4725 DataType dt, 4726 QRegister rd, 4727 DRegisterLane rm) { 4728 os().SetCurrentInstruction(kVdup, kFpNeon); 4729 os() << ToCString(kVdup) << ConditionPrinter(it_block_, cond) << dt << " " 4730 << rd << ", " << rm; 4731 } 4732 4733 void Disassembler::veor( 4734 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { 4735 os().SetCurrentInstruction(kVeor, kFpNeon); 4736 os() << ToCString(kVeor) << ConditionPrinter(it_block_, cond) << dt; 4737 os() << " "; 4738 if (!rd.Is(rn) || !use_short_hand_form_) { 4739 os() << rd << ", "; 4740 } 4741 os() << rn << ", " << rm; 4742 } 4743 4744 void Disassembler::veor( 4745 Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { 4746 os().SetCurrentInstruction(kVeor, kFpNeon); 4747 os() << ToCString(kVeor) << ConditionPrinter(it_block_, cond) << dt; 4748 os() << " "; 4749 if (!rd.Is(rn) || !use_short_hand_form_) { 4750 os() << rd << ", "; 4751 } 4752 os() << rn << ", " << rm; 4753 } 4754 4755 void Disassembler::vext(Condition cond, 4756 DataType dt, 4757 DRegister rd, 4758 DRegister rn, 4759 DRegister rm, 4760 const DOperand& operand) { 4761 os().SetCurrentInstruction(kVext, kFpNeon); 4762 os() << ToCString(kVext) << ConditionPrinter(it_block_, cond) << dt; 4763 os() << " "; 4764 if (!rd.Is(rn) || !use_short_hand_form_) { 4765 os() << rd << ", "; 4766 } 4767 os() << rn << ", " << rm << ", " << operand; 4768 } 4769 4770 void Disassembler::vext(Condition cond, 4771 DataType dt, 4772 QRegister rd, 4773 QRegister rn, 4774 QRegister rm, 4775 const QOperand& operand) { 4776 os().SetCurrentInstruction(kVext, kFpNeon); 4777 os() << ToCString(kVext) << ConditionPrinter(it_block_, cond) << dt; 4778 os() << " "; 4779 if (!rd.Is(rn) || !use_short_hand_form_) { 4780 os() << rd << ", "; 4781 } 4782 os() << rn << ", " << rm << ", " << operand; 4783 } 4784 4785 void Disassembler::vfma( 4786 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { 4787 os().SetCurrentInstruction(kVfma, kFpNeon); 4788 os() << ToCString(kVfma) << ConditionPrinter(it_block_, cond) << dt << " " 4789 << rd << ", " << rn << ", " << rm; 4790 } 4791 4792 void Disassembler::vfma( 4793 Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { 4794 os().SetCurrentInstruction(kVfma, kFpNeon); 4795 os() << ToCString(kVfma) << ConditionPrinter(it_block_, cond) << dt << " " 4796 << rd << ", " << rn << ", " << rm; 4797 } 4798 4799 void Disassembler::vfma( 4800 Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) { 4801 os().SetCurrentInstruction(kVfma, kFpNeon); 4802 os() << ToCString(kVfma) << ConditionPrinter(it_block_, cond) << dt << " " 4803 << rd << ", " << rn << ", " << rm; 4804 } 4805 4806 void Disassembler::vfms( 4807 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { 4808 os().SetCurrentInstruction(kVfms, kFpNeon); 4809 os() << ToCString(kVfms) << ConditionPrinter(it_block_, cond) << dt << " " 4810 << rd << ", " << rn << ", " << rm; 4811 } 4812 4813 void Disassembler::vfms( 4814 Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { 4815 os().SetCurrentInstruction(kVfms, kFpNeon); 4816 os() << ToCString(kVfms) << ConditionPrinter(it_block_, cond) << dt << " " 4817 << rd << ", " << rn << ", " << rm; 4818 } 4819 4820 void Disassembler::vfms( 4821 Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) { 4822 os().SetCurrentInstruction(kVfms, kFpNeon); 4823 os() << ToCString(kVfms) << ConditionPrinter(it_block_, cond) << dt << " " 4824 << rd << ", " << rn << ", " << rm; 4825 } 4826 4827 void Disassembler::vfnma( 4828 Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) { 4829 os().SetCurrentInstruction(kVfnma, kFpNeon); 4830 os() << ToCString(kVfnma) << ConditionPrinter(it_block_, cond) << dt << " " 4831 << rd << ", " << rn << ", " << rm; 4832 } 4833 4834 void Disassembler::vfnma( 4835 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { 4836 os().SetCurrentInstruction(kVfnma, kFpNeon); 4837 os() << ToCString(kVfnma) << ConditionPrinter(it_block_, cond) << dt << " " 4838 << rd << ", " << rn << ", " << rm; 4839 } 4840 4841 void Disassembler::vfnms( 4842 Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) { 4843 os().SetCurrentInstruction(kVfnms, kFpNeon); 4844 os() << ToCString(kVfnms) << ConditionPrinter(it_block_, cond) << dt << " " 4845 << rd << ", " << rn << ", " << rm; 4846 } 4847 4848 void Disassembler::vfnms( 4849 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { 4850 os().SetCurrentInstruction(kVfnms, kFpNeon); 4851 os() << ToCString(kVfnms) << ConditionPrinter(it_block_, cond) << dt << " " 4852 << rd << ", " << rn << ", " << rm; 4853 } 4854 4855 void Disassembler::vhadd( 4856 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { 4857 os().SetCurrentInstruction(kVhadd, kFpNeon); 4858 os() << ToCString(kVhadd) << ConditionPrinter(it_block_, cond) << dt; 4859 os() << " "; 4860 if (!rd.Is(rn) || !use_short_hand_form_) { 4861 os() << rd << ", "; 4862 } 4863 os() << rn << ", " << rm; 4864 } 4865 4866 void Disassembler::vhadd( 4867 Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { 4868 os().SetCurrentInstruction(kVhadd, kFpNeon); 4869 os() << ToCString(kVhadd) << ConditionPrinter(it_block_, cond) << dt; 4870 os() << " "; 4871 if (!rd.Is(rn) || !use_short_hand_form_) { 4872 os() << rd << ", "; 4873 } 4874 os() << rn << ", " << rm; 4875 } 4876 4877 void Disassembler::vhsub( 4878 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { 4879 os().SetCurrentInstruction(kVhsub, kFpNeon); 4880 os() << ToCString(kVhsub) << ConditionPrinter(it_block_, cond) << dt; 4881 os() << " "; 4882 if (!rd.Is(rn) || !use_short_hand_form_) { 4883 os() << rd << ", "; 4884 } 4885 os() << rn << ", " << rm; 4886 } 4887 4888 void Disassembler::vhsub( 4889 Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { 4890 os().SetCurrentInstruction(kVhsub, kFpNeon); 4891 os() << ToCString(kVhsub) << ConditionPrinter(it_block_, cond) << dt; 4892 os() << " "; 4893 if (!rd.Is(rn) || !use_short_hand_form_) { 4894 os() << rd << ", "; 4895 } 4896 os() << rn << ", " << rm; 4897 } 4898 4899 void Disassembler::vld1(Condition cond, 4900 DataType dt, 4901 const NeonRegisterList& nreglist, 4902 const AlignedMemOperand& operand) { 4903 os().SetCurrentInstruction(kVld1, kFpNeon); 4904 os() << ToCString(kVld1) << ConditionPrinter(it_block_, cond) << dt << " " 4905 << nreglist << ", " << PrintAlignedMemOperand(kVld1Location, operand); 4906 } 4907 4908 void Disassembler::vld2(Condition cond, 4909 DataType dt, 4910 const NeonRegisterList& nreglist, 4911 const AlignedMemOperand& operand) { 4912 os().SetCurrentInstruction(kVld2, kFpNeon); 4913 os() << ToCString(kVld2) << ConditionPrinter(it_block_, cond) << dt << " " 4914 << nreglist << ", " << PrintAlignedMemOperand(kVld2Location, operand); 4915 } 4916 4917 void Disassembler::vld3(Condition cond, 4918 DataType dt, 4919 const NeonRegisterList& nreglist, 4920 const AlignedMemOperand& operand) { 4921 os().SetCurrentInstruction(kVld3, kFpNeon); 4922 os() << ToCString(kVld3) << ConditionPrinter(it_block_, cond) << dt << " " 4923 << nreglist << ", " << PrintAlignedMemOperand(kVld3Location, operand); 4924 } 4925 4926 void Disassembler::vld3(Condition cond, 4927 DataType dt, 4928 const NeonRegisterList& nreglist, 4929 const MemOperand& operand) { 4930 os().SetCurrentInstruction(kVld3, kFpNeon); 4931 os() << ToCString(kVld3) << ConditionPrinter(it_block_, cond) << dt << " " 4932 << nreglist << ", " << PrintMemOperand(kVld3Location, operand); 4933 } 4934 4935 void Disassembler::vld4(Condition cond, 4936 DataType dt, 4937 const NeonRegisterList& nreglist, 4938 const AlignedMemOperand& operand) { 4939 os().SetCurrentInstruction(kVld4, kFpNeon); 4940 os() << ToCString(kVld4) << ConditionPrinter(it_block_, cond) << dt << " " 4941 << nreglist << ", " << PrintAlignedMemOperand(kVld4Location, operand); 4942 } 4943 4944 void Disassembler::vldm(Condition cond, 4945 DataType dt, 4946 Register rn, 4947 WriteBack write_back, 4948 DRegisterList dreglist) { 4949 os().SetCurrentInstruction(kVldm, kLoadStore | kLoadStoreMultiple | kFpNeon); 4950 os() << ToCString(kVldm) << ConditionPrinter(it_block_, cond) << dt << " " 4951 << rn << write_back << ", " << dreglist; 4952 } 4953 4954 void Disassembler::vldm(Condition cond, 4955 DataType dt, 4956 Register rn, 4957 WriteBack write_back, 4958 SRegisterList sreglist) { 4959 os().SetCurrentInstruction(kVldm, kLoadStore | kLoadStoreMultiple | kFpNeon); 4960 os() << ToCString(kVldm) << ConditionPrinter(it_block_, cond) << dt << " " 4961 << rn << write_back << ", " << sreglist; 4962 } 4963 4964 void Disassembler::vldmdb(Condition cond, 4965 DataType dt, 4966 Register rn, 4967 WriteBack write_back, 4968 DRegisterList dreglist) { 4969 os().SetCurrentInstruction(kVldmdb, 4970 kLoadStore | kLoadStoreMultiple | kFpNeon); 4971 os() << ToCString(kVldmdb) << ConditionPrinter(it_block_, cond) << dt << " " 4972 << rn << write_back << ", " << dreglist; 4973 } 4974 4975 void Disassembler::vldmdb(Condition cond, 4976 DataType dt, 4977 Register rn, 4978 WriteBack write_back, 4979 SRegisterList sreglist) { 4980 os().SetCurrentInstruction(kVldmdb, 4981 kLoadStore | kLoadStoreMultiple | kFpNeon); 4982 os() << ToCString(kVldmdb) << ConditionPrinter(it_block_, cond) << dt << " " 4983 << rn << write_back << ", " << sreglist; 4984 } 4985 4986 void Disassembler::vldmia(Condition cond, 4987 DataType dt, 4988 Register rn, 4989 WriteBack write_back, 4990 DRegisterList dreglist) { 4991 os().SetCurrentInstruction(kVldmia, 4992 kLoadStore | kLoadStoreMultiple | kFpNeon); 4993 os() << ToCString(kVldmia) << ConditionPrinter(it_block_, cond) << dt << " " 4994 << rn << write_back << ", " << dreglist; 4995 } 4996 4997 void Disassembler::vldmia(Condition cond, 4998 DataType dt, 4999 Register rn, 5000 WriteBack write_back, 5001 SRegisterList sreglist) { 5002 os().SetCurrentInstruction(kVldmia, 5003 kLoadStore | kLoadStoreMultiple | kFpNeon); 5004 os() << ToCString(kVldmia) << ConditionPrinter(it_block_, cond) << dt << " " 5005 << rn << write_back << ", " << sreglist; 5006 } 5007 5008 void Disassembler::vldr(Condition cond, 5009 DataType dt, 5010 DRegister rd, 5011 Location* location) { 5012 os().SetCurrentInstruction(kVldr, kFpNeon); 5013 os() << ToCString(kVldr) << ConditionPrinter(it_block_, cond) 5014 << DtPrinter(dt, Untyped64) << " " << rd << ", " 5015 << PrintLabel(kLoadDoublePrecisionLocation, 5016 location, 5017 GetCodeAddress() & ~3); 5018 } 5019 5020 void Disassembler::vldr(Condition cond, 5021 DataType dt, 5022 DRegister rd, 5023 const MemOperand& operand) { 5024 os().SetCurrentInstruction(kVldr, kFpNeon); 5025 os() << ToCString(kVldr) << ConditionPrinter(it_block_, cond) 5026 << DtPrinter(dt, Untyped64) << " " << rd << ", " 5027 << PrintMemOperand(kLoadDoublePrecisionLocation, operand); 5028 } 5029 5030 void Disassembler::vldr(Condition cond, 5031 DataType dt, 5032 SRegister rd, 5033 Location* location) { 5034 os().SetCurrentInstruction(kVldr, kFpNeon); 5035 os() << ToCString(kVldr) << ConditionPrinter(it_block_, cond) 5036 << DtPrinter(dt, Untyped32) << " " << rd << ", " 5037 << PrintLabel(kLoadSinglePrecisionLocation, 5038 location, 5039 GetCodeAddress() & ~3); 5040 } 5041 5042 void Disassembler::vldr(Condition cond, 5043 DataType dt, 5044 SRegister rd, 5045 const MemOperand& operand) { 5046 os().SetCurrentInstruction(kVldr, kFpNeon); 5047 os() << ToCString(kVldr) << ConditionPrinter(it_block_, cond) 5048 << DtPrinter(dt, Untyped32) << " " << rd << ", " 5049 << PrintMemOperand(kLoadSinglePrecisionLocation, operand); 5050 } 5051 5052 void Disassembler::vmax( 5053 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { 5054 os().SetCurrentInstruction(kVmax, kFpNeon); 5055 os() << ToCString(kVmax) << ConditionPrinter(it_block_, cond) << dt; 5056 os() << " "; 5057 if (!rd.Is(rn) || !use_short_hand_form_) { 5058 os() << rd << ", "; 5059 } 5060 os() << rn << ", " << rm; 5061 } 5062 5063 void Disassembler::vmax( 5064 Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { 5065 os().SetCurrentInstruction(kVmax, kFpNeon); 5066 os() << ToCString(kVmax) << ConditionPrinter(it_block_, cond) << dt; 5067 os() << " "; 5068 if (!rd.Is(rn) || !use_short_hand_form_) { 5069 os() << rd << ", "; 5070 } 5071 os() << rn << ", " << rm; 5072 } 5073 5074 void Disassembler::vmaxnm(DataType dt, 5075 DRegister rd, 5076 DRegister rn, 5077 DRegister rm) { 5078 os().SetCurrentInstruction(kVmaxnm, kFpNeon); 5079 os() << ToCString(kVmaxnm) << dt << " " << rd << ", " << rn << ", " << rm; 5080 } 5081 5082 void Disassembler::vmaxnm(DataType dt, 5083 QRegister rd, 5084 QRegister rn, 5085 QRegister rm) { 5086 os().SetCurrentInstruction(kVmaxnm, kFpNeon); 5087 os() << ToCString(kVmaxnm) << dt << " " << rd << ", " << rn << ", " << rm; 5088 } 5089 5090 void Disassembler::vmaxnm(DataType dt, 5091 SRegister rd, 5092 SRegister rn, 5093 SRegister rm) { 5094 os().SetCurrentInstruction(kVmaxnm, kFpNeon); 5095 os() << ToCString(kVmaxnm) << dt << " " << rd << ", " << rn << ", " << rm; 5096 } 5097 5098 void Disassembler::vmin( 5099 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { 5100 os().SetCurrentInstruction(kVmin, kFpNeon); 5101 os() << ToCString(kVmin) << ConditionPrinter(it_block_, cond) << dt; 5102 os() << " "; 5103 if (!rd.Is(rn) || !use_short_hand_form_) { 5104 os() << rd << ", "; 5105 } 5106 os() << rn << ", " << rm; 5107 } 5108 5109 void Disassembler::vmin( 5110 Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { 5111 os().SetCurrentInstruction(kVmin, kFpNeon); 5112 os() << ToCString(kVmin) << ConditionPrinter(it_block_, cond) << dt; 5113 os() << " "; 5114 if (!rd.Is(rn) || !use_short_hand_form_) { 5115 os() << rd << ", "; 5116 } 5117 os() << rn << ", " << rm; 5118 } 5119 5120 void Disassembler::vminnm(DataType dt, 5121 DRegister rd, 5122 DRegister rn, 5123 DRegister rm) { 5124 os().SetCurrentInstruction(kVminnm, kFpNeon); 5125 os() << ToCString(kVminnm) << dt << " " << rd << ", " << rn << ", " << rm; 5126 } 5127 5128 void Disassembler::vminnm(DataType dt, 5129 QRegister rd, 5130 QRegister rn, 5131 QRegister rm) { 5132 os().SetCurrentInstruction(kVminnm, kFpNeon); 5133 os() << ToCString(kVminnm) << dt << " " << rd << ", " << rn << ", " << rm; 5134 } 5135 5136 void Disassembler::vminnm(DataType dt, 5137 SRegister rd, 5138 SRegister rn, 5139 SRegister rm) { 5140 os().SetCurrentInstruction(kVminnm, kFpNeon); 5141 os() << ToCString(kVminnm) << dt << " " << rd << ", " << rn << ", " << rm; 5142 } 5143 5144 void Disassembler::vmla( 5145 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegisterLane rm) { 5146 os().SetCurrentInstruction(kVmla, kFpNeon); 5147 os() << ToCString(kVmla) << ConditionPrinter(it_block_, cond) << dt << " " 5148 << rd << ", " << rn << ", " << rm; 5149 } 5150 5151 void Disassembler::vmla( 5152 Condition cond, DataType dt, QRegister rd, QRegister rn, DRegisterLane rm) { 5153 os().SetCurrentInstruction(kVmla, kFpNeon); 5154 os() << ToCString(kVmla) << ConditionPrinter(it_block_, cond) << dt << " " 5155 << rd << ", " << rn << ", " << rm; 5156 } 5157 5158 void Disassembler::vmla( 5159 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { 5160 os().SetCurrentInstruction(kVmla, kFpNeon); 5161 os() << ToCString(kVmla) << ConditionPrinter(it_block_, cond) << dt << " " 5162 << rd << ", " << rn << ", " << rm; 5163 } 5164 5165 void Disassembler::vmla( 5166 Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { 5167 os().SetCurrentInstruction(kVmla, kFpNeon); 5168 os() << ToCString(kVmla) << ConditionPrinter(it_block_, cond) << dt << " " 5169 << rd << ", " << rn << ", " << rm; 5170 } 5171 5172 void Disassembler::vmla( 5173 Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) { 5174 os().SetCurrentInstruction(kVmla, kFpNeon); 5175 os() << ToCString(kVmla) << ConditionPrinter(it_block_, cond) << dt << " " 5176 << rd << ", " << rn << ", " << rm; 5177 } 5178 5179 void Disassembler::vmlal( 5180 Condition cond, DataType dt, QRegister rd, DRegister rn, DRegisterLane rm) { 5181 os().SetCurrentInstruction(kVmlal, kFpNeon); 5182 os() << ToCString(kVmlal) << ConditionPrinter(it_block_, cond) << dt << " " 5183 << rd << ", " << rn << ", " << rm; 5184 } 5185 5186 void Disassembler::vmlal( 5187 Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) { 5188 os().SetCurrentInstruction(kVmlal, kFpNeon); 5189 os() << ToCString(kVmlal) << ConditionPrinter(it_block_, cond) << dt << " " 5190 << rd << ", " << rn << ", " << rm; 5191 } 5192 5193 void Disassembler::vmls( 5194 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegisterLane rm) { 5195 os().SetCurrentInstruction(kVmls, kFpNeon); 5196 os() << ToCString(kVmls) << ConditionPrinter(it_block_, cond) << dt << " " 5197 << rd << ", " << rn << ", " << rm; 5198 } 5199 5200 void Disassembler::vmls( 5201 Condition cond, DataType dt, QRegister rd, QRegister rn, DRegisterLane rm) { 5202 os().SetCurrentInstruction(kVmls, kFpNeon); 5203 os() << ToCString(kVmls) << ConditionPrinter(it_block_, cond) << dt << " " 5204 << rd << ", " << rn << ", " << rm; 5205 } 5206 5207 void Disassembler::vmls( 5208 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { 5209 os().SetCurrentInstruction(kVmls, kFpNeon); 5210 os() << ToCString(kVmls) << ConditionPrinter(it_block_, cond) << dt << " " 5211 << rd << ", " << rn << ", " << rm; 5212 } 5213 5214 void Disassembler::vmls( 5215 Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { 5216 os().SetCurrentInstruction(kVmls, kFpNeon); 5217 os() << ToCString(kVmls) << ConditionPrinter(it_block_, cond) << dt << " " 5218 << rd << ", " << rn << ", " << rm; 5219 } 5220 5221 void Disassembler::vmls( 5222 Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) { 5223 os().SetCurrentInstruction(kVmls, kFpNeon); 5224 os() << ToCString(kVmls) << ConditionPrinter(it_block_, cond) << dt << " " 5225 << rd << ", " << rn << ", " << rm; 5226 } 5227 5228 void Disassembler::vmlsl( 5229 Condition cond, DataType dt, QRegister rd, DRegister rn, DRegisterLane rm) { 5230 os().SetCurrentInstruction(kVmlsl, kFpNeon); 5231 os() << ToCString(kVmlsl) << ConditionPrinter(it_block_, cond) << dt << " " 5232 << rd << ", " << rn << ", " << rm; 5233 } 5234 5235 void Disassembler::vmlsl( 5236 Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) { 5237 os().SetCurrentInstruction(kVmlsl, kFpNeon); 5238 os() << ToCString(kVmlsl) << ConditionPrinter(it_block_, cond) << dt << " " 5239 << rd << ", " << rn << ", " << rm; 5240 } 5241 5242 void Disassembler::vmov(Condition cond, Register rt, SRegister rn) { 5243 os().SetCurrentInstruction(kVmov, kFpNeon); 5244 os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << " " << rt 5245 << ", " << rn; 5246 } 5247 5248 void Disassembler::vmov(Condition cond, SRegister rn, Register rt) { 5249 os().SetCurrentInstruction(kVmov, kFpNeon); 5250 os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << " " << rn 5251 << ", " << rt; 5252 } 5253 5254 void Disassembler::vmov(Condition cond, 5255 Register rt, 5256 Register rt2, 5257 DRegister rm) { 5258 os().SetCurrentInstruction(kVmov, kFpNeon); 5259 os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << " " << rt 5260 << ", " << rt2 << ", " << rm; 5261 } 5262 5263 void Disassembler::vmov(Condition cond, 5264 DRegister rm, 5265 Register rt, 5266 Register rt2) { 5267 os().SetCurrentInstruction(kVmov, kFpNeon); 5268 os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << " " << rm 5269 << ", " << rt << ", " << rt2; 5270 } 5271 5272 void Disassembler::vmov( 5273 Condition cond, Register rt, Register rt2, SRegister rm, SRegister rm1) { 5274 os().SetCurrentInstruction(kVmov, kFpNeon); 5275 os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << " " << rt 5276 << ", " << rt2 << ", " << rm << ", " << rm1; 5277 } 5278 5279 void Disassembler::vmov( 5280 Condition cond, SRegister rm, SRegister rm1, Register rt, Register rt2) { 5281 os().SetCurrentInstruction(kVmov, kFpNeon); 5282 os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << " " << rm 5283 << ", " << rm1 << ", " << rt << ", " << rt2; 5284 } 5285 5286 void Disassembler::vmov(Condition cond, 5287 DataType dt, 5288 DRegisterLane rd, 5289 Register rt) { 5290 os().SetCurrentInstruction(kVmov, kFpNeon); 5291 os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << dt << " " 5292 << rd << ", " << rt; 5293 } 5294 5295 void Disassembler::vmov(Condition cond, 5296 DataType dt, 5297 DRegister rd, 5298 const DOperand& operand) { 5299 os().SetCurrentInstruction(kVmov, kFpNeon); 5300 os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << dt << " " 5301 << rd << ", " << operand; 5302 } 5303 5304 void Disassembler::vmov(Condition cond, 5305 DataType dt, 5306 QRegister rd, 5307 const QOperand& operand) { 5308 os().SetCurrentInstruction(kVmov, kFpNeon); 5309 os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << dt << " " 5310 << rd << ", " << operand; 5311 } 5312 5313 void Disassembler::vmov(Condition cond, 5314 DataType dt, 5315 SRegister rd, 5316 const SOperand& operand) { 5317 os().SetCurrentInstruction(kVmov, kFpNeon); 5318 os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << dt << " " 5319 << rd << ", " << operand; 5320 } 5321 5322 void Disassembler::vmov(Condition cond, 5323 DataType dt, 5324 Register rt, 5325 DRegisterLane rn) { 5326 os().SetCurrentInstruction(kVmov, kFpNeon); 5327 os() << ToCString(kVmov) << ConditionPrinter(it_block_, cond) << dt << " " 5328 << rt << ", " << rn; 5329 } 5330 5331 void Disassembler::vmovl(Condition cond, 5332 DataType dt, 5333 QRegister rd, 5334 DRegister rm) { 5335 os().SetCurrentInstruction(kVmovl, kFpNeon); 5336 os() << ToCString(kVmovl) << ConditionPrinter(it_block_, cond) << dt << " " 5337 << rd << ", " << rm; 5338 } 5339 5340 void Disassembler::vmovn(Condition cond, 5341 DataType dt, 5342 DRegister rd, 5343 QRegister rm) { 5344 os().SetCurrentInstruction(kVmovn, kFpNeon); 5345 os() << ToCString(kVmovn) << ConditionPrinter(it_block_, cond) << dt << " " 5346 << rd << ", " << rm; 5347 } 5348 5349 void Disassembler::vmrs(Condition cond, 5350 RegisterOrAPSR_nzcv rt, 5351 SpecialFPRegister spec_reg) { 5352 os().SetCurrentInstruction(kVmrs, kFpNeon); 5353 os() << ToCString(kVmrs) << ConditionPrinter(it_block_, cond) << " " << rt 5354 << ", " << spec_reg; 5355 } 5356 5357 void Disassembler::vmsr(Condition cond, 5358 SpecialFPRegister spec_reg, 5359 Register rt) { 5360 os().SetCurrentInstruction(kVmsr, kFpNeon); 5361 os() << ToCString(kVmsr) << ConditionPrinter(it_block_, cond) << " " 5362 << spec_reg << ", " << rt; 5363 } 5364 5365 void Disassembler::vmul(Condition cond, 5366 DataType dt, 5367 DRegister rd, 5368 DRegister rn, 5369 DRegister dm, 5370 unsigned index) { 5371 os().SetCurrentInstruction(kVmul, kFpNeon); 5372 os() << ToCString(kVmul) << ConditionPrinter(it_block_, cond) << dt; 5373 os() << " "; 5374 if (!rd.Is(rn) || !use_short_hand_form_) { 5375 os() << rd << ", "; 5376 } 5377 os() << rn << ", " << IndexedRegisterPrinter(dm, index); 5378 } 5379 5380 void Disassembler::vmul(Condition cond, 5381 DataType dt, 5382 QRegister rd, 5383 QRegister rn, 5384 DRegister dm, 5385 unsigned index) { 5386 os().SetCurrentInstruction(kVmul, kFpNeon); 5387 os() << ToCString(kVmul) << ConditionPrinter(it_block_, cond) << dt; 5388 os() << " "; 5389 if (!rd.Is(rn) || !use_short_hand_form_) { 5390 os() << rd << ", "; 5391 } 5392 os() << rn << ", " << IndexedRegisterPrinter(dm, index); 5393 } 5394 5395 void Disassembler::vmul( 5396 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { 5397 os().SetCurrentInstruction(kVmul, kFpNeon); 5398 os() << ToCString(kVmul) << ConditionPrinter(it_block_, cond) << dt; 5399 os() << " "; 5400 if (!rd.Is(rn) || !use_short_hand_form_) { 5401 os() << rd << ", "; 5402 } 5403 os() << rn << ", " << rm; 5404 } 5405 5406 void Disassembler::vmul( 5407 Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { 5408 os().SetCurrentInstruction(kVmul, kFpNeon); 5409 os() << ToCString(kVmul) << ConditionPrinter(it_block_, cond) << dt; 5410 os() << " "; 5411 if (!rd.Is(rn) || !use_short_hand_form_) { 5412 os() << rd << ", "; 5413 } 5414 os() << rn << ", " << rm; 5415 } 5416 5417 void Disassembler::vmul( 5418 Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) { 5419 os().SetCurrentInstruction(kVmul, kFpNeon); 5420 os() << ToCString(kVmul) << ConditionPrinter(it_block_, cond) << dt; 5421 os() << " "; 5422 if (!rd.Is(rn) || !use_short_hand_form_) { 5423 os() << rd << ", "; 5424 } 5425 os() << rn << ", " << rm; 5426 } 5427 5428 void Disassembler::vmull(Condition cond, 5429 DataType dt, 5430 QRegister rd, 5431 DRegister rn, 5432 DRegister dm, 5433 unsigned index) { 5434 os().SetCurrentInstruction(kVmull, kFpNeon); 5435 os() << ToCString(kVmull) << ConditionPrinter(it_block_, cond) << dt << " " 5436 << rd << ", " << rn << ", " << IndexedRegisterPrinter(dm, index); 5437 } 5438 5439 void Disassembler::vmull( 5440 Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) { 5441 os().SetCurrentInstruction(kVmull, kFpNeon); 5442 os() << ToCString(kVmull) << ConditionPrinter(it_block_, cond) << dt << " " 5443 << rd << ", " << rn << ", " << rm; 5444 } 5445 5446 void Disassembler::vmvn(Condition cond, 5447 DataType dt, 5448 DRegister rd, 5449 const DOperand& operand) { 5450 os().SetCurrentInstruction(kVmvn, kFpNeon); 5451 os() << ToCString(kVmvn) << ConditionPrinter(it_block_, cond) << dt << " " 5452 << rd << ", " << operand; 5453 } 5454 5455 void Disassembler::vmvn(Condition cond, 5456 DataType dt, 5457 QRegister rd, 5458 const QOperand& operand) { 5459 os().SetCurrentInstruction(kVmvn, kFpNeon); 5460 os() << ToCString(kVmvn) << ConditionPrinter(it_block_, cond) << dt << " " 5461 << rd << ", " << operand; 5462 } 5463 5464 void Disassembler::vneg(Condition cond, 5465 DataType dt, 5466 DRegister rd, 5467 DRegister rm) { 5468 os().SetCurrentInstruction(kVneg, kFpNeon); 5469 os() << ToCString(kVneg) << ConditionPrinter(it_block_, cond) << dt << " " 5470 << rd << ", " << rm; 5471 } 5472 5473 void Disassembler::vneg(Condition cond, 5474 DataType dt, 5475 QRegister rd, 5476 QRegister rm) { 5477 os().SetCurrentInstruction(kVneg, kFpNeon); 5478 os() << ToCString(kVneg) << ConditionPrinter(it_block_, cond) << dt << " " 5479 << rd << ", " << rm; 5480 } 5481 5482 void Disassembler::vneg(Condition cond, 5483 DataType dt, 5484 SRegister rd, 5485 SRegister rm) { 5486 os().SetCurrentInstruction(kVneg, kFpNeon); 5487 os() << ToCString(kVneg) << ConditionPrinter(it_block_, cond) << dt << " " 5488 << rd << ", " << rm; 5489 } 5490 5491 void Disassembler::vnmla( 5492 Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) { 5493 os().SetCurrentInstruction(kVnmla, kFpNeon); 5494 os() << ToCString(kVnmla) << ConditionPrinter(it_block_, cond) << dt << " " 5495 << rd << ", " << rn << ", " << rm; 5496 } 5497 5498 void Disassembler::vnmla( 5499 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { 5500 os().SetCurrentInstruction(kVnmla, kFpNeon); 5501 os() << ToCString(kVnmla) << ConditionPrinter(it_block_, cond) << dt << " " 5502 << rd << ", " << rn << ", " << rm; 5503 } 5504 5505 void Disassembler::vnmls( 5506 Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) { 5507 os().SetCurrentInstruction(kVnmls, kFpNeon); 5508 os() << ToCString(kVnmls) << ConditionPrinter(it_block_, cond) << dt << " " 5509 << rd << ", " << rn << ", " << rm; 5510 } 5511 5512 void Disassembler::vnmls( 5513 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { 5514 os().SetCurrentInstruction(kVnmls, kFpNeon); 5515 os() << ToCString(kVnmls) << ConditionPrinter(it_block_, cond) << dt << " " 5516 << rd << ", " << rn << ", " << rm; 5517 } 5518 5519 void Disassembler::vnmul( 5520 Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) { 5521 os().SetCurrentInstruction(kVnmul, kFpNeon); 5522 os() << ToCString(kVnmul) << ConditionPrinter(it_block_, cond) << dt; 5523 os() << " "; 5524 if (!rd.Is(rn) || !use_short_hand_form_) { 5525 os() << rd << ", "; 5526 } 5527 os() << rn << ", " << rm; 5528 } 5529 5530 void Disassembler::vnmul( 5531 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { 5532 os().SetCurrentInstruction(kVnmul, kFpNeon); 5533 os() << ToCString(kVnmul) << ConditionPrinter(it_block_, cond) << dt; 5534 os() << " "; 5535 if (!rd.Is(rn) || !use_short_hand_form_) { 5536 os() << rd << ", "; 5537 } 5538 os() << rn << ", " << rm; 5539 } 5540 5541 void Disassembler::vorn(Condition cond, 5542 DataType dt, 5543 DRegister rd, 5544 DRegister rn, 5545 const DOperand& operand) { 5546 os().SetCurrentInstruction(kVorn, kFpNeon); 5547 os() << ToCString(kVorn) << ConditionPrinter(it_block_, cond) << dt; 5548 os() << " "; 5549 if (!rd.Is(rn) || !use_short_hand_form_) { 5550 os() << rd << ", "; 5551 } 5552 os() << rn << ", " << operand; 5553 } 5554 5555 void Disassembler::vorn(Condition cond, 5556 DataType dt, 5557 QRegister rd, 5558 QRegister rn, 5559 const QOperand& operand) { 5560 os().SetCurrentInstruction(kVorn, kFpNeon); 5561 os() << ToCString(kVorn) << ConditionPrinter(it_block_, cond) << dt; 5562 os() << " "; 5563 if (!rd.Is(rn) || !use_short_hand_form_) { 5564 os() << rd << ", "; 5565 } 5566 os() << rn << ", " << operand; 5567 } 5568 5569 void Disassembler::vorr(Condition cond, 5570 DataType dt, 5571 DRegister rd, 5572 DRegister rn, 5573 const DOperand& operand) { 5574 os().SetCurrentInstruction(kVorr, kFpNeon); 5575 os() << ToCString(kVorr) << ConditionPrinter(it_block_, cond) << dt; 5576 os() << " "; 5577 if (!rd.Is(rn) || !use_short_hand_form_) { 5578 os() << rd << ", "; 5579 } 5580 os() << rn << ", " << operand; 5581 } 5582 5583 void Disassembler::vorr(Condition cond, 5584 DataType dt, 5585 QRegister rd, 5586 QRegister rn, 5587 const QOperand& operand) { 5588 os().SetCurrentInstruction(kVorr, kFpNeon); 5589 os() << ToCString(kVorr) << ConditionPrinter(it_block_, cond) << dt; 5590 os() << " "; 5591 if (!rd.Is(rn) || !use_short_hand_form_) { 5592 os() << rd << ", "; 5593 } 5594 os() << rn << ", " << operand; 5595 } 5596 5597 void Disassembler::vpadal(Condition cond, 5598 DataType dt, 5599 DRegister rd, 5600 DRegister rm) { 5601 os().SetCurrentInstruction(kVpadal, kFpNeon); 5602 os() << ToCString(kVpadal) << ConditionPrinter(it_block_, cond) << dt << " " 5603 << rd << ", " << rm; 5604 } 5605 5606 void Disassembler::vpadal(Condition cond, 5607 DataType dt, 5608 QRegister rd, 5609 QRegister rm) { 5610 os().SetCurrentInstruction(kVpadal, kFpNeon); 5611 os() << ToCString(kVpadal) << ConditionPrinter(it_block_, cond) << dt << " " 5612 << rd << ", " << rm; 5613 } 5614 5615 void Disassembler::vpadd( 5616 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { 5617 os().SetCurrentInstruction(kVpadd, kFpNeon); 5618 os() << ToCString(kVpadd) << ConditionPrinter(it_block_, cond) << dt; 5619 os() << " "; 5620 if (!rd.Is(rn) || !use_short_hand_form_) { 5621 os() << rd << ", "; 5622 } 5623 os() << rn << ", " << rm; 5624 } 5625 5626 void Disassembler::vpaddl(Condition cond, 5627 DataType dt, 5628 DRegister rd, 5629 DRegister rm) { 5630 os().SetCurrentInstruction(kVpaddl, kFpNeon); 5631 os() << ToCString(kVpaddl) << ConditionPrinter(it_block_, cond) << dt << " " 5632 << rd << ", " << rm; 5633 } 5634 5635 void Disassembler::vpaddl(Condition cond, 5636 DataType dt, 5637 QRegister rd, 5638 QRegister rm) { 5639 os().SetCurrentInstruction(kVpaddl, kFpNeon); 5640 os() << ToCString(kVpaddl) << ConditionPrinter(it_block_, cond) << dt << " " 5641 << rd << ", " << rm; 5642 } 5643 5644 void Disassembler::vpmax( 5645 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { 5646 os().SetCurrentInstruction(kVpmax, kFpNeon); 5647 os() << ToCString(kVpmax) << ConditionPrinter(it_block_, cond) << dt; 5648 os() << " "; 5649 if (!rd.Is(rn) || !use_short_hand_form_) { 5650 os() << rd << ", "; 5651 } 5652 os() << rn << ", " << rm; 5653 } 5654 5655 void Disassembler::vpmin( 5656 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { 5657 os().SetCurrentInstruction(kVpmin, kFpNeon); 5658 os() << ToCString(kVpmin) << ConditionPrinter(it_block_, cond) << dt; 5659 os() << " "; 5660 if (!rd.Is(rn) || !use_short_hand_form_) { 5661 os() << rd << ", "; 5662 } 5663 os() << rn << ", " << rm; 5664 } 5665 5666 void Disassembler::vpop(Condition cond, DataType dt, DRegisterList dreglist) { 5667 os().SetCurrentInstruction(kVpop, kLoadStore | kLoadStoreMultiple | kFpNeon); 5668 os() << ToCString(kVpop) << ConditionPrinter(it_block_, cond) << dt << " " 5669 << dreglist; 5670 } 5671 5672 void Disassembler::vpop(Condition cond, DataType dt, SRegisterList sreglist) { 5673 os().SetCurrentInstruction(kVpop, kLoadStore | kLoadStoreMultiple | kFpNeon); 5674 os() << ToCString(kVpop) << ConditionPrinter(it_block_, cond) << dt << " " 5675 << sreglist; 5676 } 5677 5678 void Disassembler::vpush(Condition cond, DataType dt, DRegisterList dreglist) { 5679 os().SetCurrentInstruction(kVpush, kLoadStore | kLoadStoreMultiple | kFpNeon); 5680 os() << ToCString(kVpush) << ConditionPrinter(it_block_, cond) << dt << " " 5681 << dreglist; 5682 } 5683 5684 void Disassembler::vpush(Condition cond, DataType dt, SRegisterList sreglist) { 5685 os().SetCurrentInstruction(kVpush, kLoadStore | kLoadStoreMultiple | kFpNeon); 5686 os() << ToCString(kVpush) << ConditionPrinter(it_block_, cond) << dt << " " 5687 << sreglist; 5688 } 5689 5690 void Disassembler::vqabs(Condition cond, 5691 DataType dt, 5692 DRegister rd, 5693 DRegister rm) { 5694 os().SetCurrentInstruction(kVqabs, kFpNeon); 5695 os() << ToCString(kVqabs) << ConditionPrinter(it_block_, cond) << dt << " " 5696 << rd << ", " << rm; 5697 } 5698 5699 void Disassembler::vqabs(Condition cond, 5700 DataType dt, 5701 QRegister rd, 5702 QRegister rm) { 5703 os().SetCurrentInstruction(kVqabs, kFpNeon); 5704 os() << ToCString(kVqabs) << ConditionPrinter(it_block_, cond) << dt << " " 5705 << rd << ", " << rm; 5706 } 5707 5708 void Disassembler::vqadd( 5709 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { 5710 os().SetCurrentInstruction(kVqadd, kFpNeon); 5711 os() << ToCString(kVqadd) << ConditionPrinter(it_block_, cond) << dt; 5712 os() << " "; 5713 if (!rd.Is(rn) || !use_short_hand_form_) { 5714 os() << rd << ", "; 5715 } 5716 os() << rn << ", " << rm; 5717 } 5718 5719 void Disassembler::vqadd( 5720 Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { 5721 os().SetCurrentInstruction(kVqadd, kFpNeon); 5722 os() << ToCString(kVqadd) << ConditionPrinter(it_block_, cond) << dt; 5723 os() << " "; 5724 if (!rd.Is(rn) || !use_short_hand_form_) { 5725 os() << rd << ", "; 5726 } 5727 os() << rn << ", " << rm; 5728 } 5729 5730 void Disassembler::vqdmlal( 5731 Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) { 5732 os().SetCurrentInstruction(kVqdmlal, kFpNeon); 5733 os() << ToCString(kVqdmlal) << ConditionPrinter(it_block_, cond) << dt << " " 5734 << rd << ", " << rn << ", " << rm; 5735 } 5736 5737 void Disassembler::vqdmlal(Condition cond, 5738 DataType dt, 5739 QRegister rd, 5740 DRegister rn, 5741 DRegister dm, 5742 unsigned index) { 5743 os().SetCurrentInstruction(kVqdmlal, kFpNeon); 5744 os() << ToCString(kVqdmlal) << ConditionPrinter(it_block_, cond) << dt << " " 5745 << rd << ", " << rn << ", " << IndexedRegisterPrinter(dm, index); 5746 } 5747 5748 void Disassembler::vqdmlsl( 5749 Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) { 5750 os().SetCurrentInstruction(kVqdmlsl, kFpNeon); 5751 os() << ToCString(kVqdmlsl) << ConditionPrinter(it_block_, cond) << dt << " " 5752 << rd << ", " << rn << ", " << rm; 5753 } 5754 5755 void Disassembler::vqdmlsl(Condition cond, 5756 DataType dt, 5757 QRegister rd, 5758 DRegister rn, 5759 DRegister dm, 5760 unsigned index) { 5761 os().SetCurrentInstruction(kVqdmlsl, kFpNeon); 5762 os() << ToCString(kVqdmlsl) << ConditionPrinter(it_block_, cond) << dt << " " 5763 << rd << ", " << rn << ", " << IndexedRegisterPrinter(dm, index); 5764 } 5765 5766 void Disassembler::vqdmulh( 5767 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { 5768 os().SetCurrentInstruction(kVqdmulh, kFpNeon); 5769 os() << ToCString(kVqdmulh) << ConditionPrinter(it_block_, cond) << dt; 5770 os() << " "; 5771 if (!rd.Is(rn) || !use_short_hand_form_) { 5772 os() << rd << ", "; 5773 } 5774 os() << rn << ", " << rm; 5775 } 5776 5777 void Disassembler::vqdmulh( 5778 Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { 5779 os().SetCurrentInstruction(kVqdmulh, kFpNeon); 5780 os() << ToCString(kVqdmulh) << ConditionPrinter(it_block_, cond) << dt; 5781 os() << " "; 5782 if (!rd.Is(rn) || !use_short_hand_form_) { 5783 os() << rd << ", "; 5784 } 5785 os() << rn << ", " << rm; 5786 } 5787 5788 void Disassembler::vqdmulh( 5789 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegisterLane rm) { 5790 os().SetCurrentInstruction(kVqdmulh, kFpNeon); 5791 os() << ToCString(kVqdmulh) << ConditionPrinter(it_block_, cond) << dt; 5792 os() << " "; 5793 if (!rd.Is(rn) || !use_short_hand_form_) { 5794 os() << rd << ", "; 5795 } 5796 os() << rn << ", " << rm; 5797 } 5798 5799 void Disassembler::vqdmulh( 5800 Condition cond, DataType dt, QRegister rd, QRegister rn, DRegisterLane rm) { 5801 os().SetCurrentInstruction(kVqdmulh, kFpNeon); 5802 os() << ToCString(kVqdmulh) << ConditionPrinter(it_block_, cond) << dt; 5803 os() << " "; 5804 if (!rd.Is(rn) || !use_short_hand_form_) { 5805 os() << rd << ", "; 5806 } 5807 os() << rn << ", " << rm; 5808 } 5809 5810 void Disassembler::vqdmull( 5811 Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) { 5812 os().SetCurrentInstruction(kVqdmull, kFpNeon); 5813 os() << ToCString(kVqdmull) << ConditionPrinter(it_block_, cond) << dt << " " 5814 << rd << ", " << rn << ", " << rm; 5815 } 5816 5817 void Disassembler::vqdmull( 5818 Condition cond, DataType dt, QRegister rd, DRegister rn, DRegisterLane rm) { 5819 os().SetCurrentInstruction(kVqdmull, kFpNeon); 5820 os() << ToCString(kVqdmull) << ConditionPrinter(it_block_, cond) << dt << " " 5821 << rd << ", " << rn << ", " << rm; 5822 } 5823 5824 void Disassembler::vqmovn(Condition cond, 5825 DataType dt, 5826 DRegister rd, 5827 QRegister rm) { 5828 os().SetCurrentInstruction(kVqmovn, kFpNeon); 5829 os() << ToCString(kVqmovn) << ConditionPrinter(it_block_, cond) << dt << " " 5830 << rd << ", " << rm; 5831 } 5832 5833 void Disassembler::vqmovun(Condition cond, 5834 DataType dt, 5835 DRegister rd, 5836 QRegister rm) { 5837 os().SetCurrentInstruction(kVqmovun, kFpNeon); 5838 os() << ToCString(kVqmovun) << ConditionPrinter(it_block_, cond) << dt << " " 5839 << rd << ", " << rm; 5840 } 5841 5842 void Disassembler::vqneg(Condition cond, 5843 DataType dt, 5844 DRegister rd, 5845 DRegister rm) { 5846 os().SetCurrentInstruction(kVqneg, kFpNeon); 5847 os() << ToCString(kVqneg) << ConditionPrinter(it_block_, cond) << dt << " " 5848 << rd << ", " << rm; 5849 } 5850 5851 void Disassembler::vqneg(Condition cond, 5852 DataType dt, 5853 QRegister rd, 5854 QRegister rm) { 5855 os().SetCurrentInstruction(kVqneg, kFpNeon); 5856 os() << ToCString(kVqneg) << ConditionPrinter(it_block_, cond) << dt << " " 5857 << rd << ", " << rm; 5858 } 5859 5860 void Disassembler::vqrdmulh( 5861 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { 5862 os().SetCurrentInstruction(kVqrdmulh, kFpNeon); 5863 os() << ToCString(kVqrdmulh) << ConditionPrinter(it_block_, cond) << dt; 5864 os() << " "; 5865 if (!rd.Is(rn) || !use_short_hand_form_) { 5866 os() << rd << ", "; 5867 } 5868 os() << rn << ", " << rm; 5869 } 5870 5871 void Disassembler::vqrdmulh( 5872 Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { 5873 os().SetCurrentInstruction(kVqrdmulh, kFpNeon); 5874 os() << ToCString(kVqrdmulh) << ConditionPrinter(it_block_, cond) << dt; 5875 os() << " "; 5876 if (!rd.Is(rn) || !use_short_hand_form_) { 5877 os() << rd << ", "; 5878 } 5879 os() << rn << ", " << rm; 5880 } 5881 5882 void Disassembler::vqrdmulh( 5883 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegisterLane rm) { 5884 os().SetCurrentInstruction(kVqrdmulh, kFpNeon); 5885 os() << ToCString(kVqrdmulh) << ConditionPrinter(it_block_, cond) << dt; 5886 os() << " "; 5887 if (!rd.Is(rn) || !use_short_hand_form_) { 5888 os() << rd << ", "; 5889 } 5890 os() << rn << ", " << rm; 5891 } 5892 5893 void Disassembler::vqrdmulh( 5894 Condition cond, DataType dt, QRegister rd, QRegister rn, DRegisterLane rm) { 5895 os().SetCurrentInstruction(kVqrdmulh, kFpNeon); 5896 os() << ToCString(kVqrdmulh) << ConditionPrinter(it_block_, cond) << dt; 5897 os() << " "; 5898 if (!rd.Is(rn) || !use_short_hand_form_) { 5899 os() << rd << ", "; 5900 } 5901 os() << rn << ", " << rm; 5902 } 5903 5904 void Disassembler::vqrshl( 5905 Condition cond, DataType dt, DRegister rd, DRegister rm, DRegister rn) { 5906 os().SetCurrentInstruction(kVqrshl, kFpNeon); 5907 os() << ToCString(kVqrshl) << ConditionPrinter(it_block_, cond) << dt; 5908 os() << " "; 5909 if (!rd.Is(rm) || !use_short_hand_form_) { 5910 os() << rd << ", "; 5911 } 5912 os() << rm << ", " << rn; 5913 } 5914 5915 void Disassembler::vqrshl( 5916 Condition cond, DataType dt, QRegister rd, QRegister rm, QRegister rn) { 5917 os().SetCurrentInstruction(kVqrshl, kFpNeon); 5918 os() << ToCString(kVqrshl) << ConditionPrinter(it_block_, cond) << dt; 5919 os() << " "; 5920 if (!rd.Is(rm) || !use_short_hand_form_) { 5921 os() << rd << ", "; 5922 } 5923 os() << rm << ", " << rn; 5924 } 5925 5926 void Disassembler::vqrshrn(Condition cond, 5927 DataType dt, 5928 DRegister rd, 5929 QRegister rm, 5930 const QOperand& operand) { 5931 os().SetCurrentInstruction(kVqrshrn, kFpNeon); 5932 os() << ToCString(kVqrshrn) << ConditionPrinter(it_block_, cond) << dt << " " 5933 << rd << ", " << rm << ", " << operand; 5934 } 5935 5936 void Disassembler::vqrshrun(Condition cond, 5937 DataType dt, 5938 DRegister rd, 5939 QRegister rm, 5940 const QOperand& operand) { 5941 os().SetCurrentInstruction(kVqrshrun, kFpNeon); 5942 os() << ToCString(kVqrshrun) << ConditionPrinter(it_block_, cond) << dt << " " 5943 << rd << ", " << rm << ", " << operand; 5944 } 5945 5946 void Disassembler::vqshl(Condition cond, 5947 DataType dt, 5948 DRegister rd, 5949 DRegister rm, 5950 const DOperand& operand) { 5951 os().SetCurrentInstruction(kVqshl, kFpNeon); 5952 os() << ToCString(kVqshl) << ConditionPrinter(it_block_, cond) << dt; 5953 os() << " "; 5954 if (!rd.Is(rm) || !use_short_hand_form_) { 5955 os() << rd << ", "; 5956 } 5957 os() << rm << ", " << operand; 5958 } 5959 5960 void Disassembler::vqshl(Condition cond, 5961 DataType dt, 5962 QRegister rd, 5963 QRegister rm, 5964 const QOperand& operand) { 5965 os().SetCurrentInstruction(kVqshl, kFpNeon); 5966 os() << ToCString(kVqshl) << ConditionPrinter(it_block_, cond) << dt; 5967 os() << " "; 5968 if (!rd.Is(rm) || !use_short_hand_form_) { 5969 os() << rd << ", "; 5970 } 5971 os() << rm << ", " << operand; 5972 } 5973 5974 void Disassembler::vqshlu(Condition cond, 5975 DataType dt, 5976 DRegister rd, 5977 DRegister rm, 5978 const DOperand& operand) { 5979 os().SetCurrentInstruction(kVqshlu, kFpNeon); 5980 os() << ToCString(kVqshlu) << ConditionPrinter(it_block_, cond) << dt; 5981 os() << " "; 5982 if (!rd.Is(rm) || !use_short_hand_form_) { 5983 os() << rd << ", "; 5984 } 5985 os() << rm << ", " << operand; 5986 } 5987 5988 void Disassembler::vqshlu(Condition cond, 5989 DataType dt, 5990 QRegister rd, 5991 QRegister rm, 5992 const QOperand& operand) { 5993 os().SetCurrentInstruction(kVqshlu, kFpNeon); 5994 os() << ToCString(kVqshlu) << ConditionPrinter(it_block_, cond) << dt; 5995 os() << " "; 5996 if (!rd.Is(rm) || !use_short_hand_form_) { 5997 os() << rd << ", "; 5998 } 5999 os() << rm << ", " << operand; 6000 } 6001 6002 void Disassembler::vqshrn(Condition cond, 6003 DataType dt, 6004 DRegister rd, 6005 QRegister rm, 6006 const QOperand& operand) { 6007 os().SetCurrentInstruction(kVqshrn, kFpNeon); 6008 os() << ToCString(kVqshrn) << ConditionPrinter(it_block_, cond) << dt << " " 6009 << rd << ", " << rm << ", " << operand; 6010 } 6011 6012 void Disassembler::vqshrun(Condition cond, 6013 DataType dt, 6014 DRegister rd, 6015 QRegister rm, 6016 const QOperand& operand) { 6017 os().SetCurrentInstruction(kVqshrun, kFpNeon); 6018 os() << ToCString(kVqshrun) << ConditionPrinter(it_block_, cond) << dt << " " 6019 << rd << ", " << rm << ", " << operand; 6020 } 6021 6022 void Disassembler::vqsub( 6023 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { 6024 os().SetCurrentInstruction(kVqsub, kFpNeon); 6025 os() << ToCString(kVqsub) << ConditionPrinter(it_block_, cond) << dt; 6026 os() << " "; 6027 if (!rd.Is(rn) || !use_short_hand_form_) { 6028 os() << rd << ", "; 6029 } 6030 os() << rn << ", " << rm; 6031 } 6032 6033 void Disassembler::vqsub( 6034 Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { 6035 os().SetCurrentInstruction(kVqsub, kFpNeon); 6036 os() << ToCString(kVqsub) << ConditionPrinter(it_block_, cond) << dt; 6037 os() << " "; 6038 if (!rd.Is(rn) || !use_short_hand_form_) { 6039 os() << rd << ", "; 6040 } 6041 os() << rn << ", " << rm; 6042 } 6043 6044 void Disassembler::vraddhn( 6045 Condition cond, DataType dt, DRegister rd, QRegister rn, QRegister rm) { 6046 os().SetCurrentInstruction(kVraddhn, kFpNeon); 6047 os() << ToCString(kVraddhn) << ConditionPrinter(it_block_, cond) << dt << " " 6048 << rd << ", " << rn << ", " << rm; 6049 } 6050 6051 void Disassembler::vrecpe(Condition cond, 6052 DataType dt, 6053 DRegister rd, 6054 DRegister rm) { 6055 os().SetCurrentInstruction(kVrecpe, kFpNeon); 6056 os() << ToCString(kVrecpe) << ConditionPrinter(it_block_, cond) << dt << " " 6057 << rd << ", " << rm; 6058 } 6059 6060 void Disassembler::vrecpe(Condition cond, 6061 DataType dt, 6062 QRegister rd, 6063 QRegister rm) { 6064 os().SetCurrentInstruction(kVrecpe, kFpNeon); 6065 os() << ToCString(kVrecpe) << ConditionPrinter(it_block_, cond) << dt << " " 6066 << rd << ", " << rm; 6067 } 6068 6069 void Disassembler::vrecps( 6070 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { 6071 os().SetCurrentInstruction(kVrecps, kFpNeon); 6072 os() << ToCString(kVrecps) << ConditionPrinter(it_block_, cond) << dt; 6073 os() << " "; 6074 if (!rd.Is(rn) || !use_short_hand_form_) { 6075 os() << rd << ", "; 6076 } 6077 os() << rn << ", " << rm; 6078 } 6079 6080 void Disassembler::vrecps( 6081 Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { 6082 os().SetCurrentInstruction(kVrecps, kFpNeon); 6083 os() << ToCString(kVrecps) << ConditionPrinter(it_block_, cond) << dt; 6084 os() << " "; 6085 if (!rd.Is(rn) || !use_short_hand_form_) { 6086 os() << rd << ", "; 6087 } 6088 os() << rn << ", " << rm; 6089 } 6090 6091 void Disassembler::vrev16(Condition cond, 6092 DataType dt, 6093 DRegister rd, 6094 DRegister rm) { 6095 os().SetCurrentInstruction(kVrev16, kFpNeon); 6096 os() << ToCString(kVrev16) << ConditionPrinter(it_block_, cond) << dt << " " 6097 << rd << ", " << rm; 6098 } 6099 6100 void Disassembler::vrev16(Condition cond, 6101 DataType dt, 6102 QRegister rd, 6103 QRegister rm) { 6104 os().SetCurrentInstruction(kVrev16, kFpNeon); 6105 os() << ToCString(kVrev16) << ConditionPrinter(it_block_, cond) << dt << " " 6106 << rd << ", " << rm; 6107 } 6108 6109 void Disassembler::vrev32(Condition cond, 6110 DataType dt, 6111 DRegister rd, 6112 DRegister rm) { 6113 os().SetCurrentInstruction(kVrev32, kFpNeon); 6114 os() << ToCString(kVrev32) << ConditionPrinter(it_block_, cond) << dt << " " 6115 << rd << ", " << rm; 6116 } 6117 6118 void Disassembler::vrev32(Condition cond, 6119 DataType dt, 6120 QRegister rd, 6121 QRegister rm) { 6122 os().SetCurrentInstruction(kVrev32, kFpNeon); 6123 os() << ToCString(kVrev32) << ConditionPrinter(it_block_, cond) << dt << " " 6124 << rd << ", " << rm; 6125 } 6126 6127 void Disassembler::vrev64(Condition cond, 6128 DataType dt, 6129 DRegister rd, 6130 DRegister rm) { 6131 os().SetCurrentInstruction(kVrev64, kFpNeon); 6132 os() << ToCString(kVrev64) << ConditionPrinter(it_block_, cond) << dt << " " 6133 << rd << ", " << rm; 6134 } 6135 6136 void Disassembler::vrev64(Condition cond, 6137 DataType dt, 6138 QRegister rd, 6139 QRegister rm) { 6140 os().SetCurrentInstruction(kVrev64, kFpNeon); 6141 os() << ToCString(kVrev64) << ConditionPrinter(it_block_, cond) << dt << " " 6142 << rd << ", " << rm; 6143 } 6144 6145 void Disassembler::vrhadd( 6146 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { 6147 os().SetCurrentInstruction(kVrhadd, kFpNeon); 6148 os() << ToCString(kVrhadd) << ConditionPrinter(it_block_, cond) << dt; 6149 os() << " "; 6150 if (!rd.Is(rn) || !use_short_hand_form_) { 6151 os() << rd << ", "; 6152 } 6153 os() << rn << ", " << rm; 6154 } 6155 6156 void Disassembler::vrhadd( 6157 Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { 6158 os().SetCurrentInstruction(kVrhadd, kFpNeon); 6159 os() << ToCString(kVrhadd) << ConditionPrinter(it_block_, cond) << dt; 6160 os() << " "; 6161 if (!rd.Is(rn) || !use_short_hand_form_) { 6162 os() << rd << ", "; 6163 } 6164 os() << rn << ", " << rm; 6165 } 6166 6167 void Disassembler::vrinta(DataType dt, DRegister rd, DRegister rm) { 6168 os().SetCurrentInstruction(kVrinta, kFpNeon); 6169 os() << ToCString(kVrinta) << dt << " " << rd << ", " << rm; 6170 } 6171 6172 void Disassembler::vrinta(DataType dt, QRegister rd, QRegister rm) { 6173 os().SetCurrentInstruction(kVrinta, kFpNeon); 6174 os() << ToCString(kVrinta) << dt << " " << rd << ", " << rm; 6175 } 6176 6177 void Disassembler::vrinta(DataType dt, SRegister rd, SRegister rm) { 6178 os().SetCurrentInstruction(kVrinta, kFpNeon); 6179 os() << ToCString(kVrinta) << dt << " " << rd << ", " << rm; 6180 } 6181 6182 void Disassembler::vrintm(DataType dt, DRegister rd, DRegister rm) { 6183 os().SetCurrentInstruction(kVrintm, kFpNeon); 6184 os() << ToCString(kVrintm) << dt << " " << rd << ", " << rm; 6185 } 6186 6187 void Disassembler::vrintm(DataType dt, QRegister rd, QRegister rm) { 6188 os().SetCurrentInstruction(kVrintm, kFpNeon); 6189 os() << ToCString(kVrintm) << dt << " " << rd << ", " << rm; 6190 } 6191 6192 void Disassembler::vrintm(DataType dt, SRegister rd, SRegister rm) { 6193 os().SetCurrentInstruction(kVrintm, kFpNeon); 6194 os() << ToCString(kVrintm) << dt << " " << rd << ", " << rm; 6195 } 6196 6197 void Disassembler::vrintn(DataType dt, DRegister rd, DRegister rm) { 6198 os().SetCurrentInstruction(kVrintn, kFpNeon); 6199 os() << ToCString(kVrintn) << dt << " " << rd << ", " << rm; 6200 } 6201 6202 void Disassembler::vrintn(DataType dt, QRegister rd, QRegister rm) { 6203 os().SetCurrentInstruction(kVrintn, kFpNeon); 6204 os() << ToCString(kVrintn) << dt << " " << rd << ", " << rm; 6205 } 6206 6207 void Disassembler::vrintn(DataType dt, SRegister rd, SRegister rm) { 6208 os().SetCurrentInstruction(kVrintn, kFpNeon); 6209 os() << ToCString(kVrintn) << dt << " " << rd << ", " << rm; 6210 } 6211 6212 void Disassembler::vrintp(DataType dt, DRegister rd, DRegister rm) { 6213 os().SetCurrentInstruction(kVrintp, kFpNeon); 6214 os() << ToCString(kVrintp) << dt << " " << rd << ", " << rm; 6215 } 6216 6217 void Disassembler::vrintp(DataType dt, QRegister rd, QRegister rm) { 6218 os().SetCurrentInstruction(kVrintp, kFpNeon); 6219 os() << ToCString(kVrintp) << dt << " " << rd << ", " << rm; 6220 } 6221 6222 void Disassembler::vrintp(DataType dt, SRegister rd, SRegister rm) { 6223 os().SetCurrentInstruction(kVrintp, kFpNeon); 6224 os() << ToCString(kVrintp) << dt << " " << rd << ", " << rm; 6225 } 6226 6227 void Disassembler::vrintr(Condition cond, 6228 DataType dt, 6229 SRegister rd, 6230 SRegister rm) { 6231 os().SetCurrentInstruction(kVrintr, kFpNeon); 6232 os() << ToCString(kVrintr) << ConditionPrinter(it_block_, cond) << dt << " " 6233 << rd << ", " << rm; 6234 } 6235 6236 void Disassembler::vrintr(Condition cond, 6237 DataType dt, 6238 DRegister rd, 6239 DRegister rm) { 6240 os().SetCurrentInstruction(kVrintr, kFpNeon); 6241 os() << ToCString(kVrintr) << ConditionPrinter(it_block_, cond) << dt << " " 6242 << rd << ", " << rm; 6243 } 6244 6245 void Disassembler::vrintx(Condition cond, 6246 DataType dt, 6247 DRegister rd, 6248 DRegister rm) { 6249 os().SetCurrentInstruction(kVrintx, kFpNeon); 6250 os() << ToCString(kVrintx) << ConditionPrinter(it_block_, cond) << dt << " " 6251 << rd << ", " << rm; 6252 } 6253 6254 void Disassembler::vrintx(DataType dt, QRegister rd, QRegister rm) { 6255 os().SetCurrentInstruction(kVrintx, kFpNeon); 6256 os() << ToCString(kVrintx) << dt << " " << rd << ", " << rm; 6257 } 6258 6259 void Disassembler::vrintx(Condition cond, 6260 DataType dt, 6261 SRegister rd, 6262 SRegister rm) { 6263 os().SetCurrentInstruction(kVrintx, kFpNeon); 6264 os() << ToCString(kVrintx) << ConditionPrinter(it_block_, cond) << dt << " " 6265 << rd << ", " << rm; 6266 } 6267 6268 void Disassembler::vrintz(Condition cond, 6269 DataType dt, 6270 DRegister rd, 6271 DRegister rm) { 6272 os().SetCurrentInstruction(kVrintz, kFpNeon); 6273 os() << ToCString(kVrintz) << ConditionPrinter(it_block_, cond) << dt << " " 6274 << rd << ", " << rm; 6275 } 6276 6277 void Disassembler::vrintz(DataType dt, QRegister rd, QRegister rm) { 6278 os().SetCurrentInstruction(kVrintz, kFpNeon); 6279 os() << ToCString(kVrintz) << dt << " " << rd << ", " << rm; 6280 } 6281 6282 void Disassembler::vrintz(Condition cond, 6283 DataType dt, 6284 SRegister rd, 6285 SRegister rm) { 6286 os().SetCurrentInstruction(kVrintz, kFpNeon); 6287 os() << ToCString(kVrintz) << ConditionPrinter(it_block_, cond) << dt << " " 6288 << rd << ", " << rm; 6289 } 6290 6291 void Disassembler::vrshl( 6292 Condition cond, DataType dt, DRegister rd, DRegister rm, DRegister rn) { 6293 os().SetCurrentInstruction(kVrshl, kFpNeon); 6294 os() << ToCString(kVrshl) << ConditionPrinter(it_block_, cond) << dt; 6295 os() << " "; 6296 if (!rd.Is(rm) || !use_short_hand_form_) { 6297 os() << rd << ", "; 6298 } 6299 os() << rm << ", " << rn; 6300 } 6301 6302 void Disassembler::vrshl( 6303 Condition cond, DataType dt, QRegister rd, QRegister rm, QRegister rn) { 6304 os().SetCurrentInstruction(kVrshl, kFpNeon); 6305 os() << ToCString(kVrshl) << ConditionPrinter(it_block_, cond) << dt; 6306 os() << " "; 6307 if (!rd.Is(rm) || !use_short_hand_form_) { 6308 os() << rd << ", "; 6309 } 6310 os() << rm << ", " << rn; 6311 } 6312 6313 void Disassembler::vrshr(Condition cond, 6314 DataType dt, 6315 DRegister rd, 6316 DRegister rm, 6317 const DOperand& operand) { 6318 os().SetCurrentInstruction(kVrshr, kFpNeon); 6319 os() << ToCString(kVrshr) << ConditionPrinter(it_block_, cond) << dt; 6320 os() << " "; 6321 if (!rd.Is(rm) || !use_short_hand_form_) { 6322 os() << rd << ", "; 6323 } 6324 os() << rm << ", " << operand; 6325 } 6326 6327 void Disassembler::vrshr(Condition cond, 6328 DataType dt, 6329 QRegister rd, 6330 QRegister rm, 6331 const QOperand& operand) { 6332 os().SetCurrentInstruction(kVrshr, kFpNeon); 6333 os() << ToCString(kVrshr) << ConditionPrinter(it_block_, cond) << dt; 6334 os() << " "; 6335 if (!rd.Is(rm) || !use_short_hand_form_) { 6336 os() << rd << ", "; 6337 } 6338 os() << rm << ", " << operand; 6339 } 6340 6341 void Disassembler::vrshrn(Condition cond, 6342 DataType dt, 6343 DRegister rd, 6344 QRegister rm, 6345 const QOperand& operand) { 6346 os().SetCurrentInstruction(kVrshrn, kFpNeon); 6347 os() << ToCString(kVrshrn) << ConditionPrinter(it_block_, cond) << dt << " " 6348 << rd << ", " << rm << ", " << operand; 6349 } 6350 6351 void Disassembler::vrsqrte(Condition cond, 6352 DataType dt, 6353 DRegister rd, 6354 DRegister rm) { 6355 os().SetCurrentInstruction(kVrsqrte, kFpNeon); 6356 os() << ToCString(kVrsqrte) << ConditionPrinter(it_block_, cond) << dt << " " 6357 << rd << ", " << rm; 6358 } 6359 6360 void Disassembler::vrsqrte(Condition cond, 6361 DataType dt, 6362 QRegister rd, 6363 QRegister rm) { 6364 os().SetCurrentInstruction(kVrsqrte, kFpNeon); 6365 os() << ToCString(kVrsqrte) << ConditionPrinter(it_block_, cond) << dt << " " 6366 << rd << ", " << rm; 6367 } 6368 6369 void Disassembler::vrsqrts( 6370 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { 6371 os().SetCurrentInstruction(kVrsqrts, kFpNeon); 6372 os() << ToCString(kVrsqrts) << ConditionPrinter(it_block_, cond) << dt; 6373 os() << " "; 6374 if (!rd.Is(rn) || !use_short_hand_form_) { 6375 os() << rd << ", "; 6376 } 6377 os() << rn << ", " << rm; 6378 } 6379 6380 void Disassembler::vrsqrts( 6381 Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { 6382 os().SetCurrentInstruction(kVrsqrts, kFpNeon); 6383 os() << ToCString(kVrsqrts) << ConditionPrinter(it_block_, cond) << dt; 6384 os() << " "; 6385 if (!rd.Is(rn) || !use_short_hand_form_) { 6386 os() << rd << ", "; 6387 } 6388 os() << rn << ", " << rm; 6389 } 6390 6391 void Disassembler::vrsra(Condition cond, 6392 DataType dt, 6393 DRegister rd, 6394 DRegister rm, 6395 const DOperand& operand) { 6396 os().SetCurrentInstruction(kVrsra, kFpNeon); 6397 os() << ToCString(kVrsra) << ConditionPrinter(it_block_, cond) << dt; 6398 os() << " "; 6399 if (!rd.Is(rm) || !use_short_hand_form_) { 6400 os() << rd << ", "; 6401 } 6402 os() << rm << ", " << operand; 6403 } 6404 6405 void Disassembler::vrsra(Condition cond, 6406 DataType dt, 6407 QRegister rd, 6408 QRegister rm, 6409 const QOperand& operand) { 6410 os().SetCurrentInstruction(kVrsra, kFpNeon); 6411 os() << ToCString(kVrsra) << ConditionPrinter(it_block_, cond) << dt; 6412 os() << " "; 6413 if (!rd.Is(rm) || !use_short_hand_form_) { 6414 os() << rd << ", "; 6415 } 6416 os() << rm << ", " << operand; 6417 } 6418 6419 void Disassembler::vrsubhn( 6420 Condition cond, DataType dt, DRegister rd, QRegister rn, QRegister rm) { 6421 os().SetCurrentInstruction(kVrsubhn, kFpNeon); 6422 os() << ToCString(kVrsubhn) << ConditionPrinter(it_block_, cond) << dt << " " 6423 << rd << ", " << rn << ", " << rm; 6424 } 6425 6426 void Disassembler::vseleq(DataType dt, 6427 DRegister rd, 6428 DRegister rn, 6429 DRegister rm) { 6430 os().SetCurrentInstruction(kVseleq, kFpNeon); 6431 os() << ToCString(kVseleq) << dt << " " << rd << ", " << rn << ", " << rm; 6432 } 6433 6434 void Disassembler::vseleq(DataType dt, 6435 SRegister rd, 6436 SRegister rn, 6437 SRegister rm) { 6438 os().SetCurrentInstruction(kVseleq, kFpNeon); 6439 os() << ToCString(kVseleq) << dt << " " << rd << ", " << rn << ", " << rm; 6440 } 6441 6442 void Disassembler::vselge(DataType dt, 6443 DRegister rd, 6444 DRegister rn, 6445 DRegister rm) { 6446 os().SetCurrentInstruction(kVselge, kFpNeon); 6447 os() << ToCString(kVselge) << dt << " " << rd << ", " << rn << ", " << rm; 6448 } 6449 6450 void Disassembler::vselge(DataType dt, 6451 SRegister rd, 6452 SRegister rn, 6453 SRegister rm) { 6454 os().SetCurrentInstruction(kVselge, kFpNeon); 6455 os() << ToCString(kVselge) << dt << " " << rd << ", " << rn << ", " << rm; 6456 } 6457 6458 void Disassembler::vselgt(DataType dt, 6459 DRegister rd, 6460 DRegister rn, 6461 DRegister rm) { 6462 os().SetCurrentInstruction(kVselgt, kFpNeon); 6463 os() << ToCString(kVselgt) << dt << " " << rd << ", " << rn << ", " << rm; 6464 } 6465 6466 void Disassembler::vselgt(DataType dt, 6467 SRegister rd, 6468 SRegister rn, 6469 SRegister rm) { 6470 os().SetCurrentInstruction(kVselgt, kFpNeon); 6471 os() << ToCString(kVselgt) << dt << " " << rd << ", " << rn << ", " << rm; 6472 } 6473 6474 void Disassembler::vselvs(DataType dt, 6475 DRegister rd, 6476 DRegister rn, 6477 DRegister rm) { 6478 os().SetCurrentInstruction(kVselvs, kFpNeon); 6479 os() << ToCString(kVselvs) << dt << " " << rd << ", " << rn << ", " << rm; 6480 } 6481 6482 void Disassembler::vselvs(DataType dt, 6483 SRegister rd, 6484 SRegister rn, 6485 SRegister rm) { 6486 os().SetCurrentInstruction(kVselvs, kFpNeon); 6487 os() << ToCString(kVselvs) << dt << " " << rd << ", " << rn << ", " << rm; 6488 } 6489 6490 void Disassembler::vshl(Condition cond, 6491 DataType dt, 6492 DRegister rd, 6493 DRegister rm, 6494 const DOperand& operand) { 6495 os().SetCurrentInstruction(kVshl, kFpNeon); 6496 os() << ToCString(kVshl) << ConditionPrinter(it_block_, cond) << dt; 6497 os() << " "; 6498 if (!rd.Is(rm) || !use_short_hand_form_) { 6499 os() << rd << ", "; 6500 } 6501 os() << rm << ", " << operand; 6502 } 6503 6504 void Disassembler::vshl(Condition cond, 6505 DataType dt, 6506 QRegister rd, 6507 QRegister rm, 6508 const QOperand& operand) { 6509 os().SetCurrentInstruction(kVshl, kFpNeon); 6510 os() << ToCString(kVshl) << ConditionPrinter(it_block_, cond) << dt; 6511 os() << " "; 6512 if (!rd.Is(rm) || !use_short_hand_form_) { 6513 os() << rd << ", "; 6514 } 6515 os() << rm << ", " << operand; 6516 } 6517 6518 void Disassembler::vshll(Condition cond, 6519 DataType dt, 6520 QRegister rd, 6521 DRegister rm, 6522 const DOperand& operand) { 6523 os().SetCurrentInstruction(kVshll, kFpNeon); 6524 os() << ToCString(kVshll) << ConditionPrinter(it_block_, cond) << dt << " " 6525 << rd << ", " << rm << ", " << operand; 6526 } 6527 6528 void Disassembler::vshr(Condition cond, 6529 DataType dt, 6530 DRegister rd, 6531 DRegister rm, 6532 const DOperand& operand) { 6533 os().SetCurrentInstruction(kVshr, kFpNeon); 6534 os() << ToCString(kVshr) << ConditionPrinter(it_block_, cond) << dt; 6535 os() << " "; 6536 if (!rd.Is(rm) || !use_short_hand_form_) { 6537 os() << rd << ", "; 6538 } 6539 os() << rm << ", " << operand; 6540 } 6541 6542 void Disassembler::vshr(Condition cond, 6543 DataType dt, 6544 QRegister rd, 6545 QRegister rm, 6546 const QOperand& operand) { 6547 os().SetCurrentInstruction(kVshr, kFpNeon); 6548 os() << ToCString(kVshr) << ConditionPrinter(it_block_, cond) << dt; 6549 os() << " "; 6550 if (!rd.Is(rm) || !use_short_hand_form_) { 6551 os() << rd << ", "; 6552 } 6553 os() << rm << ", " << operand; 6554 } 6555 6556 void Disassembler::vshrn(Condition cond, 6557 DataType dt, 6558 DRegister rd, 6559 QRegister rm, 6560 const QOperand& operand) { 6561 os().SetCurrentInstruction(kVshrn, kFpNeon); 6562 os() << ToCString(kVshrn) << ConditionPrinter(it_block_, cond) << dt << " " 6563 << rd << ", " << rm << ", " << operand; 6564 } 6565 6566 void Disassembler::vsli(Condition cond, 6567 DataType dt, 6568 DRegister rd, 6569 DRegister rm, 6570 const DOperand& operand) { 6571 os().SetCurrentInstruction(kVsli, kFpNeon); 6572 os() << ToCString(kVsli) << ConditionPrinter(it_block_, cond) << dt; 6573 os() << " "; 6574 if (!rd.Is(rm) || !use_short_hand_form_) { 6575 os() << rd << ", "; 6576 } 6577 os() << rm << ", " << operand; 6578 } 6579 6580 void Disassembler::vsli(Condition cond, 6581 DataType dt, 6582 QRegister rd, 6583 QRegister rm, 6584 const QOperand& operand) { 6585 os().SetCurrentInstruction(kVsli, kFpNeon); 6586 os() << ToCString(kVsli) << ConditionPrinter(it_block_, cond) << dt; 6587 os() << " "; 6588 if (!rd.Is(rm) || !use_short_hand_form_) { 6589 os() << rd << ", "; 6590 } 6591 os() << rm << ", " << operand; 6592 } 6593 6594 void Disassembler::vsqrt(Condition cond, 6595 DataType dt, 6596 SRegister rd, 6597 SRegister rm) { 6598 os().SetCurrentInstruction(kVsqrt, kFpNeon); 6599 os() << ToCString(kVsqrt) << ConditionPrinter(it_block_, cond) << dt << " " 6600 << rd << ", " << rm; 6601 } 6602 6603 void Disassembler::vsqrt(Condition cond, 6604 DataType dt, 6605 DRegister rd, 6606 DRegister rm) { 6607 os().SetCurrentInstruction(kVsqrt, kFpNeon); 6608 os() << ToCString(kVsqrt) << ConditionPrinter(it_block_, cond) << dt << " " 6609 << rd << ", " << rm; 6610 } 6611 6612 void Disassembler::vsra(Condition cond, 6613 DataType dt, 6614 DRegister rd, 6615 DRegister rm, 6616 const DOperand& operand) { 6617 os().SetCurrentInstruction(kVsra, kFpNeon); 6618 os() << ToCString(kVsra) << ConditionPrinter(it_block_, cond) << dt; 6619 os() << " "; 6620 if (!rd.Is(rm) || !use_short_hand_form_) { 6621 os() << rd << ", "; 6622 } 6623 os() << rm << ", " << operand; 6624 } 6625 6626 void Disassembler::vsra(Condition cond, 6627 DataType dt, 6628 QRegister rd, 6629 QRegister rm, 6630 const QOperand& operand) { 6631 os().SetCurrentInstruction(kVsra, kFpNeon); 6632 os() << ToCString(kVsra) << ConditionPrinter(it_block_, cond) << dt; 6633 os() << " "; 6634 if (!rd.Is(rm) || !use_short_hand_form_) { 6635 os() << rd << ", "; 6636 } 6637 os() << rm << ", " << operand; 6638 } 6639 6640 void Disassembler::vsri(Condition cond, 6641 DataType dt, 6642 DRegister rd, 6643 DRegister rm, 6644 const DOperand& operand) { 6645 os().SetCurrentInstruction(kVsri, kFpNeon); 6646 os() << ToCString(kVsri) << ConditionPrinter(it_block_, cond) << dt; 6647 os() << " "; 6648 if (!rd.Is(rm) || !use_short_hand_form_) { 6649 os() << rd << ", "; 6650 } 6651 os() << rm << ", " << operand; 6652 } 6653 6654 void Disassembler::vsri(Condition cond, 6655 DataType dt, 6656 QRegister rd, 6657 QRegister rm, 6658 const QOperand& operand) { 6659 os().SetCurrentInstruction(kVsri, kFpNeon); 6660 os() << ToCString(kVsri) << ConditionPrinter(it_block_, cond) << dt; 6661 os() << " "; 6662 if (!rd.Is(rm) || !use_short_hand_form_) { 6663 os() << rd << ", "; 6664 } 6665 os() << rm << ", " << operand; 6666 } 6667 6668 void Disassembler::vst1(Condition cond, 6669 DataType dt, 6670 const NeonRegisterList& nreglist, 6671 const AlignedMemOperand& operand) { 6672 os().SetCurrentInstruction(kVst1, kFpNeon); 6673 os() << ToCString(kVst1) << ConditionPrinter(it_block_, cond) << dt << " " 6674 << nreglist << ", " << PrintAlignedMemOperand(kVst1Location, operand); 6675 } 6676 6677 void Disassembler::vst2(Condition cond, 6678 DataType dt, 6679 const NeonRegisterList& nreglist, 6680 const AlignedMemOperand& operand) { 6681 os().SetCurrentInstruction(kVst2, kFpNeon); 6682 os() << ToCString(kVst2) << ConditionPrinter(it_block_, cond) << dt << " " 6683 << nreglist << ", " << PrintAlignedMemOperand(kVst2Location, operand); 6684 } 6685 6686 void Disassembler::vst3(Condition cond, 6687 DataType dt, 6688 const NeonRegisterList& nreglist, 6689 const AlignedMemOperand& operand) { 6690 os().SetCurrentInstruction(kVst3, kFpNeon); 6691 os() << ToCString(kVst3) << ConditionPrinter(it_block_, cond) << dt << " " 6692 << nreglist << ", " << PrintAlignedMemOperand(kVst3Location, operand); 6693 } 6694 6695 void Disassembler::vst3(Condition cond, 6696 DataType dt, 6697 const NeonRegisterList& nreglist, 6698 const MemOperand& operand) { 6699 os().SetCurrentInstruction(kVst3, kFpNeon); 6700 os() << ToCString(kVst3) << ConditionPrinter(it_block_, cond) << dt << " " 6701 << nreglist << ", " << PrintMemOperand(kVst3Location, operand); 6702 } 6703 6704 void Disassembler::vst4(Condition cond, 6705 DataType dt, 6706 const NeonRegisterList& nreglist, 6707 const AlignedMemOperand& operand) { 6708 os().SetCurrentInstruction(kVst4, kFpNeon); 6709 os() << ToCString(kVst4) << ConditionPrinter(it_block_, cond) << dt << " " 6710 << nreglist << ", " << PrintAlignedMemOperand(kVst4Location, operand); 6711 } 6712 6713 void Disassembler::vstm(Condition cond, 6714 DataType dt, 6715 Register rn, 6716 WriteBack write_back, 6717 DRegisterList dreglist) { 6718 os().SetCurrentInstruction(kVstm, kLoadStore | kLoadStoreMultiple | kFpNeon); 6719 os() << ToCString(kVstm) << ConditionPrinter(it_block_, cond) << dt << " " 6720 << rn << write_back << ", " << dreglist; 6721 } 6722 6723 void Disassembler::vstm(Condition cond, 6724 DataType dt, 6725 Register rn, 6726 WriteBack write_back, 6727 SRegisterList sreglist) { 6728 os().SetCurrentInstruction(kVstm, kLoadStore | kLoadStoreMultiple | kFpNeon); 6729 os() << ToCString(kVstm) << ConditionPrinter(it_block_, cond) << dt << " " 6730 << rn << write_back << ", " << sreglist; 6731 } 6732 6733 void Disassembler::vstmdb(Condition cond, 6734 DataType dt, 6735 Register rn, 6736 WriteBack write_back, 6737 DRegisterList dreglist) { 6738 os().SetCurrentInstruction(kVstmdb, 6739 kLoadStore | kLoadStoreMultiple | kFpNeon); 6740 os() << ToCString(kVstmdb) << ConditionPrinter(it_block_, cond) << dt << " " 6741 << rn << write_back << ", " << dreglist; 6742 } 6743 6744 void Disassembler::vstmdb(Condition cond, 6745 DataType dt, 6746 Register rn, 6747 WriteBack write_back, 6748 SRegisterList sreglist) { 6749 os().SetCurrentInstruction(kVstmdb, 6750 kLoadStore | kLoadStoreMultiple | kFpNeon); 6751 os() << ToCString(kVstmdb) << ConditionPrinter(it_block_, cond) << dt << " " 6752 << rn << write_back << ", " << sreglist; 6753 } 6754 6755 void Disassembler::vstmia(Condition cond, 6756 DataType dt, 6757 Register rn, 6758 WriteBack write_back, 6759 DRegisterList dreglist) { 6760 os().SetCurrentInstruction(kVstmia, 6761 kLoadStore | kLoadStoreMultiple | kFpNeon); 6762 os() << ToCString(kVstmia) << ConditionPrinter(it_block_, cond) << dt << " " 6763 << rn << write_back << ", " << dreglist; 6764 } 6765 6766 void Disassembler::vstmia(Condition cond, 6767 DataType dt, 6768 Register rn, 6769 WriteBack write_back, 6770 SRegisterList sreglist) { 6771 os().SetCurrentInstruction(kVstmia, 6772 kLoadStore | kLoadStoreMultiple | kFpNeon); 6773 os() << ToCString(kVstmia) << ConditionPrinter(it_block_, cond) << dt << " " 6774 << rn << write_back << ", " << sreglist; 6775 } 6776 6777 void Disassembler::vstr(Condition cond, 6778 DataType dt, 6779 DRegister rd, 6780 const MemOperand& operand) { 6781 os().SetCurrentInstruction(kVstr, kFpNeon); 6782 os() << ToCString(kVstr) << ConditionPrinter(it_block_, cond) 6783 << DtPrinter(dt, Untyped64) << " " << rd << ", " 6784 << PrintMemOperand(kStoreDoublePrecisionLocation, operand); 6785 } 6786 6787 void Disassembler::vstr(Condition cond, 6788 DataType dt, 6789 SRegister rd, 6790 const MemOperand& operand) { 6791 os().SetCurrentInstruction(kVstr, kFpNeon); 6792 os() << ToCString(kVstr) << ConditionPrinter(it_block_, cond) 6793 << DtPrinter(dt, Untyped32) << " " << rd << ", " 6794 << PrintMemOperand(kStoreSinglePrecisionLocation, operand); 6795 } 6796 6797 void Disassembler::vsub( 6798 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { 6799 os().SetCurrentInstruction(kVsub, kFpNeon); 6800 os() << ToCString(kVsub) << ConditionPrinter(it_block_, cond) << dt; 6801 os() << " "; 6802 if (!rd.Is(rn) || !use_short_hand_form_) { 6803 os() << rd << ", "; 6804 } 6805 os() << rn << ", " << rm; 6806 } 6807 6808 void Disassembler::vsub( 6809 Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { 6810 os().SetCurrentInstruction(kVsub, kFpNeon); 6811 os() << ToCString(kVsub) << ConditionPrinter(it_block_, cond) << dt; 6812 os() << " "; 6813 if (!rd.Is(rn) || !use_short_hand_form_) { 6814 os() << rd << ", "; 6815 } 6816 os() << rn << ", " << rm; 6817 } 6818 6819 void Disassembler::vsub( 6820 Condition cond, DataType dt, SRegister rd, SRegister rn, SRegister rm) { 6821 os().SetCurrentInstruction(kVsub, kFpNeon); 6822 os() << ToCString(kVsub) << ConditionPrinter(it_block_, cond) << dt; 6823 os() << " "; 6824 if (!rd.Is(rn) || !use_short_hand_form_) { 6825 os() << rd << ", "; 6826 } 6827 os() << rn << ", " << rm; 6828 } 6829 6830 void Disassembler::vsubhn( 6831 Condition cond, DataType dt, DRegister rd, QRegister rn, QRegister rm) { 6832 os().SetCurrentInstruction(kVsubhn, kFpNeon); 6833 os() << ToCString(kVsubhn) << ConditionPrinter(it_block_, cond) << dt << " " 6834 << rd << ", " << rn << ", " << rm; 6835 } 6836 6837 void Disassembler::vsubl( 6838 Condition cond, DataType dt, QRegister rd, DRegister rn, DRegister rm) { 6839 os().SetCurrentInstruction(kVsubl, kFpNeon); 6840 os() << ToCString(kVsubl) << ConditionPrinter(it_block_, cond) << dt << " " 6841 << rd << ", " << rn << ", " << rm; 6842 } 6843 6844 void Disassembler::vsubw( 6845 Condition cond, DataType dt, QRegister rd, QRegister rn, DRegister rm) { 6846 os().SetCurrentInstruction(kVsubw, kFpNeon); 6847 os() << ToCString(kVsubw) << ConditionPrinter(it_block_, cond) << dt; 6848 os() << " "; 6849 if (!rd.Is(rn) || !use_short_hand_form_) { 6850 os() << rd << ", "; 6851 } 6852 os() << rn << ", " << rm; 6853 } 6854 6855 void Disassembler::vswp(Condition cond, 6856 DataType dt, 6857 DRegister rd, 6858 DRegister rm) { 6859 os().SetCurrentInstruction(kVswp, kFpNeon); 6860 os() << ToCString(kVswp) << ConditionPrinter(it_block_, cond) << dt << " " 6861 << rd << ", " << rm; 6862 } 6863 6864 void Disassembler::vswp(Condition cond, 6865 DataType dt, 6866 QRegister rd, 6867 QRegister rm) { 6868 os().SetCurrentInstruction(kVswp, kFpNeon); 6869 os() << ToCString(kVswp) << ConditionPrinter(it_block_, cond) << dt << " " 6870 << rd << ", " << rm; 6871 } 6872 6873 void Disassembler::vtbl(Condition cond, 6874 DataType dt, 6875 DRegister rd, 6876 const NeonRegisterList& nreglist, 6877 DRegister rm) { 6878 os().SetCurrentInstruction(kVtbl, kFpNeon); 6879 os() << ToCString(kVtbl) << ConditionPrinter(it_block_, cond) << dt << " " 6880 << rd << ", " << nreglist << ", " << rm; 6881 } 6882 6883 void Disassembler::vtbx(Condition cond, 6884 DataType dt, 6885 DRegister rd, 6886 const NeonRegisterList& nreglist, 6887 DRegister rm) { 6888 os().SetCurrentInstruction(kVtbx, kFpNeon); 6889 os() << ToCString(kVtbx) << ConditionPrinter(it_block_, cond) << dt << " " 6890 << rd << ", " << nreglist << ", " << rm; 6891 } 6892 6893 void Disassembler::vtrn(Condition cond, 6894 DataType dt, 6895 DRegister rd, 6896 DRegister rm) { 6897 os().SetCurrentInstruction(kVtrn, kFpNeon); 6898 os() << ToCString(kVtrn) << ConditionPrinter(it_block_, cond) << dt << " " 6899 << rd << ", " << rm; 6900 } 6901 6902 void Disassembler::vtrn(Condition cond, 6903 DataType dt, 6904 QRegister rd, 6905 QRegister rm) { 6906 os().SetCurrentInstruction(kVtrn, kFpNeon); 6907 os() << ToCString(kVtrn) << ConditionPrinter(it_block_, cond) << dt << " " 6908 << rd << ", " << rm; 6909 } 6910 6911 void Disassembler::vtst( 6912 Condition cond, DataType dt, DRegister rd, DRegister rn, DRegister rm) { 6913 os().SetCurrentInstruction(kVtst, kFpNeon); 6914 os() << ToCString(kVtst) << ConditionPrinter(it_block_, cond) << dt; 6915 os() << " "; 6916 if (!rd.Is(rn) || !use_short_hand_form_) { 6917 os() << rd << ", "; 6918 } 6919 os() << rn << ", " << rm; 6920 } 6921 6922 void Disassembler::vtst( 6923 Condition cond, DataType dt, QRegister rd, QRegister rn, QRegister rm) { 6924 os().SetCurrentInstruction(kVtst, kFpNeon); 6925 os() << ToCString(kVtst) << ConditionPrinter(it_block_, cond) << dt; 6926 os() << " "; 6927 if (!rd.Is(rn) || !use_short_hand_form_) { 6928 os() << rd << ", "; 6929 } 6930 os() << rn << ", " << rm; 6931 } 6932 6933 void Disassembler::vuzp(Condition cond, 6934 DataType dt, 6935 DRegister rd, 6936 DRegister rm) { 6937 os().SetCurrentInstruction(kVuzp, kFpNeon); 6938 os() << ToCString(kVuzp) << ConditionPrinter(it_block_, cond) << dt << " " 6939 << rd << ", " << rm; 6940 } 6941 6942 void Disassembler::vuzp(Condition cond, 6943 DataType dt, 6944 QRegister rd, 6945 QRegister rm) { 6946 os().SetCurrentInstruction(kVuzp, kFpNeon); 6947 os() << ToCString(kVuzp) << ConditionPrinter(it_block_, cond) << dt << " " 6948 << rd << ", " << rm; 6949 } 6950 6951 void Disassembler::vzip(Condition cond, 6952 DataType dt, 6953 DRegister rd, 6954 DRegister rm) { 6955 os().SetCurrentInstruction(kVzip, kFpNeon); 6956 os() << ToCString(kVzip) << ConditionPrinter(it_block_, cond) << dt << " " 6957 << rd << ", " << rm; 6958 } 6959 6960 void Disassembler::vzip(Condition cond, 6961 DataType dt, 6962 QRegister rd, 6963 QRegister rm) { 6964 os().SetCurrentInstruction(kVzip, kFpNeon); 6965 os() << ToCString(kVzip) << ConditionPrinter(it_block_, cond) << dt << " " 6966 << rd << ", " << rm; 6967 } 6968 6969 void Disassembler::yield(Condition cond, EncodingSize size) { 6970 os().SetCurrentInstruction(kYield, kNoAttribute); 6971 os() << ToCString(kYield) << ConditionPrinter(it_block_, cond) << size; 6972 } 6973 6974 int Disassembler::T32Size(uint32_t instr) { 6975 if ((instr & 0xe0000000) == 0xe0000000) { 6976 switch (instr & 0x08000000) { 6977 case 0x00000000: 6978 if ((instr & 0x10000000) == 0x10000000) return 4; 6979 return 2; 6980 case 0x08000000: 6981 return 4; 6982 default: 6983 return 2; 6984 } 6985 } 6986 return 2; 6987 } 6988 6989 void Disassembler::DecodeT32(uint32_t instr) { 6990 T32CodeAddressIncrementer incrementer(instr, &code_address_); 6991 ITBlockScope it_scope(&it_block_); 6992 6993 switch (instr & 0xe0000000) { 6994 case 0x00000000: { 6995 // 0x00000000 6996 switch (instr & 0x18000000) { 6997 case 0x18000000: { 6998 // 0x18000000 6999 switch (instr & 0x06000000) { 7000 case 0x00000000: { 7001 // 0x18000000 7002 unsigned rd = (instr >> 16) & 0x7; 7003 unsigned rn = (instr >> 19) & 0x7; 7004 unsigned rm = (instr >> 22) & 0x7; 7005 if (InITBlock()) { 7006 // ADD<c>{<q>} <Rd>, <Rn>, <Rm> ; T1 7007 add(CurrentCond(), 7008 Narrow, 7009 Register(rd), 7010 Register(rn), 7011 Register(rm)); 7012 } else { 7013 VIXL_ASSERT(OutsideITBlock()); 7014 // ADDS{<q>} {<Rd>}, <Rn>, <Rm> ; T1 7015 adds(Condition::None(), 7016 Narrow, 7017 Register(rd), 7018 Register(rn), 7019 Register(rm)); 7020 } 7021 break; 7022 } 7023 case 0x02000000: { 7024 // 0x1a000000 7025 unsigned rd = (instr >> 16) & 0x7; 7026 unsigned rn = (instr >> 19) & 0x7; 7027 unsigned rm = (instr >> 22) & 0x7; 7028 if (InITBlock()) { 7029 // SUB<c>{<q>} <Rd>, <Rn>, <Rm> ; T1 7030 sub(CurrentCond(), 7031 Narrow, 7032 Register(rd), 7033 Register(rn), 7034 Register(rm)); 7035 } else { 7036 VIXL_ASSERT(OutsideITBlock()); 7037 // SUBS{<q>} {<Rd>}, <Rn>, <Rm> ; T1 7038 subs(Condition::None(), 7039 Narrow, 7040 Register(rd), 7041 Register(rn), 7042 Register(rm)); 7043 } 7044 break; 7045 } 7046 case 0x04000000: { 7047 // 0x1c000000 7048 unsigned rd = (instr >> 16) & 0x7; 7049 unsigned rn = (instr >> 19) & 0x7; 7050 uint32_t imm = (instr >> 22) & 0x7; 7051 if (InITBlock()) { 7052 // ADD<c>{<q>} <Rd>, <Rn>, #<imm3> ; T1 7053 add(CurrentCond(), Narrow, Register(rd), Register(rn), imm); 7054 } else { 7055 VIXL_ASSERT(OutsideITBlock()); 7056 // ADDS{<q>} <Rd>, <Rn>, #<imm3> ; T1 7057 adds(Condition::None(), 7058 Narrow, 7059 Register(rd), 7060 Register(rn), 7061 imm); 7062 } 7063 break; 7064 } 7065 case 0x06000000: { 7066 // 0x1e000000 7067 unsigned rd = (instr >> 16) & 0x7; 7068 unsigned rn = (instr >> 19) & 0x7; 7069 uint32_t imm = (instr >> 22) & 0x7; 7070 if (InITBlock()) { 7071 // SUB<c>{<q>} <Rd>, <Rn>, #<imm3> ; T1 7072 sub(CurrentCond(), Narrow, Register(rd), Register(rn), imm); 7073 } else { 7074 VIXL_ASSERT(OutsideITBlock()); 7075 // SUBS{<q>} <Rd>, <Rn>, #<imm3> ; T1 7076 subs(Condition::None(), 7077 Narrow, 7078 Register(rd), 7079 Register(rn), 7080 imm); 7081 } 7082 break; 7083 } 7084 } 7085 break; 7086 } 7087 default: { 7088 if (((instr & 0x18000000) == 0x18000000)) { 7089 UnallocatedT32(instr); 7090 return; 7091 } 7092 if (((Uint32((instr >> 27)) & Uint32(0x3)) == Uint32(0x2)) && 7093 InITBlock()) { 7094 unsigned rd = (instr >> 16) & 0x7; 7095 unsigned rm = (instr >> 19) & 0x7; 7096 uint32_t amount = (instr >> 22) & 0x1f; 7097 if (amount == 0) amount = 32; 7098 // ASR<c>{<q>} {<Rd>}, <Rm>, #<imm> ; T2 7099 asr(CurrentCond(), Narrow, Register(rd), Register(rm), amount); 7100 return; 7101 } 7102 if (((Uint32((instr >> 27)) & Uint32(0x3)) == Uint32(0x2)) && 7103 !InITBlock()) { 7104 unsigned rd = (instr >> 16) & 0x7; 7105 unsigned rm = (instr >> 19) & 0x7; 7106 uint32_t amount = (instr >> 22) & 0x1f; 7107 if (amount == 0) amount = 32; 7108 // ASRS{<q>} {<Rd>}, <Rm>, #<imm> ; T2 7109 asrs(Condition::None(), Narrow, Register(rd), Register(rm), amount); 7110 return; 7111 } 7112 if (((Uint32((instr >> 27)) & Uint32(0x3)) == Uint32(0x0)) && 7113 ((instr & 0x07c00000) != 0x00000000) && InITBlock()) { 7114 unsigned rd = (instr >> 16) & 0x7; 7115 unsigned rm = (instr >> 19) & 0x7; 7116 uint32_t amount = (instr >> 22) & 0x1f; 7117 // LSL<c>{<q>} {<Rd>}, <Rm>, #<imm> ; T2 7118 lsl(CurrentCond(), Narrow, Register(rd), Register(rm), amount); 7119 return; 7120 } 7121 if (((Uint32((instr >> 27)) & Uint32(0x3)) == Uint32(0x0)) && 7122 ((instr & 0x07c00000) != 0x00000000) && !InITBlock()) { 7123 unsigned rd = (instr >> 16) & 0x7; 7124 unsigned rm = (instr >> 19) & 0x7; 7125 uint32_t amount = (instr >> 22) & 0x1f; 7126 // LSLS{<q>} {<Rd>}, <Rm>, #<imm> ; T2 7127 lsls(Condition::None(), Narrow, Register(rd), Register(rm), amount); 7128 return; 7129 } 7130 if (((Uint32((instr >> 27)) & Uint32(0x3)) == Uint32(0x1)) && 7131 InITBlock()) { 7132 unsigned rd = (instr >> 16) & 0x7; 7133 unsigned rm = (instr >> 19) & 0x7; 7134 uint32_t amount = (instr >> 22) & 0x1f; 7135 if (amount == 0) amount = 32; 7136 // LSR<c>{<q>} {<Rd>}, <Rm>, #<imm> ; T2 7137 lsr(CurrentCond(), Narrow, Register(rd), Register(rm), amount); 7138 return; 7139 } 7140 if (((Uint32((instr >> 27)) & Uint32(0x3)) == Uint32(0x1)) && 7141 !InITBlock()) { 7142 unsigned rd = (instr >> 16) & 0x7; 7143 unsigned rm = (instr >> 19) & 0x7; 7144 uint32_t amount = (instr >> 22) & 0x1f; 7145 if (amount == 0) amount = 32; 7146 // LSRS{<q>} {<Rd>}, <Rm>, #<imm> ; T2 7147 lsrs(Condition::None(), Narrow, Register(rd), Register(rm), amount); 7148 return; 7149 } 7150 unsigned rd = (instr >> 16) & 0x7; 7151 unsigned rm = (instr >> 19) & 0x7; 7152 ImmediateShiftOperand shift_operand((instr >> 27) & 0x3, 7153 (instr >> 22) & 0x1f); 7154 if (InITBlock()) { 7155 // MOV<c>{<q>} <Rd>, <Rm> {, <shift> #<amount> } ; T2 7156 mov(CurrentCond(), 7157 Narrow, 7158 Register(rd), 7159 Operand(Register(rm), 7160 shift_operand.GetType(), 7161 shift_operand.GetAmount())); 7162 } else { 7163 VIXL_ASSERT(OutsideITBlock()); 7164 // MOVS{<q>} <Rd>, <Rm> {, <shift> #<amount> } ; T2 7165 movs(Condition::None(), 7166 Narrow, 7167 Register(rd), 7168 Operand(Register(rm), 7169 shift_operand.GetType(), 7170 shift_operand.GetAmount())); 7171 } 7172 break; 7173 } 7174 } 7175 break; 7176 } 7177 case 0x20000000: { 7178 // 0x20000000 7179 switch (instr & 0x18000000) { 7180 case 0x00000000: { 7181 // 0x20000000 7182 unsigned rd = (instr >> 24) & 0x7; 7183 uint32_t imm = (instr >> 16) & 0xff; 7184 if (InITBlock()) { 7185 // MOV<c>{<q>} <Rd>, #<imm8> ; T1 7186 mov(CurrentCond(), Narrow, Register(rd), imm); 7187 } else { 7188 VIXL_ASSERT(OutsideITBlock()); 7189 // MOVS{<q>} <Rd>, #<imm8> ; T1 7190 movs(Condition::None(), Narrow, Register(rd), imm); 7191 } 7192 break; 7193 } 7194 case 0x08000000: { 7195 // 0x28000000 7196 unsigned rn = (instr >> 24) & 0x7; 7197 uint32_t imm = (instr >> 16) & 0xff; 7198 // CMP{<c>}{<q>} <Rn>, #<imm8> ; T1 7199 cmp(CurrentCond(), Narrow, Register(rn), imm); 7200 break; 7201 } 7202 case 0x10000000: { 7203 // 0x30000000 7204 unsigned rd = (instr >> 24) & 0x7; 7205 uint32_t imm = (instr >> 16) & 0xff; 7206 if (InITBlock() && ((imm <= 7))) { 7207 // ADD<c>{<q>} <Rdn>, #<imm8> ; T2 7208 add(CurrentCond(), Register(rd), imm); 7209 } else if (InITBlock() && ((imm > 7))) { 7210 // ADD<c>{<q>} {<Rdn>}, <Rdn>, #<imm8> ; T2 7211 add(CurrentCond(), Narrow, Register(rd), Register(rd), imm); 7212 } else if (OutsideITBlock() && ((imm <= 7))) { 7213 // ADDS{<q>} <Rdn>, #<imm8> ; T2 7214 adds(Register(rd), imm); 7215 } else if (OutsideITBlock() && ((imm > 7))) { 7216 // ADDS{<q>} {<Rdn>}, <Rdn>, #<imm8> ; T2 7217 adds(Condition::None(), Narrow, Register(rd), Register(rd), imm); 7218 } else { 7219 UnallocatedT32(instr); 7220 } 7221 break; 7222 } 7223 case 0x18000000: { 7224 // 0x38000000 7225 unsigned rd = (instr >> 24) & 0x7; 7226 uint32_t imm = (instr >> 16) & 0xff; 7227 if (InITBlock() && ((imm <= 7))) { 7228 // SUB<c>{<q>} <Rdn>, #<imm8> ; T2 7229 sub(CurrentCond(), Register(rd), imm); 7230 } else if (InITBlock() && ((imm > 7))) { 7231 // SUB<c>{<q>} {<Rdn>}, <Rdn>, #<imm8> ; T2 7232 sub(CurrentCond(), Narrow, Register(rd), Register(rd), imm); 7233 } else if (OutsideITBlock() && ((imm <= 7))) { 7234 // SUBS{<q>} <Rdn>, #<imm8> ; T2 7235 subs(Register(rd), imm); 7236 } else if (OutsideITBlock() && ((imm > 7))) { 7237 // SUBS{<q>} {<Rdn>}, <Rdn>, #<imm8> ; T2 7238 subs(Condition::None(), Narrow, Register(rd), Register(rd), imm); 7239 } else { 7240 UnallocatedT32(instr); 7241 } 7242 break; 7243 } 7244 } 7245 break; 7246 } 7247 case 0x40000000: { 7248 // 0x40000000 7249 switch (instr & 0x18000000) { 7250 case 0x00000000: { 7251 // 0x40000000 7252 switch (instr & 0x07000000) { 7253 case 0x00000000: { 7254 // 0x40000000 7255 switch (instr & 0x00c00000) { 7256 case 0x00000000: { 7257 // 0x40000000 7258 unsigned rd = (instr >> 16) & 0x7; 7259 unsigned rm = (instr >> 19) & 0x7; 7260 if (InITBlock()) { 7261 // AND<c>{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1 7262 and_(CurrentCond(), 7263 Narrow, 7264 Register(rd), 7265 Register(rd), 7266 Register(rm)); 7267 } else { 7268 VIXL_ASSERT(OutsideITBlock()); 7269 // ANDS{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1 7270 ands(Condition::None(), 7271 Narrow, 7272 Register(rd), 7273 Register(rd), 7274 Register(rm)); 7275 } 7276 break; 7277 } 7278 case 0x00400000: { 7279 // 0x40400000 7280 unsigned rd = (instr >> 16) & 0x7; 7281 unsigned rm = (instr >> 19) & 0x7; 7282 if (InITBlock()) { 7283 // EOR<c>{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1 7284 eor(CurrentCond(), 7285 Narrow, 7286 Register(rd), 7287 Register(rd), 7288 Register(rm)); 7289 } else { 7290 VIXL_ASSERT(OutsideITBlock()); 7291 // EORS{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1 7292 eors(Condition::None(), 7293 Narrow, 7294 Register(rd), 7295 Register(rd), 7296 Register(rm)); 7297 } 7298 break; 7299 } 7300 case 0x00800000: { 7301 // 0x40800000 7302 if (InITBlock()) { 7303 unsigned rd = (instr >> 16) & 0x7; 7304 unsigned rs = (instr >> 19) & 0x7; 7305 // LSL<c>{<q>} {<Rdm>}, <Rdm>, <Rs> ; T1 7306 lsl(CurrentCond(), 7307 Narrow, 7308 Register(rd), 7309 Register(rd), 7310 Register(rs)); 7311 return; 7312 } 7313 if (!InITBlock()) { 7314 unsigned rd = (instr >> 16) & 0x7; 7315 unsigned rs = (instr >> 19) & 0x7; 7316 // LSLS{<q>} {<Rdm>}, <Rdm>, <Rs> ; T1 7317 lsls(Condition::None(), 7318 Narrow, 7319 Register(rd), 7320 Register(rd), 7321 Register(rs)); 7322 return; 7323 } 7324 unsigned rd = (instr >> 16) & 0x7; 7325 unsigned rm = (instr >> 16) & 0x7; 7326 unsigned rs = (instr >> 19) & 0x7; 7327 if (InITBlock()) { 7328 // MOV<c>{<q>} <Rdm>, <Rdm>, LSL <Rs> ; T1 7329 mov(CurrentCond(), 7330 Narrow, 7331 Register(rd), 7332 Operand(Register(rm), LSL, Register(rs))); 7333 } else { 7334 VIXL_ASSERT(OutsideITBlock()); 7335 // MOVS{<q>} <Rdm>, <Rdm>, LSL <Rs> ; T1 7336 movs(Condition::None(), 7337 Narrow, 7338 Register(rd), 7339 Operand(Register(rm), LSL, Register(rs))); 7340 } 7341 break; 7342 } 7343 case 0x00c00000: { 7344 // 0x40c00000 7345 if (InITBlock()) { 7346 unsigned rd = (instr >> 16) & 0x7; 7347 unsigned rs = (instr >> 19) & 0x7; 7348 // LSR<c>{<q>} {<Rdm>}, <Rdm>, <Rs> ; T1 7349 lsr(CurrentCond(), 7350 Narrow, 7351 Register(rd), 7352 Register(rd), 7353 Register(rs)); 7354 return; 7355 } 7356 if (!InITBlock()) { 7357 unsigned rd = (instr >> 16) & 0x7; 7358 unsigned rs = (instr >> 19) & 0x7; 7359 // LSRS{<q>} {<Rdm>}, <Rdm>, <Rs> ; T1 7360 lsrs(Condition::None(), 7361 Narrow, 7362 Register(rd), 7363 Register(rd), 7364 Register(rs)); 7365 return; 7366 } 7367 unsigned rd = (instr >> 16) & 0x7; 7368 unsigned rm = (instr >> 16) & 0x7; 7369 unsigned rs = (instr >> 19) & 0x7; 7370 if (InITBlock()) { 7371 // MOV<c>{<q>} <Rdm>, <Rdm>, LSR <Rs> ; T1 7372 mov(CurrentCond(), 7373 Narrow, 7374 Register(rd), 7375 Operand(Register(rm), LSR, Register(rs))); 7376 } else { 7377 VIXL_ASSERT(OutsideITBlock()); 7378 // MOVS{<q>} <Rdm>, <Rdm>, LSR <Rs> ; T1 7379 movs(Condition::None(), 7380 Narrow, 7381 Register(rd), 7382 Operand(Register(rm), LSR, Register(rs))); 7383 } 7384 break; 7385 } 7386 } 7387 break; 7388 } 7389 case 0x01000000: { 7390 // 0x41000000 7391 switch (instr & 0x00c00000) { 7392 case 0x00000000: { 7393 // 0x41000000 7394 if (InITBlock()) { 7395 unsigned rd = (instr >> 16) & 0x7; 7396 unsigned rs = (instr >> 19) & 0x7; 7397 // ASR<c>{<q>} {<Rdm>}, <Rdm>, <Rs> ; T1 7398 asr(CurrentCond(), 7399 Narrow, 7400 Register(rd), 7401 Register(rd), 7402 Register(rs)); 7403 return; 7404 } 7405 if (!InITBlock()) { 7406 unsigned rd = (instr >> 16) & 0x7; 7407 unsigned rs = (instr >> 19) & 0x7; 7408 // ASRS{<q>} {<Rdm>}, <Rdm>, <Rs> ; T1 7409 asrs(Condition::None(), 7410 Narrow, 7411 Register(rd), 7412 Register(rd), 7413 Register(rs)); 7414 return; 7415 } 7416 unsigned rd = (instr >> 16) & 0x7; 7417 unsigned rm = (instr >> 16) & 0x7; 7418 unsigned rs = (instr >> 19) & 0x7; 7419 if (InITBlock()) { 7420 // MOV<c>{<q>} <Rdm>, <Rdm>, ASR <Rs> ; T1 7421 mov(CurrentCond(), 7422 Narrow, 7423 Register(rd), 7424 Operand(Register(rm), ASR, Register(rs))); 7425 } else { 7426 VIXL_ASSERT(OutsideITBlock()); 7427 // MOVS{<q>} <Rdm>, <Rdm>, ASR <Rs> ; T1 7428 movs(Condition::None(), 7429 Narrow, 7430 Register(rd), 7431 Operand(Register(rm), ASR, Register(rs))); 7432 } 7433 break; 7434 } 7435 case 0x00400000: { 7436 // 0x41400000 7437 unsigned rd = (instr >> 16) & 0x7; 7438 unsigned rm = (instr >> 19) & 0x7; 7439 if (InITBlock()) { 7440 // ADC<c>{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1 7441 adc(CurrentCond(), 7442 Narrow, 7443 Register(rd), 7444 Register(rd), 7445 Register(rm)); 7446 } else { 7447 VIXL_ASSERT(OutsideITBlock()); 7448 // ADCS{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1 7449 adcs(Condition::None(), 7450 Narrow, 7451 Register(rd), 7452 Register(rd), 7453 Register(rm)); 7454 } 7455 break; 7456 } 7457 case 0x00800000: { 7458 // 0x41800000 7459 unsigned rd = (instr >> 16) & 0x7; 7460 unsigned rm = (instr >> 19) & 0x7; 7461 if (InITBlock()) { 7462 // SBC<c>{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1 7463 sbc(CurrentCond(), 7464 Narrow, 7465 Register(rd), 7466 Register(rd), 7467 Register(rm)); 7468 } else { 7469 VIXL_ASSERT(OutsideITBlock()); 7470 // SBCS{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1 7471 sbcs(Condition::None(), 7472 Narrow, 7473 Register(rd), 7474 Register(rd), 7475 Register(rm)); 7476 } 7477 break; 7478 } 7479 case 0x00c00000: { 7480 // 0x41c00000 7481 if (InITBlock()) { 7482 unsigned rd = (instr >> 16) & 0x7; 7483 unsigned rs = (instr >> 19) & 0x7; 7484 // ROR<c>{<q>} {<Rdm>}, <Rdm>, <Rs> ; T1 7485 ror(CurrentCond(), 7486 Narrow, 7487 Register(rd), 7488 Register(rd), 7489 Register(rs)); 7490 return; 7491 } 7492 if (!InITBlock()) { 7493 unsigned rd = (instr >> 16) & 0x7; 7494 unsigned rs = (instr >> 19) & 0x7; 7495 // RORS{<q>} {<Rdm>}, <Rdm>, <Rs> ; T1 7496 rors(Condition::None(), 7497 Narrow, 7498 Register(rd), 7499 Register(rd), 7500 Register(rs)); 7501 return; 7502 } 7503 unsigned rd = (instr >> 16) & 0x7; 7504 unsigned rm = (instr >> 16) & 0x7; 7505 unsigned rs = (instr >> 19) & 0x7; 7506 if (InITBlock()) { 7507 // MOV<c>{<q>} <Rdm>, <Rdm>, ROR <Rs> ; T1 7508 mov(CurrentCond(), 7509 Narrow, 7510 Register(rd), 7511 Operand(Register(rm), ROR, Register(rs))); 7512 } else { 7513 VIXL_ASSERT(OutsideITBlock()); 7514 // MOVS{<q>} <Rdm>, <Rdm>, ROR <Rs> ; T1 7515 movs(Condition::None(), 7516 Narrow, 7517 Register(rd), 7518 Operand(Register(rm), ROR, Register(rs))); 7519 } 7520 break; 7521 } 7522 } 7523 break; 7524 } 7525 case 0x02000000: { 7526 // 0x42000000 7527 switch (instr & 0x00c00000) { 7528 case 0x00000000: { 7529 // 0x42000000 7530 unsigned rn = (instr >> 16) & 0x7; 7531 unsigned rm = (instr >> 19) & 0x7; 7532 // TST{<c>}{<q>} <Rn>, <Rm> ; T1 7533 tst(CurrentCond(), Narrow, Register(rn), Register(rm)); 7534 break; 7535 } 7536 case 0x00400000: { 7537 // 0x42400000 7538 unsigned rd = (instr >> 16) & 0x7; 7539 unsigned rn = (instr >> 19) & 0x7; 7540 if (InITBlock()) { 7541 // RSB<c>{<q>} {<Rd>}, <Rn>, #0 ; T1 7542 rsb(CurrentCond(), 7543 Narrow, 7544 Register(rd), 7545 Register(rn), 7546 UINT32_C(0)); 7547 } else { 7548 VIXL_ASSERT(OutsideITBlock()); 7549 // RSBS{<q>} {<Rd>}, <Rn>, #0 ; T1 7550 rsbs(Condition::None(), 7551 Narrow, 7552 Register(rd), 7553 Register(rn), 7554 UINT32_C(0)); 7555 } 7556 break; 7557 } 7558 case 0x00800000: { 7559 // 0x42800000 7560 unsigned rn = (instr >> 16) & 0x7; 7561 unsigned rm = (instr >> 19) & 0x7; 7562 // CMP{<c>}{<q>} <Rn>, <Rm> ; T1 7563 cmp(CurrentCond(), Narrow, Register(rn), Register(rm)); 7564 break; 7565 } 7566 case 0x00c00000: { 7567 // 0x42c00000 7568 unsigned rn = (instr >> 16) & 0x7; 7569 unsigned rm = (instr >> 19) & 0x7; 7570 // CMN{<c>}{<q>} <Rn>, <Rm> ; T1 7571 cmn(CurrentCond(), Narrow, Register(rn), Register(rm)); 7572 break; 7573 } 7574 } 7575 break; 7576 } 7577 case 0x03000000: { 7578 // 0x43000000 7579 switch (instr & 0x00c00000) { 7580 case 0x00000000: { 7581 // 0x43000000 7582 unsigned rd = (instr >> 16) & 0x7; 7583 unsigned rm = (instr >> 19) & 0x7; 7584 if (InITBlock()) { 7585 // ORR<c>{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1 7586 orr(CurrentCond(), 7587 Narrow, 7588 Register(rd), 7589 Register(rd), 7590 Register(rm)); 7591 } else { 7592 VIXL_ASSERT(OutsideITBlock()); 7593 // ORRS{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1 7594 orrs(Condition::None(), 7595 Narrow, 7596 Register(rd), 7597 Register(rd), 7598 Register(rm)); 7599 } 7600 break; 7601 } 7602 case 0x00400000: { 7603 // 0x43400000 7604 unsigned rd = (instr >> 16) & 0x7; 7605 unsigned rn = (instr >> 19) & 0x7; 7606 if (InITBlock()) { 7607 // MUL<c>{<q>} <Rdm>, <Rn>, {<Rdm>} ; T1 7608 mul(CurrentCond(), 7609 Narrow, 7610 Register(rd), 7611 Register(rn), 7612 Register(rd)); 7613 } else { 7614 VIXL_ASSERT(OutsideITBlock()); 7615 // MULS{<q>} <Rdm>, <Rn>, {<Rdm>} ; T1 7616 muls(Condition::None(), 7617 Register(rd), 7618 Register(rn), 7619 Register(rd)); 7620 } 7621 break; 7622 } 7623 case 0x00800000: { 7624 // 0x43800000 7625 unsigned rd = (instr >> 16) & 0x7; 7626 unsigned rm = (instr >> 19) & 0x7; 7627 if (InITBlock()) { 7628 // BIC<c>{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1 7629 bic(CurrentCond(), 7630 Narrow, 7631 Register(rd), 7632 Register(rd), 7633 Register(rm)); 7634 } else { 7635 VIXL_ASSERT(OutsideITBlock()); 7636 // BICS{<q>} {<Rdn>}, <Rdn>, <Rm> ; T1 7637 bics(Condition::None(), 7638 Narrow, 7639 Register(rd), 7640 Register(rd), 7641 Register(rm)); 7642 } 7643 break; 7644 } 7645 case 0x00c00000: { 7646 // 0x43c00000 7647 unsigned rd = (instr >> 16) & 0x7; 7648 unsigned rm = (instr >> 19) & 0x7; 7649 if (InITBlock()) { 7650 // MVN<c>{<q>} <Rd>, <Rm> ; T1 7651 mvn(CurrentCond(), Narrow, Register(rd), Register(rm)); 7652 } else { 7653 VIXL_ASSERT(OutsideITBlock()); 7654 // MVNS{<q>} <Rd>, <Rm> ; T1 7655 mvns(Condition::None(), Narrow, Register(rd), Register(rm)); 7656 } 7657 break; 7658 } 7659 } 7660 break; 7661 } 7662 case 0x04000000: { 7663 // 0x44000000 7664 switch (instr & 0x00780000) { 7665 case 0x00680000: { 7666 // 0x44680000 7667 unsigned rd = ((instr >> 16) & 0x7) | ((instr >> 20) & 0x8); 7668 // ADD{<c>}{<q>} {<Rdm>}, SP, <Rdm> ; T1 7669 add(CurrentCond(), Narrow, Register(rd), sp, Register(rd)); 7670 break; 7671 } 7672 default: { 7673 switch (instr & 0x00870000) { 7674 case 0x00850000: { 7675 // 0x44850000 7676 if (((instr & 0x780000) == 0x680000)) { 7677 UnallocatedT32(instr); 7678 return; 7679 } 7680 unsigned rm = (instr >> 19) & 0xf; 7681 // ADD{<c>}{<q>} {SP}, SP, <Rm> ; T2 7682 add(CurrentCond(), Narrow, sp, sp, Register(rm)); 7683 break; 7684 } 7685 default: { 7686 if (((instr & 0x780000) == 0x680000) || 7687 ((instr & 0x870000) == 0x850000)) { 7688 UnallocatedT32(instr); 7689 return; 7690 } 7691 unsigned rd = 7692 ((instr >> 16) & 0x7) | ((instr >> 20) & 0x8); 7693 unsigned rm = (instr >> 19) & 0xf; 7694 if (InITBlock()) { 7695 // ADD<c>{<q>} <Rdn>, <Rm> ; T2 7696 add(CurrentCond(), Register(rd), Register(rm)); 7697 } else { 7698 // ADD{<c>}{<q>} {<Rdn>}, <Rdn>, <Rm> ; T2 7699 add(CurrentCond(), 7700 Narrow, 7701 Register(rd), 7702 Register(rd), 7703 Register(rm)); 7704 } 7705 break; 7706 } 7707 } 7708 break; 7709 } 7710 } 7711 break; 7712 } 7713 case 0x05000000: { 7714 // 0x45000000 7715 unsigned rn = ((instr >> 16) & 0x7) | ((instr >> 20) & 0x8); 7716 unsigned rm = (instr >> 19) & 0xf; 7717 // CMP{<c>}{<q>} <Rn>, <Rm> ; T2 7718 cmp(CurrentCond(), Narrow, Register(rn), Register(rm)); 7719 break; 7720 } 7721 case 0x06000000: { 7722 // 0x46000000 7723 unsigned rd = ((instr >> 16) & 0x7) | ((instr >> 20) & 0x8); 7724 unsigned rm = (instr >> 19) & 0xf; 7725 // MOV{<c>}{<q>} <Rd>, <Rm> ; T1 7726 mov(CurrentCond(), Narrow, Register(rd), Register(rm)); 7727 break; 7728 } 7729 case 0x07000000: { 7730 // 0x47000000 7731 switch (instr & 0x00800000) { 7732 case 0x00000000: { 7733 // 0x47000000 7734 unsigned rm = (instr >> 19) & 0xf; 7735 // BX{<c>}{<q>} <Rm> ; T1 7736 bx(CurrentCond(), Register(rm)); 7737 if (((instr & 0xff870000) != 0x47000000)) { 7738 UnpredictableT32(instr); 7739 } 7740 break; 7741 } 7742 case 0x00800000: { 7743 // 0x47800000 7744 unsigned rm = (instr >> 19) & 0xf; 7745 // BLX{<c>}{<q>} <Rm> ; T1 7746 blx(CurrentCond(), Register(rm)); 7747 if (((instr & 0xff870000) != 0x47800000)) { 7748 UnpredictableT32(instr); 7749 } 7750 break; 7751 } 7752 } 7753 break; 7754 } 7755 } 7756 break; 7757 } 7758 case 0x08000000: { 7759 // 0x48000000 7760 unsigned rt = (instr >> 24) & 0x7; 7761 int32_t imm = ((instr >> 16) & 0xff) << 2; 7762 Location location(imm, kT32PcDelta); 7763 // LDR{<c>}{<q>} <Rt>, <label> ; T1 7764 ldr(CurrentCond(), Narrow, Register(rt), &location); 7765 break; 7766 } 7767 case 0x10000000: { 7768 // 0x50000000 7769 switch (instr & 0x06000000) { 7770 case 0x00000000: { 7771 // 0x50000000 7772 unsigned rt = (instr >> 16) & 0x7; 7773 unsigned rn = (instr >> 19) & 0x7; 7774 Sign sign(plus); 7775 unsigned rm = (instr >> 22) & 0x7; 7776 AddrMode addrmode = Offset; 7777 // STR{<c>}{<q>} <Rt>, [<Rn>, #{+}<Rm>] ; T1 7778 str(CurrentCond(), 7779 Narrow, 7780 Register(rt), 7781 MemOperand(Register(rn), sign, Register(rm), addrmode)); 7782 break; 7783 } 7784 case 0x02000000: { 7785 // 0x52000000 7786 unsigned rt = (instr >> 16) & 0x7; 7787 unsigned rn = (instr >> 19) & 0x7; 7788 Sign sign(plus); 7789 unsigned rm = (instr >> 22) & 0x7; 7790 AddrMode addrmode = Offset; 7791 // STRH{<c>}{<q>} <Rt>, [<Rn>, #{+}<Rm>] ; T1 7792 strh(CurrentCond(), 7793 Narrow, 7794 Register(rt), 7795 MemOperand(Register(rn), sign, Register(rm), addrmode)); 7796 break; 7797 } 7798 case 0x04000000: { 7799 // 0x54000000 7800 unsigned rt = (instr >> 16) & 0x7; 7801 unsigned rn = (instr >> 19) & 0x7; 7802 Sign sign(plus); 7803 unsigned rm = (instr >> 22) & 0x7; 7804 AddrMode addrmode = Offset; 7805 // STRB{<c>}{<q>} <Rt>, [<Rn>, #{+}<Rm>] ; T1 7806 strb(CurrentCond(), 7807 Narrow, 7808 Register(rt), 7809 MemOperand(Register(rn), sign, Register(rm), addrmode)); 7810 break; 7811 } 7812 case 0x06000000: { 7813 // 0x56000000 7814 unsigned rt = (instr >> 16) & 0x7; 7815 unsigned rn = (instr >> 19) & 0x7; 7816 Sign sign(plus); 7817 unsigned rm = (instr >> 22) & 0x7; 7818 AddrMode addrmode = Offset; 7819 // LDRSB{<c>}{<q>} <Rt>, [<Rn>, #{+}<Rm>] ; T1 7820 ldrsb(CurrentCond(), 7821 Narrow, 7822 Register(rt), 7823 MemOperand(Register(rn), sign, Register(rm), addrmode)); 7824 break; 7825 } 7826 } 7827 break; 7828 } 7829 case 0x18000000: { 7830 // 0x58000000 7831 switch (instr & 0x06000000) { 7832 case 0x00000000: { 7833 // 0x58000000 7834 unsigned rt = (instr >> 16) & 0x7; 7835 unsigned rn = (instr >> 19) & 0x7; 7836 Sign sign(plus); 7837 unsigned rm = (instr >> 22) & 0x7; 7838 AddrMode addrmode = Offset; 7839 // LDR{<c>}{<q>} <Rt>, [<Rn>, #{+}<Rm>] ; T1 7840 ldr(CurrentCond(), 7841 Narrow, 7842 Register(rt), 7843 MemOperand(Register(rn), sign, Register(rm), addrmode)); 7844 break; 7845 } 7846 case 0x02000000: { 7847 // 0x5a000000 7848 unsigned rt = (instr >> 16) & 0x7; 7849 unsigned rn = (instr >> 19) & 0x7; 7850 Sign sign(plus); 7851 unsigned rm = (instr >> 22) & 0x7; 7852 AddrMode addrmode = Offset; 7853 // LDRH{<c>}{<q>} <Rt>, [<Rn>, #{+}<Rm>] ; T1 7854 ldrh(CurrentCond(), 7855 Narrow, 7856 Register(rt), 7857 MemOperand(Register(rn), sign, Register(rm), addrmode)); 7858 break; 7859 } 7860 case 0x04000000: { 7861 // 0x5c000000 7862 unsigned rt = (instr >> 16) & 0x7; 7863 unsigned rn = (instr >> 19) & 0x7; 7864 Sign sign(plus); 7865 unsigned rm = (instr >> 22) & 0x7; 7866 AddrMode addrmode = Offset; 7867 // LDRB{<c>}{<q>} <Rt>, [<Rn>, #{+}<Rm>] ; T1 7868 ldrb(CurrentCond(), 7869 Narrow, 7870 Register(rt), 7871 MemOperand(Register(rn), sign, Register(rm), addrmode)); 7872 break; 7873 } 7874 case 0x06000000: { 7875 // 0x5e000000 7876 unsigned rt = (instr >> 16) & 0x7; 7877 unsigned rn = (instr >> 19) & 0x7; 7878 Sign sign(plus); 7879 unsigned rm = (instr >> 22) & 0x7; 7880 AddrMode addrmode = Offset; 7881 // LDRSH{<c>}{<q>} <Rt>, [<Rn>, #{+}<Rm>] ; T1 7882 ldrsh(CurrentCond(), 7883 Narrow, 7884 Register(rt), 7885 MemOperand(Register(rn), sign, Register(rm), addrmode)); 7886 break; 7887 } 7888 } 7889 break; 7890 } 7891 } 7892 break; 7893 } 7894 case 0x60000000: { 7895 // 0x60000000 7896 switch (instr & 0x18000000) { 7897 case 0x00000000: { 7898 // 0x60000000 7899 unsigned rt = (instr >> 16) & 0x7; 7900 unsigned rn = (instr >> 19) & 0x7; 7901 int32_t offset = ((instr >> 22) & 0x1f) << 2; 7902 // STR{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm>}] ; T1 7903 str(CurrentCond(), 7904 Narrow, 7905 Register(rt), 7906 MemOperand(Register(rn), plus, offset, Offset)); 7907 break; 7908 } 7909 case 0x08000000: { 7910 // 0x68000000 7911 unsigned rt = (instr >> 16) & 0x7; 7912 unsigned rn = (instr >> 19) & 0x7; 7913 int32_t offset = ((instr >> 22) & 0x1f) << 2; 7914 // LDR{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm>}] ; T1 7915 ldr(CurrentCond(), 7916 Narrow, 7917 Register(rt), 7918 MemOperand(Register(rn), plus, offset, Offset)); 7919 break; 7920 } 7921 case 0x10000000: { 7922 // 0x70000000 7923 unsigned rt = (instr >> 16) & 0x7; 7924 unsigned rn = (instr >> 19) & 0x7; 7925 int32_t offset = (instr >> 22) & 0x1f; 7926 // STRB{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm>}] ; T1 7927 strb(CurrentCond(), 7928 Narrow, 7929 Register(rt), 7930 MemOperand(Register(rn), plus, offset, Offset)); 7931 break; 7932 } 7933 case 0x18000000: { 7934 // 0x78000000 7935 unsigned rt = (instr >> 16) & 0x7; 7936 unsigned rn = (instr >> 19) & 0x7; 7937 int32_t offset = (instr >> 22) & 0x1f; 7938 // LDRB{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm>}] ; T1 7939 ldrb(CurrentCond(), 7940 Narrow, 7941 Register(rt), 7942 MemOperand(Register(rn), plus, offset, Offset)); 7943 break; 7944 } 7945 } 7946 break; 7947 } 7948 case 0x80000000: { 7949 // 0x80000000 7950 switch (instr & 0x18000000) { 7951 case 0x00000000: { 7952 // 0x80000000 7953 unsigned rt = (instr >> 16) & 0x7; 7954 unsigned rn = (instr >> 19) & 0x7; 7955 int32_t offset = ((instr >> 22) & 0x1f) << 1; 7956 // STRH{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm>}] ; T1 7957 strh(CurrentCond(), 7958 Narrow, 7959 Register(rt), 7960 MemOperand(Register(rn), plus, offset, Offset)); 7961 break; 7962 } 7963 case 0x08000000: { 7964 // 0x88000000 7965 unsigned rt = (instr >> 16) & 0x7; 7966 unsigned rn = (instr >> 19) & 0x7; 7967 int32_t offset = ((instr >> 22) & 0x1f) << 1; 7968 // LDRH{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm>}] ; T1 7969 ldrh(CurrentCond(), 7970 Narrow, 7971 Register(rt), 7972 MemOperand(Register(rn), plus, offset, Offset)); 7973 break; 7974 } 7975 case 0x10000000: { 7976 // 0x90000000 7977 unsigned rt = (instr >> 24) & 0x7; 7978 int32_t offset = ((instr >> 16) & 0xff) << 2; 7979 // STR{<c>}{<q>} <Rt>, [SP{, #{+}<imm>}] ; T2 7980 str(CurrentCond(), 7981 Narrow, 7982 Register(rt), 7983 MemOperand(sp, plus, offset, Offset)); 7984 break; 7985 } 7986 case 0x18000000: { 7987 // 0x98000000 7988 unsigned rt = (instr >> 24) & 0x7; 7989 int32_t offset = ((instr >> 16) & 0xff) << 2; 7990 // LDR{<c>}{<q>} <Rt>, [SP{, #{+}<imm>}] ; T2 7991 ldr(CurrentCond(), 7992 Narrow, 7993 Register(rt), 7994 MemOperand(sp, plus, offset, Offset)); 7995 break; 7996 } 7997 } 7998 break; 7999 } 8000 case 0xa0000000: { 8001 // 0xa0000000 8002 switch (instr & 0x18000000) { 8003 case 0x00000000: { 8004 // 0xa0000000 8005 unsigned rd = (instr >> 24) & 0x7; 8006 int32_t imm = ((instr >> 16) & 0xff) << 2; 8007 Location location(imm, kT32PcDelta); 8008 // ADR{<c>}{<q>} <Rd>, <label> ; T1 8009 adr(CurrentCond(), Narrow, Register(rd), &location); 8010 break; 8011 } 8012 case 0x08000000: { 8013 // 0xa8000000 8014 unsigned rd = (instr >> 24) & 0x7; 8015 uint32_t imm = ((instr >> 16) & 0xff) << 2; 8016 // ADD{<c>}{<q>} <Rd>, SP, #<imm8> ; T1 8017 add(CurrentCond(), Narrow, Register(rd), sp, imm); 8018 break; 8019 } 8020 case 0x10000000: { 8021 // 0xb0000000 8022 switch (instr & 0x04000000) { 8023 case 0x00000000: { 8024 // 0xb0000000 8025 switch (instr & 0x01000000) { 8026 case 0x00000000: { 8027 // 0xb0000000 8028 switch (instr & 0x02800000) { 8029 case 0x00000000: { 8030 // 0xb0000000 8031 uint32_t imm = ((instr >> 16) & 0x7f) << 2; 8032 // ADD{<c>}{<q>} {SP}, SP, #<imm7> ; T2 8033 add(CurrentCond(), Narrow, sp, sp, imm); 8034 break; 8035 } 8036 case 0x00800000: { 8037 // 0xb0800000 8038 uint32_t imm = ((instr >> 16) & 0x7f) << 2; 8039 // SUB{<c>}{<q>} {SP}, SP, #<imm7> ; T1 8040 sub(CurrentCond(), Narrow, sp, sp, imm); 8041 break; 8042 } 8043 case 0x02000000: { 8044 // 0xb2000000 8045 switch (instr & 0x00400000) { 8046 case 0x00000000: { 8047 // 0xb2000000 8048 unsigned rd = (instr >> 16) & 0x7; 8049 unsigned rm = (instr >> 19) & 0x7; 8050 // SXTH{<c>}{<q>} {<Rd>}, <Rm> ; T1 8051 sxth(CurrentCond(), 8052 Narrow, 8053 Register(rd), 8054 Register(rm)); 8055 break; 8056 } 8057 case 0x00400000: { 8058 // 0xb2400000 8059 unsigned rd = (instr >> 16) & 0x7; 8060 unsigned rm = (instr >> 19) & 0x7; 8061 // SXTB{<c>}{<q>} {<Rd>}, <Rm> ; T1 8062 sxtb(CurrentCond(), 8063 Narrow, 8064 Register(rd), 8065 Register(rm)); 8066 break; 8067 } 8068 } 8069 break; 8070 } 8071 case 0x02800000: { 8072 // 0xb2800000 8073 switch (instr & 0x00400000) { 8074 case 0x00000000: { 8075 // 0xb2800000 8076 unsigned rd = (instr >> 16) & 0x7; 8077 unsigned rm = (instr >> 19) & 0x7; 8078 // UXTH{<c>}{<q>} {<Rd>}, <Rm> ; T1 8079 uxth(CurrentCond(), 8080 Narrow, 8081 Register(rd), 8082 Register(rm)); 8083 break; 8084 } 8085 case 0x00400000: { 8086 // 0xb2c00000 8087 unsigned rd = (instr >> 16) & 0x7; 8088 unsigned rm = (instr >> 19) & 0x7; 8089 // UXTB{<c>}{<q>} {<Rd>}, <Rm> ; T1 8090 uxtb(CurrentCond(), 8091 Narrow, 8092 Register(rd), 8093 Register(rm)); 8094 break; 8095 } 8096 } 8097 break; 8098 } 8099 } 8100 break; 8101 } 8102 case 0x01000000: { 8103 // 0xb1000000 8104 unsigned rn = (instr >> 16) & 0x7; 8105 int32_t imm = 8106 (((instr >> 19) & 0x1f) | ((instr >> 20) & 0x20)) << 1; 8107 Location location(imm, kT32PcDelta); 8108 // CBZ{<q>} <Rn>, <label> ; T1 8109 cbz(Register(rn), &location); 8110 break; 8111 } 8112 } 8113 break; 8114 } 8115 case 0x04000000: { 8116 // 0xb4000000 8117 switch (instr & 0x02000000) { 8118 case 0x00000000: { 8119 // 0xb4000000 8120 RegisterList registers((((instr >> 24) & 0x1) << kLRRegNum) | 8121 ((instr >> 16) & 0xff)); 8122 // PUSH{<c>}{<q>} <registers> ; T1 8123 push(CurrentCond(), Narrow, registers); 8124 break; 8125 } 8126 case 0x02000000: { 8127 // 0xb6000000 8128 switch (instr & 0x01e00000) { 8129 case 0x00400000: { 8130 // 0xb6400000 8131 UnimplementedT32_16("SETEND", instr); 8132 break; 8133 } 8134 case 0x00600000: { 8135 // 0xb6600000 8136 switch (instr & 0x00100000) { 8137 case 0x00000000: { 8138 // 0xb6600000 8139 UnimplementedT32_16("CPSIE", instr); 8140 break; 8141 } 8142 case 0x00100000: { 8143 // 0xb6700000 8144 UnimplementedT32_16("CPSID", instr); 8145 break; 8146 } 8147 } 8148 break; 8149 } 8150 default: 8151 UnallocatedT32(instr); 8152 break; 8153 } 8154 break; 8155 } 8156 } 8157 break; 8158 } 8159 } 8160 break; 8161 } 8162 case 0x18000000: { 8163 // 0xb8000000 8164 switch (instr & 0x04000000) { 8165 case 0x00000000: { 8166 // 0xb8000000 8167 switch (instr & 0x01000000) { 8168 case 0x00000000: { 8169 // 0xb8000000 8170 switch (instr & 0x02c00000) { 8171 case 0x02000000: { 8172 // 0xba000000 8173 unsigned rd = (instr >> 16) & 0x7; 8174 unsigned rm = (instr >> 19) & 0x7; 8175 // REV{<c>}{<q>} <Rd>, <Rm> ; T1 8176 rev(CurrentCond(), Narrow, Register(rd), Register(rm)); 8177 break; 8178 } 8179 case 0x02400000: { 8180 // 0xba400000 8181 unsigned rd = (instr >> 16) & 0x7; 8182 unsigned rm = (instr >> 19) & 0x7; 8183 // REV16{<c>}{<q>} <Rd>, <Rm> ; T1 8184 rev16(CurrentCond(), Narrow, Register(rd), Register(rm)); 8185 break; 8186 } 8187 case 0x02800000: { 8188 // 0xba800000 8189 uint32_t imm = (instr >> 16) & 0x3f; 8190 // HLT{<q>} {#}<imm> ; T1 8191 hlt(Condition::None(), imm); 8192 break; 8193 } 8194 case 0x02c00000: { 8195 // 0xbac00000 8196 unsigned rd = (instr >> 16) & 0x7; 8197 unsigned rm = (instr >> 19) & 0x7; 8198 // REVSH{<c>}{<q>} <Rd>, <Rm> ; T1 8199 revsh(CurrentCond(), Narrow, Register(rd), Register(rm)); 8200 break; 8201 } 8202 default: 8203 UnallocatedT32(instr); 8204 break; 8205 } 8206 break; 8207 } 8208 case 0x01000000: { 8209 // 0xb9000000 8210 unsigned rn = (instr >> 16) & 0x7; 8211 int32_t imm = 8212 (((instr >> 19) & 0x1f) | ((instr >> 20) & 0x20)) << 1; 8213 Location location(imm, kT32PcDelta); 8214 // CBNZ{<q>} <Rn>, <label> ; T1 8215 cbnz(Register(rn), &location); 8216 break; 8217 } 8218 } 8219 break; 8220 } 8221 case 0x04000000: { 8222 // 0xbc000000 8223 switch (instr & 0x02000000) { 8224 case 0x00000000: { 8225 // 0xbc000000 8226 RegisterList registers((((instr >> 24) & 0x1) << kPCRegNum) | 8227 ((instr >> 16) & 0xff)); 8228 // POP{<c>}{<q>} <registers> ; T1 8229 pop(CurrentCond(), Narrow, registers); 8230 break; 8231 } 8232 case 0x02000000: { 8233 // 0xbe000000 8234 switch (instr & 0x01000000) { 8235 case 0x00000000: { 8236 // 0xbe000000 8237 uint32_t imm = (instr >> 16) & 0xff; 8238 // BKPT{<q>} {#}<imm> ; T1 8239 bkpt(Condition::None(), imm); 8240 break; 8241 } 8242 case 0x01000000: { 8243 // 0xbf000000 8244 switch (instr & 0x000f0000) { 8245 case 0x00000000: { 8246 // 0xbf000000 8247 switch (instr & 0x00f00000) { 8248 case 0x00000000: { 8249 // 0xbf000000 8250 // NOP{<c>}{<q>} ; T1 8251 nop(CurrentCond(), Narrow); 8252 break; 8253 } 8254 case 0x00100000: { 8255 // 0xbf100000 8256 // YIELD{<c>}{<q>} ; T1 8257 yield(CurrentCond(), Narrow); 8258 break; 8259 } 8260 case 0x00200000: { 8261 // 0xbf200000 8262 UnimplementedT32_16("WFE", instr); 8263 break; 8264 } 8265 case 0x00300000: { 8266 // 0xbf300000 8267 UnimplementedT32_16("WFI", instr); 8268 break; 8269 } 8270 case 0x00400000: { 8271 // 0xbf400000 8272 UnimplementedT32_16("SEV", instr); 8273 break; 8274 } 8275 case 0x00500000: { 8276 // 0xbf500000 8277 UnimplementedT32_16("SEVL", instr); 8278 break; 8279 } 8280 default: 8281 UnallocatedT32(instr); 8282 break; 8283 } 8284 break; 8285 } 8286 default: { 8287 if (((instr & 0xf0000) == 0x0)) { 8288 UnallocatedT32(instr); 8289 return; 8290 } 8291 unsigned first_cond = (instr >> 20) & 0xf; 8292 unsigned mask = (instr >> 16) & 0xf; 8293 bool was_in_it_block = InITBlock(); 8294 SetIT(Condition(first_cond), mask); 8295 it(Condition(first_cond), mask); 8296 if (was_in_it_block || (first_cond == 15) || 8297 ((first_cond == al) && 8298 (BitCount(Uint32(mask)) != 1))) { 8299 UnpredictableT32(instr); 8300 } 8301 break; 8302 } 8303 } 8304 break; 8305 } 8306 } 8307 break; 8308 } 8309 } 8310 break; 8311 } 8312 } 8313 break; 8314 } 8315 } 8316 break; 8317 } 8318 case 0xc0000000: { 8319 // 0xc0000000 8320 switch (instr & 0x10000000) { 8321 case 0x00000000: { 8322 // 0xc0000000 8323 switch (instr & 0x08000000) { 8324 case 0x00000000: { 8325 // 0xc0000000 8326 unsigned rn = (instr >> 24) & 0x7; 8327 RegisterList registers(((instr >> 16) & 0xff)); 8328 // STM{<c>}{<q>} <Rn>!, <registers> ; T1 8329 stm(CurrentCond(), 8330 Narrow, 8331 Register(rn), 8332 WriteBack(WRITE_BACK), 8333 registers); 8334 break; 8335 } 8336 case 0x08000000: { 8337 // 0xc8000000 8338 unsigned rn = (instr >> 24) & 0x7; 8339 RegisterList registers(((instr >> 16) & 0xff)); 8340 // LDM{<c>}{<q>} <Rn>{!}, <registers> ; T1 8341 ldm(CurrentCond(), 8342 Narrow, 8343 Register(rn), 8344 WriteBack(!registers.Includes(Register(rn))), 8345 registers); 8346 break; 8347 } 8348 } 8349 break; 8350 } 8351 case 0x10000000: { 8352 // 0xd0000000 8353 switch (instr & 0x0e000000) { 8354 case 0x0e000000: { 8355 // 0xde000000 8356 switch (instr & 0x01000000) { 8357 case 0x00000000: { 8358 // 0xde000000 8359 uint32_t imm = (instr >> 16) & 0xff; 8360 // UDF{<c>}{<q>} {#}<imm> ; T1 8361 udf(CurrentCond(), Narrow, imm); 8362 break; 8363 } 8364 case 0x01000000: { 8365 // 0xdf000000 8366 uint32_t imm = (instr >> 16) & 0xff; 8367 // SVC{<c>}{<q>} {#}<imm> ; T1 8368 svc(CurrentCond(), imm); 8369 break; 8370 } 8371 } 8372 break; 8373 } 8374 default: { 8375 if (((instr & 0xe000000) == 0xe000000)) { 8376 UnallocatedT32(instr); 8377 return; 8378 } 8379 Condition condition((instr >> 24) & 0xf); 8380 int32_t imm = SignExtend<int32_t>(((instr >> 16) & 0xff) << 1, 9); 8381 Location location(imm, kT32PcDelta); 8382 // B<c>{<q>} <label> ; T1 8383 b(condition, Narrow, &location); 8384 if (InITBlock()) { 8385 UnpredictableT32(instr); 8386 } 8387 break; 8388 } 8389 } 8390 break; 8391 } 8392 } 8393 break; 8394 } 8395 case 0xe0000000: { 8396 // 0xe0000000 8397 switch (instr & 0x08000000) { 8398 case 0x00000000: { 8399 // 0xe0000000 8400 switch (instr & 0x10000000) { 8401 case 0x00000000: { 8402 // 0xe0000000 8403 int32_t imm = 8404 SignExtend<int32_t>(((instr >> 16) & 0x7ff) << 1, 12); 8405 Location location(imm, kT32PcDelta); 8406 // B{<c>}{<q>} <label> ; T2 8407 b(CurrentCond(), Narrow, &location); 8408 if (!OutsideITBlockOrLast()) { 8409 UnpredictableT32(instr); 8410 } 8411 break; 8412 } 8413 case 0x10000000: { 8414 // 0xf0000000 8415 switch (instr & 0x00008000) { 8416 case 0x00000000: { 8417 // 0xf0000000 8418 switch (instr & 0x03f00000) { 8419 case 0x00000000: { 8420 // 0xf0000000 8421 unsigned rd = (instr >> 8) & 0xf; 8422 unsigned rn = (instr >> 16) & 0xf; 8423 uint32_t imm = ImmediateT32::Decode( 8424 (instr & 0xff) | ((instr >> 4) & 0x700) | 8425 ((instr >> 15) & 0x800)); 8426 // AND{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1 8427 and_(CurrentCond(), 8428 Best, 8429 Register(rd), 8430 Register(rn), 8431 imm); 8432 break; 8433 } 8434 case 0x00100000: { 8435 // 0xf0100000 8436 switch (instr & 0x00000f00) { 8437 case 0x00000f00: { 8438 // 0xf0100f00 8439 unsigned rn = (instr >> 16) & 0xf; 8440 uint32_t imm = ImmediateT32::Decode( 8441 (instr & 0xff) | ((instr >> 4) & 0x700) | 8442 ((instr >> 15) & 0x800)); 8443 // TST{<c>}{<q>} <Rn>, #<const> ; T1 8444 tst(CurrentCond(), Best, Register(rn), imm); 8445 break; 8446 } 8447 default: { 8448 if (((instr & 0xf00) == 0xf00)) { 8449 UnallocatedT32(instr); 8450 return; 8451 } 8452 unsigned rd = (instr >> 8) & 0xf; 8453 unsigned rn = (instr >> 16) & 0xf; 8454 uint32_t imm = ImmediateT32::Decode( 8455 (instr & 0xff) | ((instr >> 4) & 0x700) | 8456 ((instr >> 15) & 0x800)); 8457 // ANDS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1 8458 ands(CurrentCond(), 8459 Best, 8460 Register(rd), 8461 Register(rn), 8462 imm); 8463 break; 8464 } 8465 } 8466 break; 8467 } 8468 case 0x00200000: { 8469 // 0xf0200000 8470 unsigned rd = (instr >> 8) & 0xf; 8471 unsigned rn = (instr >> 16) & 0xf; 8472 uint32_t imm = ImmediateT32::Decode( 8473 (instr & 0xff) | ((instr >> 4) & 0x700) | 8474 ((instr >> 15) & 0x800)); 8475 // BIC{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1 8476 bic(CurrentCond(), Best, Register(rd), Register(rn), imm); 8477 break; 8478 } 8479 case 0x00300000: { 8480 // 0xf0300000 8481 unsigned rd = (instr >> 8) & 0xf; 8482 unsigned rn = (instr >> 16) & 0xf; 8483 uint32_t imm = ImmediateT32::Decode( 8484 (instr & 0xff) | ((instr >> 4) & 0x700) | 8485 ((instr >> 15) & 0x800)); 8486 // BICS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1 8487 bics(CurrentCond(), 8488 Best, 8489 Register(rd), 8490 Register(rn), 8491 imm); 8492 break; 8493 } 8494 case 0x00400000: { 8495 // 0xf0400000 8496 switch (instr & 0x000f0000) { 8497 case 0x000f0000: { 8498 // 0xf04f0000 8499 unsigned rd = (instr >> 8) & 0xf; 8500 uint32_t imm = ImmediateT32::Decode( 8501 (instr & 0xff) | ((instr >> 4) & 0x700) | 8502 ((instr >> 15) & 0x800)); 8503 if (InITBlock() && 8504 (instr & 0x00100000) == 0x00000000 && 8505 ((rd < kNumberOfT32LowRegisters) && 8506 (imm <= 255))) { 8507 // MOV<c>.W <Rd>, #<const> ; T2 8508 mov(CurrentCond(), Wide, Register(rd), imm); 8509 } else if ((instr & 0x00100000) == 0x00000000) { 8510 // MOV{<c>}{<q>} <Rd>, #<const> ; T2 8511 mov(CurrentCond(), Best, Register(rd), imm); 8512 } else { 8513 UnallocatedT32(instr); 8514 } 8515 break; 8516 } 8517 default: { 8518 if (((instr & 0xf0000) == 0xf0000)) { 8519 UnallocatedT32(instr); 8520 return; 8521 } 8522 unsigned rd = (instr >> 8) & 0xf; 8523 unsigned rn = (instr >> 16) & 0xf; 8524 uint32_t imm = ImmediateT32::Decode( 8525 (instr & 0xff) | ((instr >> 4) & 0x700) | 8526 ((instr >> 15) & 0x800)); 8527 // ORR{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1 8528 orr(CurrentCond(), 8529 Best, 8530 Register(rd), 8531 Register(rn), 8532 imm); 8533 break; 8534 } 8535 } 8536 break; 8537 } 8538 case 0x00500000: { 8539 // 0xf0500000 8540 switch (instr & 0x000f0000) { 8541 case 0x000f0000: { 8542 // 0xf05f0000 8543 unsigned rd = (instr >> 8) & 0xf; 8544 uint32_t imm = ImmediateT32::Decode( 8545 (instr & 0xff) | ((instr >> 4) & 0x700) | 8546 ((instr >> 15) & 0x800)); 8547 if (OutsideITBlock() && 8548 (instr & 0x00100000) == 0x00100000 && 8549 ((rd < kNumberOfT32LowRegisters) && 8550 (imm <= 255))) { 8551 // MOVS.W <Rd>, #<const> ; T2 8552 movs(Condition::None(), Wide, Register(rd), imm); 8553 } else if ((instr & 0x00100000) == 0x00100000) { 8554 // MOVS{<c>}{<q>} <Rd>, #<const> ; T2 8555 movs(CurrentCond(), Best, Register(rd), imm); 8556 } else { 8557 UnallocatedT32(instr); 8558 } 8559 break; 8560 } 8561 default: { 8562 if (((instr & 0xf0000) == 0xf0000)) { 8563 UnallocatedT32(instr); 8564 return; 8565 } 8566 unsigned rd = (instr >> 8) & 0xf; 8567 unsigned rn = (instr >> 16) & 0xf; 8568 uint32_t imm = ImmediateT32::Decode( 8569 (instr & 0xff) | ((instr >> 4) & 0x700) | 8570 ((instr >> 15) & 0x800)); 8571 // ORRS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1 8572 orrs(CurrentCond(), 8573 Best, 8574 Register(rd), 8575 Register(rn), 8576 imm); 8577 break; 8578 } 8579 } 8580 break; 8581 } 8582 case 0x00600000: { 8583 // 0xf0600000 8584 switch (instr & 0x000f0000) { 8585 case 0x000f0000: { 8586 // 0xf06f0000 8587 unsigned rd = (instr >> 8) & 0xf; 8588 uint32_t imm = ImmediateT32::Decode( 8589 (instr & 0xff) | ((instr >> 4) & 0x700) | 8590 ((instr >> 15) & 0x800)); 8591 // MVN{<c>}{<q>} <Rd>, #<const> ; T1 8592 mvn(CurrentCond(), Best, Register(rd), imm); 8593 break; 8594 } 8595 default: { 8596 if (((instr & 0xf0000) == 0xf0000)) { 8597 UnallocatedT32(instr); 8598 return; 8599 } 8600 unsigned rd = (instr >> 8) & 0xf; 8601 unsigned rn = (instr >> 16) & 0xf; 8602 uint32_t imm = ImmediateT32::Decode( 8603 (instr & 0xff) | ((instr >> 4) & 0x700) | 8604 ((instr >> 15) & 0x800)); 8605 // ORN{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1 8606 orn(CurrentCond(), Register(rd), Register(rn), imm); 8607 break; 8608 } 8609 } 8610 break; 8611 } 8612 case 0x00700000: { 8613 // 0xf0700000 8614 switch (instr & 0x000f0000) { 8615 case 0x000f0000: { 8616 // 0xf07f0000 8617 unsigned rd = (instr >> 8) & 0xf; 8618 uint32_t imm = ImmediateT32::Decode( 8619 (instr & 0xff) | ((instr >> 4) & 0x700) | 8620 ((instr >> 15) & 0x800)); 8621 // MVNS{<c>}{<q>} <Rd>, #<const> ; T1 8622 mvns(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 // ORNS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1 8636 orns(CurrentCond(), Register(rd), Register(rn), imm); 8637 break; 8638 } 8639 } 8640 break; 8641 } 8642 case 0x00800000: { 8643 // 0xf0800000 8644 unsigned rd = (instr >> 8) & 0xf; 8645 unsigned rn = (instr >> 16) & 0xf; 8646 uint32_t imm = ImmediateT32::Decode( 8647 (instr & 0xff) | ((instr >> 4) & 0x700) | 8648 ((instr >> 15) & 0x800)); 8649 // EOR{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1 8650 eor(CurrentCond(), Best, Register(rd), Register(rn), imm); 8651 break; 8652 } 8653 case 0x00900000: { 8654 // 0xf0900000 8655 switch (instr & 0x00000f00) { 8656 case 0x00000f00: { 8657 // 0xf0900f00 8658 unsigned rn = (instr >> 16) & 0xf; 8659 uint32_t imm = ImmediateT32::Decode( 8660 (instr & 0xff) | ((instr >> 4) & 0x700) | 8661 ((instr >> 15) & 0x800)); 8662 // TEQ{<c>}{<q>} <Rn>, #<const> ; T1 8663 teq(CurrentCond(), Register(rn), imm); 8664 break; 8665 } 8666 default: { 8667 if (((instr & 0xf00) == 0xf00)) { 8668 UnallocatedT32(instr); 8669 return; 8670 } 8671 unsigned rd = (instr >> 8) & 0xf; 8672 unsigned rn = (instr >> 16) & 0xf; 8673 uint32_t imm = ImmediateT32::Decode( 8674 (instr & 0xff) | ((instr >> 4) & 0x700) | 8675 ((instr >> 15) & 0x800)); 8676 // EORS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1 8677 eors(CurrentCond(), 8678 Best, 8679 Register(rd), 8680 Register(rn), 8681 imm); 8682 break; 8683 } 8684 } 8685 break; 8686 } 8687 case 0x01000000: { 8688 // 0xf1000000 8689 switch (instr & 0x000f0000) { 8690 case 0x000d0000: { 8691 // 0xf10d0000 8692 unsigned rd = (instr >> 8) & 0xf; 8693 uint32_t imm = ImmediateT32::Decode( 8694 (instr & 0xff) | ((instr >> 4) & 0x700) | 8695 ((instr >> 15) & 0x800)); 8696 if ((instr & 0x00100000) == 0x00000000 && 8697 (((rd < kNumberOfT32LowRegisters) && 8698 ((imm <= 1020) && ((imm & 3) == 0))) || 8699 ((rd == sp.GetCode()) && 8700 ((imm <= 508) && ((imm & 3) == 0))))) { 8701 // ADD{<c>}.W {<Rd>}, SP, #<const> ; T3 8702 add(CurrentCond(), Wide, Register(rd), sp, imm); 8703 } else if ((instr & 0x00100000) == 0x00000000) { 8704 // ADD{<c>}{<q>} {<Rd>}, SP, #<const> ; T3 8705 add(CurrentCond(), Best, Register(rd), sp, imm); 8706 } else { 8707 UnallocatedT32(instr); 8708 } 8709 break; 8710 } 8711 default: { 8712 if (((instr & 0xf0000) == 0xd0000)) { 8713 UnallocatedT32(instr); 8714 return; 8715 } 8716 unsigned rd = (instr >> 8) & 0xf; 8717 unsigned rn = (instr >> 16) & 0xf; 8718 uint32_t imm = ImmediateT32::Decode( 8719 (instr & 0xff) | ((instr >> 4) & 0x700) | 8720 ((instr >> 15) & 0x800)); 8721 if (InITBlock() && 8722 (instr & 0x00100000) == 0x00000000 && 8723 (((rd < kNumberOfT32LowRegisters) && 8724 (rn < kNumberOfT32LowRegisters) && 8725 (imm <= 7)) || 8726 ((rd == rn) && (rd < kNumberOfT32LowRegisters) && 8727 (imm <= 255)))) { 8728 // ADD<c>.W {<Rd>}, <Rn>, #<const> ; T3 8729 add(CurrentCond(), 8730 Wide, 8731 Register(rd), 8732 Register(rn), 8733 imm); 8734 } else if ((instr & 0x00100000) == 0x00000000) { 8735 // ADD{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T3 8736 add(CurrentCond(), 8737 Best, 8738 Register(rd), 8739 Register(rn), 8740 imm); 8741 } else { 8742 UnallocatedT32(instr); 8743 } 8744 break; 8745 } 8746 } 8747 break; 8748 } 8749 case 0x01100000: { 8750 // 0xf1100000 8751 switch (instr & 0x00000f00) { 8752 case 0x00000f00: { 8753 // 0xf1100f00 8754 unsigned rn = (instr >> 16) & 0xf; 8755 uint32_t imm = ImmediateT32::Decode( 8756 (instr & 0xff) | ((instr >> 4) & 0x700) | 8757 ((instr >> 15) & 0x800)); 8758 // CMN{<c>}{<q>} <Rn>, #<const> ; T1 8759 cmn(CurrentCond(), Best, Register(rn), imm); 8760 break; 8761 } 8762 default: { 8763 switch (instr & 0x000f0000) { 8764 case 0x000d0000: { 8765 // 0xf11d0000 8766 if (((instr & 0xf00) == 0xf00)) { 8767 UnallocatedT32(instr); 8768 return; 8769 } 8770 unsigned rd = (instr >> 8) & 0xf; 8771 uint32_t imm = ImmediateT32::Decode( 8772 (instr & 0xff) | ((instr >> 4) & 0x700) | 8773 ((instr >> 15) & 0x800)); 8774 // ADDS{<c>}{<q>} {<Rd>}, SP, #<const> ; T3 8775 adds(CurrentCond(), Best, Register(rd), sp, imm); 8776 break; 8777 } 8778 default: { 8779 if (((instr & 0xf0000) == 0xd0000) || 8780 ((instr & 0xf00) == 0xf00)) { 8781 UnallocatedT32(instr); 8782 return; 8783 } 8784 unsigned rd = (instr >> 8) & 0xf; 8785 unsigned rn = (instr >> 16) & 0xf; 8786 uint32_t imm = ImmediateT32::Decode( 8787 (instr & 0xff) | ((instr >> 4) & 0x700) | 8788 ((instr >> 15) & 0x800)); 8789 if (OutsideITBlock() && 8790 (instr & 0x00100000) == 0x00100000 && 8791 (((rd < kNumberOfT32LowRegisters) && 8792 (rn < kNumberOfT32LowRegisters) && 8793 (imm <= 7)) || 8794 ((rd == rn) && 8795 (rd < kNumberOfT32LowRegisters) && 8796 (imm <= 255)))) { 8797 // ADDS.W {<Rd>}, <Rn>, #<const> ; T3 8798 adds(Condition::None(), 8799 Wide, 8800 Register(rd), 8801 Register(rn), 8802 imm); 8803 } else if ((instr & 0x00100000) == 0x00100000) { 8804 // ADDS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T3 8805 adds(CurrentCond(), 8806 Best, 8807 Register(rd), 8808 Register(rn), 8809 imm); 8810 } else { 8811 UnallocatedT32(instr); 8812 } 8813 break; 8814 } 8815 } 8816 break; 8817 } 8818 } 8819 break; 8820 } 8821 case 0x01400000: { 8822 // 0xf1400000 8823 unsigned rd = (instr >> 8) & 0xf; 8824 unsigned rn = (instr >> 16) & 0xf; 8825 uint32_t imm = ImmediateT32::Decode( 8826 (instr & 0xff) | ((instr >> 4) & 0x700) | 8827 ((instr >> 15) & 0x800)); 8828 // ADC{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1 8829 adc(CurrentCond(), Best, Register(rd), Register(rn), imm); 8830 break; 8831 } 8832 case 0x01500000: { 8833 // 0xf1500000 8834 unsigned rd = (instr >> 8) & 0xf; 8835 unsigned rn = (instr >> 16) & 0xf; 8836 uint32_t imm = ImmediateT32::Decode( 8837 (instr & 0xff) | ((instr >> 4) & 0x700) | 8838 ((instr >> 15) & 0x800)); 8839 // ADCS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1 8840 adcs(CurrentCond(), 8841 Best, 8842 Register(rd), 8843 Register(rn), 8844 imm); 8845 break; 8846 } 8847 case 0x01600000: { 8848 // 0xf1600000 8849 unsigned rd = (instr >> 8) & 0xf; 8850 unsigned rn = (instr >> 16) & 0xf; 8851 uint32_t imm = ImmediateT32::Decode( 8852 (instr & 0xff) | ((instr >> 4) & 0x700) | 8853 ((instr >> 15) & 0x800)); 8854 // SBC{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1 8855 sbc(CurrentCond(), Best, Register(rd), Register(rn), imm); 8856 break; 8857 } 8858 case 0x01700000: { 8859 // 0xf1700000 8860 unsigned rd = (instr >> 8) & 0xf; 8861 unsigned rn = (instr >> 16) & 0xf; 8862 uint32_t imm = ImmediateT32::Decode( 8863 (instr & 0xff) | ((instr >> 4) & 0x700) | 8864 ((instr >> 15) & 0x800)); 8865 // SBCS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T1 8866 sbcs(CurrentCond(), 8867 Best, 8868 Register(rd), 8869 Register(rn), 8870 imm); 8871 break; 8872 } 8873 case 0x01a00000: { 8874 // 0xf1a00000 8875 switch (instr & 0x000f0000) { 8876 case 0x000d0000: { 8877 // 0xf1ad0000 8878 unsigned rd = (instr >> 8) & 0xf; 8879 uint32_t imm = ImmediateT32::Decode( 8880 (instr & 0xff) | ((instr >> 4) & 0x700) | 8881 ((instr >> 15) & 0x800)); 8882 if ((instr & 0x00100000) == 0x00000000 && 8883 ((rd == sp.GetCode()) && 8884 ((imm <= 508) && ((imm & 3) == 0)))) { 8885 // SUB{<c>}.W {<Rd>}, SP, #<const> ; T2 8886 sub(CurrentCond(), Wide, Register(rd), sp, imm); 8887 } else if ((instr & 0x00100000) == 0x00000000) { 8888 // SUB{<c>}{<q>} {<Rd>}, SP, #<const> ; T2 8889 sub(CurrentCond(), Best, Register(rd), sp, imm); 8890 } else { 8891 UnallocatedT32(instr); 8892 } 8893 break; 8894 } 8895 default: { 8896 if (((instr & 0xf0000) == 0xd0000)) { 8897 UnallocatedT32(instr); 8898 return; 8899 } 8900 unsigned rd = (instr >> 8) & 0xf; 8901 unsigned rn = (instr >> 16) & 0xf; 8902 uint32_t imm = ImmediateT32::Decode( 8903 (instr & 0xff) | ((instr >> 4) & 0x700) | 8904 ((instr >> 15) & 0x800)); 8905 if (InITBlock() && 8906 (instr & 0x00100000) == 0x00000000 && 8907 (((rd < kNumberOfT32LowRegisters) && 8908 (rn < kNumberOfT32LowRegisters) && 8909 (imm <= 7)) || 8910 ((rd == rn) && (rd < kNumberOfT32LowRegisters) && 8911 (imm <= 255)))) { 8912 // SUB<c>.W {<Rd>}, <Rn>, #<const> ; T3 8913 sub(CurrentCond(), 8914 Wide, 8915 Register(rd), 8916 Register(rn), 8917 imm); 8918 } else if ((instr & 0x00100000) == 0x00000000) { 8919 // SUB{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T3 8920 sub(CurrentCond(), 8921 Best, 8922 Register(rd), 8923 Register(rn), 8924 imm); 8925 } else { 8926 UnallocatedT32(instr); 8927 } 8928 break; 8929 } 8930 } 8931 break; 8932 } 8933 case 0x01b00000: { 8934 // 0xf1b00000 8935 switch (instr & 0x00000f00) { 8936 case 0x00000f00: { 8937 // 0xf1b00f00 8938 unsigned rn = (instr >> 16) & 0xf; 8939 uint32_t imm = ImmediateT32::Decode( 8940 (instr & 0xff) | ((instr >> 4) & 0x700) | 8941 ((instr >> 15) & 0x800)); 8942 if ((rn < kNumberOfT32LowRegisters) && (imm <= 255)) { 8943 // CMP{<c>}.W <Rn>, #<const> ; T2 8944 cmp(CurrentCond(), Wide, Register(rn), imm); 8945 } else { 8946 // CMP{<c>}{<q>} <Rn>, #<const> ; T2 8947 cmp(CurrentCond(), Best, Register(rn), imm); 8948 } 8949 break; 8950 } 8951 default: { 8952 switch (instr & 0x000f0000) { 8953 case 0x000d0000: { 8954 // 0xf1bd0000 8955 if (((instr & 0xf00) == 0xf00)) { 8956 UnallocatedT32(instr); 8957 return; 8958 } 8959 unsigned rd = (instr >> 8) & 0xf; 8960 uint32_t imm = ImmediateT32::Decode( 8961 (instr & 0xff) | ((instr >> 4) & 0x700) | 8962 ((instr >> 15) & 0x800)); 8963 // SUBS{<c>}{<q>} {<Rd>}, SP, #<const> ; T2 8964 subs(CurrentCond(), Best, Register(rd), sp, imm); 8965 break; 8966 } 8967 default: { 8968 if (((instr & 0xf0000) == 0xd0000) || 8969 ((instr & 0xf00) == 0xf00)) { 8970 UnallocatedT32(instr); 8971 return; 8972 } 8973 unsigned rd = (instr >> 8) & 0xf; 8974 unsigned rn = (instr >> 16) & 0xf; 8975 uint32_t imm = ImmediateT32::Decode( 8976 (instr & 0xff) | ((instr >> 4) & 0x700) | 8977 ((instr >> 15) & 0x800)); 8978 if (OutsideITBlock() && 8979 (instr & 0x00100000) == 0x00100000 && 8980 (((rd < kNumberOfT32LowRegisters) && 8981 (rn < kNumberOfT32LowRegisters) && 8982 (imm <= 7)) || 8983 ((rd == rn) && 8984 (rd < kNumberOfT32LowRegisters) && 8985 (imm <= 255)))) { 8986 // SUBS.W {<Rd>}, <Rn>, #<const> ; T3 8987 subs(Condition::None(), 8988 Wide, 8989 Register(rd), 8990 Register(rn), 8991 imm); 8992 } else if ((instr & 0x00100000) == 0x00100000) { 8993 // SUBS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T3 8994 subs(CurrentCond(), 8995 Best, 8996 Register(rd), 8997 Register(rn), 8998 imm); 8999 } else { 9000 UnallocatedT32(instr); 9001 } 9002 break; 9003 } 9004 } 9005 break; 9006 } 9007 } 9008 break; 9009 } 9010 case 0x01c00000: { 9011 // 0xf1c00000 9012 unsigned rd = (instr >> 8) & 0xf; 9013 unsigned rn = (instr >> 16) & 0xf; 9014 uint32_t imm = ImmediateT32::Decode( 9015 (instr & 0xff) | ((instr >> 4) & 0x700) | 9016 ((instr >> 15) & 0x800)); 9017 if (InITBlock() && (instr & 0x00100000) == 0x00000000 && 9018 (imm == 0) && 9019 ((rd < kNumberOfT32LowRegisters) && 9020 (rn < kNumberOfT32LowRegisters) && (imm == 0))) { 9021 // RSB<c>.W {<Rd>}, <Rn>, #0 ; T2 9022 rsb(CurrentCond(), 9023 Wide, 9024 Register(rd), 9025 Register(rn), 9026 UINT32_C(0)); 9027 } else if ((instr & 0x00100000) == 0x00000000) { 9028 // RSB{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T2 9029 rsb(CurrentCond(), 9030 Best, 9031 Register(rd), 9032 Register(rn), 9033 imm); 9034 } else { 9035 UnallocatedT32(instr); 9036 } 9037 break; 9038 } 9039 case 0x01d00000: { 9040 // 0xf1d00000 9041 unsigned rd = (instr >> 8) & 0xf; 9042 unsigned rn = (instr >> 16) & 0xf; 9043 uint32_t imm = ImmediateT32::Decode( 9044 (instr & 0xff) | ((instr >> 4) & 0x700) | 9045 ((instr >> 15) & 0x800)); 9046 if (OutsideITBlock() && 9047 (instr & 0x00100000) == 0x00100000 && (imm == 0) && 9048 ((rd < kNumberOfT32LowRegisters) && 9049 (rn < kNumberOfT32LowRegisters) && (imm == 0))) { 9050 // RSBS.W {<Rd>}, <Rn>, #0 ; T2 9051 rsbs(Condition::None(), 9052 Wide, 9053 Register(rd), 9054 Register(rn), 9055 UINT32_C(0)); 9056 } else if ((instr & 0x00100000) == 0x00100000) { 9057 // RSBS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; T2 9058 rsbs(CurrentCond(), 9059 Best, 9060 Register(rd), 9061 Register(rn), 9062 imm); 9063 } else { 9064 UnallocatedT32(instr); 9065 } 9066 break; 9067 } 9068 case 0x02000000: { 9069 // 0xf2000000 9070 switch (instr & 0x000d0000) { 9071 case 0x000d0000: { 9072 // 0xf20d0000 9073 switch (instr & 0x00020000) { 9074 case 0x00000000: { 9075 // 0xf20d0000 9076 unsigned rd = (instr >> 8) & 0xf; 9077 uint32_t imm = (instr & 0xff) | 9078 ((instr >> 4) & 0x700) | 9079 ((instr >> 15) & 0x800); 9080 if (((rd >= kNumberOfT32LowRegisters) || 9081 ((imm > 1020) || ((imm & 3) != 0))) && 9082 ((rd != sp.GetCode()) || 9083 ((imm > 508) || ((imm & 3) != 0))) && 9084 (!ImmediateT32::IsImmediateT32(imm))) { 9085 // ADD{<c>}{<q>} {<Rd>}, SP, #<imm12> ; T4 9086 add(CurrentCond(), Best, Register(rd), sp, imm); 9087 } else { 9088 // ADDW{<c>}{<q>} {<Rd>}, SP, #<imm12> ; T4 9089 addw(CurrentCond(), Register(rd), sp, imm); 9090 } 9091 break; 9092 } 9093 case 0x00020000: { 9094 // 0xf20f0000 9095 unsigned rd = (instr >> 8) & 0xf; 9096 int32_t imm = (instr & 0xff) | 9097 ((instr >> 4) & 0x700) | 9098 ((instr >> 15) & 0x800); 9099 Location location(imm, kT32PcDelta); 9100 if ((imm >= 0) && (imm <= 4095) && 9101 ((rd < kNumberOfT32LowRegisters) && 9102 (imm >= 0) && (imm <= 1020) && 9103 ((imm & 3) == 0))) { 9104 // ADR{<c>}.W <Rd>, <label> ; T3 9105 adr(CurrentCond(), 9106 Wide, 9107 Register(rd), 9108 &location); 9109 } else if ((imm >= 0) && (imm <= 4095)) { 9110 // ADR{<c>}{<q>} <Rd>, <label> ; T3 9111 adr(CurrentCond(), 9112 Best, 9113 Register(rd), 9114 &location); 9115 } else { 9116 UnallocatedT32(instr); 9117 } 9118 break; 9119 } 9120 } 9121 break; 9122 } 9123 default: { 9124 if (((instr & 0xd0000) == 0xd0000)) { 9125 UnallocatedT32(instr); 9126 return; 9127 } 9128 unsigned rd = (instr >> 8) & 0xf; 9129 unsigned rn = (instr >> 16) & 0xf; 9130 uint32_t imm = (instr & 0xff) | 9131 ((instr >> 4) & 0x700) | 9132 ((instr >> 15) & 0x800); 9133 if ((InITBlock() || 9134 (rd >= kNumberOfT32LowRegisters) || 9135 (rn >= kNumberOfT32LowRegisters) || (imm > 7)) && 9136 (InITBlock() || (rd != rn) || 9137 (rd >= kNumberOfT32LowRegisters) || 9138 (imm > 255)) && 9139 (!ImmediateT32::IsImmediateT32(imm))) { 9140 // ADD{<c>}{<q>} {<Rd>}, <Rn>, #<imm12> ; T4 9141 add(CurrentCond(), 9142 Best, 9143 Register(rd), 9144 Register(rn), 9145 imm); 9146 } else { 9147 // ADDW{<c>}{<q>} {<Rd>}, <Rn>, #<imm12> ; T4 9148 addw(CurrentCond(), 9149 Register(rd), 9150 Register(rn), 9151 imm); 9152 } 9153 break; 9154 } 9155 } 9156 break; 9157 } 9158 case 0x02400000: { 9159 // 0xf2400000 9160 unsigned rd = (instr >> 8) & 0xf; 9161 uint32_t imm = (instr & 0xff) | ((instr >> 4) & 0x700) | 9162 ((instr >> 15) & 0x800) | 9163 ((instr >> 4) & 0xf000); 9164 if ((InITBlock() || (rd >= kNumberOfT32LowRegisters) || 9165 (imm > 255)) && 9166 (!ImmediateT32::IsImmediateT32(imm))) { 9167 // MOV{<c>}{<q>} <Rd>, #<imm16> ; T3 9168 mov(CurrentCond(), Best, Register(rd), imm); 9169 } else { 9170 // MOVW{<c>}{<q>} <Rd>, #<imm16> ; T3 9171 movw(CurrentCond(), Register(rd), imm); 9172 } 9173 break; 9174 } 9175 case 0x02a00000: { 9176 // 0xf2a00000 9177 switch (instr & 0x000d0000) { 9178 case 0x000d0000: { 9179 // 0xf2ad0000 9180 switch (instr & 0x00020000) { 9181 case 0x00000000: { 9182 // 0xf2ad0000 9183 unsigned rd = (instr >> 8) & 0xf; 9184 uint32_t imm = (instr & 0xff) | 9185 ((instr >> 4) & 0x700) | 9186 ((instr >> 15) & 0x800); 9187 if (((rd != sp.GetCode()) || 9188 ((imm > 508) || ((imm & 3) != 0))) && 9189 (!ImmediateT32::IsImmediateT32(imm))) { 9190 // SUB{<c>}{<q>} {<Rd>}, SP, #<imm12> ; T3 9191 sub(CurrentCond(), Best, Register(rd), sp, imm); 9192 } else { 9193 // SUBW{<c>}{<q>} {<Rd>}, SP, #<imm12> ; T3 9194 subw(CurrentCond(), Register(rd), sp, imm); 9195 } 9196 break; 9197 } 9198 case 0x00020000: { 9199 // 0xf2af0000 9200 if (((((Uint32((instr >> 26)) & Uint32(0x1)) 9201 << 11) | 9202 ((Uint32((instr >> 12)) & Uint32(0x7)) 9203 << 8) | 9204 (Uint32(instr) & Uint32(0xff))) == 9205 Uint32(0x0))) { 9206 unsigned rd = (instr >> 8) & 0xf; 9207 uint32_t imm = (instr & 0xff) | 9208 ((instr >> 4) & 0x700) | 9209 ((instr >> 15) & 0x800); 9210 // SUB{<c>}{<q>} <Rd>, PC, #<imm12> ; T2 9211 sub(CurrentCond(), Best, Register(rd), pc, imm); 9212 return; 9213 } 9214 unsigned rd = (instr >> 8) & 0xf; 9215 int32_t imm = (instr & 0xff) | 9216 ((instr >> 4) & 0x700) | 9217 ((instr >> 15) & 0x800); 9218 Location location(-imm, kT32PcDelta); 9219 // ADR{<c>}{<q>} <Rd>, <label> ; T2 9220 adr(CurrentCond(), Best, Register(rd), &location); 9221 break; 9222 } 9223 } 9224 break; 9225 } 9226 default: { 9227 if (((instr & 0xd0000) == 0xd0000)) { 9228 UnallocatedT32(instr); 9229 return; 9230 } 9231 unsigned rd = (instr >> 8) & 0xf; 9232 unsigned rn = (instr >> 16) & 0xf; 9233 uint32_t imm = (instr & 0xff) | 9234 ((instr >> 4) & 0x700) | 9235 ((instr >> 15) & 0x800); 9236 if ((InITBlock() || 9237 (rd >= kNumberOfT32LowRegisters) || 9238 (rn >= kNumberOfT32LowRegisters) || (imm > 7)) && 9239 (InITBlock() || (rd != rn) || 9240 (rd >= kNumberOfT32LowRegisters) || 9241 (imm > 255)) && 9242 (!ImmediateT32::IsImmediateT32(imm))) { 9243 // SUB{<c>}{<q>} {<Rd>}, <Rn>, #<imm12> ; T4 9244 sub(CurrentCond(), 9245 Best, 9246 Register(rd), 9247 Register(rn), 9248 imm); 9249 } else { 9250 // SUBW{<c>}{<q>} {<Rd>}, <Rn>, #<imm12> ; T4 9251 subw(CurrentCond(), 9252 Register(rd), 9253 Register(rn), 9254 imm); 9255 } 9256 break; 9257 } 9258 } 9259 break; 9260 } 9261 case 0x02c00000: { 9262 // 0xf2c00000 9263 unsigned rd = (instr >> 8) & 0xf; 9264 uint32_t imm = (instr & 0xff) | ((instr >> 4) & 0x700) | 9265 ((instr >> 15) & 0x800) | 9266 ((instr >> 4) & 0xf000); 9267 // MOVT{<c>}{<q>} <Rd>, #<imm16> ; T1 9268 movt(CurrentCond(), Register(rd), imm); 9269 break; 9270 } 9271 case 0x03000000: { 9272 // 0xf3000000 9273 unsigned rd = (instr >> 8) & 0xf; 9274 uint32_t imm = (instr & 0x1f) + 1; 9275 unsigned rn = (instr >> 16) & 0xf; 9276 uint32_t amount = 9277 ((instr >> 6) & 0x3) | ((instr >> 10) & 0x1c); 9278 // SSAT{<c>}{<q>} <Rd>, #<imm>, <Rn> {, LSL #<amount> } ; T1 NOLINT(whitespace/line_length) 9279 ssat(CurrentCond(), 9280 Register(rd), 9281 imm, 9282 Operand(Register(rn), LSL, amount)); 9283 if (((instr & 0xfff08020) != 0xf3000000)) { 9284 UnpredictableT32(instr); 9285 } 9286 break; 9287 } 9288 case 0x03200000: { 9289 // 0xf3200000 9290 switch (instr & 0x000070c0) { 9291 case 0x00000000: { 9292 // 0xf3200000 9293 unsigned rd = (instr >> 8) & 0xf; 9294 uint32_t imm = (instr & 0xf) + 1; 9295 unsigned rn = (instr >> 16) & 0xf; 9296 // SSAT16{<c>}{<q>} <Rd>, #<imm>, <Rn> ; T1 9297 ssat16(CurrentCond(), 9298 Register(rd), 9299 imm, 9300 Register(rn)); 9301 if (((instr & 0xfff0f0f0) != 0xf3200000)) { 9302 UnpredictableT32(instr); 9303 } 9304 break; 9305 } 9306 default: { 9307 if (((instr & 0x70c0) == 0x0)) { 9308 UnallocatedT32(instr); 9309 return; 9310 } 9311 unsigned rd = (instr >> 8) & 0xf; 9312 uint32_t imm = (instr & 0x1f) + 1; 9313 unsigned rn = (instr >> 16) & 0xf; 9314 uint32_t amount = 9315 ((instr >> 6) & 0x3) | ((instr >> 10) & 0x1c); 9316 // SSAT{<c>}{<q>} <Rd>, #<imm>, <Rn>, ASR #<amount> ; T1 NOLINT(whitespace/line_length) 9317 ssat(CurrentCond(), 9318 Register(rd), 9319 imm, 9320 Operand(Register(rn), ASR, amount)); 9321 if (((instr & 0xfff08020) != 0xf3200000)) { 9322 UnpredictableT32(instr); 9323 } 9324 break; 9325 } 9326 } 9327 break; 9328 } 9329 case 0x03400000: { 9330 // 0xf3400000 9331 unsigned rd = (instr >> 8) & 0xf; 9332 unsigned rn = (instr >> 16) & 0xf; 9333 uint32_t lsb = 9334 ((instr >> 6) & 0x3) | ((instr >> 10) & 0x1c); 9335 uint32_t widthm1 = instr & 0x1f; 9336 uint32_t width = widthm1 + 1; 9337 // SBFX{<c>}{<q>} <Rd>, <Rn>, #<lsb>, #<width> ; T1 9338 sbfx(CurrentCond(), 9339 Register(rd), 9340 Register(rn), 9341 lsb, 9342 width); 9343 if (((instr & 0xfff08020) != 0xf3400000)) { 9344 UnpredictableT32(instr); 9345 } 9346 break; 9347 } 9348 case 0x03600000: { 9349 // 0xf3600000 9350 switch (instr & 0x000f0000) { 9351 case 0x000f0000: { 9352 // 0xf36f0000 9353 unsigned rd = (instr >> 8) & 0xf; 9354 uint32_t lsb = 9355 ((instr >> 6) & 0x3) | ((instr >> 10) & 0x1c); 9356 uint32_t msb = instr & 0x1f; 9357 uint32_t width = msb - lsb + 1; 9358 // BFC{<c>}{<q>} <Rd>, #<lsb>, #<width> ; T1 9359 bfc(CurrentCond(), Register(rd), lsb, width); 9360 if (((instr & 0xffff8020) != 0xf36f0000)) { 9361 UnpredictableT32(instr); 9362 } 9363 break; 9364 } 9365 default: { 9366 if (((instr & 0xf0000) == 0xf0000)) { 9367 UnallocatedT32(instr); 9368 return; 9369 } 9370 unsigned rd = (instr >> 8) & 0xf; 9371 unsigned rn = (instr >> 16) & 0xf; 9372 uint32_t lsb = 9373 ((instr >> 6) & 0x3) | ((instr >> 10) & 0x1c); 9374 uint32_t msb = instr & 0x1f; 9375 uint32_t width = msb - lsb + 1; 9376 // BFI{<c>}{<q>} <Rd>, <Rn>, #<lsb>, #<width> ; T1 9377 bfi(CurrentCond(), 9378 Register(rd), 9379 Register(rn), 9380 lsb, 9381 width); 9382 if (((instr & 0xfff08020) != 0xf3600000)) { 9383 UnpredictableT32(instr); 9384 } 9385 break; 9386 } 9387 } 9388 break; 9389 } 9390 case 0x03800000: { 9391 // 0xf3800000 9392 unsigned rd = (instr >> 8) & 0xf; 9393 uint32_t imm = instr & 0x1f; 9394 unsigned rn = (instr >> 16) & 0xf; 9395 uint32_t amount = 9396 ((instr >> 6) & 0x3) | ((instr >> 10) & 0x1c); 9397 // USAT{<c>}{<q>} <Rd>, #<imm>, <Rn> {, LSL #<amount> } ; T1 NOLINT(whitespace/line_length) 9398 usat(CurrentCond(), 9399 Register(rd), 9400 imm, 9401 Operand(Register(rn), LSL, amount)); 9402 if (((instr & 0xfff08020) != 0xf3800000)) { 9403 UnpredictableT32(instr); 9404 } 9405 break; 9406 } 9407 case 0x03a00000: { 9408 // 0xf3a00000 9409 switch (instr & 0x000070c0) { 9410 case 0x00000000: { 9411 // 0xf3a00000 9412 unsigned rd = (instr >> 8) & 0xf; 9413 uint32_t imm = instr & 0xf; 9414 unsigned rn = (instr >> 16) & 0xf; 9415 // USAT16{<c>}{<q>} <Rd>, #<imm>, <Rn> ; T1 9416 usat16(CurrentCond(), 9417 Register(rd), 9418 imm, 9419 Register(rn)); 9420 if (((instr & 0xfff0f0f0) != 0xf3a00000)) { 9421 UnpredictableT32(instr); 9422 } 9423 break; 9424 } 9425 default: { 9426 if (((instr & 0x70c0) == 0x0)) { 9427 UnallocatedT32(instr); 9428 return; 9429 } 9430 unsigned rd = (instr >> 8) & 0xf; 9431 uint32_t imm = instr & 0x1f; 9432 unsigned rn = (instr >> 16) & 0xf; 9433 uint32_t amount = 9434 ((instr >> 6) & 0x3) | ((instr >> 10) & 0x1c); 9435 // USAT{<c>}{<q>} <Rd>, #<imm>, <Rn>, ASR #<amount> ; T1 NOLINT(whitespace/line_length) 9436 usat(CurrentCond(), 9437 Register(rd), 9438 imm, 9439 Operand(Register(rn), ASR, amount)); 9440 if (((instr & 0xfff08020) != 0xf3a00000)) { 9441 UnpredictableT32(instr); 9442 } 9443 break; 9444 } 9445 } 9446 break; 9447 } 9448 case 0x03c00000: { 9449 // 0xf3c00000 9450 unsigned rd = (instr >> 8) & 0xf; 9451 unsigned rn = (instr >> 16) & 0xf; 9452 uint32_t lsb = 9453 ((instr >> 6) & 0x3) | ((instr >> 10) & 0x1c); 9454 uint32_t widthm1 = instr & 0x1f; 9455 uint32_t width = widthm1 + 1; 9456 // UBFX{<c>}{<q>} <Rd>, <Rn>, #<lsb>, #<width> ; T1 9457 ubfx(CurrentCond(), 9458 Register(rd), 9459 Register(rn), 9460 lsb, 9461 width); 9462 if (((instr & 0xfff08020) != 0xf3c00000)) { 9463 UnpredictableT32(instr); 9464 } 9465 break; 9466 } 9467 default: 9468 UnallocatedT32(instr); 9469 break; 9470 } 9471 break; 9472 } 9473 case 0x00008000: { 9474 // 0xf0008000 9475 switch (instr & 0x00005000) { 9476 case 0x00000000: { 9477 // 0xf0008000 9478 switch (instr & 0x03800000) { 9479 case 0x03800000: { 9480 // 0xf3808000 9481 switch (instr & 0x04600000) { 9482 case 0x00000000: { 9483 // 0xf3808000 9484 switch (instr & 0x00000020) { 9485 case 0x00000000: { 9486 // 0xf3808000 9487 unsigned spec_reg = ((instr >> 8) & 0xf) | 9488 ((instr >> 16) & 0x10); 9489 unsigned rn = (instr >> 16) & 0xf; 9490 // MSR{<c>}{<q>} <spec_reg>, <Rn> ; T1 9491 msr(CurrentCond(), 9492 MaskedSpecialRegister(spec_reg), 9493 Register(rn)); 9494 if (((instr & 0xffe0f0ff) != 0xf3808000)) { 9495 UnpredictableT32(instr); 9496 } 9497 break; 9498 } 9499 case 0x00000020: { 9500 // 0xf3808020 9501 UnimplementedT32_32("MSR", instr); 9502 break; 9503 } 9504 } 9505 break; 9506 } 9507 case 0x00200000: { 9508 // 0xf3a08000 9509 switch (instr & 0x00100000) { 9510 case 0x00000000: { 9511 // 0xf3a08000 9512 switch (instr & 0x00000700) { 9513 case 0x00000000: { 9514 // 0xf3a08000 9515 switch (instr & 0x000000f0) { 9516 case 0x00000000: { 9517 // 0xf3a08000 9518 switch (instr & 0x0000000f) { 9519 case 0x00000000: { 9520 // 0xf3a08000 9521 // NOP{<c>}.W ; T2 9522 nop(CurrentCond(), Wide); 9523 if (((instr & 0xffffffff) != 9524 0xf3af8000)) { 9525 UnpredictableT32(instr); 9526 } 9527 break; 9528 } 9529 case 0x00000001: { 9530 // 0xf3a08001 9531 // YIELD{<c>}.W ; T2 9532 yield(CurrentCond(), Wide); 9533 if (((instr & 0xffffffff) != 9534 0xf3af8001)) { 9535 UnpredictableT32(instr); 9536 } 9537 break; 9538 } 9539 case 0x00000002: { 9540 // 0xf3a08002 9541 UnimplementedT32_32("WFE", instr); 9542 break; 9543 } 9544 case 0x00000003: { 9545 // 0xf3a08003 9546 UnimplementedT32_32("WFI", instr); 9547 break; 9548 } 9549 case 0x00000004: { 9550 // 0xf3a08004 9551 UnimplementedT32_32("SEV", instr); 9552 break; 9553 } 9554 case 0x00000005: { 9555 // 0xf3a08005 9556 UnimplementedT32_32("SEVL", 9557 instr); 9558 break; 9559 } 9560 default: 9561 UnallocatedT32(instr); 9562 break; 9563 } 9564 break; 9565 } 9566 case 0x000000f0: { 9567 // 0xf3a080f0 9568 UnimplementedT32_32("DBG", instr); 9569 break; 9570 } 9571 default: 9572 UnallocatedT32(instr); 9573 break; 9574 } 9575 break; 9576 } 9577 case 0x00000100: { 9578 // 0xf3a08100 9579 if ((instr & 0x000000e0) == 0x00000000) { 9580 UnimplementedT32_32("CPS", instr); 9581 } else { 9582 UnallocatedT32(instr); 9583 } 9584 break; 9585 } 9586 case 0x00000400: { 9587 // 0xf3a08400 9588 if ((instr & 0x0000001f) == 0x00000000) { 9589 UnimplementedT32_32("CPSIE", instr); 9590 } else { 9591 UnallocatedT32(instr); 9592 } 9593 break; 9594 } 9595 case 0x00000500: { 9596 // 0xf3a08500 9597 UnimplementedT32_32("CPSIE", instr); 9598 break; 9599 } 9600 case 0x00000600: { 9601 // 0xf3a08600 9602 if ((instr & 0x0000001f) == 0x00000000) { 9603 UnimplementedT32_32("CPSID", instr); 9604 } else { 9605 UnallocatedT32(instr); 9606 } 9607 break; 9608 } 9609 case 0x00000700: { 9610 // 0xf3a08700 9611 UnimplementedT32_32("CPSID", instr); 9612 break; 9613 } 9614 default: 9615 UnallocatedT32(instr); 9616 break; 9617 } 9618 break; 9619 } 9620 case 0x00100000: { 9621 // 0xf3b08000 9622 switch (instr & 0x000000f0) { 9623 case 0x00000020: { 9624 // 0xf3b08020 9625 // CLREX{<c>}{<q>} ; T1 9626 clrex(CurrentCond()); 9627 if (((instr & 0xffffffff) != 9628 0xf3bf8f2f)) { 9629 UnpredictableT32(instr); 9630 } 9631 break; 9632 } 9633 case 0x00000040: { 9634 // 0xf3b08040 9635 MemoryBarrier option(instr & 0xf); 9636 // DSB{<c>}{<q>} {<option>} ; T1 9637 dsb(CurrentCond(), option); 9638 if (((instr & 0xfffffff0) != 9639 0xf3bf8f40)) { 9640 UnpredictableT32(instr); 9641 } 9642 break; 9643 } 9644 case 0x00000050: { 9645 // 0xf3b08050 9646 MemoryBarrier option(instr & 0xf); 9647 // DMB{<c>}{<q>} {<option>} ; T1 9648 dmb(CurrentCond(), option); 9649 if (((instr & 0xfffffff0) != 9650 0xf3bf8f50)) { 9651 UnpredictableT32(instr); 9652 } 9653 break; 9654 } 9655 case 0x00000060: { 9656 // 0xf3b08060 9657 MemoryBarrier option(instr & 0xf); 9658 // ISB{<c>}{<q>} {<option>} ; T1 9659 isb(CurrentCond(), option); 9660 if (((instr & 0xfffffff0) != 9661 0xf3bf8f60)) { 9662 UnpredictableT32(instr); 9663 } 9664 break; 9665 } 9666 default: 9667 UnallocatedT32(instr); 9668 break; 9669 } 9670 break; 9671 } 9672 } 9673 break; 9674 } 9675 case 0x00400000: { 9676 // 0xf3c08000 9677 switch (instr & 0x00100000) { 9678 case 0x00000000: { 9679 // 0xf3c08000 9680 unsigned rm = (instr >> 16) & 0xf; 9681 // BXJ{<c>}{<q>} <Rm> ; T1 9682 bxj(CurrentCond(), Register(rm)); 9683 if (((instr & 0xfff0ffff) != 0xf3c08f00)) { 9684 UnpredictableT32(instr); 9685 } 9686 break; 9687 } 9688 case 0x00100000: { 9689 // 0xf3d08000 9690 switch (instr & 0x000000ff) { 9691 case 0x00000000: { 9692 // 0xf3d08000 9693 if ((instr & 0x000f0000) == 0x000e0000) { 9694 UnimplementedT32_32("ERET", instr); 9695 } else { 9696 UnallocatedT32(instr); 9697 } 9698 break; 9699 } 9700 default: { 9701 if (((instr & 0xff) == 0x0)) { 9702 UnallocatedT32(instr); 9703 return; 9704 } 9705 uint32_t imm = instr & 0xff; 9706 // SUBS{<c>}{<q>} PC, LR, #<imm8> ; T5 9707 subs(CurrentCond(), Best, pc, lr, imm); 9708 if (((instr & 0xffffff00) != 9709 0xf3de8f00)) { 9710 UnpredictableT32(instr); 9711 } 9712 break; 9713 } 9714 } 9715 break; 9716 } 9717 } 9718 break; 9719 } 9720 case 0x00600000: { 9721 // 0xf3e08000 9722 switch (instr & 0x00000020) { 9723 case 0x00000000: { 9724 // 0xf3e08000 9725 unsigned rd = (instr >> 8) & 0xf; 9726 unsigned spec_reg = (instr >> 20) & 0x1; 9727 // MRS{<c>}{<q>} <Rd>, <spec_reg> ; T1 9728 mrs(CurrentCond(), 9729 Register(rd), 9730 SpecialRegister(spec_reg)); 9731 if (((instr & 0xffeff0ff) != 0xf3ef8000)) { 9732 UnpredictableT32(instr); 9733 } 9734 break; 9735 } 9736 case 0x00000020: { 9737 // 0xf3e08020 9738 UnimplementedT32_32("MRS", instr); 9739 break; 9740 } 9741 } 9742 break; 9743 } 9744 case 0x04000000: { 9745 // 0xf7808000 9746 switch (instr & 0x001f2fff) { 9747 case 0x000f0001: { 9748 // 0xf78f8001 9749 UnimplementedT32_32("DCPS1", instr); 9750 break; 9751 } 9752 case 0x000f0002: { 9753 // 0xf78f8002 9754 UnimplementedT32_32("DCPS2", instr); 9755 break; 9756 } 9757 case 0x000f0003: { 9758 // 0xf78f8003 9759 UnimplementedT32_32("DCPS3", instr); 9760 break; 9761 } 9762 default: 9763 UnallocatedT32(instr); 9764 break; 9765 } 9766 break; 9767 } 9768 case 0x04600000: { 9769 // 0xf7e08000 9770 switch (instr & 0x00102000) { 9771 case 0x00000000: { 9772 // 0xf7e08000 9773 uint32_t imm = 9774 (instr & 0xfff) | ((instr >> 4) & 0xf000); 9775 // HVC{<q>} {#}<imm16> ; T1 9776 hvc(Condition::None(), imm); 9777 break; 9778 } 9779 case 0x00100000: { 9780 // 0xf7f08000 9781 UnimplementedT32_32("SMC", instr); 9782 break; 9783 } 9784 case 0x00102000: { 9785 // 0xf7f0a000 9786 uint32_t imm = 9787 (instr & 0xfff) | ((instr >> 4) & 0xf000); 9788 if ((imm <= 255)) { 9789 // UDF{<c>}.W {#}<imm> ; T2 9790 udf(CurrentCond(), Wide, imm); 9791 } else { 9792 // UDF{<c>}{<q>} {#}<imm> ; T2 9793 udf(CurrentCond(), Best, imm); 9794 } 9795 break; 9796 } 9797 default: 9798 UnallocatedT32(instr); 9799 break; 9800 } 9801 break; 9802 } 9803 default: 9804 UnallocatedT32(instr); 9805 break; 9806 } 9807 break; 9808 } 9809 default: { 9810 if (((instr & 0x3800000) == 0x3800000)) { 9811 UnallocatedT32(instr); 9812 return; 9813 } 9814 Condition condition((instr >> 22) & 0xf); 9815 int32_t imm = 9816 SignExtend<int32_t>(((instr & 0x7ff) | 9817 ((instr >> 5) & 0x1f800) | 9818 ((instr << 4) & 0x20000) | 9819 ((instr << 7) & 0x40000) | 9820 ((instr >> 7) & 0x80000)) 9821 << 1, 9822 21); 9823 Location location(imm, kT32PcDelta); 9824 if ((imm >= -1048576) && (imm <= 1048574) && 9825 ((imm & 1) == 0) && 9826 ((imm >= -256) && (imm <= 254) && 9827 ((imm & 1) == 0))) { 9828 // B<c>.W <label> ; T3 9829 b(condition, Wide, &location); 9830 if (InITBlock()) { 9831 UnpredictableT32(instr); 9832 } 9833 } else if ((imm >= -1048576) && (imm <= 1048574) && 9834 ((imm & 1) == 0)) { 9835 // B<c>{<q>} <label> ; T3 9836 b(condition, Best, &location); 9837 if (InITBlock()) { 9838 UnpredictableT32(instr); 9839 } 9840 } else { 9841 UnallocatedT32(instr); 9842 } 9843 break; 9844 } 9845 } 9846 break; 9847 } 9848 case 0x00001000: { 9849 // 0xf0009000 9850 uint32_t encoded_imm = 9851 (instr & 0x7ff) | ((instr >> 5) & 0x1ff800) | 9852 ((instr << 10) & 0x200000) | 9853 ((instr << 9) & 0x400000) | ((instr >> 3) & 0x800000); 9854 uint32_t S = encoded_imm & (1 << 23); 9855 encoded_imm ^= ((S >> 1) | (S >> 2)) ^ (3 << 21); 9856 int32_t imm = SignExtend<int32_t>(encoded_imm << 1, 25); 9857 Location location(imm, kT32PcDelta); 9858 if ((imm >= -16777216) && (imm <= 16777214) && 9859 ((imm & 1) == 0) && 9860 ((imm >= -2048) && (imm <= 2046) && 9861 ((imm & 1) == 0))) { 9862 // B{<c>}.W <label> ; T4 9863 b(CurrentCond(), Wide, &location); 9864 } else if ((imm >= -16777216) && (imm <= 16777214) && 9865 ((imm & 1) == 0)) { 9866 // B{<c>}{<q>} <label> ; T4 9867 b(CurrentCond(), Best, &location); 9868 if (!OutsideITBlockOrLast()) { 9869 UnpredictableT32(instr); 9870 } 9871 } else { 9872 UnallocatedT32(instr); 9873 } 9874 break; 9875 } 9876 case 0x00004000: { 9877 // 0xf000c000 9878 if ((instr & 0x00000001) == 0x00000000) { 9879 uint32_t encoded_imm = ((instr >> 1) & 0x3ff) | 9880 ((instr >> 6) & 0xffc00) | 9881 ((instr << 9) & 0x100000) | 9882 ((instr << 8) & 0x200000) | 9883 ((instr >> 4) & 0x400000); 9884 uint32_t S = encoded_imm & (1 << 22); 9885 encoded_imm ^= ((S >> 1) | (S >> 2)) ^ (3 << 20); 9886 int32_t imm = SignExtend<int32_t>(encoded_imm << 2, 25); 9887 Location location(imm, kT32PcDelta); 9888 // BLX{<c>}{<q>} <label> ; T2 9889 blx(CurrentCond(), &location); 9890 } else { 9891 UnallocatedT32(instr); 9892 } 9893 break; 9894 } 9895 case 0x00005000: { 9896 // 0xf000d000 9897 uint32_t encoded_imm = 9898 (instr & 0x7ff) | ((instr >> 5) & 0x1ff800) | 9899 ((instr << 10) & 0x200000) | 9900 ((instr << 9) & 0x400000) | ((instr >> 3) & 0x800000); 9901 uint32_t S = encoded_imm & (1 << 23); 9902 encoded_imm ^= ((S >> 1) | (S >> 2)) ^ (3 << 21); 9903 int32_t imm = SignExtend<int32_t>(encoded_imm << 1, 25); 9904 Location location(imm, kT32PcDelta); 9905 // BL{<c>}{<q>} <label> ; T1 9906 bl(CurrentCond(), &location); 9907 break; 9908 } 9909 } 9910 break; 9911 } 9912 } 9913 break; 9914 } 9915 } 9916 break; 9917 } 9918 case 0x08000000: { 9919 // 0xe8000000 9920 switch (instr & 0x06000000) { 9921 case 0x00000000: { 9922 // 0xe8000000 9923 switch (instr & 0x10100000) { 9924 case 0x00000000: { 9925 // 0xe8000000 9926 switch (instr & 0x01400000) { 9927 case 0x00000000: { 9928 // 0xe8000000 9929 switch (instr & 0x00800000) { 9930 case 0x00000000: { 9931 // 0xe8000000 9932 UnimplementedT32_32("SRSDB", instr); 9933 break; 9934 } 9935 case 0x00800000: { 9936 // 0xe8800000 9937 unsigned rn = (instr >> 16) & 0xf; 9938 WriteBack write_back((instr >> 21) & 0x1); 9939 RegisterList registers( 9940 (((instr >> 14) & 0x1) << kLRRegNum) | 9941 (instr & 0x1fff)); 9942 if ((rn < kNumberOfT32LowRegisters) && 9943 write_back.DoesWriteBack() && 9944 ((registers.GetList() & ~0xff) == 0)) { 9945 // STM{<c>}.W <Rn>{!}, <registers> ; T2 9946 stm(CurrentCond(), 9947 Wide, 9948 Register(rn), 9949 write_back, 9950 registers); 9951 if (((instr & 0xffd0a000) != 0xe8800000)) { 9952 UnpredictableT32(instr); 9953 } 9954 } else { 9955 // STM{<c>}{<q>} <Rn>{!}, <registers> ; T2 9956 stm(CurrentCond(), 9957 Best, 9958 Register(rn), 9959 write_back, 9960 registers); 9961 if (((instr & 0xffd0a000) != 0xe8800000)) { 9962 UnpredictableT32(instr); 9963 } 9964 } 9965 break; 9966 } 9967 } 9968 break; 9969 } 9970 case 0x00400000: { 9971 // 0xe8400000 9972 switch (instr & 0x00200000) { 9973 case 0x00000000: { 9974 // 0xe8400000 9975 switch (instr & 0x00800000) { 9976 case 0x00000000: { 9977 // 0xe8400000 9978 unsigned rd = (instr >> 8) & 0xf; 9979 unsigned rt = (instr >> 12) & 0xf; 9980 unsigned rn = (instr >> 16) & 0xf; 9981 int32_t offset = (instr & 0xff) << 2; 9982 // STREX{<c>}{<q>} <Rd>, <Rt>, [<Rn>{, #<imm>}] ; T1 NOLINT(whitespace/line_length) 9983 strex(CurrentCond(), 9984 Register(rd), 9985 Register(rt), 9986 MemOperand(Register(rn), 9987 plus, 9988 offset, 9989 Offset)); 9990 break; 9991 } 9992 case 0x00800000: { 9993 // 0xe8c00000 9994 switch (instr & 0x000000f0) { 9995 case 0x00000040: { 9996 // 0xe8c00040 9997 unsigned rd = instr & 0xf; 9998 unsigned rt = (instr >> 12) & 0xf; 9999 unsigned rn = (instr >> 16) & 0xf; 10000 // STREXB{<c>}{<q>} <Rd>, <Rt>, [<Rn>] ; T1 10001 strexb(CurrentCond(), 10002 Register(rd), 10003 Register(rt), 10004 MemOperand(Register(rn), Offset)); 10005 if (((instr & 0xfff00ff0) != 0xe8c00f40)) { 10006 UnpredictableT32(instr); 10007 } 10008 break; 10009 } 10010 case 0x00000050: { 10011 // 0xe8c00050 10012 unsigned rd = instr & 0xf; 10013 unsigned rt = (instr >> 12) & 0xf; 10014 unsigned rn = (instr >> 16) & 0xf; 10015 // STREXH{<c>}{<q>} <Rd>, <Rt>, [<Rn>] ; T1 10016 strexh(CurrentCond(), 10017 Register(rd), 10018 Register(rt), 10019 MemOperand(Register(rn), Offset)); 10020 if (((instr & 0xfff00ff0) != 0xe8c00f50)) { 10021 UnpredictableT32(instr); 10022 } 10023 break; 10024 } 10025 case 0x00000070: { 10026 // 0xe8c00070 10027 unsigned rd = instr & 0xf; 10028 unsigned rt = (instr >> 12) & 0xf; 10029 unsigned rt2 = (instr >> 8) & 0xf; 10030 unsigned rn = (instr >> 16) & 0xf; 10031 // STREXD{<c>}{<q>} <Rd>, <Rt>, <Rt2>, [<Rn>] ; T1 NOLINT(whitespace/line_length) 10032 strexd(CurrentCond(), 10033 Register(rd), 10034 Register(rt), 10035 Register(rt2), 10036 MemOperand(Register(rn), Offset)); 10037 break; 10038 } 10039 case 0x00000080: { 10040 // 0xe8c00080 10041 unsigned rt = (instr >> 12) & 0xf; 10042 unsigned rn = (instr >> 16) & 0xf; 10043 // STLB{<c>}{<q>} <Rt>, [<Rn>] ; T1 10044 stlb(CurrentCond(), 10045 Register(rt), 10046 MemOperand(Register(rn), Offset)); 10047 if (((instr & 0xfff00fff) != 0xe8c00f8f)) { 10048 UnpredictableT32(instr); 10049 } 10050 break; 10051 } 10052 case 0x00000090: { 10053 // 0xe8c00090 10054 unsigned rt = (instr >> 12) & 0xf; 10055 unsigned rn = (instr >> 16) & 0xf; 10056 // STLH{<c>}{<q>} <Rt>, [<Rn>] ; T1 10057 stlh(CurrentCond(), 10058 Register(rt), 10059 MemOperand(Register(rn), Offset)); 10060 if (((instr & 0xfff00fff) != 0xe8c00f9f)) { 10061 UnpredictableT32(instr); 10062 } 10063 break; 10064 } 10065 case 0x000000a0: { 10066 // 0xe8c000a0 10067 unsigned rt = (instr >> 12) & 0xf; 10068 unsigned rn = (instr >> 16) & 0xf; 10069 // STL{<c>}{<q>} <Rt>, [<Rn>] ; T1 10070 stl(CurrentCond(), 10071 Register(rt), 10072 MemOperand(Register(rn), Offset)); 10073 if (((instr & 0xfff00fff) != 0xe8c00faf)) { 10074 UnpredictableT32(instr); 10075 } 10076 break; 10077 } 10078 case 0x000000c0: { 10079 // 0xe8c000c0 10080 unsigned rd = instr & 0xf; 10081 unsigned rt = (instr >> 12) & 0xf; 10082 unsigned rn = (instr >> 16) & 0xf; 10083 // STLEXB{<c>}{<q>} <Rd>, <Rt>, [<Rn>] ; T1 10084 stlexb(CurrentCond(), 10085 Register(rd), 10086 Register(rt), 10087 MemOperand(Register(rn), Offset)); 10088 if (((instr & 0xfff00ff0) != 0xe8c00fc0)) { 10089 UnpredictableT32(instr); 10090 } 10091 break; 10092 } 10093 case 0x000000d0: { 10094 // 0xe8c000d0 10095 unsigned rd = instr & 0xf; 10096 unsigned rt = (instr >> 12) & 0xf; 10097 unsigned rn = (instr >> 16) & 0xf; 10098 // STLEXH{<c>}{<q>} <Rd>, <Rt>, [<Rn>] ; T1 10099 stlexh(CurrentCond(), 10100 Register(rd), 10101 Register(rt), 10102 MemOperand(Register(rn), Offset)); 10103 if (((instr & 0xfff00ff0) != 0xe8c00fd0)) { 10104 UnpredictableT32(instr); 10105 } 10106 break; 10107 } 10108 case 0x000000e0: { 10109 // 0xe8c000e0 10110 unsigned rd = instr & 0xf; 10111 unsigned rt = (instr >> 12) & 0xf; 10112 unsigned rn = (instr >> 16) & 0xf; 10113 // STLEX{<c>}{<q>} <Rd>, <Rt>, [<Rn>] ; T1 10114 stlex(CurrentCond(), 10115 Register(rd), 10116 Register(rt), 10117 MemOperand(Register(rn), Offset)); 10118 if (((instr & 0xfff00ff0) != 0xe8c00fe0)) { 10119 UnpredictableT32(instr); 10120 } 10121 break; 10122 } 10123 case 0x000000f0: { 10124 // 0xe8c000f0 10125 unsigned rd = instr & 0xf; 10126 unsigned rt = (instr >> 12) & 0xf; 10127 unsigned rt2 = (instr >> 8) & 0xf; 10128 unsigned rn = (instr >> 16) & 0xf; 10129 // STLEXD{<c>}{<q>} <Rd>, <Rt>, <Rt2>, [<Rn>] ; T1 NOLINT(whitespace/line_length) 10130 stlexd(CurrentCond(), 10131 Register(rd), 10132 Register(rt), 10133 Register(rt2), 10134 MemOperand(Register(rn), Offset)); 10135 break; 10136 } 10137 default: 10138 UnallocatedT32(instr); 10139 break; 10140 } 10141 break; 10142 } 10143 } 10144 break; 10145 } 10146 case 0x00200000: { 10147 // 0xe8600000 10148 if (((instr & 0xf0000) == 0xf0000)) { 10149 UnallocatedT32(instr); 10150 return; 10151 } 10152 unsigned rt = (instr >> 12) & 0xf; 10153 unsigned rt2 = (instr >> 8) & 0xf; 10154 unsigned rn = (instr >> 16) & 0xf; 10155 Sign sign((((instr >> 23) & 0x1) == 0) ? minus 10156 : plus); 10157 int32_t offset = (instr & 0xff) << 2; 10158 // STRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>], #{+/-}<imm> ; T1 NOLINT(whitespace/line_length) 10159 strd(CurrentCond(), 10160 Register(rt), 10161 Register(rt2), 10162 MemOperand(Register(rn), 10163 sign, 10164 offset, 10165 PostIndex)); 10166 break; 10167 } 10168 } 10169 break; 10170 } 10171 case 0x01000000: { 10172 // 0xe9000000 10173 switch (instr & 0x00800000) { 10174 case 0x00000000: { 10175 // 0xe9000000 10176 if (((Uint32((instr >> 21)) & Uint32(0x1)) == 10177 Uint32(0x1)) && 10178 ((Uint32((instr >> 16)) & Uint32(0xf)) == 10179 Uint32(0xd)) && 10180 (BitCount(((Uint32((instr >> 14)) & Uint32(0x1)) 10181 << 13) | 10182 (Uint32(instr) & Uint32(0x1fff))) > 10183 Int64(1))) { 10184 RegisterList registers( 10185 (((instr >> 14) & 0x1) << kLRRegNum) | 10186 (instr & 0x1fff)); 10187 if (registers.IsR0toR7orLR()) { 10188 // PUSH{<c>}.W <registers> ; T1 10189 push(CurrentCond(), Wide, registers); 10190 if (((instr & 0xffffa000) != 0xe92d0000)) { 10191 UnpredictableT32(instr); 10192 } 10193 } else { 10194 // PUSH{<c>}{<q>} <registers> ; T1 10195 push(CurrentCond(), Best, registers); 10196 if (((instr & 0xffffa000) != 0xe92d0000)) { 10197 UnpredictableT32(instr); 10198 } 10199 } 10200 return; 10201 } 10202 unsigned rn = (instr >> 16) & 0xf; 10203 WriteBack write_back((instr >> 21) & 0x1); 10204 RegisterList registers( 10205 (((instr >> 14) & 0x1) << kLRRegNum) | 10206 (instr & 0x1fff)); 10207 // STMDB{<c>}{<q>} <Rn>{!}, <registers> ; T1 10208 stmdb(CurrentCond(), 10209 Best, 10210 Register(rn), 10211 write_back, 10212 registers); 10213 if (((instr & 0xffd0a000) != 0xe9000000)) { 10214 UnpredictableT32(instr); 10215 } 10216 break; 10217 } 10218 case 0x00800000: { 10219 // 0xe9800000 10220 UnimplementedT32_32("SRS{IA}", instr); 10221 break; 10222 } 10223 } 10224 break; 10225 } 10226 case 0x01400000: { 10227 // 0xe9400000 10228 switch (instr & 0x00200000) { 10229 case 0x00000000: { 10230 // 0xe9400000 10231 if (((instr & 0xf0000) == 0xf0000)) { 10232 UnallocatedT32(instr); 10233 return; 10234 } 10235 unsigned rt = (instr >> 12) & 0xf; 10236 unsigned rt2 = (instr >> 8) & 0xf; 10237 unsigned rn = (instr >> 16) & 0xf; 10238 Sign sign((((instr >> 23) & 0x1) == 0) ? minus 10239 : plus); 10240 int32_t offset = (instr & 0xff) << 2; 10241 // STRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>{, #{+/-}<imm>}] ; T1 NOLINT(whitespace/line_length) 10242 strd(CurrentCond(), 10243 Register(rt), 10244 Register(rt2), 10245 MemOperand(Register(rn), sign, offset, Offset)); 10246 break; 10247 } 10248 case 0x00200000: { 10249 // 0xe9600000 10250 if (((instr & 0xf0000) == 0xf0000)) { 10251 UnallocatedT32(instr); 10252 return; 10253 } 10254 unsigned rt = (instr >> 12) & 0xf; 10255 unsigned rt2 = (instr >> 8) & 0xf; 10256 unsigned rn = (instr >> 16) & 0xf; 10257 Sign sign((((instr >> 23) & 0x1) == 0) ? minus 10258 : plus); 10259 int32_t offset = (instr & 0xff) << 2; 10260 // STRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>{, #{+/-}<imm>}]! ; T1 NOLINT(whitespace/line_length) 10261 strd(CurrentCond(), 10262 Register(rt), 10263 Register(rt2), 10264 MemOperand(Register(rn), 10265 sign, 10266 offset, 10267 PreIndex)); 10268 break; 10269 } 10270 } 10271 break; 10272 } 10273 } 10274 break; 10275 } 10276 case 0x00100000: { 10277 // 0xe8100000 10278 switch (instr & 0x00400000) { 10279 case 0x00000000: { 10280 // 0xe8100000 10281 switch (instr & 0x01800000) { 10282 case 0x00000000: { 10283 // 0xe8100000 10284 UnimplementedT32_32("RFEDB", instr); 10285 break; 10286 } 10287 case 0x00800000: { 10288 // 0xe8900000 10289 if (((Uint32((instr >> 21)) & Uint32(0x1)) == 10290 Uint32(0x1)) && 10291 ((Uint32((instr >> 16)) & Uint32(0xf)) == 10292 Uint32(0xd)) && 10293 (BitCount(((Uint32((instr >> 15)) & Uint32(0x1)) 10294 << 14) | 10295 ((Uint32((instr >> 14)) & Uint32(0x1)) 10296 << 13) | 10297 (Uint32(instr) & Uint32(0x1fff))) > 10298 Int64(1))) { 10299 RegisterList registers( 10300 (((instr >> 15) & 0x1) << kPCRegNum) | 10301 (((instr >> 14) & 0x1) << kLRRegNum) | 10302 (instr & 0x1fff)); 10303 if (registers.IsR0toR7orPC()) { 10304 // POP{<c>}.W <registers> ; T2 10305 pop(CurrentCond(), Wide, registers); 10306 if (((instr & 0xffff2000) != 0xe8bd0000)) { 10307 UnpredictableT32(instr); 10308 } 10309 } else { 10310 // POP{<c>}{<q>} <registers> ; T2 10311 pop(CurrentCond(), Best, registers); 10312 if (((instr & 0xffff2000) != 0xe8bd0000)) { 10313 UnpredictableT32(instr); 10314 } 10315 } 10316 return; 10317 } 10318 unsigned rn = (instr >> 16) & 0xf; 10319 WriteBack write_back((instr >> 21) & 0x1); 10320 RegisterList registers( 10321 (((instr >> 15) & 0x1) << kPCRegNum) | 10322 (((instr >> 14) & 0x1) << kLRRegNum) | 10323 (instr & 0x1fff)); 10324 if ((rn < kNumberOfT32LowRegisters) && 10325 (((registers.GetList() & (1 << rn)) == 0) == 10326 write_back.DoesWriteBack()) && 10327 ((registers.GetList() & ~0xff) == 0)) { 10328 // LDM{<c>}.W <Rn>{!}, <registers> ; T2 10329 ldm(CurrentCond(), 10330 Wide, 10331 Register(rn), 10332 write_back, 10333 registers); 10334 if (((instr & 0xffd02000) != 0xe8900000)) { 10335 UnpredictableT32(instr); 10336 } 10337 } else { 10338 // LDM{<c>}{<q>} <Rn>{!}, <registers> ; T2 10339 ldm(CurrentCond(), 10340 Best, 10341 Register(rn), 10342 write_back, 10343 registers); 10344 if (((instr & 0xffd02000) != 0xe8900000)) { 10345 UnpredictableT32(instr); 10346 } 10347 } 10348 break; 10349 } 10350 case 0x01000000: { 10351 // 0xe9100000 10352 unsigned rn = (instr >> 16) & 0xf; 10353 WriteBack write_back((instr >> 21) & 0x1); 10354 RegisterList registers( 10355 (((instr >> 15) & 0x1) << kPCRegNum) | 10356 (((instr >> 14) & 0x1) << kLRRegNum) | 10357 (instr & 0x1fff)); 10358 // LDMDB{<c>}{<q>} <Rn>{!}, <registers> ; T1 10359 ldmdb(CurrentCond(), 10360 Register(rn), 10361 write_back, 10362 registers); 10363 if (((instr & 0xffd02000) != 0xe9100000)) { 10364 UnpredictableT32(instr); 10365 } 10366 break; 10367 } 10368 case 0x01800000: { 10369 // 0xe9900000 10370 UnimplementedT32_32("RFE{IA}", instr); 10371 break; 10372 } 10373 } 10374 break; 10375 } 10376 case 0x00400000: { 10377 // 0xe8500000 10378 switch (instr & 0x01200000) { 10379 case 0x00000000: { 10380 // 0xe8500000 10381 switch (instr & 0x00800000) { 10382 case 0x00000000: { 10383 // 0xe8500000 10384 unsigned rt = (instr >> 12) & 0xf; 10385 unsigned rn = (instr >> 16) & 0xf; 10386 int32_t offset = (instr & 0xff) << 2; 10387 // LDREX{<c>}{<q>} <Rt>, [<Rn>{, #<imm>}] ; T1 10388 ldrex(CurrentCond(), 10389 Register(rt), 10390 MemOperand(Register(rn), 10391 plus, 10392 offset, 10393 Offset)); 10394 if (((instr & 0xfff00f00) != 0xe8500f00)) { 10395 UnpredictableT32(instr); 10396 } 10397 break; 10398 } 10399 case 0x00800000: { 10400 // 0xe8d00000 10401 switch (instr & 0x000000f0) { 10402 case 0x00000000: { 10403 // 0xe8d00000 10404 unsigned rn = (instr >> 16) & 0xf; 10405 unsigned rm = instr & 0xf; 10406 // TBB{<c>}{<q>} [<Rn>, <Rm>] ; T1 10407 tbb(CurrentCond(), 10408 Register(rn), 10409 Register(rm)); 10410 if (((instr & 0xfff0fff0) != 0xe8d0f000) || 10411 !OutsideITBlockOrLast()) { 10412 UnpredictableT32(instr); 10413 } 10414 break; 10415 } 10416 case 0x00000010: { 10417 // 0xe8d00010 10418 unsigned rn = (instr >> 16) & 0xf; 10419 unsigned rm = instr & 0xf; 10420 // TBH{<c>}{<q>} [<Rn>, <Rm>, LSL #1] ; T1 10421 tbh(CurrentCond(), 10422 Register(rn), 10423 Register(rm)); 10424 if (((instr & 0xfff0fff0) != 0xe8d0f010) || 10425 !OutsideITBlockOrLast()) { 10426 UnpredictableT32(instr); 10427 } 10428 break; 10429 } 10430 case 0x00000040: { 10431 // 0xe8d00040 10432 unsigned rt = (instr >> 12) & 0xf; 10433 unsigned rn = (instr >> 16) & 0xf; 10434 // LDREXB{<c>}{<q>} <Rt>, [<Rn>] ; T1 10435 ldrexb(CurrentCond(), 10436 Register(rt), 10437 MemOperand(Register(rn), Offset)); 10438 if (((instr & 0xfff00fff) != 0xe8d00f4f)) { 10439 UnpredictableT32(instr); 10440 } 10441 break; 10442 } 10443 case 0x00000050: { 10444 // 0xe8d00050 10445 unsigned rt = (instr >> 12) & 0xf; 10446 unsigned rn = (instr >> 16) & 0xf; 10447 // LDREXH{<c>}{<q>} <Rt>, [<Rn>] ; T1 10448 ldrexh(CurrentCond(), 10449 Register(rt), 10450 MemOperand(Register(rn), Offset)); 10451 if (((instr & 0xfff00fff) != 0xe8d00f5f)) { 10452 UnpredictableT32(instr); 10453 } 10454 break; 10455 } 10456 case 0x00000070: { 10457 // 0xe8d00070 10458 unsigned rt = (instr >> 12) & 0xf; 10459 unsigned rt2 = (instr >> 8) & 0xf; 10460 unsigned rn = (instr >> 16) & 0xf; 10461 // LDREXD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>] ; T1 10462 ldrexd(CurrentCond(), 10463 Register(rt), 10464 Register(rt2), 10465 MemOperand(Register(rn), Offset)); 10466 if (((instr & 0xfff000ff) != 0xe8d0007f)) { 10467 UnpredictableT32(instr); 10468 } 10469 break; 10470 } 10471 case 0x00000080: { 10472 // 0xe8d00080 10473 unsigned rt = (instr >> 12) & 0xf; 10474 unsigned rn = (instr >> 16) & 0xf; 10475 // LDAB{<c>}{<q>} <Rt>, [<Rn>] ; T1 10476 ldab(CurrentCond(), 10477 Register(rt), 10478 MemOperand(Register(rn), Offset)); 10479 if (((instr & 0xfff00fff) != 0xe8d00f8f)) { 10480 UnpredictableT32(instr); 10481 } 10482 break; 10483 } 10484 case 0x00000090: { 10485 // 0xe8d00090 10486 unsigned rt = (instr >> 12) & 0xf; 10487 unsigned rn = (instr >> 16) & 0xf; 10488 // LDAH{<c>}{<q>} <Rt>, [<Rn>] ; T1 10489 ldah(CurrentCond(), 10490 Register(rt), 10491 MemOperand(Register(rn), Offset)); 10492 if (((instr & 0xfff00fff) != 0xe8d00f9f)) { 10493 UnpredictableT32(instr); 10494 } 10495 break; 10496 } 10497 case 0x000000a0: { 10498 // 0xe8d000a0 10499 unsigned rt = (instr >> 12) & 0xf; 10500 unsigned rn = (instr >> 16) & 0xf; 10501 // LDA{<c>}{<q>} <Rt>, [<Rn>] ; T1 10502 lda(CurrentCond(), 10503 Register(rt), 10504 MemOperand(Register(rn), Offset)); 10505 if (((instr & 0xfff00fff) != 0xe8d00faf)) { 10506 UnpredictableT32(instr); 10507 } 10508 break; 10509 } 10510 case 0x000000c0: { 10511 // 0xe8d000c0 10512 unsigned rt = (instr >> 12) & 0xf; 10513 unsigned rn = (instr >> 16) & 0xf; 10514 // LDAEXB{<c>}{<q>} <Rt>, [<Rn>] ; T1 10515 ldaexb(CurrentCond(), 10516 Register(rt), 10517 MemOperand(Register(rn), Offset)); 10518 if (((instr & 0xfff00fff) != 0xe8d00fcf)) { 10519 UnpredictableT32(instr); 10520 } 10521 break; 10522 } 10523 case 0x000000d0: { 10524 // 0xe8d000d0 10525 unsigned rt = (instr >> 12) & 0xf; 10526 unsigned rn = (instr >> 16) & 0xf; 10527 // LDAEXH{<c>}{<q>} <Rt>, [<Rn>] ; T1 10528 ldaexh(CurrentCond(), 10529 Register(rt), 10530 MemOperand(Register(rn), Offset)); 10531 if (((instr & 0xfff00fff) != 0xe8d00fdf)) { 10532 UnpredictableT32(instr); 10533 } 10534 break; 10535 } 10536 case 0x000000e0: { 10537 // 0xe8d000e0 10538 unsigned rt = (instr >> 12) & 0xf; 10539 unsigned rn = (instr >> 16) & 0xf; 10540 // LDAEX{<c>}{<q>} <Rt>, [<Rn>] ; T1 10541 ldaex(CurrentCond(), 10542 Register(rt), 10543 MemOperand(Register(rn), Offset)); 10544 if (((instr & 0xfff00fff) != 0xe8d00fef)) { 10545 UnpredictableT32(instr); 10546 } 10547 break; 10548 } 10549 case 0x000000f0: { 10550 // 0xe8d000f0 10551 unsigned rt = (instr >> 12) & 0xf; 10552 unsigned rt2 = (instr >> 8) & 0xf; 10553 unsigned rn = (instr >> 16) & 0xf; 10554 // LDAEXD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>] ; T1 10555 ldaexd(CurrentCond(), 10556 Register(rt), 10557 Register(rt2), 10558 MemOperand(Register(rn), Offset)); 10559 if (((instr & 0xfff000ff) != 0xe8d000ff)) { 10560 UnpredictableT32(instr); 10561 } 10562 break; 10563 } 10564 default: 10565 UnallocatedT32(instr); 10566 break; 10567 } 10568 break; 10569 } 10570 } 10571 break; 10572 } 10573 case 0x00200000: { 10574 // 0xe8700000 10575 switch (instr & 0x000f0000) { 10576 case 0x000f0000: { 10577 // 0xe87f0000 10578 if (((instr & 0x1200000) == 0x0)) { 10579 UnallocatedT32(instr); 10580 return; 10581 } 10582 unsigned rt = (instr >> 12) & 0xf; 10583 unsigned rt2 = (instr >> 8) & 0xf; 10584 uint32_t U = (instr >> 23) & 0x1; 10585 int32_t imm = instr & 0xff; 10586 imm <<= 2; 10587 if (U == 0) imm = -imm; 10588 bool minus_zero = (imm == 0) && (U == 0); 10589 Location location(imm, kT32PcDelta); 10590 // LDRD{<c>}{<q>} <Rt>, <Rt2>, <label> ; T1 10591 if (minus_zero) { 10592 ldrd(CurrentCond(), 10593 Register(rt), 10594 Register(rt2), 10595 MemOperand(pc, minus, 0)); 10596 } else { 10597 ldrd(CurrentCond(), 10598 Register(rt), 10599 Register(rt2), 10600 &location); 10601 } 10602 if (((instr & 0xff7f0000) != 0xe95f0000)) { 10603 UnpredictableT32(instr); 10604 } 10605 break; 10606 } 10607 default: { 10608 if (((instr & 0xf0000) == 0xf0000)) { 10609 UnallocatedT32(instr); 10610 return; 10611 } 10612 unsigned rt = (instr >> 12) & 0xf; 10613 unsigned rt2 = (instr >> 8) & 0xf; 10614 unsigned rn = (instr >> 16) & 0xf; 10615 Sign sign((((instr >> 23) & 0x1) == 0) ? minus 10616 : plus); 10617 int32_t offset = (instr & 0xff) << 2; 10618 // LDRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>], #{+/-}<imm> ; T1 NOLINT(whitespace/line_length) 10619 ldrd(CurrentCond(), 10620 Register(rt), 10621 Register(rt2), 10622 MemOperand(Register(rn), 10623 sign, 10624 offset, 10625 PostIndex)); 10626 break; 10627 } 10628 } 10629 break; 10630 } 10631 case 0x01000000: { 10632 // 0xe9500000 10633 switch (instr & 0x000f0000) { 10634 case 0x000f0000: { 10635 // 0xe95f0000 10636 if (((instr & 0x1200000) == 0x0)) { 10637 UnallocatedT32(instr); 10638 return; 10639 } 10640 unsigned rt = (instr >> 12) & 0xf; 10641 unsigned rt2 = (instr >> 8) & 0xf; 10642 uint32_t U = (instr >> 23) & 0x1; 10643 int32_t imm = instr & 0xff; 10644 imm <<= 2; 10645 if (U == 0) imm = -imm; 10646 bool minus_zero = (imm == 0) && (U == 0); 10647 Location location(imm, kT32PcDelta); 10648 // LDRD{<c>}{<q>} <Rt>, <Rt2>, <label> ; T1 10649 if (minus_zero) { 10650 ldrd(CurrentCond(), 10651 Register(rt), 10652 Register(rt2), 10653 MemOperand(pc, minus, 0)); 10654 } else { 10655 ldrd(CurrentCond(), 10656 Register(rt), 10657 Register(rt2), 10658 &location); 10659 } 10660 if (((instr & 0xff7f0000) != 0xe95f0000)) { 10661 UnpredictableT32(instr); 10662 } 10663 break; 10664 } 10665 default: { 10666 if (((instr & 0xf0000) == 0xf0000)) { 10667 UnallocatedT32(instr); 10668 return; 10669 } 10670 unsigned rt = (instr >> 12) & 0xf; 10671 unsigned rt2 = (instr >> 8) & 0xf; 10672 unsigned rn = (instr >> 16) & 0xf; 10673 Sign sign((((instr >> 23) & 0x1) == 0) ? minus 10674 : plus); 10675 int32_t offset = (instr & 0xff) << 2; 10676 // LDRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>{, #{+/-}<imm>}] ; T1 NOLINT(whitespace/line_length) 10677 ldrd(CurrentCond(), 10678 Register(rt), 10679 Register(rt2), 10680 MemOperand(Register(rn), 10681 sign, 10682 offset, 10683 Offset)); 10684 break; 10685 } 10686 } 10687 break; 10688 } 10689 case 0x01200000: { 10690 // 0xe9700000 10691 switch (instr & 0x000f0000) { 10692 case 0x000f0000: { 10693 // 0xe97f0000 10694 if (((instr & 0x1200000) == 0x0)) { 10695 UnallocatedT32(instr); 10696 return; 10697 } 10698 unsigned rt = (instr >> 12) & 0xf; 10699 unsigned rt2 = (instr >> 8) & 0xf; 10700 uint32_t U = (instr >> 23) & 0x1; 10701 int32_t imm = instr & 0xff; 10702 imm <<= 2; 10703 if (U == 0) imm = -imm; 10704 bool minus_zero = (imm == 0) && (U == 0); 10705 Location location(imm, kT32PcDelta); 10706 // LDRD{<c>}{<q>} <Rt>, <Rt2>, <label> ; T1 10707 if (minus_zero) { 10708 ldrd(CurrentCond(), 10709 Register(rt), 10710 Register(rt2), 10711 MemOperand(pc, minus, 0)); 10712 } else { 10713 ldrd(CurrentCond(), 10714 Register(rt), 10715 Register(rt2), 10716 &location); 10717 } 10718 if (((instr & 0xff7f0000) != 0xe95f0000)) { 10719 UnpredictableT32(instr); 10720 } 10721 break; 10722 } 10723 default: { 10724 if (((instr & 0xf0000) == 0xf0000)) { 10725 UnallocatedT32(instr); 10726 return; 10727 } 10728 unsigned rt = (instr >> 12) & 0xf; 10729 unsigned rt2 = (instr >> 8) & 0xf; 10730 unsigned rn = (instr >> 16) & 0xf; 10731 Sign sign((((instr >> 23) & 0x1) == 0) ? minus 10732 : plus); 10733 int32_t offset = (instr & 0xff) << 2; 10734 // LDRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>{, #{+/-}<imm>}]! ; T1 NOLINT(whitespace/line_length) 10735 ldrd(CurrentCond(), 10736 Register(rt), 10737 Register(rt2), 10738 MemOperand(Register(rn), 10739 sign, 10740 offset, 10741 PreIndex)); 10742 break; 10743 } 10744 } 10745 break; 10746 } 10747 } 10748 break; 10749 } 10750 } 10751 break; 10752 } 10753 case 0x10000000: { 10754 // 0xf8000000 10755 switch (instr & 0x01a00000) { 10756 case 0x00000000: { 10757 // 0xf8000000 10758 switch (instr & 0x00400d00) { 10759 case 0x00000000: { 10760 // 0xf8000000 10761 if ((instr & 0x000002c0) == 0x00000000) { 10762 if (((instr & 0xf0000) == 0xf0000)) { 10763 UnallocatedT32(instr); 10764 return; 10765 } 10766 unsigned rt = (instr >> 12) & 0xf; 10767 unsigned rn = (instr >> 16) & 0xf; 10768 Sign sign(plus); 10769 unsigned rm = instr & 0xf; 10770 Shift shift = LSL; 10771 uint32_t amount = (instr >> 4) & 0x3; 10772 AddrMode addrmode = Offset; 10773 if ((rt < kNumberOfT32LowRegisters) && 10774 (rn < kNumberOfT32LowRegisters) && 10775 (rm < kNumberOfT32LowRegisters) && 10776 shift.IsLSL() && (amount == 0) && 10777 sign.IsPlus()) { 10778 // STRB{<c>}.W <Rt>, [<Rn>, #{+}<Rm>] ; T2 10779 strb(CurrentCond(), 10780 Wide, 10781 Register(rt), 10782 MemOperand(Register(rn), 10783 sign, 10784 Register(rm), 10785 addrmode)); 10786 } else { 10787 // STRB{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>{, LSL #<imm>}] ; T2 NOLINT(whitespace/line_length) 10788 strb(CurrentCond(), 10789 Best, 10790 Register(rt), 10791 MemOperand(Register(rn), 10792 sign, 10793 Register(rm), 10794 shift, 10795 amount, 10796 addrmode)); 10797 } 10798 } else { 10799 UnallocatedT32(instr); 10800 } 10801 break; 10802 } 10803 case 0x00000900: { 10804 // 0xf8000900 10805 if (((instr & 0xf0000) == 0xf0000)) { 10806 UnallocatedT32(instr); 10807 return; 10808 } 10809 unsigned rt = (instr >> 12) & 0xf; 10810 unsigned rn = (instr >> 16) & 0xf; 10811 Sign sign((((instr >> 9) & 0x1) == 0) ? minus : plus); 10812 int32_t offset = instr & 0xff; 10813 // STRB{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_2> ; T3 10814 strb(CurrentCond(), 10815 Best, 10816 Register(rt), 10817 MemOperand(Register(rn), 10818 sign, 10819 offset, 10820 PostIndex)); 10821 break; 10822 } 10823 case 0x00000c00: { 10824 // 0xf8000c00 10825 switch (instr & 0x00000200) { 10826 case 0x00000000: { 10827 // 0xf8000c00 10828 if (((instr & 0xf0000) == 0xf0000)) { 10829 UnallocatedT32(instr); 10830 return; 10831 } 10832 unsigned rt = (instr >> 12) & 0xf; 10833 unsigned rn = (instr >> 16) & 0xf; 10834 int32_t offset = instr & 0xff; 10835 // STRB{<c>}{<q>} <Rt>, [<Rn>{, #-<imm_2>}] ; T3 10836 strb(CurrentCond(), 10837 Best, 10838 Register(rt), 10839 MemOperand(Register(rn), 10840 minus, 10841 offset, 10842 Offset)); 10843 break; 10844 } 10845 case 0x00000200: { 10846 // 0xf8000e00 10847 if (((instr & 0xf0000) == 0xf0000)) { 10848 UnallocatedT32(instr); 10849 return; 10850 } 10851 UnimplementedT32_32("STRBT", instr); 10852 break; 10853 } 10854 } 10855 break; 10856 } 10857 case 0x00000d00: { 10858 // 0xf8000d00 10859 if (((instr & 0xf0000) == 0xf0000)) { 10860 UnallocatedT32(instr); 10861 return; 10862 } 10863 unsigned rt = (instr >> 12) & 0xf; 10864 unsigned rn = (instr >> 16) & 0xf; 10865 Sign sign((((instr >> 9) & 0x1) == 0) ? minus : plus); 10866 int32_t offset = instr & 0xff; 10867 // STRB{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_2>}]! ; T3 10868 strb(CurrentCond(), 10869 Best, 10870 Register(rt), 10871 MemOperand(Register(rn), 10872 sign, 10873 offset, 10874 PreIndex)); 10875 break; 10876 } 10877 case 0x00400000: { 10878 // 0xf8400000 10879 if ((instr & 0x000002c0) == 0x00000000) { 10880 if (((instr & 0xf0000) == 0xf0000)) { 10881 UnallocatedT32(instr); 10882 return; 10883 } 10884 unsigned rt = (instr >> 12) & 0xf; 10885 unsigned rn = (instr >> 16) & 0xf; 10886 Sign sign(plus); 10887 unsigned rm = instr & 0xf; 10888 Shift shift = LSL; 10889 uint32_t amount = (instr >> 4) & 0x3; 10890 AddrMode addrmode = Offset; 10891 if ((rt < kNumberOfT32LowRegisters) && 10892 (rn < kNumberOfT32LowRegisters) && 10893 (rm < kNumberOfT32LowRegisters) && 10894 shift.IsLSL() && (amount == 0) && 10895 sign.IsPlus()) { 10896 // STR{<c>}.W <Rt>, [<Rn>, #{+}<Rm>] ; T2 10897 str(CurrentCond(), 10898 Wide, 10899 Register(rt), 10900 MemOperand(Register(rn), 10901 sign, 10902 Register(rm), 10903 addrmode)); 10904 } else { 10905 // STR{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>{, LSL #<imm>}] ; T2 NOLINT(whitespace/line_length) 10906 str(CurrentCond(), 10907 Best, 10908 Register(rt), 10909 MemOperand(Register(rn), 10910 sign, 10911 Register(rm), 10912 shift, 10913 amount, 10914 addrmode)); 10915 } 10916 } else { 10917 UnallocatedT32(instr); 10918 } 10919 break; 10920 } 10921 case 0x00400900: { 10922 // 0xf8400900 10923 if (((instr & 0xf0000) == 0xf0000)) { 10924 UnallocatedT32(instr); 10925 return; 10926 } 10927 unsigned rt = (instr >> 12) & 0xf; 10928 unsigned rn = (instr >> 16) & 0xf; 10929 Sign sign((((instr >> 9) & 0x1) == 0) ? minus : plus); 10930 int32_t offset = instr & 0xff; 10931 // STR{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_2> ; T4 10932 str(CurrentCond(), 10933 Best, 10934 Register(rt), 10935 MemOperand(Register(rn), 10936 sign, 10937 offset, 10938 PostIndex)); 10939 break; 10940 } 10941 case 0x00400c00: { 10942 // 0xf8400c00 10943 switch (instr & 0x00000200) { 10944 case 0x00000000: { 10945 // 0xf8400c00 10946 if (((instr & 0xf0000) == 0xf0000)) { 10947 UnallocatedT32(instr); 10948 return; 10949 } 10950 unsigned rt = (instr >> 12) & 0xf; 10951 unsigned rn = (instr >> 16) & 0xf; 10952 int32_t offset = instr & 0xff; 10953 // STR{<c>}{<q>} <Rt>, [<Rn>{, #-<imm_2>}] ; T4 10954 str(CurrentCond(), 10955 Best, 10956 Register(rt), 10957 MemOperand(Register(rn), 10958 minus, 10959 offset, 10960 Offset)); 10961 break; 10962 } 10963 case 0x00000200: { 10964 // 0xf8400e00 10965 if (((instr & 0xf0000) == 0xf0000)) { 10966 UnallocatedT32(instr); 10967 return; 10968 } 10969 UnimplementedT32_32("STRT", instr); 10970 break; 10971 } 10972 } 10973 break; 10974 } 10975 case 0x00400d00: { 10976 // 0xf8400d00 10977 if (((instr & 0xf0000) == 0xf0000)) { 10978 UnallocatedT32(instr); 10979 return; 10980 } 10981 if (((Uint32((instr >> 16)) & Uint32(0xf)) == 10982 Uint32(0xd)) && 10983 ((Uint32((instr >> 9)) & Uint32(0x1)) == 10984 Uint32(0x0)) && 10985 ((Uint32(instr) & Uint32(0xff)) == Uint32(0x4))) { 10986 unsigned rt = (instr >> 12) & 0xf; 10987 if ((rt <= 7) || (rt == kLRRegNum)) { 10988 // PUSH{<c>}.W <single_register_list> ; T4 10989 push(CurrentCond(), Wide, Register(rt)); 10990 } else { 10991 // PUSH{<c>}{<q>} <single_register_list> ; T4 10992 push(CurrentCond(), Best, Register(rt)); 10993 } 10994 return; 10995 } 10996 unsigned rt = (instr >> 12) & 0xf; 10997 unsigned rn = (instr >> 16) & 0xf; 10998 Sign sign((((instr >> 9) & 0x1) == 0) ? minus : plus); 10999 int32_t offset = instr & 0xff; 11000 // STR{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_2>}]! ; T4 11001 str(CurrentCond(), 11002 Best, 11003 Register(rt), 11004 MemOperand(Register(rn), sign, offset, PreIndex)); 11005 break; 11006 } 11007 default: 11008 UnallocatedT32(instr); 11009 break; 11010 } 11011 break; 11012 } 11013 case 0x00200000: { 11014 // 0xf8200000 11015 switch (instr & 0x00400d00) { 11016 case 0x00000000: { 11017 // 0xf8200000 11018 if ((instr & 0x000002c0) == 0x00000000) { 11019 if (((instr & 0xf0000) == 0xf0000)) { 11020 UnallocatedT32(instr); 11021 return; 11022 } 11023 unsigned rt = (instr >> 12) & 0xf; 11024 unsigned rn = (instr >> 16) & 0xf; 11025 Sign sign(plus); 11026 unsigned rm = instr & 0xf; 11027 Shift shift = LSL; 11028 uint32_t amount = (instr >> 4) & 0x3; 11029 AddrMode addrmode = Offset; 11030 if ((rt < kNumberOfT32LowRegisters) && 11031 (rn < kNumberOfT32LowRegisters) && 11032 (rm < kNumberOfT32LowRegisters) && 11033 shift.IsLSL() && (amount == 0) && 11034 sign.IsPlus()) { 11035 // STRH{<c>}.W <Rt>, [<Rn>, #{+}<Rm>] ; T2 11036 strh(CurrentCond(), 11037 Wide, 11038 Register(rt), 11039 MemOperand(Register(rn), 11040 sign, 11041 Register(rm), 11042 addrmode)); 11043 } else { 11044 // STRH{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>{, LSL #<imm>}] ; T2 NOLINT(whitespace/line_length) 11045 strh(CurrentCond(), 11046 Best, 11047 Register(rt), 11048 MemOperand(Register(rn), 11049 sign, 11050 Register(rm), 11051 shift, 11052 amount, 11053 addrmode)); 11054 } 11055 } else { 11056 UnallocatedT32(instr); 11057 } 11058 break; 11059 } 11060 case 0x00000900: { 11061 // 0xf8200900 11062 if (((instr & 0xf0000) == 0xf0000)) { 11063 UnallocatedT32(instr); 11064 return; 11065 } 11066 unsigned rt = (instr >> 12) & 0xf; 11067 unsigned rn = (instr >> 16) & 0xf; 11068 Sign sign((((instr >> 9) & 0x1) == 0) ? minus : plus); 11069 int32_t offset = instr & 0xff; 11070 // STRH{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_2> ; T3 11071 strh(CurrentCond(), 11072 Best, 11073 Register(rt), 11074 MemOperand(Register(rn), 11075 sign, 11076 offset, 11077 PostIndex)); 11078 break; 11079 } 11080 case 0x00000c00: { 11081 // 0xf8200c00 11082 switch (instr & 0x00000200) { 11083 case 0x00000000: { 11084 // 0xf8200c00 11085 if (((instr & 0xf0000) == 0xf0000)) { 11086 UnallocatedT32(instr); 11087 return; 11088 } 11089 unsigned rt = (instr >> 12) & 0xf; 11090 unsigned rn = (instr >> 16) & 0xf; 11091 int32_t offset = instr & 0xff; 11092 // STRH{<c>}{<q>} <Rt>, [<Rn>{, #-<imm_2>}] ; T3 11093 strh(CurrentCond(), 11094 Best, 11095 Register(rt), 11096 MemOperand(Register(rn), 11097 minus, 11098 offset, 11099 Offset)); 11100 break; 11101 } 11102 case 0x00000200: { 11103 // 0xf8200e00 11104 if (((instr & 0xf0000) == 0xf0000)) { 11105 UnallocatedT32(instr); 11106 return; 11107 } 11108 UnimplementedT32_32("STRHT", instr); 11109 break; 11110 } 11111 } 11112 break; 11113 } 11114 case 0x00000d00: { 11115 // 0xf8200d00 11116 if (((instr & 0xf0000) == 0xf0000)) { 11117 UnallocatedT32(instr); 11118 return; 11119 } 11120 unsigned rt = (instr >> 12) & 0xf; 11121 unsigned rn = (instr >> 16) & 0xf; 11122 Sign sign((((instr >> 9) & 0x1) == 0) ? minus : plus); 11123 int32_t offset = instr & 0xff; 11124 // STRH{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_2>}]! ; T3 11125 strh(CurrentCond(), 11126 Best, 11127 Register(rt), 11128 MemOperand(Register(rn), 11129 sign, 11130 offset, 11131 PreIndex)); 11132 break; 11133 } 11134 default: 11135 UnallocatedT32(instr); 11136 break; 11137 } 11138 break; 11139 } 11140 case 0x00800000: { 11141 // 0xf8800000 11142 switch (instr & 0x00400000) { 11143 case 0x00000000: { 11144 // 0xf8800000 11145 if (((instr & 0xf0000) == 0xf0000)) { 11146 UnallocatedT32(instr); 11147 return; 11148 } 11149 unsigned rt = (instr >> 12) & 0xf; 11150 unsigned rn = (instr >> 16) & 0xf; 11151 int32_t offset = instr & 0xfff; 11152 if ((rt < kNumberOfT32LowRegisters) && 11153 (rn < kNumberOfT32LowRegisters) && 11154 ((offset >= 0) && (offset <= 31))) { 11155 // STRB{<c>}.W <Rt>, [<Rn>{, #{+}<imm_1>}] ; T2 11156 strb(CurrentCond(), 11157 Wide, 11158 Register(rt), 11159 MemOperand(Register(rn), 11160 plus, 11161 offset, 11162 Offset)); 11163 } else { 11164 // STRB{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm_1>}] ; T2 11165 strb(CurrentCond(), 11166 Best, 11167 Register(rt), 11168 MemOperand(Register(rn), 11169 plus, 11170 offset, 11171 Offset)); 11172 } 11173 break; 11174 } 11175 case 0x00400000: { 11176 // 0xf8c00000 11177 if (((instr & 0xf0000) == 0xf0000)) { 11178 UnallocatedT32(instr); 11179 return; 11180 } 11181 unsigned rt = (instr >> 12) & 0xf; 11182 unsigned rn = (instr >> 16) & 0xf; 11183 int32_t offset = instr & 0xfff; 11184 if (((rt < kNumberOfT32LowRegisters) && 11185 (rn < kNumberOfT32LowRegisters) && 11186 ((offset >= 0) && (offset <= 124) && 11187 ((offset & 3) == 0))) || 11188 ((rt < kNumberOfT32LowRegisters) && 11189 (rn == sp.GetCode()) && 11190 ((offset >= 0) && (offset <= 1020) && 11191 ((offset & 3) == 0)))) { 11192 // STR{<c>}.W <Rt>, [<Rn>{, #{+}<imm_1>}] ; T3 11193 str(CurrentCond(), 11194 Wide, 11195 Register(rt), 11196 MemOperand(Register(rn), plus, offset, Offset)); 11197 } else { 11198 // STR{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm_1>}] ; T3 11199 str(CurrentCond(), 11200 Best, 11201 Register(rt), 11202 MemOperand(Register(rn), plus, offset, Offset)); 11203 } 11204 break; 11205 } 11206 } 11207 break; 11208 } 11209 case 0x00a00000: { 11210 // 0xf8a00000 11211 if ((instr & 0x00400000) == 0x00000000) { 11212 if (((instr & 0xf0000) == 0xf0000)) { 11213 UnallocatedT32(instr); 11214 return; 11215 } 11216 unsigned rt = (instr >> 12) & 0xf; 11217 unsigned rn = (instr >> 16) & 0xf; 11218 int32_t offset = instr & 0xfff; 11219 if ((rt < kNumberOfT32LowRegisters) && 11220 (rn < kNumberOfT32LowRegisters) && 11221 ((offset >= 0) && (offset <= 62) && 11222 ((offset & 1) == 0))) { 11223 // STRH{<c>}.W <Rt>, [<Rn>{, #{+}<imm_1>}] ; T2 11224 strh(CurrentCond(), 11225 Wide, 11226 Register(rt), 11227 MemOperand(Register(rn), plus, offset, Offset)); 11228 } else { 11229 // STRH{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm_1>}] ; T2 11230 strh(CurrentCond(), 11231 Best, 11232 Register(rt), 11233 MemOperand(Register(rn), plus, offset, Offset)); 11234 } 11235 } else { 11236 UnallocatedT32(instr); 11237 } 11238 break; 11239 } 11240 case 0x01000000: { 11241 // 0xf9000000 11242 switch (instr & 0x0000000d) { 11243 case 0x0000000d: { 11244 // 0xf900000d 11245 switch (instr & 0x00000002) { 11246 case 0x00000000: { 11247 // 0xf900000d 11248 switch (instr & 0x00000f00) { 11249 case 0x00000000: { 11250 // 0xf900000d 11251 DataType dt = 11252 Dt_size_7_Decode((instr >> 6) & 0x3); 11253 if (dt.Is(kDataTypeValueInvalid)) { 11254 UnallocatedT32(instr); 11255 return; 11256 } 11257 Alignment align = 11258 Align_align_4_Decode((instr >> 4) & 0x3); 11259 if (dt.Is(kDataTypeValueInvalid) || 11260 align.Is(kBadAlignment)) { 11261 UnallocatedT32(instr); 11262 return; 11263 } 11264 unsigned first = 11265 ExtractDRegister(instr, 22, 12); 11266 unsigned length; 11267 SpacingType spacing; 11268 switch ((instr >> 8) & 0xf) { 11269 default: 11270 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 11271 case 0x0: 11272 length = 4; 11273 spacing = kSingle; 11274 break; 11275 case 0x1: 11276 length = 4; 11277 spacing = kDouble; 11278 break; 11279 } 11280 unsigned last = 11281 first + 11282 (length - 1) * 11283 (spacing == kSingle ? 1 : 2); 11284 TransferType transfer = kMultipleLanes; 11285 unsigned rn = (instr >> 16) & 0xf; 11286 // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length) 11287 vst4(CurrentCond(), 11288 dt, 11289 NeonRegisterList(DRegister(first), 11290 DRegister(last), 11291 spacing, 11292 transfer), 11293 AlignedMemOperand(Register(rn), 11294 align, 11295 PostIndex)); 11296 break; 11297 } 11298 case 0x00000100: { 11299 // 0xf900010d 11300 DataType dt = 11301 Dt_size_7_Decode((instr >> 6) & 0x3); 11302 if (dt.Is(kDataTypeValueInvalid)) { 11303 UnallocatedT32(instr); 11304 return; 11305 } 11306 Alignment align = 11307 Align_align_4_Decode((instr >> 4) & 0x3); 11308 if (dt.Is(kDataTypeValueInvalid) || 11309 align.Is(kBadAlignment)) { 11310 UnallocatedT32(instr); 11311 return; 11312 } 11313 unsigned first = 11314 ExtractDRegister(instr, 22, 12); 11315 unsigned length; 11316 SpacingType spacing; 11317 switch ((instr >> 8) & 0xf) { 11318 default: 11319 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 11320 case 0x0: 11321 length = 4; 11322 spacing = kSingle; 11323 break; 11324 case 0x1: 11325 length = 4; 11326 spacing = kDouble; 11327 break; 11328 } 11329 unsigned last = 11330 first + 11331 (length - 1) * 11332 (spacing == kSingle ? 1 : 2); 11333 TransferType transfer = kMultipleLanes; 11334 unsigned rn = (instr >> 16) & 0xf; 11335 // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length) 11336 vst4(CurrentCond(), 11337 dt, 11338 NeonRegisterList(DRegister(first), 11339 DRegister(last), 11340 spacing, 11341 transfer), 11342 AlignedMemOperand(Register(rn), 11343 align, 11344 PostIndex)); 11345 break; 11346 } 11347 case 0x00000200: { 11348 // 0xf900020d 11349 if (((instr & 0xe20) == 0x620) || 11350 ((instr & 0xf30) == 0xa30)) { 11351 UnallocatedT32(instr); 11352 return; 11353 } 11354 DataType dt = 11355 Dt_size_6_Decode((instr >> 6) & 0x3); 11356 if (dt.Is(kDataTypeValueInvalid)) { 11357 UnallocatedT32(instr); 11358 return; 11359 } 11360 Alignment align = 11361 Align_align_5_Decode((instr >> 4) & 0x3); 11362 if (dt.Is(kDataTypeValueInvalid) || 11363 align.Is(kBadAlignment)) { 11364 UnallocatedT32(instr); 11365 return; 11366 } 11367 unsigned first = 11368 ExtractDRegister(instr, 22, 12); 11369 unsigned length; 11370 SpacingType spacing = kSingle; 11371 switch ((instr >> 8) & 0xf) { 11372 default: 11373 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 11374 case 0x7: 11375 length = 1; 11376 break; 11377 case 0xa: 11378 length = 2; 11379 break; 11380 case 0x6: 11381 length = 3; 11382 break; 11383 case 0x2: 11384 length = 4; 11385 break; 11386 } 11387 unsigned last = first + length - 1; 11388 TransferType transfer = kMultipleLanes; 11389 unsigned rn = (instr >> 16) & 0xf; 11390 // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length) 11391 vst1(CurrentCond(), 11392 dt, 11393 NeonRegisterList(DRegister(first), 11394 DRegister(last), 11395 spacing, 11396 transfer), 11397 AlignedMemOperand(Register(rn), 11398 align, 11399 PostIndex)); 11400 break; 11401 } 11402 case 0x00000300: { 11403 // 0xf900030d 11404 if (((instr & 0xe30) == 0x830)) { 11405 UnallocatedT32(instr); 11406 return; 11407 } 11408 DataType dt = 11409 Dt_size_7_Decode((instr >> 6) & 0x3); 11410 if (dt.Is(kDataTypeValueInvalid)) { 11411 UnallocatedT32(instr); 11412 return; 11413 } 11414 Alignment align = 11415 Align_align_2_Decode((instr >> 4) & 0x3); 11416 if (dt.Is(kDataTypeValueInvalid) || 11417 align.Is(kBadAlignment)) { 11418 UnallocatedT32(instr); 11419 return; 11420 } 11421 unsigned first = 11422 ExtractDRegister(instr, 22, 12); 11423 unsigned length; 11424 SpacingType spacing; 11425 switch ((instr >> 8) & 0xf) { 11426 default: 11427 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 11428 case 0x8: 11429 length = 2; 11430 spacing = kSingle; 11431 break; 11432 case 0x9: 11433 length = 2; 11434 spacing = kDouble; 11435 break; 11436 case 0x3: 11437 length = 4; 11438 spacing = kSingle; 11439 break; 11440 } 11441 unsigned last = 11442 first + 11443 (length - 1) * 11444 (spacing == kSingle ? 1 : 2); 11445 TransferType transfer = kMultipleLanes; 11446 unsigned rn = (instr >> 16) & 0xf; 11447 // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length) 11448 vst2(CurrentCond(), 11449 dt, 11450 NeonRegisterList(DRegister(first), 11451 DRegister(last), 11452 spacing, 11453 transfer), 11454 AlignedMemOperand(Register(rn), 11455 align, 11456 PostIndex)); 11457 break; 11458 } 11459 case 0x00000400: { 11460 // 0xf900040d 11461 if (((instr & 0x20) == 0x20)) { 11462 UnallocatedT32(instr); 11463 return; 11464 } 11465 DataType dt = 11466 Dt_size_7_Decode((instr >> 6) & 0x3); 11467 if (dt.Is(kDataTypeValueInvalid)) { 11468 UnallocatedT32(instr); 11469 return; 11470 } 11471 Alignment align = 11472 Align_align_3_Decode((instr >> 4) & 0x3); 11473 if (dt.Is(kDataTypeValueInvalid) || 11474 align.Is(kBadAlignment)) { 11475 UnallocatedT32(instr); 11476 return; 11477 } 11478 unsigned first = 11479 ExtractDRegister(instr, 22, 12); 11480 unsigned length; 11481 SpacingType spacing; 11482 switch ((instr >> 8) & 0xf) { 11483 default: 11484 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 11485 case 0x4: 11486 length = 3; 11487 spacing = kSingle; 11488 break; 11489 case 0x5: 11490 length = 3; 11491 spacing = kDouble; 11492 break; 11493 } 11494 unsigned last = 11495 first + 11496 (length - 1) * 11497 (spacing == kSingle ? 1 : 2); 11498 TransferType transfer = kMultipleLanes; 11499 unsigned rn = (instr >> 16) & 0xf; 11500 // VST3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length) 11501 vst3(CurrentCond(), 11502 dt, 11503 NeonRegisterList(DRegister(first), 11504 DRegister(last), 11505 spacing, 11506 transfer), 11507 AlignedMemOperand(Register(rn), 11508 align, 11509 PostIndex)); 11510 break; 11511 } 11512 case 0x00000500: { 11513 // 0xf900050d 11514 if (((instr & 0x20) == 0x20)) { 11515 UnallocatedT32(instr); 11516 return; 11517 } 11518 DataType dt = 11519 Dt_size_7_Decode((instr >> 6) & 0x3); 11520 if (dt.Is(kDataTypeValueInvalid)) { 11521 UnallocatedT32(instr); 11522 return; 11523 } 11524 Alignment align = 11525 Align_align_3_Decode((instr >> 4) & 0x3); 11526 if (dt.Is(kDataTypeValueInvalid) || 11527 align.Is(kBadAlignment)) { 11528 UnallocatedT32(instr); 11529 return; 11530 } 11531 unsigned first = 11532 ExtractDRegister(instr, 22, 12); 11533 unsigned length; 11534 SpacingType spacing; 11535 switch ((instr >> 8) & 0xf) { 11536 default: 11537 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 11538 case 0x4: 11539 length = 3; 11540 spacing = kSingle; 11541 break; 11542 case 0x5: 11543 length = 3; 11544 spacing = kDouble; 11545 break; 11546 } 11547 unsigned last = 11548 first + 11549 (length - 1) * 11550 (spacing == kSingle ? 1 : 2); 11551 TransferType transfer = kMultipleLanes; 11552 unsigned rn = (instr >> 16) & 0xf; 11553 // VST3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length) 11554 vst3(CurrentCond(), 11555 dt, 11556 NeonRegisterList(DRegister(first), 11557 DRegister(last), 11558 spacing, 11559 transfer), 11560 AlignedMemOperand(Register(rn), 11561 align, 11562 PostIndex)); 11563 break; 11564 } 11565 case 0x00000600: { 11566 // 0xf900060d 11567 if (((instr & 0xe20) == 0x620) || 11568 ((instr & 0xf30) == 0xa30)) { 11569 UnallocatedT32(instr); 11570 return; 11571 } 11572 DataType dt = 11573 Dt_size_6_Decode((instr >> 6) & 0x3); 11574 if (dt.Is(kDataTypeValueInvalid)) { 11575 UnallocatedT32(instr); 11576 return; 11577 } 11578 Alignment align = 11579 Align_align_5_Decode((instr >> 4) & 0x3); 11580 if (dt.Is(kDataTypeValueInvalid) || 11581 align.Is(kBadAlignment)) { 11582 UnallocatedT32(instr); 11583 return; 11584 } 11585 unsigned first = 11586 ExtractDRegister(instr, 22, 12); 11587 unsigned length; 11588 SpacingType spacing = kSingle; 11589 switch ((instr >> 8) & 0xf) { 11590 default: 11591 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 11592 case 0x7: 11593 length = 1; 11594 break; 11595 case 0xa: 11596 length = 2; 11597 break; 11598 case 0x6: 11599 length = 3; 11600 break; 11601 case 0x2: 11602 length = 4; 11603 break; 11604 } 11605 unsigned last = first + length - 1; 11606 TransferType transfer = kMultipleLanes; 11607 unsigned rn = (instr >> 16) & 0xf; 11608 // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length) 11609 vst1(CurrentCond(), 11610 dt, 11611 NeonRegisterList(DRegister(first), 11612 DRegister(last), 11613 spacing, 11614 transfer), 11615 AlignedMemOperand(Register(rn), 11616 align, 11617 PostIndex)); 11618 break; 11619 } 11620 case 0x00000700: { 11621 // 0xf900070d 11622 if (((instr & 0xe20) == 0x620) || 11623 ((instr & 0xf30) == 0xa30)) { 11624 UnallocatedT32(instr); 11625 return; 11626 } 11627 DataType dt = 11628 Dt_size_6_Decode((instr >> 6) & 0x3); 11629 if (dt.Is(kDataTypeValueInvalid)) { 11630 UnallocatedT32(instr); 11631 return; 11632 } 11633 Alignment align = 11634 Align_align_5_Decode((instr >> 4) & 0x3); 11635 if (dt.Is(kDataTypeValueInvalid) || 11636 align.Is(kBadAlignment)) { 11637 UnallocatedT32(instr); 11638 return; 11639 } 11640 unsigned first = 11641 ExtractDRegister(instr, 22, 12); 11642 unsigned length; 11643 SpacingType spacing = kSingle; 11644 switch ((instr >> 8) & 0xf) { 11645 default: 11646 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 11647 case 0x7: 11648 length = 1; 11649 break; 11650 case 0xa: 11651 length = 2; 11652 break; 11653 case 0x6: 11654 length = 3; 11655 break; 11656 case 0x2: 11657 length = 4; 11658 break; 11659 } 11660 unsigned last = first + length - 1; 11661 TransferType transfer = kMultipleLanes; 11662 unsigned rn = (instr >> 16) & 0xf; 11663 // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length) 11664 vst1(CurrentCond(), 11665 dt, 11666 NeonRegisterList(DRegister(first), 11667 DRegister(last), 11668 spacing, 11669 transfer), 11670 AlignedMemOperand(Register(rn), 11671 align, 11672 PostIndex)); 11673 break; 11674 } 11675 case 0x00000800: { 11676 // 0xf900080d 11677 if (((instr & 0xe30) == 0x830)) { 11678 UnallocatedT32(instr); 11679 return; 11680 } 11681 DataType dt = 11682 Dt_size_7_Decode((instr >> 6) & 0x3); 11683 if (dt.Is(kDataTypeValueInvalid)) { 11684 UnallocatedT32(instr); 11685 return; 11686 } 11687 Alignment align = 11688 Align_align_2_Decode((instr >> 4) & 0x3); 11689 if (dt.Is(kDataTypeValueInvalid) || 11690 align.Is(kBadAlignment)) { 11691 UnallocatedT32(instr); 11692 return; 11693 } 11694 unsigned first = 11695 ExtractDRegister(instr, 22, 12); 11696 unsigned length; 11697 SpacingType spacing; 11698 switch ((instr >> 8) & 0xf) { 11699 default: 11700 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 11701 case 0x8: 11702 length = 2; 11703 spacing = kSingle; 11704 break; 11705 case 0x9: 11706 length = 2; 11707 spacing = kDouble; 11708 break; 11709 case 0x3: 11710 length = 4; 11711 spacing = kSingle; 11712 break; 11713 } 11714 unsigned last = 11715 first + 11716 (length - 1) * 11717 (spacing == kSingle ? 1 : 2); 11718 TransferType transfer = kMultipleLanes; 11719 unsigned rn = (instr >> 16) & 0xf; 11720 // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length) 11721 vst2(CurrentCond(), 11722 dt, 11723 NeonRegisterList(DRegister(first), 11724 DRegister(last), 11725 spacing, 11726 transfer), 11727 AlignedMemOperand(Register(rn), 11728 align, 11729 PostIndex)); 11730 break; 11731 } 11732 case 0x00000900: { 11733 // 0xf900090d 11734 if (((instr & 0xe30) == 0x830)) { 11735 UnallocatedT32(instr); 11736 return; 11737 } 11738 DataType dt = 11739 Dt_size_7_Decode((instr >> 6) & 0x3); 11740 if (dt.Is(kDataTypeValueInvalid)) { 11741 UnallocatedT32(instr); 11742 return; 11743 } 11744 Alignment align = 11745 Align_align_2_Decode((instr >> 4) & 0x3); 11746 if (dt.Is(kDataTypeValueInvalid) || 11747 align.Is(kBadAlignment)) { 11748 UnallocatedT32(instr); 11749 return; 11750 } 11751 unsigned first = 11752 ExtractDRegister(instr, 22, 12); 11753 unsigned length; 11754 SpacingType spacing; 11755 switch ((instr >> 8) & 0xf) { 11756 default: 11757 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 11758 case 0x8: 11759 length = 2; 11760 spacing = kSingle; 11761 break; 11762 case 0x9: 11763 length = 2; 11764 spacing = kDouble; 11765 break; 11766 case 0x3: 11767 length = 4; 11768 spacing = kSingle; 11769 break; 11770 } 11771 unsigned last = 11772 first + 11773 (length - 1) * 11774 (spacing == kSingle ? 1 : 2); 11775 TransferType transfer = kMultipleLanes; 11776 unsigned rn = (instr >> 16) & 0xf; 11777 // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length) 11778 vst2(CurrentCond(), 11779 dt, 11780 NeonRegisterList(DRegister(first), 11781 DRegister(last), 11782 spacing, 11783 transfer), 11784 AlignedMemOperand(Register(rn), 11785 align, 11786 PostIndex)); 11787 break; 11788 } 11789 case 0x00000a00: { 11790 // 0xf9000a0d 11791 if (((instr & 0xe20) == 0x620) || 11792 ((instr & 0xf30) == 0xa30)) { 11793 UnallocatedT32(instr); 11794 return; 11795 } 11796 DataType dt = 11797 Dt_size_6_Decode((instr >> 6) & 0x3); 11798 if (dt.Is(kDataTypeValueInvalid)) { 11799 UnallocatedT32(instr); 11800 return; 11801 } 11802 Alignment align = 11803 Align_align_5_Decode((instr >> 4) & 0x3); 11804 if (dt.Is(kDataTypeValueInvalid) || 11805 align.Is(kBadAlignment)) { 11806 UnallocatedT32(instr); 11807 return; 11808 } 11809 unsigned first = 11810 ExtractDRegister(instr, 22, 12); 11811 unsigned length; 11812 SpacingType spacing = kSingle; 11813 switch ((instr >> 8) & 0xf) { 11814 default: 11815 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 11816 case 0x7: 11817 length = 1; 11818 break; 11819 case 0xa: 11820 length = 2; 11821 break; 11822 case 0x6: 11823 length = 3; 11824 break; 11825 case 0x2: 11826 length = 4; 11827 break; 11828 } 11829 unsigned last = first + length - 1; 11830 TransferType transfer = kMultipleLanes; 11831 unsigned rn = (instr >> 16) & 0xf; 11832 // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length) 11833 vst1(CurrentCond(), 11834 dt, 11835 NeonRegisterList(DRegister(first), 11836 DRegister(last), 11837 spacing, 11838 transfer), 11839 AlignedMemOperand(Register(rn), 11840 align, 11841 PostIndex)); 11842 break; 11843 } 11844 default: 11845 UnallocatedT32(instr); 11846 break; 11847 } 11848 break; 11849 } 11850 case 0x00000002: { 11851 // 0xf900000f 11852 switch (instr & 0x00000f00) { 11853 case 0x00000000: { 11854 // 0xf900000d 11855 DataType dt = 11856 Dt_size_7_Decode((instr >> 6) & 0x3); 11857 if (dt.Is(kDataTypeValueInvalid)) { 11858 UnallocatedT32(instr); 11859 return; 11860 } 11861 Alignment align = 11862 Align_align_4_Decode((instr >> 4) & 0x3); 11863 if (dt.Is(kDataTypeValueInvalid) || 11864 align.Is(kBadAlignment)) { 11865 UnallocatedT32(instr); 11866 return; 11867 } 11868 unsigned first = 11869 ExtractDRegister(instr, 22, 12); 11870 unsigned length; 11871 SpacingType spacing; 11872 switch ((instr >> 8) & 0xf) { 11873 default: 11874 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 11875 case 0x0: 11876 length = 4; 11877 spacing = kSingle; 11878 break; 11879 case 0x1: 11880 length = 4; 11881 spacing = kDouble; 11882 break; 11883 } 11884 unsigned last = 11885 first + 11886 (length - 1) * 11887 (spacing == kSingle ? 1 : 2); 11888 TransferType transfer = kMultipleLanes; 11889 unsigned rn = (instr >> 16) & 0xf; 11890 // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length) 11891 vst4(CurrentCond(), 11892 dt, 11893 NeonRegisterList(DRegister(first), 11894 DRegister(last), 11895 spacing, 11896 transfer), 11897 AlignedMemOperand(Register(rn), 11898 align, 11899 Offset)); 11900 break; 11901 } 11902 case 0x00000100: { 11903 // 0xf900010d 11904 DataType dt = 11905 Dt_size_7_Decode((instr >> 6) & 0x3); 11906 if (dt.Is(kDataTypeValueInvalid)) { 11907 UnallocatedT32(instr); 11908 return; 11909 } 11910 Alignment align = 11911 Align_align_4_Decode((instr >> 4) & 0x3); 11912 if (dt.Is(kDataTypeValueInvalid) || 11913 align.Is(kBadAlignment)) { 11914 UnallocatedT32(instr); 11915 return; 11916 } 11917 unsigned first = 11918 ExtractDRegister(instr, 22, 12); 11919 unsigned length; 11920 SpacingType spacing; 11921 switch ((instr >> 8) & 0xf) { 11922 default: 11923 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 11924 case 0x0: 11925 length = 4; 11926 spacing = kSingle; 11927 break; 11928 case 0x1: 11929 length = 4; 11930 spacing = kDouble; 11931 break; 11932 } 11933 unsigned last = 11934 first + 11935 (length - 1) * 11936 (spacing == kSingle ? 1 : 2); 11937 TransferType transfer = kMultipleLanes; 11938 unsigned rn = (instr >> 16) & 0xf; 11939 // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length) 11940 vst4(CurrentCond(), 11941 dt, 11942 NeonRegisterList(DRegister(first), 11943 DRegister(last), 11944 spacing, 11945 transfer), 11946 AlignedMemOperand(Register(rn), 11947 align, 11948 Offset)); 11949 break; 11950 } 11951 case 0x00000200: { 11952 // 0xf900020d 11953 if (((instr & 0xe20) == 0x620) || 11954 ((instr & 0xf30) == 0xa30)) { 11955 UnallocatedT32(instr); 11956 return; 11957 } 11958 DataType dt = 11959 Dt_size_6_Decode((instr >> 6) & 0x3); 11960 if (dt.Is(kDataTypeValueInvalid)) { 11961 UnallocatedT32(instr); 11962 return; 11963 } 11964 Alignment align = 11965 Align_align_5_Decode((instr >> 4) & 0x3); 11966 if (dt.Is(kDataTypeValueInvalid) || 11967 align.Is(kBadAlignment)) { 11968 UnallocatedT32(instr); 11969 return; 11970 } 11971 unsigned first = 11972 ExtractDRegister(instr, 22, 12); 11973 unsigned length; 11974 SpacingType spacing = kSingle; 11975 switch ((instr >> 8) & 0xf) { 11976 default: 11977 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 11978 case 0x7: 11979 length = 1; 11980 break; 11981 case 0xa: 11982 length = 2; 11983 break; 11984 case 0x6: 11985 length = 3; 11986 break; 11987 case 0x2: 11988 length = 4; 11989 break; 11990 } 11991 unsigned last = first + length - 1; 11992 TransferType transfer = kMultipleLanes; 11993 unsigned rn = (instr >> 16) & 0xf; 11994 // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length) 11995 vst1(CurrentCond(), 11996 dt, 11997 NeonRegisterList(DRegister(first), 11998 DRegister(last), 11999 spacing, 12000 transfer), 12001 AlignedMemOperand(Register(rn), 12002 align, 12003 Offset)); 12004 break; 12005 } 12006 case 0x00000300: { 12007 // 0xf900030d 12008 if (((instr & 0xe30) == 0x830)) { 12009 UnallocatedT32(instr); 12010 return; 12011 } 12012 DataType dt = 12013 Dt_size_7_Decode((instr >> 6) & 0x3); 12014 if (dt.Is(kDataTypeValueInvalid)) { 12015 UnallocatedT32(instr); 12016 return; 12017 } 12018 Alignment align = 12019 Align_align_2_Decode((instr >> 4) & 0x3); 12020 if (dt.Is(kDataTypeValueInvalid) || 12021 align.Is(kBadAlignment)) { 12022 UnallocatedT32(instr); 12023 return; 12024 } 12025 unsigned first = 12026 ExtractDRegister(instr, 22, 12); 12027 unsigned length; 12028 SpacingType spacing; 12029 switch ((instr >> 8) & 0xf) { 12030 default: 12031 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 12032 case 0x8: 12033 length = 2; 12034 spacing = kSingle; 12035 break; 12036 case 0x9: 12037 length = 2; 12038 spacing = kDouble; 12039 break; 12040 case 0x3: 12041 length = 4; 12042 spacing = kSingle; 12043 break; 12044 } 12045 unsigned last = 12046 first + 12047 (length - 1) * 12048 (spacing == kSingle ? 1 : 2); 12049 TransferType transfer = kMultipleLanes; 12050 unsigned rn = (instr >> 16) & 0xf; 12051 // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length) 12052 vst2(CurrentCond(), 12053 dt, 12054 NeonRegisterList(DRegister(first), 12055 DRegister(last), 12056 spacing, 12057 transfer), 12058 AlignedMemOperand(Register(rn), 12059 align, 12060 Offset)); 12061 break; 12062 } 12063 case 0x00000400: { 12064 // 0xf900040d 12065 if (((instr & 0x20) == 0x20)) { 12066 UnallocatedT32(instr); 12067 return; 12068 } 12069 DataType dt = 12070 Dt_size_7_Decode((instr >> 6) & 0x3); 12071 if (dt.Is(kDataTypeValueInvalid)) { 12072 UnallocatedT32(instr); 12073 return; 12074 } 12075 Alignment align = 12076 Align_align_3_Decode((instr >> 4) & 0x3); 12077 if (dt.Is(kDataTypeValueInvalid) || 12078 align.Is(kBadAlignment)) { 12079 UnallocatedT32(instr); 12080 return; 12081 } 12082 unsigned first = 12083 ExtractDRegister(instr, 22, 12); 12084 unsigned length; 12085 SpacingType spacing; 12086 switch ((instr >> 8) & 0xf) { 12087 default: 12088 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 12089 case 0x4: 12090 length = 3; 12091 spacing = kSingle; 12092 break; 12093 case 0x5: 12094 length = 3; 12095 spacing = kDouble; 12096 break; 12097 } 12098 unsigned last = 12099 first + 12100 (length - 1) * 12101 (spacing == kSingle ? 1 : 2); 12102 TransferType transfer = kMultipleLanes; 12103 unsigned rn = (instr >> 16) & 0xf; 12104 // VST3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length) 12105 vst3(CurrentCond(), 12106 dt, 12107 NeonRegisterList(DRegister(first), 12108 DRegister(last), 12109 spacing, 12110 transfer), 12111 AlignedMemOperand(Register(rn), 12112 align, 12113 Offset)); 12114 break; 12115 } 12116 case 0x00000500: { 12117 // 0xf900050d 12118 if (((instr & 0x20) == 0x20)) { 12119 UnallocatedT32(instr); 12120 return; 12121 } 12122 DataType dt = 12123 Dt_size_7_Decode((instr >> 6) & 0x3); 12124 if (dt.Is(kDataTypeValueInvalid)) { 12125 UnallocatedT32(instr); 12126 return; 12127 } 12128 Alignment align = 12129 Align_align_3_Decode((instr >> 4) & 0x3); 12130 if (dt.Is(kDataTypeValueInvalid) || 12131 align.Is(kBadAlignment)) { 12132 UnallocatedT32(instr); 12133 return; 12134 } 12135 unsigned first = 12136 ExtractDRegister(instr, 22, 12); 12137 unsigned length; 12138 SpacingType spacing; 12139 switch ((instr >> 8) & 0xf) { 12140 default: 12141 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 12142 case 0x4: 12143 length = 3; 12144 spacing = kSingle; 12145 break; 12146 case 0x5: 12147 length = 3; 12148 spacing = kDouble; 12149 break; 12150 } 12151 unsigned last = 12152 first + 12153 (length - 1) * 12154 (spacing == kSingle ? 1 : 2); 12155 TransferType transfer = kMultipleLanes; 12156 unsigned rn = (instr >> 16) & 0xf; 12157 // VST3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length) 12158 vst3(CurrentCond(), 12159 dt, 12160 NeonRegisterList(DRegister(first), 12161 DRegister(last), 12162 spacing, 12163 transfer), 12164 AlignedMemOperand(Register(rn), 12165 align, 12166 Offset)); 12167 break; 12168 } 12169 case 0x00000600: { 12170 // 0xf900060d 12171 if (((instr & 0xe20) == 0x620) || 12172 ((instr & 0xf30) == 0xa30)) { 12173 UnallocatedT32(instr); 12174 return; 12175 } 12176 DataType dt = 12177 Dt_size_6_Decode((instr >> 6) & 0x3); 12178 if (dt.Is(kDataTypeValueInvalid)) { 12179 UnallocatedT32(instr); 12180 return; 12181 } 12182 Alignment align = 12183 Align_align_5_Decode((instr >> 4) & 0x3); 12184 if (dt.Is(kDataTypeValueInvalid) || 12185 align.Is(kBadAlignment)) { 12186 UnallocatedT32(instr); 12187 return; 12188 } 12189 unsigned first = 12190 ExtractDRegister(instr, 22, 12); 12191 unsigned length; 12192 SpacingType spacing = kSingle; 12193 switch ((instr >> 8) & 0xf) { 12194 default: 12195 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 12196 case 0x7: 12197 length = 1; 12198 break; 12199 case 0xa: 12200 length = 2; 12201 break; 12202 case 0x6: 12203 length = 3; 12204 break; 12205 case 0x2: 12206 length = 4; 12207 break; 12208 } 12209 unsigned last = first + length - 1; 12210 TransferType transfer = kMultipleLanes; 12211 unsigned rn = (instr >> 16) & 0xf; 12212 // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length) 12213 vst1(CurrentCond(), 12214 dt, 12215 NeonRegisterList(DRegister(first), 12216 DRegister(last), 12217 spacing, 12218 transfer), 12219 AlignedMemOperand(Register(rn), 12220 align, 12221 Offset)); 12222 break; 12223 } 12224 case 0x00000700: { 12225 // 0xf900070d 12226 if (((instr & 0xe20) == 0x620) || 12227 ((instr & 0xf30) == 0xa30)) { 12228 UnallocatedT32(instr); 12229 return; 12230 } 12231 DataType dt = 12232 Dt_size_6_Decode((instr >> 6) & 0x3); 12233 if (dt.Is(kDataTypeValueInvalid)) { 12234 UnallocatedT32(instr); 12235 return; 12236 } 12237 Alignment align = 12238 Align_align_5_Decode((instr >> 4) & 0x3); 12239 if (dt.Is(kDataTypeValueInvalid) || 12240 align.Is(kBadAlignment)) { 12241 UnallocatedT32(instr); 12242 return; 12243 } 12244 unsigned first = 12245 ExtractDRegister(instr, 22, 12); 12246 unsigned length; 12247 SpacingType spacing = kSingle; 12248 switch ((instr >> 8) & 0xf) { 12249 default: 12250 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 12251 case 0x7: 12252 length = 1; 12253 break; 12254 case 0xa: 12255 length = 2; 12256 break; 12257 case 0x6: 12258 length = 3; 12259 break; 12260 case 0x2: 12261 length = 4; 12262 break; 12263 } 12264 unsigned last = first + length - 1; 12265 TransferType transfer = kMultipleLanes; 12266 unsigned rn = (instr >> 16) & 0xf; 12267 // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length) 12268 vst1(CurrentCond(), 12269 dt, 12270 NeonRegisterList(DRegister(first), 12271 DRegister(last), 12272 spacing, 12273 transfer), 12274 AlignedMemOperand(Register(rn), 12275 align, 12276 Offset)); 12277 break; 12278 } 12279 case 0x00000800: { 12280 // 0xf900080d 12281 if (((instr & 0xe30) == 0x830)) { 12282 UnallocatedT32(instr); 12283 return; 12284 } 12285 DataType dt = 12286 Dt_size_7_Decode((instr >> 6) & 0x3); 12287 if (dt.Is(kDataTypeValueInvalid)) { 12288 UnallocatedT32(instr); 12289 return; 12290 } 12291 Alignment align = 12292 Align_align_2_Decode((instr >> 4) & 0x3); 12293 if (dt.Is(kDataTypeValueInvalid) || 12294 align.Is(kBadAlignment)) { 12295 UnallocatedT32(instr); 12296 return; 12297 } 12298 unsigned first = 12299 ExtractDRegister(instr, 22, 12); 12300 unsigned length; 12301 SpacingType spacing; 12302 switch ((instr >> 8) & 0xf) { 12303 default: 12304 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 12305 case 0x8: 12306 length = 2; 12307 spacing = kSingle; 12308 break; 12309 case 0x9: 12310 length = 2; 12311 spacing = kDouble; 12312 break; 12313 case 0x3: 12314 length = 4; 12315 spacing = kSingle; 12316 break; 12317 } 12318 unsigned last = 12319 first + 12320 (length - 1) * 12321 (spacing == kSingle ? 1 : 2); 12322 TransferType transfer = kMultipleLanes; 12323 unsigned rn = (instr >> 16) & 0xf; 12324 // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length) 12325 vst2(CurrentCond(), 12326 dt, 12327 NeonRegisterList(DRegister(first), 12328 DRegister(last), 12329 spacing, 12330 transfer), 12331 AlignedMemOperand(Register(rn), 12332 align, 12333 Offset)); 12334 break; 12335 } 12336 case 0x00000900: { 12337 // 0xf900090d 12338 if (((instr & 0xe30) == 0x830)) { 12339 UnallocatedT32(instr); 12340 return; 12341 } 12342 DataType dt = 12343 Dt_size_7_Decode((instr >> 6) & 0x3); 12344 if (dt.Is(kDataTypeValueInvalid)) { 12345 UnallocatedT32(instr); 12346 return; 12347 } 12348 Alignment align = 12349 Align_align_2_Decode((instr >> 4) & 0x3); 12350 if (dt.Is(kDataTypeValueInvalid) || 12351 align.Is(kBadAlignment)) { 12352 UnallocatedT32(instr); 12353 return; 12354 } 12355 unsigned first = 12356 ExtractDRegister(instr, 22, 12); 12357 unsigned length; 12358 SpacingType spacing; 12359 switch ((instr >> 8) & 0xf) { 12360 default: 12361 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 12362 case 0x8: 12363 length = 2; 12364 spacing = kSingle; 12365 break; 12366 case 0x9: 12367 length = 2; 12368 spacing = kDouble; 12369 break; 12370 case 0x3: 12371 length = 4; 12372 spacing = kSingle; 12373 break; 12374 } 12375 unsigned last = 12376 first + 12377 (length - 1) * 12378 (spacing == kSingle ? 1 : 2); 12379 TransferType transfer = kMultipleLanes; 12380 unsigned rn = (instr >> 16) & 0xf; 12381 // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length) 12382 vst2(CurrentCond(), 12383 dt, 12384 NeonRegisterList(DRegister(first), 12385 DRegister(last), 12386 spacing, 12387 transfer), 12388 AlignedMemOperand(Register(rn), 12389 align, 12390 Offset)); 12391 break; 12392 } 12393 case 0x00000a00: { 12394 // 0xf9000a0d 12395 if (((instr & 0xe20) == 0x620) || 12396 ((instr & 0xf30) == 0xa30)) { 12397 UnallocatedT32(instr); 12398 return; 12399 } 12400 DataType dt = 12401 Dt_size_6_Decode((instr >> 6) & 0x3); 12402 if (dt.Is(kDataTypeValueInvalid)) { 12403 UnallocatedT32(instr); 12404 return; 12405 } 12406 Alignment align = 12407 Align_align_5_Decode((instr >> 4) & 0x3); 12408 if (dt.Is(kDataTypeValueInvalid) || 12409 align.Is(kBadAlignment)) { 12410 UnallocatedT32(instr); 12411 return; 12412 } 12413 unsigned first = 12414 ExtractDRegister(instr, 22, 12); 12415 unsigned length; 12416 SpacingType spacing = kSingle; 12417 switch ((instr >> 8) & 0xf) { 12418 default: 12419 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 12420 case 0x7: 12421 length = 1; 12422 break; 12423 case 0xa: 12424 length = 2; 12425 break; 12426 case 0x6: 12427 length = 3; 12428 break; 12429 case 0x2: 12430 length = 4; 12431 break; 12432 } 12433 unsigned last = first + length - 1; 12434 TransferType transfer = kMultipleLanes; 12435 unsigned rn = (instr >> 16) & 0xf; 12436 // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length) 12437 vst1(CurrentCond(), 12438 dt, 12439 NeonRegisterList(DRegister(first), 12440 DRegister(last), 12441 spacing, 12442 transfer), 12443 AlignedMemOperand(Register(rn), 12444 align, 12445 Offset)); 12446 break; 12447 } 12448 default: 12449 UnallocatedT32(instr); 12450 break; 12451 } 12452 break; 12453 } 12454 } 12455 break; 12456 } 12457 default: { 12458 switch (instr & 0x00000f00) { 12459 case 0x00000000: { 12460 // 0xf9000000 12461 if (((instr & 0xd) == 0xd)) { 12462 UnallocatedT32(instr); 12463 return; 12464 } 12465 DataType dt = 12466 Dt_size_7_Decode((instr >> 6) & 0x3); 12467 if (dt.Is(kDataTypeValueInvalid)) { 12468 UnallocatedT32(instr); 12469 return; 12470 } 12471 Alignment align = 12472 Align_align_4_Decode((instr >> 4) & 0x3); 12473 if (dt.Is(kDataTypeValueInvalid) || 12474 align.Is(kBadAlignment)) { 12475 UnallocatedT32(instr); 12476 return; 12477 } 12478 unsigned first = ExtractDRegister(instr, 22, 12); 12479 unsigned length; 12480 SpacingType spacing; 12481 switch ((instr >> 8) & 0xf) { 12482 default: 12483 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 12484 case 0x0: 12485 length = 4; 12486 spacing = kSingle; 12487 break; 12488 case 0x1: 12489 length = 4; 12490 spacing = kDouble; 12491 break; 12492 } 12493 unsigned last = 12494 first + 12495 (length - 1) * (spacing == kSingle ? 1 : 2); 12496 TransferType transfer = kMultipleLanes; 12497 unsigned rn = (instr >> 16) & 0xf; 12498 unsigned rm = instr & 0xf; 12499 // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length) 12500 vst4(CurrentCond(), 12501 dt, 12502 NeonRegisterList(DRegister(first), 12503 DRegister(last), 12504 spacing, 12505 transfer), 12506 AlignedMemOperand(Register(rn), 12507 align, 12508 Register(rm), 12509 PostIndex)); 12510 break; 12511 } 12512 case 0x00000100: { 12513 // 0xf9000100 12514 if (((instr & 0xd) == 0xd)) { 12515 UnallocatedT32(instr); 12516 return; 12517 } 12518 DataType dt = 12519 Dt_size_7_Decode((instr >> 6) & 0x3); 12520 if (dt.Is(kDataTypeValueInvalid)) { 12521 UnallocatedT32(instr); 12522 return; 12523 } 12524 Alignment align = 12525 Align_align_4_Decode((instr >> 4) & 0x3); 12526 if (dt.Is(kDataTypeValueInvalid) || 12527 align.Is(kBadAlignment)) { 12528 UnallocatedT32(instr); 12529 return; 12530 } 12531 unsigned first = ExtractDRegister(instr, 22, 12); 12532 unsigned length; 12533 SpacingType spacing; 12534 switch ((instr >> 8) & 0xf) { 12535 default: 12536 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 12537 case 0x0: 12538 length = 4; 12539 spacing = kSingle; 12540 break; 12541 case 0x1: 12542 length = 4; 12543 spacing = kDouble; 12544 break; 12545 } 12546 unsigned last = 12547 first + 12548 (length - 1) * (spacing == kSingle ? 1 : 2); 12549 TransferType transfer = kMultipleLanes; 12550 unsigned rn = (instr >> 16) & 0xf; 12551 unsigned rm = instr & 0xf; 12552 // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length) 12553 vst4(CurrentCond(), 12554 dt, 12555 NeonRegisterList(DRegister(first), 12556 DRegister(last), 12557 spacing, 12558 transfer), 12559 AlignedMemOperand(Register(rn), 12560 align, 12561 Register(rm), 12562 PostIndex)); 12563 break; 12564 } 12565 case 0x00000200: { 12566 // 0xf9000200 12567 if (((instr & 0xd) == 0xd) || 12568 ((instr & 0xe20) == 0x620) || 12569 ((instr & 0xf30) == 0xa30)) { 12570 UnallocatedT32(instr); 12571 return; 12572 } 12573 DataType dt = 12574 Dt_size_6_Decode((instr >> 6) & 0x3); 12575 if (dt.Is(kDataTypeValueInvalid)) { 12576 UnallocatedT32(instr); 12577 return; 12578 } 12579 Alignment align = 12580 Align_align_5_Decode((instr >> 4) & 0x3); 12581 if (dt.Is(kDataTypeValueInvalid) || 12582 align.Is(kBadAlignment)) { 12583 UnallocatedT32(instr); 12584 return; 12585 } 12586 unsigned first = ExtractDRegister(instr, 22, 12); 12587 unsigned length; 12588 SpacingType spacing = kSingle; 12589 switch ((instr >> 8) & 0xf) { 12590 default: 12591 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 12592 case 0x7: 12593 length = 1; 12594 break; 12595 case 0xa: 12596 length = 2; 12597 break; 12598 case 0x6: 12599 length = 3; 12600 break; 12601 case 0x2: 12602 length = 4; 12603 break; 12604 } 12605 unsigned last = first + length - 1; 12606 TransferType transfer = kMultipleLanes; 12607 unsigned rn = (instr >> 16) & 0xf; 12608 unsigned rm = instr & 0xf; 12609 // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length) 12610 vst1(CurrentCond(), 12611 dt, 12612 NeonRegisterList(DRegister(first), 12613 DRegister(last), 12614 spacing, 12615 transfer), 12616 AlignedMemOperand(Register(rn), 12617 align, 12618 Register(rm), 12619 PostIndex)); 12620 break; 12621 } 12622 case 0x00000300: { 12623 // 0xf9000300 12624 if (((instr & 0xd) == 0xd) || 12625 ((instr & 0xe30) == 0x830)) { 12626 UnallocatedT32(instr); 12627 return; 12628 } 12629 DataType dt = 12630 Dt_size_7_Decode((instr >> 6) & 0x3); 12631 if (dt.Is(kDataTypeValueInvalid)) { 12632 UnallocatedT32(instr); 12633 return; 12634 } 12635 Alignment align = 12636 Align_align_2_Decode((instr >> 4) & 0x3); 12637 if (dt.Is(kDataTypeValueInvalid) || 12638 align.Is(kBadAlignment)) { 12639 UnallocatedT32(instr); 12640 return; 12641 } 12642 unsigned first = ExtractDRegister(instr, 22, 12); 12643 unsigned length; 12644 SpacingType spacing; 12645 switch ((instr >> 8) & 0xf) { 12646 default: 12647 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 12648 case 0x8: 12649 length = 2; 12650 spacing = kSingle; 12651 break; 12652 case 0x9: 12653 length = 2; 12654 spacing = kDouble; 12655 break; 12656 case 0x3: 12657 length = 4; 12658 spacing = kSingle; 12659 break; 12660 } 12661 unsigned last = 12662 first + 12663 (length - 1) * (spacing == kSingle ? 1 : 2); 12664 TransferType transfer = kMultipleLanes; 12665 unsigned rn = (instr >> 16) & 0xf; 12666 unsigned rm = instr & 0xf; 12667 // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length) 12668 vst2(CurrentCond(), 12669 dt, 12670 NeonRegisterList(DRegister(first), 12671 DRegister(last), 12672 spacing, 12673 transfer), 12674 AlignedMemOperand(Register(rn), 12675 align, 12676 Register(rm), 12677 PostIndex)); 12678 break; 12679 } 12680 case 0x00000400: { 12681 // 0xf9000400 12682 if (((instr & 0xd) == 0xd) || 12683 ((instr & 0x20) == 0x20)) { 12684 UnallocatedT32(instr); 12685 return; 12686 } 12687 DataType dt = 12688 Dt_size_7_Decode((instr >> 6) & 0x3); 12689 if (dt.Is(kDataTypeValueInvalid)) { 12690 UnallocatedT32(instr); 12691 return; 12692 } 12693 Alignment align = 12694 Align_align_3_Decode((instr >> 4) & 0x3); 12695 if (dt.Is(kDataTypeValueInvalid) || 12696 align.Is(kBadAlignment)) { 12697 UnallocatedT32(instr); 12698 return; 12699 } 12700 unsigned first = ExtractDRegister(instr, 22, 12); 12701 unsigned length; 12702 SpacingType spacing; 12703 switch ((instr >> 8) & 0xf) { 12704 default: 12705 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 12706 case 0x4: 12707 length = 3; 12708 spacing = kSingle; 12709 break; 12710 case 0x5: 12711 length = 3; 12712 spacing = kDouble; 12713 break; 12714 } 12715 unsigned last = 12716 first + 12717 (length - 1) * (spacing == kSingle ? 1 : 2); 12718 TransferType transfer = kMultipleLanes; 12719 unsigned rn = (instr >> 16) & 0xf; 12720 unsigned rm = instr & 0xf; 12721 // VST3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length) 12722 vst3(CurrentCond(), 12723 dt, 12724 NeonRegisterList(DRegister(first), 12725 DRegister(last), 12726 spacing, 12727 transfer), 12728 AlignedMemOperand(Register(rn), 12729 align, 12730 Register(rm), 12731 PostIndex)); 12732 break; 12733 } 12734 case 0x00000500: { 12735 // 0xf9000500 12736 if (((instr & 0xd) == 0xd) || 12737 ((instr & 0x20) == 0x20)) { 12738 UnallocatedT32(instr); 12739 return; 12740 } 12741 DataType dt = 12742 Dt_size_7_Decode((instr >> 6) & 0x3); 12743 if (dt.Is(kDataTypeValueInvalid)) { 12744 UnallocatedT32(instr); 12745 return; 12746 } 12747 Alignment align = 12748 Align_align_3_Decode((instr >> 4) & 0x3); 12749 if (dt.Is(kDataTypeValueInvalid) || 12750 align.Is(kBadAlignment)) { 12751 UnallocatedT32(instr); 12752 return; 12753 } 12754 unsigned first = ExtractDRegister(instr, 22, 12); 12755 unsigned length; 12756 SpacingType spacing; 12757 switch ((instr >> 8) & 0xf) { 12758 default: 12759 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 12760 case 0x4: 12761 length = 3; 12762 spacing = kSingle; 12763 break; 12764 case 0x5: 12765 length = 3; 12766 spacing = kDouble; 12767 break; 12768 } 12769 unsigned last = 12770 first + 12771 (length - 1) * (spacing == kSingle ? 1 : 2); 12772 TransferType transfer = kMultipleLanes; 12773 unsigned rn = (instr >> 16) & 0xf; 12774 unsigned rm = instr & 0xf; 12775 // VST3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length) 12776 vst3(CurrentCond(), 12777 dt, 12778 NeonRegisterList(DRegister(first), 12779 DRegister(last), 12780 spacing, 12781 transfer), 12782 AlignedMemOperand(Register(rn), 12783 align, 12784 Register(rm), 12785 PostIndex)); 12786 break; 12787 } 12788 case 0x00000600: { 12789 // 0xf9000600 12790 if (((instr & 0xd) == 0xd) || 12791 ((instr & 0xe20) == 0x620) || 12792 ((instr & 0xf30) == 0xa30)) { 12793 UnallocatedT32(instr); 12794 return; 12795 } 12796 DataType dt = 12797 Dt_size_6_Decode((instr >> 6) & 0x3); 12798 if (dt.Is(kDataTypeValueInvalid)) { 12799 UnallocatedT32(instr); 12800 return; 12801 } 12802 Alignment align = 12803 Align_align_5_Decode((instr >> 4) & 0x3); 12804 if (dt.Is(kDataTypeValueInvalid) || 12805 align.Is(kBadAlignment)) { 12806 UnallocatedT32(instr); 12807 return; 12808 } 12809 unsigned first = ExtractDRegister(instr, 22, 12); 12810 unsigned length; 12811 SpacingType spacing = kSingle; 12812 switch ((instr >> 8) & 0xf) { 12813 default: 12814 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 12815 case 0x7: 12816 length = 1; 12817 break; 12818 case 0xa: 12819 length = 2; 12820 break; 12821 case 0x6: 12822 length = 3; 12823 break; 12824 case 0x2: 12825 length = 4; 12826 break; 12827 } 12828 unsigned last = first + length - 1; 12829 TransferType transfer = kMultipleLanes; 12830 unsigned rn = (instr >> 16) & 0xf; 12831 unsigned rm = instr & 0xf; 12832 // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length) 12833 vst1(CurrentCond(), 12834 dt, 12835 NeonRegisterList(DRegister(first), 12836 DRegister(last), 12837 spacing, 12838 transfer), 12839 AlignedMemOperand(Register(rn), 12840 align, 12841 Register(rm), 12842 PostIndex)); 12843 break; 12844 } 12845 case 0x00000700: { 12846 // 0xf9000700 12847 if (((instr & 0xd) == 0xd) || 12848 ((instr & 0xe20) == 0x620) || 12849 ((instr & 0xf30) == 0xa30)) { 12850 UnallocatedT32(instr); 12851 return; 12852 } 12853 DataType dt = 12854 Dt_size_6_Decode((instr >> 6) & 0x3); 12855 if (dt.Is(kDataTypeValueInvalid)) { 12856 UnallocatedT32(instr); 12857 return; 12858 } 12859 Alignment align = 12860 Align_align_5_Decode((instr >> 4) & 0x3); 12861 if (dt.Is(kDataTypeValueInvalid) || 12862 align.Is(kBadAlignment)) { 12863 UnallocatedT32(instr); 12864 return; 12865 } 12866 unsigned first = ExtractDRegister(instr, 22, 12); 12867 unsigned length; 12868 SpacingType spacing = kSingle; 12869 switch ((instr >> 8) & 0xf) { 12870 default: 12871 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 12872 case 0x7: 12873 length = 1; 12874 break; 12875 case 0xa: 12876 length = 2; 12877 break; 12878 case 0x6: 12879 length = 3; 12880 break; 12881 case 0x2: 12882 length = 4; 12883 break; 12884 } 12885 unsigned last = first + length - 1; 12886 TransferType transfer = kMultipleLanes; 12887 unsigned rn = (instr >> 16) & 0xf; 12888 unsigned rm = instr & 0xf; 12889 // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length) 12890 vst1(CurrentCond(), 12891 dt, 12892 NeonRegisterList(DRegister(first), 12893 DRegister(last), 12894 spacing, 12895 transfer), 12896 AlignedMemOperand(Register(rn), 12897 align, 12898 Register(rm), 12899 PostIndex)); 12900 break; 12901 } 12902 case 0x00000800: { 12903 // 0xf9000800 12904 if (((instr & 0xd) == 0xd) || 12905 ((instr & 0xe30) == 0x830)) { 12906 UnallocatedT32(instr); 12907 return; 12908 } 12909 DataType dt = 12910 Dt_size_7_Decode((instr >> 6) & 0x3); 12911 if (dt.Is(kDataTypeValueInvalid)) { 12912 UnallocatedT32(instr); 12913 return; 12914 } 12915 Alignment align = 12916 Align_align_2_Decode((instr >> 4) & 0x3); 12917 if (dt.Is(kDataTypeValueInvalid) || 12918 align.Is(kBadAlignment)) { 12919 UnallocatedT32(instr); 12920 return; 12921 } 12922 unsigned first = ExtractDRegister(instr, 22, 12); 12923 unsigned length; 12924 SpacingType spacing; 12925 switch ((instr >> 8) & 0xf) { 12926 default: 12927 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 12928 case 0x8: 12929 length = 2; 12930 spacing = kSingle; 12931 break; 12932 case 0x9: 12933 length = 2; 12934 spacing = kDouble; 12935 break; 12936 case 0x3: 12937 length = 4; 12938 spacing = kSingle; 12939 break; 12940 } 12941 unsigned last = 12942 first + 12943 (length - 1) * (spacing == kSingle ? 1 : 2); 12944 TransferType transfer = kMultipleLanes; 12945 unsigned rn = (instr >> 16) & 0xf; 12946 unsigned rm = instr & 0xf; 12947 // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length) 12948 vst2(CurrentCond(), 12949 dt, 12950 NeonRegisterList(DRegister(first), 12951 DRegister(last), 12952 spacing, 12953 transfer), 12954 AlignedMemOperand(Register(rn), 12955 align, 12956 Register(rm), 12957 PostIndex)); 12958 break; 12959 } 12960 case 0x00000900: { 12961 // 0xf9000900 12962 if (((instr & 0xd) == 0xd) || 12963 ((instr & 0xe30) == 0x830)) { 12964 UnallocatedT32(instr); 12965 return; 12966 } 12967 DataType dt = 12968 Dt_size_7_Decode((instr >> 6) & 0x3); 12969 if (dt.Is(kDataTypeValueInvalid)) { 12970 UnallocatedT32(instr); 12971 return; 12972 } 12973 Alignment align = 12974 Align_align_2_Decode((instr >> 4) & 0x3); 12975 if (dt.Is(kDataTypeValueInvalid) || 12976 align.Is(kBadAlignment)) { 12977 UnallocatedT32(instr); 12978 return; 12979 } 12980 unsigned first = ExtractDRegister(instr, 22, 12); 12981 unsigned length; 12982 SpacingType spacing; 12983 switch ((instr >> 8) & 0xf) { 12984 default: 12985 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 12986 case 0x8: 12987 length = 2; 12988 spacing = kSingle; 12989 break; 12990 case 0x9: 12991 length = 2; 12992 spacing = kDouble; 12993 break; 12994 case 0x3: 12995 length = 4; 12996 spacing = kSingle; 12997 break; 12998 } 12999 unsigned last = 13000 first + 13001 (length - 1) * (spacing == kSingle ? 1 : 2); 13002 TransferType transfer = kMultipleLanes; 13003 unsigned rn = (instr >> 16) & 0xf; 13004 unsigned rm = instr & 0xf; 13005 // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length) 13006 vst2(CurrentCond(), 13007 dt, 13008 NeonRegisterList(DRegister(first), 13009 DRegister(last), 13010 spacing, 13011 transfer), 13012 AlignedMemOperand(Register(rn), 13013 align, 13014 Register(rm), 13015 PostIndex)); 13016 break; 13017 } 13018 case 0x00000a00: { 13019 // 0xf9000a00 13020 if (((instr & 0xd) == 0xd) || 13021 ((instr & 0xe20) == 0x620) || 13022 ((instr & 0xf30) == 0xa30)) { 13023 UnallocatedT32(instr); 13024 return; 13025 } 13026 DataType dt = 13027 Dt_size_6_Decode((instr >> 6) & 0x3); 13028 if (dt.Is(kDataTypeValueInvalid)) { 13029 UnallocatedT32(instr); 13030 return; 13031 } 13032 Alignment align = 13033 Align_align_5_Decode((instr >> 4) & 0x3); 13034 if (dt.Is(kDataTypeValueInvalid) || 13035 align.Is(kBadAlignment)) { 13036 UnallocatedT32(instr); 13037 return; 13038 } 13039 unsigned first = ExtractDRegister(instr, 22, 12); 13040 unsigned length; 13041 SpacingType spacing = kSingle; 13042 switch ((instr >> 8) & 0xf) { 13043 default: 13044 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 13045 case 0x7: 13046 length = 1; 13047 break; 13048 case 0xa: 13049 length = 2; 13050 break; 13051 case 0x6: 13052 length = 3; 13053 break; 13054 case 0x2: 13055 length = 4; 13056 break; 13057 } 13058 unsigned last = first + length - 1; 13059 TransferType transfer = kMultipleLanes; 13060 unsigned rn = (instr >> 16) & 0xf; 13061 unsigned rm = instr & 0xf; 13062 // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length) 13063 vst1(CurrentCond(), 13064 dt, 13065 NeonRegisterList(DRegister(first), 13066 DRegister(last), 13067 spacing, 13068 transfer), 13069 AlignedMemOperand(Register(rn), 13070 align, 13071 Register(rm), 13072 PostIndex)); 13073 break; 13074 } 13075 default: 13076 UnallocatedT32(instr); 13077 break; 13078 } 13079 break; 13080 } 13081 } 13082 break; 13083 } 13084 case 0x01200000: { 13085 // 0xf9200000 13086 switch (instr & 0x0000000d) { 13087 case 0x0000000d: { 13088 // 0xf920000d 13089 switch (instr & 0x00000002) { 13090 case 0x00000000: { 13091 // 0xf920000d 13092 switch (instr & 0x00000f00) { 13093 case 0x00000000: { 13094 // 0xf920000d 13095 DataType dt = 13096 Dt_size_7_Decode((instr >> 6) & 0x3); 13097 if (dt.Is(kDataTypeValueInvalid)) { 13098 UnallocatedT32(instr); 13099 return; 13100 } 13101 Alignment align = 13102 Align_align_4_Decode((instr >> 4) & 0x3); 13103 if (dt.Is(kDataTypeValueInvalid) || 13104 align.Is(kBadAlignment)) { 13105 UnallocatedT32(instr); 13106 return; 13107 } 13108 unsigned first = 13109 ExtractDRegister(instr, 22, 12); 13110 unsigned length; 13111 SpacingType spacing; 13112 switch ((instr >> 8) & 0xf) { 13113 default: 13114 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 13115 case 0x0: 13116 length = 4; 13117 spacing = kSingle; 13118 break; 13119 case 0x1: 13120 length = 4; 13121 spacing = kDouble; 13122 break; 13123 } 13124 unsigned last = 13125 first + 13126 (length - 1) * 13127 (spacing == kSingle ? 1 : 2); 13128 TransferType transfer = kMultipleLanes; 13129 unsigned rn = (instr >> 16) & 0xf; 13130 // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length) 13131 vld4(CurrentCond(), 13132 dt, 13133 NeonRegisterList(DRegister(first), 13134 DRegister(last), 13135 spacing, 13136 transfer), 13137 AlignedMemOperand(Register(rn), 13138 align, 13139 PostIndex)); 13140 break; 13141 } 13142 case 0x00000100: { 13143 // 0xf920010d 13144 DataType dt = 13145 Dt_size_7_Decode((instr >> 6) & 0x3); 13146 if (dt.Is(kDataTypeValueInvalid)) { 13147 UnallocatedT32(instr); 13148 return; 13149 } 13150 Alignment align = 13151 Align_align_4_Decode((instr >> 4) & 0x3); 13152 if (dt.Is(kDataTypeValueInvalid) || 13153 align.Is(kBadAlignment)) { 13154 UnallocatedT32(instr); 13155 return; 13156 } 13157 unsigned first = 13158 ExtractDRegister(instr, 22, 12); 13159 unsigned length; 13160 SpacingType spacing; 13161 switch ((instr >> 8) & 0xf) { 13162 default: 13163 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 13164 case 0x0: 13165 length = 4; 13166 spacing = kSingle; 13167 break; 13168 case 0x1: 13169 length = 4; 13170 spacing = kDouble; 13171 break; 13172 } 13173 unsigned last = 13174 first + 13175 (length - 1) * 13176 (spacing == kSingle ? 1 : 2); 13177 TransferType transfer = kMultipleLanes; 13178 unsigned rn = (instr >> 16) & 0xf; 13179 // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length) 13180 vld4(CurrentCond(), 13181 dt, 13182 NeonRegisterList(DRegister(first), 13183 DRegister(last), 13184 spacing, 13185 transfer), 13186 AlignedMemOperand(Register(rn), 13187 align, 13188 PostIndex)); 13189 break; 13190 } 13191 case 0x00000200: { 13192 // 0xf920020d 13193 if (((instr & 0xe20) == 0x620) || 13194 ((instr & 0xf30) == 0xa30)) { 13195 UnallocatedT32(instr); 13196 return; 13197 } 13198 DataType dt = 13199 Dt_size_6_Decode((instr >> 6) & 0x3); 13200 if (dt.Is(kDataTypeValueInvalid)) { 13201 UnallocatedT32(instr); 13202 return; 13203 } 13204 Alignment align = 13205 Align_align_1_Decode((instr >> 4) & 0x3); 13206 if (dt.Is(kDataTypeValueInvalid) || 13207 align.Is(kBadAlignment)) { 13208 UnallocatedT32(instr); 13209 return; 13210 } 13211 unsigned first = 13212 ExtractDRegister(instr, 22, 12); 13213 unsigned length; 13214 SpacingType spacing = kSingle; 13215 switch ((instr >> 8) & 0xf) { 13216 default: 13217 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 13218 case 0x7: 13219 length = 1; 13220 break; 13221 case 0xa: 13222 length = 2; 13223 break; 13224 case 0x6: 13225 length = 3; 13226 break; 13227 case 0x2: 13228 length = 4; 13229 break; 13230 } 13231 unsigned last = first + length - 1; 13232 TransferType transfer = kMultipleLanes; 13233 unsigned rn = (instr >> 16) & 0xf; 13234 // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length) 13235 vld1(CurrentCond(), 13236 dt, 13237 NeonRegisterList(DRegister(first), 13238 DRegister(last), 13239 spacing, 13240 transfer), 13241 AlignedMemOperand(Register(rn), 13242 align, 13243 PostIndex)); 13244 break; 13245 } 13246 case 0x00000300: { 13247 // 0xf920030d 13248 if (((instr & 0xe30) == 0x830)) { 13249 UnallocatedT32(instr); 13250 return; 13251 } 13252 DataType dt = 13253 Dt_size_7_Decode((instr >> 6) & 0x3); 13254 if (dt.Is(kDataTypeValueInvalid)) { 13255 UnallocatedT32(instr); 13256 return; 13257 } 13258 Alignment align = 13259 Align_align_2_Decode((instr >> 4) & 0x3); 13260 if (dt.Is(kDataTypeValueInvalid) || 13261 align.Is(kBadAlignment)) { 13262 UnallocatedT32(instr); 13263 return; 13264 } 13265 unsigned first = 13266 ExtractDRegister(instr, 22, 12); 13267 unsigned length; 13268 SpacingType spacing; 13269 switch ((instr >> 8) & 0xf) { 13270 default: 13271 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 13272 case 0x8: 13273 length = 2; 13274 spacing = kSingle; 13275 break; 13276 case 0x9: 13277 length = 2; 13278 spacing = kDouble; 13279 break; 13280 case 0x3: 13281 length = 4; 13282 spacing = kSingle; 13283 break; 13284 } 13285 unsigned last = 13286 first + 13287 (length - 1) * 13288 (spacing == kSingle ? 1 : 2); 13289 TransferType transfer = kMultipleLanes; 13290 unsigned rn = (instr >> 16) & 0xf; 13291 // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length) 13292 vld2(CurrentCond(), 13293 dt, 13294 NeonRegisterList(DRegister(first), 13295 DRegister(last), 13296 spacing, 13297 transfer), 13298 AlignedMemOperand(Register(rn), 13299 align, 13300 PostIndex)); 13301 break; 13302 } 13303 case 0x00000400: { 13304 // 0xf920040d 13305 DataType dt = 13306 Dt_size_7_Decode((instr >> 6) & 0x3); 13307 if (dt.Is(kDataTypeValueInvalid)) { 13308 UnallocatedT32(instr); 13309 return; 13310 } 13311 Alignment align = 13312 Align_align_3_Decode((instr >> 4) & 0x3); 13313 if (dt.Is(kDataTypeValueInvalid) || 13314 align.Is(kBadAlignment)) { 13315 UnallocatedT32(instr); 13316 return; 13317 } 13318 unsigned first = 13319 ExtractDRegister(instr, 22, 12); 13320 unsigned length; 13321 SpacingType spacing; 13322 switch ((instr >> 8) & 0xf) { 13323 default: 13324 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 13325 case 0x4: 13326 length = 3; 13327 spacing = kSingle; 13328 break; 13329 case 0x5: 13330 length = 3; 13331 spacing = kDouble; 13332 break; 13333 } 13334 unsigned last = 13335 first + 13336 (length - 1) * 13337 (spacing == kSingle ? 1 : 2); 13338 TransferType transfer = kMultipleLanes; 13339 unsigned rn = (instr >> 16) & 0xf; 13340 // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length) 13341 vld3(CurrentCond(), 13342 dt, 13343 NeonRegisterList(DRegister(first), 13344 DRegister(last), 13345 spacing, 13346 transfer), 13347 AlignedMemOperand(Register(rn), 13348 align, 13349 PostIndex)); 13350 break; 13351 } 13352 case 0x00000500: { 13353 // 0xf920050d 13354 DataType dt = 13355 Dt_size_7_Decode((instr >> 6) & 0x3); 13356 if (dt.Is(kDataTypeValueInvalid)) { 13357 UnallocatedT32(instr); 13358 return; 13359 } 13360 Alignment align = 13361 Align_align_3_Decode((instr >> 4) & 0x3); 13362 if (dt.Is(kDataTypeValueInvalid) || 13363 align.Is(kBadAlignment)) { 13364 UnallocatedT32(instr); 13365 return; 13366 } 13367 unsigned first = 13368 ExtractDRegister(instr, 22, 12); 13369 unsigned length; 13370 SpacingType spacing; 13371 switch ((instr >> 8) & 0xf) { 13372 default: 13373 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 13374 case 0x4: 13375 length = 3; 13376 spacing = kSingle; 13377 break; 13378 case 0x5: 13379 length = 3; 13380 spacing = kDouble; 13381 break; 13382 } 13383 unsigned last = 13384 first + 13385 (length - 1) * 13386 (spacing == kSingle ? 1 : 2); 13387 TransferType transfer = kMultipleLanes; 13388 unsigned rn = (instr >> 16) & 0xf; 13389 // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length) 13390 vld3(CurrentCond(), 13391 dt, 13392 NeonRegisterList(DRegister(first), 13393 DRegister(last), 13394 spacing, 13395 transfer), 13396 AlignedMemOperand(Register(rn), 13397 align, 13398 PostIndex)); 13399 break; 13400 } 13401 case 0x00000600: { 13402 // 0xf920060d 13403 if (((instr & 0xe20) == 0x620) || 13404 ((instr & 0xf30) == 0xa30)) { 13405 UnallocatedT32(instr); 13406 return; 13407 } 13408 DataType dt = 13409 Dt_size_6_Decode((instr >> 6) & 0x3); 13410 if (dt.Is(kDataTypeValueInvalid)) { 13411 UnallocatedT32(instr); 13412 return; 13413 } 13414 Alignment align = 13415 Align_align_1_Decode((instr >> 4) & 0x3); 13416 if (dt.Is(kDataTypeValueInvalid) || 13417 align.Is(kBadAlignment)) { 13418 UnallocatedT32(instr); 13419 return; 13420 } 13421 unsigned first = 13422 ExtractDRegister(instr, 22, 12); 13423 unsigned length; 13424 SpacingType spacing = kSingle; 13425 switch ((instr >> 8) & 0xf) { 13426 default: 13427 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 13428 case 0x7: 13429 length = 1; 13430 break; 13431 case 0xa: 13432 length = 2; 13433 break; 13434 case 0x6: 13435 length = 3; 13436 break; 13437 case 0x2: 13438 length = 4; 13439 break; 13440 } 13441 unsigned last = first + length - 1; 13442 TransferType transfer = kMultipleLanes; 13443 unsigned rn = (instr >> 16) & 0xf; 13444 // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length) 13445 vld1(CurrentCond(), 13446 dt, 13447 NeonRegisterList(DRegister(first), 13448 DRegister(last), 13449 spacing, 13450 transfer), 13451 AlignedMemOperand(Register(rn), 13452 align, 13453 PostIndex)); 13454 break; 13455 } 13456 case 0x00000700: { 13457 // 0xf920070d 13458 if (((instr & 0xe20) == 0x620) || 13459 ((instr & 0xf30) == 0xa30)) { 13460 UnallocatedT32(instr); 13461 return; 13462 } 13463 DataType dt = 13464 Dt_size_6_Decode((instr >> 6) & 0x3); 13465 if (dt.Is(kDataTypeValueInvalid)) { 13466 UnallocatedT32(instr); 13467 return; 13468 } 13469 Alignment align = 13470 Align_align_1_Decode((instr >> 4) & 0x3); 13471 if (dt.Is(kDataTypeValueInvalid) || 13472 align.Is(kBadAlignment)) { 13473 UnallocatedT32(instr); 13474 return; 13475 } 13476 unsigned first = 13477 ExtractDRegister(instr, 22, 12); 13478 unsigned length; 13479 SpacingType spacing = kSingle; 13480 switch ((instr >> 8) & 0xf) { 13481 default: 13482 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 13483 case 0x7: 13484 length = 1; 13485 break; 13486 case 0xa: 13487 length = 2; 13488 break; 13489 case 0x6: 13490 length = 3; 13491 break; 13492 case 0x2: 13493 length = 4; 13494 break; 13495 } 13496 unsigned last = first + length - 1; 13497 TransferType transfer = kMultipleLanes; 13498 unsigned rn = (instr >> 16) & 0xf; 13499 // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length) 13500 vld1(CurrentCond(), 13501 dt, 13502 NeonRegisterList(DRegister(first), 13503 DRegister(last), 13504 spacing, 13505 transfer), 13506 AlignedMemOperand(Register(rn), 13507 align, 13508 PostIndex)); 13509 break; 13510 } 13511 case 0x00000800: { 13512 // 0xf920080d 13513 if (((instr & 0xe30) == 0x830)) { 13514 UnallocatedT32(instr); 13515 return; 13516 } 13517 DataType dt = 13518 Dt_size_7_Decode((instr >> 6) & 0x3); 13519 if (dt.Is(kDataTypeValueInvalid)) { 13520 UnallocatedT32(instr); 13521 return; 13522 } 13523 Alignment align = 13524 Align_align_2_Decode((instr >> 4) & 0x3); 13525 if (dt.Is(kDataTypeValueInvalid) || 13526 align.Is(kBadAlignment)) { 13527 UnallocatedT32(instr); 13528 return; 13529 } 13530 unsigned first = 13531 ExtractDRegister(instr, 22, 12); 13532 unsigned length; 13533 SpacingType spacing; 13534 switch ((instr >> 8) & 0xf) { 13535 default: 13536 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 13537 case 0x8: 13538 length = 2; 13539 spacing = kSingle; 13540 break; 13541 case 0x9: 13542 length = 2; 13543 spacing = kDouble; 13544 break; 13545 case 0x3: 13546 length = 4; 13547 spacing = kSingle; 13548 break; 13549 } 13550 unsigned last = 13551 first + 13552 (length - 1) * 13553 (spacing == kSingle ? 1 : 2); 13554 TransferType transfer = kMultipleLanes; 13555 unsigned rn = (instr >> 16) & 0xf; 13556 // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length) 13557 vld2(CurrentCond(), 13558 dt, 13559 NeonRegisterList(DRegister(first), 13560 DRegister(last), 13561 spacing, 13562 transfer), 13563 AlignedMemOperand(Register(rn), 13564 align, 13565 PostIndex)); 13566 break; 13567 } 13568 case 0x00000900: { 13569 // 0xf920090d 13570 if (((instr & 0xe30) == 0x830)) { 13571 UnallocatedT32(instr); 13572 return; 13573 } 13574 DataType dt = 13575 Dt_size_7_Decode((instr >> 6) & 0x3); 13576 if (dt.Is(kDataTypeValueInvalid)) { 13577 UnallocatedT32(instr); 13578 return; 13579 } 13580 Alignment align = 13581 Align_align_2_Decode((instr >> 4) & 0x3); 13582 if (dt.Is(kDataTypeValueInvalid) || 13583 align.Is(kBadAlignment)) { 13584 UnallocatedT32(instr); 13585 return; 13586 } 13587 unsigned first = 13588 ExtractDRegister(instr, 22, 12); 13589 unsigned length; 13590 SpacingType spacing; 13591 switch ((instr >> 8) & 0xf) { 13592 default: 13593 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 13594 case 0x8: 13595 length = 2; 13596 spacing = kSingle; 13597 break; 13598 case 0x9: 13599 length = 2; 13600 spacing = kDouble; 13601 break; 13602 case 0x3: 13603 length = 4; 13604 spacing = kSingle; 13605 break; 13606 } 13607 unsigned last = 13608 first + 13609 (length - 1) * 13610 (spacing == kSingle ? 1 : 2); 13611 TransferType transfer = kMultipleLanes; 13612 unsigned rn = (instr >> 16) & 0xf; 13613 // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length) 13614 vld2(CurrentCond(), 13615 dt, 13616 NeonRegisterList(DRegister(first), 13617 DRegister(last), 13618 spacing, 13619 transfer), 13620 AlignedMemOperand(Register(rn), 13621 align, 13622 PostIndex)); 13623 break; 13624 } 13625 case 0x00000a00: { 13626 // 0xf9200a0d 13627 if (((instr & 0xe20) == 0x620) || 13628 ((instr & 0xf30) == 0xa30)) { 13629 UnallocatedT32(instr); 13630 return; 13631 } 13632 DataType dt = 13633 Dt_size_6_Decode((instr >> 6) & 0x3); 13634 if (dt.Is(kDataTypeValueInvalid)) { 13635 UnallocatedT32(instr); 13636 return; 13637 } 13638 Alignment align = 13639 Align_align_1_Decode((instr >> 4) & 0x3); 13640 if (dt.Is(kDataTypeValueInvalid) || 13641 align.Is(kBadAlignment)) { 13642 UnallocatedT32(instr); 13643 return; 13644 } 13645 unsigned first = 13646 ExtractDRegister(instr, 22, 12); 13647 unsigned length; 13648 SpacingType spacing = kSingle; 13649 switch ((instr >> 8) & 0xf) { 13650 default: 13651 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 13652 case 0x7: 13653 length = 1; 13654 break; 13655 case 0xa: 13656 length = 2; 13657 break; 13658 case 0x6: 13659 length = 3; 13660 break; 13661 case 0x2: 13662 length = 4; 13663 break; 13664 } 13665 unsigned last = first + length - 1; 13666 TransferType transfer = kMultipleLanes; 13667 unsigned rn = (instr >> 16) & 0xf; 13668 // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length) 13669 vld1(CurrentCond(), 13670 dt, 13671 NeonRegisterList(DRegister(first), 13672 DRegister(last), 13673 spacing, 13674 transfer), 13675 AlignedMemOperand(Register(rn), 13676 align, 13677 PostIndex)); 13678 break; 13679 } 13680 default: 13681 UnallocatedT32(instr); 13682 break; 13683 } 13684 break; 13685 } 13686 case 0x00000002: { 13687 // 0xf920000f 13688 switch (instr & 0x00000f00) { 13689 case 0x00000000: { 13690 // 0xf920000d 13691 DataType dt = 13692 Dt_size_7_Decode((instr >> 6) & 0x3); 13693 if (dt.Is(kDataTypeValueInvalid)) { 13694 UnallocatedT32(instr); 13695 return; 13696 } 13697 Alignment align = 13698 Align_align_4_Decode((instr >> 4) & 0x3); 13699 if (dt.Is(kDataTypeValueInvalid) || 13700 align.Is(kBadAlignment)) { 13701 UnallocatedT32(instr); 13702 return; 13703 } 13704 unsigned first = 13705 ExtractDRegister(instr, 22, 12); 13706 unsigned length; 13707 SpacingType spacing; 13708 switch ((instr >> 8) & 0xf) { 13709 default: 13710 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 13711 case 0x0: 13712 length = 4; 13713 spacing = kSingle; 13714 break; 13715 case 0x1: 13716 length = 4; 13717 spacing = kDouble; 13718 break; 13719 } 13720 unsigned last = 13721 first + 13722 (length - 1) * 13723 (spacing == kSingle ? 1 : 2); 13724 TransferType transfer = kMultipleLanes; 13725 unsigned rn = (instr >> 16) & 0xf; 13726 // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length) 13727 vld4(CurrentCond(), 13728 dt, 13729 NeonRegisterList(DRegister(first), 13730 DRegister(last), 13731 spacing, 13732 transfer), 13733 AlignedMemOperand(Register(rn), 13734 align, 13735 Offset)); 13736 break; 13737 } 13738 case 0x00000100: { 13739 // 0xf920010d 13740 DataType dt = 13741 Dt_size_7_Decode((instr >> 6) & 0x3); 13742 if (dt.Is(kDataTypeValueInvalid)) { 13743 UnallocatedT32(instr); 13744 return; 13745 } 13746 Alignment align = 13747 Align_align_4_Decode((instr >> 4) & 0x3); 13748 if (dt.Is(kDataTypeValueInvalid) || 13749 align.Is(kBadAlignment)) { 13750 UnallocatedT32(instr); 13751 return; 13752 } 13753 unsigned first = 13754 ExtractDRegister(instr, 22, 12); 13755 unsigned length; 13756 SpacingType spacing; 13757 switch ((instr >> 8) & 0xf) { 13758 default: 13759 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 13760 case 0x0: 13761 length = 4; 13762 spacing = kSingle; 13763 break; 13764 case 0x1: 13765 length = 4; 13766 spacing = kDouble; 13767 break; 13768 } 13769 unsigned last = 13770 first + 13771 (length - 1) * 13772 (spacing == kSingle ? 1 : 2); 13773 TransferType transfer = kMultipleLanes; 13774 unsigned rn = (instr >> 16) & 0xf; 13775 // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length) 13776 vld4(CurrentCond(), 13777 dt, 13778 NeonRegisterList(DRegister(first), 13779 DRegister(last), 13780 spacing, 13781 transfer), 13782 AlignedMemOperand(Register(rn), 13783 align, 13784 Offset)); 13785 break; 13786 } 13787 case 0x00000200: { 13788 // 0xf920020d 13789 if (((instr & 0xe20) == 0x620) || 13790 ((instr & 0xf30) == 0xa30)) { 13791 UnallocatedT32(instr); 13792 return; 13793 } 13794 DataType dt = 13795 Dt_size_6_Decode((instr >> 6) & 0x3); 13796 if (dt.Is(kDataTypeValueInvalid)) { 13797 UnallocatedT32(instr); 13798 return; 13799 } 13800 Alignment align = 13801 Align_align_1_Decode((instr >> 4) & 0x3); 13802 if (dt.Is(kDataTypeValueInvalid) || 13803 align.Is(kBadAlignment)) { 13804 UnallocatedT32(instr); 13805 return; 13806 } 13807 unsigned first = 13808 ExtractDRegister(instr, 22, 12); 13809 unsigned length; 13810 SpacingType spacing = kSingle; 13811 switch ((instr >> 8) & 0xf) { 13812 default: 13813 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 13814 case 0x7: 13815 length = 1; 13816 break; 13817 case 0xa: 13818 length = 2; 13819 break; 13820 case 0x6: 13821 length = 3; 13822 break; 13823 case 0x2: 13824 length = 4; 13825 break; 13826 } 13827 unsigned last = first + length - 1; 13828 TransferType transfer = kMultipleLanes; 13829 unsigned rn = (instr >> 16) & 0xf; 13830 // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length) 13831 vld1(CurrentCond(), 13832 dt, 13833 NeonRegisterList(DRegister(first), 13834 DRegister(last), 13835 spacing, 13836 transfer), 13837 AlignedMemOperand(Register(rn), 13838 align, 13839 Offset)); 13840 break; 13841 } 13842 case 0x00000300: { 13843 // 0xf920030d 13844 if (((instr & 0xe30) == 0x830)) { 13845 UnallocatedT32(instr); 13846 return; 13847 } 13848 DataType dt = 13849 Dt_size_7_Decode((instr >> 6) & 0x3); 13850 if (dt.Is(kDataTypeValueInvalid)) { 13851 UnallocatedT32(instr); 13852 return; 13853 } 13854 Alignment align = 13855 Align_align_2_Decode((instr >> 4) & 0x3); 13856 if (dt.Is(kDataTypeValueInvalid) || 13857 align.Is(kBadAlignment)) { 13858 UnallocatedT32(instr); 13859 return; 13860 } 13861 unsigned first = 13862 ExtractDRegister(instr, 22, 12); 13863 unsigned length; 13864 SpacingType spacing; 13865 switch ((instr >> 8) & 0xf) { 13866 default: 13867 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 13868 case 0x8: 13869 length = 2; 13870 spacing = kSingle; 13871 break; 13872 case 0x9: 13873 length = 2; 13874 spacing = kDouble; 13875 break; 13876 case 0x3: 13877 length = 4; 13878 spacing = kSingle; 13879 break; 13880 } 13881 unsigned last = 13882 first + 13883 (length - 1) * 13884 (spacing == kSingle ? 1 : 2); 13885 TransferType transfer = kMultipleLanes; 13886 unsigned rn = (instr >> 16) & 0xf; 13887 // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length) 13888 vld2(CurrentCond(), 13889 dt, 13890 NeonRegisterList(DRegister(first), 13891 DRegister(last), 13892 spacing, 13893 transfer), 13894 AlignedMemOperand(Register(rn), 13895 align, 13896 Offset)); 13897 break; 13898 } 13899 case 0x00000400: { 13900 // 0xf920040d 13901 DataType dt = 13902 Dt_size_7_Decode((instr >> 6) & 0x3); 13903 if (dt.Is(kDataTypeValueInvalid)) { 13904 UnallocatedT32(instr); 13905 return; 13906 } 13907 Alignment align = 13908 Align_align_3_Decode((instr >> 4) & 0x3); 13909 if (dt.Is(kDataTypeValueInvalid) || 13910 align.Is(kBadAlignment)) { 13911 UnallocatedT32(instr); 13912 return; 13913 } 13914 unsigned first = 13915 ExtractDRegister(instr, 22, 12); 13916 unsigned length; 13917 SpacingType spacing; 13918 switch ((instr >> 8) & 0xf) { 13919 default: 13920 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 13921 case 0x4: 13922 length = 3; 13923 spacing = kSingle; 13924 break; 13925 case 0x5: 13926 length = 3; 13927 spacing = kDouble; 13928 break; 13929 } 13930 unsigned last = 13931 first + 13932 (length - 1) * 13933 (spacing == kSingle ? 1 : 2); 13934 TransferType transfer = kMultipleLanes; 13935 unsigned rn = (instr >> 16) & 0xf; 13936 // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length) 13937 vld3(CurrentCond(), 13938 dt, 13939 NeonRegisterList(DRegister(first), 13940 DRegister(last), 13941 spacing, 13942 transfer), 13943 AlignedMemOperand(Register(rn), 13944 align, 13945 Offset)); 13946 break; 13947 } 13948 case 0x00000500: { 13949 // 0xf920050d 13950 DataType dt = 13951 Dt_size_7_Decode((instr >> 6) & 0x3); 13952 if (dt.Is(kDataTypeValueInvalid)) { 13953 UnallocatedT32(instr); 13954 return; 13955 } 13956 Alignment align = 13957 Align_align_3_Decode((instr >> 4) & 0x3); 13958 if (dt.Is(kDataTypeValueInvalid) || 13959 align.Is(kBadAlignment)) { 13960 UnallocatedT32(instr); 13961 return; 13962 } 13963 unsigned first = 13964 ExtractDRegister(instr, 22, 12); 13965 unsigned length; 13966 SpacingType spacing; 13967 switch ((instr >> 8) & 0xf) { 13968 default: 13969 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 13970 case 0x4: 13971 length = 3; 13972 spacing = kSingle; 13973 break; 13974 case 0x5: 13975 length = 3; 13976 spacing = kDouble; 13977 break; 13978 } 13979 unsigned last = 13980 first + 13981 (length - 1) * 13982 (spacing == kSingle ? 1 : 2); 13983 TransferType transfer = kMultipleLanes; 13984 unsigned rn = (instr >> 16) & 0xf; 13985 // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length) 13986 vld3(CurrentCond(), 13987 dt, 13988 NeonRegisterList(DRegister(first), 13989 DRegister(last), 13990 spacing, 13991 transfer), 13992 AlignedMemOperand(Register(rn), 13993 align, 13994 Offset)); 13995 break; 13996 } 13997 case 0x00000600: { 13998 // 0xf920060d 13999 if (((instr & 0xe20) == 0x620) || 14000 ((instr & 0xf30) == 0xa30)) { 14001 UnallocatedT32(instr); 14002 return; 14003 } 14004 DataType dt = 14005 Dt_size_6_Decode((instr >> 6) & 0x3); 14006 if (dt.Is(kDataTypeValueInvalid)) { 14007 UnallocatedT32(instr); 14008 return; 14009 } 14010 Alignment align = 14011 Align_align_1_Decode((instr >> 4) & 0x3); 14012 if (dt.Is(kDataTypeValueInvalid) || 14013 align.Is(kBadAlignment)) { 14014 UnallocatedT32(instr); 14015 return; 14016 } 14017 unsigned first = 14018 ExtractDRegister(instr, 22, 12); 14019 unsigned length; 14020 SpacingType spacing = kSingle; 14021 switch ((instr >> 8) & 0xf) { 14022 default: 14023 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 14024 case 0x7: 14025 length = 1; 14026 break; 14027 case 0xa: 14028 length = 2; 14029 break; 14030 case 0x6: 14031 length = 3; 14032 break; 14033 case 0x2: 14034 length = 4; 14035 break; 14036 } 14037 unsigned last = first + length - 1; 14038 TransferType transfer = kMultipleLanes; 14039 unsigned rn = (instr >> 16) & 0xf; 14040 // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length) 14041 vld1(CurrentCond(), 14042 dt, 14043 NeonRegisterList(DRegister(first), 14044 DRegister(last), 14045 spacing, 14046 transfer), 14047 AlignedMemOperand(Register(rn), 14048 align, 14049 Offset)); 14050 break; 14051 } 14052 case 0x00000700: { 14053 // 0xf920070d 14054 if (((instr & 0xe20) == 0x620) || 14055 ((instr & 0xf30) == 0xa30)) { 14056 UnallocatedT32(instr); 14057 return; 14058 } 14059 DataType dt = 14060 Dt_size_6_Decode((instr >> 6) & 0x3); 14061 if (dt.Is(kDataTypeValueInvalid)) { 14062 UnallocatedT32(instr); 14063 return; 14064 } 14065 Alignment align = 14066 Align_align_1_Decode((instr >> 4) & 0x3); 14067 if (dt.Is(kDataTypeValueInvalid) || 14068 align.Is(kBadAlignment)) { 14069 UnallocatedT32(instr); 14070 return; 14071 } 14072 unsigned first = 14073 ExtractDRegister(instr, 22, 12); 14074 unsigned length; 14075 SpacingType spacing = kSingle; 14076 switch ((instr >> 8) & 0xf) { 14077 default: 14078 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 14079 case 0x7: 14080 length = 1; 14081 break; 14082 case 0xa: 14083 length = 2; 14084 break; 14085 case 0x6: 14086 length = 3; 14087 break; 14088 case 0x2: 14089 length = 4; 14090 break; 14091 } 14092 unsigned last = first + length - 1; 14093 TransferType transfer = kMultipleLanes; 14094 unsigned rn = (instr >> 16) & 0xf; 14095 // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length) 14096 vld1(CurrentCond(), 14097 dt, 14098 NeonRegisterList(DRegister(first), 14099 DRegister(last), 14100 spacing, 14101 transfer), 14102 AlignedMemOperand(Register(rn), 14103 align, 14104 Offset)); 14105 break; 14106 } 14107 case 0x00000800: { 14108 // 0xf920080d 14109 if (((instr & 0xe30) == 0x830)) { 14110 UnallocatedT32(instr); 14111 return; 14112 } 14113 DataType dt = 14114 Dt_size_7_Decode((instr >> 6) & 0x3); 14115 if (dt.Is(kDataTypeValueInvalid)) { 14116 UnallocatedT32(instr); 14117 return; 14118 } 14119 Alignment align = 14120 Align_align_2_Decode((instr >> 4) & 0x3); 14121 if (dt.Is(kDataTypeValueInvalid) || 14122 align.Is(kBadAlignment)) { 14123 UnallocatedT32(instr); 14124 return; 14125 } 14126 unsigned first = 14127 ExtractDRegister(instr, 22, 12); 14128 unsigned length; 14129 SpacingType spacing; 14130 switch ((instr >> 8) & 0xf) { 14131 default: 14132 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 14133 case 0x8: 14134 length = 2; 14135 spacing = kSingle; 14136 break; 14137 case 0x9: 14138 length = 2; 14139 spacing = kDouble; 14140 break; 14141 case 0x3: 14142 length = 4; 14143 spacing = kSingle; 14144 break; 14145 } 14146 unsigned last = 14147 first + 14148 (length - 1) * 14149 (spacing == kSingle ? 1 : 2); 14150 TransferType transfer = kMultipleLanes; 14151 unsigned rn = (instr >> 16) & 0xf; 14152 // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length) 14153 vld2(CurrentCond(), 14154 dt, 14155 NeonRegisterList(DRegister(first), 14156 DRegister(last), 14157 spacing, 14158 transfer), 14159 AlignedMemOperand(Register(rn), 14160 align, 14161 Offset)); 14162 break; 14163 } 14164 case 0x00000900: { 14165 // 0xf920090d 14166 if (((instr & 0xe30) == 0x830)) { 14167 UnallocatedT32(instr); 14168 return; 14169 } 14170 DataType dt = 14171 Dt_size_7_Decode((instr >> 6) & 0x3); 14172 if (dt.Is(kDataTypeValueInvalid)) { 14173 UnallocatedT32(instr); 14174 return; 14175 } 14176 Alignment align = 14177 Align_align_2_Decode((instr >> 4) & 0x3); 14178 if (dt.Is(kDataTypeValueInvalid) || 14179 align.Is(kBadAlignment)) { 14180 UnallocatedT32(instr); 14181 return; 14182 } 14183 unsigned first = 14184 ExtractDRegister(instr, 22, 12); 14185 unsigned length; 14186 SpacingType spacing; 14187 switch ((instr >> 8) & 0xf) { 14188 default: 14189 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 14190 case 0x8: 14191 length = 2; 14192 spacing = kSingle; 14193 break; 14194 case 0x9: 14195 length = 2; 14196 spacing = kDouble; 14197 break; 14198 case 0x3: 14199 length = 4; 14200 spacing = kSingle; 14201 break; 14202 } 14203 unsigned last = 14204 first + 14205 (length - 1) * 14206 (spacing == kSingle ? 1 : 2); 14207 TransferType transfer = kMultipleLanes; 14208 unsigned rn = (instr >> 16) & 0xf; 14209 // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length) 14210 vld2(CurrentCond(), 14211 dt, 14212 NeonRegisterList(DRegister(first), 14213 DRegister(last), 14214 spacing, 14215 transfer), 14216 AlignedMemOperand(Register(rn), 14217 align, 14218 Offset)); 14219 break; 14220 } 14221 case 0x00000a00: { 14222 // 0xf9200a0d 14223 if (((instr & 0xe20) == 0x620) || 14224 ((instr & 0xf30) == 0xa30)) { 14225 UnallocatedT32(instr); 14226 return; 14227 } 14228 DataType dt = 14229 Dt_size_6_Decode((instr >> 6) & 0x3); 14230 if (dt.Is(kDataTypeValueInvalid)) { 14231 UnallocatedT32(instr); 14232 return; 14233 } 14234 Alignment align = 14235 Align_align_1_Decode((instr >> 4) & 0x3); 14236 if (dt.Is(kDataTypeValueInvalid) || 14237 align.Is(kBadAlignment)) { 14238 UnallocatedT32(instr); 14239 return; 14240 } 14241 unsigned first = 14242 ExtractDRegister(instr, 22, 12); 14243 unsigned length; 14244 SpacingType spacing = kSingle; 14245 switch ((instr >> 8) & 0xf) { 14246 default: 14247 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 14248 case 0x7: 14249 length = 1; 14250 break; 14251 case 0xa: 14252 length = 2; 14253 break; 14254 case 0x6: 14255 length = 3; 14256 break; 14257 case 0x2: 14258 length = 4; 14259 break; 14260 } 14261 unsigned last = first + length - 1; 14262 TransferType transfer = kMultipleLanes; 14263 unsigned rn = (instr >> 16) & 0xf; 14264 // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length) 14265 vld1(CurrentCond(), 14266 dt, 14267 NeonRegisterList(DRegister(first), 14268 DRegister(last), 14269 spacing, 14270 transfer), 14271 AlignedMemOperand(Register(rn), 14272 align, 14273 Offset)); 14274 break; 14275 } 14276 default: 14277 UnallocatedT32(instr); 14278 break; 14279 } 14280 break; 14281 } 14282 } 14283 break; 14284 } 14285 default: { 14286 switch (instr & 0x00000f00) { 14287 case 0x00000000: { 14288 // 0xf9200000 14289 if (((instr & 0xd) == 0xd)) { 14290 UnallocatedT32(instr); 14291 return; 14292 } 14293 DataType dt = 14294 Dt_size_7_Decode((instr >> 6) & 0x3); 14295 if (dt.Is(kDataTypeValueInvalid)) { 14296 UnallocatedT32(instr); 14297 return; 14298 } 14299 Alignment align = 14300 Align_align_4_Decode((instr >> 4) & 0x3); 14301 if (dt.Is(kDataTypeValueInvalid) || 14302 align.Is(kBadAlignment)) { 14303 UnallocatedT32(instr); 14304 return; 14305 } 14306 unsigned first = ExtractDRegister(instr, 22, 12); 14307 unsigned length; 14308 SpacingType spacing; 14309 switch ((instr >> 8) & 0xf) { 14310 default: 14311 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 14312 case 0x0: 14313 length = 4; 14314 spacing = kSingle; 14315 break; 14316 case 0x1: 14317 length = 4; 14318 spacing = kDouble; 14319 break; 14320 } 14321 unsigned last = 14322 first + 14323 (length - 1) * (spacing == kSingle ? 1 : 2); 14324 TransferType transfer = kMultipleLanes; 14325 unsigned rn = (instr >> 16) & 0xf; 14326 unsigned rm = instr & 0xf; 14327 // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length) 14328 vld4(CurrentCond(), 14329 dt, 14330 NeonRegisterList(DRegister(first), 14331 DRegister(last), 14332 spacing, 14333 transfer), 14334 AlignedMemOperand(Register(rn), 14335 align, 14336 Register(rm), 14337 PostIndex)); 14338 break; 14339 } 14340 case 0x00000100: { 14341 // 0xf9200100 14342 if (((instr & 0xd) == 0xd)) { 14343 UnallocatedT32(instr); 14344 return; 14345 } 14346 DataType dt = 14347 Dt_size_7_Decode((instr >> 6) & 0x3); 14348 if (dt.Is(kDataTypeValueInvalid)) { 14349 UnallocatedT32(instr); 14350 return; 14351 } 14352 Alignment align = 14353 Align_align_4_Decode((instr >> 4) & 0x3); 14354 if (dt.Is(kDataTypeValueInvalid) || 14355 align.Is(kBadAlignment)) { 14356 UnallocatedT32(instr); 14357 return; 14358 } 14359 unsigned first = ExtractDRegister(instr, 22, 12); 14360 unsigned length; 14361 SpacingType spacing; 14362 switch ((instr >> 8) & 0xf) { 14363 default: 14364 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 14365 case 0x0: 14366 length = 4; 14367 spacing = kSingle; 14368 break; 14369 case 0x1: 14370 length = 4; 14371 spacing = kDouble; 14372 break; 14373 } 14374 unsigned last = 14375 first + 14376 (length - 1) * (spacing == kSingle ? 1 : 2); 14377 TransferType transfer = kMultipleLanes; 14378 unsigned rn = (instr >> 16) & 0xf; 14379 unsigned rm = instr & 0xf; 14380 // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length) 14381 vld4(CurrentCond(), 14382 dt, 14383 NeonRegisterList(DRegister(first), 14384 DRegister(last), 14385 spacing, 14386 transfer), 14387 AlignedMemOperand(Register(rn), 14388 align, 14389 Register(rm), 14390 PostIndex)); 14391 break; 14392 } 14393 case 0x00000200: { 14394 // 0xf9200200 14395 if (((instr & 0xd) == 0xd) || 14396 ((instr & 0xe20) == 0x620) || 14397 ((instr & 0xf30) == 0xa30)) { 14398 UnallocatedT32(instr); 14399 return; 14400 } 14401 DataType dt = 14402 Dt_size_6_Decode((instr >> 6) & 0x3); 14403 if (dt.Is(kDataTypeValueInvalid)) { 14404 UnallocatedT32(instr); 14405 return; 14406 } 14407 Alignment align = 14408 Align_align_1_Decode((instr >> 4) & 0x3); 14409 if (dt.Is(kDataTypeValueInvalid) || 14410 align.Is(kBadAlignment)) { 14411 UnallocatedT32(instr); 14412 return; 14413 } 14414 unsigned first = ExtractDRegister(instr, 22, 12); 14415 unsigned length; 14416 SpacingType spacing = kSingle; 14417 switch ((instr >> 8) & 0xf) { 14418 default: 14419 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 14420 case 0x7: 14421 length = 1; 14422 break; 14423 case 0xa: 14424 length = 2; 14425 break; 14426 case 0x6: 14427 length = 3; 14428 break; 14429 case 0x2: 14430 length = 4; 14431 break; 14432 } 14433 unsigned last = first + length - 1; 14434 TransferType transfer = kMultipleLanes; 14435 unsigned rn = (instr >> 16) & 0xf; 14436 unsigned rm = instr & 0xf; 14437 // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length) 14438 vld1(CurrentCond(), 14439 dt, 14440 NeonRegisterList(DRegister(first), 14441 DRegister(last), 14442 spacing, 14443 transfer), 14444 AlignedMemOperand(Register(rn), 14445 align, 14446 Register(rm), 14447 PostIndex)); 14448 break; 14449 } 14450 case 0x00000300: { 14451 // 0xf9200300 14452 if (((instr & 0xd) == 0xd) || 14453 ((instr & 0xe30) == 0x830)) { 14454 UnallocatedT32(instr); 14455 return; 14456 } 14457 DataType dt = 14458 Dt_size_7_Decode((instr >> 6) & 0x3); 14459 if (dt.Is(kDataTypeValueInvalid)) { 14460 UnallocatedT32(instr); 14461 return; 14462 } 14463 Alignment align = 14464 Align_align_2_Decode((instr >> 4) & 0x3); 14465 if (dt.Is(kDataTypeValueInvalid) || 14466 align.Is(kBadAlignment)) { 14467 UnallocatedT32(instr); 14468 return; 14469 } 14470 unsigned first = ExtractDRegister(instr, 22, 12); 14471 unsigned length; 14472 SpacingType spacing; 14473 switch ((instr >> 8) & 0xf) { 14474 default: 14475 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 14476 case 0x8: 14477 length = 2; 14478 spacing = kSingle; 14479 break; 14480 case 0x9: 14481 length = 2; 14482 spacing = kDouble; 14483 break; 14484 case 0x3: 14485 length = 4; 14486 spacing = kSingle; 14487 break; 14488 } 14489 unsigned last = 14490 first + 14491 (length - 1) * (spacing == kSingle ? 1 : 2); 14492 TransferType transfer = kMultipleLanes; 14493 unsigned rn = (instr >> 16) & 0xf; 14494 unsigned rm = instr & 0xf; 14495 // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length) 14496 vld2(CurrentCond(), 14497 dt, 14498 NeonRegisterList(DRegister(first), 14499 DRegister(last), 14500 spacing, 14501 transfer), 14502 AlignedMemOperand(Register(rn), 14503 align, 14504 Register(rm), 14505 PostIndex)); 14506 break; 14507 } 14508 case 0x00000400: { 14509 // 0xf9200400 14510 if (((instr & 0xd) == 0xd)) { 14511 UnallocatedT32(instr); 14512 return; 14513 } 14514 DataType dt = 14515 Dt_size_7_Decode((instr >> 6) & 0x3); 14516 if (dt.Is(kDataTypeValueInvalid)) { 14517 UnallocatedT32(instr); 14518 return; 14519 } 14520 Alignment align = 14521 Align_align_3_Decode((instr >> 4) & 0x3); 14522 if (dt.Is(kDataTypeValueInvalid) || 14523 align.Is(kBadAlignment)) { 14524 UnallocatedT32(instr); 14525 return; 14526 } 14527 unsigned first = ExtractDRegister(instr, 22, 12); 14528 unsigned length; 14529 SpacingType spacing; 14530 switch ((instr >> 8) & 0xf) { 14531 default: 14532 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 14533 case 0x4: 14534 length = 3; 14535 spacing = kSingle; 14536 break; 14537 case 0x5: 14538 length = 3; 14539 spacing = kDouble; 14540 break; 14541 } 14542 unsigned last = 14543 first + 14544 (length - 1) * (spacing == kSingle ? 1 : 2); 14545 TransferType transfer = kMultipleLanes; 14546 unsigned rn = (instr >> 16) & 0xf; 14547 unsigned rm = instr & 0xf; 14548 // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length) 14549 vld3(CurrentCond(), 14550 dt, 14551 NeonRegisterList(DRegister(first), 14552 DRegister(last), 14553 spacing, 14554 transfer), 14555 AlignedMemOperand(Register(rn), 14556 align, 14557 Register(rm), 14558 PostIndex)); 14559 break; 14560 } 14561 case 0x00000500: { 14562 // 0xf9200500 14563 if (((instr & 0xd) == 0xd)) { 14564 UnallocatedT32(instr); 14565 return; 14566 } 14567 DataType dt = 14568 Dt_size_7_Decode((instr >> 6) & 0x3); 14569 if (dt.Is(kDataTypeValueInvalid)) { 14570 UnallocatedT32(instr); 14571 return; 14572 } 14573 Alignment align = 14574 Align_align_3_Decode((instr >> 4) & 0x3); 14575 if (dt.Is(kDataTypeValueInvalid) || 14576 align.Is(kBadAlignment)) { 14577 UnallocatedT32(instr); 14578 return; 14579 } 14580 unsigned first = ExtractDRegister(instr, 22, 12); 14581 unsigned length; 14582 SpacingType spacing; 14583 switch ((instr >> 8) & 0xf) { 14584 default: 14585 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 14586 case 0x4: 14587 length = 3; 14588 spacing = kSingle; 14589 break; 14590 case 0x5: 14591 length = 3; 14592 spacing = kDouble; 14593 break; 14594 } 14595 unsigned last = 14596 first + 14597 (length - 1) * (spacing == kSingle ? 1 : 2); 14598 TransferType transfer = kMultipleLanes; 14599 unsigned rn = (instr >> 16) & 0xf; 14600 unsigned rm = instr & 0xf; 14601 // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length) 14602 vld3(CurrentCond(), 14603 dt, 14604 NeonRegisterList(DRegister(first), 14605 DRegister(last), 14606 spacing, 14607 transfer), 14608 AlignedMemOperand(Register(rn), 14609 align, 14610 Register(rm), 14611 PostIndex)); 14612 break; 14613 } 14614 case 0x00000600: { 14615 // 0xf9200600 14616 if (((instr & 0xd) == 0xd) || 14617 ((instr & 0xe20) == 0x620) || 14618 ((instr & 0xf30) == 0xa30)) { 14619 UnallocatedT32(instr); 14620 return; 14621 } 14622 DataType dt = 14623 Dt_size_6_Decode((instr >> 6) & 0x3); 14624 if (dt.Is(kDataTypeValueInvalid)) { 14625 UnallocatedT32(instr); 14626 return; 14627 } 14628 Alignment align = 14629 Align_align_1_Decode((instr >> 4) & 0x3); 14630 if (dt.Is(kDataTypeValueInvalid) || 14631 align.Is(kBadAlignment)) { 14632 UnallocatedT32(instr); 14633 return; 14634 } 14635 unsigned first = ExtractDRegister(instr, 22, 12); 14636 unsigned length; 14637 SpacingType spacing = kSingle; 14638 switch ((instr >> 8) & 0xf) { 14639 default: 14640 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 14641 case 0x7: 14642 length = 1; 14643 break; 14644 case 0xa: 14645 length = 2; 14646 break; 14647 case 0x6: 14648 length = 3; 14649 break; 14650 case 0x2: 14651 length = 4; 14652 break; 14653 } 14654 unsigned last = first + length - 1; 14655 TransferType transfer = kMultipleLanes; 14656 unsigned rn = (instr >> 16) & 0xf; 14657 unsigned rm = instr & 0xf; 14658 // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length) 14659 vld1(CurrentCond(), 14660 dt, 14661 NeonRegisterList(DRegister(first), 14662 DRegister(last), 14663 spacing, 14664 transfer), 14665 AlignedMemOperand(Register(rn), 14666 align, 14667 Register(rm), 14668 PostIndex)); 14669 break; 14670 } 14671 case 0x00000700: { 14672 // 0xf9200700 14673 if (((instr & 0xd) == 0xd) || 14674 ((instr & 0xe20) == 0x620) || 14675 ((instr & 0xf30) == 0xa30)) { 14676 UnallocatedT32(instr); 14677 return; 14678 } 14679 DataType dt = 14680 Dt_size_6_Decode((instr >> 6) & 0x3); 14681 if (dt.Is(kDataTypeValueInvalid)) { 14682 UnallocatedT32(instr); 14683 return; 14684 } 14685 Alignment align = 14686 Align_align_1_Decode((instr >> 4) & 0x3); 14687 if (dt.Is(kDataTypeValueInvalid) || 14688 align.Is(kBadAlignment)) { 14689 UnallocatedT32(instr); 14690 return; 14691 } 14692 unsigned first = ExtractDRegister(instr, 22, 12); 14693 unsigned length; 14694 SpacingType spacing = kSingle; 14695 switch ((instr >> 8) & 0xf) { 14696 default: 14697 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 14698 case 0x7: 14699 length = 1; 14700 break; 14701 case 0xa: 14702 length = 2; 14703 break; 14704 case 0x6: 14705 length = 3; 14706 break; 14707 case 0x2: 14708 length = 4; 14709 break; 14710 } 14711 unsigned last = first + length - 1; 14712 TransferType transfer = kMultipleLanes; 14713 unsigned rn = (instr >> 16) & 0xf; 14714 unsigned rm = instr & 0xf; 14715 // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length) 14716 vld1(CurrentCond(), 14717 dt, 14718 NeonRegisterList(DRegister(first), 14719 DRegister(last), 14720 spacing, 14721 transfer), 14722 AlignedMemOperand(Register(rn), 14723 align, 14724 Register(rm), 14725 PostIndex)); 14726 break; 14727 } 14728 case 0x00000800: { 14729 // 0xf9200800 14730 if (((instr & 0xd) == 0xd) || 14731 ((instr & 0xe30) == 0x830)) { 14732 UnallocatedT32(instr); 14733 return; 14734 } 14735 DataType dt = 14736 Dt_size_7_Decode((instr >> 6) & 0x3); 14737 if (dt.Is(kDataTypeValueInvalid)) { 14738 UnallocatedT32(instr); 14739 return; 14740 } 14741 Alignment align = 14742 Align_align_2_Decode((instr >> 4) & 0x3); 14743 if (dt.Is(kDataTypeValueInvalid) || 14744 align.Is(kBadAlignment)) { 14745 UnallocatedT32(instr); 14746 return; 14747 } 14748 unsigned first = ExtractDRegister(instr, 22, 12); 14749 unsigned length; 14750 SpacingType spacing; 14751 switch ((instr >> 8) & 0xf) { 14752 default: 14753 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 14754 case 0x8: 14755 length = 2; 14756 spacing = kSingle; 14757 break; 14758 case 0x9: 14759 length = 2; 14760 spacing = kDouble; 14761 break; 14762 case 0x3: 14763 length = 4; 14764 spacing = kSingle; 14765 break; 14766 } 14767 unsigned last = 14768 first + 14769 (length - 1) * (spacing == kSingle ? 1 : 2); 14770 TransferType transfer = kMultipleLanes; 14771 unsigned rn = (instr >> 16) & 0xf; 14772 unsigned rm = instr & 0xf; 14773 // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length) 14774 vld2(CurrentCond(), 14775 dt, 14776 NeonRegisterList(DRegister(first), 14777 DRegister(last), 14778 spacing, 14779 transfer), 14780 AlignedMemOperand(Register(rn), 14781 align, 14782 Register(rm), 14783 PostIndex)); 14784 break; 14785 } 14786 case 0x00000900: { 14787 // 0xf9200900 14788 if (((instr & 0xd) == 0xd) || 14789 ((instr & 0xe30) == 0x830)) { 14790 UnallocatedT32(instr); 14791 return; 14792 } 14793 DataType dt = 14794 Dt_size_7_Decode((instr >> 6) & 0x3); 14795 if (dt.Is(kDataTypeValueInvalid)) { 14796 UnallocatedT32(instr); 14797 return; 14798 } 14799 Alignment align = 14800 Align_align_2_Decode((instr >> 4) & 0x3); 14801 if (dt.Is(kDataTypeValueInvalid) || 14802 align.Is(kBadAlignment)) { 14803 UnallocatedT32(instr); 14804 return; 14805 } 14806 unsigned first = ExtractDRegister(instr, 22, 12); 14807 unsigned length; 14808 SpacingType spacing; 14809 switch ((instr >> 8) & 0xf) { 14810 default: 14811 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 14812 case 0x8: 14813 length = 2; 14814 spacing = kSingle; 14815 break; 14816 case 0x9: 14817 length = 2; 14818 spacing = kDouble; 14819 break; 14820 case 0x3: 14821 length = 4; 14822 spacing = kSingle; 14823 break; 14824 } 14825 unsigned last = 14826 first + 14827 (length - 1) * (spacing == kSingle ? 1 : 2); 14828 TransferType transfer = kMultipleLanes; 14829 unsigned rn = (instr >> 16) & 0xf; 14830 unsigned rm = instr & 0xf; 14831 // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length) 14832 vld2(CurrentCond(), 14833 dt, 14834 NeonRegisterList(DRegister(first), 14835 DRegister(last), 14836 spacing, 14837 transfer), 14838 AlignedMemOperand(Register(rn), 14839 align, 14840 Register(rm), 14841 PostIndex)); 14842 break; 14843 } 14844 case 0x00000a00: { 14845 // 0xf9200a00 14846 if (((instr & 0xd) == 0xd) || 14847 ((instr & 0xe20) == 0x620) || 14848 ((instr & 0xf30) == 0xa30)) { 14849 UnallocatedT32(instr); 14850 return; 14851 } 14852 DataType dt = 14853 Dt_size_6_Decode((instr >> 6) & 0x3); 14854 if (dt.Is(kDataTypeValueInvalid)) { 14855 UnallocatedT32(instr); 14856 return; 14857 } 14858 Alignment align = 14859 Align_align_1_Decode((instr >> 4) & 0x3); 14860 if (dt.Is(kDataTypeValueInvalid) || 14861 align.Is(kBadAlignment)) { 14862 UnallocatedT32(instr); 14863 return; 14864 } 14865 unsigned first = ExtractDRegister(instr, 22, 12); 14866 unsigned length; 14867 SpacingType spacing = kSingle; 14868 switch ((instr >> 8) & 0xf) { 14869 default: 14870 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 14871 case 0x7: 14872 length = 1; 14873 break; 14874 case 0xa: 14875 length = 2; 14876 break; 14877 case 0x6: 14878 length = 3; 14879 break; 14880 case 0x2: 14881 length = 4; 14882 break; 14883 } 14884 unsigned last = first + length - 1; 14885 TransferType transfer = kMultipleLanes; 14886 unsigned rn = (instr >> 16) & 0xf; 14887 unsigned rm = instr & 0xf; 14888 // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length) 14889 vld1(CurrentCond(), 14890 dt, 14891 NeonRegisterList(DRegister(first), 14892 DRegister(last), 14893 spacing, 14894 transfer), 14895 AlignedMemOperand(Register(rn), 14896 align, 14897 Register(rm), 14898 PostIndex)); 14899 break; 14900 } 14901 default: 14902 UnallocatedT32(instr); 14903 break; 14904 } 14905 break; 14906 } 14907 } 14908 break; 14909 } 14910 case 0x01800000: { 14911 // 0xf9800000 14912 switch (instr & 0x00000300) { 14913 case 0x00000000: { 14914 // 0xf9800000 14915 switch (instr & 0x00000c00) { 14916 case 0x00000c00: { 14917 // 0xf9800c00 14918 UnallocatedT32(instr); 14919 break; 14920 } 14921 default: { 14922 switch (instr & 0x0000000d) { 14923 case 0x0000000d: { 14924 // 0xf980000d 14925 switch (instr & 0x00000002) { 14926 case 0x00000000: { 14927 // 0xf980000d 14928 if (((instr & 0xc00) == 0xc00)) { 14929 UnallocatedT32(instr); 14930 return; 14931 } 14932 DataType dt = 14933 Dt_size_7_Decode((instr >> 10) & 0x3); 14934 if (dt.Is(kDataTypeValueInvalid)) { 14935 UnallocatedT32(instr); 14936 return; 14937 } 14938 DecodeNeonAndAlign decode_neon = 14939 Align_index_align_1_Decode((instr >> 14940 4) & 14941 0xf, 14942 dt); 14943 if (!decode_neon.IsValid()) { 14944 UnallocatedT32(instr); 14945 return; 14946 } 14947 Alignment align = decode_neon.GetAlign(); 14948 int lane = decode_neon.GetLane(); 14949 SpacingType spacing = 14950 decode_neon.GetSpacing(); 14951 unsigned first = 14952 ExtractDRegister(instr, 22, 12); 14953 unsigned length = 1; 14954 unsigned last = first + length - 1; 14955 unsigned rn = (instr >> 16) & 0xf; 14956 // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length) 14957 vst1(CurrentCond(), 14958 dt, 14959 NeonRegisterList(DRegister(first), 14960 DRegister(last), 14961 spacing, 14962 lane), 14963 AlignedMemOperand(Register(rn), 14964 align, 14965 PostIndex)); 14966 break; 14967 } 14968 case 0x00000002: { 14969 // 0xf980000f 14970 if (((instr & 0xc00) == 0xc00)) { 14971 UnallocatedT32(instr); 14972 return; 14973 } 14974 DataType dt = 14975 Dt_size_7_Decode((instr >> 10) & 0x3); 14976 if (dt.Is(kDataTypeValueInvalid)) { 14977 UnallocatedT32(instr); 14978 return; 14979 } 14980 DecodeNeonAndAlign decode_neon = 14981 Align_index_align_1_Decode((instr >> 14982 4) & 14983 0xf, 14984 dt); 14985 if (!decode_neon.IsValid()) { 14986 UnallocatedT32(instr); 14987 return; 14988 } 14989 Alignment align = decode_neon.GetAlign(); 14990 int lane = decode_neon.GetLane(); 14991 SpacingType spacing = 14992 decode_neon.GetSpacing(); 14993 unsigned first = 14994 ExtractDRegister(instr, 22, 12); 14995 unsigned length = 1; 14996 unsigned last = first + length - 1; 14997 unsigned rn = (instr >> 16) & 0xf; 14998 // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length) 14999 vst1(CurrentCond(), 15000 dt, 15001 NeonRegisterList(DRegister(first), 15002 DRegister(last), 15003 spacing, 15004 lane), 15005 AlignedMemOperand(Register(rn), 15006 align, 15007 Offset)); 15008 break; 15009 } 15010 } 15011 break; 15012 } 15013 default: { 15014 if (((instr & 0xc00) == 0xc00) || 15015 ((instr & 0xd) == 0xd)) { 15016 UnallocatedT32(instr); 15017 return; 15018 } 15019 DataType dt = 15020 Dt_size_7_Decode((instr >> 10) & 0x3); 15021 if (dt.Is(kDataTypeValueInvalid)) { 15022 UnallocatedT32(instr); 15023 return; 15024 } 15025 DecodeNeonAndAlign decode_neon = 15026 Align_index_align_1_Decode((instr >> 4) & 15027 0xf, 15028 dt); 15029 if (!decode_neon.IsValid()) { 15030 UnallocatedT32(instr); 15031 return; 15032 } 15033 Alignment align = decode_neon.GetAlign(); 15034 int lane = decode_neon.GetLane(); 15035 SpacingType spacing = 15036 decode_neon.GetSpacing(); 15037 unsigned first = 15038 ExtractDRegister(instr, 22, 12); 15039 unsigned length = 1; 15040 unsigned last = first + length - 1; 15041 unsigned rn = (instr >> 16) & 0xf; 15042 unsigned rm = instr & 0xf; 15043 // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length) 15044 vst1(CurrentCond(), 15045 dt, 15046 NeonRegisterList(DRegister(first), 15047 DRegister(last), 15048 spacing, 15049 lane), 15050 AlignedMemOperand(Register(rn), 15051 align, 15052 Register(rm), 15053 PostIndex)); 15054 break; 15055 } 15056 } 15057 break; 15058 } 15059 } 15060 break; 15061 } 15062 case 0x00000100: { 15063 // 0xf9800100 15064 switch (instr & 0x00000c00) { 15065 case 0x00000c00: { 15066 // 0xf9800d00 15067 UnallocatedT32(instr); 15068 break; 15069 } 15070 default: { 15071 switch (instr & 0x0000000d) { 15072 case 0x0000000d: { 15073 // 0xf980010d 15074 switch (instr & 0x00000002) { 15075 case 0x00000000: { 15076 // 0xf980010d 15077 if (((instr & 0xc00) == 0xc00)) { 15078 UnallocatedT32(instr); 15079 return; 15080 } 15081 DataType dt = 15082 Dt_size_7_Decode((instr >> 10) & 0x3); 15083 if (dt.Is(kDataTypeValueInvalid)) { 15084 UnallocatedT32(instr); 15085 return; 15086 } 15087 DecodeNeonAndAlign decode_neon = 15088 Align_index_align_2_Decode((instr >> 15089 4) & 15090 0xf, 15091 dt); 15092 if (!decode_neon.IsValid()) { 15093 UnallocatedT32(instr); 15094 return; 15095 } 15096 Alignment align = decode_neon.GetAlign(); 15097 int lane = decode_neon.GetLane(); 15098 SpacingType spacing = 15099 decode_neon.GetSpacing(); 15100 unsigned first = 15101 ExtractDRegister(instr, 22, 12); 15102 unsigned length = 2; 15103 unsigned last = 15104 first + 15105 (length - 1) * 15106 (spacing == kSingle ? 1 : 2); 15107 unsigned rn = (instr >> 16) & 0xf; 15108 // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length) 15109 vst2(CurrentCond(), 15110 dt, 15111 NeonRegisterList(DRegister(first), 15112 DRegister(last), 15113 spacing, 15114 lane), 15115 AlignedMemOperand(Register(rn), 15116 align, 15117 PostIndex)); 15118 break; 15119 } 15120 case 0x00000002: { 15121 // 0xf980010f 15122 if (((instr & 0xc00) == 0xc00)) { 15123 UnallocatedT32(instr); 15124 return; 15125 } 15126 DataType dt = 15127 Dt_size_7_Decode((instr >> 10) & 0x3); 15128 if (dt.Is(kDataTypeValueInvalid)) { 15129 UnallocatedT32(instr); 15130 return; 15131 } 15132 DecodeNeonAndAlign decode_neon = 15133 Align_index_align_2_Decode((instr >> 15134 4) & 15135 0xf, 15136 dt); 15137 if (!decode_neon.IsValid()) { 15138 UnallocatedT32(instr); 15139 return; 15140 } 15141 Alignment align = decode_neon.GetAlign(); 15142 int lane = decode_neon.GetLane(); 15143 SpacingType spacing = 15144 decode_neon.GetSpacing(); 15145 unsigned first = 15146 ExtractDRegister(instr, 22, 12); 15147 unsigned length = 2; 15148 unsigned last = 15149 first + 15150 (length - 1) * 15151 (spacing == kSingle ? 1 : 2); 15152 unsigned rn = (instr >> 16) & 0xf; 15153 // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length) 15154 vst2(CurrentCond(), 15155 dt, 15156 NeonRegisterList(DRegister(first), 15157 DRegister(last), 15158 spacing, 15159 lane), 15160 AlignedMemOperand(Register(rn), 15161 align, 15162 Offset)); 15163 break; 15164 } 15165 } 15166 break; 15167 } 15168 default: { 15169 if (((instr & 0xc00) == 0xc00) || 15170 ((instr & 0xd) == 0xd)) { 15171 UnallocatedT32(instr); 15172 return; 15173 } 15174 DataType dt = 15175 Dt_size_7_Decode((instr >> 10) & 0x3); 15176 if (dt.Is(kDataTypeValueInvalid)) { 15177 UnallocatedT32(instr); 15178 return; 15179 } 15180 DecodeNeonAndAlign decode_neon = 15181 Align_index_align_2_Decode((instr >> 4) & 15182 0xf, 15183 dt); 15184 if (!decode_neon.IsValid()) { 15185 UnallocatedT32(instr); 15186 return; 15187 } 15188 Alignment align = decode_neon.GetAlign(); 15189 int lane = decode_neon.GetLane(); 15190 SpacingType spacing = 15191 decode_neon.GetSpacing(); 15192 unsigned first = 15193 ExtractDRegister(instr, 22, 12); 15194 unsigned length = 2; 15195 unsigned last = 15196 first + 15197 (length - 1) * 15198 (spacing == kSingle ? 1 : 2); 15199 unsigned rn = (instr >> 16) & 0xf; 15200 unsigned rm = instr & 0xf; 15201 // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length) 15202 vst2(CurrentCond(), 15203 dt, 15204 NeonRegisterList(DRegister(first), 15205 DRegister(last), 15206 spacing, 15207 lane), 15208 AlignedMemOperand(Register(rn), 15209 align, 15210 Register(rm), 15211 PostIndex)); 15212 break; 15213 } 15214 } 15215 break; 15216 } 15217 } 15218 break; 15219 } 15220 case 0x00000200: { 15221 // 0xf9800200 15222 switch (instr & 0x00000c30) { 15223 case 0x00000010: { 15224 // 0xf9800210 15225 UnallocatedT32(instr); 15226 break; 15227 } 15228 case 0x00000030: { 15229 // 0xf9800230 15230 UnallocatedT32(instr); 15231 break; 15232 } 15233 case 0x00000410: { 15234 // 0xf9800610 15235 UnallocatedT32(instr); 15236 break; 15237 } 15238 case 0x00000430: { 15239 // 0xf9800630 15240 UnallocatedT32(instr); 15241 break; 15242 } 15243 case 0x00000810: { 15244 // 0xf9800a10 15245 UnallocatedT32(instr); 15246 break; 15247 } 15248 case 0x00000820: { 15249 // 0xf9800a20 15250 UnallocatedT32(instr); 15251 break; 15252 } 15253 case 0x00000830: { 15254 // 0xf9800a30 15255 UnallocatedT32(instr); 15256 break; 15257 } 15258 case 0x00000c00: { 15259 // 0xf9800e00 15260 UnallocatedT32(instr); 15261 break; 15262 } 15263 case 0x00000c10: { 15264 // 0xf9800e10 15265 UnallocatedT32(instr); 15266 break; 15267 } 15268 case 0x00000c20: { 15269 // 0xf9800e20 15270 UnallocatedT32(instr); 15271 break; 15272 } 15273 case 0x00000c30: { 15274 // 0xf9800e30 15275 UnallocatedT32(instr); 15276 break; 15277 } 15278 default: { 15279 switch (instr & 0x0000000d) { 15280 case 0x0000000d: { 15281 // 0xf980020d 15282 switch (instr & 0x00000002) { 15283 case 0x00000000: { 15284 // 0xf980020d 15285 if (((instr & 0xc00) == 0xc00) || 15286 ((instr & 0x810) == 0x10) || 15287 ((instr & 0xc30) == 0x810) || 15288 ((instr & 0xc30) == 0x820) || 15289 ((instr & 0xc30) == 0x830)) { 15290 UnallocatedT32(instr); 15291 return; 15292 } 15293 DataType dt = 15294 Dt_size_7_Decode((instr >> 10) & 0x3); 15295 if (dt.Is(kDataTypeValueInvalid)) { 15296 UnallocatedT32(instr); 15297 return; 15298 } 15299 DecodeNeon decode_neon = 15300 Index_1_Decode((instr >> 4) & 0xf, 15301 dt); 15302 if (!decode_neon.IsValid()) { 15303 UnallocatedT32(instr); 15304 return; 15305 } 15306 int lane = decode_neon.GetLane(); 15307 SpacingType spacing = 15308 decode_neon.GetSpacing(); 15309 unsigned first = 15310 ExtractDRegister(instr, 22, 12); 15311 unsigned length = 3; 15312 unsigned last = 15313 first + 15314 (length - 1) * 15315 (spacing == kSingle ? 1 : 2); 15316 unsigned rn = (instr >> 16) & 0xf; 15317 // VST3{<c>}{<q>}.<dt> <list>, [<Rn>]! ; T1 NOLINT(whitespace/line_length) 15318 vst3(CurrentCond(), 15319 dt, 15320 NeonRegisterList(DRegister(first), 15321 DRegister(last), 15322 spacing, 15323 lane), 15324 MemOperand(Register(rn), PostIndex)); 15325 break; 15326 } 15327 case 0x00000002: { 15328 // 0xf980020f 15329 if (((instr & 0xc00) == 0xc00) || 15330 ((instr & 0x810) == 0x10) || 15331 ((instr & 0xc30) == 0x810) || 15332 ((instr & 0xc30) == 0x820) || 15333 ((instr & 0xc30) == 0x830)) { 15334 UnallocatedT32(instr); 15335 return; 15336 } 15337 DataType dt = 15338 Dt_size_7_Decode((instr >> 10) & 0x3); 15339 if (dt.Is(kDataTypeValueInvalid)) { 15340 UnallocatedT32(instr); 15341 return; 15342 } 15343 DecodeNeon decode_neon = 15344 Index_1_Decode((instr >> 4) & 0xf, 15345 dt); 15346 if (!decode_neon.IsValid()) { 15347 UnallocatedT32(instr); 15348 return; 15349 } 15350 int lane = decode_neon.GetLane(); 15351 SpacingType spacing = 15352 decode_neon.GetSpacing(); 15353 unsigned first = 15354 ExtractDRegister(instr, 22, 12); 15355 unsigned length = 3; 15356 unsigned last = 15357 first + 15358 (length - 1) * 15359 (spacing == kSingle ? 1 : 2); 15360 unsigned rn = (instr >> 16) & 0xf; 15361 // VST3{<c>}{<q>}.<dt> <list>, [<Rn>] ; T1 15362 vst3(CurrentCond(), 15363 dt, 15364 NeonRegisterList(DRegister(first), 15365 DRegister(last), 15366 spacing, 15367 lane), 15368 MemOperand(Register(rn), Offset)); 15369 break; 15370 } 15371 } 15372 break; 15373 } 15374 default: { 15375 if (((instr & 0xc00) == 0xc00) || 15376 ((instr & 0xd) == 0xd) || 15377 ((instr & 0x810) == 0x10) || 15378 ((instr & 0xc30) == 0x810) || 15379 ((instr & 0xc30) == 0x820) || 15380 ((instr & 0xc30) == 0x830)) { 15381 UnallocatedT32(instr); 15382 return; 15383 } 15384 DataType dt = 15385 Dt_size_7_Decode((instr >> 10) & 0x3); 15386 if (dt.Is(kDataTypeValueInvalid)) { 15387 UnallocatedT32(instr); 15388 return; 15389 } 15390 DecodeNeon decode_neon = 15391 Index_1_Decode((instr >> 4) & 0xf, dt); 15392 if (!decode_neon.IsValid()) { 15393 UnallocatedT32(instr); 15394 return; 15395 } 15396 int lane = decode_neon.GetLane(); 15397 SpacingType spacing = 15398 decode_neon.GetSpacing(); 15399 unsigned first = 15400 ExtractDRegister(instr, 22, 12); 15401 unsigned length = 3; 15402 unsigned last = 15403 first + 15404 (length - 1) * 15405 (spacing == kSingle ? 1 : 2); 15406 unsigned rn = (instr >> 16) & 0xf; 15407 Sign sign(plus); 15408 unsigned rm = instr & 0xf; 15409 // VST3{<c>}{<q>}.<dt> <list>, [<Rn>], #<Rm> ; T1 NOLINT(whitespace/line_length) 15410 vst3(CurrentCond(), 15411 dt, 15412 NeonRegisterList(DRegister(first), 15413 DRegister(last), 15414 spacing, 15415 lane), 15416 MemOperand(Register(rn), 15417 sign, 15418 Register(rm), 15419 PostIndex)); 15420 break; 15421 } 15422 } 15423 break; 15424 } 15425 } 15426 break; 15427 } 15428 case 0x00000300: { 15429 // 0xf9800300 15430 switch (instr & 0x00000c00) { 15431 case 0x00000c00: { 15432 // 0xf9800f00 15433 UnallocatedT32(instr); 15434 break; 15435 } 15436 default: { 15437 switch (instr & 0x0000000d) { 15438 case 0x0000000d: { 15439 // 0xf980030d 15440 switch (instr & 0x00000002) { 15441 case 0x00000000: { 15442 // 0xf980030d 15443 if (((instr & 0xc00) == 0xc00)) { 15444 UnallocatedT32(instr); 15445 return; 15446 } 15447 DataType dt = 15448 Dt_size_7_Decode((instr >> 10) & 0x3); 15449 if (dt.Is(kDataTypeValueInvalid)) { 15450 UnallocatedT32(instr); 15451 return; 15452 } 15453 DecodeNeonAndAlign decode_neon = 15454 Align_index_align_3_Decode((instr >> 15455 4) & 15456 0xf, 15457 dt); 15458 if (!decode_neon.IsValid()) { 15459 UnallocatedT32(instr); 15460 return; 15461 } 15462 Alignment align = decode_neon.GetAlign(); 15463 int lane = decode_neon.GetLane(); 15464 SpacingType spacing = 15465 decode_neon.GetSpacing(); 15466 unsigned first = 15467 ExtractDRegister(instr, 22, 12); 15468 unsigned length = 4; 15469 unsigned last = 15470 first + 15471 (length - 1) * 15472 (spacing == kSingle ? 1 : 2); 15473 unsigned rn = (instr >> 16) & 0xf; 15474 // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length) 15475 vst4(CurrentCond(), 15476 dt, 15477 NeonRegisterList(DRegister(first), 15478 DRegister(last), 15479 spacing, 15480 lane), 15481 AlignedMemOperand(Register(rn), 15482 align, 15483 PostIndex)); 15484 break; 15485 } 15486 case 0x00000002: { 15487 // 0xf980030f 15488 if (((instr & 0xc00) == 0xc00)) { 15489 UnallocatedT32(instr); 15490 return; 15491 } 15492 DataType dt = 15493 Dt_size_7_Decode((instr >> 10) & 0x3); 15494 if (dt.Is(kDataTypeValueInvalid)) { 15495 UnallocatedT32(instr); 15496 return; 15497 } 15498 DecodeNeonAndAlign decode_neon = 15499 Align_index_align_3_Decode((instr >> 15500 4) & 15501 0xf, 15502 dt); 15503 if (!decode_neon.IsValid()) { 15504 UnallocatedT32(instr); 15505 return; 15506 } 15507 Alignment align = decode_neon.GetAlign(); 15508 int lane = decode_neon.GetLane(); 15509 SpacingType spacing = 15510 decode_neon.GetSpacing(); 15511 unsigned first = 15512 ExtractDRegister(instr, 22, 12); 15513 unsigned length = 4; 15514 unsigned last = 15515 first + 15516 (length - 1) * 15517 (spacing == kSingle ? 1 : 2); 15518 unsigned rn = (instr >> 16) & 0xf; 15519 // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length) 15520 vst4(CurrentCond(), 15521 dt, 15522 NeonRegisterList(DRegister(first), 15523 DRegister(last), 15524 spacing, 15525 lane), 15526 AlignedMemOperand(Register(rn), 15527 align, 15528 Offset)); 15529 break; 15530 } 15531 } 15532 break; 15533 } 15534 default: { 15535 if (((instr & 0xc00) == 0xc00) || 15536 ((instr & 0xd) == 0xd)) { 15537 UnallocatedT32(instr); 15538 return; 15539 } 15540 DataType dt = 15541 Dt_size_7_Decode((instr >> 10) & 0x3); 15542 if (dt.Is(kDataTypeValueInvalid)) { 15543 UnallocatedT32(instr); 15544 return; 15545 } 15546 DecodeNeonAndAlign decode_neon = 15547 Align_index_align_3_Decode((instr >> 4) & 15548 0xf, 15549 dt); 15550 if (!decode_neon.IsValid()) { 15551 UnallocatedT32(instr); 15552 return; 15553 } 15554 Alignment align = decode_neon.GetAlign(); 15555 int lane = decode_neon.GetLane(); 15556 SpacingType spacing = 15557 decode_neon.GetSpacing(); 15558 unsigned first = 15559 ExtractDRegister(instr, 22, 12); 15560 unsigned length = 4; 15561 unsigned last = 15562 first + 15563 (length - 1) * 15564 (spacing == kSingle ? 1 : 2); 15565 unsigned rn = (instr >> 16) & 0xf; 15566 unsigned rm = instr & 0xf; 15567 // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length) 15568 vst4(CurrentCond(), 15569 dt, 15570 NeonRegisterList(DRegister(first), 15571 DRegister(last), 15572 spacing, 15573 lane), 15574 AlignedMemOperand(Register(rn), 15575 align, 15576 Register(rm), 15577 PostIndex)); 15578 break; 15579 } 15580 } 15581 break; 15582 } 15583 } 15584 break; 15585 } 15586 } 15587 break; 15588 } 15589 case 0x01a00000: { 15590 // 0xf9a00000 15591 switch (instr & 0x00000300) { 15592 case 0x00000000: { 15593 // 0xf9a00000 15594 switch (instr & 0x00000c00) { 15595 case 0x00000c00: { 15596 // 0xf9a00c00 15597 switch (instr & 0x0000000d) { 15598 case 0x0000000d: { 15599 // 0xf9a00c0d 15600 switch (instr & 0x00000002) { 15601 case 0x00000000: { 15602 // 0xf9a00c0d 15603 DataType dt = 15604 Dt_size_7_Decode((instr >> 6) & 0x3); 15605 if (dt.Is(kDataTypeValueInvalid)) { 15606 UnallocatedT32(instr); 15607 return; 15608 } 15609 Alignment align = 15610 Align_a_1_Decode((instr >> 4) & 0x1, 15611 dt); 15612 if (dt.Is(kDataTypeValueInvalid) || 15613 align.Is(kBadAlignment)) { 15614 UnallocatedT32(instr); 15615 return; 15616 } 15617 unsigned first = 15618 ExtractDRegister(instr, 22, 12); 15619 unsigned length; 15620 SpacingType spacing = kSingle; 15621 switch ((instr >> 5) & 0x1) { 15622 default: 15623 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 15624 case 0x0: 15625 length = 1; 15626 break; 15627 case 0x1: 15628 length = 2; 15629 break; 15630 } 15631 unsigned last = first + length - 1; 15632 TransferType transfer = kAllLanes; 15633 unsigned rn = (instr >> 16) & 0xf; 15634 // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length) 15635 vld1(CurrentCond(), 15636 dt, 15637 NeonRegisterList(DRegister(first), 15638 DRegister(last), 15639 spacing, 15640 transfer), 15641 AlignedMemOperand(Register(rn), 15642 align, 15643 PostIndex)); 15644 break; 15645 } 15646 case 0x00000002: { 15647 // 0xf9a00c0f 15648 DataType dt = 15649 Dt_size_7_Decode((instr >> 6) & 0x3); 15650 if (dt.Is(kDataTypeValueInvalid)) { 15651 UnallocatedT32(instr); 15652 return; 15653 } 15654 Alignment align = 15655 Align_a_1_Decode((instr >> 4) & 0x1, 15656 dt); 15657 if (dt.Is(kDataTypeValueInvalid) || 15658 align.Is(kBadAlignment)) { 15659 UnallocatedT32(instr); 15660 return; 15661 } 15662 unsigned first = 15663 ExtractDRegister(instr, 22, 12); 15664 unsigned length; 15665 SpacingType spacing = kSingle; 15666 switch ((instr >> 5) & 0x1) { 15667 default: 15668 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 15669 case 0x0: 15670 length = 1; 15671 break; 15672 case 0x1: 15673 length = 2; 15674 break; 15675 } 15676 unsigned last = first + length - 1; 15677 TransferType transfer = kAllLanes; 15678 unsigned rn = (instr >> 16) & 0xf; 15679 // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length) 15680 vld1(CurrentCond(), 15681 dt, 15682 NeonRegisterList(DRegister(first), 15683 DRegister(last), 15684 spacing, 15685 transfer), 15686 AlignedMemOperand(Register(rn), 15687 align, 15688 Offset)); 15689 break; 15690 } 15691 } 15692 break; 15693 } 15694 default: { 15695 if (((instr & 0xd) == 0xd)) { 15696 UnallocatedT32(instr); 15697 return; 15698 } 15699 DataType dt = 15700 Dt_size_7_Decode((instr >> 6) & 0x3); 15701 if (dt.Is(kDataTypeValueInvalid)) { 15702 UnallocatedT32(instr); 15703 return; 15704 } 15705 Alignment align = 15706 Align_a_1_Decode((instr >> 4) & 0x1, dt); 15707 if (dt.Is(kDataTypeValueInvalid) || 15708 align.Is(kBadAlignment)) { 15709 UnallocatedT32(instr); 15710 return; 15711 } 15712 unsigned first = 15713 ExtractDRegister(instr, 22, 12); 15714 unsigned length; 15715 SpacingType spacing = kSingle; 15716 switch ((instr >> 5) & 0x1) { 15717 default: 15718 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 15719 case 0x0: 15720 length = 1; 15721 break; 15722 case 0x1: 15723 length = 2; 15724 break; 15725 } 15726 unsigned last = first + length - 1; 15727 TransferType transfer = kAllLanes; 15728 unsigned rn = (instr >> 16) & 0xf; 15729 unsigned rm = instr & 0xf; 15730 // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length) 15731 vld1(CurrentCond(), 15732 dt, 15733 NeonRegisterList(DRegister(first), 15734 DRegister(last), 15735 spacing, 15736 transfer), 15737 AlignedMemOperand(Register(rn), 15738 align, 15739 Register(rm), 15740 PostIndex)); 15741 break; 15742 } 15743 } 15744 break; 15745 } 15746 default: { 15747 switch (instr & 0x0000000d) { 15748 case 0x0000000d: { 15749 // 0xf9a0000d 15750 switch (instr & 0x00000002) { 15751 case 0x00000000: { 15752 // 0xf9a0000d 15753 if (((instr & 0xc00) == 0xc00)) { 15754 UnallocatedT32(instr); 15755 return; 15756 } 15757 DataType dt = 15758 Dt_size_7_Decode((instr >> 10) & 0x3); 15759 if (dt.Is(kDataTypeValueInvalid)) { 15760 UnallocatedT32(instr); 15761 return; 15762 } 15763 DecodeNeonAndAlign decode_neon = 15764 Align_index_align_1_Decode((instr >> 15765 4) & 15766 0xf, 15767 dt); 15768 if (!decode_neon.IsValid()) { 15769 UnallocatedT32(instr); 15770 return; 15771 } 15772 Alignment align = decode_neon.GetAlign(); 15773 int lane = decode_neon.GetLane(); 15774 SpacingType spacing = 15775 decode_neon.GetSpacing(); 15776 unsigned first = 15777 ExtractDRegister(instr, 22, 12); 15778 unsigned length = 1; 15779 unsigned last = first + length - 1; 15780 unsigned rn = (instr >> 16) & 0xf; 15781 // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length) 15782 vld1(CurrentCond(), 15783 dt, 15784 NeonRegisterList(DRegister(first), 15785 DRegister(last), 15786 spacing, 15787 lane), 15788 AlignedMemOperand(Register(rn), 15789 align, 15790 PostIndex)); 15791 break; 15792 } 15793 case 0x00000002: { 15794 // 0xf9a0000f 15795 if (((instr & 0xc00) == 0xc00)) { 15796 UnallocatedT32(instr); 15797 return; 15798 } 15799 DataType dt = 15800 Dt_size_7_Decode((instr >> 10) & 0x3); 15801 if (dt.Is(kDataTypeValueInvalid)) { 15802 UnallocatedT32(instr); 15803 return; 15804 } 15805 DecodeNeonAndAlign decode_neon = 15806 Align_index_align_1_Decode((instr >> 15807 4) & 15808 0xf, 15809 dt); 15810 if (!decode_neon.IsValid()) { 15811 UnallocatedT32(instr); 15812 return; 15813 } 15814 Alignment align = decode_neon.GetAlign(); 15815 int lane = decode_neon.GetLane(); 15816 SpacingType spacing = 15817 decode_neon.GetSpacing(); 15818 unsigned first = 15819 ExtractDRegister(instr, 22, 12); 15820 unsigned length = 1; 15821 unsigned last = first + length - 1; 15822 unsigned rn = (instr >> 16) & 0xf; 15823 // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length) 15824 vld1(CurrentCond(), 15825 dt, 15826 NeonRegisterList(DRegister(first), 15827 DRegister(last), 15828 spacing, 15829 lane), 15830 AlignedMemOperand(Register(rn), 15831 align, 15832 Offset)); 15833 break; 15834 } 15835 } 15836 break; 15837 } 15838 default: { 15839 if (((instr & 0xc00) == 0xc00) || 15840 ((instr & 0xd) == 0xd)) { 15841 UnallocatedT32(instr); 15842 return; 15843 } 15844 DataType dt = 15845 Dt_size_7_Decode((instr >> 10) & 0x3); 15846 if (dt.Is(kDataTypeValueInvalid)) { 15847 UnallocatedT32(instr); 15848 return; 15849 } 15850 DecodeNeonAndAlign decode_neon = 15851 Align_index_align_1_Decode((instr >> 4) & 15852 0xf, 15853 dt); 15854 if (!decode_neon.IsValid()) { 15855 UnallocatedT32(instr); 15856 return; 15857 } 15858 Alignment align = decode_neon.GetAlign(); 15859 int lane = decode_neon.GetLane(); 15860 SpacingType spacing = 15861 decode_neon.GetSpacing(); 15862 unsigned first = 15863 ExtractDRegister(instr, 22, 12); 15864 unsigned length = 1; 15865 unsigned last = first + length - 1; 15866 unsigned rn = (instr >> 16) & 0xf; 15867 unsigned rm = instr & 0xf; 15868 // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length) 15869 vld1(CurrentCond(), 15870 dt, 15871 NeonRegisterList(DRegister(first), 15872 DRegister(last), 15873 spacing, 15874 lane), 15875 AlignedMemOperand(Register(rn), 15876 align, 15877 Register(rm), 15878 PostIndex)); 15879 break; 15880 } 15881 } 15882 break; 15883 } 15884 } 15885 break; 15886 } 15887 case 0x00000100: { 15888 // 0xf9a00100 15889 switch (instr & 0x00000c00) { 15890 case 0x00000c00: { 15891 // 0xf9a00d00 15892 switch (instr & 0x0000000d) { 15893 case 0x0000000d: { 15894 // 0xf9a00d0d 15895 switch (instr & 0x00000002) { 15896 case 0x00000000: { 15897 // 0xf9a00d0d 15898 DataType dt = 15899 Dt_size_7_Decode((instr >> 6) & 0x3); 15900 if (dt.Is(kDataTypeValueInvalid)) { 15901 UnallocatedT32(instr); 15902 return; 15903 } 15904 Alignment align = 15905 Align_a_2_Decode((instr >> 4) & 0x1, 15906 dt); 15907 if (dt.Is(kDataTypeValueInvalid) || 15908 align.Is(kBadAlignment)) { 15909 UnallocatedT32(instr); 15910 return; 15911 } 15912 unsigned first = 15913 ExtractDRegister(instr, 22, 12); 15914 unsigned length; 15915 SpacingType spacing; 15916 switch ((instr >> 5) & 0x1) { 15917 default: 15918 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 15919 case 0x0: 15920 length = 2; 15921 spacing = kSingle; 15922 break; 15923 case 0x1: 15924 length = 2; 15925 spacing = kDouble; 15926 break; 15927 } 15928 unsigned last = 15929 first + 15930 (length - 1) * 15931 (spacing == kSingle ? 1 : 2); 15932 TransferType transfer = kAllLanes; 15933 unsigned rn = (instr >> 16) & 0xf; 15934 // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length) 15935 vld2(CurrentCond(), 15936 dt, 15937 NeonRegisterList(DRegister(first), 15938 DRegister(last), 15939 spacing, 15940 transfer), 15941 AlignedMemOperand(Register(rn), 15942 align, 15943 PostIndex)); 15944 break; 15945 } 15946 case 0x00000002: { 15947 // 0xf9a00d0f 15948 DataType dt = 15949 Dt_size_7_Decode((instr >> 6) & 0x3); 15950 if (dt.Is(kDataTypeValueInvalid)) { 15951 UnallocatedT32(instr); 15952 return; 15953 } 15954 Alignment align = 15955 Align_a_2_Decode((instr >> 4) & 0x1, 15956 dt); 15957 if (dt.Is(kDataTypeValueInvalid) || 15958 align.Is(kBadAlignment)) { 15959 UnallocatedT32(instr); 15960 return; 15961 } 15962 unsigned first = 15963 ExtractDRegister(instr, 22, 12); 15964 unsigned length; 15965 SpacingType spacing; 15966 switch ((instr >> 5) & 0x1) { 15967 default: 15968 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 15969 case 0x0: 15970 length = 2; 15971 spacing = kSingle; 15972 break; 15973 case 0x1: 15974 length = 2; 15975 spacing = kDouble; 15976 break; 15977 } 15978 unsigned last = 15979 first + 15980 (length - 1) * 15981 (spacing == kSingle ? 1 : 2); 15982 TransferType transfer = kAllLanes; 15983 unsigned rn = (instr >> 16) & 0xf; 15984 // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length) 15985 vld2(CurrentCond(), 15986 dt, 15987 NeonRegisterList(DRegister(first), 15988 DRegister(last), 15989 spacing, 15990 transfer), 15991 AlignedMemOperand(Register(rn), 15992 align, 15993 Offset)); 15994 break; 15995 } 15996 } 15997 break; 15998 } 15999 default: { 16000 if (((instr & 0xd) == 0xd)) { 16001 UnallocatedT32(instr); 16002 return; 16003 } 16004 DataType dt = 16005 Dt_size_7_Decode((instr >> 6) & 0x3); 16006 if (dt.Is(kDataTypeValueInvalid)) { 16007 UnallocatedT32(instr); 16008 return; 16009 } 16010 Alignment align = 16011 Align_a_2_Decode((instr >> 4) & 0x1, dt); 16012 if (dt.Is(kDataTypeValueInvalid) || 16013 align.Is(kBadAlignment)) { 16014 UnallocatedT32(instr); 16015 return; 16016 } 16017 unsigned first = 16018 ExtractDRegister(instr, 22, 12); 16019 unsigned length; 16020 SpacingType spacing; 16021 switch ((instr >> 5) & 0x1) { 16022 default: 16023 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 16024 case 0x0: 16025 length = 2; 16026 spacing = kSingle; 16027 break; 16028 case 0x1: 16029 length = 2; 16030 spacing = kDouble; 16031 break; 16032 } 16033 unsigned last = 16034 first + 16035 (length - 1) * 16036 (spacing == kSingle ? 1 : 2); 16037 TransferType transfer = kAllLanes; 16038 unsigned rn = (instr >> 16) & 0xf; 16039 unsigned rm = instr & 0xf; 16040 // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length) 16041 vld2(CurrentCond(), 16042 dt, 16043 NeonRegisterList(DRegister(first), 16044 DRegister(last), 16045 spacing, 16046 transfer), 16047 AlignedMemOperand(Register(rn), 16048 align, 16049 Register(rm), 16050 PostIndex)); 16051 break; 16052 } 16053 } 16054 break; 16055 } 16056 default: { 16057 switch (instr & 0x0000000d) { 16058 case 0x0000000d: { 16059 // 0xf9a0010d 16060 switch (instr & 0x00000002) { 16061 case 0x00000000: { 16062 // 0xf9a0010d 16063 if (((instr & 0xc00) == 0xc00)) { 16064 UnallocatedT32(instr); 16065 return; 16066 } 16067 DataType dt = 16068 Dt_size_7_Decode((instr >> 10) & 0x3); 16069 if (dt.Is(kDataTypeValueInvalid)) { 16070 UnallocatedT32(instr); 16071 return; 16072 } 16073 DecodeNeonAndAlign decode_neon = 16074 Align_index_align_2_Decode((instr >> 16075 4) & 16076 0xf, 16077 dt); 16078 if (!decode_neon.IsValid()) { 16079 UnallocatedT32(instr); 16080 return; 16081 } 16082 Alignment align = decode_neon.GetAlign(); 16083 int lane = decode_neon.GetLane(); 16084 SpacingType spacing = 16085 decode_neon.GetSpacing(); 16086 unsigned first = 16087 ExtractDRegister(instr, 22, 12); 16088 unsigned length = 2; 16089 unsigned last = 16090 first + 16091 (length - 1) * 16092 (spacing == kSingle ? 1 : 2); 16093 unsigned rn = (instr >> 16) & 0xf; 16094 // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length) 16095 vld2(CurrentCond(), 16096 dt, 16097 NeonRegisterList(DRegister(first), 16098 DRegister(last), 16099 spacing, 16100 lane), 16101 AlignedMemOperand(Register(rn), 16102 align, 16103 PostIndex)); 16104 break; 16105 } 16106 case 0x00000002: { 16107 // 0xf9a0010f 16108 if (((instr & 0xc00) == 0xc00)) { 16109 UnallocatedT32(instr); 16110 return; 16111 } 16112 DataType dt = 16113 Dt_size_7_Decode((instr >> 10) & 0x3); 16114 if (dt.Is(kDataTypeValueInvalid)) { 16115 UnallocatedT32(instr); 16116 return; 16117 } 16118 DecodeNeonAndAlign decode_neon = 16119 Align_index_align_2_Decode((instr >> 16120 4) & 16121 0xf, 16122 dt); 16123 if (!decode_neon.IsValid()) { 16124 UnallocatedT32(instr); 16125 return; 16126 } 16127 Alignment align = decode_neon.GetAlign(); 16128 int lane = decode_neon.GetLane(); 16129 SpacingType spacing = 16130 decode_neon.GetSpacing(); 16131 unsigned first = 16132 ExtractDRegister(instr, 22, 12); 16133 unsigned length = 2; 16134 unsigned last = 16135 first + 16136 (length - 1) * 16137 (spacing == kSingle ? 1 : 2); 16138 unsigned rn = (instr >> 16) & 0xf; 16139 // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length) 16140 vld2(CurrentCond(), 16141 dt, 16142 NeonRegisterList(DRegister(first), 16143 DRegister(last), 16144 spacing, 16145 lane), 16146 AlignedMemOperand(Register(rn), 16147 align, 16148 Offset)); 16149 break; 16150 } 16151 } 16152 break; 16153 } 16154 default: { 16155 if (((instr & 0xc00) == 0xc00) || 16156 ((instr & 0xd) == 0xd)) { 16157 UnallocatedT32(instr); 16158 return; 16159 } 16160 DataType dt = 16161 Dt_size_7_Decode((instr >> 10) & 0x3); 16162 if (dt.Is(kDataTypeValueInvalid)) { 16163 UnallocatedT32(instr); 16164 return; 16165 } 16166 DecodeNeonAndAlign decode_neon = 16167 Align_index_align_2_Decode((instr >> 4) & 16168 0xf, 16169 dt); 16170 if (!decode_neon.IsValid()) { 16171 UnallocatedT32(instr); 16172 return; 16173 } 16174 Alignment align = decode_neon.GetAlign(); 16175 int lane = decode_neon.GetLane(); 16176 SpacingType spacing = 16177 decode_neon.GetSpacing(); 16178 unsigned first = 16179 ExtractDRegister(instr, 22, 12); 16180 unsigned length = 2; 16181 unsigned last = 16182 first + 16183 (length - 1) * 16184 (spacing == kSingle ? 1 : 2); 16185 unsigned rn = (instr >> 16) & 0xf; 16186 unsigned rm = instr & 0xf; 16187 // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length) 16188 vld2(CurrentCond(), 16189 dt, 16190 NeonRegisterList(DRegister(first), 16191 DRegister(last), 16192 spacing, 16193 lane), 16194 AlignedMemOperand(Register(rn), 16195 align, 16196 Register(rm), 16197 PostIndex)); 16198 break; 16199 } 16200 } 16201 break; 16202 } 16203 } 16204 break; 16205 } 16206 case 0x00000200: { 16207 // 0xf9a00200 16208 switch (instr & 0x00000c00) { 16209 case 0x00000c00: { 16210 // 0xf9a00e00 16211 switch (instr & 0x00000010) { 16212 case 0x00000000: { 16213 // 0xf9a00e00 16214 switch (instr & 0x0000000d) { 16215 case 0x0000000d: { 16216 // 0xf9a00e0d 16217 switch (instr & 0x00000002) { 16218 case 0x00000000: { 16219 // 0xf9a00e0d 16220 DataType dt = Dt_size_7_Decode( 16221 (instr >> 6) & 0x3); 16222 if (dt.Is(kDataTypeValueInvalid)) { 16223 UnallocatedT32(instr); 16224 return; 16225 } 16226 unsigned first = 16227 ExtractDRegister(instr, 22, 12); 16228 unsigned length; 16229 SpacingType spacing; 16230 switch ((instr >> 5) & 0x1) { 16231 default: 16232 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 16233 case 0x0: 16234 length = 3; 16235 spacing = kSingle; 16236 break; 16237 case 0x1: 16238 length = 3; 16239 spacing = kDouble; 16240 break; 16241 } 16242 unsigned last = 16243 first + 16244 (length - 1) * 16245 (spacing == kSingle ? 1 : 2); 16246 TransferType transfer = kAllLanes; 16247 unsigned rn = (instr >> 16) & 0xf; 16248 // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>]! ; T1 NOLINT(whitespace/line_length) 16249 vld3(CurrentCond(), 16250 dt, 16251 NeonRegisterList(DRegister( 16252 first), 16253 DRegister(last), 16254 spacing, 16255 transfer), 16256 MemOperand(Register(rn), 16257 PostIndex)); 16258 break; 16259 } 16260 case 0x00000002: { 16261 // 0xf9a00e0f 16262 DataType dt = Dt_size_7_Decode( 16263 (instr >> 6) & 0x3); 16264 if (dt.Is(kDataTypeValueInvalid)) { 16265 UnallocatedT32(instr); 16266 return; 16267 } 16268 unsigned first = 16269 ExtractDRegister(instr, 22, 12); 16270 unsigned length; 16271 SpacingType spacing; 16272 switch ((instr >> 5) & 0x1) { 16273 default: 16274 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 16275 case 0x0: 16276 length = 3; 16277 spacing = kSingle; 16278 break; 16279 case 0x1: 16280 length = 3; 16281 spacing = kDouble; 16282 break; 16283 } 16284 unsigned last = 16285 first + 16286 (length - 1) * 16287 (spacing == kSingle ? 1 : 2); 16288 TransferType transfer = kAllLanes; 16289 unsigned rn = (instr >> 16) & 0xf; 16290 // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>] ; T1 NOLINT(whitespace/line_length) 16291 vld3(CurrentCond(), 16292 dt, 16293 NeonRegisterList(DRegister( 16294 first), 16295 DRegister(last), 16296 spacing, 16297 transfer), 16298 MemOperand(Register(rn), 16299 Offset)); 16300 break; 16301 } 16302 } 16303 break; 16304 } 16305 default: { 16306 if (((instr & 0xd) == 0xd)) { 16307 UnallocatedT32(instr); 16308 return; 16309 } 16310 DataType dt = 16311 Dt_size_7_Decode((instr >> 6) & 0x3); 16312 if (dt.Is(kDataTypeValueInvalid)) { 16313 UnallocatedT32(instr); 16314 return; 16315 } 16316 unsigned first = 16317 ExtractDRegister(instr, 22, 12); 16318 unsigned length; 16319 SpacingType spacing; 16320 switch ((instr >> 5) & 0x1) { 16321 default: 16322 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 16323 case 0x0: 16324 length = 3; 16325 spacing = kSingle; 16326 break; 16327 case 0x1: 16328 length = 3; 16329 spacing = kDouble; 16330 break; 16331 } 16332 unsigned last = 16333 first + 16334 (length - 1) * 16335 (spacing == kSingle ? 1 : 2); 16336 TransferType transfer = kAllLanes; 16337 unsigned rn = (instr >> 16) & 0xf; 16338 Sign sign(plus); 16339 unsigned rm = instr & 0xf; 16340 // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>], #<Rm> ; T1 NOLINT(whitespace/line_length) 16341 vld3(CurrentCond(), 16342 dt, 16343 NeonRegisterList(DRegister(first), 16344 DRegister(last), 16345 spacing, 16346 transfer), 16347 MemOperand(Register(rn), 16348 sign, 16349 Register(rm), 16350 PostIndex)); 16351 break; 16352 } 16353 } 16354 break; 16355 } 16356 default: 16357 UnallocatedT32(instr); 16358 break; 16359 } 16360 break; 16361 } 16362 default: { 16363 switch (instr & 0x0000000d) { 16364 case 0x0000000d: { 16365 // 0xf9a0020d 16366 switch (instr & 0x00000002) { 16367 case 0x00000000: { 16368 // 0xf9a0020d 16369 if (((instr & 0xc00) == 0xc00)) { 16370 UnallocatedT32(instr); 16371 return; 16372 } 16373 DataType dt = 16374 Dt_size_7_Decode((instr >> 10) & 0x3); 16375 if (dt.Is(kDataTypeValueInvalid)) { 16376 UnallocatedT32(instr); 16377 return; 16378 } 16379 DecodeNeon decode_neon = 16380 Index_1_Decode((instr >> 4) & 0xf, 16381 dt); 16382 if (!decode_neon.IsValid()) { 16383 UnallocatedT32(instr); 16384 return; 16385 } 16386 int lane = decode_neon.GetLane(); 16387 SpacingType spacing = 16388 decode_neon.GetSpacing(); 16389 unsigned first = 16390 ExtractDRegister(instr, 22, 12); 16391 unsigned length = 3; 16392 unsigned last = 16393 first + 16394 (length - 1) * 16395 (spacing == kSingle ? 1 : 2); 16396 unsigned rn = (instr >> 16) & 0xf; 16397 // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>]! ; T1 NOLINT(whitespace/line_length) 16398 vld3(CurrentCond(), 16399 dt, 16400 NeonRegisterList(DRegister(first), 16401 DRegister(last), 16402 spacing, 16403 lane), 16404 MemOperand(Register(rn), PostIndex)); 16405 break; 16406 } 16407 case 0x00000002: { 16408 // 0xf9a0020f 16409 if (((instr & 0xc00) == 0xc00)) { 16410 UnallocatedT32(instr); 16411 return; 16412 } 16413 DataType dt = 16414 Dt_size_7_Decode((instr >> 10) & 0x3); 16415 if (dt.Is(kDataTypeValueInvalid)) { 16416 UnallocatedT32(instr); 16417 return; 16418 } 16419 DecodeNeon decode_neon = 16420 Index_1_Decode((instr >> 4) & 0xf, 16421 dt); 16422 if (!decode_neon.IsValid()) { 16423 UnallocatedT32(instr); 16424 return; 16425 } 16426 int lane = decode_neon.GetLane(); 16427 SpacingType spacing = 16428 decode_neon.GetSpacing(); 16429 unsigned first = 16430 ExtractDRegister(instr, 22, 12); 16431 unsigned length = 3; 16432 unsigned last = 16433 first + 16434 (length - 1) * 16435 (spacing == kSingle ? 1 : 2); 16436 unsigned rn = (instr >> 16) & 0xf; 16437 // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>] ; T1 16438 vld3(CurrentCond(), 16439 dt, 16440 NeonRegisterList(DRegister(first), 16441 DRegister(last), 16442 spacing, 16443 lane), 16444 MemOperand(Register(rn), Offset)); 16445 break; 16446 } 16447 } 16448 break; 16449 } 16450 default: { 16451 if (((instr & 0xc00) == 0xc00) || 16452 ((instr & 0xd) == 0xd)) { 16453 UnallocatedT32(instr); 16454 return; 16455 } 16456 DataType dt = 16457 Dt_size_7_Decode((instr >> 10) & 0x3); 16458 if (dt.Is(kDataTypeValueInvalid)) { 16459 UnallocatedT32(instr); 16460 return; 16461 } 16462 DecodeNeon decode_neon = 16463 Index_1_Decode((instr >> 4) & 0xf, dt); 16464 if (!decode_neon.IsValid()) { 16465 UnallocatedT32(instr); 16466 return; 16467 } 16468 int lane = decode_neon.GetLane(); 16469 SpacingType spacing = 16470 decode_neon.GetSpacing(); 16471 unsigned first = 16472 ExtractDRegister(instr, 22, 12); 16473 unsigned length = 3; 16474 unsigned last = 16475 first + 16476 (length - 1) * 16477 (spacing == kSingle ? 1 : 2); 16478 unsigned rn = (instr >> 16) & 0xf; 16479 Sign sign(plus); 16480 unsigned rm = instr & 0xf; 16481 // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>], #<Rm> ; T1 NOLINT(whitespace/line_length) 16482 vld3(CurrentCond(), 16483 dt, 16484 NeonRegisterList(DRegister(first), 16485 DRegister(last), 16486 spacing, 16487 lane), 16488 MemOperand(Register(rn), 16489 sign, 16490 Register(rm), 16491 PostIndex)); 16492 break; 16493 } 16494 } 16495 break; 16496 } 16497 } 16498 break; 16499 } 16500 case 0x00000300: { 16501 // 0xf9a00300 16502 switch (instr & 0x00000c00) { 16503 case 0x00000c00: { 16504 // 0xf9a00f00 16505 switch (instr & 0x0000000d) { 16506 case 0x0000000d: { 16507 // 0xf9a00f0d 16508 switch (instr & 0x00000002) { 16509 case 0x00000000: { 16510 // 0xf9a00f0d 16511 DataType dt = 16512 Dt_size_8_Decode((instr >> 6) & 0x3); 16513 if (dt.Is(kDataTypeValueInvalid)) { 16514 UnallocatedT32(instr); 16515 return; 16516 } 16517 Alignment align = 16518 Align_a_3_Decode((instr >> 4) & 0x1, 16519 dt, 16520 (instr >> 6) & 0x3); 16521 if (dt.Is(kDataTypeValueInvalid) || 16522 align.Is(kBadAlignment)) { 16523 UnallocatedT32(instr); 16524 return; 16525 } 16526 unsigned first = 16527 ExtractDRegister(instr, 22, 12); 16528 unsigned length; 16529 SpacingType spacing; 16530 switch ((instr >> 5) & 0x1) { 16531 default: 16532 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 16533 case 0x0: 16534 length = 4; 16535 spacing = kSingle; 16536 break; 16537 case 0x1: 16538 length = 4; 16539 spacing = kDouble; 16540 break; 16541 } 16542 unsigned last = 16543 first + 16544 (length - 1) * 16545 (spacing == kSingle ? 1 : 2); 16546 TransferType transfer = kAllLanes; 16547 unsigned rn = (instr >> 16) & 0xf; 16548 // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length) 16549 vld4(CurrentCond(), 16550 dt, 16551 NeonRegisterList(DRegister(first), 16552 DRegister(last), 16553 spacing, 16554 transfer), 16555 AlignedMemOperand(Register(rn), 16556 align, 16557 PostIndex)); 16558 break; 16559 } 16560 case 0x00000002: { 16561 // 0xf9a00f0f 16562 DataType dt = 16563 Dt_size_8_Decode((instr >> 6) & 0x3); 16564 if (dt.Is(kDataTypeValueInvalid)) { 16565 UnallocatedT32(instr); 16566 return; 16567 } 16568 Alignment align = 16569 Align_a_3_Decode((instr >> 4) & 0x1, 16570 dt, 16571 (instr >> 6) & 0x3); 16572 if (dt.Is(kDataTypeValueInvalid) || 16573 align.Is(kBadAlignment)) { 16574 UnallocatedT32(instr); 16575 return; 16576 } 16577 unsigned first = 16578 ExtractDRegister(instr, 22, 12); 16579 unsigned length; 16580 SpacingType spacing; 16581 switch ((instr >> 5) & 0x1) { 16582 default: 16583 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 16584 case 0x0: 16585 length = 4; 16586 spacing = kSingle; 16587 break; 16588 case 0x1: 16589 length = 4; 16590 spacing = kDouble; 16591 break; 16592 } 16593 unsigned last = 16594 first + 16595 (length - 1) * 16596 (spacing == kSingle ? 1 : 2); 16597 TransferType transfer = kAllLanes; 16598 unsigned rn = (instr >> 16) & 0xf; 16599 // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length) 16600 vld4(CurrentCond(), 16601 dt, 16602 NeonRegisterList(DRegister(first), 16603 DRegister(last), 16604 spacing, 16605 transfer), 16606 AlignedMemOperand(Register(rn), 16607 align, 16608 Offset)); 16609 break; 16610 } 16611 } 16612 break; 16613 } 16614 default: { 16615 if (((instr & 0xd) == 0xd)) { 16616 UnallocatedT32(instr); 16617 return; 16618 } 16619 DataType dt = 16620 Dt_size_8_Decode((instr >> 6) & 0x3); 16621 if (dt.Is(kDataTypeValueInvalid)) { 16622 UnallocatedT32(instr); 16623 return; 16624 } 16625 Alignment align = 16626 Align_a_3_Decode((instr >> 4) & 0x1, 16627 dt, 16628 (instr >> 6) & 0x3); 16629 if (dt.Is(kDataTypeValueInvalid) || 16630 align.Is(kBadAlignment)) { 16631 UnallocatedT32(instr); 16632 return; 16633 } 16634 unsigned first = 16635 ExtractDRegister(instr, 22, 12); 16636 unsigned length; 16637 SpacingType spacing; 16638 switch ((instr >> 5) & 0x1) { 16639 default: 16640 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 16641 case 0x0: 16642 length = 4; 16643 spacing = kSingle; 16644 break; 16645 case 0x1: 16646 length = 4; 16647 spacing = kDouble; 16648 break; 16649 } 16650 unsigned last = 16651 first + 16652 (length - 1) * 16653 (spacing == kSingle ? 1 : 2); 16654 TransferType transfer = kAllLanes; 16655 unsigned rn = (instr >> 16) & 0xf; 16656 unsigned rm = instr & 0xf; 16657 // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length) 16658 vld4(CurrentCond(), 16659 dt, 16660 NeonRegisterList(DRegister(first), 16661 DRegister(last), 16662 spacing, 16663 transfer), 16664 AlignedMemOperand(Register(rn), 16665 align, 16666 Register(rm), 16667 PostIndex)); 16668 break; 16669 } 16670 } 16671 break; 16672 } 16673 default: { 16674 switch (instr & 0x0000000d) { 16675 case 0x0000000d: { 16676 // 0xf9a0030d 16677 switch (instr & 0x00000002) { 16678 case 0x00000000: { 16679 // 0xf9a0030d 16680 if (((instr & 0xc00) == 0xc00)) { 16681 UnallocatedT32(instr); 16682 return; 16683 } 16684 DataType dt = 16685 Dt_size_7_Decode((instr >> 10) & 0x3); 16686 if (dt.Is(kDataTypeValueInvalid)) { 16687 UnallocatedT32(instr); 16688 return; 16689 } 16690 DecodeNeonAndAlign decode_neon = 16691 Align_index_align_3_Decode((instr >> 16692 4) & 16693 0xf, 16694 dt); 16695 if (!decode_neon.IsValid()) { 16696 UnallocatedT32(instr); 16697 return; 16698 } 16699 Alignment align = decode_neon.GetAlign(); 16700 int lane = decode_neon.GetLane(); 16701 SpacingType spacing = 16702 decode_neon.GetSpacing(); 16703 unsigned first = 16704 ExtractDRegister(instr, 22, 12); 16705 unsigned length = 4; 16706 unsigned last = 16707 first + 16708 (length - 1) * 16709 (spacing == kSingle ? 1 : 2); 16710 unsigned rn = (instr >> 16) & 0xf; 16711 // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; T1 NOLINT(whitespace/line_length) 16712 vld4(CurrentCond(), 16713 dt, 16714 NeonRegisterList(DRegister(first), 16715 DRegister(last), 16716 spacing, 16717 lane), 16718 AlignedMemOperand(Register(rn), 16719 align, 16720 PostIndex)); 16721 break; 16722 } 16723 case 0x00000002: { 16724 // 0xf9a0030f 16725 if (((instr & 0xc00) == 0xc00)) { 16726 UnallocatedT32(instr); 16727 return; 16728 } 16729 DataType dt = 16730 Dt_size_7_Decode((instr >> 10) & 0x3); 16731 if (dt.Is(kDataTypeValueInvalid)) { 16732 UnallocatedT32(instr); 16733 return; 16734 } 16735 DecodeNeonAndAlign decode_neon = 16736 Align_index_align_3_Decode((instr >> 16737 4) & 16738 0xf, 16739 dt); 16740 if (!decode_neon.IsValid()) { 16741 UnallocatedT32(instr); 16742 return; 16743 } 16744 Alignment align = decode_neon.GetAlign(); 16745 int lane = decode_neon.GetLane(); 16746 SpacingType spacing = 16747 decode_neon.GetSpacing(); 16748 unsigned first = 16749 ExtractDRegister(instr, 22, 12); 16750 unsigned length = 4; 16751 unsigned last = 16752 first + 16753 (length - 1) * 16754 (spacing == kSingle ? 1 : 2); 16755 unsigned rn = (instr >> 16) & 0xf; 16756 // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; T1 NOLINT(whitespace/line_length) 16757 vld4(CurrentCond(), 16758 dt, 16759 NeonRegisterList(DRegister(first), 16760 DRegister(last), 16761 spacing, 16762 lane), 16763 AlignedMemOperand(Register(rn), 16764 align, 16765 Offset)); 16766 break; 16767 } 16768 } 16769 break; 16770 } 16771 default: { 16772 if (((instr & 0xc00) == 0xc00) || 16773 ((instr & 0xd) == 0xd)) { 16774 UnallocatedT32(instr); 16775 return; 16776 } 16777 DataType dt = 16778 Dt_size_7_Decode((instr >> 10) & 0x3); 16779 if (dt.Is(kDataTypeValueInvalid)) { 16780 UnallocatedT32(instr); 16781 return; 16782 } 16783 DecodeNeonAndAlign decode_neon = 16784 Align_index_align_3_Decode((instr >> 4) & 16785 0xf, 16786 dt); 16787 if (!decode_neon.IsValid()) { 16788 UnallocatedT32(instr); 16789 return; 16790 } 16791 Alignment align = decode_neon.GetAlign(); 16792 int lane = decode_neon.GetLane(); 16793 SpacingType spacing = 16794 decode_neon.GetSpacing(); 16795 unsigned first = 16796 ExtractDRegister(instr, 22, 12); 16797 unsigned length = 4; 16798 unsigned last = 16799 first + 16800 (length - 1) * 16801 (spacing == kSingle ? 1 : 2); 16802 unsigned rn = (instr >> 16) & 0xf; 16803 unsigned rm = instr & 0xf; 16804 // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; T1 NOLINT(whitespace/line_length) 16805 vld4(CurrentCond(), 16806 dt, 16807 NeonRegisterList(DRegister(first), 16808 DRegister(last), 16809 spacing, 16810 lane), 16811 AlignedMemOperand(Register(rn), 16812 align, 16813 Register(rm), 16814 PostIndex)); 16815 break; 16816 } 16817 } 16818 break; 16819 } 16820 } 16821 break; 16822 } 16823 } 16824 break; 16825 } 16826 } 16827 break; 16828 } 16829 case 0x10100000: { 16830 // 0xf8100000 16831 switch (instr & 0x01400000) { 16832 case 0x00000000: { 16833 // 0xf8100000 16834 switch (instr & 0x000f0000) { 16835 case 0x000f0000: { 16836 // 0xf81f0000 16837 switch (instr & 0x0000f000) { 16838 case 0x0000f000: { 16839 // 0xf81ff000 16840 uint32_t U = (instr >> 23) & 0x1; 16841 int32_t imm = instr & 0xfff; 16842 if (U == 0) imm = -imm; 16843 bool minus_zero = (imm == 0) && (U == 0); 16844 Location location(imm, kT32PcDelta); 16845 // PLD{<c>}{<q>} <label> ; T1 16846 if (minus_zero) { 16847 pld(CurrentCond(), MemOperand(pc, minus, 0)); 16848 } else { 16849 pld(CurrentCond(), &location); 16850 } 16851 if (((instr & 0xff7ff000) != 0xf81ff000)) { 16852 UnpredictableT32(instr); 16853 } 16854 break; 16855 } 16856 default: { 16857 switch (instr & 0x00200000) { 16858 case 0x00000000: { 16859 // 0xf81f0000 16860 if (((instr & 0xf000) == 0xf000)) { 16861 UnallocatedT32(instr); 16862 return; 16863 } 16864 unsigned rt = (instr >> 12) & 0xf; 16865 uint32_t U = (instr >> 23) & 0x1; 16866 int32_t imm = instr & 0xfff; 16867 if (U == 0) imm = -imm; 16868 bool minus_zero = (imm == 0) && (U == 0); 16869 Location location(imm, kT32PcDelta); 16870 // LDRB{<c>}{<q>} <Rt>, <label> ; T1 16871 if (minus_zero) { 16872 ldrb(CurrentCond(), 16873 Best, 16874 Register(rt), 16875 MemOperand(pc, minus, 0)); 16876 } else { 16877 ldrb(CurrentCond(), 16878 Register(rt), 16879 &location); 16880 } 16881 break; 16882 } 16883 case 0x00200000: { 16884 // 0xf83f0000 16885 if (((instr & 0xf000) == 0xf000)) { 16886 UnallocatedT32(instr); 16887 return; 16888 } 16889 unsigned rt = (instr >> 12) & 0xf; 16890 uint32_t U = (instr >> 23) & 0x1; 16891 int32_t imm = instr & 0xfff; 16892 if (U == 0) imm = -imm; 16893 bool minus_zero = (imm == 0) && (U == 0); 16894 Location location(imm, kT32PcDelta); 16895 // LDRH{<c>}{<q>} <Rt>, <label> ; T1 16896 if (minus_zero) { 16897 ldrh(CurrentCond(), 16898 Best, 16899 Register(rt), 16900 MemOperand(pc, minus, 0)); 16901 } else { 16902 ldrh(CurrentCond(), 16903 Register(rt), 16904 &location); 16905 } 16906 break; 16907 } 16908 } 16909 break; 16910 } 16911 } 16912 break; 16913 } 16914 default: { 16915 switch (instr & 0x00a00000) { 16916 case 0x00000000: { 16917 // 0xf8100000 16918 switch (instr & 0x00000d00) { 16919 case 0x00000000: { 16920 // 0xf8100000 16921 switch (instr & 0x000002c0) { 16922 case 0x00000000: { 16923 // 0xf8100000 16924 switch (instr & 0x0000f000) { 16925 case 0x0000f000: { 16926 // 0xf810f000 16927 if (((instr & 0xf0000) == 0xf0000)) { 16928 UnallocatedT32(instr); 16929 return; 16930 } 16931 unsigned rn = (instr >> 16) & 0xf; 16932 Sign sign(plus); 16933 unsigned rm = instr & 0xf; 16934 Shift shift = LSL; 16935 uint32_t amount = (instr >> 4) & 0x3; 16936 AddrMode addrmode = Offset; 16937 // PLD{<c>}{<q>} [<Rn>, {+}<Rm>{, LSL #<amount>}] ; T1 NOLINT(whitespace/line_length) 16938 pld(CurrentCond(), 16939 MemOperand(Register(rn), 16940 sign, 16941 Register(rm), 16942 shift, 16943 amount, 16944 addrmode)); 16945 break; 16946 } 16947 default: { 16948 if (((instr & 0xf0000) == 0xf0000) || 16949 ((instr & 0xf000) == 0xf000)) { 16950 UnallocatedT32(instr); 16951 return; 16952 } 16953 unsigned rt = (instr >> 12) & 0xf; 16954 unsigned rn = (instr >> 16) & 0xf; 16955 Sign sign(plus); 16956 unsigned rm = instr & 0xf; 16957 Shift shift = LSL; 16958 uint32_t amount = (instr >> 4) & 0x3; 16959 AddrMode addrmode = Offset; 16960 if ((rt < kNumberOfT32LowRegisters) && 16961 (rn < kNumberOfT32LowRegisters) && 16962 (rm < kNumberOfT32LowRegisters) && 16963 shift.IsLSL() && (amount == 0) && 16964 sign.IsPlus()) { 16965 // LDRB{<c>}.W <Rt>, [<Rn>, #{+}<Rm>] ; T2 NOLINT(whitespace/line_length) 16966 ldrb(CurrentCond(), 16967 Wide, 16968 Register(rt), 16969 MemOperand(Register(rn), 16970 sign, 16971 Register(rm), 16972 addrmode)); 16973 } else { 16974 // LDRB{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>{, LSL #<imm>}] ; T2 NOLINT(whitespace/line_length) 16975 ldrb(CurrentCond(), 16976 Best, 16977 Register(rt), 16978 MemOperand(Register(rn), 16979 sign, 16980 Register(rm), 16981 shift, 16982 amount, 16983 addrmode)); 16984 } 16985 break; 16986 } 16987 } 16988 break; 16989 } 16990 default: 16991 UnallocatedT32(instr); 16992 break; 16993 } 16994 break; 16995 } 16996 case 0x00000900: { 16997 // 0xf8100900 16998 if (((instr & 0xf0000) == 0xf0000)) { 16999 UnallocatedT32(instr); 17000 return; 17001 } 17002 unsigned rt = (instr >> 12) & 0xf; 17003 unsigned rn = (instr >> 16) & 0xf; 17004 Sign sign((((instr >> 9) & 0x1) == 0) ? minus 17005 : plus); 17006 int32_t offset = instr & 0xff; 17007 // LDRB{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_2> ; T3 NOLINT(whitespace/line_length) 17008 ldrb(CurrentCond(), 17009 Best, 17010 Register(rt), 17011 MemOperand(Register(rn), 17012 sign, 17013 offset, 17014 PostIndex)); 17015 break; 17016 } 17017 case 0x00000c00: { 17018 // 0xf8100c00 17019 switch (instr & 0x00000200) { 17020 case 0x00000000: { 17021 // 0xf8100c00 17022 switch (instr & 0x0000f000) { 17023 case 0x0000f000: { 17024 // 0xf810fc00 17025 if (((instr & 0xf0000) == 0xf0000)) { 17026 UnallocatedT32(instr); 17027 return; 17028 } 17029 unsigned rn = (instr >> 16) & 0xf; 17030 int32_t offset = instr & 0xff; 17031 // PLD{<c>}{<q>} [<Rn>{, #-<imm_1>}] ; T2 NOLINT(whitespace/line_length) 17032 pld(CurrentCond(), 17033 MemOperand(Register(rn), 17034 minus, 17035 offset, 17036 Offset)); 17037 break; 17038 } 17039 default: { 17040 if (((instr & 0xf0000) == 0xf0000) || 17041 ((instr & 0xf000) == 0xf000)) { 17042 UnallocatedT32(instr); 17043 return; 17044 } 17045 unsigned rt = (instr >> 12) & 0xf; 17046 unsigned rn = (instr >> 16) & 0xf; 17047 int32_t offset = instr & 0xff; 17048 // LDRB{<c>}{<q>} <Rt>, [<Rn>{, #-<imm_2>}] ; T3 NOLINT(whitespace/line_length) 17049 ldrb(CurrentCond(), 17050 Best, 17051 Register(rt), 17052 MemOperand(Register(rn), 17053 minus, 17054 offset, 17055 Offset)); 17056 break; 17057 } 17058 } 17059 break; 17060 } 17061 case 0x00000200: { 17062 // 0xf8100e00 17063 if (((instr & 0xf0000) == 0xf0000)) { 17064 UnallocatedT32(instr); 17065 return; 17066 } 17067 UnimplementedT32_32("LDRBT", instr); 17068 break; 17069 } 17070 } 17071 break; 17072 } 17073 case 0x00000d00: { 17074 // 0xf8100d00 17075 if (((instr & 0xf0000) == 0xf0000)) { 17076 UnallocatedT32(instr); 17077 return; 17078 } 17079 unsigned rt = (instr >> 12) & 0xf; 17080 unsigned rn = (instr >> 16) & 0xf; 17081 Sign sign((((instr >> 9) & 0x1) == 0) ? minus 17082 : plus); 17083 int32_t offset = instr & 0xff; 17084 // LDRB{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_2>}]! ; T3 NOLINT(whitespace/line_length) 17085 ldrb(CurrentCond(), 17086 Best, 17087 Register(rt), 17088 MemOperand(Register(rn), 17089 sign, 17090 offset, 17091 PreIndex)); 17092 break; 17093 } 17094 default: 17095 UnallocatedT32(instr); 17096 break; 17097 } 17098 break; 17099 } 17100 case 0x00200000: { 17101 // 0xf8300000 17102 switch (instr & 0x00000d00) { 17103 case 0x00000000: { 17104 // 0xf8300000 17105 switch (instr & 0x000002c0) { 17106 case 0x00000000: { 17107 // 0xf8300000 17108 switch (instr & 0x0000f000) { 17109 case 0x0000f000: { 17110 // 0xf830f000 17111 if (((instr & 0xf0000) == 0xf0000)) { 17112 UnallocatedT32(instr); 17113 return; 17114 } 17115 unsigned rn = (instr >> 16) & 0xf; 17116 Sign sign(plus); 17117 unsigned rm = instr & 0xf; 17118 Shift shift = LSL; 17119 uint32_t amount = (instr >> 4) & 0x3; 17120 AddrMode addrmode = Offset; 17121 // PLDW{<c>}{<q>} [<Rn>, {+}<Rm>{, LSL #<amount>}] ; T1 NOLINT(whitespace/line_length) 17122 pldw(CurrentCond(), 17123 MemOperand(Register(rn), 17124 sign, 17125 Register(rm), 17126 shift, 17127 amount, 17128 addrmode)); 17129 break; 17130 } 17131 default: { 17132 if (((instr & 0xf0000) == 0xf0000) || 17133 ((instr & 0xf000) == 0xf000)) { 17134 UnallocatedT32(instr); 17135 return; 17136 } 17137 unsigned rt = (instr >> 12) & 0xf; 17138 unsigned rn = (instr >> 16) & 0xf; 17139 Sign sign(plus); 17140 unsigned rm = instr & 0xf; 17141 Shift shift = LSL; 17142 uint32_t amount = (instr >> 4) & 0x3; 17143 AddrMode addrmode = Offset; 17144 if ((rt < kNumberOfT32LowRegisters) && 17145 (rn < kNumberOfT32LowRegisters) && 17146 (rm < kNumberOfT32LowRegisters) && 17147 shift.IsLSL() && (amount == 0) && 17148 sign.IsPlus()) { 17149 // LDRH{<c>}.W <Rt>, [<Rn>, #{+}<Rm>] ; T2 NOLINT(whitespace/line_length) 17150 ldrh(CurrentCond(), 17151 Wide, 17152 Register(rt), 17153 MemOperand(Register(rn), 17154 sign, 17155 Register(rm), 17156 addrmode)); 17157 } else { 17158 // LDRH{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>{, LSL #<imm>}] ; T2 NOLINT(whitespace/line_length) 17159 ldrh(CurrentCond(), 17160 Best, 17161 Register(rt), 17162 MemOperand(Register(rn), 17163 sign, 17164 Register(rm), 17165 shift, 17166 amount, 17167 addrmode)); 17168 } 17169 break; 17170 } 17171 } 17172 break; 17173 } 17174 default: 17175 UnallocatedT32(instr); 17176 break; 17177 } 17178 break; 17179 } 17180 case 0x00000900: { 17181 // 0xf8300900 17182 if (((instr & 0xf0000) == 0xf0000)) { 17183 UnallocatedT32(instr); 17184 return; 17185 } 17186 unsigned rt = (instr >> 12) & 0xf; 17187 unsigned rn = (instr >> 16) & 0xf; 17188 Sign sign((((instr >> 9) & 0x1) == 0) ? minus 17189 : plus); 17190 int32_t offset = instr & 0xff; 17191 // LDRH{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_2> ; T3 NOLINT(whitespace/line_length) 17192 ldrh(CurrentCond(), 17193 Best, 17194 Register(rt), 17195 MemOperand(Register(rn), 17196 sign, 17197 offset, 17198 PostIndex)); 17199 break; 17200 } 17201 case 0x00000c00: { 17202 // 0xf8300c00 17203 switch (instr & 0x00000200) { 17204 case 0x00000000: { 17205 // 0xf8300c00 17206 switch (instr & 0x0000f000) { 17207 case 0x0000f000: { 17208 // 0xf830fc00 17209 if (((instr & 0xf0000) == 0xf0000)) { 17210 UnallocatedT32(instr); 17211 return; 17212 } 17213 unsigned rn = (instr >> 16) & 0xf; 17214 int32_t offset = instr & 0xff; 17215 // PLDW{<c>}{<q>} [<Rn>{, #-<imm_1>}] ; T2 NOLINT(whitespace/line_length) 17216 pldw(CurrentCond(), 17217 MemOperand(Register(rn), 17218 minus, 17219 offset, 17220 Offset)); 17221 break; 17222 } 17223 default: { 17224 if (((instr & 0xf0000) == 0xf0000) || 17225 ((instr & 0xf000) == 0xf000)) { 17226 UnallocatedT32(instr); 17227 return; 17228 } 17229 unsigned rt = (instr >> 12) & 0xf; 17230 unsigned rn = (instr >> 16) & 0xf; 17231 int32_t offset = instr & 0xff; 17232 // LDRH{<c>}{<q>} <Rt>, [<Rn>{, #-<imm_2>}] ; T3 NOLINT(whitespace/line_length) 17233 ldrh(CurrentCond(), 17234 Best, 17235 Register(rt), 17236 MemOperand(Register(rn), 17237 minus, 17238 offset, 17239 Offset)); 17240 break; 17241 } 17242 } 17243 break; 17244 } 17245 case 0x00000200: { 17246 // 0xf8300e00 17247 if (((instr & 0xf0000) == 0xf0000)) { 17248 UnallocatedT32(instr); 17249 return; 17250 } 17251 UnimplementedT32_32("LDRHT", instr); 17252 break; 17253 } 17254 } 17255 break; 17256 } 17257 case 0x00000d00: { 17258 // 0xf8300d00 17259 if (((instr & 0xf0000) == 0xf0000)) { 17260 UnallocatedT32(instr); 17261 return; 17262 } 17263 unsigned rt = (instr >> 12) & 0xf; 17264 unsigned rn = (instr >> 16) & 0xf; 17265 Sign sign((((instr >> 9) & 0x1) == 0) ? minus 17266 : plus); 17267 int32_t offset = instr & 0xff; 17268 // LDRH{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_2>}]! ; T3 NOLINT(whitespace/line_length) 17269 ldrh(CurrentCond(), 17270 Best, 17271 Register(rt), 17272 MemOperand(Register(rn), 17273 sign, 17274 offset, 17275 PreIndex)); 17276 break; 17277 } 17278 default: 17279 UnallocatedT32(instr); 17280 break; 17281 } 17282 break; 17283 } 17284 case 0x00800000: { 17285 // 0xf8900000 17286 switch (instr & 0x0000f000) { 17287 case 0x0000f000: { 17288 // 0xf890f000 17289 if (((instr & 0xf0000) == 0xf0000)) { 17290 UnallocatedT32(instr); 17291 return; 17292 } 17293 unsigned rn = (instr >> 16) & 0xf; 17294 int32_t offset = instr & 0xfff; 17295 // PLD{<c>}{<q>} [<Rn>{, #{+}<imm>}] ; T1 17296 pld(CurrentCond(), 17297 MemOperand(Register(rn), 17298 plus, 17299 offset, 17300 Offset)); 17301 break; 17302 } 17303 default: { 17304 if (((instr & 0xf0000) == 0xf0000) || 17305 ((instr & 0xf000) == 0xf000)) { 17306 UnallocatedT32(instr); 17307 return; 17308 } 17309 unsigned rt = (instr >> 12) & 0xf; 17310 unsigned rn = (instr >> 16) & 0xf; 17311 int32_t offset = instr & 0xfff; 17312 if ((rt < kNumberOfT32LowRegisters) && 17313 (rn < kNumberOfT32LowRegisters) && 17314 ((offset >= 0) && (offset <= 31))) { 17315 // LDRB{<c>}.W <Rt>, [<Rn>{, #{+}<imm_1>}] ; T2 NOLINT(whitespace/line_length) 17316 ldrb(CurrentCond(), 17317 Wide, 17318 Register(rt), 17319 MemOperand(Register(rn), 17320 plus, 17321 offset, 17322 Offset)); 17323 } else { 17324 // LDRB{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm_1>}] ; T2 NOLINT(whitespace/line_length) 17325 ldrb(CurrentCond(), 17326 Best, 17327 Register(rt), 17328 MemOperand(Register(rn), 17329 plus, 17330 offset, 17331 Offset)); 17332 } 17333 break; 17334 } 17335 } 17336 break; 17337 } 17338 case 0x00a00000: { 17339 // 0xf8b00000 17340 switch (instr & 0x0000f000) { 17341 case 0x0000f000: { 17342 // 0xf8b0f000 17343 if (((instr & 0xf0000) == 0xf0000)) { 17344 UnallocatedT32(instr); 17345 return; 17346 } 17347 unsigned rn = (instr >> 16) & 0xf; 17348 int32_t offset = instr & 0xfff; 17349 // PLDW{<c>}{<q>} [<Rn>{, #{+}<imm>}] ; T1 17350 pldw(CurrentCond(), 17351 MemOperand(Register(rn), 17352 plus, 17353 offset, 17354 Offset)); 17355 break; 17356 } 17357 default: { 17358 if (((instr & 0xf0000) == 0xf0000) || 17359 ((instr & 0xf000) == 0xf000)) { 17360 UnallocatedT32(instr); 17361 return; 17362 } 17363 unsigned rt = (instr >> 12) & 0xf; 17364 unsigned rn = (instr >> 16) & 0xf; 17365 int32_t offset = instr & 0xfff; 17366 if ((rt < kNumberOfT32LowRegisters) && 17367 (rn < kNumberOfT32LowRegisters) && 17368 ((offset >= 0) && (offset <= 62) && 17369 ((offset & 1) == 0))) { 17370 // LDRH{<c>}.W <Rt>, [<Rn>{, #{+}<imm_1>}] ; T2 NOLINT(whitespace/line_length) 17371 ldrh(CurrentCond(), 17372 Wide, 17373 Register(rt), 17374 MemOperand(Register(rn), 17375 plus, 17376 offset, 17377 Offset)); 17378 } else { 17379 // LDRH{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm_1>}] ; T2 NOLINT(whitespace/line_length) 17380 ldrh(CurrentCond(), 17381 Best, 17382 Register(rt), 17383 MemOperand(Register(rn), 17384 plus, 17385 offset, 17386 Offset)); 17387 } 17388 break; 17389 } 17390 } 17391 break; 17392 } 17393 } 17394 break; 17395 } 17396 } 17397 break; 17398 } 17399 case 0x00400000: { 17400 // 0xf8500000 17401 switch (instr & 0x00200000) { 17402 case 0x00000000: { 17403 // 0xf8500000 17404 switch (instr & 0x000f0000) { 17405 case 0x000f0000: { 17406 // 0xf85f0000 17407 unsigned rt = (instr >> 12) & 0xf; 17408 uint32_t U = (instr >> 23) & 0x1; 17409 int32_t imm = instr & 0xfff; 17410 if (U == 0) imm = -imm; 17411 bool minus_zero = (imm == 0) && (U == 0); 17412 Location location(imm, kT32PcDelta); 17413 if ((imm >= -4095) && (imm <= 4095) && 17414 ((rt < kNumberOfT32LowRegisters) && 17415 (imm >= 0) && (imm <= 1020) && 17416 ((imm & 3) == 0))) { 17417 // LDR{<c>}.W <Rt>, <label> ; T2 17418 if (minus_zero) { 17419 ldr(CurrentCond(), 17420 Wide, 17421 Register(rt), 17422 MemOperand(pc, minus, 0)); 17423 } else { 17424 ldr(CurrentCond(), 17425 Wide, 17426 Register(rt), 17427 &location); 17428 } 17429 } else if ((imm >= -4095) && (imm <= 4095)) { 17430 // LDR{<c>}{<q>} <Rt>, <label> ; T2 17431 if (minus_zero) { 17432 ldr(CurrentCond(), 17433 Best, 17434 Register(rt), 17435 MemOperand(pc, minus, 0)); 17436 } else { 17437 ldr(CurrentCond(), 17438 Best, 17439 Register(rt), 17440 &location); 17441 } 17442 } else { 17443 UnallocatedT32(instr); 17444 } 17445 break; 17446 } 17447 default: { 17448 switch (instr & 0x00800000) { 17449 case 0x00000000: { 17450 // 0xf8500000 17451 switch (instr & 0x00000d00) { 17452 case 0x00000000: { 17453 // 0xf8500000 17454 if ((instr & 0x000002c0) == 0x00000000) { 17455 if (((instr & 0xf0000) == 0xf0000)) { 17456 UnallocatedT32(instr); 17457 return; 17458 } 17459 unsigned rt = (instr >> 12) & 0xf; 17460 unsigned rn = (instr >> 16) & 0xf; 17461 Sign sign(plus); 17462 unsigned rm = instr & 0xf; 17463 Shift shift = LSL; 17464 uint32_t amount = (instr >> 4) & 0x3; 17465 AddrMode addrmode = Offset; 17466 if ((rt < kNumberOfT32LowRegisters) && 17467 (rn < kNumberOfT32LowRegisters) && 17468 (rm < kNumberOfT32LowRegisters) && 17469 shift.IsLSL() && (amount == 0) && 17470 sign.IsPlus()) { 17471 // LDR{<c>}.W <Rt>, [<Rn>, #{+}<Rm>] ; T2 NOLINT(whitespace/line_length) 17472 ldr(CurrentCond(), 17473 Wide, 17474 Register(rt), 17475 MemOperand(Register(rn), 17476 sign, 17477 Register(rm), 17478 addrmode)); 17479 } else { 17480 // LDR{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>{, LSL #<imm>}] ; T2 NOLINT(whitespace/line_length) 17481 ldr(CurrentCond(), 17482 Best, 17483 Register(rt), 17484 MemOperand(Register(rn), 17485 sign, 17486 Register(rm), 17487 shift, 17488 amount, 17489 addrmode)); 17490 } 17491 } else { 17492 UnallocatedT32(instr); 17493 } 17494 break; 17495 } 17496 case 0x00000900: { 17497 // 0xf8500900 17498 if (((instr & 0xf0000) == 0xf0000)) { 17499 UnallocatedT32(instr); 17500 return; 17501 } 17502 if (((Uint32((instr >> 16)) & 17503 Uint32(0xf)) == Uint32(0xd)) && 17504 ((Uint32((instr >> 9)) & 17505 Uint32(0x1)) == Uint32(0x1)) && 17506 ((Uint32(instr) & Uint32(0xff)) == 17507 Uint32(0x4))) { 17508 unsigned rt = (instr >> 12) & 0xf; 17509 if ((rt <= 7) || (rt == kPCRegNum)) { 17510 // POP{<c>}.W <single_register_list> ; T4 NOLINT(whitespace/line_length) 17511 pop(CurrentCond(), 17512 Wide, 17513 Register(rt)); 17514 } else { 17515 // POP{<c>}{<q>} <single_register_list> ; T4 NOLINT(whitespace/line_length) 17516 pop(CurrentCond(), 17517 Best, 17518 Register(rt)); 17519 } 17520 return; 17521 } 17522 unsigned rt = (instr >> 12) & 0xf; 17523 unsigned rn = (instr >> 16) & 0xf; 17524 Sign sign((((instr >> 9) & 0x1) == 0) 17525 ? minus 17526 : plus); 17527 int32_t offset = instr & 0xff; 17528 // LDR{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_2> ; T4 NOLINT(whitespace/line_length) 17529 ldr(CurrentCond(), 17530 Best, 17531 Register(rt), 17532 MemOperand(Register(rn), 17533 sign, 17534 offset, 17535 PostIndex)); 17536 break; 17537 } 17538 case 0x00000c00: { 17539 // 0xf8500c00 17540 switch (instr & 0x00000200) { 17541 case 0x00000000: { 17542 // 0xf8500c00 17543 if (((instr & 0xf0000) == 0xf0000)) { 17544 UnallocatedT32(instr); 17545 return; 17546 } 17547 unsigned rt = (instr >> 12) & 0xf; 17548 unsigned rn = (instr >> 16) & 0xf; 17549 int32_t offset = instr & 0xff; 17550 // LDR{<c>}{<q>} <Rt>, [<Rn>{, #-<imm_2>}] ; T4 NOLINT(whitespace/line_length) 17551 ldr(CurrentCond(), 17552 Best, 17553 Register(rt), 17554 MemOperand(Register(rn), 17555 minus, 17556 offset, 17557 Offset)); 17558 break; 17559 } 17560 case 0x00000200: { 17561 // 0xf8500e00 17562 if (((instr & 0xf0000) == 0xf0000)) { 17563 UnallocatedT32(instr); 17564 return; 17565 } 17566 UnimplementedT32_32("LDRT", instr); 17567 break; 17568 } 17569 } 17570 break; 17571 } 17572 case 0x00000d00: { 17573 // 0xf8500d00 17574 if (((instr & 0xf0000) == 0xf0000)) { 17575 UnallocatedT32(instr); 17576 return; 17577 } 17578 unsigned rt = (instr >> 12) & 0xf; 17579 unsigned rn = (instr >> 16) & 0xf; 17580 Sign sign((((instr >> 9) & 0x1) == 0) 17581 ? minus 17582 : plus); 17583 int32_t offset = instr & 0xff; 17584 // LDR{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_2>}]! ; T4 NOLINT(whitespace/line_length) 17585 ldr(CurrentCond(), 17586 Best, 17587 Register(rt), 17588 MemOperand(Register(rn), 17589 sign, 17590 offset, 17591 PreIndex)); 17592 break; 17593 } 17594 default: 17595 UnallocatedT32(instr); 17596 break; 17597 } 17598 break; 17599 } 17600 case 0x00800000: { 17601 // 0xf8d00000 17602 if (((instr & 0xf0000) == 0xf0000)) { 17603 UnallocatedT32(instr); 17604 return; 17605 } 17606 unsigned rt = (instr >> 12) & 0xf; 17607 unsigned rn = (instr >> 16) & 0xf; 17608 int32_t offset = instr & 0xfff; 17609 if (((rt < kNumberOfT32LowRegisters) && 17610 (rn < kNumberOfT32LowRegisters) && 17611 ((offset >= 0) && (offset <= 124) && 17612 ((offset & 3) == 0))) || 17613 ((rt < kNumberOfT32LowRegisters) && 17614 (rn == sp.GetCode()) && 17615 ((offset >= 0) && (offset <= 1020) && 17616 ((offset & 3) == 0)))) { 17617 // LDR{<c>}.W <Rt>, [<Rn>{, #{+}<imm_1>}] ; T3 NOLINT(whitespace/line_length) 17618 ldr(CurrentCond(), 17619 Wide, 17620 Register(rt), 17621 MemOperand(Register(rn), 17622 plus, 17623 offset, 17624 Offset)); 17625 } else { 17626 // LDR{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm_1>}] ; T3 NOLINT(whitespace/line_length) 17627 ldr(CurrentCond(), 17628 Best, 17629 Register(rt), 17630 MemOperand(Register(rn), 17631 plus, 17632 offset, 17633 Offset)); 17634 } 17635 break; 17636 } 17637 } 17638 break; 17639 } 17640 } 17641 break; 17642 } 17643 default: 17644 UnallocatedT32(instr); 17645 break; 17646 } 17647 break; 17648 } 17649 case 0x01000000: { 17650 // 0xf9100000 17651 switch (instr & 0x00200000) { 17652 case 0x00000000: { 17653 // 0xf9100000 17654 switch (instr & 0x000f0000) { 17655 case 0x000f0000: { 17656 // 0xf91f0000 17657 switch (instr & 0x0000f000) { 17658 case 0x0000f000: { 17659 // 0xf91ff000 17660 uint32_t U = (instr >> 23) & 0x1; 17661 int32_t imm = instr & 0xfff; 17662 if (U == 0) imm = -imm; 17663 bool minus_zero = (imm == 0) && (U == 0); 17664 Location location(imm, kT32PcDelta); 17665 // PLI{<c>}{<q>} <label> ; T3 17666 if (minus_zero) { 17667 pli(CurrentCond(), 17668 MemOperand(pc, minus, 0)); 17669 } else { 17670 pli(CurrentCond(), &location); 17671 } 17672 break; 17673 } 17674 default: { 17675 if (((instr & 0xf000) == 0xf000)) { 17676 UnallocatedT32(instr); 17677 return; 17678 } 17679 unsigned rt = (instr >> 12) & 0xf; 17680 uint32_t U = (instr >> 23) & 0x1; 17681 int32_t imm = instr & 0xfff; 17682 if (U == 0) imm = -imm; 17683 bool minus_zero = (imm == 0) && (U == 0); 17684 Location location(imm, kT32PcDelta); 17685 // LDRSB{<c>}{<q>} <Rt>, <label> ; T1 17686 if (minus_zero) { 17687 ldrsb(CurrentCond(), 17688 Best, 17689 Register(rt), 17690 MemOperand(pc, minus, 0)); 17691 } else { 17692 ldrsb(CurrentCond(), 17693 Register(rt), 17694 &location); 17695 } 17696 break; 17697 } 17698 } 17699 break; 17700 } 17701 default: { 17702 switch (instr & 0x00800000) { 17703 case 0x00000000: { 17704 // 0xf9100000 17705 switch (instr & 0x00000d00) { 17706 case 0x00000000: { 17707 // 0xf9100000 17708 switch (instr & 0x000002c0) { 17709 case 0x00000000: { 17710 // 0xf9100000 17711 switch (instr & 0x0000f000) { 17712 case 0x0000f000: { 17713 // 0xf910f000 17714 if (((instr & 0xf0000) == 17715 0xf0000)) { 17716 UnallocatedT32(instr); 17717 return; 17718 } 17719 unsigned rn = (instr >> 16) & 0xf; 17720 Sign sign(plus); 17721 unsigned rm = instr & 0xf; 17722 Shift shift = LSL; 17723 uint32_t amount = 17724 (instr >> 4) & 0x3; 17725 AddrMode addrmode = Offset; 17726 // PLI{<c>}{<q>} [<Rn>, {+}<Rm>{, LSL #<amount>}] ; T1 NOLINT(whitespace/line_length) 17727 pli(CurrentCond(), 17728 MemOperand(Register(rn), 17729 sign, 17730 Register(rm), 17731 shift, 17732 amount, 17733 addrmode)); 17734 break; 17735 } 17736 default: { 17737 if (((instr & 0xf0000) == 17738 0xf0000) || 17739 ((instr & 0xf000) == 17740 0xf000)) { 17741 UnallocatedT32(instr); 17742 return; 17743 } 17744 unsigned rt = (instr >> 12) & 0xf; 17745 unsigned rn = (instr >> 16) & 0xf; 17746 Sign sign(plus); 17747 unsigned rm = instr & 0xf; 17748 Shift shift = LSL; 17749 uint32_t amount = 17750 (instr >> 4) & 0x3; 17751 AddrMode addrmode = Offset; 17752 if ((rt < 17753 kNumberOfT32LowRegisters) && 17754 (rn < 17755 kNumberOfT32LowRegisters) && 17756 (rm < 17757 kNumberOfT32LowRegisters) && 17758 shift.IsLSL() && 17759 (amount == 0) && 17760 sign.IsPlus()) { 17761 // LDRSB{<c>}.W <Rt>, [<Rn>, #{+}<Rm>] ; T2 NOLINT(whitespace/line_length) 17762 ldrsb(CurrentCond(), 17763 Wide, 17764 Register(rt), 17765 MemOperand(Register(rn), 17766 sign, 17767 Register(rm), 17768 addrmode)); 17769 } else { 17770 // LDRSB{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>{, LSL #<imm>}] ; T2 NOLINT(whitespace/line_length) 17771 ldrsb(CurrentCond(), 17772 Best, 17773 Register(rt), 17774 MemOperand(Register(rn), 17775 sign, 17776 Register(rm), 17777 shift, 17778 amount, 17779 addrmode)); 17780 } 17781 break; 17782 } 17783 } 17784 break; 17785 } 17786 default: 17787 UnallocatedT32(instr); 17788 break; 17789 } 17790 break; 17791 } 17792 case 0x00000900: { 17793 // 0xf9100900 17794 if (((instr & 0xf0000) == 0xf0000)) { 17795 UnallocatedT32(instr); 17796 return; 17797 } 17798 unsigned rt = (instr >> 12) & 0xf; 17799 unsigned rn = (instr >> 16) & 0xf; 17800 Sign sign((((instr >> 9) & 0x1) == 0) 17801 ? minus 17802 : plus); 17803 int32_t offset = instr & 0xff; 17804 // LDRSB{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_1> ; T2 NOLINT(whitespace/line_length) 17805 ldrsb(CurrentCond(), 17806 Best, 17807 Register(rt), 17808 MemOperand(Register(rn), 17809 sign, 17810 offset, 17811 PostIndex)); 17812 break; 17813 } 17814 case 0x00000c00: { 17815 // 0xf9100c00 17816 switch (instr & 0x00000200) { 17817 case 0x00000000: { 17818 // 0xf9100c00 17819 switch (instr & 0x0000f000) { 17820 case 0x0000f000: { 17821 // 0xf910fc00 17822 if (((instr & 0xf0000) == 17823 0xf0000)) { 17824 UnallocatedT32(instr); 17825 return; 17826 } 17827 unsigned rn = (instr >> 16) & 0xf; 17828 int32_t offset = instr & 0xff; 17829 // PLI{<c>}{<q>} [<Rn>{, #-<imm_1>}] ; T2 NOLINT(whitespace/line_length) 17830 pli(CurrentCond(), 17831 MemOperand(Register(rn), 17832 minus, 17833 offset, 17834 Offset)); 17835 break; 17836 } 17837 default: { 17838 if (((instr & 0xf0000) == 17839 0xf0000) || 17840 ((instr & 0xf000) == 17841 0xf000)) { 17842 UnallocatedT32(instr); 17843 return; 17844 } 17845 unsigned rt = (instr >> 12) & 0xf; 17846 unsigned rn = (instr >> 16) & 0xf; 17847 int32_t offset = instr & 0xff; 17848 // LDRSB{<c>}{<q>} <Rt>, [<Rn>{, #-<imm_1>}] ; T2 NOLINT(whitespace/line_length) 17849 ldrsb(CurrentCond(), 17850 Best, 17851 Register(rt), 17852 MemOperand(Register(rn), 17853 minus, 17854 offset, 17855 Offset)); 17856 break; 17857 } 17858 } 17859 break; 17860 } 17861 case 0x00000200: { 17862 // 0xf9100e00 17863 if (((instr & 0xf0000) == 0xf0000)) { 17864 UnallocatedT32(instr); 17865 return; 17866 } 17867 UnimplementedT32_32("LDRSBT", instr); 17868 break; 17869 } 17870 } 17871 break; 17872 } 17873 case 0x00000d00: { 17874 // 0xf9100d00 17875 if (((instr & 0xf0000) == 0xf0000)) { 17876 UnallocatedT32(instr); 17877 return; 17878 } 17879 unsigned rt = (instr >> 12) & 0xf; 17880 unsigned rn = (instr >> 16) & 0xf; 17881 Sign sign((((instr >> 9) & 0x1) == 0) 17882 ? minus 17883 : plus); 17884 int32_t offset = instr & 0xff; 17885 // LDRSB{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_1>}]! ; T2 NOLINT(whitespace/line_length) 17886 ldrsb(CurrentCond(), 17887 Best, 17888 Register(rt), 17889 MemOperand(Register(rn), 17890 sign, 17891 offset, 17892 PreIndex)); 17893 break; 17894 } 17895 default: 17896 UnallocatedT32(instr); 17897 break; 17898 } 17899 break; 17900 } 17901 case 0x00800000: { 17902 // 0xf9900000 17903 switch (instr & 0x0000f000) { 17904 case 0x0000f000: { 17905 // 0xf990f000 17906 if (((instr & 0xf0000) == 0xf0000)) { 17907 UnallocatedT32(instr); 17908 return; 17909 } 17910 unsigned rn = (instr >> 16) & 0xf; 17911 int32_t offset = instr & 0xfff; 17912 // PLI{<c>}{<q>} [<Rn>{, #{+}<imm>}] ; T1 17913 pli(CurrentCond(), 17914 MemOperand(Register(rn), 17915 plus, 17916 offset, 17917 Offset)); 17918 break; 17919 } 17920 default: { 17921 if (((instr & 0xf0000) == 0xf0000) || 17922 ((instr & 0xf000) == 0xf000)) { 17923 UnallocatedT32(instr); 17924 return; 17925 } 17926 unsigned rt = (instr >> 12) & 0xf; 17927 unsigned rn = (instr >> 16) & 0xf; 17928 int32_t offset = instr & 0xfff; 17929 // LDRSB{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm>}] ; T1 NOLINT(whitespace/line_length) 17930 ldrsb(CurrentCond(), 17931 Best, 17932 Register(rt), 17933 MemOperand(Register(rn), 17934 plus, 17935 offset, 17936 Offset)); 17937 break; 17938 } 17939 } 17940 break; 17941 } 17942 } 17943 break; 17944 } 17945 } 17946 break; 17947 } 17948 case 0x00200000: { 17949 // 0xf9300000 17950 switch (instr & 0x000f0000) { 17951 case 0x000f0000: { 17952 // 0xf93f0000 17953 if (((instr & 0xf000) == 0xf000)) { 17954 UnallocatedT32(instr); 17955 return; 17956 } 17957 unsigned rt = (instr >> 12) & 0xf; 17958 uint32_t U = (instr >> 23) & 0x1; 17959 int32_t imm = instr & 0xfff; 17960 if (U == 0) imm = -imm; 17961 bool minus_zero = (imm == 0) && (U == 0); 17962 Location location(imm, kT32PcDelta); 17963 // LDRSH{<c>}{<q>} <Rt>, <label> ; T1 17964 if (minus_zero) { 17965 ldrsh(CurrentCond(), 17966 Best, 17967 Register(rt), 17968 MemOperand(pc, minus, 0)); 17969 } else { 17970 ldrsh(CurrentCond(), Register(rt), &location); 17971 } 17972 break; 17973 } 17974 default: { 17975 switch (instr & 0x00800000) { 17976 case 0x00000000: { 17977 // 0xf9300000 17978 switch (instr & 0x00000d00) { 17979 case 0x00000000: { 17980 // 0xf9300000 17981 if ((instr & 0x000002c0) == 0x00000000) { 17982 if (((instr & 0xf0000) == 0xf0000) || 17983 ((instr & 0xf000) == 0xf000)) { 17984 UnallocatedT32(instr); 17985 return; 17986 } 17987 unsigned rt = (instr >> 12) & 0xf; 17988 unsigned rn = (instr >> 16) & 0xf; 17989 Sign sign(plus); 17990 unsigned rm = instr & 0xf; 17991 Shift shift = LSL; 17992 uint32_t amount = (instr >> 4) & 0x3; 17993 AddrMode addrmode = Offset; 17994 if ((rt < kNumberOfT32LowRegisters) && 17995 (rn < kNumberOfT32LowRegisters) && 17996 (rm < kNumberOfT32LowRegisters) && 17997 shift.IsLSL() && (amount == 0) && 17998 sign.IsPlus()) { 17999 // LDRSH{<c>}.W <Rt>, [<Rn>, #{+}<Rm>] ; T2 NOLINT(whitespace/line_length) 18000 ldrsh(CurrentCond(), 18001 Wide, 18002 Register(rt), 18003 MemOperand(Register(rn), 18004 sign, 18005 Register(rm), 18006 addrmode)); 18007 } else { 18008 // LDRSH{<c>}{<q>} <Rt>, [<Rn>, {+}<Rm>{, LSL #<imm>}] ; T2 NOLINT(whitespace/line_length) 18009 ldrsh(CurrentCond(), 18010 Best, 18011 Register(rt), 18012 MemOperand(Register(rn), 18013 sign, 18014 Register(rm), 18015 shift, 18016 amount, 18017 addrmode)); 18018 } 18019 } else { 18020 UnallocatedT32(instr); 18021 } 18022 break; 18023 } 18024 case 0x00000900: { 18025 // 0xf9300900 18026 if (((instr & 0xf0000) == 0xf0000)) { 18027 UnallocatedT32(instr); 18028 return; 18029 } 18030 unsigned rt = (instr >> 12) & 0xf; 18031 unsigned rn = (instr >> 16) & 0xf; 18032 Sign sign((((instr >> 9) & 0x1) == 0) 18033 ? minus 18034 : plus); 18035 int32_t offset = instr & 0xff; 18036 // LDRSH{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_1> ; T2 NOLINT(whitespace/line_length) 18037 ldrsh(CurrentCond(), 18038 Best, 18039 Register(rt), 18040 MemOperand(Register(rn), 18041 sign, 18042 offset, 18043 PostIndex)); 18044 break; 18045 } 18046 case 0x00000c00: { 18047 // 0xf9300c00 18048 switch (instr & 0x00000200) { 18049 case 0x00000000: { 18050 // 0xf9300c00 18051 if (((instr & 0xf0000) == 0xf0000) || 18052 ((instr & 0xf000) == 0xf000)) { 18053 UnallocatedT32(instr); 18054 return; 18055 } 18056 unsigned rt = (instr >> 12) & 0xf; 18057 unsigned rn = (instr >> 16) & 0xf; 18058 int32_t offset = instr & 0xff; 18059 // LDRSH{<c>}{<q>} <Rt>, [<Rn>{, #-<imm_1>}] ; T2 NOLINT(whitespace/line_length) 18060 ldrsh(CurrentCond(), 18061 Best, 18062 Register(rt), 18063 MemOperand(Register(rn), 18064 minus, 18065 offset, 18066 Offset)); 18067 break; 18068 } 18069 case 0x00000200: { 18070 // 0xf9300e00 18071 if (((instr & 0xf0000) == 0xf0000)) { 18072 UnallocatedT32(instr); 18073 return; 18074 } 18075 UnimplementedT32_32("LDRSHT", instr); 18076 break; 18077 } 18078 } 18079 break; 18080 } 18081 case 0x00000d00: { 18082 // 0xf9300d00 18083 if (((instr & 0xf0000) == 0xf0000)) { 18084 UnallocatedT32(instr); 18085 return; 18086 } 18087 unsigned rt = (instr >> 12) & 0xf; 18088 unsigned rn = (instr >> 16) & 0xf; 18089 Sign sign((((instr >> 9) & 0x1) == 0) 18090 ? minus 18091 : plus); 18092 int32_t offset = instr & 0xff; 18093 // LDRSH{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_1>}]! ; T2 NOLINT(whitespace/line_length) 18094 ldrsh(CurrentCond(), 18095 Best, 18096 Register(rt), 18097 MemOperand(Register(rn), 18098 sign, 18099 offset, 18100 PreIndex)); 18101 break; 18102 } 18103 default: 18104 UnallocatedT32(instr); 18105 break; 18106 } 18107 break; 18108 } 18109 case 0x00800000: { 18110 // 0xf9b00000 18111 if (((instr & 0xf0000) == 0xf0000) || 18112 ((instr & 0xf000) == 0xf000)) { 18113 UnallocatedT32(instr); 18114 return; 18115 } 18116 unsigned rt = (instr >> 12) & 0xf; 18117 unsigned rn = (instr >> 16) & 0xf; 18118 int32_t offset = instr & 0xfff; 18119 // LDRSH{<c>}{<q>} <Rt>, [<Rn>{, #{+}<imm>}] ; T1 NOLINT(whitespace/line_length) 18120 ldrsh(CurrentCond(), 18121 Best, 18122 Register(rt), 18123 MemOperand(Register(rn), 18124 plus, 18125 offset, 18126 Offset)); 18127 break; 18128 } 18129 } 18130 break; 18131 } 18132 } 18133 break; 18134 } 18135 } 18136 break; 18137 } 18138 default: 18139 UnallocatedT32(instr); 18140 break; 18141 } 18142 break; 18143 } 18144 } 18145 break; 18146 } 18147 case 0x02000000: { 18148 // 0xea000000 18149 switch (instr & 0x11900000) { 18150 case 0x00000000: { 18151 // 0xea000000 18152 switch (instr & 0x00600000) { 18153 case 0x00000000: { 18154 // 0xea000000 18155 switch (instr & 0x000070f0) { 18156 case 0x00000030: { 18157 // 0xea000030 18158 unsigned rd = (instr >> 8) & 0xf; 18159 unsigned rn = (instr >> 16) & 0xf; 18160 unsigned rm = instr & 0xf; 18161 // AND{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T2 18162 and_(CurrentCond(), 18163 Best, 18164 Register(rd), 18165 Register(rn), 18166 Operand(Register(rm), RRX)); 18167 if (((instr & 0xfff0f0f0) != 0xea000030)) { 18168 UnpredictableT32(instr); 18169 } 18170 break; 18171 } 18172 default: { 18173 if (((instr & 0x70f0) == 0x30)) { 18174 UnallocatedT32(instr); 18175 return; 18176 } 18177 unsigned rd = (instr >> 8) & 0xf; 18178 unsigned rn = (instr >> 16) & 0xf; 18179 unsigned rm = instr & 0xf; 18180 ImmediateShiftOperand 18181 shift_operand((instr >> 4) & 0x3, 18182 ((instr >> 6) & 0x3) | 18183 ((instr >> 10) & 0x1c)); 18184 if (InITBlock() && 18185 (instr & 0x00100000) == 0x00000000 && 18186 shift_operand.GetShift().IsLSL() && 18187 (shift_operand.GetAmount() == 0) && 18188 ((rd == rn) && (rd < kNumberOfT32LowRegisters) && 18189 (rm < kNumberOfT32LowRegisters))) { 18190 // AND<c>.W {<Rd>}, <Rn>, <Rm> ; T2 18191 and_(CurrentCond(), 18192 Wide, 18193 Register(rd), 18194 Register(rn), 18195 Register(rm)); 18196 if (((instr & 0xfff08000) != 0xea000000)) { 18197 UnpredictableT32(instr); 18198 } 18199 } else if ((instr & 0x00100000) == 0x00000000) { 18200 // AND{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length) 18201 and_(CurrentCond(), 18202 Best, 18203 Register(rd), 18204 Register(rn), 18205 Operand(Register(rm), 18206 shift_operand.GetType(), 18207 shift_operand.GetAmount())); 18208 if (((instr & 0xfff08000) != 0xea000000)) { 18209 UnpredictableT32(instr); 18210 } 18211 } else { 18212 UnallocatedT32(instr); 18213 } 18214 break; 18215 } 18216 } 18217 break; 18218 } 18219 case 0x00200000: { 18220 // 0xea200000 18221 switch (instr & 0x000070f0) { 18222 case 0x00000030: { 18223 // 0xea200030 18224 unsigned rd = (instr >> 8) & 0xf; 18225 unsigned rn = (instr >> 16) & 0xf; 18226 unsigned rm = instr & 0xf; 18227 // BIC{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T2 18228 bic(CurrentCond(), 18229 Best, 18230 Register(rd), 18231 Register(rn), 18232 Operand(Register(rm), RRX)); 18233 if (((instr & 0xfff0f0f0) != 0xea200030)) { 18234 UnpredictableT32(instr); 18235 } 18236 break; 18237 } 18238 default: { 18239 if (((instr & 0x70f0) == 0x30)) { 18240 UnallocatedT32(instr); 18241 return; 18242 } 18243 unsigned rd = (instr >> 8) & 0xf; 18244 unsigned rn = (instr >> 16) & 0xf; 18245 unsigned rm = instr & 0xf; 18246 ImmediateShiftOperand 18247 shift_operand((instr >> 4) & 0x3, 18248 ((instr >> 6) & 0x3) | 18249 ((instr >> 10) & 0x1c)); 18250 if (InITBlock() && 18251 (instr & 0x00100000) == 0x00000000 && 18252 shift_operand.GetShift().IsLSL() && 18253 (shift_operand.GetAmount() == 0) && 18254 ((rd == rn) && (rd < kNumberOfT32LowRegisters) && 18255 (rm < kNumberOfT32LowRegisters))) { 18256 // BIC<c>.W {<Rd>}, <Rn>, <Rm> ; T2 18257 bic(CurrentCond(), 18258 Wide, 18259 Register(rd), 18260 Register(rn), 18261 Register(rm)); 18262 if (((instr & 0xfff08000) != 0xea200000)) { 18263 UnpredictableT32(instr); 18264 } 18265 } else if ((instr & 0x00100000) == 0x00000000) { 18266 // BIC{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length) 18267 bic(CurrentCond(), 18268 Best, 18269 Register(rd), 18270 Register(rn), 18271 Operand(Register(rm), 18272 shift_operand.GetType(), 18273 shift_operand.GetAmount())); 18274 if (((instr & 0xfff08000) != 0xea200000)) { 18275 UnpredictableT32(instr); 18276 } 18277 } else { 18278 UnallocatedT32(instr); 18279 } 18280 break; 18281 } 18282 } 18283 break; 18284 } 18285 case 0x00400000: { 18286 // 0xea400000 18287 switch (instr & 0x000f0000) { 18288 case 0x000f0000: { 18289 // 0xea4f0000 18290 switch (instr & 0x000070f0) { 18291 case 0x00000030: { 18292 // 0xea4f0030 18293 unsigned rd = (instr >> 8) & 0xf; 18294 unsigned rm = instr & 0xf; 18295 // RRX{<c>}{<q>} {<Rd>}, <Rm> ; T3 18296 rrx(CurrentCond(), Register(rd), Register(rm)); 18297 if (((instr & 0xfffff0f0) != 0xea4f0030)) { 18298 UnpredictableT32(instr); 18299 } 18300 break; 18301 } 18302 default: { 18303 if (((instr & 0x70f0) == 0x30)) { 18304 UnallocatedT32(instr); 18305 return; 18306 } 18307 if (((Uint32((instr >> 4)) & Uint32(0x3)) == 18308 Uint32(0x2))) { 18309 unsigned rd = (instr >> 8) & 0xf; 18310 unsigned rm = instr & 0xf; 18311 uint32_t amount = ((instr >> 6) & 0x3) | 18312 ((instr >> 10) & 0x1c); 18313 if (amount == 0) amount = 32; 18314 if (InITBlock() && 18315 ((rd < kNumberOfT32LowRegisters) && 18316 (rm < kNumberOfT32LowRegisters) && 18317 ((amount >= 1) && (amount <= 32)))) { 18318 // ASR<c>.W {<Rd>}, <Rm>, #<imm> ; T3 18319 asr(CurrentCond(), 18320 Wide, 18321 Register(rd), 18322 Register(rm), 18323 amount); 18324 if (((instr & 0xffff8030) != 0xea4f0020)) { 18325 UnpredictableT32(instr); 18326 } 18327 } else { 18328 // ASR{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; T3 18329 asr(CurrentCond(), 18330 Best, 18331 Register(rd), 18332 Register(rm), 18333 amount); 18334 if (((instr & 0xffff8030) != 0xea4f0020)) { 18335 UnpredictableT32(instr); 18336 } 18337 } 18338 return; 18339 } 18340 if (((Uint32((instr >> 4)) & Uint32(0x3)) == 18341 Uint32(0x0)) && 18342 ((instr & 0x000070c0) != 0x00000000)) { 18343 unsigned rd = (instr >> 8) & 0xf; 18344 unsigned rm = instr & 0xf; 18345 uint32_t amount = ((instr >> 6) & 0x3) | 18346 ((instr >> 10) & 0x1c); 18347 if (InITBlock() && 18348 ((rd < kNumberOfT32LowRegisters) && 18349 (rm < kNumberOfT32LowRegisters) && 18350 ((amount >= 1) && (amount <= 31)))) { 18351 // LSL<c>.W {<Rd>}, <Rm>, #<imm> ; T3 18352 lsl(CurrentCond(), 18353 Wide, 18354 Register(rd), 18355 Register(rm), 18356 amount); 18357 if (((instr & 0xffff8030) != 0xea4f0000)) { 18358 UnpredictableT32(instr); 18359 } 18360 } else { 18361 // LSL{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; T3 18362 lsl(CurrentCond(), 18363 Best, 18364 Register(rd), 18365 Register(rm), 18366 amount); 18367 if (((instr & 0xffff8030) != 0xea4f0000)) { 18368 UnpredictableT32(instr); 18369 } 18370 } 18371 return; 18372 } 18373 if (((Uint32((instr >> 4)) & Uint32(0x3)) == 18374 Uint32(0x1))) { 18375 unsigned rd = (instr >> 8) & 0xf; 18376 unsigned rm = instr & 0xf; 18377 uint32_t amount = ((instr >> 6) & 0x3) | 18378 ((instr >> 10) & 0x1c); 18379 if (amount == 0) amount = 32; 18380 if (InITBlock() && 18381 ((rd < kNumberOfT32LowRegisters) && 18382 (rm < kNumberOfT32LowRegisters) && 18383 ((amount >= 1) && (amount <= 32)))) { 18384 // LSR<c>.W {<Rd>}, <Rm>, #<imm> ; T3 18385 lsr(CurrentCond(), 18386 Wide, 18387 Register(rd), 18388 Register(rm), 18389 amount); 18390 if (((instr & 0xffff8030) != 0xea4f0010)) { 18391 UnpredictableT32(instr); 18392 } 18393 } else { 18394 // LSR{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; T3 18395 lsr(CurrentCond(), 18396 Best, 18397 Register(rd), 18398 Register(rm), 18399 amount); 18400 if (((instr & 0xffff8030) != 0xea4f0010)) { 18401 UnpredictableT32(instr); 18402 } 18403 } 18404 return; 18405 } 18406 if (((Uint32((instr >> 4)) & Uint32(0x3)) == 18407 Uint32(0x3)) && 18408 ((instr & 0x000070c0) != 0x00000000)) { 18409 unsigned rd = (instr >> 8) & 0xf; 18410 unsigned rm = instr & 0xf; 18411 uint32_t amount = ((instr >> 6) & 0x3) | 18412 ((instr >> 10) & 0x1c); 18413 // ROR{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; T3 18414 ror(CurrentCond(), 18415 Best, 18416 Register(rd), 18417 Register(rm), 18418 amount); 18419 if (((instr & 0xffff8030) != 0xea4f0030)) { 18420 UnpredictableT32(instr); 18421 } 18422 return; 18423 } 18424 unsigned rd = (instr >> 8) & 0xf; 18425 unsigned rm = instr & 0xf; 18426 ImmediateShiftOperand 18427 shift_operand((instr >> 4) & 0x3, 18428 ((instr >> 6) & 0x3) | 18429 ((instr >> 10) & 0x1c)); 18430 if ((instr & 0x00100000) == 0x00000000 && 18431 (shift_operand.GetShift().IsLSL() && 18432 (shift_operand.GetAmount() == 0))) { 18433 // MOV<c>.W <Rd>, <Rm> {, <shift> #<amount> } ; T3 NOLINT(whitespace/line_length) 18434 mov(CurrentCond(), 18435 Wide, 18436 Register(rd), 18437 Operand(Register(rm), 18438 shift_operand.GetType(), 18439 shift_operand.GetAmount())); 18440 if (((instr & 0xffff8000) != 0xea4f0000)) { 18441 UnpredictableT32(instr); 18442 } 18443 } else if (InITBlock() && 18444 (instr & 0x00100000) == 0x00000000 && 18445 ((rd < kNumberOfT32LowRegisters) && 18446 (rm < kNumberOfT32LowRegisters))) { 18447 // MOV<c>.W <Rd>, <Rm> {, <shift> #<amount> } ; T3 NOLINT(whitespace/line_length) 18448 mov(CurrentCond(), 18449 Wide, 18450 Register(rd), 18451 Operand(Register(rm), 18452 shift_operand.GetType(), 18453 shift_operand.GetAmount())); 18454 if (((instr & 0xffff8000) != 0xea4f0000)) { 18455 UnpredictableT32(instr); 18456 } 18457 } else if ((instr & 0x00100000) == 0x00000000) { 18458 // MOV{<c>}{<q>} <Rd>, <Rm> {, <shift> #<amount> } ; T3 NOLINT(whitespace/line_length) 18459 mov(CurrentCond(), 18460 Best, 18461 Register(rd), 18462 Operand(Register(rm), 18463 shift_operand.GetType(), 18464 shift_operand.GetAmount())); 18465 if (((instr & 0xffff8000) != 0xea4f0000)) { 18466 UnpredictableT32(instr); 18467 } 18468 } else { 18469 UnallocatedT32(instr); 18470 } 18471 break; 18472 } 18473 } 18474 break; 18475 } 18476 default: { 18477 switch (instr & 0x000070f0) { 18478 case 0x00000030: { 18479 // 0xea400030 18480 if (((instr & 0xf0000) == 0xf0000)) { 18481 UnallocatedT32(instr); 18482 return; 18483 } 18484 unsigned rd = (instr >> 8) & 0xf; 18485 unsigned rn = (instr >> 16) & 0xf; 18486 unsigned rm = instr & 0xf; 18487 // ORR{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T2 18488 orr(CurrentCond(), 18489 Best, 18490 Register(rd), 18491 Register(rn), 18492 Operand(Register(rm), RRX)); 18493 if (((instr & 0xfff0f0f0) != 0xea400030)) { 18494 UnpredictableT32(instr); 18495 } 18496 break; 18497 } 18498 default: { 18499 if (((instr & 0xf0000) == 0xf0000) || 18500 ((instr & 0x70f0) == 0x30)) { 18501 UnallocatedT32(instr); 18502 return; 18503 } 18504 unsigned rd = (instr >> 8) & 0xf; 18505 unsigned rn = (instr >> 16) & 0xf; 18506 unsigned rm = instr & 0xf; 18507 ImmediateShiftOperand 18508 shift_operand((instr >> 4) & 0x3, 18509 ((instr >> 6) & 0x3) | 18510 ((instr >> 10) & 0x1c)); 18511 if (InITBlock() && 18512 (instr & 0x00100000) == 0x00000000 && 18513 shift_operand.GetShift().IsLSL() && 18514 (shift_operand.GetAmount() == 0) && 18515 ((rd == rn) && 18516 (rd < kNumberOfT32LowRegisters) && 18517 (rm < kNumberOfT32LowRegisters))) { 18518 // ORR<c>.W {<Rd>}, <Rn>, <Rm> ; T2 18519 orr(CurrentCond(), 18520 Wide, 18521 Register(rd), 18522 Register(rn), 18523 Register(rm)); 18524 if (((instr & 0xfff08000) != 0xea400000)) { 18525 UnpredictableT32(instr); 18526 } 18527 } else if ((instr & 0x00100000) == 0x00000000) { 18528 // ORR{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length) 18529 orr(CurrentCond(), 18530 Best, 18531 Register(rd), 18532 Register(rn), 18533 Operand(Register(rm), 18534 shift_operand.GetType(), 18535 shift_operand.GetAmount())); 18536 if (((instr & 0xfff08000) != 0xea400000)) { 18537 UnpredictableT32(instr); 18538 } 18539 } else { 18540 UnallocatedT32(instr); 18541 } 18542 break; 18543 } 18544 } 18545 break; 18546 } 18547 } 18548 break; 18549 } 18550 case 0x00600000: { 18551 // 0xea600000 18552 switch (instr & 0x000f0000) { 18553 case 0x000f0000: { 18554 // 0xea6f0000 18555 switch (instr & 0x000070f0) { 18556 case 0x00000030: { 18557 // 0xea6f0030 18558 unsigned rd = (instr >> 8) & 0xf; 18559 unsigned rm = instr & 0xf; 18560 // MVN{<c>}{<q>} <Rd>, <Rm>, RRX ; T2 18561 mvn(CurrentCond(), 18562 Best, 18563 Register(rd), 18564 Operand(Register(rm), RRX)); 18565 if (((instr & 0xfffff0f0) != 0xea6f0030)) { 18566 UnpredictableT32(instr); 18567 } 18568 break; 18569 } 18570 default: { 18571 if (((instr & 0x70f0) == 0x30)) { 18572 UnallocatedT32(instr); 18573 return; 18574 } 18575 unsigned rd = (instr >> 8) & 0xf; 18576 unsigned rm = instr & 0xf; 18577 ImmediateShiftOperand 18578 shift_operand((instr >> 4) & 0x3, 18579 ((instr >> 6) & 0x3) | 18580 ((instr >> 10) & 0x1c)); 18581 if (InITBlock() && 18582 (instr & 0x00100000) == 0x00000000 && 18583 shift_operand.GetShift().IsLSL() && 18584 (shift_operand.GetAmount() == 0) && 18585 ((rd < kNumberOfT32LowRegisters) && 18586 (rm < kNumberOfT32LowRegisters))) { 18587 // MVN<c>.W <Rd>, <Rm> ; T2 18588 mvn(CurrentCond(), 18589 Wide, 18590 Register(rd), 18591 Register(rm)); 18592 if (((instr & 0xffff8000) != 0xea6f0000)) { 18593 UnpredictableT32(instr); 18594 } 18595 } else if ((instr & 0x00100000) == 0x00000000) { 18596 // MVN{<c>}{<q>} <Rd>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length) 18597 mvn(CurrentCond(), 18598 Best, 18599 Register(rd), 18600 Operand(Register(rm), 18601 shift_operand.GetType(), 18602 shift_operand.GetAmount())); 18603 if (((instr & 0xffff8000) != 0xea6f0000)) { 18604 UnpredictableT32(instr); 18605 } 18606 } else { 18607 UnallocatedT32(instr); 18608 } 18609 break; 18610 } 18611 } 18612 break; 18613 } 18614 default: { 18615 switch (instr & 0x000070f0) { 18616 case 0x00000030: { 18617 // 0xea600030 18618 if (((instr & 0xf0000) == 0xf0000)) { 18619 UnallocatedT32(instr); 18620 return; 18621 } 18622 unsigned rd = (instr >> 8) & 0xf; 18623 unsigned rn = (instr >> 16) & 0xf; 18624 unsigned rm = instr & 0xf; 18625 // ORN{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T1 18626 orn(CurrentCond(), 18627 Register(rd), 18628 Register(rn), 18629 Operand(Register(rm), RRX)); 18630 if (((instr & 0xfff0f0f0) != 0xea600030)) { 18631 UnpredictableT32(instr); 18632 } 18633 break; 18634 } 18635 default: { 18636 if (((instr & 0xf0000) == 0xf0000) || 18637 ((instr & 0x70f0) == 0x30)) { 18638 UnallocatedT32(instr); 18639 return; 18640 } 18641 unsigned rd = (instr >> 8) & 0xf; 18642 unsigned rn = (instr >> 16) & 0xf; 18643 unsigned rm = instr & 0xf; 18644 ImmediateShiftOperand 18645 shift_operand((instr >> 4) & 0x3, 18646 ((instr >> 6) & 0x3) | 18647 ((instr >> 10) & 0x1c)); 18648 // ORN{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T1 NOLINT(whitespace/line_length) 18649 orn(CurrentCond(), 18650 Register(rd), 18651 Register(rn), 18652 Operand(Register(rm), 18653 shift_operand.GetType(), 18654 shift_operand.GetAmount())); 18655 if (((instr & 0xfff08000) != 0xea600000)) { 18656 UnpredictableT32(instr); 18657 } 18658 break; 18659 } 18660 } 18661 break; 18662 } 18663 } 18664 break; 18665 } 18666 } 18667 break; 18668 } 18669 case 0x00100000: { 18670 // 0xea100000 18671 switch (instr & 0x00600000) { 18672 case 0x00000000: { 18673 // 0xea100000 18674 switch (instr & 0x00000f00) { 18675 case 0x00000f00: { 18676 // 0xea100f00 18677 switch (instr & 0x000070f0) { 18678 case 0x00000030: { 18679 // 0xea100f30 18680 unsigned rn = (instr >> 16) & 0xf; 18681 unsigned rm = instr & 0xf; 18682 // TST{<c>}{<q>} <Rn>, <Rm>, RRX ; T2 18683 tst(CurrentCond(), 18684 Best, 18685 Register(rn), 18686 Operand(Register(rm), RRX)); 18687 if (((instr & 0xfff0fff0) != 0xea100f30)) { 18688 UnpredictableT32(instr); 18689 } 18690 break; 18691 } 18692 default: { 18693 if (((instr & 0x70f0) == 0x30)) { 18694 UnallocatedT32(instr); 18695 return; 18696 } 18697 unsigned rn = (instr >> 16) & 0xf; 18698 unsigned rm = instr & 0xf; 18699 ImmediateShiftOperand 18700 shift_operand((instr >> 4) & 0x3, 18701 ((instr >> 6) & 0x3) | 18702 ((instr >> 10) & 0x1c)); 18703 if (shift_operand.GetShift().IsLSL() && 18704 (shift_operand.GetAmount() == 0) && 18705 ((rn < kNumberOfT32LowRegisters) && 18706 (rm < kNumberOfT32LowRegisters))) { 18707 // TST{<c>}.W <Rn>, <Rm> ; T2 18708 tst(CurrentCond(), 18709 Wide, 18710 Register(rn), 18711 Register(rm)); 18712 if (((instr & 0xfff08f00) != 0xea100f00)) { 18713 UnpredictableT32(instr); 18714 } 18715 } else { 18716 // TST{<c>}{<q>} <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length) 18717 tst(CurrentCond(), 18718 Best, 18719 Register(rn), 18720 Operand(Register(rm), 18721 shift_operand.GetType(), 18722 shift_operand.GetAmount())); 18723 if (((instr & 0xfff08f00) != 0xea100f00)) { 18724 UnpredictableT32(instr); 18725 } 18726 } 18727 break; 18728 } 18729 } 18730 break; 18731 } 18732 default: { 18733 switch (instr & 0x000070f0) { 18734 case 0x00000030: { 18735 // 0xea100030 18736 if (((instr & 0xf00) == 0xf00)) { 18737 UnallocatedT32(instr); 18738 return; 18739 } 18740 unsigned rd = (instr >> 8) & 0xf; 18741 unsigned rn = (instr >> 16) & 0xf; 18742 unsigned rm = instr & 0xf; 18743 // ANDS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T2 18744 ands(CurrentCond(), 18745 Best, 18746 Register(rd), 18747 Register(rn), 18748 Operand(Register(rm), RRX)); 18749 if (((instr & 0xfff0f0f0) != 0xea100030)) { 18750 UnpredictableT32(instr); 18751 } 18752 break; 18753 } 18754 default: { 18755 if (((instr & 0x70f0) == 0x30) || 18756 ((instr & 0xf00) == 0xf00)) { 18757 UnallocatedT32(instr); 18758 return; 18759 } 18760 unsigned rd = (instr >> 8) & 0xf; 18761 unsigned rn = (instr >> 16) & 0xf; 18762 unsigned rm = instr & 0xf; 18763 ImmediateShiftOperand 18764 shift_operand((instr >> 4) & 0x3, 18765 ((instr >> 6) & 0x3) | 18766 ((instr >> 10) & 0x1c)); 18767 if (OutsideITBlock() && 18768 (instr & 0x00100000) == 0x00100000 && 18769 shift_operand.GetShift().IsLSL() && 18770 (shift_operand.GetAmount() == 0) && 18771 ((rd == rn) && 18772 (rd < kNumberOfT32LowRegisters) && 18773 (rm < kNumberOfT32LowRegisters))) { 18774 // ANDS.W {<Rd>}, <Rn>, <Rm> ; T2 18775 ands(Condition::None(), 18776 Wide, 18777 Register(rd), 18778 Register(rn), 18779 Register(rm)); 18780 if (((instr & 0xfff08000) != 0xea100000)) { 18781 UnpredictableT32(instr); 18782 } 18783 } else if ((instr & 0x00100000) == 0x00100000) { 18784 // ANDS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length) 18785 ands(CurrentCond(), 18786 Best, 18787 Register(rd), 18788 Register(rn), 18789 Operand(Register(rm), 18790 shift_operand.GetType(), 18791 shift_operand.GetAmount())); 18792 if (((instr & 0xfff08000) != 0xea100000)) { 18793 UnpredictableT32(instr); 18794 } 18795 } else { 18796 UnallocatedT32(instr); 18797 } 18798 break; 18799 } 18800 } 18801 break; 18802 } 18803 } 18804 break; 18805 } 18806 case 0x00200000: { 18807 // 0xea300000 18808 switch (instr & 0x000070f0) { 18809 case 0x00000030: { 18810 // 0xea300030 18811 unsigned rd = (instr >> 8) & 0xf; 18812 unsigned rn = (instr >> 16) & 0xf; 18813 unsigned rm = instr & 0xf; 18814 // BICS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T2 18815 bics(CurrentCond(), 18816 Best, 18817 Register(rd), 18818 Register(rn), 18819 Operand(Register(rm), RRX)); 18820 if (((instr & 0xfff0f0f0) != 0xea300030)) { 18821 UnpredictableT32(instr); 18822 } 18823 break; 18824 } 18825 default: { 18826 if (((instr & 0x70f0) == 0x30)) { 18827 UnallocatedT32(instr); 18828 return; 18829 } 18830 unsigned rd = (instr >> 8) & 0xf; 18831 unsigned rn = (instr >> 16) & 0xf; 18832 unsigned rm = instr & 0xf; 18833 ImmediateShiftOperand 18834 shift_operand((instr >> 4) & 0x3, 18835 ((instr >> 6) & 0x3) | 18836 ((instr >> 10) & 0x1c)); 18837 if (OutsideITBlock() && 18838 (instr & 0x00100000) == 0x00100000 && 18839 shift_operand.GetShift().IsLSL() && 18840 (shift_operand.GetAmount() == 0) && 18841 ((rd == rn) && (rd < kNumberOfT32LowRegisters) && 18842 (rm < kNumberOfT32LowRegisters))) { 18843 // BICS.W {<Rd>}, <Rn>, <Rm> ; T2 18844 bics(Condition::None(), 18845 Wide, 18846 Register(rd), 18847 Register(rn), 18848 Register(rm)); 18849 if (((instr & 0xfff08000) != 0xea300000)) { 18850 UnpredictableT32(instr); 18851 } 18852 } else if ((instr & 0x00100000) == 0x00100000) { 18853 // BICS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length) 18854 bics(CurrentCond(), 18855 Best, 18856 Register(rd), 18857 Register(rn), 18858 Operand(Register(rm), 18859 shift_operand.GetType(), 18860 shift_operand.GetAmount())); 18861 if (((instr & 0xfff08000) != 0xea300000)) { 18862 UnpredictableT32(instr); 18863 } 18864 } else { 18865 UnallocatedT32(instr); 18866 } 18867 break; 18868 } 18869 } 18870 break; 18871 } 18872 case 0x00400000: { 18873 // 0xea500000 18874 switch (instr & 0x000f0000) { 18875 case 0x000f0000: { 18876 // 0xea5f0000 18877 switch (instr & 0x000070f0) { 18878 case 0x00000030: { 18879 // 0xea5f0030 18880 unsigned rd = (instr >> 8) & 0xf; 18881 unsigned rm = instr & 0xf; 18882 // RRXS{<c>}{<q>} {<Rd>}, <Rm> ; T3 18883 rrxs(CurrentCond(), Register(rd), Register(rm)); 18884 if (((instr & 0xfffff0f0) != 0xea5f0030)) { 18885 UnpredictableT32(instr); 18886 } 18887 break; 18888 } 18889 default: { 18890 if (((instr & 0x70f0) == 0x30)) { 18891 UnallocatedT32(instr); 18892 return; 18893 } 18894 if (((Uint32((instr >> 4)) & Uint32(0x3)) == 18895 Uint32(0x2))) { 18896 unsigned rd = (instr >> 8) & 0xf; 18897 unsigned rm = instr & 0xf; 18898 uint32_t amount = ((instr >> 6) & 0x3) | 18899 ((instr >> 10) & 0x1c); 18900 if (amount == 0) amount = 32; 18901 if (OutsideITBlock() && 18902 ((rd < kNumberOfT32LowRegisters) && 18903 (rm < kNumberOfT32LowRegisters) && 18904 ((amount >= 1) && (amount <= 32)))) { 18905 // ASRS.W {<Rd>}, <Rm>, #<imm> ; T3 18906 asrs(Condition::None(), 18907 Wide, 18908 Register(rd), 18909 Register(rm), 18910 amount); 18911 if (((instr & 0xffff8030) != 0xea5f0020)) { 18912 UnpredictableT32(instr); 18913 } 18914 } else { 18915 // ASRS{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; T3 18916 asrs(CurrentCond(), 18917 Best, 18918 Register(rd), 18919 Register(rm), 18920 amount); 18921 if (((instr & 0xffff8030) != 0xea5f0020)) { 18922 UnpredictableT32(instr); 18923 } 18924 } 18925 return; 18926 } 18927 if (((Uint32((instr >> 4)) & Uint32(0x3)) == 18928 Uint32(0x0)) && 18929 ((instr & 0x000070c0) != 0x00000000)) { 18930 unsigned rd = (instr >> 8) & 0xf; 18931 unsigned rm = instr & 0xf; 18932 uint32_t amount = ((instr >> 6) & 0x3) | 18933 ((instr >> 10) & 0x1c); 18934 if (OutsideITBlock() && 18935 ((rd < kNumberOfT32LowRegisters) && 18936 (rm < kNumberOfT32LowRegisters) && 18937 ((amount >= 1) && (amount <= 31)))) { 18938 // LSLS.W {<Rd>}, <Rm>, #<imm> ; T3 18939 lsls(Condition::None(), 18940 Wide, 18941 Register(rd), 18942 Register(rm), 18943 amount); 18944 if (((instr & 0xffff8030) != 0xea5f0000)) { 18945 UnpredictableT32(instr); 18946 } 18947 } else { 18948 // LSLS{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; T3 18949 lsls(CurrentCond(), 18950 Best, 18951 Register(rd), 18952 Register(rm), 18953 amount); 18954 if (((instr & 0xffff8030) != 0xea5f0000)) { 18955 UnpredictableT32(instr); 18956 } 18957 } 18958 return; 18959 } 18960 if (((Uint32((instr >> 4)) & Uint32(0x3)) == 18961 Uint32(0x1))) { 18962 unsigned rd = (instr >> 8) & 0xf; 18963 unsigned rm = instr & 0xf; 18964 uint32_t amount = ((instr >> 6) & 0x3) | 18965 ((instr >> 10) & 0x1c); 18966 if (amount == 0) amount = 32; 18967 if (OutsideITBlock() && 18968 ((rd < kNumberOfT32LowRegisters) && 18969 (rm < kNumberOfT32LowRegisters) && 18970 ((amount >= 1) && (amount <= 32)))) { 18971 // LSRS.W {<Rd>}, <Rm>, #<imm> ; T3 18972 lsrs(Condition::None(), 18973 Wide, 18974 Register(rd), 18975 Register(rm), 18976 amount); 18977 if (((instr & 0xffff8030) != 0xea5f0010)) { 18978 UnpredictableT32(instr); 18979 } 18980 } else { 18981 // LSRS{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; T3 18982 lsrs(CurrentCond(), 18983 Best, 18984 Register(rd), 18985 Register(rm), 18986 amount); 18987 if (((instr & 0xffff8030) != 0xea5f0010)) { 18988 UnpredictableT32(instr); 18989 } 18990 } 18991 return; 18992 } 18993 if (((Uint32((instr >> 4)) & Uint32(0x3)) == 18994 Uint32(0x3)) && 18995 ((instr & 0x000070c0) != 0x00000000)) { 18996 unsigned rd = (instr >> 8) & 0xf; 18997 unsigned rm = instr & 0xf; 18998 uint32_t amount = ((instr >> 6) & 0x3) | 18999 ((instr >> 10) & 0x1c); 19000 // RORS{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; T3 19001 rors(CurrentCond(), 19002 Best, 19003 Register(rd), 19004 Register(rm), 19005 amount); 19006 if (((instr & 0xffff8030) != 0xea5f0030)) { 19007 UnpredictableT32(instr); 19008 } 19009 return; 19010 } 19011 unsigned rd = (instr >> 8) & 0xf; 19012 unsigned rm = instr & 0xf; 19013 ImmediateShiftOperand 19014 shift_operand((instr >> 4) & 0x3, 19015 ((instr >> 6) & 0x3) | 19016 ((instr >> 10) & 0x1c)); 19017 if (OutsideITBlock() && 19018 (instr & 0x00100000) == 0x00100000 && 19019 ((rd < kNumberOfT32LowRegisters) && 19020 (rm < kNumberOfT32LowRegisters))) { 19021 // MOVS.W <Rd>, <Rm> {, <shift> #<amount> } ; T3 19022 movs(Condition::None(), 19023 Wide, 19024 Register(rd), 19025 Operand(Register(rm), 19026 shift_operand.GetType(), 19027 shift_operand.GetAmount())); 19028 if (((instr & 0xffff8000) != 0xea5f0000)) { 19029 UnpredictableT32(instr); 19030 } 19031 } else if ((instr & 0x00100000) == 0x00100000) { 19032 // MOVS{<c>}{<q>} <Rd>, <Rm> {, <shift> #<amount> } ; T3 NOLINT(whitespace/line_length) 19033 movs(CurrentCond(), 19034 Best, 19035 Register(rd), 19036 Operand(Register(rm), 19037 shift_operand.GetType(), 19038 shift_operand.GetAmount())); 19039 if (((instr & 0xffff8000) != 0xea5f0000)) { 19040 UnpredictableT32(instr); 19041 } 19042 } else { 19043 UnallocatedT32(instr); 19044 } 19045 break; 19046 } 19047 } 19048 break; 19049 } 19050 default: { 19051 switch (instr & 0x000070f0) { 19052 case 0x00000030: { 19053 // 0xea500030 19054 if (((instr & 0xf0000) == 0xf0000)) { 19055 UnallocatedT32(instr); 19056 return; 19057 } 19058 unsigned rd = (instr >> 8) & 0xf; 19059 unsigned rn = (instr >> 16) & 0xf; 19060 unsigned rm = instr & 0xf; 19061 // ORRS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T2 19062 orrs(CurrentCond(), 19063 Best, 19064 Register(rd), 19065 Register(rn), 19066 Operand(Register(rm), RRX)); 19067 if (((instr & 0xfff0f0f0) != 0xea500030)) { 19068 UnpredictableT32(instr); 19069 } 19070 break; 19071 } 19072 default: { 19073 if (((instr & 0xf0000) == 0xf0000) || 19074 ((instr & 0x70f0) == 0x30)) { 19075 UnallocatedT32(instr); 19076 return; 19077 } 19078 unsigned rd = (instr >> 8) & 0xf; 19079 unsigned rn = (instr >> 16) & 0xf; 19080 unsigned rm = instr & 0xf; 19081 ImmediateShiftOperand 19082 shift_operand((instr >> 4) & 0x3, 19083 ((instr >> 6) & 0x3) | 19084 ((instr >> 10) & 0x1c)); 19085 if (OutsideITBlock() && 19086 (instr & 0x00100000) == 0x00100000 && 19087 shift_operand.GetShift().IsLSL() && 19088 (shift_operand.GetAmount() == 0) && 19089 ((rd == rn) && 19090 (rd < kNumberOfT32LowRegisters) && 19091 (rm < kNumberOfT32LowRegisters))) { 19092 // ORRS.W {<Rd>}, <Rn>, <Rm> ; T2 19093 orrs(Condition::None(), 19094 Wide, 19095 Register(rd), 19096 Register(rn), 19097 Register(rm)); 19098 if (((instr & 0xfff08000) != 0xea500000)) { 19099 UnpredictableT32(instr); 19100 } 19101 } else if ((instr & 0x00100000) == 0x00100000) { 19102 // ORRS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length) 19103 orrs(CurrentCond(), 19104 Best, 19105 Register(rd), 19106 Register(rn), 19107 Operand(Register(rm), 19108 shift_operand.GetType(), 19109 shift_operand.GetAmount())); 19110 if (((instr & 0xfff08000) != 0xea500000)) { 19111 UnpredictableT32(instr); 19112 } 19113 } else { 19114 UnallocatedT32(instr); 19115 } 19116 break; 19117 } 19118 } 19119 break; 19120 } 19121 } 19122 break; 19123 } 19124 case 0x00600000: { 19125 // 0xea700000 19126 switch (instr & 0x000f0000) { 19127 case 0x000f0000: { 19128 // 0xea7f0000 19129 switch (instr & 0x000070f0) { 19130 case 0x00000030: { 19131 // 0xea7f0030 19132 unsigned rd = (instr >> 8) & 0xf; 19133 unsigned rm = instr & 0xf; 19134 // MVNS{<c>}{<q>} <Rd>, <Rm>, RRX ; T2 19135 mvns(CurrentCond(), 19136 Best, 19137 Register(rd), 19138 Operand(Register(rm), RRX)); 19139 if (((instr & 0xfffff0f0) != 0xea7f0030)) { 19140 UnpredictableT32(instr); 19141 } 19142 break; 19143 } 19144 default: { 19145 if (((instr & 0x70f0) == 0x30)) { 19146 UnallocatedT32(instr); 19147 return; 19148 } 19149 unsigned rd = (instr >> 8) & 0xf; 19150 unsigned rm = instr & 0xf; 19151 ImmediateShiftOperand 19152 shift_operand((instr >> 4) & 0x3, 19153 ((instr >> 6) & 0x3) | 19154 ((instr >> 10) & 0x1c)); 19155 if (OutsideITBlock() && 19156 (instr & 0x00100000) == 0x00100000 && 19157 shift_operand.GetShift().IsLSL() && 19158 (shift_operand.GetAmount() == 0) && 19159 ((rd < kNumberOfT32LowRegisters) && 19160 (rm < kNumberOfT32LowRegisters))) { 19161 // MVNS.W <Rd>, <Rm> ; T2 19162 mvns(Condition::None(), 19163 Wide, 19164 Register(rd), 19165 Register(rm)); 19166 if (((instr & 0xffff8000) != 0xea7f0000)) { 19167 UnpredictableT32(instr); 19168 } 19169 } else if ((instr & 0x00100000) == 0x00100000) { 19170 // MVNS{<c>}{<q>} <Rd>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length) 19171 mvns(CurrentCond(), 19172 Best, 19173 Register(rd), 19174 Operand(Register(rm), 19175 shift_operand.GetType(), 19176 shift_operand.GetAmount())); 19177 if (((instr & 0xffff8000) != 0xea7f0000)) { 19178 UnpredictableT32(instr); 19179 } 19180 } else { 19181 UnallocatedT32(instr); 19182 } 19183 break; 19184 } 19185 } 19186 break; 19187 } 19188 default: { 19189 switch (instr & 0x000070f0) { 19190 case 0x00000030: { 19191 // 0xea700030 19192 if (((instr & 0xf0000) == 0xf0000)) { 19193 UnallocatedT32(instr); 19194 return; 19195 } 19196 unsigned rd = (instr >> 8) & 0xf; 19197 unsigned rn = (instr >> 16) & 0xf; 19198 unsigned rm = instr & 0xf; 19199 // ORNS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T1 19200 orns(CurrentCond(), 19201 Register(rd), 19202 Register(rn), 19203 Operand(Register(rm), RRX)); 19204 if (((instr & 0xfff0f0f0) != 0xea700030)) { 19205 UnpredictableT32(instr); 19206 } 19207 break; 19208 } 19209 default: { 19210 if (((instr & 0xf0000) == 0xf0000) || 19211 ((instr & 0x70f0) == 0x30)) { 19212 UnallocatedT32(instr); 19213 return; 19214 } 19215 unsigned rd = (instr >> 8) & 0xf; 19216 unsigned rn = (instr >> 16) & 0xf; 19217 unsigned rm = instr & 0xf; 19218 ImmediateShiftOperand 19219 shift_operand((instr >> 4) & 0x3, 19220 ((instr >> 6) & 0x3) | 19221 ((instr >> 10) & 0x1c)); 19222 // ORNS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T1 NOLINT(whitespace/line_length) 19223 orns(CurrentCond(), 19224 Register(rd), 19225 Register(rn), 19226 Operand(Register(rm), 19227 shift_operand.GetType(), 19228 shift_operand.GetAmount())); 19229 if (((instr & 0xfff08000) != 0xea700000)) { 19230 UnpredictableT32(instr); 19231 } 19232 break; 19233 } 19234 } 19235 break; 19236 } 19237 } 19238 break; 19239 } 19240 } 19241 break; 19242 } 19243 case 0x00800000: { 19244 // 0xea800000 19245 switch (instr & 0x00600000) { 19246 case 0x00000000: { 19247 // 0xea800000 19248 switch (instr & 0x000070f0) { 19249 case 0x00000030: { 19250 // 0xea800030 19251 unsigned rd = (instr >> 8) & 0xf; 19252 unsigned rn = (instr >> 16) & 0xf; 19253 unsigned rm = instr & 0xf; 19254 // EOR{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T2 19255 eor(CurrentCond(), 19256 Best, 19257 Register(rd), 19258 Register(rn), 19259 Operand(Register(rm), RRX)); 19260 if (((instr & 0xfff0f0f0) != 0xea800030)) { 19261 UnpredictableT32(instr); 19262 } 19263 break; 19264 } 19265 default: { 19266 if (((instr & 0x70f0) == 0x30)) { 19267 UnallocatedT32(instr); 19268 return; 19269 } 19270 unsigned rd = (instr >> 8) & 0xf; 19271 unsigned rn = (instr >> 16) & 0xf; 19272 unsigned rm = instr & 0xf; 19273 ImmediateShiftOperand 19274 shift_operand((instr >> 4) & 0x3, 19275 ((instr >> 6) & 0x3) | 19276 ((instr >> 10) & 0x1c)); 19277 if (InITBlock() && 19278 (instr & 0x00100000) == 0x00000000 && 19279 shift_operand.GetShift().IsLSL() && 19280 (shift_operand.GetAmount() == 0) && 19281 ((rd == rn) && (rd < kNumberOfT32LowRegisters) && 19282 (rm < kNumberOfT32LowRegisters))) { 19283 // EOR<c>.W {<Rd>}, <Rn>, <Rm> ; T2 19284 eor(CurrentCond(), 19285 Wide, 19286 Register(rd), 19287 Register(rn), 19288 Register(rm)); 19289 if (((instr & 0xfff08000) != 0xea800000)) { 19290 UnpredictableT32(instr); 19291 } 19292 } else if ((instr & 0x00100000) == 0x00000000) { 19293 // EOR{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length) 19294 eor(CurrentCond(), 19295 Best, 19296 Register(rd), 19297 Register(rn), 19298 Operand(Register(rm), 19299 shift_operand.GetType(), 19300 shift_operand.GetAmount())); 19301 if (((instr & 0xfff08000) != 0xea800000)) { 19302 UnpredictableT32(instr); 19303 } 19304 } else { 19305 UnallocatedT32(instr); 19306 } 19307 break; 19308 } 19309 } 19310 break; 19311 } 19312 case 0x00400000: { 19313 // 0xeac00000 19314 switch (instr & 0x00000030) { 19315 case 0x00000000: { 19316 // 0xeac00000 19317 unsigned rd = (instr >> 8) & 0xf; 19318 unsigned rn = (instr >> 16) & 0xf; 19319 unsigned rm = instr & 0xf; 19320 uint32_t amount = 19321 ((instr >> 6) & 0x3) | ((instr >> 10) & 0x1c); 19322 // PKHBT{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, LSL #<imm> } ; T1 NOLINT(whitespace/line_length) 19323 pkhbt(CurrentCond(), 19324 Register(rd), 19325 Register(rn), 19326 Operand(Register(rm), LSL, amount)); 19327 if (((instr & 0xfff08030) != 0xeac00000)) { 19328 UnpredictableT32(instr); 19329 } 19330 break; 19331 } 19332 case 0x00000020: { 19333 // 0xeac00020 19334 unsigned rd = (instr >> 8) & 0xf; 19335 unsigned rn = (instr >> 16) & 0xf; 19336 unsigned rm = instr & 0xf; 19337 uint32_t amount = 19338 ((instr >> 6) & 0x3) | ((instr >> 10) & 0x1c); 19339 if (amount == 0) amount = 32; 19340 // PKHTB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, ASR #<imm> } ; T1 NOLINT(whitespace/line_length) 19341 pkhtb(CurrentCond(), 19342 Register(rd), 19343 Register(rn), 19344 Operand(Register(rm), ASR, amount)); 19345 if (((instr & 0xfff08030) != 0xeac00020)) { 19346 UnpredictableT32(instr); 19347 } 19348 break; 19349 } 19350 default: 19351 UnallocatedT32(instr); 19352 break; 19353 } 19354 break; 19355 } 19356 default: 19357 UnallocatedT32(instr); 19358 break; 19359 } 19360 break; 19361 } 19362 case 0x00900000: { 19363 // 0xea900000 19364 switch (instr & 0x00600000) { 19365 case 0x00000000: { 19366 // 0xea900000 19367 switch (instr & 0x00000f00) { 19368 case 0x00000f00: { 19369 // 0xea900f00 19370 switch (instr & 0x000070f0) { 19371 case 0x00000030: { 19372 // 0xea900f30 19373 unsigned rn = (instr >> 16) & 0xf; 19374 unsigned rm = instr & 0xf; 19375 // TEQ{<c>}{<q>} <Rn>, <Rm>, RRX ; T1 19376 teq(CurrentCond(), 19377 Register(rn), 19378 Operand(Register(rm), RRX)); 19379 if (((instr & 0xfff0fff0) != 0xea900f30)) { 19380 UnpredictableT32(instr); 19381 } 19382 break; 19383 } 19384 default: { 19385 if (((instr & 0x70f0) == 0x30)) { 19386 UnallocatedT32(instr); 19387 return; 19388 } 19389 unsigned rn = (instr >> 16) & 0xf; 19390 unsigned rm = instr & 0xf; 19391 ImmediateShiftOperand 19392 shift_operand((instr >> 4) & 0x3, 19393 ((instr >> 6) & 0x3) | 19394 ((instr >> 10) & 0x1c)); 19395 // TEQ{<c>}{<q>} <Rn>, <Rm> {, <shift> #<amount> } ; T1 NOLINT(whitespace/line_length) 19396 teq(CurrentCond(), 19397 Register(rn), 19398 Operand(Register(rm), 19399 shift_operand.GetType(), 19400 shift_operand.GetAmount())); 19401 if (((instr & 0xfff08f00) != 0xea900f00)) { 19402 UnpredictableT32(instr); 19403 } 19404 break; 19405 } 19406 } 19407 break; 19408 } 19409 default: { 19410 switch (instr & 0x000070f0) { 19411 case 0x00000030: { 19412 // 0xea900030 19413 if (((instr & 0xf00) == 0xf00)) { 19414 UnallocatedT32(instr); 19415 return; 19416 } 19417 unsigned rd = (instr >> 8) & 0xf; 19418 unsigned rn = (instr >> 16) & 0xf; 19419 unsigned rm = instr & 0xf; 19420 // EORS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T2 19421 eors(CurrentCond(), 19422 Best, 19423 Register(rd), 19424 Register(rn), 19425 Operand(Register(rm), RRX)); 19426 if (((instr & 0xfff0f0f0) != 0xea900030)) { 19427 UnpredictableT32(instr); 19428 } 19429 break; 19430 } 19431 default: { 19432 if (((instr & 0x70f0) == 0x30) || 19433 ((instr & 0xf00) == 0xf00)) { 19434 UnallocatedT32(instr); 19435 return; 19436 } 19437 unsigned rd = (instr >> 8) & 0xf; 19438 unsigned rn = (instr >> 16) & 0xf; 19439 unsigned rm = instr & 0xf; 19440 ImmediateShiftOperand 19441 shift_operand((instr >> 4) & 0x3, 19442 ((instr >> 6) & 0x3) | 19443 ((instr >> 10) & 0x1c)); 19444 if (OutsideITBlock() && 19445 (instr & 0x00100000) == 0x00100000 && 19446 shift_operand.GetShift().IsLSL() && 19447 (shift_operand.GetAmount() == 0) && 19448 ((rd == rn) && 19449 (rd < kNumberOfT32LowRegisters) && 19450 (rm < kNumberOfT32LowRegisters))) { 19451 // EORS.W {<Rd>}, <Rn>, <Rm> ; T2 19452 eors(Condition::None(), 19453 Wide, 19454 Register(rd), 19455 Register(rn), 19456 Register(rm)); 19457 if (((instr & 0xfff08000) != 0xea900000)) { 19458 UnpredictableT32(instr); 19459 } 19460 } else if ((instr & 0x00100000) == 0x00100000) { 19461 // EORS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length) 19462 eors(CurrentCond(), 19463 Best, 19464 Register(rd), 19465 Register(rn), 19466 Operand(Register(rm), 19467 shift_operand.GetType(), 19468 shift_operand.GetAmount())); 19469 if (((instr & 0xfff08000) != 0xea900000)) { 19470 UnpredictableT32(instr); 19471 } 19472 } else { 19473 UnallocatedT32(instr); 19474 } 19475 break; 19476 } 19477 } 19478 break; 19479 } 19480 } 19481 break; 19482 } 19483 default: 19484 UnallocatedT32(instr); 19485 break; 19486 } 19487 break; 19488 } 19489 case 0x01000000: { 19490 // 0xeb000000 19491 switch (instr & 0x00600000) { 19492 case 0x00000000: { 19493 // 0xeb000000 19494 switch (instr & 0x000f0000) { 19495 case 0x000d0000: { 19496 // 0xeb0d0000 19497 switch (instr & 0x000070f0) { 19498 case 0x00000030: { 19499 // 0xeb0d0030 19500 unsigned rd = (instr >> 8) & 0xf; 19501 unsigned rm = instr & 0xf; 19502 // ADD{<c>}{<q>} {<Rd>}, SP, <Rm>, RRX ; T3 19503 add(CurrentCond(), 19504 Best, 19505 Register(rd), 19506 sp, 19507 Operand(Register(rm), RRX)); 19508 if (((instr & 0xfffff0f0) != 0xeb0d0030)) { 19509 UnpredictableT32(instr); 19510 } 19511 break; 19512 } 19513 default: { 19514 if (((instr & 0x70f0) == 0x30)) { 19515 UnallocatedT32(instr); 19516 return; 19517 } 19518 unsigned rd = (instr >> 8) & 0xf; 19519 unsigned rm = instr & 0xf; 19520 ImmediateShiftOperand 19521 shift_operand((instr >> 4) & 0x3, 19522 ((instr >> 6) & 0x3) | 19523 ((instr >> 10) & 0x1c)); 19524 if ((instr & 0x00100000) == 0x00000000 && 19525 shift_operand.GetShift().IsLSL() && 19526 (shift_operand.GetAmount() == 0) && 19527 (((rd == rm)) || ((rd == sp.GetCode())))) { 19528 // ADD{<c>}.W {<Rd>}, SP, <Rm> ; T3 19529 add(CurrentCond(), 19530 Wide, 19531 Register(rd), 19532 sp, 19533 Register(rm)); 19534 if (((instr & 0xffff8000) != 0xeb0d0000)) { 19535 UnpredictableT32(instr); 19536 } 19537 } else if ((instr & 0x00100000) == 0x00000000) { 19538 // ADD{<c>}{<q>} {<Rd>}, SP, <Rm> {, <shift> #<amount> } ; T3 NOLINT(whitespace/line_length) 19539 add(CurrentCond(), 19540 Best, 19541 Register(rd), 19542 sp, 19543 Operand(Register(rm), 19544 shift_operand.GetType(), 19545 shift_operand.GetAmount())); 19546 if (((instr & 0xffff8000) != 0xeb0d0000)) { 19547 UnpredictableT32(instr); 19548 } 19549 } else { 19550 UnallocatedT32(instr); 19551 } 19552 break; 19553 } 19554 } 19555 break; 19556 } 19557 default: { 19558 switch (instr & 0x000070f0) { 19559 case 0x00000030: { 19560 // 0xeb000030 19561 if (((instr & 0xf0000) == 0xd0000)) { 19562 UnallocatedT32(instr); 19563 return; 19564 } 19565 unsigned rd = (instr >> 8) & 0xf; 19566 unsigned rn = (instr >> 16) & 0xf; 19567 unsigned rm = instr & 0xf; 19568 // ADD{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T3 19569 add(CurrentCond(), 19570 Best, 19571 Register(rd), 19572 Register(rn), 19573 Operand(Register(rm), RRX)); 19574 if (((instr & 0xfff0f0f0) != 0xeb000030)) { 19575 UnpredictableT32(instr); 19576 } 19577 break; 19578 } 19579 default: { 19580 if (((instr & 0xf0000) == 0xd0000) || 19581 ((instr & 0x70f0) == 0x30)) { 19582 UnallocatedT32(instr); 19583 return; 19584 } 19585 unsigned rd = (instr >> 8) & 0xf; 19586 unsigned rn = (instr >> 16) & 0xf; 19587 unsigned rm = instr & 0xf; 19588 ImmediateShiftOperand 19589 shift_operand((instr >> 4) & 0x3, 19590 ((instr >> 6) & 0x3) | 19591 ((instr >> 10) & 0x1c)); 19592 if (InITBlock() && 19593 (instr & 0x00100000) == 0x00000000 && 19594 shift_operand.GetShift().IsLSL() && 19595 (shift_operand.GetAmount() == 0) && 19596 ((rd < kNumberOfT32LowRegisters) && 19597 (rn < kNumberOfT32LowRegisters) && 19598 (rm < kNumberOfT32LowRegisters))) { 19599 // ADD<c>.W {<Rd>}, <Rn>, <Rm> ; T3 19600 add(CurrentCond(), 19601 Wide, 19602 Register(rd), 19603 Register(rn), 19604 Register(rm)); 19605 if (((instr & 0xfff08000) != 0xeb000000)) { 19606 UnpredictableT32(instr); 19607 } 19608 } else if ((instr & 0x00100000) == 0x00000000 && 19609 shift_operand.GetShift().IsLSL() && 19610 (shift_operand.GetAmount() == 0) && 19611 ((rd == rn))) { 19612 // ADD<c>.W {<Rd>}, <Rn>, <Rm> ; T3 19613 add(CurrentCond(), 19614 Wide, 19615 Register(rd), 19616 Register(rn), 19617 Register(rm)); 19618 if (((instr & 0xfff08000) != 0xeb000000)) { 19619 UnpredictableT32(instr); 19620 } 19621 } else if ((instr & 0x00100000) == 0x00000000) { 19622 // ADD{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T3 NOLINT(whitespace/line_length) 19623 add(CurrentCond(), 19624 Best, 19625 Register(rd), 19626 Register(rn), 19627 Operand(Register(rm), 19628 shift_operand.GetType(), 19629 shift_operand.GetAmount())); 19630 if (((instr & 0xfff08000) != 0xeb000000)) { 19631 UnpredictableT32(instr); 19632 } 19633 } else { 19634 UnallocatedT32(instr); 19635 } 19636 break; 19637 } 19638 } 19639 break; 19640 } 19641 } 19642 break; 19643 } 19644 case 0x00400000: { 19645 // 0xeb400000 19646 switch (instr & 0x000070f0) { 19647 case 0x00000030: { 19648 // 0xeb400030 19649 unsigned rd = (instr >> 8) & 0xf; 19650 unsigned rn = (instr >> 16) & 0xf; 19651 unsigned rm = instr & 0xf; 19652 // ADC{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T2 19653 adc(CurrentCond(), 19654 Best, 19655 Register(rd), 19656 Register(rn), 19657 Operand(Register(rm), RRX)); 19658 if (((instr & 0xfff0f0f0) != 0xeb400030)) { 19659 UnpredictableT32(instr); 19660 } 19661 break; 19662 } 19663 default: { 19664 if (((instr & 0x70f0) == 0x30)) { 19665 UnallocatedT32(instr); 19666 return; 19667 } 19668 unsigned rd = (instr >> 8) & 0xf; 19669 unsigned rn = (instr >> 16) & 0xf; 19670 unsigned rm = instr & 0xf; 19671 ImmediateShiftOperand 19672 shift_operand((instr >> 4) & 0x3, 19673 ((instr >> 6) & 0x3) | 19674 ((instr >> 10) & 0x1c)); 19675 if (InITBlock() && 19676 (instr & 0x00100000) == 0x00000000 && 19677 shift_operand.GetShift().IsLSL() && 19678 (shift_operand.GetAmount() == 0) && 19679 ((rd == rn) && (rd < kNumberOfT32LowRegisters) && 19680 (rm < kNumberOfT32LowRegisters))) { 19681 // ADC<c>.W {<Rd>}, <Rn>, <Rm> ; T2 19682 adc(CurrentCond(), 19683 Wide, 19684 Register(rd), 19685 Register(rn), 19686 Register(rm)); 19687 if (((instr & 0xfff08000) != 0xeb400000)) { 19688 UnpredictableT32(instr); 19689 } 19690 } else if ((instr & 0x00100000) == 0x00000000) { 19691 // ADC{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length) 19692 adc(CurrentCond(), 19693 Best, 19694 Register(rd), 19695 Register(rn), 19696 Operand(Register(rm), 19697 shift_operand.GetType(), 19698 shift_operand.GetAmount())); 19699 if (((instr & 0xfff08000) != 0xeb400000)) { 19700 UnpredictableT32(instr); 19701 } 19702 } else { 19703 UnallocatedT32(instr); 19704 } 19705 break; 19706 } 19707 } 19708 break; 19709 } 19710 case 0x00600000: { 19711 // 0xeb600000 19712 switch (instr & 0x000070f0) { 19713 case 0x00000030: { 19714 // 0xeb600030 19715 unsigned rd = (instr >> 8) & 0xf; 19716 unsigned rn = (instr >> 16) & 0xf; 19717 unsigned rm = instr & 0xf; 19718 // SBC{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T2 19719 sbc(CurrentCond(), 19720 Best, 19721 Register(rd), 19722 Register(rn), 19723 Operand(Register(rm), RRX)); 19724 if (((instr & 0xfff0f0f0) != 0xeb600030)) { 19725 UnpredictableT32(instr); 19726 } 19727 break; 19728 } 19729 default: { 19730 if (((instr & 0x70f0) == 0x30)) { 19731 UnallocatedT32(instr); 19732 return; 19733 } 19734 unsigned rd = (instr >> 8) & 0xf; 19735 unsigned rn = (instr >> 16) & 0xf; 19736 unsigned rm = instr & 0xf; 19737 ImmediateShiftOperand 19738 shift_operand((instr >> 4) & 0x3, 19739 ((instr >> 6) & 0x3) | 19740 ((instr >> 10) & 0x1c)); 19741 if (InITBlock() && 19742 (instr & 0x00100000) == 0x00000000 && 19743 shift_operand.GetShift().IsLSL() && 19744 (shift_operand.GetAmount() == 0) && 19745 ((rd == rn) && (rd < kNumberOfT32LowRegisters) && 19746 (rm < kNumberOfT32LowRegisters))) { 19747 // SBC<c>.W {<Rd>}, <Rn>, <Rm> ; T2 19748 sbc(CurrentCond(), 19749 Wide, 19750 Register(rd), 19751 Register(rn), 19752 Register(rm)); 19753 if (((instr & 0xfff08000) != 0xeb600000)) { 19754 UnpredictableT32(instr); 19755 } 19756 } else if ((instr & 0x00100000) == 0x00000000) { 19757 // SBC{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length) 19758 sbc(CurrentCond(), 19759 Best, 19760 Register(rd), 19761 Register(rn), 19762 Operand(Register(rm), 19763 shift_operand.GetType(), 19764 shift_operand.GetAmount())); 19765 if (((instr & 0xfff08000) != 0xeb600000)) { 19766 UnpredictableT32(instr); 19767 } 19768 } else { 19769 UnallocatedT32(instr); 19770 } 19771 break; 19772 } 19773 } 19774 break; 19775 } 19776 default: 19777 UnallocatedT32(instr); 19778 break; 19779 } 19780 break; 19781 } 19782 case 0x01100000: { 19783 // 0xeb100000 19784 switch (instr & 0x00600000) { 19785 case 0x00000000: { 19786 // 0xeb100000 19787 switch (instr & 0x00000f00) { 19788 case 0x00000f00: { 19789 // 0xeb100f00 19790 switch (instr & 0x000070f0) { 19791 case 0x00000030: { 19792 // 0xeb100f30 19793 unsigned rn = (instr >> 16) & 0xf; 19794 unsigned rm = instr & 0xf; 19795 // CMN{<c>}{<q>} <Rn>, <Rm>, RRX ; T2 19796 cmn(CurrentCond(), 19797 Best, 19798 Register(rn), 19799 Operand(Register(rm), RRX)); 19800 if (((instr & 0xfff0fff0) != 0xeb100f30)) { 19801 UnpredictableT32(instr); 19802 } 19803 break; 19804 } 19805 default: { 19806 if (((instr & 0x70f0) == 0x30)) { 19807 UnallocatedT32(instr); 19808 return; 19809 } 19810 unsigned rn = (instr >> 16) & 0xf; 19811 unsigned rm = instr & 0xf; 19812 ImmediateShiftOperand 19813 shift_operand((instr >> 4) & 0x3, 19814 ((instr >> 6) & 0x3) | 19815 ((instr >> 10) & 0x1c)); 19816 if (shift_operand.GetShift().IsLSL() && 19817 (shift_operand.GetAmount() == 0) && 19818 ((rn < kNumberOfT32LowRegisters) && 19819 (rm < kNumberOfT32LowRegisters))) { 19820 // CMN{<c>}.W <Rn>, <Rm> ; T2 19821 cmn(CurrentCond(), 19822 Wide, 19823 Register(rn), 19824 Register(rm)); 19825 if (((instr & 0xfff08f00) != 0xeb100f00)) { 19826 UnpredictableT32(instr); 19827 } 19828 } else { 19829 // CMN{<c>}{<q>} <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length) 19830 cmn(CurrentCond(), 19831 Best, 19832 Register(rn), 19833 Operand(Register(rm), 19834 shift_operand.GetType(), 19835 shift_operand.GetAmount())); 19836 if (((instr & 0xfff08f00) != 0xeb100f00)) { 19837 UnpredictableT32(instr); 19838 } 19839 } 19840 break; 19841 } 19842 } 19843 break; 19844 } 19845 default: { 19846 switch (instr & 0x000f0000) { 19847 case 0x000d0000: { 19848 // 0xeb1d0000 19849 switch (instr & 0x000070f0) { 19850 case 0x00000030: { 19851 // 0xeb1d0030 19852 if (((instr & 0xf00) == 0xf00)) { 19853 UnallocatedT32(instr); 19854 return; 19855 } 19856 unsigned rd = (instr >> 8) & 0xf; 19857 unsigned rm = instr & 0xf; 19858 // ADDS{<c>}{<q>} {<Rd>}, SP, <Rm>, RRX ; T3 19859 adds(CurrentCond(), 19860 Best, 19861 Register(rd), 19862 sp, 19863 Operand(Register(rm), RRX)); 19864 if (((instr & 0xfffff0f0) != 0xeb1d0030)) { 19865 UnpredictableT32(instr); 19866 } 19867 break; 19868 } 19869 default: { 19870 if (((instr & 0x70f0) == 0x30) || 19871 ((instr & 0xf00) == 0xf00)) { 19872 UnallocatedT32(instr); 19873 return; 19874 } 19875 unsigned rd = (instr >> 8) & 0xf; 19876 unsigned rm = instr & 0xf; 19877 ImmediateShiftOperand 19878 shift_operand((instr >> 4) & 0x3, 19879 ((instr >> 6) & 0x3) | 19880 ((instr >> 10) & 0x1c)); 19881 // ADDS{<c>}{<q>} {<Rd>}, SP, <Rm> {, <shift> #<amount> } ; T3 NOLINT(whitespace/line_length) 19882 adds(CurrentCond(), 19883 Best, 19884 Register(rd), 19885 sp, 19886 Operand(Register(rm), 19887 shift_operand.GetType(), 19888 shift_operand.GetAmount())); 19889 if (((instr & 0xffff8000) != 0xeb1d0000)) { 19890 UnpredictableT32(instr); 19891 } 19892 break; 19893 } 19894 } 19895 break; 19896 } 19897 default: { 19898 switch (instr & 0x000070f0) { 19899 case 0x00000030: { 19900 // 0xeb100030 19901 if (((instr & 0xf0000) == 0xd0000) || 19902 ((instr & 0xf00) == 0xf00)) { 19903 UnallocatedT32(instr); 19904 return; 19905 } 19906 unsigned rd = (instr >> 8) & 0xf; 19907 unsigned rn = (instr >> 16) & 0xf; 19908 unsigned rm = instr & 0xf; 19909 // ADDS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T3 19910 adds(CurrentCond(), 19911 Best, 19912 Register(rd), 19913 Register(rn), 19914 Operand(Register(rm), RRX)); 19915 if (((instr & 0xfff0f0f0) != 0xeb100030)) { 19916 UnpredictableT32(instr); 19917 } 19918 break; 19919 } 19920 default: { 19921 if (((instr & 0xf0000) == 0xd0000) || 19922 ((instr & 0x70f0) == 0x30) || 19923 ((instr & 0xf00) == 0xf00)) { 19924 UnallocatedT32(instr); 19925 return; 19926 } 19927 unsigned rd = (instr >> 8) & 0xf; 19928 unsigned rn = (instr >> 16) & 0xf; 19929 unsigned rm = instr & 0xf; 19930 ImmediateShiftOperand 19931 shift_operand((instr >> 4) & 0x3, 19932 ((instr >> 6) & 0x3) | 19933 ((instr >> 10) & 0x1c)); 19934 if (OutsideITBlock() && 19935 (instr & 0x00100000) == 0x00100000 && 19936 shift_operand.GetShift().IsLSL() && 19937 (shift_operand.GetAmount() == 0) && 19938 ((rd < kNumberOfT32LowRegisters) && 19939 (rn < kNumberOfT32LowRegisters) && 19940 (rm < kNumberOfT32LowRegisters))) { 19941 // ADDS.W {<Rd>}, <Rn>, <Rm> ; T3 19942 adds(Condition::None(), 19943 Wide, 19944 Register(rd), 19945 Register(rn), 19946 Register(rm)); 19947 if (((instr & 0xfff08000) != 0xeb100000)) { 19948 UnpredictableT32(instr); 19949 } 19950 } else if ((instr & 0x00100000) == 19951 0x00100000) { 19952 // ADDS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T3 NOLINT(whitespace/line_length) 19953 adds(CurrentCond(), 19954 Best, 19955 Register(rd), 19956 Register(rn), 19957 Operand(Register(rm), 19958 shift_operand.GetType(), 19959 shift_operand.GetAmount())); 19960 if (((instr & 0xfff08000) != 0xeb100000)) { 19961 UnpredictableT32(instr); 19962 } 19963 } else { 19964 UnallocatedT32(instr); 19965 } 19966 break; 19967 } 19968 } 19969 break; 19970 } 19971 } 19972 break; 19973 } 19974 } 19975 break; 19976 } 19977 case 0x00400000: { 19978 // 0xeb500000 19979 switch (instr & 0x000070f0) { 19980 case 0x00000030: { 19981 // 0xeb500030 19982 unsigned rd = (instr >> 8) & 0xf; 19983 unsigned rn = (instr >> 16) & 0xf; 19984 unsigned rm = instr & 0xf; 19985 // ADCS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T2 19986 adcs(CurrentCond(), 19987 Best, 19988 Register(rd), 19989 Register(rn), 19990 Operand(Register(rm), RRX)); 19991 if (((instr & 0xfff0f0f0) != 0xeb500030)) { 19992 UnpredictableT32(instr); 19993 } 19994 break; 19995 } 19996 default: { 19997 if (((instr & 0x70f0) == 0x30)) { 19998 UnallocatedT32(instr); 19999 return; 20000 } 20001 unsigned rd = (instr >> 8) & 0xf; 20002 unsigned rn = (instr >> 16) & 0xf; 20003 unsigned rm = instr & 0xf; 20004 ImmediateShiftOperand 20005 shift_operand((instr >> 4) & 0x3, 20006 ((instr >> 6) & 0x3) | 20007 ((instr >> 10) & 0x1c)); 20008 if (OutsideITBlock() && 20009 (instr & 0x00100000) == 0x00100000 && 20010 shift_operand.GetShift().IsLSL() && 20011 (shift_operand.GetAmount() == 0) && 20012 ((rd == rn) && (rd < kNumberOfT32LowRegisters) && 20013 (rm < kNumberOfT32LowRegisters))) { 20014 // ADCS.W {<Rd>}, <Rn>, <Rm> ; T2 20015 adcs(Condition::None(), 20016 Wide, 20017 Register(rd), 20018 Register(rn), 20019 Register(rm)); 20020 if (((instr & 0xfff08000) != 0xeb500000)) { 20021 UnpredictableT32(instr); 20022 } 20023 } else if ((instr & 0x00100000) == 0x00100000) { 20024 // ADCS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length) 20025 adcs(CurrentCond(), 20026 Best, 20027 Register(rd), 20028 Register(rn), 20029 Operand(Register(rm), 20030 shift_operand.GetType(), 20031 shift_operand.GetAmount())); 20032 if (((instr & 0xfff08000) != 0xeb500000)) { 20033 UnpredictableT32(instr); 20034 } 20035 } else { 20036 UnallocatedT32(instr); 20037 } 20038 break; 20039 } 20040 } 20041 break; 20042 } 20043 case 0x00600000: { 20044 // 0xeb700000 20045 switch (instr & 0x000070f0) { 20046 case 0x00000030: { 20047 // 0xeb700030 20048 unsigned rd = (instr >> 8) & 0xf; 20049 unsigned rn = (instr >> 16) & 0xf; 20050 unsigned rm = instr & 0xf; 20051 // SBCS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T2 20052 sbcs(CurrentCond(), 20053 Best, 20054 Register(rd), 20055 Register(rn), 20056 Operand(Register(rm), RRX)); 20057 if (((instr & 0xfff0f0f0) != 0xeb700030)) { 20058 UnpredictableT32(instr); 20059 } 20060 break; 20061 } 20062 default: { 20063 if (((instr & 0x70f0) == 0x30)) { 20064 UnallocatedT32(instr); 20065 return; 20066 } 20067 unsigned rd = (instr >> 8) & 0xf; 20068 unsigned rn = (instr >> 16) & 0xf; 20069 unsigned rm = instr & 0xf; 20070 ImmediateShiftOperand 20071 shift_operand((instr >> 4) & 0x3, 20072 ((instr >> 6) & 0x3) | 20073 ((instr >> 10) & 0x1c)); 20074 if (OutsideITBlock() && 20075 (instr & 0x00100000) == 0x00100000 && 20076 shift_operand.GetShift().IsLSL() && 20077 (shift_operand.GetAmount() == 0) && 20078 ((rd == rn) && (rd < kNumberOfT32LowRegisters) && 20079 (rm < kNumberOfT32LowRegisters))) { 20080 // SBCS.W {<Rd>}, <Rn>, <Rm> ; T2 20081 sbcs(Condition::None(), 20082 Wide, 20083 Register(rd), 20084 Register(rn), 20085 Register(rm)); 20086 if (((instr & 0xfff08000) != 0xeb700000)) { 20087 UnpredictableT32(instr); 20088 } 20089 } else if ((instr & 0x00100000) == 0x00100000) { 20090 // SBCS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length) 20091 sbcs(CurrentCond(), 20092 Best, 20093 Register(rd), 20094 Register(rn), 20095 Operand(Register(rm), 20096 shift_operand.GetType(), 20097 shift_operand.GetAmount())); 20098 if (((instr & 0xfff08000) != 0xeb700000)) { 20099 UnpredictableT32(instr); 20100 } 20101 } else { 20102 UnallocatedT32(instr); 20103 } 20104 break; 20105 } 20106 } 20107 break; 20108 } 20109 default: 20110 UnallocatedT32(instr); 20111 break; 20112 } 20113 break; 20114 } 20115 case 0x01800000: { 20116 // 0xeb800000 20117 switch (instr & 0x00600000) { 20118 case 0x00200000: { 20119 // 0xeba00000 20120 switch (instr & 0x000f0000) { 20121 case 0x000d0000: { 20122 // 0xebad0000 20123 switch (instr & 0x000070f0) { 20124 case 0x00000030: { 20125 // 0xebad0030 20126 unsigned rd = (instr >> 8) & 0xf; 20127 unsigned rm = instr & 0xf; 20128 // SUB{<c>}{<q>} {<Rd>}, SP, <Rm>, RRX ; T1 20129 sub(CurrentCond(), 20130 Best, 20131 Register(rd), 20132 sp, 20133 Operand(Register(rm), RRX)); 20134 if (((instr & 0xfffff0f0) != 0xebad0030)) { 20135 UnpredictableT32(instr); 20136 } 20137 break; 20138 } 20139 default: { 20140 if (((instr & 0x70f0) == 0x30)) { 20141 UnallocatedT32(instr); 20142 return; 20143 } 20144 unsigned rd = (instr >> 8) & 0xf; 20145 unsigned rm = instr & 0xf; 20146 ImmediateShiftOperand 20147 shift_operand((instr >> 4) & 0x3, 20148 ((instr >> 6) & 0x3) | 20149 ((instr >> 10) & 0x1c)); 20150 if ((instr & 0x00100000) == 0x00000000 && 20151 shift_operand.GetShift().IsLSL() && 20152 (shift_operand.GetAmount() == 0)) { 20153 // SUB{<c>} {<Rd>}, SP, <Rm> ; T1 20154 sub(CurrentCond(), 20155 Best, 20156 Register(rd), 20157 sp, 20158 Register(rm)); 20159 if (((instr & 0xffff8000) != 0xebad0000)) { 20160 UnpredictableT32(instr); 20161 } 20162 } else if ((instr & 0x00100000) == 0x00000000) { 20163 // SUB{<c>}{<q>} {<Rd>}, SP, <Rm> {, <shift> #<amount> } ; T1 NOLINT(whitespace/line_length) 20164 sub(CurrentCond(), 20165 Best, 20166 Register(rd), 20167 sp, 20168 Operand(Register(rm), 20169 shift_operand.GetType(), 20170 shift_operand.GetAmount())); 20171 if (((instr & 0xffff8000) != 0xebad0000)) { 20172 UnpredictableT32(instr); 20173 } 20174 } else { 20175 UnallocatedT32(instr); 20176 } 20177 break; 20178 } 20179 } 20180 break; 20181 } 20182 default: { 20183 switch (instr & 0x000070f0) { 20184 case 0x00000030: { 20185 // 0xeba00030 20186 if (((instr & 0xf0000) == 0xd0000)) { 20187 UnallocatedT32(instr); 20188 return; 20189 } 20190 unsigned rd = (instr >> 8) & 0xf; 20191 unsigned rn = (instr >> 16) & 0xf; 20192 unsigned rm = instr & 0xf; 20193 // SUB{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T2 20194 sub(CurrentCond(), 20195 Best, 20196 Register(rd), 20197 Register(rn), 20198 Operand(Register(rm), RRX)); 20199 if (((instr & 0xfff0f0f0) != 0xeba00030)) { 20200 UnpredictableT32(instr); 20201 } 20202 break; 20203 } 20204 default: { 20205 if (((instr & 0xf0000) == 0xd0000) || 20206 ((instr & 0x70f0) == 0x30)) { 20207 UnallocatedT32(instr); 20208 return; 20209 } 20210 unsigned rd = (instr >> 8) & 0xf; 20211 unsigned rn = (instr >> 16) & 0xf; 20212 unsigned rm = instr & 0xf; 20213 ImmediateShiftOperand 20214 shift_operand((instr >> 4) & 0x3, 20215 ((instr >> 6) & 0x3) | 20216 ((instr >> 10) & 0x1c)); 20217 if (InITBlock() && 20218 (instr & 0x00100000) == 0x00000000 && 20219 shift_operand.GetShift().IsLSL() && 20220 (shift_operand.GetAmount() == 0) && 20221 ((rd < kNumberOfT32LowRegisters) && 20222 (rn < kNumberOfT32LowRegisters) && 20223 (rm < kNumberOfT32LowRegisters))) { 20224 // SUB<c>.W {<Rd>}, <Rn>, <Rm> ; T2 20225 sub(CurrentCond(), 20226 Wide, 20227 Register(rd), 20228 Register(rn), 20229 Register(rm)); 20230 if (((instr & 0xfff08000) != 0xeba00000)) { 20231 UnpredictableT32(instr); 20232 } 20233 } else if ((instr & 0x00100000) == 0x00000000) { 20234 // SUB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length) 20235 sub(CurrentCond(), 20236 Best, 20237 Register(rd), 20238 Register(rn), 20239 Operand(Register(rm), 20240 shift_operand.GetType(), 20241 shift_operand.GetAmount())); 20242 if (((instr & 0xfff08000) != 0xeba00000)) { 20243 UnpredictableT32(instr); 20244 } 20245 } else { 20246 UnallocatedT32(instr); 20247 } 20248 break; 20249 } 20250 } 20251 break; 20252 } 20253 } 20254 break; 20255 } 20256 case 0x00400000: { 20257 // 0xebc00000 20258 switch (instr & 0x000070f0) { 20259 case 0x00000030: { 20260 // 0xebc00030 20261 unsigned rd = (instr >> 8) & 0xf; 20262 unsigned rn = (instr >> 16) & 0xf; 20263 unsigned rm = instr & 0xf; 20264 // RSB{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T1 20265 rsb(CurrentCond(), 20266 Best, 20267 Register(rd), 20268 Register(rn), 20269 Operand(Register(rm), RRX)); 20270 if (((instr & 0xfff0f0f0) != 0xebc00030)) { 20271 UnpredictableT32(instr); 20272 } 20273 break; 20274 } 20275 default: { 20276 if (((instr & 0x70f0) == 0x30)) { 20277 UnallocatedT32(instr); 20278 return; 20279 } 20280 unsigned rd = (instr >> 8) & 0xf; 20281 unsigned rn = (instr >> 16) & 0xf; 20282 unsigned rm = instr & 0xf; 20283 ImmediateShiftOperand 20284 shift_operand((instr >> 4) & 0x3, 20285 ((instr >> 6) & 0x3) | 20286 ((instr >> 10) & 0x1c)); 20287 // RSB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T1 NOLINT(whitespace/line_length) 20288 rsb(CurrentCond(), 20289 Best, 20290 Register(rd), 20291 Register(rn), 20292 Operand(Register(rm), 20293 shift_operand.GetType(), 20294 shift_operand.GetAmount())); 20295 if (((instr & 0xfff08000) != 0xebc00000)) { 20296 UnpredictableT32(instr); 20297 } 20298 break; 20299 } 20300 } 20301 break; 20302 } 20303 default: 20304 UnallocatedT32(instr); 20305 break; 20306 } 20307 break; 20308 } 20309 case 0x01900000: { 20310 // 0xeb900000 20311 switch (instr & 0x00600000) { 20312 case 0x00200000: { 20313 // 0xebb00000 20314 switch (instr & 0x00000f00) { 20315 case 0x00000f00: { 20316 // 0xebb00f00 20317 switch (instr & 0x000070f0) { 20318 case 0x00000030: { 20319 // 0xebb00f30 20320 unsigned rn = (instr >> 16) & 0xf; 20321 unsigned rm = instr & 0xf; 20322 // CMP{<c>}{<q>} <Rn>, <Rm>, RRX ; T3 20323 cmp(CurrentCond(), 20324 Best, 20325 Register(rn), 20326 Operand(Register(rm), RRX)); 20327 if (((instr & 0xfff0fff0) != 0xebb00f30)) { 20328 UnpredictableT32(instr); 20329 } 20330 break; 20331 } 20332 default: { 20333 if (((instr & 0x70f0) == 0x30)) { 20334 UnallocatedT32(instr); 20335 return; 20336 } 20337 unsigned rn = (instr >> 16) & 0xf; 20338 unsigned rm = instr & 0xf; 20339 ImmediateShiftOperand 20340 shift_operand((instr >> 4) & 0x3, 20341 ((instr >> 6) & 0x3) | 20342 ((instr >> 10) & 0x1c)); 20343 if (shift_operand.GetShift().IsLSL() && 20344 (shift_operand.GetAmount() == 0)) { 20345 // CMP{<c>}.W <Rn>, <Rm> ; T3 20346 cmp(CurrentCond(), 20347 Wide, 20348 Register(rn), 20349 Register(rm)); 20350 if (((instr & 0xfff08f00) != 0xebb00f00)) { 20351 UnpredictableT32(instr); 20352 } 20353 } else { 20354 // CMP{<c>}{<q>} <Rn>, <Rm>, <shift> #<amount> ; T3 NOLINT(whitespace/line_length) 20355 cmp(CurrentCond(), 20356 Best, 20357 Register(rn), 20358 Operand(Register(rm), 20359 shift_operand.GetType(), 20360 shift_operand.GetAmount())); 20361 if (((instr & 0xfff08f00) != 0xebb00f00)) { 20362 UnpredictableT32(instr); 20363 } 20364 } 20365 break; 20366 } 20367 } 20368 break; 20369 } 20370 default: { 20371 switch (instr & 0x000f0000) { 20372 case 0x000d0000: { 20373 // 0xebbd0000 20374 switch (instr & 0x000070f0) { 20375 case 0x00000030: { 20376 // 0xebbd0030 20377 if (((instr & 0xf00) == 0xf00)) { 20378 UnallocatedT32(instr); 20379 return; 20380 } 20381 unsigned rd = (instr >> 8) & 0xf; 20382 unsigned rm = instr & 0xf; 20383 // SUBS{<c>}{<q>} {<Rd>}, SP, <Rm>, RRX ; T1 20384 subs(CurrentCond(), 20385 Best, 20386 Register(rd), 20387 sp, 20388 Operand(Register(rm), RRX)); 20389 if (((instr & 0xfffff0f0) != 0xebbd0030)) { 20390 UnpredictableT32(instr); 20391 } 20392 break; 20393 } 20394 default: { 20395 if (((instr & 0x70f0) == 0x30) || 20396 ((instr & 0xf00) == 0xf00)) { 20397 UnallocatedT32(instr); 20398 return; 20399 } 20400 unsigned rd = (instr >> 8) & 0xf; 20401 unsigned rm = instr & 0xf; 20402 ImmediateShiftOperand 20403 shift_operand((instr >> 4) & 0x3, 20404 ((instr >> 6) & 0x3) | 20405 ((instr >> 10) & 0x1c)); 20406 // SUBS{<c>}{<q>} {<Rd>}, SP, <Rm> {, <shift> #<amount> } ; T1 NOLINT(whitespace/line_length) 20407 subs(CurrentCond(), 20408 Best, 20409 Register(rd), 20410 sp, 20411 Operand(Register(rm), 20412 shift_operand.GetType(), 20413 shift_operand.GetAmount())); 20414 if (((instr & 0xffff8000) != 0xebbd0000)) { 20415 UnpredictableT32(instr); 20416 } 20417 break; 20418 } 20419 } 20420 break; 20421 } 20422 default: { 20423 switch (instr & 0x000070f0) { 20424 case 0x00000030: { 20425 // 0xebb00030 20426 if (((instr & 0xf0000) == 0xd0000) || 20427 ((instr & 0xf00) == 0xf00)) { 20428 UnallocatedT32(instr); 20429 return; 20430 } 20431 unsigned rd = (instr >> 8) & 0xf; 20432 unsigned rn = (instr >> 16) & 0xf; 20433 unsigned rm = instr & 0xf; 20434 // SUBS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T2 20435 subs(CurrentCond(), 20436 Best, 20437 Register(rd), 20438 Register(rn), 20439 Operand(Register(rm), RRX)); 20440 if (((instr & 0xfff0f0f0) != 0xebb00030)) { 20441 UnpredictableT32(instr); 20442 } 20443 break; 20444 } 20445 default: { 20446 if (((instr & 0xf0000) == 0xd0000) || 20447 ((instr & 0x70f0) == 0x30) || 20448 ((instr & 0xf00) == 0xf00)) { 20449 UnallocatedT32(instr); 20450 return; 20451 } 20452 unsigned rd = (instr >> 8) & 0xf; 20453 unsigned rn = (instr >> 16) & 0xf; 20454 unsigned rm = instr & 0xf; 20455 ImmediateShiftOperand 20456 shift_operand((instr >> 4) & 0x3, 20457 ((instr >> 6) & 0x3) | 20458 ((instr >> 10) & 0x1c)); 20459 if (OutsideITBlock() && 20460 (instr & 0x00100000) == 0x00100000 && 20461 shift_operand.GetShift().IsLSL() && 20462 (shift_operand.GetAmount() == 0) && 20463 ((rd < kNumberOfT32LowRegisters) && 20464 (rn < kNumberOfT32LowRegisters) && 20465 (rm < kNumberOfT32LowRegisters))) { 20466 // SUBS.W {<Rd>}, <Rn>, <Rm> ; T2 20467 subs(Condition::None(), 20468 Wide, 20469 Register(rd), 20470 Register(rn), 20471 Register(rm)); 20472 if (((instr & 0xfff08000) != 0xebb00000)) { 20473 UnpredictableT32(instr); 20474 } 20475 } else if ((instr & 0x00100000) == 20476 0x00100000) { 20477 // SUBS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T2 NOLINT(whitespace/line_length) 20478 subs(CurrentCond(), 20479 Best, 20480 Register(rd), 20481 Register(rn), 20482 Operand(Register(rm), 20483 shift_operand.GetType(), 20484 shift_operand.GetAmount())); 20485 if (((instr & 0xfff08000) != 0xebb00000)) { 20486 UnpredictableT32(instr); 20487 } 20488 } else { 20489 UnallocatedT32(instr); 20490 } 20491 break; 20492 } 20493 } 20494 break; 20495 } 20496 } 20497 break; 20498 } 20499 } 20500 break; 20501 } 20502 case 0x00400000: { 20503 // 0xebd00000 20504 switch (instr & 0x000070f0) { 20505 case 0x00000030: { 20506 // 0xebd00030 20507 unsigned rd = (instr >> 8) & 0xf; 20508 unsigned rn = (instr >> 16) & 0xf; 20509 unsigned rm = instr & 0xf; 20510 // RSBS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; T1 20511 rsbs(CurrentCond(), 20512 Best, 20513 Register(rd), 20514 Register(rn), 20515 Operand(Register(rm), RRX)); 20516 if (((instr & 0xfff0f0f0) != 0xebd00030)) { 20517 UnpredictableT32(instr); 20518 } 20519 break; 20520 } 20521 default: { 20522 if (((instr & 0x70f0) == 0x30)) { 20523 UnallocatedT32(instr); 20524 return; 20525 } 20526 unsigned rd = (instr >> 8) & 0xf; 20527 unsigned rn = (instr >> 16) & 0xf; 20528 unsigned rm = instr & 0xf; 20529 ImmediateShiftOperand 20530 shift_operand((instr >> 4) & 0x3, 20531 ((instr >> 6) & 0x3) | 20532 ((instr >> 10) & 0x1c)); 20533 // RSBS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; T1 NOLINT(whitespace/line_length) 20534 rsbs(CurrentCond(), 20535 Best, 20536 Register(rd), 20537 Register(rn), 20538 Operand(Register(rm), 20539 shift_operand.GetType(), 20540 shift_operand.GetAmount())); 20541 if (((instr & 0xfff08000) != 0xebd00000)) { 20542 UnpredictableT32(instr); 20543 } 20544 break; 20545 } 20546 } 20547 break; 20548 } 20549 default: 20550 UnallocatedT32(instr); 20551 break; 20552 } 20553 break; 20554 } 20555 case 0x10000000: { 20556 // 0xfa000000 20557 switch (instr & 0x0000f080) { 20558 case 0x0000f000: { 20559 // 0xfa00f000 20560 if ((instr & 0x00000070) == 0x00000000) { 20561 if (((Uint32((instr >> 21)) & Uint32(0x3)) == 20562 Uint32(0x2))) { 20563 unsigned rd = (instr >> 8) & 0xf; 20564 unsigned rm = (instr >> 16) & 0xf; 20565 unsigned rs = instr & 0xf; 20566 if (InITBlock() && 20567 ((rd == rm) && (rd < kNumberOfT32LowRegisters) && 20568 (rs < kNumberOfT32LowRegisters))) { 20569 // ASR<c>.W {<Rd>}, <Rm>, <Rs> ; T2 20570 asr(CurrentCond(), 20571 Wide, 20572 Register(rd), 20573 Register(rm), 20574 Register(rs)); 20575 } else { 20576 // ASR{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; T2 20577 asr(CurrentCond(), 20578 Best, 20579 Register(rd), 20580 Register(rm), 20581 Register(rs)); 20582 } 20583 return; 20584 } 20585 if (((Uint32((instr >> 21)) & Uint32(0x3)) == 20586 Uint32(0x0))) { 20587 unsigned rd = (instr >> 8) & 0xf; 20588 unsigned rm = (instr >> 16) & 0xf; 20589 unsigned rs = instr & 0xf; 20590 if (InITBlock() && 20591 ((rd == rm) && (rd < kNumberOfT32LowRegisters) && 20592 (rs < kNumberOfT32LowRegisters))) { 20593 // LSL<c>.W {<Rd>}, <Rm>, <Rs> ; T2 20594 lsl(CurrentCond(), 20595 Wide, 20596 Register(rd), 20597 Register(rm), 20598 Register(rs)); 20599 } else { 20600 // LSL{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; T2 20601 lsl(CurrentCond(), 20602 Best, 20603 Register(rd), 20604 Register(rm), 20605 Register(rs)); 20606 } 20607 return; 20608 } 20609 if (((Uint32((instr >> 21)) & Uint32(0x3)) == 20610 Uint32(0x1))) { 20611 unsigned rd = (instr >> 8) & 0xf; 20612 unsigned rm = (instr >> 16) & 0xf; 20613 unsigned rs = instr & 0xf; 20614 if (InITBlock() && 20615 ((rd == rm) && (rd < kNumberOfT32LowRegisters) && 20616 (rs < kNumberOfT32LowRegisters))) { 20617 // LSR<c>.W {<Rd>}, <Rm>, <Rs> ; T2 20618 lsr(CurrentCond(), 20619 Wide, 20620 Register(rd), 20621 Register(rm), 20622 Register(rs)); 20623 } else { 20624 // LSR{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; T2 20625 lsr(CurrentCond(), 20626 Best, 20627 Register(rd), 20628 Register(rm), 20629 Register(rs)); 20630 } 20631 return; 20632 } 20633 if (((Uint32((instr >> 21)) & Uint32(0x3)) == 20634 Uint32(0x3))) { 20635 unsigned rd = (instr >> 8) & 0xf; 20636 unsigned rm = (instr >> 16) & 0xf; 20637 unsigned rs = instr & 0xf; 20638 if (InITBlock() && 20639 ((rd == rm) && (rd < kNumberOfT32LowRegisters) && 20640 (rs < kNumberOfT32LowRegisters))) { 20641 // ROR<c>.W {<Rd>}, <Rm>, <Rs> ; T2 20642 ror(CurrentCond(), 20643 Wide, 20644 Register(rd), 20645 Register(rm), 20646 Register(rs)); 20647 } else { 20648 // ROR{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; T2 20649 ror(CurrentCond(), 20650 Best, 20651 Register(rd), 20652 Register(rm), 20653 Register(rs)); 20654 } 20655 return; 20656 } 20657 unsigned rd = (instr >> 8) & 0xf; 20658 unsigned rm = (instr >> 16) & 0xf; 20659 Shift shift((instr >> 21) & 0x3); 20660 unsigned rs = instr & 0xf; 20661 if (InITBlock() && (instr & 0x00100000) == 0x00000000 && 20662 ((rd < kNumberOfT32LowRegisters) && 20663 (rm < kNumberOfT32LowRegisters) && 20664 (rs < kNumberOfT32LowRegisters))) { 20665 // MOV<c>.W <Rd>, <Rm>, <shift> <Rs> ; T2 20666 mov(CurrentCond(), 20667 Wide, 20668 Register(rd), 20669 Operand(Register(rm), 20670 shift.GetType(), 20671 Register(rs))); 20672 } else if ((instr & 0x00100000) == 0x00000000) { 20673 // MOV{<c>}{<q>} <Rd>, <Rm>, <shift> <Rs> ; T2 20674 mov(CurrentCond(), 20675 Best, 20676 Register(rd), 20677 Operand(Register(rm), 20678 shift.GetType(), 20679 Register(rs))); 20680 } else { 20681 UnallocatedT32(instr); 20682 } 20683 } else { 20684 UnallocatedT32(instr); 20685 } 20686 break; 20687 } 20688 case 0x0000f080: { 20689 // 0xfa00f080 20690 switch (instr & 0x00600000) { 20691 case 0x00000000: { 20692 // 0xfa00f080 20693 switch (instr & 0x000f0000) { 20694 case 0x000f0000: { 20695 // 0xfa0ff080 20696 unsigned rd = (instr >> 8) & 0xf; 20697 unsigned rm = instr & 0xf; 20698 uint32_t amount = ((instr >> 4) & 0x3) * 8; 20699 if ((amount == 0) && 20700 ((rd < kNumberOfT32LowRegisters) && 20701 (rm < kNumberOfT32LowRegisters))) { 20702 // SXTH{<c>}.W {<Rd>}, <Rm> ; T2 20703 sxth(CurrentCond(), 20704 Wide, 20705 Register(rd), 20706 Register(rm)); 20707 if (((instr & 0xfffff0c0) != 0xfa0ff080)) { 20708 UnpredictableT32(instr); 20709 } 20710 } else { 20711 // SXTH{<c>}{<q>} {<Rd>}, <Rm> {, ROR #<amount> } ; T2 NOLINT(whitespace/line_length) 20712 sxth(CurrentCond(), 20713 Best, 20714 Register(rd), 20715 Operand(Register(rm), ROR, amount)); 20716 if (((instr & 0xfffff0c0) != 0xfa0ff080)) { 20717 UnpredictableT32(instr); 20718 } 20719 } 20720 break; 20721 } 20722 default: { 20723 if (((instr & 0xf0000) == 0xf0000)) { 20724 UnallocatedT32(instr); 20725 return; 20726 } 20727 unsigned rd = (instr >> 8) & 0xf; 20728 unsigned rn = (instr >> 16) & 0xf; 20729 unsigned rm = instr & 0xf; 20730 uint32_t amount = ((instr >> 4) & 0x3) * 8; 20731 // SXTAH{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, ROR #<amount> } ; T1 NOLINT(whitespace/line_length) 20732 sxtah(CurrentCond(), 20733 Register(rd), 20734 Register(rn), 20735 Operand(Register(rm), ROR, amount)); 20736 if (((instr & 0xfff0f0c0) != 0xfa00f080)) { 20737 UnpredictableT32(instr); 20738 } 20739 break; 20740 } 20741 } 20742 break; 20743 } 20744 case 0x00200000: { 20745 // 0xfa20f080 20746 switch (instr & 0x000f0000) { 20747 case 0x000f0000: { 20748 // 0xfa2ff080 20749 unsigned rd = (instr >> 8) & 0xf; 20750 unsigned rm = instr & 0xf; 20751 uint32_t amount = ((instr >> 4) & 0x3) * 8; 20752 // SXTB16{<c>}{<q>} {<Rd>}, <Rm> {, ROR #<amount> } ; T1 NOLINT(whitespace/line_length) 20753 sxtb16(CurrentCond(), 20754 Register(rd), 20755 Operand(Register(rm), ROR, amount)); 20756 if (((instr & 0xfffff0c0) != 0xfa2ff080)) { 20757 UnpredictableT32(instr); 20758 } 20759 break; 20760 } 20761 default: { 20762 if (((instr & 0xf0000) == 0xf0000)) { 20763 UnallocatedT32(instr); 20764 return; 20765 } 20766 unsigned rd = (instr >> 8) & 0xf; 20767 unsigned rn = (instr >> 16) & 0xf; 20768 unsigned rm = instr & 0xf; 20769 uint32_t amount = ((instr >> 4) & 0x3) * 8; 20770 // SXTAB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, ROR #<amount> } ; T1 NOLINT(whitespace/line_length) 20771 sxtab16(CurrentCond(), 20772 Register(rd), 20773 Register(rn), 20774 Operand(Register(rm), ROR, amount)); 20775 if (((instr & 0xfff0f0c0) != 0xfa20f080)) { 20776 UnpredictableT32(instr); 20777 } 20778 break; 20779 } 20780 } 20781 break; 20782 } 20783 case 0x00400000: { 20784 // 0xfa40f080 20785 switch (instr & 0x000f0000) { 20786 case 0x000f0000: { 20787 // 0xfa4ff080 20788 unsigned rd = (instr >> 8) & 0xf; 20789 unsigned rm = instr & 0xf; 20790 uint32_t amount = ((instr >> 4) & 0x3) * 8; 20791 if ((amount == 0) && 20792 ((rd < kNumberOfT32LowRegisters) && 20793 (rm < kNumberOfT32LowRegisters))) { 20794 // SXTB{<c>}.W {<Rd>}, <Rm> ; T2 20795 sxtb(CurrentCond(), 20796 Wide, 20797 Register(rd), 20798 Register(rm)); 20799 if (((instr & 0xfffff0c0) != 0xfa4ff080)) { 20800 UnpredictableT32(instr); 20801 } 20802 } else { 20803 // SXTB{<c>}{<q>} {<Rd>}, <Rm> {, ROR #<amount> } ; T2 NOLINT(whitespace/line_length) 20804 sxtb(CurrentCond(), 20805 Best, 20806 Register(rd), 20807 Operand(Register(rm), ROR, amount)); 20808 if (((instr & 0xfffff0c0) != 0xfa4ff080)) { 20809 UnpredictableT32(instr); 20810 } 20811 } 20812 break; 20813 } 20814 default: { 20815 if (((instr & 0xf0000) == 0xf0000)) { 20816 UnallocatedT32(instr); 20817 return; 20818 } 20819 unsigned rd = (instr >> 8) & 0xf; 20820 unsigned rn = (instr >> 16) & 0xf; 20821 unsigned rm = instr & 0xf; 20822 uint32_t amount = ((instr >> 4) & 0x3) * 8; 20823 // SXTAB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, ROR #<amount> } ; T1 NOLINT(whitespace/line_length) 20824 sxtab(CurrentCond(), 20825 Register(rd), 20826 Register(rn), 20827 Operand(Register(rm), ROR, amount)); 20828 if (((instr & 0xfff0f0c0) != 0xfa40f080)) { 20829 UnpredictableT32(instr); 20830 } 20831 break; 20832 } 20833 } 20834 break; 20835 } 20836 default: 20837 UnallocatedT32(instr); 20838 break; 20839 } 20840 break; 20841 } 20842 default: 20843 UnallocatedT32(instr); 20844 break; 20845 } 20846 break; 20847 } 20848 case 0x10100000: { 20849 // 0xfa100000 20850 switch (instr & 0x0000f080) { 20851 case 0x0000f000: { 20852 // 0xfa10f000 20853 if ((instr & 0x00000070) == 0x00000000) { 20854 if (((Uint32((instr >> 21)) & Uint32(0x3)) == 20855 Uint32(0x2))) { 20856 unsigned rd = (instr >> 8) & 0xf; 20857 unsigned rm = (instr >> 16) & 0xf; 20858 unsigned rs = instr & 0xf; 20859 if (OutsideITBlock() && 20860 ((rd == rm) && (rd < kNumberOfT32LowRegisters) && 20861 (rs < kNumberOfT32LowRegisters))) { 20862 // ASRS.W {<Rd>}, <Rm>, <Rs> ; T2 20863 asrs(Condition::None(), 20864 Wide, 20865 Register(rd), 20866 Register(rm), 20867 Register(rs)); 20868 } else { 20869 // ASRS{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; T2 20870 asrs(CurrentCond(), 20871 Best, 20872 Register(rd), 20873 Register(rm), 20874 Register(rs)); 20875 } 20876 return; 20877 } 20878 if (((Uint32((instr >> 21)) & Uint32(0x3)) == 20879 Uint32(0x0))) { 20880 unsigned rd = (instr >> 8) & 0xf; 20881 unsigned rm = (instr >> 16) & 0xf; 20882 unsigned rs = instr & 0xf; 20883 if (OutsideITBlock() && 20884 ((rd == rm) && (rd < kNumberOfT32LowRegisters) && 20885 (rs < kNumberOfT32LowRegisters))) { 20886 // LSLS.W {<Rd>}, <Rm>, <Rs> ; T2 20887 lsls(Condition::None(), 20888 Wide, 20889 Register(rd), 20890 Register(rm), 20891 Register(rs)); 20892 } else { 20893 // LSLS{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; T2 20894 lsls(CurrentCond(), 20895 Best, 20896 Register(rd), 20897 Register(rm), 20898 Register(rs)); 20899 } 20900 return; 20901 } 20902 if (((Uint32((instr >> 21)) & Uint32(0x3)) == 20903 Uint32(0x1))) { 20904 unsigned rd = (instr >> 8) & 0xf; 20905 unsigned rm = (instr >> 16) & 0xf; 20906 unsigned rs = instr & 0xf; 20907 if (OutsideITBlock() && 20908 ((rd == rm) && (rd < kNumberOfT32LowRegisters) && 20909 (rs < kNumberOfT32LowRegisters))) { 20910 // LSRS.W {<Rd>}, <Rm>, <Rs> ; T2 20911 lsrs(Condition::None(), 20912 Wide, 20913 Register(rd), 20914 Register(rm), 20915 Register(rs)); 20916 } else { 20917 // LSRS{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; T2 20918 lsrs(CurrentCond(), 20919 Best, 20920 Register(rd), 20921 Register(rm), 20922 Register(rs)); 20923 } 20924 return; 20925 } 20926 if (((Uint32((instr >> 21)) & Uint32(0x3)) == 20927 Uint32(0x3))) { 20928 unsigned rd = (instr >> 8) & 0xf; 20929 unsigned rm = (instr >> 16) & 0xf; 20930 unsigned rs = instr & 0xf; 20931 if (OutsideITBlock() && 20932 ((rd == rm) && (rd < kNumberOfT32LowRegisters) && 20933 (rs < kNumberOfT32LowRegisters))) { 20934 // RORS.W {<Rd>}, <Rm>, <Rs> ; T2 20935 rors(Condition::None(), 20936 Wide, 20937 Register(rd), 20938 Register(rm), 20939 Register(rs)); 20940 } else { 20941 // RORS{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; T2 20942 rors(CurrentCond(), 20943 Best, 20944 Register(rd), 20945 Register(rm), 20946 Register(rs)); 20947 } 20948 return; 20949 } 20950 unsigned rd = (instr >> 8) & 0xf; 20951 unsigned rm = (instr >> 16) & 0xf; 20952 Shift shift((instr >> 21) & 0x3); 20953 unsigned rs = instr & 0xf; 20954 if (OutsideITBlock() && 20955 (instr & 0x00100000) == 0x00100000 && 20956 ((rd < kNumberOfT32LowRegisters) && 20957 (rm < kNumberOfT32LowRegisters) && 20958 (rs < kNumberOfT32LowRegisters))) { 20959 // MOVS.W <Rd>, <Rm>, <shift> <Rs> ; T2 20960 movs(Condition::None(), 20961 Wide, 20962 Register(rd), 20963 Operand(Register(rm), 20964 shift.GetType(), 20965 Register(rs))); 20966 } else if ((instr & 0x00100000) == 0x00100000) { 20967 // MOVS{<c>}{<q>} <Rd>, <Rm>, <shift> <Rs> ; T2 20968 movs(CurrentCond(), 20969 Best, 20970 Register(rd), 20971 Operand(Register(rm), 20972 shift.GetType(), 20973 Register(rs))); 20974 } else { 20975 UnallocatedT32(instr); 20976 } 20977 } else { 20978 UnallocatedT32(instr); 20979 } 20980 break; 20981 } 20982 case 0x0000f080: { 20983 // 0xfa10f080 20984 switch (instr & 0x00600000) { 20985 case 0x00000000: { 20986 // 0xfa10f080 20987 switch (instr & 0x000f0000) { 20988 case 0x000f0000: { 20989 // 0xfa1ff080 20990 unsigned rd = (instr >> 8) & 0xf; 20991 unsigned rm = instr & 0xf; 20992 uint32_t amount = ((instr >> 4) & 0x3) * 8; 20993 if ((amount == 0) && 20994 ((rd < kNumberOfT32LowRegisters) && 20995 (rm < kNumberOfT32LowRegisters))) { 20996 // UXTH{<c>}.W {<Rd>}, <Rm> ; T2 20997 uxth(CurrentCond(), 20998 Wide, 20999 Register(rd), 21000 Register(rm)); 21001 if (((instr & 0xfffff0c0) != 0xfa1ff080)) { 21002 UnpredictableT32(instr); 21003 } 21004 } else { 21005 // UXTH{<c>}{<q>} {<Rd>}, <Rm> {, ROR #<amount> } ; T2 NOLINT(whitespace/line_length) 21006 uxth(CurrentCond(), 21007 Best, 21008 Register(rd), 21009 Operand(Register(rm), ROR, amount)); 21010 if (((instr & 0xfffff0c0) != 0xfa1ff080)) { 21011 UnpredictableT32(instr); 21012 } 21013 } 21014 break; 21015 } 21016 default: { 21017 if (((instr & 0xf0000) == 0xf0000)) { 21018 UnallocatedT32(instr); 21019 return; 21020 } 21021 unsigned rd = (instr >> 8) & 0xf; 21022 unsigned rn = (instr >> 16) & 0xf; 21023 unsigned rm = instr & 0xf; 21024 uint32_t amount = ((instr >> 4) & 0x3) * 8; 21025 // UXTAH{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, ROR #<amount> } ; T1 NOLINT(whitespace/line_length) 21026 uxtah(CurrentCond(), 21027 Register(rd), 21028 Register(rn), 21029 Operand(Register(rm), ROR, amount)); 21030 if (((instr & 0xfff0f0c0) != 0xfa10f080)) { 21031 UnpredictableT32(instr); 21032 } 21033 break; 21034 } 21035 } 21036 break; 21037 } 21038 case 0x00200000: { 21039 // 0xfa30f080 21040 switch (instr & 0x000f0000) { 21041 case 0x000f0000: { 21042 // 0xfa3ff080 21043 unsigned rd = (instr >> 8) & 0xf; 21044 unsigned rm = instr & 0xf; 21045 uint32_t amount = ((instr >> 4) & 0x3) * 8; 21046 // UXTB16{<c>}{<q>} {<Rd>}, <Rm> {, ROR #<amount> } ; T1 NOLINT(whitespace/line_length) 21047 uxtb16(CurrentCond(), 21048 Register(rd), 21049 Operand(Register(rm), ROR, amount)); 21050 if (((instr & 0xfffff0c0) != 0xfa3ff080)) { 21051 UnpredictableT32(instr); 21052 } 21053 break; 21054 } 21055 default: { 21056 if (((instr & 0xf0000) == 0xf0000)) { 21057 UnallocatedT32(instr); 21058 return; 21059 } 21060 unsigned rd = (instr >> 8) & 0xf; 21061 unsigned rn = (instr >> 16) & 0xf; 21062 unsigned rm = instr & 0xf; 21063 uint32_t amount = ((instr >> 4) & 0x3) * 8; 21064 // UXTAB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, ROR #<amount> } ; T1 NOLINT(whitespace/line_length) 21065 uxtab16(CurrentCond(), 21066 Register(rd), 21067 Register(rn), 21068 Operand(Register(rm), ROR, amount)); 21069 if (((instr & 0xfff0f0c0) != 0xfa30f080)) { 21070 UnpredictableT32(instr); 21071 } 21072 break; 21073 } 21074 } 21075 break; 21076 } 21077 case 0x00400000: { 21078 // 0xfa50f080 21079 switch (instr & 0x000f0000) { 21080 case 0x000f0000: { 21081 // 0xfa5ff080 21082 unsigned rd = (instr >> 8) & 0xf; 21083 unsigned rm = instr & 0xf; 21084 uint32_t amount = ((instr >> 4) & 0x3) * 8; 21085 if ((amount == 0) && 21086 ((rd < kNumberOfT32LowRegisters) && 21087 (rm < kNumberOfT32LowRegisters))) { 21088 // UXTB{<c>}.W {<Rd>}, <Rm> ; T2 21089 uxtb(CurrentCond(), 21090 Wide, 21091 Register(rd), 21092 Register(rm)); 21093 if (((instr & 0xfffff0c0) != 0xfa5ff080)) { 21094 UnpredictableT32(instr); 21095 } 21096 } else { 21097 // UXTB{<c>}{<q>} {<Rd>}, <Rm> {, ROR #<amount> } ; T2 NOLINT(whitespace/line_length) 21098 uxtb(CurrentCond(), 21099 Best, 21100 Register(rd), 21101 Operand(Register(rm), ROR, amount)); 21102 if (((instr & 0xfffff0c0) != 0xfa5ff080)) { 21103 UnpredictableT32(instr); 21104 } 21105 } 21106 break; 21107 } 21108 default: { 21109 if (((instr & 0xf0000) == 0xf0000)) { 21110 UnallocatedT32(instr); 21111 return; 21112 } 21113 unsigned rd = (instr >> 8) & 0xf; 21114 unsigned rn = (instr >> 16) & 0xf; 21115 unsigned rm = instr & 0xf; 21116 uint32_t amount = ((instr >> 4) & 0x3) * 8; 21117 // UXTAB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, ROR #<amount> } ; T1 NOLINT(whitespace/line_length) 21118 uxtab(CurrentCond(), 21119 Register(rd), 21120 Register(rn), 21121 Operand(Register(rm), ROR, amount)); 21122 if (((instr & 0xfff0f0c0) != 0xfa50f080)) { 21123 UnpredictableT32(instr); 21124 } 21125 break; 21126 } 21127 } 21128 break; 21129 } 21130 default: 21131 UnallocatedT32(instr); 21132 break; 21133 } 21134 break; 21135 } 21136 default: 21137 UnallocatedT32(instr); 21138 break; 21139 } 21140 break; 21141 } 21142 case 0x10800000: { 21143 // 0xfa800000 21144 switch (instr & 0x0060f0f0) { 21145 case 0x0000f000: { 21146 // 0xfa80f000 21147 unsigned rd = (instr >> 8) & 0xf; 21148 unsigned rn = (instr >> 16) & 0xf; 21149 unsigned rm = instr & 0xf; 21150 // SADD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1 21151 sadd8(CurrentCond(), 21152 Register(rd), 21153 Register(rn), 21154 Register(rm)); 21155 break; 21156 } 21157 case 0x0000f010: { 21158 // 0xfa80f010 21159 unsigned rd = (instr >> 8) & 0xf; 21160 unsigned rn = (instr >> 16) & 0xf; 21161 unsigned rm = instr & 0xf; 21162 // QADD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1 21163 qadd8(CurrentCond(), 21164 Register(rd), 21165 Register(rn), 21166 Register(rm)); 21167 break; 21168 } 21169 case 0x0000f020: { 21170 // 0xfa80f020 21171 unsigned rd = (instr >> 8) & 0xf; 21172 unsigned rn = (instr >> 16) & 0xf; 21173 unsigned rm = instr & 0xf; 21174 // SHADD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1 21175 shadd8(CurrentCond(), 21176 Register(rd), 21177 Register(rn), 21178 Register(rm)); 21179 break; 21180 } 21181 case 0x0000f040: { 21182 // 0xfa80f040 21183 unsigned rd = (instr >> 8) & 0xf; 21184 unsigned rn = (instr >> 16) & 0xf; 21185 unsigned rm = instr & 0xf; 21186 // UADD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1 21187 uadd8(CurrentCond(), 21188 Register(rd), 21189 Register(rn), 21190 Register(rm)); 21191 break; 21192 } 21193 case 0x0000f050: { 21194 // 0xfa80f050 21195 unsigned rd = (instr >> 8) & 0xf; 21196 unsigned rn = (instr >> 16) & 0xf; 21197 unsigned rm = instr & 0xf; 21198 // UQADD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1 21199 uqadd8(CurrentCond(), 21200 Register(rd), 21201 Register(rn), 21202 Register(rm)); 21203 break; 21204 } 21205 case 0x0000f060: { 21206 // 0xfa80f060 21207 unsigned rd = (instr >> 8) & 0xf; 21208 unsigned rn = (instr >> 16) & 0xf; 21209 unsigned rm = instr & 0xf; 21210 // UHADD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1 21211 uhadd8(CurrentCond(), 21212 Register(rd), 21213 Register(rn), 21214 Register(rm)); 21215 break; 21216 } 21217 case 0x0000f080: { 21218 // 0xfa80f080 21219 unsigned rd = (instr >> 8) & 0xf; 21220 unsigned rm = instr & 0xf; 21221 unsigned rn = (instr >> 16) & 0xf; 21222 // QADD{<c>}{<q>} {<Rd>}, <Rm>, <Rn> ; T1 21223 qadd(CurrentCond(), 21224 Register(rd), 21225 Register(rm), 21226 Register(rn)); 21227 break; 21228 } 21229 case 0x0000f090: { 21230 // 0xfa80f090 21231 unsigned rd = (instr >> 8) & 0xf; 21232 unsigned rm = instr & 0xf; 21233 unsigned rn = (instr >> 16) & 0xf; 21234 // QDADD{<c>}{<q>} {<Rd>}, <Rm>, <Rn> ; T1 21235 qdadd(CurrentCond(), 21236 Register(rd), 21237 Register(rm), 21238 Register(rn)); 21239 break; 21240 } 21241 case 0x0000f0a0: { 21242 // 0xfa80f0a0 21243 unsigned rd = (instr >> 8) & 0xf; 21244 unsigned rm = instr & 0xf; 21245 unsigned rn = (instr >> 16) & 0xf; 21246 // QSUB{<c>}{<q>} {<Rd>}, <Rm>, <Rn> ; T1 21247 qsub(CurrentCond(), 21248 Register(rd), 21249 Register(rm), 21250 Register(rn)); 21251 break; 21252 } 21253 case 0x0000f0b0: { 21254 // 0xfa80f0b0 21255 unsigned rd = (instr >> 8) & 0xf; 21256 unsigned rm = instr & 0xf; 21257 unsigned rn = (instr >> 16) & 0xf; 21258 // QDSUB{<c>}{<q>} {<Rd>}, <Rm>, <Rn> ; T1 21259 qdsub(CurrentCond(), 21260 Register(rd), 21261 Register(rm), 21262 Register(rn)); 21263 break; 21264 } 21265 case 0x0020f000: { 21266 // 0xfaa0f000 21267 unsigned rd = (instr >> 8) & 0xf; 21268 unsigned rn = (instr >> 16) & 0xf; 21269 unsigned rm = instr & 0xf; 21270 // SASX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1 21271 sasx(CurrentCond(), 21272 Register(rd), 21273 Register(rn), 21274 Register(rm)); 21275 break; 21276 } 21277 case 0x0020f010: { 21278 // 0xfaa0f010 21279 unsigned rd = (instr >> 8) & 0xf; 21280 unsigned rn = (instr >> 16) & 0xf; 21281 unsigned rm = instr & 0xf; 21282 // QASX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1 21283 qasx(CurrentCond(), 21284 Register(rd), 21285 Register(rn), 21286 Register(rm)); 21287 break; 21288 } 21289 case 0x0020f020: { 21290 // 0xfaa0f020 21291 unsigned rd = (instr >> 8) & 0xf; 21292 unsigned rn = (instr >> 16) & 0xf; 21293 unsigned rm = instr & 0xf; 21294 // SHASX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1 21295 shasx(CurrentCond(), 21296 Register(rd), 21297 Register(rn), 21298 Register(rm)); 21299 break; 21300 } 21301 case 0x0020f040: { 21302 // 0xfaa0f040 21303 unsigned rd = (instr >> 8) & 0xf; 21304 unsigned rn = (instr >> 16) & 0xf; 21305 unsigned rm = instr & 0xf; 21306 // UASX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1 21307 uasx(CurrentCond(), 21308 Register(rd), 21309 Register(rn), 21310 Register(rm)); 21311 break; 21312 } 21313 case 0x0020f050: { 21314 // 0xfaa0f050 21315 unsigned rd = (instr >> 8) & 0xf; 21316 unsigned rn = (instr >> 16) & 0xf; 21317 unsigned rm = instr & 0xf; 21318 // UQASX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1 21319 uqasx(CurrentCond(), 21320 Register(rd), 21321 Register(rn), 21322 Register(rm)); 21323 break; 21324 } 21325 case 0x0020f060: { 21326 // 0xfaa0f060 21327 unsigned rd = (instr >> 8) & 0xf; 21328 unsigned rn = (instr >> 16) & 0xf; 21329 unsigned rm = instr & 0xf; 21330 // UHASX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1 21331 uhasx(CurrentCond(), 21332 Register(rd), 21333 Register(rn), 21334 Register(rm)); 21335 break; 21336 } 21337 case 0x0020f080: { 21338 // 0xfaa0f080 21339 unsigned rd = (instr >> 8) & 0xf; 21340 unsigned rn = (instr >> 16) & 0xf; 21341 unsigned rm = instr & 0xf; 21342 // SEL{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1 21343 sel(CurrentCond(), 21344 Register(rd), 21345 Register(rn), 21346 Register(rm)); 21347 break; 21348 } 21349 case 0x0040f000: { 21350 // 0xfac0f000 21351 unsigned rd = (instr >> 8) & 0xf; 21352 unsigned rn = (instr >> 16) & 0xf; 21353 unsigned rm = instr & 0xf; 21354 // SSUB8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1 21355 ssub8(CurrentCond(), 21356 Register(rd), 21357 Register(rn), 21358 Register(rm)); 21359 break; 21360 } 21361 case 0x0040f010: { 21362 // 0xfac0f010 21363 unsigned rd = (instr >> 8) & 0xf; 21364 unsigned rn = (instr >> 16) & 0xf; 21365 unsigned rm = instr & 0xf; 21366 // QSUB8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1 21367 qsub8(CurrentCond(), 21368 Register(rd), 21369 Register(rn), 21370 Register(rm)); 21371 break; 21372 } 21373 case 0x0040f020: { 21374 // 0xfac0f020 21375 unsigned rd = (instr >> 8) & 0xf; 21376 unsigned rn = (instr >> 16) & 0xf; 21377 unsigned rm = instr & 0xf; 21378 // SHSUB8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1 21379 shsub8(CurrentCond(), 21380 Register(rd), 21381 Register(rn), 21382 Register(rm)); 21383 break; 21384 } 21385 case 0x0040f040: { 21386 // 0xfac0f040 21387 unsigned rd = (instr >> 8) & 0xf; 21388 unsigned rn = (instr >> 16) & 0xf; 21389 unsigned rm = instr & 0xf; 21390 // USUB8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1 21391 usub8(CurrentCond(), 21392 Register(rd), 21393 Register(rn), 21394 Register(rm)); 21395 break; 21396 } 21397 case 0x0040f050: { 21398 // 0xfac0f050 21399 unsigned rd = (instr >> 8) & 0xf; 21400 unsigned rn = (instr >> 16) & 0xf; 21401 unsigned rm = instr & 0xf; 21402 // UQSUB8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1 21403 uqsub8(CurrentCond(), 21404 Register(rd), 21405 Register(rn), 21406 Register(rm)); 21407 break; 21408 } 21409 case 0x0040f060: { 21410 // 0xfac0f060 21411 unsigned rd = (instr >> 8) & 0xf; 21412 unsigned rn = (instr >> 16) & 0xf; 21413 unsigned rm = instr & 0xf; 21414 // UHSUB8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1 21415 uhsub8(CurrentCond(), 21416 Register(rd), 21417 Register(rn), 21418 Register(rm)); 21419 break; 21420 } 21421 case 0x0040f080: { 21422 // 0xfac0f080 21423 unsigned rd = (instr >> 8) & 0xf; 21424 unsigned rn = (instr >> 16) & 0xf; 21425 unsigned rm = instr & 0xf; 21426 // CRC32B{<q>} <Rd>, <Rn>, <Rm> ; T1 21427 crc32b(Condition::None(), 21428 Register(rd), 21429 Register(rn), 21430 Register(rm)); 21431 break; 21432 } 21433 case 0x0040f090: { 21434 // 0xfac0f090 21435 unsigned rd = (instr >> 8) & 0xf; 21436 unsigned rn = (instr >> 16) & 0xf; 21437 unsigned rm = instr & 0xf; 21438 // CRC32H{<q>} <Rd>, <Rn>, <Rm> ; T1 21439 crc32h(Condition::None(), 21440 Register(rd), 21441 Register(rn), 21442 Register(rm)); 21443 break; 21444 } 21445 case 0x0040f0a0: { 21446 // 0xfac0f0a0 21447 unsigned rd = (instr >> 8) & 0xf; 21448 unsigned rn = (instr >> 16) & 0xf; 21449 unsigned rm = instr & 0xf; 21450 // CRC32W{<q>} <Rd>, <Rn>, <Rm> ; T1 21451 crc32w(Condition::None(), 21452 Register(rd), 21453 Register(rn), 21454 Register(rm)); 21455 break; 21456 } 21457 case 0x0060f000: { 21458 // 0xfae0f000 21459 unsigned rd = (instr >> 8) & 0xf; 21460 unsigned rn = (instr >> 16) & 0xf; 21461 unsigned rm = instr & 0xf; 21462 // SSAX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1 21463 ssax(CurrentCond(), 21464 Register(rd), 21465 Register(rn), 21466 Register(rm)); 21467 break; 21468 } 21469 case 0x0060f010: { 21470 // 0xfae0f010 21471 unsigned rd = (instr >> 8) & 0xf; 21472 unsigned rn = (instr >> 16) & 0xf; 21473 unsigned rm = instr & 0xf; 21474 // QSAX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1 21475 qsax(CurrentCond(), 21476 Register(rd), 21477 Register(rn), 21478 Register(rm)); 21479 break; 21480 } 21481 case 0x0060f020: { 21482 // 0xfae0f020 21483 unsigned rd = (instr >> 8) & 0xf; 21484 unsigned rn = (instr >> 16) & 0xf; 21485 unsigned rm = instr & 0xf; 21486 // SHSAX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1 21487 shsax(CurrentCond(), 21488 Register(rd), 21489 Register(rn), 21490 Register(rm)); 21491 break; 21492 } 21493 case 0x0060f040: { 21494 // 0xfae0f040 21495 unsigned rd = (instr >> 8) & 0xf; 21496 unsigned rn = (instr >> 16) & 0xf; 21497 unsigned rm = instr & 0xf; 21498 // USAX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1 21499 usax(CurrentCond(), 21500 Register(rd), 21501 Register(rn), 21502 Register(rm)); 21503 break; 21504 } 21505 case 0x0060f050: { 21506 // 0xfae0f050 21507 unsigned rd = (instr >> 8) & 0xf; 21508 unsigned rn = (instr >> 16) & 0xf; 21509 unsigned rm = instr & 0xf; 21510 // UQSAX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1 21511 uqsax(CurrentCond(), 21512 Register(rd), 21513 Register(rn), 21514 Register(rm)); 21515 break; 21516 } 21517 case 0x0060f060: { 21518 // 0xfae0f060 21519 unsigned rd = (instr >> 8) & 0xf; 21520 unsigned rn = (instr >> 16) & 0xf; 21521 unsigned rm = instr & 0xf; 21522 // UHSAX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1 21523 uhsax(CurrentCond(), 21524 Register(rd), 21525 Register(rn), 21526 Register(rm)); 21527 break; 21528 } 21529 default: 21530 UnallocatedT32(instr); 21531 break; 21532 } 21533 break; 21534 } 21535 case 0x10900000: { 21536 // 0xfa900000 21537 switch (instr & 0x0060f0f0) { 21538 case 0x0000f000: { 21539 // 0xfa90f000 21540 unsigned rd = (instr >> 8) & 0xf; 21541 unsigned rn = (instr >> 16) & 0xf; 21542 unsigned rm = instr & 0xf; 21543 // SADD16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1 21544 sadd16(CurrentCond(), 21545 Register(rd), 21546 Register(rn), 21547 Register(rm)); 21548 break; 21549 } 21550 case 0x0000f010: { 21551 // 0xfa90f010 21552 unsigned rd = (instr >> 8) & 0xf; 21553 unsigned rn = (instr >> 16) & 0xf; 21554 unsigned rm = instr & 0xf; 21555 // QADD16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1 21556 qadd16(CurrentCond(), 21557 Register(rd), 21558 Register(rn), 21559 Register(rm)); 21560 break; 21561 } 21562 case 0x0000f020: { 21563 // 0xfa90f020 21564 unsigned rd = (instr >> 8) & 0xf; 21565 unsigned rn = (instr >> 16) & 0xf; 21566 unsigned rm = instr & 0xf; 21567 // SHADD16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1 21568 shadd16(CurrentCond(), 21569 Register(rd), 21570 Register(rn), 21571 Register(rm)); 21572 break; 21573 } 21574 case 0x0000f040: { 21575 // 0xfa90f040 21576 unsigned rd = (instr >> 8) & 0xf; 21577 unsigned rn = (instr >> 16) & 0xf; 21578 unsigned rm = instr & 0xf; 21579 // UADD16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1 21580 uadd16(CurrentCond(), 21581 Register(rd), 21582 Register(rn), 21583 Register(rm)); 21584 break; 21585 } 21586 case 0x0000f050: { 21587 // 0xfa90f050 21588 unsigned rd = (instr >> 8) & 0xf; 21589 unsigned rn = (instr >> 16) & 0xf; 21590 unsigned rm = instr & 0xf; 21591 // UQADD16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1 21592 uqadd16(CurrentCond(), 21593 Register(rd), 21594 Register(rn), 21595 Register(rm)); 21596 break; 21597 } 21598 case 0x0000f060: { 21599 // 0xfa90f060 21600 unsigned rd = (instr >> 8) & 0xf; 21601 unsigned rn = (instr >> 16) & 0xf; 21602 unsigned rm = instr & 0xf; 21603 // UHADD16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1 21604 uhadd16(CurrentCond(), 21605 Register(rd), 21606 Register(rn), 21607 Register(rm)); 21608 break; 21609 } 21610 case 0x0000f080: { 21611 // 0xfa90f080 21612 if (((instr >> 16) & 0xf) == (instr & 0xf)) { 21613 unsigned rd = (instr >> 8) & 0xf; 21614 unsigned rm = instr & 0xf; 21615 if ((rd < kNumberOfT32LowRegisters) && 21616 (rm < kNumberOfT32LowRegisters)) { 21617 // REV{<c>}.W <Rd>, <Rm> ; T2 21618 rev(CurrentCond(), Wide, Register(rd), Register(rm)); 21619 } else { 21620 // REV{<c>}{<q>} <Rd>, <Rm> ; T2 21621 rev(CurrentCond(), Best, Register(rd), Register(rm)); 21622 } 21623 } else { 21624 UnallocatedT32(instr); 21625 } 21626 break; 21627 } 21628 case 0x0000f090: { 21629 // 0xfa90f090 21630 if (((instr >> 16) & 0xf) == (instr & 0xf)) { 21631 unsigned rd = (instr >> 8) & 0xf; 21632 unsigned rm = instr & 0xf; 21633 if ((rd < kNumberOfT32LowRegisters) && 21634 (rm < kNumberOfT32LowRegisters)) { 21635 // REV16{<c>}.W <Rd>, <Rm> ; T2 21636 rev16(CurrentCond(), 21637 Wide, 21638 Register(rd), 21639 Register(rm)); 21640 } else { 21641 // REV16{<c>}{<q>} <Rd>, <Rm> ; T2 21642 rev16(CurrentCond(), 21643 Best, 21644 Register(rd), 21645 Register(rm)); 21646 } 21647 } else { 21648 UnallocatedT32(instr); 21649 } 21650 break; 21651 } 21652 case 0x0000f0a0: { 21653 // 0xfa90f0a0 21654 if (((instr >> 16) & 0xf) == (instr & 0xf)) { 21655 unsigned rd = (instr >> 8) & 0xf; 21656 unsigned rm = instr & 0xf; 21657 // RBIT{<c>}{<q>} <Rd>, <Rm> ; T1 21658 rbit(CurrentCond(), Register(rd), Register(rm)); 21659 } else { 21660 UnallocatedT32(instr); 21661 } 21662 break; 21663 } 21664 case 0x0000f0b0: { 21665 // 0xfa90f0b0 21666 if (((instr >> 16) & 0xf) == (instr & 0xf)) { 21667 unsigned rd = (instr >> 8) & 0xf; 21668 unsigned rm = instr & 0xf; 21669 if ((rd < kNumberOfT32LowRegisters) && 21670 (rm < kNumberOfT32LowRegisters)) { 21671 // REVSH{<c>}.W <Rd>, <Rm> ; T2 21672 revsh(CurrentCond(), 21673 Wide, 21674 Register(rd), 21675 Register(rm)); 21676 } else { 21677 // REVSH{<c>}{<q>} <Rd>, <Rm> ; T2 21678 revsh(CurrentCond(), 21679 Best, 21680 Register(rd), 21681 Register(rm)); 21682 } 21683 } else { 21684 UnallocatedT32(instr); 21685 } 21686 break; 21687 } 21688 case 0x0020f080: { 21689 // 0xfab0f080 21690 if (((instr >> 16) & 0xf) == (instr & 0xf)) { 21691 unsigned rd = (instr >> 8) & 0xf; 21692 unsigned rm = instr & 0xf; 21693 // CLZ{<c>}{<q>} <Rd>, <Rm> ; T1 21694 clz(CurrentCond(), Register(rd), Register(rm)); 21695 } else { 21696 UnallocatedT32(instr); 21697 } 21698 break; 21699 } 21700 case 0x0040f000: { 21701 // 0xfad0f000 21702 unsigned rd = (instr >> 8) & 0xf; 21703 unsigned rn = (instr >> 16) & 0xf; 21704 unsigned rm = instr & 0xf; 21705 // SSUB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1 21706 ssub16(CurrentCond(), 21707 Register(rd), 21708 Register(rn), 21709 Register(rm)); 21710 break; 21711 } 21712 case 0x0040f010: { 21713 // 0xfad0f010 21714 unsigned rd = (instr >> 8) & 0xf; 21715 unsigned rn = (instr >> 16) & 0xf; 21716 unsigned rm = instr & 0xf; 21717 // QSUB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1 21718 qsub16(CurrentCond(), 21719 Register(rd), 21720 Register(rn), 21721 Register(rm)); 21722 break; 21723 } 21724 case 0x0040f020: { 21725 // 0xfad0f020 21726 unsigned rd = (instr >> 8) & 0xf; 21727 unsigned rn = (instr >> 16) & 0xf; 21728 unsigned rm = instr & 0xf; 21729 // SHSUB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1 21730 shsub16(CurrentCond(), 21731 Register(rd), 21732 Register(rn), 21733 Register(rm)); 21734 break; 21735 } 21736 case 0x0040f040: { 21737 // 0xfad0f040 21738 unsigned rd = (instr >> 8) & 0xf; 21739 unsigned rn = (instr >> 16) & 0xf; 21740 unsigned rm = instr & 0xf; 21741 // USUB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1 21742 usub16(CurrentCond(), 21743 Register(rd), 21744 Register(rn), 21745 Register(rm)); 21746 break; 21747 } 21748 case 0x0040f050: { 21749 // 0xfad0f050 21750 unsigned rd = (instr >> 8) & 0xf; 21751 unsigned rn = (instr >> 16) & 0xf; 21752 unsigned rm = instr & 0xf; 21753 // UQSUB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1 21754 uqsub16(CurrentCond(), 21755 Register(rd), 21756 Register(rn), 21757 Register(rm)); 21758 break; 21759 } 21760 case 0x0040f060: { 21761 // 0xfad0f060 21762 unsigned rd = (instr >> 8) & 0xf; 21763 unsigned rn = (instr >> 16) & 0xf; 21764 unsigned rm = instr & 0xf; 21765 // UHSUB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1 21766 uhsub16(CurrentCond(), 21767 Register(rd), 21768 Register(rn), 21769 Register(rm)); 21770 break; 21771 } 21772 case 0x0040f080: { 21773 // 0xfad0f080 21774 unsigned rd = (instr >> 8) & 0xf; 21775 unsigned rn = (instr >> 16) & 0xf; 21776 unsigned rm = instr & 0xf; 21777 // CRC32CB{<q>} <Rd>, <Rn>, <Rm> ; T1 21778 crc32cb(Condition::None(), 21779 Register(rd), 21780 Register(rn), 21781 Register(rm)); 21782 break; 21783 } 21784 case 0x0040f090: { 21785 // 0xfad0f090 21786 unsigned rd = (instr >> 8) & 0xf; 21787 unsigned rn = (instr >> 16) & 0xf; 21788 unsigned rm = instr & 0xf; 21789 // CRC32CH{<q>} <Rd>, <Rn>, <Rm> ; T1 21790 crc32ch(Condition::None(), 21791 Register(rd), 21792 Register(rn), 21793 Register(rm)); 21794 break; 21795 } 21796 case 0x0040f0a0: { 21797 // 0xfad0f0a0 21798 unsigned rd = (instr >> 8) & 0xf; 21799 unsigned rn = (instr >> 16) & 0xf; 21800 unsigned rm = instr & 0xf; 21801 // CRC32CW{<q>} <Rd>, <Rn>, <Rm> ; T1 21802 crc32cw(Condition::None(), 21803 Register(rd), 21804 Register(rn), 21805 Register(rm)); 21806 break; 21807 } 21808 default: 21809 UnallocatedT32(instr); 21810 break; 21811 } 21812 break; 21813 } 21814 case 0x11000000: { 21815 // 0xfb000000 21816 switch (instr & 0x006000f0) { 21817 case 0x00000000: { 21818 // 0xfb000000 21819 switch (instr & 0x0000f000) { 21820 case 0x0000f000: { 21821 // 0xfb00f000 21822 unsigned rd = (instr >> 8) & 0xf; 21823 unsigned rn = (instr >> 16) & 0xf; 21824 unsigned rm = instr & 0xf; 21825 if (InITBlock() && 21826 ((rd == rm) && (rd < kNumberOfT32LowRegisters) && 21827 (rn < kNumberOfT32LowRegisters))) { 21828 // MUL<c>.W <Rd>, <Rn>, {<Rm>} ; T2 21829 mul(CurrentCond(), 21830 Wide, 21831 Register(rd), 21832 Register(rn), 21833 Register(rm)); 21834 } else { 21835 // MUL{<c>}{<q>} <Rd>, <Rn>, {<Rm>} ; T2 21836 mul(CurrentCond(), 21837 Best, 21838 Register(rd), 21839 Register(rn), 21840 Register(rm)); 21841 } 21842 break; 21843 } 21844 default: { 21845 if (((instr & 0xf000) == 0xf000)) { 21846 UnallocatedT32(instr); 21847 return; 21848 } 21849 unsigned rd = (instr >> 8) & 0xf; 21850 unsigned rn = (instr >> 16) & 0xf; 21851 unsigned rm = instr & 0xf; 21852 unsigned ra = (instr >> 12) & 0xf; 21853 // MLA{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1 21854 mla(CurrentCond(), 21855 Register(rd), 21856 Register(rn), 21857 Register(rm), 21858 Register(ra)); 21859 break; 21860 } 21861 } 21862 break; 21863 } 21864 case 0x00000010: { 21865 // 0xfb000010 21866 unsigned rd = (instr >> 8) & 0xf; 21867 unsigned rn = (instr >> 16) & 0xf; 21868 unsigned rm = instr & 0xf; 21869 unsigned ra = (instr >> 12) & 0xf; 21870 // MLS{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1 21871 mls(CurrentCond(), 21872 Register(rd), 21873 Register(rn), 21874 Register(rm), 21875 Register(ra)); 21876 break; 21877 } 21878 case 0x00200000: { 21879 // 0xfb200000 21880 switch (instr & 0x0000f000) { 21881 case 0x0000f000: { 21882 // 0xfb20f000 21883 unsigned rd = (instr >> 8) & 0xf; 21884 unsigned rn = (instr >> 16) & 0xf; 21885 unsigned rm = instr & 0xf; 21886 // SMUAD{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1 21887 smuad(CurrentCond(), 21888 Register(rd), 21889 Register(rn), 21890 Register(rm)); 21891 break; 21892 } 21893 default: { 21894 if (((instr & 0xf000) == 0xf000)) { 21895 UnallocatedT32(instr); 21896 return; 21897 } 21898 unsigned rd = (instr >> 8) & 0xf; 21899 unsigned rn = (instr >> 16) & 0xf; 21900 unsigned rm = instr & 0xf; 21901 unsigned ra = (instr >> 12) & 0xf; 21902 // SMLAD{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1 21903 smlad(CurrentCond(), 21904 Register(rd), 21905 Register(rn), 21906 Register(rm), 21907 Register(ra)); 21908 break; 21909 } 21910 } 21911 break; 21912 } 21913 case 0x00200010: { 21914 // 0xfb200010 21915 switch (instr & 0x0000f000) { 21916 case 0x0000f000: { 21917 // 0xfb20f010 21918 unsigned rd = (instr >> 8) & 0xf; 21919 unsigned rn = (instr >> 16) & 0xf; 21920 unsigned rm = instr & 0xf; 21921 // SMUADX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1 21922 smuadx(CurrentCond(), 21923 Register(rd), 21924 Register(rn), 21925 Register(rm)); 21926 break; 21927 } 21928 default: { 21929 if (((instr & 0xf000) == 0xf000)) { 21930 UnallocatedT32(instr); 21931 return; 21932 } 21933 unsigned rd = (instr >> 8) & 0xf; 21934 unsigned rn = (instr >> 16) & 0xf; 21935 unsigned rm = instr & 0xf; 21936 unsigned ra = (instr >> 12) & 0xf; 21937 // SMLADX{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1 21938 smladx(CurrentCond(), 21939 Register(rd), 21940 Register(rn), 21941 Register(rm), 21942 Register(ra)); 21943 break; 21944 } 21945 } 21946 break; 21947 } 21948 case 0x00400000: { 21949 // 0xfb400000 21950 switch (instr & 0x0000f000) { 21951 case 0x0000f000: { 21952 // 0xfb40f000 21953 unsigned rd = (instr >> 8) & 0xf; 21954 unsigned rn = (instr >> 16) & 0xf; 21955 unsigned rm = instr & 0xf; 21956 // SMUSD{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1 21957 smusd(CurrentCond(), 21958 Register(rd), 21959 Register(rn), 21960 Register(rm)); 21961 break; 21962 } 21963 default: { 21964 if (((instr & 0xf000) == 0xf000)) { 21965 UnallocatedT32(instr); 21966 return; 21967 } 21968 unsigned rd = (instr >> 8) & 0xf; 21969 unsigned rn = (instr >> 16) & 0xf; 21970 unsigned rm = instr & 0xf; 21971 unsigned ra = (instr >> 12) & 0xf; 21972 // SMLSD{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1 21973 smlsd(CurrentCond(), 21974 Register(rd), 21975 Register(rn), 21976 Register(rm), 21977 Register(ra)); 21978 break; 21979 } 21980 } 21981 break; 21982 } 21983 case 0x00400010: { 21984 // 0xfb400010 21985 switch (instr & 0x0000f000) { 21986 case 0x0000f000: { 21987 // 0xfb40f010 21988 unsigned rd = (instr >> 8) & 0xf; 21989 unsigned rn = (instr >> 16) & 0xf; 21990 unsigned rm = instr & 0xf; 21991 // SMUSDX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1 21992 smusdx(CurrentCond(), 21993 Register(rd), 21994 Register(rn), 21995 Register(rm)); 21996 break; 21997 } 21998 default: { 21999 if (((instr & 0xf000) == 0xf000)) { 22000 UnallocatedT32(instr); 22001 return; 22002 } 22003 unsigned rd = (instr >> 8) & 0xf; 22004 unsigned rn = (instr >> 16) & 0xf; 22005 unsigned rm = instr & 0xf; 22006 unsigned ra = (instr >> 12) & 0xf; 22007 // SMLSDX{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1 22008 smlsdx(CurrentCond(), 22009 Register(rd), 22010 Register(rn), 22011 Register(rm), 22012 Register(ra)); 22013 break; 22014 } 22015 } 22016 break; 22017 } 22018 case 0x00600000: { 22019 // 0xfb600000 22020 unsigned rd = (instr >> 8) & 0xf; 22021 unsigned rn = (instr >> 16) & 0xf; 22022 unsigned rm = instr & 0xf; 22023 unsigned ra = (instr >> 12) & 0xf; 22024 // SMMLS{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1 22025 smmls(CurrentCond(), 22026 Register(rd), 22027 Register(rn), 22028 Register(rm), 22029 Register(ra)); 22030 break; 22031 } 22032 case 0x00600010: { 22033 // 0xfb600010 22034 unsigned rd = (instr >> 8) & 0xf; 22035 unsigned rn = (instr >> 16) & 0xf; 22036 unsigned rm = instr & 0xf; 22037 unsigned ra = (instr >> 12) & 0xf; 22038 // SMMLSR{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1 22039 smmlsr(CurrentCond(), 22040 Register(rd), 22041 Register(rn), 22042 Register(rm), 22043 Register(ra)); 22044 break; 22045 } 22046 default: 22047 UnallocatedT32(instr); 22048 break; 22049 } 22050 break; 22051 } 22052 case 0x11100000: { 22053 // 0xfb100000 22054 switch (instr & 0x006000f0) { 22055 case 0x00000000: { 22056 // 0xfb100000 22057 switch (instr & 0x0000f000) { 22058 case 0x0000f000: { 22059 // 0xfb10f000 22060 unsigned rd = (instr >> 8) & 0xf; 22061 unsigned rn = (instr >> 16) & 0xf; 22062 unsigned rm = instr & 0xf; 22063 // SMULBB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1 22064 smulbb(CurrentCond(), 22065 Register(rd), 22066 Register(rn), 22067 Register(rm)); 22068 break; 22069 } 22070 default: { 22071 if (((instr & 0xf000) == 0xf000)) { 22072 UnallocatedT32(instr); 22073 return; 22074 } 22075 unsigned rd = (instr >> 8) & 0xf; 22076 unsigned rn = (instr >> 16) & 0xf; 22077 unsigned rm = instr & 0xf; 22078 unsigned ra = (instr >> 12) & 0xf; 22079 // SMLABB{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1 22080 smlabb(CurrentCond(), 22081 Register(rd), 22082 Register(rn), 22083 Register(rm), 22084 Register(ra)); 22085 break; 22086 } 22087 } 22088 break; 22089 } 22090 case 0x00000010: { 22091 // 0xfb100010 22092 switch (instr & 0x0000f000) { 22093 case 0x0000f000: { 22094 // 0xfb10f010 22095 unsigned rd = (instr >> 8) & 0xf; 22096 unsigned rn = (instr >> 16) & 0xf; 22097 unsigned rm = instr & 0xf; 22098 // SMULBT{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1 22099 smulbt(CurrentCond(), 22100 Register(rd), 22101 Register(rn), 22102 Register(rm)); 22103 break; 22104 } 22105 default: { 22106 if (((instr & 0xf000) == 0xf000)) { 22107 UnallocatedT32(instr); 22108 return; 22109 } 22110 unsigned rd = (instr >> 8) & 0xf; 22111 unsigned rn = (instr >> 16) & 0xf; 22112 unsigned rm = instr & 0xf; 22113 unsigned ra = (instr >> 12) & 0xf; 22114 // SMLABT{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1 22115 smlabt(CurrentCond(), 22116 Register(rd), 22117 Register(rn), 22118 Register(rm), 22119 Register(ra)); 22120 break; 22121 } 22122 } 22123 break; 22124 } 22125 case 0x00000020: { 22126 // 0xfb100020 22127 switch (instr & 0x0000f000) { 22128 case 0x0000f000: { 22129 // 0xfb10f020 22130 unsigned rd = (instr >> 8) & 0xf; 22131 unsigned rn = (instr >> 16) & 0xf; 22132 unsigned rm = instr & 0xf; 22133 // SMULTB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1 22134 smultb(CurrentCond(), 22135 Register(rd), 22136 Register(rn), 22137 Register(rm)); 22138 break; 22139 } 22140 default: { 22141 if (((instr & 0xf000) == 0xf000)) { 22142 UnallocatedT32(instr); 22143 return; 22144 } 22145 unsigned rd = (instr >> 8) & 0xf; 22146 unsigned rn = (instr >> 16) & 0xf; 22147 unsigned rm = instr & 0xf; 22148 unsigned ra = (instr >> 12) & 0xf; 22149 // SMLATB{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1 22150 smlatb(CurrentCond(), 22151 Register(rd), 22152 Register(rn), 22153 Register(rm), 22154 Register(ra)); 22155 break; 22156 } 22157 } 22158 break; 22159 } 22160 case 0x00000030: { 22161 // 0xfb100030 22162 switch (instr & 0x0000f000) { 22163 case 0x0000f000: { 22164 // 0xfb10f030 22165 unsigned rd = (instr >> 8) & 0xf; 22166 unsigned rn = (instr >> 16) & 0xf; 22167 unsigned rm = instr & 0xf; 22168 // SMULTT{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1 22169 smultt(CurrentCond(), 22170 Register(rd), 22171 Register(rn), 22172 Register(rm)); 22173 break; 22174 } 22175 default: { 22176 if (((instr & 0xf000) == 0xf000)) { 22177 UnallocatedT32(instr); 22178 return; 22179 } 22180 unsigned rd = (instr >> 8) & 0xf; 22181 unsigned rn = (instr >> 16) & 0xf; 22182 unsigned rm = instr & 0xf; 22183 unsigned ra = (instr >> 12) & 0xf; 22184 // SMLATT{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1 22185 smlatt(CurrentCond(), 22186 Register(rd), 22187 Register(rn), 22188 Register(rm), 22189 Register(ra)); 22190 break; 22191 } 22192 } 22193 break; 22194 } 22195 case 0x00200000: { 22196 // 0xfb300000 22197 switch (instr & 0x0000f000) { 22198 case 0x0000f000: { 22199 // 0xfb30f000 22200 unsigned rd = (instr >> 8) & 0xf; 22201 unsigned rn = (instr >> 16) & 0xf; 22202 unsigned rm = instr & 0xf; 22203 // SMULWB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1 22204 smulwb(CurrentCond(), 22205 Register(rd), 22206 Register(rn), 22207 Register(rm)); 22208 break; 22209 } 22210 default: { 22211 if (((instr & 0xf000) == 0xf000)) { 22212 UnallocatedT32(instr); 22213 return; 22214 } 22215 unsigned rd = (instr >> 8) & 0xf; 22216 unsigned rn = (instr >> 16) & 0xf; 22217 unsigned rm = instr & 0xf; 22218 unsigned ra = (instr >> 12) & 0xf; 22219 // SMLAWB{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1 22220 smlawb(CurrentCond(), 22221 Register(rd), 22222 Register(rn), 22223 Register(rm), 22224 Register(ra)); 22225 break; 22226 } 22227 } 22228 break; 22229 } 22230 case 0x00200010: { 22231 // 0xfb300010 22232 switch (instr & 0x0000f000) { 22233 case 0x0000f000: { 22234 // 0xfb30f010 22235 unsigned rd = (instr >> 8) & 0xf; 22236 unsigned rn = (instr >> 16) & 0xf; 22237 unsigned rm = instr & 0xf; 22238 // SMULWT{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1 22239 smulwt(CurrentCond(), 22240 Register(rd), 22241 Register(rn), 22242 Register(rm)); 22243 break; 22244 } 22245 default: { 22246 if (((instr & 0xf000) == 0xf000)) { 22247 UnallocatedT32(instr); 22248 return; 22249 } 22250 unsigned rd = (instr >> 8) & 0xf; 22251 unsigned rn = (instr >> 16) & 0xf; 22252 unsigned rm = instr & 0xf; 22253 unsigned ra = (instr >> 12) & 0xf; 22254 // SMLAWT{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1 22255 smlawt(CurrentCond(), 22256 Register(rd), 22257 Register(rn), 22258 Register(rm), 22259 Register(ra)); 22260 break; 22261 } 22262 } 22263 break; 22264 } 22265 case 0x00400000: { 22266 // 0xfb500000 22267 switch (instr & 0x0000f000) { 22268 case 0x0000f000: { 22269 // 0xfb50f000 22270 unsigned rd = (instr >> 8) & 0xf; 22271 unsigned rn = (instr >> 16) & 0xf; 22272 unsigned rm = instr & 0xf; 22273 // SMMUL{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1 22274 smmul(CurrentCond(), 22275 Register(rd), 22276 Register(rn), 22277 Register(rm)); 22278 break; 22279 } 22280 default: { 22281 if (((instr & 0xf000) == 0xf000)) { 22282 UnallocatedT32(instr); 22283 return; 22284 } 22285 unsigned rd = (instr >> 8) & 0xf; 22286 unsigned rn = (instr >> 16) & 0xf; 22287 unsigned rm = instr & 0xf; 22288 unsigned ra = (instr >> 12) & 0xf; 22289 // SMMLA{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1 22290 smmla(CurrentCond(), 22291 Register(rd), 22292 Register(rn), 22293 Register(rm), 22294 Register(ra)); 22295 break; 22296 } 22297 } 22298 break; 22299 } 22300 case 0x00400010: { 22301 // 0xfb500010 22302 switch (instr & 0x0000f000) { 22303 case 0x0000f000: { 22304 // 0xfb50f010 22305 unsigned rd = (instr >> 8) & 0xf; 22306 unsigned rn = (instr >> 16) & 0xf; 22307 unsigned rm = instr & 0xf; 22308 // SMMULR{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1 22309 smmulr(CurrentCond(), 22310 Register(rd), 22311 Register(rn), 22312 Register(rm)); 22313 break; 22314 } 22315 default: { 22316 if (((instr & 0xf000) == 0xf000)) { 22317 UnallocatedT32(instr); 22318 return; 22319 } 22320 unsigned rd = (instr >> 8) & 0xf; 22321 unsigned rn = (instr >> 16) & 0xf; 22322 unsigned rm = instr & 0xf; 22323 unsigned ra = (instr >> 12) & 0xf; 22324 // SMMLAR{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1 22325 smmlar(CurrentCond(), 22326 Register(rd), 22327 Register(rn), 22328 Register(rm), 22329 Register(ra)); 22330 break; 22331 } 22332 } 22333 break; 22334 } 22335 case 0x00600000: { 22336 // 0xfb700000 22337 switch (instr & 0x0000f000) { 22338 case 0x0000f000: { 22339 // 0xfb70f000 22340 unsigned rd = (instr >> 8) & 0xf; 22341 unsigned rn = (instr >> 16) & 0xf; 22342 unsigned rm = instr & 0xf; 22343 // USAD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1 22344 usad8(CurrentCond(), 22345 Register(rd), 22346 Register(rn), 22347 Register(rm)); 22348 break; 22349 } 22350 default: { 22351 if (((instr & 0xf000) == 0xf000)) { 22352 UnallocatedT32(instr); 22353 return; 22354 } 22355 unsigned rd = (instr >> 8) & 0xf; 22356 unsigned rn = (instr >> 16) & 0xf; 22357 unsigned rm = instr & 0xf; 22358 unsigned ra = (instr >> 12) & 0xf; 22359 // USADA8{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; T1 22360 usada8(CurrentCond(), 22361 Register(rd), 22362 Register(rn), 22363 Register(rm), 22364 Register(ra)); 22365 break; 22366 } 22367 } 22368 break; 22369 } 22370 default: 22371 UnallocatedT32(instr); 22372 break; 22373 } 22374 break; 22375 } 22376 case 0x11800000: { 22377 // 0xfb800000 22378 switch (instr & 0x006000f0) { 22379 case 0x00000000: { 22380 // 0xfb800000 22381 unsigned rdlo = (instr >> 12) & 0xf; 22382 unsigned rdhi = (instr >> 8) & 0xf; 22383 unsigned rn = (instr >> 16) & 0xf; 22384 unsigned rm = instr & 0xf; 22385 // SMULL{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; T1 22386 smull(CurrentCond(), 22387 Register(rdlo), 22388 Register(rdhi), 22389 Register(rn), 22390 Register(rm)); 22391 break; 22392 } 22393 case 0x00200000: { 22394 // 0xfba00000 22395 unsigned rdlo = (instr >> 12) & 0xf; 22396 unsigned rdhi = (instr >> 8) & 0xf; 22397 unsigned rn = (instr >> 16) & 0xf; 22398 unsigned rm = instr & 0xf; 22399 // UMULL{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; T1 22400 umull(CurrentCond(), 22401 Register(rdlo), 22402 Register(rdhi), 22403 Register(rn), 22404 Register(rm)); 22405 break; 22406 } 22407 case 0x00400000: { 22408 // 0xfbc00000 22409 unsigned rdlo = (instr >> 12) & 0xf; 22410 unsigned rdhi = (instr >> 8) & 0xf; 22411 unsigned rn = (instr >> 16) & 0xf; 22412 unsigned rm = instr & 0xf; 22413 // SMLAL{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; T1 22414 smlal(CurrentCond(), 22415 Register(rdlo), 22416 Register(rdhi), 22417 Register(rn), 22418 Register(rm)); 22419 break; 22420 } 22421 case 0x00400080: { 22422 // 0xfbc00080 22423 unsigned rdlo = (instr >> 12) & 0xf; 22424 unsigned rdhi = (instr >> 8) & 0xf; 22425 unsigned rn = (instr >> 16) & 0xf; 22426 unsigned rm = instr & 0xf; 22427 // SMLALBB{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; T1 22428 smlalbb(CurrentCond(), 22429 Register(rdlo), 22430 Register(rdhi), 22431 Register(rn), 22432 Register(rm)); 22433 break; 22434 } 22435 case 0x00400090: { 22436 // 0xfbc00090 22437 unsigned rdlo = (instr >> 12) & 0xf; 22438 unsigned rdhi = (instr >> 8) & 0xf; 22439 unsigned rn = (instr >> 16) & 0xf; 22440 unsigned rm = instr & 0xf; 22441 // SMLALBT{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; T1 22442 smlalbt(CurrentCond(), 22443 Register(rdlo), 22444 Register(rdhi), 22445 Register(rn), 22446 Register(rm)); 22447 break; 22448 } 22449 case 0x004000a0: { 22450 // 0xfbc000a0 22451 unsigned rdlo = (instr >> 12) & 0xf; 22452 unsigned rdhi = (instr >> 8) & 0xf; 22453 unsigned rn = (instr >> 16) & 0xf; 22454 unsigned rm = instr & 0xf; 22455 // SMLALTB{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; T1 22456 smlaltb(CurrentCond(), 22457 Register(rdlo), 22458 Register(rdhi), 22459 Register(rn), 22460 Register(rm)); 22461 break; 22462 } 22463 case 0x004000b0: { 22464 // 0xfbc000b0 22465 unsigned rdlo = (instr >> 12) & 0xf; 22466 unsigned rdhi = (instr >> 8) & 0xf; 22467 unsigned rn = (instr >> 16) & 0xf; 22468 unsigned rm = instr & 0xf; 22469 // SMLALTT{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; T1 22470 smlaltt(CurrentCond(), 22471 Register(rdlo), 22472 Register(rdhi), 22473 Register(rn), 22474 Register(rm)); 22475 break; 22476 } 22477 case 0x004000c0: { 22478 // 0xfbc000c0 22479 unsigned rdlo = (instr >> 12) & 0xf; 22480 unsigned rdhi = (instr >> 8) & 0xf; 22481 unsigned rn = (instr >> 16) & 0xf; 22482 unsigned rm = instr & 0xf; 22483 // SMLALD{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; T1 22484 smlald(CurrentCond(), 22485 Register(rdlo), 22486 Register(rdhi), 22487 Register(rn), 22488 Register(rm)); 22489 break; 22490 } 22491 case 0x004000d0: { 22492 // 0xfbc000d0 22493 unsigned rdlo = (instr >> 12) & 0xf; 22494 unsigned rdhi = (instr >> 8) & 0xf; 22495 unsigned rn = (instr >> 16) & 0xf; 22496 unsigned rm = instr & 0xf; 22497 // SMLALDX{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; T1 22498 smlaldx(CurrentCond(), 22499 Register(rdlo), 22500 Register(rdhi), 22501 Register(rn), 22502 Register(rm)); 22503 break; 22504 } 22505 case 0x00600000: { 22506 // 0xfbe00000 22507 unsigned rdlo = (instr >> 12) & 0xf; 22508 unsigned rdhi = (instr >> 8) & 0xf; 22509 unsigned rn = (instr >> 16) & 0xf; 22510 unsigned rm = instr & 0xf; 22511 // UMLAL{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; T1 22512 umlal(CurrentCond(), 22513 Register(rdlo), 22514 Register(rdhi), 22515 Register(rn), 22516 Register(rm)); 22517 break; 22518 } 22519 case 0x00600060: { 22520 // 0xfbe00060 22521 unsigned rdlo = (instr >> 12) & 0xf; 22522 unsigned rdhi = (instr >> 8) & 0xf; 22523 unsigned rn = (instr >> 16) & 0xf; 22524 unsigned rm = instr & 0xf; 22525 // UMAAL{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; T1 22526 umaal(CurrentCond(), 22527 Register(rdlo), 22528 Register(rdhi), 22529 Register(rn), 22530 Register(rm)); 22531 break; 22532 } 22533 default: 22534 UnallocatedT32(instr); 22535 break; 22536 } 22537 break; 22538 } 22539 case 0x11900000: { 22540 // 0xfb900000 22541 switch (instr & 0x006000f0) { 22542 case 0x000000f0: { 22543 // 0xfb9000f0 22544 unsigned rd = (instr >> 8) & 0xf; 22545 unsigned rn = (instr >> 16) & 0xf; 22546 unsigned rm = instr & 0xf; 22547 // SDIV{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1 22548 sdiv(CurrentCond(), 22549 Register(rd), 22550 Register(rn), 22551 Register(rm)); 22552 if (((instr & 0xfff0f0f0) != 0xfb90f0f0)) { 22553 UnpredictableT32(instr); 22554 } 22555 break; 22556 } 22557 case 0x002000f0: { 22558 // 0xfbb000f0 22559 unsigned rd = (instr >> 8) & 0xf; 22560 unsigned rn = (instr >> 16) & 0xf; 22561 unsigned rm = instr & 0xf; 22562 // UDIV{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; T1 22563 udiv(CurrentCond(), 22564 Register(rd), 22565 Register(rn), 22566 Register(rm)); 22567 if (((instr & 0xfff0f0f0) != 0xfbb0f0f0)) { 22568 UnpredictableT32(instr); 22569 } 22570 break; 22571 } 22572 case 0x004000c0: { 22573 // 0xfbd000c0 22574 unsigned rdlo = (instr >> 12) & 0xf; 22575 unsigned rdhi = (instr >> 8) & 0xf; 22576 unsigned rn = (instr >> 16) & 0xf; 22577 unsigned rm = instr & 0xf; 22578 // SMLSLD{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; T1 22579 smlsld(CurrentCond(), 22580 Register(rdlo), 22581 Register(rdhi), 22582 Register(rn), 22583 Register(rm)); 22584 break; 22585 } 22586 case 0x004000d0: { 22587 // 0xfbd000d0 22588 unsigned rdlo = (instr >> 12) & 0xf; 22589 unsigned rdhi = (instr >> 8) & 0xf; 22590 unsigned rn = (instr >> 16) & 0xf; 22591 unsigned rm = instr & 0xf; 22592 // SMLSLDX{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; T1 22593 smlsldx(CurrentCond(), 22594 Register(rdlo), 22595 Register(rdhi), 22596 Register(rn), 22597 Register(rm)); 22598 break; 22599 } 22600 default: 22601 UnallocatedT32(instr); 22602 break; 22603 } 22604 break; 22605 } 22606 } 22607 break; 22608 } 22609 case 0x04000000: { 22610 // 0xec000000 22611 switch (instr & 0x11100e00) { 22612 case 0x00000a00: { 22613 // 0xec000a00 22614 switch (instr & 0x00800100) { 22615 case 0x00000000: { 22616 // 0xec000a00 22617 if ((instr & 0x006000d0) == 0x00400010) { 22618 unsigned rm = ExtractSRegister(instr, 5, 0); 22619 unsigned rt = (instr >> 12) & 0xf; 22620 unsigned rt2 = (instr >> 16) & 0xf; 22621 // VMOV{<c>}{<q>} <Sm>, <Sm1>, <Rt>, <Rt2> ; T1 22622 vmov(CurrentCond(), 22623 SRegister(rm), 22624 SRegister(rm + 1), 22625 Register(rt), 22626 Register(rt2)); 22627 } else { 22628 UnallocatedT32(instr); 22629 } 22630 break; 22631 } 22632 case 0x00000100: { 22633 // 0xec000b00 22634 if ((instr & 0x006000d0) == 0x00400010) { 22635 unsigned rm = ExtractDRegister(instr, 5, 0); 22636 unsigned rt = (instr >> 12) & 0xf; 22637 unsigned rt2 = (instr >> 16) & 0xf; 22638 // VMOV{<c>}{<q>} <Dm>, <Rt>, <Rt2> ; T1 22639 vmov(CurrentCond(), 22640 DRegister(rm), 22641 Register(rt), 22642 Register(rt2)); 22643 } else { 22644 UnallocatedT32(instr); 22645 } 22646 break; 22647 } 22648 case 0x00800000: { 22649 // 0xec800a00 22650 unsigned rn = (instr >> 16) & 0xf; 22651 WriteBack write_back((instr >> 21) & 0x1); 22652 unsigned first = ExtractSRegister(instr, 22, 12); 22653 unsigned len = instr & 0xff; 22654 // VSTM{<c>}{<q>}{.<size>} <Rn>{!}, <sreglist> ; T2 22655 vstm(CurrentCond(), 22656 kDataTypeValueNone, 22657 Register(rn), 22658 write_back, 22659 SRegisterList(SRegister(first), len)); 22660 if ((len == 0) || ((first + len) > kNumberOfSRegisters)) { 22661 UnpredictableT32(instr); 22662 } 22663 break; 22664 } 22665 case 0x00800100: { 22666 // 0xec800b00 22667 switch (instr & 0x00000001) { 22668 case 0x00000000: { 22669 // 0xec800b00 22670 unsigned rn = (instr >> 16) & 0xf; 22671 WriteBack write_back((instr >> 21) & 0x1); 22672 unsigned first = ExtractDRegister(instr, 22, 12); 22673 unsigned imm8 = (instr & 0xff); 22674 unsigned len = imm8 / 2; 22675 unsigned end = first + len; 22676 // VSTM{<c>}{<q>}{.<size>} <Rn>{!}, <dreglist> ; T1 22677 vstm(CurrentCond(), 22678 kDataTypeValueNone, 22679 Register(rn), 22680 write_back, 22681 DRegisterList(DRegister(first), len)); 22682 if ((len == 0) || (len > 16) || 22683 (end > kMaxNumberOfDRegisters)) { 22684 UnpredictableT32(instr); 22685 } 22686 break; 22687 } 22688 case 0x00000001: { 22689 // 0xec800b01 22690 unsigned rn = (instr >> 16) & 0xf; 22691 WriteBack write_back((instr >> 21) & 0x1); 22692 unsigned first = ExtractDRegister(instr, 22, 12); 22693 unsigned imm8 = (instr & 0xff); 22694 unsigned len = imm8 / 2; 22695 unsigned end = first + len; 22696 // FSTMIAX{<c>}{<q>} <Rn>{!}, <dreglist> ; T1 22697 fstmiax(CurrentCond(), 22698 Register(rn), 22699 write_back, 22700 DRegisterList(DRegister(first), len)); 22701 if ((len == 0) || (len > 16) || (end > 16)) { 22702 UnpredictableT32(instr); 22703 } 22704 break; 22705 } 22706 } 22707 break; 22708 } 22709 } 22710 break; 22711 } 22712 case 0x00000e00: { 22713 // 0xec000e00 22714 switch (instr & 0x00600000) { 22715 case 0x00000000: { 22716 // 0xec000e00 22717 if ((instr & 0x0080f100) == 0x00805000) { 22718 UnimplementedT32_32("STC", instr); 22719 } else { 22720 UnallocatedT32(instr); 22721 } 22722 break; 22723 } 22724 case 0x00200000: { 22725 // 0xec200e00 22726 if ((instr & 0x0000f100) == 0x00005000) { 22727 UnimplementedT32_32("STC", instr); 22728 } else { 22729 UnallocatedT32(instr); 22730 } 22731 break; 22732 } 22733 case 0x00400000: { 22734 // 0xec400e00 22735 if ((instr & 0x00800000) == 0x00000000) { 22736 UnimplementedT32_32("MCRR", instr); 22737 } else { 22738 UnallocatedT32(instr); 22739 } 22740 break; 22741 } 22742 default: 22743 UnallocatedT32(instr); 22744 break; 22745 } 22746 break; 22747 } 22748 case 0x00100a00: { 22749 // 0xec100a00 22750 switch (instr & 0x00800100) { 22751 case 0x00000000: { 22752 // 0xec100a00 22753 if ((instr & 0x006000d0) == 0x00400010) { 22754 unsigned rt = (instr >> 12) & 0xf; 22755 unsigned rt2 = (instr >> 16) & 0xf; 22756 unsigned rm = ExtractSRegister(instr, 5, 0); 22757 // VMOV{<c>}{<q>} <Rt>, <Rt2>, <Sm>, <Sm1> ; T1 22758 vmov(CurrentCond(), 22759 Register(rt), 22760 Register(rt2), 22761 SRegister(rm), 22762 SRegister(rm + 1)); 22763 } else { 22764 UnallocatedT32(instr); 22765 } 22766 break; 22767 } 22768 case 0x00000100: { 22769 // 0xec100b00 22770 if ((instr & 0x006000d0) == 0x00400010) { 22771 unsigned rt = (instr >> 12) & 0xf; 22772 unsigned rt2 = (instr >> 16) & 0xf; 22773 unsigned rm = ExtractDRegister(instr, 5, 0); 22774 // VMOV{<c>}{<q>} <Rt>, <Rt2>, <Dm> ; T1 22775 vmov(CurrentCond(), 22776 Register(rt), 22777 Register(rt2), 22778 DRegister(rm)); 22779 } else { 22780 UnallocatedT32(instr); 22781 } 22782 break; 22783 } 22784 case 0x00800000: { 22785 // 0xec900a00 22786 if (((Uint32((instr >> 21)) & Uint32(0x1)) == 22787 Uint32(0x1)) && 22788 ((Uint32((instr >> 16)) & Uint32(0xf)) == 22789 Uint32(0xd))) { 22790 unsigned first = ExtractSRegister(instr, 22, 12); 22791 unsigned len = instr & 0xff; 22792 // VPOP{<c>}{<q>}{.<size>} <sreglist> ; T2 22793 vpop(CurrentCond(), 22794 kDataTypeValueNone, 22795 SRegisterList(SRegister(first), len)); 22796 if ((len == 0) || 22797 ((first + len) > kNumberOfSRegisters)) { 22798 UnpredictableT32(instr); 22799 } 22800 return; 22801 } 22802 unsigned rn = (instr >> 16) & 0xf; 22803 WriteBack write_back((instr >> 21) & 0x1); 22804 unsigned first = ExtractSRegister(instr, 22, 12); 22805 unsigned len = instr & 0xff; 22806 // VLDM{<c>}{<q>}{.<size>} <Rn>{!}, <sreglist> ; T2 22807 vldm(CurrentCond(), 22808 kDataTypeValueNone, 22809 Register(rn), 22810 write_back, 22811 SRegisterList(SRegister(first), len)); 22812 if ((len == 0) || ((first + len) > kNumberOfSRegisters)) { 22813 UnpredictableT32(instr); 22814 } 22815 break; 22816 } 22817 case 0x00800100: { 22818 // 0xec900b00 22819 switch (instr & 0x00000001) { 22820 case 0x00000000: { 22821 // 0xec900b00 22822 if (((Uint32((instr >> 21)) & Uint32(0x1)) == 22823 Uint32(0x1)) && 22824 ((Uint32((instr >> 16)) & Uint32(0xf)) == 22825 Uint32(0xd))) { 22826 unsigned first = ExtractDRegister(instr, 22, 12); 22827 unsigned imm8 = (instr & 0xff); 22828 unsigned len = imm8 / 2; 22829 unsigned end = first + len; 22830 // VPOP{<c>}{<q>}{.<size>} <dreglist> ; T1 22831 vpop(CurrentCond(), 22832 kDataTypeValueNone, 22833 DRegisterList(DRegister(first), len)); 22834 if ((len == 0) || (len > 16) || 22835 (end > kMaxNumberOfDRegisters)) { 22836 UnpredictableT32(instr); 22837 } 22838 return; 22839 } 22840 unsigned rn = (instr >> 16) & 0xf; 22841 WriteBack write_back((instr >> 21) & 0x1); 22842 unsigned first = ExtractDRegister(instr, 22, 12); 22843 unsigned imm8 = (instr & 0xff); 22844 unsigned len = imm8 / 2; 22845 unsigned end = first + len; 22846 // VLDM{<c>}{<q>}{.<size>} <Rn>{!}, <dreglist> ; T1 22847 vldm(CurrentCond(), 22848 kDataTypeValueNone, 22849 Register(rn), 22850 write_back, 22851 DRegisterList(DRegister(first), len)); 22852 if ((len == 0) || (len > 16) || 22853 (end > kMaxNumberOfDRegisters)) { 22854 UnpredictableT32(instr); 22855 } 22856 break; 22857 } 22858 case 0x00000001: { 22859 // 0xec900b01 22860 unsigned rn = (instr >> 16) & 0xf; 22861 WriteBack write_back((instr >> 21) & 0x1); 22862 unsigned first = ExtractDRegister(instr, 22, 12); 22863 unsigned imm8 = (instr & 0xff); 22864 unsigned len = imm8 / 2; 22865 unsigned end = first + len; 22866 // FLDMIAX{<c>}{<q>} <Rn>{!}, <dreglist> ; T1 22867 fldmiax(CurrentCond(), 22868 Register(rn), 22869 write_back, 22870 DRegisterList(DRegister(first), len)); 22871 if ((len == 0) || (len > 16) || (end > 16)) { 22872 UnpredictableT32(instr); 22873 } 22874 break; 22875 } 22876 } 22877 break; 22878 } 22879 } 22880 break; 22881 } 22882 case 0x00100e00: { 22883 // 0xec100e00 22884 switch (instr & 0x00600000) { 22885 case 0x00000000: { 22886 // 0xec100e00 22887 if ((instr & 0x0080f100) == 0x00805000) { 22888 if (((instr & 0xf0000) == 0xf0000)) { 22889 UnallocatedT32(instr); 22890 return; 22891 } 22892 UnimplementedT32_32("LDC", instr); 22893 } else { 22894 UnallocatedT32(instr); 22895 } 22896 break; 22897 } 22898 case 0x00200000: { 22899 // 0xec300e00 22900 if ((instr & 0x0000f100) == 0x00005000) { 22901 if (((instr & 0xf0000) == 0xf0000)) { 22902 UnallocatedT32(instr); 22903 return; 22904 } 22905 UnimplementedT32_32("LDC", instr); 22906 } else { 22907 UnallocatedT32(instr); 22908 } 22909 break; 22910 } 22911 case 0x00400000: { 22912 // 0xec500e00 22913 if ((instr & 0x00800000) == 0x00000000) { 22914 UnimplementedT32_32("MRRC", instr); 22915 } else { 22916 UnallocatedT32(instr); 22917 } 22918 break; 22919 } 22920 default: 22921 UnallocatedT32(instr); 22922 break; 22923 } 22924 break; 22925 } 22926 case 0x01000a00: { 22927 // 0xed000a00 22928 switch (instr & 0x00200100) { 22929 case 0x00000000: { 22930 // 0xed000a00 22931 unsigned rd = ExtractSRegister(instr, 22, 12); 22932 unsigned rn = (instr >> 16) & 0xf; 22933 Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus); 22934 int32_t offset = (instr & 0xff) << 2; 22935 // VSTR{<c>}{<q>}{.32} <Sd>, [<Rn>{, #{+/-}<imm>}] ; T2 22936 vstr(CurrentCond(), 22937 Untyped32, 22938 SRegister(rd), 22939 MemOperand(Register(rn), sign, offset, Offset)); 22940 break; 22941 } 22942 case 0x00000100: { 22943 // 0xed000b00 22944 unsigned rd = ExtractDRegister(instr, 22, 12); 22945 unsigned rn = (instr >> 16) & 0xf; 22946 Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus); 22947 int32_t offset = (instr & 0xff) << 2; 22948 // VSTR{<c>}{<q>}{.64} <Dd>, [<Rn>{, #{+/-}<imm>}] ; T1 22949 vstr(CurrentCond(), 22950 Untyped64, 22951 DRegister(rd), 22952 MemOperand(Register(rn), sign, offset, Offset)); 22953 break; 22954 } 22955 case 0x00200000: { 22956 // 0xed200a00 22957 if ((instr & 0x00800000) == 0x00000000) { 22958 if (((Uint32((instr >> 16)) & Uint32(0xf)) == 22959 Uint32(0xd))) { 22960 unsigned first = ExtractSRegister(instr, 22, 12); 22961 unsigned len = instr & 0xff; 22962 // VPUSH{<c>}{<q>}{.<size>} <sreglist> ; T2 22963 vpush(CurrentCond(), 22964 kDataTypeValueNone, 22965 SRegisterList(SRegister(first), len)); 22966 if ((len == 0) || 22967 ((first + len) > kNumberOfSRegisters)) { 22968 UnpredictableT32(instr); 22969 } 22970 return; 22971 } 22972 unsigned rn = (instr >> 16) & 0xf; 22973 unsigned first = ExtractSRegister(instr, 22, 12); 22974 unsigned len = instr & 0xff; 22975 // VSTMDB{<c>}{<q>}{.<size>} <Rn>!, <sreglist> ; T2 22976 vstmdb(CurrentCond(), 22977 kDataTypeValueNone, 22978 Register(rn), 22979 WriteBack(WRITE_BACK), 22980 SRegisterList(SRegister(first), len)); 22981 if ((len == 0) || 22982 ((first + len) > kNumberOfSRegisters)) { 22983 UnpredictableT32(instr); 22984 } 22985 } else { 22986 UnallocatedT32(instr); 22987 } 22988 break; 22989 } 22990 case 0x00200100: { 22991 // 0xed200b00 22992 switch (instr & 0x00800001) { 22993 case 0x00000000: { 22994 // 0xed200b00 22995 if (((Uint32((instr >> 16)) & Uint32(0xf)) == 22996 Uint32(0xd))) { 22997 unsigned first = ExtractDRegister(instr, 22, 12); 22998 unsigned imm8 = (instr & 0xff); 22999 unsigned len = imm8 / 2; 23000 unsigned end = first + len; 23001 // VPUSH{<c>}{<q>}{.<size>} <dreglist> ; T1 23002 vpush(CurrentCond(), 23003 kDataTypeValueNone, 23004 DRegisterList(DRegister(first), len)); 23005 if ((len == 0) || (len > 16) || 23006 (end > kMaxNumberOfDRegisters)) { 23007 UnpredictableT32(instr); 23008 } 23009 return; 23010 } 23011 unsigned rn = (instr >> 16) & 0xf; 23012 unsigned first = ExtractDRegister(instr, 22, 12); 23013 unsigned imm8 = (instr & 0xff); 23014 unsigned len = imm8 / 2; 23015 unsigned end = first + len; 23016 // VSTMDB{<c>}{<q>}{.<size>} <Rn>!, <dreglist> ; T1 23017 vstmdb(CurrentCond(), 23018 kDataTypeValueNone, 23019 Register(rn), 23020 WriteBack(WRITE_BACK), 23021 DRegisterList(DRegister(first), len)); 23022 if ((len == 0) || (len > 16) || 23023 (end > kMaxNumberOfDRegisters)) { 23024 UnpredictableT32(instr); 23025 } 23026 break; 23027 } 23028 case 0x00000001: { 23029 // 0xed200b01 23030 unsigned rn = (instr >> 16) & 0xf; 23031 unsigned first = ExtractDRegister(instr, 22, 12); 23032 unsigned imm8 = (instr & 0xff); 23033 unsigned len = imm8 / 2; 23034 unsigned end = first + len; 23035 // FSTMDBX{<c>}{<q>} <Rn>!, <dreglist> ; T1 23036 fstmdbx(CurrentCond(), 23037 Register(rn), 23038 WriteBack(WRITE_BACK), 23039 DRegisterList(DRegister(first), len)); 23040 if ((len == 0) || (len > 16) || (end > 16)) { 23041 UnpredictableT32(instr); 23042 } 23043 break; 23044 } 23045 default: 23046 UnallocatedT32(instr); 23047 break; 23048 } 23049 break; 23050 } 23051 } 23052 break; 23053 } 23054 case 0x01000e00: { 23055 // 0xed000e00 23056 switch (instr & 0x0060f100) { 23057 case 0x00005000: { 23058 // 0xed005e00 23059 UnimplementedT32_32("STC", instr); 23060 break; 23061 } 23062 case 0x00205000: { 23063 // 0xed205e00 23064 UnimplementedT32_32("STC", instr); 23065 break; 23066 } 23067 default: 23068 UnallocatedT32(instr); 23069 break; 23070 } 23071 break; 23072 } 23073 case 0x01100a00: { 23074 // 0xed100a00 23075 switch (instr & 0x00200100) { 23076 case 0x00000000: { 23077 // 0xed100a00 23078 switch (instr & 0x000f0000) { 23079 case 0x000f0000: { 23080 // 0xed1f0a00 23081 unsigned rd = ExtractSRegister(instr, 22, 12); 23082 uint32_t U = (instr >> 23) & 0x1; 23083 int32_t imm = instr & 0xff; 23084 imm <<= 2; 23085 if (U == 0) imm = -imm; 23086 bool minus_zero = (imm == 0) && (U == 0); 23087 Location location(imm, kT32PcDelta); 23088 // VLDR{<c>}{<q>}{.32} <Sd>, <label> ; T2 23089 if (minus_zero) { 23090 vldr(CurrentCond(), 23091 Untyped32, 23092 SRegister(rd), 23093 MemOperand(pc, minus, 0)); 23094 } else { 23095 vldr(CurrentCond(), 23096 Untyped32, 23097 SRegister(rd), 23098 &location); 23099 } 23100 break; 23101 } 23102 default: { 23103 if (((instr & 0xf0000) == 0xf0000)) { 23104 UnallocatedT32(instr); 23105 return; 23106 } 23107 unsigned rd = ExtractSRegister(instr, 22, 12); 23108 unsigned rn = (instr >> 16) & 0xf; 23109 Sign sign((((instr >> 23) & 0x1) == 0) ? minus 23110 : plus); 23111 int32_t offset = (instr & 0xff) << 2; 23112 // VLDR{<c>}{<q>}{.32} <Sd>, [<Rn>{, #{+/-}<imm>}] ; T2 NOLINT(whitespace/line_length) 23113 vldr(CurrentCond(), 23114 Untyped32, 23115 SRegister(rd), 23116 MemOperand(Register(rn), sign, offset, Offset)); 23117 break; 23118 } 23119 } 23120 break; 23121 } 23122 case 0x00000100: { 23123 // 0xed100b00 23124 switch (instr & 0x000f0000) { 23125 case 0x000f0000: { 23126 // 0xed1f0b00 23127 unsigned rd = ExtractDRegister(instr, 22, 12); 23128 uint32_t U = (instr >> 23) & 0x1; 23129 int32_t imm = instr & 0xff; 23130 imm <<= 2; 23131 if (U == 0) imm = -imm; 23132 bool minus_zero = (imm == 0) && (U == 0); 23133 Location location(imm, kT32PcDelta); 23134 // VLDR{<c>}{<q>}{.64} <Dd>, <label> ; T1 23135 if (minus_zero) { 23136 vldr(CurrentCond(), 23137 Untyped64, 23138 DRegister(rd), 23139 MemOperand(pc, minus, 0)); 23140 } else { 23141 vldr(CurrentCond(), 23142 Untyped64, 23143 DRegister(rd), 23144 &location); 23145 } 23146 break; 23147 } 23148 default: { 23149 if (((instr & 0xf0000) == 0xf0000)) { 23150 UnallocatedT32(instr); 23151 return; 23152 } 23153 unsigned rd = ExtractDRegister(instr, 22, 12); 23154 unsigned rn = (instr >> 16) & 0xf; 23155 Sign sign((((instr >> 23) & 0x1) == 0) ? minus 23156 : plus); 23157 int32_t offset = (instr & 0xff) << 2; 23158 // VLDR{<c>}{<q>}{.64} <Dd>, [<Rn>{, #{+/-}<imm>}] ; T1 NOLINT(whitespace/line_length) 23159 vldr(CurrentCond(), 23160 Untyped64, 23161 DRegister(rd), 23162 MemOperand(Register(rn), sign, offset, Offset)); 23163 break; 23164 } 23165 } 23166 break; 23167 } 23168 case 0x00200000: { 23169 // 0xed300a00 23170 if ((instr & 0x00800000) == 0x00000000) { 23171 unsigned rn = (instr >> 16) & 0xf; 23172 unsigned first = ExtractSRegister(instr, 22, 12); 23173 unsigned len = instr & 0xff; 23174 // VLDMDB{<c>}{<q>}{.<size>} <Rn>!, <sreglist> ; T2 23175 vldmdb(CurrentCond(), 23176 kDataTypeValueNone, 23177 Register(rn), 23178 WriteBack(WRITE_BACK), 23179 SRegisterList(SRegister(first), len)); 23180 if ((len == 0) || 23181 ((first + len) > kNumberOfSRegisters)) { 23182 UnpredictableT32(instr); 23183 } 23184 } else { 23185 UnallocatedT32(instr); 23186 } 23187 break; 23188 } 23189 case 0x00200100: { 23190 // 0xed300b00 23191 switch (instr & 0x00800001) { 23192 case 0x00000000: { 23193 // 0xed300b00 23194 unsigned rn = (instr >> 16) & 0xf; 23195 unsigned first = ExtractDRegister(instr, 22, 12); 23196 unsigned imm8 = (instr & 0xff); 23197 unsigned len = imm8 / 2; 23198 unsigned end = first + len; 23199 // VLDMDB{<c>}{<q>}{.<size>} <Rn>!, <dreglist> ; T1 23200 vldmdb(CurrentCond(), 23201 kDataTypeValueNone, 23202 Register(rn), 23203 WriteBack(WRITE_BACK), 23204 DRegisterList(DRegister(first), len)); 23205 if ((len == 0) || (len > 16) || 23206 (end > kMaxNumberOfDRegisters)) { 23207 UnpredictableT32(instr); 23208 } 23209 break; 23210 } 23211 case 0x00000001: { 23212 // 0xed300b01 23213 unsigned rn = (instr >> 16) & 0xf; 23214 unsigned first = ExtractDRegister(instr, 22, 12); 23215 unsigned imm8 = (instr & 0xff); 23216 unsigned len = imm8 / 2; 23217 unsigned end = first + len; 23218 // FLDMDBX{<c>}{<q>} <Rn>!, <dreglist> ; T1 23219 fldmdbx(CurrentCond(), 23220 Register(rn), 23221 WriteBack(WRITE_BACK), 23222 DRegisterList(DRegister(first), len)); 23223 if ((len == 0) || (len > 16) || (end > 16)) { 23224 UnpredictableT32(instr); 23225 } 23226 break; 23227 } 23228 default: 23229 UnallocatedT32(instr); 23230 break; 23231 } 23232 break; 23233 } 23234 } 23235 break; 23236 } 23237 case 0x01100e00: { 23238 // 0xed100e00 23239 switch (instr & 0x0060f100) { 23240 case 0x00005000: { 23241 // 0xed105e00 23242 switch (instr & 0x000f0000) { 23243 case 0x000f0000: { 23244 // 0xed1f5e00 23245 UnimplementedT32_32("LDC", instr); 23246 break; 23247 } 23248 default: { 23249 if (((instr & 0xf0000) == 0xf0000)) { 23250 UnallocatedT32(instr); 23251 return; 23252 } 23253 UnimplementedT32_32("LDC", instr); 23254 break; 23255 } 23256 } 23257 break; 23258 } 23259 case 0x00205000: { 23260 // 0xed305e00 23261 if (((instr & 0xf0000) == 0xf0000)) { 23262 UnallocatedT32(instr); 23263 return; 23264 } 23265 UnimplementedT32_32("LDC", instr); 23266 break; 23267 } 23268 default: 23269 UnallocatedT32(instr); 23270 break; 23271 } 23272 break; 23273 } 23274 default: 23275 UnallocatedT32(instr); 23276 break; 23277 } 23278 break; 23279 } 23280 case 0x06000000: { 23281 // 0xee000000 23282 switch (instr & 0x01000010) { 23283 case 0x00000000: { 23284 // 0xee000000 23285 switch (instr & 0x10b00f40) { 23286 case 0x00000a00: { 23287 // 0xee000a00 23288 unsigned rd = ExtractSRegister(instr, 22, 12); 23289 unsigned rn = ExtractSRegister(instr, 7, 16); 23290 unsigned rm = ExtractSRegister(instr, 5, 0); 23291 // VMLA{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; T2 23292 vmla(CurrentCond(), 23293 F32, 23294 SRegister(rd), 23295 SRegister(rn), 23296 SRegister(rm)); 23297 break; 23298 } 23299 case 0x00000a40: { 23300 // 0xee000a40 23301 unsigned rd = ExtractSRegister(instr, 22, 12); 23302 unsigned rn = ExtractSRegister(instr, 7, 16); 23303 unsigned rm = ExtractSRegister(instr, 5, 0); 23304 // VMLS{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; T2 23305 vmls(CurrentCond(), 23306 F32, 23307 SRegister(rd), 23308 SRegister(rn), 23309 SRegister(rm)); 23310 break; 23311 } 23312 case 0x00000b00: { 23313 // 0xee000b00 23314 unsigned rd = ExtractDRegister(instr, 22, 12); 23315 unsigned rn = ExtractDRegister(instr, 7, 16); 23316 unsigned rm = ExtractDRegister(instr, 5, 0); 23317 // VMLA{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; T2 23318 vmla(CurrentCond(), 23319 F64, 23320 DRegister(rd), 23321 DRegister(rn), 23322 DRegister(rm)); 23323 break; 23324 } 23325 case 0x00000b40: { 23326 // 0xee000b40 23327 unsigned rd = ExtractDRegister(instr, 22, 12); 23328 unsigned rn = ExtractDRegister(instr, 7, 16); 23329 unsigned rm = ExtractDRegister(instr, 5, 0); 23330 // VMLS{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; T2 23331 vmls(CurrentCond(), 23332 F64, 23333 DRegister(rd), 23334 DRegister(rn), 23335 DRegister(rm)); 23336 break; 23337 } 23338 case 0x00100a00: { 23339 // 0xee100a00 23340 unsigned rd = ExtractSRegister(instr, 22, 12); 23341 unsigned rn = ExtractSRegister(instr, 7, 16); 23342 unsigned rm = ExtractSRegister(instr, 5, 0); 23343 // VNMLS{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; T1 23344 vnmls(CurrentCond(), 23345 F32, 23346 SRegister(rd), 23347 SRegister(rn), 23348 SRegister(rm)); 23349 break; 23350 } 23351 case 0x00100a40: { 23352 // 0xee100a40 23353 unsigned rd = ExtractSRegister(instr, 22, 12); 23354 unsigned rn = ExtractSRegister(instr, 7, 16); 23355 unsigned rm = ExtractSRegister(instr, 5, 0); 23356 // VNMLA{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; T1 23357 vnmla(CurrentCond(), 23358 F32, 23359 SRegister(rd), 23360 SRegister(rn), 23361 SRegister(rm)); 23362 break; 23363 } 23364 case 0x00100b00: { 23365 // 0xee100b00 23366 unsigned rd = ExtractDRegister(instr, 22, 12); 23367 unsigned rn = ExtractDRegister(instr, 7, 16); 23368 unsigned rm = ExtractDRegister(instr, 5, 0); 23369 // VNMLS{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; T1 23370 vnmls(CurrentCond(), 23371 F64, 23372 DRegister(rd), 23373 DRegister(rn), 23374 DRegister(rm)); 23375 break; 23376 } 23377 case 0x00100b40: { 23378 // 0xee100b40 23379 unsigned rd = ExtractDRegister(instr, 22, 12); 23380 unsigned rn = ExtractDRegister(instr, 7, 16); 23381 unsigned rm = ExtractDRegister(instr, 5, 0); 23382 // VNMLA{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; T1 23383 vnmla(CurrentCond(), 23384 F64, 23385 DRegister(rd), 23386 DRegister(rn), 23387 DRegister(rm)); 23388 break; 23389 } 23390 case 0x00200a00: { 23391 // 0xee200a00 23392 unsigned rd = ExtractSRegister(instr, 22, 12); 23393 unsigned rn = ExtractSRegister(instr, 7, 16); 23394 unsigned rm = ExtractSRegister(instr, 5, 0); 23395 // VMUL{<c>}{<q>}.F32 {<Sd>}, <Sn>, <Sm> ; T2 23396 vmul(CurrentCond(), 23397 F32, 23398 SRegister(rd), 23399 SRegister(rn), 23400 SRegister(rm)); 23401 break; 23402 } 23403 case 0x00200a40: { 23404 // 0xee200a40 23405 unsigned rd = ExtractSRegister(instr, 22, 12); 23406 unsigned rn = ExtractSRegister(instr, 7, 16); 23407 unsigned rm = ExtractSRegister(instr, 5, 0); 23408 // VNMUL{<c>}{<q>}.F32 {<Sd>}, <Sn>, <Sm> ; T1 23409 vnmul(CurrentCond(), 23410 F32, 23411 SRegister(rd), 23412 SRegister(rn), 23413 SRegister(rm)); 23414 break; 23415 } 23416 case 0x00200b00: { 23417 // 0xee200b00 23418 unsigned rd = ExtractDRegister(instr, 22, 12); 23419 unsigned rn = ExtractDRegister(instr, 7, 16); 23420 unsigned rm = ExtractDRegister(instr, 5, 0); 23421 // VMUL{<c>}{<q>}.F64 {<Dd>}, <Dn>, <Dm> ; T2 23422 vmul(CurrentCond(), 23423 F64, 23424 DRegister(rd), 23425 DRegister(rn), 23426 DRegister(rm)); 23427 break; 23428 } 23429 case 0x00200b40: { 23430 // 0xee200b40 23431 unsigned rd = ExtractDRegister(instr, 22, 12); 23432 unsigned rn = ExtractDRegister(instr, 7, 16); 23433 unsigned rm = ExtractDRegister(instr, 5, 0); 23434 // VNMUL{<c>}{<q>}.F64 {<Dd>}, <Dn>, <Dm> ; T1 23435 vnmul(CurrentCond(), 23436 F64, 23437 DRegister(rd), 23438 DRegister(rn), 23439 DRegister(rm)); 23440 break; 23441 } 23442 case 0x00300a00: { 23443 // 0xee300a00 23444 unsigned rd = ExtractSRegister(instr, 22, 12); 23445 unsigned rn = ExtractSRegister(instr, 7, 16); 23446 unsigned rm = ExtractSRegister(instr, 5, 0); 23447 // VADD{<c>}{<q>}.F32 {<Sd>}, <Sn>, <Sm> ; T2 23448 vadd(CurrentCond(), 23449 F32, 23450 SRegister(rd), 23451 SRegister(rn), 23452 SRegister(rm)); 23453 break; 23454 } 23455 case 0x00300a40: { 23456 // 0xee300a40 23457 unsigned rd = ExtractSRegister(instr, 22, 12); 23458 unsigned rn = ExtractSRegister(instr, 7, 16); 23459 unsigned rm = ExtractSRegister(instr, 5, 0); 23460 // VSUB{<c>}{<q>}.F32 {<Sd>}, <Sn>, <Sm> ; T2 23461 vsub(CurrentCond(), 23462 F32, 23463 SRegister(rd), 23464 SRegister(rn), 23465 SRegister(rm)); 23466 break; 23467 } 23468 case 0x00300b00: { 23469 // 0xee300b00 23470 unsigned rd = ExtractDRegister(instr, 22, 12); 23471 unsigned rn = ExtractDRegister(instr, 7, 16); 23472 unsigned rm = ExtractDRegister(instr, 5, 0); 23473 // VADD{<c>}{<q>}.F64 {<Dd>}, <Dn>, <Dm> ; T2 23474 vadd(CurrentCond(), 23475 F64, 23476 DRegister(rd), 23477 DRegister(rn), 23478 DRegister(rm)); 23479 break; 23480 } 23481 case 0x00300b40: { 23482 // 0xee300b40 23483 unsigned rd = ExtractDRegister(instr, 22, 12); 23484 unsigned rn = ExtractDRegister(instr, 7, 16); 23485 unsigned rm = ExtractDRegister(instr, 5, 0); 23486 // VSUB{<c>}{<q>}.F64 {<Dd>}, <Dn>, <Dm> ; T2 23487 vsub(CurrentCond(), 23488 F64, 23489 DRegister(rd), 23490 DRegister(rn), 23491 DRegister(rm)); 23492 break; 23493 } 23494 case 0x00800a00: { 23495 // 0xee800a00 23496 unsigned rd = ExtractSRegister(instr, 22, 12); 23497 unsigned rn = ExtractSRegister(instr, 7, 16); 23498 unsigned rm = ExtractSRegister(instr, 5, 0); 23499 // VDIV{<c>}{<q>}.F32 {<Sd>}, <Sn>, <Sm> ; T1 23500 vdiv(CurrentCond(), 23501 F32, 23502 SRegister(rd), 23503 SRegister(rn), 23504 SRegister(rm)); 23505 break; 23506 } 23507 case 0x00800b00: { 23508 // 0xee800b00 23509 unsigned rd = ExtractDRegister(instr, 22, 12); 23510 unsigned rn = ExtractDRegister(instr, 7, 16); 23511 unsigned rm = ExtractDRegister(instr, 5, 0); 23512 // VDIV{<c>}{<q>}.F64 {<Dd>}, <Dn>, <Dm> ; T1 23513 vdiv(CurrentCond(), 23514 F64, 23515 DRegister(rd), 23516 DRegister(rn), 23517 DRegister(rm)); 23518 break; 23519 } 23520 case 0x00900a00: { 23521 // 0xee900a00 23522 unsigned rd = ExtractSRegister(instr, 22, 12); 23523 unsigned rn = ExtractSRegister(instr, 7, 16); 23524 unsigned rm = ExtractSRegister(instr, 5, 0); 23525 // VFNMS{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; T1 23526 vfnms(CurrentCond(), 23527 F32, 23528 SRegister(rd), 23529 SRegister(rn), 23530 SRegister(rm)); 23531 break; 23532 } 23533 case 0x00900a40: { 23534 // 0xee900a40 23535 unsigned rd = ExtractSRegister(instr, 22, 12); 23536 unsigned rn = ExtractSRegister(instr, 7, 16); 23537 unsigned rm = ExtractSRegister(instr, 5, 0); 23538 // VFNMA{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; T1 23539 vfnma(CurrentCond(), 23540 F32, 23541 SRegister(rd), 23542 SRegister(rn), 23543 SRegister(rm)); 23544 break; 23545 } 23546 case 0x00900b00: { 23547 // 0xee900b00 23548 unsigned rd = ExtractDRegister(instr, 22, 12); 23549 unsigned rn = ExtractDRegister(instr, 7, 16); 23550 unsigned rm = ExtractDRegister(instr, 5, 0); 23551 // VFNMS{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; T1 23552 vfnms(CurrentCond(), 23553 F64, 23554 DRegister(rd), 23555 DRegister(rn), 23556 DRegister(rm)); 23557 break; 23558 } 23559 case 0x00900b40: { 23560 // 0xee900b40 23561 unsigned rd = ExtractDRegister(instr, 22, 12); 23562 unsigned rn = ExtractDRegister(instr, 7, 16); 23563 unsigned rm = ExtractDRegister(instr, 5, 0); 23564 // VFNMA{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; T1 23565 vfnma(CurrentCond(), 23566 F64, 23567 DRegister(rd), 23568 DRegister(rn), 23569 DRegister(rm)); 23570 break; 23571 } 23572 case 0x00a00a00: { 23573 // 0xeea00a00 23574 unsigned rd = ExtractSRegister(instr, 22, 12); 23575 unsigned rn = ExtractSRegister(instr, 7, 16); 23576 unsigned rm = ExtractSRegister(instr, 5, 0); 23577 // VFMA{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; T2 23578 vfma(CurrentCond(), 23579 F32, 23580 SRegister(rd), 23581 SRegister(rn), 23582 SRegister(rm)); 23583 break; 23584 } 23585 case 0x00a00a40: { 23586 // 0xeea00a40 23587 unsigned rd = ExtractSRegister(instr, 22, 12); 23588 unsigned rn = ExtractSRegister(instr, 7, 16); 23589 unsigned rm = ExtractSRegister(instr, 5, 0); 23590 // VFMS{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; T2 23591 vfms(CurrentCond(), 23592 F32, 23593 SRegister(rd), 23594 SRegister(rn), 23595 SRegister(rm)); 23596 break; 23597 } 23598 case 0x00a00b00: { 23599 // 0xeea00b00 23600 unsigned rd = ExtractDRegister(instr, 22, 12); 23601 unsigned rn = ExtractDRegister(instr, 7, 16); 23602 unsigned rm = ExtractDRegister(instr, 5, 0); 23603 // VFMA{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; T2 23604 vfma(CurrentCond(), 23605 F64, 23606 DRegister(rd), 23607 DRegister(rn), 23608 DRegister(rm)); 23609 break; 23610 } 23611 case 0x00a00b40: { 23612 // 0xeea00b40 23613 unsigned rd = ExtractDRegister(instr, 22, 12); 23614 unsigned rn = ExtractDRegister(instr, 7, 16); 23615 unsigned rm = ExtractDRegister(instr, 5, 0); 23616 // VFMS{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; T2 23617 vfms(CurrentCond(), 23618 F64, 23619 DRegister(rd), 23620 DRegister(rn), 23621 DRegister(rm)); 23622 break; 23623 } 23624 case 0x00b00a00: { 23625 // 0xeeb00a00 23626 unsigned rd = ExtractSRegister(instr, 22, 12); 23627 uint32_t encoded_imm = 23628 (instr & 0xf) | ((instr >> 12) & 0xf0); 23629 NeonImmediate imm = 23630 ImmediateVFP::Decode<float>(encoded_imm); 23631 // VMOV{<c>}{<q>}.F32 <Sd>, #<imm> ; T2 23632 vmov(CurrentCond(), F32, SRegister(rd), imm); 23633 if (((instr & 0xffb00ff0) != 0xeeb00a00)) { 23634 UnpredictableT32(instr); 23635 } 23636 break; 23637 } 23638 case 0x00b00a40: { 23639 // 0xeeb00a40 23640 switch (instr & 0x000e0000) { 23641 case 0x00000000: { 23642 // 0xeeb00a40 23643 switch (instr & 0x00010080) { 23644 case 0x00000000: { 23645 // 0xeeb00a40 23646 unsigned rd = ExtractSRegister(instr, 22, 12); 23647 unsigned rm = ExtractSRegister(instr, 5, 0); 23648 // VMOV{<c>}{<q>}.F32 <Sd>, <Sm> ; T2 23649 vmov(CurrentCond(), 23650 F32, 23651 SRegister(rd), 23652 SRegister(rm)); 23653 break; 23654 } 23655 case 0x00000080: { 23656 // 0xeeb00ac0 23657 unsigned rd = ExtractSRegister(instr, 22, 12); 23658 unsigned rm = ExtractSRegister(instr, 5, 0); 23659 // VABS{<c>}{<q>}.F32 <Sd>, <Sm> ; T2 23660 vabs(CurrentCond(), 23661 F32, 23662 SRegister(rd), 23663 SRegister(rm)); 23664 break; 23665 } 23666 case 0x00010000: { 23667 // 0xeeb10a40 23668 unsigned rd = ExtractSRegister(instr, 22, 12); 23669 unsigned rm = ExtractSRegister(instr, 5, 0); 23670 // VNEG{<c>}{<q>}.F32 <Sd>, <Sm> ; T2 23671 vneg(CurrentCond(), 23672 F32, 23673 SRegister(rd), 23674 SRegister(rm)); 23675 break; 23676 } 23677 case 0x00010080: { 23678 // 0xeeb10ac0 23679 unsigned rd = ExtractSRegister(instr, 22, 12); 23680 unsigned rm = ExtractSRegister(instr, 5, 0); 23681 // VSQRT{<c>}{<q>}.F32 <Sd>, <Sm> ; T1 23682 vsqrt(CurrentCond(), 23683 F32, 23684 SRegister(rd), 23685 SRegister(rm)); 23686 break; 23687 } 23688 } 23689 break; 23690 } 23691 case 0x00020000: { 23692 // 0xeeb20a40 23693 switch (instr & 0x00010080) { 23694 case 0x00000000: { 23695 // 0xeeb20a40 23696 unsigned rd = ExtractSRegister(instr, 22, 12); 23697 unsigned rm = ExtractSRegister(instr, 5, 0); 23698 // VCVTB{<c>}{<q>}.F32.F16 <Sd>, <Sm> ; T1 23699 vcvtb(CurrentCond(), 23700 F32, 23701 F16, 23702 SRegister(rd), 23703 SRegister(rm)); 23704 break; 23705 } 23706 case 0x00000080: { 23707 // 0xeeb20ac0 23708 unsigned rd = ExtractSRegister(instr, 22, 12); 23709 unsigned rm = ExtractSRegister(instr, 5, 0); 23710 // VCVTT{<c>}{<q>}.F32.F16 <Sd>, <Sm> ; T1 23711 vcvtt(CurrentCond(), 23712 F32, 23713 F16, 23714 SRegister(rd), 23715 SRegister(rm)); 23716 break; 23717 } 23718 case 0x00010000: { 23719 // 0xeeb30a40 23720 unsigned rd = ExtractSRegister(instr, 22, 12); 23721 unsigned rm = ExtractSRegister(instr, 5, 0); 23722 // VCVTB{<c>}{<q>}.F16.F32 <Sd>, <Sm> ; T1 23723 vcvtb(CurrentCond(), 23724 F16, 23725 F32, 23726 SRegister(rd), 23727 SRegister(rm)); 23728 break; 23729 } 23730 case 0x00010080: { 23731 // 0xeeb30ac0 23732 unsigned rd = ExtractSRegister(instr, 22, 12); 23733 unsigned rm = ExtractSRegister(instr, 5, 0); 23734 // VCVTT{<c>}{<q>}.F16.F32 <Sd>, <Sm> ; T1 23735 vcvtt(CurrentCond(), 23736 F16, 23737 F32, 23738 SRegister(rd), 23739 SRegister(rm)); 23740 break; 23741 } 23742 } 23743 break; 23744 } 23745 case 0x00040000: { 23746 // 0xeeb40a40 23747 switch (instr & 0x00010080) { 23748 case 0x00000000: { 23749 // 0xeeb40a40 23750 unsigned rd = ExtractSRegister(instr, 22, 12); 23751 unsigned rm = ExtractSRegister(instr, 5, 0); 23752 // VCMP{<c>}{<q>}.F32 <Sd>, <Sm> ; T1 23753 vcmp(CurrentCond(), 23754 F32, 23755 SRegister(rd), 23756 SRegister(rm)); 23757 break; 23758 } 23759 case 0x00000080: { 23760 // 0xeeb40ac0 23761 unsigned rd = ExtractSRegister(instr, 22, 12); 23762 unsigned rm = ExtractSRegister(instr, 5, 0); 23763 // VCMPE{<c>}{<q>}.F32 <Sd>, <Sm> ; T1 23764 vcmpe(CurrentCond(), 23765 F32, 23766 SRegister(rd), 23767 SRegister(rm)); 23768 break; 23769 } 23770 case 0x00010000: { 23771 // 0xeeb50a40 23772 unsigned rd = ExtractSRegister(instr, 22, 12); 23773 // VCMP{<c>}{<q>}.F32 <Sd>, #0.0 ; T2 23774 vcmp(CurrentCond(), F32, SRegister(rd), 0.0); 23775 if (((instr & 0xffbf0fff) != 0xeeb50a40)) { 23776 UnpredictableT32(instr); 23777 } 23778 break; 23779 } 23780 case 0x00010080: { 23781 // 0xeeb50ac0 23782 unsigned rd = ExtractSRegister(instr, 22, 12); 23783 // VCMPE{<c>}{<q>}.F32 <Sd>, #0.0 ; T2 23784 vcmpe(CurrentCond(), F32, SRegister(rd), 0.0); 23785 if (((instr & 0xffbf0fff) != 0xeeb50ac0)) { 23786 UnpredictableT32(instr); 23787 } 23788 break; 23789 } 23790 } 23791 break; 23792 } 23793 case 0x00060000: { 23794 // 0xeeb60a40 23795 switch (instr & 0x00010080) { 23796 case 0x00000000: { 23797 // 0xeeb60a40 23798 unsigned rd = ExtractSRegister(instr, 22, 12); 23799 unsigned rm = ExtractSRegister(instr, 5, 0); 23800 // VRINTR{<c>}{<q>}.F32 <Sd>, <Sm> ; T1 23801 vrintr(CurrentCond(), 23802 F32, 23803 SRegister(rd), 23804 SRegister(rm)); 23805 break; 23806 } 23807 case 0x00000080: { 23808 // 0xeeb60ac0 23809 unsigned rd = ExtractSRegister(instr, 22, 12); 23810 unsigned rm = ExtractSRegister(instr, 5, 0); 23811 // VRINTZ{<c>}{<q>}.F32 <Sd>, <Sm> ; T1 23812 vrintz(CurrentCond(), 23813 F32, 23814 SRegister(rd), 23815 SRegister(rm)); 23816 break; 23817 } 23818 case 0x00010000: { 23819 // 0xeeb70a40 23820 unsigned rd = ExtractSRegister(instr, 22, 12); 23821 unsigned rm = ExtractSRegister(instr, 5, 0); 23822 // VRINTX{<c>}{<q>}.F32 <Sd>, <Sm> ; T1 23823 vrintx(CurrentCond(), 23824 F32, 23825 SRegister(rd), 23826 SRegister(rm)); 23827 break; 23828 } 23829 case 0x00010080: { 23830 // 0xeeb70ac0 23831 unsigned rd = ExtractDRegister(instr, 22, 12); 23832 unsigned rm = ExtractSRegister(instr, 5, 0); 23833 // VCVT{<c>}{<q>}.F64.F32 <Dd>, <Sm> ; T1 23834 vcvt(CurrentCond(), 23835 F64, 23836 F32, 23837 DRegister(rd), 23838 SRegister(rm)); 23839 break; 23840 } 23841 } 23842 break; 23843 } 23844 case 0x00080000: { 23845 // 0xeeb80a40 23846 if ((instr & 0x00010000) == 0x00000000) { 23847 DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1); 23848 if (dt.Is(kDataTypeValueInvalid)) { 23849 UnallocatedT32(instr); 23850 return; 23851 } 23852 unsigned rd = ExtractSRegister(instr, 22, 12); 23853 unsigned rm = ExtractSRegister(instr, 5, 0); 23854 // VCVT{<c>}{<q>}.F32.<dt> <Sd>, <Sm> ; T1 23855 vcvt(CurrentCond(), 23856 F32, 23857 dt, 23858 SRegister(rd), 23859 SRegister(rm)); 23860 } else { 23861 UnallocatedT32(instr); 23862 } 23863 break; 23864 } 23865 case 0x000a0000: { 23866 // 0xeeba0a40 23867 DataType dt = Dt_U_sx_1_Decode(((instr >> 7) & 0x1) | 23868 ((instr >> 15) & 0x2)); 23869 if (dt.Is(kDataTypeValueInvalid)) { 23870 UnallocatedT32(instr); 23871 return; 23872 } 23873 unsigned rd = ExtractSRegister(instr, 22, 12); 23874 unsigned offset = 32; 23875 if (dt.Is(S16) || dt.Is(U16)) { 23876 offset = 16; 23877 } 23878 uint32_t fbits = offset - (((instr >> 5) & 0x1) | 23879 ((instr << 1) & 0x1e)); 23880 // VCVT{<c>}{<q>}.F32.<dt> <Sdm>, <Sdm>, #<fbits> ; T1 23881 vcvt(CurrentCond(), 23882 F32, 23883 dt, 23884 SRegister(rd), 23885 SRegister(rd), 23886 fbits); 23887 break; 23888 } 23889 case 0x000c0000: { 23890 // 0xeebc0a40 23891 switch (instr & 0x00010080) { 23892 case 0x00000000: { 23893 // 0xeebc0a40 23894 unsigned rd = ExtractSRegister(instr, 22, 12); 23895 unsigned rm = ExtractSRegister(instr, 5, 0); 23896 // VCVTR{<c>}{<q>}.U32.F32 <Sd>, <Sm> ; T1 23897 vcvtr(CurrentCond(), 23898 U32, 23899 F32, 23900 SRegister(rd), 23901 SRegister(rm)); 23902 break; 23903 } 23904 case 0x00000080: { 23905 // 0xeebc0ac0 23906 unsigned rd = ExtractSRegister(instr, 22, 12); 23907 unsigned rm = ExtractSRegister(instr, 5, 0); 23908 // VCVT{<c>}{<q>}.U32.F32 <Sd>, <Sm> ; T1 23909 vcvt(CurrentCond(), 23910 U32, 23911 F32, 23912 SRegister(rd), 23913 SRegister(rm)); 23914 break; 23915 } 23916 case 0x00010000: { 23917 // 0xeebd0a40 23918 unsigned rd = ExtractSRegister(instr, 22, 12); 23919 unsigned rm = ExtractSRegister(instr, 5, 0); 23920 // VCVTR{<c>}{<q>}.S32.F32 <Sd>, <Sm> ; T1 23921 vcvtr(CurrentCond(), 23922 S32, 23923 F32, 23924 SRegister(rd), 23925 SRegister(rm)); 23926 break; 23927 } 23928 case 0x00010080: { 23929 // 0xeebd0ac0 23930 unsigned rd = ExtractSRegister(instr, 22, 12); 23931 unsigned rm = ExtractSRegister(instr, 5, 0); 23932 // VCVT{<c>}{<q>}.S32.F32 <Sd>, <Sm> ; T1 23933 vcvt(CurrentCond(), 23934 S32, 23935 F32, 23936 SRegister(rd), 23937 SRegister(rm)); 23938 break; 23939 } 23940 } 23941 break; 23942 } 23943 case 0x000e0000: { 23944 // 0xeebe0a40 23945 DataType dt = Dt_U_sx_1_Decode(((instr >> 7) & 0x1) | 23946 ((instr >> 15) & 0x2)); 23947 if (dt.Is(kDataTypeValueInvalid)) { 23948 UnallocatedT32(instr); 23949 return; 23950 } 23951 unsigned rd = ExtractSRegister(instr, 22, 12); 23952 unsigned offset = 32; 23953 if (dt.Is(S16) || dt.Is(U16)) { 23954 offset = 16; 23955 } 23956 uint32_t fbits = offset - (((instr >> 5) & 0x1) | 23957 ((instr << 1) & 0x1e)); 23958 // VCVT{<c>}{<q>}.<dt>.F32 <Sdm>, <Sdm>, #<fbits> ; T1 23959 vcvt(CurrentCond(), 23960 dt, 23961 F32, 23962 SRegister(rd), 23963 SRegister(rd), 23964 fbits); 23965 break; 23966 } 23967 } 23968 break; 23969 } 23970 case 0x00b00b00: { 23971 // 0xeeb00b00 23972 unsigned rd = ExtractDRegister(instr, 22, 12); 23973 uint32_t encoded_imm = 23974 (instr & 0xf) | ((instr >> 12) & 0xf0); 23975 NeonImmediate imm = 23976 ImmediateVFP::Decode<double>(encoded_imm); 23977 // VMOV{<c>}{<q>}.F64 <Dd>, #<imm> ; T2 23978 vmov(CurrentCond(), F64, DRegister(rd), imm); 23979 if (((instr & 0xffb00ff0) != 0xeeb00b00)) { 23980 UnpredictableT32(instr); 23981 } 23982 break; 23983 } 23984 case 0x00b00b40: { 23985 // 0xeeb00b40 23986 switch (instr & 0x000e0000) { 23987 case 0x00000000: { 23988 // 0xeeb00b40 23989 switch (instr & 0x00010080) { 23990 case 0x00000000: { 23991 // 0xeeb00b40 23992 unsigned rd = ExtractDRegister(instr, 22, 12); 23993 unsigned rm = ExtractDRegister(instr, 5, 0); 23994 // VMOV{<c>}{<q>}.F64 <Dd>, <Dm> ; T2 23995 vmov(CurrentCond(), 23996 F64, 23997 DRegister(rd), 23998 DRegister(rm)); 23999 break; 24000 } 24001 case 0x00000080: { 24002 // 0xeeb00bc0 24003 unsigned rd = ExtractDRegister(instr, 22, 12); 24004 unsigned rm = ExtractDRegister(instr, 5, 0); 24005 // VABS{<c>}{<q>}.F64 <Dd>, <Dm> ; T2 24006 vabs(CurrentCond(), 24007 F64, 24008 DRegister(rd), 24009 DRegister(rm)); 24010 break; 24011 } 24012 case 0x00010000: { 24013 // 0xeeb10b40 24014 unsigned rd = ExtractDRegister(instr, 22, 12); 24015 unsigned rm = ExtractDRegister(instr, 5, 0); 24016 // VNEG{<c>}{<q>}.F64 <Dd>, <Dm> ; T2 24017 vneg(CurrentCond(), 24018 F64, 24019 DRegister(rd), 24020 DRegister(rm)); 24021 break; 24022 } 24023 case 0x00010080: { 24024 // 0xeeb10bc0 24025 unsigned rd = ExtractDRegister(instr, 22, 12); 24026 unsigned rm = ExtractDRegister(instr, 5, 0); 24027 // VSQRT{<c>}{<q>}.F64 <Dd>, <Dm> ; T1 24028 vsqrt(CurrentCond(), 24029 F64, 24030 DRegister(rd), 24031 DRegister(rm)); 24032 break; 24033 } 24034 } 24035 break; 24036 } 24037 case 0x00020000: { 24038 // 0xeeb20b40 24039 switch (instr & 0x00010080) { 24040 case 0x00000000: { 24041 // 0xeeb20b40 24042 unsigned rd = ExtractDRegister(instr, 22, 12); 24043 unsigned rm = ExtractSRegister(instr, 5, 0); 24044 // VCVTB{<c>}{<q>}.F64.F16 <Dd>, <Sm> ; T1 24045 vcvtb(CurrentCond(), 24046 F64, 24047 F16, 24048 DRegister(rd), 24049 SRegister(rm)); 24050 break; 24051 } 24052 case 0x00000080: { 24053 // 0xeeb20bc0 24054 unsigned rd = ExtractDRegister(instr, 22, 12); 24055 unsigned rm = ExtractSRegister(instr, 5, 0); 24056 // VCVTT{<c>}{<q>}.F64.F16 <Dd>, <Sm> ; T1 24057 vcvtt(CurrentCond(), 24058 F64, 24059 F16, 24060 DRegister(rd), 24061 SRegister(rm)); 24062 break; 24063 } 24064 case 0x00010000: { 24065 // 0xeeb30b40 24066 unsigned rd = ExtractSRegister(instr, 22, 12); 24067 unsigned rm = ExtractDRegister(instr, 5, 0); 24068 // VCVTB{<c>}{<q>}.F16.F64 <Sd>, <Dm> ; T1 24069 vcvtb(CurrentCond(), 24070 F16, 24071 F64, 24072 SRegister(rd), 24073 DRegister(rm)); 24074 break; 24075 } 24076 case 0x00010080: { 24077 // 0xeeb30bc0 24078 unsigned rd = ExtractSRegister(instr, 22, 12); 24079 unsigned rm = ExtractDRegister(instr, 5, 0); 24080 // VCVTT{<c>}{<q>}.F16.F64 <Sd>, <Dm> ; T1 24081 vcvtt(CurrentCond(), 24082 F16, 24083 F64, 24084 SRegister(rd), 24085 DRegister(rm)); 24086 break; 24087 } 24088 } 24089 break; 24090 } 24091 case 0x00040000: { 24092 // 0xeeb40b40 24093 switch (instr & 0x00010080) { 24094 case 0x00000000: { 24095 // 0xeeb40b40 24096 unsigned rd = ExtractDRegister(instr, 22, 12); 24097 unsigned rm = ExtractDRegister(instr, 5, 0); 24098 // VCMP{<c>}{<q>}.F64 <Dd>, <Dm> ; T1 24099 vcmp(CurrentCond(), 24100 F64, 24101 DRegister(rd), 24102 DRegister(rm)); 24103 break; 24104 } 24105 case 0x00000080: { 24106 // 0xeeb40bc0 24107 unsigned rd = ExtractDRegister(instr, 22, 12); 24108 unsigned rm = ExtractDRegister(instr, 5, 0); 24109 // VCMPE{<c>}{<q>}.F64 <Dd>, <Dm> ; T1 24110 vcmpe(CurrentCond(), 24111 F64, 24112 DRegister(rd), 24113 DRegister(rm)); 24114 break; 24115 } 24116 case 0x00010000: { 24117 // 0xeeb50b40 24118 unsigned rd = ExtractDRegister(instr, 22, 12); 24119 // VCMP{<c>}{<q>}.F64 <Dd>, #0.0 ; T2 24120 vcmp(CurrentCond(), F64, DRegister(rd), 0.0); 24121 if (((instr & 0xffbf0fff) != 0xeeb50b40)) { 24122 UnpredictableT32(instr); 24123 } 24124 break; 24125 } 24126 case 0x00010080: { 24127 // 0xeeb50bc0 24128 unsigned rd = ExtractDRegister(instr, 22, 12); 24129 // VCMPE{<c>}{<q>}.F64 <Dd>, #0.0 ; T2 24130 vcmpe(CurrentCond(), F64, DRegister(rd), 0.0); 24131 if (((instr & 0xffbf0fff) != 0xeeb50bc0)) { 24132 UnpredictableT32(instr); 24133 } 24134 break; 24135 } 24136 } 24137 break; 24138 } 24139 case 0x00060000: { 24140 // 0xeeb60b40 24141 switch (instr & 0x00010080) { 24142 case 0x00000000: { 24143 // 0xeeb60b40 24144 unsigned rd = ExtractDRegister(instr, 22, 12); 24145 unsigned rm = ExtractDRegister(instr, 5, 0); 24146 // VRINTR{<c>}{<q>}.F64 <Dd>, <Dm> ; T1 24147 vrintr(CurrentCond(), 24148 F64, 24149 DRegister(rd), 24150 DRegister(rm)); 24151 break; 24152 } 24153 case 0x00000080: { 24154 // 0xeeb60bc0 24155 unsigned rd = ExtractDRegister(instr, 22, 12); 24156 unsigned rm = ExtractDRegister(instr, 5, 0); 24157 // VRINTZ{<c>}{<q>}.F64 <Dd>, <Dm> ; T1 24158 vrintz(CurrentCond(), 24159 F64, 24160 DRegister(rd), 24161 DRegister(rm)); 24162 break; 24163 } 24164 case 0x00010000: { 24165 // 0xeeb70b40 24166 unsigned rd = ExtractDRegister(instr, 22, 12); 24167 unsigned rm = ExtractDRegister(instr, 5, 0); 24168 // VRINTX{<c>}{<q>}.F64 <Dd>, <Dm> ; T1 24169 vrintx(CurrentCond(), 24170 F64, 24171 DRegister(rd), 24172 DRegister(rm)); 24173 break; 24174 } 24175 case 0x00010080: { 24176 // 0xeeb70bc0 24177 unsigned rd = ExtractSRegister(instr, 22, 12); 24178 unsigned rm = ExtractDRegister(instr, 5, 0); 24179 // VCVT{<c>}{<q>}.F32.F64 <Sd>, <Dm> ; T1 24180 vcvt(CurrentCond(), 24181 F32, 24182 F64, 24183 SRegister(rd), 24184 DRegister(rm)); 24185 break; 24186 } 24187 } 24188 break; 24189 } 24190 case 0x00080000: { 24191 // 0xeeb80b40 24192 if ((instr & 0x00010000) == 0x00000000) { 24193 DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1); 24194 if (dt.Is(kDataTypeValueInvalid)) { 24195 UnallocatedT32(instr); 24196 return; 24197 } 24198 unsigned rd = ExtractDRegister(instr, 22, 12); 24199 unsigned rm = ExtractSRegister(instr, 5, 0); 24200 // VCVT{<c>}{<q>}.F64.<dt> <Dd>, <Sm> ; T1 24201 vcvt(CurrentCond(), 24202 F64, 24203 dt, 24204 DRegister(rd), 24205 SRegister(rm)); 24206 } else { 24207 UnallocatedT32(instr); 24208 } 24209 break; 24210 } 24211 case 0x000a0000: { 24212 // 0xeeba0b40 24213 DataType dt = Dt_U_sx_1_Decode(((instr >> 7) & 0x1) | 24214 ((instr >> 15) & 0x2)); 24215 if (dt.Is(kDataTypeValueInvalid)) { 24216 UnallocatedT32(instr); 24217 return; 24218 } 24219 unsigned rd = ExtractDRegister(instr, 22, 12); 24220 unsigned offset = 32; 24221 if (dt.Is(S16) || dt.Is(U16)) { 24222 offset = 16; 24223 } 24224 uint32_t fbits = offset - (((instr >> 5) & 0x1) | 24225 ((instr << 1) & 0x1e)); 24226 // VCVT{<c>}{<q>}.F64.<dt> <Ddm>, <Ddm>, #<fbits> ; T1 24227 vcvt(CurrentCond(), 24228 F64, 24229 dt, 24230 DRegister(rd), 24231 DRegister(rd), 24232 fbits); 24233 break; 24234 } 24235 case 0x000c0000: { 24236 // 0xeebc0b40 24237 switch (instr & 0x00010080) { 24238 case 0x00000000: { 24239 // 0xeebc0b40 24240 unsigned rd = ExtractSRegister(instr, 22, 12); 24241 unsigned rm = ExtractDRegister(instr, 5, 0); 24242 // VCVTR{<c>}{<q>}.U32.F64 <Sd>, <Dm> ; T1 24243 vcvtr(CurrentCond(), 24244 U32, 24245 F64, 24246 SRegister(rd), 24247 DRegister(rm)); 24248 break; 24249 } 24250 case 0x00000080: { 24251 // 0xeebc0bc0 24252 unsigned rd = ExtractSRegister(instr, 22, 12); 24253 unsigned rm = ExtractDRegister(instr, 5, 0); 24254 // VCVT{<c>}{<q>}.U32.F64 <Sd>, <Dm> ; T1 24255 vcvt(CurrentCond(), 24256 U32, 24257 F64, 24258 SRegister(rd), 24259 DRegister(rm)); 24260 break; 24261 } 24262 case 0x00010000: { 24263 // 0xeebd0b40 24264 unsigned rd = ExtractSRegister(instr, 22, 12); 24265 unsigned rm = ExtractDRegister(instr, 5, 0); 24266 // VCVTR{<c>}{<q>}.S32.F64 <Sd>, <Dm> ; T1 24267 vcvtr(CurrentCond(), 24268 S32, 24269 F64, 24270 SRegister(rd), 24271 DRegister(rm)); 24272 break; 24273 } 24274 case 0x00010080: { 24275 // 0xeebd0bc0 24276 unsigned rd = ExtractSRegister(instr, 22, 12); 24277 unsigned rm = ExtractDRegister(instr, 5, 0); 24278 // VCVT{<c>}{<q>}.S32.F64 <Sd>, <Dm> ; T1 24279 vcvt(CurrentCond(), 24280 S32, 24281 F64, 24282 SRegister(rd), 24283 DRegister(rm)); 24284 break; 24285 } 24286 } 24287 break; 24288 } 24289 case 0x000e0000: { 24290 // 0xeebe0b40 24291 DataType dt = Dt_U_sx_1_Decode(((instr >> 7) & 0x1) | 24292 ((instr >> 15) & 0x2)); 24293 if (dt.Is(kDataTypeValueInvalid)) { 24294 UnallocatedT32(instr); 24295 return; 24296 } 24297 unsigned rd = ExtractDRegister(instr, 22, 12); 24298 unsigned offset = 32; 24299 if (dt.Is(S16) || dt.Is(U16)) { 24300 offset = 16; 24301 } 24302 uint32_t fbits = offset - (((instr >> 5) & 0x1) | 24303 ((instr << 1) & 0x1e)); 24304 // VCVT{<c>}{<q>}.<dt>.F64 <Ddm>, <Ddm>, #<fbits> ; T1 24305 vcvt(CurrentCond(), 24306 dt, 24307 F64, 24308 DRegister(rd), 24309 DRegister(rd), 24310 fbits); 24311 break; 24312 } 24313 } 24314 break; 24315 } 24316 case 0x10000a00: { 24317 // 0xfe000a00 24318 unsigned rd = ExtractSRegister(instr, 22, 12); 24319 unsigned rn = ExtractSRegister(instr, 7, 16); 24320 unsigned rm = ExtractSRegister(instr, 5, 0); 24321 // VSELEQ.F32 <Sd>, <Sn>, <Sm> ; T1 24322 vseleq(F32, SRegister(rd), SRegister(rn), SRegister(rm)); 24323 if (InITBlock()) { 24324 UnpredictableT32(instr); 24325 } 24326 break; 24327 } 24328 case 0x10000b00: { 24329 // 0xfe000b00 24330 unsigned rd = ExtractDRegister(instr, 22, 12); 24331 unsigned rn = ExtractDRegister(instr, 7, 16); 24332 unsigned rm = ExtractDRegister(instr, 5, 0); 24333 // VSELEQ.F64 <Dd>, <Dn>, <Dm> ; T1 24334 vseleq(F64, DRegister(rd), DRegister(rn), DRegister(rm)); 24335 if (InITBlock()) { 24336 UnpredictableT32(instr); 24337 } 24338 break; 24339 } 24340 case 0x10100a00: { 24341 // 0xfe100a00 24342 unsigned rd = ExtractSRegister(instr, 22, 12); 24343 unsigned rn = ExtractSRegister(instr, 7, 16); 24344 unsigned rm = ExtractSRegister(instr, 5, 0); 24345 // VSELVS.F32 <Sd>, <Sn>, <Sm> ; T1 24346 vselvs(F32, SRegister(rd), SRegister(rn), SRegister(rm)); 24347 if (InITBlock()) { 24348 UnpredictableT32(instr); 24349 } 24350 break; 24351 } 24352 case 0x10100b00: { 24353 // 0xfe100b00 24354 unsigned rd = ExtractDRegister(instr, 22, 12); 24355 unsigned rn = ExtractDRegister(instr, 7, 16); 24356 unsigned rm = ExtractDRegister(instr, 5, 0); 24357 // VSELVS.F64 <Dd>, <Dn>, <Dm> ; T1 24358 vselvs(F64, DRegister(rd), DRegister(rn), DRegister(rm)); 24359 if (InITBlock()) { 24360 UnpredictableT32(instr); 24361 } 24362 break; 24363 } 24364 case 0x10200a00: { 24365 // 0xfe200a00 24366 unsigned rd = ExtractSRegister(instr, 22, 12); 24367 unsigned rn = ExtractSRegister(instr, 7, 16); 24368 unsigned rm = ExtractSRegister(instr, 5, 0); 24369 // VSELGE.F32 <Sd>, <Sn>, <Sm> ; T1 24370 vselge(F32, SRegister(rd), SRegister(rn), SRegister(rm)); 24371 if (InITBlock()) { 24372 UnpredictableT32(instr); 24373 } 24374 break; 24375 } 24376 case 0x10200b00: { 24377 // 0xfe200b00 24378 unsigned rd = ExtractDRegister(instr, 22, 12); 24379 unsigned rn = ExtractDRegister(instr, 7, 16); 24380 unsigned rm = ExtractDRegister(instr, 5, 0); 24381 // VSELGE.F64 <Dd>, <Dn>, <Dm> ; T1 24382 vselge(F64, DRegister(rd), DRegister(rn), DRegister(rm)); 24383 if (InITBlock()) { 24384 UnpredictableT32(instr); 24385 } 24386 break; 24387 } 24388 case 0x10300a00: { 24389 // 0xfe300a00 24390 unsigned rd = ExtractSRegister(instr, 22, 12); 24391 unsigned rn = ExtractSRegister(instr, 7, 16); 24392 unsigned rm = ExtractSRegister(instr, 5, 0); 24393 // VSELGT.F32 <Sd>, <Sn>, <Sm> ; T1 24394 vselgt(F32, SRegister(rd), SRegister(rn), SRegister(rm)); 24395 if (InITBlock()) { 24396 UnpredictableT32(instr); 24397 } 24398 break; 24399 } 24400 case 0x10300b00: { 24401 // 0xfe300b00 24402 unsigned rd = ExtractDRegister(instr, 22, 12); 24403 unsigned rn = ExtractDRegister(instr, 7, 16); 24404 unsigned rm = ExtractDRegister(instr, 5, 0); 24405 // VSELGT.F64 <Dd>, <Dn>, <Dm> ; T1 24406 vselgt(F64, DRegister(rd), DRegister(rn), DRegister(rm)); 24407 if (InITBlock()) { 24408 UnpredictableT32(instr); 24409 } 24410 break; 24411 } 24412 case 0x10800a00: { 24413 // 0xfe800a00 24414 unsigned rd = ExtractSRegister(instr, 22, 12); 24415 unsigned rn = ExtractSRegister(instr, 7, 16); 24416 unsigned rm = ExtractSRegister(instr, 5, 0); 24417 // VMAXNM{<q>}.F32 <Sd>, <Sn>, <Sm> ; T2 24418 vmaxnm(F32, SRegister(rd), SRegister(rn), SRegister(rm)); 24419 if (InITBlock()) { 24420 UnpredictableT32(instr); 24421 } 24422 break; 24423 } 24424 case 0x10800a40: { 24425 // 0xfe800a40 24426 unsigned rd = ExtractSRegister(instr, 22, 12); 24427 unsigned rn = ExtractSRegister(instr, 7, 16); 24428 unsigned rm = ExtractSRegister(instr, 5, 0); 24429 // VMINNM{<q>}.F32 <Sd>, <Sn>, <Sm> ; T2 24430 vminnm(F32, SRegister(rd), SRegister(rn), SRegister(rm)); 24431 if (InITBlock()) { 24432 UnpredictableT32(instr); 24433 } 24434 break; 24435 } 24436 case 0x10800b00: { 24437 // 0xfe800b00 24438 unsigned rd = ExtractDRegister(instr, 22, 12); 24439 unsigned rn = ExtractDRegister(instr, 7, 16); 24440 unsigned rm = ExtractDRegister(instr, 5, 0); 24441 // VMAXNM{<q>}.F64 <Dd>, <Dn>, <Dm> ; T2 24442 vmaxnm(F64, DRegister(rd), DRegister(rn), DRegister(rm)); 24443 if (InITBlock()) { 24444 UnpredictableT32(instr); 24445 } 24446 break; 24447 } 24448 case 0x10800b40: { 24449 // 0xfe800b40 24450 unsigned rd = ExtractDRegister(instr, 22, 12); 24451 unsigned rn = ExtractDRegister(instr, 7, 16); 24452 unsigned rm = ExtractDRegister(instr, 5, 0); 24453 // VMINNM{<q>}.F64 <Dd>, <Dn>, <Dm> ; T2 24454 vminnm(F64, DRegister(rd), DRegister(rn), DRegister(rm)); 24455 if (InITBlock()) { 24456 UnpredictableT32(instr); 24457 } 24458 break; 24459 } 24460 case 0x10b00a40: { 24461 // 0xfeb00a40 24462 switch (instr & 0x000f0000) { 24463 case 0x00080000: { 24464 // 0xfeb80a40 24465 if ((instr & 0x00000080) == 0x00000000) { 24466 unsigned rd = ExtractSRegister(instr, 22, 12); 24467 unsigned rm = ExtractSRegister(instr, 5, 0); 24468 // VRINTA{<q>}.F32 <Sd>, <Sm> ; T1 24469 vrinta(F32, SRegister(rd), SRegister(rm)); 24470 } else { 24471 UnallocatedT32(instr); 24472 } 24473 break; 24474 } 24475 case 0x00090000: { 24476 // 0xfeb90a40 24477 if ((instr & 0x00000080) == 0x00000000) { 24478 unsigned rd = ExtractSRegister(instr, 22, 12); 24479 unsigned rm = ExtractSRegister(instr, 5, 0); 24480 // VRINTN{<q>}.F32 <Sd>, <Sm> ; T1 24481 vrintn(F32, SRegister(rd), SRegister(rm)); 24482 } else { 24483 UnallocatedT32(instr); 24484 } 24485 break; 24486 } 24487 case 0x000a0000: { 24488 // 0xfeba0a40 24489 if ((instr & 0x00000080) == 0x00000000) { 24490 unsigned rd = ExtractSRegister(instr, 22, 12); 24491 unsigned rm = ExtractSRegister(instr, 5, 0); 24492 // VRINTP{<q>}.F32 <Sd>, <Sm> ; T1 24493 vrintp(F32, SRegister(rd), SRegister(rm)); 24494 } else { 24495 UnallocatedT32(instr); 24496 } 24497 break; 24498 } 24499 case 0x000b0000: { 24500 // 0xfebb0a40 24501 if ((instr & 0x00000080) == 0x00000000) { 24502 unsigned rd = ExtractSRegister(instr, 22, 12); 24503 unsigned rm = ExtractSRegister(instr, 5, 0); 24504 // VRINTM{<q>}.F32 <Sd>, <Sm> ; T1 24505 vrintm(F32, SRegister(rd), SRegister(rm)); 24506 } else { 24507 UnallocatedT32(instr); 24508 } 24509 break; 24510 } 24511 case 0x000c0000: { 24512 // 0xfebc0a40 24513 DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1); 24514 if (dt.Is(kDataTypeValueInvalid)) { 24515 UnallocatedT32(instr); 24516 return; 24517 } 24518 unsigned rd = ExtractSRegister(instr, 22, 12); 24519 unsigned rm = ExtractSRegister(instr, 5, 0); 24520 // VCVTA{<q>}.<dt>.F32 <Sd>, <Sm> ; T1 24521 vcvta(dt, F32, SRegister(rd), SRegister(rm)); 24522 break; 24523 } 24524 case 0x000d0000: { 24525 // 0xfebd0a40 24526 DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1); 24527 if (dt.Is(kDataTypeValueInvalid)) { 24528 UnallocatedT32(instr); 24529 return; 24530 } 24531 unsigned rd = ExtractSRegister(instr, 22, 12); 24532 unsigned rm = ExtractSRegister(instr, 5, 0); 24533 // VCVTN{<q>}.<dt>.F32 <Sd>, <Sm> ; T1 24534 vcvtn(dt, F32, SRegister(rd), SRegister(rm)); 24535 break; 24536 } 24537 case 0x000e0000: { 24538 // 0xfebe0a40 24539 DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1); 24540 if (dt.Is(kDataTypeValueInvalid)) { 24541 UnallocatedT32(instr); 24542 return; 24543 } 24544 unsigned rd = ExtractSRegister(instr, 22, 12); 24545 unsigned rm = ExtractSRegister(instr, 5, 0); 24546 // VCVTP{<q>}.<dt>.F32 <Sd>, <Sm> ; T1 24547 vcvtp(dt, F32, SRegister(rd), SRegister(rm)); 24548 break; 24549 } 24550 case 0x000f0000: { 24551 // 0xfebf0a40 24552 DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1); 24553 if (dt.Is(kDataTypeValueInvalid)) { 24554 UnallocatedT32(instr); 24555 return; 24556 } 24557 unsigned rd = ExtractSRegister(instr, 22, 12); 24558 unsigned rm = ExtractSRegister(instr, 5, 0); 24559 // VCVTM{<q>}.<dt>.F32 <Sd>, <Sm> ; T1 24560 vcvtm(dt, F32, SRegister(rd), SRegister(rm)); 24561 break; 24562 } 24563 default: 24564 UnallocatedT32(instr); 24565 break; 24566 } 24567 break; 24568 } 24569 case 0x10b00b40: { 24570 // 0xfeb00b40 24571 switch (instr & 0x000f0000) { 24572 case 0x00080000: { 24573 // 0xfeb80b40 24574 if ((instr & 0x00000080) == 0x00000000) { 24575 unsigned rd = ExtractDRegister(instr, 22, 12); 24576 unsigned rm = ExtractDRegister(instr, 5, 0); 24577 // VRINTA{<q>}.F64 <Dd>, <Dm> ; T1 24578 vrinta(F64, DRegister(rd), DRegister(rm)); 24579 } else { 24580 UnallocatedT32(instr); 24581 } 24582 break; 24583 } 24584 case 0x00090000: { 24585 // 0xfeb90b40 24586 if ((instr & 0x00000080) == 0x00000000) { 24587 unsigned rd = ExtractDRegister(instr, 22, 12); 24588 unsigned rm = ExtractDRegister(instr, 5, 0); 24589 // VRINTN{<q>}.F64 <Dd>, <Dm> ; T1 24590 vrintn(F64, DRegister(rd), DRegister(rm)); 24591 } else { 24592 UnallocatedT32(instr); 24593 } 24594 break; 24595 } 24596 case 0x000a0000: { 24597 // 0xfeba0b40 24598 if ((instr & 0x00000080) == 0x00000000) { 24599 unsigned rd = ExtractDRegister(instr, 22, 12); 24600 unsigned rm = ExtractDRegister(instr, 5, 0); 24601 // VRINTP{<q>}.F64 <Dd>, <Dm> ; T1 24602 vrintp(F64, DRegister(rd), DRegister(rm)); 24603 } else { 24604 UnallocatedT32(instr); 24605 } 24606 break; 24607 } 24608 case 0x000b0000: { 24609 // 0xfebb0b40 24610 if ((instr & 0x00000080) == 0x00000000) { 24611 unsigned rd = ExtractDRegister(instr, 22, 12); 24612 unsigned rm = ExtractDRegister(instr, 5, 0); 24613 // VRINTM{<q>}.F64 <Dd>, <Dm> ; T1 24614 vrintm(F64, DRegister(rd), DRegister(rm)); 24615 } else { 24616 UnallocatedT32(instr); 24617 } 24618 break; 24619 } 24620 case 0x000c0000: { 24621 // 0xfebc0b40 24622 DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1); 24623 if (dt.Is(kDataTypeValueInvalid)) { 24624 UnallocatedT32(instr); 24625 return; 24626 } 24627 unsigned rd = ExtractSRegister(instr, 22, 12); 24628 unsigned rm = ExtractDRegister(instr, 5, 0); 24629 // VCVTA{<q>}.<dt>.F64 <Sd>, <Dm> ; T1 24630 vcvta(dt, F64, SRegister(rd), DRegister(rm)); 24631 break; 24632 } 24633 case 0x000d0000: { 24634 // 0xfebd0b40 24635 DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1); 24636 if (dt.Is(kDataTypeValueInvalid)) { 24637 UnallocatedT32(instr); 24638 return; 24639 } 24640 unsigned rd = ExtractSRegister(instr, 22, 12); 24641 unsigned rm = ExtractDRegister(instr, 5, 0); 24642 // VCVTN{<q>}.<dt>.F64 <Sd>, <Dm> ; T1 24643 vcvtn(dt, F64, SRegister(rd), DRegister(rm)); 24644 break; 24645 } 24646 case 0x000e0000: { 24647 // 0xfebe0b40 24648 DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1); 24649 if (dt.Is(kDataTypeValueInvalid)) { 24650 UnallocatedT32(instr); 24651 return; 24652 } 24653 unsigned rd = ExtractSRegister(instr, 22, 12); 24654 unsigned rm = ExtractDRegister(instr, 5, 0); 24655 // VCVTP{<q>}.<dt>.F64 <Sd>, <Dm> ; T1 24656 vcvtp(dt, F64, SRegister(rd), DRegister(rm)); 24657 break; 24658 } 24659 case 0x000f0000: { 24660 // 0xfebf0b40 24661 DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1); 24662 if (dt.Is(kDataTypeValueInvalid)) { 24663 UnallocatedT32(instr); 24664 return; 24665 } 24666 unsigned rd = ExtractSRegister(instr, 22, 12); 24667 unsigned rm = ExtractDRegister(instr, 5, 0); 24668 // VCVTM{<q>}.<dt>.F64 <Sd>, <Dm> ; T1 24669 vcvtm(dt, F64, SRegister(rd), DRegister(rm)); 24670 break; 24671 } 24672 default: 24673 UnallocatedT32(instr); 24674 break; 24675 } 24676 break; 24677 } 24678 default: 24679 UnallocatedT32(instr); 24680 break; 24681 } 24682 break; 24683 } 24684 case 0x00000010: { 24685 // 0xee000010 24686 switch (instr & 0x10100e00) { 24687 case 0x00000a00: { 24688 // 0xee000a10 24689 switch (instr & 0x00800100) { 24690 case 0x00000000: { 24691 // 0xee000a10 24692 if ((instr & 0x00600000) == 0x00000000) { 24693 unsigned rn = ExtractSRegister(instr, 7, 16); 24694 unsigned rt = (instr >> 12) & 0xf; 24695 // VMOV{<c>}{<q>} <Sn>, <Rt> ; T1 24696 vmov(CurrentCond(), SRegister(rn), Register(rt)); 24697 if (((instr & 0xfff00f7f) != 0xee000a10)) { 24698 UnpredictableT32(instr); 24699 } 24700 } else { 24701 UnallocatedT32(instr); 24702 } 24703 break; 24704 } 24705 case 0x00000100: { 24706 // 0xee000b10 24707 unsigned lane; 24708 DataType dt = 24709 Dt_opc1_opc2_1_Decode(((instr >> 5) & 0x3) | 24710 ((instr >> 19) & 0xc), 24711 &lane); 24712 if (dt.Is(kDataTypeValueInvalid)) { 24713 UnallocatedT32(instr); 24714 return; 24715 } 24716 unsigned rd = ExtractDRegister(instr, 7, 16); 24717 unsigned rt = (instr >> 12) & 0xf; 24718 // VMOV{<c>}{<q>}{.<size>} <Dd[x]>, <Rt> ; T1 24719 vmov(CurrentCond(), 24720 dt, 24721 DRegisterLane(rd, lane), 24722 Register(rt)); 24723 if (((instr & 0xff900f1f) != 0xee000b10)) { 24724 UnpredictableT32(instr); 24725 } 24726 break; 24727 } 24728 case 0x00800000: { 24729 // 0xee800a10 24730 if ((instr & 0x00600000) == 0x00600000) { 24731 unsigned spec_reg = (instr >> 16) & 0xf; 24732 unsigned rt = (instr >> 12) & 0xf; 24733 switch (spec_reg) { 24734 case 0x0: 24735 case 0x1: 24736 case 0x8: { 24737 // VMSR{<c>}{<q>} <spec_reg>, <Rt> ; T1 24738 vmsr(CurrentCond(), 24739 SpecialFPRegister(spec_reg), 24740 Register(rt)); 24741 if (((instr & 0xfff00fff) != 0xeee00a10)) { 24742 UnpredictableT32(instr); 24743 } 24744 break; 24745 } 24746 default: 24747 UnallocatedT32(instr); 24748 break; 24749 } 24750 } else { 24751 UnallocatedT32(instr); 24752 } 24753 break; 24754 } 24755 case 0x00800100: { 24756 // 0xee800b10 24757 switch (instr & 0x00200040) { 24758 case 0x00000000: { 24759 // 0xee800b10 24760 DataType dt = Dt_B_E_1_Decode( 24761 ((instr >> 5) & 0x1) | ((instr >> 21) & 0x2)); 24762 if (dt.Is(kDataTypeValueInvalid)) { 24763 UnallocatedT32(instr); 24764 return; 24765 } 24766 unsigned rd = ExtractDRegister(instr, 7, 16); 24767 unsigned rt = (instr >> 12) & 0xf; 24768 // VDUP{<c>}{<q>}.<dt> <Dd>, <Rt> ; T1 24769 vdup(CurrentCond(), 24770 dt, 24771 DRegister(rd), 24772 Register(rt)); 24773 if (((instr & 0xffb00f5f) != 0xee800b10)) { 24774 UnpredictableT32(instr); 24775 } 24776 break; 24777 } 24778 case 0x00200000: { 24779 // 0xeea00b10 24780 DataType dt = Dt_B_E_1_Decode( 24781 ((instr >> 5) & 0x1) | ((instr >> 21) & 0x2)); 24782 if (dt.Is(kDataTypeValueInvalid)) { 24783 UnallocatedT32(instr); 24784 return; 24785 } 24786 if (((instr >> 16) & 1) != 0) { 24787 UnallocatedT32(instr); 24788 return; 24789 } 24790 unsigned rd = ExtractQRegister(instr, 7, 16); 24791 unsigned rt = (instr >> 12) & 0xf; 24792 // VDUP{<c>}{<q>}.<dt> <Qd>, <Rt> ; T1 24793 vdup(CurrentCond(), 24794 dt, 24795 QRegister(rd), 24796 Register(rt)); 24797 if (((instr & 0xffb00f5f) != 0xeea00b10)) { 24798 UnpredictableT32(instr); 24799 } 24800 break; 24801 } 24802 default: 24803 UnallocatedT32(instr); 24804 break; 24805 } 24806 break; 24807 } 24808 } 24809 break; 24810 } 24811 case 0x00000e00: { 24812 // 0xee000e10 24813 UnimplementedT32_32("MCR", instr); 24814 break; 24815 } 24816 case 0x00100a00: { 24817 // 0xee100a10 24818 switch (instr & 0x00000100) { 24819 case 0x00000000: { 24820 // 0xee100a10 24821 switch (instr & 0x00e00000) { 24822 case 0x00000000: { 24823 // 0xee100a10 24824 unsigned rt = (instr >> 12) & 0xf; 24825 unsigned rn = ExtractSRegister(instr, 7, 16); 24826 // VMOV{<c>}{<q>} <Rt>, <Sn> ; T1 24827 vmov(CurrentCond(), Register(rt), SRegister(rn)); 24828 if (((instr & 0xfff00f7f) != 0xee100a10)) { 24829 UnpredictableT32(instr); 24830 } 24831 break; 24832 } 24833 case 0x00e00000: { 24834 // 0xeef00a10 24835 unsigned rt = (instr >> 12) & 0xf; 24836 unsigned spec_reg = (instr >> 16) & 0xf; 24837 switch (spec_reg) { 24838 case 0x0: 24839 case 0x1: 24840 case 0x5: 24841 case 0x6: 24842 case 0x7: 24843 case 0x8: { 24844 // VMRS{<c>}{<q>} <Rt>, <spec_reg> ; T1 24845 vmrs(CurrentCond(), 24846 RegisterOrAPSR_nzcv(rt), 24847 SpecialFPRegister(spec_reg)); 24848 if (((instr & 0xfff00fff) != 0xeef00a10)) { 24849 UnpredictableT32(instr); 24850 } 24851 break; 24852 } 24853 default: 24854 UnallocatedT32(instr); 24855 break; 24856 } 24857 break; 24858 } 24859 default: 24860 UnallocatedT32(instr); 24861 break; 24862 } 24863 break; 24864 } 24865 case 0x00000100: { 24866 // 0xee100b10 24867 unsigned lane; 24868 DataType dt = 24869 Dt_U_opc1_opc2_1_Decode(((instr >> 5) & 0x3) | 24870 ((instr >> 19) & 24871 0xc) | 24872 ((instr >> 19) & 24873 0x10), 24874 &lane); 24875 if (dt.Is(kDataTypeValueInvalid)) { 24876 UnallocatedT32(instr); 24877 return; 24878 } 24879 unsigned rt = (instr >> 12) & 0xf; 24880 unsigned rn = ExtractDRegister(instr, 7, 16); 24881 // VMOV{<c>}{<q>}{.<dt>} <Rt>, <Dn[x]> ; T1 24882 vmov(CurrentCond(), 24883 dt, 24884 Register(rt), 24885 DRegisterLane(rn, lane)); 24886 if (((instr & 0xff100f1f) != 0xee100b10)) { 24887 UnpredictableT32(instr); 24888 } 24889 break; 24890 } 24891 } 24892 break; 24893 } 24894 case 0x00100e00: { 24895 // 0xee100e10 24896 UnimplementedT32_32("MRC", instr); 24897 break; 24898 } 24899 default: 24900 UnallocatedT32(instr); 24901 break; 24902 } 24903 break; 24904 } 24905 case 0x01000000: { 24906 // 0xef000000 24907 switch (instr & 0x00800000) { 24908 case 0x00000000: { 24909 // 0xef000000 24910 switch (instr & 0x00000f40) { 24911 case 0x00000000: { 24912 // 0xef000000 24913 DataType dt = Dt_U_size_1_Decode( 24914 ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4)); 24915 if (dt.Is(kDataTypeValueInvalid)) { 24916 UnallocatedT32(instr); 24917 return; 24918 } 24919 unsigned rd = ExtractDRegister(instr, 22, 12); 24920 unsigned rn = ExtractDRegister(instr, 7, 16); 24921 unsigned rm = ExtractDRegister(instr, 5, 0); 24922 // VHADD{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1 24923 vhadd(CurrentCond(), 24924 dt, 24925 DRegister(rd), 24926 DRegister(rn), 24927 DRegister(rm)); 24928 break; 24929 } 24930 case 0x00000040: { 24931 // 0xef000040 24932 DataType dt = Dt_U_size_1_Decode( 24933 ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4)); 24934 if (dt.Is(kDataTypeValueInvalid)) { 24935 UnallocatedT32(instr); 24936 return; 24937 } 24938 if (((instr >> 12) & 1) != 0) { 24939 UnallocatedT32(instr); 24940 return; 24941 } 24942 unsigned rd = ExtractQRegister(instr, 22, 12); 24943 if (((instr >> 16) & 1) != 0) { 24944 UnallocatedT32(instr); 24945 return; 24946 } 24947 unsigned rn = ExtractQRegister(instr, 7, 16); 24948 if ((instr & 1) != 0) { 24949 UnallocatedT32(instr); 24950 return; 24951 } 24952 unsigned rm = ExtractQRegister(instr, 5, 0); 24953 // VHADD{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1 24954 vhadd(CurrentCond(), 24955 dt, 24956 QRegister(rd), 24957 QRegister(rn), 24958 QRegister(rm)); 24959 break; 24960 } 24961 case 0x00000100: { 24962 // 0xef000100 24963 DataType dt = Dt_U_size_1_Decode( 24964 ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4)); 24965 if (dt.Is(kDataTypeValueInvalid)) { 24966 UnallocatedT32(instr); 24967 return; 24968 } 24969 unsigned rd = ExtractDRegister(instr, 22, 12); 24970 unsigned rn = ExtractDRegister(instr, 7, 16); 24971 unsigned rm = ExtractDRegister(instr, 5, 0); 24972 // VRHADD{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1 24973 vrhadd(CurrentCond(), 24974 dt, 24975 DRegister(rd), 24976 DRegister(rn), 24977 DRegister(rm)); 24978 break; 24979 } 24980 case 0x00000140: { 24981 // 0xef000140 24982 DataType dt = Dt_U_size_1_Decode( 24983 ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4)); 24984 if (dt.Is(kDataTypeValueInvalid)) { 24985 UnallocatedT32(instr); 24986 return; 24987 } 24988 if (((instr >> 12) & 1) != 0) { 24989 UnallocatedT32(instr); 24990 return; 24991 } 24992 unsigned rd = ExtractQRegister(instr, 22, 12); 24993 if (((instr >> 16) & 1) != 0) { 24994 UnallocatedT32(instr); 24995 return; 24996 } 24997 unsigned rn = ExtractQRegister(instr, 7, 16); 24998 if ((instr & 1) != 0) { 24999 UnallocatedT32(instr); 25000 return; 25001 } 25002 unsigned rm = ExtractQRegister(instr, 5, 0); 25003 // VRHADD{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1 25004 vrhadd(CurrentCond(), 25005 dt, 25006 QRegister(rd), 25007 QRegister(rn), 25008 QRegister(rm)); 25009 break; 25010 } 25011 case 0x00000200: { 25012 // 0xef000200 25013 DataType dt = Dt_U_size_1_Decode( 25014 ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4)); 25015 if (dt.Is(kDataTypeValueInvalid)) { 25016 UnallocatedT32(instr); 25017 return; 25018 } 25019 unsigned rd = ExtractDRegister(instr, 22, 12); 25020 unsigned rn = ExtractDRegister(instr, 7, 16); 25021 unsigned rm = ExtractDRegister(instr, 5, 0); 25022 // VHSUB{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1 25023 vhsub(CurrentCond(), 25024 dt, 25025 DRegister(rd), 25026 DRegister(rn), 25027 DRegister(rm)); 25028 break; 25029 } 25030 case 0x00000240: { 25031 // 0xef000240 25032 DataType dt = Dt_U_size_1_Decode( 25033 ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4)); 25034 if (dt.Is(kDataTypeValueInvalid)) { 25035 UnallocatedT32(instr); 25036 return; 25037 } 25038 if (((instr >> 12) & 1) != 0) { 25039 UnallocatedT32(instr); 25040 return; 25041 } 25042 unsigned rd = ExtractQRegister(instr, 22, 12); 25043 if (((instr >> 16) & 1) != 0) { 25044 UnallocatedT32(instr); 25045 return; 25046 } 25047 unsigned rn = ExtractQRegister(instr, 7, 16); 25048 if ((instr & 1) != 0) { 25049 UnallocatedT32(instr); 25050 return; 25051 } 25052 unsigned rm = ExtractQRegister(instr, 5, 0); 25053 // VHSUB{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1 25054 vhsub(CurrentCond(), 25055 dt, 25056 QRegister(rd), 25057 QRegister(rn), 25058 QRegister(rm)); 25059 break; 25060 } 25061 case 0x00000300: { 25062 // 0xef000300 25063 DataType dt = Dt_U_size_1_Decode( 25064 ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4)); 25065 if (dt.Is(kDataTypeValueInvalid)) { 25066 UnallocatedT32(instr); 25067 return; 25068 } 25069 unsigned rd = ExtractDRegister(instr, 22, 12); 25070 unsigned rn = ExtractDRegister(instr, 7, 16); 25071 unsigned rm = ExtractDRegister(instr, 5, 0); 25072 // VCGT{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1 25073 vcgt(CurrentCond(), 25074 dt, 25075 DRegister(rd), 25076 DRegister(rn), 25077 DRegister(rm)); 25078 break; 25079 } 25080 case 0x00000340: { 25081 // 0xef000340 25082 DataType dt = Dt_U_size_1_Decode( 25083 ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4)); 25084 if (dt.Is(kDataTypeValueInvalid)) { 25085 UnallocatedT32(instr); 25086 return; 25087 } 25088 if (((instr >> 12) & 1) != 0) { 25089 UnallocatedT32(instr); 25090 return; 25091 } 25092 unsigned rd = ExtractQRegister(instr, 22, 12); 25093 if (((instr >> 16) & 1) != 0) { 25094 UnallocatedT32(instr); 25095 return; 25096 } 25097 unsigned rn = ExtractQRegister(instr, 7, 16); 25098 if ((instr & 1) != 0) { 25099 UnallocatedT32(instr); 25100 return; 25101 } 25102 unsigned rm = ExtractQRegister(instr, 5, 0); 25103 // VCGT{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1 25104 vcgt(CurrentCond(), 25105 dt, 25106 QRegister(rd), 25107 QRegister(rn), 25108 QRegister(rm)); 25109 break; 25110 } 25111 case 0x00000400: { 25112 // 0xef000400 25113 DataType dt = Dt_U_size_3_Decode( 25114 ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4)); 25115 if (dt.Is(kDataTypeValueInvalid)) { 25116 UnallocatedT32(instr); 25117 return; 25118 } 25119 unsigned rd = ExtractDRegister(instr, 22, 12); 25120 unsigned rm = ExtractDRegister(instr, 5, 0); 25121 unsigned rn = ExtractDRegister(instr, 7, 16); 25122 // VSHL{<c>}{<q>}.<dt> {<Dd>}, <Dm>, <Dn> ; T1 25123 vshl(CurrentCond(), 25124 dt, 25125 DRegister(rd), 25126 DRegister(rm), 25127 DRegister(rn)); 25128 break; 25129 } 25130 case 0x00000440: { 25131 // 0xef000440 25132 DataType dt = Dt_U_size_3_Decode( 25133 ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4)); 25134 if (dt.Is(kDataTypeValueInvalid)) { 25135 UnallocatedT32(instr); 25136 return; 25137 } 25138 if (((instr >> 12) & 1) != 0) { 25139 UnallocatedT32(instr); 25140 return; 25141 } 25142 unsigned rd = ExtractQRegister(instr, 22, 12); 25143 if ((instr & 1) != 0) { 25144 UnallocatedT32(instr); 25145 return; 25146 } 25147 unsigned rm = ExtractQRegister(instr, 5, 0); 25148 if (((instr >> 16) & 1) != 0) { 25149 UnallocatedT32(instr); 25150 return; 25151 } 25152 unsigned rn = ExtractQRegister(instr, 7, 16); 25153 // VSHL{<c>}{<q>}.<dt> {<Qd>}, <Qm>, <Qn> ; T1 25154 vshl(CurrentCond(), 25155 dt, 25156 QRegister(rd), 25157 QRegister(rm), 25158 QRegister(rn)); 25159 break; 25160 } 25161 case 0x00000500: { 25162 // 0xef000500 25163 DataType dt = Dt_U_size_3_Decode( 25164 ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4)); 25165 if (dt.Is(kDataTypeValueInvalid)) { 25166 UnallocatedT32(instr); 25167 return; 25168 } 25169 unsigned rd = ExtractDRegister(instr, 22, 12); 25170 unsigned rm = ExtractDRegister(instr, 5, 0); 25171 unsigned rn = ExtractDRegister(instr, 7, 16); 25172 // VRSHL{<c>}{<q>}.<dt> {<Dd>}, <Dm>, <Dn> ; T1 25173 vrshl(CurrentCond(), 25174 dt, 25175 DRegister(rd), 25176 DRegister(rm), 25177 DRegister(rn)); 25178 break; 25179 } 25180 case 0x00000540: { 25181 // 0xef000540 25182 DataType dt = Dt_U_size_3_Decode( 25183 ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4)); 25184 if (dt.Is(kDataTypeValueInvalid)) { 25185 UnallocatedT32(instr); 25186 return; 25187 } 25188 if (((instr >> 12) & 1) != 0) { 25189 UnallocatedT32(instr); 25190 return; 25191 } 25192 unsigned rd = ExtractQRegister(instr, 22, 12); 25193 if ((instr & 1) != 0) { 25194 UnallocatedT32(instr); 25195 return; 25196 } 25197 unsigned rm = ExtractQRegister(instr, 5, 0); 25198 if (((instr >> 16) & 1) != 0) { 25199 UnallocatedT32(instr); 25200 return; 25201 } 25202 unsigned rn = ExtractQRegister(instr, 7, 16); 25203 // VRSHL{<c>}{<q>}.<dt> {<Qd>}, <Qm>, <Qn> ; T1 25204 vrshl(CurrentCond(), 25205 dt, 25206 QRegister(rd), 25207 QRegister(rm), 25208 QRegister(rn)); 25209 break; 25210 } 25211 case 0x00000600: { 25212 // 0xef000600 25213 DataType dt = Dt_U_size_1_Decode( 25214 ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4)); 25215 if (dt.Is(kDataTypeValueInvalid)) { 25216 UnallocatedT32(instr); 25217 return; 25218 } 25219 unsigned rd = ExtractDRegister(instr, 22, 12); 25220 unsigned rn = ExtractDRegister(instr, 7, 16); 25221 unsigned rm = ExtractDRegister(instr, 5, 0); 25222 // VMAX{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1 25223 vmax(CurrentCond(), 25224 dt, 25225 DRegister(rd), 25226 DRegister(rn), 25227 DRegister(rm)); 25228 break; 25229 } 25230 case 0x00000640: { 25231 // 0xef000640 25232 DataType dt = Dt_U_size_1_Decode( 25233 ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4)); 25234 if (dt.Is(kDataTypeValueInvalid)) { 25235 UnallocatedT32(instr); 25236 return; 25237 } 25238 if (((instr >> 12) & 1) != 0) { 25239 UnallocatedT32(instr); 25240 return; 25241 } 25242 unsigned rd = ExtractQRegister(instr, 22, 12); 25243 if (((instr >> 16) & 1) != 0) { 25244 UnallocatedT32(instr); 25245 return; 25246 } 25247 unsigned rn = ExtractQRegister(instr, 7, 16); 25248 if ((instr & 1) != 0) { 25249 UnallocatedT32(instr); 25250 return; 25251 } 25252 unsigned rm = ExtractQRegister(instr, 5, 0); 25253 // VMAX{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1 25254 vmax(CurrentCond(), 25255 dt, 25256 QRegister(rd), 25257 QRegister(rn), 25258 QRegister(rm)); 25259 break; 25260 } 25261 case 0x00000700: { 25262 // 0xef000700 25263 DataType dt = Dt_U_size_1_Decode( 25264 ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4)); 25265 if (dt.Is(kDataTypeValueInvalid)) { 25266 UnallocatedT32(instr); 25267 return; 25268 } 25269 unsigned rd = ExtractDRegister(instr, 22, 12); 25270 unsigned rn = ExtractDRegister(instr, 7, 16); 25271 unsigned rm = ExtractDRegister(instr, 5, 0); 25272 // VABD{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1 25273 vabd(CurrentCond(), 25274 dt, 25275 DRegister(rd), 25276 DRegister(rn), 25277 DRegister(rm)); 25278 break; 25279 } 25280 case 0x00000740: { 25281 // 0xef000740 25282 DataType dt = Dt_U_size_1_Decode( 25283 ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4)); 25284 if (dt.Is(kDataTypeValueInvalid)) { 25285 UnallocatedT32(instr); 25286 return; 25287 } 25288 if (((instr >> 12) & 1) != 0) { 25289 UnallocatedT32(instr); 25290 return; 25291 } 25292 unsigned rd = ExtractQRegister(instr, 22, 12); 25293 if (((instr >> 16) & 1) != 0) { 25294 UnallocatedT32(instr); 25295 return; 25296 } 25297 unsigned rn = ExtractQRegister(instr, 7, 16); 25298 if ((instr & 1) != 0) { 25299 UnallocatedT32(instr); 25300 return; 25301 } 25302 unsigned rm = ExtractQRegister(instr, 5, 0); 25303 // VABD{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1 25304 vabd(CurrentCond(), 25305 dt, 25306 QRegister(rd), 25307 QRegister(rn), 25308 QRegister(rm)); 25309 break; 25310 } 25311 case 0x00000800: { 25312 // 0xef000800 25313 switch (instr & 0x10000000) { 25314 case 0x00000000: { 25315 // 0xef000800 25316 DataType dt = 25317 Dt_size_2_Decode((instr >> 20) & 0x3); 25318 if (dt.Is(kDataTypeValueInvalid)) { 25319 UnallocatedT32(instr); 25320 return; 25321 } 25322 unsigned rd = ExtractDRegister(instr, 22, 12); 25323 unsigned rn = ExtractDRegister(instr, 7, 16); 25324 unsigned rm = ExtractDRegister(instr, 5, 0); 25325 // VADD{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1 25326 vadd(CurrentCond(), 25327 dt, 25328 DRegister(rd), 25329 DRegister(rn), 25330 DRegister(rm)); 25331 break; 25332 } 25333 case 0x10000000: { 25334 // 0xff000800 25335 DataType dt = 25336 Dt_size_2_Decode((instr >> 20) & 0x3); 25337 if (dt.Is(kDataTypeValueInvalid)) { 25338 UnallocatedT32(instr); 25339 return; 25340 } 25341 unsigned rd = ExtractDRegister(instr, 22, 12); 25342 unsigned rn = ExtractDRegister(instr, 7, 16); 25343 unsigned rm = ExtractDRegister(instr, 5, 0); 25344 // VSUB{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1 25345 vsub(CurrentCond(), 25346 dt, 25347 DRegister(rd), 25348 DRegister(rn), 25349 DRegister(rm)); 25350 break; 25351 } 25352 } 25353 break; 25354 } 25355 case 0x00000840: { 25356 // 0xef000840 25357 switch (instr & 0x10000000) { 25358 case 0x00000000: { 25359 // 0xef000840 25360 DataType dt = 25361 Dt_size_2_Decode((instr >> 20) & 0x3); 25362 if (dt.Is(kDataTypeValueInvalid)) { 25363 UnallocatedT32(instr); 25364 return; 25365 } 25366 if (((instr >> 12) & 1) != 0) { 25367 UnallocatedT32(instr); 25368 return; 25369 } 25370 unsigned rd = ExtractQRegister(instr, 22, 12); 25371 if (((instr >> 16) & 1) != 0) { 25372 UnallocatedT32(instr); 25373 return; 25374 } 25375 unsigned rn = ExtractQRegister(instr, 7, 16); 25376 if ((instr & 1) != 0) { 25377 UnallocatedT32(instr); 25378 return; 25379 } 25380 unsigned rm = ExtractQRegister(instr, 5, 0); 25381 // VADD{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1 25382 vadd(CurrentCond(), 25383 dt, 25384 QRegister(rd), 25385 QRegister(rn), 25386 QRegister(rm)); 25387 break; 25388 } 25389 case 0x10000000: { 25390 // 0xff000840 25391 DataType dt = 25392 Dt_size_2_Decode((instr >> 20) & 0x3); 25393 if (dt.Is(kDataTypeValueInvalid)) { 25394 UnallocatedT32(instr); 25395 return; 25396 } 25397 if (((instr >> 12) & 1) != 0) { 25398 UnallocatedT32(instr); 25399 return; 25400 } 25401 unsigned rd = ExtractQRegister(instr, 22, 12); 25402 if (((instr >> 16) & 1) != 0) { 25403 UnallocatedT32(instr); 25404 return; 25405 } 25406 unsigned rn = ExtractQRegister(instr, 7, 16); 25407 if ((instr & 1) != 0) { 25408 UnallocatedT32(instr); 25409 return; 25410 } 25411 unsigned rm = ExtractQRegister(instr, 5, 0); 25412 // VSUB{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1 25413 vsub(CurrentCond(), 25414 dt, 25415 QRegister(rd), 25416 QRegister(rn), 25417 QRegister(rm)); 25418 break; 25419 } 25420 } 25421 break; 25422 } 25423 case 0x00000900: { 25424 // 0xef000900 25425 switch (instr & 0x10000000) { 25426 case 0x00000000: { 25427 // 0xef000900 25428 DataType dt = 25429 Dt_size_10_Decode((instr >> 20) & 0x3); 25430 if (dt.Is(kDataTypeValueInvalid)) { 25431 UnallocatedT32(instr); 25432 return; 25433 } 25434 unsigned rd = ExtractDRegister(instr, 22, 12); 25435 unsigned rn = ExtractDRegister(instr, 7, 16); 25436 unsigned rm = ExtractDRegister(instr, 5, 0); 25437 // VMLA{<c>}{<q>}.<type><size> <Dd>, <Dn>, <Dm> ; T1 NOLINT(whitespace/line_length) 25438 vmla(CurrentCond(), 25439 dt, 25440 DRegister(rd), 25441 DRegister(rn), 25442 DRegister(rm)); 25443 break; 25444 } 25445 case 0x10000000: { 25446 // 0xff000900 25447 DataType dt = 25448 Dt_size_10_Decode((instr >> 20) & 0x3); 25449 if (dt.Is(kDataTypeValueInvalid)) { 25450 UnallocatedT32(instr); 25451 return; 25452 } 25453 unsigned rd = ExtractDRegister(instr, 22, 12); 25454 unsigned rn = ExtractDRegister(instr, 7, 16); 25455 unsigned rm = ExtractDRegister(instr, 5, 0); 25456 // VMLS{<c>}{<q>}.<type><size> <Dd>, <Dn>, <Dm> ; T1 NOLINT(whitespace/line_length) 25457 vmls(CurrentCond(), 25458 dt, 25459 DRegister(rd), 25460 DRegister(rn), 25461 DRegister(rm)); 25462 break; 25463 } 25464 } 25465 break; 25466 } 25467 case 0x00000940: { 25468 // 0xef000940 25469 switch (instr & 0x10000000) { 25470 case 0x00000000: { 25471 // 0xef000940 25472 DataType dt = 25473 Dt_size_10_Decode((instr >> 20) & 0x3); 25474 if (dt.Is(kDataTypeValueInvalid)) { 25475 UnallocatedT32(instr); 25476 return; 25477 } 25478 if (((instr >> 12) & 1) != 0) { 25479 UnallocatedT32(instr); 25480 return; 25481 } 25482 unsigned rd = ExtractQRegister(instr, 22, 12); 25483 if (((instr >> 16) & 1) != 0) { 25484 UnallocatedT32(instr); 25485 return; 25486 } 25487 unsigned rn = ExtractQRegister(instr, 7, 16); 25488 if ((instr & 1) != 0) { 25489 UnallocatedT32(instr); 25490 return; 25491 } 25492 unsigned rm = ExtractQRegister(instr, 5, 0); 25493 // VMLA{<c>}{<q>}.<type><size> <Qd>, <Qn>, <Qm> ; T1 NOLINT(whitespace/line_length) 25494 vmla(CurrentCond(), 25495 dt, 25496 QRegister(rd), 25497 QRegister(rn), 25498 QRegister(rm)); 25499 break; 25500 } 25501 case 0x10000000: { 25502 // 0xff000940 25503 DataType dt = 25504 Dt_size_10_Decode((instr >> 20) & 0x3); 25505 if (dt.Is(kDataTypeValueInvalid)) { 25506 UnallocatedT32(instr); 25507 return; 25508 } 25509 if (((instr >> 12) & 1) != 0) { 25510 UnallocatedT32(instr); 25511 return; 25512 } 25513 unsigned rd = ExtractQRegister(instr, 22, 12); 25514 if (((instr >> 16) & 1) != 0) { 25515 UnallocatedT32(instr); 25516 return; 25517 } 25518 unsigned rn = ExtractQRegister(instr, 7, 16); 25519 if ((instr & 1) != 0) { 25520 UnallocatedT32(instr); 25521 return; 25522 } 25523 unsigned rm = ExtractQRegister(instr, 5, 0); 25524 // VMLS{<c>}{<q>}.<type><size> <Qd>, <Qn>, <Qm> ; T1 NOLINT(whitespace/line_length) 25525 vmls(CurrentCond(), 25526 dt, 25527 QRegister(rd), 25528 QRegister(rn), 25529 QRegister(rm)); 25530 break; 25531 } 25532 } 25533 break; 25534 } 25535 case 0x00000a00: { 25536 // 0xef000a00 25537 DataType dt = Dt_U_size_1_Decode( 25538 ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4)); 25539 if (dt.Is(kDataTypeValueInvalid)) { 25540 UnallocatedT32(instr); 25541 return; 25542 } 25543 unsigned rd = ExtractDRegister(instr, 22, 12); 25544 unsigned rn = ExtractDRegister(instr, 7, 16); 25545 unsigned rm = ExtractDRegister(instr, 5, 0); 25546 // VPMAX{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1 25547 vpmax(CurrentCond(), 25548 dt, 25549 DRegister(rd), 25550 DRegister(rn), 25551 DRegister(rm)); 25552 break; 25553 } 25554 case 0x00000b00: { 25555 // 0xef000b00 25556 switch (instr & 0x10000000) { 25557 case 0x00000000: { 25558 // 0xef000b00 25559 DataType dt = 25560 Dt_size_13_Decode((instr >> 20) & 0x3); 25561 if (dt.Is(kDataTypeValueInvalid)) { 25562 UnallocatedT32(instr); 25563 return; 25564 } 25565 unsigned rd = ExtractDRegister(instr, 22, 12); 25566 unsigned rn = ExtractDRegister(instr, 7, 16); 25567 unsigned rm = ExtractDRegister(instr, 5, 0); 25568 // VQDMULH{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1 25569 vqdmulh(CurrentCond(), 25570 dt, 25571 DRegister(rd), 25572 DRegister(rn), 25573 DRegister(rm)); 25574 break; 25575 } 25576 case 0x10000000: { 25577 // 0xff000b00 25578 DataType dt = 25579 Dt_size_13_Decode((instr >> 20) & 0x3); 25580 if (dt.Is(kDataTypeValueInvalid)) { 25581 UnallocatedT32(instr); 25582 return; 25583 } 25584 unsigned rd = ExtractDRegister(instr, 22, 12); 25585 unsigned rn = ExtractDRegister(instr, 7, 16); 25586 unsigned rm = ExtractDRegister(instr, 5, 0); 25587 // VQRDMULH{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1 25588 vqrdmulh(CurrentCond(), 25589 dt, 25590 DRegister(rd), 25591 DRegister(rn), 25592 DRegister(rm)); 25593 break; 25594 } 25595 } 25596 break; 25597 } 25598 case 0x00000b40: { 25599 // 0xef000b40 25600 switch (instr & 0x10000000) { 25601 case 0x00000000: { 25602 // 0xef000b40 25603 DataType dt = 25604 Dt_size_13_Decode((instr >> 20) & 0x3); 25605 if (dt.Is(kDataTypeValueInvalid)) { 25606 UnallocatedT32(instr); 25607 return; 25608 } 25609 if (((instr >> 12) & 1) != 0) { 25610 UnallocatedT32(instr); 25611 return; 25612 } 25613 unsigned rd = ExtractQRegister(instr, 22, 12); 25614 if (((instr >> 16) & 1) != 0) { 25615 UnallocatedT32(instr); 25616 return; 25617 } 25618 unsigned rn = ExtractQRegister(instr, 7, 16); 25619 if ((instr & 1) != 0) { 25620 UnallocatedT32(instr); 25621 return; 25622 } 25623 unsigned rm = ExtractQRegister(instr, 5, 0); 25624 // VQDMULH{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1 25625 vqdmulh(CurrentCond(), 25626 dt, 25627 QRegister(rd), 25628 QRegister(rn), 25629 QRegister(rm)); 25630 break; 25631 } 25632 case 0x10000000: { 25633 // 0xff000b40 25634 DataType dt = 25635 Dt_size_13_Decode((instr >> 20) & 0x3); 25636 if (dt.Is(kDataTypeValueInvalid)) { 25637 UnallocatedT32(instr); 25638 return; 25639 } 25640 if (((instr >> 12) & 1) != 0) { 25641 UnallocatedT32(instr); 25642 return; 25643 } 25644 unsigned rd = ExtractQRegister(instr, 22, 12); 25645 if (((instr >> 16) & 1) != 0) { 25646 UnallocatedT32(instr); 25647 return; 25648 } 25649 unsigned rn = ExtractQRegister(instr, 7, 16); 25650 if ((instr & 1) != 0) { 25651 UnallocatedT32(instr); 25652 return; 25653 } 25654 unsigned rm = ExtractQRegister(instr, 5, 0); 25655 // VQRDMULH{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1 25656 vqrdmulh(CurrentCond(), 25657 dt, 25658 QRegister(rd), 25659 QRegister(rn), 25660 QRegister(rm)); 25661 break; 25662 } 25663 } 25664 break; 25665 } 25666 case 0x00000c40: { 25667 // 0xef000c40 25668 switch (instr & 0x10300000) { 25669 case 0x00000000: { 25670 // 0xef000c40 25671 UnimplementedT32_32("SHA1C", instr); 25672 break; 25673 } 25674 case 0x00100000: { 25675 // 0xef100c40 25676 UnimplementedT32_32("SHA1P", instr); 25677 break; 25678 } 25679 case 0x00200000: { 25680 // 0xef200c40 25681 UnimplementedT32_32("SHA1M", instr); 25682 break; 25683 } 25684 case 0x00300000: { 25685 // 0xef300c40 25686 UnimplementedT32_32("SHA1SU0", instr); 25687 break; 25688 } 25689 case 0x10000000: { 25690 // 0xff000c40 25691 UnimplementedT32_32("SHA256H", instr); 25692 break; 25693 } 25694 case 0x10100000: { 25695 // 0xff100c40 25696 UnimplementedT32_32("SHA256H2", instr); 25697 break; 25698 } 25699 case 0x10200000: { 25700 // 0xff200c40 25701 UnimplementedT32_32("SHA256SU1", instr); 25702 break; 25703 } 25704 default: 25705 UnallocatedT32(instr); 25706 break; 25707 } 25708 break; 25709 } 25710 case 0x00000d00: { 25711 // 0xef000d00 25712 switch (instr & 0x10300000) { 25713 case 0x00000000: { 25714 // 0xef000d00 25715 unsigned rd = ExtractDRegister(instr, 22, 12); 25716 unsigned rn = ExtractDRegister(instr, 7, 16); 25717 unsigned rm = ExtractDRegister(instr, 5, 0); 25718 // VADD{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T1 25719 vadd(CurrentCond(), 25720 F32, 25721 DRegister(rd), 25722 DRegister(rn), 25723 DRegister(rm)); 25724 break; 25725 } 25726 case 0x00200000: { 25727 // 0xef200d00 25728 unsigned rd = ExtractDRegister(instr, 22, 12); 25729 unsigned rn = ExtractDRegister(instr, 7, 16); 25730 unsigned rm = ExtractDRegister(instr, 5, 0); 25731 // VSUB{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T1 25732 vsub(CurrentCond(), 25733 F32, 25734 DRegister(rd), 25735 DRegister(rn), 25736 DRegister(rm)); 25737 break; 25738 } 25739 case 0x10000000: { 25740 // 0xff000d00 25741 unsigned rd = ExtractDRegister(instr, 22, 12); 25742 unsigned rn = ExtractDRegister(instr, 7, 16); 25743 unsigned rm = ExtractDRegister(instr, 5, 0); 25744 // VPADD{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T1 25745 vpadd(CurrentCond(), 25746 F32, 25747 DRegister(rd), 25748 DRegister(rn), 25749 DRegister(rm)); 25750 break; 25751 } 25752 case 0x10200000: { 25753 // 0xff200d00 25754 unsigned rd = ExtractDRegister(instr, 22, 12); 25755 unsigned rn = ExtractDRegister(instr, 7, 16); 25756 unsigned rm = ExtractDRegister(instr, 5, 0); 25757 // VABD{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T1 25758 vabd(CurrentCond(), 25759 F32, 25760 DRegister(rd), 25761 DRegister(rn), 25762 DRegister(rm)); 25763 break; 25764 } 25765 default: 25766 UnallocatedT32(instr); 25767 break; 25768 } 25769 break; 25770 } 25771 case 0x00000d40: { 25772 // 0xef000d40 25773 switch (instr & 0x10300000) { 25774 case 0x00000000: { 25775 // 0xef000d40 25776 if (((instr >> 12) & 1) != 0) { 25777 UnallocatedT32(instr); 25778 return; 25779 } 25780 unsigned rd = ExtractQRegister(instr, 22, 12); 25781 if (((instr >> 16) & 1) != 0) { 25782 UnallocatedT32(instr); 25783 return; 25784 } 25785 unsigned rn = ExtractQRegister(instr, 7, 16); 25786 if ((instr & 1) != 0) { 25787 UnallocatedT32(instr); 25788 return; 25789 } 25790 unsigned rm = ExtractQRegister(instr, 5, 0); 25791 // VADD{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; T1 25792 vadd(CurrentCond(), 25793 F32, 25794 QRegister(rd), 25795 QRegister(rn), 25796 QRegister(rm)); 25797 break; 25798 } 25799 case 0x00200000: { 25800 // 0xef200d40 25801 if (((instr >> 12) & 1) != 0) { 25802 UnallocatedT32(instr); 25803 return; 25804 } 25805 unsigned rd = ExtractQRegister(instr, 22, 12); 25806 if (((instr >> 16) & 1) != 0) { 25807 UnallocatedT32(instr); 25808 return; 25809 } 25810 unsigned rn = ExtractQRegister(instr, 7, 16); 25811 if ((instr & 1) != 0) { 25812 UnallocatedT32(instr); 25813 return; 25814 } 25815 unsigned rm = ExtractQRegister(instr, 5, 0); 25816 // VSUB{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; T1 25817 vsub(CurrentCond(), 25818 F32, 25819 QRegister(rd), 25820 QRegister(rn), 25821 QRegister(rm)); 25822 break; 25823 } 25824 case 0x10200000: { 25825 // 0xff200d40 25826 if (((instr >> 12) & 1) != 0) { 25827 UnallocatedT32(instr); 25828 return; 25829 } 25830 unsigned rd = ExtractQRegister(instr, 22, 12); 25831 if (((instr >> 16) & 1) != 0) { 25832 UnallocatedT32(instr); 25833 return; 25834 } 25835 unsigned rn = ExtractQRegister(instr, 7, 16); 25836 if ((instr & 1) != 0) { 25837 UnallocatedT32(instr); 25838 return; 25839 } 25840 unsigned rm = ExtractQRegister(instr, 5, 0); 25841 // VABD{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; T1 25842 vabd(CurrentCond(), 25843 F32, 25844 QRegister(rd), 25845 QRegister(rn), 25846 QRegister(rm)); 25847 break; 25848 } 25849 default: 25850 UnallocatedT32(instr); 25851 break; 25852 } 25853 break; 25854 } 25855 case 0x00000e00: { 25856 // 0xef000e00 25857 switch (instr & 0x10200000) { 25858 case 0x00000000: { 25859 // 0xef000e00 25860 DataType dt = Dt_sz_1_Decode((instr >> 20) & 0x1); 25861 if (dt.Is(kDataTypeValueInvalid)) { 25862 UnallocatedT32(instr); 25863 return; 25864 } 25865 unsigned rd = ExtractDRegister(instr, 22, 12); 25866 unsigned rn = ExtractDRegister(instr, 7, 16); 25867 unsigned rm = ExtractDRegister(instr, 5, 0); 25868 // VCEQ{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T2 25869 vceq(CurrentCond(), 25870 dt, 25871 DRegister(rd), 25872 DRegister(rn), 25873 DRegister(rm)); 25874 break; 25875 } 25876 case 0x10000000: { 25877 // 0xff000e00 25878 if ((instr & 0x00100000) == 0x00000000) { 25879 unsigned rd = ExtractDRegister(instr, 22, 12); 25880 unsigned rn = ExtractDRegister(instr, 7, 16); 25881 unsigned rm = ExtractDRegister(instr, 5, 0); 25882 // VCGE{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T2 25883 vcge(CurrentCond(), 25884 F32, 25885 DRegister(rd), 25886 DRegister(rn), 25887 DRegister(rm)); 25888 } else { 25889 UnallocatedT32(instr); 25890 } 25891 break; 25892 } 25893 case 0x10200000: { 25894 // 0xff200e00 25895 if ((instr & 0x00100000) == 0x00000000) { 25896 unsigned rd = ExtractDRegister(instr, 22, 12); 25897 unsigned rn = ExtractDRegister(instr, 7, 16); 25898 unsigned rm = ExtractDRegister(instr, 5, 0); 25899 // VCGT{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T2 25900 vcgt(CurrentCond(), 25901 F32, 25902 DRegister(rd), 25903 DRegister(rn), 25904 DRegister(rm)); 25905 } else { 25906 UnallocatedT32(instr); 25907 } 25908 break; 25909 } 25910 default: 25911 UnallocatedT32(instr); 25912 break; 25913 } 25914 break; 25915 } 25916 case 0x00000e40: { 25917 // 0xef000e40 25918 switch (instr & 0x10200000) { 25919 case 0x00000000: { 25920 // 0xef000e40 25921 DataType dt = Dt_sz_1_Decode((instr >> 20) & 0x1); 25922 if (dt.Is(kDataTypeValueInvalid)) { 25923 UnallocatedT32(instr); 25924 return; 25925 } 25926 if (((instr >> 12) & 1) != 0) { 25927 UnallocatedT32(instr); 25928 return; 25929 } 25930 unsigned rd = ExtractQRegister(instr, 22, 12); 25931 if (((instr >> 16) & 1) != 0) { 25932 UnallocatedT32(instr); 25933 return; 25934 } 25935 unsigned rn = ExtractQRegister(instr, 7, 16); 25936 if ((instr & 1) != 0) { 25937 UnallocatedT32(instr); 25938 return; 25939 } 25940 unsigned rm = ExtractQRegister(instr, 5, 0); 25941 // VCEQ{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T2 25942 vceq(CurrentCond(), 25943 dt, 25944 QRegister(rd), 25945 QRegister(rn), 25946 QRegister(rm)); 25947 break; 25948 } 25949 case 0x10000000: { 25950 // 0xff000e40 25951 if ((instr & 0x00100000) == 0x00000000) { 25952 if (((instr >> 12) & 1) != 0) { 25953 UnallocatedT32(instr); 25954 return; 25955 } 25956 unsigned rd = ExtractQRegister(instr, 22, 12); 25957 if (((instr >> 16) & 1) != 0) { 25958 UnallocatedT32(instr); 25959 return; 25960 } 25961 unsigned rn = ExtractQRegister(instr, 7, 16); 25962 if ((instr & 1) != 0) { 25963 UnallocatedT32(instr); 25964 return; 25965 } 25966 unsigned rm = ExtractQRegister(instr, 5, 0); 25967 // VCGE{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; T2 25968 vcge(CurrentCond(), 25969 F32, 25970 QRegister(rd), 25971 QRegister(rn), 25972 QRegister(rm)); 25973 } else { 25974 UnallocatedT32(instr); 25975 } 25976 break; 25977 } 25978 case 0x10200000: { 25979 // 0xff200e40 25980 if ((instr & 0x00100000) == 0x00000000) { 25981 if (((instr >> 12) & 1) != 0) { 25982 UnallocatedT32(instr); 25983 return; 25984 } 25985 unsigned rd = ExtractQRegister(instr, 22, 12); 25986 if (((instr >> 16) & 1) != 0) { 25987 UnallocatedT32(instr); 25988 return; 25989 } 25990 unsigned rn = ExtractQRegister(instr, 7, 16); 25991 if ((instr & 1) != 0) { 25992 UnallocatedT32(instr); 25993 return; 25994 } 25995 unsigned rm = ExtractQRegister(instr, 5, 0); 25996 // VCGT{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; T2 25997 vcgt(CurrentCond(), 25998 F32, 25999 QRegister(rd), 26000 QRegister(rn), 26001 QRegister(rm)); 26002 } else { 26003 UnallocatedT32(instr); 26004 } 26005 break; 26006 } 26007 default: 26008 UnallocatedT32(instr); 26009 break; 26010 } 26011 break; 26012 } 26013 case 0x00000f00: { 26014 // 0xef000f00 26015 switch (instr & 0x10300000) { 26016 case 0x00000000: { 26017 // 0xef000f00 26018 unsigned rd = ExtractDRegister(instr, 22, 12); 26019 unsigned rn = ExtractDRegister(instr, 7, 16); 26020 unsigned rm = ExtractDRegister(instr, 5, 0); 26021 // VMAX{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T1 26022 vmax(CurrentCond(), 26023 F32, 26024 DRegister(rd), 26025 DRegister(rn), 26026 DRegister(rm)); 26027 break; 26028 } 26029 case 0x00200000: { 26030 // 0xef200f00 26031 unsigned rd = ExtractDRegister(instr, 22, 12); 26032 unsigned rn = ExtractDRegister(instr, 7, 16); 26033 unsigned rm = ExtractDRegister(instr, 5, 0); 26034 // VMIN{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T1 26035 vmin(CurrentCond(), 26036 F32, 26037 DRegister(rd), 26038 DRegister(rn), 26039 DRegister(rm)); 26040 break; 26041 } 26042 case 0x10000000: { 26043 // 0xff000f00 26044 unsigned rd = ExtractDRegister(instr, 22, 12); 26045 unsigned rn = ExtractDRegister(instr, 7, 16); 26046 unsigned rm = ExtractDRegister(instr, 5, 0); 26047 // VPMAX{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T1 26048 vpmax(CurrentCond(), 26049 F32, 26050 DRegister(rd), 26051 DRegister(rn), 26052 DRegister(rm)); 26053 break; 26054 } 26055 case 0x10200000: { 26056 // 0xff200f00 26057 unsigned rd = ExtractDRegister(instr, 22, 12); 26058 unsigned rn = ExtractDRegister(instr, 7, 16); 26059 unsigned rm = ExtractDRegister(instr, 5, 0); 26060 // VPMIN{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T1 26061 vpmin(CurrentCond(), 26062 F32, 26063 DRegister(rd), 26064 DRegister(rn), 26065 DRegister(rm)); 26066 break; 26067 } 26068 default: 26069 UnallocatedT32(instr); 26070 break; 26071 } 26072 break; 26073 } 26074 case 0x00000f40: { 26075 // 0xef000f40 26076 switch (instr & 0x10300000) { 26077 case 0x00000000: { 26078 // 0xef000f40 26079 if (((instr >> 12) & 1) != 0) { 26080 UnallocatedT32(instr); 26081 return; 26082 } 26083 unsigned rd = ExtractQRegister(instr, 22, 12); 26084 if (((instr >> 16) & 1) != 0) { 26085 UnallocatedT32(instr); 26086 return; 26087 } 26088 unsigned rn = ExtractQRegister(instr, 7, 16); 26089 if ((instr & 1) != 0) { 26090 UnallocatedT32(instr); 26091 return; 26092 } 26093 unsigned rm = ExtractQRegister(instr, 5, 0); 26094 // VMAX{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; T1 26095 vmax(CurrentCond(), 26096 F32, 26097 QRegister(rd), 26098 QRegister(rn), 26099 QRegister(rm)); 26100 break; 26101 } 26102 case 0x00200000: { 26103 // 0xef200f40 26104 if (((instr >> 12) & 1) != 0) { 26105 UnallocatedT32(instr); 26106 return; 26107 } 26108 unsigned rd = ExtractQRegister(instr, 22, 12); 26109 if (((instr >> 16) & 1) != 0) { 26110 UnallocatedT32(instr); 26111 return; 26112 } 26113 unsigned rn = ExtractQRegister(instr, 7, 16); 26114 if ((instr & 1) != 0) { 26115 UnallocatedT32(instr); 26116 return; 26117 } 26118 unsigned rm = ExtractQRegister(instr, 5, 0); 26119 // VMIN{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; T1 26120 vmin(CurrentCond(), 26121 F32, 26122 QRegister(rd), 26123 QRegister(rn), 26124 QRegister(rm)); 26125 break; 26126 } 26127 default: 26128 UnallocatedT32(instr); 26129 break; 26130 } 26131 break; 26132 } 26133 default: 26134 UnallocatedT32(instr); 26135 break; 26136 } 26137 break; 26138 } 26139 case 0x00800000: { 26140 // 0xef800000 26141 switch (instr & 0x00300000) { 26142 case 0x00300000: { 26143 // 0xefb00000 26144 switch (instr & 0x10000000) { 26145 case 0x00000000: { 26146 // 0xefb00000 26147 switch (instr & 0x00000040) { 26148 case 0x00000000: { 26149 // 0xefb00000 26150 if (((instr & 0x800) == 0x800)) { 26151 UnallocatedT32(instr); 26152 return; 26153 } 26154 unsigned rd = ExtractDRegister(instr, 22, 12); 26155 unsigned rn = ExtractDRegister(instr, 7, 16); 26156 unsigned rm = ExtractDRegister(instr, 5, 0); 26157 uint32_t imm = (instr >> 8) & 0xf; 26158 // VEXT{<c>}{<q>}.8 {<Dd>}, <Dn>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length) 26159 vext(CurrentCond(), 26160 Untyped8, 26161 DRegister(rd), 26162 DRegister(rn), 26163 DRegister(rm), 26164 imm); 26165 break; 26166 } 26167 case 0x00000040: { 26168 // 0xefb00040 26169 if (((instr >> 12) & 1) != 0) { 26170 UnallocatedT32(instr); 26171 return; 26172 } 26173 unsigned rd = ExtractQRegister(instr, 22, 12); 26174 if (((instr >> 16) & 1) != 0) { 26175 UnallocatedT32(instr); 26176 return; 26177 } 26178 unsigned rn = ExtractQRegister(instr, 7, 16); 26179 if ((instr & 1) != 0) { 26180 UnallocatedT32(instr); 26181 return; 26182 } 26183 unsigned rm = ExtractQRegister(instr, 5, 0); 26184 uint32_t imm = (instr >> 8) & 0xf; 26185 // VEXT{<c>}{<q>}.8 {<Qd>}, <Qn>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length) 26186 vext(CurrentCond(), 26187 Untyped8, 26188 QRegister(rd), 26189 QRegister(rn), 26190 QRegister(rm), 26191 imm); 26192 break; 26193 } 26194 } 26195 break; 26196 } 26197 case 0x10000000: { 26198 // 0xffb00000 26199 switch (instr & 0x00000800) { 26200 case 0x00000000: { 26201 // 0xffb00000 26202 switch (instr & 0x00030200) { 26203 case 0x00000000: { 26204 // 0xffb00000 26205 switch (instr & 0x000005c0) { 26206 case 0x00000000: { 26207 // 0xffb00000 26208 DataType dt = Dt_size_7_Decode( 26209 (instr >> 18) & 0x3); 26210 if (dt.Is(kDataTypeValueInvalid)) { 26211 UnallocatedT32(instr); 26212 return; 26213 } 26214 unsigned rd = 26215 ExtractDRegister(instr, 22, 12); 26216 unsigned rm = 26217 ExtractDRegister(instr, 5, 0); 26218 // VREV64{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length) 26219 vrev64(CurrentCond(), 26220 dt, 26221 DRegister(rd), 26222 DRegister(rm)); 26223 break; 26224 } 26225 case 0x00000040: { 26226 // 0xffb00040 26227 DataType dt = Dt_size_7_Decode( 26228 (instr >> 18) & 0x3); 26229 if (dt.Is(kDataTypeValueInvalid)) { 26230 UnallocatedT32(instr); 26231 return; 26232 } 26233 if (((instr >> 12) & 1) != 0) { 26234 UnallocatedT32(instr); 26235 return; 26236 } 26237 unsigned rd = 26238 ExtractQRegister(instr, 22, 12); 26239 if ((instr & 1) != 0) { 26240 UnallocatedT32(instr); 26241 return; 26242 } 26243 unsigned rm = 26244 ExtractQRegister(instr, 5, 0); 26245 // VREV64{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length) 26246 vrev64(CurrentCond(), 26247 dt, 26248 QRegister(rd), 26249 QRegister(rm)); 26250 break; 26251 } 26252 case 0x00000080: { 26253 // 0xffb00080 26254 DataType dt = Dt_size_15_Decode( 26255 (instr >> 18) & 0x3); 26256 if (dt.Is(kDataTypeValueInvalid)) { 26257 UnallocatedT32(instr); 26258 return; 26259 } 26260 unsigned rd = 26261 ExtractDRegister(instr, 22, 12); 26262 unsigned rm = 26263 ExtractDRegister(instr, 5, 0); 26264 // VREV32{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length) 26265 vrev32(CurrentCond(), 26266 dt, 26267 DRegister(rd), 26268 DRegister(rm)); 26269 break; 26270 } 26271 case 0x000000c0: { 26272 // 0xffb000c0 26273 DataType dt = Dt_size_15_Decode( 26274 (instr >> 18) & 0x3); 26275 if (dt.Is(kDataTypeValueInvalid)) { 26276 UnallocatedT32(instr); 26277 return; 26278 } 26279 if (((instr >> 12) & 1) != 0) { 26280 UnallocatedT32(instr); 26281 return; 26282 } 26283 unsigned rd = 26284 ExtractQRegister(instr, 22, 12); 26285 if ((instr & 1) != 0) { 26286 UnallocatedT32(instr); 26287 return; 26288 } 26289 unsigned rm = 26290 ExtractQRegister(instr, 5, 0); 26291 // VREV32{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length) 26292 vrev32(CurrentCond(), 26293 dt, 26294 QRegister(rd), 26295 QRegister(rm)); 26296 break; 26297 } 26298 case 0x00000100: { 26299 // 0xffb00100 26300 DataType dt = Dt_size_1_Decode( 26301 (instr >> 18) & 0x3); 26302 if (dt.Is(kDataTypeValueInvalid)) { 26303 UnallocatedT32(instr); 26304 return; 26305 } 26306 unsigned rd = 26307 ExtractDRegister(instr, 22, 12); 26308 unsigned rm = 26309 ExtractDRegister(instr, 5, 0); 26310 // VREV16{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length) 26311 vrev16(CurrentCond(), 26312 dt, 26313 DRegister(rd), 26314 DRegister(rm)); 26315 break; 26316 } 26317 case 0x00000140: { 26318 // 0xffb00140 26319 DataType dt = Dt_size_1_Decode( 26320 (instr >> 18) & 0x3); 26321 if (dt.Is(kDataTypeValueInvalid)) { 26322 UnallocatedT32(instr); 26323 return; 26324 } 26325 if (((instr >> 12) & 1) != 0) { 26326 UnallocatedT32(instr); 26327 return; 26328 } 26329 unsigned rd = 26330 ExtractQRegister(instr, 22, 12); 26331 if ((instr & 1) != 0) { 26332 UnallocatedT32(instr); 26333 return; 26334 } 26335 unsigned rm = 26336 ExtractQRegister(instr, 5, 0); 26337 // VREV16{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length) 26338 vrev16(CurrentCond(), 26339 dt, 26340 QRegister(rd), 26341 QRegister(rm)); 26342 break; 26343 } 26344 case 0x00000400: { 26345 // 0xffb00400 26346 DataType dt = Dt_size_5_Decode( 26347 (instr >> 18) & 0x3); 26348 if (dt.Is(kDataTypeValueInvalid)) { 26349 UnallocatedT32(instr); 26350 return; 26351 } 26352 unsigned rd = 26353 ExtractDRegister(instr, 22, 12); 26354 unsigned rm = 26355 ExtractDRegister(instr, 5, 0); 26356 // VCLS{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1 26357 vcls(CurrentCond(), 26358 dt, 26359 DRegister(rd), 26360 DRegister(rm)); 26361 break; 26362 } 26363 case 0x00000440: { 26364 // 0xffb00440 26365 DataType dt = Dt_size_5_Decode( 26366 (instr >> 18) & 0x3); 26367 if (dt.Is(kDataTypeValueInvalid)) { 26368 UnallocatedT32(instr); 26369 return; 26370 } 26371 if (((instr >> 12) & 1) != 0) { 26372 UnallocatedT32(instr); 26373 return; 26374 } 26375 unsigned rd = 26376 ExtractQRegister(instr, 22, 12); 26377 if ((instr & 1) != 0) { 26378 UnallocatedT32(instr); 26379 return; 26380 } 26381 unsigned rm = 26382 ExtractQRegister(instr, 5, 0); 26383 // VCLS{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1 26384 vcls(CurrentCond(), 26385 dt, 26386 QRegister(rd), 26387 QRegister(rm)); 26388 break; 26389 } 26390 case 0x00000480: { 26391 // 0xffb00480 26392 DataType dt = Dt_size_4_Decode( 26393 (instr >> 18) & 0x3); 26394 if (dt.Is(kDataTypeValueInvalid)) { 26395 UnallocatedT32(instr); 26396 return; 26397 } 26398 unsigned rd = 26399 ExtractDRegister(instr, 22, 12); 26400 unsigned rm = 26401 ExtractDRegister(instr, 5, 0); 26402 // VCLZ{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1 26403 vclz(CurrentCond(), 26404 dt, 26405 DRegister(rd), 26406 DRegister(rm)); 26407 break; 26408 } 26409 case 0x000004c0: { 26410 // 0xffb004c0 26411 DataType dt = Dt_size_4_Decode( 26412 (instr >> 18) & 0x3); 26413 if (dt.Is(kDataTypeValueInvalid)) { 26414 UnallocatedT32(instr); 26415 return; 26416 } 26417 if (((instr >> 12) & 1) != 0) { 26418 UnallocatedT32(instr); 26419 return; 26420 } 26421 unsigned rd = 26422 ExtractQRegister(instr, 22, 12); 26423 if ((instr & 1) != 0) { 26424 UnallocatedT32(instr); 26425 return; 26426 } 26427 unsigned rm = 26428 ExtractQRegister(instr, 5, 0); 26429 // VCLZ{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1 26430 vclz(CurrentCond(), 26431 dt, 26432 QRegister(rd), 26433 QRegister(rm)); 26434 break; 26435 } 26436 case 0x00000500: { 26437 // 0xffb00500 26438 if ((instr & 0x000c0000) == 26439 0x00000000) { 26440 unsigned rd = 26441 ExtractDRegister(instr, 22, 12); 26442 unsigned rm = 26443 ExtractDRegister(instr, 5, 0); 26444 // VCNT{<c>}{<q>}.8 <Dd>, <Dm> ; T1 26445 vcnt(CurrentCond(), 26446 Untyped8, 26447 DRegister(rd), 26448 DRegister(rm)); 26449 } else { 26450 UnallocatedT32(instr); 26451 } 26452 break; 26453 } 26454 case 0x00000540: { 26455 // 0xffb00540 26456 if ((instr & 0x000c0000) == 26457 0x00000000) { 26458 if (((instr >> 12) & 1) != 0) { 26459 UnallocatedT32(instr); 26460 return; 26461 } 26462 unsigned rd = 26463 ExtractQRegister(instr, 22, 12); 26464 if ((instr & 1) != 0) { 26465 UnallocatedT32(instr); 26466 return; 26467 } 26468 unsigned rm = 26469 ExtractQRegister(instr, 5, 0); 26470 // VCNT{<c>}{<q>}.8 <Qd>, <Qm> ; T1 26471 vcnt(CurrentCond(), 26472 Untyped8, 26473 QRegister(rd), 26474 QRegister(rm)); 26475 } else { 26476 UnallocatedT32(instr); 26477 } 26478 break; 26479 } 26480 case 0x00000580: { 26481 // 0xffb00580 26482 if ((instr & 0x000c0000) == 26483 0x00000000) { 26484 unsigned rd = 26485 ExtractDRegister(instr, 22, 12); 26486 unsigned rm = 26487 ExtractDRegister(instr, 5, 0); 26488 // VMVN{<c>}{<q>}{.<dt>} <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length) 26489 vmvn(CurrentCond(), 26490 kDataTypeValueNone, 26491 DRegister(rd), 26492 DRegister(rm)); 26493 } else { 26494 UnallocatedT32(instr); 26495 } 26496 break; 26497 } 26498 case 0x000005c0: { 26499 // 0xffb005c0 26500 if ((instr & 0x000c0000) == 26501 0x00000000) { 26502 if (((instr >> 12) & 1) != 0) { 26503 UnallocatedT32(instr); 26504 return; 26505 } 26506 unsigned rd = 26507 ExtractQRegister(instr, 22, 12); 26508 if ((instr & 1) != 0) { 26509 UnallocatedT32(instr); 26510 return; 26511 } 26512 unsigned rm = 26513 ExtractQRegister(instr, 5, 0); 26514 // VMVN{<c>}{<q>}{.<dt>} <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length) 26515 vmvn(CurrentCond(), 26516 kDataTypeValueNone, 26517 QRegister(rd), 26518 QRegister(rm)); 26519 } else { 26520 UnallocatedT32(instr); 26521 } 26522 break; 26523 } 26524 default: 26525 UnallocatedT32(instr); 26526 break; 26527 } 26528 break; 26529 } 26530 case 0x00000200: { 26531 // 0xffb00200 26532 switch (instr & 0x00000540) { 26533 case 0x00000000: { 26534 // 0xffb00200 26535 DataType dt = Dt_op_size_2_Decode( 26536 ((instr >> 18) & 0x3) | 26537 ((instr >> 5) & 0x4)); 26538 if (dt.Is(kDataTypeValueInvalid)) { 26539 UnallocatedT32(instr); 26540 return; 26541 } 26542 unsigned rd = 26543 ExtractDRegister(instr, 22, 12); 26544 unsigned rm = 26545 ExtractDRegister(instr, 5, 0); 26546 // VPADDL{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length) 26547 vpaddl(CurrentCond(), 26548 dt, 26549 DRegister(rd), 26550 DRegister(rm)); 26551 break; 26552 } 26553 case 0x00000040: { 26554 // 0xffb00240 26555 DataType dt = Dt_op_size_2_Decode( 26556 ((instr >> 18) & 0x3) | 26557 ((instr >> 5) & 0x4)); 26558 if (dt.Is(kDataTypeValueInvalid)) { 26559 UnallocatedT32(instr); 26560 return; 26561 } 26562 if (((instr >> 12) & 1) != 0) { 26563 UnallocatedT32(instr); 26564 return; 26565 } 26566 unsigned rd = 26567 ExtractQRegister(instr, 22, 12); 26568 if ((instr & 1) != 0) { 26569 UnallocatedT32(instr); 26570 return; 26571 } 26572 unsigned rm = 26573 ExtractQRegister(instr, 5, 0); 26574 // VPADDL{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length) 26575 vpaddl(CurrentCond(), 26576 dt, 26577 QRegister(rd), 26578 QRegister(rm)); 26579 break; 26580 } 26581 case 0x00000100: { 26582 // 0xffb00300 26583 switch (instr & 0x00000080) { 26584 case 0x00000000: { 26585 // 0xffb00300 26586 UnimplementedT32_32("AESE", 26587 instr); 26588 break; 26589 } 26590 case 0x00000080: { 26591 // 0xffb00380 26592 UnimplementedT32_32("AESMC", 26593 instr); 26594 break; 26595 } 26596 } 26597 break; 26598 } 26599 case 0x00000140: { 26600 // 0xffb00340 26601 switch (instr & 0x00000080) { 26602 case 0x00000000: { 26603 // 0xffb00340 26604 UnimplementedT32_32("AESD", 26605 instr); 26606 break; 26607 } 26608 case 0x00000080: { 26609 // 0xffb003c0 26610 UnimplementedT32_32("AESIMC", 26611 instr); 26612 break; 26613 } 26614 } 26615 break; 26616 } 26617 case 0x00000400: { 26618 // 0xffb00600 26619 DataType dt = Dt_op_size_2_Decode( 26620 ((instr >> 18) & 0x3) | 26621 ((instr >> 5) & 0x4)); 26622 if (dt.Is(kDataTypeValueInvalid)) { 26623 UnallocatedT32(instr); 26624 return; 26625 } 26626 unsigned rd = 26627 ExtractDRegister(instr, 22, 12); 26628 unsigned rm = 26629 ExtractDRegister(instr, 5, 0); 26630 // VPADAL{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length) 26631 vpadal(CurrentCond(), 26632 dt, 26633 DRegister(rd), 26634 DRegister(rm)); 26635 break; 26636 } 26637 case 0x00000440: { 26638 // 0xffb00640 26639 DataType dt = Dt_op_size_2_Decode( 26640 ((instr >> 18) & 0x3) | 26641 ((instr >> 5) & 0x4)); 26642 if (dt.Is(kDataTypeValueInvalid)) { 26643 UnallocatedT32(instr); 26644 return; 26645 } 26646 if (((instr >> 12) & 1) != 0) { 26647 UnallocatedT32(instr); 26648 return; 26649 } 26650 unsigned rd = 26651 ExtractQRegister(instr, 22, 12); 26652 if ((instr & 1) != 0) { 26653 UnallocatedT32(instr); 26654 return; 26655 } 26656 unsigned rm = 26657 ExtractQRegister(instr, 5, 0); 26658 // VPADAL{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length) 26659 vpadal(CurrentCond(), 26660 dt, 26661 QRegister(rd), 26662 QRegister(rm)); 26663 break; 26664 } 26665 case 0x00000500: { 26666 // 0xffb00700 26667 switch (instr & 0x00000080) { 26668 case 0x00000000: { 26669 // 0xffb00700 26670 DataType dt = Dt_size_5_Decode( 26671 (instr >> 18) & 0x3); 26672 if (dt.Is( 26673 kDataTypeValueInvalid)) { 26674 UnallocatedT32(instr); 26675 return; 26676 } 26677 unsigned rd = 26678 ExtractDRegister(instr, 26679 22, 26680 12); 26681 unsigned rm = 26682 ExtractDRegister(instr, 5, 0); 26683 // VQABS{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length) 26684 vqabs(CurrentCond(), 26685 dt, 26686 DRegister(rd), 26687 DRegister(rm)); 26688 break; 26689 } 26690 case 0x00000080: { 26691 // 0xffb00780 26692 DataType dt = Dt_size_5_Decode( 26693 (instr >> 18) & 0x3); 26694 if (dt.Is( 26695 kDataTypeValueInvalid)) { 26696 UnallocatedT32(instr); 26697 return; 26698 } 26699 unsigned rd = 26700 ExtractDRegister(instr, 26701 22, 26702 12); 26703 unsigned rm = 26704 ExtractDRegister(instr, 5, 0); 26705 // VQNEG{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length) 26706 vqneg(CurrentCond(), 26707 dt, 26708 DRegister(rd), 26709 DRegister(rm)); 26710 break; 26711 } 26712 } 26713 break; 26714 } 26715 case 0x00000540: { 26716 // 0xffb00740 26717 switch (instr & 0x00000080) { 26718 case 0x00000000: { 26719 // 0xffb00740 26720 DataType dt = Dt_size_5_Decode( 26721 (instr >> 18) & 0x3); 26722 if (dt.Is( 26723 kDataTypeValueInvalid)) { 26724 UnallocatedT32(instr); 26725 return; 26726 } 26727 if (((instr >> 12) & 1) != 0) { 26728 UnallocatedT32(instr); 26729 return; 26730 } 26731 unsigned rd = 26732 ExtractQRegister(instr, 26733 22, 26734 12); 26735 if ((instr & 1) != 0) { 26736 UnallocatedT32(instr); 26737 return; 26738 } 26739 unsigned rm = 26740 ExtractQRegister(instr, 5, 0); 26741 // VQABS{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length) 26742 vqabs(CurrentCond(), 26743 dt, 26744 QRegister(rd), 26745 QRegister(rm)); 26746 break; 26747 } 26748 case 0x00000080: { 26749 // 0xffb007c0 26750 DataType dt = Dt_size_5_Decode( 26751 (instr >> 18) & 0x3); 26752 if (dt.Is( 26753 kDataTypeValueInvalid)) { 26754 UnallocatedT32(instr); 26755 return; 26756 } 26757 if (((instr >> 12) & 1) != 0) { 26758 UnallocatedT32(instr); 26759 return; 26760 } 26761 unsigned rd = 26762 ExtractQRegister(instr, 26763 22, 26764 12); 26765 if ((instr & 1) != 0) { 26766 UnallocatedT32(instr); 26767 return; 26768 } 26769 unsigned rm = 26770 ExtractQRegister(instr, 5, 0); 26771 // VQNEG{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length) 26772 vqneg(CurrentCond(), 26773 dt, 26774 QRegister(rd), 26775 QRegister(rm)); 26776 break; 26777 } 26778 } 26779 break; 26780 } 26781 } 26782 break; 26783 } 26784 case 0x00010000: { 26785 // 0xffb10000 26786 switch (instr & 0x000001c0) { 26787 case 0x00000000: { 26788 // 0xffb10000 26789 DataType dt = Dt_F_size_1_Decode( 26790 ((instr >> 18) & 0x3) | 26791 ((instr >> 8) & 0x4)); 26792 if (dt.Is(kDataTypeValueInvalid)) { 26793 UnallocatedT32(instr); 26794 return; 26795 } 26796 unsigned rd = 26797 ExtractDRegister(instr, 22, 12); 26798 unsigned rm = 26799 ExtractDRegister(instr, 5, 0); 26800 // VCGT{<c>}{<q>}.<dt> {<Dd>}, <Dm>, #0 ; T1 NOLINT(whitespace/line_length) 26801 vcgt(CurrentCond(), 26802 dt, 26803 DRegister(rd), 26804 DRegister(rm), 26805 UINT32_C(0)); 26806 break; 26807 } 26808 case 0x00000040: { 26809 // 0xffb10040 26810 DataType dt = Dt_F_size_1_Decode( 26811 ((instr >> 18) & 0x3) | 26812 ((instr >> 8) & 0x4)); 26813 if (dt.Is(kDataTypeValueInvalid)) { 26814 UnallocatedT32(instr); 26815 return; 26816 } 26817 if (((instr >> 12) & 1) != 0) { 26818 UnallocatedT32(instr); 26819 return; 26820 } 26821 unsigned rd = 26822 ExtractQRegister(instr, 22, 12); 26823 if ((instr & 1) != 0) { 26824 UnallocatedT32(instr); 26825 return; 26826 } 26827 unsigned rm = 26828 ExtractQRegister(instr, 5, 0); 26829 // VCGT{<c>}{<q>}.<dt> {<Qd>}, <Qm>, #0 ; T1 NOLINT(whitespace/line_length) 26830 vcgt(CurrentCond(), 26831 dt, 26832 QRegister(rd), 26833 QRegister(rm), 26834 UINT32_C(0)); 26835 break; 26836 } 26837 case 0x00000080: { 26838 // 0xffb10080 26839 DataType dt = Dt_F_size_1_Decode( 26840 ((instr >> 18) & 0x3) | 26841 ((instr >> 8) & 0x4)); 26842 if (dt.Is(kDataTypeValueInvalid)) { 26843 UnallocatedT32(instr); 26844 return; 26845 } 26846 unsigned rd = 26847 ExtractDRegister(instr, 22, 12); 26848 unsigned rm = 26849 ExtractDRegister(instr, 5, 0); 26850 // VCGE{<c>}{<q>}.<dt> {<Dd>}, <Dm>, #0 ; T1 NOLINT(whitespace/line_length) 26851 vcge(CurrentCond(), 26852 dt, 26853 DRegister(rd), 26854 DRegister(rm), 26855 UINT32_C(0)); 26856 break; 26857 } 26858 case 0x000000c0: { 26859 // 0xffb100c0 26860 DataType dt = Dt_F_size_1_Decode( 26861 ((instr >> 18) & 0x3) | 26862 ((instr >> 8) & 0x4)); 26863 if (dt.Is(kDataTypeValueInvalid)) { 26864 UnallocatedT32(instr); 26865 return; 26866 } 26867 if (((instr >> 12) & 1) != 0) { 26868 UnallocatedT32(instr); 26869 return; 26870 } 26871 unsigned rd = 26872 ExtractQRegister(instr, 22, 12); 26873 if ((instr & 1) != 0) { 26874 UnallocatedT32(instr); 26875 return; 26876 } 26877 unsigned rm = 26878 ExtractQRegister(instr, 5, 0); 26879 // VCGE{<c>}{<q>}.<dt> {<Qd>}, <Qm>, #0 ; T1 NOLINT(whitespace/line_length) 26880 vcge(CurrentCond(), 26881 dt, 26882 QRegister(rd), 26883 QRegister(rm), 26884 UINT32_C(0)); 26885 break; 26886 } 26887 case 0x00000100: { 26888 // 0xffb10100 26889 DataType dt = Dt_F_size_2_Decode( 26890 ((instr >> 18) & 0x3) | 26891 ((instr >> 8) & 0x4)); 26892 if (dt.Is(kDataTypeValueInvalid)) { 26893 UnallocatedT32(instr); 26894 return; 26895 } 26896 unsigned rd = 26897 ExtractDRegister(instr, 22, 12); 26898 unsigned rm = 26899 ExtractDRegister(instr, 5, 0); 26900 // VCEQ{<c>}{<q>}.<dt> {<Dd>}, <Dm>, #0 ; T1 NOLINT(whitespace/line_length) 26901 vceq(CurrentCond(), 26902 dt, 26903 DRegister(rd), 26904 DRegister(rm), 26905 UINT32_C(0)); 26906 break; 26907 } 26908 case 0x00000140: { 26909 // 0xffb10140 26910 DataType dt = Dt_F_size_2_Decode( 26911 ((instr >> 18) & 0x3) | 26912 ((instr >> 8) & 0x4)); 26913 if (dt.Is(kDataTypeValueInvalid)) { 26914 UnallocatedT32(instr); 26915 return; 26916 } 26917 if (((instr >> 12) & 1) != 0) { 26918 UnallocatedT32(instr); 26919 return; 26920 } 26921 unsigned rd = 26922 ExtractQRegister(instr, 22, 12); 26923 if ((instr & 1) != 0) { 26924 UnallocatedT32(instr); 26925 return; 26926 } 26927 unsigned rm = 26928 ExtractQRegister(instr, 5, 0); 26929 // VCEQ{<c>}{<q>}.<dt> {<Qd>}, <Qm>, #0 ; T1 NOLINT(whitespace/line_length) 26930 vceq(CurrentCond(), 26931 dt, 26932 QRegister(rd), 26933 QRegister(rm), 26934 UINT32_C(0)); 26935 break; 26936 } 26937 case 0x00000180: { 26938 // 0xffb10180 26939 DataType dt = Dt_F_size_1_Decode( 26940 ((instr >> 18) & 0x3) | 26941 ((instr >> 8) & 0x4)); 26942 if (dt.Is(kDataTypeValueInvalid)) { 26943 UnallocatedT32(instr); 26944 return; 26945 } 26946 unsigned rd = 26947 ExtractDRegister(instr, 22, 12); 26948 unsigned rm = 26949 ExtractDRegister(instr, 5, 0); 26950 // VCLE{<c>}{<q>}.<dt> {<Dd>}, <Dm>, #0 ; T1 NOLINT(whitespace/line_length) 26951 vcle(CurrentCond(), 26952 dt, 26953 DRegister(rd), 26954 DRegister(rm), 26955 UINT32_C(0)); 26956 break; 26957 } 26958 case 0x000001c0: { 26959 // 0xffb101c0 26960 DataType dt = Dt_F_size_1_Decode( 26961 ((instr >> 18) & 0x3) | 26962 ((instr >> 8) & 0x4)); 26963 if (dt.Is(kDataTypeValueInvalid)) { 26964 UnallocatedT32(instr); 26965 return; 26966 } 26967 if (((instr >> 12) & 1) != 0) { 26968 UnallocatedT32(instr); 26969 return; 26970 } 26971 unsigned rd = 26972 ExtractQRegister(instr, 22, 12); 26973 if ((instr & 1) != 0) { 26974 UnallocatedT32(instr); 26975 return; 26976 } 26977 unsigned rm = 26978 ExtractQRegister(instr, 5, 0); 26979 // VCLE{<c>}{<q>}.<dt> {<Qd>}, <Qm>, #0 ; T1 NOLINT(whitespace/line_length) 26980 vcle(CurrentCond(), 26981 dt, 26982 QRegister(rd), 26983 QRegister(rm), 26984 UINT32_C(0)); 26985 break; 26986 } 26987 } 26988 break; 26989 } 26990 case 0x00010200: { 26991 // 0xffb10200 26992 switch (instr & 0x000001c0) { 26993 case 0x00000000: { 26994 // 0xffb10200 26995 DataType dt = Dt_F_size_1_Decode( 26996 ((instr >> 18) & 0x3) | 26997 ((instr >> 8) & 0x4)); 26998 if (dt.Is(kDataTypeValueInvalid)) { 26999 UnallocatedT32(instr); 27000 return; 27001 } 27002 unsigned rd = 27003 ExtractDRegister(instr, 22, 12); 27004 unsigned rm = 27005 ExtractDRegister(instr, 5, 0); 27006 // VCLT{<c>}{<q>}.<dt> {<Dd>}, <Dm>, #0 ; T1 NOLINT(whitespace/line_length) 27007 vclt(CurrentCond(), 27008 dt, 27009 DRegister(rd), 27010 DRegister(rm), 27011 UINT32_C(0)); 27012 break; 27013 } 27014 case 0x00000040: { 27015 // 0xffb10240 27016 DataType dt = Dt_F_size_1_Decode( 27017 ((instr >> 18) & 0x3) | 27018 ((instr >> 8) & 0x4)); 27019 if (dt.Is(kDataTypeValueInvalid)) { 27020 UnallocatedT32(instr); 27021 return; 27022 } 27023 if (((instr >> 12) & 1) != 0) { 27024 UnallocatedT32(instr); 27025 return; 27026 } 27027 unsigned rd = 27028 ExtractQRegister(instr, 22, 12); 27029 if ((instr & 1) != 0) { 27030 UnallocatedT32(instr); 27031 return; 27032 } 27033 unsigned rm = 27034 ExtractQRegister(instr, 5, 0); 27035 // VCLT{<c>}{<q>}.<dt> {<Qd>}, <Qm>, #0 ; T1 NOLINT(whitespace/line_length) 27036 vclt(CurrentCond(), 27037 dt, 27038 QRegister(rd), 27039 QRegister(rm), 27040 UINT32_C(0)); 27041 break; 27042 } 27043 case 0x000000c0: { 27044 // 0xffb102c0 27045 if ((instr & 0x000c0400) == 27046 0x00080000) { 27047 UnimplementedT32_32("SHA1H", instr); 27048 } else { 27049 UnallocatedT32(instr); 27050 } 27051 break; 27052 } 27053 case 0x00000100: { 27054 // 0xffb10300 27055 DataType dt = Dt_F_size_1_Decode( 27056 ((instr >> 18) & 0x3) | 27057 ((instr >> 8) & 0x4)); 27058 if (dt.Is(kDataTypeValueInvalid)) { 27059 UnallocatedT32(instr); 27060 return; 27061 } 27062 unsigned rd = 27063 ExtractDRegister(instr, 22, 12); 27064 unsigned rm = 27065 ExtractDRegister(instr, 5, 0); 27066 // VABS{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1 27067 vabs(CurrentCond(), 27068 dt, 27069 DRegister(rd), 27070 DRegister(rm)); 27071 break; 27072 } 27073 case 0x00000140: { 27074 // 0xffb10340 27075 DataType dt = Dt_F_size_1_Decode( 27076 ((instr >> 18) & 0x3) | 27077 ((instr >> 8) & 0x4)); 27078 if (dt.Is(kDataTypeValueInvalid)) { 27079 UnallocatedT32(instr); 27080 return; 27081 } 27082 if (((instr >> 12) & 1) != 0) { 27083 UnallocatedT32(instr); 27084 return; 27085 } 27086 unsigned rd = 27087 ExtractQRegister(instr, 22, 12); 27088 if ((instr & 1) != 0) { 27089 UnallocatedT32(instr); 27090 return; 27091 } 27092 unsigned rm = 27093 ExtractQRegister(instr, 5, 0); 27094 // VABS{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1 27095 vabs(CurrentCond(), 27096 dt, 27097 QRegister(rd), 27098 QRegister(rm)); 27099 break; 27100 } 27101 case 0x00000180: { 27102 // 0xffb10380 27103 DataType dt = Dt_F_size_1_Decode( 27104 ((instr >> 18) & 0x3) | 27105 ((instr >> 8) & 0x4)); 27106 if (dt.Is(kDataTypeValueInvalid)) { 27107 UnallocatedT32(instr); 27108 return; 27109 } 27110 unsigned rd = 27111 ExtractDRegister(instr, 22, 12); 27112 unsigned rm = 27113 ExtractDRegister(instr, 5, 0); 27114 // VNEG{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1 27115 vneg(CurrentCond(), 27116 dt, 27117 DRegister(rd), 27118 DRegister(rm)); 27119 break; 27120 } 27121 case 0x000001c0: { 27122 // 0xffb103c0 27123 DataType dt = Dt_F_size_1_Decode( 27124 ((instr >> 18) & 0x3) | 27125 ((instr >> 8) & 0x4)); 27126 if (dt.Is(kDataTypeValueInvalid)) { 27127 UnallocatedT32(instr); 27128 return; 27129 } 27130 if (((instr >> 12) & 1) != 0) { 27131 UnallocatedT32(instr); 27132 return; 27133 } 27134 unsigned rd = 27135 ExtractQRegister(instr, 22, 12); 27136 if ((instr & 1) != 0) { 27137 UnallocatedT32(instr); 27138 return; 27139 } 27140 unsigned rm = 27141 ExtractQRegister(instr, 5, 0); 27142 // VNEG{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1 27143 vneg(CurrentCond(), 27144 dt, 27145 QRegister(rd), 27146 QRegister(rm)); 27147 break; 27148 } 27149 default: 27150 UnallocatedT32(instr); 27151 break; 27152 } 27153 break; 27154 } 27155 case 0x00020000: { 27156 // 0xffb20000 27157 switch (instr & 0x000005c0) { 27158 case 0x00000000: { 27159 // 0xffb20000 27160 if ((instr & 0x000c0000) == 27161 0x00000000) { 27162 unsigned rd = 27163 ExtractDRegister(instr, 22, 12); 27164 unsigned rm = 27165 ExtractDRegister(instr, 5, 0); 27166 // VSWP{<c>}{<q>}{.<dt>} <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length) 27167 vswp(CurrentCond(), 27168 kDataTypeValueNone, 27169 DRegister(rd), 27170 DRegister(rm)); 27171 } else { 27172 UnallocatedT32(instr); 27173 } 27174 break; 27175 } 27176 case 0x00000040: { 27177 // 0xffb20040 27178 if ((instr & 0x000c0000) == 27179 0x00000000) { 27180 if (((instr >> 12) & 1) != 0) { 27181 UnallocatedT32(instr); 27182 return; 27183 } 27184 unsigned rd = 27185 ExtractQRegister(instr, 22, 12); 27186 if ((instr & 1) != 0) { 27187 UnallocatedT32(instr); 27188 return; 27189 } 27190 unsigned rm = 27191 ExtractQRegister(instr, 5, 0); 27192 // VSWP{<c>}{<q>}{.<dt>} <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length) 27193 vswp(CurrentCond(), 27194 kDataTypeValueNone, 27195 QRegister(rd), 27196 QRegister(rm)); 27197 } else { 27198 UnallocatedT32(instr); 27199 } 27200 break; 27201 } 27202 case 0x00000080: { 27203 // 0xffb20080 27204 DataType dt = Dt_size_7_Decode( 27205 (instr >> 18) & 0x3); 27206 if (dt.Is(kDataTypeValueInvalid)) { 27207 UnallocatedT32(instr); 27208 return; 27209 } 27210 unsigned rd = 27211 ExtractDRegister(instr, 22, 12); 27212 unsigned rm = 27213 ExtractDRegister(instr, 5, 0); 27214 // VTRN{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1 27215 vtrn(CurrentCond(), 27216 dt, 27217 DRegister(rd), 27218 DRegister(rm)); 27219 break; 27220 } 27221 case 0x000000c0: { 27222 // 0xffb200c0 27223 DataType dt = Dt_size_7_Decode( 27224 (instr >> 18) & 0x3); 27225 if (dt.Is(kDataTypeValueInvalid)) { 27226 UnallocatedT32(instr); 27227 return; 27228 } 27229 if (((instr >> 12) & 1) != 0) { 27230 UnallocatedT32(instr); 27231 return; 27232 } 27233 unsigned rd = 27234 ExtractQRegister(instr, 22, 12); 27235 if ((instr & 1) != 0) { 27236 UnallocatedT32(instr); 27237 return; 27238 } 27239 unsigned rm = 27240 ExtractQRegister(instr, 5, 0); 27241 // VTRN{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1 27242 vtrn(CurrentCond(), 27243 dt, 27244 QRegister(rd), 27245 QRegister(rm)); 27246 break; 27247 } 27248 case 0x00000100: { 27249 // 0xffb20100 27250 DataType dt = Dt_size_15_Decode( 27251 (instr >> 18) & 0x3); 27252 if (dt.Is(kDataTypeValueInvalid)) { 27253 UnallocatedT32(instr); 27254 return; 27255 } 27256 unsigned rd = 27257 ExtractDRegister(instr, 22, 12); 27258 unsigned rm = 27259 ExtractDRegister(instr, 5, 0); 27260 // VUZP{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1 27261 vuzp(CurrentCond(), 27262 dt, 27263 DRegister(rd), 27264 DRegister(rm)); 27265 break; 27266 } 27267 case 0x00000140: { 27268 // 0xffb20140 27269 DataType dt = Dt_size_7_Decode( 27270 (instr >> 18) & 0x3); 27271 if (dt.Is(kDataTypeValueInvalid)) { 27272 UnallocatedT32(instr); 27273 return; 27274 } 27275 if (((instr >> 12) & 1) != 0) { 27276 UnallocatedT32(instr); 27277 return; 27278 } 27279 unsigned rd = 27280 ExtractQRegister(instr, 22, 12); 27281 if ((instr & 1) != 0) { 27282 UnallocatedT32(instr); 27283 return; 27284 } 27285 unsigned rm = 27286 ExtractQRegister(instr, 5, 0); 27287 // VUZP{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1 27288 vuzp(CurrentCond(), 27289 dt, 27290 QRegister(rd), 27291 QRegister(rm)); 27292 break; 27293 } 27294 case 0x00000180: { 27295 // 0xffb20180 27296 DataType dt = Dt_size_15_Decode( 27297 (instr >> 18) & 0x3); 27298 if (dt.Is(kDataTypeValueInvalid)) { 27299 UnallocatedT32(instr); 27300 return; 27301 } 27302 unsigned rd = 27303 ExtractDRegister(instr, 22, 12); 27304 unsigned rm = 27305 ExtractDRegister(instr, 5, 0); 27306 // VZIP{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1 27307 vzip(CurrentCond(), 27308 dt, 27309 DRegister(rd), 27310 DRegister(rm)); 27311 break; 27312 } 27313 case 0x000001c0: { 27314 // 0xffb201c0 27315 DataType dt = Dt_size_7_Decode( 27316 (instr >> 18) & 0x3); 27317 if (dt.Is(kDataTypeValueInvalid)) { 27318 UnallocatedT32(instr); 27319 return; 27320 } 27321 if (((instr >> 12) & 1) != 0) { 27322 UnallocatedT32(instr); 27323 return; 27324 } 27325 unsigned rd = 27326 ExtractQRegister(instr, 22, 12); 27327 if ((instr & 1) != 0) { 27328 UnallocatedT32(instr); 27329 return; 27330 } 27331 unsigned rm = 27332 ExtractQRegister(instr, 5, 0); 27333 // VZIP{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1 27334 vzip(CurrentCond(), 27335 dt, 27336 QRegister(rd), 27337 QRegister(rm)); 27338 break; 27339 } 27340 case 0x00000400: { 27341 // 0xffb20400 27342 DataType dt = Dt_size_16_Decode( 27343 (instr >> 18) & 0x3); 27344 if (dt.Is(kDataTypeValueInvalid)) { 27345 UnallocatedT32(instr); 27346 return; 27347 } 27348 unsigned rd = 27349 ExtractDRegister(instr, 22, 12); 27350 unsigned rm = 27351 ExtractDRegister(instr, 5, 0); 27352 // VRINTN{<q>}.<dt> <Dd>, <Dm> ; T1 27353 vrintn(dt, 27354 DRegister(rd), 27355 DRegister(rm)); 27356 break; 27357 } 27358 case 0x00000440: { 27359 // 0xffb20440 27360 DataType dt = Dt_size_16_Decode( 27361 (instr >> 18) & 0x3); 27362 if (dt.Is(kDataTypeValueInvalid)) { 27363 UnallocatedT32(instr); 27364 return; 27365 } 27366 if (((instr >> 12) & 1) != 0) { 27367 UnallocatedT32(instr); 27368 return; 27369 } 27370 unsigned rd = 27371 ExtractQRegister(instr, 22, 12); 27372 if ((instr & 1) != 0) { 27373 UnallocatedT32(instr); 27374 return; 27375 } 27376 unsigned rm = 27377 ExtractQRegister(instr, 5, 0); 27378 // VRINTN{<q>}.<dt> <Qd>, <Qm> ; T1 27379 vrintn(dt, 27380 QRegister(rd), 27381 QRegister(rm)); 27382 break; 27383 } 27384 case 0x00000480: { 27385 // 0xffb20480 27386 DataType dt = Dt_size_16_Decode( 27387 (instr >> 18) & 0x3); 27388 if (dt.Is(kDataTypeValueInvalid)) { 27389 UnallocatedT32(instr); 27390 return; 27391 } 27392 unsigned rd = 27393 ExtractDRegister(instr, 22, 12); 27394 unsigned rm = 27395 ExtractDRegister(instr, 5, 0); 27396 // VRINTX{<q>}.<dt> <Dd>, <Dm> ; T1 27397 vrintx(Condition::None(), 27398 dt, 27399 DRegister(rd), 27400 DRegister(rm)); 27401 break; 27402 } 27403 case 0x000004c0: { 27404 // 0xffb204c0 27405 DataType dt = Dt_size_16_Decode( 27406 (instr >> 18) & 0x3); 27407 if (dt.Is(kDataTypeValueInvalid)) { 27408 UnallocatedT32(instr); 27409 return; 27410 } 27411 if (((instr >> 12) & 1) != 0) { 27412 UnallocatedT32(instr); 27413 return; 27414 } 27415 unsigned rd = 27416 ExtractQRegister(instr, 22, 12); 27417 if ((instr & 1) != 0) { 27418 UnallocatedT32(instr); 27419 return; 27420 } 27421 unsigned rm = 27422 ExtractQRegister(instr, 5, 0); 27423 // VRINTX{<q>}.<dt> <Qd>, <Qm> ; T1 27424 vrintx(dt, 27425 QRegister(rd), 27426 QRegister(rm)); 27427 break; 27428 } 27429 case 0x00000500: { 27430 // 0xffb20500 27431 DataType dt = Dt_size_16_Decode( 27432 (instr >> 18) & 0x3); 27433 if (dt.Is(kDataTypeValueInvalid)) { 27434 UnallocatedT32(instr); 27435 return; 27436 } 27437 unsigned rd = 27438 ExtractDRegister(instr, 22, 12); 27439 unsigned rm = 27440 ExtractDRegister(instr, 5, 0); 27441 // VRINTA{<q>}.<dt> <Dd>, <Dm> ; T1 27442 vrinta(dt, 27443 DRegister(rd), 27444 DRegister(rm)); 27445 break; 27446 } 27447 case 0x00000540: { 27448 // 0xffb20540 27449 DataType dt = Dt_size_16_Decode( 27450 (instr >> 18) & 0x3); 27451 if (dt.Is(kDataTypeValueInvalid)) { 27452 UnallocatedT32(instr); 27453 return; 27454 } 27455 if (((instr >> 12) & 1) != 0) { 27456 UnallocatedT32(instr); 27457 return; 27458 } 27459 unsigned rd = 27460 ExtractQRegister(instr, 22, 12); 27461 if ((instr & 1) != 0) { 27462 UnallocatedT32(instr); 27463 return; 27464 } 27465 unsigned rm = 27466 ExtractQRegister(instr, 5, 0); 27467 // VRINTA{<q>}.<dt> <Qd>, <Qm> ; T1 27468 vrinta(dt, 27469 QRegister(rd), 27470 QRegister(rm)); 27471 break; 27472 } 27473 case 0x00000580: { 27474 // 0xffb20580 27475 DataType dt = Dt_size_16_Decode( 27476 (instr >> 18) & 0x3); 27477 if (dt.Is(kDataTypeValueInvalid)) { 27478 UnallocatedT32(instr); 27479 return; 27480 } 27481 unsigned rd = 27482 ExtractDRegister(instr, 22, 12); 27483 unsigned rm = 27484 ExtractDRegister(instr, 5, 0); 27485 // VRINTZ{<q>}.<dt> <Dd>, <Dm> ; T1 27486 vrintz(Condition::None(), 27487 dt, 27488 DRegister(rd), 27489 DRegister(rm)); 27490 break; 27491 } 27492 case 0x000005c0: { 27493 // 0xffb205c0 27494 DataType dt = Dt_size_16_Decode( 27495 (instr >> 18) & 0x3); 27496 if (dt.Is(kDataTypeValueInvalid)) { 27497 UnallocatedT32(instr); 27498 return; 27499 } 27500 if (((instr >> 12) & 1) != 0) { 27501 UnallocatedT32(instr); 27502 return; 27503 } 27504 unsigned rd = 27505 ExtractQRegister(instr, 22, 12); 27506 if ((instr & 1) != 0) { 27507 UnallocatedT32(instr); 27508 return; 27509 } 27510 unsigned rm = 27511 ExtractQRegister(instr, 5, 0); 27512 // VRINTZ{<q>}.<dt> <Qd>, <Qm> ; T1 27513 vrintz(dt, 27514 QRegister(rd), 27515 QRegister(rm)); 27516 break; 27517 } 27518 } 27519 break; 27520 } 27521 case 0x00020200: { 27522 // 0xffb20200 27523 switch (instr & 0x00000580) { 27524 case 0x00000000: { 27525 // 0xffb20200 27526 switch (instr & 0x00000040) { 27527 case 0x00000000: { 27528 // 0xffb20200 27529 DataType dt = Dt_size_3_Decode( 27530 (instr >> 18) & 0x3); 27531 if (dt.Is( 27532 kDataTypeValueInvalid)) { 27533 UnallocatedT32(instr); 27534 return; 27535 } 27536 unsigned rd = 27537 ExtractDRegister(instr, 27538 22, 27539 12); 27540 if ((instr & 1) != 0) { 27541 UnallocatedT32(instr); 27542 return; 27543 } 27544 unsigned rm = 27545 ExtractQRegister(instr, 5, 0); 27546 // VMOVN{<c>}{<q>}.<dt> <Dd>, <Qm> ; T1 NOLINT(whitespace/line_length) 27547 vmovn(CurrentCond(), 27548 dt, 27549 DRegister(rd), 27550 QRegister(rm)); 27551 break; 27552 } 27553 case 0x00000040: { 27554 // 0xffb20240 27555 DataType dt = Dt_size_14_Decode( 27556 (instr >> 18) & 0x3); 27557 if (dt.Is( 27558 kDataTypeValueInvalid)) { 27559 UnallocatedT32(instr); 27560 return; 27561 } 27562 unsigned rd = 27563 ExtractDRegister(instr, 27564 22, 27565 12); 27566 if ((instr & 1) != 0) { 27567 UnallocatedT32(instr); 27568 return; 27569 } 27570 unsigned rm = 27571 ExtractQRegister(instr, 5, 0); 27572 // VQMOVUN{<c>}{<q>}.<dt> <Dd>, <Qm> ; T1 NOLINT(whitespace/line_length) 27573 vqmovun(CurrentCond(), 27574 dt, 27575 DRegister(rd), 27576 QRegister(rm)); 27577 break; 27578 } 27579 } 27580 break; 27581 } 27582 case 0x00000080: { 27583 // 0xffb20280 27584 DataType dt = Dt_op_size_3_Decode( 27585 ((instr >> 18) & 0x3) | 27586 ((instr >> 4) & 0x4)); 27587 if (dt.Is(kDataTypeValueInvalid)) { 27588 UnallocatedT32(instr); 27589 return; 27590 } 27591 unsigned rd = 27592 ExtractDRegister(instr, 22, 12); 27593 if ((instr & 1) != 0) { 27594 UnallocatedT32(instr); 27595 return; 27596 } 27597 unsigned rm = 27598 ExtractQRegister(instr, 5, 0); 27599 // VQMOVN{<c>}{<q>}.<dt> <Dd>, <Qm> ; T1 NOLINT(whitespace/line_length) 27600 vqmovn(CurrentCond(), 27601 dt, 27602 DRegister(rd), 27603 QRegister(rm)); 27604 break; 27605 } 27606 case 0x00000100: { 27607 // 0xffb20300 27608 if ((instr & 0x00000040) == 27609 0x00000000) { 27610 DataType dt = Dt_size_17_Decode( 27611 (instr >> 18) & 0x3); 27612 if (dt.Is(kDataTypeValueInvalid)) { 27613 UnallocatedT32(instr); 27614 return; 27615 } 27616 if (((instr >> 12) & 1) != 0) { 27617 UnallocatedT32(instr); 27618 return; 27619 } 27620 unsigned rd = 27621 ExtractQRegister(instr, 22, 12); 27622 unsigned rm = 27623 ExtractDRegister(instr, 5, 0); 27624 uint32_t imm = dt.GetSize(); 27625 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T2 NOLINT(whitespace/line_length) 27626 vshll(CurrentCond(), 27627 dt, 27628 QRegister(rd), 27629 DRegister(rm), 27630 imm); 27631 } else { 27632 UnallocatedT32(instr); 27633 } 27634 break; 27635 } 27636 case 0x00000180: { 27637 // 0xffb20380 27638 switch (instr & 0x000c0040) { 27639 case 0x00080000: { 27640 // 0xffba0380 27641 UnimplementedT32_32("SHA1SU1", 27642 instr); 27643 break; 27644 } 27645 case 0x00080040: { 27646 // 0xffba03c0 27647 UnimplementedT32_32("SHA256SU0", 27648 instr); 27649 break; 27650 } 27651 default: 27652 UnallocatedT32(instr); 27653 break; 27654 } 27655 break; 27656 } 27657 case 0x00000400: { 27658 // 0xffb20600 27659 if ((instr & 0x000c0040) == 27660 0x00040000) { 27661 unsigned rd = 27662 ExtractDRegister(instr, 22, 12); 27663 if ((instr & 1) != 0) { 27664 UnallocatedT32(instr); 27665 return; 27666 } 27667 unsigned rm = 27668 ExtractQRegister(instr, 5, 0); 27669 // VCVT{<c>}{<q>}.F16.F32 <Dd>, <Qm> ; T1 NOLINT(whitespace/line_length) 27670 vcvt(CurrentCond(), 27671 F16, 27672 F32, 27673 DRegister(rd), 27674 QRegister(rm)); 27675 } else { 27676 UnallocatedT32(instr); 27677 } 27678 break; 27679 } 27680 case 0x00000480: { 27681 // 0xffb20680 27682 switch (instr & 0x00000040) { 27683 case 0x00000000: { 27684 // 0xffb20680 27685 DataType dt = Dt_size_16_Decode( 27686 (instr >> 18) & 0x3); 27687 if (dt.Is( 27688 kDataTypeValueInvalid)) { 27689 UnallocatedT32(instr); 27690 return; 27691 } 27692 unsigned rd = 27693 ExtractDRegister(instr, 27694 22, 27695 12); 27696 unsigned rm = 27697 ExtractDRegister(instr, 5, 0); 27698 // VRINTM{<q>}.<dt> <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length) 27699 vrintm(dt, 27700 DRegister(rd), 27701 DRegister(rm)); 27702 break; 27703 } 27704 case 0x00000040: { 27705 // 0xffb206c0 27706 DataType dt = Dt_size_16_Decode( 27707 (instr >> 18) & 0x3); 27708 if (dt.Is( 27709 kDataTypeValueInvalid)) { 27710 UnallocatedT32(instr); 27711 return; 27712 } 27713 if (((instr >> 12) & 1) != 0) { 27714 UnallocatedT32(instr); 27715 return; 27716 } 27717 unsigned rd = 27718 ExtractQRegister(instr, 27719 22, 27720 12); 27721 if ((instr & 1) != 0) { 27722 UnallocatedT32(instr); 27723 return; 27724 } 27725 unsigned rm = 27726 ExtractQRegister(instr, 5, 0); 27727 // VRINTM{<q>}.<dt> <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length) 27728 vrintm(dt, 27729 QRegister(rd), 27730 QRegister(rm)); 27731 break; 27732 } 27733 } 27734 break; 27735 } 27736 case 0x00000500: { 27737 // 0xffb20700 27738 if ((instr & 0x000c0040) == 27739 0x00040000) { 27740 if (((instr >> 12) & 1) != 0) { 27741 UnallocatedT32(instr); 27742 return; 27743 } 27744 unsigned rd = 27745 ExtractQRegister(instr, 22, 12); 27746 unsigned rm = 27747 ExtractDRegister(instr, 5, 0); 27748 // VCVT{<c>}{<q>}.F32.F16 <Qd>, <Dm> ; T1 NOLINT(whitespace/line_length) 27749 vcvt(CurrentCond(), 27750 F32, 27751 F16, 27752 QRegister(rd), 27753 DRegister(rm)); 27754 } else { 27755 UnallocatedT32(instr); 27756 } 27757 break; 27758 } 27759 case 0x00000580: { 27760 // 0xffb20780 27761 switch (instr & 0x00000040) { 27762 case 0x00000000: { 27763 // 0xffb20780 27764 DataType dt = Dt_size_16_Decode( 27765 (instr >> 18) & 0x3); 27766 if (dt.Is( 27767 kDataTypeValueInvalid)) { 27768 UnallocatedT32(instr); 27769 return; 27770 } 27771 unsigned rd = 27772 ExtractDRegister(instr, 27773 22, 27774 12); 27775 unsigned rm = 27776 ExtractDRegister(instr, 5, 0); 27777 // VRINTP{<q>}.<dt> <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length) 27778 vrintp(dt, 27779 DRegister(rd), 27780 DRegister(rm)); 27781 break; 27782 } 27783 case 0x00000040: { 27784 // 0xffb207c0 27785 DataType dt = Dt_size_16_Decode( 27786 (instr >> 18) & 0x3); 27787 if (dt.Is( 27788 kDataTypeValueInvalid)) { 27789 UnallocatedT32(instr); 27790 return; 27791 } 27792 if (((instr >> 12) & 1) != 0) { 27793 UnallocatedT32(instr); 27794 return; 27795 } 27796 unsigned rd = 27797 ExtractQRegister(instr, 27798 22, 27799 12); 27800 if ((instr & 1) != 0) { 27801 UnallocatedT32(instr); 27802 return; 27803 } 27804 unsigned rm = 27805 ExtractQRegister(instr, 5, 0); 27806 // VRINTP{<q>}.<dt> <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length) 27807 vrintp(dt, 27808 QRegister(rd), 27809 QRegister(rm)); 27810 break; 27811 } 27812 } 27813 break; 27814 } 27815 } 27816 break; 27817 } 27818 case 0x00030000: { 27819 // 0xffb30000 27820 switch (instr & 0x00000440) { 27821 case 0x00000000: { 27822 // 0xffb30000 27823 switch (instr & 0x000c0100) { 27824 case 0x00080000: { 27825 // 0xffbb0000 27826 DataType dt = Dt_op_3_Decode( 27827 (instr >> 7) & 0x1); 27828 if (dt.Is( 27829 kDataTypeValueInvalid)) { 27830 UnallocatedT32(instr); 27831 return; 27832 } 27833 unsigned rd = 27834 ExtractDRegister(instr, 27835 22, 27836 12); 27837 unsigned rm = 27838 ExtractDRegister(instr, 5, 0); 27839 // VCVTA{<q>}.<dt>.F32 <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length) 27840 vcvta(dt, 27841 F32, 27842 DRegister(rd), 27843 DRegister(rm)); 27844 break; 27845 } 27846 case 0x00080100: { 27847 // 0xffbb0100 27848 DataType dt = Dt_op_3_Decode( 27849 (instr >> 7) & 0x1); 27850 if (dt.Is( 27851 kDataTypeValueInvalid)) { 27852 UnallocatedT32(instr); 27853 return; 27854 } 27855 unsigned rd = 27856 ExtractDRegister(instr, 27857 22, 27858 12); 27859 unsigned rm = 27860 ExtractDRegister(instr, 5, 0); 27861 // VCVTN{<q>}.<dt>.F32 <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length) 27862 vcvtn(dt, 27863 F32, 27864 DRegister(rd), 27865 DRegister(rm)); 27866 break; 27867 } 27868 default: 27869 UnallocatedT32(instr); 27870 break; 27871 } 27872 break; 27873 } 27874 case 0x00000040: { 27875 // 0xffb30040 27876 switch (instr & 0x000c0100) { 27877 case 0x00080000: { 27878 // 0xffbb0040 27879 DataType dt = Dt_op_3_Decode( 27880 (instr >> 7) & 0x1); 27881 if (dt.Is( 27882 kDataTypeValueInvalid)) { 27883 UnallocatedT32(instr); 27884 return; 27885 } 27886 if (((instr >> 12) & 1) != 0) { 27887 UnallocatedT32(instr); 27888 return; 27889 } 27890 unsigned rd = 27891 ExtractQRegister(instr, 27892 22, 27893 12); 27894 if ((instr & 1) != 0) { 27895 UnallocatedT32(instr); 27896 return; 27897 } 27898 unsigned rm = 27899 ExtractQRegister(instr, 5, 0); 27900 // VCVTA{<q>}.<dt>.F32 <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length) 27901 vcvta(dt, 27902 F32, 27903 QRegister(rd), 27904 QRegister(rm)); 27905 break; 27906 } 27907 case 0x00080100: { 27908 // 0xffbb0140 27909 DataType dt = Dt_op_3_Decode( 27910 (instr >> 7) & 0x1); 27911 if (dt.Is( 27912 kDataTypeValueInvalid)) { 27913 UnallocatedT32(instr); 27914 return; 27915 } 27916 if (((instr >> 12) & 1) != 0) { 27917 UnallocatedT32(instr); 27918 return; 27919 } 27920 unsigned rd = 27921 ExtractQRegister(instr, 27922 22, 27923 12); 27924 if ((instr & 1) != 0) { 27925 UnallocatedT32(instr); 27926 return; 27927 } 27928 unsigned rm = 27929 ExtractQRegister(instr, 5, 0); 27930 // VCVTN{<q>}.<dt>.F32 <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length) 27931 vcvtn(dt, 27932 F32, 27933 QRegister(rd), 27934 QRegister(rm)); 27935 break; 27936 } 27937 default: 27938 UnallocatedT32(instr); 27939 break; 27940 } 27941 break; 27942 } 27943 case 0x00000400: { 27944 // 0xffb30400 27945 switch (instr & 0x00000080) { 27946 case 0x00000000: { 27947 // 0xffb30400 27948 DataType dt = Dt_F_size_4_Decode( 27949 ((instr >> 18) & 0x3) | 27950 ((instr >> 6) & 0x4)); 27951 if (dt.Is( 27952 kDataTypeValueInvalid)) { 27953 UnallocatedT32(instr); 27954 return; 27955 } 27956 unsigned rd = 27957 ExtractDRegister(instr, 27958 22, 27959 12); 27960 unsigned rm = 27961 ExtractDRegister(instr, 5, 0); 27962 // VRECPE{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length) 27963 vrecpe(CurrentCond(), 27964 dt, 27965 DRegister(rd), 27966 DRegister(rm)); 27967 break; 27968 } 27969 case 0x00000080: { 27970 // 0xffb30480 27971 DataType dt = Dt_F_size_4_Decode( 27972 ((instr >> 18) & 0x3) | 27973 ((instr >> 6) & 0x4)); 27974 if (dt.Is( 27975 kDataTypeValueInvalid)) { 27976 UnallocatedT32(instr); 27977 return; 27978 } 27979 unsigned rd = 27980 ExtractDRegister(instr, 27981 22, 27982 12); 27983 unsigned rm = 27984 ExtractDRegister(instr, 5, 0); 27985 // VRSQRTE{<c>}{<q>}.<dt> <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length) 27986 vrsqrte(CurrentCond(), 27987 dt, 27988 DRegister(rd), 27989 DRegister(rm)); 27990 break; 27991 } 27992 } 27993 break; 27994 } 27995 case 0x00000440: { 27996 // 0xffb30440 27997 switch (instr & 0x00000080) { 27998 case 0x00000000: { 27999 // 0xffb30440 28000 DataType dt = Dt_F_size_4_Decode( 28001 ((instr >> 18) & 0x3) | 28002 ((instr >> 6) & 0x4)); 28003 if (dt.Is( 28004 kDataTypeValueInvalid)) { 28005 UnallocatedT32(instr); 28006 return; 28007 } 28008 if (((instr >> 12) & 1) != 0) { 28009 UnallocatedT32(instr); 28010 return; 28011 } 28012 unsigned rd = 28013 ExtractQRegister(instr, 28014 22, 28015 12); 28016 if ((instr & 1) != 0) { 28017 UnallocatedT32(instr); 28018 return; 28019 } 28020 unsigned rm = 28021 ExtractQRegister(instr, 5, 0); 28022 // VRECPE{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length) 28023 vrecpe(CurrentCond(), 28024 dt, 28025 QRegister(rd), 28026 QRegister(rm)); 28027 break; 28028 } 28029 case 0x00000080: { 28030 // 0xffb304c0 28031 DataType dt = Dt_F_size_4_Decode( 28032 ((instr >> 18) & 0x3) | 28033 ((instr >> 6) & 0x4)); 28034 if (dt.Is( 28035 kDataTypeValueInvalid)) { 28036 UnallocatedT32(instr); 28037 return; 28038 } 28039 if (((instr >> 12) & 1) != 0) { 28040 UnallocatedT32(instr); 28041 return; 28042 } 28043 unsigned rd = 28044 ExtractQRegister(instr, 28045 22, 28046 12); 28047 if ((instr & 1) != 0) { 28048 UnallocatedT32(instr); 28049 return; 28050 } 28051 unsigned rm = 28052 ExtractQRegister(instr, 5, 0); 28053 // VRSQRTE{<c>}{<q>}.<dt> <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length) 28054 vrsqrte(CurrentCond(), 28055 dt, 28056 QRegister(rd), 28057 QRegister(rm)); 28058 break; 28059 } 28060 } 28061 break; 28062 } 28063 } 28064 break; 28065 } 28066 case 0x00030200: { 28067 // 0xffb30200 28068 switch (instr & 0x000c0440) { 28069 case 0x00080000: { 28070 // 0xffbb0200 28071 switch (instr & 0x00000100) { 28072 case 0x00000000: { 28073 // 0xffbb0200 28074 DataType dt = Dt_op_3_Decode( 28075 (instr >> 7) & 0x1); 28076 if (dt.Is( 28077 kDataTypeValueInvalid)) { 28078 UnallocatedT32(instr); 28079 return; 28080 } 28081 unsigned rd = 28082 ExtractDRegister(instr, 28083 22, 28084 12); 28085 unsigned rm = 28086 ExtractDRegister(instr, 5, 0); 28087 // VCVTP{<q>}.<dt>.F32 <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length) 28088 vcvtp(dt, 28089 F32, 28090 DRegister(rd), 28091 DRegister(rm)); 28092 break; 28093 } 28094 case 0x00000100: { 28095 // 0xffbb0300 28096 DataType dt = Dt_op_3_Decode( 28097 (instr >> 7) & 0x1); 28098 if (dt.Is( 28099 kDataTypeValueInvalid)) { 28100 UnallocatedT32(instr); 28101 return; 28102 } 28103 unsigned rd = 28104 ExtractDRegister(instr, 28105 22, 28106 12); 28107 unsigned rm = 28108 ExtractDRegister(instr, 5, 0); 28109 // VCVTM{<q>}.<dt>.F32 <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length) 28110 vcvtm(dt, 28111 F32, 28112 DRegister(rd), 28113 DRegister(rm)); 28114 break; 28115 } 28116 } 28117 break; 28118 } 28119 case 0x00080040: { 28120 // 0xffbb0240 28121 switch (instr & 0x00000100) { 28122 case 0x00000000: { 28123 // 0xffbb0240 28124 DataType dt = Dt_op_3_Decode( 28125 (instr >> 7) & 0x1); 28126 if (dt.Is( 28127 kDataTypeValueInvalid)) { 28128 UnallocatedT32(instr); 28129 return; 28130 } 28131 if (((instr >> 12) & 1) != 0) { 28132 UnallocatedT32(instr); 28133 return; 28134 } 28135 unsigned rd = 28136 ExtractQRegister(instr, 28137 22, 28138 12); 28139 if ((instr & 1) != 0) { 28140 UnallocatedT32(instr); 28141 return; 28142 } 28143 unsigned rm = 28144 ExtractQRegister(instr, 5, 0); 28145 // VCVTP{<q>}.<dt>.F32 <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length) 28146 vcvtp(dt, 28147 F32, 28148 QRegister(rd), 28149 QRegister(rm)); 28150 break; 28151 } 28152 case 0x00000100: { 28153 // 0xffbb0340 28154 DataType dt = Dt_op_3_Decode( 28155 (instr >> 7) & 0x1); 28156 if (dt.Is( 28157 kDataTypeValueInvalid)) { 28158 UnallocatedT32(instr); 28159 return; 28160 } 28161 if (((instr >> 12) & 1) != 0) { 28162 UnallocatedT32(instr); 28163 return; 28164 } 28165 unsigned rd = 28166 ExtractQRegister(instr, 28167 22, 28168 12); 28169 if ((instr & 1) != 0) { 28170 UnallocatedT32(instr); 28171 return; 28172 } 28173 unsigned rm = 28174 ExtractQRegister(instr, 5, 0); 28175 // VCVTM{<q>}.<dt>.F32 <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length) 28176 vcvtm(dt, 28177 F32, 28178 QRegister(rd), 28179 QRegister(rm)); 28180 break; 28181 } 28182 } 28183 break; 28184 } 28185 case 0x00080400: { 28186 // 0xffbb0600 28187 DataType dt1 = Dt_op_1_Decode1( 28188 (instr >> 7) & 0x3); 28189 if (dt1.Is(kDataTypeValueInvalid)) { 28190 UnallocatedT32(instr); 28191 return; 28192 } 28193 DataType dt2 = Dt_op_1_Decode2( 28194 (instr >> 7) & 0x3); 28195 if (dt2.Is(kDataTypeValueInvalid)) { 28196 UnallocatedT32(instr); 28197 return; 28198 } 28199 unsigned rd = 28200 ExtractDRegister(instr, 22, 12); 28201 unsigned rm = 28202 ExtractDRegister(instr, 5, 0); 28203 // VCVT{<c>}{<q>}.<dt>.<dt> <Dd>, <Dm> ; T1 NOLINT(whitespace/line_length) 28204 vcvt(CurrentCond(), 28205 dt1, 28206 dt2, 28207 DRegister(rd), 28208 DRegister(rm)); 28209 break; 28210 } 28211 case 0x00080440: { 28212 // 0xffbb0640 28213 DataType dt1 = Dt_op_1_Decode1( 28214 (instr >> 7) & 0x3); 28215 if (dt1.Is(kDataTypeValueInvalid)) { 28216 UnallocatedT32(instr); 28217 return; 28218 } 28219 DataType dt2 = Dt_op_1_Decode2( 28220 (instr >> 7) & 0x3); 28221 if (dt2.Is(kDataTypeValueInvalid)) { 28222 UnallocatedT32(instr); 28223 return; 28224 } 28225 if (((instr >> 12) & 1) != 0) { 28226 UnallocatedT32(instr); 28227 return; 28228 } 28229 unsigned rd = 28230 ExtractQRegister(instr, 22, 12); 28231 if ((instr & 1) != 0) { 28232 UnallocatedT32(instr); 28233 return; 28234 } 28235 unsigned rm = 28236 ExtractQRegister(instr, 5, 0); 28237 // VCVT{<c>}{<q>}.<dt>.<dt> <Qd>, <Qm> ; T1 NOLINT(whitespace/line_length) 28238 vcvt(CurrentCond(), 28239 dt1, 28240 dt2, 28241 QRegister(rd), 28242 QRegister(rm)); 28243 break; 28244 } 28245 default: 28246 UnallocatedT32(instr); 28247 break; 28248 } 28249 break; 28250 } 28251 } 28252 break; 28253 } 28254 case 0x00000800: { 28255 // 0xffb00800 28256 switch (instr & 0x00000440) { 28257 case 0x00000000: { 28258 // 0xffb00800 28259 unsigned rd = 28260 ExtractDRegister(instr, 22, 12); 28261 unsigned first = 28262 ExtractDRegister(instr, 7, 16); 28263 unsigned length; 28264 SpacingType spacing = kSingle; 28265 switch ((instr >> 8) & 0x3) { 28266 default: 28267 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 28268 case 0x0: 28269 length = 1; 28270 break; 28271 case 0x1: 28272 length = 2; 28273 break; 28274 case 0x2: 28275 length = 3; 28276 break; 28277 case 0x3: 28278 length = 4; 28279 break; 28280 } 28281 unsigned last = first + length - 1; 28282 TransferType transfer = kMultipleLanes; 28283 unsigned rm = 28284 ExtractDRegister(instr, 5, 0); 28285 // VTBL{<c>}{<q>}.8 <Dd>, <list>, <Dm> ; T1 NOLINT(whitespace/line_length) 28286 vtbl(CurrentCond(), 28287 Untyped8, 28288 DRegister(rd), 28289 NeonRegisterList(DRegister(first), 28290 DRegister(last), 28291 spacing, 28292 transfer), 28293 DRegister(rm)); 28294 break; 28295 } 28296 case 0x00000040: { 28297 // 0xffb00840 28298 unsigned rd = 28299 ExtractDRegister(instr, 22, 12); 28300 unsigned first = 28301 ExtractDRegister(instr, 7, 16); 28302 unsigned length; 28303 SpacingType spacing = kSingle; 28304 switch ((instr >> 8) & 0x3) { 28305 default: 28306 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 28307 case 0x0: 28308 length = 1; 28309 break; 28310 case 0x1: 28311 length = 2; 28312 break; 28313 case 0x2: 28314 length = 3; 28315 break; 28316 case 0x3: 28317 length = 4; 28318 break; 28319 } 28320 unsigned last = first + length - 1; 28321 TransferType transfer = kMultipleLanes; 28322 unsigned rm = 28323 ExtractDRegister(instr, 5, 0); 28324 // VTBX{<c>}{<q>}.8 <Dd>, <list>, <Dm> ; T1 NOLINT(whitespace/line_length) 28325 vtbx(CurrentCond(), 28326 Untyped8, 28327 DRegister(rd), 28328 NeonRegisterList(DRegister(first), 28329 DRegister(last), 28330 spacing, 28331 transfer), 28332 DRegister(rm)); 28333 break; 28334 } 28335 case 0x00000400: { 28336 // 0xffb00c00 28337 if ((instr & 0x00000380) == 0x00000000) { 28338 unsigned lane; 28339 DataType dt = 28340 Dt_imm4_1_Decode((instr >> 16) & 28341 0xf, 28342 &lane); 28343 if (dt.Is(kDataTypeValueInvalid)) { 28344 UnallocatedT32(instr); 28345 return; 28346 } 28347 unsigned rd = 28348 ExtractDRegister(instr, 22, 12); 28349 unsigned rm = 28350 ExtractDRegister(instr, 5, 0); 28351 // VDUP{<c>}{<q>}.<dt> <Dd>, <Dm[x]> ; T1 NOLINT(whitespace/line_length) 28352 vdup(CurrentCond(), 28353 dt, 28354 DRegister(rd), 28355 DRegisterLane(rm, lane)); 28356 } else { 28357 UnallocatedT32(instr); 28358 } 28359 break; 28360 } 28361 case 0x00000440: { 28362 // 0xffb00c40 28363 if ((instr & 0x00000380) == 0x00000000) { 28364 unsigned lane; 28365 DataType dt = 28366 Dt_imm4_1_Decode((instr >> 16) & 28367 0xf, 28368 &lane); 28369 if (dt.Is(kDataTypeValueInvalid)) { 28370 UnallocatedT32(instr); 28371 return; 28372 } 28373 if (((instr >> 12) & 1) != 0) { 28374 UnallocatedT32(instr); 28375 return; 28376 } 28377 unsigned rd = 28378 ExtractQRegister(instr, 22, 12); 28379 unsigned rm = 28380 ExtractDRegister(instr, 5, 0); 28381 // VDUP{<c>}{<q>}.<dt> <Qd>, <Dm[x]> ; T1 NOLINT(whitespace/line_length) 28382 vdup(CurrentCond(), 28383 dt, 28384 QRegister(rd), 28385 DRegisterLane(rm, lane)); 28386 } else { 28387 UnallocatedT32(instr); 28388 } 28389 break; 28390 } 28391 } 28392 break; 28393 } 28394 } 28395 break; 28396 } 28397 } 28398 break; 28399 } 28400 default: { 28401 switch (instr & 0x00000c40) { 28402 case 0x00000000: { 28403 // 0xef800000 28404 switch (instr & 0x00000300) { 28405 case 0x00000000: { 28406 // 0xef800000 28407 if (((instr & 0x300000) == 0x300000)) { 28408 UnallocatedT32(instr); 28409 return; 28410 } 28411 DataType dt = 28412 Dt_U_size_1_Decode(((instr >> 20) & 0x3) | 28413 ((instr >> 26) & 0x4)); 28414 if (dt.Is(kDataTypeValueInvalid)) { 28415 UnallocatedT32(instr); 28416 return; 28417 } 28418 if (((instr >> 12) & 1) != 0) { 28419 UnallocatedT32(instr); 28420 return; 28421 } 28422 unsigned rd = ExtractQRegister(instr, 22, 12); 28423 unsigned rn = ExtractDRegister(instr, 7, 16); 28424 unsigned rm = ExtractDRegister(instr, 5, 0); 28425 // VADDL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; T1 28426 vaddl(CurrentCond(), 28427 dt, 28428 QRegister(rd), 28429 DRegister(rn), 28430 DRegister(rm)); 28431 break; 28432 } 28433 case 0x00000100: { 28434 // 0xef800100 28435 if (((instr & 0x300000) == 0x300000)) { 28436 UnallocatedT32(instr); 28437 return; 28438 } 28439 DataType dt = 28440 Dt_U_size_1_Decode(((instr >> 20) & 0x3) | 28441 ((instr >> 26) & 0x4)); 28442 if (dt.Is(kDataTypeValueInvalid)) { 28443 UnallocatedT32(instr); 28444 return; 28445 } 28446 if (((instr >> 12) & 1) != 0) { 28447 UnallocatedT32(instr); 28448 return; 28449 } 28450 unsigned rd = ExtractQRegister(instr, 22, 12); 28451 if (((instr >> 16) & 1) != 0) { 28452 UnallocatedT32(instr); 28453 return; 28454 } 28455 unsigned rn = ExtractQRegister(instr, 7, 16); 28456 unsigned rm = ExtractDRegister(instr, 5, 0); 28457 // VADDW{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Dm> ; T1 NOLINT(whitespace/line_length) 28458 vaddw(CurrentCond(), 28459 dt, 28460 QRegister(rd), 28461 QRegister(rn), 28462 DRegister(rm)); 28463 break; 28464 } 28465 case 0x00000200: { 28466 // 0xef800200 28467 if (((instr & 0x300000) == 0x300000)) { 28468 UnallocatedT32(instr); 28469 return; 28470 } 28471 DataType dt = 28472 Dt_U_size_1_Decode(((instr >> 20) & 0x3) | 28473 ((instr >> 26) & 0x4)); 28474 if (dt.Is(kDataTypeValueInvalid)) { 28475 UnallocatedT32(instr); 28476 return; 28477 } 28478 if (((instr >> 12) & 1) != 0) { 28479 UnallocatedT32(instr); 28480 return; 28481 } 28482 unsigned rd = ExtractQRegister(instr, 22, 12); 28483 unsigned rn = ExtractDRegister(instr, 7, 16); 28484 unsigned rm = ExtractDRegister(instr, 5, 0); 28485 // VSUBL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; T1 28486 vsubl(CurrentCond(), 28487 dt, 28488 QRegister(rd), 28489 DRegister(rn), 28490 DRegister(rm)); 28491 break; 28492 } 28493 case 0x00000300: { 28494 // 0xef800300 28495 if (((instr & 0x300000) == 0x300000)) { 28496 UnallocatedT32(instr); 28497 return; 28498 } 28499 DataType dt = 28500 Dt_U_size_1_Decode(((instr >> 20) & 0x3) | 28501 ((instr >> 26) & 0x4)); 28502 if (dt.Is(kDataTypeValueInvalid)) { 28503 UnallocatedT32(instr); 28504 return; 28505 } 28506 if (((instr >> 12) & 1) != 0) { 28507 UnallocatedT32(instr); 28508 return; 28509 } 28510 unsigned rd = ExtractQRegister(instr, 22, 12); 28511 if (((instr >> 16) & 1) != 0) { 28512 UnallocatedT32(instr); 28513 return; 28514 } 28515 unsigned rn = ExtractQRegister(instr, 7, 16); 28516 unsigned rm = ExtractDRegister(instr, 5, 0); 28517 // VSUBW{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Dm> ; T1 NOLINT(whitespace/line_length) 28518 vsubw(CurrentCond(), 28519 dt, 28520 QRegister(rd), 28521 QRegister(rn), 28522 DRegister(rm)); 28523 break; 28524 } 28525 } 28526 break; 28527 } 28528 case 0x00000040: { 28529 // 0xef800040 28530 switch (instr & 0x00000200) { 28531 case 0x00000000: { 28532 // 0xef800040 28533 switch (instr & 0x10000000) { 28534 case 0x00000000: { 28535 // 0xef800040 28536 if (((instr & 0x300000) == 0x300000)) { 28537 UnallocatedT32(instr); 28538 return; 28539 } 28540 DataType dt = 28541 Dt_size_9_Decode((instr >> 20) & 0x3, 28542 (instr >> 8) & 0x1); 28543 if (dt.Is(kDataTypeValueInvalid)) { 28544 UnallocatedT32(instr); 28545 return; 28546 } 28547 unsigned rd = 28548 ExtractDRegister(instr, 22, 12); 28549 unsigned rn = 28550 ExtractDRegister(instr, 7, 16); 28551 int lane; 28552 unsigned rm = 28553 ExtractDRegisterAndLane(instr, 28554 dt, 28555 5, 28556 0, 28557 &lane); 28558 // VMLA{<c>}{<q>}.<type><size> <Dd>, <Dn>, <Dm[x]> ; T1 NOLINT(whitespace/line_length) 28559 vmla(CurrentCond(), 28560 dt, 28561 DRegister(rd), 28562 DRegister(rn), 28563 DRegisterLane(rm, lane)); 28564 break; 28565 } 28566 case 0x10000000: { 28567 // 0xff800040 28568 if (((instr & 0x300000) == 0x300000)) { 28569 UnallocatedT32(instr); 28570 return; 28571 } 28572 DataType dt = 28573 Dt_size_9_Decode((instr >> 20) & 0x3, 28574 (instr >> 8) & 0x1); 28575 if (dt.Is(kDataTypeValueInvalid)) { 28576 UnallocatedT32(instr); 28577 return; 28578 } 28579 if (((instr >> 12) & 1) != 0) { 28580 UnallocatedT32(instr); 28581 return; 28582 } 28583 unsigned rd = 28584 ExtractQRegister(instr, 22, 12); 28585 if (((instr >> 16) & 1) != 0) { 28586 UnallocatedT32(instr); 28587 return; 28588 } 28589 unsigned rn = 28590 ExtractQRegister(instr, 7, 16); 28591 int lane; 28592 unsigned rm = 28593 ExtractDRegisterAndLane(instr, 28594 dt, 28595 5, 28596 0, 28597 &lane); 28598 // VMLA{<c>}{<q>}.<type><size> <Qd>, <Qn>, <Dm[x]> ; T1 NOLINT(whitespace/line_length) 28599 vmla(CurrentCond(), 28600 dt, 28601 QRegister(rd), 28602 QRegister(rn), 28603 DRegisterLane(rm, lane)); 28604 break; 28605 } 28606 } 28607 break; 28608 } 28609 case 0x00000200: { 28610 // 0xef800240 28611 switch (instr & 0x00000100) { 28612 case 0x00000000: { 28613 // 0xef800240 28614 if (((instr & 0x300000) == 0x300000)) { 28615 UnallocatedT32(instr); 28616 return; 28617 } 28618 DataType dt = 28619 Dt_size_11_Decode((instr >> 20) & 0x3, 28620 (instr >> 28) & 28621 0x1); 28622 if (dt.Is(kDataTypeValueInvalid)) { 28623 UnallocatedT32(instr); 28624 return; 28625 } 28626 if (((instr >> 12) & 1) != 0) { 28627 UnallocatedT32(instr); 28628 return; 28629 } 28630 unsigned rd = 28631 ExtractQRegister(instr, 22, 12); 28632 unsigned rn = 28633 ExtractDRegister(instr, 7, 16); 28634 int lane; 28635 unsigned rm = 28636 ExtractDRegisterAndLane(instr, 28637 dt, 28638 5, 28639 0, 28640 &lane); 28641 // VMLAL{<c>}{<q>}.<type><size> <Qd>, <Dn>, <Dm[x]> ; T1 NOLINT(whitespace/line_length) 28642 vmlal(CurrentCond(), 28643 dt, 28644 QRegister(rd), 28645 DRegister(rn), 28646 DRegisterLane(rm, lane)); 28647 break; 28648 } 28649 case 0x00000100: { 28650 // 0xef800340 28651 if ((instr & 0x10000000) == 0x00000000) { 28652 if (((instr & 0x300000) == 0x300000)) { 28653 UnallocatedT32(instr); 28654 return; 28655 } 28656 DataType dt = Dt_size_13_Decode( 28657 (instr >> 20) & 0x3); 28658 if (dt.Is(kDataTypeValueInvalid)) { 28659 UnallocatedT32(instr); 28660 return; 28661 } 28662 if (((instr >> 12) & 1) != 0) { 28663 UnallocatedT32(instr); 28664 return; 28665 } 28666 unsigned rd = 28667 ExtractQRegister(instr, 22, 12); 28668 unsigned rn = 28669 ExtractDRegister(instr, 7, 16); 28670 uint32_t mvm = (instr & 0xf) | 28671 ((instr >> 1) & 0x10); 28672 uint32_t shift = 4; 28673 if (dt.Is(S16)) { 28674 shift = 3; 28675 } 28676 uint32_t vm = mvm & ((1 << shift) - 1); 28677 uint32_t index = mvm >> shift; 28678 // VQDMLAL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm>[<index>] ; T2 NOLINT(whitespace/line_length) 28679 vqdmlal(CurrentCond(), 28680 dt, 28681 QRegister(rd), 28682 DRegister(rn), 28683 DRegister(vm), 28684 index); 28685 } else { 28686 UnallocatedT32(instr); 28687 } 28688 break; 28689 } 28690 } 28691 break; 28692 } 28693 } 28694 break; 28695 } 28696 case 0x00000400: { 28697 // 0xef800400 28698 switch (instr & 0x00000300) { 28699 case 0x00000000: { 28700 // 0xef800400 28701 switch (instr & 0x10000000) { 28702 case 0x00000000: { 28703 // 0xef800400 28704 if (((instr & 0x300000) == 0x300000)) { 28705 UnallocatedT32(instr); 28706 return; 28707 } 28708 DataType dt = 28709 Dt_size_3_Decode((instr >> 20) & 0x3); 28710 if (dt.Is(kDataTypeValueInvalid)) { 28711 UnallocatedT32(instr); 28712 return; 28713 } 28714 unsigned rd = 28715 ExtractDRegister(instr, 22, 12); 28716 if (((instr >> 16) & 1) != 0) { 28717 UnallocatedT32(instr); 28718 return; 28719 } 28720 unsigned rn = 28721 ExtractQRegister(instr, 7, 16); 28722 if ((instr & 1) != 0) { 28723 UnallocatedT32(instr); 28724 return; 28725 } 28726 unsigned rm = 28727 ExtractQRegister(instr, 5, 0); 28728 // VADDHN{<c>}{<q>}.<dt> <Dd>, <Qn>, <Qm> ; T1 NOLINT(whitespace/line_length) 28729 vaddhn(CurrentCond(), 28730 dt, 28731 DRegister(rd), 28732 QRegister(rn), 28733 QRegister(rm)); 28734 break; 28735 } 28736 case 0x10000000: { 28737 // 0xff800400 28738 if (((instr & 0x300000) == 0x300000)) { 28739 UnallocatedT32(instr); 28740 return; 28741 } 28742 DataType dt = 28743 Dt_size_3_Decode((instr >> 20) & 0x3); 28744 if (dt.Is(kDataTypeValueInvalid)) { 28745 UnallocatedT32(instr); 28746 return; 28747 } 28748 unsigned rd = 28749 ExtractDRegister(instr, 22, 12); 28750 if (((instr >> 16) & 1) != 0) { 28751 UnallocatedT32(instr); 28752 return; 28753 } 28754 unsigned rn = 28755 ExtractQRegister(instr, 7, 16); 28756 if ((instr & 1) != 0) { 28757 UnallocatedT32(instr); 28758 return; 28759 } 28760 unsigned rm = 28761 ExtractQRegister(instr, 5, 0); 28762 // VRADDHN{<c>}{<q>}.<dt> <Dd>, <Qn>, <Qm> ; T1 NOLINT(whitespace/line_length) 28763 vraddhn(CurrentCond(), 28764 dt, 28765 DRegister(rd), 28766 QRegister(rn), 28767 QRegister(rm)); 28768 break; 28769 } 28770 } 28771 break; 28772 } 28773 case 0x00000100: { 28774 // 0xef800500 28775 if (((instr & 0x300000) == 0x300000)) { 28776 UnallocatedT32(instr); 28777 return; 28778 } 28779 DataType dt = 28780 Dt_U_size_1_Decode(((instr >> 20) & 0x3) | 28781 ((instr >> 26) & 0x4)); 28782 if (dt.Is(kDataTypeValueInvalid)) { 28783 UnallocatedT32(instr); 28784 return; 28785 } 28786 if (((instr >> 12) & 1) != 0) { 28787 UnallocatedT32(instr); 28788 return; 28789 } 28790 unsigned rd = ExtractQRegister(instr, 22, 12); 28791 unsigned rn = ExtractDRegister(instr, 7, 16); 28792 unsigned rm = ExtractDRegister(instr, 5, 0); 28793 // VABAL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; T1 28794 vabal(CurrentCond(), 28795 dt, 28796 QRegister(rd), 28797 DRegister(rn), 28798 DRegister(rm)); 28799 break; 28800 } 28801 case 0x00000200: { 28802 // 0xef800600 28803 switch (instr & 0x10000000) { 28804 case 0x00000000: { 28805 // 0xef800600 28806 if (((instr & 0x300000) == 0x300000)) { 28807 UnallocatedT32(instr); 28808 return; 28809 } 28810 DataType dt = 28811 Dt_size_3_Decode((instr >> 20) & 0x3); 28812 if (dt.Is(kDataTypeValueInvalid)) { 28813 UnallocatedT32(instr); 28814 return; 28815 } 28816 unsigned rd = 28817 ExtractDRegister(instr, 22, 12); 28818 if (((instr >> 16) & 1) != 0) { 28819 UnallocatedT32(instr); 28820 return; 28821 } 28822 unsigned rn = 28823 ExtractQRegister(instr, 7, 16); 28824 if ((instr & 1) != 0) { 28825 UnallocatedT32(instr); 28826 return; 28827 } 28828 unsigned rm = 28829 ExtractQRegister(instr, 5, 0); 28830 // VSUBHN{<c>}{<q>}.<dt> <Dd>, <Qn>, <Qm> ; T1 NOLINT(whitespace/line_length) 28831 vsubhn(CurrentCond(), 28832 dt, 28833 DRegister(rd), 28834 QRegister(rn), 28835 QRegister(rm)); 28836 break; 28837 } 28838 case 0x10000000: { 28839 // 0xff800600 28840 if (((instr & 0x300000) == 0x300000)) { 28841 UnallocatedT32(instr); 28842 return; 28843 } 28844 DataType dt = 28845 Dt_size_3_Decode((instr >> 20) & 0x3); 28846 if (dt.Is(kDataTypeValueInvalid)) { 28847 UnallocatedT32(instr); 28848 return; 28849 } 28850 unsigned rd = 28851 ExtractDRegister(instr, 22, 12); 28852 if (((instr >> 16) & 1) != 0) { 28853 UnallocatedT32(instr); 28854 return; 28855 } 28856 unsigned rn = 28857 ExtractQRegister(instr, 7, 16); 28858 if ((instr & 1) != 0) { 28859 UnallocatedT32(instr); 28860 return; 28861 } 28862 unsigned rm = 28863 ExtractQRegister(instr, 5, 0); 28864 // VRSUBHN{<c>}{<q>}.<dt> <Dd>, <Qn>, <Qm> ; T1 NOLINT(whitespace/line_length) 28865 vrsubhn(CurrentCond(), 28866 dt, 28867 DRegister(rd), 28868 QRegister(rn), 28869 QRegister(rm)); 28870 break; 28871 } 28872 } 28873 break; 28874 } 28875 case 0x00000300: { 28876 // 0xef800700 28877 if (((instr & 0x300000) == 0x300000)) { 28878 UnallocatedT32(instr); 28879 return; 28880 } 28881 DataType dt = 28882 Dt_U_size_1_Decode(((instr >> 20) & 0x3) | 28883 ((instr >> 26) & 0x4)); 28884 if (dt.Is(kDataTypeValueInvalid)) { 28885 UnallocatedT32(instr); 28886 return; 28887 } 28888 if (((instr >> 12) & 1) != 0) { 28889 UnallocatedT32(instr); 28890 return; 28891 } 28892 unsigned rd = ExtractQRegister(instr, 22, 12); 28893 unsigned rn = ExtractDRegister(instr, 7, 16); 28894 unsigned rm = ExtractDRegister(instr, 5, 0); 28895 // VABDL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; T1 28896 vabdl(CurrentCond(), 28897 dt, 28898 QRegister(rd), 28899 DRegister(rn), 28900 DRegister(rm)); 28901 break; 28902 } 28903 } 28904 break; 28905 } 28906 case 0x00000440: { 28907 // 0xef800440 28908 switch (instr & 0x00000200) { 28909 case 0x00000000: { 28910 // 0xef800440 28911 switch (instr & 0x10000000) { 28912 case 0x00000000: { 28913 // 0xef800440 28914 if (((instr & 0x300000) == 0x300000)) { 28915 UnallocatedT32(instr); 28916 return; 28917 } 28918 DataType dt = 28919 Dt_size_9_Decode((instr >> 20) & 0x3, 28920 (instr >> 8) & 0x1); 28921 if (dt.Is(kDataTypeValueInvalid)) { 28922 UnallocatedT32(instr); 28923 return; 28924 } 28925 unsigned rd = 28926 ExtractDRegister(instr, 22, 12); 28927 unsigned rn = 28928 ExtractDRegister(instr, 7, 16); 28929 int lane; 28930 unsigned rm = 28931 ExtractDRegisterAndLane(instr, 28932 dt, 28933 5, 28934 0, 28935 &lane); 28936 // VMLS{<c>}{<q>}.<type><size> <Dd>, <Dn>, <Dm[x]> ; T1 NOLINT(whitespace/line_length) 28937 vmls(CurrentCond(), 28938 dt, 28939 DRegister(rd), 28940 DRegister(rn), 28941 DRegisterLane(rm, lane)); 28942 break; 28943 } 28944 case 0x10000000: { 28945 // 0xff800440 28946 if (((instr & 0x300000) == 0x300000)) { 28947 UnallocatedT32(instr); 28948 return; 28949 } 28950 DataType dt = 28951 Dt_size_9_Decode((instr >> 20) & 0x3, 28952 (instr >> 8) & 0x1); 28953 if (dt.Is(kDataTypeValueInvalid)) { 28954 UnallocatedT32(instr); 28955 return; 28956 } 28957 if (((instr >> 12) & 1) != 0) { 28958 UnallocatedT32(instr); 28959 return; 28960 } 28961 unsigned rd = 28962 ExtractQRegister(instr, 22, 12); 28963 if (((instr >> 16) & 1) != 0) { 28964 UnallocatedT32(instr); 28965 return; 28966 } 28967 unsigned rn = 28968 ExtractQRegister(instr, 7, 16); 28969 int lane; 28970 unsigned rm = 28971 ExtractDRegisterAndLane(instr, 28972 dt, 28973 5, 28974 0, 28975 &lane); 28976 // VMLS{<c>}{<q>}.<type><size> <Qd>, <Qn>, <Dm[x]> ; T1 NOLINT(whitespace/line_length) 28977 vmls(CurrentCond(), 28978 dt, 28979 QRegister(rd), 28980 QRegister(rn), 28981 DRegisterLane(rm, lane)); 28982 break; 28983 } 28984 } 28985 break; 28986 } 28987 case 0x00000200: { 28988 // 0xef800640 28989 switch (instr & 0x00000100) { 28990 case 0x00000000: { 28991 // 0xef800640 28992 if (((instr & 0x300000) == 0x300000)) { 28993 UnallocatedT32(instr); 28994 return; 28995 } 28996 DataType dt = 28997 Dt_size_11_Decode((instr >> 20) & 0x3, 28998 (instr >> 28) & 28999 0x1); 29000 if (dt.Is(kDataTypeValueInvalid)) { 29001 UnallocatedT32(instr); 29002 return; 29003 } 29004 if (((instr >> 12) & 1) != 0) { 29005 UnallocatedT32(instr); 29006 return; 29007 } 29008 unsigned rd = 29009 ExtractQRegister(instr, 22, 12); 29010 unsigned rn = 29011 ExtractDRegister(instr, 7, 16); 29012 int lane; 29013 unsigned rm = 29014 ExtractDRegisterAndLane(instr, 29015 dt, 29016 5, 29017 0, 29018 &lane); 29019 // VMLSL{<c>}{<q>}.<type><size> <Qd>, <Dn>, <Dm[x]> ; T1 NOLINT(whitespace/line_length) 29020 vmlsl(CurrentCond(), 29021 dt, 29022 QRegister(rd), 29023 DRegister(rn), 29024 DRegisterLane(rm, lane)); 29025 break; 29026 } 29027 case 0x00000100: { 29028 // 0xef800740 29029 if ((instr & 0x10000000) == 0x00000000) { 29030 if (((instr & 0x300000) == 0x300000)) { 29031 UnallocatedT32(instr); 29032 return; 29033 } 29034 DataType dt = Dt_size_13_Decode( 29035 (instr >> 20) & 0x3); 29036 if (dt.Is(kDataTypeValueInvalid)) { 29037 UnallocatedT32(instr); 29038 return; 29039 } 29040 if (((instr >> 12) & 1) != 0) { 29041 UnallocatedT32(instr); 29042 return; 29043 } 29044 unsigned rd = 29045 ExtractQRegister(instr, 22, 12); 29046 unsigned rn = 29047 ExtractDRegister(instr, 7, 16); 29048 uint32_t mvm = (instr & 0xf) | 29049 ((instr >> 1) & 0x10); 29050 uint32_t shift = 4; 29051 if (dt.Is(S16)) { 29052 shift = 3; 29053 } 29054 uint32_t vm = mvm & ((1 << shift) - 1); 29055 uint32_t index = mvm >> shift; 29056 // VQDMLSL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm>[<index>] ; T2 NOLINT(whitespace/line_length) 29057 vqdmlsl(CurrentCond(), 29058 dt, 29059 QRegister(rd), 29060 DRegister(rn), 29061 DRegister(vm), 29062 index); 29063 } else { 29064 UnallocatedT32(instr); 29065 } 29066 break; 29067 } 29068 } 29069 break; 29070 } 29071 } 29072 break; 29073 } 29074 case 0x00000800: { 29075 // 0xef800800 29076 switch (instr & 0x00000300) { 29077 case 0x00000000: { 29078 // 0xef800800 29079 if (((instr & 0x300000) == 0x300000)) { 29080 UnallocatedT32(instr); 29081 return; 29082 } 29083 DataType dt = 29084 Dt_size_12_Decode((instr >> 20) & 0x3, 29085 (instr >> 28) & 0x1); 29086 if (dt.Is(kDataTypeValueInvalid)) { 29087 UnallocatedT32(instr); 29088 return; 29089 } 29090 if (((instr >> 12) & 1) != 0) { 29091 UnallocatedT32(instr); 29092 return; 29093 } 29094 unsigned rd = ExtractQRegister(instr, 22, 12); 29095 unsigned rn = ExtractDRegister(instr, 7, 16); 29096 unsigned rm = ExtractDRegister(instr, 5, 0); 29097 // VMLAL{<c>}{<q>}.<type><size> <Qd>, <Dn>, <Dm> ; T1 NOLINT(whitespace/line_length) 29098 vmlal(CurrentCond(), 29099 dt, 29100 QRegister(rd), 29101 DRegister(rn), 29102 DRegister(rm)); 29103 break; 29104 } 29105 case 0x00000100: { 29106 // 0xef800900 29107 if ((instr & 0x10000000) == 0x00000000) { 29108 if (((instr & 0x300000) == 0x300000)) { 29109 UnallocatedT32(instr); 29110 return; 29111 } 29112 DataType dt = 29113 Dt_size_13_Decode((instr >> 20) & 0x3); 29114 if (dt.Is(kDataTypeValueInvalid)) { 29115 UnallocatedT32(instr); 29116 return; 29117 } 29118 if (((instr >> 12) & 1) != 0) { 29119 UnallocatedT32(instr); 29120 return; 29121 } 29122 unsigned rd = 29123 ExtractQRegister(instr, 22, 12); 29124 unsigned rn = 29125 ExtractDRegister(instr, 7, 16); 29126 unsigned rm = ExtractDRegister(instr, 5, 0); 29127 // VQDMLAL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; T1 NOLINT(whitespace/line_length) 29128 vqdmlal(CurrentCond(), 29129 dt, 29130 QRegister(rd), 29131 DRegister(rn), 29132 DRegister(rm)); 29133 } else { 29134 UnallocatedT32(instr); 29135 } 29136 break; 29137 } 29138 case 0x00000200: { 29139 // 0xef800a00 29140 if (((instr & 0x300000) == 0x300000)) { 29141 UnallocatedT32(instr); 29142 return; 29143 } 29144 DataType dt = 29145 Dt_size_12_Decode((instr >> 20) & 0x3, 29146 (instr >> 28) & 0x1); 29147 if (dt.Is(kDataTypeValueInvalid)) { 29148 UnallocatedT32(instr); 29149 return; 29150 } 29151 if (((instr >> 12) & 1) != 0) { 29152 UnallocatedT32(instr); 29153 return; 29154 } 29155 unsigned rd = ExtractQRegister(instr, 22, 12); 29156 unsigned rn = ExtractDRegister(instr, 7, 16); 29157 unsigned rm = ExtractDRegister(instr, 5, 0); 29158 // VMLSL{<c>}{<q>}.<type><size> <Qd>, <Dn>, <Dm> ; T1 NOLINT(whitespace/line_length) 29159 vmlsl(CurrentCond(), 29160 dt, 29161 QRegister(rd), 29162 DRegister(rn), 29163 DRegister(rm)); 29164 break; 29165 } 29166 case 0x00000300: { 29167 // 0xef800b00 29168 if ((instr & 0x10000000) == 0x00000000) { 29169 if (((instr & 0x300000) == 0x300000)) { 29170 UnallocatedT32(instr); 29171 return; 29172 } 29173 DataType dt = 29174 Dt_size_13_Decode((instr >> 20) & 0x3); 29175 if (dt.Is(kDataTypeValueInvalid)) { 29176 UnallocatedT32(instr); 29177 return; 29178 } 29179 if (((instr >> 12) & 1) != 0) { 29180 UnallocatedT32(instr); 29181 return; 29182 } 29183 unsigned rd = 29184 ExtractQRegister(instr, 22, 12); 29185 unsigned rn = 29186 ExtractDRegister(instr, 7, 16); 29187 unsigned rm = ExtractDRegister(instr, 5, 0); 29188 // VQDMLSL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; T1 NOLINT(whitespace/line_length) 29189 vqdmlsl(CurrentCond(), 29190 dt, 29191 QRegister(rd), 29192 DRegister(rn), 29193 DRegister(rm)); 29194 } else { 29195 UnallocatedT32(instr); 29196 } 29197 break; 29198 } 29199 } 29200 break; 29201 } 29202 case 0x00000840: { 29203 // 0xef800840 29204 switch (instr & 0x00000200) { 29205 case 0x00000000: { 29206 // 0xef800840 29207 switch (instr & 0x10000000) { 29208 case 0x00000000: { 29209 // 0xef800840 29210 if (((instr & 0x300000) == 0x300000)) { 29211 UnallocatedT32(instr); 29212 return; 29213 } 29214 DataType dt = Dt_F_size_3_Decode( 29215 ((instr >> 20) & 0x3) | 29216 ((instr >> 6) & 0x4)); 29217 if (dt.Is(kDataTypeValueInvalid)) { 29218 UnallocatedT32(instr); 29219 return; 29220 } 29221 unsigned rd = 29222 ExtractDRegister(instr, 22, 12); 29223 unsigned rn = 29224 ExtractDRegister(instr, 7, 16); 29225 uint32_t mvm = 29226 (instr & 0xf) | ((instr >> 1) & 0x10); 29227 uint32_t shift = 4; 29228 if (dt.Is(I16)) { 29229 shift = 3; 29230 } 29231 uint32_t vm = mvm & ((1 << shift) - 1); 29232 uint32_t index = mvm >> shift; 29233 // VMUL{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm>[<index>] ; T1 NOLINT(whitespace/line_length) 29234 vmul(CurrentCond(), 29235 dt, 29236 DRegister(rd), 29237 DRegister(rn), 29238 DRegister(vm), 29239 index); 29240 break; 29241 } 29242 case 0x10000000: { 29243 // 0xff800840 29244 if (((instr & 0x300000) == 0x300000)) { 29245 UnallocatedT32(instr); 29246 return; 29247 } 29248 DataType dt = Dt_F_size_3_Decode( 29249 ((instr >> 20) & 0x3) | 29250 ((instr >> 6) & 0x4)); 29251 if (dt.Is(kDataTypeValueInvalid)) { 29252 UnallocatedT32(instr); 29253 return; 29254 } 29255 if (((instr >> 12) & 1) != 0) { 29256 UnallocatedT32(instr); 29257 return; 29258 } 29259 unsigned rd = 29260 ExtractQRegister(instr, 22, 12); 29261 if (((instr >> 16) & 1) != 0) { 29262 UnallocatedT32(instr); 29263 return; 29264 } 29265 unsigned rn = 29266 ExtractQRegister(instr, 7, 16); 29267 uint32_t mvm = 29268 (instr & 0xf) | ((instr >> 1) & 0x10); 29269 uint32_t shift = 4; 29270 if (dt.Is(I16)) { 29271 shift = 3; 29272 } 29273 uint32_t vm = mvm & ((1 << shift) - 1); 29274 uint32_t index = mvm >> shift; 29275 // VMUL{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Dm>[<index>] ; T1 NOLINT(whitespace/line_length) 29276 vmul(CurrentCond(), 29277 dt, 29278 QRegister(rd), 29279 QRegister(rn), 29280 DRegister(vm), 29281 index); 29282 break; 29283 } 29284 } 29285 break; 29286 } 29287 case 0x00000200: { 29288 // 0xef800a40 29289 switch (instr & 0x00000100) { 29290 case 0x00000000: { 29291 // 0xef800a40 29292 if (((instr & 0x300000) == 0x300000)) { 29293 UnallocatedT32(instr); 29294 return; 29295 } 29296 DataType dt = Dt_U_size_2_Decode( 29297 ((instr >> 20) & 0x3) | 29298 ((instr >> 26) & 0x4)); 29299 if (dt.Is(kDataTypeValueInvalid)) { 29300 UnallocatedT32(instr); 29301 return; 29302 } 29303 if (((instr >> 12) & 1) != 0) { 29304 UnallocatedT32(instr); 29305 return; 29306 } 29307 unsigned rd = 29308 ExtractQRegister(instr, 22, 12); 29309 unsigned rn = 29310 ExtractDRegister(instr, 7, 16); 29311 uint32_t mvm = 29312 (instr & 0xf) | ((instr >> 1) & 0x10); 29313 uint32_t shift = 4; 29314 if (dt.Is(S16) || dt.Is(U16)) { 29315 shift = 3; 29316 } 29317 uint32_t vm = mvm & ((1 << shift) - 1); 29318 uint32_t index = mvm >> shift; 29319 // VMULL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm>[<index>] ; T1 NOLINT(whitespace/line_length) 29320 vmull(CurrentCond(), 29321 dt, 29322 QRegister(rd), 29323 DRegister(rn), 29324 DRegister(vm), 29325 index); 29326 break; 29327 } 29328 case 0x00000100: { 29329 // 0xef800b40 29330 if ((instr & 0x10000000) == 0x00000000) { 29331 if (((instr & 0x300000) == 0x300000)) { 29332 UnallocatedT32(instr); 29333 return; 29334 } 29335 DataType dt = Dt_size_13_Decode( 29336 (instr >> 20) & 0x3); 29337 if (dt.Is(kDataTypeValueInvalid)) { 29338 UnallocatedT32(instr); 29339 return; 29340 } 29341 if (((instr >> 12) & 1) != 0) { 29342 UnallocatedT32(instr); 29343 return; 29344 } 29345 unsigned rd = 29346 ExtractQRegister(instr, 22, 12); 29347 unsigned rn = 29348 ExtractDRegister(instr, 7, 16); 29349 int lane; 29350 unsigned rm = 29351 ExtractDRegisterAndLane(instr, 29352 dt, 29353 5, 29354 0, 29355 &lane); 29356 // VQDMULL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm[x]> ; T2 NOLINT(whitespace/line_length) 29357 vqdmull(CurrentCond(), 29358 dt, 29359 QRegister(rd), 29360 DRegister(rn), 29361 DRegisterLane(rm, lane)); 29362 } else { 29363 UnallocatedT32(instr); 29364 } 29365 break; 29366 } 29367 } 29368 break; 29369 } 29370 } 29371 break; 29372 } 29373 case 0x00000c00: { 29374 // 0xef800c00 29375 switch (instr & 0x00000100) { 29376 case 0x00000000: { 29377 // 0xef800c00 29378 if (((instr & 0x300000) == 0x300000)) { 29379 UnallocatedT32(instr); 29380 return; 29381 } 29382 DataType dt = Dt_op_U_size_1_Decode( 29383 ((instr >> 20) & 0x3) | 29384 ((instr >> 26) & 0x4) | 29385 ((instr >> 6) & 0x8)); 29386 if (dt.Is(kDataTypeValueInvalid)) { 29387 UnallocatedT32(instr); 29388 return; 29389 } 29390 if (((instr >> 12) & 1) != 0) { 29391 UnallocatedT32(instr); 29392 return; 29393 } 29394 unsigned rd = ExtractQRegister(instr, 22, 12); 29395 unsigned rn = ExtractDRegister(instr, 7, 16); 29396 unsigned rm = ExtractDRegister(instr, 5, 0); 29397 // VMULL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; T1 29398 vmull(CurrentCond(), 29399 dt, 29400 QRegister(rd), 29401 DRegister(rn), 29402 DRegister(rm)); 29403 break; 29404 } 29405 case 0x00000100: { 29406 // 0xef800d00 29407 if ((instr & 0x10000200) == 0x00000000) { 29408 if (((instr & 0x300000) == 0x300000)) { 29409 UnallocatedT32(instr); 29410 return; 29411 } 29412 DataType dt = 29413 Dt_size_13_Decode((instr >> 20) & 0x3); 29414 if (dt.Is(kDataTypeValueInvalid)) { 29415 UnallocatedT32(instr); 29416 return; 29417 } 29418 if (((instr >> 12) & 1) != 0) { 29419 UnallocatedT32(instr); 29420 return; 29421 } 29422 unsigned rd = 29423 ExtractQRegister(instr, 22, 12); 29424 unsigned rn = 29425 ExtractDRegister(instr, 7, 16); 29426 unsigned rm = ExtractDRegister(instr, 5, 0); 29427 // VQDMULL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; T1 NOLINT(whitespace/line_length) 29428 vqdmull(CurrentCond(), 29429 dt, 29430 QRegister(rd), 29431 DRegister(rn), 29432 DRegister(rm)); 29433 } else { 29434 UnallocatedT32(instr); 29435 } 29436 break; 29437 } 29438 } 29439 break; 29440 } 29441 case 0x00000c40: { 29442 // 0xef800c40 29443 switch (instr & 0x10000300) { 29444 case 0x00000000: { 29445 // 0xef800c40 29446 if (((instr & 0x300000) == 0x300000)) { 29447 UnallocatedT32(instr); 29448 return; 29449 } 29450 DataType dt = 29451 Dt_size_13_Decode((instr >> 20) & 0x3); 29452 if (dt.Is(kDataTypeValueInvalid)) { 29453 UnallocatedT32(instr); 29454 return; 29455 } 29456 unsigned rd = ExtractDRegister(instr, 22, 12); 29457 unsigned rn = ExtractDRegister(instr, 7, 16); 29458 int lane; 29459 unsigned rm = ExtractDRegisterAndLane(instr, 29460 dt, 29461 5, 29462 0, 29463 &lane); 29464 // VQDMULH{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm[x]> ; T2 NOLINT(whitespace/line_length) 29465 vqdmulh(CurrentCond(), 29466 dt, 29467 DRegister(rd), 29468 DRegister(rn), 29469 DRegisterLane(rm, lane)); 29470 break; 29471 } 29472 case 0x00000100: { 29473 // 0xef800d40 29474 if (((instr & 0x300000) == 0x300000)) { 29475 UnallocatedT32(instr); 29476 return; 29477 } 29478 DataType dt = 29479 Dt_size_13_Decode((instr >> 20) & 0x3); 29480 if (dt.Is(kDataTypeValueInvalid)) { 29481 UnallocatedT32(instr); 29482 return; 29483 } 29484 unsigned rd = ExtractDRegister(instr, 22, 12); 29485 unsigned rn = ExtractDRegister(instr, 7, 16); 29486 int lane; 29487 unsigned rm = ExtractDRegisterAndLane(instr, 29488 dt, 29489 5, 29490 0, 29491 &lane); 29492 // VQRDMULH{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm[x]> ; T2 NOLINT(whitespace/line_length) 29493 vqrdmulh(CurrentCond(), 29494 dt, 29495 DRegister(rd), 29496 DRegister(rn), 29497 DRegisterLane(rm, lane)); 29498 break; 29499 } 29500 case 0x10000000: { 29501 // 0xff800c40 29502 if (((instr & 0x300000) == 0x300000)) { 29503 UnallocatedT32(instr); 29504 return; 29505 } 29506 DataType dt = 29507 Dt_size_13_Decode((instr >> 20) & 0x3); 29508 if (dt.Is(kDataTypeValueInvalid)) { 29509 UnallocatedT32(instr); 29510 return; 29511 } 29512 if (((instr >> 12) & 1) != 0) { 29513 UnallocatedT32(instr); 29514 return; 29515 } 29516 unsigned rd = ExtractQRegister(instr, 22, 12); 29517 if (((instr >> 16) & 1) != 0) { 29518 UnallocatedT32(instr); 29519 return; 29520 } 29521 unsigned rn = ExtractQRegister(instr, 7, 16); 29522 int lane; 29523 unsigned rm = ExtractDRegisterAndLane(instr, 29524 dt, 29525 5, 29526 0, 29527 &lane); 29528 // VQDMULH{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Dm[x]> ; T2 NOLINT(whitespace/line_length) 29529 vqdmulh(CurrentCond(), 29530 dt, 29531 QRegister(rd), 29532 QRegister(rn), 29533 DRegisterLane(rm, lane)); 29534 break; 29535 } 29536 case 0x10000100: { 29537 // 0xff800d40 29538 if (((instr & 0x300000) == 0x300000)) { 29539 UnallocatedT32(instr); 29540 return; 29541 } 29542 DataType dt = 29543 Dt_size_13_Decode((instr >> 20) & 0x3); 29544 if (dt.Is(kDataTypeValueInvalid)) { 29545 UnallocatedT32(instr); 29546 return; 29547 } 29548 if (((instr >> 12) & 1) != 0) { 29549 UnallocatedT32(instr); 29550 return; 29551 } 29552 unsigned rd = ExtractQRegister(instr, 22, 12); 29553 if (((instr >> 16) & 1) != 0) { 29554 UnallocatedT32(instr); 29555 return; 29556 } 29557 unsigned rn = ExtractQRegister(instr, 7, 16); 29558 int lane; 29559 unsigned rm = ExtractDRegisterAndLane(instr, 29560 dt, 29561 5, 29562 0, 29563 &lane); 29564 // VQRDMULH{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Dm[x]> ; T2 NOLINT(whitespace/line_length) 29565 vqrdmulh(CurrentCond(), 29566 dt, 29567 QRegister(rd), 29568 QRegister(rn), 29569 DRegisterLane(rm, lane)); 29570 break; 29571 } 29572 default: 29573 UnallocatedT32(instr); 29574 break; 29575 } 29576 break; 29577 } 29578 } 29579 break; 29580 } 29581 } 29582 break; 29583 } 29584 } 29585 break; 29586 } 29587 case 0x01000010: { 29588 // 0xef000010 29589 switch (instr & 0x00800040) { 29590 case 0x00000000: { 29591 // 0xef000010 29592 switch (instr & 0x00000f00) { 29593 case 0x00000000: { 29594 // 0xef000010 29595 DataType dt = Dt_U_size_3_Decode( 29596 ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4)); 29597 if (dt.Is(kDataTypeValueInvalid)) { 29598 UnallocatedT32(instr); 29599 return; 29600 } 29601 unsigned rd = ExtractDRegister(instr, 22, 12); 29602 unsigned rn = ExtractDRegister(instr, 7, 16); 29603 unsigned rm = ExtractDRegister(instr, 5, 0); 29604 // VQADD{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1 29605 vqadd(CurrentCond(), 29606 dt, 29607 DRegister(rd), 29608 DRegister(rn), 29609 DRegister(rm)); 29610 break; 29611 } 29612 case 0x00000100: { 29613 // 0xef000110 29614 switch (instr & 0x10300000) { 29615 case 0x00000000: { 29616 // 0xef000110 29617 unsigned rd = ExtractDRegister(instr, 22, 12); 29618 unsigned rn = ExtractDRegister(instr, 7, 16); 29619 unsigned rm = ExtractDRegister(instr, 5, 0); 29620 // VAND{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; T1 29621 vand(CurrentCond(), 29622 kDataTypeValueNone, 29623 DRegister(rd), 29624 DRegister(rn), 29625 DRegister(rm)); 29626 break; 29627 } 29628 case 0x00100000: { 29629 // 0xef100110 29630 unsigned rd = ExtractDRegister(instr, 22, 12); 29631 unsigned rn = ExtractDRegister(instr, 7, 16); 29632 unsigned rm = ExtractDRegister(instr, 5, 0); 29633 // VBIC{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; T1 29634 vbic(CurrentCond(), 29635 kDataTypeValueNone, 29636 DRegister(rd), 29637 DRegister(rn), 29638 DRegister(rm)); 29639 break; 29640 } 29641 case 0x00200000: { 29642 // 0xef200110 29643 if (((instr & 0x00000040) == 0x00000000) && 29644 ((((Uint32((instr >> 7)) & Uint32(0x1)) 29645 << 4) | 29646 (Uint32((instr >> 16)) & Uint32(0xf))) == 29647 (((Uint32((instr >> 5)) & Uint32(0x1)) 29648 << 4) | 29649 (Uint32(instr) & Uint32(0xf))))) { 29650 unsigned rd = ExtractDRegister(instr, 22, 12); 29651 unsigned rm = ExtractDRegister(instr, 7, 16); 29652 // VMOV{<c>}{<q>}{.<dt>} <Dd>, <Dm> ; T1 29653 vmov(CurrentCond(), 29654 kDataTypeValueNone, 29655 DRegister(rd), 29656 DRegister(rm)); 29657 return; 29658 } 29659 unsigned rd = ExtractDRegister(instr, 22, 12); 29660 unsigned rn = ExtractDRegister(instr, 7, 16); 29661 unsigned rm = ExtractDRegister(instr, 5, 0); 29662 // VORR{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; T1 29663 vorr(CurrentCond(), 29664 kDataTypeValueNone, 29665 DRegister(rd), 29666 DRegister(rn), 29667 DRegister(rm)); 29668 break; 29669 } 29670 case 0x00300000: { 29671 // 0xef300110 29672 unsigned rd = ExtractDRegister(instr, 22, 12); 29673 unsigned rn = ExtractDRegister(instr, 7, 16); 29674 unsigned rm = ExtractDRegister(instr, 5, 0); 29675 // VORN{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; T1 29676 vorn(CurrentCond(), 29677 kDataTypeValueNone, 29678 DRegister(rd), 29679 DRegister(rn), 29680 DRegister(rm)); 29681 break; 29682 } 29683 case 0x10000000: { 29684 // 0xff000110 29685 unsigned rd = ExtractDRegister(instr, 22, 12); 29686 unsigned rn = ExtractDRegister(instr, 7, 16); 29687 unsigned rm = ExtractDRegister(instr, 5, 0); 29688 // VEOR{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; T1 29689 veor(CurrentCond(), 29690 kDataTypeValueNone, 29691 DRegister(rd), 29692 DRegister(rn), 29693 DRegister(rm)); 29694 break; 29695 } 29696 case 0x10100000: { 29697 // 0xff100110 29698 unsigned rd = ExtractDRegister(instr, 22, 12); 29699 unsigned rn = ExtractDRegister(instr, 7, 16); 29700 unsigned rm = ExtractDRegister(instr, 5, 0); 29701 // VBSL{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; T1 29702 vbsl(CurrentCond(), 29703 kDataTypeValueNone, 29704 DRegister(rd), 29705 DRegister(rn), 29706 DRegister(rm)); 29707 break; 29708 } 29709 case 0x10200000: { 29710 // 0xff200110 29711 unsigned rd = ExtractDRegister(instr, 22, 12); 29712 unsigned rn = ExtractDRegister(instr, 7, 16); 29713 unsigned rm = ExtractDRegister(instr, 5, 0); 29714 // VBIT{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; T1 29715 vbit(CurrentCond(), 29716 kDataTypeValueNone, 29717 DRegister(rd), 29718 DRegister(rn), 29719 DRegister(rm)); 29720 break; 29721 } 29722 case 0x10300000: { 29723 // 0xff300110 29724 unsigned rd = ExtractDRegister(instr, 22, 12); 29725 unsigned rn = ExtractDRegister(instr, 7, 16); 29726 unsigned rm = ExtractDRegister(instr, 5, 0); 29727 // VBIF{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; T1 29728 vbif(CurrentCond(), 29729 kDataTypeValueNone, 29730 DRegister(rd), 29731 DRegister(rn), 29732 DRegister(rm)); 29733 break; 29734 } 29735 } 29736 break; 29737 } 29738 case 0x00000200: { 29739 // 0xef000210 29740 DataType dt = Dt_U_size_3_Decode( 29741 ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4)); 29742 if (dt.Is(kDataTypeValueInvalid)) { 29743 UnallocatedT32(instr); 29744 return; 29745 } 29746 unsigned rd = ExtractDRegister(instr, 22, 12); 29747 unsigned rn = ExtractDRegister(instr, 7, 16); 29748 unsigned rm = ExtractDRegister(instr, 5, 0); 29749 // VQSUB{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1 29750 vqsub(CurrentCond(), 29751 dt, 29752 DRegister(rd), 29753 DRegister(rn), 29754 DRegister(rm)); 29755 break; 29756 } 29757 case 0x00000300: { 29758 // 0xef000310 29759 DataType dt = Dt_U_size_1_Decode( 29760 ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4)); 29761 if (dt.Is(kDataTypeValueInvalid)) { 29762 UnallocatedT32(instr); 29763 return; 29764 } 29765 unsigned rd = ExtractDRegister(instr, 22, 12); 29766 unsigned rn = ExtractDRegister(instr, 7, 16); 29767 unsigned rm = ExtractDRegister(instr, 5, 0); 29768 // VCGE{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1 29769 vcge(CurrentCond(), 29770 dt, 29771 DRegister(rd), 29772 DRegister(rn), 29773 DRegister(rm)); 29774 break; 29775 } 29776 case 0x00000400: { 29777 // 0xef000410 29778 DataType dt = Dt_U_size_3_Decode( 29779 ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4)); 29780 if (dt.Is(kDataTypeValueInvalid)) { 29781 UnallocatedT32(instr); 29782 return; 29783 } 29784 unsigned rd = ExtractDRegister(instr, 22, 12); 29785 unsigned rm = ExtractDRegister(instr, 5, 0); 29786 unsigned rn = ExtractDRegister(instr, 7, 16); 29787 // VQSHL{<c>}{<q>}.<dt> {<Dd>}, <Dm>, <Dn> ; T1 29788 vqshl(CurrentCond(), 29789 dt, 29790 DRegister(rd), 29791 DRegister(rm), 29792 DRegister(rn)); 29793 break; 29794 } 29795 case 0x00000500: { 29796 // 0xef000510 29797 DataType dt = Dt_U_size_3_Decode( 29798 ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4)); 29799 if (dt.Is(kDataTypeValueInvalid)) { 29800 UnallocatedT32(instr); 29801 return; 29802 } 29803 unsigned rd = ExtractDRegister(instr, 22, 12); 29804 unsigned rm = ExtractDRegister(instr, 5, 0); 29805 unsigned rn = ExtractDRegister(instr, 7, 16); 29806 // VQRSHL{<c>}{<q>}.<dt> {<Dd>}, <Dm>, <Dn> ; T1 29807 vqrshl(CurrentCond(), 29808 dt, 29809 DRegister(rd), 29810 DRegister(rm), 29811 DRegister(rn)); 29812 break; 29813 } 29814 case 0x00000600: { 29815 // 0xef000610 29816 DataType dt = Dt_U_size_1_Decode( 29817 ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4)); 29818 if (dt.Is(kDataTypeValueInvalid)) { 29819 UnallocatedT32(instr); 29820 return; 29821 } 29822 unsigned rd = ExtractDRegister(instr, 22, 12); 29823 unsigned rn = ExtractDRegister(instr, 7, 16); 29824 unsigned rm = ExtractDRegister(instr, 5, 0); 29825 // VMIN{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1 29826 vmin(CurrentCond(), 29827 dt, 29828 DRegister(rd), 29829 DRegister(rn), 29830 DRegister(rm)); 29831 break; 29832 } 29833 case 0x00000700: { 29834 // 0xef000710 29835 DataType dt = Dt_U_size_1_Decode( 29836 ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4)); 29837 if (dt.Is(kDataTypeValueInvalid)) { 29838 UnallocatedT32(instr); 29839 return; 29840 } 29841 unsigned rd = ExtractDRegister(instr, 22, 12); 29842 unsigned rn = ExtractDRegister(instr, 7, 16); 29843 unsigned rm = ExtractDRegister(instr, 5, 0); 29844 // VABA{<c>}{<q>}.<dt> <Dd>, <Dn>, <Dm> ; T1 29845 vaba(CurrentCond(), 29846 dt, 29847 DRegister(rd), 29848 DRegister(rn), 29849 DRegister(rm)); 29850 break; 29851 } 29852 case 0x00000800: { 29853 // 0xef000810 29854 switch (instr & 0x10000000) { 29855 case 0x00000000: { 29856 // 0xef000810 29857 DataType dt = 29858 Dt_size_7_Decode((instr >> 20) & 0x3); 29859 if (dt.Is(kDataTypeValueInvalid)) { 29860 UnallocatedT32(instr); 29861 return; 29862 } 29863 unsigned rd = ExtractDRegister(instr, 22, 12); 29864 unsigned rn = ExtractDRegister(instr, 7, 16); 29865 unsigned rm = ExtractDRegister(instr, 5, 0); 29866 // VTST{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1 29867 vtst(CurrentCond(), 29868 dt, 29869 DRegister(rd), 29870 DRegister(rn), 29871 DRegister(rm)); 29872 break; 29873 } 29874 case 0x10000000: { 29875 // 0xff000810 29876 DataType dt = 29877 Dt_size_4_Decode((instr >> 20) & 0x3); 29878 if (dt.Is(kDataTypeValueInvalid)) { 29879 UnallocatedT32(instr); 29880 return; 29881 } 29882 unsigned rd = ExtractDRegister(instr, 22, 12); 29883 unsigned rn = ExtractDRegister(instr, 7, 16); 29884 unsigned rm = ExtractDRegister(instr, 5, 0); 29885 // VCEQ{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1 29886 vceq(CurrentCond(), 29887 dt, 29888 DRegister(rd), 29889 DRegister(rn), 29890 DRegister(rm)); 29891 break; 29892 } 29893 } 29894 break; 29895 } 29896 case 0x00000900: { 29897 // 0xef000910 29898 DataType dt = Dt_op_size_1_Decode( 29899 ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4)); 29900 if (dt.Is(kDataTypeValueInvalid)) { 29901 UnallocatedT32(instr); 29902 return; 29903 } 29904 unsigned rd = ExtractDRegister(instr, 22, 12); 29905 unsigned rn = ExtractDRegister(instr, 7, 16); 29906 unsigned rm = ExtractDRegister(instr, 5, 0); 29907 // VMUL{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1 29908 vmul(CurrentCond(), 29909 dt, 29910 DRegister(rd), 29911 DRegister(rn), 29912 DRegister(rm)); 29913 break; 29914 } 29915 case 0x00000a00: { 29916 // 0xef000a10 29917 DataType dt = Dt_U_size_1_Decode( 29918 ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4)); 29919 if (dt.Is(kDataTypeValueInvalid)) { 29920 UnallocatedT32(instr); 29921 return; 29922 } 29923 unsigned rd = ExtractDRegister(instr, 22, 12); 29924 unsigned rn = ExtractDRegister(instr, 7, 16); 29925 unsigned rm = ExtractDRegister(instr, 5, 0); 29926 // VPMIN{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1 29927 vpmin(CurrentCond(), 29928 dt, 29929 DRegister(rd), 29930 DRegister(rn), 29931 DRegister(rm)); 29932 break; 29933 } 29934 case 0x00000b00: { 29935 // 0xef000b10 29936 if ((instr & 0x10000000) == 0x00000000) { 29937 DataType dt = Dt_size_4_Decode((instr >> 20) & 0x3); 29938 if (dt.Is(kDataTypeValueInvalid)) { 29939 UnallocatedT32(instr); 29940 return; 29941 } 29942 unsigned rd = ExtractDRegister(instr, 22, 12); 29943 unsigned rn = ExtractDRegister(instr, 7, 16); 29944 unsigned rm = ExtractDRegister(instr, 5, 0); 29945 // VPADD{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; T1 29946 vpadd(CurrentCond(), 29947 dt, 29948 DRegister(rd), 29949 DRegister(rn), 29950 DRegister(rm)); 29951 } else { 29952 UnallocatedT32(instr); 29953 } 29954 break; 29955 } 29956 case 0x00000c00: { 29957 // 0xef000c10 29958 switch (instr & 0x10300000) { 29959 case 0x00000000: { 29960 // 0xef000c10 29961 unsigned rd = ExtractDRegister(instr, 22, 12); 29962 unsigned rn = ExtractDRegister(instr, 7, 16); 29963 unsigned rm = ExtractDRegister(instr, 5, 0); 29964 // VFMA{<c>}{<q>}.F32 <Dd>, <Dn>, <Dm> ; T1 29965 vfma(CurrentCond(), 29966 F32, 29967 DRegister(rd), 29968 DRegister(rn), 29969 DRegister(rm)); 29970 break; 29971 } 29972 case 0x00200000: { 29973 // 0xef200c10 29974 unsigned rd = ExtractDRegister(instr, 22, 12); 29975 unsigned rn = ExtractDRegister(instr, 7, 16); 29976 unsigned rm = ExtractDRegister(instr, 5, 0); 29977 // VFMS{<c>}{<q>}.F32 <Dd>, <Dn>, <Dm> ; T1 29978 vfms(CurrentCond(), 29979 F32, 29980 DRegister(rd), 29981 DRegister(rn), 29982 DRegister(rm)); 29983 break; 29984 } 29985 default: 29986 UnallocatedT32(instr); 29987 break; 29988 } 29989 break; 29990 } 29991 case 0x00000d00: { 29992 // 0xef000d10 29993 switch (instr & 0x10300000) { 29994 case 0x00000000: { 29995 // 0xef000d10 29996 unsigned rd = ExtractDRegister(instr, 22, 12); 29997 unsigned rn = ExtractDRegister(instr, 7, 16); 29998 unsigned rm = ExtractDRegister(instr, 5, 0); 29999 // VMLA{<c>}{<q>}.F32 <Dd>, <Dn>, <Dm> ; T1 30000 vmla(CurrentCond(), 30001 F32, 30002 DRegister(rd), 30003 DRegister(rn), 30004 DRegister(rm)); 30005 break; 30006 } 30007 case 0x00200000: { 30008 // 0xef200d10 30009 unsigned rd = ExtractDRegister(instr, 22, 12); 30010 unsigned rn = ExtractDRegister(instr, 7, 16); 30011 unsigned rm = ExtractDRegister(instr, 5, 0); 30012 // VMLS{<c>}{<q>}.F32 <Dd>, <Dn>, <Dm> ; T1 30013 vmls(CurrentCond(), 30014 F32, 30015 DRegister(rd), 30016 DRegister(rn), 30017 DRegister(rm)); 30018 break; 30019 } 30020 case 0x10000000: { 30021 // 0xff000d10 30022 unsigned rd = ExtractDRegister(instr, 22, 12); 30023 unsigned rn = ExtractDRegister(instr, 7, 16); 30024 unsigned rm = ExtractDRegister(instr, 5, 0); 30025 // VMUL{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T1 30026 vmul(CurrentCond(), 30027 F32, 30028 DRegister(rd), 30029 DRegister(rn), 30030 DRegister(rm)); 30031 break; 30032 } 30033 default: 30034 UnallocatedT32(instr); 30035 break; 30036 } 30037 break; 30038 } 30039 case 0x00000e00: { 30040 // 0xef000e10 30041 switch (instr & 0x10300000) { 30042 case 0x10000000: { 30043 // 0xff000e10 30044 unsigned rd = ExtractDRegister(instr, 22, 12); 30045 unsigned rn = ExtractDRegister(instr, 7, 16); 30046 unsigned rm = ExtractDRegister(instr, 5, 0); 30047 // VACGE{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T1 30048 vacge(CurrentCond(), 30049 F32, 30050 DRegister(rd), 30051 DRegister(rn), 30052 DRegister(rm)); 30053 break; 30054 } 30055 case 0x10200000: { 30056 // 0xff200e10 30057 unsigned rd = ExtractDRegister(instr, 22, 12); 30058 unsigned rn = ExtractDRegister(instr, 7, 16); 30059 unsigned rm = ExtractDRegister(instr, 5, 0); 30060 // VACGT{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T1 30061 vacgt(CurrentCond(), 30062 F32, 30063 DRegister(rd), 30064 DRegister(rn), 30065 DRegister(rm)); 30066 break; 30067 } 30068 default: 30069 UnallocatedT32(instr); 30070 break; 30071 } 30072 break; 30073 } 30074 case 0x00000f00: { 30075 // 0xef000f10 30076 switch (instr & 0x10300000) { 30077 case 0x00000000: { 30078 // 0xef000f10 30079 unsigned rd = ExtractDRegister(instr, 22, 12); 30080 unsigned rn = ExtractDRegister(instr, 7, 16); 30081 unsigned rm = ExtractDRegister(instr, 5, 0); 30082 // VRECPS{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T1 30083 vrecps(CurrentCond(), 30084 F32, 30085 DRegister(rd), 30086 DRegister(rn), 30087 DRegister(rm)); 30088 break; 30089 } 30090 case 0x00200000: { 30091 // 0xef200f10 30092 unsigned rd = ExtractDRegister(instr, 22, 12); 30093 unsigned rn = ExtractDRegister(instr, 7, 16); 30094 unsigned rm = ExtractDRegister(instr, 5, 0); 30095 // VRSQRTS{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; T1 30096 vrsqrts(CurrentCond(), 30097 F32, 30098 DRegister(rd), 30099 DRegister(rn), 30100 DRegister(rm)); 30101 break; 30102 } 30103 case 0x10000000: { 30104 // 0xff000f10 30105 unsigned rd = ExtractDRegister(instr, 22, 12); 30106 unsigned rn = ExtractDRegister(instr, 7, 16); 30107 unsigned rm = ExtractDRegister(instr, 5, 0); 30108 // VMAXNM{<q>}.F32 <Dd>, <Dn>, <Dm> ; T1 30109 vmaxnm(F32, 30110 DRegister(rd), 30111 DRegister(rn), 30112 DRegister(rm)); 30113 if (InITBlock()) { 30114 UnpredictableT32(instr); 30115 } 30116 break; 30117 } 30118 case 0x10200000: { 30119 // 0xff200f10 30120 unsigned rd = ExtractDRegister(instr, 22, 12); 30121 unsigned rn = ExtractDRegister(instr, 7, 16); 30122 unsigned rm = ExtractDRegister(instr, 5, 0); 30123 // VMINNM{<q>}.F32 <Dd>, <Dn>, <Dm> ; T1 30124 vminnm(F32, 30125 DRegister(rd), 30126 DRegister(rn), 30127 DRegister(rm)); 30128 if (InITBlock()) { 30129 UnpredictableT32(instr); 30130 } 30131 break; 30132 } 30133 default: 30134 UnallocatedT32(instr); 30135 break; 30136 } 30137 break; 30138 } 30139 } 30140 break; 30141 } 30142 case 0x00000040: { 30143 // 0xef000050 30144 switch (instr & 0x00000f00) { 30145 case 0x00000000: { 30146 // 0xef000050 30147 DataType dt = Dt_U_size_3_Decode( 30148 ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4)); 30149 if (dt.Is(kDataTypeValueInvalid)) { 30150 UnallocatedT32(instr); 30151 return; 30152 } 30153 if (((instr >> 12) & 1) != 0) { 30154 UnallocatedT32(instr); 30155 return; 30156 } 30157 unsigned rd = ExtractQRegister(instr, 22, 12); 30158 if (((instr >> 16) & 1) != 0) { 30159 UnallocatedT32(instr); 30160 return; 30161 } 30162 unsigned rn = ExtractQRegister(instr, 7, 16); 30163 if ((instr & 1) != 0) { 30164 UnallocatedT32(instr); 30165 return; 30166 } 30167 unsigned rm = ExtractQRegister(instr, 5, 0); 30168 // VQADD{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1 30169 vqadd(CurrentCond(), 30170 dt, 30171 QRegister(rd), 30172 QRegister(rn), 30173 QRegister(rm)); 30174 break; 30175 } 30176 case 0x00000100: { 30177 // 0xef000150 30178 switch (instr & 0x10300000) { 30179 case 0x00000000: { 30180 // 0xef000150 30181 if (((instr >> 12) & 1) != 0) { 30182 UnallocatedT32(instr); 30183 return; 30184 } 30185 unsigned rd = ExtractQRegister(instr, 22, 12); 30186 if (((instr >> 16) & 1) != 0) { 30187 UnallocatedT32(instr); 30188 return; 30189 } 30190 unsigned rn = ExtractQRegister(instr, 7, 16); 30191 if ((instr & 1) != 0) { 30192 UnallocatedT32(instr); 30193 return; 30194 } 30195 unsigned rm = ExtractQRegister(instr, 5, 0); 30196 // VAND{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; T1 30197 vand(CurrentCond(), 30198 kDataTypeValueNone, 30199 QRegister(rd), 30200 QRegister(rn), 30201 QRegister(rm)); 30202 break; 30203 } 30204 case 0x00100000: { 30205 // 0xef100150 30206 if (((instr >> 12) & 1) != 0) { 30207 UnallocatedT32(instr); 30208 return; 30209 } 30210 unsigned rd = ExtractQRegister(instr, 22, 12); 30211 if (((instr >> 16) & 1) != 0) { 30212 UnallocatedT32(instr); 30213 return; 30214 } 30215 unsigned rn = ExtractQRegister(instr, 7, 16); 30216 if ((instr & 1) != 0) { 30217 UnallocatedT32(instr); 30218 return; 30219 } 30220 unsigned rm = ExtractQRegister(instr, 5, 0); 30221 // VBIC{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; T1 30222 vbic(CurrentCond(), 30223 kDataTypeValueNone, 30224 QRegister(rd), 30225 QRegister(rn), 30226 QRegister(rm)); 30227 break; 30228 } 30229 case 0x00200000: { 30230 // 0xef200150 30231 if (((instr & 0x00000040) == 0x00000040) && 30232 ((((Uint32((instr >> 7)) & Uint32(0x1)) 30233 << 4) | 30234 (Uint32((instr >> 16)) & Uint32(0xf))) == 30235 (((Uint32((instr >> 5)) & Uint32(0x1)) 30236 << 4) | 30237 (Uint32(instr) & Uint32(0xf))))) { 30238 if (((instr >> 12) & 1) != 0) { 30239 UnallocatedT32(instr); 30240 return; 30241 } 30242 unsigned rd = ExtractQRegister(instr, 22, 12); 30243 if (((instr >> 16) & 1) != 0) { 30244 UnallocatedT32(instr); 30245 return; 30246 } 30247 unsigned rm = ExtractQRegister(instr, 7, 16); 30248 // VMOV{<c>}{<q>}{.<dt>} <Qd>, <Qm> ; T1 30249 vmov(CurrentCond(), 30250 kDataTypeValueNone, 30251 QRegister(rd), 30252 QRegister(rm)); 30253 return; 30254 } 30255 if (((instr >> 12) & 1) != 0) { 30256 UnallocatedT32(instr); 30257 return; 30258 } 30259 unsigned rd = ExtractQRegister(instr, 22, 12); 30260 if (((instr >> 16) & 1) != 0) { 30261 UnallocatedT32(instr); 30262 return; 30263 } 30264 unsigned rn = ExtractQRegister(instr, 7, 16); 30265 if ((instr & 1) != 0) { 30266 UnallocatedT32(instr); 30267 return; 30268 } 30269 unsigned rm = ExtractQRegister(instr, 5, 0); 30270 // VORR{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; T1 30271 vorr(CurrentCond(), 30272 kDataTypeValueNone, 30273 QRegister(rd), 30274 QRegister(rn), 30275 QRegister(rm)); 30276 break; 30277 } 30278 case 0x00300000: { 30279 // 0xef300150 30280 if (((instr >> 12) & 1) != 0) { 30281 UnallocatedT32(instr); 30282 return; 30283 } 30284 unsigned rd = ExtractQRegister(instr, 22, 12); 30285 if (((instr >> 16) & 1) != 0) { 30286 UnallocatedT32(instr); 30287 return; 30288 } 30289 unsigned rn = ExtractQRegister(instr, 7, 16); 30290 if ((instr & 1) != 0) { 30291 UnallocatedT32(instr); 30292 return; 30293 } 30294 unsigned rm = ExtractQRegister(instr, 5, 0); 30295 // VORN{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; T1 30296 vorn(CurrentCond(), 30297 kDataTypeValueNone, 30298 QRegister(rd), 30299 QRegister(rn), 30300 QRegister(rm)); 30301 break; 30302 } 30303 case 0x10000000: { 30304 // 0xff000150 30305 if (((instr >> 12) & 1) != 0) { 30306 UnallocatedT32(instr); 30307 return; 30308 } 30309 unsigned rd = ExtractQRegister(instr, 22, 12); 30310 if (((instr >> 16) & 1) != 0) { 30311 UnallocatedT32(instr); 30312 return; 30313 } 30314 unsigned rn = ExtractQRegister(instr, 7, 16); 30315 if ((instr & 1) != 0) { 30316 UnallocatedT32(instr); 30317 return; 30318 } 30319 unsigned rm = ExtractQRegister(instr, 5, 0); 30320 // VEOR{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; T1 30321 veor(CurrentCond(), 30322 kDataTypeValueNone, 30323 QRegister(rd), 30324 QRegister(rn), 30325 QRegister(rm)); 30326 break; 30327 } 30328 case 0x10100000: { 30329 // 0xff100150 30330 if (((instr >> 12) & 1) != 0) { 30331 UnallocatedT32(instr); 30332 return; 30333 } 30334 unsigned rd = ExtractQRegister(instr, 22, 12); 30335 if (((instr >> 16) & 1) != 0) { 30336 UnallocatedT32(instr); 30337 return; 30338 } 30339 unsigned rn = ExtractQRegister(instr, 7, 16); 30340 if ((instr & 1) != 0) { 30341 UnallocatedT32(instr); 30342 return; 30343 } 30344 unsigned rm = ExtractQRegister(instr, 5, 0); 30345 // VBSL{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; T1 30346 vbsl(CurrentCond(), 30347 kDataTypeValueNone, 30348 QRegister(rd), 30349 QRegister(rn), 30350 QRegister(rm)); 30351 break; 30352 } 30353 case 0x10200000: { 30354 // 0xff200150 30355 if (((instr >> 12) & 1) != 0) { 30356 UnallocatedT32(instr); 30357 return; 30358 } 30359 unsigned rd = ExtractQRegister(instr, 22, 12); 30360 if (((instr >> 16) & 1) != 0) { 30361 UnallocatedT32(instr); 30362 return; 30363 } 30364 unsigned rn = ExtractQRegister(instr, 7, 16); 30365 if ((instr & 1) != 0) { 30366 UnallocatedT32(instr); 30367 return; 30368 } 30369 unsigned rm = ExtractQRegister(instr, 5, 0); 30370 // VBIT{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; T1 30371 vbit(CurrentCond(), 30372 kDataTypeValueNone, 30373 QRegister(rd), 30374 QRegister(rn), 30375 QRegister(rm)); 30376 break; 30377 } 30378 case 0x10300000: { 30379 // 0xff300150 30380 if (((instr >> 12) & 1) != 0) { 30381 UnallocatedT32(instr); 30382 return; 30383 } 30384 unsigned rd = ExtractQRegister(instr, 22, 12); 30385 if (((instr >> 16) & 1) != 0) { 30386 UnallocatedT32(instr); 30387 return; 30388 } 30389 unsigned rn = ExtractQRegister(instr, 7, 16); 30390 if ((instr & 1) != 0) { 30391 UnallocatedT32(instr); 30392 return; 30393 } 30394 unsigned rm = ExtractQRegister(instr, 5, 0); 30395 // VBIF{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; T1 30396 vbif(CurrentCond(), 30397 kDataTypeValueNone, 30398 QRegister(rd), 30399 QRegister(rn), 30400 QRegister(rm)); 30401 break; 30402 } 30403 } 30404 break; 30405 } 30406 case 0x00000200: { 30407 // 0xef000250 30408 DataType dt = Dt_U_size_3_Decode( 30409 ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4)); 30410 if (dt.Is(kDataTypeValueInvalid)) { 30411 UnallocatedT32(instr); 30412 return; 30413 } 30414 if (((instr >> 12) & 1) != 0) { 30415 UnallocatedT32(instr); 30416 return; 30417 } 30418 unsigned rd = ExtractQRegister(instr, 22, 12); 30419 if (((instr >> 16) & 1) != 0) { 30420 UnallocatedT32(instr); 30421 return; 30422 } 30423 unsigned rn = ExtractQRegister(instr, 7, 16); 30424 if ((instr & 1) != 0) { 30425 UnallocatedT32(instr); 30426 return; 30427 } 30428 unsigned rm = ExtractQRegister(instr, 5, 0); 30429 // VQSUB{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1 30430 vqsub(CurrentCond(), 30431 dt, 30432 QRegister(rd), 30433 QRegister(rn), 30434 QRegister(rm)); 30435 break; 30436 } 30437 case 0x00000300: { 30438 // 0xef000350 30439 DataType dt = Dt_U_size_1_Decode( 30440 ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4)); 30441 if (dt.Is(kDataTypeValueInvalid)) { 30442 UnallocatedT32(instr); 30443 return; 30444 } 30445 if (((instr >> 12) & 1) != 0) { 30446 UnallocatedT32(instr); 30447 return; 30448 } 30449 unsigned rd = ExtractQRegister(instr, 22, 12); 30450 if (((instr >> 16) & 1) != 0) { 30451 UnallocatedT32(instr); 30452 return; 30453 } 30454 unsigned rn = ExtractQRegister(instr, 7, 16); 30455 if ((instr & 1) != 0) { 30456 UnallocatedT32(instr); 30457 return; 30458 } 30459 unsigned rm = ExtractQRegister(instr, 5, 0); 30460 // VCGE{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1 30461 vcge(CurrentCond(), 30462 dt, 30463 QRegister(rd), 30464 QRegister(rn), 30465 QRegister(rm)); 30466 break; 30467 } 30468 case 0x00000400: { 30469 // 0xef000450 30470 DataType dt = Dt_U_size_3_Decode( 30471 ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4)); 30472 if (dt.Is(kDataTypeValueInvalid)) { 30473 UnallocatedT32(instr); 30474 return; 30475 } 30476 if (((instr >> 12) & 1) != 0) { 30477 UnallocatedT32(instr); 30478 return; 30479 } 30480 unsigned rd = ExtractQRegister(instr, 22, 12); 30481 if ((instr & 1) != 0) { 30482 UnallocatedT32(instr); 30483 return; 30484 } 30485 unsigned rm = ExtractQRegister(instr, 5, 0); 30486 if (((instr >> 16) & 1) != 0) { 30487 UnallocatedT32(instr); 30488 return; 30489 } 30490 unsigned rn = ExtractQRegister(instr, 7, 16); 30491 // VQSHL{<c>}{<q>}.<dt> {<Qd>}, <Qm>, <Qn> ; T1 30492 vqshl(CurrentCond(), 30493 dt, 30494 QRegister(rd), 30495 QRegister(rm), 30496 QRegister(rn)); 30497 break; 30498 } 30499 case 0x00000500: { 30500 // 0xef000550 30501 DataType dt = Dt_U_size_3_Decode( 30502 ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4)); 30503 if (dt.Is(kDataTypeValueInvalid)) { 30504 UnallocatedT32(instr); 30505 return; 30506 } 30507 if (((instr >> 12) & 1) != 0) { 30508 UnallocatedT32(instr); 30509 return; 30510 } 30511 unsigned rd = ExtractQRegister(instr, 22, 12); 30512 if ((instr & 1) != 0) { 30513 UnallocatedT32(instr); 30514 return; 30515 } 30516 unsigned rm = ExtractQRegister(instr, 5, 0); 30517 if (((instr >> 16) & 1) != 0) { 30518 UnallocatedT32(instr); 30519 return; 30520 } 30521 unsigned rn = ExtractQRegister(instr, 7, 16); 30522 // VQRSHL{<c>}{<q>}.<dt> {<Qd>}, <Qm>, <Qn> ; T1 30523 vqrshl(CurrentCond(), 30524 dt, 30525 QRegister(rd), 30526 QRegister(rm), 30527 QRegister(rn)); 30528 break; 30529 } 30530 case 0x00000600: { 30531 // 0xef000650 30532 DataType dt = Dt_U_size_1_Decode( 30533 ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4)); 30534 if (dt.Is(kDataTypeValueInvalid)) { 30535 UnallocatedT32(instr); 30536 return; 30537 } 30538 if (((instr >> 12) & 1) != 0) { 30539 UnallocatedT32(instr); 30540 return; 30541 } 30542 unsigned rd = ExtractQRegister(instr, 22, 12); 30543 if (((instr >> 16) & 1) != 0) { 30544 UnallocatedT32(instr); 30545 return; 30546 } 30547 unsigned rn = ExtractQRegister(instr, 7, 16); 30548 if ((instr & 1) != 0) { 30549 UnallocatedT32(instr); 30550 return; 30551 } 30552 unsigned rm = ExtractQRegister(instr, 5, 0); 30553 // VMIN{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1 30554 vmin(CurrentCond(), 30555 dt, 30556 QRegister(rd), 30557 QRegister(rn), 30558 QRegister(rm)); 30559 break; 30560 } 30561 case 0x00000700: { 30562 // 0xef000750 30563 DataType dt = Dt_U_size_1_Decode( 30564 ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4)); 30565 if (dt.Is(kDataTypeValueInvalid)) { 30566 UnallocatedT32(instr); 30567 return; 30568 } 30569 if (((instr >> 12) & 1) != 0) { 30570 UnallocatedT32(instr); 30571 return; 30572 } 30573 unsigned rd = ExtractQRegister(instr, 22, 12); 30574 if (((instr >> 16) & 1) != 0) { 30575 UnallocatedT32(instr); 30576 return; 30577 } 30578 unsigned rn = ExtractQRegister(instr, 7, 16); 30579 if ((instr & 1) != 0) { 30580 UnallocatedT32(instr); 30581 return; 30582 } 30583 unsigned rm = ExtractQRegister(instr, 5, 0); 30584 // VABA{<c>}{<q>}.<dt> <Qd>, <Qn>, <Qm> ; T1 30585 vaba(CurrentCond(), 30586 dt, 30587 QRegister(rd), 30588 QRegister(rn), 30589 QRegister(rm)); 30590 break; 30591 } 30592 case 0x00000800: { 30593 // 0xef000850 30594 switch (instr & 0x10000000) { 30595 case 0x00000000: { 30596 // 0xef000850 30597 DataType dt = 30598 Dt_size_7_Decode((instr >> 20) & 0x3); 30599 if (dt.Is(kDataTypeValueInvalid)) { 30600 UnallocatedT32(instr); 30601 return; 30602 } 30603 if (((instr >> 12) & 1) != 0) { 30604 UnallocatedT32(instr); 30605 return; 30606 } 30607 unsigned rd = ExtractQRegister(instr, 22, 12); 30608 if (((instr >> 16) & 1) != 0) { 30609 UnallocatedT32(instr); 30610 return; 30611 } 30612 unsigned rn = ExtractQRegister(instr, 7, 16); 30613 if ((instr & 1) != 0) { 30614 UnallocatedT32(instr); 30615 return; 30616 } 30617 unsigned rm = ExtractQRegister(instr, 5, 0); 30618 // VTST{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1 30619 vtst(CurrentCond(), 30620 dt, 30621 QRegister(rd), 30622 QRegister(rn), 30623 QRegister(rm)); 30624 break; 30625 } 30626 case 0x10000000: { 30627 // 0xff000850 30628 DataType dt = 30629 Dt_size_4_Decode((instr >> 20) & 0x3); 30630 if (dt.Is(kDataTypeValueInvalid)) { 30631 UnallocatedT32(instr); 30632 return; 30633 } 30634 if (((instr >> 12) & 1) != 0) { 30635 UnallocatedT32(instr); 30636 return; 30637 } 30638 unsigned rd = ExtractQRegister(instr, 22, 12); 30639 if (((instr >> 16) & 1) != 0) { 30640 UnallocatedT32(instr); 30641 return; 30642 } 30643 unsigned rn = ExtractQRegister(instr, 7, 16); 30644 if ((instr & 1) != 0) { 30645 UnallocatedT32(instr); 30646 return; 30647 } 30648 unsigned rm = ExtractQRegister(instr, 5, 0); 30649 // VCEQ{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1 30650 vceq(CurrentCond(), 30651 dt, 30652 QRegister(rd), 30653 QRegister(rn), 30654 QRegister(rm)); 30655 break; 30656 } 30657 } 30658 break; 30659 } 30660 case 0x00000900: { 30661 // 0xef000950 30662 DataType dt = Dt_op_size_1_Decode( 30663 ((instr >> 20) & 0x3) | ((instr >> 26) & 0x4)); 30664 if (dt.Is(kDataTypeValueInvalid)) { 30665 UnallocatedT32(instr); 30666 return; 30667 } 30668 if (((instr >> 12) & 1) != 0) { 30669 UnallocatedT32(instr); 30670 return; 30671 } 30672 unsigned rd = ExtractQRegister(instr, 22, 12); 30673 if (((instr >> 16) & 1) != 0) { 30674 UnallocatedT32(instr); 30675 return; 30676 } 30677 unsigned rn = ExtractQRegister(instr, 7, 16); 30678 if ((instr & 1) != 0) { 30679 UnallocatedT32(instr); 30680 return; 30681 } 30682 unsigned rm = ExtractQRegister(instr, 5, 0); 30683 // VMUL{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; T1 30684 vmul(CurrentCond(), 30685 dt, 30686 QRegister(rd), 30687 QRegister(rn), 30688 QRegister(rm)); 30689 break; 30690 } 30691 case 0x00000c00: { 30692 // 0xef000c50 30693 switch (instr & 0x10300000) { 30694 case 0x00000000: { 30695 // 0xef000c50 30696 if (((instr >> 12) & 1) != 0) { 30697 UnallocatedT32(instr); 30698 return; 30699 } 30700 unsigned rd = ExtractQRegister(instr, 22, 12); 30701 if (((instr >> 16) & 1) != 0) { 30702 UnallocatedT32(instr); 30703 return; 30704 } 30705 unsigned rn = ExtractQRegister(instr, 7, 16); 30706 if ((instr & 1) != 0) { 30707 UnallocatedT32(instr); 30708 return; 30709 } 30710 unsigned rm = ExtractQRegister(instr, 5, 0); 30711 // VFMA{<c>}{<q>}.F32 <Qd>, <Qn>, <Qm> ; T1 30712 vfma(CurrentCond(), 30713 F32, 30714 QRegister(rd), 30715 QRegister(rn), 30716 QRegister(rm)); 30717 break; 30718 } 30719 case 0x00200000: { 30720 // 0xef200c50 30721 if (((instr >> 12) & 1) != 0) { 30722 UnallocatedT32(instr); 30723 return; 30724 } 30725 unsigned rd = ExtractQRegister(instr, 22, 12); 30726 if (((instr >> 16) & 1) != 0) { 30727 UnallocatedT32(instr); 30728 return; 30729 } 30730 unsigned rn = ExtractQRegister(instr, 7, 16); 30731 if ((instr & 1) != 0) { 30732 UnallocatedT32(instr); 30733 return; 30734 } 30735 unsigned rm = ExtractQRegister(instr, 5, 0); 30736 // VFMS{<c>}{<q>}.F32 <Qd>, <Qn>, <Qm> ; T1 30737 vfms(CurrentCond(), 30738 F32, 30739 QRegister(rd), 30740 QRegister(rn), 30741 QRegister(rm)); 30742 break; 30743 } 30744 default: 30745 UnallocatedT32(instr); 30746 break; 30747 } 30748 break; 30749 } 30750 case 0x00000d00: { 30751 // 0xef000d50 30752 switch (instr & 0x10300000) { 30753 case 0x00000000: { 30754 // 0xef000d50 30755 if (((instr >> 12) & 1) != 0) { 30756 UnallocatedT32(instr); 30757 return; 30758 } 30759 unsigned rd = ExtractQRegister(instr, 22, 12); 30760 if (((instr >> 16) & 1) != 0) { 30761 UnallocatedT32(instr); 30762 return; 30763 } 30764 unsigned rn = ExtractQRegister(instr, 7, 16); 30765 if ((instr & 1) != 0) { 30766 UnallocatedT32(instr); 30767 return; 30768 } 30769 unsigned rm = ExtractQRegister(instr, 5, 0); 30770 // VMLA{<c>}{<q>}.F32 <Qd>, <Qn>, <Qm> ; T1 30771 vmla(CurrentCond(), 30772 F32, 30773 QRegister(rd), 30774 QRegister(rn), 30775 QRegister(rm)); 30776 break; 30777 } 30778 case 0x00200000: { 30779 // 0xef200d50 30780 if (((instr >> 12) & 1) != 0) { 30781 UnallocatedT32(instr); 30782 return; 30783 } 30784 unsigned rd = ExtractQRegister(instr, 22, 12); 30785 if (((instr >> 16) & 1) != 0) { 30786 UnallocatedT32(instr); 30787 return; 30788 } 30789 unsigned rn = ExtractQRegister(instr, 7, 16); 30790 if ((instr & 1) != 0) { 30791 UnallocatedT32(instr); 30792 return; 30793 } 30794 unsigned rm = ExtractQRegister(instr, 5, 0); 30795 // VMLS{<c>}{<q>}.F32 <Qd>, <Qn>, <Qm> ; T1 30796 vmls(CurrentCond(), 30797 F32, 30798 QRegister(rd), 30799 QRegister(rn), 30800 QRegister(rm)); 30801 break; 30802 } 30803 case 0x10000000: { 30804 // 0xff000d50 30805 if (((instr >> 12) & 1) != 0) { 30806 UnallocatedT32(instr); 30807 return; 30808 } 30809 unsigned rd = ExtractQRegister(instr, 22, 12); 30810 if (((instr >> 16) & 1) != 0) { 30811 UnallocatedT32(instr); 30812 return; 30813 } 30814 unsigned rn = ExtractQRegister(instr, 7, 16); 30815 if ((instr & 1) != 0) { 30816 UnallocatedT32(instr); 30817 return; 30818 } 30819 unsigned rm = ExtractQRegister(instr, 5, 0); 30820 // VMUL{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; T1 30821 vmul(CurrentCond(), 30822 F32, 30823 QRegister(rd), 30824 QRegister(rn), 30825 QRegister(rm)); 30826 break; 30827 } 30828 default: 30829 UnallocatedT32(instr); 30830 break; 30831 } 30832 break; 30833 } 30834 case 0x00000e00: { 30835 // 0xef000e50 30836 switch (instr & 0x10300000) { 30837 case 0x10000000: { 30838 // 0xff000e50 30839 if (((instr >> 12) & 1) != 0) { 30840 UnallocatedT32(instr); 30841 return; 30842 } 30843 unsigned rd = ExtractQRegister(instr, 22, 12); 30844 if (((instr >> 16) & 1) != 0) { 30845 UnallocatedT32(instr); 30846 return; 30847 } 30848 unsigned rn = ExtractQRegister(instr, 7, 16); 30849 if ((instr & 1) != 0) { 30850 UnallocatedT32(instr); 30851 return; 30852 } 30853 unsigned rm = ExtractQRegister(instr, 5, 0); 30854 // VACGE{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; T1 30855 vacge(CurrentCond(), 30856 F32, 30857 QRegister(rd), 30858 QRegister(rn), 30859 QRegister(rm)); 30860 break; 30861 } 30862 case 0x10200000: { 30863 // 0xff200e50 30864 if (((instr >> 12) & 1) != 0) { 30865 UnallocatedT32(instr); 30866 return; 30867 } 30868 unsigned rd = ExtractQRegister(instr, 22, 12); 30869 if (((instr >> 16) & 1) != 0) { 30870 UnallocatedT32(instr); 30871 return; 30872 } 30873 unsigned rn = ExtractQRegister(instr, 7, 16); 30874 if ((instr & 1) != 0) { 30875 UnallocatedT32(instr); 30876 return; 30877 } 30878 unsigned rm = ExtractQRegister(instr, 5, 0); 30879 // VACGT{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; T1 30880 vacgt(CurrentCond(), 30881 F32, 30882 QRegister(rd), 30883 QRegister(rn), 30884 QRegister(rm)); 30885 break; 30886 } 30887 default: 30888 UnallocatedT32(instr); 30889 break; 30890 } 30891 break; 30892 } 30893 case 0x00000f00: { 30894 // 0xef000f50 30895 switch (instr & 0x10300000) { 30896 case 0x00000000: { 30897 // 0xef000f50 30898 if (((instr >> 12) & 1) != 0) { 30899 UnallocatedT32(instr); 30900 return; 30901 } 30902 unsigned rd = ExtractQRegister(instr, 22, 12); 30903 if (((instr >> 16) & 1) != 0) { 30904 UnallocatedT32(instr); 30905 return; 30906 } 30907 unsigned rn = ExtractQRegister(instr, 7, 16); 30908 if ((instr & 1) != 0) { 30909 UnallocatedT32(instr); 30910 return; 30911 } 30912 unsigned rm = ExtractQRegister(instr, 5, 0); 30913 // VRECPS{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; T1 30914 vrecps(CurrentCond(), 30915 F32, 30916 QRegister(rd), 30917 QRegister(rn), 30918 QRegister(rm)); 30919 break; 30920 } 30921 case 0x00200000: { 30922 // 0xef200f50 30923 if (((instr >> 12) & 1) != 0) { 30924 UnallocatedT32(instr); 30925 return; 30926 } 30927 unsigned rd = ExtractQRegister(instr, 22, 12); 30928 if (((instr >> 16) & 1) != 0) { 30929 UnallocatedT32(instr); 30930 return; 30931 } 30932 unsigned rn = ExtractQRegister(instr, 7, 16); 30933 if ((instr & 1) != 0) { 30934 UnallocatedT32(instr); 30935 return; 30936 } 30937 unsigned rm = ExtractQRegister(instr, 5, 0); 30938 // VRSQRTS{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; T1 30939 vrsqrts(CurrentCond(), 30940 F32, 30941 QRegister(rd), 30942 QRegister(rn), 30943 QRegister(rm)); 30944 break; 30945 } 30946 case 0x10000000: { 30947 // 0xff000f50 30948 if (((instr >> 12) & 1) != 0) { 30949 UnallocatedT32(instr); 30950 return; 30951 } 30952 unsigned rd = ExtractQRegister(instr, 22, 12); 30953 if (((instr >> 16) & 1) != 0) { 30954 UnallocatedT32(instr); 30955 return; 30956 } 30957 unsigned rn = ExtractQRegister(instr, 7, 16); 30958 if ((instr & 1) != 0) { 30959 UnallocatedT32(instr); 30960 return; 30961 } 30962 unsigned rm = ExtractQRegister(instr, 5, 0); 30963 // VMAXNM{<q>}.F32 <Qd>, <Qn>, <Qm> ; T1 30964 vmaxnm(F32, 30965 QRegister(rd), 30966 QRegister(rn), 30967 QRegister(rm)); 30968 if (InITBlock()) { 30969 UnpredictableT32(instr); 30970 } 30971 break; 30972 } 30973 case 0x10200000: { 30974 // 0xff200f50 30975 if (((instr >> 12) & 1) != 0) { 30976 UnallocatedT32(instr); 30977 return; 30978 } 30979 unsigned rd = ExtractQRegister(instr, 22, 12); 30980 if (((instr >> 16) & 1) != 0) { 30981 UnallocatedT32(instr); 30982 return; 30983 } 30984 unsigned rn = ExtractQRegister(instr, 7, 16); 30985 if ((instr & 1) != 0) { 30986 UnallocatedT32(instr); 30987 return; 30988 } 30989 unsigned rm = ExtractQRegister(instr, 5, 0); 30990 // VMINNM{<q>}.F32 <Qd>, <Qn>, <Qm> ; T1 30991 vminnm(F32, 30992 QRegister(rd), 30993 QRegister(rn), 30994 QRegister(rm)); 30995 if (InITBlock()) { 30996 UnpredictableT32(instr); 30997 } 30998 break; 30999 } 31000 default: 31001 UnallocatedT32(instr); 31002 break; 31003 } 31004 break; 31005 } 31006 default: 31007 UnallocatedT32(instr); 31008 break; 31009 } 31010 break; 31011 } 31012 case 0x00800000: { 31013 // 0xef800010 31014 switch (instr & 0x00000c00) { 31015 case 0x00000000: { 31016 // 0xef800010 31017 switch (instr & 0x00380080) { 31018 case 0x00000000: { 31019 // 0xef800010 31020 switch (instr & 0x00000100) { 31021 case 0x00000000: { 31022 // 0xef800010 31023 switch (instr & 0x00000200) { 31024 default: { 31025 switch (instr & 0x00000020) { 31026 case 0x00000020: { 31027 // 0xef800030 31028 if (((instr & 0xd00) == 0x100) || 31029 ((instr & 0xd00) == 0x500) || 31030 ((instr & 0xd00) == 0x900) || 31031 ((instr & 0xe00) == 0xe00)) { 31032 UnallocatedT32(instr); 31033 return; 31034 } 31035 unsigned cmode = (instr >> 8) & 0xf; 31036 DataType dt = 31037 ImmediateVmvn::DecodeDt(cmode); 31038 if (dt.Is(kDataTypeValueInvalid)) { 31039 UnallocatedT32(instr); 31040 return; 31041 } 31042 unsigned rd = 31043 ExtractDRegister(instr, 22, 12); 31044 DOperand imm = 31045 ImmediateVmvn::DecodeImmediate( 31046 cmode, 31047 (instr & 0xf) | 31048 ((instr >> 12) & 0x70) | 31049 ((instr >> 21) & 0x80)); 31050 // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length) 31051 vmvn(CurrentCond(), 31052 dt, 31053 DRegister(rd), 31054 imm); 31055 break; 31056 } 31057 default: { 31058 if (((instr & 0x920) == 0x100) || 31059 ((instr & 0x520) == 0x100) || 31060 ((instr & 0x820) == 0x20) || 31061 ((instr & 0x420) == 0x20) || 31062 ((instr & 0x220) == 0x20) || 31063 ((instr & 0x120) == 0x120)) { 31064 UnallocatedT32(instr); 31065 return; 31066 } 31067 unsigned cmode = 31068 ((instr >> 8) & 0xf) | 31069 ((instr >> 1) & 0x10); 31070 DataType dt = 31071 ImmediateVmov::DecodeDt(cmode); 31072 if (dt.Is(kDataTypeValueInvalid)) { 31073 UnallocatedT32(instr); 31074 return; 31075 } 31076 unsigned rd = 31077 ExtractDRegister(instr, 22, 12); 31078 DOperand imm = 31079 ImmediateVmov::DecodeImmediate( 31080 cmode, 31081 (instr & 0xf) | 31082 ((instr >> 12) & 0x70) | 31083 ((instr >> 21) & 0x80)); 31084 // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length) 31085 vmov(CurrentCond(), 31086 dt, 31087 DRegister(rd), 31088 imm); 31089 break; 31090 } 31091 } 31092 break; 31093 } 31094 } 31095 break; 31096 } 31097 case 0x00000100: { 31098 // 0xef800110 31099 switch (instr & 0x00000020) { 31100 case 0x00000000: { 31101 // 0xef800110 31102 if (((instr & 0x100) == 0x0) || 31103 ((instr & 0xc00) == 0xc00)) { 31104 UnallocatedT32(instr); 31105 return; 31106 } 31107 unsigned cmode = (instr >> 8) & 0xf; 31108 DataType dt = 31109 ImmediateVorr::DecodeDt(cmode); 31110 if (dt.Is(kDataTypeValueInvalid)) { 31111 UnallocatedT32(instr); 31112 return; 31113 } 31114 unsigned rd = 31115 ExtractDRegister(instr, 22, 12); 31116 DOperand imm = 31117 ImmediateVorr::DecodeImmediate( 31118 cmode, 31119 (instr & 0xf) | 31120 ((instr >> 12) & 0x70) | 31121 ((instr >> 21) & 0x80)); 31122 // VORR{<c>}{<q>}.<dt> {<Ddn>}, <Ddn>, #<imm> ; T1 NOLINT(whitespace/line_length) 31123 vorr(CurrentCond(), 31124 dt, 31125 DRegister(rd), 31126 DRegister(rd), 31127 imm); 31128 break; 31129 } 31130 case 0x00000020: { 31131 // 0xef800130 31132 if (((instr & 0x100) == 0x0) || 31133 ((instr & 0xc00) == 0xc00)) { 31134 UnallocatedT32(instr); 31135 return; 31136 } 31137 unsigned cmode = (instr >> 8) & 0xf; 31138 DataType dt = 31139 ImmediateVbic::DecodeDt(cmode); 31140 if (dt.Is(kDataTypeValueInvalid)) { 31141 UnallocatedT32(instr); 31142 return; 31143 } 31144 unsigned rd = 31145 ExtractDRegister(instr, 22, 12); 31146 DOperand imm = 31147 ImmediateVbic::DecodeImmediate( 31148 cmode, 31149 (instr & 0xf) | 31150 ((instr >> 12) & 0x70) | 31151 ((instr >> 21) & 0x80)); 31152 // VBIC{<c>}{<q>}.<dt> {<Ddn>}, <Ddn>, #<imm> ; T1 NOLINT(whitespace/line_length) 31153 vbic(CurrentCond(), 31154 dt, 31155 DRegister(rd), 31156 DRegister(rd), 31157 imm); 31158 break; 31159 } 31160 } 31161 break; 31162 } 31163 } 31164 break; 31165 } 31166 default: { 31167 switch (instr & 0x00000300) { 31168 case 0x00000000: { 31169 // 0xef800010 31170 if (((instr & 0x380080) == 0x0)) { 31171 UnallocatedT32(instr); 31172 return; 31173 } 31174 DataType dt = 31175 Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) | 31176 ((instr >> 4) & 31177 0x8), 31178 (instr >> 28) & 0x1); 31179 if (dt.Is(kDataTypeValueInvalid)) { 31180 UnallocatedT32(instr); 31181 return; 31182 } 31183 unsigned rd = ExtractDRegister(instr, 22, 12); 31184 unsigned rm = ExtractDRegister(instr, 5, 0); 31185 uint32_t imm6 = (instr >> 16) & 0x3f; 31186 uint32_t imm = 31187 (dt.IsSize(64) ? 64 31188 : (dt.GetSize() * 2)) - 31189 imm6; 31190 // VSHR{<c>}{<q>}.<type><size> {<Dd>}, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length) 31191 vshr(CurrentCond(), 31192 dt, 31193 DRegister(rd), 31194 DRegister(rm), 31195 imm); 31196 break; 31197 } 31198 case 0x00000100: { 31199 // 0xef800110 31200 if (((instr & 0x380080) == 0x0)) { 31201 UnallocatedT32(instr); 31202 return; 31203 } 31204 DataType dt = 31205 Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) | 31206 ((instr >> 4) & 31207 0x8), 31208 (instr >> 28) & 0x1); 31209 if (dt.Is(kDataTypeValueInvalid)) { 31210 UnallocatedT32(instr); 31211 return; 31212 } 31213 unsigned rd = ExtractDRegister(instr, 22, 12); 31214 unsigned rm = ExtractDRegister(instr, 5, 0); 31215 uint32_t imm6 = (instr >> 16) & 0x3f; 31216 uint32_t imm = 31217 (dt.IsSize(64) ? 64 31218 : (dt.GetSize() * 2)) - 31219 imm6; 31220 // VSRA{<c>}{<q>}.<type><size> {<Dd>}, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length) 31221 vsra(CurrentCond(), 31222 dt, 31223 DRegister(rd), 31224 DRegister(rm), 31225 imm); 31226 break; 31227 } 31228 case 0x00000200: { 31229 // 0xef800210 31230 if (((instr & 0x380080) == 0x0)) { 31231 UnallocatedT32(instr); 31232 return; 31233 } 31234 DataType dt = 31235 Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) | 31236 ((instr >> 4) & 31237 0x8), 31238 (instr >> 28) & 0x1); 31239 if (dt.Is(kDataTypeValueInvalid)) { 31240 UnallocatedT32(instr); 31241 return; 31242 } 31243 unsigned rd = ExtractDRegister(instr, 22, 12); 31244 unsigned rm = ExtractDRegister(instr, 5, 0); 31245 uint32_t imm6 = (instr >> 16) & 0x3f; 31246 uint32_t imm = 31247 (dt.IsSize(64) ? 64 31248 : (dt.GetSize() * 2)) - 31249 imm6; 31250 // VRSHR{<c>}{<q>}.<type><size> {<Dd>}, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length) 31251 vrshr(CurrentCond(), 31252 dt, 31253 DRegister(rd), 31254 DRegister(rm), 31255 imm); 31256 break; 31257 } 31258 case 0x00000300: { 31259 // 0xef800310 31260 if (((instr & 0x380080) == 0x0)) { 31261 UnallocatedT32(instr); 31262 return; 31263 } 31264 DataType dt = 31265 Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) | 31266 ((instr >> 4) & 31267 0x8), 31268 (instr >> 28) & 0x1); 31269 if (dt.Is(kDataTypeValueInvalid)) { 31270 UnallocatedT32(instr); 31271 return; 31272 } 31273 unsigned rd = ExtractDRegister(instr, 22, 12); 31274 unsigned rm = ExtractDRegister(instr, 5, 0); 31275 uint32_t imm6 = (instr >> 16) & 0x3f; 31276 uint32_t imm = 31277 (dt.IsSize(64) ? 64 31278 : (dt.GetSize() * 2)) - 31279 imm6; 31280 // VRSRA{<c>}{<q>}.<type><size> {<Dd>}, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length) 31281 vrsra(CurrentCond(), 31282 dt, 31283 DRegister(rd), 31284 DRegister(rm), 31285 imm); 31286 break; 31287 } 31288 } 31289 break; 31290 } 31291 } 31292 break; 31293 } 31294 case 0x00000400: { 31295 // 0xef800410 31296 switch (instr & 0x00380080) { 31297 case 0x00000000: { 31298 // 0xef800410 31299 switch (instr & 0x00000100) { 31300 case 0x00000000: { 31301 // 0xef800410 31302 switch (instr & 0x00000200) { 31303 default: { 31304 switch (instr & 0x00000020) { 31305 case 0x00000020: { 31306 // 0xef800430 31307 if (((instr & 0xd00) == 0x100) || 31308 ((instr & 0xd00) == 0x500) || 31309 ((instr & 0xd00) == 0x900) || 31310 ((instr & 0xe00) == 0xe00)) { 31311 UnallocatedT32(instr); 31312 return; 31313 } 31314 unsigned cmode = (instr >> 8) & 0xf; 31315 DataType dt = 31316 ImmediateVmvn::DecodeDt(cmode); 31317 if (dt.Is(kDataTypeValueInvalid)) { 31318 UnallocatedT32(instr); 31319 return; 31320 } 31321 unsigned rd = 31322 ExtractDRegister(instr, 22, 12); 31323 DOperand imm = 31324 ImmediateVmvn::DecodeImmediate( 31325 cmode, 31326 (instr & 0xf) | 31327 ((instr >> 12) & 0x70) | 31328 ((instr >> 21) & 0x80)); 31329 // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length) 31330 vmvn(CurrentCond(), 31331 dt, 31332 DRegister(rd), 31333 imm); 31334 break; 31335 } 31336 default: { 31337 if (((instr & 0x920) == 0x100) || 31338 ((instr & 0x520) == 0x100) || 31339 ((instr & 0x820) == 0x20) || 31340 ((instr & 0x420) == 0x20) || 31341 ((instr & 0x220) == 0x20) || 31342 ((instr & 0x120) == 0x120)) { 31343 UnallocatedT32(instr); 31344 return; 31345 } 31346 unsigned cmode = 31347 ((instr >> 8) & 0xf) | 31348 ((instr >> 1) & 0x10); 31349 DataType dt = 31350 ImmediateVmov::DecodeDt(cmode); 31351 if (dt.Is(kDataTypeValueInvalid)) { 31352 UnallocatedT32(instr); 31353 return; 31354 } 31355 unsigned rd = 31356 ExtractDRegister(instr, 22, 12); 31357 DOperand imm = 31358 ImmediateVmov::DecodeImmediate( 31359 cmode, 31360 (instr & 0xf) | 31361 ((instr >> 12) & 0x70) | 31362 ((instr >> 21) & 0x80)); 31363 // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length) 31364 vmov(CurrentCond(), 31365 dt, 31366 DRegister(rd), 31367 imm); 31368 break; 31369 } 31370 } 31371 break; 31372 } 31373 } 31374 break; 31375 } 31376 case 0x00000100: { 31377 // 0xef800510 31378 switch (instr & 0x00000020) { 31379 case 0x00000000: { 31380 // 0xef800510 31381 if (((instr & 0x100) == 0x0) || 31382 ((instr & 0xc00) == 0xc00)) { 31383 UnallocatedT32(instr); 31384 return; 31385 } 31386 unsigned cmode = (instr >> 8) & 0xf; 31387 DataType dt = 31388 ImmediateVorr::DecodeDt(cmode); 31389 if (dt.Is(kDataTypeValueInvalid)) { 31390 UnallocatedT32(instr); 31391 return; 31392 } 31393 unsigned rd = 31394 ExtractDRegister(instr, 22, 12); 31395 DOperand imm = 31396 ImmediateVorr::DecodeImmediate( 31397 cmode, 31398 (instr & 0xf) | 31399 ((instr >> 12) & 0x70) | 31400 ((instr >> 21) & 0x80)); 31401 // VORR{<c>}{<q>}.<dt> {<Ddn>}, <Ddn>, #<imm> ; T1 NOLINT(whitespace/line_length) 31402 vorr(CurrentCond(), 31403 dt, 31404 DRegister(rd), 31405 DRegister(rd), 31406 imm); 31407 break; 31408 } 31409 case 0x00000020: { 31410 // 0xef800530 31411 if (((instr & 0x100) == 0x0) || 31412 ((instr & 0xc00) == 0xc00)) { 31413 UnallocatedT32(instr); 31414 return; 31415 } 31416 unsigned cmode = (instr >> 8) & 0xf; 31417 DataType dt = 31418 ImmediateVbic::DecodeDt(cmode); 31419 if (dt.Is(kDataTypeValueInvalid)) { 31420 UnallocatedT32(instr); 31421 return; 31422 } 31423 unsigned rd = 31424 ExtractDRegister(instr, 22, 12); 31425 DOperand imm = 31426 ImmediateVbic::DecodeImmediate( 31427 cmode, 31428 (instr & 0xf) | 31429 ((instr >> 12) & 0x70) | 31430 ((instr >> 21) & 0x80)); 31431 // VBIC{<c>}{<q>}.<dt> {<Ddn>}, <Ddn>, #<imm> ; T1 NOLINT(whitespace/line_length) 31432 vbic(CurrentCond(), 31433 dt, 31434 DRegister(rd), 31435 DRegister(rd), 31436 imm); 31437 break; 31438 } 31439 } 31440 break; 31441 } 31442 } 31443 break; 31444 } 31445 default: { 31446 switch (instr & 0x00000300) { 31447 case 0x00000000: { 31448 // 0xef800410 31449 if ((instr & 0x10000000) == 0x10000000) { 31450 if (((instr & 0x380080) == 0x0)) { 31451 UnallocatedT32(instr); 31452 return; 31453 } 31454 DataType dt = Dt_L_imm6_4_Decode( 31455 ((instr >> 19) & 0x7) | 31456 ((instr >> 4) & 0x8)); 31457 if (dt.Is(kDataTypeValueInvalid)) { 31458 UnallocatedT32(instr); 31459 return; 31460 } 31461 unsigned rd = 31462 ExtractDRegister(instr, 22, 12); 31463 unsigned rm = ExtractDRegister(instr, 5, 0); 31464 uint32_t imm6 = (instr >> 16) & 0x3f; 31465 uint32_t imm = 31466 (dt.IsSize(64) ? 64 31467 : (dt.GetSize() * 2)) - 31468 imm6; 31469 // VSRI{<c>}{<q>}.<dt> {<Dd>}, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length) 31470 vsri(CurrentCond(), 31471 dt, 31472 DRegister(rd), 31473 DRegister(rm), 31474 imm); 31475 } else { 31476 UnallocatedT32(instr); 31477 } 31478 break; 31479 } 31480 case 0x00000100: { 31481 // 0xef800510 31482 switch (instr & 0x10000000) { 31483 case 0x00000000: { 31484 // 0xef800510 31485 if (((instr & 0x380080) == 0x0)) { 31486 UnallocatedT32(instr); 31487 return; 31488 } 31489 DataType dt = Dt_L_imm6_3_Decode( 31490 ((instr >> 19) & 0x7) | 31491 ((instr >> 4) & 0x8)); 31492 if (dt.Is(kDataTypeValueInvalid)) { 31493 UnallocatedT32(instr); 31494 return; 31495 } 31496 unsigned rd = 31497 ExtractDRegister(instr, 22, 12); 31498 unsigned rm = 31499 ExtractDRegister(instr, 5, 0); 31500 uint32_t imm6 = (instr >> 16) & 0x3f; 31501 uint32_t imm = 31502 imm6 - 31503 (dt.IsSize(64) ? 0 : dt.GetSize()); 31504 // VSHL{<c>}{<q>}.I<size> {<Dd>}, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length) 31505 vshl(CurrentCond(), 31506 dt, 31507 DRegister(rd), 31508 DRegister(rm), 31509 imm); 31510 break; 31511 } 31512 case 0x10000000: { 31513 // 0xff800510 31514 if (((instr & 0x380080) == 0x0)) { 31515 UnallocatedT32(instr); 31516 return; 31517 } 31518 DataType dt = Dt_L_imm6_4_Decode( 31519 ((instr >> 19) & 0x7) | 31520 ((instr >> 4) & 0x8)); 31521 if (dt.Is(kDataTypeValueInvalid)) { 31522 UnallocatedT32(instr); 31523 return; 31524 } 31525 unsigned rd = 31526 ExtractDRegister(instr, 22, 12); 31527 unsigned rm = 31528 ExtractDRegister(instr, 5, 0); 31529 uint32_t imm6 = (instr >> 16) & 0x3f; 31530 uint32_t imm = 31531 imm6 - 31532 (dt.IsSize(64) ? 0 : dt.GetSize()); 31533 // VSLI{<c>}{<q>}.<dt> {<Dd>}, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length) 31534 vsli(CurrentCond(), 31535 dt, 31536 DRegister(rd), 31537 DRegister(rm), 31538 imm); 31539 break; 31540 } 31541 } 31542 break; 31543 } 31544 case 0x00000200: { 31545 // 0xef800610 31546 if (((instr & 0x380080) == 0x0)) { 31547 UnallocatedT32(instr); 31548 return; 31549 } 31550 DataType dt = 31551 Dt_L_imm6_2_Decode(((instr >> 19) & 0x7) | 31552 ((instr >> 4) & 31553 0x8), 31554 (instr >> 28) & 0x1); 31555 if (dt.Is(kDataTypeValueInvalid)) { 31556 UnallocatedT32(instr); 31557 return; 31558 } 31559 unsigned rd = ExtractDRegister(instr, 22, 12); 31560 unsigned rm = ExtractDRegister(instr, 5, 0); 31561 uint32_t imm6 = (instr >> 16) & 0x3f; 31562 uint32_t imm = 31563 imm6 - (dt.IsSize(64) ? 0 : dt.GetSize()); 31564 // VQSHLU{<c>}{<q>}.<type><size> {<Dd>}, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length) 31565 vqshlu(CurrentCond(), 31566 dt, 31567 DRegister(rd), 31568 DRegister(rm), 31569 imm); 31570 break; 31571 } 31572 case 0x00000300: { 31573 // 0xef800710 31574 if (((instr & 0x380080) == 0x0)) { 31575 UnallocatedT32(instr); 31576 return; 31577 } 31578 DataType dt = 31579 Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) | 31580 ((instr >> 4) & 31581 0x8), 31582 (instr >> 28) & 0x1); 31583 if (dt.Is(kDataTypeValueInvalid)) { 31584 UnallocatedT32(instr); 31585 return; 31586 } 31587 unsigned rd = ExtractDRegister(instr, 22, 12); 31588 unsigned rm = ExtractDRegister(instr, 5, 0); 31589 uint32_t imm6 = (instr >> 16) & 0x3f; 31590 uint32_t imm = 31591 imm6 - (dt.IsSize(64) ? 0 : dt.GetSize()); 31592 // VQSHL{<c>}{<q>}.<type><size> {<Dd>}, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length) 31593 vqshl(CurrentCond(), 31594 dt, 31595 DRegister(rd), 31596 DRegister(rm), 31597 imm); 31598 break; 31599 } 31600 } 31601 break; 31602 } 31603 } 31604 break; 31605 } 31606 case 0x00000800: { 31607 // 0xef800810 31608 switch (instr & 0x00000080) { 31609 case 0x00000000: { 31610 // 0xef800810 31611 switch (instr & 0x00380000) { 31612 case 0x00000000: { 31613 // 0xef800810 31614 switch (instr & 0x00000100) { 31615 case 0x00000000: { 31616 // 0xef800810 31617 switch (instr & 0x00000200) { 31618 default: { 31619 switch (instr & 0x00000020) { 31620 case 0x00000020: { 31621 // 0xef800830 31622 if (((instr & 0xd00) == 0x100) || 31623 ((instr & 0xd00) == 0x500) || 31624 ((instr & 0xd00) == 0x900) || 31625 ((instr & 0xe00) == 0xe00)) { 31626 UnallocatedT32(instr); 31627 return; 31628 } 31629 unsigned cmode = 31630 (instr >> 8) & 0xf; 31631 DataType dt = 31632 ImmediateVmvn::DecodeDt( 31633 cmode); 31634 if (dt.Is( 31635 kDataTypeValueInvalid)) { 31636 UnallocatedT32(instr); 31637 return; 31638 } 31639 unsigned rd = 31640 ExtractDRegister(instr, 31641 22, 31642 12); 31643 DOperand imm = ImmediateVmvn:: 31644 DecodeImmediate(cmode, 31645 (instr & 31646 0xf) | 31647 ((instr >> 31648 12) & 31649 0x70) | 31650 ((instr >> 31651 21) & 31652 0x80)); 31653 // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length) 31654 vmvn(CurrentCond(), 31655 dt, 31656 DRegister(rd), 31657 imm); 31658 break; 31659 } 31660 default: { 31661 if (((instr & 0x920) == 0x100) || 31662 ((instr & 0x520) == 0x100) || 31663 ((instr & 0x820) == 0x20) || 31664 ((instr & 0x420) == 0x20) || 31665 ((instr & 0x220) == 0x20) || 31666 ((instr & 0x120) == 0x120)) { 31667 UnallocatedT32(instr); 31668 return; 31669 } 31670 unsigned cmode = 31671 ((instr >> 8) & 0xf) | 31672 ((instr >> 1) & 0x10); 31673 DataType dt = 31674 ImmediateVmov::DecodeDt( 31675 cmode); 31676 if (dt.Is( 31677 kDataTypeValueInvalid)) { 31678 UnallocatedT32(instr); 31679 return; 31680 } 31681 unsigned rd = 31682 ExtractDRegister(instr, 31683 22, 31684 12); 31685 DOperand imm = ImmediateVmov:: 31686 DecodeImmediate(cmode, 31687 (instr & 31688 0xf) | 31689 ((instr >> 31690 12) & 31691 0x70) | 31692 ((instr >> 31693 21) & 31694 0x80)); 31695 // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length) 31696 vmov(CurrentCond(), 31697 dt, 31698 DRegister(rd), 31699 imm); 31700 break; 31701 } 31702 } 31703 break; 31704 } 31705 } 31706 break; 31707 } 31708 case 0x00000100: { 31709 // 0xef800910 31710 switch (instr & 0x00000020) { 31711 case 0x00000000: { 31712 // 0xef800910 31713 if (((instr & 0x100) == 0x0) || 31714 ((instr & 0xc00) == 0xc00)) { 31715 UnallocatedT32(instr); 31716 return; 31717 } 31718 unsigned cmode = (instr >> 8) & 0xf; 31719 DataType dt = 31720 ImmediateVorr::DecodeDt(cmode); 31721 if (dt.Is(kDataTypeValueInvalid)) { 31722 UnallocatedT32(instr); 31723 return; 31724 } 31725 unsigned rd = 31726 ExtractDRegister(instr, 22, 12); 31727 DOperand imm = 31728 ImmediateVorr::DecodeImmediate( 31729 cmode, 31730 (instr & 0xf) | 31731 ((instr >> 12) & 0x70) | 31732 ((instr >> 21) & 0x80)); 31733 // VORR{<c>}{<q>}.<dt> {<Ddn>}, <Ddn>, #<imm> ; T1 NOLINT(whitespace/line_length) 31734 vorr(CurrentCond(), 31735 dt, 31736 DRegister(rd), 31737 DRegister(rd), 31738 imm); 31739 break; 31740 } 31741 case 0x00000020: { 31742 // 0xef800930 31743 if (((instr & 0x100) == 0x0) || 31744 ((instr & 0xc00) == 0xc00)) { 31745 UnallocatedT32(instr); 31746 return; 31747 } 31748 unsigned cmode = (instr >> 8) & 0xf; 31749 DataType dt = 31750 ImmediateVbic::DecodeDt(cmode); 31751 if (dt.Is(kDataTypeValueInvalid)) { 31752 UnallocatedT32(instr); 31753 return; 31754 } 31755 unsigned rd = 31756 ExtractDRegister(instr, 22, 12); 31757 DOperand imm = 31758 ImmediateVbic::DecodeImmediate( 31759 cmode, 31760 (instr & 0xf) | 31761 ((instr >> 12) & 0x70) | 31762 ((instr >> 21) & 0x80)); 31763 // VBIC{<c>}{<q>}.<dt> {<Ddn>}, <Ddn>, #<imm> ; T1 NOLINT(whitespace/line_length) 31764 vbic(CurrentCond(), 31765 dt, 31766 DRegister(rd), 31767 DRegister(rd), 31768 imm); 31769 break; 31770 } 31771 } 31772 break; 31773 } 31774 } 31775 break; 31776 } 31777 case 0x00180000: { 31778 // 0xef980810 31779 switch (instr & 0x00000300) { 31780 case 0x00000000: { 31781 // 0xef980810 31782 switch (instr & 0x10000000) { 31783 case 0x00000000: { 31784 // 0xef980810 31785 if (((instr & 0x380000) == 0x0)) { 31786 UnallocatedT32(instr); 31787 return; 31788 } 31789 DataType dt = Dt_imm6_3_Decode( 31790 (instr >> 19) & 0x7); 31791 if (dt.Is(kDataTypeValueInvalid)) { 31792 UnallocatedT32(instr); 31793 return; 31794 } 31795 unsigned rd = 31796 ExtractDRegister(instr, 22, 12); 31797 if ((instr & 1) != 0) { 31798 UnallocatedT32(instr); 31799 return; 31800 } 31801 unsigned rm = 31802 ExtractQRegister(instr, 5, 0); 31803 uint32_t imm6 = (instr >> 16) & 0x3f; 31804 uint32_t imm = dt.GetSize() - imm6; 31805 // VSHRN{<c>}{<q>}.I<size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length) 31806 vshrn(CurrentCond(), 31807 dt, 31808 DRegister(rd), 31809 QRegister(rm), 31810 imm); 31811 break; 31812 } 31813 case 0x10000000: { 31814 // 0xff980810 31815 if (((instr & 0x380000) == 0x0)) { 31816 UnallocatedT32(instr); 31817 return; 31818 } 31819 DataType dt = 31820 Dt_imm6_2_Decode((instr >> 19) & 31821 0x7, 31822 (instr >> 28) & 31823 0x1); 31824 if (dt.Is(kDataTypeValueInvalid)) { 31825 UnallocatedT32(instr); 31826 return; 31827 } 31828 unsigned rd = 31829 ExtractDRegister(instr, 22, 12); 31830 if ((instr & 1) != 0) { 31831 UnallocatedT32(instr); 31832 return; 31833 } 31834 unsigned rm = 31835 ExtractQRegister(instr, 5, 0); 31836 uint32_t imm6 = (instr >> 16) & 0x3f; 31837 uint32_t imm = dt.GetSize() - imm6; 31838 // VQSHRUN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length) 31839 vqshrun(CurrentCond(), 31840 dt, 31841 DRegister(rd), 31842 QRegister(rm), 31843 imm); 31844 break; 31845 } 31846 } 31847 break; 31848 } 31849 case 0x00000100: { 31850 // 0xef980910 31851 if (((instr & 0x380000) == 0x0)) { 31852 UnallocatedT32(instr); 31853 return; 31854 } 31855 DataType dt = 31856 Dt_imm6_1_Decode((instr >> 19) & 0x7, 31857 (instr >> 28) & 0x1); 31858 if (dt.Is(kDataTypeValueInvalid)) { 31859 UnallocatedT32(instr); 31860 return; 31861 } 31862 unsigned rd = 31863 ExtractDRegister(instr, 22, 12); 31864 if ((instr & 1) != 0) { 31865 UnallocatedT32(instr); 31866 return; 31867 } 31868 unsigned rm = 31869 ExtractQRegister(instr, 5, 0); 31870 uint32_t imm6 = (instr >> 16) & 0x3f; 31871 uint32_t imm = dt.GetSize() - imm6; 31872 // VQSHRN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length) 31873 vqshrn(CurrentCond(), 31874 dt, 31875 DRegister(rd), 31876 QRegister(rm), 31877 imm); 31878 break; 31879 } 31880 case 0x00000200: { 31881 // 0xef980a10 31882 if (((instr & 0x380000) == 0x0) || 31883 ((instr & 0x3f0000) == 0x80000) || 31884 ((instr & 0x3f0000) == 0x100000) || 31885 ((instr & 0x3f0000) == 0x200000)) { 31886 UnallocatedT32(instr); 31887 return; 31888 } 31889 DataType dt = 31890 Dt_imm6_4_Decode((instr >> 19) & 0x7, 31891 (instr >> 28) & 0x1); 31892 if (dt.Is(kDataTypeValueInvalid)) { 31893 UnallocatedT32(instr); 31894 return; 31895 } 31896 if (((instr >> 12) & 1) != 0) { 31897 UnallocatedT32(instr); 31898 return; 31899 } 31900 unsigned rd = 31901 ExtractQRegister(instr, 22, 12); 31902 unsigned rm = 31903 ExtractDRegister(instr, 5, 0); 31904 uint32_t imm6 = (instr >> 16) & 0x3f; 31905 uint32_t imm = imm6 - dt.GetSize(); 31906 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length) 31907 vshll(CurrentCond(), 31908 dt, 31909 QRegister(rd), 31910 DRegister(rm), 31911 imm); 31912 break; 31913 } 31914 default: 31915 UnallocatedT32(instr); 31916 break; 31917 } 31918 break; 31919 } 31920 case 0x00280000: { 31921 // 0xefa80810 31922 switch (instr & 0x00000300) { 31923 case 0x00000000: { 31924 // 0xefa80810 31925 switch (instr & 0x10000000) { 31926 case 0x00000000: { 31927 // 0xefa80810 31928 if (((instr & 0x380000) == 0x0)) { 31929 UnallocatedT32(instr); 31930 return; 31931 } 31932 DataType dt = Dt_imm6_3_Decode( 31933 (instr >> 19) & 0x7); 31934 if (dt.Is(kDataTypeValueInvalid)) { 31935 UnallocatedT32(instr); 31936 return; 31937 } 31938 unsigned rd = 31939 ExtractDRegister(instr, 22, 12); 31940 if ((instr & 1) != 0) { 31941 UnallocatedT32(instr); 31942 return; 31943 } 31944 unsigned rm = 31945 ExtractQRegister(instr, 5, 0); 31946 uint32_t imm6 = (instr >> 16) & 0x3f; 31947 uint32_t imm = dt.GetSize() - imm6; 31948 // VSHRN{<c>}{<q>}.I<size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length) 31949 vshrn(CurrentCond(), 31950 dt, 31951 DRegister(rd), 31952 QRegister(rm), 31953 imm); 31954 break; 31955 } 31956 case 0x10000000: { 31957 // 0xffa80810 31958 if (((instr & 0x380000) == 0x0)) { 31959 UnallocatedT32(instr); 31960 return; 31961 } 31962 DataType dt = 31963 Dt_imm6_2_Decode((instr >> 19) & 31964 0x7, 31965 (instr >> 28) & 31966 0x1); 31967 if (dt.Is(kDataTypeValueInvalid)) { 31968 UnallocatedT32(instr); 31969 return; 31970 } 31971 unsigned rd = 31972 ExtractDRegister(instr, 22, 12); 31973 if ((instr & 1) != 0) { 31974 UnallocatedT32(instr); 31975 return; 31976 } 31977 unsigned rm = 31978 ExtractQRegister(instr, 5, 0); 31979 uint32_t imm6 = (instr >> 16) & 0x3f; 31980 uint32_t imm = dt.GetSize() - imm6; 31981 // VQSHRUN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length) 31982 vqshrun(CurrentCond(), 31983 dt, 31984 DRegister(rd), 31985 QRegister(rm), 31986 imm); 31987 break; 31988 } 31989 } 31990 break; 31991 } 31992 case 0x00000100: { 31993 // 0xefa80910 31994 if (((instr & 0x380000) == 0x0)) { 31995 UnallocatedT32(instr); 31996 return; 31997 } 31998 DataType dt = 31999 Dt_imm6_1_Decode((instr >> 19) & 0x7, 32000 (instr >> 28) & 0x1); 32001 if (dt.Is(kDataTypeValueInvalid)) { 32002 UnallocatedT32(instr); 32003 return; 32004 } 32005 unsigned rd = 32006 ExtractDRegister(instr, 22, 12); 32007 if ((instr & 1) != 0) { 32008 UnallocatedT32(instr); 32009 return; 32010 } 32011 unsigned rm = 32012 ExtractQRegister(instr, 5, 0); 32013 uint32_t imm6 = (instr >> 16) & 0x3f; 32014 uint32_t imm = dt.GetSize() - imm6; 32015 // VQSHRN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length) 32016 vqshrn(CurrentCond(), 32017 dt, 32018 DRegister(rd), 32019 QRegister(rm), 32020 imm); 32021 break; 32022 } 32023 case 0x00000200: { 32024 // 0xefa80a10 32025 if (((instr & 0x380000) == 0x0) || 32026 ((instr & 0x3f0000) == 0x80000) || 32027 ((instr & 0x3f0000) == 0x100000) || 32028 ((instr & 0x3f0000) == 0x200000)) { 32029 UnallocatedT32(instr); 32030 return; 32031 } 32032 DataType dt = 32033 Dt_imm6_4_Decode((instr >> 19) & 0x7, 32034 (instr >> 28) & 0x1); 32035 if (dt.Is(kDataTypeValueInvalid)) { 32036 UnallocatedT32(instr); 32037 return; 32038 } 32039 if (((instr >> 12) & 1) != 0) { 32040 UnallocatedT32(instr); 32041 return; 32042 } 32043 unsigned rd = 32044 ExtractQRegister(instr, 22, 12); 32045 unsigned rm = 32046 ExtractDRegister(instr, 5, 0); 32047 uint32_t imm6 = (instr >> 16) & 0x3f; 32048 uint32_t imm = imm6 - dt.GetSize(); 32049 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length) 32050 vshll(CurrentCond(), 32051 dt, 32052 QRegister(rd), 32053 DRegister(rm), 32054 imm); 32055 break; 32056 } 32057 default: 32058 UnallocatedT32(instr); 32059 break; 32060 } 32061 break; 32062 } 32063 case 0x00300000: { 32064 // 0xefb00810 32065 switch (instr & 0x00000300) { 32066 case 0x00000000: { 32067 // 0xefb00810 32068 switch (instr & 0x10000000) { 32069 case 0x00000000: { 32070 // 0xefb00810 32071 if (((instr & 0x380000) == 0x0)) { 32072 UnallocatedT32(instr); 32073 return; 32074 } 32075 DataType dt = Dt_imm6_3_Decode( 32076 (instr >> 19) & 0x7); 32077 if (dt.Is(kDataTypeValueInvalid)) { 32078 UnallocatedT32(instr); 32079 return; 32080 } 32081 unsigned rd = 32082 ExtractDRegister(instr, 22, 12); 32083 if ((instr & 1) != 0) { 32084 UnallocatedT32(instr); 32085 return; 32086 } 32087 unsigned rm = 32088 ExtractQRegister(instr, 5, 0); 32089 uint32_t imm6 = (instr >> 16) & 0x3f; 32090 uint32_t imm = dt.GetSize() - imm6; 32091 // VSHRN{<c>}{<q>}.I<size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length) 32092 vshrn(CurrentCond(), 32093 dt, 32094 DRegister(rd), 32095 QRegister(rm), 32096 imm); 32097 break; 32098 } 32099 case 0x10000000: { 32100 // 0xffb00810 32101 if (((instr & 0x380000) == 0x0)) { 32102 UnallocatedT32(instr); 32103 return; 32104 } 32105 DataType dt = 32106 Dt_imm6_2_Decode((instr >> 19) & 32107 0x7, 32108 (instr >> 28) & 32109 0x1); 32110 if (dt.Is(kDataTypeValueInvalid)) { 32111 UnallocatedT32(instr); 32112 return; 32113 } 32114 unsigned rd = 32115 ExtractDRegister(instr, 22, 12); 32116 if ((instr & 1) != 0) { 32117 UnallocatedT32(instr); 32118 return; 32119 } 32120 unsigned rm = 32121 ExtractQRegister(instr, 5, 0); 32122 uint32_t imm6 = (instr >> 16) & 0x3f; 32123 uint32_t imm = dt.GetSize() - imm6; 32124 // VQSHRUN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length) 32125 vqshrun(CurrentCond(), 32126 dt, 32127 DRegister(rd), 32128 QRegister(rm), 32129 imm); 32130 break; 32131 } 32132 } 32133 break; 32134 } 32135 case 0x00000100: { 32136 // 0xefb00910 32137 if (((instr & 0x380000) == 0x0)) { 32138 UnallocatedT32(instr); 32139 return; 32140 } 32141 DataType dt = 32142 Dt_imm6_1_Decode((instr >> 19) & 0x7, 32143 (instr >> 28) & 0x1); 32144 if (dt.Is(kDataTypeValueInvalid)) { 32145 UnallocatedT32(instr); 32146 return; 32147 } 32148 unsigned rd = 32149 ExtractDRegister(instr, 22, 12); 32150 if ((instr & 1) != 0) { 32151 UnallocatedT32(instr); 32152 return; 32153 } 32154 unsigned rm = 32155 ExtractQRegister(instr, 5, 0); 32156 uint32_t imm6 = (instr >> 16) & 0x3f; 32157 uint32_t imm = dt.GetSize() - imm6; 32158 // VQSHRN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length) 32159 vqshrn(CurrentCond(), 32160 dt, 32161 DRegister(rd), 32162 QRegister(rm), 32163 imm); 32164 break; 32165 } 32166 case 0x00000200: { 32167 // 0xefb00a10 32168 if (((instr & 0x380000) == 0x0) || 32169 ((instr & 0x3f0000) == 0x80000) || 32170 ((instr & 0x3f0000) == 0x100000) || 32171 ((instr & 0x3f0000) == 0x200000)) { 32172 UnallocatedT32(instr); 32173 return; 32174 } 32175 DataType dt = 32176 Dt_imm6_4_Decode((instr >> 19) & 0x7, 32177 (instr >> 28) & 0x1); 32178 if (dt.Is(kDataTypeValueInvalid)) { 32179 UnallocatedT32(instr); 32180 return; 32181 } 32182 if (((instr >> 12) & 1) != 0) { 32183 UnallocatedT32(instr); 32184 return; 32185 } 32186 unsigned rd = 32187 ExtractQRegister(instr, 22, 12); 32188 unsigned rm = 32189 ExtractDRegister(instr, 5, 0); 32190 uint32_t imm6 = (instr >> 16) & 0x3f; 32191 uint32_t imm = imm6 - dt.GetSize(); 32192 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length) 32193 vshll(CurrentCond(), 32194 dt, 32195 QRegister(rd), 32196 DRegister(rm), 32197 imm); 32198 break; 32199 } 32200 default: 32201 UnallocatedT32(instr); 32202 break; 32203 } 32204 break; 32205 } 32206 case 0x00380000: { 32207 // 0xefb80810 32208 switch (instr & 0x00000300) { 32209 case 0x00000000: { 32210 // 0xefb80810 32211 switch (instr & 0x10000000) { 32212 case 0x00000000: { 32213 // 0xefb80810 32214 if (((instr & 0x380000) == 0x0)) { 32215 UnallocatedT32(instr); 32216 return; 32217 } 32218 DataType dt = Dt_imm6_3_Decode( 32219 (instr >> 19) & 0x7); 32220 if (dt.Is(kDataTypeValueInvalid)) { 32221 UnallocatedT32(instr); 32222 return; 32223 } 32224 unsigned rd = 32225 ExtractDRegister(instr, 22, 12); 32226 if ((instr & 1) != 0) { 32227 UnallocatedT32(instr); 32228 return; 32229 } 32230 unsigned rm = 32231 ExtractQRegister(instr, 5, 0); 32232 uint32_t imm6 = (instr >> 16) & 0x3f; 32233 uint32_t imm = dt.GetSize() - imm6; 32234 // VSHRN{<c>}{<q>}.I<size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length) 32235 vshrn(CurrentCond(), 32236 dt, 32237 DRegister(rd), 32238 QRegister(rm), 32239 imm); 32240 break; 32241 } 32242 case 0x10000000: { 32243 // 0xffb80810 32244 if (((instr & 0x380000) == 0x0)) { 32245 UnallocatedT32(instr); 32246 return; 32247 } 32248 DataType dt = 32249 Dt_imm6_2_Decode((instr >> 19) & 32250 0x7, 32251 (instr >> 28) & 32252 0x1); 32253 if (dt.Is(kDataTypeValueInvalid)) { 32254 UnallocatedT32(instr); 32255 return; 32256 } 32257 unsigned rd = 32258 ExtractDRegister(instr, 22, 12); 32259 if ((instr & 1) != 0) { 32260 UnallocatedT32(instr); 32261 return; 32262 } 32263 unsigned rm = 32264 ExtractQRegister(instr, 5, 0); 32265 uint32_t imm6 = (instr >> 16) & 0x3f; 32266 uint32_t imm = dt.GetSize() - imm6; 32267 // VQSHRUN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length) 32268 vqshrun(CurrentCond(), 32269 dt, 32270 DRegister(rd), 32271 QRegister(rm), 32272 imm); 32273 break; 32274 } 32275 } 32276 break; 32277 } 32278 case 0x00000100: { 32279 // 0xefb80910 32280 if (((instr & 0x380000) == 0x0)) { 32281 UnallocatedT32(instr); 32282 return; 32283 } 32284 DataType dt = 32285 Dt_imm6_1_Decode((instr >> 19) & 0x7, 32286 (instr >> 28) & 0x1); 32287 if (dt.Is(kDataTypeValueInvalid)) { 32288 UnallocatedT32(instr); 32289 return; 32290 } 32291 unsigned rd = 32292 ExtractDRegister(instr, 22, 12); 32293 if ((instr & 1) != 0) { 32294 UnallocatedT32(instr); 32295 return; 32296 } 32297 unsigned rm = 32298 ExtractQRegister(instr, 5, 0); 32299 uint32_t imm6 = (instr >> 16) & 0x3f; 32300 uint32_t imm = dt.GetSize() - imm6; 32301 // VQSHRN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length) 32302 vqshrn(CurrentCond(), 32303 dt, 32304 DRegister(rd), 32305 QRegister(rm), 32306 imm); 32307 break; 32308 } 32309 case 0x00000200: { 32310 // 0xefb80a10 32311 if (((instr & 0x380000) == 0x0) || 32312 ((instr & 0x3f0000) == 0x80000) || 32313 ((instr & 0x3f0000) == 0x100000) || 32314 ((instr & 0x3f0000) == 0x200000)) { 32315 UnallocatedT32(instr); 32316 return; 32317 } 32318 DataType dt = 32319 Dt_imm6_4_Decode((instr >> 19) & 0x7, 32320 (instr >> 28) & 0x1); 32321 if (dt.Is(kDataTypeValueInvalid)) { 32322 UnallocatedT32(instr); 32323 return; 32324 } 32325 if (((instr >> 12) & 1) != 0) { 32326 UnallocatedT32(instr); 32327 return; 32328 } 32329 unsigned rd = 32330 ExtractQRegister(instr, 22, 12); 32331 unsigned rm = 32332 ExtractDRegister(instr, 5, 0); 32333 uint32_t imm6 = (instr >> 16) & 0x3f; 32334 uint32_t imm = imm6 - dt.GetSize(); 32335 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length) 32336 vshll(CurrentCond(), 32337 dt, 32338 QRegister(rd), 32339 DRegister(rm), 32340 imm); 32341 break; 32342 } 32343 default: 32344 UnallocatedT32(instr); 32345 break; 32346 } 32347 break; 32348 } 32349 default: { 32350 switch (instr & 0x00000300) { 32351 case 0x00000000: { 32352 // 0xef800810 32353 switch (instr & 0x10000000) { 32354 case 0x00000000: { 32355 // 0xef800810 32356 if (((instr & 0x380000) == 0x0)) { 32357 UnallocatedT32(instr); 32358 return; 32359 } 32360 DataType dt = Dt_imm6_3_Decode( 32361 (instr >> 19) & 0x7); 32362 if (dt.Is(kDataTypeValueInvalid)) { 32363 UnallocatedT32(instr); 32364 return; 32365 } 32366 unsigned rd = 32367 ExtractDRegister(instr, 22, 12); 32368 if ((instr & 1) != 0) { 32369 UnallocatedT32(instr); 32370 return; 32371 } 32372 unsigned rm = 32373 ExtractQRegister(instr, 5, 0); 32374 uint32_t imm6 = (instr >> 16) & 0x3f; 32375 uint32_t imm = dt.GetSize() - imm6; 32376 // VSHRN{<c>}{<q>}.I<size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length) 32377 vshrn(CurrentCond(), 32378 dt, 32379 DRegister(rd), 32380 QRegister(rm), 32381 imm); 32382 break; 32383 } 32384 case 0x10000000: { 32385 // 0xff800810 32386 if (((instr & 0x380000) == 0x0)) { 32387 UnallocatedT32(instr); 32388 return; 32389 } 32390 DataType dt = 32391 Dt_imm6_2_Decode((instr >> 19) & 32392 0x7, 32393 (instr >> 28) & 32394 0x1); 32395 if (dt.Is(kDataTypeValueInvalid)) { 32396 UnallocatedT32(instr); 32397 return; 32398 } 32399 unsigned rd = 32400 ExtractDRegister(instr, 22, 12); 32401 if ((instr & 1) != 0) { 32402 UnallocatedT32(instr); 32403 return; 32404 } 32405 unsigned rm = 32406 ExtractQRegister(instr, 5, 0); 32407 uint32_t imm6 = (instr >> 16) & 0x3f; 32408 uint32_t imm = dt.GetSize() - imm6; 32409 // VQSHRUN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length) 32410 vqshrun(CurrentCond(), 32411 dt, 32412 DRegister(rd), 32413 QRegister(rm), 32414 imm); 32415 break; 32416 } 32417 } 32418 break; 32419 } 32420 case 0x00000100: { 32421 // 0xef800910 32422 if (((instr & 0x380000) == 0x0)) { 32423 UnallocatedT32(instr); 32424 return; 32425 } 32426 DataType dt = 32427 Dt_imm6_1_Decode((instr >> 19) & 0x7, 32428 (instr >> 28) & 0x1); 32429 if (dt.Is(kDataTypeValueInvalid)) { 32430 UnallocatedT32(instr); 32431 return; 32432 } 32433 unsigned rd = 32434 ExtractDRegister(instr, 22, 12); 32435 if ((instr & 1) != 0) { 32436 UnallocatedT32(instr); 32437 return; 32438 } 32439 unsigned rm = 32440 ExtractQRegister(instr, 5, 0); 32441 uint32_t imm6 = (instr >> 16) & 0x3f; 32442 uint32_t imm = dt.GetSize() - imm6; 32443 // VQSHRN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length) 32444 vqshrn(CurrentCond(), 32445 dt, 32446 DRegister(rd), 32447 QRegister(rm), 32448 imm); 32449 break; 32450 } 32451 case 0x00000200: { 32452 // 0xef800a10 32453 switch (instr & 0x00070000) { 32454 case 0x00000000: { 32455 // 0xef800a10 32456 switch (instr & 0x003f0000) { 32457 case 0x00080000: { 32458 // 0xef880a10 32459 if (((instr & 0x380000) == 0x0) || 32460 ((instr & 0x380000) == 32461 0x180000) || 32462 ((instr & 0x380000) == 32463 0x280000) || 32464 ((instr & 0x380000) == 32465 0x300000) || 32466 ((instr & 0x380000) == 32467 0x380000)) { 32468 UnallocatedT32(instr); 32469 return; 32470 } 32471 DataType dt = Dt_U_imm3H_1_Decode( 32472 ((instr >> 19) & 0x7) | 32473 ((instr >> 25) & 0x8)); 32474 if (dt.Is( 32475 kDataTypeValueInvalid)) { 32476 UnallocatedT32(instr); 32477 return; 32478 } 32479 if (((instr >> 12) & 1) != 0) { 32480 UnallocatedT32(instr); 32481 return; 32482 } 32483 unsigned rd = 32484 ExtractQRegister(instr, 32485 22, 32486 12); 32487 unsigned rm = 32488 ExtractDRegister(instr, 5, 0); 32489 // VMOVL{<c>}{<q>}.<dt> <Qd>, <Dm> ; T1 NOLINT(whitespace/line_length) 32490 vmovl(CurrentCond(), 32491 dt, 32492 QRegister(rd), 32493 DRegister(rm)); 32494 break; 32495 } 32496 case 0x00090000: { 32497 // 0xef890a10 32498 if (((instr & 0x380000) == 0x0) || 32499 ((instr & 0x3f0000) == 32500 0x80000) || 32501 ((instr & 0x3f0000) == 32502 0x100000) || 32503 ((instr & 0x3f0000) == 32504 0x200000)) { 32505 UnallocatedT32(instr); 32506 return; 32507 } 32508 DataType dt = 32509 Dt_imm6_4_Decode((instr >> 32510 19) & 32511 0x7, 32512 (instr >> 32513 28) & 32514 0x1); 32515 if (dt.Is( 32516 kDataTypeValueInvalid)) { 32517 UnallocatedT32(instr); 32518 return; 32519 } 32520 if (((instr >> 12) & 1) != 0) { 32521 UnallocatedT32(instr); 32522 return; 32523 } 32524 unsigned rd = 32525 ExtractQRegister(instr, 32526 22, 32527 12); 32528 unsigned rm = 32529 ExtractDRegister(instr, 5, 0); 32530 uint32_t imm6 = 32531 (instr >> 16) & 0x3f; 32532 uint32_t imm = 32533 imm6 - dt.GetSize(); 32534 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length) 32535 vshll(CurrentCond(), 32536 dt, 32537 QRegister(rd), 32538 DRegister(rm), 32539 imm); 32540 break; 32541 } 32542 case 0x000a0000: { 32543 // 0xef8a0a10 32544 if (((instr & 0x380000) == 0x0) || 32545 ((instr & 0x3f0000) == 32546 0x80000) || 32547 ((instr & 0x3f0000) == 32548 0x100000) || 32549 ((instr & 0x3f0000) == 32550 0x200000)) { 32551 UnallocatedT32(instr); 32552 return; 32553 } 32554 DataType dt = 32555 Dt_imm6_4_Decode((instr >> 32556 19) & 32557 0x7, 32558 (instr >> 32559 28) & 32560 0x1); 32561 if (dt.Is( 32562 kDataTypeValueInvalid)) { 32563 UnallocatedT32(instr); 32564 return; 32565 } 32566 if (((instr >> 12) & 1) != 0) { 32567 UnallocatedT32(instr); 32568 return; 32569 } 32570 unsigned rd = 32571 ExtractQRegister(instr, 32572 22, 32573 12); 32574 unsigned rm = 32575 ExtractDRegister(instr, 5, 0); 32576 uint32_t imm6 = 32577 (instr >> 16) & 0x3f; 32578 uint32_t imm = 32579 imm6 - dt.GetSize(); 32580 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length) 32581 vshll(CurrentCond(), 32582 dt, 32583 QRegister(rd), 32584 DRegister(rm), 32585 imm); 32586 break; 32587 } 32588 case 0x000b0000: { 32589 // 0xef8b0a10 32590 if (((instr & 0x380000) == 0x0) || 32591 ((instr & 0x3f0000) == 32592 0x80000) || 32593 ((instr & 0x3f0000) == 32594 0x100000) || 32595 ((instr & 0x3f0000) == 32596 0x200000)) { 32597 UnallocatedT32(instr); 32598 return; 32599 } 32600 DataType dt = 32601 Dt_imm6_4_Decode((instr >> 32602 19) & 32603 0x7, 32604 (instr >> 32605 28) & 32606 0x1); 32607 if (dt.Is( 32608 kDataTypeValueInvalid)) { 32609 UnallocatedT32(instr); 32610 return; 32611 } 32612 if (((instr >> 12) & 1) != 0) { 32613 UnallocatedT32(instr); 32614 return; 32615 } 32616 unsigned rd = 32617 ExtractQRegister(instr, 32618 22, 32619 12); 32620 unsigned rm = 32621 ExtractDRegister(instr, 5, 0); 32622 uint32_t imm6 = 32623 (instr >> 16) & 0x3f; 32624 uint32_t imm = 32625 imm6 - dt.GetSize(); 32626 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length) 32627 vshll(CurrentCond(), 32628 dt, 32629 QRegister(rd), 32630 DRegister(rm), 32631 imm); 32632 break; 32633 } 32634 case 0x000c0000: { 32635 // 0xef8c0a10 32636 if (((instr & 0x380000) == 0x0) || 32637 ((instr & 0x3f0000) == 32638 0x80000) || 32639 ((instr & 0x3f0000) == 32640 0x100000) || 32641 ((instr & 0x3f0000) == 32642 0x200000)) { 32643 UnallocatedT32(instr); 32644 return; 32645 } 32646 DataType dt = 32647 Dt_imm6_4_Decode((instr >> 32648 19) & 32649 0x7, 32650 (instr >> 32651 28) & 32652 0x1); 32653 if (dt.Is( 32654 kDataTypeValueInvalid)) { 32655 UnallocatedT32(instr); 32656 return; 32657 } 32658 if (((instr >> 12) & 1) != 0) { 32659 UnallocatedT32(instr); 32660 return; 32661 } 32662 unsigned rd = 32663 ExtractQRegister(instr, 32664 22, 32665 12); 32666 unsigned rm = 32667 ExtractDRegister(instr, 5, 0); 32668 uint32_t imm6 = 32669 (instr >> 16) & 0x3f; 32670 uint32_t imm = 32671 imm6 - dt.GetSize(); 32672 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length) 32673 vshll(CurrentCond(), 32674 dt, 32675 QRegister(rd), 32676 DRegister(rm), 32677 imm); 32678 break; 32679 } 32680 case 0x000d0000: { 32681 // 0xef8d0a10 32682 if (((instr & 0x380000) == 0x0) || 32683 ((instr & 0x3f0000) == 32684 0x80000) || 32685 ((instr & 0x3f0000) == 32686 0x100000) || 32687 ((instr & 0x3f0000) == 32688 0x200000)) { 32689 UnallocatedT32(instr); 32690 return; 32691 } 32692 DataType dt = 32693 Dt_imm6_4_Decode((instr >> 32694 19) & 32695 0x7, 32696 (instr >> 32697 28) & 32698 0x1); 32699 if (dt.Is( 32700 kDataTypeValueInvalid)) { 32701 UnallocatedT32(instr); 32702 return; 32703 } 32704 if (((instr >> 12) & 1) != 0) { 32705 UnallocatedT32(instr); 32706 return; 32707 } 32708 unsigned rd = 32709 ExtractQRegister(instr, 32710 22, 32711 12); 32712 unsigned rm = 32713 ExtractDRegister(instr, 5, 0); 32714 uint32_t imm6 = 32715 (instr >> 16) & 0x3f; 32716 uint32_t imm = 32717 imm6 - dt.GetSize(); 32718 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length) 32719 vshll(CurrentCond(), 32720 dt, 32721 QRegister(rd), 32722 DRegister(rm), 32723 imm); 32724 break; 32725 } 32726 case 0x000e0000: { 32727 // 0xef8e0a10 32728 if (((instr & 0x380000) == 0x0) || 32729 ((instr & 0x3f0000) == 32730 0x80000) || 32731 ((instr & 0x3f0000) == 32732 0x100000) || 32733 ((instr & 0x3f0000) == 32734 0x200000)) { 32735 UnallocatedT32(instr); 32736 return; 32737 } 32738 DataType dt = 32739 Dt_imm6_4_Decode((instr >> 32740 19) & 32741 0x7, 32742 (instr >> 32743 28) & 32744 0x1); 32745 if (dt.Is( 32746 kDataTypeValueInvalid)) { 32747 UnallocatedT32(instr); 32748 return; 32749 } 32750 if (((instr >> 12) & 1) != 0) { 32751 UnallocatedT32(instr); 32752 return; 32753 } 32754 unsigned rd = 32755 ExtractQRegister(instr, 32756 22, 32757 12); 32758 unsigned rm = 32759 ExtractDRegister(instr, 5, 0); 32760 uint32_t imm6 = 32761 (instr >> 16) & 0x3f; 32762 uint32_t imm = 32763 imm6 - dt.GetSize(); 32764 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length) 32765 vshll(CurrentCond(), 32766 dt, 32767 QRegister(rd), 32768 DRegister(rm), 32769 imm); 32770 break; 32771 } 32772 case 0x000f0000: { 32773 // 0xef8f0a10 32774 if (((instr & 0x380000) == 0x0) || 32775 ((instr & 0x3f0000) == 32776 0x80000) || 32777 ((instr & 0x3f0000) == 32778 0x100000) || 32779 ((instr & 0x3f0000) == 32780 0x200000)) { 32781 UnallocatedT32(instr); 32782 return; 32783 } 32784 DataType dt = 32785 Dt_imm6_4_Decode((instr >> 32786 19) & 32787 0x7, 32788 (instr >> 32789 28) & 32790 0x1); 32791 if (dt.Is( 32792 kDataTypeValueInvalid)) { 32793 UnallocatedT32(instr); 32794 return; 32795 } 32796 if (((instr >> 12) & 1) != 0) { 32797 UnallocatedT32(instr); 32798 return; 32799 } 32800 unsigned rd = 32801 ExtractQRegister(instr, 32802 22, 32803 12); 32804 unsigned rm = 32805 ExtractDRegister(instr, 5, 0); 32806 uint32_t imm6 = 32807 (instr >> 16) & 0x3f; 32808 uint32_t imm = 32809 imm6 - dt.GetSize(); 32810 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length) 32811 vshll(CurrentCond(), 32812 dt, 32813 QRegister(rd), 32814 DRegister(rm), 32815 imm); 32816 break; 32817 } 32818 case 0x00100000: { 32819 // 0xef900a10 32820 if (((instr & 0x380000) == 0x0) || 32821 ((instr & 0x380000) == 32822 0x180000) || 32823 ((instr & 0x380000) == 32824 0x280000) || 32825 ((instr & 0x380000) == 32826 0x300000) || 32827 ((instr & 0x380000) == 32828 0x380000)) { 32829 UnallocatedT32(instr); 32830 return; 32831 } 32832 DataType dt = Dt_U_imm3H_1_Decode( 32833 ((instr >> 19) & 0x7) | 32834 ((instr >> 25) & 0x8)); 32835 if (dt.Is( 32836 kDataTypeValueInvalid)) { 32837 UnallocatedT32(instr); 32838 return; 32839 } 32840 if (((instr >> 12) & 1) != 0) { 32841 UnallocatedT32(instr); 32842 return; 32843 } 32844 unsigned rd = 32845 ExtractQRegister(instr, 32846 22, 32847 12); 32848 unsigned rm = 32849 ExtractDRegister(instr, 5, 0); 32850 // VMOVL{<c>}{<q>}.<dt> <Qd>, <Dm> ; T1 NOLINT(whitespace/line_length) 32851 vmovl(CurrentCond(), 32852 dt, 32853 QRegister(rd), 32854 DRegister(rm)); 32855 break; 32856 } 32857 case 0x00110000: { 32858 // 0xef910a10 32859 if (((instr & 0x380000) == 0x0) || 32860 ((instr & 0x3f0000) == 32861 0x80000) || 32862 ((instr & 0x3f0000) == 32863 0x100000) || 32864 ((instr & 0x3f0000) == 32865 0x200000)) { 32866 UnallocatedT32(instr); 32867 return; 32868 } 32869 DataType dt = 32870 Dt_imm6_4_Decode((instr >> 32871 19) & 32872 0x7, 32873 (instr >> 32874 28) & 32875 0x1); 32876 if (dt.Is( 32877 kDataTypeValueInvalid)) { 32878 UnallocatedT32(instr); 32879 return; 32880 } 32881 if (((instr >> 12) & 1) != 0) { 32882 UnallocatedT32(instr); 32883 return; 32884 } 32885 unsigned rd = 32886 ExtractQRegister(instr, 32887 22, 32888 12); 32889 unsigned rm = 32890 ExtractDRegister(instr, 5, 0); 32891 uint32_t imm6 = 32892 (instr >> 16) & 0x3f; 32893 uint32_t imm = 32894 imm6 - dt.GetSize(); 32895 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length) 32896 vshll(CurrentCond(), 32897 dt, 32898 QRegister(rd), 32899 DRegister(rm), 32900 imm); 32901 break; 32902 } 32903 case 0x00120000: { 32904 // 0xef920a10 32905 if (((instr & 0x380000) == 0x0) || 32906 ((instr & 0x3f0000) == 32907 0x80000) || 32908 ((instr & 0x3f0000) == 32909 0x100000) || 32910 ((instr & 0x3f0000) == 32911 0x200000)) { 32912 UnallocatedT32(instr); 32913 return; 32914 } 32915 DataType dt = 32916 Dt_imm6_4_Decode((instr >> 32917 19) & 32918 0x7, 32919 (instr >> 32920 28) & 32921 0x1); 32922 if (dt.Is( 32923 kDataTypeValueInvalid)) { 32924 UnallocatedT32(instr); 32925 return; 32926 } 32927 if (((instr >> 12) & 1) != 0) { 32928 UnallocatedT32(instr); 32929 return; 32930 } 32931 unsigned rd = 32932 ExtractQRegister(instr, 32933 22, 32934 12); 32935 unsigned rm = 32936 ExtractDRegister(instr, 5, 0); 32937 uint32_t imm6 = 32938 (instr >> 16) & 0x3f; 32939 uint32_t imm = 32940 imm6 - dt.GetSize(); 32941 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length) 32942 vshll(CurrentCond(), 32943 dt, 32944 QRegister(rd), 32945 DRegister(rm), 32946 imm); 32947 break; 32948 } 32949 case 0x00130000: { 32950 // 0xef930a10 32951 if (((instr & 0x380000) == 0x0) || 32952 ((instr & 0x3f0000) == 32953 0x80000) || 32954 ((instr & 0x3f0000) == 32955 0x100000) || 32956 ((instr & 0x3f0000) == 32957 0x200000)) { 32958 UnallocatedT32(instr); 32959 return; 32960 } 32961 DataType dt = 32962 Dt_imm6_4_Decode((instr >> 32963 19) & 32964 0x7, 32965 (instr >> 32966 28) & 32967 0x1); 32968 if (dt.Is( 32969 kDataTypeValueInvalid)) { 32970 UnallocatedT32(instr); 32971 return; 32972 } 32973 if (((instr >> 12) & 1) != 0) { 32974 UnallocatedT32(instr); 32975 return; 32976 } 32977 unsigned rd = 32978 ExtractQRegister(instr, 32979 22, 32980 12); 32981 unsigned rm = 32982 ExtractDRegister(instr, 5, 0); 32983 uint32_t imm6 = 32984 (instr >> 16) & 0x3f; 32985 uint32_t imm = 32986 imm6 - dt.GetSize(); 32987 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length) 32988 vshll(CurrentCond(), 32989 dt, 32990 QRegister(rd), 32991 DRegister(rm), 32992 imm); 32993 break; 32994 } 32995 case 0x00140000: { 32996 // 0xef940a10 32997 if (((instr & 0x380000) == 0x0) || 32998 ((instr & 0x3f0000) == 32999 0x80000) || 33000 ((instr & 0x3f0000) == 33001 0x100000) || 33002 ((instr & 0x3f0000) == 33003 0x200000)) { 33004 UnallocatedT32(instr); 33005 return; 33006 } 33007 DataType dt = 33008 Dt_imm6_4_Decode((instr >> 33009 19) & 33010 0x7, 33011 (instr >> 33012 28) & 33013 0x1); 33014 if (dt.Is( 33015 kDataTypeValueInvalid)) { 33016 UnallocatedT32(instr); 33017 return; 33018 } 33019 if (((instr >> 12) & 1) != 0) { 33020 UnallocatedT32(instr); 33021 return; 33022 } 33023 unsigned rd = 33024 ExtractQRegister(instr, 33025 22, 33026 12); 33027 unsigned rm = 33028 ExtractDRegister(instr, 5, 0); 33029 uint32_t imm6 = 33030 (instr >> 16) & 0x3f; 33031 uint32_t imm = 33032 imm6 - dt.GetSize(); 33033 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length) 33034 vshll(CurrentCond(), 33035 dt, 33036 QRegister(rd), 33037 DRegister(rm), 33038 imm); 33039 break; 33040 } 33041 case 0x00150000: { 33042 // 0xef950a10 33043 if (((instr & 0x380000) == 0x0) || 33044 ((instr & 0x3f0000) == 33045 0x80000) || 33046 ((instr & 0x3f0000) == 33047 0x100000) || 33048 ((instr & 0x3f0000) == 33049 0x200000)) { 33050 UnallocatedT32(instr); 33051 return; 33052 } 33053 DataType dt = 33054 Dt_imm6_4_Decode((instr >> 33055 19) & 33056 0x7, 33057 (instr >> 33058 28) & 33059 0x1); 33060 if (dt.Is( 33061 kDataTypeValueInvalid)) { 33062 UnallocatedT32(instr); 33063 return; 33064 } 33065 if (((instr >> 12) & 1) != 0) { 33066 UnallocatedT32(instr); 33067 return; 33068 } 33069 unsigned rd = 33070 ExtractQRegister(instr, 33071 22, 33072 12); 33073 unsigned rm = 33074 ExtractDRegister(instr, 5, 0); 33075 uint32_t imm6 = 33076 (instr >> 16) & 0x3f; 33077 uint32_t imm = 33078 imm6 - dt.GetSize(); 33079 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length) 33080 vshll(CurrentCond(), 33081 dt, 33082 QRegister(rd), 33083 DRegister(rm), 33084 imm); 33085 break; 33086 } 33087 case 0x00160000: { 33088 // 0xef960a10 33089 if (((instr & 0x380000) == 0x0) || 33090 ((instr & 0x3f0000) == 33091 0x80000) || 33092 ((instr & 0x3f0000) == 33093 0x100000) || 33094 ((instr & 0x3f0000) == 33095 0x200000)) { 33096 UnallocatedT32(instr); 33097 return; 33098 } 33099 DataType dt = 33100 Dt_imm6_4_Decode((instr >> 33101 19) & 33102 0x7, 33103 (instr >> 33104 28) & 33105 0x1); 33106 if (dt.Is( 33107 kDataTypeValueInvalid)) { 33108 UnallocatedT32(instr); 33109 return; 33110 } 33111 if (((instr >> 12) & 1) != 0) { 33112 UnallocatedT32(instr); 33113 return; 33114 } 33115 unsigned rd = 33116 ExtractQRegister(instr, 33117 22, 33118 12); 33119 unsigned rm = 33120 ExtractDRegister(instr, 5, 0); 33121 uint32_t imm6 = 33122 (instr >> 16) & 0x3f; 33123 uint32_t imm = 33124 imm6 - dt.GetSize(); 33125 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length) 33126 vshll(CurrentCond(), 33127 dt, 33128 QRegister(rd), 33129 DRegister(rm), 33130 imm); 33131 break; 33132 } 33133 case 0x00170000: { 33134 // 0xef970a10 33135 if (((instr & 0x380000) == 0x0) || 33136 ((instr & 0x3f0000) == 33137 0x80000) || 33138 ((instr & 0x3f0000) == 33139 0x100000) || 33140 ((instr & 0x3f0000) == 33141 0x200000)) { 33142 UnallocatedT32(instr); 33143 return; 33144 } 33145 DataType dt = 33146 Dt_imm6_4_Decode((instr >> 33147 19) & 33148 0x7, 33149 (instr >> 33150 28) & 33151 0x1); 33152 if (dt.Is( 33153 kDataTypeValueInvalid)) { 33154 UnallocatedT32(instr); 33155 return; 33156 } 33157 if (((instr >> 12) & 1) != 0) { 33158 UnallocatedT32(instr); 33159 return; 33160 } 33161 unsigned rd = 33162 ExtractQRegister(instr, 33163 22, 33164 12); 33165 unsigned rm = 33166 ExtractDRegister(instr, 5, 0); 33167 uint32_t imm6 = 33168 (instr >> 16) & 0x3f; 33169 uint32_t imm = 33170 imm6 - dt.GetSize(); 33171 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length) 33172 vshll(CurrentCond(), 33173 dt, 33174 QRegister(rd), 33175 DRegister(rm), 33176 imm); 33177 break; 33178 } 33179 case 0x00180000: { 33180 // 0xef980a10 33181 if (((instr & 0x380000) == 0x0) || 33182 ((instr & 0x3f0000) == 33183 0x80000) || 33184 ((instr & 0x3f0000) == 33185 0x100000) || 33186 ((instr & 0x3f0000) == 33187 0x200000)) { 33188 UnallocatedT32(instr); 33189 return; 33190 } 33191 DataType dt = 33192 Dt_imm6_4_Decode((instr >> 33193 19) & 33194 0x7, 33195 (instr >> 33196 28) & 33197 0x1); 33198 if (dt.Is( 33199 kDataTypeValueInvalid)) { 33200 UnallocatedT32(instr); 33201 return; 33202 } 33203 if (((instr >> 12) & 1) != 0) { 33204 UnallocatedT32(instr); 33205 return; 33206 } 33207 unsigned rd = 33208 ExtractQRegister(instr, 33209 22, 33210 12); 33211 unsigned rm = 33212 ExtractDRegister(instr, 5, 0); 33213 uint32_t imm6 = 33214 (instr >> 16) & 0x3f; 33215 uint32_t imm = 33216 imm6 - dt.GetSize(); 33217 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length) 33218 vshll(CurrentCond(), 33219 dt, 33220 QRegister(rd), 33221 DRegister(rm), 33222 imm); 33223 break; 33224 } 33225 case 0x00190000: { 33226 // 0xef990a10 33227 if (((instr & 0x380000) == 0x0) || 33228 ((instr & 0x3f0000) == 33229 0x80000) || 33230 ((instr & 0x3f0000) == 33231 0x100000) || 33232 ((instr & 0x3f0000) == 33233 0x200000)) { 33234 UnallocatedT32(instr); 33235 return; 33236 } 33237 DataType dt = 33238 Dt_imm6_4_Decode((instr >> 33239 19) & 33240 0x7, 33241 (instr >> 33242 28) & 33243 0x1); 33244 if (dt.Is( 33245 kDataTypeValueInvalid)) { 33246 UnallocatedT32(instr); 33247 return; 33248 } 33249 if (((instr >> 12) & 1) != 0) { 33250 UnallocatedT32(instr); 33251 return; 33252 } 33253 unsigned rd = 33254 ExtractQRegister(instr, 33255 22, 33256 12); 33257 unsigned rm = 33258 ExtractDRegister(instr, 5, 0); 33259 uint32_t imm6 = 33260 (instr >> 16) & 0x3f; 33261 uint32_t imm = 33262 imm6 - dt.GetSize(); 33263 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length) 33264 vshll(CurrentCond(), 33265 dt, 33266 QRegister(rd), 33267 DRegister(rm), 33268 imm); 33269 break; 33270 } 33271 case 0x001a0000: { 33272 // 0xef9a0a10 33273 if (((instr & 0x380000) == 0x0) || 33274 ((instr & 0x3f0000) == 33275 0x80000) || 33276 ((instr & 0x3f0000) == 33277 0x100000) || 33278 ((instr & 0x3f0000) == 33279 0x200000)) { 33280 UnallocatedT32(instr); 33281 return; 33282 } 33283 DataType dt = 33284 Dt_imm6_4_Decode((instr >> 33285 19) & 33286 0x7, 33287 (instr >> 33288 28) & 33289 0x1); 33290 if (dt.Is( 33291 kDataTypeValueInvalid)) { 33292 UnallocatedT32(instr); 33293 return; 33294 } 33295 if (((instr >> 12) & 1) != 0) { 33296 UnallocatedT32(instr); 33297 return; 33298 } 33299 unsigned rd = 33300 ExtractQRegister(instr, 33301 22, 33302 12); 33303 unsigned rm = 33304 ExtractDRegister(instr, 5, 0); 33305 uint32_t imm6 = 33306 (instr >> 16) & 0x3f; 33307 uint32_t imm = 33308 imm6 - dt.GetSize(); 33309 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length) 33310 vshll(CurrentCond(), 33311 dt, 33312 QRegister(rd), 33313 DRegister(rm), 33314 imm); 33315 break; 33316 } 33317 case 0x001b0000: { 33318 // 0xef9b0a10 33319 if (((instr & 0x380000) == 0x0) || 33320 ((instr & 0x3f0000) == 33321 0x80000) || 33322 ((instr & 0x3f0000) == 33323 0x100000) || 33324 ((instr & 0x3f0000) == 33325 0x200000)) { 33326 UnallocatedT32(instr); 33327 return; 33328 } 33329 DataType dt = 33330 Dt_imm6_4_Decode((instr >> 33331 19) & 33332 0x7, 33333 (instr >> 33334 28) & 33335 0x1); 33336 if (dt.Is( 33337 kDataTypeValueInvalid)) { 33338 UnallocatedT32(instr); 33339 return; 33340 } 33341 if (((instr >> 12) & 1) != 0) { 33342 UnallocatedT32(instr); 33343 return; 33344 } 33345 unsigned rd = 33346 ExtractQRegister(instr, 33347 22, 33348 12); 33349 unsigned rm = 33350 ExtractDRegister(instr, 5, 0); 33351 uint32_t imm6 = 33352 (instr >> 16) & 0x3f; 33353 uint32_t imm = 33354 imm6 - dt.GetSize(); 33355 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length) 33356 vshll(CurrentCond(), 33357 dt, 33358 QRegister(rd), 33359 DRegister(rm), 33360 imm); 33361 break; 33362 } 33363 case 0x001c0000: { 33364 // 0xef9c0a10 33365 if (((instr & 0x380000) == 0x0) || 33366 ((instr & 0x3f0000) == 33367 0x80000) || 33368 ((instr & 0x3f0000) == 33369 0x100000) || 33370 ((instr & 0x3f0000) == 33371 0x200000)) { 33372 UnallocatedT32(instr); 33373 return; 33374 } 33375 DataType dt = 33376 Dt_imm6_4_Decode((instr >> 33377 19) & 33378 0x7, 33379 (instr >> 33380 28) & 33381 0x1); 33382 if (dt.Is( 33383 kDataTypeValueInvalid)) { 33384 UnallocatedT32(instr); 33385 return; 33386 } 33387 if (((instr >> 12) & 1) != 0) { 33388 UnallocatedT32(instr); 33389 return; 33390 } 33391 unsigned rd = 33392 ExtractQRegister(instr, 33393 22, 33394 12); 33395 unsigned rm = 33396 ExtractDRegister(instr, 5, 0); 33397 uint32_t imm6 = 33398 (instr >> 16) & 0x3f; 33399 uint32_t imm = 33400 imm6 - dt.GetSize(); 33401 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length) 33402 vshll(CurrentCond(), 33403 dt, 33404 QRegister(rd), 33405 DRegister(rm), 33406 imm); 33407 break; 33408 } 33409 case 0x001d0000: { 33410 // 0xef9d0a10 33411 if (((instr & 0x380000) == 0x0) || 33412 ((instr & 0x3f0000) == 33413 0x80000) || 33414 ((instr & 0x3f0000) == 33415 0x100000) || 33416 ((instr & 0x3f0000) == 33417 0x200000)) { 33418 UnallocatedT32(instr); 33419 return; 33420 } 33421 DataType dt = 33422 Dt_imm6_4_Decode((instr >> 33423 19) & 33424 0x7, 33425 (instr >> 33426 28) & 33427 0x1); 33428 if (dt.Is( 33429 kDataTypeValueInvalid)) { 33430 UnallocatedT32(instr); 33431 return; 33432 } 33433 if (((instr >> 12) & 1) != 0) { 33434 UnallocatedT32(instr); 33435 return; 33436 } 33437 unsigned rd = 33438 ExtractQRegister(instr, 33439 22, 33440 12); 33441 unsigned rm = 33442 ExtractDRegister(instr, 5, 0); 33443 uint32_t imm6 = 33444 (instr >> 16) & 0x3f; 33445 uint32_t imm = 33446 imm6 - dt.GetSize(); 33447 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length) 33448 vshll(CurrentCond(), 33449 dt, 33450 QRegister(rd), 33451 DRegister(rm), 33452 imm); 33453 break; 33454 } 33455 case 0x001e0000: { 33456 // 0xef9e0a10 33457 if (((instr & 0x380000) == 0x0) || 33458 ((instr & 0x3f0000) == 33459 0x80000) || 33460 ((instr & 0x3f0000) == 33461 0x100000) || 33462 ((instr & 0x3f0000) == 33463 0x200000)) { 33464 UnallocatedT32(instr); 33465 return; 33466 } 33467 DataType dt = 33468 Dt_imm6_4_Decode((instr >> 33469 19) & 33470 0x7, 33471 (instr >> 33472 28) & 33473 0x1); 33474 if (dt.Is( 33475 kDataTypeValueInvalid)) { 33476 UnallocatedT32(instr); 33477 return; 33478 } 33479 if (((instr >> 12) & 1) != 0) { 33480 UnallocatedT32(instr); 33481 return; 33482 } 33483 unsigned rd = 33484 ExtractQRegister(instr, 33485 22, 33486 12); 33487 unsigned rm = 33488 ExtractDRegister(instr, 5, 0); 33489 uint32_t imm6 = 33490 (instr >> 16) & 0x3f; 33491 uint32_t imm = 33492 imm6 - dt.GetSize(); 33493 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length) 33494 vshll(CurrentCond(), 33495 dt, 33496 QRegister(rd), 33497 DRegister(rm), 33498 imm); 33499 break; 33500 } 33501 case 0x001f0000: { 33502 // 0xef9f0a10 33503 if (((instr & 0x380000) == 0x0) || 33504 ((instr & 0x3f0000) == 33505 0x80000) || 33506 ((instr & 0x3f0000) == 33507 0x100000) || 33508 ((instr & 0x3f0000) == 33509 0x200000)) { 33510 UnallocatedT32(instr); 33511 return; 33512 } 33513 DataType dt = 33514 Dt_imm6_4_Decode((instr >> 33515 19) & 33516 0x7, 33517 (instr >> 33518 28) & 33519 0x1); 33520 if (dt.Is( 33521 kDataTypeValueInvalid)) { 33522 UnallocatedT32(instr); 33523 return; 33524 } 33525 if (((instr >> 12) & 1) != 0) { 33526 UnallocatedT32(instr); 33527 return; 33528 } 33529 unsigned rd = 33530 ExtractQRegister(instr, 33531 22, 33532 12); 33533 unsigned rm = 33534 ExtractDRegister(instr, 5, 0); 33535 uint32_t imm6 = 33536 (instr >> 16) & 0x3f; 33537 uint32_t imm = 33538 imm6 - dt.GetSize(); 33539 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length) 33540 vshll(CurrentCond(), 33541 dt, 33542 QRegister(rd), 33543 DRegister(rm), 33544 imm); 33545 break; 33546 } 33547 case 0x00200000: { 33548 // 0xefa00a10 33549 if (((instr & 0x380000) == 0x0) || 33550 ((instr & 0x380000) == 33551 0x180000) || 33552 ((instr & 0x380000) == 33553 0x280000) || 33554 ((instr & 0x380000) == 33555 0x300000) || 33556 ((instr & 0x380000) == 33557 0x380000)) { 33558 UnallocatedT32(instr); 33559 return; 33560 } 33561 DataType dt = Dt_U_imm3H_1_Decode( 33562 ((instr >> 19) & 0x7) | 33563 ((instr >> 25) & 0x8)); 33564 if (dt.Is( 33565 kDataTypeValueInvalid)) { 33566 UnallocatedT32(instr); 33567 return; 33568 } 33569 if (((instr >> 12) & 1) != 0) { 33570 UnallocatedT32(instr); 33571 return; 33572 } 33573 unsigned rd = 33574 ExtractQRegister(instr, 33575 22, 33576 12); 33577 unsigned rm = 33578 ExtractDRegister(instr, 5, 0); 33579 // VMOVL{<c>}{<q>}.<dt> <Qd>, <Dm> ; T1 NOLINT(whitespace/line_length) 33580 vmovl(CurrentCond(), 33581 dt, 33582 QRegister(rd), 33583 DRegister(rm)); 33584 break; 33585 } 33586 case 0x00210000: { 33587 // 0xefa10a10 33588 if (((instr & 0x380000) == 0x0) || 33589 ((instr & 0x3f0000) == 33590 0x80000) || 33591 ((instr & 0x3f0000) == 33592 0x100000) || 33593 ((instr & 0x3f0000) == 33594 0x200000)) { 33595 UnallocatedT32(instr); 33596 return; 33597 } 33598 DataType dt = 33599 Dt_imm6_4_Decode((instr >> 33600 19) & 33601 0x7, 33602 (instr >> 33603 28) & 33604 0x1); 33605 if (dt.Is( 33606 kDataTypeValueInvalid)) { 33607 UnallocatedT32(instr); 33608 return; 33609 } 33610 if (((instr >> 12) & 1) != 0) { 33611 UnallocatedT32(instr); 33612 return; 33613 } 33614 unsigned rd = 33615 ExtractQRegister(instr, 33616 22, 33617 12); 33618 unsigned rm = 33619 ExtractDRegister(instr, 5, 0); 33620 uint32_t imm6 = 33621 (instr >> 16) & 0x3f; 33622 uint32_t imm = 33623 imm6 - dt.GetSize(); 33624 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length) 33625 vshll(CurrentCond(), 33626 dt, 33627 QRegister(rd), 33628 DRegister(rm), 33629 imm); 33630 break; 33631 } 33632 case 0x00220000: { 33633 // 0xefa20a10 33634 if (((instr & 0x380000) == 0x0) || 33635 ((instr & 0x3f0000) == 33636 0x80000) || 33637 ((instr & 0x3f0000) == 33638 0x100000) || 33639 ((instr & 0x3f0000) == 33640 0x200000)) { 33641 UnallocatedT32(instr); 33642 return; 33643 } 33644 DataType dt = 33645 Dt_imm6_4_Decode((instr >> 33646 19) & 33647 0x7, 33648 (instr >> 33649 28) & 33650 0x1); 33651 if (dt.Is( 33652 kDataTypeValueInvalid)) { 33653 UnallocatedT32(instr); 33654 return; 33655 } 33656 if (((instr >> 12) & 1) != 0) { 33657 UnallocatedT32(instr); 33658 return; 33659 } 33660 unsigned rd = 33661 ExtractQRegister(instr, 33662 22, 33663 12); 33664 unsigned rm = 33665 ExtractDRegister(instr, 5, 0); 33666 uint32_t imm6 = 33667 (instr >> 16) & 0x3f; 33668 uint32_t imm = 33669 imm6 - dt.GetSize(); 33670 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length) 33671 vshll(CurrentCond(), 33672 dt, 33673 QRegister(rd), 33674 DRegister(rm), 33675 imm); 33676 break; 33677 } 33678 case 0x00230000: { 33679 // 0xefa30a10 33680 if (((instr & 0x380000) == 0x0) || 33681 ((instr & 0x3f0000) == 33682 0x80000) || 33683 ((instr & 0x3f0000) == 33684 0x100000) || 33685 ((instr & 0x3f0000) == 33686 0x200000)) { 33687 UnallocatedT32(instr); 33688 return; 33689 } 33690 DataType dt = 33691 Dt_imm6_4_Decode((instr >> 33692 19) & 33693 0x7, 33694 (instr >> 33695 28) & 33696 0x1); 33697 if (dt.Is( 33698 kDataTypeValueInvalid)) { 33699 UnallocatedT32(instr); 33700 return; 33701 } 33702 if (((instr >> 12) & 1) != 0) { 33703 UnallocatedT32(instr); 33704 return; 33705 } 33706 unsigned rd = 33707 ExtractQRegister(instr, 33708 22, 33709 12); 33710 unsigned rm = 33711 ExtractDRegister(instr, 5, 0); 33712 uint32_t imm6 = 33713 (instr >> 16) & 0x3f; 33714 uint32_t imm = 33715 imm6 - dt.GetSize(); 33716 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length) 33717 vshll(CurrentCond(), 33718 dt, 33719 QRegister(rd), 33720 DRegister(rm), 33721 imm); 33722 break; 33723 } 33724 case 0x00240000: { 33725 // 0xefa40a10 33726 if (((instr & 0x380000) == 0x0) || 33727 ((instr & 0x3f0000) == 33728 0x80000) || 33729 ((instr & 0x3f0000) == 33730 0x100000) || 33731 ((instr & 0x3f0000) == 33732 0x200000)) { 33733 UnallocatedT32(instr); 33734 return; 33735 } 33736 DataType dt = 33737 Dt_imm6_4_Decode((instr >> 33738 19) & 33739 0x7, 33740 (instr >> 33741 28) & 33742 0x1); 33743 if (dt.Is( 33744 kDataTypeValueInvalid)) { 33745 UnallocatedT32(instr); 33746 return; 33747 } 33748 if (((instr >> 12) & 1) != 0) { 33749 UnallocatedT32(instr); 33750 return; 33751 } 33752 unsigned rd = 33753 ExtractQRegister(instr, 33754 22, 33755 12); 33756 unsigned rm = 33757 ExtractDRegister(instr, 5, 0); 33758 uint32_t imm6 = 33759 (instr >> 16) & 0x3f; 33760 uint32_t imm = 33761 imm6 - dt.GetSize(); 33762 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length) 33763 vshll(CurrentCond(), 33764 dt, 33765 QRegister(rd), 33766 DRegister(rm), 33767 imm); 33768 break; 33769 } 33770 case 0x00250000: { 33771 // 0xefa50a10 33772 if (((instr & 0x380000) == 0x0) || 33773 ((instr & 0x3f0000) == 33774 0x80000) || 33775 ((instr & 0x3f0000) == 33776 0x100000) || 33777 ((instr & 0x3f0000) == 33778 0x200000)) { 33779 UnallocatedT32(instr); 33780 return; 33781 } 33782 DataType dt = 33783 Dt_imm6_4_Decode((instr >> 33784 19) & 33785 0x7, 33786 (instr >> 33787 28) & 33788 0x1); 33789 if (dt.Is( 33790 kDataTypeValueInvalid)) { 33791 UnallocatedT32(instr); 33792 return; 33793 } 33794 if (((instr >> 12) & 1) != 0) { 33795 UnallocatedT32(instr); 33796 return; 33797 } 33798 unsigned rd = 33799 ExtractQRegister(instr, 33800 22, 33801 12); 33802 unsigned rm = 33803 ExtractDRegister(instr, 5, 0); 33804 uint32_t imm6 = 33805 (instr >> 16) & 0x3f; 33806 uint32_t imm = 33807 imm6 - dt.GetSize(); 33808 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length) 33809 vshll(CurrentCond(), 33810 dt, 33811 QRegister(rd), 33812 DRegister(rm), 33813 imm); 33814 break; 33815 } 33816 case 0x00260000: { 33817 // 0xefa60a10 33818 if (((instr & 0x380000) == 0x0) || 33819 ((instr & 0x3f0000) == 33820 0x80000) || 33821 ((instr & 0x3f0000) == 33822 0x100000) || 33823 ((instr & 0x3f0000) == 33824 0x200000)) { 33825 UnallocatedT32(instr); 33826 return; 33827 } 33828 DataType dt = 33829 Dt_imm6_4_Decode((instr >> 33830 19) & 33831 0x7, 33832 (instr >> 33833 28) & 33834 0x1); 33835 if (dt.Is( 33836 kDataTypeValueInvalid)) { 33837 UnallocatedT32(instr); 33838 return; 33839 } 33840 if (((instr >> 12) & 1) != 0) { 33841 UnallocatedT32(instr); 33842 return; 33843 } 33844 unsigned rd = 33845 ExtractQRegister(instr, 33846 22, 33847 12); 33848 unsigned rm = 33849 ExtractDRegister(instr, 5, 0); 33850 uint32_t imm6 = 33851 (instr >> 16) & 0x3f; 33852 uint32_t imm = 33853 imm6 - dt.GetSize(); 33854 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length) 33855 vshll(CurrentCond(), 33856 dt, 33857 QRegister(rd), 33858 DRegister(rm), 33859 imm); 33860 break; 33861 } 33862 case 0x00270000: { 33863 // 0xefa70a10 33864 if (((instr & 0x380000) == 0x0) || 33865 ((instr & 0x3f0000) == 33866 0x80000) || 33867 ((instr & 0x3f0000) == 33868 0x100000) || 33869 ((instr & 0x3f0000) == 33870 0x200000)) { 33871 UnallocatedT32(instr); 33872 return; 33873 } 33874 DataType dt = 33875 Dt_imm6_4_Decode((instr >> 33876 19) & 33877 0x7, 33878 (instr >> 33879 28) & 33880 0x1); 33881 if (dt.Is( 33882 kDataTypeValueInvalid)) { 33883 UnallocatedT32(instr); 33884 return; 33885 } 33886 if (((instr >> 12) & 1) != 0) { 33887 UnallocatedT32(instr); 33888 return; 33889 } 33890 unsigned rd = 33891 ExtractQRegister(instr, 33892 22, 33893 12); 33894 unsigned rm = 33895 ExtractDRegister(instr, 5, 0); 33896 uint32_t imm6 = 33897 (instr >> 16) & 0x3f; 33898 uint32_t imm = 33899 imm6 - dt.GetSize(); 33900 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length) 33901 vshll(CurrentCond(), 33902 dt, 33903 QRegister(rd), 33904 DRegister(rm), 33905 imm); 33906 break; 33907 } 33908 case 0x00280000: { 33909 // 0xefa80a10 33910 if (((instr & 0x380000) == 0x0) || 33911 ((instr & 0x3f0000) == 33912 0x80000) || 33913 ((instr & 0x3f0000) == 33914 0x100000) || 33915 ((instr & 0x3f0000) == 33916 0x200000)) { 33917 UnallocatedT32(instr); 33918 return; 33919 } 33920 DataType dt = 33921 Dt_imm6_4_Decode((instr >> 33922 19) & 33923 0x7, 33924 (instr >> 33925 28) & 33926 0x1); 33927 if (dt.Is( 33928 kDataTypeValueInvalid)) { 33929 UnallocatedT32(instr); 33930 return; 33931 } 33932 if (((instr >> 12) & 1) != 0) { 33933 UnallocatedT32(instr); 33934 return; 33935 } 33936 unsigned rd = 33937 ExtractQRegister(instr, 33938 22, 33939 12); 33940 unsigned rm = 33941 ExtractDRegister(instr, 5, 0); 33942 uint32_t imm6 = 33943 (instr >> 16) & 0x3f; 33944 uint32_t imm = 33945 imm6 - dt.GetSize(); 33946 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length) 33947 vshll(CurrentCond(), 33948 dt, 33949 QRegister(rd), 33950 DRegister(rm), 33951 imm); 33952 break; 33953 } 33954 case 0x00290000: { 33955 // 0xefa90a10 33956 if (((instr & 0x380000) == 0x0) || 33957 ((instr & 0x3f0000) == 33958 0x80000) || 33959 ((instr & 0x3f0000) == 33960 0x100000) || 33961 ((instr & 0x3f0000) == 33962 0x200000)) { 33963 UnallocatedT32(instr); 33964 return; 33965 } 33966 DataType dt = 33967 Dt_imm6_4_Decode((instr >> 33968 19) & 33969 0x7, 33970 (instr >> 33971 28) & 33972 0x1); 33973 if (dt.Is( 33974 kDataTypeValueInvalid)) { 33975 UnallocatedT32(instr); 33976 return; 33977 } 33978 if (((instr >> 12) & 1) != 0) { 33979 UnallocatedT32(instr); 33980 return; 33981 } 33982 unsigned rd = 33983 ExtractQRegister(instr, 33984 22, 33985 12); 33986 unsigned rm = 33987 ExtractDRegister(instr, 5, 0); 33988 uint32_t imm6 = 33989 (instr >> 16) & 0x3f; 33990 uint32_t imm = 33991 imm6 - dt.GetSize(); 33992 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length) 33993 vshll(CurrentCond(), 33994 dt, 33995 QRegister(rd), 33996 DRegister(rm), 33997 imm); 33998 break; 33999 } 34000 case 0x002a0000: { 34001 // 0xefaa0a10 34002 if (((instr & 0x380000) == 0x0) || 34003 ((instr & 0x3f0000) == 34004 0x80000) || 34005 ((instr & 0x3f0000) == 34006 0x100000) || 34007 ((instr & 0x3f0000) == 34008 0x200000)) { 34009 UnallocatedT32(instr); 34010 return; 34011 } 34012 DataType dt = 34013 Dt_imm6_4_Decode((instr >> 34014 19) & 34015 0x7, 34016 (instr >> 34017 28) & 34018 0x1); 34019 if (dt.Is( 34020 kDataTypeValueInvalid)) { 34021 UnallocatedT32(instr); 34022 return; 34023 } 34024 if (((instr >> 12) & 1) != 0) { 34025 UnallocatedT32(instr); 34026 return; 34027 } 34028 unsigned rd = 34029 ExtractQRegister(instr, 34030 22, 34031 12); 34032 unsigned rm = 34033 ExtractDRegister(instr, 5, 0); 34034 uint32_t imm6 = 34035 (instr >> 16) & 0x3f; 34036 uint32_t imm = 34037 imm6 - dt.GetSize(); 34038 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length) 34039 vshll(CurrentCond(), 34040 dt, 34041 QRegister(rd), 34042 DRegister(rm), 34043 imm); 34044 break; 34045 } 34046 case 0x002b0000: { 34047 // 0xefab0a10 34048 if (((instr & 0x380000) == 0x0) || 34049 ((instr & 0x3f0000) == 34050 0x80000) || 34051 ((instr & 0x3f0000) == 34052 0x100000) || 34053 ((instr & 0x3f0000) == 34054 0x200000)) { 34055 UnallocatedT32(instr); 34056 return; 34057 } 34058 DataType dt = 34059 Dt_imm6_4_Decode((instr >> 34060 19) & 34061 0x7, 34062 (instr >> 34063 28) & 34064 0x1); 34065 if (dt.Is( 34066 kDataTypeValueInvalid)) { 34067 UnallocatedT32(instr); 34068 return; 34069 } 34070 if (((instr >> 12) & 1) != 0) { 34071 UnallocatedT32(instr); 34072 return; 34073 } 34074 unsigned rd = 34075 ExtractQRegister(instr, 34076 22, 34077 12); 34078 unsigned rm = 34079 ExtractDRegister(instr, 5, 0); 34080 uint32_t imm6 = 34081 (instr >> 16) & 0x3f; 34082 uint32_t imm = 34083 imm6 - dt.GetSize(); 34084 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length) 34085 vshll(CurrentCond(), 34086 dt, 34087 QRegister(rd), 34088 DRegister(rm), 34089 imm); 34090 break; 34091 } 34092 case 0x002c0000: { 34093 // 0xefac0a10 34094 if (((instr & 0x380000) == 0x0) || 34095 ((instr & 0x3f0000) == 34096 0x80000) || 34097 ((instr & 0x3f0000) == 34098 0x100000) || 34099 ((instr & 0x3f0000) == 34100 0x200000)) { 34101 UnallocatedT32(instr); 34102 return; 34103 } 34104 DataType dt = 34105 Dt_imm6_4_Decode((instr >> 34106 19) & 34107 0x7, 34108 (instr >> 34109 28) & 34110 0x1); 34111 if (dt.Is( 34112 kDataTypeValueInvalid)) { 34113 UnallocatedT32(instr); 34114 return; 34115 } 34116 if (((instr >> 12) & 1) != 0) { 34117 UnallocatedT32(instr); 34118 return; 34119 } 34120 unsigned rd = 34121 ExtractQRegister(instr, 34122 22, 34123 12); 34124 unsigned rm = 34125 ExtractDRegister(instr, 5, 0); 34126 uint32_t imm6 = 34127 (instr >> 16) & 0x3f; 34128 uint32_t imm = 34129 imm6 - dt.GetSize(); 34130 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length) 34131 vshll(CurrentCond(), 34132 dt, 34133 QRegister(rd), 34134 DRegister(rm), 34135 imm); 34136 break; 34137 } 34138 case 0x002d0000: { 34139 // 0xefad0a10 34140 if (((instr & 0x380000) == 0x0) || 34141 ((instr & 0x3f0000) == 34142 0x80000) || 34143 ((instr & 0x3f0000) == 34144 0x100000) || 34145 ((instr & 0x3f0000) == 34146 0x200000)) { 34147 UnallocatedT32(instr); 34148 return; 34149 } 34150 DataType dt = 34151 Dt_imm6_4_Decode((instr >> 34152 19) & 34153 0x7, 34154 (instr >> 34155 28) & 34156 0x1); 34157 if (dt.Is( 34158 kDataTypeValueInvalid)) { 34159 UnallocatedT32(instr); 34160 return; 34161 } 34162 if (((instr >> 12) & 1) != 0) { 34163 UnallocatedT32(instr); 34164 return; 34165 } 34166 unsigned rd = 34167 ExtractQRegister(instr, 34168 22, 34169 12); 34170 unsigned rm = 34171 ExtractDRegister(instr, 5, 0); 34172 uint32_t imm6 = 34173 (instr >> 16) & 0x3f; 34174 uint32_t imm = 34175 imm6 - dt.GetSize(); 34176 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length) 34177 vshll(CurrentCond(), 34178 dt, 34179 QRegister(rd), 34180 DRegister(rm), 34181 imm); 34182 break; 34183 } 34184 case 0x002e0000: { 34185 // 0xefae0a10 34186 if (((instr & 0x380000) == 0x0) || 34187 ((instr & 0x3f0000) == 34188 0x80000) || 34189 ((instr & 0x3f0000) == 34190 0x100000) || 34191 ((instr & 0x3f0000) == 34192 0x200000)) { 34193 UnallocatedT32(instr); 34194 return; 34195 } 34196 DataType dt = 34197 Dt_imm6_4_Decode((instr >> 34198 19) & 34199 0x7, 34200 (instr >> 34201 28) & 34202 0x1); 34203 if (dt.Is( 34204 kDataTypeValueInvalid)) { 34205 UnallocatedT32(instr); 34206 return; 34207 } 34208 if (((instr >> 12) & 1) != 0) { 34209 UnallocatedT32(instr); 34210 return; 34211 } 34212 unsigned rd = 34213 ExtractQRegister(instr, 34214 22, 34215 12); 34216 unsigned rm = 34217 ExtractDRegister(instr, 5, 0); 34218 uint32_t imm6 = 34219 (instr >> 16) & 0x3f; 34220 uint32_t imm = 34221 imm6 - dt.GetSize(); 34222 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length) 34223 vshll(CurrentCond(), 34224 dt, 34225 QRegister(rd), 34226 DRegister(rm), 34227 imm); 34228 break; 34229 } 34230 case 0x002f0000: { 34231 // 0xefaf0a10 34232 if (((instr & 0x380000) == 0x0) || 34233 ((instr & 0x3f0000) == 34234 0x80000) || 34235 ((instr & 0x3f0000) == 34236 0x100000) || 34237 ((instr & 0x3f0000) == 34238 0x200000)) { 34239 UnallocatedT32(instr); 34240 return; 34241 } 34242 DataType dt = 34243 Dt_imm6_4_Decode((instr >> 34244 19) & 34245 0x7, 34246 (instr >> 34247 28) & 34248 0x1); 34249 if (dt.Is( 34250 kDataTypeValueInvalid)) { 34251 UnallocatedT32(instr); 34252 return; 34253 } 34254 if (((instr >> 12) & 1) != 0) { 34255 UnallocatedT32(instr); 34256 return; 34257 } 34258 unsigned rd = 34259 ExtractQRegister(instr, 34260 22, 34261 12); 34262 unsigned rm = 34263 ExtractDRegister(instr, 5, 0); 34264 uint32_t imm6 = 34265 (instr >> 16) & 0x3f; 34266 uint32_t imm = 34267 imm6 - dt.GetSize(); 34268 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length) 34269 vshll(CurrentCond(), 34270 dt, 34271 QRegister(rd), 34272 DRegister(rm), 34273 imm); 34274 break; 34275 } 34276 case 0x00300000: { 34277 // 0xefb00a10 34278 if (((instr & 0x380000) == 0x0) || 34279 ((instr & 0x3f0000) == 34280 0x80000) || 34281 ((instr & 0x3f0000) == 34282 0x100000) || 34283 ((instr & 0x3f0000) == 34284 0x200000)) { 34285 UnallocatedT32(instr); 34286 return; 34287 } 34288 DataType dt = 34289 Dt_imm6_4_Decode((instr >> 34290 19) & 34291 0x7, 34292 (instr >> 34293 28) & 34294 0x1); 34295 if (dt.Is( 34296 kDataTypeValueInvalid)) { 34297 UnallocatedT32(instr); 34298 return; 34299 } 34300 if (((instr >> 12) & 1) != 0) { 34301 UnallocatedT32(instr); 34302 return; 34303 } 34304 unsigned rd = 34305 ExtractQRegister(instr, 34306 22, 34307 12); 34308 unsigned rm = 34309 ExtractDRegister(instr, 5, 0); 34310 uint32_t imm6 = 34311 (instr >> 16) & 0x3f; 34312 uint32_t imm = 34313 imm6 - dt.GetSize(); 34314 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length) 34315 vshll(CurrentCond(), 34316 dt, 34317 QRegister(rd), 34318 DRegister(rm), 34319 imm); 34320 break; 34321 } 34322 case 0x00310000: { 34323 // 0xefb10a10 34324 if (((instr & 0x380000) == 0x0) || 34325 ((instr & 0x3f0000) == 34326 0x80000) || 34327 ((instr & 0x3f0000) == 34328 0x100000) || 34329 ((instr & 0x3f0000) == 34330 0x200000)) { 34331 UnallocatedT32(instr); 34332 return; 34333 } 34334 DataType dt = 34335 Dt_imm6_4_Decode((instr >> 34336 19) & 34337 0x7, 34338 (instr >> 34339 28) & 34340 0x1); 34341 if (dt.Is( 34342 kDataTypeValueInvalid)) { 34343 UnallocatedT32(instr); 34344 return; 34345 } 34346 if (((instr >> 12) & 1) != 0) { 34347 UnallocatedT32(instr); 34348 return; 34349 } 34350 unsigned rd = 34351 ExtractQRegister(instr, 34352 22, 34353 12); 34354 unsigned rm = 34355 ExtractDRegister(instr, 5, 0); 34356 uint32_t imm6 = 34357 (instr >> 16) & 0x3f; 34358 uint32_t imm = 34359 imm6 - dt.GetSize(); 34360 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length) 34361 vshll(CurrentCond(), 34362 dt, 34363 QRegister(rd), 34364 DRegister(rm), 34365 imm); 34366 break; 34367 } 34368 case 0x00320000: { 34369 // 0xefb20a10 34370 if (((instr & 0x380000) == 0x0) || 34371 ((instr & 0x3f0000) == 34372 0x80000) || 34373 ((instr & 0x3f0000) == 34374 0x100000) || 34375 ((instr & 0x3f0000) == 34376 0x200000)) { 34377 UnallocatedT32(instr); 34378 return; 34379 } 34380 DataType dt = 34381 Dt_imm6_4_Decode((instr >> 34382 19) & 34383 0x7, 34384 (instr >> 34385 28) & 34386 0x1); 34387 if (dt.Is( 34388 kDataTypeValueInvalid)) { 34389 UnallocatedT32(instr); 34390 return; 34391 } 34392 if (((instr >> 12) & 1) != 0) { 34393 UnallocatedT32(instr); 34394 return; 34395 } 34396 unsigned rd = 34397 ExtractQRegister(instr, 34398 22, 34399 12); 34400 unsigned rm = 34401 ExtractDRegister(instr, 5, 0); 34402 uint32_t imm6 = 34403 (instr >> 16) & 0x3f; 34404 uint32_t imm = 34405 imm6 - dt.GetSize(); 34406 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length) 34407 vshll(CurrentCond(), 34408 dt, 34409 QRegister(rd), 34410 DRegister(rm), 34411 imm); 34412 break; 34413 } 34414 case 0x00330000: { 34415 // 0xefb30a10 34416 if (((instr & 0x380000) == 0x0) || 34417 ((instr & 0x3f0000) == 34418 0x80000) || 34419 ((instr & 0x3f0000) == 34420 0x100000) || 34421 ((instr & 0x3f0000) == 34422 0x200000)) { 34423 UnallocatedT32(instr); 34424 return; 34425 } 34426 DataType dt = 34427 Dt_imm6_4_Decode((instr >> 34428 19) & 34429 0x7, 34430 (instr >> 34431 28) & 34432 0x1); 34433 if (dt.Is( 34434 kDataTypeValueInvalid)) { 34435 UnallocatedT32(instr); 34436 return; 34437 } 34438 if (((instr >> 12) & 1) != 0) { 34439 UnallocatedT32(instr); 34440 return; 34441 } 34442 unsigned rd = 34443 ExtractQRegister(instr, 34444 22, 34445 12); 34446 unsigned rm = 34447 ExtractDRegister(instr, 5, 0); 34448 uint32_t imm6 = 34449 (instr >> 16) & 0x3f; 34450 uint32_t imm = 34451 imm6 - dt.GetSize(); 34452 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length) 34453 vshll(CurrentCond(), 34454 dt, 34455 QRegister(rd), 34456 DRegister(rm), 34457 imm); 34458 break; 34459 } 34460 case 0x00340000: { 34461 // 0xefb40a10 34462 if (((instr & 0x380000) == 0x0) || 34463 ((instr & 0x3f0000) == 34464 0x80000) || 34465 ((instr & 0x3f0000) == 34466 0x100000) || 34467 ((instr & 0x3f0000) == 34468 0x200000)) { 34469 UnallocatedT32(instr); 34470 return; 34471 } 34472 DataType dt = 34473 Dt_imm6_4_Decode((instr >> 34474 19) & 34475 0x7, 34476 (instr >> 34477 28) & 34478 0x1); 34479 if (dt.Is( 34480 kDataTypeValueInvalid)) { 34481 UnallocatedT32(instr); 34482 return; 34483 } 34484 if (((instr >> 12) & 1) != 0) { 34485 UnallocatedT32(instr); 34486 return; 34487 } 34488 unsigned rd = 34489 ExtractQRegister(instr, 34490 22, 34491 12); 34492 unsigned rm = 34493 ExtractDRegister(instr, 5, 0); 34494 uint32_t imm6 = 34495 (instr >> 16) & 0x3f; 34496 uint32_t imm = 34497 imm6 - dt.GetSize(); 34498 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length) 34499 vshll(CurrentCond(), 34500 dt, 34501 QRegister(rd), 34502 DRegister(rm), 34503 imm); 34504 break; 34505 } 34506 case 0x00350000: { 34507 // 0xefb50a10 34508 if (((instr & 0x380000) == 0x0) || 34509 ((instr & 0x3f0000) == 34510 0x80000) || 34511 ((instr & 0x3f0000) == 34512 0x100000) || 34513 ((instr & 0x3f0000) == 34514 0x200000)) { 34515 UnallocatedT32(instr); 34516 return; 34517 } 34518 DataType dt = 34519 Dt_imm6_4_Decode((instr >> 34520 19) & 34521 0x7, 34522 (instr >> 34523 28) & 34524 0x1); 34525 if (dt.Is( 34526 kDataTypeValueInvalid)) { 34527 UnallocatedT32(instr); 34528 return; 34529 } 34530 if (((instr >> 12) & 1) != 0) { 34531 UnallocatedT32(instr); 34532 return; 34533 } 34534 unsigned rd = 34535 ExtractQRegister(instr, 34536 22, 34537 12); 34538 unsigned rm = 34539 ExtractDRegister(instr, 5, 0); 34540 uint32_t imm6 = 34541 (instr >> 16) & 0x3f; 34542 uint32_t imm = 34543 imm6 - dt.GetSize(); 34544 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length) 34545 vshll(CurrentCond(), 34546 dt, 34547 QRegister(rd), 34548 DRegister(rm), 34549 imm); 34550 break; 34551 } 34552 case 0x00360000: { 34553 // 0xefb60a10 34554 if (((instr & 0x380000) == 0x0) || 34555 ((instr & 0x3f0000) == 34556 0x80000) || 34557 ((instr & 0x3f0000) == 34558 0x100000) || 34559 ((instr & 0x3f0000) == 34560 0x200000)) { 34561 UnallocatedT32(instr); 34562 return; 34563 } 34564 DataType dt = 34565 Dt_imm6_4_Decode((instr >> 34566 19) & 34567 0x7, 34568 (instr >> 34569 28) & 34570 0x1); 34571 if (dt.Is( 34572 kDataTypeValueInvalid)) { 34573 UnallocatedT32(instr); 34574 return; 34575 } 34576 if (((instr >> 12) & 1) != 0) { 34577 UnallocatedT32(instr); 34578 return; 34579 } 34580 unsigned rd = 34581 ExtractQRegister(instr, 34582 22, 34583 12); 34584 unsigned rm = 34585 ExtractDRegister(instr, 5, 0); 34586 uint32_t imm6 = 34587 (instr >> 16) & 0x3f; 34588 uint32_t imm = 34589 imm6 - dt.GetSize(); 34590 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length) 34591 vshll(CurrentCond(), 34592 dt, 34593 QRegister(rd), 34594 DRegister(rm), 34595 imm); 34596 break; 34597 } 34598 case 0x00370000: { 34599 // 0xefb70a10 34600 if (((instr & 0x380000) == 0x0) || 34601 ((instr & 0x3f0000) == 34602 0x80000) || 34603 ((instr & 0x3f0000) == 34604 0x100000) || 34605 ((instr & 0x3f0000) == 34606 0x200000)) { 34607 UnallocatedT32(instr); 34608 return; 34609 } 34610 DataType dt = 34611 Dt_imm6_4_Decode((instr >> 34612 19) & 34613 0x7, 34614 (instr >> 34615 28) & 34616 0x1); 34617 if (dt.Is( 34618 kDataTypeValueInvalid)) { 34619 UnallocatedT32(instr); 34620 return; 34621 } 34622 if (((instr >> 12) & 1) != 0) { 34623 UnallocatedT32(instr); 34624 return; 34625 } 34626 unsigned rd = 34627 ExtractQRegister(instr, 34628 22, 34629 12); 34630 unsigned rm = 34631 ExtractDRegister(instr, 5, 0); 34632 uint32_t imm6 = 34633 (instr >> 16) & 0x3f; 34634 uint32_t imm = 34635 imm6 - dt.GetSize(); 34636 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length) 34637 vshll(CurrentCond(), 34638 dt, 34639 QRegister(rd), 34640 DRegister(rm), 34641 imm); 34642 break; 34643 } 34644 case 0x00380000: { 34645 // 0xefb80a10 34646 if (((instr & 0x380000) == 0x0) || 34647 ((instr & 0x3f0000) == 34648 0x80000) || 34649 ((instr & 0x3f0000) == 34650 0x100000) || 34651 ((instr & 0x3f0000) == 34652 0x200000)) { 34653 UnallocatedT32(instr); 34654 return; 34655 } 34656 DataType dt = 34657 Dt_imm6_4_Decode((instr >> 34658 19) & 34659 0x7, 34660 (instr >> 34661 28) & 34662 0x1); 34663 if (dt.Is( 34664 kDataTypeValueInvalid)) { 34665 UnallocatedT32(instr); 34666 return; 34667 } 34668 if (((instr >> 12) & 1) != 0) { 34669 UnallocatedT32(instr); 34670 return; 34671 } 34672 unsigned rd = 34673 ExtractQRegister(instr, 34674 22, 34675 12); 34676 unsigned rm = 34677 ExtractDRegister(instr, 5, 0); 34678 uint32_t imm6 = 34679 (instr >> 16) & 0x3f; 34680 uint32_t imm = 34681 imm6 - dt.GetSize(); 34682 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length) 34683 vshll(CurrentCond(), 34684 dt, 34685 QRegister(rd), 34686 DRegister(rm), 34687 imm); 34688 break; 34689 } 34690 case 0x00390000: { 34691 // 0xefb90a10 34692 if (((instr & 0x380000) == 0x0) || 34693 ((instr & 0x3f0000) == 34694 0x80000) || 34695 ((instr & 0x3f0000) == 34696 0x100000) || 34697 ((instr & 0x3f0000) == 34698 0x200000)) { 34699 UnallocatedT32(instr); 34700 return; 34701 } 34702 DataType dt = 34703 Dt_imm6_4_Decode((instr >> 34704 19) & 34705 0x7, 34706 (instr >> 34707 28) & 34708 0x1); 34709 if (dt.Is( 34710 kDataTypeValueInvalid)) { 34711 UnallocatedT32(instr); 34712 return; 34713 } 34714 if (((instr >> 12) & 1) != 0) { 34715 UnallocatedT32(instr); 34716 return; 34717 } 34718 unsigned rd = 34719 ExtractQRegister(instr, 34720 22, 34721 12); 34722 unsigned rm = 34723 ExtractDRegister(instr, 5, 0); 34724 uint32_t imm6 = 34725 (instr >> 16) & 0x3f; 34726 uint32_t imm = 34727 imm6 - dt.GetSize(); 34728 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length) 34729 vshll(CurrentCond(), 34730 dt, 34731 QRegister(rd), 34732 DRegister(rm), 34733 imm); 34734 break; 34735 } 34736 case 0x003a0000: { 34737 // 0xefba0a10 34738 if (((instr & 0x380000) == 0x0) || 34739 ((instr & 0x3f0000) == 34740 0x80000) || 34741 ((instr & 0x3f0000) == 34742 0x100000) || 34743 ((instr & 0x3f0000) == 34744 0x200000)) { 34745 UnallocatedT32(instr); 34746 return; 34747 } 34748 DataType dt = 34749 Dt_imm6_4_Decode((instr >> 34750 19) & 34751 0x7, 34752 (instr >> 34753 28) & 34754 0x1); 34755 if (dt.Is( 34756 kDataTypeValueInvalid)) { 34757 UnallocatedT32(instr); 34758 return; 34759 } 34760 if (((instr >> 12) & 1) != 0) { 34761 UnallocatedT32(instr); 34762 return; 34763 } 34764 unsigned rd = 34765 ExtractQRegister(instr, 34766 22, 34767 12); 34768 unsigned rm = 34769 ExtractDRegister(instr, 5, 0); 34770 uint32_t imm6 = 34771 (instr >> 16) & 0x3f; 34772 uint32_t imm = 34773 imm6 - dt.GetSize(); 34774 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length) 34775 vshll(CurrentCond(), 34776 dt, 34777 QRegister(rd), 34778 DRegister(rm), 34779 imm); 34780 break; 34781 } 34782 case 0x003b0000: { 34783 // 0xefbb0a10 34784 if (((instr & 0x380000) == 0x0) || 34785 ((instr & 0x3f0000) == 34786 0x80000) || 34787 ((instr & 0x3f0000) == 34788 0x100000) || 34789 ((instr & 0x3f0000) == 34790 0x200000)) { 34791 UnallocatedT32(instr); 34792 return; 34793 } 34794 DataType dt = 34795 Dt_imm6_4_Decode((instr >> 34796 19) & 34797 0x7, 34798 (instr >> 34799 28) & 34800 0x1); 34801 if (dt.Is( 34802 kDataTypeValueInvalid)) { 34803 UnallocatedT32(instr); 34804 return; 34805 } 34806 if (((instr >> 12) & 1) != 0) { 34807 UnallocatedT32(instr); 34808 return; 34809 } 34810 unsigned rd = 34811 ExtractQRegister(instr, 34812 22, 34813 12); 34814 unsigned rm = 34815 ExtractDRegister(instr, 5, 0); 34816 uint32_t imm6 = 34817 (instr >> 16) & 0x3f; 34818 uint32_t imm = 34819 imm6 - dt.GetSize(); 34820 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length) 34821 vshll(CurrentCond(), 34822 dt, 34823 QRegister(rd), 34824 DRegister(rm), 34825 imm); 34826 break; 34827 } 34828 case 0x003c0000: { 34829 // 0xefbc0a10 34830 if (((instr & 0x380000) == 0x0) || 34831 ((instr & 0x3f0000) == 34832 0x80000) || 34833 ((instr & 0x3f0000) == 34834 0x100000) || 34835 ((instr & 0x3f0000) == 34836 0x200000)) { 34837 UnallocatedT32(instr); 34838 return; 34839 } 34840 DataType dt = 34841 Dt_imm6_4_Decode((instr >> 34842 19) & 34843 0x7, 34844 (instr >> 34845 28) & 34846 0x1); 34847 if (dt.Is( 34848 kDataTypeValueInvalid)) { 34849 UnallocatedT32(instr); 34850 return; 34851 } 34852 if (((instr >> 12) & 1) != 0) { 34853 UnallocatedT32(instr); 34854 return; 34855 } 34856 unsigned rd = 34857 ExtractQRegister(instr, 34858 22, 34859 12); 34860 unsigned rm = 34861 ExtractDRegister(instr, 5, 0); 34862 uint32_t imm6 = 34863 (instr >> 16) & 0x3f; 34864 uint32_t imm = 34865 imm6 - dt.GetSize(); 34866 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length) 34867 vshll(CurrentCond(), 34868 dt, 34869 QRegister(rd), 34870 DRegister(rm), 34871 imm); 34872 break; 34873 } 34874 case 0x003d0000: { 34875 // 0xefbd0a10 34876 if (((instr & 0x380000) == 0x0) || 34877 ((instr & 0x3f0000) == 34878 0x80000) || 34879 ((instr & 0x3f0000) == 34880 0x100000) || 34881 ((instr & 0x3f0000) == 34882 0x200000)) { 34883 UnallocatedT32(instr); 34884 return; 34885 } 34886 DataType dt = 34887 Dt_imm6_4_Decode((instr >> 34888 19) & 34889 0x7, 34890 (instr >> 34891 28) & 34892 0x1); 34893 if (dt.Is( 34894 kDataTypeValueInvalid)) { 34895 UnallocatedT32(instr); 34896 return; 34897 } 34898 if (((instr >> 12) & 1) != 0) { 34899 UnallocatedT32(instr); 34900 return; 34901 } 34902 unsigned rd = 34903 ExtractQRegister(instr, 34904 22, 34905 12); 34906 unsigned rm = 34907 ExtractDRegister(instr, 5, 0); 34908 uint32_t imm6 = 34909 (instr >> 16) & 0x3f; 34910 uint32_t imm = 34911 imm6 - dt.GetSize(); 34912 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length) 34913 vshll(CurrentCond(), 34914 dt, 34915 QRegister(rd), 34916 DRegister(rm), 34917 imm); 34918 break; 34919 } 34920 case 0x003e0000: { 34921 // 0xefbe0a10 34922 if (((instr & 0x380000) == 0x0) || 34923 ((instr & 0x3f0000) == 34924 0x80000) || 34925 ((instr & 0x3f0000) == 34926 0x100000) || 34927 ((instr & 0x3f0000) == 34928 0x200000)) { 34929 UnallocatedT32(instr); 34930 return; 34931 } 34932 DataType dt = 34933 Dt_imm6_4_Decode((instr >> 34934 19) & 34935 0x7, 34936 (instr >> 34937 28) & 34938 0x1); 34939 if (dt.Is( 34940 kDataTypeValueInvalid)) { 34941 UnallocatedT32(instr); 34942 return; 34943 } 34944 if (((instr >> 12) & 1) != 0) { 34945 UnallocatedT32(instr); 34946 return; 34947 } 34948 unsigned rd = 34949 ExtractQRegister(instr, 34950 22, 34951 12); 34952 unsigned rm = 34953 ExtractDRegister(instr, 5, 0); 34954 uint32_t imm6 = 34955 (instr >> 16) & 0x3f; 34956 uint32_t imm = 34957 imm6 - dt.GetSize(); 34958 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length) 34959 vshll(CurrentCond(), 34960 dt, 34961 QRegister(rd), 34962 DRegister(rm), 34963 imm); 34964 break; 34965 } 34966 case 0x003f0000: { 34967 // 0xefbf0a10 34968 if (((instr & 0x380000) == 0x0) || 34969 ((instr & 0x3f0000) == 34970 0x80000) || 34971 ((instr & 0x3f0000) == 34972 0x100000) || 34973 ((instr & 0x3f0000) == 34974 0x200000)) { 34975 UnallocatedT32(instr); 34976 return; 34977 } 34978 DataType dt = 34979 Dt_imm6_4_Decode((instr >> 34980 19) & 34981 0x7, 34982 (instr >> 34983 28) & 34984 0x1); 34985 if (dt.Is( 34986 kDataTypeValueInvalid)) { 34987 UnallocatedT32(instr); 34988 return; 34989 } 34990 if (((instr >> 12) & 1) != 0) { 34991 UnallocatedT32(instr); 34992 return; 34993 } 34994 unsigned rd = 34995 ExtractQRegister(instr, 34996 22, 34997 12); 34998 unsigned rm = 34999 ExtractDRegister(instr, 5, 0); 35000 uint32_t imm6 = 35001 (instr >> 16) & 0x3f; 35002 uint32_t imm = 35003 imm6 - dt.GetSize(); 35004 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length) 35005 vshll(CurrentCond(), 35006 dt, 35007 QRegister(rd), 35008 DRegister(rm), 35009 imm); 35010 break; 35011 } 35012 default: 35013 UnallocatedT32(instr); 35014 break; 35015 } 35016 break; 35017 } 35018 default: { 35019 if (((instr & 0x380000) == 0x0) || 35020 ((instr & 0x3f0000) == 0x80000) || 35021 ((instr & 0x3f0000) == 35022 0x100000) || 35023 ((instr & 0x3f0000) == 35024 0x200000)) { 35025 UnallocatedT32(instr); 35026 return; 35027 } 35028 DataType dt = 35029 Dt_imm6_4_Decode((instr >> 19) & 35030 0x7, 35031 (instr >> 28) & 35032 0x1); 35033 if (dt.Is(kDataTypeValueInvalid)) { 35034 UnallocatedT32(instr); 35035 return; 35036 } 35037 if (((instr >> 12) & 1) != 0) { 35038 UnallocatedT32(instr); 35039 return; 35040 } 35041 unsigned rd = 35042 ExtractQRegister(instr, 22, 12); 35043 unsigned rm = 35044 ExtractDRegister(instr, 5, 0); 35045 uint32_t imm6 = (instr >> 16) & 0x3f; 35046 uint32_t imm = imm6 - dt.GetSize(); 35047 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; T1 NOLINT(whitespace/line_length) 35048 vshll(CurrentCond(), 35049 dt, 35050 QRegister(rd), 35051 DRegister(rm), 35052 imm); 35053 break; 35054 } 35055 } 35056 break; 35057 } 35058 default: 35059 UnallocatedT32(instr); 35060 break; 35061 } 35062 break; 35063 } 35064 } 35065 break; 35066 } 35067 default: 35068 UnallocatedT32(instr); 35069 break; 35070 } 35071 break; 35072 } 35073 case 0x00000c00: { 35074 // 0xef800c10 35075 switch (instr & 0x00000080) { 35076 case 0x00000000: { 35077 // 0xef800c10 35078 switch (instr & 0x00200000) { 35079 case 0x00000000: { 35080 // 0xef800c10 35081 switch (instr & 0x00180000) { 35082 case 0x00000000: { 35083 // 0xef800c10 35084 switch (instr & 0x00000300) { 35085 case 0x00000200: { 35086 // 0xef800e10 35087 if (((instr & 0x920) == 0x100) || 35088 ((instr & 0x520) == 0x100) || 35089 ((instr & 0x820) == 0x20) || 35090 ((instr & 0x420) == 0x20) || 35091 ((instr & 0x220) == 0x20) || 35092 ((instr & 0x120) == 0x120)) { 35093 UnallocatedT32(instr); 35094 return; 35095 } 35096 unsigned cmode = 35097 ((instr >> 8) & 0xf) | 35098 ((instr >> 1) & 0x10); 35099 DataType dt = 35100 ImmediateVmov::DecodeDt(cmode); 35101 if (dt.Is(kDataTypeValueInvalid)) { 35102 UnallocatedT32(instr); 35103 return; 35104 } 35105 unsigned rd = 35106 ExtractDRegister(instr, 22, 12); 35107 DOperand imm = 35108 ImmediateVmov::DecodeImmediate( 35109 cmode, 35110 (instr & 0xf) | 35111 ((instr >> 12) & 0x70) | 35112 ((instr >> 21) & 0x80)); 35113 // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length) 35114 vmov(CurrentCond(), 35115 dt, 35116 DRegister(rd), 35117 imm); 35118 break; 35119 } 35120 case 0x00000300: { 35121 // 0xef800f10 35122 if (((instr & 0x920) == 0x100) || 35123 ((instr & 0x520) == 0x100) || 35124 ((instr & 0x820) == 0x20) || 35125 ((instr & 0x420) == 0x20) || 35126 ((instr & 0x220) == 0x20) || 35127 ((instr & 0x120) == 0x120)) { 35128 UnallocatedT32(instr); 35129 return; 35130 } 35131 unsigned cmode = 35132 ((instr >> 8) & 0xf) | 35133 ((instr >> 1) & 0x10); 35134 DataType dt = 35135 ImmediateVmov::DecodeDt(cmode); 35136 if (dt.Is(kDataTypeValueInvalid)) { 35137 UnallocatedT32(instr); 35138 return; 35139 } 35140 unsigned rd = 35141 ExtractDRegister(instr, 22, 12); 35142 DOperand imm = 35143 ImmediateVmov::DecodeImmediate( 35144 cmode, 35145 (instr & 0xf) | 35146 ((instr >> 12) & 0x70) | 35147 ((instr >> 21) & 0x80)); 35148 // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length) 35149 vmov(CurrentCond(), 35150 dt, 35151 DRegister(rd), 35152 imm); 35153 break; 35154 } 35155 default: { 35156 switch (instr & 0x00000020) { 35157 case 0x00000020: { 35158 // 0xef800c30 35159 switch (instr & 0x00000f20) { 35160 case 0x00000000: { 35161 // 0xef800c10 35162 if (((instr & 0x920) == 35163 0x100) || 35164 ((instr & 0x520) == 35165 0x100) || 35166 ((instr & 0x820) == 35167 0x20) || 35168 ((instr & 0x420) == 35169 0x20) || 35170 ((instr & 0x220) == 35171 0x20) || 35172 ((instr & 0x120) == 35173 0x120)) { 35174 UnallocatedT32(instr); 35175 return; 35176 } 35177 unsigned cmode = 35178 ((instr >> 8) & 0xf) | 35179 ((instr >> 1) & 0x10); 35180 DataType dt = 35181 ImmediateVmov::DecodeDt( 35182 cmode); 35183 if (dt.Is( 35184 kDataTypeValueInvalid)) { 35185 UnallocatedT32(instr); 35186 return; 35187 } 35188 unsigned rd = 35189 ExtractDRegister(instr, 35190 22, 35191 12); 35192 DOperand imm = ImmediateVmov:: 35193 DecodeImmediate( 35194 cmode, 35195 (instr & 0xf) | 35196 ((instr >> 12) & 35197 0x70) | 35198 ((instr >> 21) & 35199 0x80)); 35200 // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length) 35201 vmov(CurrentCond(), 35202 dt, 35203 DRegister(rd), 35204 imm); 35205 break; 35206 } 35207 case 0x00000020: { 35208 // 0xef800c30 35209 if (((instr & 0xd00) == 35210 0x100) || 35211 ((instr & 0xd00) == 35212 0x500) || 35213 ((instr & 0xd00) == 35214 0x900) || 35215 ((instr & 0xe00) == 35216 0xe00)) { 35217 UnallocatedT32(instr); 35218 return; 35219 } 35220 unsigned cmode = 35221 (instr >> 8) & 0xf; 35222 DataType dt = 35223 ImmediateVmvn::DecodeDt( 35224 cmode); 35225 if (dt.Is( 35226 kDataTypeValueInvalid)) { 35227 UnallocatedT32(instr); 35228 return; 35229 } 35230 unsigned rd = 35231 ExtractDRegister(instr, 35232 22, 35233 12); 35234 DOperand imm = ImmediateVmvn:: 35235 DecodeImmediate( 35236 cmode, 35237 (instr & 0xf) | 35238 ((instr >> 12) & 35239 0x70) | 35240 ((instr >> 21) & 35241 0x80)); 35242 // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length) 35243 vmvn(CurrentCond(), 35244 dt, 35245 DRegister(rd), 35246 imm); 35247 break; 35248 } 35249 case 0x00000200: { 35250 // 0xef800e10 35251 if (((instr & 0x920) == 35252 0x100) || 35253 ((instr & 0x520) == 35254 0x100) || 35255 ((instr & 0x820) == 35256 0x20) || 35257 ((instr & 0x420) == 35258 0x20) || 35259 ((instr & 0x220) == 35260 0x20) || 35261 ((instr & 0x120) == 35262 0x120)) { 35263 UnallocatedT32(instr); 35264 return; 35265 } 35266 unsigned cmode = 35267 ((instr >> 8) & 0xf) | 35268 ((instr >> 1) & 0x10); 35269 DataType dt = 35270 ImmediateVmov::DecodeDt( 35271 cmode); 35272 if (dt.Is( 35273 kDataTypeValueInvalid)) { 35274 UnallocatedT32(instr); 35275 return; 35276 } 35277 unsigned rd = 35278 ExtractDRegister(instr, 35279 22, 35280 12); 35281 DOperand imm = ImmediateVmov:: 35282 DecodeImmediate( 35283 cmode, 35284 (instr & 0xf) | 35285 ((instr >> 12) & 35286 0x70) | 35287 ((instr >> 21) & 35288 0x80)); 35289 // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length) 35290 vmov(CurrentCond(), 35291 dt, 35292 DRegister(rd), 35293 imm); 35294 break; 35295 } 35296 case 0x00000220: { 35297 // 0xef800e30 35298 if (((instr & 0xd00) == 35299 0x100) || 35300 ((instr & 0xd00) == 35301 0x500) || 35302 ((instr & 0xd00) == 35303 0x900) || 35304 ((instr & 0xe00) == 35305 0xe00)) { 35306 UnallocatedT32(instr); 35307 return; 35308 } 35309 unsigned cmode = 35310 (instr >> 8) & 0xf; 35311 DataType dt = 35312 ImmediateVmvn::DecodeDt( 35313 cmode); 35314 if (dt.Is( 35315 kDataTypeValueInvalid)) { 35316 UnallocatedT32(instr); 35317 return; 35318 } 35319 unsigned rd = 35320 ExtractDRegister(instr, 35321 22, 35322 12); 35323 DOperand imm = ImmediateVmvn:: 35324 DecodeImmediate( 35325 cmode, 35326 (instr & 0xf) | 35327 ((instr >> 12) & 35328 0x70) | 35329 ((instr >> 21) & 35330 0x80)); 35331 // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length) 35332 vmvn(CurrentCond(), 35333 dt, 35334 DRegister(rd), 35335 imm); 35336 break; 35337 } 35338 case 0x00000400: { 35339 // 0xef800c10 35340 if (((instr & 0x920) == 35341 0x100) || 35342 ((instr & 0x520) == 35343 0x100) || 35344 ((instr & 0x820) == 35345 0x20) || 35346 ((instr & 0x420) == 35347 0x20) || 35348 ((instr & 0x220) == 35349 0x20) || 35350 ((instr & 0x120) == 35351 0x120)) { 35352 UnallocatedT32(instr); 35353 return; 35354 } 35355 unsigned cmode = 35356 ((instr >> 8) & 0xf) | 35357 ((instr >> 1) & 0x10); 35358 DataType dt = 35359 ImmediateVmov::DecodeDt( 35360 cmode); 35361 if (dt.Is( 35362 kDataTypeValueInvalid)) { 35363 UnallocatedT32(instr); 35364 return; 35365 } 35366 unsigned rd = 35367 ExtractDRegister(instr, 35368 22, 35369 12); 35370 DOperand imm = ImmediateVmov:: 35371 DecodeImmediate( 35372 cmode, 35373 (instr & 0xf) | 35374 ((instr >> 12) & 35375 0x70) | 35376 ((instr >> 21) & 35377 0x80)); 35378 // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length) 35379 vmov(CurrentCond(), 35380 dt, 35381 DRegister(rd), 35382 imm); 35383 break; 35384 } 35385 case 0x00000420: { 35386 // 0xef800c30 35387 if (((instr & 0xd00) == 35388 0x100) || 35389 ((instr & 0xd00) == 35390 0x500) || 35391 ((instr & 0xd00) == 35392 0x900) || 35393 ((instr & 0xe00) == 35394 0xe00)) { 35395 UnallocatedT32(instr); 35396 return; 35397 } 35398 unsigned cmode = 35399 (instr >> 8) & 0xf; 35400 DataType dt = 35401 ImmediateVmvn::DecodeDt( 35402 cmode); 35403 if (dt.Is( 35404 kDataTypeValueInvalid)) { 35405 UnallocatedT32(instr); 35406 return; 35407 } 35408 unsigned rd = 35409 ExtractDRegister(instr, 35410 22, 35411 12); 35412 DOperand imm = ImmediateVmvn:: 35413 DecodeImmediate( 35414 cmode, 35415 (instr & 0xf) | 35416 ((instr >> 12) & 35417 0x70) | 35418 ((instr >> 21) & 35419 0x80)); 35420 // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length) 35421 vmvn(CurrentCond(), 35422 dt, 35423 DRegister(rd), 35424 imm); 35425 break; 35426 } 35427 case 0x00000600: { 35428 // 0xef800e10 35429 if (((instr & 0x920) == 35430 0x100) || 35431 ((instr & 0x520) == 35432 0x100) || 35433 ((instr & 0x820) == 35434 0x20) || 35435 ((instr & 0x420) == 35436 0x20) || 35437 ((instr & 0x220) == 35438 0x20) || 35439 ((instr & 0x120) == 35440 0x120)) { 35441 UnallocatedT32(instr); 35442 return; 35443 } 35444 unsigned cmode = 35445 ((instr >> 8) & 0xf) | 35446 ((instr >> 1) & 0x10); 35447 DataType dt = 35448 ImmediateVmov::DecodeDt( 35449 cmode); 35450 if (dt.Is( 35451 kDataTypeValueInvalid)) { 35452 UnallocatedT32(instr); 35453 return; 35454 } 35455 unsigned rd = 35456 ExtractDRegister(instr, 35457 22, 35458 12); 35459 DOperand imm = ImmediateVmov:: 35460 DecodeImmediate( 35461 cmode, 35462 (instr & 0xf) | 35463 ((instr >> 12) & 35464 0x70) | 35465 ((instr >> 21) & 35466 0x80)); 35467 // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length) 35468 vmov(CurrentCond(), 35469 dt, 35470 DRegister(rd), 35471 imm); 35472 break; 35473 } 35474 case 0x00000620: { 35475 // 0xef800e30 35476 if (((instr & 0xd00) == 35477 0x100) || 35478 ((instr & 0xd00) == 35479 0x500) || 35480 ((instr & 0xd00) == 35481 0x900) || 35482 ((instr & 0xe00) == 35483 0xe00)) { 35484 UnallocatedT32(instr); 35485 return; 35486 } 35487 unsigned cmode = 35488 (instr >> 8) & 0xf; 35489 DataType dt = 35490 ImmediateVmvn::DecodeDt( 35491 cmode); 35492 if (dt.Is( 35493 kDataTypeValueInvalid)) { 35494 UnallocatedT32(instr); 35495 return; 35496 } 35497 unsigned rd = 35498 ExtractDRegister(instr, 35499 22, 35500 12); 35501 DOperand imm = ImmediateVmvn:: 35502 DecodeImmediate( 35503 cmode, 35504 (instr & 0xf) | 35505 ((instr >> 12) & 35506 0x70) | 35507 ((instr >> 21) & 35508 0x80)); 35509 // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length) 35510 vmvn(CurrentCond(), 35511 dt, 35512 DRegister(rd), 35513 imm); 35514 break; 35515 } 35516 case 0x00000800: { 35517 // 0xef800c10 35518 if (((instr & 0x920) == 35519 0x100) || 35520 ((instr & 0x520) == 35521 0x100) || 35522 ((instr & 0x820) == 35523 0x20) || 35524 ((instr & 0x420) == 35525 0x20) || 35526 ((instr & 0x220) == 35527 0x20) || 35528 ((instr & 0x120) == 35529 0x120)) { 35530 UnallocatedT32(instr); 35531 return; 35532 } 35533 unsigned cmode = 35534 ((instr >> 8) & 0xf) | 35535 ((instr >> 1) & 0x10); 35536 DataType dt = 35537 ImmediateVmov::DecodeDt( 35538 cmode); 35539 if (dt.Is( 35540 kDataTypeValueInvalid)) { 35541 UnallocatedT32(instr); 35542 return; 35543 } 35544 unsigned rd = 35545 ExtractDRegister(instr, 35546 22, 35547 12); 35548 DOperand imm = ImmediateVmov:: 35549 DecodeImmediate( 35550 cmode, 35551 (instr & 0xf) | 35552 ((instr >> 12) & 35553 0x70) | 35554 ((instr >> 21) & 35555 0x80)); 35556 // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length) 35557 vmov(CurrentCond(), 35558 dt, 35559 DRegister(rd), 35560 imm); 35561 break; 35562 } 35563 case 0x00000820: { 35564 // 0xef800c30 35565 if (((instr & 0xd00) == 35566 0x100) || 35567 ((instr & 0xd00) == 35568 0x500) || 35569 ((instr & 0xd00) == 35570 0x900) || 35571 ((instr & 0xe00) == 35572 0xe00)) { 35573 UnallocatedT32(instr); 35574 return; 35575 } 35576 unsigned cmode = 35577 (instr >> 8) & 0xf; 35578 DataType dt = 35579 ImmediateVmvn::DecodeDt( 35580 cmode); 35581 if (dt.Is( 35582 kDataTypeValueInvalid)) { 35583 UnallocatedT32(instr); 35584 return; 35585 } 35586 unsigned rd = 35587 ExtractDRegister(instr, 35588 22, 35589 12); 35590 DOperand imm = ImmediateVmvn:: 35591 DecodeImmediate( 35592 cmode, 35593 (instr & 0xf) | 35594 ((instr >> 12) & 35595 0x70) | 35596 ((instr >> 21) & 35597 0x80)); 35598 // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length) 35599 vmvn(CurrentCond(), 35600 dt, 35601 DRegister(rd), 35602 imm); 35603 break; 35604 } 35605 case 0x00000a00: { 35606 // 0xef800e10 35607 if (((instr & 0x920) == 35608 0x100) || 35609 ((instr & 0x520) == 35610 0x100) || 35611 ((instr & 0x820) == 35612 0x20) || 35613 ((instr & 0x420) == 35614 0x20) || 35615 ((instr & 0x220) == 35616 0x20) || 35617 ((instr & 0x120) == 35618 0x120)) { 35619 UnallocatedT32(instr); 35620 return; 35621 } 35622 unsigned cmode = 35623 ((instr >> 8) & 0xf) | 35624 ((instr >> 1) & 0x10); 35625 DataType dt = 35626 ImmediateVmov::DecodeDt( 35627 cmode); 35628 if (dt.Is( 35629 kDataTypeValueInvalid)) { 35630 UnallocatedT32(instr); 35631 return; 35632 } 35633 unsigned rd = 35634 ExtractDRegister(instr, 35635 22, 35636 12); 35637 DOperand imm = ImmediateVmov:: 35638 DecodeImmediate( 35639 cmode, 35640 (instr & 0xf) | 35641 ((instr >> 12) & 35642 0x70) | 35643 ((instr >> 21) & 35644 0x80)); 35645 // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length) 35646 vmov(CurrentCond(), 35647 dt, 35648 DRegister(rd), 35649 imm); 35650 break; 35651 } 35652 case 0x00000a20: { 35653 // 0xef800e30 35654 if (((instr & 0xd00) == 35655 0x100) || 35656 ((instr & 0xd00) == 35657 0x500) || 35658 ((instr & 0xd00) == 35659 0x900) || 35660 ((instr & 0xe00) == 35661 0xe00)) { 35662 UnallocatedT32(instr); 35663 return; 35664 } 35665 unsigned cmode = 35666 (instr >> 8) & 0xf; 35667 DataType dt = 35668 ImmediateVmvn::DecodeDt( 35669 cmode); 35670 if (dt.Is( 35671 kDataTypeValueInvalid)) { 35672 UnallocatedT32(instr); 35673 return; 35674 } 35675 unsigned rd = 35676 ExtractDRegister(instr, 35677 22, 35678 12); 35679 DOperand imm = ImmediateVmvn:: 35680 DecodeImmediate( 35681 cmode, 35682 (instr & 0xf) | 35683 ((instr >> 12) & 35684 0x70) | 35685 ((instr >> 21) & 35686 0x80)); 35687 // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length) 35688 vmvn(CurrentCond(), 35689 dt, 35690 DRegister(rd), 35691 imm); 35692 break; 35693 } 35694 case 0x00000c00: { 35695 // 0xef800c10 35696 if (((instr & 0x920) == 35697 0x100) || 35698 ((instr & 0x520) == 35699 0x100) || 35700 ((instr & 0x820) == 35701 0x20) || 35702 ((instr & 0x420) == 35703 0x20) || 35704 ((instr & 0x220) == 35705 0x20) || 35706 ((instr & 0x120) == 35707 0x120)) { 35708 UnallocatedT32(instr); 35709 return; 35710 } 35711 unsigned cmode = 35712 ((instr >> 8) & 0xf) | 35713 ((instr >> 1) & 0x10); 35714 DataType dt = 35715 ImmediateVmov::DecodeDt( 35716 cmode); 35717 if (dt.Is( 35718 kDataTypeValueInvalid)) { 35719 UnallocatedT32(instr); 35720 return; 35721 } 35722 unsigned rd = 35723 ExtractDRegister(instr, 35724 22, 35725 12); 35726 DOperand imm = ImmediateVmov:: 35727 DecodeImmediate( 35728 cmode, 35729 (instr & 0xf) | 35730 ((instr >> 12) & 35731 0x70) | 35732 ((instr >> 21) & 35733 0x80)); 35734 // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length) 35735 vmov(CurrentCond(), 35736 dt, 35737 DRegister(rd), 35738 imm); 35739 break; 35740 } 35741 case 0x00000c20: { 35742 // 0xef800c30 35743 if (((instr & 0xd00) == 35744 0x100) || 35745 ((instr & 0xd00) == 35746 0x500) || 35747 ((instr & 0xd00) == 35748 0x900) || 35749 ((instr & 0xe00) == 35750 0xe00)) { 35751 UnallocatedT32(instr); 35752 return; 35753 } 35754 unsigned cmode = 35755 (instr >> 8) & 0xf; 35756 DataType dt = 35757 ImmediateVmvn::DecodeDt( 35758 cmode); 35759 if (dt.Is( 35760 kDataTypeValueInvalid)) { 35761 UnallocatedT32(instr); 35762 return; 35763 } 35764 unsigned rd = 35765 ExtractDRegister(instr, 35766 22, 35767 12); 35768 DOperand imm = ImmediateVmvn:: 35769 DecodeImmediate( 35770 cmode, 35771 (instr & 0xf) | 35772 ((instr >> 12) & 35773 0x70) | 35774 ((instr >> 21) & 35775 0x80)); 35776 // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length) 35777 vmvn(CurrentCond(), 35778 dt, 35779 DRegister(rd), 35780 imm); 35781 break; 35782 } 35783 case 0x00000d00: { 35784 // 0xef800d10 35785 if (((instr & 0x920) == 35786 0x100) || 35787 ((instr & 0x520) == 35788 0x100) || 35789 ((instr & 0x820) == 35790 0x20) || 35791 ((instr & 0x420) == 35792 0x20) || 35793 ((instr & 0x220) == 35794 0x20) || 35795 ((instr & 0x120) == 35796 0x120)) { 35797 UnallocatedT32(instr); 35798 return; 35799 } 35800 unsigned cmode = 35801 ((instr >> 8) & 0xf) | 35802 ((instr >> 1) & 0x10); 35803 DataType dt = 35804 ImmediateVmov::DecodeDt( 35805 cmode); 35806 if (dt.Is( 35807 kDataTypeValueInvalid)) { 35808 UnallocatedT32(instr); 35809 return; 35810 } 35811 unsigned rd = 35812 ExtractDRegister(instr, 35813 22, 35814 12); 35815 DOperand imm = ImmediateVmov:: 35816 DecodeImmediate( 35817 cmode, 35818 (instr & 0xf) | 35819 ((instr >> 12) & 35820 0x70) | 35821 ((instr >> 21) & 35822 0x80)); 35823 // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length) 35824 vmov(CurrentCond(), 35825 dt, 35826 DRegister(rd), 35827 imm); 35828 break; 35829 } 35830 case 0x00000d20: { 35831 // 0xef800d30 35832 if (((instr & 0xd00) == 35833 0x100) || 35834 ((instr & 0xd00) == 35835 0x500) || 35836 ((instr & 0xd00) == 35837 0x900) || 35838 ((instr & 0xe00) == 35839 0xe00)) { 35840 UnallocatedT32(instr); 35841 return; 35842 } 35843 unsigned cmode = 35844 (instr >> 8) & 0xf; 35845 DataType dt = 35846 ImmediateVmvn::DecodeDt( 35847 cmode); 35848 if (dt.Is( 35849 kDataTypeValueInvalid)) { 35850 UnallocatedT32(instr); 35851 return; 35852 } 35853 unsigned rd = 35854 ExtractDRegister(instr, 35855 22, 35856 12); 35857 DOperand imm = ImmediateVmvn:: 35858 DecodeImmediate( 35859 cmode, 35860 (instr & 0xf) | 35861 ((instr >> 12) & 35862 0x70) | 35863 ((instr >> 21) & 35864 0x80)); 35865 // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length) 35866 vmvn(CurrentCond(), 35867 dt, 35868 DRegister(rd), 35869 imm); 35870 break; 35871 } 35872 case 0x00000e00: { 35873 // 0xef800e10 35874 if (((instr & 0x920) == 35875 0x100) || 35876 ((instr & 0x520) == 35877 0x100) || 35878 ((instr & 0x820) == 35879 0x20) || 35880 ((instr & 0x420) == 35881 0x20) || 35882 ((instr & 0x220) == 35883 0x20) || 35884 ((instr & 0x120) == 35885 0x120)) { 35886 UnallocatedT32(instr); 35887 return; 35888 } 35889 unsigned cmode = 35890 ((instr >> 8) & 0xf) | 35891 ((instr >> 1) & 0x10); 35892 DataType dt = 35893 ImmediateVmov::DecodeDt( 35894 cmode); 35895 if (dt.Is( 35896 kDataTypeValueInvalid)) { 35897 UnallocatedT32(instr); 35898 return; 35899 } 35900 unsigned rd = 35901 ExtractDRegister(instr, 35902 22, 35903 12); 35904 DOperand imm = ImmediateVmov:: 35905 DecodeImmediate( 35906 cmode, 35907 (instr & 0xf) | 35908 ((instr >> 12) & 35909 0x70) | 35910 ((instr >> 21) & 35911 0x80)); 35912 // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length) 35913 vmov(CurrentCond(), 35914 dt, 35915 DRegister(rd), 35916 imm); 35917 break; 35918 } 35919 case 0x00000e20: { 35920 // 0xef800e30 35921 if (((instr & 0x920) == 35922 0x100) || 35923 ((instr & 0x520) == 35924 0x100) || 35925 ((instr & 0x820) == 35926 0x20) || 35927 ((instr & 0x420) == 35928 0x20) || 35929 ((instr & 0x220) == 35930 0x20) || 35931 ((instr & 0x120) == 35932 0x120)) { 35933 UnallocatedT32(instr); 35934 return; 35935 } 35936 unsigned cmode = 35937 ((instr >> 8) & 0xf) | 35938 ((instr >> 1) & 0x10); 35939 DataType dt = 35940 ImmediateVmov::DecodeDt( 35941 cmode); 35942 if (dt.Is( 35943 kDataTypeValueInvalid)) { 35944 UnallocatedT32(instr); 35945 return; 35946 } 35947 unsigned rd = 35948 ExtractDRegister(instr, 35949 22, 35950 12); 35951 DOperand imm = ImmediateVmov:: 35952 DecodeImmediate( 35953 cmode, 35954 (instr & 0xf) | 35955 ((instr >> 12) & 35956 0x70) | 35957 ((instr >> 21) & 35958 0x80)); 35959 // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length) 35960 vmov(CurrentCond(), 35961 dt, 35962 DRegister(rd), 35963 imm); 35964 break; 35965 } 35966 case 0x00000f00: { 35967 // 0xef800f10 35968 if (((instr & 0x920) == 35969 0x100) || 35970 ((instr & 0x520) == 35971 0x100) || 35972 ((instr & 0x820) == 35973 0x20) || 35974 ((instr & 0x420) == 35975 0x20) || 35976 ((instr & 0x220) == 35977 0x20) || 35978 ((instr & 0x120) == 35979 0x120)) { 35980 UnallocatedT32(instr); 35981 return; 35982 } 35983 unsigned cmode = 35984 ((instr >> 8) & 0xf) | 35985 ((instr >> 1) & 0x10); 35986 DataType dt = 35987 ImmediateVmov::DecodeDt( 35988 cmode); 35989 if (dt.Is( 35990 kDataTypeValueInvalid)) { 35991 UnallocatedT32(instr); 35992 return; 35993 } 35994 unsigned rd = 35995 ExtractDRegister(instr, 35996 22, 35997 12); 35998 DOperand imm = ImmediateVmov:: 35999 DecodeImmediate( 36000 cmode, 36001 (instr & 0xf) | 36002 ((instr >> 12) & 36003 0x70) | 36004 ((instr >> 21) & 36005 0x80)); 36006 // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length) 36007 vmov(CurrentCond(), 36008 dt, 36009 DRegister(rd), 36010 imm); 36011 break; 36012 } 36013 default: 36014 UnallocatedT32(instr); 36015 break; 36016 } 36017 break; 36018 } 36019 default: { 36020 if (((instr & 0x920) == 0x100) || 36021 ((instr & 0x520) == 0x100) || 36022 ((instr & 0x820) == 0x20) || 36023 ((instr & 0x420) == 0x20) || 36024 ((instr & 0x220) == 0x20) || 36025 ((instr & 0x120) == 0x120)) { 36026 UnallocatedT32(instr); 36027 return; 36028 } 36029 unsigned cmode = 36030 ((instr >> 8) & 0xf) | 36031 ((instr >> 1) & 0x10); 36032 DataType dt = 36033 ImmediateVmov::DecodeDt( 36034 cmode); 36035 if (dt.Is( 36036 kDataTypeValueInvalid)) { 36037 UnallocatedT32(instr); 36038 return; 36039 } 36040 unsigned rd = 36041 ExtractDRegister(instr, 36042 22, 36043 12); 36044 DOperand imm = ImmediateVmov:: 36045 DecodeImmediate(cmode, 36046 (instr & 36047 0xf) | 36048 ((instr >> 36049 12) & 36050 0x70) | 36051 ((instr >> 36052 21) & 36053 0x80)); 36054 // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; T1 NOLINT(whitespace/line_length) 36055 vmov(CurrentCond(), 36056 dt, 36057 DRegister(rd), 36058 imm); 36059 break; 36060 } 36061 } 36062 break; 36063 } 36064 } 36065 break; 36066 } 36067 default: 36068 UnallocatedT32(instr); 36069 break; 36070 } 36071 break; 36072 } 36073 default: { 36074 if ((instr & 0x00000200) == 0x00000200) { 36075 if (((instr & 0x200000) == 0x0)) { 36076 UnallocatedT32(instr); 36077 return; 36078 } 36079 DataType dt1 = Dt_op_U_1_Decode1( 36080 ((instr >> 28) & 0x1) | 36081 ((instr >> 7) & 0x2)); 36082 if (dt1.Is(kDataTypeValueInvalid)) { 36083 UnallocatedT32(instr); 36084 return; 36085 } 36086 DataType dt2 = Dt_op_U_1_Decode2( 36087 ((instr >> 28) & 0x1) | 36088 ((instr >> 7) & 0x2)); 36089 if (dt2.Is(kDataTypeValueInvalid)) { 36090 UnallocatedT32(instr); 36091 return; 36092 } 36093 unsigned rd = 36094 ExtractDRegister(instr, 22, 12); 36095 unsigned rm = ExtractDRegister(instr, 5, 0); 36096 uint32_t fbits = 36097 64 - ((instr >> 16) & 0x3f); 36098 // VCVT{<c>}{<q>}.<dt>.<dt> <Dd>, <Dm>, #<fbits> ; T1 NOLINT(whitespace/line_length) 36099 vcvt(CurrentCond(), 36100 dt1, 36101 dt2, 36102 DRegister(rd), 36103 DRegister(rm), 36104 fbits); 36105 } else { 36106 UnallocatedT32(instr); 36107 } 36108 break; 36109 } 36110 } 36111 break; 36112 } 36113 default: 36114 UnallocatedT32(instr); 36115 break; 36116 } 36117 break; 36118 } 36119 } 36120 break; 36121 } 36122 case 0x00800040: { 36123 // 0xef800050 36124 switch (instr & 0x00000c00) { 36125 case 0x00000000: { 36126 // 0xef800050 36127 switch (instr & 0x00380080) { 36128 case 0x00000000: { 36129 // 0xef800050 36130 switch (instr & 0x00000100) { 36131 case 0x00000000: { 36132 // 0xef800050 36133 switch (instr & 0x00000200) { 36134 default: { 36135 switch (instr & 0x00000020) { 36136 case 0x00000020: { 36137 // 0xef800070 36138 if (((instr & 0xd00) == 0x100) || 36139 ((instr & 0xd00) == 0x500) || 36140 ((instr & 0xd00) == 0x900) || 36141 ((instr & 0xe00) == 0xe00)) { 36142 UnallocatedT32(instr); 36143 return; 36144 } 36145 unsigned cmode = (instr >> 8) & 0xf; 36146 DataType dt = 36147 ImmediateVmvn::DecodeDt(cmode); 36148 if (dt.Is(kDataTypeValueInvalid)) { 36149 UnallocatedT32(instr); 36150 return; 36151 } 36152 if (((instr >> 12) & 1) != 0) { 36153 UnallocatedT32(instr); 36154 return; 36155 } 36156 unsigned rd = 36157 ExtractQRegister(instr, 22, 12); 36158 QOperand imm = 36159 ImmediateVmvn::DecodeImmediate( 36160 cmode, 36161 (instr & 0xf) | 36162 ((instr >> 12) & 0x70) | 36163 ((instr >> 21) & 0x80)); 36164 // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length) 36165 vmvn(CurrentCond(), 36166 dt, 36167 QRegister(rd), 36168 imm); 36169 break; 36170 } 36171 default: { 36172 if (((instr & 0x920) == 0x100) || 36173 ((instr & 0x520) == 0x100) || 36174 ((instr & 0x820) == 0x20) || 36175 ((instr & 0x420) == 0x20) || 36176 ((instr & 0x220) == 0x20) || 36177 ((instr & 0x120) == 0x120)) { 36178 UnallocatedT32(instr); 36179 return; 36180 } 36181 unsigned cmode = 36182 ((instr >> 8) & 0xf) | 36183 ((instr >> 1) & 0x10); 36184 DataType dt = 36185 ImmediateVmov::DecodeDt(cmode); 36186 if (dt.Is(kDataTypeValueInvalid)) { 36187 UnallocatedT32(instr); 36188 return; 36189 } 36190 if (((instr >> 12) & 1) != 0) { 36191 UnallocatedT32(instr); 36192 return; 36193 } 36194 unsigned rd = 36195 ExtractQRegister(instr, 22, 12); 36196 QOperand imm = 36197 ImmediateVmov::DecodeImmediate( 36198 cmode, 36199 (instr & 0xf) | 36200 ((instr >> 12) & 0x70) | 36201 ((instr >> 21) & 0x80)); 36202 // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length) 36203 vmov(CurrentCond(), 36204 dt, 36205 QRegister(rd), 36206 imm); 36207 break; 36208 } 36209 } 36210 break; 36211 } 36212 } 36213 break; 36214 } 36215 case 0x00000100: { 36216 // 0xef800150 36217 switch (instr & 0x00000020) { 36218 case 0x00000000: { 36219 // 0xef800150 36220 if (((instr & 0x100) == 0x0) || 36221 ((instr & 0xc00) == 0xc00)) { 36222 UnallocatedT32(instr); 36223 return; 36224 } 36225 unsigned cmode = (instr >> 8) & 0xf; 36226 DataType dt = 36227 ImmediateVorr::DecodeDt(cmode); 36228 if (dt.Is(kDataTypeValueInvalid)) { 36229 UnallocatedT32(instr); 36230 return; 36231 } 36232 if (((instr >> 12) & 1) != 0) { 36233 UnallocatedT32(instr); 36234 return; 36235 } 36236 unsigned rd = 36237 ExtractQRegister(instr, 22, 12); 36238 QOperand imm = 36239 ImmediateVorr::DecodeImmediate( 36240 cmode, 36241 (instr & 0xf) | 36242 ((instr >> 12) & 0x70) | 36243 ((instr >> 21) & 0x80)); 36244 // VORR{<c>}{<q>}.<dt> {<Qdn>}, <Qdn>, #<imm> ; T1 NOLINT(whitespace/line_length) 36245 vorr(CurrentCond(), 36246 dt, 36247 QRegister(rd), 36248 QRegister(rd), 36249 imm); 36250 break; 36251 } 36252 case 0x00000020: { 36253 // 0xef800170 36254 if (((instr & 0x100) == 0x0) || 36255 ((instr & 0xc00) == 0xc00)) { 36256 UnallocatedT32(instr); 36257 return; 36258 } 36259 unsigned cmode = (instr >> 8) & 0xf; 36260 DataType dt = 36261 ImmediateVbic::DecodeDt(cmode); 36262 if (dt.Is(kDataTypeValueInvalid)) { 36263 UnallocatedT32(instr); 36264 return; 36265 } 36266 if (((instr >> 12) & 1) != 0) { 36267 UnallocatedT32(instr); 36268 return; 36269 } 36270 unsigned rd = 36271 ExtractQRegister(instr, 22, 12); 36272 QOperand imm = 36273 ImmediateVbic::DecodeImmediate( 36274 cmode, 36275 (instr & 0xf) | 36276 ((instr >> 12) & 0x70) | 36277 ((instr >> 21) & 0x80)); 36278 // VBIC{<c>}{<q>}.<dt> {<Qdn>}, <Qdn>, #<imm> ; T1 NOLINT(whitespace/line_length) 36279 vbic(CurrentCond(), 36280 dt, 36281 QRegister(rd), 36282 QRegister(rd), 36283 imm); 36284 break; 36285 } 36286 } 36287 break; 36288 } 36289 } 36290 break; 36291 } 36292 default: { 36293 switch (instr & 0x00000300) { 36294 case 0x00000000: { 36295 // 0xef800050 36296 if (((instr & 0x380080) == 0x0)) { 36297 UnallocatedT32(instr); 36298 return; 36299 } 36300 DataType dt = 36301 Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) | 36302 ((instr >> 4) & 36303 0x8), 36304 (instr >> 28) & 0x1); 36305 if (dt.Is(kDataTypeValueInvalid)) { 36306 UnallocatedT32(instr); 36307 return; 36308 } 36309 if (((instr >> 12) & 1) != 0) { 36310 UnallocatedT32(instr); 36311 return; 36312 } 36313 unsigned rd = ExtractQRegister(instr, 22, 12); 36314 if ((instr & 1) != 0) { 36315 UnallocatedT32(instr); 36316 return; 36317 } 36318 unsigned rm = ExtractQRegister(instr, 5, 0); 36319 uint32_t imm6 = (instr >> 16) & 0x3f; 36320 uint32_t imm = 36321 (dt.IsSize(64) ? 64 36322 : (dt.GetSize() * 2)) - 36323 imm6; 36324 // VSHR{<c>}{<q>}.<type><size> {<Qd>}, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length) 36325 vshr(CurrentCond(), 36326 dt, 36327 QRegister(rd), 36328 QRegister(rm), 36329 imm); 36330 break; 36331 } 36332 case 0x00000100: { 36333 // 0xef800150 36334 if (((instr & 0x380080) == 0x0)) { 36335 UnallocatedT32(instr); 36336 return; 36337 } 36338 DataType dt = 36339 Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) | 36340 ((instr >> 4) & 36341 0x8), 36342 (instr >> 28) & 0x1); 36343 if (dt.Is(kDataTypeValueInvalid)) { 36344 UnallocatedT32(instr); 36345 return; 36346 } 36347 if (((instr >> 12) & 1) != 0) { 36348 UnallocatedT32(instr); 36349 return; 36350 } 36351 unsigned rd = ExtractQRegister(instr, 22, 12); 36352 if ((instr & 1) != 0) { 36353 UnallocatedT32(instr); 36354 return; 36355 } 36356 unsigned rm = ExtractQRegister(instr, 5, 0); 36357 uint32_t imm6 = (instr >> 16) & 0x3f; 36358 uint32_t imm = 36359 (dt.IsSize(64) ? 64 36360 : (dt.GetSize() * 2)) - 36361 imm6; 36362 // VSRA{<c>}{<q>}.<type><size> {<Qd>}, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length) 36363 vsra(CurrentCond(), 36364 dt, 36365 QRegister(rd), 36366 QRegister(rm), 36367 imm); 36368 break; 36369 } 36370 case 0x00000200: { 36371 // 0xef800250 36372 if (((instr & 0x380080) == 0x0)) { 36373 UnallocatedT32(instr); 36374 return; 36375 } 36376 DataType dt = 36377 Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) | 36378 ((instr >> 4) & 36379 0x8), 36380 (instr >> 28) & 0x1); 36381 if (dt.Is(kDataTypeValueInvalid)) { 36382 UnallocatedT32(instr); 36383 return; 36384 } 36385 if (((instr >> 12) & 1) != 0) { 36386 UnallocatedT32(instr); 36387 return; 36388 } 36389 unsigned rd = ExtractQRegister(instr, 22, 12); 36390 if ((instr & 1) != 0) { 36391 UnallocatedT32(instr); 36392 return; 36393 } 36394 unsigned rm = ExtractQRegister(instr, 5, 0); 36395 uint32_t imm6 = (instr >> 16) & 0x3f; 36396 uint32_t imm = 36397 (dt.IsSize(64) ? 64 36398 : (dt.GetSize() * 2)) - 36399 imm6; 36400 // VRSHR{<c>}{<q>}.<type><size> {<Qd>}, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length) 36401 vrshr(CurrentCond(), 36402 dt, 36403 QRegister(rd), 36404 QRegister(rm), 36405 imm); 36406 break; 36407 } 36408 case 0x00000300: { 36409 // 0xef800350 36410 if (((instr & 0x380080) == 0x0)) { 36411 UnallocatedT32(instr); 36412 return; 36413 } 36414 DataType dt = 36415 Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) | 36416 ((instr >> 4) & 36417 0x8), 36418 (instr >> 28) & 0x1); 36419 if (dt.Is(kDataTypeValueInvalid)) { 36420 UnallocatedT32(instr); 36421 return; 36422 } 36423 if (((instr >> 12) & 1) != 0) { 36424 UnallocatedT32(instr); 36425 return; 36426 } 36427 unsigned rd = ExtractQRegister(instr, 22, 12); 36428 if ((instr & 1) != 0) { 36429 UnallocatedT32(instr); 36430 return; 36431 } 36432 unsigned rm = ExtractQRegister(instr, 5, 0); 36433 uint32_t imm6 = (instr >> 16) & 0x3f; 36434 uint32_t imm = 36435 (dt.IsSize(64) ? 64 36436 : (dt.GetSize() * 2)) - 36437 imm6; 36438 // VRSRA{<c>}{<q>}.<type><size> {<Qd>}, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length) 36439 vrsra(CurrentCond(), 36440 dt, 36441 QRegister(rd), 36442 QRegister(rm), 36443 imm); 36444 break; 36445 } 36446 } 36447 break; 36448 } 36449 } 36450 break; 36451 } 36452 case 0x00000400: { 36453 // 0xef800450 36454 switch (instr & 0x00380080) { 36455 case 0x00000000: { 36456 // 0xef800450 36457 switch (instr & 0x00000100) { 36458 case 0x00000000: { 36459 // 0xef800450 36460 switch (instr & 0x00000200) { 36461 default: { 36462 switch (instr & 0x00000020) { 36463 case 0x00000020: { 36464 // 0xef800470 36465 if (((instr & 0xd00) == 0x100) || 36466 ((instr & 0xd00) == 0x500) || 36467 ((instr & 0xd00) == 0x900) || 36468 ((instr & 0xe00) == 0xe00)) { 36469 UnallocatedT32(instr); 36470 return; 36471 } 36472 unsigned cmode = (instr >> 8) & 0xf; 36473 DataType dt = 36474 ImmediateVmvn::DecodeDt(cmode); 36475 if (dt.Is(kDataTypeValueInvalid)) { 36476 UnallocatedT32(instr); 36477 return; 36478 } 36479 if (((instr >> 12) & 1) != 0) { 36480 UnallocatedT32(instr); 36481 return; 36482 } 36483 unsigned rd = 36484 ExtractQRegister(instr, 22, 12); 36485 QOperand imm = 36486 ImmediateVmvn::DecodeImmediate( 36487 cmode, 36488 (instr & 0xf) | 36489 ((instr >> 12) & 0x70) | 36490 ((instr >> 21) & 0x80)); 36491 // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length) 36492 vmvn(CurrentCond(), 36493 dt, 36494 QRegister(rd), 36495 imm); 36496 break; 36497 } 36498 default: { 36499 if (((instr & 0x920) == 0x100) || 36500 ((instr & 0x520) == 0x100) || 36501 ((instr & 0x820) == 0x20) || 36502 ((instr & 0x420) == 0x20) || 36503 ((instr & 0x220) == 0x20) || 36504 ((instr & 0x120) == 0x120)) { 36505 UnallocatedT32(instr); 36506 return; 36507 } 36508 unsigned cmode = 36509 ((instr >> 8) & 0xf) | 36510 ((instr >> 1) & 0x10); 36511 DataType dt = 36512 ImmediateVmov::DecodeDt(cmode); 36513 if (dt.Is(kDataTypeValueInvalid)) { 36514 UnallocatedT32(instr); 36515 return; 36516 } 36517 if (((instr >> 12) & 1) != 0) { 36518 UnallocatedT32(instr); 36519 return; 36520 } 36521 unsigned rd = 36522 ExtractQRegister(instr, 22, 12); 36523 QOperand imm = 36524 ImmediateVmov::DecodeImmediate( 36525 cmode, 36526 (instr & 0xf) | 36527 ((instr >> 12) & 0x70) | 36528 ((instr >> 21) & 0x80)); 36529 // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length) 36530 vmov(CurrentCond(), 36531 dt, 36532 QRegister(rd), 36533 imm); 36534 break; 36535 } 36536 } 36537 break; 36538 } 36539 } 36540 break; 36541 } 36542 case 0x00000100: { 36543 // 0xef800550 36544 switch (instr & 0x00000020) { 36545 case 0x00000000: { 36546 // 0xef800550 36547 if (((instr & 0x100) == 0x0) || 36548 ((instr & 0xc00) == 0xc00)) { 36549 UnallocatedT32(instr); 36550 return; 36551 } 36552 unsigned cmode = (instr >> 8) & 0xf; 36553 DataType dt = 36554 ImmediateVorr::DecodeDt(cmode); 36555 if (dt.Is(kDataTypeValueInvalid)) { 36556 UnallocatedT32(instr); 36557 return; 36558 } 36559 if (((instr >> 12) & 1) != 0) { 36560 UnallocatedT32(instr); 36561 return; 36562 } 36563 unsigned rd = 36564 ExtractQRegister(instr, 22, 12); 36565 QOperand imm = 36566 ImmediateVorr::DecodeImmediate( 36567 cmode, 36568 (instr & 0xf) | 36569 ((instr >> 12) & 0x70) | 36570 ((instr >> 21) & 0x80)); 36571 // VORR{<c>}{<q>}.<dt> {<Qdn>}, <Qdn>, #<imm> ; T1 NOLINT(whitespace/line_length) 36572 vorr(CurrentCond(), 36573 dt, 36574 QRegister(rd), 36575 QRegister(rd), 36576 imm); 36577 break; 36578 } 36579 case 0x00000020: { 36580 // 0xef800570 36581 if (((instr & 0x100) == 0x0) || 36582 ((instr & 0xc00) == 0xc00)) { 36583 UnallocatedT32(instr); 36584 return; 36585 } 36586 unsigned cmode = (instr >> 8) & 0xf; 36587 DataType dt = 36588 ImmediateVbic::DecodeDt(cmode); 36589 if (dt.Is(kDataTypeValueInvalid)) { 36590 UnallocatedT32(instr); 36591 return; 36592 } 36593 if (((instr >> 12) & 1) != 0) { 36594 UnallocatedT32(instr); 36595 return; 36596 } 36597 unsigned rd = 36598 ExtractQRegister(instr, 22, 12); 36599 QOperand imm = 36600 ImmediateVbic::DecodeImmediate( 36601 cmode, 36602 (instr & 0xf) | 36603 ((instr >> 12) & 0x70) | 36604 ((instr >> 21) & 0x80)); 36605 // VBIC{<c>}{<q>}.<dt> {<Qdn>}, <Qdn>, #<imm> ; T1 NOLINT(whitespace/line_length) 36606 vbic(CurrentCond(), 36607 dt, 36608 QRegister(rd), 36609 QRegister(rd), 36610 imm); 36611 break; 36612 } 36613 } 36614 break; 36615 } 36616 } 36617 break; 36618 } 36619 default: { 36620 switch (instr & 0x00000300) { 36621 case 0x00000000: { 36622 // 0xef800450 36623 if ((instr & 0x10000000) == 0x10000000) { 36624 if (((instr & 0x380080) == 0x0)) { 36625 UnallocatedT32(instr); 36626 return; 36627 } 36628 DataType dt = Dt_L_imm6_4_Decode( 36629 ((instr >> 19) & 0x7) | 36630 ((instr >> 4) & 0x8)); 36631 if (dt.Is(kDataTypeValueInvalid)) { 36632 UnallocatedT32(instr); 36633 return; 36634 } 36635 if (((instr >> 12) & 1) != 0) { 36636 UnallocatedT32(instr); 36637 return; 36638 } 36639 unsigned rd = 36640 ExtractQRegister(instr, 22, 12); 36641 if ((instr & 1) != 0) { 36642 UnallocatedT32(instr); 36643 return; 36644 } 36645 unsigned rm = ExtractQRegister(instr, 5, 0); 36646 uint32_t imm6 = (instr >> 16) & 0x3f; 36647 uint32_t imm = 36648 (dt.IsSize(64) ? 64 36649 : (dt.GetSize() * 2)) - 36650 imm6; 36651 // VSRI{<c>}{<q>}.<dt> {<Qd>}, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length) 36652 vsri(CurrentCond(), 36653 dt, 36654 QRegister(rd), 36655 QRegister(rm), 36656 imm); 36657 } else { 36658 UnallocatedT32(instr); 36659 } 36660 break; 36661 } 36662 case 0x00000100: { 36663 // 0xef800550 36664 switch (instr & 0x10000000) { 36665 case 0x00000000: { 36666 // 0xef800550 36667 if (((instr & 0x380080) == 0x0)) { 36668 UnallocatedT32(instr); 36669 return; 36670 } 36671 DataType dt = Dt_L_imm6_3_Decode( 36672 ((instr >> 19) & 0x7) | 36673 ((instr >> 4) & 0x8)); 36674 if (dt.Is(kDataTypeValueInvalid)) { 36675 UnallocatedT32(instr); 36676 return; 36677 } 36678 if (((instr >> 12) & 1) != 0) { 36679 UnallocatedT32(instr); 36680 return; 36681 } 36682 unsigned rd = 36683 ExtractQRegister(instr, 22, 12); 36684 if ((instr & 1) != 0) { 36685 UnallocatedT32(instr); 36686 return; 36687 } 36688 unsigned rm = 36689 ExtractQRegister(instr, 5, 0); 36690 uint32_t imm6 = (instr >> 16) & 0x3f; 36691 uint32_t imm = 36692 imm6 - 36693 (dt.IsSize(64) ? 0 : dt.GetSize()); 36694 // VSHL{<c>}{<q>}.I<size> {<Qd>}, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length) 36695 vshl(CurrentCond(), 36696 dt, 36697 QRegister(rd), 36698 QRegister(rm), 36699 imm); 36700 break; 36701 } 36702 case 0x10000000: { 36703 // 0xff800550 36704 if (((instr & 0x380080) == 0x0)) { 36705 UnallocatedT32(instr); 36706 return; 36707 } 36708 DataType dt = Dt_L_imm6_4_Decode( 36709 ((instr >> 19) & 0x7) | 36710 ((instr >> 4) & 0x8)); 36711 if (dt.Is(kDataTypeValueInvalid)) { 36712 UnallocatedT32(instr); 36713 return; 36714 } 36715 if (((instr >> 12) & 1) != 0) { 36716 UnallocatedT32(instr); 36717 return; 36718 } 36719 unsigned rd = 36720 ExtractQRegister(instr, 22, 12); 36721 if ((instr & 1) != 0) { 36722 UnallocatedT32(instr); 36723 return; 36724 } 36725 unsigned rm = 36726 ExtractQRegister(instr, 5, 0); 36727 uint32_t imm6 = (instr >> 16) & 0x3f; 36728 uint32_t imm = 36729 imm6 - 36730 (dt.IsSize(64) ? 0 : dt.GetSize()); 36731 // VSLI{<c>}{<q>}.<dt> {<Qd>}, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length) 36732 vsli(CurrentCond(), 36733 dt, 36734 QRegister(rd), 36735 QRegister(rm), 36736 imm); 36737 break; 36738 } 36739 } 36740 break; 36741 } 36742 case 0x00000200: { 36743 // 0xef800650 36744 if (((instr & 0x380080) == 0x0)) { 36745 UnallocatedT32(instr); 36746 return; 36747 } 36748 DataType dt = 36749 Dt_L_imm6_2_Decode(((instr >> 19) & 0x7) | 36750 ((instr >> 4) & 36751 0x8), 36752 (instr >> 28) & 0x1); 36753 if (dt.Is(kDataTypeValueInvalid)) { 36754 UnallocatedT32(instr); 36755 return; 36756 } 36757 if (((instr >> 12) & 1) != 0) { 36758 UnallocatedT32(instr); 36759 return; 36760 } 36761 unsigned rd = ExtractQRegister(instr, 22, 12); 36762 if ((instr & 1) != 0) { 36763 UnallocatedT32(instr); 36764 return; 36765 } 36766 unsigned rm = ExtractQRegister(instr, 5, 0); 36767 uint32_t imm6 = (instr >> 16) & 0x3f; 36768 uint32_t imm = 36769 imm6 - (dt.IsSize(64) ? 0 : dt.GetSize()); 36770 // VQSHLU{<c>}{<q>}.<type><size> {<Qd>}, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length) 36771 vqshlu(CurrentCond(), 36772 dt, 36773 QRegister(rd), 36774 QRegister(rm), 36775 imm); 36776 break; 36777 } 36778 case 0x00000300: { 36779 // 0xef800750 36780 if (((instr & 0x380080) == 0x0)) { 36781 UnallocatedT32(instr); 36782 return; 36783 } 36784 DataType dt = 36785 Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) | 36786 ((instr >> 4) & 36787 0x8), 36788 (instr >> 28) & 0x1); 36789 if (dt.Is(kDataTypeValueInvalid)) { 36790 UnallocatedT32(instr); 36791 return; 36792 } 36793 if (((instr >> 12) & 1) != 0) { 36794 UnallocatedT32(instr); 36795 return; 36796 } 36797 unsigned rd = ExtractQRegister(instr, 22, 12); 36798 if ((instr & 1) != 0) { 36799 UnallocatedT32(instr); 36800 return; 36801 } 36802 unsigned rm = ExtractQRegister(instr, 5, 0); 36803 uint32_t imm6 = (instr >> 16) & 0x3f; 36804 uint32_t imm = 36805 imm6 - (dt.IsSize(64) ? 0 : dt.GetSize()); 36806 // VQSHL{<c>}{<q>}.<type><size> {<Qd>}, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length) 36807 vqshl(CurrentCond(), 36808 dt, 36809 QRegister(rd), 36810 QRegister(rm), 36811 imm); 36812 break; 36813 } 36814 } 36815 break; 36816 } 36817 } 36818 break; 36819 } 36820 case 0x00000800: { 36821 // 0xef800850 36822 switch (instr & 0x00000080) { 36823 case 0x00000000: { 36824 // 0xef800850 36825 switch (instr & 0x00380000) { 36826 case 0x00000000: { 36827 // 0xef800850 36828 switch (instr & 0x00000100) { 36829 case 0x00000000: { 36830 // 0xef800850 36831 switch (instr & 0x00000200) { 36832 default: { 36833 switch (instr & 0x00000020) { 36834 case 0x00000020: { 36835 // 0xef800870 36836 if (((instr & 0xd00) == 0x100) || 36837 ((instr & 0xd00) == 0x500) || 36838 ((instr & 0xd00) == 0x900) || 36839 ((instr & 0xe00) == 0xe00)) { 36840 UnallocatedT32(instr); 36841 return; 36842 } 36843 unsigned cmode = 36844 (instr >> 8) & 0xf; 36845 DataType dt = 36846 ImmediateVmvn::DecodeDt( 36847 cmode); 36848 if (dt.Is( 36849 kDataTypeValueInvalid)) { 36850 UnallocatedT32(instr); 36851 return; 36852 } 36853 if (((instr >> 12) & 1) != 0) { 36854 UnallocatedT32(instr); 36855 return; 36856 } 36857 unsigned rd = 36858 ExtractQRegister(instr, 36859 22, 36860 12); 36861 QOperand imm = ImmediateVmvn:: 36862 DecodeImmediate(cmode, 36863 (instr & 36864 0xf) | 36865 ((instr >> 36866 12) & 36867 0x70) | 36868 ((instr >> 36869 21) & 36870 0x80)); 36871 // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length) 36872 vmvn(CurrentCond(), 36873 dt, 36874 QRegister(rd), 36875 imm); 36876 break; 36877 } 36878 default: { 36879 if (((instr & 0x920) == 0x100) || 36880 ((instr & 0x520) == 0x100) || 36881 ((instr & 0x820) == 0x20) || 36882 ((instr & 0x420) == 0x20) || 36883 ((instr & 0x220) == 0x20) || 36884 ((instr & 0x120) == 0x120)) { 36885 UnallocatedT32(instr); 36886 return; 36887 } 36888 unsigned cmode = 36889 ((instr >> 8) & 0xf) | 36890 ((instr >> 1) & 0x10); 36891 DataType dt = 36892 ImmediateVmov::DecodeDt( 36893 cmode); 36894 if (dt.Is( 36895 kDataTypeValueInvalid)) { 36896 UnallocatedT32(instr); 36897 return; 36898 } 36899 if (((instr >> 12) & 1) != 0) { 36900 UnallocatedT32(instr); 36901 return; 36902 } 36903 unsigned rd = 36904 ExtractQRegister(instr, 36905 22, 36906 12); 36907 QOperand imm = ImmediateVmov:: 36908 DecodeImmediate(cmode, 36909 (instr & 36910 0xf) | 36911 ((instr >> 36912 12) & 36913 0x70) | 36914 ((instr >> 36915 21) & 36916 0x80)); 36917 // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length) 36918 vmov(CurrentCond(), 36919 dt, 36920 QRegister(rd), 36921 imm); 36922 break; 36923 } 36924 } 36925 break; 36926 } 36927 } 36928 break; 36929 } 36930 case 0x00000100: { 36931 // 0xef800950 36932 switch (instr & 0x00000020) { 36933 case 0x00000000: { 36934 // 0xef800950 36935 if (((instr & 0x100) == 0x0) || 36936 ((instr & 0xc00) == 0xc00)) { 36937 UnallocatedT32(instr); 36938 return; 36939 } 36940 unsigned cmode = (instr >> 8) & 0xf; 36941 DataType dt = 36942 ImmediateVorr::DecodeDt(cmode); 36943 if (dt.Is(kDataTypeValueInvalid)) { 36944 UnallocatedT32(instr); 36945 return; 36946 } 36947 if (((instr >> 12) & 1) != 0) { 36948 UnallocatedT32(instr); 36949 return; 36950 } 36951 unsigned rd = 36952 ExtractQRegister(instr, 22, 12); 36953 QOperand imm = 36954 ImmediateVorr::DecodeImmediate( 36955 cmode, 36956 (instr & 0xf) | 36957 ((instr >> 12) & 0x70) | 36958 ((instr >> 21) & 0x80)); 36959 // VORR{<c>}{<q>}.<dt> {<Qdn>}, <Qdn>, #<imm> ; T1 NOLINT(whitespace/line_length) 36960 vorr(CurrentCond(), 36961 dt, 36962 QRegister(rd), 36963 QRegister(rd), 36964 imm); 36965 break; 36966 } 36967 case 0x00000020: { 36968 // 0xef800970 36969 if (((instr & 0x100) == 0x0) || 36970 ((instr & 0xc00) == 0xc00)) { 36971 UnallocatedT32(instr); 36972 return; 36973 } 36974 unsigned cmode = (instr >> 8) & 0xf; 36975 DataType dt = 36976 ImmediateVbic::DecodeDt(cmode); 36977 if (dt.Is(kDataTypeValueInvalid)) { 36978 UnallocatedT32(instr); 36979 return; 36980 } 36981 if (((instr >> 12) & 1) != 0) { 36982 UnallocatedT32(instr); 36983 return; 36984 } 36985 unsigned rd = 36986 ExtractQRegister(instr, 22, 12); 36987 QOperand imm = 36988 ImmediateVbic::DecodeImmediate( 36989 cmode, 36990 (instr & 0xf) | 36991 ((instr >> 12) & 0x70) | 36992 ((instr >> 21) & 0x80)); 36993 // VBIC{<c>}{<q>}.<dt> {<Qdn>}, <Qdn>, #<imm> ; T1 NOLINT(whitespace/line_length) 36994 vbic(CurrentCond(), 36995 dt, 36996 QRegister(rd), 36997 QRegister(rd), 36998 imm); 36999 break; 37000 } 37001 } 37002 break; 37003 } 37004 } 37005 break; 37006 } 37007 default: { 37008 switch (instr & 0x00000300) { 37009 case 0x00000000: { 37010 // 0xef800850 37011 switch (instr & 0x10000000) { 37012 case 0x00000000: { 37013 // 0xef800850 37014 if (((instr & 0x380000) == 0x0)) { 37015 UnallocatedT32(instr); 37016 return; 37017 } 37018 DataType dt = Dt_imm6_3_Decode( 37019 (instr >> 19) & 0x7); 37020 if (dt.Is(kDataTypeValueInvalid)) { 37021 UnallocatedT32(instr); 37022 return; 37023 } 37024 unsigned rd = 37025 ExtractDRegister(instr, 22, 12); 37026 if ((instr & 1) != 0) { 37027 UnallocatedT32(instr); 37028 return; 37029 } 37030 unsigned rm = 37031 ExtractQRegister(instr, 5, 0); 37032 uint32_t imm6 = (instr >> 16) & 0x3f; 37033 uint32_t imm = dt.GetSize() - imm6; 37034 // VRSHRN{<c>}{<q>}.I<size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length) 37035 vrshrn(CurrentCond(), 37036 dt, 37037 DRegister(rd), 37038 QRegister(rm), 37039 imm); 37040 break; 37041 } 37042 case 0x10000000: { 37043 // 0xff800850 37044 if (((instr & 0x380000) == 0x0)) { 37045 UnallocatedT32(instr); 37046 return; 37047 } 37048 DataType dt = 37049 Dt_imm6_2_Decode((instr >> 19) & 37050 0x7, 37051 (instr >> 28) & 37052 0x1); 37053 if (dt.Is(kDataTypeValueInvalid)) { 37054 UnallocatedT32(instr); 37055 return; 37056 } 37057 unsigned rd = 37058 ExtractDRegister(instr, 22, 12); 37059 if ((instr & 1) != 0) { 37060 UnallocatedT32(instr); 37061 return; 37062 } 37063 unsigned rm = 37064 ExtractQRegister(instr, 5, 0); 37065 uint32_t imm6 = (instr >> 16) & 0x3f; 37066 uint32_t imm = dt.GetSize() - imm6; 37067 // VQRSHRUN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length) 37068 vqrshrun(CurrentCond(), 37069 dt, 37070 DRegister(rd), 37071 QRegister(rm), 37072 imm); 37073 break; 37074 } 37075 } 37076 break; 37077 } 37078 case 0x00000100: { 37079 // 0xef800950 37080 if (((instr & 0x380000) == 0x0)) { 37081 UnallocatedT32(instr); 37082 return; 37083 } 37084 DataType dt = 37085 Dt_imm6_1_Decode((instr >> 19) & 0x7, 37086 (instr >> 28) & 0x1); 37087 if (dt.Is(kDataTypeValueInvalid)) { 37088 UnallocatedT32(instr); 37089 return; 37090 } 37091 unsigned rd = 37092 ExtractDRegister(instr, 22, 12); 37093 if ((instr & 1) != 0) { 37094 UnallocatedT32(instr); 37095 return; 37096 } 37097 unsigned rm = 37098 ExtractQRegister(instr, 5, 0); 37099 uint32_t imm6 = (instr >> 16) & 0x3f; 37100 uint32_t imm = dt.GetSize() - imm6; 37101 // VQRSHRN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; T1 NOLINT(whitespace/line_length) 37102 vqrshrn(CurrentCond(), 37103 dt, 37104 DRegister(rd), 37105 QRegister(rm), 37106 imm); 37107 break; 37108 } 37109 default: 37110 UnallocatedT32(instr); 37111 break; 37112 } 37113 break; 37114 } 37115 } 37116 break; 37117 } 37118 default: 37119 UnallocatedT32(instr); 37120 break; 37121 } 37122 break; 37123 } 37124 case 0x00000c00: { 37125 // 0xef800c50 37126 switch (instr & 0x00000080) { 37127 case 0x00000000: { 37128 // 0xef800c50 37129 switch (instr & 0x00200000) { 37130 case 0x00000000: { 37131 // 0xef800c50 37132 switch (instr & 0x00180000) { 37133 case 0x00000000: { 37134 // 0xef800c50 37135 switch (instr & 0x00000300) { 37136 case 0x00000200: { 37137 // 0xef800e50 37138 if (((instr & 0x920) == 0x100) || 37139 ((instr & 0x520) == 0x100) || 37140 ((instr & 0x820) == 0x20) || 37141 ((instr & 0x420) == 0x20) || 37142 ((instr & 0x220) == 0x20) || 37143 ((instr & 0x120) == 0x120)) { 37144 UnallocatedT32(instr); 37145 return; 37146 } 37147 unsigned cmode = 37148 ((instr >> 8) & 0xf) | 37149 ((instr >> 1) & 0x10); 37150 DataType dt = 37151 ImmediateVmov::DecodeDt(cmode); 37152 if (dt.Is(kDataTypeValueInvalid)) { 37153 UnallocatedT32(instr); 37154 return; 37155 } 37156 if (((instr >> 12) & 1) != 0) { 37157 UnallocatedT32(instr); 37158 return; 37159 } 37160 unsigned rd = 37161 ExtractQRegister(instr, 22, 12); 37162 QOperand imm = 37163 ImmediateVmov::DecodeImmediate( 37164 cmode, 37165 (instr & 0xf) | 37166 ((instr >> 12) & 0x70) | 37167 ((instr >> 21) & 0x80)); 37168 // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length) 37169 vmov(CurrentCond(), 37170 dt, 37171 QRegister(rd), 37172 imm); 37173 break; 37174 } 37175 case 0x00000300: { 37176 // 0xef800f50 37177 if (((instr & 0x920) == 0x100) || 37178 ((instr & 0x520) == 0x100) || 37179 ((instr & 0x820) == 0x20) || 37180 ((instr & 0x420) == 0x20) || 37181 ((instr & 0x220) == 0x20) || 37182 ((instr & 0x120) == 0x120)) { 37183 UnallocatedT32(instr); 37184 return; 37185 } 37186 unsigned cmode = 37187 ((instr >> 8) & 0xf) | 37188 ((instr >> 1) & 0x10); 37189 DataType dt = 37190 ImmediateVmov::DecodeDt(cmode); 37191 if (dt.Is(kDataTypeValueInvalid)) { 37192 UnallocatedT32(instr); 37193 return; 37194 } 37195 if (((instr >> 12) & 1) != 0) { 37196 UnallocatedT32(instr); 37197 return; 37198 } 37199 unsigned rd = 37200 ExtractQRegister(instr, 22, 12); 37201 QOperand imm = 37202 ImmediateVmov::DecodeImmediate( 37203 cmode, 37204 (instr & 0xf) | 37205 ((instr >> 12) & 0x70) | 37206 ((instr >> 21) & 0x80)); 37207 // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length) 37208 vmov(CurrentCond(), 37209 dt, 37210 QRegister(rd), 37211 imm); 37212 break; 37213 } 37214 default: { 37215 switch (instr & 0x00000020) { 37216 case 0x00000020: { 37217 // 0xef800c70 37218 switch (instr & 0x00000f20) { 37219 case 0x00000000: { 37220 // 0xef800c50 37221 if (((instr & 0x920) == 37222 0x100) || 37223 ((instr & 0x520) == 37224 0x100) || 37225 ((instr & 0x820) == 37226 0x20) || 37227 ((instr & 0x420) == 37228 0x20) || 37229 ((instr & 0x220) == 37230 0x20) || 37231 ((instr & 0x120) == 37232 0x120)) { 37233 UnallocatedT32(instr); 37234 return; 37235 } 37236 unsigned cmode = 37237 ((instr >> 8) & 0xf) | 37238 ((instr >> 1) & 0x10); 37239 DataType dt = 37240 ImmediateVmov::DecodeDt( 37241 cmode); 37242 if (dt.Is( 37243 kDataTypeValueInvalid)) { 37244 UnallocatedT32(instr); 37245 return; 37246 } 37247 if (((instr >> 12) & 1) != 37248 0) { 37249 UnallocatedT32(instr); 37250 return; 37251 } 37252 unsigned rd = 37253 ExtractQRegister(instr, 37254 22, 37255 12); 37256 QOperand imm = ImmediateVmov:: 37257 DecodeImmediate( 37258 cmode, 37259 (instr & 0xf) | 37260 ((instr >> 12) & 37261 0x70) | 37262 ((instr >> 21) & 37263 0x80)); 37264 // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length) 37265 vmov(CurrentCond(), 37266 dt, 37267 QRegister(rd), 37268 imm); 37269 break; 37270 } 37271 case 0x00000020: { 37272 // 0xef800c70 37273 if (((instr & 0xd00) == 37274 0x100) || 37275 ((instr & 0xd00) == 37276 0x500) || 37277 ((instr & 0xd00) == 37278 0x900) || 37279 ((instr & 0xe00) == 37280 0xe00)) { 37281 UnallocatedT32(instr); 37282 return; 37283 } 37284 unsigned cmode = 37285 (instr >> 8) & 0xf; 37286 DataType dt = 37287 ImmediateVmvn::DecodeDt( 37288 cmode); 37289 if (dt.Is( 37290 kDataTypeValueInvalid)) { 37291 UnallocatedT32(instr); 37292 return; 37293 } 37294 if (((instr >> 12) & 1) != 37295 0) { 37296 UnallocatedT32(instr); 37297 return; 37298 } 37299 unsigned rd = 37300 ExtractQRegister(instr, 37301 22, 37302 12); 37303 QOperand imm = ImmediateVmvn:: 37304 DecodeImmediate( 37305 cmode, 37306 (instr & 0xf) | 37307 ((instr >> 12) & 37308 0x70) | 37309 ((instr >> 21) & 37310 0x80)); 37311 // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length) 37312 vmvn(CurrentCond(), 37313 dt, 37314 QRegister(rd), 37315 imm); 37316 break; 37317 } 37318 case 0x00000200: { 37319 // 0xef800e50 37320 if (((instr & 0x920) == 37321 0x100) || 37322 ((instr & 0x520) == 37323 0x100) || 37324 ((instr & 0x820) == 37325 0x20) || 37326 ((instr & 0x420) == 37327 0x20) || 37328 ((instr & 0x220) == 37329 0x20) || 37330 ((instr & 0x120) == 37331 0x120)) { 37332 UnallocatedT32(instr); 37333 return; 37334 } 37335 unsigned cmode = 37336 ((instr >> 8) & 0xf) | 37337 ((instr >> 1) & 0x10); 37338 DataType dt = 37339 ImmediateVmov::DecodeDt( 37340 cmode); 37341 if (dt.Is( 37342 kDataTypeValueInvalid)) { 37343 UnallocatedT32(instr); 37344 return; 37345 } 37346 if (((instr >> 12) & 1) != 37347 0) { 37348 UnallocatedT32(instr); 37349 return; 37350 } 37351 unsigned rd = 37352 ExtractQRegister(instr, 37353 22, 37354 12); 37355 QOperand imm = ImmediateVmov:: 37356 DecodeImmediate( 37357 cmode, 37358 (instr & 0xf) | 37359 ((instr >> 12) & 37360 0x70) | 37361 ((instr >> 21) & 37362 0x80)); 37363 // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length) 37364 vmov(CurrentCond(), 37365 dt, 37366 QRegister(rd), 37367 imm); 37368 break; 37369 } 37370 case 0x00000220: { 37371 // 0xef800e70 37372 if (((instr & 0xd00) == 37373 0x100) || 37374 ((instr & 0xd00) == 37375 0x500) || 37376 ((instr & 0xd00) == 37377 0x900) || 37378 ((instr & 0xe00) == 37379 0xe00)) { 37380 UnallocatedT32(instr); 37381 return; 37382 } 37383 unsigned cmode = 37384 (instr >> 8) & 0xf; 37385 DataType dt = 37386 ImmediateVmvn::DecodeDt( 37387 cmode); 37388 if (dt.Is( 37389 kDataTypeValueInvalid)) { 37390 UnallocatedT32(instr); 37391 return; 37392 } 37393 if (((instr >> 12) & 1) != 37394 0) { 37395 UnallocatedT32(instr); 37396 return; 37397 } 37398 unsigned rd = 37399 ExtractQRegister(instr, 37400 22, 37401 12); 37402 QOperand imm = ImmediateVmvn:: 37403 DecodeImmediate( 37404 cmode, 37405 (instr & 0xf) | 37406 ((instr >> 12) & 37407 0x70) | 37408 ((instr >> 21) & 37409 0x80)); 37410 // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length) 37411 vmvn(CurrentCond(), 37412 dt, 37413 QRegister(rd), 37414 imm); 37415 break; 37416 } 37417 case 0x00000400: { 37418 // 0xef800c50 37419 if (((instr & 0x920) == 37420 0x100) || 37421 ((instr & 0x520) == 37422 0x100) || 37423 ((instr & 0x820) == 37424 0x20) || 37425 ((instr & 0x420) == 37426 0x20) || 37427 ((instr & 0x220) == 37428 0x20) || 37429 ((instr & 0x120) == 37430 0x120)) { 37431 UnallocatedT32(instr); 37432 return; 37433 } 37434 unsigned cmode = 37435 ((instr >> 8) & 0xf) | 37436 ((instr >> 1) & 0x10); 37437 DataType dt = 37438 ImmediateVmov::DecodeDt( 37439 cmode); 37440 if (dt.Is( 37441 kDataTypeValueInvalid)) { 37442 UnallocatedT32(instr); 37443 return; 37444 } 37445 if (((instr >> 12) & 1) != 37446 0) { 37447 UnallocatedT32(instr); 37448 return; 37449 } 37450 unsigned rd = 37451 ExtractQRegister(instr, 37452 22, 37453 12); 37454 QOperand imm = ImmediateVmov:: 37455 DecodeImmediate( 37456 cmode, 37457 (instr & 0xf) | 37458 ((instr >> 12) & 37459 0x70) | 37460 ((instr >> 21) & 37461 0x80)); 37462 // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length) 37463 vmov(CurrentCond(), 37464 dt, 37465 QRegister(rd), 37466 imm); 37467 break; 37468 } 37469 case 0x00000420: { 37470 // 0xef800c70 37471 if (((instr & 0xd00) == 37472 0x100) || 37473 ((instr & 0xd00) == 37474 0x500) || 37475 ((instr & 0xd00) == 37476 0x900) || 37477 ((instr & 0xe00) == 37478 0xe00)) { 37479 UnallocatedT32(instr); 37480 return; 37481 } 37482 unsigned cmode = 37483 (instr >> 8) & 0xf; 37484 DataType dt = 37485 ImmediateVmvn::DecodeDt( 37486 cmode); 37487 if (dt.Is( 37488 kDataTypeValueInvalid)) { 37489 UnallocatedT32(instr); 37490 return; 37491 } 37492 if (((instr >> 12) & 1) != 37493 0) { 37494 UnallocatedT32(instr); 37495 return; 37496 } 37497 unsigned rd = 37498 ExtractQRegister(instr, 37499 22, 37500 12); 37501 QOperand imm = ImmediateVmvn:: 37502 DecodeImmediate( 37503 cmode, 37504 (instr & 0xf) | 37505 ((instr >> 12) & 37506 0x70) | 37507 ((instr >> 21) & 37508 0x80)); 37509 // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length) 37510 vmvn(CurrentCond(), 37511 dt, 37512 QRegister(rd), 37513 imm); 37514 break; 37515 } 37516 case 0x00000600: { 37517 // 0xef800e50 37518 if (((instr & 0x920) == 37519 0x100) || 37520 ((instr & 0x520) == 37521 0x100) || 37522 ((instr & 0x820) == 37523 0x20) || 37524 ((instr & 0x420) == 37525 0x20) || 37526 ((instr & 0x220) == 37527 0x20) || 37528 ((instr & 0x120) == 37529 0x120)) { 37530 UnallocatedT32(instr); 37531 return; 37532 } 37533 unsigned cmode = 37534 ((instr >> 8) & 0xf) | 37535 ((instr >> 1) & 0x10); 37536 DataType dt = 37537 ImmediateVmov::DecodeDt( 37538 cmode); 37539 if (dt.Is( 37540 kDataTypeValueInvalid)) { 37541 UnallocatedT32(instr); 37542 return; 37543 } 37544 if (((instr >> 12) & 1) != 37545 0) { 37546 UnallocatedT32(instr); 37547 return; 37548 } 37549 unsigned rd = 37550 ExtractQRegister(instr, 37551 22, 37552 12); 37553 QOperand imm = ImmediateVmov:: 37554 DecodeImmediate( 37555 cmode, 37556 (instr & 0xf) | 37557 ((instr >> 12) & 37558 0x70) | 37559 ((instr >> 21) & 37560 0x80)); 37561 // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length) 37562 vmov(CurrentCond(), 37563 dt, 37564 QRegister(rd), 37565 imm); 37566 break; 37567 } 37568 case 0x00000620: { 37569 // 0xef800e70 37570 if (((instr & 0xd00) == 37571 0x100) || 37572 ((instr & 0xd00) == 37573 0x500) || 37574 ((instr & 0xd00) == 37575 0x900) || 37576 ((instr & 0xe00) == 37577 0xe00)) { 37578 UnallocatedT32(instr); 37579 return; 37580 } 37581 unsigned cmode = 37582 (instr >> 8) & 0xf; 37583 DataType dt = 37584 ImmediateVmvn::DecodeDt( 37585 cmode); 37586 if (dt.Is( 37587 kDataTypeValueInvalid)) { 37588 UnallocatedT32(instr); 37589 return; 37590 } 37591 if (((instr >> 12) & 1) != 37592 0) { 37593 UnallocatedT32(instr); 37594 return; 37595 } 37596 unsigned rd = 37597 ExtractQRegister(instr, 37598 22, 37599 12); 37600 QOperand imm = ImmediateVmvn:: 37601 DecodeImmediate( 37602 cmode, 37603 (instr & 0xf) | 37604 ((instr >> 12) & 37605 0x70) | 37606 ((instr >> 21) & 37607 0x80)); 37608 // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length) 37609 vmvn(CurrentCond(), 37610 dt, 37611 QRegister(rd), 37612 imm); 37613 break; 37614 } 37615 case 0x00000800: { 37616 // 0xef800c50 37617 if (((instr & 0x920) == 37618 0x100) || 37619 ((instr & 0x520) == 37620 0x100) || 37621 ((instr & 0x820) == 37622 0x20) || 37623 ((instr & 0x420) == 37624 0x20) || 37625 ((instr & 0x220) == 37626 0x20) || 37627 ((instr & 0x120) == 37628 0x120)) { 37629 UnallocatedT32(instr); 37630 return; 37631 } 37632 unsigned cmode = 37633 ((instr >> 8) & 0xf) | 37634 ((instr >> 1) & 0x10); 37635 DataType dt = 37636 ImmediateVmov::DecodeDt( 37637 cmode); 37638 if (dt.Is( 37639 kDataTypeValueInvalid)) { 37640 UnallocatedT32(instr); 37641 return; 37642 } 37643 if (((instr >> 12) & 1) != 37644 0) { 37645 UnallocatedT32(instr); 37646 return; 37647 } 37648 unsigned rd = 37649 ExtractQRegister(instr, 37650 22, 37651 12); 37652 QOperand imm = ImmediateVmov:: 37653 DecodeImmediate( 37654 cmode, 37655 (instr & 0xf) | 37656 ((instr >> 12) & 37657 0x70) | 37658 ((instr >> 21) & 37659 0x80)); 37660 // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length) 37661 vmov(CurrentCond(), 37662 dt, 37663 QRegister(rd), 37664 imm); 37665 break; 37666 } 37667 case 0x00000820: { 37668 // 0xef800c70 37669 if (((instr & 0xd00) == 37670 0x100) || 37671 ((instr & 0xd00) == 37672 0x500) || 37673 ((instr & 0xd00) == 37674 0x900) || 37675 ((instr & 0xe00) == 37676 0xe00)) { 37677 UnallocatedT32(instr); 37678 return; 37679 } 37680 unsigned cmode = 37681 (instr >> 8) & 0xf; 37682 DataType dt = 37683 ImmediateVmvn::DecodeDt( 37684 cmode); 37685 if (dt.Is( 37686 kDataTypeValueInvalid)) { 37687 UnallocatedT32(instr); 37688 return; 37689 } 37690 if (((instr >> 12) & 1) != 37691 0) { 37692 UnallocatedT32(instr); 37693 return; 37694 } 37695 unsigned rd = 37696 ExtractQRegister(instr, 37697 22, 37698 12); 37699 QOperand imm = ImmediateVmvn:: 37700 DecodeImmediate( 37701 cmode, 37702 (instr & 0xf) | 37703 ((instr >> 12) & 37704 0x70) | 37705 ((instr >> 21) & 37706 0x80)); 37707 // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length) 37708 vmvn(CurrentCond(), 37709 dt, 37710 QRegister(rd), 37711 imm); 37712 break; 37713 } 37714 case 0x00000a00: { 37715 // 0xef800e50 37716 if (((instr & 0x920) == 37717 0x100) || 37718 ((instr & 0x520) == 37719 0x100) || 37720 ((instr & 0x820) == 37721 0x20) || 37722 ((instr & 0x420) == 37723 0x20) || 37724 ((instr & 0x220) == 37725 0x20) || 37726 ((instr & 0x120) == 37727 0x120)) { 37728 UnallocatedT32(instr); 37729 return; 37730 } 37731 unsigned cmode = 37732 ((instr >> 8) & 0xf) | 37733 ((instr >> 1) & 0x10); 37734 DataType dt = 37735 ImmediateVmov::DecodeDt( 37736 cmode); 37737 if (dt.Is( 37738 kDataTypeValueInvalid)) { 37739 UnallocatedT32(instr); 37740 return; 37741 } 37742 if (((instr >> 12) & 1) != 37743 0) { 37744 UnallocatedT32(instr); 37745 return; 37746 } 37747 unsigned rd = 37748 ExtractQRegister(instr, 37749 22, 37750 12); 37751 QOperand imm = ImmediateVmov:: 37752 DecodeImmediate( 37753 cmode, 37754 (instr & 0xf) | 37755 ((instr >> 12) & 37756 0x70) | 37757 ((instr >> 21) & 37758 0x80)); 37759 // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length) 37760 vmov(CurrentCond(), 37761 dt, 37762 QRegister(rd), 37763 imm); 37764 break; 37765 } 37766 case 0x00000a20: { 37767 // 0xef800e70 37768 if (((instr & 0xd00) == 37769 0x100) || 37770 ((instr & 0xd00) == 37771 0x500) || 37772 ((instr & 0xd00) == 37773 0x900) || 37774 ((instr & 0xe00) == 37775 0xe00)) { 37776 UnallocatedT32(instr); 37777 return; 37778 } 37779 unsigned cmode = 37780 (instr >> 8) & 0xf; 37781 DataType dt = 37782 ImmediateVmvn::DecodeDt( 37783 cmode); 37784 if (dt.Is( 37785 kDataTypeValueInvalid)) { 37786 UnallocatedT32(instr); 37787 return; 37788 } 37789 if (((instr >> 12) & 1) != 37790 0) { 37791 UnallocatedT32(instr); 37792 return; 37793 } 37794 unsigned rd = 37795 ExtractQRegister(instr, 37796 22, 37797 12); 37798 QOperand imm = ImmediateVmvn:: 37799 DecodeImmediate( 37800 cmode, 37801 (instr & 0xf) | 37802 ((instr >> 12) & 37803 0x70) | 37804 ((instr >> 21) & 37805 0x80)); 37806 // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length) 37807 vmvn(CurrentCond(), 37808 dt, 37809 QRegister(rd), 37810 imm); 37811 break; 37812 } 37813 case 0x00000c00: { 37814 // 0xef800c50 37815 if (((instr & 0x920) == 37816 0x100) || 37817 ((instr & 0x520) == 37818 0x100) || 37819 ((instr & 0x820) == 37820 0x20) || 37821 ((instr & 0x420) == 37822 0x20) || 37823 ((instr & 0x220) == 37824 0x20) || 37825 ((instr & 0x120) == 37826 0x120)) { 37827 UnallocatedT32(instr); 37828 return; 37829 } 37830 unsigned cmode = 37831 ((instr >> 8) & 0xf) | 37832 ((instr >> 1) & 0x10); 37833 DataType dt = 37834 ImmediateVmov::DecodeDt( 37835 cmode); 37836 if (dt.Is( 37837 kDataTypeValueInvalid)) { 37838 UnallocatedT32(instr); 37839 return; 37840 } 37841 if (((instr >> 12) & 1) != 37842 0) { 37843 UnallocatedT32(instr); 37844 return; 37845 } 37846 unsigned rd = 37847 ExtractQRegister(instr, 37848 22, 37849 12); 37850 QOperand imm = ImmediateVmov:: 37851 DecodeImmediate( 37852 cmode, 37853 (instr & 0xf) | 37854 ((instr >> 12) & 37855 0x70) | 37856 ((instr >> 21) & 37857 0x80)); 37858 // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length) 37859 vmov(CurrentCond(), 37860 dt, 37861 QRegister(rd), 37862 imm); 37863 break; 37864 } 37865 case 0x00000c20: { 37866 // 0xef800c70 37867 if (((instr & 0xd00) == 37868 0x100) || 37869 ((instr & 0xd00) == 37870 0x500) || 37871 ((instr & 0xd00) == 37872 0x900) || 37873 ((instr & 0xe00) == 37874 0xe00)) { 37875 UnallocatedT32(instr); 37876 return; 37877 } 37878 unsigned cmode = 37879 (instr >> 8) & 0xf; 37880 DataType dt = 37881 ImmediateVmvn::DecodeDt( 37882 cmode); 37883 if (dt.Is( 37884 kDataTypeValueInvalid)) { 37885 UnallocatedT32(instr); 37886 return; 37887 } 37888 if (((instr >> 12) & 1) != 37889 0) { 37890 UnallocatedT32(instr); 37891 return; 37892 } 37893 unsigned rd = 37894 ExtractQRegister(instr, 37895 22, 37896 12); 37897 QOperand imm = ImmediateVmvn:: 37898 DecodeImmediate( 37899 cmode, 37900 (instr & 0xf) | 37901 ((instr >> 12) & 37902 0x70) | 37903 ((instr >> 21) & 37904 0x80)); 37905 // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length) 37906 vmvn(CurrentCond(), 37907 dt, 37908 QRegister(rd), 37909 imm); 37910 break; 37911 } 37912 case 0x00000d00: { 37913 // 0xef800d50 37914 if (((instr & 0x920) == 37915 0x100) || 37916 ((instr & 0x520) == 37917 0x100) || 37918 ((instr & 0x820) == 37919 0x20) || 37920 ((instr & 0x420) == 37921 0x20) || 37922 ((instr & 0x220) == 37923 0x20) || 37924 ((instr & 0x120) == 37925 0x120)) { 37926 UnallocatedT32(instr); 37927 return; 37928 } 37929 unsigned cmode = 37930 ((instr >> 8) & 0xf) | 37931 ((instr >> 1) & 0x10); 37932 DataType dt = 37933 ImmediateVmov::DecodeDt( 37934 cmode); 37935 if (dt.Is( 37936 kDataTypeValueInvalid)) { 37937 UnallocatedT32(instr); 37938 return; 37939 } 37940 if (((instr >> 12) & 1) != 37941 0) { 37942 UnallocatedT32(instr); 37943 return; 37944 } 37945 unsigned rd = 37946 ExtractQRegister(instr, 37947 22, 37948 12); 37949 QOperand imm = ImmediateVmov:: 37950 DecodeImmediate( 37951 cmode, 37952 (instr & 0xf) | 37953 ((instr >> 12) & 37954 0x70) | 37955 ((instr >> 21) & 37956 0x80)); 37957 // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length) 37958 vmov(CurrentCond(), 37959 dt, 37960 QRegister(rd), 37961 imm); 37962 break; 37963 } 37964 case 0x00000d20: { 37965 // 0xef800d70 37966 if (((instr & 0xd00) == 37967 0x100) || 37968 ((instr & 0xd00) == 37969 0x500) || 37970 ((instr & 0xd00) == 37971 0x900) || 37972 ((instr & 0xe00) == 37973 0xe00)) { 37974 UnallocatedT32(instr); 37975 return; 37976 } 37977 unsigned cmode = 37978 (instr >> 8) & 0xf; 37979 DataType dt = 37980 ImmediateVmvn::DecodeDt( 37981 cmode); 37982 if (dt.Is( 37983 kDataTypeValueInvalid)) { 37984 UnallocatedT32(instr); 37985 return; 37986 } 37987 if (((instr >> 12) & 1) != 37988 0) { 37989 UnallocatedT32(instr); 37990 return; 37991 } 37992 unsigned rd = 37993 ExtractQRegister(instr, 37994 22, 37995 12); 37996 QOperand imm = ImmediateVmvn:: 37997 DecodeImmediate( 37998 cmode, 37999 (instr & 0xf) | 38000 ((instr >> 12) & 38001 0x70) | 38002 ((instr >> 21) & 38003 0x80)); 38004 // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length) 38005 vmvn(CurrentCond(), 38006 dt, 38007 QRegister(rd), 38008 imm); 38009 break; 38010 } 38011 case 0x00000e00: { 38012 // 0xef800e50 38013 if (((instr & 0x920) == 38014 0x100) || 38015 ((instr & 0x520) == 38016 0x100) || 38017 ((instr & 0x820) == 38018 0x20) || 38019 ((instr & 0x420) == 38020 0x20) || 38021 ((instr & 0x220) == 38022 0x20) || 38023 ((instr & 0x120) == 38024 0x120)) { 38025 UnallocatedT32(instr); 38026 return; 38027 } 38028 unsigned cmode = 38029 ((instr >> 8) & 0xf) | 38030 ((instr >> 1) & 0x10); 38031 DataType dt = 38032 ImmediateVmov::DecodeDt( 38033 cmode); 38034 if (dt.Is( 38035 kDataTypeValueInvalid)) { 38036 UnallocatedT32(instr); 38037 return; 38038 } 38039 if (((instr >> 12) & 1) != 38040 0) { 38041 UnallocatedT32(instr); 38042 return; 38043 } 38044 unsigned rd = 38045 ExtractQRegister(instr, 38046 22, 38047 12); 38048 QOperand imm = ImmediateVmov:: 38049 DecodeImmediate( 38050 cmode, 38051 (instr & 0xf) | 38052 ((instr >> 12) & 38053 0x70) | 38054 ((instr >> 21) & 38055 0x80)); 38056 // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length) 38057 vmov(CurrentCond(), 38058 dt, 38059 QRegister(rd), 38060 imm); 38061 break; 38062 } 38063 case 0x00000e20: { 38064 // 0xef800e70 38065 if (((instr & 0x920) == 38066 0x100) || 38067 ((instr & 0x520) == 38068 0x100) || 38069 ((instr & 0x820) == 38070 0x20) || 38071 ((instr & 0x420) == 38072 0x20) || 38073 ((instr & 0x220) == 38074 0x20) || 38075 ((instr & 0x120) == 38076 0x120)) { 38077 UnallocatedT32(instr); 38078 return; 38079 } 38080 unsigned cmode = 38081 ((instr >> 8) & 0xf) | 38082 ((instr >> 1) & 0x10); 38083 DataType dt = 38084 ImmediateVmov::DecodeDt( 38085 cmode); 38086 if (dt.Is( 38087 kDataTypeValueInvalid)) { 38088 UnallocatedT32(instr); 38089 return; 38090 } 38091 if (((instr >> 12) & 1) != 38092 0) { 38093 UnallocatedT32(instr); 38094 return; 38095 } 38096 unsigned rd = 38097 ExtractQRegister(instr, 38098 22, 38099 12); 38100 QOperand imm = ImmediateVmov:: 38101 DecodeImmediate( 38102 cmode, 38103 (instr & 0xf) | 38104 ((instr >> 12) & 38105 0x70) | 38106 ((instr >> 21) & 38107 0x80)); 38108 // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length) 38109 vmov(CurrentCond(), 38110 dt, 38111 QRegister(rd), 38112 imm); 38113 break; 38114 } 38115 case 0x00000f00: { 38116 // 0xef800f50 38117 if (((instr & 0x920) == 38118 0x100) || 38119 ((instr & 0x520) == 38120 0x100) || 38121 ((instr & 0x820) == 38122 0x20) || 38123 ((instr & 0x420) == 38124 0x20) || 38125 ((instr & 0x220) == 38126 0x20) || 38127 ((instr & 0x120) == 38128 0x120)) { 38129 UnallocatedT32(instr); 38130 return; 38131 } 38132 unsigned cmode = 38133 ((instr >> 8) & 0xf) | 38134 ((instr >> 1) & 0x10); 38135 DataType dt = 38136 ImmediateVmov::DecodeDt( 38137 cmode); 38138 if (dt.Is( 38139 kDataTypeValueInvalid)) { 38140 UnallocatedT32(instr); 38141 return; 38142 } 38143 if (((instr >> 12) & 1) != 38144 0) { 38145 UnallocatedT32(instr); 38146 return; 38147 } 38148 unsigned rd = 38149 ExtractQRegister(instr, 38150 22, 38151 12); 38152 QOperand imm = ImmediateVmov:: 38153 DecodeImmediate( 38154 cmode, 38155 (instr & 0xf) | 38156 ((instr >> 12) & 38157 0x70) | 38158 ((instr >> 21) & 38159 0x80)); 38160 // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length) 38161 vmov(CurrentCond(), 38162 dt, 38163 QRegister(rd), 38164 imm); 38165 break; 38166 } 38167 default: 38168 UnallocatedT32(instr); 38169 break; 38170 } 38171 break; 38172 } 38173 default: { 38174 if (((instr & 0x920) == 0x100) || 38175 ((instr & 0x520) == 0x100) || 38176 ((instr & 0x820) == 0x20) || 38177 ((instr & 0x420) == 0x20) || 38178 ((instr & 0x220) == 0x20) || 38179 ((instr & 0x120) == 0x120)) { 38180 UnallocatedT32(instr); 38181 return; 38182 } 38183 unsigned cmode = 38184 ((instr >> 8) & 0xf) | 38185 ((instr >> 1) & 0x10); 38186 DataType dt = 38187 ImmediateVmov::DecodeDt( 38188 cmode); 38189 if (dt.Is( 38190 kDataTypeValueInvalid)) { 38191 UnallocatedT32(instr); 38192 return; 38193 } 38194 if (((instr >> 12) & 1) != 0) { 38195 UnallocatedT32(instr); 38196 return; 38197 } 38198 unsigned rd = 38199 ExtractQRegister(instr, 38200 22, 38201 12); 38202 QOperand imm = ImmediateVmov:: 38203 DecodeImmediate(cmode, 38204 (instr & 38205 0xf) | 38206 ((instr >> 38207 12) & 38208 0x70) | 38209 ((instr >> 38210 21) & 38211 0x80)); 38212 // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; T1 NOLINT(whitespace/line_length) 38213 vmov(CurrentCond(), 38214 dt, 38215 QRegister(rd), 38216 imm); 38217 break; 38218 } 38219 } 38220 break; 38221 } 38222 } 38223 break; 38224 } 38225 default: 38226 UnallocatedT32(instr); 38227 break; 38228 } 38229 break; 38230 } 38231 default: { 38232 if ((instr & 0x00000200) == 0x00000200) { 38233 if (((instr & 0x200000) == 0x0)) { 38234 UnallocatedT32(instr); 38235 return; 38236 } 38237 DataType dt1 = Dt_op_U_1_Decode1( 38238 ((instr >> 28) & 0x1) | 38239 ((instr >> 7) & 0x2)); 38240 if (dt1.Is(kDataTypeValueInvalid)) { 38241 UnallocatedT32(instr); 38242 return; 38243 } 38244 DataType dt2 = Dt_op_U_1_Decode2( 38245 ((instr >> 28) & 0x1) | 38246 ((instr >> 7) & 0x2)); 38247 if (dt2.Is(kDataTypeValueInvalid)) { 38248 UnallocatedT32(instr); 38249 return; 38250 } 38251 if (((instr >> 12) & 1) != 0) { 38252 UnallocatedT32(instr); 38253 return; 38254 } 38255 unsigned rd = 38256 ExtractQRegister(instr, 22, 12); 38257 if ((instr & 1) != 0) { 38258 UnallocatedT32(instr); 38259 return; 38260 } 38261 unsigned rm = ExtractQRegister(instr, 5, 0); 38262 uint32_t fbits = 38263 64 - ((instr >> 16) & 0x3f); 38264 // VCVT{<c>}{<q>}.<dt>.<dt> <Qd>, <Qm>, #<fbits> ; T1 NOLINT(whitespace/line_length) 38265 vcvt(CurrentCond(), 38266 dt1, 38267 dt2, 38268 QRegister(rd), 38269 QRegister(rm), 38270 fbits); 38271 } else { 38272 UnallocatedT32(instr); 38273 } 38274 break; 38275 } 38276 } 38277 break; 38278 } 38279 default: 38280 UnallocatedT32(instr); 38281 break; 38282 } 38283 break; 38284 } 38285 } 38286 break; 38287 } 38288 } 38289 break; 38290 } 38291 } 38292 break; 38293 } 38294 } 38295 break; 38296 } 38297 } 38298 break; 38299 } 38300 } 38301 } // NOLINT(readability/fn_size) 38302 38303 void Disassembler::DecodeA32(uint32_t instr) { 38304 A32CodeAddressIncrementer incrementer(&code_address_); 38305 if ((instr & 0xf0000000) == 0xf0000000) { 38306 switch (instr & 0x0e000000) { 38307 case 0x00000000: { 38308 // 0xf0000000 38309 switch (instr & 0x01f10020) { 38310 case 0x01000000: { 38311 // 0xf1000000 38312 switch (instr & 0x000e0000) { 38313 case 0x00020000: { 38314 // 0xf1020000 38315 if ((instr & 0x000001c0) == 0x00000000) { 38316 UnimplementedA32("CPS", instr); 38317 } else { 38318 UnallocatedA32(instr); 38319 } 38320 break; 38321 } 38322 case 0x00080000: { 38323 // 0xf1080000 38324 if ((instr & 0x0000001f) == 0x00000000) { 38325 UnimplementedA32("CPSIE", instr); 38326 } else { 38327 UnallocatedA32(instr); 38328 } 38329 break; 38330 } 38331 case 0x000a0000: { 38332 // 0xf10a0000 38333 UnimplementedA32("CPSIE", instr); 38334 break; 38335 } 38336 case 0x000c0000: { 38337 // 0xf10c0000 38338 if ((instr & 0x0000001f) == 0x00000000) { 38339 UnimplementedA32("CPSID", instr); 38340 } else { 38341 UnallocatedA32(instr); 38342 } 38343 break; 38344 } 38345 case 0x000e0000: { 38346 // 0xf10e0000 38347 UnimplementedA32("CPSID", instr); 38348 break; 38349 } 38350 default: 38351 UnallocatedA32(instr); 38352 break; 38353 } 38354 break; 38355 } 38356 case 0x01010000: { 38357 // 0xf1010000 38358 if ((instr & 0x000000d0) == 0x00000000) { 38359 UnimplementedA32("SETEND", instr); 38360 } else { 38361 UnallocatedA32(instr); 38362 } 38363 break; 38364 } 38365 default: 38366 UnallocatedA32(instr); 38367 break; 38368 } 38369 break; 38370 } 38371 case 0x02000000: { 38372 // 0xf2000000 38373 switch (instr & 0x00800010) { 38374 case 0x00000000: { 38375 // 0xf2000000 38376 switch (instr & 0x00000f40) { 38377 case 0x00000000: { 38378 // 0xf2000000 38379 DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) | 38380 ((instr >> 22) & 0x4)); 38381 if (dt.Is(kDataTypeValueInvalid)) { 38382 UnallocatedA32(instr); 38383 return; 38384 } 38385 unsigned rd = ExtractDRegister(instr, 22, 12); 38386 unsigned rn = ExtractDRegister(instr, 7, 16); 38387 unsigned rm = ExtractDRegister(instr, 5, 0); 38388 // VHADD{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1 38389 vhadd(al, dt, DRegister(rd), DRegister(rn), DRegister(rm)); 38390 break; 38391 } 38392 case 0x00000040: { 38393 // 0xf2000040 38394 DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) | 38395 ((instr >> 22) & 0x4)); 38396 if (dt.Is(kDataTypeValueInvalid)) { 38397 UnallocatedA32(instr); 38398 return; 38399 } 38400 if (((instr >> 12) & 1) != 0) { 38401 UnallocatedA32(instr); 38402 return; 38403 } 38404 unsigned rd = ExtractQRegister(instr, 22, 12); 38405 if (((instr >> 16) & 1) != 0) { 38406 UnallocatedA32(instr); 38407 return; 38408 } 38409 unsigned rn = ExtractQRegister(instr, 7, 16); 38410 if ((instr & 1) != 0) { 38411 UnallocatedA32(instr); 38412 return; 38413 } 38414 unsigned rm = ExtractQRegister(instr, 5, 0); 38415 // VHADD{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1 38416 vhadd(al, dt, QRegister(rd), QRegister(rn), QRegister(rm)); 38417 break; 38418 } 38419 case 0x00000100: { 38420 // 0xf2000100 38421 DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) | 38422 ((instr >> 22) & 0x4)); 38423 if (dt.Is(kDataTypeValueInvalid)) { 38424 UnallocatedA32(instr); 38425 return; 38426 } 38427 unsigned rd = ExtractDRegister(instr, 22, 12); 38428 unsigned rn = ExtractDRegister(instr, 7, 16); 38429 unsigned rm = ExtractDRegister(instr, 5, 0); 38430 // VRHADD{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1 38431 vrhadd(al, dt, DRegister(rd), DRegister(rn), DRegister(rm)); 38432 break; 38433 } 38434 case 0x00000140: { 38435 // 0xf2000140 38436 DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) | 38437 ((instr >> 22) & 0x4)); 38438 if (dt.Is(kDataTypeValueInvalid)) { 38439 UnallocatedA32(instr); 38440 return; 38441 } 38442 if (((instr >> 12) & 1) != 0) { 38443 UnallocatedA32(instr); 38444 return; 38445 } 38446 unsigned rd = ExtractQRegister(instr, 22, 12); 38447 if (((instr >> 16) & 1) != 0) { 38448 UnallocatedA32(instr); 38449 return; 38450 } 38451 unsigned rn = ExtractQRegister(instr, 7, 16); 38452 if ((instr & 1) != 0) { 38453 UnallocatedA32(instr); 38454 return; 38455 } 38456 unsigned rm = ExtractQRegister(instr, 5, 0); 38457 // VRHADD{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1 38458 vrhadd(al, dt, QRegister(rd), QRegister(rn), QRegister(rm)); 38459 break; 38460 } 38461 case 0x00000200: { 38462 // 0xf2000200 38463 DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) | 38464 ((instr >> 22) & 0x4)); 38465 if (dt.Is(kDataTypeValueInvalid)) { 38466 UnallocatedA32(instr); 38467 return; 38468 } 38469 unsigned rd = ExtractDRegister(instr, 22, 12); 38470 unsigned rn = ExtractDRegister(instr, 7, 16); 38471 unsigned rm = ExtractDRegister(instr, 5, 0); 38472 // VHSUB{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1 38473 vhsub(al, dt, DRegister(rd), DRegister(rn), DRegister(rm)); 38474 break; 38475 } 38476 case 0x00000240: { 38477 // 0xf2000240 38478 DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) | 38479 ((instr >> 22) & 0x4)); 38480 if (dt.Is(kDataTypeValueInvalid)) { 38481 UnallocatedA32(instr); 38482 return; 38483 } 38484 if (((instr >> 12) & 1) != 0) { 38485 UnallocatedA32(instr); 38486 return; 38487 } 38488 unsigned rd = ExtractQRegister(instr, 22, 12); 38489 if (((instr >> 16) & 1) != 0) { 38490 UnallocatedA32(instr); 38491 return; 38492 } 38493 unsigned rn = ExtractQRegister(instr, 7, 16); 38494 if ((instr & 1) != 0) { 38495 UnallocatedA32(instr); 38496 return; 38497 } 38498 unsigned rm = ExtractQRegister(instr, 5, 0); 38499 // VHSUB{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1 38500 vhsub(al, dt, QRegister(rd), QRegister(rn), QRegister(rm)); 38501 break; 38502 } 38503 case 0x00000300: { 38504 // 0xf2000300 38505 DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) | 38506 ((instr >> 22) & 0x4)); 38507 if (dt.Is(kDataTypeValueInvalid)) { 38508 UnallocatedA32(instr); 38509 return; 38510 } 38511 unsigned rd = ExtractDRegister(instr, 22, 12); 38512 unsigned rn = ExtractDRegister(instr, 7, 16); 38513 unsigned rm = ExtractDRegister(instr, 5, 0); 38514 // VCGT{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1 38515 vcgt(al, dt, DRegister(rd), DRegister(rn), DRegister(rm)); 38516 break; 38517 } 38518 case 0x00000340: { 38519 // 0xf2000340 38520 DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) | 38521 ((instr >> 22) & 0x4)); 38522 if (dt.Is(kDataTypeValueInvalid)) { 38523 UnallocatedA32(instr); 38524 return; 38525 } 38526 if (((instr >> 12) & 1) != 0) { 38527 UnallocatedA32(instr); 38528 return; 38529 } 38530 unsigned rd = ExtractQRegister(instr, 22, 12); 38531 if (((instr >> 16) & 1) != 0) { 38532 UnallocatedA32(instr); 38533 return; 38534 } 38535 unsigned rn = ExtractQRegister(instr, 7, 16); 38536 if ((instr & 1) != 0) { 38537 UnallocatedA32(instr); 38538 return; 38539 } 38540 unsigned rm = ExtractQRegister(instr, 5, 0); 38541 // VCGT{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1 38542 vcgt(al, dt, QRegister(rd), QRegister(rn), QRegister(rm)); 38543 break; 38544 } 38545 case 0x00000400: { 38546 // 0xf2000400 38547 DataType dt = Dt_U_size_3_Decode(((instr >> 20) & 0x3) | 38548 ((instr >> 22) & 0x4)); 38549 if (dt.Is(kDataTypeValueInvalid)) { 38550 UnallocatedA32(instr); 38551 return; 38552 } 38553 unsigned rd = ExtractDRegister(instr, 22, 12); 38554 unsigned rm = ExtractDRegister(instr, 5, 0); 38555 unsigned rn = ExtractDRegister(instr, 7, 16); 38556 // VSHL{<c>}{<q>}.<dt> {<Dd>}, <Dm>, <Dn> ; A1 38557 vshl(al, dt, DRegister(rd), DRegister(rm), DRegister(rn)); 38558 break; 38559 } 38560 case 0x00000440: { 38561 // 0xf2000440 38562 DataType dt = Dt_U_size_3_Decode(((instr >> 20) & 0x3) | 38563 ((instr >> 22) & 0x4)); 38564 if (dt.Is(kDataTypeValueInvalid)) { 38565 UnallocatedA32(instr); 38566 return; 38567 } 38568 if (((instr >> 12) & 1) != 0) { 38569 UnallocatedA32(instr); 38570 return; 38571 } 38572 unsigned rd = ExtractQRegister(instr, 22, 12); 38573 if ((instr & 1) != 0) { 38574 UnallocatedA32(instr); 38575 return; 38576 } 38577 unsigned rm = ExtractQRegister(instr, 5, 0); 38578 if (((instr >> 16) & 1) != 0) { 38579 UnallocatedA32(instr); 38580 return; 38581 } 38582 unsigned rn = ExtractQRegister(instr, 7, 16); 38583 // VSHL{<c>}{<q>}.<dt> {<Qd>}, <Qm>, <Qn> ; A1 38584 vshl(al, dt, QRegister(rd), QRegister(rm), QRegister(rn)); 38585 break; 38586 } 38587 case 0x00000500: { 38588 // 0xf2000500 38589 DataType dt = Dt_U_size_3_Decode(((instr >> 20) & 0x3) | 38590 ((instr >> 22) & 0x4)); 38591 if (dt.Is(kDataTypeValueInvalid)) { 38592 UnallocatedA32(instr); 38593 return; 38594 } 38595 unsigned rd = ExtractDRegister(instr, 22, 12); 38596 unsigned rm = ExtractDRegister(instr, 5, 0); 38597 unsigned rn = ExtractDRegister(instr, 7, 16); 38598 // VRSHL{<c>}{<q>}.<dt> {<Dd>}, <Dm>, <Dn> ; A1 38599 vrshl(al, dt, DRegister(rd), DRegister(rm), DRegister(rn)); 38600 break; 38601 } 38602 case 0x00000540: { 38603 // 0xf2000540 38604 DataType dt = Dt_U_size_3_Decode(((instr >> 20) & 0x3) | 38605 ((instr >> 22) & 0x4)); 38606 if (dt.Is(kDataTypeValueInvalid)) { 38607 UnallocatedA32(instr); 38608 return; 38609 } 38610 if (((instr >> 12) & 1) != 0) { 38611 UnallocatedA32(instr); 38612 return; 38613 } 38614 unsigned rd = ExtractQRegister(instr, 22, 12); 38615 if ((instr & 1) != 0) { 38616 UnallocatedA32(instr); 38617 return; 38618 } 38619 unsigned rm = ExtractQRegister(instr, 5, 0); 38620 if (((instr >> 16) & 1) != 0) { 38621 UnallocatedA32(instr); 38622 return; 38623 } 38624 unsigned rn = ExtractQRegister(instr, 7, 16); 38625 // VRSHL{<c>}{<q>}.<dt> {<Qd>}, <Qm>, <Qn> ; A1 38626 vrshl(al, dt, QRegister(rd), QRegister(rm), QRegister(rn)); 38627 break; 38628 } 38629 case 0x00000600: { 38630 // 0xf2000600 38631 DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) | 38632 ((instr >> 22) & 0x4)); 38633 if (dt.Is(kDataTypeValueInvalid)) { 38634 UnallocatedA32(instr); 38635 return; 38636 } 38637 unsigned rd = ExtractDRegister(instr, 22, 12); 38638 unsigned rn = ExtractDRegister(instr, 7, 16); 38639 unsigned rm = ExtractDRegister(instr, 5, 0); 38640 // VMAX{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1 38641 vmax(al, dt, DRegister(rd), DRegister(rn), DRegister(rm)); 38642 break; 38643 } 38644 case 0x00000640: { 38645 // 0xf2000640 38646 DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) | 38647 ((instr >> 22) & 0x4)); 38648 if (dt.Is(kDataTypeValueInvalid)) { 38649 UnallocatedA32(instr); 38650 return; 38651 } 38652 if (((instr >> 12) & 1) != 0) { 38653 UnallocatedA32(instr); 38654 return; 38655 } 38656 unsigned rd = ExtractQRegister(instr, 22, 12); 38657 if (((instr >> 16) & 1) != 0) { 38658 UnallocatedA32(instr); 38659 return; 38660 } 38661 unsigned rn = ExtractQRegister(instr, 7, 16); 38662 if ((instr & 1) != 0) { 38663 UnallocatedA32(instr); 38664 return; 38665 } 38666 unsigned rm = ExtractQRegister(instr, 5, 0); 38667 // VMAX{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1 38668 vmax(al, dt, QRegister(rd), QRegister(rn), QRegister(rm)); 38669 break; 38670 } 38671 case 0x00000700: { 38672 // 0xf2000700 38673 DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) | 38674 ((instr >> 22) & 0x4)); 38675 if (dt.Is(kDataTypeValueInvalid)) { 38676 UnallocatedA32(instr); 38677 return; 38678 } 38679 unsigned rd = ExtractDRegister(instr, 22, 12); 38680 unsigned rn = ExtractDRegister(instr, 7, 16); 38681 unsigned rm = ExtractDRegister(instr, 5, 0); 38682 // VABD{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1 38683 vabd(al, dt, DRegister(rd), DRegister(rn), DRegister(rm)); 38684 break; 38685 } 38686 case 0x00000740: { 38687 // 0xf2000740 38688 DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) | 38689 ((instr >> 22) & 0x4)); 38690 if (dt.Is(kDataTypeValueInvalid)) { 38691 UnallocatedA32(instr); 38692 return; 38693 } 38694 if (((instr >> 12) & 1) != 0) { 38695 UnallocatedA32(instr); 38696 return; 38697 } 38698 unsigned rd = ExtractQRegister(instr, 22, 12); 38699 if (((instr >> 16) & 1) != 0) { 38700 UnallocatedA32(instr); 38701 return; 38702 } 38703 unsigned rn = ExtractQRegister(instr, 7, 16); 38704 if ((instr & 1) != 0) { 38705 UnallocatedA32(instr); 38706 return; 38707 } 38708 unsigned rm = ExtractQRegister(instr, 5, 0); 38709 // VABD{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1 38710 vabd(al, dt, QRegister(rd), QRegister(rn), QRegister(rm)); 38711 break; 38712 } 38713 case 0x00000800: { 38714 // 0xf2000800 38715 switch (instr & 0x01000000) { 38716 case 0x00000000: { 38717 // 0xf2000800 38718 DataType dt = Dt_size_2_Decode((instr >> 20) & 0x3); 38719 if (dt.Is(kDataTypeValueInvalid)) { 38720 UnallocatedA32(instr); 38721 return; 38722 } 38723 unsigned rd = ExtractDRegister(instr, 22, 12); 38724 unsigned rn = ExtractDRegister(instr, 7, 16); 38725 unsigned rm = ExtractDRegister(instr, 5, 0); 38726 // VADD{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1 38727 vadd(al, dt, DRegister(rd), DRegister(rn), DRegister(rm)); 38728 break; 38729 } 38730 case 0x01000000: { 38731 // 0xf3000800 38732 DataType dt = Dt_size_2_Decode((instr >> 20) & 0x3); 38733 if (dt.Is(kDataTypeValueInvalid)) { 38734 UnallocatedA32(instr); 38735 return; 38736 } 38737 unsigned rd = ExtractDRegister(instr, 22, 12); 38738 unsigned rn = ExtractDRegister(instr, 7, 16); 38739 unsigned rm = ExtractDRegister(instr, 5, 0); 38740 // VSUB{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1 38741 vsub(al, dt, DRegister(rd), DRegister(rn), DRegister(rm)); 38742 break; 38743 } 38744 } 38745 break; 38746 } 38747 case 0x00000840: { 38748 // 0xf2000840 38749 switch (instr & 0x01000000) { 38750 case 0x00000000: { 38751 // 0xf2000840 38752 DataType dt = Dt_size_2_Decode((instr >> 20) & 0x3); 38753 if (dt.Is(kDataTypeValueInvalid)) { 38754 UnallocatedA32(instr); 38755 return; 38756 } 38757 if (((instr >> 12) & 1) != 0) { 38758 UnallocatedA32(instr); 38759 return; 38760 } 38761 unsigned rd = ExtractQRegister(instr, 22, 12); 38762 if (((instr >> 16) & 1) != 0) { 38763 UnallocatedA32(instr); 38764 return; 38765 } 38766 unsigned rn = ExtractQRegister(instr, 7, 16); 38767 if ((instr & 1) != 0) { 38768 UnallocatedA32(instr); 38769 return; 38770 } 38771 unsigned rm = ExtractQRegister(instr, 5, 0); 38772 // VADD{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1 38773 vadd(al, dt, QRegister(rd), QRegister(rn), QRegister(rm)); 38774 break; 38775 } 38776 case 0x01000000: { 38777 // 0xf3000840 38778 DataType dt = Dt_size_2_Decode((instr >> 20) & 0x3); 38779 if (dt.Is(kDataTypeValueInvalid)) { 38780 UnallocatedA32(instr); 38781 return; 38782 } 38783 if (((instr >> 12) & 1) != 0) { 38784 UnallocatedA32(instr); 38785 return; 38786 } 38787 unsigned rd = ExtractQRegister(instr, 22, 12); 38788 if (((instr >> 16) & 1) != 0) { 38789 UnallocatedA32(instr); 38790 return; 38791 } 38792 unsigned rn = ExtractQRegister(instr, 7, 16); 38793 if ((instr & 1) != 0) { 38794 UnallocatedA32(instr); 38795 return; 38796 } 38797 unsigned rm = ExtractQRegister(instr, 5, 0); 38798 // VSUB{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1 38799 vsub(al, dt, QRegister(rd), QRegister(rn), QRegister(rm)); 38800 break; 38801 } 38802 } 38803 break; 38804 } 38805 case 0x00000900: { 38806 // 0xf2000900 38807 switch (instr & 0x01000000) { 38808 case 0x00000000: { 38809 // 0xf2000900 38810 DataType dt = Dt_size_10_Decode((instr >> 20) & 0x3); 38811 if (dt.Is(kDataTypeValueInvalid)) { 38812 UnallocatedA32(instr); 38813 return; 38814 } 38815 unsigned rd = ExtractDRegister(instr, 22, 12); 38816 unsigned rn = ExtractDRegister(instr, 7, 16); 38817 unsigned rm = ExtractDRegister(instr, 5, 0); 38818 // VMLA{<c>}{<q>}.<type><size> <Dd>, <Dn>, <Dm> ; A1 38819 vmla(al, dt, DRegister(rd), DRegister(rn), DRegister(rm)); 38820 break; 38821 } 38822 case 0x01000000: { 38823 // 0xf3000900 38824 DataType dt = Dt_size_10_Decode((instr >> 20) & 0x3); 38825 if (dt.Is(kDataTypeValueInvalid)) { 38826 UnallocatedA32(instr); 38827 return; 38828 } 38829 unsigned rd = ExtractDRegister(instr, 22, 12); 38830 unsigned rn = ExtractDRegister(instr, 7, 16); 38831 unsigned rm = ExtractDRegister(instr, 5, 0); 38832 // VMLS{<c>}{<q>}.<type><size> <Dd>, <Dn>, <Dm> ; A1 38833 vmls(al, dt, DRegister(rd), DRegister(rn), DRegister(rm)); 38834 break; 38835 } 38836 } 38837 break; 38838 } 38839 case 0x00000940: { 38840 // 0xf2000940 38841 switch (instr & 0x01000000) { 38842 case 0x00000000: { 38843 // 0xf2000940 38844 DataType dt = Dt_size_10_Decode((instr >> 20) & 0x3); 38845 if (dt.Is(kDataTypeValueInvalid)) { 38846 UnallocatedA32(instr); 38847 return; 38848 } 38849 if (((instr >> 12) & 1) != 0) { 38850 UnallocatedA32(instr); 38851 return; 38852 } 38853 unsigned rd = ExtractQRegister(instr, 22, 12); 38854 if (((instr >> 16) & 1) != 0) { 38855 UnallocatedA32(instr); 38856 return; 38857 } 38858 unsigned rn = ExtractQRegister(instr, 7, 16); 38859 if ((instr & 1) != 0) { 38860 UnallocatedA32(instr); 38861 return; 38862 } 38863 unsigned rm = ExtractQRegister(instr, 5, 0); 38864 // VMLA{<c>}{<q>}.<type><size> <Qd>, <Qn>, <Qm> ; A1 38865 vmla(al, dt, QRegister(rd), QRegister(rn), QRegister(rm)); 38866 break; 38867 } 38868 case 0x01000000: { 38869 // 0xf3000940 38870 DataType dt = Dt_size_10_Decode((instr >> 20) & 0x3); 38871 if (dt.Is(kDataTypeValueInvalid)) { 38872 UnallocatedA32(instr); 38873 return; 38874 } 38875 if (((instr >> 12) & 1) != 0) { 38876 UnallocatedA32(instr); 38877 return; 38878 } 38879 unsigned rd = ExtractQRegister(instr, 22, 12); 38880 if (((instr >> 16) & 1) != 0) { 38881 UnallocatedA32(instr); 38882 return; 38883 } 38884 unsigned rn = ExtractQRegister(instr, 7, 16); 38885 if ((instr & 1) != 0) { 38886 UnallocatedA32(instr); 38887 return; 38888 } 38889 unsigned rm = ExtractQRegister(instr, 5, 0); 38890 // VMLS{<c>}{<q>}.<type><size> <Qd>, <Qn>, <Qm> ; A1 38891 vmls(al, dt, QRegister(rd), QRegister(rn), QRegister(rm)); 38892 break; 38893 } 38894 } 38895 break; 38896 } 38897 case 0x00000a00: { 38898 // 0xf2000a00 38899 DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) | 38900 ((instr >> 22) & 0x4)); 38901 if (dt.Is(kDataTypeValueInvalid)) { 38902 UnallocatedA32(instr); 38903 return; 38904 } 38905 unsigned rd = ExtractDRegister(instr, 22, 12); 38906 unsigned rn = ExtractDRegister(instr, 7, 16); 38907 unsigned rm = ExtractDRegister(instr, 5, 0); 38908 // VPMAX{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1 38909 vpmax(al, dt, DRegister(rd), DRegister(rn), DRegister(rm)); 38910 break; 38911 } 38912 case 0x00000b00: { 38913 // 0xf2000b00 38914 switch (instr & 0x01000000) { 38915 case 0x00000000: { 38916 // 0xf2000b00 38917 DataType dt = Dt_size_13_Decode((instr >> 20) & 0x3); 38918 if (dt.Is(kDataTypeValueInvalid)) { 38919 UnallocatedA32(instr); 38920 return; 38921 } 38922 unsigned rd = ExtractDRegister(instr, 22, 12); 38923 unsigned rn = ExtractDRegister(instr, 7, 16); 38924 unsigned rm = ExtractDRegister(instr, 5, 0); 38925 // VQDMULH{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1 38926 vqdmulh(al, 38927 dt, 38928 DRegister(rd), 38929 DRegister(rn), 38930 DRegister(rm)); 38931 break; 38932 } 38933 case 0x01000000: { 38934 // 0xf3000b00 38935 DataType dt = Dt_size_13_Decode((instr >> 20) & 0x3); 38936 if (dt.Is(kDataTypeValueInvalid)) { 38937 UnallocatedA32(instr); 38938 return; 38939 } 38940 unsigned rd = ExtractDRegister(instr, 22, 12); 38941 unsigned rn = ExtractDRegister(instr, 7, 16); 38942 unsigned rm = ExtractDRegister(instr, 5, 0); 38943 // VQRDMULH{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1 38944 vqrdmulh(al, 38945 dt, 38946 DRegister(rd), 38947 DRegister(rn), 38948 DRegister(rm)); 38949 break; 38950 } 38951 } 38952 break; 38953 } 38954 case 0x00000b40: { 38955 // 0xf2000b40 38956 switch (instr & 0x01000000) { 38957 case 0x00000000: { 38958 // 0xf2000b40 38959 DataType dt = Dt_size_13_Decode((instr >> 20) & 0x3); 38960 if (dt.Is(kDataTypeValueInvalid)) { 38961 UnallocatedA32(instr); 38962 return; 38963 } 38964 if (((instr >> 12) & 1) != 0) { 38965 UnallocatedA32(instr); 38966 return; 38967 } 38968 unsigned rd = ExtractQRegister(instr, 22, 12); 38969 if (((instr >> 16) & 1) != 0) { 38970 UnallocatedA32(instr); 38971 return; 38972 } 38973 unsigned rn = ExtractQRegister(instr, 7, 16); 38974 if ((instr & 1) != 0) { 38975 UnallocatedA32(instr); 38976 return; 38977 } 38978 unsigned rm = ExtractQRegister(instr, 5, 0); 38979 // VQDMULH{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1 38980 vqdmulh(al, 38981 dt, 38982 QRegister(rd), 38983 QRegister(rn), 38984 QRegister(rm)); 38985 break; 38986 } 38987 case 0x01000000: { 38988 // 0xf3000b40 38989 DataType dt = Dt_size_13_Decode((instr >> 20) & 0x3); 38990 if (dt.Is(kDataTypeValueInvalid)) { 38991 UnallocatedA32(instr); 38992 return; 38993 } 38994 if (((instr >> 12) & 1) != 0) { 38995 UnallocatedA32(instr); 38996 return; 38997 } 38998 unsigned rd = ExtractQRegister(instr, 22, 12); 38999 if (((instr >> 16) & 1) != 0) { 39000 UnallocatedA32(instr); 39001 return; 39002 } 39003 unsigned rn = ExtractQRegister(instr, 7, 16); 39004 if ((instr & 1) != 0) { 39005 UnallocatedA32(instr); 39006 return; 39007 } 39008 unsigned rm = ExtractQRegister(instr, 5, 0); 39009 // VQRDMULH{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1 39010 vqrdmulh(al, 39011 dt, 39012 QRegister(rd), 39013 QRegister(rn), 39014 QRegister(rm)); 39015 break; 39016 } 39017 } 39018 break; 39019 } 39020 case 0x00000c40: { 39021 // 0xf2000c40 39022 switch (instr & 0x01300000) { 39023 case 0x00000000: { 39024 // 0xf2000c40 39025 UnimplementedA32("SHA1C", instr); 39026 break; 39027 } 39028 case 0x00100000: { 39029 // 0xf2100c40 39030 UnimplementedA32("SHA1P", instr); 39031 break; 39032 } 39033 case 0x00200000: { 39034 // 0xf2200c40 39035 UnimplementedA32("SHA1M", instr); 39036 break; 39037 } 39038 case 0x00300000: { 39039 // 0xf2300c40 39040 UnimplementedA32("SHA1SU0", instr); 39041 break; 39042 } 39043 case 0x01000000: { 39044 // 0xf3000c40 39045 UnimplementedA32("SHA256H", instr); 39046 break; 39047 } 39048 case 0x01100000: { 39049 // 0xf3100c40 39050 UnimplementedA32("SHA256H2", instr); 39051 break; 39052 } 39053 case 0x01200000: { 39054 // 0xf3200c40 39055 UnimplementedA32("SHA256SU1", instr); 39056 break; 39057 } 39058 default: 39059 UnallocatedA32(instr); 39060 break; 39061 } 39062 break; 39063 } 39064 case 0x00000d00: { 39065 // 0xf2000d00 39066 switch (instr & 0x01300000) { 39067 case 0x00000000: { 39068 // 0xf2000d00 39069 unsigned rd = ExtractDRegister(instr, 22, 12); 39070 unsigned rn = ExtractDRegister(instr, 7, 16); 39071 unsigned rm = ExtractDRegister(instr, 5, 0); 39072 // VADD{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A1 39073 vadd(al, F32, DRegister(rd), DRegister(rn), DRegister(rm)); 39074 break; 39075 } 39076 case 0x00200000: { 39077 // 0xf2200d00 39078 unsigned rd = ExtractDRegister(instr, 22, 12); 39079 unsigned rn = ExtractDRegister(instr, 7, 16); 39080 unsigned rm = ExtractDRegister(instr, 5, 0); 39081 // VSUB{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A1 39082 vsub(al, F32, DRegister(rd), DRegister(rn), DRegister(rm)); 39083 break; 39084 } 39085 case 0x01000000: { 39086 // 0xf3000d00 39087 unsigned rd = ExtractDRegister(instr, 22, 12); 39088 unsigned rn = ExtractDRegister(instr, 7, 16); 39089 unsigned rm = ExtractDRegister(instr, 5, 0); 39090 // VPADD{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A1 39091 vpadd(al, F32, DRegister(rd), DRegister(rn), DRegister(rm)); 39092 break; 39093 } 39094 case 0x01200000: { 39095 // 0xf3200d00 39096 unsigned rd = ExtractDRegister(instr, 22, 12); 39097 unsigned rn = ExtractDRegister(instr, 7, 16); 39098 unsigned rm = ExtractDRegister(instr, 5, 0); 39099 // VABD{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A1 39100 vabd(al, F32, DRegister(rd), DRegister(rn), DRegister(rm)); 39101 break; 39102 } 39103 default: 39104 UnallocatedA32(instr); 39105 break; 39106 } 39107 break; 39108 } 39109 case 0x00000d40: { 39110 // 0xf2000d40 39111 switch (instr & 0x01300000) { 39112 case 0x00000000: { 39113 // 0xf2000d40 39114 if (((instr >> 12) & 1) != 0) { 39115 UnallocatedA32(instr); 39116 return; 39117 } 39118 unsigned rd = ExtractQRegister(instr, 22, 12); 39119 if (((instr >> 16) & 1) != 0) { 39120 UnallocatedA32(instr); 39121 return; 39122 } 39123 unsigned rn = ExtractQRegister(instr, 7, 16); 39124 if ((instr & 1) != 0) { 39125 UnallocatedA32(instr); 39126 return; 39127 } 39128 unsigned rm = ExtractQRegister(instr, 5, 0); 39129 // VADD{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; A1 39130 vadd(al, F32, QRegister(rd), QRegister(rn), QRegister(rm)); 39131 break; 39132 } 39133 case 0x00200000: { 39134 // 0xf2200d40 39135 if (((instr >> 12) & 1) != 0) { 39136 UnallocatedA32(instr); 39137 return; 39138 } 39139 unsigned rd = ExtractQRegister(instr, 22, 12); 39140 if (((instr >> 16) & 1) != 0) { 39141 UnallocatedA32(instr); 39142 return; 39143 } 39144 unsigned rn = ExtractQRegister(instr, 7, 16); 39145 if ((instr & 1) != 0) { 39146 UnallocatedA32(instr); 39147 return; 39148 } 39149 unsigned rm = ExtractQRegister(instr, 5, 0); 39150 // VSUB{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; A1 39151 vsub(al, F32, QRegister(rd), QRegister(rn), QRegister(rm)); 39152 break; 39153 } 39154 case 0x01200000: { 39155 // 0xf3200d40 39156 if (((instr >> 12) & 1) != 0) { 39157 UnallocatedA32(instr); 39158 return; 39159 } 39160 unsigned rd = ExtractQRegister(instr, 22, 12); 39161 if (((instr >> 16) & 1) != 0) { 39162 UnallocatedA32(instr); 39163 return; 39164 } 39165 unsigned rn = ExtractQRegister(instr, 7, 16); 39166 if ((instr & 1) != 0) { 39167 UnallocatedA32(instr); 39168 return; 39169 } 39170 unsigned rm = ExtractQRegister(instr, 5, 0); 39171 // VABD{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; A1 39172 vabd(al, F32, QRegister(rd), QRegister(rn), QRegister(rm)); 39173 break; 39174 } 39175 default: 39176 UnallocatedA32(instr); 39177 break; 39178 } 39179 break; 39180 } 39181 case 0x00000e00: { 39182 // 0xf2000e00 39183 switch (instr & 0x01200000) { 39184 case 0x00000000: { 39185 // 0xf2000e00 39186 DataType dt = Dt_sz_1_Decode((instr >> 20) & 0x1); 39187 if (dt.Is(kDataTypeValueInvalid)) { 39188 UnallocatedA32(instr); 39189 return; 39190 } 39191 unsigned rd = ExtractDRegister(instr, 22, 12); 39192 unsigned rn = ExtractDRegister(instr, 7, 16); 39193 unsigned rm = ExtractDRegister(instr, 5, 0); 39194 // VCEQ{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A2 39195 vceq(al, dt, DRegister(rd), DRegister(rn), DRegister(rm)); 39196 break; 39197 } 39198 case 0x01000000: { 39199 // 0xf3000e00 39200 if ((instr & 0x00100000) == 0x00000000) { 39201 unsigned rd = ExtractDRegister(instr, 22, 12); 39202 unsigned rn = ExtractDRegister(instr, 7, 16); 39203 unsigned rm = ExtractDRegister(instr, 5, 0); 39204 // VCGE{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A2 39205 vcge(al, 39206 F32, 39207 DRegister(rd), 39208 DRegister(rn), 39209 DRegister(rm)); 39210 } else { 39211 UnallocatedA32(instr); 39212 } 39213 break; 39214 } 39215 case 0x01200000: { 39216 // 0xf3200e00 39217 if ((instr & 0x00100000) == 0x00000000) { 39218 unsigned rd = ExtractDRegister(instr, 22, 12); 39219 unsigned rn = ExtractDRegister(instr, 7, 16); 39220 unsigned rm = ExtractDRegister(instr, 5, 0); 39221 // VCGT{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A2 39222 vcgt(al, 39223 F32, 39224 DRegister(rd), 39225 DRegister(rn), 39226 DRegister(rm)); 39227 } else { 39228 UnallocatedA32(instr); 39229 } 39230 break; 39231 } 39232 default: 39233 UnallocatedA32(instr); 39234 break; 39235 } 39236 break; 39237 } 39238 case 0x00000e40: { 39239 // 0xf2000e40 39240 switch (instr & 0x01200000) { 39241 case 0x00000000: { 39242 // 0xf2000e40 39243 DataType dt = Dt_sz_1_Decode((instr >> 20) & 0x1); 39244 if (dt.Is(kDataTypeValueInvalid)) { 39245 UnallocatedA32(instr); 39246 return; 39247 } 39248 if (((instr >> 12) & 1) != 0) { 39249 UnallocatedA32(instr); 39250 return; 39251 } 39252 unsigned rd = ExtractQRegister(instr, 22, 12); 39253 if (((instr >> 16) & 1) != 0) { 39254 UnallocatedA32(instr); 39255 return; 39256 } 39257 unsigned rn = ExtractQRegister(instr, 7, 16); 39258 if ((instr & 1) != 0) { 39259 UnallocatedA32(instr); 39260 return; 39261 } 39262 unsigned rm = ExtractQRegister(instr, 5, 0); 39263 // VCEQ{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A2 39264 vceq(al, dt, QRegister(rd), QRegister(rn), QRegister(rm)); 39265 break; 39266 } 39267 case 0x01000000: { 39268 // 0xf3000e40 39269 if ((instr & 0x00100000) == 0x00000000) { 39270 if (((instr >> 12) & 1) != 0) { 39271 UnallocatedA32(instr); 39272 return; 39273 } 39274 unsigned rd = ExtractQRegister(instr, 22, 12); 39275 if (((instr >> 16) & 1) != 0) { 39276 UnallocatedA32(instr); 39277 return; 39278 } 39279 unsigned rn = ExtractQRegister(instr, 7, 16); 39280 if ((instr & 1) != 0) { 39281 UnallocatedA32(instr); 39282 return; 39283 } 39284 unsigned rm = ExtractQRegister(instr, 5, 0); 39285 // VCGE{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; A2 39286 vcge(al, 39287 F32, 39288 QRegister(rd), 39289 QRegister(rn), 39290 QRegister(rm)); 39291 } else { 39292 UnallocatedA32(instr); 39293 } 39294 break; 39295 } 39296 case 0x01200000: { 39297 // 0xf3200e40 39298 if ((instr & 0x00100000) == 0x00000000) { 39299 if (((instr >> 12) & 1) != 0) { 39300 UnallocatedA32(instr); 39301 return; 39302 } 39303 unsigned rd = ExtractQRegister(instr, 22, 12); 39304 if (((instr >> 16) & 1) != 0) { 39305 UnallocatedA32(instr); 39306 return; 39307 } 39308 unsigned rn = ExtractQRegister(instr, 7, 16); 39309 if ((instr & 1) != 0) { 39310 UnallocatedA32(instr); 39311 return; 39312 } 39313 unsigned rm = ExtractQRegister(instr, 5, 0); 39314 // VCGT{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; A2 39315 vcgt(al, 39316 F32, 39317 QRegister(rd), 39318 QRegister(rn), 39319 QRegister(rm)); 39320 } else { 39321 UnallocatedA32(instr); 39322 } 39323 break; 39324 } 39325 default: 39326 UnallocatedA32(instr); 39327 break; 39328 } 39329 break; 39330 } 39331 case 0x00000f00: { 39332 // 0xf2000f00 39333 switch (instr & 0x01300000) { 39334 case 0x00000000: { 39335 // 0xf2000f00 39336 unsigned rd = ExtractDRegister(instr, 22, 12); 39337 unsigned rn = ExtractDRegister(instr, 7, 16); 39338 unsigned rm = ExtractDRegister(instr, 5, 0); 39339 // VMAX{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A1 39340 vmax(al, F32, DRegister(rd), DRegister(rn), DRegister(rm)); 39341 break; 39342 } 39343 case 0x00200000: { 39344 // 0xf2200f00 39345 unsigned rd = ExtractDRegister(instr, 22, 12); 39346 unsigned rn = ExtractDRegister(instr, 7, 16); 39347 unsigned rm = ExtractDRegister(instr, 5, 0); 39348 // VMIN{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A1 39349 vmin(al, F32, DRegister(rd), DRegister(rn), DRegister(rm)); 39350 break; 39351 } 39352 case 0x01000000: { 39353 // 0xf3000f00 39354 unsigned rd = ExtractDRegister(instr, 22, 12); 39355 unsigned rn = ExtractDRegister(instr, 7, 16); 39356 unsigned rm = ExtractDRegister(instr, 5, 0); 39357 // VPMAX{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A1 39358 vpmax(al, F32, DRegister(rd), DRegister(rn), DRegister(rm)); 39359 break; 39360 } 39361 case 0x01200000: { 39362 // 0xf3200f00 39363 unsigned rd = ExtractDRegister(instr, 22, 12); 39364 unsigned rn = ExtractDRegister(instr, 7, 16); 39365 unsigned rm = ExtractDRegister(instr, 5, 0); 39366 // VPMIN{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A1 39367 vpmin(al, F32, DRegister(rd), DRegister(rn), DRegister(rm)); 39368 break; 39369 } 39370 default: 39371 UnallocatedA32(instr); 39372 break; 39373 } 39374 break; 39375 } 39376 case 0x00000f40: { 39377 // 0xf2000f40 39378 switch (instr & 0x01300000) { 39379 case 0x00000000: { 39380 // 0xf2000f40 39381 if (((instr >> 12) & 1) != 0) { 39382 UnallocatedA32(instr); 39383 return; 39384 } 39385 unsigned rd = ExtractQRegister(instr, 22, 12); 39386 if (((instr >> 16) & 1) != 0) { 39387 UnallocatedA32(instr); 39388 return; 39389 } 39390 unsigned rn = ExtractQRegister(instr, 7, 16); 39391 if ((instr & 1) != 0) { 39392 UnallocatedA32(instr); 39393 return; 39394 } 39395 unsigned rm = ExtractQRegister(instr, 5, 0); 39396 // VMAX{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; A1 39397 vmax(al, F32, QRegister(rd), QRegister(rn), QRegister(rm)); 39398 break; 39399 } 39400 case 0x00200000: { 39401 // 0xf2200f40 39402 if (((instr >> 12) & 1) != 0) { 39403 UnallocatedA32(instr); 39404 return; 39405 } 39406 unsigned rd = ExtractQRegister(instr, 22, 12); 39407 if (((instr >> 16) & 1) != 0) { 39408 UnallocatedA32(instr); 39409 return; 39410 } 39411 unsigned rn = ExtractQRegister(instr, 7, 16); 39412 if ((instr & 1) != 0) { 39413 UnallocatedA32(instr); 39414 return; 39415 } 39416 unsigned rm = ExtractQRegister(instr, 5, 0); 39417 // VMIN{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; A1 39418 vmin(al, F32, QRegister(rd), QRegister(rn), QRegister(rm)); 39419 break; 39420 } 39421 default: 39422 UnallocatedA32(instr); 39423 break; 39424 } 39425 break; 39426 } 39427 default: 39428 UnallocatedA32(instr); 39429 break; 39430 } 39431 break; 39432 } 39433 case 0x00000010: { 39434 // 0xf2000010 39435 switch (instr & 0x00000f40) { 39436 case 0x00000000: { 39437 // 0xf2000010 39438 DataType dt = Dt_U_size_3_Decode(((instr >> 20) & 0x3) | 39439 ((instr >> 22) & 0x4)); 39440 if (dt.Is(kDataTypeValueInvalid)) { 39441 UnallocatedA32(instr); 39442 return; 39443 } 39444 unsigned rd = ExtractDRegister(instr, 22, 12); 39445 unsigned rn = ExtractDRegister(instr, 7, 16); 39446 unsigned rm = ExtractDRegister(instr, 5, 0); 39447 // VQADD{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1 39448 vqadd(al, dt, DRegister(rd), DRegister(rn), DRegister(rm)); 39449 break; 39450 } 39451 case 0x00000040: { 39452 // 0xf2000050 39453 DataType dt = Dt_U_size_3_Decode(((instr >> 20) & 0x3) | 39454 ((instr >> 22) & 0x4)); 39455 if (dt.Is(kDataTypeValueInvalid)) { 39456 UnallocatedA32(instr); 39457 return; 39458 } 39459 if (((instr >> 12) & 1) != 0) { 39460 UnallocatedA32(instr); 39461 return; 39462 } 39463 unsigned rd = ExtractQRegister(instr, 22, 12); 39464 if (((instr >> 16) & 1) != 0) { 39465 UnallocatedA32(instr); 39466 return; 39467 } 39468 unsigned rn = ExtractQRegister(instr, 7, 16); 39469 if ((instr & 1) != 0) { 39470 UnallocatedA32(instr); 39471 return; 39472 } 39473 unsigned rm = ExtractQRegister(instr, 5, 0); 39474 // VQADD{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1 39475 vqadd(al, dt, QRegister(rd), QRegister(rn), QRegister(rm)); 39476 break; 39477 } 39478 case 0x00000100: { 39479 // 0xf2000110 39480 switch (instr & 0x01300000) { 39481 case 0x00000000: { 39482 // 0xf2000110 39483 unsigned rd = ExtractDRegister(instr, 22, 12); 39484 unsigned rn = ExtractDRegister(instr, 7, 16); 39485 unsigned rm = ExtractDRegister(instr, 5, 0); 39486 // VAND{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; A1 39487 vand(al, 39488 kDataTypeValueNone, 39489 DRegister(rd), 39490 DRegister(rn), 39491 DRegister(rm)); 39492 break; 39493 } 39494 case 0x00100000: { 39495 // 0xf2100110 39496 unsigned rd = ExtractDRegister(instr, 22, 12); 39497 unsigned rn = ExtractDRegister(instr, 7, 16); 39498 unsigned rm = ExtractDRegister(instr, 5, 0); 39499 // VBIC{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; A1 39500 vbic(al, 39501 kDataTypeValueNone, 39502 DRegister(rd), 39503 DRegister(rn), 39504 DRegister(rm)); 39505 break; 39506 } 39507 case 0x00200000: { 39508 // 0xf2200110 39509 if (((instr & 0x00000040) == 0x00000000) && 39510 ((((Uint32((instr >> 7)) & Uint32(0x1)) << 4) | 39511 (Uint32((instr >> 16)) & Uint32(0xf))) == 39512 (((Uint32((instr >> 5)) & Uint32(0x1)) << 4) | 39513 (Uint32(instr) & Uint32(0xf))))) { 39514 unsigned rd = ExtractDRegister(instr, 22, 12); 39515 unsigned rm = ExtractDRegister(instr, 7, 16); 39516 // VMOV{<c>}{<q>}{.<dt>} <Dd>, <Dm> ; A1 39517 vmov(al, 39518 kDataTypeValueNone, 39519 DRegister(rd), 39520 DRegister(rm)); 39521 return; 39522 } 39523 unsigned rd = ExtractDRegister(instr, 22, 12); 39524 unsigned rn = ExtractDRegister(instr, 7, 16); 39525 unsigned rm = ExtractDRegister(instr, 5, 0); 39526 // VORR{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; A1 39527 vorr(al, 39528 kDataTypeValueNone, 39529 DRegister(rd), 39530 DRegister(rn), 39531 DRegister(rm)); 39532 break; 39533 } 39534 case 0x00300000: { 39535 // 0xf2300110 39536 unsigned rd = ExtractDRegister(instr, 22, 12); 39537 unsigned rn = ExtractDRegister(instr, 7, 16); 39538 unsigned rm = ExtractDRegister(instr, 5, 0); 39539 // VORN{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; A1 39540 vorn(al, 39541 kDataTypeValueNone, 39542 DRegister(rd), 39543 DRegister(rn), 39544 DRegister(rm)); 39545 break; 39546 } 39547 case 0x01000000: { 39548 // 0xf3000110 39549 unsigned rd = ExtractDRegister(instr, 22, 12); 39550 unsigned rn = ExtractDRegister(instr, 7, 16); 39551 unsigned rm = ExtractDRegister(instr, 5, 0); 39552 // VEOR{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; A1 39553 veor(al, 39554 kDataTypeValueNone, 39555 DRegister(rd), 39556 DRegister(rn), 39557 DRegister(rm)); 39558 break; 39559 } 39560 case 0x01100000: { 39561 // 0xf3100110 39562 unsigned rd = ExtractDRegister(instr, 22, 12); 39563 unsigned rn = ExtractDRegister(instr, 7, 16); 39564 unsigned rm = ExtractDRegister(instr, 5, 0); 39565 // VBSL{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; A1 39566 vbsl(al, 39567 kDataTypeValueNone, 39568 DRegister(rd), 39569 DRegister(rn), 39570 DRegister(rm)); 39571 break; 39572 } 39573 case 0x01200000: { 39574 // 0xf3200110 39575 unsigned rd = ExtractDRegister(instr, 22, 12); 39576 unsigned rn = ExtractDRegister(instr, 7, 16); 39577 unsigned rm = ExtractDRegister(instr, 5, 0); 39578 // VBIT{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; A1 39579 vbit(al, 39580 kDataTypeValueNone, 39581 DRegister(rd), 39582 DRegister(rn), 39583 DRegister(rm)); 39584 break; 39585 } 39586 case 0x01300000: { 39587 // 0xf3300110 39588 unsigned rd = ExtractDRegister(instr, 22, 12); 39589 unsigned rn = ExtractDRegister(instr, 7, 16); 39590 unsigned rm = ExtractDRegister(instr, 5, 0); 39591 // VBIF{<c>}{<q>}{.<dt>} {<Dd>}, <Dn>, <Dm> ; A1 39592 vbif(al, 39593 kDataTypeValueNone, 39594 DRegister(rd), 39595 DRegister(rn), 39596 DRegister(rm)); 39597 break; 39598 } 39599 } 39600 break; 39601 } 39602 case 0x00000140: { 39603 // 0xf2000150 39604 switch (instr & 0x01300000) { 39605 case 0x00000000: { 39606 // 0xf2000150 39607 if (((instr >> 12) & 1) != 0) { 39608 UnallocatedA32(instr); 39609 return; 39610 } 39611 unsigned rd = ExtractQRegister(instr, 22, 12); 39612 if (((instr >> 16) & 1) != 0) { 39613 UnallocatedA32(instr); 39614 return; 39615 } 39616 unsigned rn = ExtractQRegister(instr, 7, 16); 39617 if ((instr & 1) != 0) { 39618 UnallocatedA32(instr); 39619 return; 39620 } 39621 unsigned rm = ExtractQRegister(instr, 5, 0); 39622 // VAND{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; A1 39623 vand(al, 39624 kDataTypeValueNone, 39625 QRegister(rd), 39626 QRegister(rn), 39627 QRegister(rm)); 39628 break; 39629 } 39630 case 0x00100000: { 39631 // 0xf2100150 39632 if (((instr >> 12) & 1) != 0) { 39633 UnallocatedA32(instr); 39634 return; 39635 } 39636 unsigned rd = ExtractQRegister(instr, 22, 12); 39637 if (((instr >> 16) & 1) != 0) { 39638 UnallocatedA32(instr); 39639 return; 39640 } 39641 unsigned rn = ExtractQRegister(instr, 7, 16); 39642 if ((instr & 1) != 0) { 39643 UnallocatedA32(instr); 39644 return; 39645 } 39646 unsigned rm = ExtractQRegister(instr, 5, 0); 39647 // VBIC{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; A1 39648 vbic(al, 39649 kDataTypeValueNone, 39650 QRegister(rd), 39651 QRegister(rn), 39652 QRegister(rm)); 39653 break; 39654 } 39655 case 0x00200000: { 39656 // 0xf2200150 39657 if (((instr & 0x00000040) == 0x00000040) && 39658 ((((Uint32((instr >> 7)) & Uint32(0x1)) << 4) | 39659 (Uint32((instr >> 16)) & Uint32(0xf))) == 39660 (((Uint32((instr >> 5)) & Uint32(0x1)) << 4) | 39661 (Uint32(instr) & Uint32(0xf))))) { 39662 if (((instr >> 12) & 1) != 0) { 39663 UnallocatedA32(instr); 39664 return; 39665 } 39666 unsigned rd = ExtractQRegister(instr, 22, 12); 39667 if (((instr >> 16) & 1) != 0) { 39668 UnallocatedA32(instr); 39669 return; 39670 } 39671 unsigned rm = ExtractQRegister(instr, 7, 16); 39672 // VMOV{<c>}{<q>}{.<dt>} <Qd>, <Qm> ; A1 39673 vmov(al, 39674 kDataTypeValueNone, 39675 QRegister(rd), 39676 QRegister(rm)); 39677 return; 39678 } 39679 if (((instr >> 12) & 1) != 0) { 39680 UnallocatedA32(instr); 39681 return; 39682 } 39683 unsigned rd = ExtractQRegister(instr, 22, 12); 39684 if (((instr >> 16) & 1) != 0) { 39685 UnallocatedA32(instr); 39686 return; 39687 } 39688 unsigned rn = ExtractQRegister(instr, 7, 16); 39689 if ((instr & 1) != 0) { 39690 UnallocatedA32(instr); 39691 return; 39692 } 39693 unsigned rm = ExtractQRegister(instr, 5, 0); 39694 // VORR{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; A1 39695 vorr(al, 39696 kDataTypeValueNone, 39697 QRegister(rd), 39698 QRegister(rn), 39699 QRegister(rm)); 39700 break; 39701 } 39702 case 0x00300000: { 39703 // 0xf2300150 39704 if (((instr >> 12) & 1) != 0) { 39705 UnallocatedA32(instr); 39706 return; 39707 } 39708 unsigned rd = ExtractQRegister(instr, 22, 12); 39709 if (((instr >> 16) & 1) != 0) { 39710 UnallocatedA32(instr); 39711 return; 39712 } 39713 unsigned rn = ExtractQRegister(instr, 7, 16); 39714 if ((instr & 1) != 0) { 39715 UnallocatedA32(instr); 39716 return; 39717 } 39718 unsigned rm = ExtractQRegister(instr, 5, 0); 39719 // VORN{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; A1 39720 vorn(al, 39721 kDataTypeValueNone, 39722 QRegister(rd), 39723 QRegister(rn), 39724 QRegister(rm)); 39725 break; 39726 } 39727 case 0x01000000: { 39728 // 0xf3000150 39729 if (((instr >> 12) & 1) != 0) { 39730 UnallocatedA32(instr); 39731 return; 39732 } 39733 unsigned rd = ExtractQRegister(instr, 22, 12); 39734 if (((instr >> 16) & 1) != 0) { 39735 UnallocatedA32(instr); 39736 return; 39737 } 39738 unsigned rn = ExtractQRegister(instr, 7, 16); 39739 if ((instr & 1) != 0) { 39740 UnallocatedA32(instr); 39741 return; 39742 } 39743 unsigned rm = ExtractQRegister(instr, 5, 0); 39744 // VEOR{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; A1 39745 veor(al, 39746 kDataTypeValueNone, 39747 QRegister(rd), 39748 QRegister(rn), 39749 QRegister(rm)); 39750 break; 39751 } 39752 case 0x01100000: { 39753 // 0xf3100150 39754 if (((instr >> 12) & 1) != 0) { 39755 UnallocatedA32(instr); 39756 return; 39757 } 39758 unsigned rd = ExtractQRegister(instr, 22, 12); 39759 if (((instr >> 16) & 1) != 0) { 39760 UnallocatedA32(instr); 39761 return; 39762 } 39763 unsigned rn = ExtractQRegister(instr, 7, 16); 39764 if ((instr & 1) != 0) { 39765 UnallocatedA32(instr); 39766 return; 39767 } 39768 unsigned rm = ExtractQRegister(instr, 5, 0); 39769 // VBSL{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; A1 39770 vbsl(al, 39771 kDataTypeValueNone, 39772 QRegister(rd), 39773 QRegister(rn), 39774 QRegister(rm)); 39775 break; 39776 } 39777 case 0x01200000: { 39778 // 0xf3200150 39779 if (((instr >> 12) & 1) != 0) { 39780 UnallocatedA32(instr); 39781 return; 39782 } 39783 unsigned rd = ExtractQRegister(instr, 22, 12); 39784 if (((instr >> 16) & 1) != 0) { 39785 UnallocatedA32(instr); 39786 return; 39787 } 39788 unsigned rn = ExtractQRegister(instr, 7, 16); 39789 if ((instr & 1) != 0) { 39790 UnallocatedA32(instr); 39791 return; 39792 } 39793 unsigned rm = ExtractQRegister(instr, 5, 0); 39794 // VBIT{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; A1 39795 vbit(al, 39796 kDataTypeValueNone, 39797 QRegister(rd), 39798 QRegister(rn), 39799 QRegister(rm)); 39800 break; 39801 } 39802 case 0x01300000: { 39803 // 0xf3300150 39804 if (((instr >> 12) & 1) != 0) { 39805 UnallocatedA32(instr); 39806 return; 39807 } 39808 unsigned rd = ExtractQRegister(instr, 22, 12); 39809 if (((instr >> 16) & 1) != 0) { 39810 UnallocatedA32(instr); 39811 return; 39812 } 39813 unsigned rn = ExtractQRegister(instr, 7, 16); 39814 if ((instr & 1) != 0) { 39815 UnallocatedA32(instr); 39816 return; 39817 } 39818 unsigned rm = ExtractQRegister(instr, 5, 0); 39819 // VBIF{<c>}{<q>}{.<dt>} {<Qd>}, <Qn>, <Qm> ; A1 39820 vbif(al, 39821 kDataTypeValueNone, 39822 QRegister(rd), 39823 QRegister(rn), 39824 QRegister(rm)); 39825 break; 39826 } 39827 } 39828 break; 39829 } 39830 case 0x00000200: { 39831 // 0xf2000210 39832 DataType dt = Dt_U_size_3_Decode(((instr >> 20) & 0x3) | 39833 ((instr >> 22) & 0x4)); 39834 if (dt.Is(kDataTypeValueInvalid)) { 39835 UnallocatedA32(instr); 39836 return; 39837 } 39838 unsigned rd = ExtractDRegister(instr, 22, 12); 39839 unsigned rn = ExtractDRegister(instr, 7, 16); 39840 unsigned rm = ExtractDRegister(instr, 5, 0); 39841 // VQSUB{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1 39842 vqsub(al, dt, DRegister(rd), DRegister(rn), DRegister(rm)); 39843 break; 39844 } 39845 case 0x00000240: { 39846 // 0xf2000250 39847 DataType dt = Dt_U_size_3_Decode(((instr >> 20) & 0x3) | 39848 ((instr >> 22) & 0x4)); 39849 if (dt.Is(kDataTypeValueInvalid)) { 39850 UnallocatedA32(instr); 39851 return; 39852 } 39853 if (((instr >> 12) & 1) != 0) { 39854 UnallocatedA32(instr); 39855 return; 39856 } 39857 unsigned rd = ExtractQRegister(instr, 22, 12); 39858 if (((instr >> 16) & 1) != 0) { 39859 UnallocatedA32(instr); 39860 return; 39861 } 39862 unsigned rn = ExtractQRegister(instr, 7, 16); 39863 if ((instr & 1) != 0) { 39864 UnallocatedA32(instr); 39865 return; 39866 } 39867 unsigned rm = ExtractQRegister(instr, 5, 0); 39868 // VQSUB{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1 39869 vqsub(al, dt, QRegister(rd), QRegister(rn), QRegister(rm)); 39870 break; 39871 } 39872 case 0x00000300: { 39873 // 0xf2000310 39874 DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) | 39875 ((instr >> 22) & 0x4)); 39876 if (dt.Is(kDataTypeValueInvalid)) { 39877 UnallocatedA32(instr); 39878 return; 39879 } 39880 unsigned rd = ExtractDRegister(instr, 22, 12); 39881 unsigned rn = ExtractDRegister(instr, 7, 16); 39882 unsigned rm = ExtractDRegister(instr, 5, 0); 39883 // VCGE{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1 39884 vcge(al, dt, DRegister(rd), DRegister(rn), DRegister(rm)); 39885 break; 39886 } 39887 case 0x00000340: { 39888 // 0xf2000350 39889 DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) | 39890 ((instr >> 22) & 0x4)); 39891 if (dt.Is(kDataTypeValueInvalid)) { 39892 UnallocatedA32(instr); 39893 return; 39894 } 39895 if (((instr >> 12) & 1) != 0) { 39896 UnallocatedA32(instr); 39897 return; 39898 } 39899 unsigned rd = ExtractQRegister(instr, 22, 12); 39900 if (((instr >> 16) & 1) != 0) { 39901 UnallocatedA32(instr); 39902 return; 39903 } 39904 unsigned rn = ExtractQRegister(instr, 7, 16); 39905 if ((instr & 1) != 0) { 39906 UnallocatedA32(instr); 39907 return; 39908 } 39909 unsigned rm = ExtractQRegister(instr, 5, 0); 39910 // VCGE{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1 39911 vcge(al, dt, QRegister(rd), QRegister(rn), QRegister(rm)); 39912 break; 39913 } 39914 case 0x00000400: { 39915 // 0xf2000410 39916 DataType dt = Dt_U_size_3_Decode(((instr >> 20) & 0x3) | 39917 ((instr >> 22) & 0x4)); 39918 if (dt.Is(kDataTypeValueInvalid)) { 39919 UnallocatedA32(instr); 39920 return; 39921 } 39922 unsigned rd = ExtractDRegister(instr, 22, 12); 39923 unsigned rm = ExtractDRegister(instr, 5, 0); 39924 unsigned rn = ExtractDRegister(instr, 7, 16); 39925 // VQSHL{<c>}{<q>}.<dt> {<Dd>}, <Dm>, <Dn> ; A1 39926 vqshl(al, dt, DRegister(rd), DRegister(rm), DRegister(rn)); 39927 break; 39928 } 39929 case 0x00000440: { 39930 // 0xf2000450 39931 DataType dt = Dt_U_size_3_Decode(((instr >> 20) & 0x3) | 39932 ((instr >> 22) & 0x4)); 39933 if (dt.Is(kDataTypeValueInvalid)) { 39934 UnallocatedA32(instr); 39935 return; 39936 } 39937 if (((instr >> 12) & 1) != 0) { 39938 UnallocatedA32(instr); 39939 return; 39940 } 39941 unsigned rd = ExtractQRegister(instr, 22, 12); 39942 if ((instr & 1) != 0) { 39943 UnallocatedA32(instr); 39944 return; 39945 } 39946 unsigned rm = ExtractQRegister(instr, 5, 0); 39947 if (((instr >> 16) & 1) != 0) { 39948 UnallocatedA32(instr); 39949 return; 39950 } 39951 unsigned rn = ExtractQRegister(instr, 7, 16); 39952 // VQSHL{<c>}{<q>}.<dt> {<Qd>}, <Qm>, <Qn> ; A1 39953 vqshl(al, dt, QRegister(rd), QRegister(rm), QRegister(rn)); 39954 break; 39955 } 39956 case 0x00000500: { 39957 // 0xf2000510 39958 DataType dt = Dt_U_size_3_Decode(((instr >> 20) & 0x3) | 39959 ((instr >> 22) & 0x4)); 39960 if (dt.Is(kDataTypeValueInvalid)) { 39961 UnallocatedA32(instr); 39962 return; 39963 } 39964 unsigned rd = ExtractDRegister(instr, 22, 12); 39965 unsigned rm = ExtractDRegister(instr, 5, 0); 39966 unsigned rn = ExtractDRegister(instr, 7, 16); 39967 // VQRSHL{<c>}{<q>}.<dt> {<Dd>}, <Dm>, <Dn> ; A1 39968 vqrshl(al, dt, DRegister(rd), DRegister(rm), DRegister(rn)); 39969 break; 39970 } 39971 case 0x00000540: { 39972 // 0xf2000550 39973 DataType dt = Dt_U_size_3_Decode(((instr >> 20) & 0x3) | 39974 ((instr >> 22) & 0x4)); 39975 if (dt.Is(kDataTypeValueInvalid)) { 39976 UnallocatedA32(instr); 39977 return; 39978 } 39979 if (((instr >> 12) & 1) != 0) { 39980 UnallocatedA32(instr); 39981 return; 39982 } 39983 unsigned rd = ExtractQRegister(instr, 22, 12); 39984 if ((instr & 1) != 0) { 39985 UnallocatedA32(instr); 39986 return; 39987 } 39988 unsigned rm = ExtractQRegister(instr, 5, 0); 39989 if (((instr >> 16) & 1) != 0) { 39990 UnallocatedA32(instr); 39991 return; 39992 } 39993 unsigned rn = ExtractQRegister(instr, 7, 16); 39994 // VQRSHL{<c>}{<q>}.<dt> {<Qd>}, <Qm>, <Qn> ; A1 39995 vqrshl(al, dt, QRegister(rd), QRegister(rm), QRegister(rn)); 39996 break; 39997 } 39998 case 0x00000600: { 39999 // 0xf2000610 40000 DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) | 40001 ((instr >> 22) & 0x4)); 40002 if (dt.Is(kDataTypeValueInvalid)) { 40003 UnallocatedA32(instr); 40004 return; 40005 } 40006 unsigned rd = ExtractDRegister(instr, 22, 12); 40007 unsigned rn = ExtractDRegister(instr, 7, 16); 40008 unsigned rm = ExtractDRegister(instr, 5, 0); 40009 // VMIN{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1 40010 vmin(al, dt, DRegister(rd), DRegister(rn), DRegister(rm)); 40011 break; 40012 } 40013 case 0x00000640: { 40014 // 0xf2000650 40015 DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) | 40016 ((instr >> 22) & 0x4)); 40017 if (dt.Is(kDataTypeValueInvalid)) { 40018 UnallocatedA32(instr); 40019 return; 40020 } 40021 if (((instr >> 12) & 1) != 0) { 40022 UnallocatedA32(instr); 40023 return; 40024 } 40025 unsigned rd = ExtractQRegister(instr, 22, 12); 40026 if (((instr >> 16) & 1) != 0) { 40027 UnallocatedA32(instr); 40028 return; 40029 } 40030 unsigned rn = ExtractQRegister(instr, 7, 16); 40031 if ((instr & 1) != 0) { 40032 UnallocatedA32(instr); 40033 return; 40034 } 40035 unsigned rm = ExtractQRegister(instr, 5, 0); 40036 // VMIN{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1 40037 vmin(al, dt, QRegister(rd), QRegister(rn), QRegister(rm)); 40038 break; 40039 } 40040 case 0x00000700: { 40041 // 0xf2000710 40042 DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) | 40043 ((instr >> 22) & 0x4)); 40044 if (dt.Is(kDataTypeValueInvalid)) { 40045 UnallocatedA32(instr); 40046 return; 40047 } 40048 unsigned rd = ExtractDRegister(instr, 22, 12); 40049 unsigned rn = ExtractDRegister(instr, 7, 16); 40050 unsigned rm = ExtractDRegister(instr, 5, 0); 40051 // VABA{<c>}{<q>}.<dt> <Dd>, <Dn>, <Dm> ; A1 40052 vaba(al, dt, DRegister(rd), DRegister(rn), DRegister(rm)); 40053 break; 40054 } 40055 case 0x00000740: { 40056 // 0xf2000750 40057 DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) | 40058 ((instr >> 22) & 0x4)); 40059 if (dt.Is(kDataTypeValueInvalid)) { 40060 UnallocatedA32(instr); 40061 return; 40062 } 40063 if (((instr >> 12) & 1) != 0) { 40064 UnallocatedA32(instr); 40065 return; 40066 } 40067 unsigned rd = ExtractQRegister(instr, 22, 12); 40068 if (((instr >> 16) & 1) != 0) { 40069 UnallocatedA32(instr); 40070 return; 40071 } 40072 unsigned rn = ExtractQRegister(instr, 7, 16); 40073 if ((instr & 1) != 0) { 40074 UnallocatedA32(instr); 40075 return; 40076 } 40077 unsigned rm = ExtractQRegister(instr, 5, 0); 40078 // VABA{<c>}{<q>}.<dt> <Qd>, <Qn>, <Qm> ; A1 40079 vaba(al, dt, QRegister(rd), QRegister(rn), QRegister(rm)); 40080 break; 40081 } 40082 case 0x00000800: { 40083 // 0xf2000810 40084 switch (instr & 0x01000000) { 40085 case 0x00000000: { 40086 // 0xf2000810 40087 DataType dt = Dt_size_7_Decode((instr >> 20) & 0x3); 40088 if (dt.Is(kDataTypeValueInvalid)) { 40089 UnallocatedA32(instr); 40090 return; 40091 } 40092 unsigned rd = ExtractDRegister(instr, 22, 12); 40093 unsigned rn = ExtractDRegister(instr, 7, 16); 40094 unsigned rm = ExtractDRegister(instr, 5, 0); 40095 // VTST{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1 40096 vtst(al, dt, DRegister(rd), DRegister(rn), DRegister(rm)); 40097 break; 40098 } 40099 case 0x01000000: { 40100 // 0xf3000810 40101 DataType dt = Dt_size_4_Decode((instr >> 20) & 0x3); 40102 if (dt.Is(kDataTypeValueInvalid)) { 40103 UnallocatedA32(instr); 40104 return; 40105 } 40106 unsigned rd = ExtractDRegister(instr, 22, 12); 40107 unsigned rn = ExtractDRegister(instr, 7, 16); 40108 unsigned rm = ExtractDRegister(instr, 5, 0); 40109 // VCEQ{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1 40110 vceq(al, dt, DRegister(rd), DRegister(rn), DRegister(rm)); 40111 break; 40112 } 40113 } 40114 break; 40115 } 40116 case 0x00000840: { 40117 // 0xf2000850 40118 switch (instr & 0x01000000) { 40119 case 0x00000000: { 40120 // 0xf2000850 40121 DataType dt = Dt_size_7_Decode((instr >> 20) & 0x3); 40122 if (dt.Is(kDataTypeValueInvalid)) { 40123 UnallocatedA32(instr); 40124 return; 40125 } 40126 if (((instr >> 12) & 1) != 0) { 40127 UnallocatedA32(instr); 40128 return; 40129 } 40130 unsigned rd = ExtractQRegister(instr, 22, 12); 40131 if (((instr >> 16) & 1) != 0) { 40132 UnallocatedA32(instr); 40133 return; 40134 } 40135 unsigned rn = ExtractQRegister(instr, 7, 16); 40136 if ((instr & 1) != 0) { 40137 UnallocatedA32(instr); 40138 return; 40139 } 40140 unsigned rm = ExtractQRegister(instr, 5, 0); 40141 // VTST{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1 40142 vtst(al, dt, QRegister(rd), QRegister(rn), QRegister(rm)); 40143 break; 40144 } 40145 case 0x01000000: { 40146 // 0xf3000850 40147 DataType dt = Dt_size_4_Decode((instr >> 20) & 0x3); 40148 if (dt.Is(kDataTypeValueInvalid)) { 40149 UnallocatedA32(instr); 40150 return; 40151 } 40152 if (((instr >> 12) & 1) != 0) { 40153 UnallocatedA32(instr); 40154 return; 40155 } 40156 unsigned rd = ExtractQRegister(instr, 22, 12); 40157 if (((instr >> 16) & 1) != 0) { 40158 UnallocatedA32(instr); 40159 return; 40160 } 40161 unsigned rn = ExtractQRegister(instr, 7, 16); 40162 if ((instr & 1) != 0) { 40163 UnallocatedA32(instr); 40164 return; 40165 } 40166 unsigned rm = ExtractQRegister(instr, 5, 0); 40167 // VCEQ{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1 40168 vceq(al, dt, QRegister(rd), QRegister(rn), QRegister(rm)); 40169 break; 40170 } 40171 } 40172 break; 40173 } 40174 case 0x00000900: { 40175 // 0xf2000910 40176 DataType dt = Dt_op_size_1_Decode(((instr >> 20) & 0x3) | 40177 ((instr >> 22) & 0x4)); 40178 if (dt.Is(kDataTypeValueInvalid)) { 40179 UnallocatedA32(instr); 40180 return; 40181 } 40182 unsigned rd = ExtractDRegister(instr, 22, 12); 40183 unsigned rn = ExtractDRegister(instr, 7, 16); 40184 unsigned rm = ExtractDRegister(instr, 5, 0); 40185 // VMUL{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1 40186 vmul(al, dt, DRegister(rd), DRegister(rn), DRegister(rm)); 40187 break; 40188 } 40189 case 0x00000940: { 40190 // 0xf2000950 40191 DataType dt = Dt_op_size_1_Decode(((instr >> 20) & 0x3) | 40192 ((instr >> 22) & 0x4)); 40193 if (dt.Is(kDataTypeValueInvalid)) { 40194 UnallocatedA32(instr); 40195 return; 40196 } 40197 if (((instr >> 12) & 1) != 0) { 40198 UnallocatedA32(instr); 40199 return; 40200 } 40201 unsigned rd = ExtractQRegister(instr, 22, 12); 40202 if (((instr >> 16) & 1) != 0) { 40203 UnallocatedA32(instr); 40204 return; 40205 } 40206 unsigned rn = ExtractQRegister(instr, 7, 16); 40207 if ((instr & 1) != 0) { 40208 UnallocatedA32(instr); 40209 return; 40210 } 40211 unsigned rm = ExtractQRegister(instr, 5, 0); 40212 // VMUL{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Qm> ; A1 40213 vmul(al, dt, QRegister(rd), QRegister(rn), QRegister(rm)); 40214 break; 40215 } 40216 case 0x00000a00: { 40217 // 0xf2000a10 40218 DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) | 40219 ((instr >> 22) & 0x4)); 40220 if (dt.Is(kDataTypeValueInvalid)) { 40221 UnallocatedA32(instr); 40222 return; 40223 } 40224 unsigned rd = ExtractDRegister(instr, 22, 12); 40225 unsigned rn = ExtractDRegister(instr, 7, 16); 40226 unsigned rm = ExtractDRegister(instr, 5, 0); 40227 // VPMIN{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1 40228 vpmin(al, dt, DRegister(rd), DRegister(rn), DRegister(rm)); 40229 break; 40230 } 40231 case 0x00000b00: { 40232 // 0xf2000b10 40233 if ((instr & 0x01000000) == 0x00000000) { 40234 DataType dt = Dt_size_4_Decode((instr >> 20) & 0x3); 40235 if (dt.Is(kDataTypeValueInvalid)) { 40236 UnallocatedA32(instr); 40237 return; 40238 } 40239 unsigned rd = ExtractDRegister(instr, 22, 12); 40240 unsigned rn = ExtractDRegister(instr, 7, 16); 40241 unsigned rm = ExtractDRegister(instr, 5, 0); 40242 // VPADD{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm> ; A1 40243 vpadd(al, dt, DRegister(rd), DRegister(rn), DRegister(rm)); 40244 } else { 40245 UnallocatedA32(instr); 40246 } 40247 break; 40248 } 40249 case 0x00000c00: { 40250 // 0xf2000c10 40251 switch (instr & 0x01300000) { 40252 case 0x00000000: { 40253 // 0xf2000c10 40254 unsigned rd = ExtractDRegister(instr, 22, 12); 40255 unsigned rn = ExtractDRegister(instr, 7, 16); 40256 unsigned rm = ExtractDRegister(instr, 5, 0); 40257 // VFMA{<c>}{<q>}.F32 <Dd>, <Dn>, <Dm> ; A1 40258 vfma(al, F32, DRegister(rd), DRegister(rn), DRegister(rm)); 40259 break; 40260 } 40261 case 0x00200000: { 40262 // 0xf2200c10 40263 unsigned rd = ExtractDRegister(instr, 22, 12); 40264 unsigned rn = ExtractDRegister(instr, 7, 16); 40265 unsigned rm = ExtractDRegister(instr, 5, 0); 40266 // VFMS{<c>}{<q>}.F32 <Dd>, <Dn>, <Dm> ; A1 40267 vfms(al, F32, DRegister(rd), DRegister(rn), DRegister(rm)); 40268 break; 40269 } 40270 default: 40271 UnallocatedA32(instr); 40272 break; 40273 } 40274 break; 40275 } 40276 case 0x00000c40: { 40277 // 0xf2000c50 40278 switch (instr & 0x01300000) { 40279 case 0x00000000: { 40280 // 0xf2000c50 40281 if (((instr >> 12) & 1) != 0) { 40282 UnallocatedA32(instr); 40283 return; 40284 } 40285 unsigned rd = ExtractQRegister(instr, 22, 12); 40286 if (((instr >> 16) & 1) != 0) { 40287 UnallocatedA32(instr); 40288 return; 40289 } 40290 unsigned rn = ExtractQRegister(instr, 7, 16); 40291 if ((instr & 1) != 0) { 40292 UnallocatedA32(instr); 40293 return; 40294 } 40295 unsigned rm = ExtractQRegister(instr, 5, 0); 40296 // VFMA{<c>}{<q>}.F32 <Qd>, <Qn>, <Qm> ; A1 40297 vfma(al, F32, QRegister(rd), QRegister(rn), QRegister(rm)); 40298 break; 40299 } 40300 case 0x00200000: { 40301 // 0xf2200c50 40302 if (((instr >> 12) & 1) != 0) { 40303 UnallocatedA32(instr); 40304 return; 40305 } 40306 unsigned rd = ExtractQRegister(instr, 22, 12); 40307 if (((instr >> 16) & 1) != 0) { 40308 UnallocatedA32(instr); 40309 return; 40310 } 40311 unsigned rn = ExtractQRegister(instr, 7, 16); 40312 if ((instr & 1) != 0) { 40313 UnallocatedA32(instr); 40314 return; 40315 } 40316 unsigned rm = ExtractQRegister(instr, 5, 0); 40317 // VFMS{<c>}{<q>}.F32 <Qd>, <Qn>, <Qm> ; A1 40318 vfms(al, F32, QRegister(rd), QRegister(rn), QRegister(rm)); 40319 break; 40320 } 40321 default: 40322 UnallocatedA32(instr); 40323 break; 40324 } 40325 break; 40326 } 40327 case 0x00000d00: { 40328 // 0xf2000d10 40329 switch (instr & 0x01300000) { 40330 case 0x00000000: { 40331 // 0xf2000d10 40332 unsigned rd = ExtractDRegister(instr, 22, 12); 40333 unsigned rn = ExtractDRegister(instr, 7, 16); 40334 unsigned rm = ExtractDRegister(instr, 5, 0); 40335 // VMLA{<c>}{<q>}.F32 <Dd>, <Dn>, <Dm> ; A1 40336 vmla(al, F32, DRegister(rd), DRegister(rn), DRegister(rm)); 40337 break; 40338 } 40339 case 0x00200000: { 40340 // 0xf2200d10 40341 unsigned rd = ExtractDRegister(instr, 22, 12); 40342 unsigned rn = ExtractDRegister(instr, 7, 16); 40343 unsigned rm = ExtractDRegister(instr, 5, 0); 40344 // VMLS{<c>}{<q>}.F32 <Dd>, <Dn>, <Dm> ; A1 40345 vmls(al, F32, DRegister(rd), DRegister(rn), DRegister(rm)); 40346 break; 40347 } 40348 case 0x01000000: { 40349 // 0xf3000d10 40350 unsigned rd = ExtractDRegister(instr, 22, 12); 40351 unsigned rn = ExtractDRegister(instr, 7, 16); 40352 unsigned rm = ExtractDRegister(instr, 5, 0); 40353 // VMUL{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A1 40354 vmul(al, F32, DRegister(rd), DRegister(rn), DRegister(rm)); 40355 break; 40356 } 40357 default: 40358 UnallocatedA32(instr); 40359 break; 40360 } 40361 break; 40362 } 40363 case 0x00000d40: { 40364 // 0xf2000d50 40365 switch (instr & 0x01300000) { 40366 case 0x00000000: { 40367 // 0xf2000d50 40368 if (((instr >> 12) & 1) != 0) { 40369 UnallocatedA32(instr); 40370 return; 40371 } 40372 unsigned rd = ExtractQRegister(instr, 22, 12); 40373 if (((instr >> 16) & 1) != 0) { 40374 UnallocatedA32(instr); 40375 return; 40376 } 40377 unsigned rn = ExtractQRegister(instr, 7, 16); 40378 if ((instr & 1) != 0) { 40379 UnallocatedA32(instr); 40380 return; 40381 } 40382 unsigned rm = ExtractQRegister(instr, 5, 0); 40383 // VMLA{<c>}{<q>}.F32 <Qd>, <Qn>, <Qm> ; A1 40384 vmla(al, F32, QRegister(rd), QRegister(rn), QRegister(rm)); 40385 break; 40386 } 40387 case 0x00200000: { 40388 // 0xf2200d50 40389 if (((instr >> 12) & 1) != 0) { 40390 UnallocatedA32(instr); 40391 return; 40392 } 40393 unsigned rd = ExtractQRegister(instr, 22, 12); 40394 if (((instr >> 16) & 1) != 0) { 40395 UnallocatedA32(instr); 40396 return; 40397 } 40398 unsigned rn = ExtractQRegister(instr, 7, 16); 40399 if ((instr & 1) != 0) { 40400 UnallocatedA32(instr); 40401 return; 40402 } 40403 unsigned rm = ExtractQRegister(instr, 5, 0); 40404 // VMLS{<c>}{<q>}.F32 <Qd>, <Qn>, <Qm> ; A1 40405 vmls(al, F32, QRegister(rd), QRegister(rn), QRegister(rm)); 40406 break; 40407 } 40408 case 0x01000000: { 40409 // 0xf3000d50 40410 if (((instr >> 12) & 1) != 0) { 40411 UnallocatedA32(instr); 40412 return; 40413 } 40414 unsigned rd = ExtractQRegister(instr, 22, 12); 40415 if (((instr >> 16) & 1) != 0) { 40416 UnallocatedA32(instr); 40417 return; 40418 } 40419 unsigned rn = ExtractQRegister(instr, 7, 16); 40420 if ((instr & 1) != 0) { 40421 UnallocatedA32(instr); 40422 return; 40423 } 40424 unsigned rm = ExtractQRegister(instr, 5, 0); 40425 // VMUL{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; A1 40426 vmul(al, F32, QRegister(rd), QRegister(rn), QRegister(rm)); 40427 break; 40428 } 40429 default: 40430 UnallocatedA32(instr); 40431 break; 40432 } 40433 break; 40434 } 40435 case 0x00000e00: { 40436 // 0xf2000e10 40437 switch (instr & 0x01300000) { 40438 case 0x01000000: { 40439 // 0xf3000e10 40440 unsigned rd = ExtractDRegister(instr, 22, 12); 40441 unsigned rn = ExtractDRegister(instr, 7, 16); 40442 unsigned rm = ExtractDRegister(instr, 5, 0); 40443 // VACGE{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A1 40444 vacge(al, F32, DRegister(rd), DRegister(rn), DRegister(rm)); 40445 break; 40446 } 40447 case 0x01200000: { 40448 // 0xf3200e10 40449 unsigned rd = ExtractDRegister(instr, 22, 12); 40450 unsigned rn = ExtractDRegister(instr, 7, 16); 40451 unsigned rm = ExtractDRegister(instr, 5, 0); 40452 // VACGT{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A1 40453 vacgt(al, F32, DRegister(rd), DRegister(rn), DRegister(rm)); 40454 break; 40455 } 40456 default: 40457 UnallocatedA32(instr); 40458 break; 40459 } 40460 break; 40461 } 40462 case 0x00000e40: { 40463 // 0xf2000e50 40464 switch (instr & 0x01300000) { 40465 case 0x01000000: { 40466 // 0xf3000e50 40467 if (((instr >> 12) & 1) != 0) { 40468 UnallocatedA32(instr); 40469 return; 40470 } 40471 unsigned rd = ExtractQRegister(instr, 22, 12); 40472 if (((instr >> 16) & 1) != 0) { 40473 UnallocatedA32(instr); 40474 return; 40475 } 40476 unsigned rn = ExtractQRegister(instr, 7, 16); 40477 if ((instr & 1) != 0) { 40478 UnallocatedA32(instr); 40479 return; 40480 } 40481 unsigned rm = ExtractQRegister(instr, 5, 0); 40482 // VACGE{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; A1 40483 vacge(al, F32, QRegister(rd), QRegister(rn), QRegister(rm)); 40484 break; 40485 } 40486 case 0x01200000: { 40487 // 0xf3200e50 40488 if (((instr >> 12) & 1) != 0) { 40489 UnallocatedA32(instr); 40490 return; 40491 } 40492 unsigned rd = ExtractQRegister(instr, 22, 12); 40493 if (((instr >> 16) & 1) != 0) { 40494 UnallocatedA32(instr); 40495 return; 40496 } 40497 unsigned rn = ExtractQRegister(instr, 7, 16); 40498 if ((instr & 1) != 0) { 40499 UnallocatedA32(instr); 40500 return; 40501 } 40502 unsigned rm = ExtractQRegister(instr, 5, 0); 40503 // VACGT{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; A1 40504 vacgt(al, F32, QRegister(rd), QRegister(rn), QRegister(rm)); 40505 break; 40506 } 40507 default: 40508 UnallocatedA32(instr); 40509 break; 40510 } 40511 break; 40512 } 40513 case 0x00000f00: { 40514 // 0xf2000f10 40515 switch (instr & 0x01300000) { 40516 case 0x00000000: { 40517 // 0xf2000f10 40518 unsigned rd = ExtractDRegister(instr, 22, 12); 40519 unsigned rn = ExtractDRegister(instr, 7, 16); 40520 unsigned rm = ExtractDRegister(instr, 5, 0); 40521 // VRECPS{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A1 40522 vrecps(al, 40523 F32, 40524 DRegister(rd), 40525 DRegister(rn), 40526 DRegister(rm)); 40527 break; 40528 } 40529 case 0x00200000: { 40530 // 0xf2200f10 40531 unsigned rd = ExtractDRegister(instr, 22, 12); 40532 unsigned rn = ExtractDRegister(instr, 7, 16); 40533 unsigned rm = ExtractDRegister(instr, 5, 0); 40534 // VRSQRTS{<c>}{<q>}.F32 {<Dd>}, <Dn>, <Dm> ; A1 40535 vrsqrts(al, 40536 F32, 40537 DRegister(rd), 40538 DRegister(rn), 40539 DRegister(rm)); 40540 break; 40541 } 40542 case 0x01000000: { 40543 // 0xf3000f10 40544 unsigned rd = ExtractDRegister(instr, 22, 12); 40545 unsigned rn = ExtractDRegister(instr, 7, 16); 40546 unsigned rm = ExtractDRegister(instr, 5, 0); 40547 // VMAXNM{<q>}.F32 <Dd>, <Dn>, <Dm> ; A1 40548 vmaxnm(F32, DRegister(rd), DRegister(rn), DRegister(rm)); 40549 break; 40550 } 40551 case 0x01200000: { 40552 // 0xf3200f10 40553 unsigned rd = ExtractDRegister(instr, 22, 12); 40554 unsigned rn = ExtractDRegister(instr, 7, 16); 40555 unsigned rm = ExtractDRegister(instr, 5, 0); 40556 // VMINNM{<q>}.F32 <Dd>, <Dn>, <Dm> ; A1 40557 vminnm(F32, DRegister(rd), DRegister(rn), DRegister(rm)); 40558 break; 40559 } 40560 default: 40561 UnallocatedA32(instr); 40562 break; 40563 } 40564 break; 40565 } 40566 case 0x00000f40: { 40567 // 0xf2000f50 40568 switch (instr & 0x01300000) { 40569 case 0x00000000: { 40570 // 0xf2000f50 40571 if (((instr >> 12) & 1) != 0) { 40572 UnallocatedA32(instr); 40573 return; 40574 } 40575 unsigned rd = ExtractQRegister(instr, 22, 12); 40576 if (((instr >> 16) & 1) != 0) { 40577 UnallocatedA32(instr); 40578 return; 40579 } 40580 unsigned rn = ExtractQRegister(instr, 7, 16); 40581 if ((instr & 1) != 0) { 40582 UnallocatedA32(instr); 40583 return; 40584 } 40585 unsigned rm = ExtractQRegister(instr, 5, 0); 40586 // VRECPS{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; A1 40587 vrecps(al, 40588 F32, 40589 QRegister(rd), 40590 QRegister(rn), 40591 QRegister(rm)); 40592 break; 40593 } 40594 case 0x00200000: { 40595 // 0xf2200f50 40596 if (((instr >> 12) & 1) != 0) { 40597 UnallocatedA32(instr); 40598 return; 40599 } 40600 unsigned rd = ExtractQRegister(instr, 22, 12); 40601 if (((instr >> 16) & 1) != 0) { 40602 UnallocatedA32(instr); 40603 return; 40604 } 40605 unsigned rn = ExtractQRegister(instr, 7, 16); 40606 if ((instr & 1) != 0) { 40607 UnallocatedA32(instr); 40608 return; 40609 } 40610 unsigned rm = ExtractQRegister(instr, 5, 0); 40611 // VRSQRTS{<c>}{<q>}.F32 {<Qd>}, <Qn>, <Qm> ; A1 40612 vrsqrts(al, 40613 F32, 40614 QRegister(rd), 40615 QRegister(rn), 40616 QRegister(rm)); 40617 break; 40618 } 40619 case 0x01000000: { 40620 // 0xf3000f50 40621 if (((instr >> 12) & 1) != 0) { 40622 UnallocatedA32(instr); 40623 return; 40624 } 40625 unsigned rd = ExtractQRegister(instr, 22, 12); 40626 if (((instr >> 16) & 1) != 0) { 40627 UnallocatedA32(instr); 40628 return; 40629 } 40630 unsigned rn = ExtractQRegister(instr, 7, 16); 40631 if ((instr & 1) != 0) { 40632 UnallocatedA32(instr); 40633 return; 40634 } 40635 unsigned rm = ExtractQRegister(instr, 5, 0); 40636 // VMAXNM{<q>}.F32 <Qd>, <Qn>, <Qm> ; A1 40637 vmaxnm(F32, QRegister(rd), QRegister(rn), QRegister(rm)); 40638 break; 40639 } 40640 case 0x01200000: { 40641 // 0xf3200f50 40642 if (((instr >> 12) & 1) != 0) { 40643 UnallocatedA32(instr); 40644 return; 40645 } 40646 unsigned rd = ExtractQRegister(instr, 22, 12); 40647 if (((instr >> 16) & 1) != 0) { 40648 UnallocatedA32(instr); 40649 return; 40650 } 40651 unsigned rn = ExtractQRegister(instr, 7, 16); 40652 if ((instr & 1) != 0) { 40653 UnallocatedA32(instr); 40654 return; 40655 } 40656 unsigned rm = ExtractQRegister(instr, 5, 0); 40657 // VMINNM{<q>}.F32 <Qd>, <Qn>, <Qm> ; A1 40658 vminnm(F32, QRegister(rd), QRegister(rn), QRegister(rm)); 40659 break; 40660 } 40661 default: 40662 UnallocatedA32(instr); 40663 break; 40664 } 40665 break; 40666 } 40667 default: 40668 UnallocatedA32(instr); 40669 break; 40670 } 40671 break; 40672 } 40673 case 0x00800000: { 40674 // 0xf2800000 40675 switch (instr & 0x00300000) { 40676 case 0x00300000: { 40677 // 0xf2b00000 40678 switch (instr & 0x01000000) { 40679 case 0x00000000: { 40680 // 0xf2b00000 40681 switch (instr & 0x00000040) { 40682 case 0x00000000: { 40683 // 0xf2b00000 40684 if (((instr & 0x800) == 0x800)) { 40685 UnallocatedA32(instr); 40686 return; 40687 } 40688 unsigned rd = ExtractDRegister(instr, 22, 12); 40689 unsigned rn = ExtractDRegister(instr, 7, 16); 40690 unsigned rm = ExtractDRegister(instr, 5, 0); 40691 uint32_t imm = (instr >> 8) & 0xf; 40692 // VEXT{<c>}{<q>}.8 {<Dd>}, <Dn>, <Dm>, #<imm> ; A1 40693 vext(al, 40694 Untyped8, 40695 DRegister(rd), 40696 DRegister(rn), 40697 DRegister(rm), 40698 imm); 40699 break; 40700 } 40701 case 0x00000040: { 40702 // 0xf2b00040 40703 if (((instr >> 12) & 1) != 0) { 40704 UnallocatedA32(instr); 40705 return; 40706 } 40707 unsigned rd = ExtractQRegister(instr, 22, 12); 40708 if (((instr >> 16) & 1) != 0) { 40709 UnallocatedA32(instr); 40710 return; 40711 } 40712 unsigned rn = ExtractQRegister(instr, 7, 16); 40713 if ((instr & 1) != 0) { 40714 UnallocatedA32(instr); 40715 return; 40716 } 40717 unsigned rm = ExtractQRegister(instr, 5, 0); 40718 uint32_t imm = (instr >> 8) & 0xf; 40719 // VEXT{<c>}{<q>}.8 {<Qd>}, <Qn>, <Qm>, #<imm> ; A1 40720 vext(al, 40721 Untyped8, 40722 QRegister(rd), 40723 QRegister(rn), 40724 QRegister(rm), 40725 imm); 40726 break; 40727 } 40728 } 40729 break; 40730 } 40731 case 0x01000000: { 40732 // 0xf3b00000 40733 switch (instr & 0x00000800) { 40734 case 0x00000000: { 40735 // 0xf3b00000 40736 switch (instr & 0x00030200) { 40737 case 0x00000000: { 40738 // 0xf3b00000 40739 switch (instr & 0x000005c0) { 40740 case 0x00000000: { 40741 // 0xf3b00000 40742 DataType dt = 40743 Dt_size_7_Decode((instr >> 18) & 0x3); 40744 if (dt.Is(kDataTypeValueInvalid)) { 40745 UnallocatedA32(instr); 40746 return; 40747 } 40748 unsigned rd = ExtractDRegister(instr, 22, 12); 40749 unsigned rm = ExtractDRegister(instr, 5, 0); 40750 // VREV64{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1 40751 vrev64(al, dt, DRegister(rd), DRegister(rm)); 40752 break; 40753 } 40754 case 0x00000040: { 40755 // 0xf3b00040 40756 DataType dt = 40757 Dt_size_7_Decode((instr >> 18) & 0x3); 40758 if (dt.Is(kDataTypeValueInvalid)) { 40759 UnallocatedA32(instr); 40760 return; 40761 } 40762 if (((instr >> 12) & 1) != 0) { 40763 UnallocatedA32(instr); 40764 return; 40765 } 40766 unsigned rd = ExtractQRegister(instr, 22, 12); 40767 if ((instr & 1) != 0) { 40768 UnallocatedA32(instr); 40769 return; 40770 } 40771 unsigned rm = ExtractQRegister(instr, 5, 0); 40772 // VREV64{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1 40773 vrev64(al, dt, QRegister(rd), QRegister(rm)); 40774 break; 40775 } 40776 case 0x00000080: { 40777 // 0xf3b00080 40778 DataType dt = 40779 Dt_size_15_Decode((instr >> 18) & 0x3); 40780 if (dt.Is(kDataTypeValueInvalid)) { 40781 UnallocatedA32(instr); 40782 return; 40783 } 40784 unsigned rd = ExtractDRegister(instr, 22, 12); 40785 unsigned rm = ExtractDRegister(instr, 5, 0); 40786 // VREV32{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1 40787 vrev32(al, dt, DRegister(rd), DRegister(rm)); 40788 break; 40789 } 40790 case 0x000000c0: { 40791 // 0xf3b000c0 40792 DataType dt = 40793 Dt_size_15_Decode((instr >> 18) & 0x3); 40794 if (dt.Is(kDataTypeValueInvalid)) { 40795 UnallocatedA32(instr); 40796 return; 40797 } 40798 if (((instr >> 12) & 1) != 0) { 40799 UnallocatedA32(instr); 40800 return; 40801 } 40802 unsigned rd = ExtractQRegister(instr, 22, 12); 40803 if ((instr & 1) != 0) { 40804 UnallocatedA32(instr); 40805 return; 40806 } 40807 unsigned rm = ExtractQRegister(instr, 5, 0); 40808 // VREV32{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1 40809 vrev32(al, dt, QRegister(rd), QRegister(rm)); 40810 break; 40811 } 40812 case 0x00000100: { 40813 // 0xf3b00100 40814 DataType dt = 40815 Dt_size_1_Decode((instr >> 18) & 0x3); 40816 if (dt.Is(kDataTypeValueInvalid)) { 40817 UnallocatedA32(instr); 40818 return; 40819 } 40820 unsigned rd = ExtractDRegister(instr, 22, 12); 40821 unsigned rm = ExtractDRegister(instr, 5, 0); 40822 // VREV16{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1 40823 vrev16(al, dt, DRegister(rd), DRegister(rm)); 40824 break; 40825 } 40826 case 0x00000140: { 40827 // 0xf3b00140 40828 DataType dt = 40829 Dt_size_1_Decode((instr >> 18) & 0x3); 40830 if (dt.Is(kDataTypeValueInvalid)) { 40831 UnallocatedA32(instr); 40832 return; 40833 } 40834 if (((instr >> 12) & 1) != 0) { 40835 UnallocatedA32(instr); 40836 return; 40837 } 40838 unsigned rd = ExtractQRegister(instr, 22, 12); 40839 if ((instr & 1) != 0) { 40840 UnallocatedA32(instr); 40841 return; 40842 } 40843 unsigned rm = ExtractQRegister(instr, 5, 0); 40844 // VREV16{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1 40845 vrev16(al, dt, QRegister(rd), QRegister(rm)); 40846 break; 40847 } 40848 case 0x00000400: { 40849 // 0xf3b00400 40850 DataType dt = 40851 Dt_size_5_Decode((instr >> 18) & 0x3); 40852 if (dt.Is(kDataTypeValueInvalid)) { 40853 UnallocatedA32(instr); 40854 return; 40855 } 40856 unsigned rd = ExtractDRegister(instr, 22, 12); 40857 unsigned rm = ExtractDRegister(instr, 5, 0); 40858 // VCLS{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1 40859 vcls(al, dt, DRegister(rd), DRegister(rm)); 40860 break; 40861 } 40862 case 0x00000440: { 40863 // 0xf3b00440 40864 DataType dt = 40865 Dt_size_5_Decode((instr >> 18) & 0x3); 40866 if (dt.Is(kDataTypeValueInvalid)) { 40867 UnallocatedA32(instr); 40868 return; 40869 } 40870 if (((instr >> 12) & 1) != 0) { 40871 UnallocatedA32(instr); 40872 return; 40873 } 40874 unsigned rd = ExtractQRegister(instr, 22, 12); 40875 if ((instr & 1) != 0) { 40876 UnallocatedA32(instr); 40877 return; 40878 } 40879 unsigned rm = ExtractQRegister(instr, 5, 0); 40880 // VCLS{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1 40881 vcls(al, dt, QRegister(rd), QRegister(rm)); 40882 break; 40883 } 40884 case 0x00000480: { 40885 // 0xf3b00480 40886 DataType dt = 40887 Dt_size_4_Decode((instr >> 18) & 0x3); 40888 if (dt.Is(kDataTypeValueInvalid)) { 40889 UnallocatedA32(instr); 40890 return; 40891 } 40892 unsigned rd = ExtractDRegister(instr, 22, 12); 40893 unsigned rm = ExtractDRegister(instr, 5, 0); 40894 // VCLZ{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1 40895 vclz(al, dt, DRegister(rd), DRegister(rm)); 40896 break; 40897 } 40898 case 0x000004c0: { 40899 // 0xf3b004c0 40900 DataType dt = 40901 Dt_size_4_Decode((instr >> 18) & 0x3); 40902 if (dt.Is(kDataTypeValueInvalid)) { 40903 UnallocatedA32(instr); 40904 return; 40905 } 40906 if (((instr >> 12) & 1) != 0) { 40907 UnallocatedA32(instr); 40908 return; 40909 } 40910 unsigned rd = ExtractQRegister(instr, 22, 12); 40911 if ((instr & 1) != 0) { 40912 UnallocatedA32(instr); 40913 return; 40914 } 40915 unsigned rm = ExtractQRegister(instr, 5, 0); 40916 // VCLZ{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1 40917 vclz(al, dt, QRegister(rd), QRegister(rm)); 40918 break; 40919 } 40920 case 0x00000500: { 40921 // 0xf3b00500 40922 if ((instr & 0x000c0000) == 0x00000000) { 40923 unsigned rd = ExtractDRegister(instr, 22, 12); 40924 unsigned rm = ExtractDRegister(instr, 5, 0); 40925 // VCNT{<c>}{<q>}.8 <Dd>, <Dm> ; A1 40926 vcnt(al, 40927 Untyped8, 40928 DRegister(rd), 40929 DRegister(rm)); 40930 } else { 40931 UnallocatedA32(instr); 40932 } 40933 break; 40934 } 40935 case 0x00000540: { 40936 // 0xf3b00540 40937 if ((instr & 0x000c0000) == 0x00000000) { 40938 if (((instr >> 12) & 1) != 0) { 40939 UnallocatedA32(instr); 40940 return; 40941 } 40942 unsigned rd = ExtractQRegister(instr, 22, 12); 40943 if ((instr & 1) != 0) { 40944 UnallocatedA32(instr); 40945 return; 40946 } 40947 unsigned rm = ExtractQRegister(instr, 5, 0); 40948 // VCNT{<c>}{<q>}.8 <Qd>, <Qm> ; A1 40949 vcnt(al, 40950 Untyped8, 40951 QRegister(rd), 40952 QRegister(rm)); 40953 } else { 40954 UnallocatedA32(instr); 40955 } 40956 break; 40957 } 40958 case 0x00000580: { 40959 // 0xf3b00580 40960 if ((instr & 0x000c0000) == 0x00000000) { 40961 unsigned rd = ExtractDRegister(instr, 22, 12); 40962 unsigned rm = ExtractDRegister(instr, 5, 0); 40963 // VMVN{<c>}{<q>}{.<dt>} <Dd>, <Dm> ; A1 40964 vmvn(al, 40965 kDataTypeValueNone, 40966 DRegister(rd), 40967 DRegister(rm)); 40968 } else { 40969 UnallocatedA32(instr); 40970 } 40971 break; 40972 } 40973 case 0x000005c0: { 40974 // 0xf3b005c0 40975 if ((instr & 0x000c0000) == 0x00000000) { 40976 if (((instr >> 12) & 1) != 0) { 40977 UnallocatedA32(instr); 40978 return; 40979 } 40980 unsigned rd = ExtractQRegister(instr, 22, 12); 40981 if ((instr & 1) != 0) { 40982 UnallocatedA32(instr); 40983 return; 40984 } 40985 unsigned rm = ExtractQRegister(instr, 5, 0); 40986 // VMVN{<c>}{<q>}{.<dt>} <Qd>, <Qm> ; A1 40987 vmvn(al, 40988 kDataTypeValueNone, 40989 QRegister(rd), 40990 QRegister(rm)); 40991 } else { 40992 UnallocatedA32(instr); 40993 } 40994 break; 40995 } 40996 default: 40997 UnallocatedA32(instr); 40998 break; 40999 } 41000 break; 41001 } 41002 case 0x00000200: { 41003 // 0xf3b00200 41004 switch (instr & 0x00000540) { 41005 case 0x00000000: { 41006 // 0xf3b00200 41007 DataType dt = 41008 Dt_op_size_2_Decode(((instr >> 18) & 0x3) | 41009 ((instr >> 5) & 0x4)); 41010 if (dt.Is(kDataTypeValueInvalid)) { 41011 UnallocatedA32(instr); 41012 return; 41013 } 41014 unsigned rd = ExtractDRegister(instr, 22, 12); 41015 unsigned rm = ExtractDRegister(instr, 5, 0); 41016 // VPADDL{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1 41017 vpaddl(al, dt, DRegister(rd), DRegister(rm)); 41018 break; 41019 } 41020 case 0x00000040: { 41021 // 0xf3b00240 41022 DataType dt = 41023 Dt_op_size_2_Decode(((instr >> 18) & 0x3) | 41024 ((instr >> 5) & 0x4)); 41025 if (dt.Is(kDataTypeValueInvalid)) { 41026 UnallocatedA32(instr); 41027 return; 41028 } 41029 if (((instr >> 12) & 1) != 0) { 41030 UnallocatedA32(instr); 41031 return; 41032 } 41033 unsigned rd = ExtractQRegister(instr, 22, 12); 41034 if ((instr & 1) != 0) { 41035 UnallocatedA32(instr); 41036 return; 41037 } 41038 unsigned rm = ExtractQRegister(instr, 5, 0); 41039 // VPADDL{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1 41040 vpaddl(al, dt, QRegister(rd), QRegister(rm)); 41041 break; 41042 } 41043 case 0x00000100: { 41044 // 0xf3b00300 41045 switch (instr & 0x00000080) { 41046 case 0x00000000: { 41047 // 0xf3b00300 41048 UnimplementedA32("AESE", instr); 41049 break; 41050 } 41051 case 0x00000080: { 41052 // 0xf3b00380 41053 UnimplementedA32("AESMC", instr); 41054 break; 41055 } 41056 } 41057 break; 41058 } 41059 case 0x00000140: { 41060 // 0xf3b00340 41061 switch (instr & 0x00000080) { 41062 case 0x00000000: { 41063 // 0xf3b00340 41064 UnimplementedA32("AESD", instr); 41065 break; 41066 } 41067 case 0x00000080: { 41068 // 0xf3b003c0 41069 UnimplementedA32("AESIMC", instr); 41070 break; 41071 } 41072 } 41073 break; 41074 } 41075 case 0x00000400: { 41076 // 0xf3b00600 41077 DataType dt = 41078 Dt_op_size_2_Decode(((instr >> 18) & 0x3) | 41079 ((instr >> 5) & 0x4)); 41080 if (dt.Is(kDataTypeValueInvalid)) { 41081 UnallocatedA32(instr); 41082 return; 41083 } 41084 unsigned rd = ExtractDRegister(instr, 22, 12); 41085 unsigned rm = ExtractDRegister(instr, 5, 0); 41086 // VPADAL{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1 41087 vpadal(al, dt, DRegister(rd), DRegister(rm)); 41088 break; 41089 } 41090 case 0x00000440: { 41091 // 0xf3b00640 41092 DataType dt = 41093 Dt_op_size_2_Decode(((instr >> 18) & 0x3) | 41094 ((instr >> 5) & 0x4)); 41095 if (dt.Is(kDataTypeValueInvalid)) { 41096 UnallocatedA32(instr); 41097 return; 41098 } 41099 if (((instr >> 12) & 1) != 0) { 41100 UnallocatedA32(instr); 41101 return; 41102 } 41103 unsigned rd = ExtractQRegister(instr, 22, 12); 41104 if ((instr & 1) != 0) { 41105 UnallocatedA32(instr); 41106 return; 41107 } 41108 unsigned rm = ExtractQRegister(instr, 5, 0); 41109 // VPADAL{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1 41110 vpadal(al, dt, QRegister(rd), QRegister(rm)); 41111 break; 41112 } 41113 case 0x00000500: { 41114 // 0xf3b00700 41115 switch (instr & 0x00000080) { 41116 case 0x00000000: { 41117 // 0xf3b00700 41118 DataType dt = 41119 Dt_size_5_Decode((instr >> 18) & 0x3); 41120 if (dt.Is(kDataTypeValueInvalid)) { 41121 UnallocatedA32(instr); 41122 return; 41123 } 41124 unsigned rd = 41125 ExtractDRegister(instr, 22, 12); 41126 unsigned rm = ExtractDRegister(instr, 5, 0); 41127 // VQABS{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1 41128 vqabs(al, dt, DRegister(rd), DRegister(rm)); 41129 break; 41130 } 41131 case 0x00000080: { 41132 // 0xf3b00780 41133 DataType dt = 41134 Dt_size_5_Decode((instr >> 18) & 0x3); 41135 if (dt.Is(kDataTypeValueInvalid)) { 41136 UnallocatedA32(instr); 41137 return; 41138 } 41139 unsigned rd = 41140 ExtractDRegister(instr, 22, 12); 41141 unsigned rm = ExtractDRegister(instr, 5, 0); 41142 // VQNEG{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1 41143 vqneg(al, dt, DRegister(rd), DRegister(rm)); 41144 break; 41145 } 41146 } 41147 break; 41148 } 41149 case 0x00000540: { 41150 // 0xf3b00740 41151 switch (instr & 0x00000080) { 41152 case 0x00000000: { 41153 // 0xf3b00740 41154 DataType dt = 41155 Dt_size_5_Decode((instr >> 18) & 0x3); 41156 if (dt.Is(kDataTypeValueInvalid)) { 41157 UnallocatedA32(instr); 41158 return; 41159 } 41160 if (((instr >> 12) & 1) != 0) { 41161 UnallocatedA32(instr); 41162 return; 41163 } 41164 unsigned rd = 41165 ExtractQRegister(instr, 22, 12); 41166 if ((instr & 1) != 0) { 41167 UnallocatedA32(instr); 41168 return; 41169 } 41170 unsigned rm = ExtractQRegister(instr, 5, 0); 41171 // VQABS{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1 41172 vqabs(al, dt, QRegister(rd), QRegister(rm)); 41173 break; 41174 } 41175 case 0x00000080: { 41176 // 0xf3b007c0 41177 DataType dt = 41178 Dt_size_5_Decode((instr >> 18) & 0x3); 41179 if (dt.Is(kDataTypeValueInvalid)) { 41180 UnallocatedA32(instr); 41181 return; 41182 } 41183 if (((instr >> 12) & 1) != 0) { 41184 UnallocatedA32(instr); 41185 return; 41186 } 41187 unsigned rd = 41188 ExtractQRegister(instr, 22, 12); 41189 if ((instr & 1) != 0) { 41190 UnallocatedA32(instr); 41191 return; 41192 } 41193 unsigned rm = ExtractQRegister(instr, 5, 0); 41194 // VQNEG{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1 41195 vqneg(al, dt, QRegister(rd), QRegister(rm)); 41196 break; 41197 } 41198 } 41199 break; 41200 } 41201 } 41202 break; 41203 } 41204 case 0x00010000: { 41205 // 0xf3b10000 41206 switch (instr & 0x000001c0) { 41207 case 0x00000000: { 41208 // 0xf3b10000 41209 DataType dt = 41210 Dt_F_size_1_Decode(((instr >> 18) & 0x3) | 41211 ((instr >> 8) & 0x4)); 41212 if (dt.Is(kDataTypeValueInvalid)) { 41213 UnallocatedA32(instr); 41214 return; 41215 } 41216 unsigned rd = ExtractDRegister(instr, 22, 12); 41217 unsigned rm = ExtractDRegister(instr, 5, 0); 41218 // VCGT{<c>}{<q>}.<dt> {<Dd>}, <Dm>, #0 ; A1 41219 vcgt(al, 41220 dt, 41221 DRegister(rd), 41222 DRegister(rm), 41223 UINT32_C(0)); 41224 break; 41225 } 41226 case 0x00000040: { 41227 // 0xf3b10040 41228 DataType dt = 41229 Dt_F_size_1_Decode(((instr >> 18) & 0x3) | 41230 ((instr >> 8) & 0x4)); 41231 if (dt.Is(kDataTypeValueInvalid)) { 41232 UnallocatedA32(instr); 41233 return; 41234 } 41235 if (((instr >> 12) & 1) != 0) { 41236 UnallocatedA32(instr); 41237 return; 41238 } 41239 unsigned rd = ExtractQRegister(instr, 22, 12); 41240 if ((instr & 1) != 0) { 41241 UnallocatedA32(instr); 41242 return; 41243 } 41244 unsigned rm = ExtractQRegister(instr, 5, 0); 41245 // VCGT{<c>}{<q>}.<dt> {<Qd>}, <Qm>, #0 ; A1 41246 vcgt(al, 41247 dt, 41248 QRegister(rd), 41249 QRegister(rm), 41250 UINT32_C(0)); 41251 break; 41252 } 41253 case 0x00000080: { 41254 // 0xf3b10080 41255 DataType dt = 41256 Dt_F_size_1_Decode(((instr >> 18) & 0x3) | 41257 ((instr >> 8) & 0x4)); 41258 if (dt.Is(kDataTypeValueInvalid)) { 41259 UnallocatedA32(instr); 41260 return; 41261 } 41262 unsigned rd = ExtractDRegister(instr, 22, 12); 41263 unsigned rm = ExtractDRegister(instr, 5, 0); 41264 // VCGE{<c>}{<q>}.<dt> {<Dd>}, <Dm>, #0 ; A1 41265 vcge(al, 41266 dt, 41267 DRegister(rd), 41268 DRegister(rm), 41269 UINT32_C(0)); 41270 break; 41271 } 41272 case 0x000000c0: { 41273 // 0xf3b100c0 41274 DataType dt = 41275 Dt_F_size_1_Decode(((instr >> 18) & 0x3) | 41276 ((instr >> 8) & 0x4)); 41277 if (dt.Is(kDataTypeValueInvalid)) { 41278 UnallocatedA32(instr); 41279 return; 41280 } 41281 if (((instr >> 12) & 1) != 0) { 41282 UnallocatedA32(instr); 41283 return; 41284 } 41285 unsigned rd = ExtractQRegister(instr, 22, 12); 41286 if ((instr & 1) != 0) { 41287 UnallocatedA32(instr); 41288 return; 41289 } 41290 unsigned rm = ExtractQRegister(instr, 5, 0); 41291 // VCGE{<c>}{<q>}.<dt> {<Qd>}, <Qm>, #0 ; A1 41292 vcge(al, 41293 dt, 41294 QRegister(rd), 41295 QRegister(rm), 41296 UINT32_C(0)); 41297 break; 41298 } 41299 case 0x00000100: { 41300 // 0xf3b10100 41301 DataType dt = 41302 Dt_F_size_2_Decode(((instr >> 18) & 0x3) | 41303 ((instr >> 8) & 0x4)); 41304 if (dt.Is(kDataTypeValueInvalid)) { 41305 UnallocatedA32(instr); 41306 return; 41307 } 41308 unsigned rd = ExtractDRegister(instr, 22, 12); 41309 unsigned rm = ExtractDRegister(instr, 5, 0); 41310 // VCEQ{<c>}{<q>}.<dt> {<Dd>}, <Dm>, #0 ; A1 41311 vceq(al, 41312 dt, 41313 DRegister(rd), 41314 DRegister(rm), 41315 UINT32_C(0)); 41316 break; 41317 } 41318 case 0x00000140: { 41319 // 0xf3b10140 41320 DataType dt = 41321 Dt_F_size_2_Decode(((instr >> 18) & 0x3) | 41322 ((instr >> 8) & 0x4)); 41323 if (dt.Is(kDataTypeValueInvalid)) { 41324 UnallocatedA32(instr); 41325 return; 41326 } 41327 if (((instr >> 12) & 1) != 0) { 41328 UnallocatedA32(instr); 41329 return; 41330 } 41331 unsigned rd = ExtractQRegister(instr, 22, 12); 41332 if ((instr & 1) != 0) { 41333 UnallocatedA32(instr); 41334 return; 41335 } 41336 unsigned rm = ExtractQRegister(instr, 5, 0); 41337 // VCEQ{<c>}{<q>}.<dt> {<Qd>}, <Qm>, #0 ; A1 41338 vceq(al, 41339 dt, 41340 QRegister(rd), 41341 QRegister(rm), 41342 UINT32_C(0)); 41343 break; 41344 } 41345 case 0x00000180: { 41346 // 0xf3b10180 41347 DataType dt = 41348 Dt_F_size_1_Decode(((instr >> 18) & 0x3) | 41349 ((instr >> 8) & 0x4)); 41350 if (dt.Is(kDataTypeValueInvalid)) { 41351 UnallocatedA32(instr); 41352 return; 41353 } 41354 unsigned rd = ExtractDRegister(instr, 22, 12); 41355 unsigned rm = ExtractDRegister(instr, 5, 0); 41356 // VCLE{<c>}{<q>}.<dt> {<Dd>}, <Dm>, #0 ; A1 41357 vcle(al, 41358 dt, 41359 DRegister(rd), 41360 DRegister(rm), 41361 UINT32_C(0)); 41362 break; 41363 } 41364 case 0x000001c0: { 41365 // 0xf3b101c0 41366 DataType dt = 41367 Dt_F_size_1_Decode(((instr >> 18) & 0x3) | 41368 ((instr >> 8) & 0x4)); 41369 if (dt.Is(kDataTypeValueInvalid)) { 41370 UnallocatedA32(instr); 41371 return; 41372 } 41373 if (((instr >> 12) & 1) != 0) { 41374 UnallocatedA32(instr); 41375 return; 41376 } 41377 unsigned rd = ExtractQRegister(instr, 22, 12); 41378 if ((instr & 1) != 0) { 41379 UnallocatedA32(instr); 41380 return; 41381 } 41382 unsigned rm = ExtractQRegister(instr, 5, 0); 41383 // VCLE{<c>}{<q>}.<dt> {<Qd>}, <Qm>, #0 ; A1 41384 vcle(al, 41385 dt, 41386 QRegister(rd), 41387 QRegister(rm), 41388 UINT32_C(0)); 41389 break; 41390 } 41391 } 41392 break; 41393 } 41394 case 0x00010200: { 41395 // 0xf3b10200 41396 switch (instr & 0x000001c0) { 41397 case 0x00000000: { 41398 // 0xf3b10200 41399 DataType dt = 41400 Dt_F_size_1_Decode(((instr >> 18) & 0x3) | 41401 ((instr >> 8) & 0x4)); 41402 if (dt.Is(kDataTypeValueInvalid)) { 41403 UnallocatedA32(instr); 41404 return; 41405 } 41406 unsigned rd = ExtractDRegister(instr, 22, 12); 41407 unsigned rm = ExtractDRegister(instr, 5, 0); 41408 // VCLT{<c>}{<q>}.<dt> {<Dd>}, <Dm>, #0 ; A1 41409 vclt(al, 41410 dt, 41411 DRegister(rd), 41412 DRegister(rm), 41413 UINT32_C(0)); 41414 break; 41415 } 41416 case 0x00000040: { 41417 // 0xf3b10240 41418 DataType dt = 41419 Dt_F_size_1_Decode(((instr >> 18) & 0x3) | 41420 ((instr >> 8) & 0x4)); 41421 if (dt.Is(kDataTypeValueInvalid)) { 41422 UnallocatedA32(instr); 41423 return; 41424 } 41425 if (((instr >> 12) & 1) != 0) { 41426 UnallocatedA32(instr); 41427 return; 41428 } 41429 unsigned rd = ExtractQRegister(instr, 22, 12); 41430 if ((instr & 1) != 0) { 41431 UnallocatedA32(instr); 41432 return; 41433 } 41434 unsigned rm = ExtractQRegister(instr, 5, 0); 41435 // VCLT{<c>}{<q>}.<dt> {<Qd>}, <Qm>, #0 ; A1 41436 vclt(al, 41437 dt, 41438 QRegister(rd), 41439 QRegister(rm), 41440 UINT32_C(0)); 41441 break; 41442 } 41443 case 0x000000c0: { 41444 // 0xf3b102c0 41445 if ((instr & 0x000c0400) == 0x00080000) { 41446 UnimplementedA32("SHA1H", instr); 41447 } else { 41448 UnallocatedA32(instr); 41449 } 41450 break; 41451 } 41452 case 0x00000100: { 41453 // 0xf3b10300 41454 DataType dt = 41455 Dt_F_size_1_Decode(((instr >> 18) & 0x3) | 41456 ((instr >> 8) & 0x4)); 41457 if (dt.Is(kDataTypeValueInvalid)) { 41458 UnallocatedA32(instr); 41459 return; 41460 } 41461 unsigned rd = ExtractDRegister(instr, 22, 12); 41462 unsigned rm = ExtractDRegister(instr, 5, 0); 41463 // VABS{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1 41464 vabs(al, dt, DRegister(rd), DRegister(rm)); 41465 break; 41466 } 41467 case 0x00000140: { 41468 // 0xf3b10340 41469 DataType dt = 41470 Dt_F_size_1_Decode(((instr >> 18) & 0x3) | 41471 ((instr >> 8) & 0x4)); 41472 if (dt.Is(kDataTypeValueInvalid)) { 41473 UnallocatedA32(instr); 41474 return; 41475 } 41476 if (((instr >> 12) & 1) != 0) { 41477 UnallocatedA32(instr); 41478 return; 41479 } 41480 unsigned rd = ExtractQRegister(instr, 22, 12); 41481 if ((instr & 1) != 0) { 41482 UnallocatedA32(instr); 41483 return; 41484 } 41485 unsigned rm = ExtractQRegister(instr, 5, 0); 41486 // VABS{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1 41487 vabs(al, dt, QRegister(rd), QRegister(rm)); 41488 break; 41489 } 41490 case 0x00000180: { 41491 // 0xf3b10380 41492 DataType dt = 41493 Dt_F_size_1_Decode(((instr >> 18) & 0x3) | 41494 ((instr >> 8) & 0x4)); 41495 if (dt.Is(kDataTypeValueInvalid)) { 41496 UnallocatedA32(instr); 41497 return; 41498 } 41499 unsigned rd = ExtractDRegister(instr, 22, 12); 41500 unsigned rm = ExtractDRegister(instr, 5, 0); 41501 // VNEG{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1 41502 vneg(al, dt, DRegister(rd), DRegister(rm)); 41503 break; 41504 } 41505 case 0x000001c0: { 41506 // 0xf3b103c0 41507 DataType dt = 41508 Dt_F_size_1_Decode(((instr >> 18) & 0x3) | 41509 ((instr >> 8) & 0x4)); 41510 if (dt.Is(kDataTypeValueInvalid)) { 41511 UnallocatedA32(instr); 41512 return; 41513 } 41514 if (((instr >> 12) & 1) != 0) { 41515 UnallocatedA32(instr); 41516 return; 41517 } 41518 unsigned rd = ExtractQRegister(instr, 22, 12); 41519 if ((instr & 1) != 0) { 41520 UnallocatedA32(instr); 41521 return; 41522 } 41523 unsigned rm = ExtractQRegister(instr, 5, 0); 41524 // VNEG{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1 41525 vneg(al, dt, QRegister(rd), QRegister(rm)); 41526 break; 41527 } 41528 default: 41529 UnallocatedA32(instr); 41530 break; 41531 } 41532 break; 41533 } 41534 case 0x00020000: { 41535 // 0xf3b20000 41536 switch (instr & 0x000005c0) { 41537 case 0x00000000: { 41538 // 0xf3b20000 41539 if ((instr & 0x000c0000) == 0x00000000) { 41540 unsigned rd = ExtractDRegister(instr, 22, 12); 41541 unsigned rm = ExtractDRegister(instr, 5, 0); 41542 // VSWP{<c>}{<q>}{.<dt>} <Dd>, <Dm> ; A1 41543 vswp(al, 41544 kDataTypeValueNone, 41545 DRegister(rd), 41546 DRegister(rm)); 41547 } else { 41548 UnallocatedA32(instr); 41549 } 41550 break; 41551 } 41552 case 0x00000040: { 41553 // 0xf3b20040 41554 if ((instr & 0x000c0000) == 0x00000000) { 41555 if (((instr >> 12) & 1) != 0) { 41556 UnallocatedA32(instr); 41557 return; 41558 } 41559 unsigned rd = ExtractQRegister(instr, 22, 12); 41560 if ((instr & 1) != 0) { 41561 UnallocatedA32(instr); 41562 return; 41563 } 41564 unsigned rm = ExtractQRegister(instr, 5, 0); 41565 // VSWP{<c>}{<q>}{.<dt>} <Qd>, <Qm> ; A1 41566 vswp(al, 41567 kDataTypeValueNone, 41568 QRegister(rd), 41569 QRegister(rm)); 41570 } else { 41571 UnallocatedA32(instr); 41572 } 41573 break; 41574 } 41575 case 0x00000080: { 41576 // 0xf3b20080 41577 DataType dt = 41578 Dt_size_7_Decode((instr >> 18) & 0x3); 41579 if (dt.Is(kDataTypeValueInvalid)) { 41580 UnallocatedA32(instr); 41581 return; 41582 } 41583 unsigned rd = ExtractDRegister(instr, 22, 12); 41584 unsigned rm = ExtractDRegister(instr, 5, 0); 41585 // VTRN{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1 41586 vtrn(al, dt, DRegister(rd), DRegister(rm)); 41587 break; 41588 } 41589 case 0x000000c0: { 41590 // 0xf3b200c0 41591 DataType dt = 41592 Dt_size_7_Decode((instr >> 18) & 0x3); 41593 if (dt.Is(kDataTypeValueInvalid)) { 41594 UnallocatedA32(instr); 41595 return; 41596 } 41597 if (((instr >> 12) & 1) != 0) { 41598 UnallocatedA32(instr); 41599 return; 41600 } 41601 unsigned rd = ExtractQRegister(instr, 22, 12); 41602 if ((instr & 1) != 0) { 41603 UnallocatedA32(instr); 41604 return; 41605 } 41606 unsigned rm = ExtractQRegister(instr, 5, 0); 41607 // VTRN{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1 41608 vtrn(al, dt, QRegister(rd), QRegister(rm)); 41609 break; 41610 } 41611 case 0x00000100: { 41612 // 0xf3b20100 41613 DataType dt = 41614 Dt_size_15_Decode((instr >> 18) & 0x3); 41615 if (dt.Is(kDataTypeValueInvalid)) { 41616 UnallocatedA32(instr); 41617 return; 41618 } 41619 unsigned rd = ExtractDRegister(instr, 22, 12); 41620 unsigned rm = ExtractDRegister(instr, 5, 0); 41621 // VUZP{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1 41622 vuzp(al, dt, DRegister(rd), DRegister(rm)); 41623 break; 41624 } 41625 case 0x00000140: { 41626 // 0xf3b20140 41627 DataType dt = 41628 Dt_size_7_Decode((instr >> 18) & 0x3); 41629 if (dt.Is(kDataTypeValueInvalid)) { 41630 UnallocatedA32(instr); 41631 return; 41632 } 41633 if (((instr >> 12) & 1) != 0) { 41634 UnallocatedA32(instr); 41635 return; 41636 } 41637 unsigned rd = ExtractQRegister(instr, 22, 12); 41638 if ((instr & 1) != 0) { 41639 UnallocatedA32(instr); 41640 return; 41641 } 41642 unsigned rm = ExtractQRegister(instr, 5, 0); 41643 // VUZP{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1 41644 vuzp(al, dt, QRegister(rd), QRegister(rm)); 41645 break; 41646 } 41647 case 0x00000180: { 41648 // 0xf3b20180 41649 DataType dt = 41650 Dt_size_15_Decode((instr >> 18) & 0x3); 41651 if (dt.Is(kDataTypeValueInvalid)) { 41652 UnallocatedA32(instr); 41653 return; 41654 } 41655 unsigned rd = ExtractDRegister(instr, 22, 12); 41656 unsigned rm = ExtractDRegister(instr, 5, 0); 41657 // VZIP{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1 41658 vzip(al, dt, DRegister(rd), DRegister(rm)); 41659 break; 41660 } 41661 case 0x000001c0: { 41662 // 0xf3b201c0 41663 DataType dt = 41664 Dt_size_7_Decode((instr >> 18) & 0x3); 41665 if (dt.Is(kDataTypeValueInvalid)) { 41666 UnallocatedA32(instr); 41667 return; 41668 } 41669 if (((instr >> 12) & 1) != 0) { 41670 UnallocatedA32(instr); 41671 return; 41672 } 41673 unsigned rd = ExtractQRegister(instr, 22, 12); 41674 if ((instr & 1) != 0) { 41675 UnallocatedA32(instr); 41676 return; 41677 } 41678 unsigned rm = ExtractQRegister(instr, 5, 0); 41679 // VZIP{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1 41680 vzip(al, dt, QRegister(rd), QRegister(rm)); 41681 break; 41682 } 41683 case 0x00000400: { 41684 // 0xf3b20400 41685 DataType dt = 41686 Dt_size_16_Decode((instr >> 18) & 0x3); 41687 if (dt.Is(kDataTypeValueInvalid)) { 41688 UnallocatedA32(instr); 41689 return; 41690 } 41691 unsigned rd = ExtractDRegister(instr, 22, 12); 41692 unsigned rm = ExtractDRegister(instr, 5, 0); 41693 // VRINTN{<q>}.<dt> <Dd>, <Dm> ; A1 41694 vrintn(dt, DRegister(rd), DRegister(rm)); 41695 break; 41696 } 41697 case 0x00000440: { 41698 // 0xf3b20440 41699 DataType dt = 41700 Dt_size_16_Decode((instr >> 18) & 0x3); 41701 if (dt.Is(kDataTypeValueInvalid)) { 41702 UnallocatedA32(instr); 41703 return; 41704 } 41705 if (((instr >> 12) & 1) != 0) { 41706 UnallocatedA32(instr); 41707 return; 41708 } 41709 unsigned rd = ExtractQRegister(instr, 22, 12); 41710 if ((instr & 1) != 0) { 41711 UnallocatedA32(instr); 41712 return; 41713 } 41714 unsigned rm = ExtractQRegister(instr, 5, 0); 41715 // VRINTN{<q>}.<dt> <Qd>, <Qm> ; A1 41716 vrintn(dt, QRegister(rd), QRegister(rm)); 41717 break; 41718 } 41719 case 0x00000480: { 41720 // 0xf3b20480 41721 DataType dt = 41722 Dt_size_16_Decode((instr >> 18) & 0x3); 41723 if (dt.Is(kDataTypeValueInvalid)) { 41724 UnallocatedA32(instr); 41725 return; 41726 } 41727 unsigned rd = ExtractDRegister(instr, 22, 12); 41728 unsigned rm = ExtractDRegister(instr, 5, 0); 41729 // VRINTX{<q>}.<dt> <Dd>, <Dm> ; A1 41730 vrintx(al, dt, DRegister(rd), DRegister(rm)); 41731 break; 41732 } 41733 case 0x000004c0: { 41734 // 0xf3b204c0 41735 DataType dt = 41736 Dt_size_16_Decode((instr >> 18) & 0x3); 41737 if (dt.Is(kDataTypeValueInvalid)) { 41738 UnallocatedA32(instr); 41739 return; 41740 } 41741 if (((instr >> 12) & 1) != 0) { 41742 UnallocatedA32(instr); 41743 return; 41744 } 41745 unsigned rd = ExtractQRegister(instr, 22, 12); 41746 if ((instr & 1) != 0) { 41747 UnallocatedA32(instr); 41748 return; 41749 } 41750 unsigned rm = ExtractQRegister(instr, 5, 0); 41751 // VRINTX{<q>}.<dt> <Qd>, <Qm> ; A1 41752 vrintx(dt, QRegister(rd), QRegister(rm)); 41753 break; 41754 } 41755 case 0x00000500: { 41756 // 0xf3b20500 41757 DataType dt = 41758 Dt_size_16_Decode((instr >> 18) & 0x3); 41759 if (dt.Is(kDataTypeValueInvalid)) { 41760 UnallocatedA32(instr); 41761 return; 41762 } 41763 unsigned rd = ExtractDRegister(instr, 22, 12); 41764 unsigned rm = ExtractDRegister(instr, 5, 0); 41765 // VRINTA{<q>}.<dt> <Dd>, <Dm> ; A1 41766 vrinta(dt, DRegister(rd), DRegister(rm)); 41767 break; 41768 } 41769 case 0x00000540: { 41770 // 0xf3b20540 41771 DataType dt = 41772 Dt_size_16_Decode((instr >> 18) & 0x3); 41773 if (dt.Is(kDataTypeValueInvalid)) { 41774 UnallocatedA32(instr); 41775 return; 41776 } 41777 if (((instr >> 12) & 1) != 0) { 41778 UnallocatedA32(instr); 41779 return; 41780 } 41781 unsigned rd = ExtractQRegister(instr, 22, 12); 41782 if ((instr & 1) != 0) { 41783 UnallocatedA32(instr); 41784 return; 41785 } 41786 unsigned rm = ExtractQRegister(instr, 5, 0); 41787 // VRINTA{<q>}.<dt> <Qd>, <Qm> ; A1 41788 vrinta(dt, QRegister(rd), QRegister(rm)); 41789 break; 41790 } 41791 case 0x00000580: { 41792 // 0xf3b20580 41793 DataType dt = 41794 Dt_size_16_Decode((instr >> 18) & 0x3); 41795 if (dt.Is(kDataTypeValueInvalid)) { 41796 UnallocatedA32(instr); 41797 return; 41798 } 41799 unsigned rd = ExtractDRegister(instr, 22, 12); 41800 unsigned rm = ExtractDRegister(instr, 5, 0); 41801 // VRINTZ{<q>}.<dt> <Dd>, <Dm> ; A1 41802 vrintz(al, dt, DRegister(rd), DRegister(rm)); 41803 break; 41804 } 41805 case 0x000005c0: { 41806 // 0xf3b205c0 41807 DataType dt = 41808 Dt_size_16_Decode((instr >> 18) & 0x3); 41809 if (dt.Is(kDataTypeValueInvalid)) { 41810 UnallocatedA32(instr); 41811 return; 41812 } 41813 if (((instr >> 12) & 1) != 0) { 41814 UnallocatedA32(instr); 41815 return; 41816 } 41817 unsigned rd = ExtractQRegister(instr, 22, 12); 41818 if ((instr & 1) != 0) { 41819 UnallocatedA32(instr); 41820 return; 41821 } 41822 unsigned rm = ExtractQRegister(instr, 5, 0); 41823 // VRINTZ{<q>}.<dt> <Qd>, <Qm> ; A1 41824 vrintz(dt, QRegister(rd), QRegister(rm)); 41825 break; 41826 } 41827 } 41828 break; 41829 } 41830 case 0x00020200: { 41831 // 0xf3b20200 41832 switch (instr & 0x00000580) { 41833 case 0x00000000: { 41834 // 0xf3b20200 41835 switch (instr & 0x00000040) { 41836 case 0x00000000: { 41837 // 0xf3b20200 41838 DataType dt = 41839 Dt_size_3_Decode((instr >> 18) & 0x3); 41840 if (dt.Is(kDataTypeValueInvalid)) { 41841 UnallocatedA32(instr); 41842 return; 41843 } 41844 unsigned rd = 41845 ExtractDRegister(instr, 22, 12); 41846 if ((instr & 1) != 0) { 41847 UnallocatedA32(instr); 41848 return; 41849 } 41850 unsigned rm = ExtractQRegister(instr, 5, 0); 41851 // VMOVN{<c>}{<q>}.<dt> <Dd>, <Qm> ; A1 41852 vmovn(al, dt, DRegister(rd), QRegister(rm)); 41853 break; 41854 } 41855 case 0x00000040: { 41856 // 0xf3b20240 41857 DataType dt = 41858 Dt_size_14_Decode((instr >> 18) & 0x3); 41859 if (dt.Is(kDataTypeValueInvalid)) { 41860 UnallocatedA32(instr); 41861 return; 41862 } 41863 unsigned rd = 41864 ExtractDRegister(instr, 22, 12); 41865 if ((instr & 1) != 0) { 41866 UnallocatedA32(instr); 41867 return; 41868 } 41869 unsigned rm = ExtractQRegister(instr, 5, 0); 41870 // VQMOVUN{<c>}{<q>}.<dt> <Dd>, <Qm> ; A1 41871 vqmovun(al, 41872 dt, 41873 DRegister(rd), 41874 QRegister(rm)); 41875 break; 41876 } 41877 } 41878 break; 41879 } 41880 case 0x00000080: { 41881 // 0xf3b20280 41882 DataType dt = 41883 Dt_op_size_3_Decode(((instr >> 18) & 0x3) | 41884 ((instr >> 4) & 0x4)); 41885 if (dt.Is(kDataTypeValueInvalid)) { 41886 UnallocatedA32(instr); 41887 return; 41888 } 41889 unsigned rd = ExtractDRegister(instr, 22, 12); 41890 if ((instr & 1) != 0) { 41891 UnallocatedA32(instr); 41892 return; 41893 } 41894 unsigned rm = ExtractQRegister(instr, 5, 0); 41895 // VQMOVN{<c>}{<q>}.<dt> <Dd>, <Qm> ; A1 41896 vqmovn(al, dt, DRegister(rd), QRegister(rm)); 41897 break; 41898 } 41899 case 0x00000100: { 41900 // 0xf3b20300 41901 if ((instr & 0x00000040) == 0x00000000) { 41902 DataType dt = 41903 Dt_size_17_Decode((instr >> 18) & 0x3); 41904 if (dt.Is(kDataTypeValueInvalid)) { 41905 UnallocatedA32(instr); 41906 return; 41907 } 41908 if (((instr >> 12) & 1) != 0) { 41909 UnallocatedA32(instr); 41910 return; 41911 } 41912 unsigned rd = ExtractQRegister(instr, 22, 12); 41913 unsigned rm = ExtractDRegister(instr, 5, 0); 41914 uint32_t imm = dt.GetSize(); 41915 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A2 NOLINT(whitespace/line_length) 41916 vshll(al, 41917 dt, 41918 QRegister(rd), 41919 DRegister(rm), 41920 imm); 41921 } else { 41922 UnallocatedA32(instr); 41923 } 41924 break; 41925 } 41926 case 0x00000180: { 41927 // 0xf3b20380 41928 switch (instr & 0x000c0040) { 41929 case 0x00080000: { 41930 // 0xf3ba0380 41931 UnimplementedA32("SHA1SU1", instr); 41932 break; 41933 } 41934 case 0x00080040: { 41935 // 0xf3ba03c0 41936 UnimplementedA32("SHA256SU0", instr); 41937 break; 41938 } 41939 default: 41940 UnallocatedA32(instr); 41941 break; 41942 } 41943 break; 41944 } 41945 case 0x00000400: { 41946 // 0xf3b20600 41947 if ((instr & 0x000c0040) == 0x00040000) { 41948 unsigned rd = ExtractDRegister(instr, 22, 12); 41949 if ((instr & 1) != 0) { 41950 UnallocatedA32(instr); 41951 return; 41952 } 41953 unsigned rm = ExtractQRegister(instr, 5, 0); 41954 // VCVT{<c>}{<q>}.F16.F32 <Dd>, <Qm> ; A1 41955 vcvt(al, 41956 F16, 41957 F32, 41958 DRegister(rd), 41959 QRegister(rm)); 41960 } else { 41961 UnallocatedA32(instr); 41962 } 41963 break; 41964 } 41965 case 0x00000480: { 41966 // 0xf3b20680 41967 switch (instr & 0x00000040) { 41968 case 0x00000000: { 41969 // 0xf3b20680 41970 DataType dt = 41971 Dt_size_16_Decode((instr >> 18) & 0x3); 41972 if (dt.Is(kDataTypeValueInvalid)) { 41973 UnallocatedA32(instr); 41974 return; 41975 } 41976 unsigned rd = 41977 ExtractDRegister(instr, 22, 12); 41978 unsigned rm = ExtractDRegister(instr, 5, 0); 41979 // VRINTM{<q>}.<dt> <Dd>, <Dm> ; A1 41980 vrintm(dt, DRegister(rd), DRegister(rm)); 41981 break; 41982 } 41983 case 0x00000040: { 41984 // 0xf3b206c0 41985 DataType dt = 41986 Dt_size_16_Decode((instr >> 18) & 0x3); 41987 if (dt.Is(kDataTypeValueInvalid)) { 41988 UnallocatedA32(instr); 41989 return; 41990 } 41991 if (((instr >> 12) & 1) != 0) { 41992 UnallocatedA32(instr); 41993 return; 41994 } 41995 unsigned rd = 41996 ExtractQRegister(instr, 22, 12); 41997 if ((instr & 1) != 0) { 41998 UnallocatedA32(instr); 41999 return; 42000 } 42001 unsigned rm = ExtractQRegister(instr, 5, 0); 42002 // VRINTM{<q>}.<dt> <Qd>, <Qm> ; A1 42003 vrintm(dt, QRegister(rd), QRegister(rm)); 42004 break; 42005 } 42006 } 42007 break; 42008 } 42009 case 0x00000500: { 42010 // 0xf3b20700 42011 if ((instr & 0x000c0040) == 0x00040000) { 42012 if (((instr >> 12) & 1) != 0) { 42013 UnallocatedA32(instr); 42014 return; 42015 } 42016 unsigned rd = ExtractQRegister(instr, 22, 12); 42017 unsigned rm = ExtractDRegister(instr, 5, 0); 42018 // VCVT{<c>}{<q>}.F32.F16 <Qd>, <Dm> ; A1 42019 vcvt(al, 42020 F32, 42021 F16, 42022 QRegister(rd), 42023 DRegister(rm)); 42024 } else { 42025 UnallocatedA32(instr); 42026 } 42027 break; 42028 } 42029 case 0x00000580: { 42030 // 0xf3b20780 42031 switch (instr & 0x00000040) { 42032 case 0x00000000: { 42033 // 0xf3b20780 42034 DataType dt = 42035 Dt_size_16_Decode((instr >> 18) & 0x3); 42036 if (dt.Is(kDataTypeValueInvalid)) { 42037 UnallocatedA32(instr); 42038 return; 42039 } 42040 unsigned rd = 42041 ExtractDRegister(instr, 22, 12); 42042 unsigned rm = ExtractDRegister(instr, 5, 0); 42043 // VRINTP{<q>}.<dt> <Dd>, <Dm> ; A1 42044 vrintp(dt, DRegister(rd), DRegister(rm)); 42045 break; 42046 } 42047 case 0x00000040: { 42048 // 0xf3b207c0 42049 DataType dt = 42050 Dt_size_16_Decode((instr >> 18) & 0x3); 42051 if (dt.Is(kDataTypeValueInvalid)) { 42052 UnallocatedA32(instr); 42053 return; 42054 } 42055 if (((instr >> 12) & 1) != 0) { 42056 UnallocatedA32(instr); 42057 return; 42058 } 42059 unsigned rd = 42060 ExtractQRegister(instr, 22, 12); 42061 if ((instr & 1) != 0) { 42062 UnallocatedA32(instr); 42063 return; 42064 } 42065 unsigned rm = ExtractQRegister(instr, 5, 0); 42066 // VRINTP{<q>}.<dt> <Qd>, <Qm> ; A1 42067 vrintp(dt, QRegister(rd), QRegister(rm)); 42068 break; 42069 } 42070 } 42071 break; 42072 } 42073 } 42074 break; 42075 } 42076 case 0x00030000: { 42077 // 0xf3b30000 42078 switch (instr & 0x00000440) { 42079 case 0x00000000: { 42080 // 0xf3b30000 42081 switch (instr & 0x000c0100) { 42082 case 0x00080000: { 42083 // 0xf3bb0000 42084 DataType dt = 42085 Dt_op_3_Decode((instr >> 7) & 0x1); 42086 if (dt.Is(kDataTypeValueInvalid)) { 42087 UnallocatedA32(instr); 42088 return; 42089 } 42090 unsigned rd = 42091 ExtractDRegister(instr, 22, 12); 42092 unsigned rm = ExtractDRegister(instr, 5, 0); 42093 // VCVTA{<q>}.<dt>.F32 <Dd>, <Dm> ; A1 42094 vcvta(dt, 42095 F32, 42096 DRegister(rd), 42097 DRegister(rm)); 42098 break; 42099 } 42100 case 0x00080100: { 42101 // 0xf3bb0100 42102 DataType dt = 42103 Dt_op_3_Decode((instr >> 7) & 0x1); 42104 if (dt.Is(kDataTypeValueInvalid)) { 42105 UnallocatedA32(instr); 42106 return; 42107 } 42108 unsigned rd = 42109 ExtractDRegister(instr, 22, 12); 42110 unsigned rm = ExtractDRegister(instr, 5, 0); 42111 // VCVTN{<q>}.<dt>.F32 <Dd>, <Dm> ; A1 42112 vcvtn(dt, 42113 F32, 42114 DRegister(rd), 42115 DRegister(rm)); 42116 break; 42117 } 42118 default: 42119 UnallocatedA32(instr); 42120 break; 42121 } 42122 break; 42123 } 42124 case 0x00000040: { 42125 // 0xf3b30040 42126 switch (instr & 0x000c0100) { 42127 case 0x00080000: { 42128 // 0xf3bb0040 42129 DataType dt = 42130 Dt_op_3_Decode((instr >> 7) & 0x1); 42131 if (dt.Is(kDataTypeValueInvalid)) { 42132 UnallocatedA32(instr); 42133 return; 42134 } 42135 if (((instr >> 12) & 1) != 0) { 42136 UnallocatedA32(instr); 42137 return; 42138 } 42139 unsigned rd = 42140 ExtractQRegister(instr, 22, 12); 42141 if ((instr & 1) != 0) { 42142 UnallocatedA32(instr); 42143 return; 42144 } 42145 unsigned rm = ExtractQRegister(instr, 5, 0); 42146 // VCVTA{<q>}.<dt>.F32 <Qd>, <Qm> ; A1 42147 vcvta(dt, 42148 F32, 42149 QRegister(rd), 42150 QRegister(rm)); 42151 break; 42152 } 42153 case 0x00080100: { 42154 // 0xf3bb0140 42155 DataType dt = 42156 Dt_op_3_Decode((instr >> 7) & 0x1); 42157 if (dt.Is(kDataTypeValueInvalid)) { 42158 UnallocatedA32(instr); 42159 return; 42160 } 42161 if (((instr >> 12) & 1) != 0) { 42162 UnallocatedA32(instr); 42163 return; 42164 } 42165 unsigned rd = 42166 ExtractQRegister(instr, 22, 12); 42167 if ((instr & 1) != 0) { 42168 UnallocatedA32(instr); 42169 return; 42170 } 42171 unsigned rm = ExtractQRegister(instr, 5, 0); 42172 // VCVTN{<q>}.<dt>.F32 <Qd>, <Qm> ; A1 42173 vcvtn(dt, 42174 F32, 42175 QRegister(rd), 42176 QRegister(rm)); 42177 break; 42178 } 42179 default: 42180 UnallocatedA32(instr); 42181 break; 42182 } 42183 break; 42184 } 42185 case 0x00000400: { 42186 // 0xf3b30400 42187 switch (instr & 0x00000080) { 42188 case 0x00000000: { 42189 // 0xf3b30400 42190 DataType dt = Dt_F_size_4_Decode( 42191 ((instr >> 18) & 0x3) | 42192 ((instr >> 6) & 0x4)); 42193 if (dt.Is(kDataTypeValueInvalid)) { 42194 UnallocatedA32(instr); 42195 return; 42196 } 42197 unsigned rd = 42198 ExtractDRegister(instr, 22, 12); 42199 unsigned rm = ExtractDRegister(instr, 5, 0); 42200 // VRECPE{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1 42201 vrecpe(al, 42202 dt, 42203 DRegister(rd), 42204 DRegister(rm)); 42205 break; 42206 } 42207 case 0x00000080: { 42208 // 0xf3b30480 42209 DataType dt = Dt_F_size_4_Decode( 42210 ((instr >> 18) & 0x3) | 42211 ((instr >> 6) & 0x4)); 42212 if (dt.Is(kDataTypeValueInvalid)) { 42213 UnallocatedA32(instr); 42214 return; 42215 } 42216 unsigned rd = 42217 ExtractDRegister(instr, 22, 12); 42218 unsigned rm = ExtractDRegister(instr, 5, 0); 42219 // VRSQRTE{<c>}{<q>}.<dt> <Dd>, <Dm> ; A1 42220 vrsqrte(al, 42221 dt, 42222 DRegister(rd), 42223 DRegister(rm)); 42224 break; 42225 } 42226 } 42227 break; 42228 } 42229 case 0x00000440: { 42230 // 0xf3b30440 42231 switch (instr & 0x00000080) { 42232 case 0x00000000: { 42233 // 0xf3b30440 42234 DataType dt = Dt_F_size_4_Decode( 42235 ((instr >> 18) & 0x3) | 42236 ((instr >> 6) & 0x4)); 42237 if (dt.Is(kDataTypeValueInvalid)) { 42238 UnallocatedA32(instr); 42239 return; 42240 } 42241 if (((instr >> 12) & 1) != 0) { 42242 UnallocatedA32(instr); 42243 return; 42244 } 42245 unsigned rd = 42246 ExtractQRegister(instr, 22, 12); 42247 if ((instr & 1) != 0) { 42248 UnallocatedA32(instr); 42249 return; 42250 } 42251 unsigned rm = ExtractQRegister(instr, 5, 0); 42252 // VRECPE{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1 42253 vrecpe(al, 42254 dt, 42255 QRegister(rd), 42256 QRegister(rm)); 42257 break; 42258 } 42259 case 0x00000080: { 42260 // 0xf3b304c0 42261 DataType dt = Dt_F_size_4_Decode( 42262 ((instr >> 18) & 0x3) | 42263 ((instr >> 6) & 0x4)); 42264 if (dt.Is(kDataTypeValueInvalid)) { 42265 UnallocatedA32(instr); 42266 return; 42267 } 42268 if (((instr >> 12) & 1) != 0) { 42269 UnallocatedA32(instr); 42270 return; 42271 } 42272 unsigned rd = 42273 ExtractQRegister(instr, 22, 12); 42274 if ((instr & 1) != 0) { 42275 UnallocatedA32(instr); 42276 return; 42277 } 42278 unsigned rm = ExtractQRegister(instr, 5, 0); 42279 // VRSQRTE{<c>}{<q>}.<dt> <Qd>, <Qm> ; A1 42280 vrsqrte(al, 42281 dt, 42282 QRegister(rd), 42283 QRegister(rm)); 42284 break; 42285 } 42286 } 42287 break; 42288 } 42289 } 42290 break; 42291 } 42292 case 0x00030200: { 42293 // 0xf3b30200 42294 switch (instr & 0x000c0440) { 42295 case 0x00080000: { 42296 // 0xf3bb0200 42297 switch (instr & 0x00000100) { 42298 case 0x00000000: { 42299 // 0xf3bb0200 42300 DataType dt = 42301 Dt_op_3_Decode((instr >> 7) & 0x1); 42302 if (dt.Is(kDataTypeValueInvalid)) { 42303 UnallocatedA32(instr); 42304 return; 42305 } 42306 unsigned rd = 42307 ExtractDRegister(instr, 22, 12); 42308 unsigned rm = ExtractDRegister(instr, 5, 0); 42309 // VCVTP{<q>}.<dt>.F32 <Dd>, <Dm> ; A1 42310 vcvtp(dt, 42311 F32, 42312 DRegister(rd), 42313 DRegister(rm)); 42314 break; 42315 } 42316 case 0x00000100: { 42317 // 0xf3bb0300 42318 DataType dt = 42319 Dt_op_3_Decode((instr >> 7) & 0x1); 42320 if (dt.Is(kDataTypeValueInvalid)) { 42321 UnallocatedA32(instr); 42322 return; 42323 } 42324 unsigned rd = 42325 ExtractDRegister(instr, 22, 12); 42326 unsigned rm = ExtractDRegister(instr, 5, 0); 42327 // VCVTM{<q>}.<dt>.F32 <Dd>, <Dm> ; A1 42328 vcvtm(dt, 42329 F32, 42330 DRegister(rd), 42331 DRegister(rm)); 42332 break; 42333 } 42334 } 42335 break; 42336 } 42337 case 0x00080040: { 42338 // 0xf3bb0240 42339 switch (instr & 0x00000100) { 42340 case 0x00000000: { 42341 // 0xf3bb0240 42342 DataType dt = 42343 Dt_op_3_Decode((instr >> 7) & 0x1); 42344 if (dt.Is(kDataTypeValueInvalid)) { 42345 UnallocatedA32(instr); 42346 return; 42347 } 42348 if (((instr >> 12) & 1) != 0) { 42349 UnallocatedA32(instr); 42350 return; 42351 } 42352 unsigned rd = 42353 ExtractQRegister(instr, 22, 12); 42354 if ((instr & 1) != 0) { 42355 UnallocatedA32(instr); 42356 return; 42357 } 42358 unsigned rm = ExtractQRegister(instr, 5, 0); 42359 // VCVTP{<q>}.<dt>.F32 <Qd>, <Qm> ; A1 42360 vcvtp(dt, 42361 F32, 42362 QRegister(rd), 42363 QRegister(rm)); 42364 break; 42365 } 42366 case 0x00000100: { 42367 // 0xf3bb0340 42368 DataType dt = 42369 Dt_op_3_Decode((instr >> 7) & 0x1); 42370 if (dt.Is(kDataTypeValueInvalid)) { 42371 UnallocatedA32(instr); 42372 return; 42373 } 42374 if (((instr >> 12) & 1) != 0) { 42375 UnallocatedA32(instr); 42376 return; 42377 } 42378 unsigned rd = 42379 ExtractQRegister(instr, 22, 12); 42380 if ((instr & 1) != 0) { 42381 UnallocatedA32(instr); 42382 return; 42383 } 42384 unsigned rm = ExtractQRegister(instr, 5, 0); 42385 // VCVTM{<q>}.<dt>.F32 <Qd>, <Qm> ; A1 42386 vcvtm(dt, 42387 F32, 42388 QRegister(rd), 42389 QRegister(rm)); 42390 break; 42391 } 42392 } 42393 break; 42394 } 42395 case 0x00080400: { 42396 // 0xf3bb0600 42397 DataType dt1 = 42398 Dt_op_1_Decode1((instr >> 7) & 0x3); 42399 if (dt1.Is(kDataTypeValueInvalid)) { 42400 UnallocatedA32(instr); 42401 return; 42402 } 42403 DataType dt2 = 42404 Dt_op_1_Decode2((instr >> 7) & 0x3); 42405 if (dt2.Is(kDataTypeValueInvalid)) { 42406 UnallocatedA32(instr); 42407 return; 42408 } 42409 unsigned rd = ExtractDRegister(instr, 22, 12); 42410 unsigned rm = ExtractDRegister(instr, 5, 0); 42411 // VCVT{<c>}{<q>}.<dt>.<dt> <Dd>, <Dm> ; A1 42412 vcvt(al, 42413 dt1, 42414 dt2, 42415 DRegister(rd), 42416 DRegister(rm)); 42417 break; 42418 } 42419 case 0x00080440: { 42420 // 0xf3bb0640 42421 DataType dt1 = 42422 Dt_op_1_Decode1((instr >> 7) & 0x3); 42423 if (dt1.Is(kDataTypeValueInvalid)) { 42424 UnallocatedA32(instr); 42425 return; 42426 } 42427 DataType dt2 = 42428 Dt_op_1_Decode2((instr >> 7) & 0x3); 42429 if (dt2.Is(kDataTypeValueInvalid)) { 42430 UnallocatedA32(instr); 42431 return; 42432 } 42433 if (((instr >> 12) & 1) != 0) { 42434 UnallocatedA32(instr); 42435 return; 42436 } 42437 unsigned rd = ExtractQRegister(instr, 22, 12); 42438 if ((instr & 1) != 0) { 42439 UnallocatedA32(instr); 42440 return; 42441 } 42442 unsigned rm = ExtractQRegister(instr, 5, 0); 42443 // VCVT{<c>}{<q>}.<dt>.<dt> <Qd>, <Qm> ; A1 42444 vcvt(al, 42445 dt1, 42446 dt2, 42447 QRegister(rd), 42448 QRegister(rm)); 42449 break; 42450 } 42451 default: 42452 UnallocatedA32(instr); 42453 break; 42454 } 42455 break; 42456 } 42457 } 42458 break; 42459 } 42460 case 0x00000800: { 42461 // 0xf3b00800 42462 switch (instr & 0x00000440) { 42463 case 0x00000000: { 42464 // 0xf3b00800 42465 unsigned rd = ExtractDRegister(instr, 22, 12); 42466 unsigned first = ExtractDRegister(instr, 7, 16); 42467 unsigned length; 42468 SpacingType spacing = kSingle; 42469 switch ((instr >> 8) & 0x3) { 42470 default: 42471 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 42472 case 0x0: 42473 length = 1; 42474 break; 42475 case 0x1: 42476 length = 2; 42477 break; 42478 case 0x2: 42479 length = 3; 42480 break; 42481 case 0x3: 42482 length = 4; 42483 break; 42484 } 42485 unsigned last = first + length - 1; 42486 TransferType transfer = kMultipleLanes; 42487 unsigned rm = ExtractDRegister(instr, 5, 0); 42488 // VTBL{<c>}{<q>}.8 <Dd>, <list>, <Dm> ; A1 42489 vtbl(al, 42490 Untyped8, 42491 DRegister(rd), 42492 NeonRegisterList(DRegister(first), 42493 DRegister(last), 42494 spacing, 42495 transfer), 42496 DRegister(rm)); 42497 break; 42498 } 42499 case 0x00000040: { 42500 // 0xf3b00840 42501 unsigned rd = ExtractDRegister(instr, 22, 12); 42502 unsigned first = ExtractDRegister(instr, 7, 16); 42503 unsigned length; 42504 SpacingType spacing = kSingle; 42505 switch ((instr >> 8) & 0x3) { 42506 default: 42507 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 42508 case 0x0: 42509 length = 1; 42510 break; 42511 case 0x1: 42512 length = 2; 42513 break; 42514 case 0x2: 42515 length = 3; 42516 break; 42517 case 0x3: 42518 length = 4; 42519 break; 42520 } 42521 unsigned last = first + length - 1; 42522 TransferType transfer = kMultipleLanes; 42523 unsigned rm = ExtractDRegister(instr, 5, 0); 42524 // VTBX{<c>}{<q>}.8 <Dd>, <list>, <Dm> ; A1 42525 vtbx(al, 42526 Untyped8, 42527 DRegister(rd), 42528 NeonRegisterList(DRegister(first), 42529 DRegister(last), 42530 spacing, 42531 transfer), 42532 DRegister(rm)); 42533 break; 42534 } 42535 case 0x00000400: { 42536 // 0xf3b00c00 42537 if ((instr & 0x00000380) == 0x00000000) { 42538 unsigned lane; 42539 DataType dt = 42540 Dt_imm4_1_Decode((instr >> 16) & 0xf, &lane); 42541 if (dt.Is(kDataTypeValueInvalid)) { 42542 UnallocatedA32(instr); 42543 return; 42544 } 42545 unsigned rd = ExtractDRegister(instr, 22, 12); 42546 unsigned rm = ExtractDRegister(instr, 5, 0); 42547 // VDUP{<c>}{<q>}.<dt> <Dd>, <Dm[x]> ; A1 42548 vdup(al, 42549 dt, 42550 DRegister(rd), 42551 DRegisterLane(rm, lane)); 42552 } else { 42553 UnallocatedA32(instr); 42554 } 42555 break; 42556 } 42557 case 0x00000440: { 42558 // 0xf3b00c40 42559 if ((instr & 0x00000380) == 0x00000000) { 42560 unsigned lane; 42561 DataType dt = 42562 Dt_imm4_1_Decode((instr >> 16) & 0xf, &lane); 42563 if (dt.Is(kDataTypeValueInvalid)) { 42564 UnallocatedA32(instr); 42565 return; 42566 } 42567 if (((instr >> 12) & 1) != 0) { 42568 UnallocatedA32(instr); 42569 return; 42570 } 42571 unsigned rd = ExtractQRegister(instr, 22, 12); 42572 unsigned rm = ExtractDRegister(instr, 5, 0); 42573 // VDUP{<c>}{<q>}.<dt> <Qd>, <Dm[x]> ; A1 42574 vdup(al, 42575 dt, 42576 QRegister(rd), 42577 DRegisterLane(rm, lane)); 42578 } else { 42579 UnallocatedA32(instr); 42580 } 42581 break; 42582 } 42583 } 42584 break; 42585 } 42586 } 42587 break; 42588 } 42589 } 42590 break; 42591 } 42592 default: { 42593 switch (instr & 0x00000c40) { 42594 case 0x00000000: { 42595 // 0xf2800000 42596 switch (instr & 0x00000300) { 42597 case 0x00000000: { 42598 // 0xf2800000 42599 if (((instr & 0x300000) == 0x300000)) { 42600 UnallocatedA32(instr); 42601 return; 42602 } 42603 DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) | 42604 ((instr >> 22) & 0x4)); 42605 if (dt.Is(kDataTypeValueInvalid)) { 42606 UnallocatedA32(instr); 42607 return; 42608 } 42609 if (((instr >> 12) & 1) != 0) { 42610 UnallocatedA32(instr); 42611 return; 42612 } 42613 unsigned rd = ExtractQRegister(instr, 22, 12); 42614 unsigned rn = ExtractDRegister(instr, 7, 16); 42615 unsigned rm = ExtractDRegister(instr, 5, 0); 42616 // VADDL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; A1 42617 vaddl(al, 42618 dt, 42619 QRegister(rd), 42620 DRegister(rn), 42621 DRegister(rm)); 42622 break; 42623 } 42624 case 0x00000100: { 42625 // 0xf2800100 42626 if (((instr & 0x300000) == 0x300000)) { 42627 UnallocatedA32(instr); 42628 return; 42629 } 42630 DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) | 42631 ((instr >> 22) & 0x4)); 42632 if (dt.Is(kDataTypeValueInvalid)) { 42633 UnallocatedA32(instr); 42634 return; 42635 } 42636 if (((instr >> 12) & 1) != 0) { 42637 UnallocatedA32(instr); 42638 return; 42639 } 42640 unsigned rd = ExtractQRegister(instr, 22, 12); 42641 if (((instr >> 16) & 1) != 0) { 42642 UnallocatedA32(instr); 42643 return; 42644 } 42645 unsigned rn = ExtractQRegister(instr, 7, 16); 42646 unsigned rm = ExtractDRegister(instr, 5, 0); 42647 // VADDW{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Dm> ; A1 42648 vaddw(al, 42649 dt, 42650 QRegister(rd), 42651 QRegister(rn), 42652 DRegister(rm)); 42653 break; 42654 } 42655 case 0x00000200: { 42656 // 0xf2800200 42657 if (((instr & 0x300000) == 0x300000)) { 42658 UnallocatedA32(instr); 42659 return; 42660 } 42661 DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) | 42662 ((instr >> 22) & 0x4)); 42663 if (dt.Is(kDataTypeValueInvalid)) { 42664 UnallocatedA32(instr); 42665 return; 42666 } 42667 if (((instr >> 12) & 1) != 0) { 42668 UnallocatedA32(instr); 42669 return; 42670 } 42671 unsigned rd = ExtractQRegister(instr, 22, 12); 42672 unsigned rn = ExtractDRegister(instr, 7, 16); 42673 unsigned rm = ExtractDRegister(instr, 5, 0); 42674 // VSUBL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; A1 42675 vsubl(al, 42676 dt, 42677 QRegister(rd), 42678 DRegister(rn), 42679 DRegister(rm)); 42680 break; 42681 } 42682 case 0x00000300: { 42683 // 0xf2800300 42684 if (((instr & 0x300000) == 0x300000)) { 42685 UnallocatedA32(instr); 42686 return; 42687 } 42688 DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) | 42689 ((instr >> 22) & 0x4)); 42690 if (dt.Is(kDataTypeValueInvalid)) { 42691 UnallocatedA32(instr); 42692 return; 42693 } 42694 if (((instr >> 12) & 1) != 0) { 42695 UnallocatedA32(instr); 42696 return; 42697 } 42698 unsigned rd = ExtractQRegister(instr, 22, 12); 42699 if (((instr >> 16) & 1) != 0) { 42700 UnallocatedA32(instr); 42701 return; 42702 } 42703 unsigned rn = ExtractQRegister(instr, 7, 16); 42704 unsigned rm = ExtractDRegister(instr, 5, 0); 42705 // VSUBW{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Dm> ; A1 42706 vsubw(al, 42707 dt, 42708 QRegister(rd), 42709 QRegister(rn), 42710 DRegister(rm)); 42711 break; 42712 } 42713 } 42714 break; 42715 } 42716 case 0x00000040: { 42717 // 0xf2800040 42718 switch (instr & 0x00000200) { 42719 case 0x00000000: { 42720 // 0xf2800040 42721 switch (instr & 0x01000000) { 42722 case 0x00000000: { 42723 // 0xf2800040 42724 if (((instr & 0x300000) == 0x300000)) { 42725 UnallocatedA32(instr); 42726 return; 42727 } 42728 DataType dt = Dt_size_9_Decode((instr >> 20) & 0x3, 42729 (instr >> 8) & 0x1); 42730 if (dt.Is(kDataTypeValueInvalid)) { 42731 UnallocatedA32(instr); 42732 return; 42733 } 42734 unsigned rd = ExtractDRegister(instr, 22, 12); 42735 unsigned rn = ExtractDRegister(instr, 7, 16); 42736 int lane; 42737 unsigned rm = 42738 ExtractDRegisterAndLane(instr, dt, 5, 0, &lane); 42739 // VMLA{<c>}{<q>}.<type><size> <Dd>, <Dn>, <Dm[x]> ; A1 NOLINT(whitespace/line_length) 42740 vmla(al, 42741 dt, 42742 DRegister(rd), 42743 DRegister(rn), 42744 DRegisterLane(rm, lane)); 42745 break; 42746 } 42747 case 0x01000000: { 42748 // 0xf3800040 42749 if (((instr & 0x300000) == 0x300000)) { 42750 UnallocatedA32(instr); 42751 return; 42752 } 42753 DataType dt = Dt_size_9_Decode((instr >> 20) & 0x3, 42754 (instr >> 8) & 0x1); 42755 if (dt.Is(kDataTypeValueInvalid)) { 42756 UnallocatedA32(instr); 42757 return; 42758 } 42759 if (((instr >> 12) & 1) != 0) { 42760 UnallocatedA32(instr); 42761 return; 42762 } 42763 unsigned rd = ExtractQRegister(instr, 22, 12); 42764 if (((instr >> 16) & 1) != 0) { 42765 UnallocatedA32(instr); 42766 return; 42767 } 42768 unsigned rn = ExtractQRegister(instr, 7, 16); 42769 int lane; 42770 unsigned rm = 42771 ExtractDRegisterAndLane(instr, dt, 5, 0, &lane); 42772 // VMLA{<c>}{<q>}.<type><size> <Qd>, <Qn>, <Dm[x]> ; A1 NOLINT(whitespace/line_length) 42773 vmla(al, 42774 dt, 42775 QRegister(rd), 42776 QRegister(rn), 42777 DRegisterLane(rm, lane)); 42778 break; 42779 } 42780 } 42781 break; 42782 } 42783 case 0x00000200: { 42784 // 0xf2800240 42785 switch (instr & 0x00000100) { 42786 case 0x00000000: { 42787 // 0xf2800240 42788 if (((instr & 0x300000) == 0x300000)) { 42789 UnallocatedA32(instr); 42790 return; 42791 } 42792 DataType dt = 42793 Dt_size_11_Decode((instr >> 20) & 0x3, 42794 (instr >> 24) & 0x1); 42795 if (dt.Is(kDataTypeValueInvalid)) { 42796 UnallocatedA32(instr); 42797 return; 42798 } 42799 if (((instr >> 12) & 1) != 0) { 42800 UnallocatedA32(instr); 42801 return; 42802 } 42803 unsigned rd = ExtractQRegister(instr, 22, 12); 42804 unsigned rn = ExtractDRegister(instr, 7, 16); 42805 int lane; 42806 unsigned rm = 42807 ExtractDRegisterAndLane(instr, dt, 5, 0, &lane); 42808 // VMLAL{<c>}{<q>}.<type><size> <Qd>, <Dn>, <Dm[x]> ; A1 NOLINT(whitespace/line_length) 42809 vmlal(al, 42810 dt, 42811 QRegister(rd), 42812 DRegister(rn), 42813 DRegisterLane(rm, lane)); 42814 break; 42815 } 42816 case 0x00000100: { 42817 // 0xf2800340 42818 if ((instr & 0x01000000) == 0x00000000) { 42819 if (((instr & 0x300000) == 0x300000)) { 42820 UnallocatedA32(instr); 42821 return; 42822 } 42823 DataType dt = 42824 Dt_size_13_Decode((instr >> 20) & 0x3); 42825 if (dt.Is(kDataTypeValueInvalid)) { 42826 UnallocatedA32(instr); 42827 return; 42828 } 42829 if (((instr >> 12) & 1) != 0) { 42830 UnallocatedA32(instr); 42831 return; 42832 } 42833 unsigned rd = ExtractQRegister(instr, 22, 12); 42834 unsigned rn = ExtractDRegister(instr, 7, 16); 42835 uint32_t mvm = 42836 (instr & 0xf) | ((instr >> 1) & 0x10); 42837 uint32_t shift = 4; 42838 if (dt.Is(S16)) { 42839 shift = 3; 42840 } 42841 uint32_t vm = mvm & ((1 << shift) - 1); 42842 uint32_t index = mvm >> shift; 42843 // VQDMLAL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm>[<index>] ; A2 NOLINT(whitespace/line_length) 42844 vqdmlal(al, 42845 dt, 42846 QRegister(rd), 42847 DRegister(rn), 42848 DRegister(vm), 42849 index); 42850 } else { 42851 UnallocatedA32(instr); 42852 } 42853 break; 42854 } 42855 } 42856 break; 42857 } 42858 } 42859 break; 42860 } 42861 case 0x00000400: { 42862 // 0xf2800400 42863 switch (instr & 0x00000300) { 42864 case 0x00000000: { 42865 // 0xf2800400 42866 switch (instr & 0x01000000) { 42867 case 0x00000000: { 42868 // 0xf2800400 42869 if (((instr & 0x300000) == 0x300000)) { 42870 UnallocatedA32(instr); 42871 return; 42872 } 42873 DataType dt = Dt_size_3_Decode((instr >> 20) & 0x3); 42874 if (dt.Is(kDataTypeValueInvalid)) { 42875 UnallocatedA32(instr); 42876 return; 42877 } 42878 unsigned rd = ExtractDRegister(instr, 22, 12); 42879 if (((instr >> 16) & 1) != 0) { 42880 UnallocatedA32(instr); 42881 return; 42882 } 42883 unsigned rn = ExtractQRegister(instr, 7, 16); 42884 if ((instr & 1) != 0) { 42885 UnallocatedA32(instr); 42886 return; 42887 } 42888 unsigned rm = ExtractQRegister(instr, 5, 0); 42889 // VADDHN{<c>}{<q>}.<dt> <Dd>, <Qn>, <Qm> ; A1 42890 vaddhn(al, 42891 dt, 42892 DRegister(rd), 42893 QRegister(rn), 42894 QRegister(rm)); 42895 break; 42896 } 42897 case 0x01000000: { 42898 // 0xf3800400 42899 if (((instr & 0x300000) == 0x300000)) { 42900 UnallocatedA32(instr); 42901 return; 42902 } 42903 DataType dt = Dt_size_3_Decode((instr >> 20) & 0x3); 42904 if (dt.Is(kDataTypeValueInvalid)) { 42905 UnallocatedA32(instr); 42906 return; 42907 } 42908 unsigned rd = ExtractDRegister(instr, 22, 12); 42909 if (((instr >> 16) & 1) != 0) { 42910 UnallocatedA32(instr); 42911 return; 42912 } 42913 unsigned rn = ExtractQRegister(instr, 7, 16); 42914 if ((instr & 1) != 0) { 42915 UnallocatedA32(instr); 42916 return; 42917 } 42918 unsigned rm = ExtractQRegister(instr, 5, 0); 42919 // VRADDHN{<c>}{<q>}.<dt> <Dd>, <Qn>, <Qm> ; A1 42920 vraddhn(al, 42921 dt, 42922 DRegister(rd), 42923 QRegister(rn), 42924 QRegister(rm)); 42925 break; 42926 } 42927 } 42928 break; 42929 } 42930 case 0x00000100: { 42931 // 0xf2800500 42932 if (((instr & 0x300000) == 0x300000)) { 42933 UnallocatedA32(instr); 42934 return; 42935 } 42936 DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) | 42937 ((instr >> 22) & 0x4)); 42938 if (dt.Is(kDataTypeValueInvalid)) { 42939 UnallocatedA32(instr); 42940 return; 42941 } 42942 if (((instr >> 12) & 1) != 0) { 42943 UnallocatedA32(instr); 42944 return; 42945 } 42946 unsigned rd = ExtractQRegister(instr, 22, 12); 42947 unsigned rn = ExtractDRegister(instr, 7, 16); 42948 unsigned rm = ExtractDRegister(instr, 5, 0); 42949 // VABAL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; A1 42950 vabal(al, 42951 dt, 42952 QRegister(rd), 42953 DRegister(rn), 42954 DRegister(rm)); 42955 break; 42956 } 42957 case 0x00000200: { 42958 // 0xf2800600 42959 switch (instr & 0x01000000) { 42960 case 0x00000000: { 42961 // 0xf2800600 42962 if (((instr & 0x300000) == 0x300000)) { 42963 UnallocatedA32(instr); 42964 return; 42965 } 42966 DataType dt = Dt_size_3_Decode((instr >> 20) & 0x3); 42967 if (dt.Is(kDataTypeValueInvalid)) { 42968 UnallocatedA32(instr); 42969 return; 42970 } 42971 unsigned rd = ExtractDRegister(instr, 22, 12); 42972 if (((instr >> 16) & 1) != 0) { 42973 UnallocatedA32(instr); 42974 return; 42975 } 42976 unsigned rn = ExtractQRegister(instr, 7, 16); 42977 if ((instr & 1) != 0) { 42978 UnallocatedA32(instr); 42979 return; 42980 } 42981 unsigned rm = ExtractQRegister(instr, 5, 0); 42982 // VSUBHN{<c>}{<q>}.<dt> <Dd>, <Qn>, <Qm> ; A1 42983 vsubhn(al, 42984 dt, 42985 DRegister(rd), 42986 QRegister(rn), 42987 QRegister(rm)); 42988 break; 42989 } 42990 case 0x01000000: { 42991 // 0xf3800600 42992 if (((instr & 0x300000) == 0x300000)) { 42993 UnallocatedA32(instr); 42994 return; 42995 } 42996 DataType dt = Dt_size_3_Decode((instr >> 20) & 0x3); 42997 if (dt.Is(kDataTypeValueInvalid)) { 42998 UnallocatedA32(instr); 42999 return; 43000 } 43001 unsigned rd = ExtractDRegister(instr, 22, 12); 43002 if (((instr >> 16) & 1) != 0) { 43003 UnallocatedA32(instr); 43004 return; 43005 } 43006 unsigned rn = ExtractQRegister(instr, 7, 16); 43007 if ((instr & 1) != 0) { 43008 UnallocatedA32(instr); 43009 return; 43010 } 43011 unsigned rm = ExtractQRegister(instr, 5, 0); 43012 // VRSUBHN{<c>}{<q>}.<dt> <Dd>, <Qn>, <Qm> ; A1 43013 vrsubhn(al, 43014 dt, 43015 DRegister(rd), 43016 QRegister(rn), 43017 QRegister(rm)); 43018 break; 43019 } 43020 } 43021 break; 43022 } 43023 case 0x00000300: { 43024 // 0xf2800700 43025 if (((instr & 0x300000) == 0x300000)) { 43026 UnallocatedA32(instr); 43027 return; 43028 } 43029 DataType dt = Dt_U_size_1_Decode(((instr >> 20) & 0x3) | 43030 ((instr >> 22) & 0x4)); 43031 if (dt.Is(kDataTypeValueInvalid)) { 43032 UnallocatedA32(instr); 43033 return; 43034 } 43035 if (((instr >> 12) & 1) != 0) { 43036 UnallocatedA32(instr); 43037 return; 43038 } 43039 unsigned rd = ExtractQRegister(instr, 22, 12); 43040 unsigned rn = ExtractDRegister(instr, 7, 16); 43041 unsigned rm = ExtractDRegister(instr, 5, 0); 43042 // VABDL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; A1 43043 vabdl(al, 43044 dt, 43045 QRegister(rd), 43046 DRegister(rn), 43047 DRegister(rm)); 43048 break; 43049 } 43050 } 43051 break; 43052 } 43053 case 0x00000440: { 43054 // 0xf2800440 43055 switch (instr & 0x00000200) { 43056 case 0x00000000: { 43057 // 0xf2800440 43058 switch (instr & 0x01000000) { 43059 case 0x00000000: { 43060 // 0xf2800440 43061 if (((instr & 0x300000) == 0x300000)) { 43062 UnallocatedA32(instr); 43063 return; 43064 } 43065 DataType dt = Dt_size_9_Decode((instr >> 20) & 0x3, 43066 (instr >> 8) & 0x1); 43067 if (dt.Is(kDataTypeValueInvalid)) { 43068 UnallocatedA32(instr); 43069 return; 43070 } 43071 unsigned rd = ExtractDRegister(instr, 22, 12); 43072 unsigned rn = ExtractDRegister(instr, 7, 16); 43073 int lane; 43074 unsigned rm = 43075 ExtractDRegisterAndLane(instr, dt, 5, 0, &lane); 43076 // VMLS{<c>}{<q>}.<type><size> <Dd>, <Dn>, <Dm[x]> ; A1 NOLINT(whitespace/line_length) 43077 vmls(al, 43078 dt, 43079 DRegister(rd), 43080 DRegister(rn), 43081 DRegisterLane(rm, lane)); 43082 break; 43083 } 43084 case 0x01000000: { 43085 // 0xf3800440 43086 if (((instr & 0x300000) == 0x300000)) { 43087 UnallocatedA32(instr); 43088 return; 43089 } 43090 DataType dt = Dt_size_9_Decode((instr >> 20) & 0x3, 43091 (instr >> 8) & 0x1); 43092 if (dt.Is(kDataTypeValueInvalid)) { 43093 UnallocatedA32(instr); 43094 return; 43095 } 43096 if (((instr >> 12) & 1) != 0) { 43097 UnallocatedA32(instr); 43098 return; 43099 } 43100 unsigned rd = ExtractQRegister(instr, 22, 12); 43101 if (((instr >> 16) & 1) != 0) { 43102 UnallocatedA32(instr); 43103 return; 43104 } 43105 unsigned rn = ExtractQRegister(instr, 7, 16); 43106 int lane; 43107 unsigned rm = 43108 ExtractDRegisterAndLane(instr, dt, 5, 0, &lane); 43109 // VMLS{<c>}{<q>}.<type><size> <Qd>, <Qn>, <Dm[x]> ; A1 NOLINT(whitespace/line_length) 43110 vmls(al, 43111 dt, 43112 QRegister(rd), 43113 QRegister(rn), 43114 DRegisterLane(rm, lane)); 43115 break; 43116 } 43117 } 43118 break; 43119 } 43120 case 0x00000200: { 43121 // 0xf2800640 43122 switch (instr & 0x00000100) { 43123 case 0x00000000: { 43124 // 0xf2800640 43125 if (((instr & 0x300000) == 0x300000)) { 43126 UnallocatedA32(instr); 43127 return; 43128 } 43129 DataType dt = 43130 Dt_size_11_Decode((instr >> 20) & 0x3, 43131 (instr >> 24) & 0x1); 43132 if (dt.Is(kDataTypeValueInvalid)) { 43133 UnallocatedA32(instr); 43134 return; 43135 } 43136 if (((instr >> 12) & 1) != 0) { 43137 UnallocatedA32(instr); 43138 return; 43139 } 43140 unsigned rd = ExtractQRegister(instr, 22, 12); 43141 unsigned rn = ExtractDRegister(instr, 7, 16); 43142 int lane; 43143 unsigned rm = 43144 ExtractDRegisterAndLane(instr, dt, 5, 0, &lane); 43145 // VMLSL{<c>}{<q>}.<type><size> <Qd>, <Dn>, <Dm[x]> ; A1 NOLINT(whitespace/line_length) 43146 vmlsl(al, 43147 dt, 43148 QRegister(rd), 43149 DRegister(rn), 43150 DRegisterLane(rm, lane)); 43151 break; 43152 } 43153 case 0x00000100: { 43154 // 0xf2800740 43155 if ((instr & 0x01000000) == 0x00000000) { 43156 if (((instr & 0x300000) == 0x300000)) { 43157 UnallocatedA32(instr); 43158 return; 43159 } 43160 DataType dt = 43161 Dt_size_13_Decode((instr >> 20) & 0x3); 43162 if (dt.Is(kDataTypeValueInvalid)) { 43163 UnallocatedA32(instr); 43164 return; 43165 } 43166 if (((instr >> 12) & 1) != 0) { 43167 UnallocatedA32(instr); 43168 return; 43169 } 43170 unsigned rd = ExtractQRegister(instr, 22, 12); 43171 unsigned rn = ExtractDRegister(instr, 7, 16); 43172 uint32_t mvm = 43173 (instr & 0xf) | ((instr >> 1) & 0x10); 43174 uint32_t shift = 4; 43175 if (dt.Is(S16)) { 43176 shift = 3; 43177 } 43178 uint32_t vm = mvm & ((1 << shift) - 1); 43179 uint32_t index = mvm >> shift; 43180 // VQDMLSL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm>[<index>] ; A2 NOLINT(whitespace/line_length) 43181 vqdmlsl(al, 43182 dt, 43183 QRegister(rd), 43184 DRegister(rn), 43185 DRegister(vm), 43186 index); 43187 } else { 43188 UnallocatedA32(instr); 43189 } 43190 break; 43191 } 43192 } 43193 break; 43194 } 43195 } 43196 break; 43197 } 43198 case 0x00000800: { 43199 // 0xf2800800 43200 switch (instr & 0x00000300) { 43201 case 0x00000000: { 43202 // 0xf2800800 43203 if (((instr & 0x300000) == 0x300000)) { 43204 UnallocatedA32(instr); 43205 return; 43206 } 43207 DataType dt = Dt_size_12_Decode((instr >> 20) & 0x3, 43208 (instr >> 24) & 0x1); 43209 if (dt.Is(kDataTypeValueInvalid)) { 43210 UnallocatedA32(instr); 43211 return; 43212 } 43213 if (((instr >> 12) & 1) != 0) { 43214 UnallocatedA32(instr); 43215 return; 43216 } 43217 unsigned rd = ExtractQRegister(instr, 22, 12); 43218 unsigned rn = ExtractDRegister(instr, 7, 16); 43219 unsigned rm = ExtractDRegister(instr, 5, 0); 43220 // VMLAL{<c>}{<q>}.<type><size> <Qd>, <Dn>, <Dm> ; A1 43221 vmlal(al, 43222 dt, 43223 QRegister(rd), 43224 DRegister(rn), 43225 DRegister(rm)); 43226 break; 43227 } 43228 case 0x00000100: { 43229 // 0xf2800900 43230 if ((instr & 0x01000000) == 0x00000000) { 43231 if (((instr & 0x300000) == 0x300000)) { 43232 UnallocatedA32(instr); 43233 return; 43234 } 43235 DataType dt = Dt_size_13_Decode((instr >> 20) & 0x3); 43236 if (dt.Is(kDataTypeValueInvalid)) { 43237 UnallocatedA32(instr); 43238 return; 43239 } 43240 if (((instr >> 12) & 1) != 0) { 43241 UnallocatedA32(instr); 43242 return; 43243 } 43244 unsigned rd = ExtractQRegister(instr, 22, 12); 43245 unsigned rn = ExtractDRegister(instr, 7, 16); 43246 unsigned rm = ExtractDRegister(instr, 5, 0); 43247 // VQDMLAL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; A1 43248 vqdmlal(al, 43249 dt, 43250 QRegister(rd), 43251 DRegister(rn), 43252 DRegister(rm)); 43253 } else { 43254 UnallocatedA32(instr); 43255 } 43256 break; 43257 } 43258 case 0x00000200: { 43259 // 0xf2800a00 43260 if (((instr & 0x300000) == 0x300000)) { 43261 UnallocatedA32(instr); 43262 return; 43263 } 43264 DataType dt = Dt_size_12_Decode((instr >> 20) & 0x3, 43265 (instr >> 24) & 0x1); 43266 if (dt.Is(kDataTypeValueInvalid)) { 43267 UnallocatedA32(instr); 43268 return; 43269 } 43270 if (((instr >> 12) & 1) != 0) { 43271 UnallocatedA32(instr); 43272 return; 43273 } 43274 unsigned rd = ExtractQRegister(instr, 22, 12); 43275 unsigned rn = ExtractDRegister(instr, 7, 16); 43276 unsigned rm = ExtractDRegister(instr, 5, 0); 43277 // VMLSL{<c>}{<q>}.<type><size> <Qd>, <Dn>, <Dm> ; A1 43278 vmlsl(al, 43279 dt, 43280 QRegister(rd), 43281 DRegister(rn), 43282 DRegister(rm)); 43283 break; 43284 } 43285 case 0x00000300: { 43286 // 0xf2800b00 43287 if ((instr & 0x01000000) == 0x00000000) { 43288 if (((instr & 0x300000) == 0x300000)) { 43289 UnallocatedA32(instr); 43290 return; 43291 } 43292 DataType dt = Dt_size_13_Decode((instr >> 20) & 0x3); 43293 if (dt.Is(kDataTypeValueInvalid)) { 43294 UnallocatedA32(instr); 43295 return; 43296 } 43297 if (((instr >> 12) & 1) != 0) { 43298 UnallocatedA32(instr); 43299 return; 43300 } 43301 unsigned rd = ExtractQRegister(instr, 22, 12); 43302 unsigned rn = ExtractDRegister(instr, 7, 16); 43303 unsigned rm = ExtractDRegister(instr, 5, 0); 43304 // VQDMLSL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; A1 43305 vqdmlsl(al, 43306 dt, 43307 QRegister(rd), 43308 DRegister(rn), 43309 DRegister(rm)); 43310 } else { 43311 UnallocatedA32(instr); 43312 } 43313 break; 43314 } 43315 } 43316 break; 43317 } 43318 case 0x00000840: { 43319 // 0xf2800840 43320 switch (instr & 0x00000200) { 43321 case 0x00000000: { 43322 // 0xf2800840 43323 switch (instr & 0x01000000) { 43324 case 0x00000000: { 43325 // 0xf2800840 43326 if (((instr & 0x300000) == 0x300000)) { 43327 UnallocatedA32(instr); 43328 return; 43329 } 43330 DataType dt = Dt_F_size_3_Decode( 43331 ((instr >> 20) & 0x3) | ((instr >> 6) & 0x4)); 43332 if (dt.Is(kDataTypeValueInvalid)) { 43333 UnallocatedA32(instr); 43334 return; 43335 } 43336 unsigned rd = ExtractDRegister(instr, 22, 12); 43337 unsigned rn = ExtractDRegister(instr, 7, 16); 43338 uint32_t mvm = 43339 (instr & 0xf) | ((instr >> 1) & 0x10); 43340 uint32_t shift = 4; 43341 if (dt.Is(I16)) { 43342 shift = 3; 43343 } 43344 uint32_t vm = mvm & ((1 << shift) - 1); 43345 uint32_t index = mvm >> shift; 43346 // VMUL{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm>[<index>] ; A1 NOLINT(whitespace/line_length) 43347 vmul(al, 43348 dt, 43349 DRegister(rd), 43350 DRegister(rn), 43351 DRegister(vm), 43352 index); 43353 break; 43354 } 43355 case 0x01000000: { 43356 // 0xf3800840 43357 if (((instr & 0x300000) == 0x300000)) { 43358 UnallocatedA32(instr); 43359 return; 43360 } 43361 DataType dt = Dt_F_size_3_Decode( 43362 ((instr >> 20) & 0x3) | ((instr >> 6) & 0x4)); 43363 if (dt.Is(kDataTypeValueInvalid)) { 43364 UnallocatedA32(instr); 43365 return; 43366 } 43367 if (((instr >> 12) & 1) != 0) { 43368 UnallocatedA32(instr); 43369 return; 43370 } 43371 unsigned rd = ExtractQRegister(instr, 22, 12); 43372 if (((instr >> 16) & 1) != 0) { 43373 UnallocatedA32(instr); 43374 return; 43375 } 43376 unsigned rn = ExtractQRegister(instr, 7, 16); 43377 uint32_t mvm = 43378 (instr & 0xf) | ((instr >> 1) & 0x10); 43379 uint32_t shift = 4; 43380 if (dt.Is(I16)) { 43381 shift = 3; 43382 } 43383 uint32_t vm = mvm & ((1 << shift) - 1); 43384 uint32_t index = mvm >> shift; 43385 // VMUL{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Dm>[<index>] ; A1 NOLINT(whitespace/line_length) 43386 vmul(al, 43387 dt, 43388 QRegister(rd), 43389 QRegister(rn), 43390 DRegister(vm), 43391 index); 43392 break; 43393 } 43394 } 43395 break; 43396 } 43397 case 0x00000200: { 43398 // 0xf2800a40 43399 switch (instr & 0x00000100) { 43400 case 0x00000000: { 43401 // 0xf2800a40 43402 if (((instr & 0x300000) == 0x300000)) { 43403 UnallocatedA32(instr); 43404 return; 43405 } 43406 DataType dt = Dt_U_size_2_Decode( 43407 ((instr >> 20) & 0x3) | ((instr >> 22) & 0x4)); 43408 if (dt.Is(kDataTypeValueInvalid)) { 43409 UnallocatedA32(instr); 43410 return; 43411 } 43412 if (((instr >> 12) & 1) != 0) { 43413 UnallocatedA32(instr); 43414 return; 43415 } 43416 unsigned rd = ExtractQRegister(instr, 22, 12); 43417 unsigned rn = ExtractDRegister(instr, 7, 16); 43418 uint32_t mvm = 43419 (instr & 0xf) | ((instr >> 1) & 0x10); 43420 uint32_t shift = 4; 43421 if (dt.Is(S16) || dt.Is(U16)) { 43422 shift = 3; 43423 } 43424 uint32_t vm = mvm & ((1 << shift) - 1); 43425 uint32_t index = mvm >> shift; 43426 // VMULL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm>[<index>] ; A1 NOLINT(whitespace/line_length) 43427 vmull(al, 43428 dt, 43429 QRegister(rd), 43430 DRegister(rn), 43431 DRegister(vm), 43432 index); 43433 break; 43434 } 43435 case 0x00000100: { 43436 // 0xf2800b40 43437 if ((instr & 0x01000000) == 0x00000000) { 43438 if (((instr & 0x300000) == 0x300000)) { 43439 UnallocatedA32(instr); 43440 return; 43441 } 43442 DataType dt = 43443 Dt_size_13_Decode((instr >> 20) & 0x3); 43444 if (dt.Is(kDataTypeValueInvalid)) { 43445 UnallocatedA32(instr); 43446 return; 43447 } 43448 if (((instr >> 12) & 1) != 0) { 43449 UnallocatedA32(instr); 43450 return; 43451 } 43452 unsigned rd = ExtractQRegister(instr, 22, 12); 43453 unsigned rn = ExtractDRegister(instr, 7, 16); 43454 int lane; 43455 unsigned rm = ExtractDRegisterAndLane(instr, 43456 dt, 43457 5, 43458 0, 43459 &lane); 43460 // VQDMULL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm[x]> ; A2 43461 vqdmull(al, 43462 dt, 43463 QRegister(rd), 43464 DRegister(rn), 43465 DRegisterLane(rm, lane)); 43466 } else { 43467 UnallocatedA32(instr); 43468 } 43469 break; 43470 } 43471 } 43472 break; 43473 } 43474 } 43475 break; 43476 } 43477 case 0x00000c00: { 43478 // 0xf2800c00 43479 switch (instr & 0x00000100) { 43480 case 0x00000000: { 43481 // 0xf2800c00 43482 if (((instr & 0x300000) == 0x300000)) { 43483 UnallocatedA32(instr); 43484 return; 43485 } 43486 DataType dt = Dt_op_U_size_1_Decode( 43487 ((instr >> 20) & 0x3) | ((instr >> 22) & 0x4) | 43488 ((instr >> 6) & 0x8)); 43489 if (dt.Is(kDataTypeValueInvalid)) { 43490 UnallocatedA32(instr); 43491 return; 43492 } 43493 if (((instr >> 12) & 1) != 0) { 43494 UnallocatedA32(instr); 43495 return; 43496 } 43497 unsigned rd = ExtractQRegister(instr, 22, 12); 43498 unsigned rn = ExtractDRegister(instr, 7, 16); 43499 unsigned rm = ExtractDRegister(instr, 5, 0); 43500 // VMULL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; A1 43501 vmull(al, 43502 dt, 43503 QRegister(rd), 43504 DRegister(rn), 43505 DRegister(rm)); 43506 break; 43507 } 43508 case 0x00000100: { 43509 // 0xf2800d00 43510 if ((instr & 0x01000200) == 0x00000000) { 43511 if (((instr & 0x300000) == 0x300000)) { 43512 UnallocatedA32(instr); 43513 return; 43514 } 43515 DataType dt = Dt_size_13_Decode((instr >> 20) & 0x3); 43516 if (dt.Is(kDataTypeValueInvalid)) { 43517 UnallocatedA32(instr); 43518 return; 43519 } 43520 if (((instr >> 12) & 1) != 0) { 43521 UnallocatedA32(instr); 43522 return; 43523 } 43524 unsigned rd = ExtractQRegister(instr, 22, 12); 43525 unsigned rn = ExtractDRegister(instr, 7, 16); 43526 unsigned rm = ExtractDRegister(instr, 5, 0); 43527 // VQDMULL{<c>}{<q>}.<dt> <Qd>, <Dn>, <Dm> ; A1 43528 vqdmull(al, 43529 dt, 43530 QRegister(rd), 43531 DRegister(rn), 43532 DRegister(rm)); 43533 } else { 43534 UnallocatedA32(instr); 43535 } 43536 break; 43537 } 43538 } 43539 break; 43540 } 43541 case 0x00000c40: { 43542 // 0xf2800c40 43543 switch (instr & 0x01000300) { 43544 case 0x00000000: { 43545 // 0xf2800c40 43546 if (((instr & 0x300000) == 0x300000)) { 43547 UnallocatedA32(instr); 43548 return; 43549 } 43550 DataType dt = Dt_size_13_Decode((instr >> 20) & 0x3); 43551 if (dt.Is(kDataTypeValueInvalid)) { 43552 UnallocatedA32(instr); 43553 return; 43554 } 43555 unsigned rd = ExtractDRegister(instr, 22, 12); 43556 unsigned rn = ExtractDRegister(instr, 7, 16); 43557 int lane; 43558 unsigned rm = 43559 ExtractDRegisterAndLane(instr, dt, 5, 0, &lane); 43560 // VQDMULH{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm[x]> ; A2 43561 vqdmulh(al, 43562 dt, 43563 DRegister(rd), 43564 DRegister(rn), 43565 DRegisterLane(rm, lane)); 43566 break; 43567 } 43568 case 0x00000100: { 43569 // 0xf2800d40 43570 if (((instr & 0x300000) == 0x300000)) { 43571 UnallocatedA32(instr); 43572 return; 43573 } 43574 DataType dt = Dt_size_13_Decode((instr >> 20) & 0x3); 43575 if (dt.Is(kDataTypeValueInvalid)) { 43576 UnallocatedA32(instr); 43577 return; 43578 } 43579 unsigned rd = ExtractDRegister(instr, 22, 12); 43580 unsigned rn = ExtractDRegister(instr, 7, 16); 43581 int lane; 43582 unsigned rm = 43583 ExtractDRegisterAndLane(instr, dt, 5, 0, &lane); 43584 // VQRDMULH{<c>}{<q>}.<dt> {<Dd>}, <Dn>, <Dm[x]> ; A2 43585 vqrdmulh(al, 43586 dt, 43587 DRegister(rd), 43588 DRegister(rn), 43589 DRegisterLane(rm, lane)); 43590 break; 43591 } 43592 case 0x01000000: { 43593 // 0xf3800c40 43594 if (((instr & 0x300000) == 0x300000)) { 43595 UnallocatedA32(instr); 43596 return; 43597 } 43598 DataType dt = Dt_size_13_Decode((instr >> 20) & 0x3); 43599 if (dt.Is(kDataTypeValueInvalid)) { 43600 UnallocatedA32(instr); 43601 return; 43602 } 43603 if (((instr >> 12) & 1) != 0) { 43604 UnallocatedA32(instr); 43605 return; 43606 } 43607 unsigned rd = ExtractQRegister(instr, 22, 12); 43608 if (((instr >> 16) & 1) != 0) { 43609 UnallocatedA32(instr); 43610 return; 43611 } 43612 unsigned rn = ExtractQRegister(instr, 7, 16); 43613 int lane; 43614 unsigned rm = 43615 ExtractDRegisterAndLane(instr, dt, 5, 0, &lane); 43616 // VQDMULH{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Dm[x]> ; A2 43617 vqdmulh(al, 43618 dt, 43619 QRegister(rd), 43620 QRegister(rn), 43621 DRegisterLane(rm, lane)); 43622 break; 43623 } 43624 case 0x01000100: { 43625 // 0xf3800d40 43626 if (((instr & 0x300000) == 0x300000)) { 43627 UnallocatedA32(instr); 43628 return; 43629 } 43630 DataType dt = Dt_size_13_Decode((instr >> 20) & 0x3); 43631 if (dt.Is(kDataTypeValueInvalid)) { 43632 UnallocatedA32(instr); 43633 return; 43634 } 43635 if (((instr >> 12) & 1) != 0) { 43636 UnallocatedA32(instr); 43637 return; 43638 } 43639 unsigned rd = ExtractQRegister(instr, 22, 12); 43640 if (((instr >> 16) & 1) != 0) { 43641 UnallocatedA32(instr); 43642 return; 43643 } 43644 unsigned rn = ExtractQRegister(instr, 7, 16); 43645 int lane; 43646 unsigned rm = 43647 ExtractDRegisterAndLane(instr, dt, 5, 0, &lane); 43648 // VQRDMULH{<c>}{<q>}.<dt> {<Qd>}, <Qn>, <Dm[x]> ; A2 43649 vqrdmulh(al, 43650 dt, 43651 QRegister(rd), 43652 QRegister(rn), 43653 DRegisterLane(rm, lane)); 43654 break; 43655 } 43656 default: 43657 UnallocatedA32(instr); 43658 break; 43659 } 43660 break; 43661 } 43662 } 43663 break; 43664 } 43665 } 43666 break; 43667 } 43668 case 0x00800010: { 43669 // 0xf2800010 43670 switch (instr & 0x00000040) { 43671 case 0x00000000: { 43672 // 0xf2800010 43673 switch (instr & 0x00000c00) { 43674 case 0x00000000: { 43675 // 0xf2800010 43676 switch (instr & 0x00380080) { 43677 case 0x00000000: { 43678 // 0xf2800010 43679 switch (instr & 0x00000100) { 43680 case 0x00000000: { 43681 // 0xf2800010 43682 switch (instr & 0x00000200) { 43683 default: { 43684 switch (instr & 0x00000020) { 43685 case 0x00000020: { 43686 // 0xf2800030 43687 if (((instr & 0xd00) == 0x100) || 43688 ((instr & 0xd00) == 0x500) || 43689 ((instr & 0xd00) == 0x900) || 43690 ((instr & 0xe00) == 0xe00)) { 43691 UnallocatedA32(instr); 43692 return; 43693 } 43694 unsigned cmode = (instr >> 8) & 0xf; 43695 DataType dt = 43696 ImmediateVmvn::DecodeDt(cmode); 43697 if (dt.Is(kDataTypeValueInvalid)) { 43698 UnallocatedA32(instr); 43699 return; 43700 } 43701 unsigned rd = 43702 ExtractDRegister(instr, 22, 12); 43703 DOperand imm = 43704 ImmediateVmvn::DecodeImmediate( 43705 cmode, 43706 (instr & 0xf) | 43707 ((instr >> 12) & 0x70) | 43708 ((instr >> 17) & 0x80)); 43709 // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 43710 vmvn(al, dt, DRegister(rd), imm); 43711 break; 43712 } 43713 default: { 43714 if (((instr & 0x920) == 0x100) || 43715 ((instr & 0x520) == 0x100) || 43716 ((instr & 0x820) == 0x20) || 43717 ((instr & 0x420) == 0x20) || 43718 ((instr & 0x220) == 0x20) || 43719 ((instr & 0x120) == 0x120)) { 43720 UnallocatedA32(instr); 43721 return; 43722 } 43723 unsigned cmode = ((instr >> 8) & 0xf) | 43724 ((instr >> 1) & 0x10); 43725 DataType dt = 43726 ImmediateVmov::DecodeDt(cmode); 43727 if (dt.Is(kDataTypeValueInvalid)) { 43728 UnallocatedA32(instr); 43729 return; 43730 } 43731 unsigned rd = 43732 ExtractDRegister(instr, 22, 12); 43733 DOperand imm = 43734 ImmediateVmov::DecodeImmediate( 43735 cmode, 43736 (instr & 0xf) | 43737 ((instr >> 12) & 0x70) | 43738 ((instr >> 17) & 0x80)); 43739 // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 43740 vmov(al, dt, DRegister(rd), imm); 43741 break; 43742 } 43743 } 43744 break; 43745 } 43746 } 43747 break; 43748 } 43749 case 0x00000100: { 43750 // 0xf2800110 43751 switch (instr & 0x00000020) { 43752 case 0x00000000: { 43753 // 0xf2800110 43754 if (((instr & 0x100) == 0x0) || 43755 ((instr & 0xc00) == 0xc00)) { 43756 UnallocatedA32(instr); 43757 return; 43758 } 43759 unsigned cmode = (instr >> 8) & 0xf; 43760 DataType dt = ImmediateVorr::DecodeDt(cmode); 43761 if (dt.Is(kDataTypeValueInvalid)) { 43762 UnallocatedA32(instr); 43763 return; 43764 } 43765 unsigned rd = ExtractDRegister(instr, 22, 12); 43766 DOperand imm = ImmediateVorr::DecodeImmediate( 43767 cmode, 43768 (instr & 0xf) | ((instr >> 12) & 0x70) | 43769 ((instr >> 17) & 0x80)); 43770 // VORR{<c>}{<q>}.<dt> {<Ddn>}, <Ddn>, #<imm> ; A1 NOLINT(whitespace/line_length) 43771 vorr(al, dt, DRegister(rd), DRegister(rd), imm); 43772 break; 43773 } 43774 case 0x00000020: { 43775 // 0xf2800130 43776 if (((instr & 0x100) == 0x0) || 43777 ((instr & 0xc00) == 0xc00)) { 43778 UnallocatedA32(instr); 43779 return; 43780 } 43781 unsigned cmode = (instr >> 8) & 0xf; 43782 DataType dt = ImmediateVbic::DecodeDt(cmode); 43783 if (dt.Is(kDataTypeValueInvalid)) { 43784 UnallocatedA32(instr); 43785 return; 43786 } 43787 unsigned rd = ExtractDRegister(instr, 22, 12); 43788 DOperand imm = ImmediateVbic::DecodeImmediate( 43789 cmode, 43790 (instr & 0xf) | ((instr >> 12) & 0x70) | 43791 ((instr >> 17) & 0x80)); 43792 // VBIC{<c>}{<q>}.<dt> {<Ddn>}, <Ddn>, #<imm> ; A1 NOLINT(whitespace/line_length) 43793 vbic(al, dt, DRegister(rd), DRegister(rd), imm); 43794 break; 43795 } 43796 } 43797 break; 43798 } 43799 } 43800 break; 43801 } 43802 default: { 43803 switch (instr & 0x00000300) { 43804 case 0x00000000: { 43805 // 0xf2800010 43806 if (((instr & 0x380080) == 0x0)) { 43807 UnallocatedA32(instr); 43808 return; 43809 } 43810 DataType dt = 43811 Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) | 43812 ((instr >> 4) & 0x8), 43813 (instr >> 24) & 0x1); 43814 if (dt.Is(kDataTypeValueInvalid)) { 43815 UnallocatedA32(instr); 43816 return; 43817 } 43818 unsigned rd = ExtractDRegister(instr, 22, 12); 43819 unsigned rm = ExtractDRegister(instr, 5, 0); 43820 uint32_t imm6 = (instr >> 16) & 0x3f; 43821 uint32_t imm = 43822 (dt.IsSize(64) ? 64 : (dt.GetSize() * 2)) - 43823 imm6; 43824 // VSHR{<c>}{<q>}.<type><size> {<Dd>}, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length) 43825 vshr(al, dt, DRegister(rd), DRegister(rm), imm); 43826 break; 43827 } 43828 case 0x00000100: { 43829 // 0xf2800110 43830 if (((instr & 0x380080) == 0x0)) { 43831 UnallocatedA32(instr); 43832 return; 43833 } 43834 DataType dt = 43835 Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) | 43836 ((instr >> 4) & 0x8), 43837 (instr >> 24) & 0x1); 43838 if (dt.Is(kDataTypeValueInvalid)) { 43839 UnallocatedA32(instr); 43840 return; 43841 } 43842 unsigned rd = ExtractDRegister(instr, 22, 12); 43843 unsigned rm = ExtractDRegister(instr, 5, 0); 43844 uint32_t imm6 = (instr >> 16) & 0x3f; 43845 uint32_t imm = 43846 (dt.IsSize(64) ? 64 : (dt.GetSize() * 2)) - 43847 imm6; 43848 // VSRA{<c>}{<q>}.<type><size> {<Dd>}, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length) 43849 vsra(al, dt, DRegister(rd), DRegister(rm), imm); 43850 break; 43851 } 43852 case 0x00000200: { 43853 // 0xf2800210 43854 if (((instr & 0x380080) == 0x0)) { 43855 UnallocatedA32(instr); 43856 return; 43857 } 43858 DataType dt = 43859 Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) | 43860 ((instr >> 4) & 0x8), 43861 (instr >> 24) & 0x1); 43862 if (dt.Is(kDataTypeValueInvalid)) { 43863 UnallocatedA32(instr); 43864 return; 43865 } 43866 unsigned rd = ExtractDRegister(instr, 22, 12); 43867 unsigned rm = ExtractDRegister(instr, 5, 0); 43868 uint32_t imm6 = (instr >> 16) & 0x3f; 43869 uint32_t imm = 43870 (dt.IsSize(64) ? 64 : (dt.GetSize() * 2)) - 43871 imm6; 43872 // VRSHR{<c>}{<q>}.<type><size> {<Dd>}, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length) 43873 vrshr(al, dt, DRegister(rd), DRegister(rm), imm); 43874 break; 43875 } 43876 case 0x00000300: { 43877 // 0xf2800310 43878 if (((instr & 0x380080) == 0x0)) { 43879 UnallocatedA32(instr); 43880 return; 43881 } 43882 DataType dt = 43883 Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) | 43884 ((instr >> 4) & 0x8), 43885 (instr >> 24) & 0x1); 43886 if (dt.Is(kDataTypeValueInvalid)) { 43887 UnallocatedA32(instr); 43888 return; 43889 } 43890 unsigned rd = ExtractDRegister(instr, 22, 12); 43891 unsigned rm = ExtractDRegister(instr, 5, 0); 43892 uint32_t imm6 = (instr >> 16) & 0x3f; 43893 uint32_t imm = 43894 (dt.IsSize(64) ? 64 : (dt.GetSize() * 2)) - 43895 imm6; 43896 // VRSRA{<c>}{<q>}.<type><size> {<Dd>}, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length) 43897 vrsra(al, dt, DRegister(rd), DRegister(rm), imm); 43898 break; 43899 } 43900 } 43901 break; 43902 } 43903 } 43904 break; 43905 } 43906 case 0x00000400: { 43907 // 0xf2800410 43908 switch (instr & 0x00380080) { 43909 case 0x00000000: { 43910 // 0xf2800410 43911 switch (instr & 0x00000100) { 43912 case 0x00000000: { 43913 // 0xf2800410 43914 switch (instr & 0x00000200) { 43915 default: { 43916 switch (instr & 0x00000020) { 43917 case 0x00000020: { 43918 // 0xf2800430 43919 if (((instr & 0xd00) == 0x100) || 43920 ((instr & 0xd00) == 0x500) || 43921 ((instr & 0xd00) == 0x900) || 43922 ((instr & 0xe00) == 0xe00)) { 43923 UnallocatedA32(instr); 43924 return; 43925 } 43926 unsigned cmode = (instr >> 8) & 0xf; 43927 DataType dt = 43928 ImmediateVmvn::DecodeDt(cmode); 43929 if (dt.Is(kDataTypeValueInvalid)) { 43930 UnallocatedA32(instr); 43931 return; 43932 } 43933 unsigned rd = 43934 ExtractDRegister(instr, 22, 12); 43935 DOperand imm = 43936 ImmediateVmvn::DecodeImmediate( 43937 cmode, 43938 (instr & 0xf) | 43939 ((instr >> 12) & 0x70) | 43940 ((instr >> 17) & 0x80)); 43941 // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 43942 vmvn(al, dt, DRegister(rd), imm); 43943 break; 43944 } 43945 default: { 43946 if (((instr & 0x920) == 0x100) || 43947 ((instr & 0x520) == 0x100) || 43948 ((instr & 0x820) == 0x20) || 43949 ((instr & 0x420) == 0x20) || 43950 ((instr & 0x220) == 0x20) || 43951 ((instr & 0x120) == 0x120)) { 43952 UnallocatedA32(instr); 43953 return; 43954 } 43955 unsigned cmode = ((instr >> 8) & 0xf) | 43956 ((instr >> 1) & 0x10); 43957 DataType dt = 43958 ImmediateVmov::DecodeDt(cmode); 43959 if (dt.Is(kDataTypeValueInvalid)) { 43960 UnallocatedA32(instr); 43961 return; 43962 } 43963 unsigned rd = 43964 ExtractDRegister(instr, 22, 12); 43965 DOperand imm = 43966 ImmediateVmov::DecodeImmediate( 43967 cmode, 43968 (instr & 0xf) | 43969 ((instr >> 12) & 0x70) | 43970 ((instr >> 17) & 0x80)); 43971 // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 43972 vmov(al, dt, DRegister(rd), imm); 43973 break; 43974 } 43975 } 43976 break; 43977 } 43978 } 43979 break; 43980 } 43981 case 0x00000100: { 43982 // 0xf2800510 43983 switch (instr & 0x00000020) { 43984 case 0x00000000: { 43985 // 0xf2800510 43986 if (((instr & 0x100) == 0x0) || 43987 ((instr & 0xc00) == 0xc00)) { 43988 UnallocatedA32(instr); 43989 return; 43990 } 43991 unsigned cmode = (instr >> 8) & 0xf; 43992 DataType dt = ImmediateVorr::DecodeDt(cmode); 43993 if (dt.Is(kDataTypeValueInvalid)) { 43994 UnallocatedA32(instr); 43995 return; 43996 } 43997 unsigned rd = ExtractDRegister(instr, 22, 12); 43998 DOperand imm = ImmediateVorr::DecodeImmediate( 43999 cmode, 44000 (instr & 0xf) | ((instr >> 12) & 0x70) | 44001 ((instr >> 17) & 0x80)); 44002 // VORR{<c>}{<q>}.<dt> {<Ddn>}, <Ddn>, #<imm> ; A1 NOLINT(whitespace/line_length) 44003 vorr(al, dt, DRegister(rd), DRegister(rd), imm); 44004 break; 44005 } 44006 case 0x00000020: { 44007 // 0xf2800530 44008 if (((instr & 0x100) == 0x0) || 44009 ((instr & 0xc00) == 0xc00)) { 44010 UnallocatedA32(instr); 44011 return; 44012 } 44013 unsigned cmode = (instr >> 8) & 0xf; 44014 DataType dt = ImmediateVbic::DecodeDt(cmode); 44015 if (dt.Is(kDataTypeValueInvalid)) { 44016 UnallocatedA32(instr); 44017 return; 44018 } 44019 unsigned rd = ExtractDRegister(instr, 22, 12); 44020 DOperand imm = ImmediateVbic::DecodeImmediate( 44021 cmode, 44022 (instr & 0xf) | ((instr >> 12) & 0x70) | 44023 ((instr >> 17) & 0x80)); 44024 // VBIC{<c>}{<q>}.<dt> {<Ddn>}, <Ddn>, #<imm> ; A1 NOLINT(whitespace/line_length) 44025 vbic(al, dt, DRegister(rd), DRegister(rd), imm); 44026 break; 44027 } 44028 } 44029 break; 44030 } 44031 } 44032 break; 44033 } 44034 default: { 44035 switch (instr & 0x00000300) { 44036 case 0x00000000: { 44037 // 0xf2800410 44038 if ((instr & 0x01000000) == 0x01000000) { 44039 if (((instr & 0x380080) == 0x0)) { 44040 UnallocatedA32(instr); 44041 return; 44042 } 44043 DataType dt = Dt_L_imm6_4_Decode( 44044 ((instr >> 19) & 0x7) | ((instr >> 4) & 0x8)); 44045 if (dt.Is(kDataTypeValueInvalid)) { 44046 UnallocatedA32(instr); 44047 return; 44048 } 44049 unsigned rd = ExtractDRegister(instr, 22, 12); 44050 unsigned rm = ExtractDRegister(instr, 5, 0); 44051 uint32_t imm6 = (instr >> 16) & 0x3f; 44052 uint32_t imm = 44053 (dt.IsSize(64) ? 64 : (dt.GetSize() * 2)) - 44054 imm6; 44055 // VSRI{<c>}{<q>}.<dt> {<Dd>}, <Dm>, #<imm> ; A1 44056 vsri(al, dt, DRegister(rd), DRegister(rm), imm); 44057 } else { 44058 UnallocatedA32(instr); 44059 } 44060 break; 44061 } 44062 case 0x00000100: { 44063 // 0xf2800510 44064 switch (instr & 0x01000000) { 44065 case 0x00000000: { 44066 // 0xf2800510 44067 if (((instr & 0x380080) == 0x0)) { 44068 UnallocatedA32(instr); 44069 return; 44070 } 44071 DataType dt = 44072 Dt_L_imm6_3_Decode(((instr >> 19) & 0x7) | 44073 ((instr >> 4) & 0x8)); 44074 if (dt.Is(kDataTypeValueInvalid)) { 44075 UnallocatedA32(instr); 44076 return; 44077 } 44078 unsigned rd = ExtractDRegister(instr, 22, 12); 44079 unsigned rm = ExtractDRegister(instr, 5, 0); 44080 uint32_t imm6 = (instr >> 16) & 0x3f; 44081 uint32_t imm = 44082 imm6 - (dt.IsSize(64) ? 0 : dt.GetSize()); 44083 // VSHL{<c>}{<q>}.I<size> {<Dd>}, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length) 44084 vshl(al, dt, DRegister(rd), DRegister(rm), imm); 44085 break; 44086 } 44087 case 0x01000000: { 44088 // 0xf3800510 44089 if (((instr & 0x380080) == 0x0)) { 44090 UnallocatedA32(instr); 44091 return; 44092 } 44093 DataType dt = 44094 Dt_L_imm6_4_Decode(((instr >> 19) & 0x7) | 44095 ((instr >> 4) & 0x8)); 44096 if (dt.Is(kDataTypeValueInvalid)) { 44097 UnallocatedA32(instr); 44098 return; 44099 } 44100 unsigned rd = ExtractDRegister(instr, 22, 12); 44101 unsigned rm = ExtractDRegister(instr, 5, 0); 44102 uint32_t imm6 = (instr >> 16) & 0x3f; 44103 uint32_t imm = 44104 imm6 - (dt.IsSize(64) ? 0 : dt.GetSize()); 44105 // VSLI{<c>}{<q>}.<dt> {<Dd>}, <Dm>, #<imm> ; A1 44106 vsli(al, dt, DRegister(rd), DRegister(rm), imm); 44107 break; 44108 } 44109 } 44110 break; 44111 } 44112 case 0x00000200: { 44113 // 0xf2800610 44114 if (((instr & 0x380080) == 0x0)) { 44115 UnallocatedA32(instr); 44116 return; 44117 } 44118 DataType dt = 44119 Dt_L_imm6_2_Decode(((instr >> 19) & 0x7) | 44120 ((instr >> 4) & 0x8), 44121 (instr >> 24) & 0x1); 44122 if (dt.Is(kDataTypeValueInvalid)) { 44123 UnallocatedA32(instr); 44124 return; 44125 } 44126 unsigned rd = ExtractDRegister(instr, 22, 12); 44127 unsigned rm = ExtractDRegister(instr, 5, 0); 44128 uint32_t imm6 = (instr >> 16) & 0x3f; 44129 uint32_t imm = 44130 imm6 - (dt.IsSize(64) ? 0 : dt.GetSize()); 44131 // VQSHLU{<c>}{<q>}.<type><size> {<Dd>}, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length) 44132 vqshlu(al, dt, DRegister(rd), DRegister(rm), imm); 44133 break; 44134 } 44135 case 0x00000300: { 44136 // 0xf2800710 44137 if (((instr & 0x380080) == 0x0)) { 44138 UnallocatedA32(instr); 44139 return; 44140 } 44141 DataType dt = 44142 Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) | 44143 ((instr >> 4) & 0x8), 44144 (instr >> 24) & 0x1); 44145 if (dt.Is(kDataTypeValueInvalid)) { 44146 UnallocatedA32(instr); 44147 return; 44148 } 44149 unsigned rd = ExtractDRegister(instr, 22, 12); 44150 unsigned rm = ExtractDRegister(instr, 5, 0); 44151 uint32_t imm6 = (instr >> 16) & 0x3f; 44152 uint32_t imm = 44153 imm6 - (dt.IsSize(64) ? 0 : dt.GetSize()); 44154 // VQSHL{<c>}{<q>}.<type><size> {<Dd>}, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length) 44155 vqshl(al, dt, DRegister(rd), DRegister(rm), imm); 44156 break; 44157 } 44158 } 44159 break; 44160 } 44161 } 44162 break; 44163 } 44164 case 0x00000800: { 44165 // 0xf2800810 44166 switch (instr & 0x00000080) { 44167 case 0x00000000: { 44168 // 0xf2800810 44169 switch (instr & 0x00380000) { 44170 case 0x00000000: { 44171 // 0xf2800810 44172 switch (instr & 0x00000100) { 44173 case 0x00000000: { 44174 // 0xf2800810 44175 switch (instr & 0x00000200) { 44176 default: { 44177 switch (instr & 0x00000020) { 44178 case 0x00000020: { 44179 // 0xf2800830 44180 if (((instr & 0xd00) == 0x100) || 44181 ((instr & 0xd00) == 0x500) || 44182 ((instr & 0xd00) == 0x900) || 44183 ((instr & 0xe00) == 0xe00)) { 44184 UnallocatedA32(instr); 44185 return; 44186 } 44187 unsigned cmode = (instr >> 8) & 0xf; 44188 DataType dt = 44189 ImmediateVmvn::DecodeDt(cmode); 44190 if (dt.Is(kDataTypeValueInvalid)) { 44191 UnallocatedA32(instr); 44192 return; 44193 } 44194 unsigned rd = 44195 ExtractDRegister(instr, 22, 12); 44196 DOperand imm = 44197 ImmediateVmvn::DecodeImmediate( 44198 cmode, 44199 (instr & 0xf) | 44200 ((instr >> 12) & 0x70) | 44201 ((instr >> 17) & 0x80)); 44202 // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 44203 vmvn(al, dt, DRegister(rd), imm); 44204 break; 44205 } 44206 default: { 44207 if (((instr & 0x920) == 0x100) || 44208 ((instr & 0x520) == 0x100) || 44209 ((instr & 0x820) == 0x20) || 44210 ((instr & 0x420) == 0x20) || 44211 ((instr & 0x220) == 0x20) || 44212 ((instr & 0x120) == 0x120)) { 44213 UnallocatedA32(instr); 44214 return; 44215 } 44216 unsigned cmode = ((instr >> 8) & 0xf) | 44217 ((instr >> 1) & 0x10); 44218 DataType dt = 44219 ImmediateVmov::DecodeDt(cmode); 44220 if (dt.Is(kDataTypeValueInvalid)) { 44221 UnallocatedA32(instr); 44222 return; 44223 } 44224 unsigned rd = 44225 ExtractDRegister(instr, 22, 12); 44226 DOperand imm = 44227 ImmediateVmov::DecodeImmediate( 44228 cmode, 44229 (instr & 0xf) | 44230 ((instr >> 12) & 0x70) | 44231 ((instr >> 17) & 0x80)); 44232 // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 44233 vmov(al, dt, DRegister(rd), imm); 44234 break; 44235 } 44236 } 44237 break; 44238 } 44239 } 44240 break; 44241 } 44242 case 0x00000100: { 44243 // 0xf2800910 44244 switch (instr & 0x00000020) { 44245 case 0x00000000: { 44246 // 0xf2800910 44247 if (((instr & 0x100) == 0x0) || 44248 ((instr & 0xc00) == 0xc00)) { 44249 UnallocatedA32(instr); 44250 return; 44251 } 44252 unsigned cmode = (instr >> 8) & 0xf; 44253 DataType dt = 44254 ImmediateVorr::DecodeDt(cmode); 44255 if (dt.Is(kDataTypeValueInvalid)) { 44256 UnallocatedA32(instr); 44257 return; 44258 } 44259 unsigned rd = 44260 ExtractDRegister(instr, 22, 12); 44261 DOperand imm = 44262 ImmediateVorr::DecodeImmediate( 44263 cmode, 44264 (instr & 0xf) | 44265 ((instr >> 12) & 0x70) | 44266 ((instr >> 17) & 0x80)); 44267 // VORR{<c>}{<q>}.<dt> {<Ddn>}, <Ddn>, #<imm> ; A1 NOLINT(whitespace/line_length) 44268 vorr(al, 44269 dt, 44270 DRegister(rd), 44271 DRegister(rd), 44272 imm); 44273 break; 44274 } 44275 case 0x00000020: { 44276 // 0xf2800930 44277 if (((instr & 0x100) == 0x0) || 44278 ((instr & 0xc00) == 0xc00)) { 44279 UnallocatedA32(instr); 44280 return; 44281 } 44282 unsigned cmode = (instr >> 8) & 0xf; 44283 DataType dt = 44284 ImmediateVbic::DecodeDt(cmode); 44285 if (dt.Is(kDataTypeValueInvalid)) { 44286 UnallocatedA32(instr); 44287 return; 44288 } 44289 unsigned rd = 44290 ExtractDRegister(instr, 22, 12); 44291 DOperand imm = 44292 ImmediateVbic::DecodeImmediate( 44293 cmode, 44294 (instr & 0xf) | 44295 ((instr >> 12) & 0x70) | 44296 ((instr >> 17) & 0x80)); 44297 // VBIC{<c>}{<q>}.<dt> {<Ddn>}, <Ddn>, #<imm> ; A1 NOLINT(whitespace/line_length) 44298 vbic(al, 44299 dt, 44300 DRegister(rd), 44301 DRegister(rd), 44302 imm); 44303 break; 44304 } 44305 } 44306 break; 44307 } 44308 } 44309 break; 44310 } 44311 case 0x00180000: { 44312 // 0xf2980810 44313 switch (instr & 0x00000300) { 44314 case 0x00000000: { 44315 // 0xf2980810 44316 switch (instr & 0x01000000) { 44317 case 0x00000000: { 44318 // 0xf2980810 44319 if (((instr & 0x380000) == 0x0)) { 44320 UnallocatedA32(instr); 44321 return; 44322 } 44323 DataType dt = 44324 Dt_imm6_3_Decode((instr >> 19) & 0x7); 44325 if (dt.Is(kDataTypeValueInvalid)) { 44326 UnallocatedA32(instr); 44327 return; 44328 } 44329 unsigned rd = 44330 ExtractDRegister(instr, 22, 12); 44331 if ((instr & 1) != 0) { 44332 UnallocatedA32(instr); 44333 return; 44334 } 44335 unsigned rm = ExtractQRegister(instr, 5, 0); 44336 uint32_t imm6 = (instr >> 16) & 0x3f; 44337 uint32_t imm = dt.GetSize() - imm6; 44338 // VSHRN{<c>}{<q>}.I<size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length) 44339 vshrn(al, 44340 dt, 44341 DRegister(rd), 44342 QRegister(rm), 44343 imm); 44344 break; 44345 } 44346 case 0x01000000: { 44347 // 0xf3980810 44348 if (((instr & 0x380000) == 0x0)) { 44349 UnallocatedA32(instr); 44350 return; 44351 } 44352 DataType dt = 44353 Dt_imm6_2_Decode((instr >> 19) & 0x7, 44354 (instr >> 24) & 0x1); 44355 if (dt.Is(kDataTypeValueInvalid)) { 44356 UnallocatedA32(instr); 44357 return; 44358 } 44359 unsigned rd = 44360 ExtractDRegister(instr, 22, 12); 44361 if ((instr & 1) != 0) { 44362 UnallocatedA32(instr); 44363 return; 44364 } 44365 unsigned rm = ExtractQRegister(instr, 5, 0); 44366 uint32_t imm6 = (instr >> 16) & 0x3f; 44367 uint32_t imm = dt.GetSize() - imm6; 44368 // VQSHRUN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length) 44369 vqshrun(al, 44370 dt, 44371 DRegister(rd), 44372 QRegister(rm), 44373 imm); 44374 break; 44375 } 44376 } 44377 break; 44378 } 44379 case 0x00000100: { 44380 // 0xf2980910 44381 if (((instr & 0x380000) == 0x0)) { 44382 UnallocatedA32(instr); 44383 return; 44384 } 44385 DataType dt = 44386 Dt_imm6_1_Decode((instr >> 19) & 0x7, 44387 (instr >> 24) & 0x1); 44388 if (dt.Is(kDataTypeValueInvalid)) { 44389 UnallocatedA32(instr); 44390 return; 44391 } 44392 unsigned rd = ExtractDRegister(instr, 22, 12); 44393 if ((instr & 1) != 0) { 44394 UnallocatedA32(instr); 44395 return; 44396 } 44397 unsigned rm = ExtractQRegister(instr, 5, 0); 44398 uint32_t imm6 = (instr >> 16) & 0x3f; 44399 uint32_t imm = dt.GetSize() - imm6; 44400 // VQSHRN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length) 44401 vqshrn(al, 44402 dt, 44403 DRegister(rd), 44404 QRegister(rm), 44405 imm); 44406 break; 44407 } 44408 case 0x00000200: { 44409 // 0xf2980a10 44410 if (((instr & 0x380000) == 0x0) || 44411 ((instr & 0x3f0000) == 0x80000) || 44412 ((instr & 0x3f0000) == 0x100000) || 44413 ((instr & 0x3f0000) == 0x200000)) { 44414 UnallocatedA32(instr); 44415 return; 44416 } 44417 DataType dt = 44418 Dt_imm6_4_Decode((instr >> 19) & 0x7, 44419 (instr >> 24) & 0x1); 44420 if (dt.Is(kDataTypeValueInvalid)) { 44421 UnallocatedA32(instr); 44422 return; 44423 } 44424 if (((instr >> 12) & 1) != 0) { 44425 UnallocatedA32(instr); 44426 return; 44427 } 44428 unsigned rd = ExtractQRegister(instr, 22, 12); 44429 unsigned rm = ExtractDRegister(instr, 5, 0); 44430 uint32_t imm6 = (instr >> 16) & 0x3f; 44431 uint32_t imm = imm6 - dt.GetSize(); 44432 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length) 44433 vshll(al, 44434 dt, 44435 QRegister(rd), 44436 DRegister(rm), 44437 imm); 44438 break; 44439 } 44440 default: 44441 UnallocatedA32(instr); 44442 break; 44443 } 44444 break; 44445 } 44446 case 0x00280000: { 44447 // 0xf2a80810 44448 switch (instr & 0x00000300) { 44449 case 0x00000000: { 44450 // 0xf2a80810 44451 switch (instr & 0x01000000) { 44452 case 0x00000000: { 44453 // 0xf2a80810 44454 if (((instr & 0x380000) == 0x0)) { 44455 UnallocatedA32(instr); 44456 return; 44457 } 44458 DataType dt = 44459 Dt_imm6_3_Decode((instr >> 19) & 0x7); 44460 if (dt.Is(kDataTypeValueInvalid)) { 44461 UnallocatedA32(instr); 44462 return; 44463 } 44464 unsigned rd = 44465 ExtractDRegister(instr, 22, 12); 44466 if ((instr & 1) != 0) { 44467 UnallocatedA32(instr); 44468 return; 44469 } 44470 unsigned rm = ExtractQRegister(instr, 5, 0); 44471 uint32_t imm6 = (instr >> 16) & 0x3f; 44472 uint32_t imm = dt.GetSize() - imm6; 44473 // VSHRN{<c>}{<q>}.I<size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length) 44474 vshrn(al, 44475 dt, 44476 DRegister(rd), 44477 QRegister(rm), 44478 imm); 44479 break; 44480 } 44481 case 0x01000000: { 44482 // 0xf3a80810 44483 if (((instr & 0x380000) == 0x0)) { 44484 UnallocatedA32(instr); 44485 return; 44486 } 44487 DataType dt = 44488 Dt_imm6_2_Decode((instr >> 19) & 0x7, 44489 (instr >> 24) & 0x1); 44490 if (dt.Is(kDataTypeValueInvalid)) { 44491 UnallocatedA32(instr); 44492 return; 44493 } 44494 unsigned rd = 44495 ExtractDRegister(instr, 22, 12); 44496 if ((instr & 1) != 0) { 44497 UnallocatedA32(instr); 44498 return; 44499 } 44500 unsigned rm = ExtractQRegister(instr, 5, 0); 44501 uint32_t imm6 = (instr >> 16) & 0x3f; 44502 uint32_t imm = dt.GetSize() - imm6; 44503 // VQSHRUN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length) 44504 vqshrun(al, 44505 dt, 44506 DRegister(rd), 44507 QRegister(rm), 44508 imm); 44509 break; 44510 } 44511 } 44512 break; 44513 } 44514 case 0x00000100: { 44515 // 0xf2a80910 44516 if (((instr & 0x380000) == 0x0)) { 44517 UnallocatedA32(instr); 44518 return; 44519 } 44520 DataType dt = 44521 Dt_imm6_1_Decode((instr >> 19) & 0x7, 44522 (instr >> 24) & 0x1); 44523 if (dt.Is(kDataTypeValueInvalid)) { 44524 UnallocatedA32(instr); 44525 return; 44526 } 44527 unsigned rd = ExtractDRegister(instr, 22, 12); 44528 if ((instr & 1) != 0) { 44529 UnallocatedA32(instr); 44530 return; 44531 } 44532 unsigned rm = ExtractQRegister(instr, 5, 0); 44533 uint32_t imm6 = (instr >> 16) & 0x3f; 44534 uint32_t imm = dt.GetSize() - imm6; 44535 // VQSHRN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length) 44536 vqshrn(al, 44537 dt, 44538 DRegister(rd), 44539 QRegister(rm), 44540 imm); 44541 break; 44542 } 44543 case 0x00000200: { 44544 // 0xf2a80a10 44545 if (((instr & 0x380000) == 0x0) || 44546 ((instr & 0x3f0000) == 0x80000) || 44547 ((instr & 0x3f0000) == 0x100000) || 44548 ((instr & 0x3f0000) == 0x200000)) { 44549 UnallocatedA32(instr); 44550 return; 44551 } 44552 DataType dt = 44553 Dt_imm6_4_Decode((instr >> 19) & 0x7, 44554 (instr >> 24) & 0x1); 44555 if (dt.Is(kDataTypeValueInvalid)) { 44556 UnallocatedA32(instr); 44557 return; 44558 } 44559 if (((instr >> 12) & 1) != 0) { 44560 UnallocatedA32(instr); 44561 return; 44562 } 44563 unsigned rd = ExtractQRegister(instr, 22, 12); 44564 unsigned rm = ExtractDRegister(instr, 5, 0); 44565 uint32_t imm6 = (instr >> 16) & 0x3f; 44566 uint32_t imm = imm6 - dt.GetSize(); 44567 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length) 44568 vshll(al, 44569 dt, 44570 QRegister(rd), 44571 DRegister(rm), 44572 imm); 44573 break; 44574 } 44575 default: 44576 UnallocatedA32(instr); 44577 break; 44578 } 44579 break; 44580 } 44581 case 0x00300000: { 44582 // 0xf2b00810 44583 switch (instr & 0x00000300) { 44584 case 0x00000000: { 44585 // 0xf2b00810 44586 switch (instr & 0x01000000) { 44587 case 0x00000000: { 44588 // 0xf2b00810 44589 if (((instr & 0x380000) == 0x0)) { 44590 UnallocatedA32(instr); 44591 return; 44592 } 44593 DataType dt = 44594 Dt_imm6_3_Decode((instr >> 19) & 0x7); 44595 if (dt.Is(kDataTypeValueInvalid)) { 44596 UnallocatedA32(instr); 44597 return; 44598 } 44599 unsigned rd = 44600 ExtractDRegister(instr, 22, 12); 44601 if ((instr & 1) != 0) { 44602 UnallocatedA32(instr); 44603 return; 44604 } 44605 unsigned rm = ExtractQRegister(instr, 5, 0); 44606 uint32_t imm6 = (instr >> 16) & 0x3f; 44607 uint32_t imm = dt.GetSize() - imm6; 44608 // VSHRN{<c>}{<q>}.I<size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length) 44609 vshrn(al, 44610 dt, 44611 DRegister(rd), 44612 QRegister(rm), 44613 imm); 44614 break; 44615 } 44616 case 0x01000000: { 44617 // 0xf3b00810 44618 if (((instr & 0x380000) == 0x0)) { 44619 UnallocatedA32(instr); 44620 return; 44621 } 44622 DataType dt = 44623 Dt_imm6_2_Decode((instr >> 19) & 0x7, 44624 (instr >> 24) & 0x1); 44625 if (dt.Is(kDataTypeValueInvalid)) { 44626 UnallocatedA32(instr); 44627 return; 44628 } 44629 unsigned rd = 44630 ExtractDRegister(instr, 22, 12); 44631 if ((instr & 1) != 0) { 44632 UnallocatedA32(instr); 44633 return; 44634 } 44635 unsigned rm = ExtractQRegister(instr, 5, 0); 44636 uint32_t imm6 = (instr >> 16) & 0x3f; 44637 uint32_t imm = dt.GetSize() - imm6; 44638 // VQSHRUN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length) 44639 vqshrun(al, 44640 dt, 44641 DRegister(rd), 44642 QRegister(rm), 44643 imm); 44644 break; 44645 } 44646 } 44647 break; 44648 } 44649 case 0x00000100: { 44650 // 0xf2b00910 44651 if (((instr & 0x380000) == 0x0)) { 44652 UnallocatedA32(instr); 44653 return; 44654 } 44655 DataType dt = 44656 Dt_imm6_1_Decode((instr >> 19) & 0x7, 44657 (instr >> 24) & 0x1); 44658 if (dt.Is(kDataTypeValueInvalid)) { 44659 UnallocatedA32(instr); 44660 return; 44661 } 44662 unsigned rd = ExtractDRegister(instr, 22, 12); 44663 if ((instr & 1) != 0) { 44664 UnallocatedA32(instr); 44665 return; 44666 } 44667 unsigned rm = ExtractQRegister(instr, 5, 0); 44668 uint32_t imm6 = (instr >> 16) & 0x3f; 44669 uint32_t imm = dt.GetSize() - imm6; 44670 // VQSHRN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length) 44671 vqshrn(al, 44672 dt, 44673 DRegister(rd), 44674 QRegister(rm), 44675 imm); 44676 break; 44677 } 44678 case 0x00000200: { 44679 // 0xf2b00a10 44680 if (((instr & 0x380000) == 0x0) || 44681 ((instr & 0x3f0000) == 0x80000) || 44682 ((instr & 0x3f0000) == 0x100000) || 44683 ((instr & 0x3f0000) == 0x200000)) { 44684 UnallocatedA32(instr); 44685 return; 44686 } 44687 DataType dt = 44688 Dt_imm6_4_Decode((instr >> 19) & 0x7, 44689 (instr >> 24) & 0x1); 44690 if (dt.Is(kDataTypeValueInvalid)) { 44691 UnallocatedA32(instr); 44692 return; 44693 } 44694 if (((instr >> 12) & 1) != 0) { 44695 UnallocatedA32(instr); 44696 return; 44697 } 44698 unsigned rd = ExtractQRegister(instr, 22, 12); 44699 unsigned rm = ExtractDRegister(instr, 5, 0); 44700 uint32_t imm6 = (instr >> 16) & 0x3f; 44701 uint32_t imm = imm6 - dt.GetSize(); 44702 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length) 44703 vshll(al, 44704 dt, 44705 QRegister(rd), 44706 DRegister(rm), 44707 imm); 44708 break; 44709 } 44710 default: 44711 UnallocatedA32(instr); 44712 break; 44713 } 44714 break; 44715 } 44716 case 0x00380000: { 44717 // 0xf2b80810 44718 switch (instr & 0x00000300) { 44719 case 0x00000000: { 44720 // 0xf2b80810 44721 switch (instr & 0x01000000) { 44722 case 0x00000000: { 44723 // 0xf2b80810 44724 if (((instr & 0x380000) == 0x0)) { 44725 UnallocatedA32(instr); 44726 return; 44727 } 44728 DataType dt = 44729 Dt_imm6_3_Decode((instr >> 19) & 0x7); 44730 if (dt.Is(kDataTypeValueInvalid)) { 44731 UnallocatedA32(instr); 44732 return; 44733 } 44734 unsigned rd = 44735 ExtractDRegister(instr, 22, 12); 44736 if ((instr & 1) != 0) { 44737 UnallocatedA32(instr); 44738 return; 44739 } 44740 unsigned rm = ExtractQRegister(instr, 5, 0); 44741 uint32_t imm6 = (instr >> 16) & 0x3f; 44742 uint32_t imm = dt.GetSize() - imm6; 44743 // VSHRN{<c>}{<q>}.I<size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length) 44744 vshrn(al, 44745 dt, 44746 DRegister(rd), 44747 QRegister(rm), 44748 imm); 44749 break; 44750 } 44751 case 0x01000000: { 44752 // 0xf3b80810 44753 if (((instr & 0x380000) == 0x0)) { 44754 UnallocatedA32(instr); 44755 return; 44756 } 44757 DataType dt = 44758 Dt_imm6_2_Decode((instr >> 19) & 0x7, 44759 (instr >> 24) & 0x1); 44760 if (dt.Is(kDataTypeValueInvalid)) { 44761 UnallocatedA32(instr); 44762 return; 44763 } 44764 unsigned rd = 44765 ExtractDRegister(instr, 22, 12); 44766 if ((instr & 1) != 0) { 44767 UnallocatedA32(instr); 44768 return; 44769 } 44770 unsigned rm = ExtractQRegister(instr, 5, 0); 44771 uint32_t imm6 = (instr >> 16) & 0x3f; 44772 uint32_t imm = dt.GetSize() - imm6; 44773 // VQSHRUN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length) 44774 vqshrun(al, 44775 dt, 44776 DRegister(rd), 44777 QRegister(rm), 44778 imm); 44779 break; 44780 } 44781 } 44782 break; 44783 } 44784 case 0x00000100: { 44785 // 0xf2b80910 44786 if (((instr & 0x380000) == 0x0)) { 44787 UnallocatedA32(instr); 44788 return; 44789 } 44790 DataType dt = 44791 Dt_imm6_1_Decode((instr >> 19) & 0x7, 44792 (instr >> 24) & 0x1); 44793 if (dt.Is(kDataTypeValueInvalid)) { 44794 UnallocatedA32(instr); 44795 return; 44796 } 44797 unsigned rd = ExtractDRegister(instr, 22, 12); 44798 if ((instr & 1) != 0) { 44799 UnallocatedA32(instr); 44800 return; 44801 } 44802 unsigned rm = ExtractQRegister(instr, 5, 0); 44803 uint32_t imm6 = (instr >> 16) & 0x3f; 44804 uint32_t imm = dt.GetSize() - imm6; 44805 // VQSHRN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length) 44806 vqshrn(al, 44807 dt, 44808 DRegister(rd), 44809 QRegister(rm), 44810 imm); 44811 break; 44812 } 44813 case 0x00000200: { 44814 // 0xf2b80a10 44815 if (((instr & 0x380000) == 0x0) || 44816 ((instr & 0x3f0000) == 0x80000) || 44817 ((instr & 0x3f0000) == 0x100000) || 44818 ((instr & 0x3f0000) == 0x200000)) { 44819 UnallocatedA32(instr); 44820 return; 44821 } 44822 DataType dt = 44823 Dt_imm6_4_Decode((instr >> 19) & 0x7, 44824 (instr >> 24) & 0x1); 44825 if (dt.Is(kDataTypeValueInvalid)) { 44826 UnallocatedA32(instr); 44827 return; 44828 } 44829 if (((instr >> 12) & 1) != 0) { 44830 UnallocatedA32(instr); 44831 return; 44832 } 44833 unsigned rd = ExtractQRegister(instr, 22, 12); 44834 unsigned rm = ExtractDRegister(instr, 5, 0); 44835 uint32_t imm6 = (instr >> 16) & 0x3f; 44836 uint32_t imm = imm6 - dt.GetSize(); 44837 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length) 44838 vshll(al, 44839 dt, 44840 QRegister(rd), 44841 DRegister(rm), 44842 imm); 44843 break; 44844 } 44845 default: 44846 UnallocatedA32(instr); 44847 break; 44848 } 44849 break; 44850 } 44851 default: { 44852 switch (instr & 0x00000300) { 44853 case 0x00000000: { 44854 // 0xf2800810 44855 switch (instr & 0x01000000) { 44856 case 0x00000000: { 44857 // 0xf2800810 44858 if (((instr & 0x380000) == 0x0)) { 44859 UnallocatedA32(instr); 44860 return; 44861 } 44862 DataType dt = 44863 Dt_imm6_3_Decode((instr >> 19) & 0x7); 44864 if (dt.Is(kDataTypeValueInvalid)) { 44865 UnallocatedA32(instr); 44866 return; 44867 } 44868 unsigned rd = 44869 ExtractDRegister(instr, 22, 12); 44870 if ((instr & 1) != 0) { 44871 UnallocatedA32(instr); 44872 return; 44873 } 44874 unsigned rm = ExtractQRegister(instr, 5, 0); 44875 uint32_t imm6 = (instr >> 16) & 0x3f; 44876 uint32_t imm = dt.GetSize() - imm6; 44877 // VSHRN{<c>}{<q>}.I<size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length) 44878 vshrn(al, 44879 dt, 44880 DRegister(rd), 44881 QRegister(rm), 44882 imm); 44883 break; 44884 } 44885 case 0x01000000: { 44886 // 0xf3800810 44887 if (((instr & 0x380000) == 0x0)) { 44888 UnallocatedA32(instr); 44889 return; 44890 } 44891 DataType dt = 44892 Dt_imm6_2_Decode((instr >> 19) & 0x7, 44893 (instr >> 24) & 0x1); 44894 if (dt.Is(kDataTypeValueInvalid)) { 44895 UnallocatedA32(instr); 44896 return; 44897 } 44898 unsigned rd = 44899 ExtractDRegister(instr, 22, 12); 44900 if ((instr & 1) != 0) { 44901 UnallocatedA32(instr); 44902 return; 44903 } 44904 unsigned rm = ExtractQRegister(instr, 5, 0); 44905 uint32_t imm6 = (instr >> 16) & 0x3f; 44906 uint32_t imm = dt.GetSize() - imm6; 44907 // VQSHRUN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length) 44908 vqshrun(al, 44909 dt, 44910 DRegister(rd), 44911 QRegister(rm), 44912 imm); 44913 break; 44914 } 44915 } 44916 break; 44917 } 44918 case 0x00000100: { 44919 // 0xf2800910 44920 if (((instr & 0x380000) == 0x0)) { 44921 UnallocatedA32(instr); 44922 return; 44923 } 44924 DataType dt = 44925 Dt_imm6_1_Decode((instr >> 19) & 0x7, 44926 (instr >> 24) & 0x1); 44927 if (dt.Is(kDataTypeValueInvalid)) { 44928 UnallocatedA32(instr); 44929 return; 44930 } 44931 unsigned rd = ExtractDRegister(instr, 22, 12); 44932 if ((instr & 1) != 0) { 44933 UnallocatedA32(instr); 44934 return; 44935 } 44936 unsigned rm = ExtractQRegister(instr, 5, 0); 44937 uint32_t imm6 = (instr >> 16) & 0x3f; 44938 uint32_t imm = dt.GetSize() - imm6; 44939 // VQSHRN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length) 44940 vqshrn(al, 44941 dt, 44942 DRegister(rd), 44943 QRegister(rm), 44944 imm); 44945 break; 44946 } 44947 case 0x00000200: { 44948 // 0xf2800a10 44949 switch (instr & 0x00070000) { 44950 case 0x00000000: { 44951 // 0xf2800a10 44952 switch (instr & 0x003f0000) { 44953 case 0x00080000: { 44954 // 0xf2880a10 44955 if (((instr & 0x380000) == 0x0) || 44956 ((instr & 0x380000) == 0x180000) || 44957 ((instr & 0x380000) == 0x280000) || 44958 ((instr & 0x380000) == 0x300000) || 44959 ((instr & 0x380000) == 0x380000)) { 44960 UnallocatedA32(instr); 44961 return; 44962 } 44963 DataType dt = Dt_U_imm3H_1_Decode( 44964 ((instr >> 19) & 0x7) | 44965 ((instr >> 21) & 0x8)); 44966 if (dt.Is(kDataTypeValueInvalid)) { 44967 UnallocatedA32(instr); 44968 return; 44969 } 44970 if (((instr >> 12) & 1) != 0) { 44971 UnallocatedA32(instr); 44972 return; 44973 } 44974 unsigned rd = 44975 ExtractQRegister(instr, 22, 12); 44976 unsigned rm = 44977 ExtractDRegister(instr, 5, 0); 44978 // VMOVL{<c>}{<q>}.<dt> <Qd>, <Dm> ; A1 44979 vmovl(al, 44980 dt, 44981 QRegister(rd), 44982 DRegister(rm)); 44983 break; 44984 } 44985 case 0x00090000: { 44986 // 0xf2890a10 44987 if (((instr & 0x380000) == 0x0) || 44988 ((instr & 0x3f0000) == 0x80000) || 44989 ((instr & 0x3f0000) == 0x100000) || 44990 ((instr & 0x3f0000) == 0x200000)) { 44991 UnallocatedA32(instr); 44992 return; 44993 } 44994 DataType dt = 44995 Dt_imm6_4_Decode((instr >> 19) & 44996 0x7, 44997 (instr >> 24) & 44998 0x1); 44999 if (dt.Is(kDataTypeValueInvalid)) { 45000 UnallocatedA32(instr); 45001 return; 45002 } 45003 if (((instr >> 12) & 1) != 0) { 45004 UnallocatedA32(instr); 45005 return; 45006 } 45007 unsigned rd = 45008 ExtractQRegister(instr, 22, 12); 45009 unsigned rm = 45010 ExtractDRegister(instr, 5, 0); 45011 uint32_t imm6 = (instr >> 16) & 0x3f; 45012 uint32_t imm = imm6 - dt.GetSize(); 45013 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length) 45014 vshll(al, 45015 dt, 45016 QRegister(rd), 45017 DRegister(rm), 45018 imm); 45019 break; 45020 } 45021 case 0x000a0000: { 45022 // 0xf28a0a10 45023 if (((instr & 0x380000) == 0x0) || 45024 ((instr & 0x3f0000) == 0x80000) || 45025 ((instr & 0x3f0000) == 0x100000) || 45026 ((instr & 0x3f0000) == 0x200000)) { 45027 UnallocatedA32(instr); 45028 return; 45029 } 45030 DataType dt = 45031 Dt_imm6_4_Decode((instr >> 19) & 45032 0x7, 45033 (instr >> 24) & 45034 0x1); 45035 if (dt.Is(kDataTypeValueInvalid)) { 45036 UnallocatedA32(instr); 45037 return; 45038 } 45039 if (((instr >> 12) & 1) != 0) { 45040 UnallocatedA32(instr); 45041 return; 45042 } 45043 unsigned rd = 45044 ExtractQRegister(instr, 22, 12); 45045 unsigned rm = 45046 ExtractDRegister(instr, 5, 0); 45047 uint32_t imm6 = (instr >> 16) & 0x3f; 45048 uint32_t imm = imm6 - dt.GetSize(); 45049 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length) 45050 vshll(al, 45051 dt, 45052 QRegister(rd), 45053 DRegister(rm), 45054 imm); 45055 break; 45056 } 45057 case 0x000b0000: { 45058 // 0xf28b0a10 45059 if (((instr & 0x380000) == 0x0) || 45060 ((instr & 0x3f0000) == 0x80000) || 45061 ((instr & 0x3f0000) == 0x100000) || 45062 ((instr & 0x3f0000) == 0x200000)) { 45063 UnallocatedA32(instr); 45064 return; 45065 } 45066 DataType dt = 45067 Dt_imm6_4_Decode((instr >> 19) & 45068 0x7, 45069 (instr >> 24) & 45070 0x1); 45071 if (dt.Is(kDataTypeValueInvalid)) { 45072 UnallocatedA32(instr); 45073 return; 45074 } 45075 if (((instr >> 12) & 1) != 0) { 45076 UnallocatedA32(instr); 45077 return; 45078 } 45079 unsigned rd = 45080 ExtractQRegister(instr, 22, 12); 45081 unsigned rm = 45082 ExtractDRegister(instr, 5, 0); 45083 uint32_t imm6 = (instr >> 16) & 0x3f; 45084 uint32_t imm = imm6 - dt.GetSize(); 45085 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length) 45086 vshll(al, 45087 dt, 45088 QRegister(rd), 45089 DRegister(rm), 45090 imm); 45091 break; 45092 } 45093 case 0x000c0000: { 45094 // 0xf28c0a10 45095 if (((instr & 0x380000) == 0x0) || 45096 ((instr & 0x3f0000) == 0x80000) || 45097 ((instr & 0x3f0000) == 0x100000) || 45098 ((instr & 0x3f0000) == 0x200000)) { 45099 UnallocatedA32(instr); 45100 return; 45101 } 45102 DataType dt = 45103 Dt_imm6_4_Decode((instr >> 19) & 45104 0x7, 45105 (instr >> 24) & 45106 0x1); 45107 if (dt.Is(kDataTypeValueInvalid)) { 45108 UnallocatedA32(instr); 45109 return; 45110 } 45111 if (((instr >> 12) & 1) != 0) { 45112 UnallocatedA32(instr); 45113 return; 45114 } 45115 unsigned rd = 45116 ExtractQRegister(instr, 22, 12); 45117 unsigned rm = 45118 ExtractDRegister(instr, 5, 0); 45119 uint32_t imm6 = (instr >> 16) & 0x3f; 45120 uint32_t imm = imm6 - dt.GetSize(); 45121 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length) 45122 vshll(al, 45123 dt, 45124 QRegister(rd), 45125 DRegister(rm), 45126 imm); 45127 break; 45128 } 45129 case 0x000d0000: { 45130 // 0xf28d0a10 45131 if (((instr & 0x380000) == 0x0) || 45132 ((instr & 0x3f0000) == 0x80000) || 45133 ((instr & 0x3f0000) == 0x100000) || 45134 ((instr & 0x3f0000) == 0x200000)) { 45135 UnallocatedA32(instr); 45136 return; 45137 } 45138 DataType dt = 45139 Dt_imm6_4_Decode((instr >> 19) & 45140 0x7, 45141 (instr >> 24) & 45142 0x1); 45143 if (dt.Is(kDataTypeValueInvalid)) { 45144 UnallocatedA32(instr); 45145 return; 45146 } 45147 if (((instr >> 12) & 1) != 0) { 45148 UnallocatedA32(instr); 45149 return; 45150 } 45151 unsigned rd = 45152 ExtractQRegister(instr, 22, 12); 45153 unsigned rm = 45154 ExtractDRegister(instr, 5, 0); 45155 uint32_t imm6 = (instr >> 16) & 0x3f; 45156 uint32_t imm = imm6 - dt.GetSize(); 45157 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length) 45158 vshll(al, 45159 dt, 45160 QRegister(rd), 45161 DRegister(rm), 45162 imm); 45163 break; 45164 } 45165 case 0x000e0000: { 45166 // 0xf28e0a10 45167 if (((instr & 0x380000) == 0x0) || 45168 ((instr & 0x3f0000) == 0x80000) || 45169 ((instr & 0x3f0000) == 0x100000) || 45170 ((instr & 0x3f0000) == 0x200000)) { 45171 UnallocatedA32(instr); 45172 return; 45173 } 45174 DataType dt = 45175 Dt_imm6_4_Decode((instr >> 19) & 45176 0x7, 45177 (instr >> 24) & 45178 0x1); 45179 if (dt.Is(kDataTypeValueInvalid)) { 45180 UnallocatedA32(instr); 45181 return; 45182 } 45183 if (((instr >> 12) & 1) != 0) { 45184 UnallocatedA32(instr); 45185 return; 45186 } 45187 unsigned rd = 45188 ExtractQRegister(instr, 22, 12); 45189 unsigned rm = 45190 ExtractDRegister(instr, 5, 0); 45191 uint32_t imm6 = (instr >> 16) & 0x3f; 45192 uint32_t imm = imm6 - dt.GetSize(); 45193 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length) 45194 vshll(al, 45195 dt, 45196 QRegister(rd), 45197 DRegister(rm), 45198 imm); 45199 break; 45200 } 45201 case 0x000f0000: { 45202 // 0xf28f0a10 45203 if (((instr & 0x380000) == 0x0) || 45204 ((instr & 0x3f0000) == 0x80000) || 45205 ((instr & 0x3f0000) == 0x100000) || 45206 ((instr & 0x3f0000) == 0x200000)) { 45207 UnallocatedA32(instr); 45208 return; 45209 } 45210 DataType dt = 45211 Dt_imm6_4_Decode((instr >> 19) & 45212 0x7, 45213 (instr >> 24) & 45214 0x1); 45215 if (dt.Is(kDataTypeValueInvalid)) { 45216 UnallocatedA32(instr); 45217 return; 45218 } 45219 if (((instr >> 12) & 1) != 0) { 45220 UnallocatedA32(instr); 45221 return; 45222 } 45223 unsigned rd = 45224 ExtractQRegister(instr, 22, 12); 45225 unsigned rm = 45226 ExtractDRegister(instr, 5, 0); 45227 uint32_t imm6 = (instr >> 16) & 0x3f; 45228 uint32_t imm = imm6 - dt.GetSize(); 45229 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length) 45230 vshll(al, 45231 dt, 45232 QRegister(rd), 45233 DRegister(rm), 45234 imm); 45235 break; 45236 } 45237 case 0x00100000: { 45238 // 0xf2900a10 45239 if (((instr & 0x380000) == 0x0) || 45240 ((instr & 0x380000) == 0x180000) || 45241 ((instr & 0x380000) == 0x280000) || 45242 ((instr & 0x380000) == 0x300000) || 45243 ((instr & 0x380000) == 0x380000)) { 45244 UnallocatedA32(instr); 45245 return; 45246 } 45247 DataType dt = Dt_U_imm3H_1_Decode( 45248 ((instr >> 19) & 0x7) | 45249 ((instr >> 21) & 0x8)); 45250 if (dt.Is(kDataTypeValueInvalid)) { 45251 UnallocatedA32(instr); 45252 return; 45253 } 45254 if (((instr >> 12) & 1) != 0) { 45255 UnallocatedA32(instr); 45256 return; 45257 } 45258 unsigned rd = 45259 ExtractQRegister(instr, 22, 12); 45260 unsigned rm = 45261 ExtractDRegister(instr, 5, 0); 45262 // VMOVL{<c>}{<q>}.<dt> <Qd>, <Dm> ; A1 45263 vmovl(al, 45264 dt, 45265 QRegister(rd), 45266 DRegister(rm)); 45267 break; 45268 } 45269 case 0x00110000: { 45270 // 0xf2910a10 45271 if (((instr & 0x380000) == 0x0) || 45272 ((instr & 0x3f0000) == 0x80000) || 45273 ((instr & 0x3f0000) == 0x100000) || 45274 ((instr & 0x3f0000) == 0x200000)) { 45275 UnallocatedA32(instr); 45276 return; 45277 } 45278 DataType dt = 45279 Dt_imm6_4_Decode((instr >> 19) & 45280 0x7, 45281 (instr >> 24) & 45282 0x1); 45283 if (dt.Is(kDataTypeValueInvalid)) { 45284 UnallocatedA32(instr); 45285 return; 45286 } 45287 if (((instr >> 12) & 1) != 0) { 45288 UnallocatedA32(instr); 45289 return; 45290 } 45291 unsigned rd = 45292 ExtractQRegister(instr, 22, 12); 45293 unsigned rm = 45294 ExtractDRegister(instr, 5, 0); 45295 uint32_t imm6 = (instr >> 16) & 0x3f; 45296 uint32_t imm = imm6 - dt.GetSize(); 45297 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length) 45298 vshll(al, 45299 dt, 45300 QRegister(rd), 45301 DRegister(rm), 45302 imm); 45303 break; 45304 } 45305 case 0x00120000: { 45306 // 0xf2920a10 45307 if (((instr & 0x380000) == 0x0) || 45308 ((instr & 0x3f0000) == 0x80000) || 45309 ((instr & 0x3f0000) == 0x100000) || 45310 ((instr & 0x3f0000) == 0x200000)) { 45311 UnallocatedA32(instr); 45312 return; 45313 } 45314 DataType dt = 45315 Dt_imm6_4_Decode((instr >> 19) & 45316 0x7, 45317 (instr >> 24) & 45318 0x1); 45319 if (dt.Is(kDataTypeValueInvalid)) { 45320 UnallocatedA32(instr); 45321 return; 45322 } 45323 if (((instr >> 12) & 1) != 0) { 45324 UnallocatedA32(instr); 45325 return; 45326 } 45327 unsigned rd = 45328 ExtractQRegister(instr, 22, 12); 45329 unsigned rm = 45330 ExtractDRegister(instr, 5, 0); 45331 uint32_t imm6 = (instr >> 16) & 0x3f; 45332 uint32_t imm = imm6 - dt.GetSize(); 45333 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length) 45334 vshll(al, 45335 dt, 45336 QRegister(rd), 45337 DRegister(rm), 45338 imm); 45339 break; 45340 } 45341 case 0x00130000: { 45342 // 0xf2930a10 45343 if (((instr & 0x380000) == 0x0) || 45344 ((instr & 0x3f0000) == 0x80000) || 45345 ((instr & 0x3f0000) == 0x100000) || 45346 ((instr & 0x3f0000) == 0x200000)) { 45347 UnallocatedA32(instr); 45348 return; 45349 } 45350 DataType dt = 45351 Dt_imm6_4_Decode((instr >> 19) & 45352 0x7, 45353 (instr >> 24) & 45354 0x1); 45355 if (dt.Is(kDataTypeValueInvalid)) { 45356 UnallocatedA32(instr); 45357 return; 45358 } 45359 if (((instr >> 12) & 1) != 0) { 45360 UnallocatedA32(instr); 45361 return; 45362 } 45363 unsigned rd = 45364 ExtractQRegister(instr, 22, 12); 45365 unsigned rm = 45366 ExtractDRegister(instr, 5, 0); 45367 uint32_t imm6 = (instr >> 16) & 0x3f; 45368 uint32_t imm = imm6 - dt.GetSize(); 45369 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length) 45370 vshll(al, 45371 dt, 45372 QRegister(rd), 45373 DRegister(rm), 45374 imm); 45375 break; 45376 } 45377 case 0x00140000: { 45378 // 0xf2940a10 45379 if (((instr & 0x380000) == 0x0) || 45380 ((instr & 0x3f0000) == 0x80000) || 45381 ((instr & 0x3f0000) == 0x100000) || 45382 ((instr & 0x3f0000) == 0x200000)) { 45383 UnallocatedA32(instr); 45384 return; 45385 } 45386 DataType dt = 45387 Dt_imm6_4_Decode((instr >> 19) & 45388 0x7, 45389 (instr >> 24) & 45390 0x1); 45391 if (dt.Is(kDataTypeValueInvalid)) { 45392 UnallocatedA32(instr); 45393 return; 45394 } 45395 if (((instr >> 12) & 1) != 0) { 45396 UnallocatedA32(instr); 45397 return; 45398 } 45399 unsigned rd = 45400 ExtractQRegister(instr, 22, 12); 45401 unsigned rm = 45402 ExtractDRegister(instr, 5, 0); 45403 uint32_t imm6 = (instr >> 16) & 0x3f; 45404 uint32_t imm = imm6 - dt.GetSize(); 45405 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length) 45406 vshll(al, 45407 dt, 45408 QRegister(rd), 45409 DRegister(rm), 45410 imm); 45411 break; 45412 } 45413 case 0x00150000: { 45414 // 0xf2950a10 45415 if (((instr & 0x380000) == 0x0) || 45416 ((instr & 0x3f0000) == 0x80000) || 45417 ((instr & 0x3f0000) == 0x100000) || 45418 ((instr & 0x3f0000) == 0x200000)) { 45419 UnallocatedA32(instr); 45420 return; 45421 } 45422 DataType dt = 45423 Dt_imm6_4_Decode((instr >> 19) & 45424 0x7, 45425 (instr >> 24) & 45426 0x1); 45427 if (dt.Is(kDataTypeValueInvalid)) { 45428 UnallocatedA32(instr); 45429 return; 45430 } 45431 if (((instr >> 12) & 1) != 0) { 45432 UnallocatedA32(instr); 45433 return; 45434 } 45435 unsigned rd = 45436 ExtractQRegister(instr, 22, 12); 45437 unsigned rm = 45438 ExtractDRegister(instr, 5, 0); 45439 uint32_t imm6 = (instr >> 16) & 0x3f; 45440 uint32_t imm = imm6 - dt.GetSize(); 45441 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length) 45442 vshll(al, 45443 dt, 45444 QRegister(rd), 45445 DRegister(rm), 45446 imm); 45447 break; 45448 } 45449 case 0x00160000: { 45450 // 0xf2960a10 45451 if (((instr & 0x380000) == 0x0) || 45452 ((instr & 0x3f0000) == 0x80000) || 45453 ((instr & 0x3f0000) == 0x100000) || 45454 ((instr & 0x3f0000) == 0x200000)) { 45455 UnallocatedA32(instr); 45456 return; 45457 } 45458 DataType dt = 45459 Dt_imm6_4_Decode((instr >> 19) & 45460 0x7, 45461 (instr >> 24) & 45462 0x1); 45463 if (dt.Is(kDataTypeValueInvalid)) { 45464 UnallocatedA32(instr); 45465 return; 45466 } 45467 if (((instr >> 12) & 1) != 0) { 45468 UnallocatedA32(instr); 45469 return; 45470 } 45471 unsigned rd = 45472 ExtractQRegister(instr, 22, 12); 45473 unsigned rm = 45474 ExtractDRegister(instr, 5, 0); 45475 uint32_t imm6 = (instr >> 16) & 0x3f; 45476 uint32_t imm = imm6 - dt.GetSize(); 45477 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length) 45478 vshll(al, 45479 dt, 45480 QRegister(rd), 45481 DRegister(rm), 45482 imm); 45483 break; 45484 } 45485 case 0x00170000: { 45486 // 0xf2970a10 45487 if (((instr & 0x380000) == 0x0) || 45488 ((instr & 0x3f0000) == 0x80000) || 45489 ((instr & 0x3f0000) == 0x100000) || 45490 ((instr & 0x3f0000) == 0x200000)) { 45491 UnallocatedA32(instr); 45492 return; 45493 } 45494 DataType dt = 45495 Dt_imm6_4_Decode((instr >> 19) & 45496 0x7, 45497 (instr >> 24) & 45498 0x1); 45499 if (dt.Is(kDataTypeValueInvalid)) { 45500 UnallocatedA32(instr); 45501 return; 45502 } 45503 if (((instr >> 12) & 1) != 0) { 45504 UnallocatedA32(instr); 45505 return; 45506 } 45507 unsigned rd = 45508 ExtractQRegister(instr, 22, 12); 45509 unsigned rm = 45510 ExtractDRegister(instr, 5, 0); 45511 uint32_t imm6 = (instr >> 16) & 0x3f; 45512 uint32_t imm = imm6 - dt.GetSize(); 45513 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length) 45514 vshll(al, 45515 dt, 45516 QRegister(rd), 45517 DRegister(rm), 45518 imm); 45519 break; 45520 } 45521 case 0x00180000: { 45522 // 0xf2980a10 45523 if (((instr & 0x380000) == 0x0) || 45524 ((instr & 0x3f0000) == 0x80000) || 45525 ((instr & 0x3f0000) == 0x100000) || 45526 ((instr & 0x3f0000) == 0x200000)) { 45527 UnallocatedA32(instr); 45528 return; 45529 } 45530 DataType dt = 45531 Dt_imm6_4_Decode((instr >> 19) & 45532 0x7, 45533 (instr >> 24) & 45534 0x1); 45535 if (dt.Is(kDataTypeValueInvalid)) { 45536 UnallocatedA32(instr); 45537 return; 45538 } 45539 if (((instr >> 12) & 1) != 0) { 45540 UnallocatedA32(instr); 45541 return; 45542 } 45543 unsigned rd = 45544 ExtractQRegister(instr, 22, 12); 45545 unsigned rm = 45546 ExtractDRegister(instr, 5, 0); 45547 uint32_t imm6 = (instr >> 16) & 0x3f; 45548 uint32_t imm = imm6 - dt.GetSize(); 45549 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length) 45550 vshll(al, 45551 dt, 45552 QRegister(rd), 45553 DRegister(rm), 45554 imm); 45555 break; 45556 } 45557 case 0x00190000: { 45558 // 0xf2990a10 45559 if (((instr & 0x380000) == 0x0) || 45560 ((instr & 0x3f0000) == 0x80000) || 45561 ((instr & 0x3f0000) == 0x100000) || 45562 ((instr & 0x3f0000) == 0x200000)) { 45563 UnallocatedA32(instr); 45564 return; 45565 } 45566 DataType dt = 45567 Dt_imm6_4_Decode((instr >> 19) & 45568 0x7, 45569 (instr >> 24) & 45570 0x1); 45571 if (dt.Is(kDataTypeValueInvalid)) { 45572 UnallocatedA32(instr); 45573 return; 45574 } 45575 if (((instr >> 12) & 1) != 0) { 45576 UnallocatedA32(instr); 45577 return; 45578 } 45579 unsigned rd = 45580 ExtractQRegister(instr, 22, 12); 45581 unsigned rm = 45582 ExtractDRegister(instr, 5, 0); 45583 uint32_t imm6 = (instr >> 16) & 0x3f; 45584 uint32_t imm = imm6 - dt.GetSize(); 45585 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length) 45586 vshll(al, 45587 dt, 45588 QRegister(rd), 45589 DRegister(rm), 45590 imm); 45591 break; 45592 } 45593 case 0x001a0000: { 45594 // 0xf29a0a10 45595 if (((instr & 0x380000) == 0x0) || 45596 ((instr & 0x3f0000) == 0x80000) || 45597 ((instr & 0x3f0000) == 0x100000) || 45598 ((instr & 0x3f0000) == 0x200000)) { 45599 UnallocatedA32(instr); 45600 return; 45601 } 45602 DataType dt = 45603 Dt_imm6_4_Decode((instr >> 19) & 45604 0x7, 45605 (instr >> 24) & 45606 0x1); 45607 if (dt.Is(kDataTypeValueInvalid)) { 45608 UnallocatedA32(instr); 45609 return; 45610 } 45611 if (((instr >> 12) & 1) != 0) { 45612 UnallocatedA32(instr); 45613 return; 45614 } 45615 unsigned rd = 45616 ExtractQRegister(instr, 22, 12); 45617 unsigned rm = 45618 ExtractDRegister(instr, 5, 0); 45619 uint32_t imm6 = (instr >> 16) & 0x3f; 45620 uint32_t imm = imm6 - dt.GetSize(); 45621 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length) 45622 vshll(al, 45623 dt, 45624 QRegister(rd), 45625 DRegister(rm), 45626 imm); 45627 break; 45628 } 45629 case 0x001b0000: { 45630 // 0xf29b0a10 45631 if (((instr & 0x380000) == 0x0) || 45632 ((instr & 0x3f0000) == 0x80000) || 45633 ((instr & 0x3f0000) == 0x100000) || 45634 ((instr & 0x3f0000) == 0x200000)) { 45635 UnallocatedA32(instr); 45636 return; 45637 } 45638 DataType dt = 45639 Dt_imm6_4_Decode((instr >> 19) & 45640 0x7, 45641 (instr >> 24) & 45642 0x1); 45643 if (dt.Is(kDataTypeValueInvalid)) { 45644 UnallocatedA32(instr); 45645 return; 45646 } 45647 if (((instr >> 12) & 1) != 0) { 45648 UnallocatedA32(instr); 45649 return; 45650 } 45651 unsigned rd = 45652 ExtractQRegister(instr, 22, 12); 45653 unsigned rm = 45654 ExtractDRegister(instr, 5, 0); 45655 uint32_t imm6 = (instr >> 16) & 0x3f; 45656 uint32_t imm = imm6 - dt.GetSize(); 45657 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length) 45658 vshll(al, 45659 dt, 45660 QRegister(rd), 45661 DRegister(rm), 45662 imm); 45663 break; 45664 } 45665 case 0x001c0000: { 45666 // 0xf29c0a10 45667 if (((instr & 0x380000) == 0x0) || 45668 ((instr & 0x3f0000) == 0x80000) || 45669 ((instr & 0x3f0000) == 0x100000) || 45670 ((instr & 0x3f0000) == 0x200000)) { 45671 UnallocatedA32(instr); 45672 return; 45673 } 45674 DataType dt = 45675 Dt_imm6_4_Decode((instr >> 19) & 45676 0x7, 45677 (instr >> 24) & 45678 0x1); 45679 if (dt.Is(kDataTypeValueInvalid)) { 45680 UnallocatedA32(instr); 45681 return; 45682 } 45683 if (((instr >> 12) & 1) != 0) { 45684 UnallocatedA32(instr); 45685 return; 45686 } 45687 unsigned rd = 45688 ExtractQRegister(instr, 22, 12); 45689 unsigned rm = 45690 ExtractDRegister(instr, 5, 0); 45691 uint32_t imm6 = (instr >> 16) & 0x3f; 45692 uint32_t imm = imm6 - dt.GetSize(); 45693 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length) 45694 vshll(al, 45695 dt, 45696 QRegister(rd), 45697 DRegister(rm), 45698 imm); 45699 break; 45700 } 45701 case 0x001d0000: { 45702 // 0xf29d0a10 45703 if (((instr & 0x380000) == 0x0) || 45704 ((instr & 0x3f0000) == 0x80000) || 45705 ((instr & 0x3f0000) == 0x100000) || 45706 ((instr & 0x3f0000) == 0x200000)) { 45707 UnallocatedA32(instr); 45708 return; 45709 } 45710 DataType dt = 45711 Dt_imm6_4_Decode((instr >> 19) & 45712 0x7, 45713 (instr >> 24) & 45714 0x1); 45715 if (dt.Is(kDataTypeValueInvalid)) { 45716 UnallocatedA32(instr); 45717 return; 45718 } 45719 if (((instr >> 12) & 1) != 0) { 45720 UnallocatedA32(instr); 45721 return; 45722 } 45723 unsigned rd = 45724 ExtractQRegister(instr, 22, 12); 45725 unsigned rm = 45726 ExtractDRegister(instr, 5, 0); 45727 uint32_t imm6 = (instr >> 16) & 0x3f; 45728 uint32_t imm = imm6 - dt.GetSize(); 45729 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length) 45730 vshll(al, 45731 dt, 45732 QRegister(rd), 45733 DRegister(rm), 45734 imm); 45735 break; 45736 } 45737 case 0x001e0000: { 45738 // 0xf29e0a10 45739 if (((instr & 0x380000) == 0x0) || 45740 ((instr & 0x3f0000) == 0x80000) || 45741 ((instr & 0x3f0000) == 0x100000) || 45742 ((instr & 0x3f0000) == 0x200000)) { 45743 UnallocatedA32(instr); 45744 return; 45745 } 45746 DataType dt = 45747 Dt_imm6_4_Decode((instr >> 19) & 45748 0x7, 45749 (instr >> 24) & 45750 0x1); 45751 if (dt.Is(kDataTypeValueInvalid)) { 45752 UnallocatedA32(instr); 45753 return; 45754 } 45755 if (((instr >> 12) & 1) != 0) { 45756 UnallocatedA32(instr); 45757 return; 45758 } 45759 unsigned rd = 45760 ExtractQRegister(instr, 22, 12); 45761 unsigned rm = 45762 ExtractDRegister(instr, 5, 0); 45763 uint32_t imm6 = (instr >> 16) & 0x3f; 45764 uint32_t imm = imm6 - dt.GetSize(); 45765 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length) 45766 vshll(al, 45767 dt, 45768 QRegister(rd), 45769 DRegister(rm), 45770 imm); 45771 break; 45772 } 45773 case 0x001f0000: { 45774 // 0xf29f0a10 45775 if (((instr & 0x380000) == 0x0) || 45776 ((instr & 0x3f0000) == 0x80000) || 45777 ((instr & 0x3f0000) == 0x100000) || 45778 ((instr & 0x3f0000) == 0x200000)) { 45779 UnallocatedA32(instr); 45780 return; 45781 } 45782 DataType dt = 45783 Dt_imm6_4_Decode((instr >> 19) & 45784 0x7, 45785 (instr >> 24) & 45786 0x1); 45787 if (dt.Is(kDataTypeValueInvalid)) { 45788 UnallocatedA32(instr); 45789 return; 45790 } 45791 if (((instr >> 12) & 1) != 0) { 45792 UnallocatedA32(instr); 45793 return; 45794 } 45795 unsigned rd = 45796 ExtractQRegister(instr, 22, 12); 45797 unsigned rm = 45798 ExtractDRegister(instr, 5, 0); 45799 uint32_t imm6 = (instr >> 16) & 0x3f; 45800 uint32_t imm = imm6 - dt.GetSize(); 45801 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length) 45802 vshll(al, 45803 dt, 45804 QRegister(rd), 45805 DRegister(rm), 45806 imm); 45807 break; 45808 } 45809 case 0x00200000: { 45810 // 0xf2a00a10 45811 if (((instr & 0x380000) == 0x0) || 45812 ((instr & 0x380000) == 0x180000) || 45813 ((instr & 0x380000) == 0x280000) || 45814 ((instr & 0x380000) == 0x300000) || 45815 ((instr & 0x380000) == 0x380000)) { 45816 UnallocatedA32(instr); 45817 return; 45818 } 45819 DataType dt = Dt_U_imm3H_1_Decode( 45820 ((instr >> 19) & 0x7) | 45821 ((instr >> 21) & 0x8)); 45822 if (dt.Is(kDataTypeValueInvalid)) { 45823 UnallocatedA32(instr); 45824 return; 45825 } 45826 if (((instr >> 12) & 1) != 0) { 45827 UnallocatedA32(instr); 45828 return; 45829 } 45830 unsigned rd = 45831 ExtractQRegister(instr, 22, 12); 45832 unsigned rm = 45833 ExtractDRegister(instr, 5, 0); 45834 // VMOVL{<c>}{<q>}.<dt> <Qd>, <Dm> ; A1 45835 vmovl(al, 45836 dt, 45837 QRegister(rd), 45838 DRegister(rm)); 45839 break; 45840 } 45841 case 0x00210000: { 45842 // 0xf2a10a10 45843 if (((instr & 0x380000) == 0x0) || 45844 ((instr & 0x3f0000) == 0x80000) || 45845 ((instr & 0x3f0000) == 0x100000) || 45846 ((instr & 0x3f0000) == 0x200000)) { 45847 UnallocatedA32(instr); 45848 return; 45849 } 45850 DataType dt = 45851 Dt_imm6_4_Decode((instr >> 19) & 45852 0x7, 45853 (instr >> 24) & 45854 0x1); 45855 if (dt.Is(kDataTypeValueInvalid)) { 45856 UnallocatedA32(instr); 45857 return; 45858 } 45859 if (((instr >> 12) & 1) != 0) { 45860 UnallocatedA32(instr); 45861 return; 45862 } 45863 unsigned rd = 45864 ExtractQRegister(instr, 22, 12); 45865 unsigned rm = 45866 ExtractDRegister(instr, 5, 0); 45867 uint32_t imm6 = (instr >> 16) & 0x3f; 45868 uint32_t imm = imm6 - dt.GetSize(); 45869 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length) 45870 vshll(al, 45871 dt, 45872 QRegister(rd), 45873 DRegister(rm), 45874 imm); 45875 break; 45876 } 45877 case 0x00220000: { 45878 // 0xf2a20a10 45879 if (((instr & 0x380000) == 0x0) || 45880 ((instr & 0x3f0000) == 0x80000) || 45881 ((instr & 0x3f0000) == 0x100000) || 45882 ((instr & 0x3f0000) == 0x200000)) { 45883 UnallocatedA32(instr); 45884 return; 45885 } 45886 DataType dt = 45887 Dt_imm6_4_Decode((instr >> 19) & 45888 0x7, 45889 (instr >> 24) & 45890 0x1); 45891 if (dt.Is(kDataTypeValueInvalid)) { 45892 UnallocatedA32(instr); 45893 return; 45894 } 45895 if (((instr >> 12) & 1) != 0) { 45896 UnallocatedA32(instr); 45897 return; 45898 } 45899 unsigned rd = 45900 ExtractQRegister(instr, 22, 12); 45901 unsigned rm = 45902 ExtractDRegister(instr, 5, 0); 45903 uint32_t imm6 = (instr >> 16) & 0x3f; 45904 uint32_t imm = imm6 - dt.GetSize(); 45905 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length) 45906 vshll(al, 45907 dt, 45908 QRegister(rd), 45909 DRegister(rm), 45910 imm); 45911 break; 45912 } 45913 case 0x00230000: { 45914 // 0xf2a30a10 45915 if (((instr & 0x380000) == 0x0) || 45916 ((instr & 0x3f0000) == 0x80000) || 45917 ((instr & 0x3f0000) == 0x100000) || 45918 ((instr & 0x3f0000) == 0x200000)) { 45919 UnallocatedA32(instr); 45920 return; 45921 } 45922 DataType dt = 45923 Dt_imm6_4_Decode((instr >> 19) & 45924 0x7, 45925 (instr >> 24) & 45926 0x1); 45927 if (dt.Is(kDataTypeValueInvalid)) { 45928 UnallocatedA32(instr); 45929 return; 45930 } 45931 if (((instr >> 12) & 1) != 0) { 45932 UnallocatedA32(instr); 45933 return; 45934 } 45935 unsigned rd = 45936 ExtractQRegister(instr, 22, 12); 45937 unsigned rm = 45938 ExtractDRegister(instr, 5, 0); 45939 uint32_t imm6 = (instr >> 16) & 0x3f; 45940 uint32_t imm = imm6 - dt.GetSize(); 45941 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length) 45942 vshll(al, 45943 dt, 45944 QRegister(rd), 45945 DRegister(rm), 45946 imm); 45947 break; 45948 } 45949 case 0x00240000: { 45950 // 0xf2a40a10 45951 if (((instr & 0x380000) == 0x0) || 45952 ((instr & 0x3f0000) == 0x80000) || 45953 ((instr & 0x3f0000) == 0x100000) || 45954 ((instr & 0x3f0000) == 0x200000)) { 45955 UnallocatedA32(instr); 45956 return; 45957 } 45958 DataType dt = 45959 Dt_imm6_4_Decode((instr >> 19) & 45960 0x7, 45961 (instr >> 24) & 45962 0x1); 45963 if (dt.Is(kDataTypeValueInvalid)) { 45964 UnallocatedA32(instr); 45965 return; 45966 } 45967 if (((instr >> 12) & 1) != 0) { 45968 UnallocatedA32(instr); 45969 return; 45970 } 45971 unsigned rd = 45972 ExtractQRegister(instr, 22, 12); 45973 unsigned rm = 45974 ExtractDRegister(instr, 5, 0); 45975 uint32_t imm6 = (instr >> 16) & 0x3f; 45976 uint32_t imm = imm6 - dt.GetSize(); 45977 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length) 45978 vshll(al, 45979 dt, 45980 QRegister(rd), 45981 DRegister(rm), 45982 imm); 45983 break; 45984 } 45985 case 0x00250000: { 45986 // 0xf2a50a10 45987 if (((instr & 0x380000) == 0x0) || 45988 ((instr & 0x3f0000) == 0x80000) || 45989 ((instr & 0x3f0000) == 0x100000) || 45990 ((instr & 0x3f0000) == 0x200000)) { 45991 UnallocatedA32(instr); 45992 return; 45993 } 45994 DataType dt = 45995 Dt_imm6_4_Decode((instr >> 19) & 45996 0x7, 45997 (instr >> 24) & 45998 0x1); 45999 if (dt.Is(kDataTypeValueInvalid)) { 46000 UnallocatedA32(instr); 46001 return; 46002 } 46003 if (((instr >> 12) & 1) != 0) { 46004 UnallocatedA32(instr); 46005 return; 46006 } 46007 unsigned rd = 46008 ExtractQRegister(instr, 22, 12); 46009 unsigned rm = 46010 ExtractDRegister(instr, 5, 0); 46011 uint32_t imm6 = (instr >> 16) & 0x3f; 46012 uint32_t imm = imm6 - dt.GetSize(); 46013 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length) 46014 vshll(al, 46015 dt, 46016 QRegister(rd), 46017 DRegister(rm), 46018 imm); 46019 break; 46020 } 46021 case 0x00260000: { 46022 // 0xf2a60a10 46023 if (((instr & 0x380000) == 0x0) || 46024 ((instr & 0x3f0000) == 0x80000) || 46025 ((instr & 0x3f0000) == 0x100000) || 46026 ((instr & 0x3f0000) == 0x200000)) { 46027 UnallocatedA32(instr); 46028 return; 46029 } 46030 DataType dt = 46031 Dt_imm6_4_Decode((instr >> 19) & 46032 0x7, 46033 (instr >> 24) & 46034 0x1); 46035 if (dt.Is(kDataTypeValueInvalid)) { 46036 UnallocatedA32(instr); 46037 return; 46038 } 46039 if (((instr >> 12) & 1) != 0) { 46040 UnallocatedA32(instr); 46041 return; 46042 } 46043 unsigned rd = 46044 ExtractQRegister(instr, 22, 12); 46045 unsigned rm = 46046 ExtractDRegister(instr, 5, 0); 46047 uint32_t imm6 = (instr >> 16) & 0x3f; 46048 uint32_t imm = imm6 - dt.GetSize(); 46049 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length) 46050 vshll(al, 46051 dt, 46052 QRegister(rd), 46053 DRegister(rm), 46054 imm); 46055 break; 46056 } 46057 case 0x00270000: { 46058 // 0xf2a70a10 46059 if (((instr & 0x380000) == 0x0) || 46060 ((instr & 0x3f0000) == 0x80000) || 46061 ((instr & 0x3f0000) == 0x100000) || 46062 ((instr & 0x3f0000) == 0x200000)) { 46063 UnallocatedA32(instr); 46064 return; 46065 } 46066 DataType dt = 46067 Dt_imm6_4_Decode((instr >> 19) & 46068 0x7, 46069 (instr >> 24) & 46070 0x1); 46071 if (dt.Is(kDataTypeValueInvalid)) { 46072 UnallocatedA32(instr); 46073 return; 46074 } 46075 if (((instr >> 12) & 1) != 0) { 46076 UnallocatedA32(instr); 46077 return; 46078 } 46079 unsigned rd = 46080 ExtractQRegister(instr, 22, 12); 46081 unsigned rm = 46082 ExtractDRegister(instr, 5, 0); 46083 uint32_t imm6 = (instr >> 16) & 0x3f; 46084 uint32_t imm = imm6 - dt.GetSize(); 46085 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length) 46086 vshll(al, 46087 dt, 46088 QRegister(rd), 46089 DRegister(rm), 46090 imm); 46091 break; 46092 } 46093 case 0x00280000: { 46094 // 0xf2a80a10 46095 if (((instr & 0x380000) == 0x0) || 46096 ((instr & 0x3f0000) == 0x80000) || 46097 ((instr & 0x3f0000) == 0x100000) || 46098 ((instr & 0x3f0000) == 0x200000)) { 46099 UnallocatedA32(instr); 46100 return; 46101 } 46102 DataType dt = 46103 Dt_imm6_4_Decode((instr >> 19) & 46104 0x7, 46105 (instr >> 24) & 46106 0x1); 46107 if (dt.Is(kDataTypeValueInvalid)) { 46108 UnallocatedA32(instr); 46109 return; 46110 } 46111 if (((instr >> 12) & 1) != 0) { 46112 UnallocatedA32(instr); 46113 return; 46114 } 46115 unsigned rd = 46116 ExtractQRegister(instr, 22, 12); 46117 unsigned rm = 46118 ExtractDRegister(instr, 5, 0); 46119 uint32_t imm6 = (instr >> 16) & 0x3f; 46120 uint32_t imm = imm6 - dt.GetSize(); 46121 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length) 46122 vshll(al, 46123 dt, 46124 QRegister(rd), 46125 DRegister(rm), 46126 imm); 46127 break; 46128 } 46129 case 0x00290000: { 46130 // 0xf2a90a10 46131 if (((instr & 0x380000) == 0x0) || 46132 ((instr & 0x3f0000) == 0x80000) || 46133 ((instr & 0x3f0000) == 0x100000) || 46134 ((instr & 0x3f0000) == 0x200000)) { 46135 UnallocatedA32(instr); 46136 return; 46137 } 46138 DataType dt = 46139 Dt_imm6_4_Decode((instr >> 19) & 46140 0x7, 46141 (instr >> 24) & 46142 0x1); 46143 if (dt.Is(kDataTypeValueInvalid)) { 46144 UnallocatedA32(instr); 46145 return; 46146 } 46147 if (((instr >> 12) & 1) != 0) { 46148 UnallocatedA32(instr); 46149 return; 46150 } 46151 unsigned rd = 46152 ExtractQRegister(instr, 22, 12); 46153 unsigned rm = 46154 ExtractDRegister(instr, 5, 0); 46155 uint32_t imm6 = (instr >> 16) & 0x3f; 46156 uint32_t imm = imm6 - dt.GetSize(); 46157 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length) 46158 vshll(al, 46159 dt, 46160 QRegister(rd), 46161 DRegister(rm), 46162 imm); 46163 break; 46164 } 46165 case 0x002a0000: { 46166 // 0xf2aa0a10 46167 if (((instr & 0x380000) == 0x0) || 46168 ((instr & 0x3f0000) == 0x80000) || 46169 ((instr & 0x3f0000) == 0x100000) || 46170 ((instr & 0x3f0000) == 0x200000)) { 46171 UnallocatedA32(instr); 46172 return; 46173 } 46174 DataType dt = 46175 Dt_imm6_4_Decode((instr >> 19) & 46176 0x7, 46177 (instr >> 24) & 46178 0x1); 46179 if (dt.Is(kDataTypeValueInvalid)) { 46180 UnallocatedA32(instr); 46181 return; 46182 } 46183 if (((instr >> 12) & 1) != 0) { 46184 UnallocatedA32(instr); 46185 return; 46186 } 46187 unsigned rd = 46188 ExtractQRegister(instr, 22, 12); 46189 unsigned rm = 46190 ExtractDRegister(instr, 5, 0); 46191 uint32_t imm6 = (instr >> 16) & 0x3f; 46192 uint32_t imm = imm6 - dt.GetSize(); 46193 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length) 46194 vshll(al, 46195 dt, 46196 QRegister(rd), 46197 DRegister(rm), 46198 imm); 46199 break; 46200 } 46201 case 0x002b0000: { 46202 // 0xf2ab0a10 46203 if (((instr & 0x380000) == 0x0) || 46204 ((instr & 0x3f0000) == 0x80000) || 46205 ((instr & 0x3f0000) == 0x100000) || 46206 ((instr & 0x3f0000) == 0x200000)) { 46207 UnallocatedA32(instr); 46208 return; 46209 } 46210 DataType dt = 46211 Dt_imm6_4_Decode((instr >> 19) & 46212 0x7, 46213 (instr >> 24) & 46214 0x1); 46215 if (dt.Is(kDataTypeValueInvalid)) { 46216 UnallocatedA32(instr); 46217 return; 46218 } 46219 if (((instr >> 12) & 1) != 0) { 46220 UnallocatedA32(instr); 46221 return; 46222 } 46223 unsigned rd = 46224 ExtractQRegister(instr, 22, 12); 46225 unsigned rm = 46226 ExtractDRegister(instr, 5, 0); 46227 uint32_t imm6 = (instr >> 16) & 0x3f; 46228 uint32_t imm = imm6 - dt.GetSize(); 46229 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length) 46230 vshll(al, 46231 dt, 46232 QRegister(rd), 46233 DRegister(rm), 46234 imm); 46235 break; 46236 } 46237 case 0x002c0000: { 46238 // 0xf2ac0a10 46239 if (((instr & 0x380000) == 0x0) || 46240 ((instr & 0x3f0000) == 0x80000) || 46241 ((instr & 0x3f0000) == 0x100000) || 46242 ((instr & 0x3f0000) == 0x200000)) { 46243 UnallocatedA32(instr); 46244 return; 46245 } 46246 DataType dt = 46247 Dt_imm6_4_Decode((instr >> 19) & 46248 0x7, 46249 (instr >> 24) & 46250 0x1); 46251 if (dt.Is(kDataTypeValueInvalid)) { 46252 UnallocatedA32(instr); 46253 return; 46254 } 46255 if (((instr >> 12) & 1) != 0) { 46256 UnallocatedA32(instr); 46257 return; 46258 } 46259 unsigned rd = 46260 ExtractQRegister(instr, 22, 12); 46261 unsigned rm = 46262 ExtractDRegister(instr, 5, 0); 46263 uint32_t imm6 = (instr >> 16) & 0x3f; 46264 uint32_t imm = imm6 - dt.GetSize(); 46265 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length) 46266 vshll(al, 46267 dt, 46268 QRegister(rd), 46269 DRegister(rm), 46270 imm); 46271 break; 46272 } 46273 case 0x002d0000: { 46274 // 0xf2ad0a10 46275 if (((instr & 0x380000) == 0x0) || 46276 ((instr & 0x3f0000) == 0x80000) || 46277 ((instr & 0x3f0000) == 0x100000) || 46278 ((instr & 0x3f0000) == 0x200000)) { 46279 UnallocatedA32(instr); 46280 return; 46281 } 46282 DataType dt = 46283 Dt_imm6_4_Decode((instr >> 19) & 46284 0x7, 46285 (instr >> 24) & 46286 0x1); 46287 if (dt.Is(kDataTypeValueInvalid)) { 46288 UnallocatedA32(instr); 46289 return; 46290 } 46291 if (((instr >> 12) & 1) != 0) { 46292 UnallocatedA32(instr); 46293 return; 46294 } 46295 unsigned rd = 46296 ExtractQRegister(instr, 22, 12); 46297 unsigned rm = 46298 ExtractDRegister(instr, 5, 0); 46299 uint32_t imm6 = (instr >> 16) & 0x3f; 46300 uint32_t imm = imm6 - dt.GetSize(); 46301 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length) 46302 vshll(al, 46303 dt, 46304 QRegister(rd), 46305 DRegister(rm), 46306 imm); 46307 break; 46308 } 46309 case 0x002e0000: { 46310 // 0xf2ae0a10 46311 if (((instr & 0x380000) == 0x0) || 46312 ((instr & 0x3f0000) == 0x80000) || 46313 ((instr & 0x3f0000) == 0x100000) || 46314 ((instr & 0x3f0000) == 0x200000)) { 46315 UnallocatedA32(instr); 46316 return; 46317 } 46318 DataType dt = 46319 Dt_imm6_4_Decode((instr >> 19) & 46320 0x7, 46321 (instr >> 24) & 46322 0x1); 46323 if (dt.Is(kDataTypeValueInvalid)) { 46324 UnallocatedA32(instr); 46325 return; 46326 } 46327 if (((instr >> 12) & 1) != 0) { 46328 UnallocatedA32(instr); 46329 return; 46330 } 46331 unsigned rd = 46332 ExtractQRegister(instr, 22, 12); 46333 unsigned rm = 46334 ExtractDRegister(instr, 5, 0); 46335 uint32_t imm6 = (instr >> 16) & 0x3f; 46336 uint32_t imm = imm6 - dt.GetSize(); 46337 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length) 46338 vshll(al, 46339 dt, 46340 QRegister(rd), 46341 DRegister(rm), 46342 imm); 46343 break; 46344 } 46345 case 0x002f0000: { 46346 // 0xf2af0a10 46347 if (((instr & 0x380000) == 0x0) || 46348 ((instr & 0x3f0000) == 0x80000) || 46349 ((instr & 0x3f0000) == 0x100000) || 46350 ((instr & 0x3f0000) == 0x200000)) { 46351 UnallocatedA32(instr); 46352 return; 46353 } 46354 DataType dt = 46355 Dt_imm6_4_Decode((instr >> 19) & 46356 0x7, 46357 (instr >> 24) & 46358 0x1); 46359 if (dt.Is(kDataTypeValueInvalid)) { 46360 UnallocatedA32(instr); 46361 return; 46362 } 46363 if (((instr >> 12) & 1) != 0) { 46364 UnallocatedA32(instr); 46365 return; 46366 } 46367 unsigned rd = 46368 ExtractQRegister(instr, 22, 12); 46369 unsigned rm = 46370 ExtractDRegister(instr, 5, 0); 46371 uint32_t imm6 = (instr >> 16) & 0x3f; 46372 uint32_t imm = imm6 - dt.GetSize(); 46373 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length) 46374 vshll(al, 46375 dt, 46376 QRegister(rd), 46377 DRegister(rm), 46378 imm); 46379 break; 46380 } 46381 case 0x00300000: { 46382 // 0xf2b00a10 46383 if (((instr & 0x380000) == 0x0) || 46384 ((instr & 0x3f0000) == 0x80000) || 46385 ((instr & 0x3f0000) == 0x100000) || 46386 ((instr & 0x3f0000) == 0x200000)) { 46387 UnallocatedA32(instr); 46388 return; 46389 } 46390 DataType dt = 46391 Dt_imm6_4_Decode((instr >> 19) & 46392 0x7, 46393 (instr >> 24) & 46394 0x1); 46395 if (dt.Is(kDataTypeValueInvalid)) { 46396 UnallocatedA32(instr); 46397 return; 46398 } 46399 if (((instr >> 12) & 1) != 0) { 46400 UnallocatedA32(instr); 46401 return; 46402 } 46403 unsigned rd = 46404 ExtractQRegister(instr, 22, 12); 46405 unsigned rm = 46406 ExtractDRegister(instr, 5, 0); 46407 uint32_t imm6 = (instr >> 16) & 0x3f; 46408 uint32_t imm = imm6 - dt.GetSize(); 46409 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length) 46410 vshll(al, 46411 dt, 46412 QRegister(rd), 46413 DRegister(rm), 46414 imm); 46415 break; 46416 } 46417 case 0x00310000: { 46418 // 0xf2b10a10 46419 if (((instr & 0x380000) == 0x0) || 46420 ((instr & 0x3f0000) == 0x80000) || 46421 ((instr & 0x3f0000) == 0x100000) || 46422 ((instr & 0x3f0000) == 0x200000)) { 46423 UnallocatedA32(instr); 46424 return; 46425 } 46426 DataType dt = 46427 Dt_imm6_4_Decode((instr >> 19) & 46428 0x7, 46429 (instr >> 24) & 46430 0x1); 46431 if (dt.Is(kDataTypeValueInvalid)) { 46432 UnallocatedA32(instr); 46433 return; 46434 } 46435 if (((instr >> 12) & 1) != 0) { 46436 UnallocatedA32(instr); 46437 return; 46438 } 46439 unsigned rd = 46440 ExtractQRegister(instr, 22, 12); 46441 unsigned rm = 46442 ExtractDRegister(instr, 5, 0); 46443 uint32_t imm6 = (instr >> 16) & 0x3f; 46444 uint32_t imm = imm6 - dt.GetSize(); 46445 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length) 46446 vshll(al, 46447 dt, 46448 QRegister(rd), 46449 DRegister(rm), 46450 imm); 46451 break; 46452 } 46453 case 0x00320000: { 46454 // 0xf2b20a10 46455 if (((instr & 0x380000) == 0x0) || 46456 ((instr & 0x3f0000) == 0x80000) || 46457 ((instr & 0x3f0000) == 0x100000) || 46458 ((instr & 0x3f0000) == 0x200000)) { 46459 UnallocatedA32(instr); 46460 return; 46461 } 46462 DataType dt = 46463 Dt_imm6_4_Decode((instr >> 19) & 46464 0x7, 46465 (instr >> 24) & 46466 0x1); 46467 if (dt.Is(kDataTypeValueInvalid)) { 46468 UnallocatedA32(instr); 46469 return; 46470 } 46471 if (((instr >> 12) & 1) != 0) { 46472 UnallocatedA32(instr); 46473 return; 46474 } 46475 unsigned rd = 46476 ExtractQRegister(instr, 22, 12); 46477 unsigned rm = 46478 ExtractDRegister(instr, 5, 0); 46479 uint32_t imm6 = (instr >> 16) & 0x3f; 46480 uint32_t imm = imm6 - dt.GetSize(); 46481 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length) 46482 vshll(al, 46483 dt, 46484 QRegister(rd), 46485 DRegister(rm), 46486 imm); 46487 break; 46488 } 46489 case 0x00330000: { 46490 // 0xf2b30a10 46491 if (((instr & 0x380000) == 0x0) || 46492 ((instr & 0x3f0000) == 0x80000) || 46493 ((instr & 0x3f0000) == 0x100000) || 46494 ((instr & 0x3f0000) == 0x200000)) { 46495 UnallocatedA32(instr); 46496 return; 46497 } 46498 DataType dt = 46499 Dt_imm6_4_Decode((instr >> 19) & 46500 0x7, 46501 (instr >> 24) & 46502 0x1); 46503 if (dt.Is(kDataTypeValueInvalid)) { 46504 UnallocatedA32(instr); 46505 return; 46506 } 46507 if (((instr >> 12) & 1) != 0) { 46508 UnallocatedA32(instr); 46509 return; 46510 } 46511 unsigned rd = 46512 ExtractQRegister(instr, 22, 12); 46513 unsigned rm = 46514 ExtractDRegister(instr, 5, 0); 46515 uint32_t imm6 = (instr >> 16) & 0x3f; 46516 uint32_t imm = imm6 - dt.GetSize(); 46517 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length) 46518 vshll(al, 46519 dt, 46520 QRegister(rd), 46521 DRegister(rm), 46522 imm); 46523 break; 46524 } 46525 case 0x00340000: { 46526 // 0xf2b40a10 46527 if (((instr & 0x380000) == 0x0) || 46528 ((instr & 0x3f0000) == 0x80000) || 46529 ((instr & 0x3f0000) == 0x100000) || 46530 ((instr & 0x3f0000) == 0x200000)) { 46531 UnallocatedA32(instr); 46532 return; 46533 } 46534 DataType dt = 46535 Dt_imm6_4_Decode((instr >> 19) & 46536 0x7, 46537 (instr >> 24) & 46538 0x1); 46539 if (dt.Is(kDataTypeValueInvalid)) { 46540 UnallocatedA32(instr); 46541 return; 46542 } 46543 if (((instr >> 12) & 1) != 0) { 46544 UnallocatedA32(instr); 46545 return; 46546 } 46547 unsigned rd = 46548 ExtractQRegister(instr, 22, 12); 46549 unsigned rm = 46550 ExtractDRegister(instr, 5, 0); 46551 uint32_t imm6 = (instr >> 16) & 0x3f; 46552 uint32_t imm = imm6 - dt.GetSize(); 46553 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length) 46554 vshll(al, 46555 dt, 46556 QRegister(rd), 46557 DRegister(rm), 46558 imm); 46559 break; 46560 } 46561 case 0x00350000: { 46562 // 0xf2b50a10 46563 if (((instr & 0x380000) == 0x0) || 46564 ((instr & 0x3f0000) == 0x80000) || 46565 ((instr & 0x3f0000) == 0x100000) || 46566 ((instr & 0x3f0000) == 0x200000)) { 46567 UnallocatedA32(instr); 46568 return; 46569 } 46570 DataType dt = 46571 Dt_imm6_4_Decode((instr >> 19) & 46572 0x7, 46573 (instr >> 24) & 46574 0x1); 46575 if (dt.Is(kDataTypeValueInvalid)) { 46576 UnallocatedA32(instr); 46577 return; 46578 } 46579 if (((instr >> 12) & 1) != 0) { 46580 UnallocatedA32(instr); 46581 return; 46582 } 46583 unsigned rd = 46584 ExtractQRegister(instr, 22, 12); 46585 unsigned rm = 46586 ExtractDRegister(instr, 5, 0); 46587 uint32_t imm6 = (instr >> 16) & 0x3f; 46588 uint32_t imm = imm6 - dt.GetSize(); 46589 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length) 46590 vshll(al, 46591 dt, 46592 QRegister(rd), 46593 DRegister(rm), 46594 imm); 46595 break; 46596 } 46597 case 0x00360000: { 46598 // 0xf2b60a10 46599 if (((instr & 0x380000) == 0x0) || 46600 ((instr & 0x3f0000) == 0x80000) || 46601 ((instr & 0x3f0000) == 0x100000) || 46602 ((instr & 0x3f0000) == 0x200000)) { 46603 UnallocatedA32(instr); 46604 return; 46605 } 46606 DataType dt = 46607 Dt_imm6_4_Decode((instr >> 19) & 46608 0x7, 46609 (instr >> 24) & 46610 0x1); 46611 if (dt.Is(kDataTypeValueInvalid)) { 46612 UnallocatedA32(instr); 46613 return; 46614 } 46615 if (((instr >> 12) & 1) != 0) { 46616 UnallocatedA32(instr); 46617 return; 46618 } 46619 unsigned rd = 46620 ExtractQRegister(instr, 22, 12); 46621 unsigned rm = 46622 ExtractDRegister(instr, 5, 0); 46623 uint32_t imm6 = (instr >> 16) & 0x3f; 46624 uint32_t imm = imm6 - dt.GetSize(); 46625 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length) 46626 vshll(al, 46627 dt, 46628 QRegister(rd), 46629 DRegister(rm), 46630 imm); 46631 break; 46632 } 46633 case 0x00370000: { 46634 // 0xf2b70a10 46635 if (((instr & 0x380000) == 0x0) || 46636 ((instr & 0x3f0000) == 0x80000) || 46637 ((instr & 0x3f0000) == 0x100000) || 46638 ((instr & 0x3f0000) == 0x200000)) { 46639 UnallocatedA32(instr); 46640 return; 46641 } 46642 DataType dt = 46643 Dt_imm6_4_Decode((instr >> 19) & 46644 0x7, 46645 (instr >> 24) & 46646 0x1); 46647 if (dt.Is(kDataTypeValueInvalid)) { 46648 UnallocatedA32(instr); 46649 return; 46650 } 46651 if (((instr >> 12) & 1) != 0) { 46652 UnallocatedA32(instr); 46653 return; 46654 } 46655 unsigned rd = 46656 ExtractQRegister(instr, 22, 12); 46657 unsigned rm = 46658 ExtractDRegister(instr, 5, 0); 46659 uint32_t imm6 = (instr >> 16) & 0x3f; 46660 uint32_t imm = imm6 - dt.GetSize(); 46661 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length) 46662 vshll(al, 46663 dt, 46664 QRegister(rd), 46665 DRegister(rm), 46666 imm); 46667 break; 46668 } 46669 case 0x00380000: { 46670 // 0xf2b80a10 46671 if (((instr & 0x380000) == 0x0) || 46672 ((instr & 0x3f0000) == 0x80000) || 46673 ((instr & 0x3f0000) == 0x100000) || 46674 ((instr & 0x3f0000) == 0x200000)) { 46675 UnallocatedA32(instr); 46676 return; 46677 } 46678 DataType dt = 46679 Dt_imm6_4_Decode((instr >> 19) & 46680 0x7, 46681 (instr >> 24) & 46682 0x1); 46683 if (dt.Is(kDataTypeValueInvalid)) { 46684 UnallocatedA32(instr); 46685 return; 46686 } 46687 if (((instr >> 12) & 1) != 0) { 46688 UnallocatedA32(instr); 46689 return; 46690 } 46691 unsigned rd = 46692 ExtractQRegister(instr, 22, 12); 46693 unsigned rm = 46694 ExtractDRegister(instr, 5, 0); 46695 uint32_t imm6 = (instr >> 16) & 0x3f; 46696 uint32_t imm = imm6 - dt.GetSize(); 46697 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length) 46698 vshll(al, 46699 dt, 46700 QRegister(rd), 46701 DRegister(rm), 46702 imm); 46703 break; 46704 } 46705 case 0x00390000: { 46706 // 0xf2b90a10 46707 if (((instr & 0x380000) == 0x0) || 46708 ((instr & 0x3f0000) == 0x80000) || 46709 ((instr & 0x3f0000) == 0x100000) || 46710 ((instr & 0x3f0000) == 0x200000)) { 46711 UnallocatedA32(instr); 46712 return; 46713 } 46714 DataType dt = 46715 Dt_imm6_4_Decode((instr >> 19) & 46716 0x7, 46717 (instr >> 24) & 46718 0x1); 46719 if (dt.Is(kDataTypeValueInvalid)) { 46720 UnallocatedA32(instr); 46721 return; 46722 } 46723 if (((instr >> 12) & 1) != 0) { 46724 UnallocatedA32(instr); 46725 return; 46726 } 46727 unsigned rd = 46728 ExtractQRegister(instr, 22, 12); 46729 unsigned rm = 46730 ExtractDRegister(instr, 5, 0); 46731 uint32_t imm6 = (instr >> 16) & 0x3f; 46732 uint32_t imm = imm6 - dt.GetSize(); 46733 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length) 46734 vshll(al, 46735 dt, 46736 QRegister(rd), 46737 DRegister(rm), 46738 imm); 46739 break; 46740 } 46741 case 0x003a0000: { 46742 // 0xf2ba0a10 46743 if (((instr & 0x380000) == 0x0) || 46744 ((instr & 0x3f0000) == 0x80000) || 46745 ((instr & 0x3f0000) == 0x100000) || 46746 ((instr & 0x3f0000) == 0x200000)) { 46747 UnallocatedA32(instr); 46748 return; 46749 } 46750 DataType dt = 46751 Dt_imm6_4_Decode((instr >> 19) & 46752 0x7, 46753 (instr >> 24) & 46754 0x1); 46755 if (dt.Is(kDataTypeValueInvalid)) { 46756 UnallocatedA32(instr); 46757 return; 46758 } 46759 if (((instr >> 12) & 1) != 0) { 46760 UnallocatedA32(instr); 46761 return; 46762 } 46763 unsigned rd = 46764 ExtractQRegister(instr, 22, 12); 46765 unsigned rm = 46766 ExtractDRegister(instr, 5, 0); 46767 uint32_t imm6 = (instr >> 16) & 0x3f; 46768 uint32_t imm = imm6 - dt.GetSize(); 46769 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length) 46770 vshll(al, 46771 dt, 46772 QRegister(rd), 46773 DRegister(rm), 46774 imm); 46775 break; 46776 } 46777 case 0x003b0000: { 46778 // 0xf2bb0a10 46779 if (((instr & 0x380000) == 0x0) || 46780 ((instr & 0x3f0000) == 0x80000) || 46781 ((instr & 0x3f0000) == 0x100000) || 46782 ((instr & 0x3f0000) == 0x200000)) { 46783 UnallocatedA32(instr); 46784 return; 46785 } 46786 DataType dt = 46787 Dt_imm6_4_Decode((instr >> 19) & 46788 0x7, 46789 (instr >> 24) & 46790 0x1); 46791 if (dt.Is(kDataTypeValueInvalid)) { 46792 UnallocatedA32(instr); 46793 return; 46794 } 46795 if (((instr >> 12) & 1) != 0) { 46796 UnallocatedA32(instr); 46797 return; 46798 } 46799 unsigned rd = 46800 ExtractQRegister(instr, 22, 12); 46801 unsigned rm = 46802 ExtractDRegister(instr, 5, 0); 46803 uint32_t imm6 = (instr >> 16) & 0x3f; 46804 uint32_t imm = imm6 - dt.GetSize(); 46805 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length) 46806 vshll(al, 46807 dt, 46808 QRegister(rd), 46809 DRegister(rm), 46810 imm); 46811 break; 46812 } 46813 case 0x003c0000: { 46814 // 0xf2bc0a10 46815 if (((instr & 0x380000) == 0x0) || 46816 ((instr & 0x3f0000) == 0x80000) || 46817 ((instr & 0x3f0000) == 0x100000) || 46818 ((instr & 0x3f0000) == 0x200000)) { 46819 UnallocatedA32(instr); 46820 return; 46821 } 46822 DataType dt = 46823 Dt_imm6_4_Decode((instr >> 19) & 46824 0x7, 46825 (instr >> 24) & 46826 0x1); 46827 if (dt.Is(kDataTypeValueInvalid)) { 46828 UnallocatedA32(instr); 46829 return; 46830 } 46831 if (((instr >> 12) & 1) != 0) { 46832 UnallocatedA32(instr); 46833 return; 46834 } 46835 unsigned rd = 46836 ExtractQRegister(instr, 22, 12); 46837 unsigned rm = 46838 ExtractDRegister(instr, 5, 0); 46839 uint32_t imm6 = (instr >> 16) & 0x3f; 46840 uint32_t imm = imm6 - dt.GetSize(); 46841 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length) 46842 vshll(al, 46843 dt, 46844 QRegister(rd), 46845 DRegister(rm), 46846 imm); 46847 break; 46848 } 46849 case 0x003d0000: { 46850 // 0xf2bd0a10 46851 if (((instr & 0x380000) == 0x0) || 46852 ((instr & 0x3f0000) == 0x80000) || 46853 ((instr & 0x3f0000) == 0x100000) || 46854 ((instr & 0x3f0000) == 0x200000)) { 46855 UnallocatedA32(instr); 46856 return; 46857 } 46858 DataType dt = 46859 Dt_imm6_4_Decode((instr >> 19) & 46860 0x7, 46861 (instr >> 24) & 46862 0x1); 46863 if (dt.Is(kDataTypeValueInvalid)) { 46864 UnallocatedA32(instr); 46865 return; 46866 } 46867 if (((instr >> 12) & 1) != 0) { 46868 UnallocatedA32(instr); 46869 return; 46870 } 46871 unsigned rd = 46872 ExtractQRegister(instr, 22, 12); 46873 unsigned rm = 46874 ExtractDRegister(instr, 5, 0); 46875 uint32_t imm6 = (instr >> 16) & 0x3f; 46876 uint32_t imm = imm6 - dt.GetSize(); 46877 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length) 46878 vshll(al, 46879 dt, 46880 QRegister(rd), 46881 DRegister(rm), 46882 imm); 46883 break; 46884 } 46885 case 0x003e0000: { 46886 // 0xf2be0a10 46887 if (((instr & 0x380000) == 0x0) || 46888 ((instr & 0x3f0000) == 0x80000) || 46889 ((instr & 0x3f0000) == 0x100000) || 46890 ((instr & 0x3f0000) == 0x200000)) { 46891 UnallocatedA32(instr); 46892 return; 46893 } 46894 DataType dt = 46895 Dt_imm6_4_Decode((instr >> 19) & 46896 0x7, 46897 (instr >> 24) & 46898 0x1); 46899 if (dt.Is(kDataTypeValueInvalid)) { 46900 UnallocatedA32(instr); 46901 return; 46902 } 46903 if (((instr >> 12) & 1) != 0) { 46904 UnallocatedA32(instr); 46905 return; 46906 } 46907 unsigned rd = 46908 ExtractQRegister(instr, 22, 12); 46909 unsigned rm = 46910 ExtractDRegister(instr, 5, 0); 46911 uint32_t imm6 = (instr >> 16) & 0x3f; 46912 uint32_t imm = imm6 - dt.GetSize(); 46913 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length) 46914 vshll(al, 46915 dt, 46916 QRegister(rd), 46917 DRegister(rm), 46918 imm); 46919 break; 46920 } 46921 case 0x003f0000: { 46922 // 0xf2bf0a10 46923 if (((instr & 0x380000) == 0x0) || 46924 ((instr & 0x3f0000) == 0x80000) || 46925 ((instr & 0x3f0000) == 0x100000) || 46926 ((instr & 0x3f0000) == 0x200000)) { 46927 UnallocatedA32(instr); 46928 return; 46929 } 46930 DataType dt = 46931 Dt_imm6_4_Decode((instr >> 19) & 46932 0x7, 46933 (instr >> 24) & 46934 0x1); 46935 if (dt.Is(kDataTypeValueInvalid)) { 46936 UnallocatedA32(instr); 46937 return; 46938 } 46939 if (((instr >> 12) & 1) != 0) { 46940 UnallocatedA32(instr); 46941 return; 46942 } 46943 unsigned rd = 46944 ExtractQRegister(instr, 22, 12); 46945 unsigned rm = 46946 ExtractDRegister(instr, 5, 0); 46947 uint32_t imm6 = (instr >> 16) & 0x3f; 46948 uint32_t imm = imm6 - dt.GetSize(); 46949 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length) 46950 vshll(al, 46951 dt, 46952 QRegister(rd), 46953 DRegister(rm), 46954 imm); 46955 break; 46956 } 46957 default: 46958 UnallocatedA32(instr); 46959 break; 46960 } 46961 break; 46962 } 46963 default: { 46964 if (((instr & 0x380000) == 0x0) || 46965 ((instr & 0x3f0000) == 0x80000) || 46966 ((instr & 0x3f0000) == 0x100000) || 46967 ((instr & 0x3f0000) == 0x200000)) { 46968 UnallocatedA32(instr); 46969 return; 46970 } 46971 DataType dt = 46972 Dt_imm6_4_Decode((instr >> 19) & 0x7, 46973 (instr >> 24) & 0x1); 46974 if (dt.Is(kDataTypeValueInvalid)) { 46975 UnallocatedA32(instr); 46976 return; 46977 } 46978 if (((instr >> 12) & 1) != 0) { 46979 UnallocatedA32(instr); 46980 return; 46981 } 46982 unsigned rd = 46983 ExtractQRegister(instr, 22, 12); 46984 unsigned rm = ExtractDRegister(instr, 5, 0); 46985 uint32_t imm6 = (instr >> 16) & 0x3f; 46986 uint32_t imm = imm6 - dt.GetSize(); 46987 // VSHLL{<c>}{<q>}.<type><size> <Qd>, <Dm>, #<imm> ; A1 NOLINT(whitespace/line_length) 46988 vshll(al, 46989 dt, 46990 QRegister(rd), 46991 DRegister(rm), 46992 imm); 46993 break; 46994 } 46995 } 46996 break; 46997 } 46998 default: 46999 UnallocatedA32(instr); 47000 break; 47001 } 47002 break; 47003 } 47004 } 47005 break; 47006 } 47007 default: 47008 UnallocatedA32(instr); 47009 break; 47010 } 47011 break; 47012 } 47013 case 0x00000c00: { 47014 // 0xf2800c10 47015 switch (instr & 0x00000080) { 47016 case 0x00000000: { 47017 // 0xf2800c10 47018 switch (instr & 0x00200000) { 47019 case 0x00000000: { 47020 // 0xf2800c10 47021 switch (instr & 0x00180000) { 47022 case 0x00000000: { 47023 // 0xf2800c10 47024 switch (instr & 0x00000300) { 47025 case 0x00000200: { 47026 // 0xf2800e10 47027 if (((instr & 0x920) == 0x100) || 47028 ((instr & 0x520) == 0x100) || 47029 ((instr & 0x820) == 0x20) || 47030 ((instr & 0x420) == 0x20) || 47031 ((instr & 0x220) == 0x20) || 47032 ((instr & 0x120) == 0x120)) { 47033 UnallocatedA32(instr); 47034 return; 47035 } 47036 unsigned cmode = ((instr >> 8) & 0xf) | 47037 ((instr >> 1) & 0x10); 47038 DataType dt = 47039 ImmediateVmov::DecodeDt(cmode); 47040 if (dt.Is(kDataTypeValueInvalid)) { 47041 UnallocatedA32(instr); 47042 return; 47043 } 47044 unsigned rd = 47045 ExtractDRegister(instr, 22, 12); 47046 DOperand imm = 47047 ImmediateVmov::DecodeImmediate( 47048 cmode, 47049 (instr & 0xf) | 47050 ((instr >> 12) & 0x70) | 47051 ((instr >> 17) & 0x80)); 47052 // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 47053 vmov(al, dt, DRegister(rd), imm); 47054 break; 47055 } 47056 case 0x00000300: { 47057 // 0xf2800f10 47058 if (((instr & 0x920) == 0x100) || 47059 ((instr & 0x520) == 0x100) || 47060 ((instr & 0x820) == 0x20) || 47061 ((instr & 0x420) == 0x20) || 47062 ((instr & 0x220) == 0x20) || 47063 ((instr & 0x120) == 0x120)) { 47064 UnallocatedA32(instr); 47065 return; 47066 } 47067 unsigned cmode = ((instr >> 8) & 0xf) | 47068 ((instr >> 1) & 0x10); 47069 DataType dt = 47070 ImmediateVmov::DecodeDt(cmode); 47071 if (dt.Is(kDataTypeValueInvalid)) { 47072 UnallocatedA32(instr); 47073 return; 47074 } 47075 unsigned rd = 47076 ExtractDRegister(instr, 22, 12); 47077 DOperand imm = 47078 ImmediateVmov::DecodeImmediate( 47079 cmode, 47080 (instr & 0xf) | 47081 ((instr >> 12) & 0x70) | 47082 ((instr >> 17) & 0x80)); 47083 // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 47084 vmov(al, dt, DRegister(rd), imm); 47085 break; 47086 } 47087 default: { 47088 switch (instr & 0x00000020) { 47089 case 0x00000020: { 47090 // 0xf2800c30 47091 switch (instr & 0x00000f20) { 47092 case 0x00000000: { 47093 // 0xf2800c10 47094 if (((instr & 0x920) == 0x100) || 47095 ((instr & 0x520) == 0x100) || 47096 ((instr & 0x820) == 0x20) || 47097 ((instr & 0x420) == 0x20) || 47098 ((instr & 0x220) == 0x20) || 47099 ((instr & 0x120) == 0x120)) { 47100 UnallocatedA32(instr); 47101 return; 47102 } 47103 unsigned cmode = 47104 ((instr >> 8) & 0xf) | 47105 ((instr >> 1) & 0x10); 47106 DataType dt = 47107 ImmediateVmov::DecodeDt(cmode); 47108 if (dt.Is(kDataTypeValueInvalid)) { 47109 UnallocatedA32(instr); 47110 return; 47111 } 47112 unsigned rd = 47113 ExtractDRegister(instr, 22, 12); 47114 DOperand imm = 47115 ImmediateVmov::DecodeImmediate( 47116 cmode, 47117 (instr & 0xf) | 47118 ((instr >> 12) & 0x70) | 47119 ((instr >> 17) & 0x80)); 47120 // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length) 47121 vmov(al, dt, DRegister(rd), imm); 47122 break; 47123 } 47124 case 0x00000020: { 47125 // 0xf2800c30 47126 if (((instr & 0xd00) == 0x100) || 47127 ((instr & 0xd00) == 0x500) || 47128 ((instr & 0xd00) == 0x900) || 47129 ((instr & 0xe00) == 0xe00)) { 47130 UnallocatedA32(instr); 47131 return; 47132 } 47133 unsigned cmode = (instr >> 8) & 0xf; 47134 DataType dt = 47135 ImmediateVmvn::DecodeDt(cmode); 47136 if (dt.Is(kDataTypeValueInvalid)) { 47137 UnallocatedA32(instr); 47138 return; 47139 } 47140 unsigned rd = 47141 ExtractDRegister(instr, 22, 12); 47142 DOperand imm = 47143 ImmediateVmvn::DecodeImmediate( 47144 cmode, 47145 (instr & 0xf) | 47146 ((instr >> 12) & 0x70) | 47147 ((instr >> 17) & 0x80)); 47148 // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length) 47149 vmvn(al, dt, DRegister(rd), imm); 47150 break; 47151 } 47152 case 0x00000200: { 47153 // 0xf2800e10 47154 if (((instr & 0x920) == 0x100) || 47155 ((instr & 0x520) == 0x100) || 47156 ((instr & 0x820) == 0x20) || 47157 ((instr & 0x420) == 0x20) || 47158 ((instr & 0x220) == 0x20) || 47159 ((instr & 0x120) == 0x120)) { 47160 UnallocatedA32(instr); 47161 return; 47162 } 47163 unsigned cmode = 47164 ((instr >> 8) & 0xf) | 47165 ((instr >> 1) & 0x10); 47166 DataType dt = 47167 ImmediateVmov::DecodeDt(cmode); 47168 if (dt.Is(kDataTypeValueInvalid)) { 47169 UnallocatedA32(instr); 47170 return; 47171 } 47172 unsigned rd = 47173 ExtractDRegister(instr, 22, 12); 47174 DOperand imm = 47175 ImmediateVmov::DecodeImmediate( 47176 cmode, 47177 (instr & 0xf) | 47178 ((instr >> 12) & 0x70) | 47179 ((instr >> 17) & 0x80)); 47180 // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length) 47181 vmov(al, dt, DRegister(rd), imm); 47182 break; 47183 } 47184 case 0x00000220: { 47185 // 0xf2800e30 47186 if (((instr & 0xd00) == 0x100) || 47187 ((instr & 0xd00) == 0x500) || 47188 ((instr & 0xd00) == 0x900) || 47189 ((instr & 0xe00) == 0xe00)) { 47190 UnallocatedA32(instr); 47191 return; 47192 } 47193 unsigned cmode = (instr >> 8) & 0xf; 47194 DataType dt = 47195 ImmediateVmvn::DecodeDt(cmode); 47196 if (dt.Is(kDataTypeValueInvalid)) { 47197 UnallocatedA32(instr); 47198 return; 47199 } 47200 unsigned rd = 47201 ExtractDRegister(instr, 22, 12); 47202 DOperand imm = 47203 ImmediateVmvn::DecodeImmediate( 47204 cmode, 47205 (instr & 0xf) | 47206 ((instr >> 12) & 0x70) | 47207 ((instr >> 17) & 0x80)); 47208 // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length) 47209 vmvn(al, dt, DRegister(rd), imm); 47210 break; 47211 } 47212 case 0x00000400: { 47213 // 0xf2800c10 47214 if (((instr & 0x920) == 0x100) || 47215 ((instr & 0x520) == 0x100) || 47216 ((instr & 0x820) == 0x20) || 47217 ((instr & 0x420) == 0x20) || 47218 ((instr & 0x220) == 0x20) || 47219 ((instr & 0x120) == 0x120)) { 47220 UnallocatedA32(instr); 47221 return; 47222 } 47223 unsigned cmode = 47224 ((instr >> 8) & 0xf) | 47225 ((instr >> 1) & 0x10); 47226 DataType dt = 47227 ImmediateVmov::DecodeDt(cmode); 47228 if (dt.Is(kDataTypeValueInvalid)) { 47229 UnallocatedA32(instr); 47230 return; 47231 } 47232 unsigned rd = 47233 ExtractDRegister(instr, 22, 12); 47234 DOperand imm = 47235 ImmediateVmov::DecodeImmediate( 47236 cmode, 47237 (instr & 0xf) | 47238 ((instr >> 12) & 0x70) | 47239 ((instr >> 17) & 0x80)); 47240 // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length) 47241 vmov(al, dt, DRegister(rd), imm); 47242 break; 47243 } 47244 case 0x00000420: { 47245 // 0xf2800c30 47246 if (((instr & 0xd00) == 0x100) || 47247 ((instr & 0xd00) == 0x500) || 47248 ((instr & 0xd00) == 0x900) || 47249 ((instr & 0xe00) == 0xe00)) { 47250 UnallocatedA32(instr); 47251 return; 47252 } 47253 unsigned cmode = (instr >> 8) & 0xf; 47254 DataType dt = 47255 ImmediateVmvn::DecodeDt(cmode); 47256 if (dt.Is(kDataTypeValueInvalid)) { 47257 UnallocatedA32(instr); 47258 return; 47259 } 47260 unsigned rd = 47261 ExtractDRegister(instr, 22, 12); 47262 DOperand imm = 47263 ImmediateVmvn::DecodeImmediate( 47264 cmode, 47265 (instr & 0xf) | 47266 ((instr >> 12) & 0x70) | 47267 ((instr >> 17) & 0x80)); 47268 // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length) 47269 vmvn(al, dt, DRegister(rd), imm); 47270 break; 47271 } 47272 case 0x00000600: { 47273 // 0xf2800e10 47274 if (((instr & 0x920) == 0x100) || 47275 ((instr & 0x520) == 0x100) || 47276 ((instr & 0x820) == 0x20) || 47277 ((instr & 0x420) == 0x20) || 47278 ((instr & 0x220) == 0x20) || 47279 ((instr & 0x120) == 0x120)) { 47280 UnallocatedA32(instr); 47281 return; 47282 } 47283 unsigned cmode = 47284 ((instr >> 8) & 0xf) | 47285 ((instr >> 1) & 0x10); 47286 DataType dt = 47287 ImmediateVmov::DecodeDt(cmode); 47288 if (dt.Is(kDataTypeValueInvalid)) { 47289 UnallocatedA32(instr); 47290 return; 47291 } 47292 unsigned rd = 47293 ExtractDRegister(instr, 22, 12); 47294 DOperand imm = 47295 ImmediateVmov::DecodeImmediate( 47296 cmode, 47297 (instr & 0xf) | 47298 ((instr >> 12) & 0x70) | 47299 ((instr >> 17) & 0x80)); 47300 // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length) 47301 vmov(al, dt, DRegister(rd), imm); 47302 break; 47303 } 47304 case 0x00000620: { 47305 // 0xf2800e30 47306 if (((instr & 0xd00) == 0x100) || 47307 ((instr & 0xd00) == 0x500) || 47308 ((instr & 0xd00) == 0x900) || 47309 ((instr & 0xe00) == 0xe00)) { 47310 UnallocatedA32(instr); 47311 return; 47312 } 47313 unsigned cmode = (instr >> 8) & 0xf; 47314 DataType dt = 47315 ImmediateVmvn::DecodeDt(cmode); 47316 if (dt.Is(kDataTypeValueInvalid)) { 47317 UnallocatedA32(instr); 47318 return; 47319 } 47320 unsigned rd = 47321 ExtractDRegister(instr, 22, 12); 47322 DOperand imm = 47323 ImmediateVmvn::DecodeImmediate( 47324 cmode, 47325 (instr & 0xf) | 47326 ((instr >> 12) & 0x70) | 47327 ((instr >> 17) & 0x80)); 47328 // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length) 47329 vmvn(al, dt, DRegister(rd), imm); 47330 break; 47331 } 47332 case 0x00000800: { 47333 // 0xf2800c10 47334 if (((instr & 0x920) == 0x100) || 47335 ((instr & 0x520) == 0x100) || 47336 ((instr & 0x820) == 0x20) || 47337 ((instr & 0x420) == 0x20) || 47338 ((instr & 0x220) == 0x20) || 47339 ((instr & 0x120) == 0x120)) { 47340 UnallocatedA32(instr); 47341 return; 47342 } 47343 unsigned cmode = 47344 ((instr >> 8) & 0xf) | 47345 ((instr >> 1) & 0x10); 47346 DataType dt = 47347 ImmediateVmov::DecodeDt(cmode); 47348 if (dt.Is(kDataTypeValueInvalid)) { 47349 UnallocatedA32(instr); 47350 return; 47351 } 47352 unsigned rd = 47353 ExtractDRegister(instr, 22, 12); 47354 DOperand imm = 47355 ImmediateVmov::DecodeImmediate( 47356 cmode, 47357 (instr & 0xf) | 47358 ((instr >> 12) & 0x70) | 47359 ((instr >> 17) & 0x80)); 47360 // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length) 47361 vmov(al, dt, DRegister(rd), imm); 47362 break; 47363 } 47364 case 0x00000820: { 47365 // 0xf2800c30 47366 if (((instr & 0xd00) == 0x100) || 47367 ((instr & 0xd00) == 0x500) || 47368 ((instr & 0xd00) == 0x900) || 47369 ((instr & 0xe00) == 0xe00)) { 47370 UnallocatedA32(instr); 47371 return; 47372 } 47373 unsigned cmode = (instr >> 8) & 0xf; 47374 DataType dt = 47375 ImmediateVmvn::DecodeDt(cmode); 47376 if (dt.Is(kDataTypeValueInvalid)) { 47377 UnallocatedA32(instr); 47378 return; 47379 } 47380 unsigned rd = 47381 ExtractDRegister(instr, 22, 12); 47382 DOperand imm = 47383 ImmediateVmvn::DecodeImmediate( 47384 cmode, 47385 (instr & 0xf) | 47386 ((instr >> 12) & 0x70) | 47387 ((instr >> 17) & 0x80)); 47388 // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length) 47389 vmvn(al, dt, DRegister(rd), imm); 47390 break; 47391 } 47392 case 0x00000a00: { 47393 // 0xf2800e10 47394 if (((instr & 0x920) == 0x100) || 47395 ((instr & 0x520) == 0x100) || 47396 ((instr & 0x820) == 0x20) || 47397 ((instr & 0x420) == 0x20) || 47398 ((instr & 0x220) == 0x20) || 47399 ((instr & 0x120) == 0x120)) { 47400 UnallocatedA32(instr); 47401 return; 47402 } 47403 unsigned cmode = 47404 ((instr >> 8) & 0xf) | 47405 ((instr >> 1) & 0x10); 47406 DataType dt = 47407 ImmediateVmov::DecodeDt(cmode); 47408 if (dt.Is(kDataTypeValueInvalid)) { 47409 UnallocatedA32(instr); 47410 return; 47411 } 47412 unsigned rd = 47413 ExtractDRegister(instr, 22, 12); 47414 DOperand imm = 47415 ImmediateVmov::DecodeImmediate( 47416 cmode, 47417 (instr & 0xf) | 47418 ((instr >> 12) & 0x70) | 47419 ((instr >> 17) & 0x80)); 47420 // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length) 47421 vmov(al, dt, DRegister(rd), imm); 47422 break; 47423 } 47424 case 0x00000a20: { 47425 // 0xf2800e30 47426 if (((instr & 0xd00) == 0x100) || 47427 ((instr & 0xd00) == 0x500) || 47428 ((instr & 0xd00) == 0x900) || 47429 ((instr & 0xe00) == 0xe00)) { 47430 UnallocatedA32(instr); 47431 return; 47432 } 47433 unsigned cmode = (instr >> 8) & 0xf; 47434 DataType dt = 47435 ImmediateVmvn::DecodeDt(cmode); 47436 if (dt.Is(kDataTypeValueInvalid)) { 47437 UnallocatedA32(instr); 47438 return; 47439 } 47440 unsigned rd = 47441 ExtractDRegister(instr, 22, 12); 47442 DOperand imm = 47443 ImmediateVmvn::DecodeImmediate( 47444 cmode, 47445 (instr & 0xf) | 47446 ((instr >> 12) & 0x70) | 47447 ((instr >> 17) & 0x80)); 47448 // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length) 47449 vmvn(al, dt, DRegister(rd), imm); 47450 break; 47451 } 47452 case 0x00000c00: { 47453 // 0xf2800c10 47454 if (((instr & 0x920) == 0x100) || 47455 ((instr & 0x520) == 0x100) || 47456 ((instr & 0x820) == 0x20) || 47457 ((instr & 0x420) == 0x20) || 47458 ((instr & 0x220) == 0x20) || 47459 ((instr & 0x120) == 0x120)) { 47460 UnallocatedA32(instr); 47461 return; 47462 } 47463 unsigned cmode = 47464 ((instr >> 8) & 0xf) | 47465 ((instr >> 1) & 0x10); 47466 DataType dt = 47467 ImmediateVmov::DecodeDt(cmode); 47468 if (dt.Is(kDataTypeValueInvalid)) { 47469 UnallocatedA32(instr); 47470 return; 47471 } 47472 unsigned rd = 47473 ExtractDRegister(instr, 22, 12); 47474 DOperand imm = 47475 ImmediateVmov::DecodeImmediate( 47476 cmode, 47477 (instr & 0xf) | 47478 ((instr >> 12) & 0x70) | 47479 ((instr >> 17) & 0x80)); 47480 // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length) 47481 vmov(al, dt, DRegister(rd), imm); 47482 break; 47483 } 47484 case 0x00000c20: { 47485 // 0xf2800c30 47486 if (((instr & 0xd00) == 0x100) || 47487 ((instr & 0xd00) == 0x500) || 47488 ((instr & 0xd00) == 0x900) || 47489 ((instr & 0xe00) == 0xe00)) { 47490 UnallocatedA32(instr); 47491 return; 47492 } 47493 unsigned cmode = (instr >> 8) & 0xf; 47494 DataType dt = 47495 ImmediateVmvn::DecodeDt(cmode); 47496 if (dt.Is(kDataTypeValueInvalid)) { 47497 UnallocatedA32(instr); 47498 return; 47499 } 47500 unsigned rd = 47501 ExtractDRegister(instr, 22, 12); 47502 DOperand imm = 47503 ImmediateVmvn::DecodeImmediate( 47504 cmode, 47505 (instr & 0xf) | 47506 ((instr >> 12) & 0x70) | 47507 ((instr >> 17) & 0x80)); 47508 // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length) 47509 vmvn(al, dt, DRegister(rd), imm); 47510 break; 47511 } 47512 case 0x00000d00: { 47513 // 0xf2800d10 47514 if (((instr & 0x920) == 0x100) || 47515 ((instr & 0x520) == 0x100) || 47516 ((instr & 0x820) == 0x20) || 47517 ((instr & 0x420) == 0x20) || 47518 ((instr & 0x220) == 0x20) || 47519 ((instr & 0x120) == 0x120)) { 47520 UnallocatedA32(instr); 47521 return; 47522 } 47523 unsigned cmode = 47524 ((instr >> 8) & 0xf) | 47525 ((instr >> 1) & 0x10); 47526 DataType dt = 47527 ImmediateVmov::DecodeDt(cmode); 47528 if (dt.Is(kDataTypeValueInvalid)) { 47529 UnallocatedA32(instr); 47530 return; 47531 } 47532 unsigned rd = 47533 ExtractDRegister(instr, 22, 12); 47534 DOperand imm = 47535 ImmediateVmov::DecodeImmediate( 47536 cmode, 47537 (instr & 0xf) | 47538 ((instr >> 12) & 0x70) | 47539 ((instr >> 17) & 0x80)); 47540 // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length) 47541 vmov(al, dt, DRegister(rd), imm); 47542 break; 47543 } 47544 case 0x00000d20: { 47545 // 0xf2800d30 47546 if (((instr & 0xd00) == 0x100) || 47547 ((instr & 0xd00) == 0x500) || 47548 ((instr & 0xd00) == 0x900) || 47549 ((instr & 0xe00) == 0xe00)) { 47550 UnallocatedA32(instr); 47551 return; 47552 } 47553 unsigned cmode = (instr >> 8) & 0xf; 47554 DataType dt = 47555 ImmediateVmvn::DecodeDt(cmode); 47556 if (dt.Is(kDataTypeValueInvalid)) { 47557 UnallocatedA32(instr); 47558 return; 47559 } 47560 unsigned rd = 47561 ExtractDRegister(instr, 22, 12); 47562 DOperand imm = 47563 ImmediateVmvn::DecodeImmediate( 47564 cmode, 47565 (instr & 0xf) | 47566 ((instr >> 12) & 0x70) | 47567 ((instr >> 17) & 0x80)); 47568 // VMVN{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length) 47569 vmvn(al, dt, DRegister(rd), imm); 47570 break; 47571 } 47572 case 0x00000e00: { 47573 // 0xf2800e10 47574 if (((instr & 0x920) == 0x100) || 47575 ((instr & 0x520) == 0x100) || 47576 ((instr & 0x820) == 0x20) || 47577 ((instr & 0x420) == 0x20) || 47578 ((instr & 0x220) == 0x20) || 47579 ((instr & 0x120) == 0x120)) { 47580 UnallocatedA32(instr); 47581 return; 47582 } 47583 unsigned cmode = 47584 ((instr >> 8) & 0xf) | 47585 ((instr >> 1) & 0x10); 47586 DataType dt = 47587 ImmediateVmov::DecodeDt(cmode); 47588 if (dt.Is(kDataTypeValueInvalid)) { 47589 UnallocatedA32(instr); 47590 return; 47591 } 47592 unsigned rd = 47593 ExtractDRegister(instr, 22, 12); 47594 DOperand imm = 47595 ImmediateVmov::DecodeImmediate( 47596 cmode, 47597 (instr & 0xf) | 47598 ((instr >> 12) & 0x70) | 47599 ((instr >> 17) & 0x80)); 47600 // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length) 47601 vmov(al, dt, DRegister(rd), imm); 47602 break; 47603 } 47604 case 0x00000e20: { 47605 // 0xf2800e30 47606 if (((instr & 0x920) == 0x100) || 47607 ((instr & 0x520) == 0x100) || 47608 ((instr & 0x820) == 0x20) || 47609 ((instr & 0x420) == 0x20) || 47610 ((instr & 0x220) == 0x20) || 47611 ((instr & 0x120) == 0x120)) { 47612 UnallocatedA32(instr); 47613 return; 47614 } 47615 unsigned cmode = 47616 ((instr >> 8) & 0xf) | 47617 ((instr >> 1) & 0x10); 47618 DataType dt = 47619 ImmediateVmov::DecodeDt(cmode); 47620 if (dt.Is(kDataTypeValueInvalid)) { 47621 UnallocatedA32(instr); 47622 return; 47623 } 47624 unsigned rd = 47625 ExtractDRegister(instr, 22, 12); 47626 DOperand imm = 47627 ImmediateVmov::DecodeImmediate( 47628 cmode, 47629 (instr & 0xf) | 47630 ((instr >> 12) & 0x70) | 47631 ((instr >> 17) & 0x80)); 47632 // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length) 47633 vmov(al, dt, DRegister(rd), imm); 47634 break; 47635 } 47636 case 0x00000f00: { 47637 // 0xf2800f10 47638 if (((instr & 0x920) == 0x100) || 47639 ((instr & 0x520) == 0x100) || 47640 ((instr & 0x820) == 0x20) || 47641 ((instr & 0x420) == 0x20) || 47642 ((instr & 0x220) == 0x20) || 47643 ((instr & 0x120) == 0x120)) { 47644 UnallocatedA32(instr); 47645 return; 47646 } 47647 unsigned cmode = 47648 ((instr >> 8) & 0xf) | 47649 ((instr >> 1) & 0x10); 47650 DataType dt = 47651 ImmediateVmov::DecodeDt(cmode); 47652 if (dt.Is(kDataTypeValueInvalid)) { 47653 UnallocatedA32(instr); 47654 return; 47655 } 47656 unsigned rd = 47657 ExtractDRegister(instr, 22, 12); 47658 DOperand imm = 47659 ImmediateVmov::DecodeImmediate( 47660 cmode, 47661 (instr & 0xf) | 47662 ((instr >> 12) & 0x70) | 47663 ((instr >> 17) & 0x80)); 47664 // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 NOLINT(whitespace/line_length) 47665 vmov(al, dt, DRegister(rd), imm); 47666 break; 47667 } 47668 default: 47669 UnallocatedA32(instr); 47670 break; 47671 } 47672 break; 47673 } 47674 default: { 47675 if (((instr & 0x920) == 0x100) || 47676 ((instr & 0x520) == 0x100) || 47677 ((instr & 0x820) == 0x20) || 47678 ((instr & 0x420) == 0x20) || 47679 ((instr & 0x220) == 0x20) || 47680 ((instr & 0x120) == 0x120)) { 47681 UnallocatedA32(instr); 47682 return; 47683 } 47684 unsigned cmode = ((instr >> 8) & 0xf) | 47685 ((instr >> 1) & 0x10); 47686 DataType dt = 47687 ImmediateVmov::DecodeDt(cmode); 47688 if (dt.Is(kDataTypeValueInvalid)) { 47689 UnallocatedA32(instr); 47690 return; 47691 } 47692 unsigned rd = 47693 ExtractDRegister(instr, 22, 12); 47694 DOperand imm = 47695 ImmediateVmov::DecodeImmediate( 47696 cmode, 47697 (instr & 0xf) | 47698 ((instr >> 12) & 0x70) | 47699 ((instr >> 17) & 0x80)); 47700 // VMOV{<c>}{<q>}.<dt> <Dd>, #<imm> ; A1 47701 vmov(al, dt, DRegister(rd), imm); 47702 break; 47703 } 47704 } 47705 break; 47706 } 47707 } 47708 break; 47709 } 47710 default: 47711 UnallocatedA32(instr); 47712 break; 47713 } 47714 break; 47715 } 47716 default: { 47717 if ((instr & 0x00000200) == 0x00000200) { 47718 if (((instr & 0x200000) == 0x0)) { 47719 UnallocatedA32(instr); 47720 return; 47721 } 47722 DataType dt1 = Dt_op_U_1_Decode1( 47723 ((instr >> 24) & 0x1) | ((instr >> 7) & 0x2)); 47724 if (dt1.Is(kDataTypeValueInvalid)) { 47725 UnallocatedA32(instr); 47726 return; 47727 } 47728 DataType dt2 = Dt_op_U_1_Decode2( 47729 ((instr >> 24) & 0x1) | ((instr >> 7) & 0x2)); 47730 if (dt2.Is(kDataTypeValueInvalid)) { 47731 UnallocatedA32(instr); 47732 return; 47733 } 47734 unsigned rd = ExtractDRegister(instr, 22, 12); 47735 unsigned rm = ExtractDRegister(instr, 5, 0); 47736 uint32_t fbits = 64 - ((instr >> 16) & 0x3f); 47737 // VCVT{<c>}{<q>}.<dt>.<dt> <Dd>, <Dm>, #<fbits> ; A1 NOLINT(whitespace/line_length) 47738 vcvt(al, 47739 dt1, 47740 dt2, 47741 DRegister(rd), 47742 DRegister(rm), 47743 fbits); 47744 } else { 47745 UnallocatedA32(instr); 47746 } 47747 break; 47748 } 47749 } 47750 break; 47751 } 47752 default: 47753 UnallocatedA32(instr); 47754 break; 47755 } 47756 break; 47757 } 47758 } 47759 break; 47760 } 47761 case 0x00000040: { 47762 // 0xf2800050 47763 switch (instr & 0x00000c00) { 47764 case 0x00000000: { 47765 // 0xf2800050 47766 switch (instr & 0x00380080) { 47767 case 0x00000000: { 47768 // 0xf2800050 47769 switch (instr & 0x00000100) { 47770 case 0x00000000: { 47771 // 0xf2800050 47772 switch (instr & 0x00000200) { 47773 default: { 47774 switch (instr & 0x00000020) { 47775 case 0x00000020: { 47776 // 0xf2800070 47777 if (((instr & 0xd00) == 0x100) || 47778 ((instr & 0xd00) == 0x500) || 47779 ((instr & 0xd00) == 0x900) || 47780 ((instr & 0xe00) == 0xe00)) { 47781 UnallocatedA32(instr); 47782 return; 47783 } 47784 unsigned cmode = (instr >> 8) & 0xf; 47785 DataType dt = 47786 ImmediateVmvn::DecodeDt(cmode); 47787 if (dt.Is(kDataTypeValueInvalid)) { 47788 UnallocatedA32(instr); 47789 return; 47790 } 47791 if (((instr >> 12) & 1) != 0) { 47792 UnallocatedA32(instr); 47793 return; 47794 } 47795 unsigned rd = 47796 ExtractQRegister(instr, 22, 12); 47797 QOperand imm = 47798 ImmediateVmvn::DecodeImmediate( 47799 cmode, 47800 (instr & 0xf) | 47801 ((instr >> 12) & 0x70) | 47802 ((instr >> 17) & 0x80)); 47803 // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 47804 vmvn(al, dt, QRegister(rd), imm); 47805 break; 47806 } 47807 default: { 47808 if (((instr & 0x920) == 0x100) || 47809 ((instr & 0x520) == 0x100) || 47810 ((instr & 0x820) == 0x20) || 47811 ((instr & 0x420) == 0x20) || 47812 ((instr & 0x220) == 0x20) || 47813 ((instr & 0x120) == 0x120)) { 47814 UnallocatedA32(instr); 47815 return; 47816 } 47817 unsigned cmode = ((instr >> 8) & 0xf) | 47818 ((instr >> 1) & 0x10); 47819 DataType dt = 47820 ImmediateVmov::DecodeDt(cmode); 47821 if (dt.Is(kDataTypeValueInvalid)) { 47822 UnallocatedA32(instr); 47823 return; 47824 } 47825 if (((instr >> 12) & 1) != 0) { 47826 UnallocatedA32(instr); 47827 return; 47828 } 47829 unsigned rd = 47830 ExtractQRegister(instr, 22, 12); 47831 QOperand imm = 47832 ImmediateVmov::DecodeImmediate( 47833 cmode, 47834 (instr & 0xf) | 47835 ((instr >> 12) & 0x70) | 47836 ((instr >> 17) & 0x80)); 47837 // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 47838 vmov(al, dt, QRegister(rd), imm); 47839 break; 47840 } 47841 } 47842 break; 47843 } 47844 } 47845 break; 47846 } 47847 case 0x00000100: { 47848 // 0xf2800150 47849 switch (instr & 0x00000020) { 47850 case 0x00000000: { 47851 // 0xf2800150 47852 if (((instr & 0x100) == 0x0) || 47853 ((instr & 0xc00) == 0xc00)) { 47854 UnallocatedA32(instr); 47855 return; 47856 } 47857 unsigned cmode = (instr >> 8) & 0xf; 47858 DataType dt = ImmediateVorr::DecodeDt(cmode); 47859 if (dt.Is(kDataTypeValueInvalid)) { 47860 UnallocatedA32(instr); 47861 return; 47862 } 47863 if (((instr >> 12) & 1) != 0) { 47864 UnallocatedA32(instr); 47865 return; 47866 } 47867 unsigned rd = ExtractQRegister(instr, 22, 12); 47868 QOperand imm = ImmediateVorr::DecodeImmediate( 47869 cmode, 47870 (instr & 0xf) | ((instr >> 12) & 0x70) | 47871 ((instr >> 17) & 0x80)); 47872 // VORR{<c>}{<q>}.<dt> {<Qdn>}, <Qdn>, #<imm> ; A1 NOLINT(whitespace/line_length) 47873 vorr(al, dt, QRegister(rd), QRegister(rd), imm); 47874 break; 47875 } 47876 case 0x00000020: { 47877 // 0xf2800170 47878 if (((instr & 0x100) == 0x0) || 47879 ((instr & 0xc00) == 0xc00)) { 47880 UnallocatedA32(instr); 47881 return; 47882 } 47883 unsigned cmode = (instr >> 8) & 0xf; 47884 DataType dt = ImmediateVbic::DecodeDt(cmode); 47885 if (dt.Is(kDataTypeValueInvalid)) { 47886 UnallocatedA32(instr); 47887 return; 47888 } 47889 if (((instr >> 12) & 1) != 0) { 47890 UnallocatedA32(instr); 47891 return; 47892 } 47893 unsigned rd = ExtractQRegister(instr, 22, 12); 47894 QOperand imm = ImmediateVbic::DecodeImmediate( 47895 cmode, 47896 (instr & 0xf) | ((instr >> 12) & 0x70) | 47897 ((instr >> 17) & 0x80)); 47898 // VBIC{<c>}{<q>}.<dt> {<Qdn>}, <Qdn>, #<imm> ; A1 NOLINT(whitespace/line_length) 47899 vbic(al, dt, QRegister(rd), QRegister(rd), imm); 47900 break; 47901 } 47902 } 47903 break; 47904 } 47905 } 47906 break; 47907 } 47908 default: { 47909 switch (instr & 0x00000300) { 47910 case 0x00000000: { 47911 // 0xf2800050 47912 if (((instr & 0x380080) == 0x0)) { 47913 UnallocatedA32(instr); 47914 return; 47915 } 47916 DataType dt = 47917 Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) | 47918 ((instr >> 4) & 0x8), 47919 (instr >> 24) & 0x1); 47920 if (dt.Is(kDataTypeValueInvalid)) { 47921 UnallocatedA32(instr); 47922 return; 47923 } 47924 if (((instr >> 12) & 1) != 0) { 47925 UnallocatedA32(instr); 47926 return; 47927 } 47928 unsigned rd = ExtractQRegister(instr, 22, 12); 47929 if ((instr & 1) != 0) { 47930 UnallocatedA32(instr); 47931 return; 47932 } 47933 unsigned rm = ExtractQRegister(instr, 5, 0); 47934 uint32_t imm6 = (instr >> 16) & 0x3f; 47935 uint32_t imm = 47936 (dt.IsSize(64) ? 64 : (dt.GetSize() * 2)) - 47937 imm6; 47938 // VSHR{<c>}{<q>}.<type><size> {<Qd>}, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length) 47939 vshr(al, dt, QRegister(rd), QRegister(rm), imm); 47940 break; 47941 } 47942 case 0x00000100: { 47943 // 0xf2800150 47944 if (((instr & 0x380080) == 0x0)) { 47945 UnallocatedA32(instr); 47946 return; 47947 } 47948 DataType dt = 47949 Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) | 47950 ((instr >> 4) & 0x8), 47951 (instr >> 24) & 0x1); 47952 if (dt.Is(kDataTypeValueInvalid)) { 47953 UnallocatedA32(instr); 47954 return; 47955 } 47956 if (((instr >> 12) & 1) != 0) { 47957 UnallocatedA32(instr); 47958 return; 47959 } 47960 unsigned rd = ExtractQRegister(instr, 22, 12); 47961 if ((instr & 1) != 0) { 47962 UnallocatedA32(instr); 47963 return; 47964 } 47965 unsigned rm = ExtractQRegister(instr, 5, 0); 47966 uint32_t imm6 = (instr >> 16) & 0x3f; 47967 uint32_t imm = 47968 (dt.IsSize(64) ? 64 : (dt.GetSize() * 2)) - 47969 imm6; 47970 // VSRA{<c>}{<q>}.<type><size> {<Qd>}, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length) 47971 vsra(al, dt, QRegister(rd), QRegister(rm), imm); 47972 break; 47973 } 47974 case 0x00000200: { 47975 // 0xf2800250 47976 if (((instr & 0x380080) == 0x0)) { 47977 UnallocatedA32(instr); 47978 return; 47979 } 47980 DataType dt = 47981 Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) | 47982 ((instr >> 4) & 0x8), 47983 (instr >> 24) & 0x1); 47984 if (dt.Is(kDataTypeValueInvalid)) { 47985 UnallocatedA32(instr); 47986 return; 47987 } 47988 if (((instr >> 12) & 1) != 0) { 47989 UnallocatedA32(instr); 47990 return; 47991 } 47992 unsigned rd = ExtractQRegister(instr, 22, 12); 47993 if ((instr & 1) != 0) { 47994 UnallocatedA32(instr); 47995 return; 47996 } 47997 unsigned rm = ExtractQRegister(instr, 5, 0); 47998 uint32_t imm6 = (instr >> 16) & 0x3f; 47999 uint32_t imm = 48000 (dt.IsSize(64) ? 64 : (dt.GetSize() * 2)) - 48001 imm6; 48002 // VRSHR{<c>}{<q>}.<type><size> {<Qd>}, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length) 48003 vrshr(al, dt, QRegister(rd), QRegister(rm), imm); 48004 break; 48005 } 48006 case 0x00000300: { 48007 // 0xf2800350 48008 if (((instr & 0x380080) == 0x0)) { 48009 UnallocatedA32(instr); 48010 return; 48011 } 48012 DataType dt = 48013 Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) | 48014 ((instr >> 4) & 0x8), 48015 (instr >> 24) & 0x1); 48016 if (dt.Is(kDataTypeValueInvalid)) { 48017 UnallocatedA32(instr); 48018 return; 48019 } 48020 if (((instr >> 12) & 1) != 0) { 48021 UnallocatedA32(instr); 48022 return; 48023 } 48024 unsigned rd = ExtractQRegister(instr, 22, 12); 48025 if ((instr & 1) != 0) { 48026 UnallocatedA32(instr); 48027 return; 48028 } 48029 unsigned rm = ExtractQRegister(instr, 5, 0); 48030 uint32_t imm6 = (instr >> 16) & 0x3f; 48031 uint32_t imm = 48032 (dt.IsSize(64) ? 64 : (dt.GetSize() * 2)) - 48033 imm6; 48034 // VRSRA{<c>}{<q>}.<type><size> {<Qd>}, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length) 48035 vrsra(al, dt, QRegister(rd), QRegister(rm), imm); 48036 break; 48037 } 48038 } 48039 break; 48040 } 48041 } 48042 break; 48043 } 48044 case 0x00000400: { 48045 // 0xf2800450 48046 switch (instr & 0x00380080) { 48047 case 0x00000000: { 48048 // 0xf2800450 48049 switch (instr & 0x00000100) { 48050 case 0x00000000: { 48051 // 0xf2800450 48052 switch (instr & 0x00000200) { 48053 default: { 48054 switch (instr & 0x00000020) { 48055 case 0x00000020: { 48056 // 0xf2800470 48057 if (((instr & 0xd00) == 0x100) || 48058 ((instr & 0xd00) == 0x500) || 48059 ((instr & 0xd00) == 0x900) || 48060 ((instr & 0xe00) == 0xe00)) { 48061 UnallocatedA32(instr); 48062 return; 48063 } 48064 unsigned cmode = (instr >> 8) & 0xf; 48065 DataType dt = 48066 ImmediateVmvn::DecodeDt(cmode); 48067 if (dt.Is(kDataTypeValueInvalid)) { 48068 UnallocatedA32(instr); 48069 return; 48070 } 48071 if (((instr >> 12) & 1) != 0) { 48072 UnallocatedA32(instr); 48073 return; 48074 } 48075 unsigned rd = 48076 ExtractQRegister(instr, 22, 12); 48077 QOperand imm = 48078 ImmediateVmvn::DecodeImmediate( 48079 cmode, 48080 (instr & 0xf) | 48081 ((instr >> 12) & 0x70) | 48082 ((instr >> 17) & 0x80)); 48083 // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 48084 vmvn(al, dt, QRegister(rd), imm); 48085 break; 48086 } 48087 default: { 48088 if (((instr & 0x920) == 0x100) || 48089 ((instr & 0x520) == 0x100) || 48090 ((instr & 0x820) == 0x20) || 48091 ((instr & 0x420) == 0x20) || 48092 ((instr & 0x220) == 0x20) || 48093 ((instr & 0x120) == 0x120)) { 48094 UnallocatedA32(instr); 48095 return; 48096 } 48097 unsigned cmode = ((instr >> 8) & 0xf) | 48098 ((instr >> 1) & 0x10); 48099 DataType dt = 48100 ImmediateVmov::DecodeDt(cmode); 48101 if (dt.Is(kDataTypeValueInvalid)) { 48102 UnallocatedA32(instr); 48103 return; 48104 } 48105 if (((instr >> 12) & 1) != 0) { 48106 UnallocatedA32(instr); 48107 return; 48108 } 48109 unsigned rd = 48110 ExtractQRegister(instr, 22, 12); 48111 QOperand imm = 48112 ImmediateVmov::DecodeImmediate( 48113 cmode, 48114 (instr & 0xf) | 48115 ((instr >> 12) & 0x70) | 48116 ((instr >> 17) & 0x80)); 48117 // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 48118 vmov(al, dt, QRegister(rd), imm); 48119 break; 48120 } 48121 } 48122 break; 48123 } 48124 } 48125 break; 48126 } 48127 case 0x00000100: { 48128 // 0xf2800550 48129 switch (instr & 0x00000020) { 48130 case 0x00000000: { 48131 // 0xf2800550 48132 if (((instr & 0x100) == 0x0) || 48133 ((instr & 0xc00) == 0xc00)) { 48134 UnallocatedA32(instr); 48135 return; 48136 } 48137 unsigned cmode = (instr >> 8) & 0xf; 48138 DataType dt = ImmediateVorr::DecodeDt(cmode); 48139 if (dt.Is(kDataTypeValueInvalid)) { 48140 UnallocatedA32(instr); 48141 return; 48142 } 48143 if (((instr >> 12) & 1) != 0) { 48144 UnallocatedA32(instr); 48145 return; 48146 } 48147 unsigned rd = ExtractQRegister(instr, 22, 12); 48148 QOperand imm = ImmediateVorr::DecodeImmediate( 48149 cmode, 48150 (instr & 0xf) | ((instr >> 12) & 0x70) | 48151 ((instr >> 17) & 0x80)); 48152 // VORR{<c>}{<q>}.<dt> {<Qdn>}, <Qdn>, #<imm> ; A1 NOLINT(whitespace/line_length) 48153 vorr(al, dt, QRegister(rd), QRegister(rd), imm); 48154 break; 48155 } 48156 case 0x00000020: { 48157 // 0xf2800570 48158 if (((instr & 0x100) == 0x0) || 48159 ((instr & 0xc00) == 0xc00)) { 48160 UnallocatedA32(instr); 48161 return; 48162 } 48163 unsigned cmode = (instr >> 8) & 0xf; 48164 DataType dt = ImmediateVbic::DecodeDt(cmode); 48165 if (dt.Is(kDataTypeValueInvalid)) { 48166 UnallocatedA32(instr); 48167 return; 48168 } 48169 if (((instr >> 12) & 1) != 0) { 48170 UnallocatedA32(instr); 48171 return; 48172 } 48173 unsigned rd = ExtractQRegister(instr, 22, 12); 48174 QOperand imm = ImmediateVbic::DecodeImmediate( 48175 cmode, 48176 (instr & 0xf) | ((instr >> 12) & 0x70) | 48177 ((instr >> 17) & 0x80)); 48178 // VBIC{<c>}{<q>}.<dt> {<Qdn>}, <Qdn>, #<imm> ; A1 NOLINT(whitespace/line_length) 48179 vbic(al, dt, QRegister(rd), QRegister(rd), imm); 48180 break; 48181 } 48182 } 48183 break; 48184 } 48185 } 48186 break; 48187 } 48188 default: { 48189 switch (instr & 0x00000300) { 48190 case 0x00000000: { 48191 // 0xf2800450 48192 if ((instr & 0x01000000) == 0x01000000) { 48193 if (((instr & 0x380080) == 0x0)) { 48194 UnallocatedA32(instr); 48195 return; 48196 } 48197 DataType dt = Dt_L_imm6_4_Decode( 48198 ((instr >> 19) & 0x7) | ((instr >> 4) & 0x8)); 48199 if (dt.Is(kDataTypeValueInvalid)) { 48200 UnallocatedA32(instr); 48201 return; 48202 } 48203 if (((instr >> 12) & 1) != 0) { 48204 UnallocatedA32(instr); 48205 return; 48206 } 48207 unsigned rd = ExtractQRegister(instr, 22, 12); 48208 if ((instr & 1) != 0) { 48209 UnallocatedA32(instr); 48210 return; 48211 } 48212 unsigned rm = ExtractQRegister(instr, 5, 0); 48213 uint32_t imm6 = (instr >> 16) & 0x3f; 48214 uint32_t imm = 48215 (dt.IsSize(64) ? 64 : (dt.GetSize() * 2)) - 48216 imm6; 48217 // VSRI{<c>}{<q>}.<dt> {<Qd>}, <Qm>, #<imm> ; A1 48218 vsri(al, dt, QRegister(rd), QRegister(rm), imm); 48219 } else { 48220 UnallocatedA32(instr); 48221 } 48222 break; 48223 } 48224 case 0x00000100: { 48225 // 0xf2800550 48226 switch (instr & 0x01000000) { 48227 case 0x00000000: { 48228 // 0xf2800550 48229 if (((instr & 0x380080) == 0x0)) { 48230 UnallocatedA32(instr); 48231 return; 48232 } 48233 DataType dt = 48234 Dt_L_imm6_3_Decode(((instr >> 19) & 0x7) | 48235 ((instr >> 4) & 0x8)); 48236 if (dt.Is(kDataTypeValueInvalid)) { 48237 UnallocatedA32(instr); 48238 return; 48239 } 48240 if (((instr >> 12) & 1) != 0) { 48241 UnallocatedA32(instr); 48242 return; 48243 } 48244 unsigned rd = ExtractQRegister(instr, 22, 12); 48245 if ((instr & 1) != 0) { 48246 UnallocatedA32(instr); 48247 return; 48248 } 48249 unsigned rm = ExtractQRegister(instr, 5, 0); 48250 uint32_t imm6 = (instr >> 16) & 0x3f; 48251 uint32_t imm = 48252 imm6 - (dt.IsSize(64) ? 0 : dt.GetSize()); 48253 // VSHL{<c>}{<q>}.I<size> {<Qd>}, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length) 48254 vshl(al, dt, QRegister(rd), QRegister(rm), imm); 48255 break; 48256 } 48257 case 0x01000000: { 48258 // 0xf3800550 48259 if (((instr & 0x380080) == 0x0)) { 48260 UnallocatedA32(instr); 48261 return; 48262 } 48263 DataType dt = 48264 Dt_L_imm6_4_Decode(((instr >> 19) & 0x7) | 48265 ((instr >> 4) & 0x8)); 48266 if (dt.Is(kDataTypeValueInvalid)) { 48267 UnallocatedA32(instr); 48268 return; 48269 } 48270 if (((instr >> 12) & 1) != 0) { 48271 UnallocatedA32(instr); 48272 return; 48273 } 48274 unsigned rd = ExtractQRegister(instr, 22, 12); 48275 if ((instr & 1) != 0) { 48276 UnallocatedA32(instr); 48277 return; 48278 } 48279 unsigned rm = ExtractQRegister(instr, 5, 0); 48280 uint32_t imm6 = (instr >> 16) & 0x3f; 48281 uint32_t imm = 48282 imm6 - (dt.IsSize(64) ? 0 : dt.GetSize()); 48283 // VSLI{<c>}{<q>}.<dt> {<Qd>}, <Qm>, #<imm> ; A1 48284 vsli(al, dt, QRegister(rd), QRegister(rm), imm); 48285 break; 48286 } 48287 } 48288 break; 48289 } 48290 case 0x00000200: { 48291 // 0xf2800650 48292 if (((instr & 0x380080) == 0x0)) { 48293 UnallocatedA32(instr); 48294 return; 48295 } 48296 DataType dt = 48297 Dt_L_imm6_2_Decode(((instr >> 19) & 0x7) | 48298 ((instr >> 4) & 0x8), 48299 (instr >> 24) & 0x1); 48300 if (dt.Is(kDataTypeValueInvalid)) { 48301 UnallocatedA32(instr); 48302 return; 48303 } 48304 if (((instr >> 12) & 1) != 0) { 48305 UnallocatedA32(instr); 48306 return; 48307 } 48308 unsigned rd = ExtractQRegister(instr, 22, 12); 48309 if ((instr & 1) != 0) { 48310 UnallocatedA32(instr); 48311 return; 48312 } 48313 unsigned rm = ExtractQRegister(instr, 5, 0); 48314 uint32_t imm6 = (instr >> 16) & 0x3f; 48315 uint32_t imm = 48316 imm6 - (dt.IsSize(64) ? 0 : dt.GetSize()); 48317 // VQSHLU{<c>}{<q>}.<type><size> {<Qd>}, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length) 48318 vqshlu(al, dt, QRegister(rd), QRegister(rm), imm); 48319 break; 48320 } 48321 case 0x00000300: { 48322 // 0xf2800750 48323 if (((instr & 0x380080) == 0x0)) { 48324 UnallocatedA32(instr); 48325 return; 48326 } 48327 DataType dt = 48328 Dt_L_imm6_1_Decode(((instr >> 19) & 0x7) | 48329 ((instr >> 4) & 0x8), 48330 (instr >> 24) & 0x1); 48331 if (dt.Is(kDataTypeValueInvalid)) { 48332 UnallocatedA32(instr); 48333 return; 48334 } 48335 if (((instr >> 12) & 1) != 0) { 48336 UnallocatedA32(instr); 48337 return; 48338 } 48339 unsigned rd = ExtractQRegister(instr, 22, 12); 48340 if ((instr & 1) != 0) { 48341 UnallocatedA32(instr); 48342 return; 48343 } 48344 unsigned rm = ExtractQRegister(instr, 5, 0); 48345 uint32_t imm6 = (instr >> 16) & 0x3f; 48346 uint32_t imm = 48347 imm6 - (dt.IsSize(64) ? 0 : dt.GetSize()); 48348 // VQSHL{<c>}{<q>}.<type><size> {<Qd>}, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length) 48349 vqshl(al, dt, QRegister(rd), QRegister(rm), imm); 48350 break; 48351 } 48352 } 48353 break; 48354 } 48355 } 48356 break; 48357 } 48358 case 0x00000800: { 48359 // 0xf2800850 48360 switch (instr & 0x00000080) { 48361 case 0x00000000: { 48362 // 0xf2800850 48363 switch (instr & 0x00380000) { 48364 case 0x00000000: { 48365 // 0xf2800850 48366 switch (instr & 0x00000100) { 48367 case 0x00000000: { 48368 // 0xf2800850 48369 switch (instr & 0x00000200) { 48370 default: { 48371 switch (instr & 0x00000020) { 48372 case 0x00000020: { 48373 // 0xf2800870 48374 if (((instr & 0xd00) == 0x100) || 48375 ((instr & 0xd00) == 0x500) || 48376 ((instr & 0xd00) == 0x900) || 48377 ((instr & 0xe00) == 0xe00)) { 48378 UnallocatedA32(instr); 48379 return; 48380 } 48381 unsigned cmode = (instr >> 8) & 0xf; 48382 DataType dt = 48383 ImmediateVmvn::DecodeDt(cmode); 48384 if (dt.Is(kDataTypeValueInvalid)) { 48385 UnallocatedA32(instr); 48386 return; 48387 } 48388 if (((instr >> 12) & 1) != 0) { 48389 UnallocatedA32(instr); 48390 return; 48391 } 48392 unsigned rd = 48393 ExtractQRegister(instr, 22, 12); 48394 QOperand imm = 48395 ImmediateVmvn::DecodeImmediate( 48396 cmode, 48397 (instr & 0xf) | 48398 ((instr >> 12) & 0x70) | 48399 ((instr >> 17) & 0x80)); 48400 // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 48401 vmvn(al, dt, QRegister(rd), imm); 48402 break; 48403 } 48404 default: { 48405 if (((instr & 0x920) == 0x100) || 48406 ((instr & 0x520) == 0x100) || 48407 ((instr & 0x820) == 0x20) || 48408 ((instr & 0x420) == 0x20) || 48409 ((instr & 0x220) == 0x20) || 48410 ((instr & 0x120) == 0x120)) { 48411 UnallocatedA32(instr); 48412 return; 48413 } 48414 unsigned cmode = ((instr >> 8) & 0xf) | 48415 ((instr >> 1) & 0x10); 48416 DataType dt = 48417 ImmediateVmov::DecodeDt(cmode); 48418 if (dt.Is(kDataTypeValueInvalid)) { 48419 UnallocatedA32(instr); 48420 return; 48421 } 48422 if (((instr >> 12) & 1) != 0) { 48423 UnallocatedA32(instr); 48424 return; 48425 } 48426 unsigned rd = 48427 ExtractQRegister(instr, 22, 12); 48428 QOperand imm = 48429 ImmediateVmov::DecodeImmediate( 48430 cmode, 48431 (instr & 0xf) | 48432 ((instr >> 12) & 0x70) | 48433 ((instr >> 17) & 0x80)); 48434 // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 48435 vmov(al, dt, QRegister(rd), imm); 48436 break; 48437 } 48438 } 48439 break; 48440 } 48441 } 48442 break; 48443 } 48444 case 0x00000100: { 48445 // 0xf2800950 48446 switch (instr & 0x00000020) { 48447 case 0x00000000: { 48448 // 0xf2800950 48449 if (((instr & 0x100) == 0x0) || 48450 ((instr & 0xc00) == 0xc00)) { 48451 UnallocatedA32(instr); 48452 return; 48453 } 48454 unsigned cmode = (instr >> 8) & 0xf; 48455 DataType dt = 48456 ImmediateVorr::DecodeDt(cmode); 48457 if (dt.Is(kDataTypeValueInvalid)) { 48458 UnallocatedA32(instr); 48459 return; 48460 } 48461 if (((instr >> 12) & 1) != 0) { 48462 UnallocatedA32(instr); 48463 return; 48464 } 48465 unsigned rd = 48466 ExtractQRegister(instr, 22, 12); 48467 QOperand imm = 48468 ImmediateVorr::DecodeImmediate( 48469 cmode, 48470 (instr & 0xf) | 48471 ((instr >> 12) & 0x70) | 48472 ((instr >> 17) & 0x80)); 48473 // VORR{<c>}{<q>}.<dt> {<Qdn>}, <Qdn>, #<imm> ; A1 NOLINT(whitespace/line_length) 48474 vorr(al, 48475 dt, 48476 QRegister(rd), 48477 QRegister(rd), 48478 imm); 48479 break; 48480 } 48481 case 0x00000020: { 48482 // 0xf2800970 48483 if (((instr & 0x100) == 0x0) || 48484 ((instr & 0xc00) == 0xc00)) { 48485 UnallocatedA32(instr); 48486 return; 48487 } 48488 unsigned cmode = (instr >> 8) & 0xf; 48489 DataType dt = 48490 ImmediateVbic::DecodeDt(cmode); 48491 if (dt.Is(kDataTypeValueInvalid)) { 48492 UnallocatedA32(instr); 48493 return; 48494 } 48495 if (((instr >> 12) & 1) != 0) { 48496 UnallocatedA32(instr); 48497 return; 48498 } 48499 unsigned rd = 48500 ExtractQRegister(instr, 22, 12); 48501 QOperand imm = 48502 ImmediateVbic::DecodeImmediate( 48503 cmode, 48504 (instr & 0xf) | 48505 ((instr >> 12) & 0x70) | 48506 ((instr >> 17) & 0x80)); 48507 // VBIC{<c>}{<q>}.<dt> {<Qdn>}, <Qdn>, #<imm> ; A1 NOLINT(whitespace/line_length) 48508 vbic(al, 48509 dt, 48510 QRegister(rd), 48511 QRegister(rd), 48512 imm); 48513 break; 48514 } 48515 } 48516 break; 48517 } 48518 } 48519 break; 48520 } 48521 default: { 48522 switch (instr & 0x00000300) { 48523 case 0x00000000: { 48524 // 0xf2800850 48525 switch (instr & 0x01000000) { 48526 case 0x00000000: { 48527 // 0xf2800850 48528 if (((instr & 0x380000) == 0x0)) { 48529 UnallocatedA32(instr); 48530 return; 48531 } 48532 DataType dt = 48533 Dt_imm6_3_Decode((instr >> 19) & 0x7); 48534 if (dt.Is(kDataTypeValueInvalid)) { 48535 UnallocatedA32(instr); 48536 return; 48537 } 48538 unsigned rd = 48539 ExtractDRegister(instr, 22, 12); 48540 if ((instr & 1) != 0) { 48541 UnallocatedA32(instr); 48542 return; 48543 } 48544 unsigned rm = ExtractQRegister(instr, 5, 0); 48545 uint32_t imm6 = (instr >> 16) & 0x3f; 48546 uint32_t imm = dt.GetSize() - imm6; 48547 // VRSHRN{<c>}{<q>}.I<size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length) 48548 vrshrn(al, 48549 dt, 48550 DRegister(rd), 48551 QRegister(rm), 48552 imm); 48553 break; 48554 } 48555 case 0x01000000: { 48556 // 0xf3800850 48557 if (((instr & 0x380000) == 0x0)) { 48558 UnallocatedA32(instr); 48559 return; 48560 } 48561 DataType dt = 48562 Dt_imm6_2_Decode((instr >> 19) & 0x7, 48563 (instr >> 24) & 0x1); 48564 if (dt.Is(kDataTypeValueInvalid)) { 48565 UnallocatedA32(instr); 48566 return; 48567 } 48568 unsigned rd = 48569 ExtractDRegister(instr, 22, 12); 48570 if ((instr & 1) != 0) { 48571 UnallocatedA32(instr); 48572 return; 48573 } 48574 unsigned rm = ExtractQRegister(instr, 5, 0); 48575 uint32_t imm6 = (instr >> 16) & 0x3f; 48576 uint32_t imm = dt.GetSize() - imm6; 48577 // VQRSHRUN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length) 48578 vqrshrun(al, 48579 dt, 48580 DRegister(rd), 48581 QRegister(rm), 48582 imm); 48583 break; 48584 } 48585 } 48586 break; 48587 } 48588 case 0x00000100: { 48589 // 0xf2800950 48590 if (((instr & 0x380000) == 0x0)) { 48591 UnallocatedA32(instr); 48592 return; 48593 } 48594 DataType dt = 48595 Dt_imm6_1_Decode((instr >> 19) & 0x7, 48596 (instr >> 24) & 0x1); 48597 if (dt.Is(kDataTypeValueInvalid)) { 48598 UnallocatedA32(instr); 48599 return; 48600 } 48601 unsigned rd = ExtractDRegister(instr, 22, 12); 48602 if ((instr & 1) != 0) { 48603 UnallocatedA32(instr); 48604 return; 48605 } 48606 unsigned rm = ExtractQRegister(instr, 5, 0); 48607 uint32_t imm6 = (instr >> 16) & 0x3f; 48608 uint32_t imm = dt.GetSize() - imm6; 48609 // VQRSHRN{<c>}{<q>}.<type><size> <Dd>, <Qm>, #<imm> ; A1 NOLINT(whitespace/line_length) 48610 vqrshrn(al, 48611 dt, 48612 DRegister(rd), 48613 QRegister(rm), 48614 imm); 48615 break; 48616 } 48617 default: 48618 UnallocatedA32(instr); 48619 break; 48620 } 48621 break; 48622 } 48623 } 48624 break; 48625 } 48626 default: 48627 UnallocatedA32(instr); 48628 break; 48629 } 48630 break; 48631 } 48632 case 0x00000c00: { 48633 // 0xf2800c50 48634 switch (instr & 0x00000080) { 48635 case 0x00000000: { 48636 // 0xf2800c50 48637 switch (instr & 0x00200000) { 48638 case 0x00000000: { 48639 // 0xf2800c50 48640 switch (instr & 0x00180000) { 48641 case 0x00000000: { 48642 // 0xf2800c50 48643 switch (instr & 0x00000300) { 48644 case 0x00000200: { 48645 // 0xf2800e50 48646 if (((instr & 0x920) == 0x100) || 48647 ((instr & 0x520) == 0x100) || 48648 ((instr & 0x820) == 0x20) || 48649 ((instr & 0x420) == 0x20) || 48650 ((instr & 0x220) == 0x20) || 48651 ((instr & 0x120) == 0x120)) { 48652 UnallocatedA32(instr); 48653 return; 48654 } 48655 unsigned cmode = ((instr >> 8) & 0xf) | 48656 ((instr >> 1) & 0x10); 48657 DataType dt = 48658 ImmediateVmov::DecodeDt(cmode); 48659 if (dt.Is(kDataTypeValueInvalid)) { 48660 UnallocatedA32(instr); 48661 return; 48662 } 48663 if (((instr >> 12) & 1) != 0) { 48664 UnallocatedA32(instr); 48665 return; 48666 } 48667 unsigned rd = 48668 ExtractQRegister(instr, 22, 12); 48669 QOperand imm = 48670 ImmediateVmov::DecodeImmediate( 48671 cmode, 48672 (instr & 0xf) | 48673 ((instr >> 12) & 0x70) | 48674 ((instr >> 17) & 0x80)); 48675 // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 48676 vmov(al, dt, QRegister(rd), imm); 48677 break; 48678 } 48679 case 0x00000300: { 48680 // 0xf2800f50 48681 if (((instr & 0x920) == 0x100) || 48682 ((instr & 0x520) == 0x100) || 48683 ((instr & 0x820) == 0x20) || 48684 ((instr & 0x420) == 0x20) || 48685 ((instr & 0x220) == 0x20) || 48686 ((instr & 0x120) == 0x120)) { 48687 UnallocatedA32(instr); 48688 return; 48689 } 48690 unsigned cmode = ((instr >> 8) & 0xf) | 48691 ((instr >> 1) & 0x10); 48692 DataType dt = 48693 ImmediateVmov::DecodeDt(cmode); 48694 if (dt.Is(kDataTypeValueInvalid)) { 48695 UnallocatedA32(instr); 48696 return; 48697 } 48698 if (((instr >> 12) & 1) != 0) { 48699 UnallocatedA32(instr); 48700 return; 48701 } 48702 unsigned rd = 48703 ExtractQRegister(instr, 22, 12); 48704 QOperand imm = 48705 ImmediateVmov::DecodeImmediate( 48706 cmode, 48707 (instr & 0xf) | 48708 ((instr >> 12) & 0x70) | 48709 ((instr >> 17) & 0x80)); 48710 // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 48711 vmov(al, dt, QRegister(rd), imm); 48712 break; 48713 } 48714 default: { 48715 switch (instr & 0x00000020) { 48716 case 0x00000020: { 48717 // 0xf2800c70 48718 switch (instr & 0x00000f20) { 48719 case 0x00000000: { 48720 // 0xf2800c50 48721 if (((instr & 0x920) == 0x100) || 48722 ((instr & 0x520) == 0x100) || 48723 ((instr & 0x820) == 0x20) || 48724 ((instr & 0x420) == 0x20) || 48725 ((instr & 0x220) == 0x20) || 48726 ((instr & 0x120) == 0x120)) { 48727 UnallocatedA32(instr); 48728 return; 48729 } 48730 unsigned cmode = 48731 ((instr >> 8) & 0xf) | 48732 ((instr >> 1) & 0x10); 48733 DataType dt = 48734 ImmediateVmov::DecodeDt(cmode); 48735 if (dt.Is(kDataTypeValueInvalid)) { 48736 UnallocatedA32(instr); 48737 return; 48738 } 48739 if (((instr >> 12) & 1) != 0) { 48740 UnallocatedA32(instr); 48741 return; 48742 } 48743 unsigned rd = 48744 ExtractQRegister(instr, 22, 12); 48745 QOperand imm = 48746 ImmediateVmov::DecodeImmediate( 48747 cmode, 48748 (instr & 0xf) | 48749 ((instr >> 12) & 0x70) | 48750 ((instr >> 17) & 0x80)); 48751 // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length) 48752 vmov(al, dt, QRegister(rd), imm); 48753 break; 48754 } 48755 case 0x00000020: { 48756 // 0xf2800c70 48757 if (((instr & 0xd00) == 0x100) || 48758 ((instr & 0xd00) == 0x500) || 48759 ((instr & 0xd00) == 0x900) || 48760 ((instr & 0xe00) == 0xe00)) { 48761 UnallocatedA32(instr); 48762 return; 48763 } 48764 unsigned cmode = (instr >> 8) & 0xf; 48765 DataType dt = 48766 ImmediateVmvn::DecodeDt(cmode); 48767 if (dt.Is(kDataTypeValueInvalid)) { 48768 UnallocatedA32(instr); 48769 return; 48770 } 48771 if (((instr >> 12) & 1) != 0) { 48772 UnallocatedA32(instr); 48773 return; 48774 } 48775 unsigned rd = 48776 ExtractQRegister(instr, 22, 12); 48777 QOperand imm = 48778 ImmediateVmvn::DecodeImmediate( 48779 cmode, 48780 (instr & 0xf) | 48781 ((instr >> 12) & 0x70) | 48782 ((instr >> 17) & 0x80)); 48783 // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length) 48784 vmvn(al, dt, QRegister(rd), imm); 48785 break; 48786 } 48787 case 0x00000200: { 48788 // 0xf2800e50 48789 if (((instr & 0x920) == 0x100) || 48790 ((instr & 0x520) == 0x100) || 48791 ((instr & 0x820) == 0x20) || 48792 ((instr & 0x420) == 0x20) || 48793 ((instr & 0x220) == 0x20) || 48794 ((instr & 0x120) == 0x120)) { 48795 UnallocatedA32(instr); 48796 return; 48797 } 48798 unsigned cmode = 48799 ((instr >> 8) & 0xf) | 48800 ((instr >> 1) & 0x10); 48801 DataType dt = 48802 ImmediateVmov::DecodeDt(cmode); 48803 if (dt.Is(kDataTypeValueInvalid)) { 48804 UnallocatedA32(instr); 48805 return; 48806 } 48807 if (((instr >> 12) & 1) != 0) { 48808 UnallocatedA32(instr); 48809 return; 48810 } 48811 unsigned rd = 48812 ExtractQRegister(instr, 22, 12); 48813 QOperand imm = 48814 ImmediateVmov::DecodeImmediate( 48815 cmode, 48816 (instr & 0xf) | 48817 ((instr >> 12) & 0x70) | 48818 ((instr >> 17) & 0x80)); 48819 // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length) 48820 vmov(al, dt, QRegister(rd), imm); 48821 break; 48822 } 48823 case 0x00000220: { 48824 // 0xf2800e70 48825 if (((instr & 0xd00) == 0x100) || 48826 ((instr & 0xd00) == 0x500) || 48827 ((instr & 0xd00) == 0x900) || 48828 ((instr & 0xe00) == 0xe00)) { 48829 UnallocatedA32(instr); 48830 return; 48831 } 48832 unsigned cmode = (instr >> 8) & 0xf; 48833 DataType dt = 48834 ImmediateVmvn::DecodeDt(cmode); 48835 if (dt.Is(kDataTypeValueInvalid)) { 48836 UnallocatedA32(instr); 48837 return; 48838 } 48839 if (((instr >> 12) & 1) != 0) { 48840 UnallocatedA32(instr); 48841 return; 48842 } 48843 unsigned rd = 48844 ExtractQRegister(instr, 22, 12); 48845 QOperand imm = 48846 ImmediateVmvn::DecodeImmediate( 48847 cmode, 48848 (instr & 0xf) | 48849 ((instr >> 12) & 0x70) | 48850 ((instr >> 17) & 0x80)); 48851 // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length) 48852 vmvn(al, dt, QRegister(rd), imm); 48853 break; 48854 } 48855 case 0x00000400: { 48856 // 0xf2800c50 48857 if (((instr & 0x920) == 0x100) || 48858 ((instr & 0x520) == 0x100) || 48859 ((instr & 0x820) == 0x20) || 48860 ((instr & 0x420) == 0x20) || 48861 ((instr & 0x220) == 0x20) || 48862 ((instr & 0x120) == 0x120)) { 48863 UnallocatedA32(instr); 48864 return; 48865 } 48866 unsigned cmode = 48867 ((instr >> 8) & 0xf) | 48868 ((instr >> 1) & 0x10); 48869 DataType dt = 48870 ImmediateVmov::DecodeDt(cmode); 48871 if (dt.Is(kDataTypeValueInvalid)) { 48872 UnallocatedA32(instr); 48873 return; 48874 } 48875 if (((instr >> 12) & 1) != 0) { 48876 UnallocatedA32(instr); 48877 return; 48878 } 48879 unsigned rd = 48880 ExtractQRegister(instr, 22, 12); 48881 QOperand imm = 48882 ImmediateVmov::DecodeImmediate( 48883 cmode, 48884 (instr & 0xf) | 48885 ((instr >> 12) & 0x70) | 48886 ((instr >> 17) & 0x80)); 48887 // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length) 48888 vmov(al, dt, QRegister(rd), imm); 48889 break; 48890 } 48891 case 0x00000420: { 48892 // 0xf2800c70 48893 if (((instr & 0xd00) == 0x100) || 48894 ((instr & 0xd00) == 0x500) || 48895 ((instr & 0xd00) == 0x900) || 48896 ((instr & 0xe00) == 0xe00)) { 48897 UnallocatedA32(instr); 48898 return; 48899 } 48900 unsigned cmode = (instr >> 8) & 0xf; 48901 DataType dt = 48902 ImmediateVmvn::DecodeDt(cmode); 48903 if (dt.Is(kDataTypeValueInvalid)) { 48904 UnallocatedA32(instr); 48905 return; 48906 } 48907 if (((instr >> 12) & 1) != 0) { 48908 UnallocatedA32(instr); 48909 return; 48910 } 48911 unsigned rd = 48912 ExtractQRegister(instr, 22, 12); 48913 QOperand imm = 48914 ImmediateVmvn::DecodeImmediate( 48915 cmode, 48916 (instr & 0xf) | 48917 ((instr >> 12) & 0x70) | 48918 ((instr >> 17) & 0x80)); 48919 // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length) 48920 vmvn(al, dt, QRegister(rd), imm); 48921 break; 48922 } 48923 case 0x00000600: { 48924 // 0xf2800e50 48925 if (((instr & 0x920) == 0x100) || 48926 ((instr & 0x520) == 0x100) || 48927 ((instr & 0x820) == 0x20) || 48928 ((instr & 0x420) == 0x20) || 48929 ((instr & 0x220) == 0x20) || 48930 ((instr & 0x120) == 0x120)) { 48931 UnallocatedA32(instr); 48932 return; 48933 } 48934 unsigned cmode = 48935 ((instr >> 8) & 0xf) | 48936 ((instr >> 1) & 0x10); 48937 DataType dt = 48938 ImmediateVmov::DecodeDt(cmode); 48939 if (dt.Is(kDataTypeValueInvalid)) { 48940 UnallocatedA32(instr); 48941 return; 48942 } 48943 if (((instr >> 12) & 1) != 0) { 48944 UnallocatedA32(instr); 48945 return; 48946 } 48947 unsigned rd = 48948 ExtractQRegister(instr, 22, 12); 48949 QOperand imm = 48950 ImmediateVmov::DecodeImmediate( 48951 cmode, 48952 (instr & 0xf) | 48953 ((instr >> 12) & 0x70) | 48954 ((instr >> 17) & 0x80)); 48955 // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length) 48956 vmov(al, dt, QRegister(rd), imm); 48957 break; 48958 } 48959 case 0x00000620: { 48960 // 0xf2800e70 48961 if (((instr & 0xd00) == 0x100) || 48962 ((instr & 0xd00) == 0x500) || 48963 ((instr & 0xd00) == 0x900) || 48964 ((instr & 0xe00) == 0xe00)) { 48965 UnallocatedA32(instr); 48966 return; 48967 } 48968 unsigned cmode = (instr >> 8) & 0xf; 48969 DataType dt = 48970 ImmediateVmvn::DecodeDt(cmode); 48971 if (dt.Is(kDataTypeValueInvalid)) { 48972 UnallocatedA32(instr); 48973 return; 48974 } 48975 if (((instr >> 12) & 1) != 0) { 48976 UnallocatedA32(instr); 48977 return; 48978 } 48979 unsigned rd = 48980 ExtractQRegister(instr, 22, 12); 48981 QOperand imm = 48982 ImmediateVmvn::DecodeImmediate( 48983 cmode, 48984 (instr & 0xf) | 48985 ((instr >> 12) & 0x70) | 48986 ((instr >> 17) & 0x80)); 48987 // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length) 48988 vmvn(al, dt, QRegister(rd), imm); 48989 break; 48990 } 48991 case 0x00000800: { 48992 // 0xf2800c50 48993 if (((instr & 0x920) == 0x100) || 48994 ((instr & 0x520) == 0x100) || 48995 ((instr & 0x820) == 0x20) || 48996 ((instr & 0x420) == 0x20) || 48997 ((instr & 0x220) == 0x20) || 48998 ((instr & 0x120) == 0x120)) { 48999 UnallocatedA32(instr); 49000 return; 49001 } 49002 unsigned cmode = 49003 ((instr >> 8) & 0xf) | 49004 ((instr >> 1) & 0x10); 49005 DataType dt = 49006 ImmediateVmov::DecodeDt(cmode); 49007 if (dt.Is(kDataTypeValueInvalid)) { 49008 UnallocatedA32(instr); 49009 return; 49010 } 49011 if (((instr >> 12) & 1) != 0) { 49012 UnallocatedA32(instr); 49013 return; 49014 } 49015 unsigned rd = 49016 ExtractQRegister(instr, 22, 12); 49017 QOperand imm = 49018 ImmediateVmov::DecodeImmediate( 49019 cmode, 49020 (instr & 0xf) | 49021 ((instr >> 12) & 0x70) | 49022 ((instr >> 17) & 0x80)); 49023 // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length) 49024 vmov(al, dt, QRegister(rd), imm); 49025 break; 49026 } 49027 case 0x00000820: { 49028 // 0xf2800c70 49029 if (((instr & 0xd00) == 0x100) || 49030 ((instr & 0xd00) == 0x500) || 49031 ((instr & 0xd00) == 0x900) || 49032 ((instr & 0xe00) == 0xe00)) { 49033 UnallocatedA32(instr); 49034 return; 49035 } 49036 unsigned cmode = (instr >> 8) & 0xf; 49037 DataType dt = 49038 ImmediateVmvn::DecodeDt(cmode); 49039 if (dt.Is(kDataTypeValueInvalid)) { 49040 UnallocatedA32(instr); 49041 return; 49042 } 49043 if (((instr >> 12) & 1) != 0) { 49044 UnallocatedA32(instr); 49045 return; 49046 } 49047 unsigned rd = 49048 ExtractQRegister(instr, 22, 12); 49049 QOperand imm = 49050 ImmediateVmvn::DecodeImmediate( 49051 cmode, 49052 (instr & 0xf) | 49053 ((instr >> 12) & 0x70) | 49054 ((instr >> 17) & 0x80)); 49055 // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length) 49056 vmvn(al, dt, QRegister(rd), imm); 49057 break; 49058 } 49059 case 0x00000a00: { 49060 // 0xf2800e50 49061 if (((instr & 0x920) == 0x100) || 49062 ((instr & 0x520) == 0x100) || 49063 ((instr & 0x820) == 0x20) || 49064 ((instr & 0x420) == 0x20) || 49065 ((instr & 0x220) == 0x20) || 49066 ((instr & 0x120) == 0x120)) { 49067 UnallocatedA32(instr); 49068 return; 49069 } 49070 unsigned cmode = 49071 ((instr >> 8) & 0xf) | 49072 ((instr >> 1) & 0x10); 49073 DataType dt = 49074 ImmediateVmov::DecodeDt(cmode); 49075 if (dt.Is(kDataTypeValueInvalid)) { 49076 UnallocatedA32(instr); 49077 return; 49078 } 49079 if (((instr >> 12) & 1) != 0) { 49080 UnallocatedA32(instr); 49081 return; 49082 } 49083 unsigned rd = 49084 ExtractQRegister(instr, 22, 12); 49085 QOperand imm = 49086 ImmediateVmov::DecodeImmediate( 49087 cmode, 49088 (instr & 0xf) | 49089 ((instr >> 12) & 0x70) | 49090 ((instr >> 17) & 0x80)); 49091 // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length) 49092 vmov(al, dt, QRegister(rd), imm); 49093 break; 49094 } 49095 case 0x00000a20: { 49096 // 0xf2800e70 49097 if (((instr & 0xd00) == 0x100) || 49098 ((instr & 0xd00) == 0x500) || 49099 ((instr & 0xd00) == 0x900) || 49100 ((instr & 0xe00) == 0xe00)) { 49101 UnallocatedA32(instr); 49102 return; 49103 } 49104 unsigned cmode = (instr >> 8) & 0xf; 49105 DataType dt = 49106 ImmediateVmvn::DecodeDt(cmode); 49107 if (dt.Is(kDataTypeValueInvalid)) { 49108 UnallocatedA32(instr); 49109 return; 49110 } 49111 if (((instr >> 12) & 1) != 0) { 49112 UnallocatedA32(instr); 49113 return; 49114 } 49115 unsigned rd = 49116 ExtractQRegister(instr, 22, 12); 49117 QOperand imm = 49118 ImmediateVmvn::DecodeImmediate( 49119 cmode, 49120 (instr & 0xf) | 49121 ((instr >> 12) & 0x70) | 49122 ((instr >> 17) & 0x80)); 49123 // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length) 49124 vmvn(al, dt, QRegister(rd), imm); 49125 break; 49126 } 49127 case 0x00000c00: { 49128 // 0xf2800c50 49129 if (((instr & 0x920) == 0x100) || 49130 ((instr & 0x520) == 0x100) || 49131 ((instr & 0x820) == 0x20) || 49132 ((instr & 0x420) == 0x20) || 49133 ((instr & 0x220) == 0x20) || 49134 ((instr & 0x120) == 0x120)) { 49135 UnallocatedA32(instr); 49136 return; 49137 } 49138 unsigned cmode = 49139 ((instr >> 8) & 0xf) | 49140 ((instr >> 1) & 0x10); 49141 DataType dt = 49142 ImmediateVmov::DecodeDt(cmode); 49143 if (dt.Is(kDataTypeValueInvalid)) { 49144 UnallocatedA32(instr); 49145 return; 49146 } 49147 if (((instr >> 12) & 1) != 0) { 49148 UnallocatedA32(instr); 49149 return; 49150 } 49151 unsigned rd = 49152 ExtractQRegister(instr, 22, 12); 49153 QOperand imm = 49154 ImmediateVmov::DecodeImmediate( 49155 cmode, 49156 (instr & 0xf) | 49157 ((instr >> 12) & 0x70) | 49158 ((instr >> 17) & 0x80)); 49159 // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length) 49160 vmov(al, dt, QRegister(rd), imm); 49161 break; 49162 } 49163 case 0x00000c20: { 49164 // 0xf2800c70 49165 if (((instr & 0xd00) == 0x100) || 49166 ((instr & 0xd00) == 0x500) || 49167 ((instr & 0xd00) == 0x900) || 49168 ((instr & 0xe00) == 0xe00)) { 49169 UnallocatedA32(instr); 49170 return; 49171 } 49172 unsigned cmode = (instr >> 8) & 0xf; 49173 DataType dt = 49174 ImmediateVmvn::DecodeDt(cmode); 49175 if (dt.Is(kDataTypeValueInvalid)) { 49176 UnallocatedA32(instr); 49177 return; 49178 } 49179 if (((instr >> 12) & 1) != 0) { 49180 UnallocatedA32(instr); 49181 return; 49182 } 49183 unsigned rd = 49184 ExtractQRegister(instr, 22, 12); 49185 QOperand imm = 49186 ImmediateVmvn::DecodeImmediate( 49187 cmode, 49188 (instr & 0xf) | 49189 ((instr >> 12) & 0x70) | 49190 ((instr >> 17) & 0x80)); 49191 // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length) 49192 vmvn(al, dt, QRegister(rd), imm); 49193 break; 49194 } 49195 case 0x00000d00: { 49196 // 0xf2800d50 49197 if (((instr & 0x920) == 0x100) || 49198 ((instr & 0x520) == 0x100) || 49199 ((instr & 0x820) == 0x20) || 49200 ((instr & 0x420) == 0x20) || 49201 ((instr & 0x220) == 0x20) || 49202 ((instr & 0x120) == 0x120)) { 49203 UnallocatedA32(instr); 49204 return; 49205 } 49206 unsigned cmode = 49207 ((instr >> 8) & 0xf) | 49208 ((instr >> 1) & 0x10); 49209 DataType dt = 49210 ImmediateVmov::DecodeDt(cmode); 49211 if (dt.Is(kDataTypeValueInvalid)) { 49212 UnallocatedA32(instr); 49213 return; 49214 } 49215 if (((instr >> 12) & 1) != 0) { 49216 UnallocatedA32(instr); 49217 return; 49218 } 49219 unsigned rd = 49220 ExtractQRegister(instr, 22, 12); 49221 QOperand imm = 49222 ImmediateVmov::DecodeImmediate( 49223 cmode, 49224 (instr & 0xf) | 49225 ((instr >> 12) & 0x70) | 49226 ((instr >> 17) & 0x80)); 49227 // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length) 49228 vmov(al, dt, QRegister(rd), imm); 49229 break; 49230 } 49231 case 0x00000d20: { 49232 // 0xf2800d70 49233 if (((instr & 0xd00) == 0x100) || 49234 ((instr & 0xd00) == 0x500) || 49235 ((instr & 0xd00) == 0x900) || 49236 ((instr & 0xe00) == 0xe00)) { 49237 UnallocatedA32(instr); 49238 return; 49239 } 49240 unsigned cmode = (instr >> 8) & 0xf; 49241 DataType dt = 49242 ImmediateVmvn::DecodeDt(cmode); 49243 if (dt.Is(kDataTypeValueInvalid)) { 49244 UnallocatedA32(instr); 49245 return; 49246 } 49247 if (((instr >> 12) & 1) != 0) { 49248 UnallocatedA32(instr); 49249 return; 49250 } 49251 unsigned rd = 49252 ExtractQRegister(instr, 22, 12); 49253 QOperand imm = 49254 ImmediateVmvn::DecodeImmediate( 49255 cmode, 49256 (instr & 0xf) | 49257 ((instr >> 12) & 0x70) | 49258 ((instr >> 17) & 0x80)); 49259 // VMVN{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length) 49260 vmvn(al, dt, QRegister(rd), imm); 49261 break; 49262 } 49263 case 0x00000e00: { 49264 // 0xf2800e50 49265 if (((instr & 0x920) == 0x100) || 49266 ((instr & 0x520) == 0x100) || 49267 ((instr & 0x820) == 0x20) || 49268 ((instr & 0x420) == 0x20) || 49269 ((instr & 0x220) == 0x20) || 49270 ((instr & 0x120) == 0x120)) { 49271 UnallocatedA32(instr); 49272 return; 49273 } 49274 unsigned cmode = 49275 ((instr >> 8) & 0xf) | 49276 ((instr >> 1) & 0x10); 49277 DataType dt = 49278 ImmediateVmov::DecodeDt(cmode); 49279 if (dt.Is(kDataTypeValueInvalid)) { 49280 UnallocatedA32(instr); 49281 return; 49282 } 49283 if (((instr >> 12) & 1) != 0) { 49284 UnallocatedA32(instr); 49285 return; 49286 } 49287 unsigned rd = 49288 ExtractQRegister(instr, 22, 12); 49289 QOperand imm = 49290 ImmediateVmov::DecodeImmediate( 49291 cmode, 49292 (instr & 0xf) | 49293 ((instr >> 12) & 0x70) | 49294 ((instr >> 17) & 0x80)); 49295 // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length) 49296 vmov(al, dt, QRegister(rd), imm); 49297 break; 49298 } 49299 case 0x00000e20: { 49300 // 0xf2800e70 49301 if (((instr & 0x920) == 0x100) || 49302 ((instr & 0x520) == 0x100) || 49303 ((instr & 0x820) == 0x20) || 49304 ((instr & 0x420) == 0x20) || 49305 ((instr & 0x220) == 0x20) || 49306 ((instr & 0x120) == 0x120)) { 49307 UnallocatedA32(instr); 49308 return; 49309 } 49310 unsigned cmode = 49311 ((instr >> 8) & 0xf) | 49312 ((instr >> 1) & 0x10); 49313 DataType dt = 49314 ImmediateVmov::DecodeDt(cmode); 49315 if (dt.Is(kDataTypeValueInvalid)) { 49316 UnallocatedA32(instr); 49317 return; 49318 } 49319 if (((instr >> 12) & 1) != 0) { 49320 UnallocatedA32(instr); 49321 return; 49322 } 49323 unsigned rd = 49324 ExtractQRegister(instr, 22, 12); 49325 QOperand imm = 49326 ImmediateVmov::DecodeImmediate( 49327 cmode, 49328 (instr & 0xf) | 49329 ((instr >> 12) & 0x70) | 49330 ((instr >> 17) & 0x80)); 49331 // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length) 49332 vmov(al, dt, QRegister(rd), imm); 49333 break; 49334 } 49335 case 0x00000f00: { 49336 // 0xf2800f50 49337 if (((instr & 0x920) == 0x100) || 49338 ((instr & 0x520) == 0x100) || 49339 ((instr & 0x820) == 0x20) || 49340 ((instr & 0x420) == 0x20) || 49341 ((instr & 0x220) == 0x20) || 49342 ((instr & 0x120) == 0x120)) { 49343 UnallocatedA32(instr); 49344 return; 49345 } 49346 unsigned cmode = 49347 ((instr >> 8) & 0xf) | 49348 ((instr >> 1) & 0x10); 49349 DataType dt = 49350 ImmediateVmov::DecodeDt(cmode); 49351 if (dt.Is(kDataTypeValueInvalid)) { 49352 UnallocatedA32(instr); 49353 return; 49354 } 49355 if (((instr >> 12) & 1) != 0) { 49356 UnallocatedA32(instr); 49357 return; 49358 } 49359 unsigned rd = 49360 ExtractQRegister(instr, 22, 12); 49361 QOperand imm = 49362 ImmediateVmov::DecodeImmediate( 49363 cmode, 49364 (instr & 0xf) | 49365 ((instr >> 12) & 0x70) | 49366 ((instr >> 17) & 0x80)); 49367 // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 NOLINT(whitespace/line_length) 49368 vmov(al, dt, QRegister(rd), imm); 49369 break; 49370 } 49371 default: 49372 UnallocatedA32(instr); 49373 break; 49374 } 49375 break; 49376 } 49377 default: { 49378 if (((instr & 0x920) == 0x100) || 49379 ((instr & 0x520) == 0x100) || 49380 ((instr & 0x820) == 0x20) || 49381 ((instr & 0x420) == 0x20) || 49382 ((instr & 0x220) == 0x20) || 49383 ((instr & 0x120) == 0x120)) { 49384 UnallocatedA32(instr); 49385 return; 49386 } 49387 unsigned cmode = ((instr >> 8) & 0xf) | 49388 ((instr >> 1) & 0x10); 49389 DataType dt = 49390 ImmediateVmov::DecodeDt(cmode); 49391 if (dt.Is(kDataTypeValueInvalid)) { 49392 UnallocatedA32(instr); 49393 return; 49394 } 49395 if (((instr >> 12) & 1) != 0) { 49396 UnallocatedA32(instr); 49397 return; 49398 } 49399 unsigned rd = 49400 ExtractQRegister(instr, 22, 12); 49401 QOperand imm = 49402 ImmediateVmov::DecodeImmediate( 49403 cmode, 49404 (instr & 0xf) | 49405 ((instr >> 12) & 0x70) | 49406 ((instr >> 17) & 0x80)); 49407 // VMOV{<c>}{<q>}.<dt> <Qd>, #<imm> ; A1 49408 vmov(al, dt, QRegister(rd), imm); 49409 break; 49410 } 49411 } 49412 break; 49413 } 49414 } 49415 break; 49416 } 49417 default: 49418 UnallocatedA32(instr); 49419 break; 49420 } 49421 break; 49422 } 49423 default: { 49424 if ((instr & 0x00000200) == 0x00000200) { 49425 if (((instr & 0x200000) == 0x0)) { 49426 UnallocatedA32(instr); 49427 return; 49428 } 49429 DataType dt1 = Dt_op_U_1_Decode1( 49430 ((instr >> 24) & 0x1) | ((instr >> 7) & 0x2)); 49431 if (dt1.Is(kDataTypeValueInvalid)) { 49432 UnallocatedA32(instr); 49433 return; 49434 } 49435 DataType dt2 = Dt_op_U_1_Decode2( 49436 ((instr >> 24) & 0x1) | ((instr >> 7) & 0x2)); 49437 if (dt2.Is(kDataTypeValueInvalid)) { 49438 UnallocatedA32(instr); 49439 return; 49440 } 49441 if (((instr >> 12) & 1) != 0) { 49442 UnallocatedA32(instr); 49443 return; 49444 } 49445 unsigned rd = ExtractQRegister(instr, 22, 12); 49446 if ((instr & 1) != 0) { 49447 UnallocatedA32(instr); 49448 return; 49449 } 49450 unsigned rm = ExtractQRegister(instr, 5, 0); 49451 uint32_t fbits = 64 - ((instr >> 16) & 0x3f); 49452 // VCVT{<c>}{<q>}.<dt>.<dt> <Qd>, <Qm>, #<fbits> ; A1 NOLINT(whitespace/line_length) 49453 vcvt(al, 49454 dt1, 49455 dt2, 49456 QRegister(rd), 49457 QRegister(rm), 49458 fbits); 49459 } else { 49460 UnallocatedA32(instr); 49461 } 49462 break; 49463 } 49464 } 49465 break; 49466 } 49467 default: 49468 UnallocatedA32(instr); 49469 break; 49470 } 49471 break; 49472 } 49473 } 49474 break; 49475 } 49476 } 49477 break; 49478 } 49479 } 49480 break; 49481 } 49482 case 0x04000000: { 49483 // 0xf4000000 49484 switch (instr & 0x01300000) { 49485 case 0x00000000: { 49486 // 0xf4000000 49487 switch (instr & 0x00800000) { 49488 case 0x00000000: { 49489 // 0xf4000000 49490 switch (instr & 0x0000000d) { 49491 case 0x0000000d: { 49492 // 0xf400000d 49493 switch (instr & 0x00000002) { 49494 case 0x00000000: { 49495 // 0xf400000d 49496 switch (instr & 0x00000f00) { 49497 case 0x00000000: { 49498 // 0xf400000d 49499 DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3); 49500 if (dt.Is(kDataTypeValueInvalid)) { 49501 UnallocatedA32(instr); 49502 return; 49503 } 49504 Alignment align = 49505 Align_align_4_Decode((instr >> 4) & 0x3); 49506 if (dt.Is(kDataTypeValueInvalid) || 49507 align.Is(kBadAlignment)) { 49508 UnallocatedA32(instr); 49509 return; 49510 } 49511 unsigned first = ExtractDRegister(instr, 22, 12); 49512 unsigned length; 49513 SpacingType spacing; 49514 switch ((instr >> 8) & 0xf) { 49515 default: 49516 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 49517 case 0x0: 49518 length = 4; 49519 spacing = kSingle; 49520 break; 49521 case 0x1: 49522 length = 4; 49523 spacing = kDouble; 49524 break; 49525 } 49526 unsigned last = 49527 first + 49528 (length - 1) * (spacing == kSingle ? 1 : 2); 49529 TransferType transfer = kMultipleLanes; 49530 unsigned rn = (instr >> 16) & 0xf; 49531 // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length) 49532 vst4(al, 49533 dt, 49534 NeonRegisterList(DRegister(first), 49535 DRegister(last), 49536 spacing, 49537 transfer), 49538 AlignedMemOperand(Register(rn), 49539 align, 49540 PostIndex)); 49541 break; 49542 } 49543 case 0x00000100: { 49544 // 0xf400010d 49545 DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3); 49546 if (dt.Is(kDataTypeValueInvalid)) { 49547 UnallocatedA32(instr); 49548 return; 49549 } 49550 Alignment align = 49551 Align_align_4_Decode((instr >> 4) & 0x3); 49552 if (dt.Is(kDataTypeValueInvalid) || 49553 align.Is(kBadAlignment)) { 49554 UnallocatedA32(instr); 49555 return; 49556 } 49557 unsigned first = ExtractDRegister(instr, 22, 12); 49558 unsigned length; 49559 SpacingType spacing; 49560 switch ((instr >> 8) & 0xf) { 49561 default: 49562 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 49563 case 0x0: 49564 length = 4; 49565 spacing = kSingle; 49566 break; 49567 case 0x1: 49568 length = 4; 49569 spacing = kDouble; 49570 break; 49571 } 49572 unsigned last = 49573 first + 49574 (length - 1) * (spacing == kSingle ? 1 : 2); 49575 TransferType transfer = kMultipleLanes; 49576 unsigned rn = (instr >> 16) & 0xf; 49577 // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length) 49578 vst4(al, 49579 dt, 49580 NeonRegisterList(DRegister(first), 49581 DRegister(last), 49582 spacing, 49583 transfer), 49584 AlignedMemOperand(Register(rn), 49585 align, 49586 PostIndex)); 49587 break; 49588 } 49589 case 0x00000200: { 49590 // 0xf400020d 49591 if (((instr & 0xe20) == 0x620) || 49592 ((instr & 0xf30) == 0xa30)) { 49593 UnallocatedA32(instr); 49594 return; 49595 } 49596 DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3); 49597 if (dt.Is(kDataTypeValueInvalid)) { 49598 UnallocatedA32(instr); 49599 return; 49600 } 49601 Alignment align = 49602 Align_align_5_Decode((instr >> 4) & 0x3); 49603 if (dt.Is(kDataTypeValueInvalid) || 49604 align.Is(kBadAlignment)) { 49605 UnallocatedA32(instr); 49606 return; 49607 } 49608 unsigned first = ExtractDRegister(instr, 22, 12); 49609 unsigned length; 49610 SpacingType spacing = kSingle; 49611 switch ((instr >> 8) & 0xf) { 49612 default: 49613 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 49614 case 0x7: 49615 length = 1; 49616 break; 49617 case 0xa: 49618 length = 2; 49619 break; 49620 case 0x6: 49621 length = 3; 49622 break; 49623 case 0x2: 49624 length = 4; 49625 break; 49626 } 49627 unsigned last = first + length - 1; 49628 TransferType transfer = kMultipleLanes; 49629 unsigned rn = (instr >> 16) & 0xf; 49630 // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length) 49631 vst1(al, 49632 dt, 49633 NeonRegisterList(DRegister(first), 49634 DRegister(last), 49635 spacing, 49636 transfer), 49637 AlignedMemOperand(Register(rn), 49638 align, 49639 PostIndex)); 49640 break; 49641 } 49642 case 0x00000300: { 49643 // 0xf400030d 49644 if (((instr & 0xe30) == 0x830)) { 49645 UnallocatedA32(instr); 49646 return; 49647 } 49648 DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3); 49649 if (dt.Is(kDataTypeValueInvalid)) { 49650 UnallocatedA32(instr); 49651 return; 49652 } 49653 Alignment align = 49654 Align_align_2_Decode((instr >> 4) & 0x3); 49655 if (dt.Is(kDataTypeValueInvalid) || 49656 align.Is(kBadAlignment)) { 49657 UnallocatedA32(instr); 49658 return; 49659 } 49660 unsigned first = ExtractDRegister(instr, 22, 12); 49661 unsigned length; 49662 SpacingType spacing; 49663 switch ((instr >> 8) & 0xf) { 49664 default: 49665 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 49666 case 0x8: 49667 length = 2; 49668 spacing = kSingle; 49669 break; 49670 case 0x9: 49671 length = 2; 49672 spacing = kDouble; 49673 break; 49674 case 0x3: 49675 length = 4; 49676 spacing = kSingle; 49677 break; 49678 } 49679 unsigned last = 49680 first + 49681 (length - 1) * (spacing == kSingle ? 1 : 2); 49682 TransferType transfer = kMultipleLanes; 49683 unsigned rn = (instr >> 16) & 0xf; 49684 // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length) 49685 vst2(al, 49686 dt, 49687 NeonRegisterList(DRegister(first), 49688 DRegister(last), 49689 spacing, 49690 transfer), 49691 AlignedMemOperand(Register(rn), 49692 align, 49693 PostIndex)); 49694 break; 49695 } 49696 case 0x00000400: { 49697 // 0xf400040d 49698 if (((instr & 0x20) == 0x20)) { 49699 UnallocatedA32(instr); 49700 return; 49701 } 49702 DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3); 49703 if (dt.Is(kDataTypeValueInvalid)) { 49704 UnallocatedA32(instr); 49705 return; 49706 } 49707 Alignment align = 49708 Align_align_3_Decode((instr >> 4) & 0x3); 49709 if (dt.Is(kDataTypeValueInvalid) || 49710 align.Is(kBadAlignment)) { 49711 UnallocatedA32(instr); 49712 return; 49713 } 49714 unsigned first = ExtractDRegister(instr, 22, 12); 49715 unsigned length; 49716 SpacingType spacing; 49717 switch ((instr >> 8) & 0xf) { 49718 default: 49719 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 49720 case 0x4: 49721 length = 3; 49722 spacing = kSingle; 49723 break; 49724 case 0x5: 49725 length = 3; 49726 spacing = kDouble; 49727 break; 49728 } 49729 unsigned last = 49730 first + 49731 (length - 1) * (spacing == kSingle ? 1 : 2); 49732 TransferType transfer = kMultipleLanes; 49733 unsigned rn = (instr >> 16) & 0xf; 49734 // VST3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length) 49735 vst3(al, 49736 dt, 49737 NeonRegisterList(DRegister(first), 49738 DRegister(last), 49739 spacing, 49740 transfer), 49741 AlignedMemOperand(Register(rn), 49742 align, 49743 PostIndex)); 49744 break; 49745 } 49746 case 0x00000500: { 49747 // 0xf400050d 49748 if (((instr & 0x20) == 0x20)) { 49749 UnallocatedA32(instr); 49750 return; 49751 } 49752 DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3); 49753 if (dt.Is(kDataTypeValueInvalid)) { 49754 UnallocatedA32(instr); 49755 return; 49756 } 49757 Alignment align = 49758 Align_align_3_Decode((instr >> 4) & 0x3); 49759 if (dt.Is(kDataTypeValueInvalid) || 49760 align.Is(kBadAlignment)) { 49761 UnallocatedA32(instr); 49762 return; 49763 } 49764 unsigned first = ExtractDRegister(instr, 22, 12); 49765 unsigned length; 49766 SpacingType spacing; 49767 switch ((instr >> 8) & 0xf) { 49768 default: 49769 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 49770 case 0x4: 49771 length = 3; 49772 spacing = kSingle; 49773 break; 49774 case 0x5: 49775 length = 3; 49776 spacing = kDouble; 49777 break; 49778 } 49779 unsigned last = 49780 first + 49781 (length - 1) * (spacing == kSingle ? 1 : 2); 49782 TransferType transfer = kMultipleLanes; 49783 unsigned rn = (instr >> 16) & 0xf; 49784 // VST3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length) 49785 vst3(al, 49786 dt, 49787 NeonRegisterList(DRegister(first), 49788 DRegister(last), 49789 spacing, 49790 transfer), 49791 AlignedMemOperand(Register(rn), 49792 align, 49793 PostIndex)); 49794 break; 49795 } 49796 case 0x00000600: { 49797 // 0xf400060d 49798 if (((instr & 0xe20) == 0x620) || 49799 ((instr & 0xf30) == 0xa30)) { 49800 UnallocatedA32(instr); 49801 return; 49802 } 49803 DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3); 49804 if (dt.Is(kDataTypeValueInvalid)) { 49805 UnallocatedA32(instr); 49806 return; 49807 } 49808 Alignment align = 49809 Align_align_5_Decode((instr >> 4) & 0x3); 49810 if (dt.Is(kDataTypeValueInvalid) || 49811 align.Is(kBadAlignment)) { 49812 UnallocatedA32(instr); 49813 return; 49814 } 49815 unsigned first = ExtractDRegister(instr, 22, 12); 49816 unsigned length; 49817 SpacingType spacing = kSingle; 49818 switch ((instr >> 8) & 0xf) { 49819 default: 49820 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 49821 case 0x7: 49822 length = 1; 49823 break; 49824 case 0xa: 49825 length = 2; 49826 break; 49827 case 0x6: 49828 length = 3; 49829 break; 49830 case 0x2: 49831 length = 4; 49832 break; 49833 } 49834 unsigned last = first + length - 1; 49835 TransferType transfer = kMultipleLanes; 49836 unsigned rn = (instr >> 16) & 0xf; 49837 // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length) 49838 vst1(al, 49839 dt, 49840 NeonRegisterList(DRegister(first), 49841 DRegister(last), 49842 spacing, 49843 transfer), 49844 AlignedMemOperand(Register(rn), 49845 align, 49846 PostIndex)); 49847 break; 49848 } 49849 case 0x00000700: { 49850 // 0xf400070d 49851 if (((instr & 0xe20) == 0x620) || 49852 ((instr & 0xf30) == 0xa30)) { 49853 UnallocatedA32(instr); 49854 return; 49855 } 49856 DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3); 49857 if (dt.Is(kDataTypeValueInvalid)) { 49858 UnallocatedA32(instr); 49859 return; 49860 } 49861 Alignment align = 49862 Align_align_5_Decode((instr >> 4) & 0x3); 49863 if (dt.Is(kDataTypeValueInvalid) || 49864 align.Is(kBadAlignment)) { 49865 UnallocatedA32(instr); 49866 return; 49867 } 49868 unsigned first = ExtractDRegister(instr, 22, 12); 49869 unsigned length; 49870 SpacingType spacing = kSingle; 49871 switch ((instr >> 8) & 0xf) { 49872 default: 49873 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 49874 case 0x7: 49875 length = 1; 49876 break; 49877 case 0xa: 49878 length = 2; 49879 break; 49880 case 0x6: 49881 length = 3; 49882 break; 49883 case 0x2: 49884 length = 4; 49885 break; 49886 } 49887 unsigned last = first + length - 1; 49888 TransferType transfer = kMultipleLanes; 49889 unsigned rn = (instr >> 16) & 0xf; 49890 // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length) 49891 vst1(al, 49892 dt, 49893 NeonRegisterList(DRegister(first), 49894 DRegister(last), 49895 spacing, 49896 transfer), 49897 AlignedMemOperand(Register(rn), 49898 align, 49899 PostIndex)); 49900 break; 49901 } 49902 case 0x00000800: { 49903 // 0xf400080d 49904 if (((instr & 0xe30) == 0x830)) { 49905 UnallocatedA32(instr); 49906 return; 49907 } 49908 DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3); 49909 if (dt.Is(kDataTypeValueInvalid)) { 49910 UnallocatedA32(instr); 49911 return; 49912 } 49913 Alignment align = 49914 Align_align_2_Decode((instr >> 4) & 0x3); 49915 if (dt.Is(kDataTypeValueInvalid) || 49916 align.Is(kBadAlignment)) { 49917 UnallocatedA32(instr); 49918 return; 49919 } 49920 unsigned first = ExtractDRegister(instr, 22, 12); 49921 unsigned length; 49922 SpacingType spacing; 49923 switch ((instr >> 8) & 0xf) { 49924 default: 49925 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 49926 case 0x8: 49927 length = 2; 49928 spacing = kSingle; 49929 break; 49930 case 0x9: 49931 length = 2; 49932 spacing = kDouble; 49933 break; 49934 case 0x3: 49935 length = 4; 49936 spacing = kSingle; 49937 break; 49938 } 49939 unsigned last = 49940 first + 49941 (length - 1) * (spacing == kSingle ? 1 : 2); 49942 TransferType transfer = kMultipleLanes; 49943 unsigned rn = (instr >> 16) & 0xf; 49944 // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length) 49945 vst2(al, 49946 dt, 49947 NeonRegisterList(DRegister(first), 49948 DRegister(last), 49949 spacing, 49950 transfer), 49951 AlignedMemOperand(Register(rn), 49952 align, 49953 PostIndex)); 49954 break; 49955 } 49956 case 0x00000900: { 49957 // 0xf400090d 49958 if (((instr & 0xe30) == 0x830)) { 49959 UnallocatedA32(instr); 49960 return; 49961 } 49962 DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3); 49963 if (dt.Is(kDataTypeValueInvalid)) { 49964 UnallocatedA32(instr); 49965 return; 49966 } 49967 Alignment align = 49968 Align_align_2_Decode((instr >> 4) & 0x3); 49969 if (dt.Is(kDataTypeValueInvalid) || 49970 align.Is(kBadAlignment)) { 49971 UnallocatedA32(instr); 49972 return; 49973 } 49974 unsigned first = ExtractDRegister(instr, 22, 12); 49975 unsigned length; 49976 SpacingType spacing; 49977 switch ((instr >> 8) & 0xf) { 49978 default: 49979 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 49980 case 0x8: 49981 length = 2; 49982 spacing = kSingle; 49983 break; 49984 case 0x9: 49985 length = 2; 49986 spacing = kDouble; 49987 break; 49988 case 0x3: 49989 length = 4; 49990 spacing = kSingle; 49991 break; 49992 } 49993 unsigned last = 49994 first + 49995 (length - 1) * (spacing == kSingle ? 1 : 2); 49996 TransferType transfer = kMultipleLanes; 49997 unsigned rn = (instr >> 16) & 0xf; 49998 // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length) 49999 vst2(al, 50000 dt, 50001 NeonRegisterList(DRegister(first), 50002 DRegister(last), 50003 spacing, 50004 transfer), 50005 AlignedMemOperand(Register(rn), 50006 align, 50007 PostIndex)); 50008 break; 50009 } 50010 case 0x00000a00: { 50011 // 0xf4000a0d 50012 if (((instr & 0xe20) == 0x620) || 50013 ((instr & 0xf30) == 0xa30)) { 50014 UnallocatedA32(instr); 50015 return; 50016 } 50017 DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3); 50018 if (dt.Is(kDataTypeValueInvalid)) { 50019 UnallocatedA32(instr); 50020 return; 50021 } 50022 Alignment align = 50023 Align_align_5_Decode((instr >> 4) & 0x3); 50024 if (dt.Is(kDataTypeValueInvalid) || 50025 align.Is(kBadAlignment)) { 50026 UnallocatedA32(instr); 50027 return; 50028 } 50029 unsigned first = ExtractDRegister(instr, 22, 12); 50030 unsigned length; 50031 SpacingType spacing = kSingle; 50032 switch ((instr >> 8) & 0xf) { 50033 default: 50034 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 50035 case 0x7: 50036 length = 1; 50037 break; 50038 case 0xa: 50039 length = 2; 50040 break; 50041 case 0x6: 50042 length = 3; 50043 break; 50044 case 0x2: 50045 length = 4; 50046 break; 50047 } 50048 unsigned last = first + length - 1; 50049 TransferType transfer = kMultipleLanes; 50050 unsigned rn = (instr >> 16) & 0xf; 50051 // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length) 50052 vst1(al, 50053 dt, 50054 NeonRegisterList(DRegister(first), 50055 DRegister(last), 50056 spacing, 50057 transfer), 50058 AlignedMemOperand(Register(rn), 50059 align, 50060 PostIndex)); 50061 break; 50062 } 50063 default: 50064 UnallocatedA32(instr); 50065 break; 50066 } 50067 break; 50068 } 50069 case 0x00000002: { 50070 // 0xf400000f 50071 switch (instr & 0x00000f00) { 50072 case 0x00000000: { 50073 // 0xf400000d 50074 DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3); 50075 if (dt.Is(kDataTypeValueInvalid)) { 50076 UnallocatedA32(instr); 50077 return; 50078 } 50079 Alignment align = 50080 Align_align_4_Decode((instr >> 4) & 0x3); 50081 if (dt.Is(kDataTypeValueInvalid) || 50082 align.Is(kBadAlignment)) { 50083 UnallocatedA32(instr); 50084 return; 50085 } 50086 unsigned first = ExtractDRegister(instr, 22, 12); 50087 unsigned length; 50088 SpacingType spacing; 50089 switch ((instr >> 8) & 0xf) { 50090 default: 50091 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 50092 case 0x0: 50093 length = 4; 50094 spacing = kSingle; 50095 break; 50096 case 0x1: 50097 length = 4; 50098 spacing = kDouble; 50099 break; 50100 } 50101 unsigned last = 50102 first + 50103 (length - 1) * (spacing == kSingle ? 1 : 2); 50104 TransferType transfer = kMultipleLanes; 50105 unsigned rn = (instr >> 16) & 0xf; 50106 // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1 50107 vst4(al, 50108 dt, 50109 NeonRegisterList(DRegister(first), 50110 DRegister(last), 50111 spacing, 50112 transfer), 50113 AlignedMemOperand(Register(rn), 50114 align, 50115 Offset)); 50116 break; 50117 } 50118 case 0x00000100: { 50119 // 0xf400010d 50120 DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3); 50121 if (dt.Is(kDataTypeValueInvalid)) { 50122 UnallocatedA32(instr); 50123 return; 50124 } 50125 Alignment align = 50126 Align_align_4_Decode((instr >> 4) & 0x3); 50127 if (dt.Is(kDataTypeValueInvalid) || 50128 align.Is(kBadAlignment)) { 50129 UnallocatedA32(instr); 50130 return; 50131 } 50132 unsigned first = ExtractDRegister(instr, 22, 12); 50133 unsigned length; 50134 SpacingType spacing; 50135 switch ((instr >> 8) & 0xf) { 50136 default: 50137 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 50138 case 0x0: 50139 length = 4; 50140 spacing = kSingle; 50141 break; 50142 case 0x1: 50143 length = 4; 50144 spacing = kDouble; 50145 break; 50146 } 50147 unsigned last = 50148 first + 50149 (length - 1) * (spacing == kSingle ? 1 : 2); 50150 TransferType transfer = kMultipleLanes; 50151 unsigned rn = (instr >> 16) & 0xf; 50152 // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1 50153 vst4(al, 50154 dt, 50155 NeonRegisterList(DRegister(first), 50156 DRegister(last), 50157 spacing, 50158 transfer), 50159 AlignedMemOperand(Register(rn), 50160 align, 50161 Offset)); 50162 break; 50163 } 50164 case 0x00000200: { 50165 // 0xf400020d 50166 if (((instr & 0xe20) == 0x620) || 50167 ((instr & 0xf30) == 0xa30)) { 50168 UnallocatedA32(instr); 50169 return; 50170 } 50171 DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3); 50172 if (dt.Is(kDataTypeValueInvalid)) { 50173 UnallocatedA32(instr); 50174 return; 50175 } 50176 Alignment align = 50177 Align_align_5_Decode((instr >> 4) & 0x3); 50178 if (dt.Is(kDataTypeValueInvalid) || 50179 align.Is(kBadAlignment)) { 50180 UnallocatedA32(instr); 50181 return; 50182 } 50183 unsigned first = ExtractDRegister(instr, 22, 12); 50184 unsigned length; 50185 SpacingType spacing = kSingle; 50186 switch ((instr >> 8) & 0xf) { 50187 default: 50188 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 50189 case 0x7: 50190 length = 1; 50191 break; 50192 case 0xa: 50193 length = 2; 50194 break; 50195 case 0x6: 50196 length = 3; 50197 break; 50198 case 0x2: 50199 length = 4; 50200 break; 50201 } 50202 unsigned last = first + length - 1; 50203 TransferType transfer = kMultipleLanes; 50204 unsigned rn = (instr >> 16) & 0xf; 50205 // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1 50206 vst1(al, 50207 dt, 50208 NeonRegisterList(DRegister(first), 50209 DRegister(last), 50210 spacing, 50211 transfer), 50212 AlignedMemOperand(Register(rn), 50213 align, 50214 Offset)); 50215 break; 50216 } 50217 case 0x00000300: { 50218 // 0xf400030d 50219 if (((instr & 0xe30) == 0x830)) { 50220 UnallocatedA32(instr); 50221 return; 50222 } 50223 DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3); 50224 if (dt.Is(kDataTypeValueInvalid)) { 50225 UnallocatedA32(instr); 50226 return; 50227 } 50228 Alignment align = 50229 Align_align_2_Decode((instr >> 4) & 0x3); 50230 if (dt.Is(kDataTypeValueInvalid) || 50231 align.Is(kBadAlignment)) { 50232 UnallocatedA32(instr); 50233 return; 50234 } 50235 unsigned first = ExtractDRegister(instr, 22, 12); 50236 unsigned length; 50237 SpacingType spacing; 50238 switch ((instr >> 8) & 0xf) { 50239 default: 50240 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 50241 case 0x8: 50242 length = 2; 50243 spacing = kSingle; 50244 break; 50245 case 0x9: 50246 length = 2; 50247 spacing = kDouble; 50248 break; 50249 case 0x3: 50250 length = 4; 50251 spacing = kSingle; 50252 break; 50253 } 50254 unsigned last = 50255 first + 50256 (length - 1) * (spacing == kSingle ? 1 : 2); 50257 TransferType transfer = kMultipleLanes; 50258 unsigned rn = (instr >> 16) & 0xf; 50259 // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1 50260 vst2(al, 50261 dt, 50262 NeonRegisterList(DRegister(first), 50263 DRegister(last), 50264 spacing, 50265 transfer), 50266 AlignedMemOperand(Register(rn), 50267 align, 50268 Offset)); 50269 break; 50270 } 50271 case 0x00000400: { 50272 // 0xf400040d 50273 if (((instr & 0x20) == 0x20)) { 50274 UnallocatedA32(instr); 50275 return; 50276 } 50277 DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3); 50278 if (dt.Is(kDataTypeValueInvalid)) { 50279 UnallocatedA32(instr); 50280 return; 50281 } 50282 Alignment align = 50283 Align_align_3_Decode((instr >> 4) & 0x3); 50284 if (dt.Is(kDataTypeValueInvalid) || 50285 align.Is(kBadAlignment)) { 50286 UnallocatedA32(instr); 50287 return; 50288 } 50289 unsigned first = ExtractDRegister(instr, 22, 12); 50290 unsigned length; 50291 SpacingType spacing; 50292 switch ((instr >> 8) & 0xf) { 50293 default: 50294 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 50295 case 0x4: 50296 length = 3; 50297 spacing = kSingle; 50298 break; 50299 case 0x5: 50300 length = 3; 50301 spacing = kDouble; 50302 break; 50303 } 50304 unsigned last = 50305 first + 50306 (length - 1) * (spacing == kSingle ? 1 : 2); 50307 TransferType transfer = kMultipleLanes; 50308 unsigned rn = (instr >> 16) & 0xf; 50309 // VST3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1 50310 vst3(al, 50311 dt, 50312 NeonRegisterList(DRegister(first), 50313 DRegister(last), 50314 spacing, 50315 transfer), 50316 AlignedMemOperand(Register(rn), 50317 align, 50318 Offset)); 50319 break; 50320 } 50321 case 0x00000500: { 50322 // 0xf400050d 50323 if (((instr & 0x20) == 0x20)) { 50324 UnallocatedA32(instr); 50325 return; 50326 } 50327 DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3); 50328 if (dt.Is(kDataTypeValueInvalid)) { 50329 UnallocatedA32(instr); 50330 return; 50331 } 50332 Alignment align = 50333 Align_align_3_Decode((instr >> 4) & 0x3); 50334 if (dt.Is(kDataTypeValueInvalid) || 50335 align.Is(kBadAlignment)) { 50336 UnallocatedA32(instr); 50337 return; 50338 } 50339 unsigned first = ExtractDRegister(instr, 22, 12); 50340 unsigned length; 50341 SpacingType spacing; 50342 switch ((instr >> 8) & 0xf) { 50343 default: 50344 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 50345 case 0x4: 50346 length = 3; 50347 spacing = kSingle; 50348 break; 50349 case 0x5: 50350 length = 3; 50351 spacing = kDouble; 50352 break; 50353 } 50354 unsigned last = 50355 first + 50356 (length - 1) * (spacing == kSingle ? 1 : 2); 50357 TransferType transfer = kMultipleLanes; 50358 unsigned rn = (instr >> 16) & 0xf; 50359 // VST3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1 50360 vst3(al, 50361 dt, 50362 NeonRegisterList(DRegister(first), 50363 DRegister(last), 50364 spacing, 50365 transfer), 50366 AlignedMemOperand(Register(rn), 50367 align, 50368 Offset)); 50369 break; 50370 } 50371 case 0x00000600: { 50372 // 0xf400060d 50373 if (((instr & 0xe20) == 0x620) || 50374 ((instr & 0xf30) == 0xa30)) { 50375 UnallocatedA32(instr); 50376 return; 50377 } 50378 DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3); 50379 if (dt.Is(kDataTypeValueInvalid)) { 50380 UnallocatedA32(instr); 50381 return; 50382 } 50383 Alignment align = 50384 Align_align_5_Decode((instr >> 4) & 0x3); 50385 if (dt.Is(kDataTypeValueInvalid) || 50386 align.Is(kBadAlignment)) { 50387 UnallocatedA32(instr); 50388 return; 50389 } 50390 unsigned first = ExtractDRegister(instr, 22, 12); 50391 unsigned length; 50392 SpacingType spacing = kSingle; 50393 switch ((instr >> 8) & 0xf) { 50394 default: 50395 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 50396 case 0x7: 50397 length = 1; 50398 break; 50399 case 0xa: 50400 length = 2; 50401 break; 50402 case 0x6: 50403 length = 3; 50404 break; 50405 case 0x2: 50406 length = 4; 50407 break; 50408 } 50409 unsigned last = first + length - 1; 50410 TransferType transfer = kMultipleLanes; 50411 unsigned rn = (instr >> 16) & 0xf; 50412 // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1 50413 vst1(al, 50414 dt, 50415 NeonRegisterList(DRegister(first), 50416 DRegister(last), 50417 spacing, 50418 transfer), 50419 AlignedMemOperand(Register(rn), 50420 align, 50421 Offset)); 50422 break; 50423 } 50424 case 0x00000700: { 50425 // 0xf400070d 50426 if (((instr & 0xe20) == 0x620) || 50427 ((instr & 0xf30) == 0xa30)) { 50428 UnallocatedA32(instr); 50429 return; 50430 } 50431 DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3); 50432 if (dt.Is(kDataTypeValueInvalid)) { 50433 UnallocatedA32(instr); 50434 return; 50435 } 50436 Alignment align = 50437 Align_align_5_Decode((instr >> 4) & 0x3); 50438 if (dt.Is(kDataTypeValueInvalid) || 50439 align.Is(kBadAlignment)) { 50440 UnallocatedA32(instr); 50441 return; 50442 } 50443 unsigned first = ExtractDRegister(instr, 22, 12); 50444 unsigned length; 50445 SpacingType spacing = kSingle; 50446 switch ((instr >> 8) & 0xf) { 50447 default: 50448 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 50449 case 0x7: 50450 length = 1; 50451 break; 50452 case 0xa: 50453 length = 2; 50454 break; 50455 case 0x6: 50456 length = 3; 50457 break; 50458 case 0x2: 50459 length = 4; 50460 break; 50461 } 50462 unsigned last = first + length - 1; 50463 TransferType transfer = kMultipleLanes; 50464 unsigned rn = (instr >> 16) & 0xf; 50465 // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1 50466 vst1(al, 50467 dt, 50468 NeonRegisterList(DRegister(first), 50469 DRegister(last), 50470 spacing, 50471 transfer), 50472 AlignedMemOperand(Register(rn), 50473 align, 50474 Offset)); 50475 break; 50476 } 50477 case 0x00000800: { 50478 // 0xf400080d 50479 if (((instr & 0xe30) == 0x830)) { 50480 UnallocatedA32(instr); 50481 return; 50482 } 50483 DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3); 50484 if (dt.Is(kDataTypeValueInvalid)) { 50485 UnallocatedA32(instr); 50486 return; 50487 } 50488 Alignment align = 50489 Align_align_2_Decode((instr >> 4) & 0x3); 50490 if (dt.Is(kDataTypeValueInvalid) || 50491 align.Is(kBadAlignment)) { 50492 UnallocatedA32(instr); 50493 return; 50494 } 50495 unsigned first = ExtractDRegister(instr, 22, 12); 50496 unsigned length; 50497 SpacingType spacing; 50498 switch ((instr >> 8) & 0xf) { 50499 default: 50500 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 50501 case 0x8: 50502 length = 2; 50503 spacing = kSingle; 50504 break; 50505 case 0x9: 50506 length = 2; 50507 spacing = kDouble; 50508 break; 50509 case 0x3: 50510 length = 4; 50511 spacing = kSingle; 50512 break; 50513 } 50514 unsigned last = 50515 first + 50516 (length - 1) * (spacing == kSingle ? 1 : 2); 50517 TransferType transfer = kMultipleLanes; 50518 unsigned rn = (instr >> 16) & 0xf; 50519 // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1 50520 vst2(al, 50521 dt, 50522 NeonRegisterList(DRegister(first), 50523 DRegister(last), 50524 spacing, 50525 transfer), 50526 AlignedMemOperand(Register(rn), 50527 align, 50528 Offset)); 50529 break; 50530 } 50531 case 0x00000900: { 50532 // 0xf400090d 50533 if (((instr & 0xe30) == 0x830)) { 50534 UnallocatedA32(instr); 50535 return; 50536 } 50537 DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3); 50538 if (dt.Is(kDataTypeValueInvalid)) { 50539 UnallocatedA32(instr); 50540 return; 50541 } 50542 Alignment align = 50543 Align_align_2_Decode((instr >> 4) & 0x3); 50544 if (dt.Is(kDataTypeValueInvalid) || 50545 align.Is(kBadAlignment)) { 50546 UnallocatedA32(instr); 50547 return; 50548 } 50549 unsigned first = ExtractDRegister(instr, 22, 12); 50550 unsigned length; 50551 SpacingType spacing; 50552 switch ((instr >> 8) & 0xf) { 50553 default: 50554 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 50555 case 0x8: 50556 length = 2; 50557 spacing = kSingle; 50558 break; 50559 case 0x9: 50560 length = 2; 50561 spacing = kDouble; 50562 break; 50563 case 0x3: 50564 length = 4; 50565 spacing = kSingle; 50566 break; 50567 } 50568 unsigned last = 50569 first + 50570 (length - 1) * (spacing == kSingle ? 1 : 2); 50571 TransferType transfer = kMultipleLanes; 50572 unsigned rn = (instr >> 16) & 0xf; 50573 // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1 50574 vst2(al, 50575 dt, 50576 NeonRegisterList(DRegister(first), 50577 DRegister(last), 50578 spacing, 50579 transfer), 50580 AlignedMemOperand(Register(rn), 50581 align, 50582 Offset)); 50583 break; 50584 } 50585 case 0x00000a00: { 50586 // 0xf4000a0d 50587 if (((instr & 0xe20) == 0x620) || 50588 ((instr & 0xf30) == 0xa30)) { 50589 UnallocatedA32(instr); 50590 return; 50591 } 50592 DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3); 50593 if (dt.Is(kDataTypeValueInvalid)) { 50594 UnallocatedA32(instr); 50595 return; 50596 } 50597 Alignment align = 50598 Align_align_5_Decode((instr >> 4) & 0x3); 50599 if (dt.Is(kDataTypeValueInvalid) || 50600 align.Is(kBadAlignment)) { 50601 UnallocatedA32(instr); 50602 return; 50603 } 50604 unsigned first = ExtractDRegister(instr, 22, 12); 50605 unsigned length; 50606 SpacingType spacing = kSingle; 50607 switch ((instr >> 8) & 0xf) { 50608 default: 50609 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 50610 case 0x7: 50611 length = 1; 50612 break; 50613 case 0xa: 50614 length = 2; 50615 break; 50616 case 0x6: 50617 length = 3; 50618 break; 50619 case 0x2: 50620 length = 4; 50621 break; 50622 } 50623 unsigned last = first + length - 1; 50624 TransferType transfer = kMultipleLanes; 50625 unsigned rn = (instr >> 16) & 0xf; 50626 // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1 50627 vst1(al, 50628 dt, 50629 NeonRegisterList(DRegister(first), 50630 DRegister(last), 50631 spacing, 50632 transfer), 50633 AlignedMemOperand(Register(rn), 50634 align, 50635 Offset)); 50636 break; 50637 } 50638 default: 50639 UnallocatedA32(instr); 50640 break; 50641 } 50642 break; 50643 } 50644 } 50645 break; 50646 } 50647 default: { 50648 switch (instr & 0x00000f00) { 50649 case 0x00000000: { 50650 // 0xf4000000 50651 if (((instr & 0xd) == 0xd)) { 50652 UnallocatedA32(instr); 50653 return; 50654 } 50655 DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3); 50656 if (dt.Is(kDataTypeValueInvalid)) { 50657 UnallocatedA32(instr); 50658 return; 50659 } 50660 Alignment align = 50661 Align_align_4_Decode((instr >> 4) & 0x3); 50662 if (dt.Is(kDataTypeValueInvalid) || 50663 align.Is(kBadAlignment)) { 50664 UnallocatedA32(instr); 50665 return; 50666 } 50667 unsigned first = ExtractDRegister(instr, 22, 12); 50668 unsigned length; 50669 SpacingType spacing; 50670 switch ((instr >> 8) & 0xf) { 50671 default: 50672 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 50673 case 0x0: 50674 length = 4; 50675 spacing = kSingle; 50676 break; 50677 case 0x1: 50678 length = 4; 50679 spacing = kDouble; 50680 break; 50681 } 50682 unsigned last = 50683 first + (length - 1) * (spacing == kSingle ? 1 : 2); 50684 TransferType transfer = kMultipleLanes; 50685 unsigned rn = (instr >> 16) & 0xf; 50686 unsigned rm = instr & 0xf; 50687 // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length) 50688 vst4(al, 50689 dt, 50690 NeonRegisterList(DRegister(first), 50691 DRegister(last), 50692 spacing, 50693 transfer), 50694 AlignedMemOperand(Register(rn), 50695 align, 50696 Register(rm), 50697 PostIndex)); 50698 break; 50699 } 50700 case 0x00000100: { 50701 // 0xf4000100 50702 if (((instr & 0xd) == 0xd)) { 50703 UnallocatedA32(instr); 50704 return; 50705 } 50706 DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3); 50707 if (dt.Is(kDataTypeValueInvalid)) { 50708 UnallocatedA32(instr); 50709 return; 50710 } 50711 Alignment align = 50712 Align_align_4_Decode((instr >> 4) & 0x3); 50713 if (dt.Is(kDataTypeValueInvalid) || 50714 align.Is(kBadAlignment)) { 50715 UnallocatedA32(instr); 50716 return; 50717 } 50718 unsigned first = ExtractDRegister(instr, 22, 12); 50719 unsigned length; 50720 SpacingType spacing; 50721 switch ((instr >> 8) & 0xf) { 50722 default: 50723 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 50724 case 0x0: 50725 length = 4; 50726 spacing = kSingle; 50727 break; 50728 case 0x1: 50729 length = 4; 50730 spacing = kDouble; 50731 break; 50732 } 50733 unsigned last = 50734 first + (length - 1) * (spacing == kSingle ? 1 : 2); 50735 TransferType transfer = kMultipleLanes; 50736 unsigned rn = (instr >> 16) & 0xf; 50737 unsigned rm = instr & 0xf; 50738 // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length) 50739 vst4(al, 50740 dt, 50741 NeonRegisterList(DRegister(first), 50742 DRegister(last), 50743 spacing, 50744 transfer), 50745 AlignedMemOperand(Register(rn), 50746 align, 50747 Register(rm), 50748 PostIndex)); 50749 break; 50750 } 50751 case 0x00000200: { 50752 // 0xf4000200 50753 if (((instr & 0xd) == 0xd) || 50754 ((instr & 0xe20) == 0x620) || 50755 ((instr & 0xf30) == 0xa30)) { 50756 UnallocatedA32(instr); 50757 return; 50758 } 50759 DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3); 50760 if (dt.Is(kDataTypeValueInvalid)) { 50761 UnallocatedA32(instr); 50762 return; 50763 } 50764 Alignment align = 50765 Align_align_5_Decode((instr >> 4) & 0x3); 50766 if (dt.Is(kDataTypeValueInvalid) || 50767 align.Is(kBadAlignment)) { 50768 UnallocatedA32(instr); 50769 return; 50770 } 50771 unsigned first = ExtractDRegister(instr, 22, 12); 50772 unsigned length; 50773 SpacingType spacing = kSingle; 50774 switch ((instr >> 8) & 0xf) { 50775 default: 50776 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 50777 case 0x7: 50778 length = 1; 50779 break; 50780 case 0xa: 50781 length = 2; 50782 break; 50783 case 0x6: 50784 length = 3; 50785 break; 50786 case 0x2: 50787 length = 4; 50788 break; 50789 } 50790 unsigned last = first + length - 1; 50791 TransferType transfer = kMultipleLanes; 50792 unsigned rn = (instr >> 16) & 0xf; 50793 unsigned rm = instr & 0xf; 50794 // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length) 50795 vst1(al, 50796 dt, 50797 NeonRegisterList(DRegister(first), 50798 DRegister(last), 50799 spacing, 50800 transfer), 50801 AlignedMemOperand(Register(rn), 50802 align, 50803 Register(rm), 50804 PostIndex)); 50805 break; 50806 } 50807 case 0x00000300: { 50808 // 0xf4000300 50809 if (((instr & 0xd) == 0xd) || 50810 ((instr & 0xe30) == 0x830)) { 50811 UnallocatedA32(instr); 50812 return; 50813 } 50814 DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3); 50815 if (dt.Is(kDataTypeValueInvalid)) { 50816 UnallocatedA32(instr); 50817 return; 50818 } 50819 Alignment align = 50820 Align_align_2_Decode((instr >> 4) & 0x3); 50821 if (dt.Is(kDataTypeValueInvalid) || 50822 align.Is(kBadAlignment)) { 50823 UnallocatedA32(instr); 50824 return; 50825 } 50826 unsigned first = ExtractDRegister(instr, 22, 12); 50827 unsigned length; 50828 SpacingType spacing; 50829 switch ((instr >> 8) & 0xf) { 50830 default: 50831 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 50832 case 0x8: 50833 length = 2; 50834 spacing = kSingle; 50835 break; 50836 case 0x9: 50837 length = 2; 50838 spacing = kDouble; 50839 break; 50840 case 0x3: 50841 length = 4; 50842 spacing = kSingle; 50843 break; 50844 } 50845 unsigned last = 50846 first + (length - 1) * (spacing == kSingle ? 1 : 2); 50847 TransferType transfer = kMultipleLanes; 50848 unsigned rn = (instr >> 16) & 0xf; 50849 unsigned rm = instr & 0xf; 50850 // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length) 50851 vst2(al, 50852 dt, 50853 NeonRegisterList(DRegister(first), 50854 DRegister(last), 50855 spacing, 50856 transfer), 50857 AlignedMemOperand(Register(rn), 50858 align, 50859 Register(rm), 50860 PostIndex)); 50861 break; 50862 } 50863 case 0x00000400: { 50864 // 0xf4000400 50865 if (((instr & 0xd) == 0xd) || 50866 ((instr & 0x20) == 0x20)) { 50867 UnallocatedA32(instr); 50868 return; 50869 } 50870 DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3); 50871 if (dt.Is(kDataTypeValueInvalid)) { 50872 UnallocatedA32(instr); 50873 return; 50874 } 50875 Alignment align = 50876 Align_align_3_Decode((instr >> 4) & 0x3); 50877 if (dt.Is(kDataTypeValueInvalid) || 50878 align.Is(kBadAlignment)) { 50879 UnallocatedA32(instr); 50880 return; 50881 } 50882 unsigned first = ExtractDRegister(instr, 22, 12); 50883 unsigned length; 50884 SpacingType spacing; 50885 switch ((instr >> 8) & 0xf) { 50886 default: 50887 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 50888 case 0x4: 50889 length = 3; 50890 spacing = kSingle; 50891 break; 50892 case 0x5: 50893 length = 3; 50894 spacing = kDouble; 50895 break; 50896 } 50897 unsigned last = 50898 first + (length - 1) * (spacing == kSingle ? 1 : 2); 50899 TransferType transfer = kMultipleLanes; 50900 unsigned rn = (instr >> 16) & 0xf; 50901 unsigned rm = instr & 0xf; 50902 // VST3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length) 50903 vst3(al, 50904 dt, 50905 NeonRegisterList(DRegister(first), 50906 DRegister(last), 50907 spacing, 50908 transfer), 50909 AlignedMemOperand(Register(rn), 50910 align, 50911 Register(rm), 50912 PostIndex)); 50913 break; 50914 } 50915 case 0x00000500: { 50916 // 0xf4000500 50917 if (((instr & 0xd) == 0xd) || 50918 ((instr & 0x20) == 0x20)) { 50919 UnallocatedA32(instr); 50920 return; 50921 } 50922 DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3); 50923 if (dt.Is(kDataTypeValueInvalid)) { 50924 UnallocatedA32(instr); 50925 return; 50926 } 50927 Alignment align = 50928 Align_align_3_Decode((instr >> 4) & 0x3); 50929 if (dt.Is(kDataTypeValueInvalid) || 50930 align.Is(kBadAlignment)) { 50931 UnallocatedA32(instr); 50932 return; 50933 } 50934 unsigned first = ExtractDRegister(instr, 22, 12); 50935 unsigned length; 50936 SpacingType spacing; 50937 switch ((instr >> 8) & 0xf) { 50938 default: 50939 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 50940 case 0x4: 50941 length = 3; 50942 spacing = kSingle; 50943 break; 50944 case 0x5: 50945 length = 3; 50946 spacing = kDouble; 50947 break; 50948 } 50949 unsigned last = 50950 first + (length - 1) * (spacing == kSingle ? 1 : 2); 50951 TransferType transfer = kMultipleLanes; 50952 unsigned rn = (instr >> 16) & 0xf; 50953 unsigned rm = instr & 0xf; 50954 // VST3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length) 50955 vst3(al, 50956 dt, 50957 NeonRegisterList(DRegister(first), 50958 DRegister(last), 50959 spacing, 50960 transfer), 50961 AlignedMemOperand(Register(rn), 50962 align, 50963 Register(rm), 50964 PostIndex)); 50965 break; 50966 } 50967 case 0x00000600: { 50968 // 0xf4000600 50969 if (((instr & 0xd) == 0xd) || 50970 ((instr & 0xe20) == 0x620) || 50971 ((instr & 0xf30) == 0xa30)) { 50972 UnallocatedA32(instr); 50973 return; 50974 } 50975 DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3); 50976 if (dt.Is(kDataTypeValueInvalid)) { 50977 UnallocatedA32(instr); 50978 return; 50979 } 50980 Alignment align = 50981 Align_align_5_Decode((instr >> 4) & 0x3); 50982 if (dt.Is(kDataTypeValueInvalid) || 50983 align.Is(kBadAlignment)) { 50984 UnallocatedA32(instr); 50985 return; 50986 } 50987 unsigned first = ExtractDRegister(instr, 22, 12); 50988 unsigned length; 50989 SpacingType spacing = kSingle; 50990 switch ((instr >> 8) & 0xf) { 50991 default: 50992 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 50993 case 0x7: 50994 length = 1; 50995 break; 50996 case 0xa: 50997 length = 2; 50998 break; 50999 case 0x6: 51000 length = 3; 51001 break; 51002 case 0x2: 51003 length = 4; 51004 break; 51005 } 51006 unsigned last = first + length - 1; 51007 TransferType transfer = kMultipleLanes; 51008 unsigned rn = (instr >> 16) & 0xf; 51009 unsigned rm = instr & 0xf; 51010 // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length) 51011 vst1(al, 51012 dt, 51013 NeonRegisterList(DRegister(first), 51014 DRegister(last), 51015 spacing, 51016 transfer), 51017 AlignedMemOperand(Register(rn), 51018 align, 51019 Register(rm), 51020 PostIndex)); 51021 break; 51022 } 51023 case 0x00000700: { 51024 // 0xf4000700 51025 if (((instr & 0xd) == 0xd) || 51026 ((instr & 0xe20) == 0x620) || 51027 ((instr & 0xf30) == 0xa30)) { 51028 UnallocatedA32(instr); 51029 return; 51030 } 51031 DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3); 51032 if (dt.Is(kDataTypeValueInvalid)) { 51033 UnallocatedA32(instr); 51034 return; 51035 } 51036 Alignment align = 51037 Align_align_5_Decode((instr >> 4) & 0x3); 51038 if (dt.Is(kDataTypeValueInvalid) || 51039 align.Is(kBadAlignment)) { 51040 UnallocatedA32(instr); 51041 return; 51042 } 51043 unsigned first = ExtractDRegister(instr, 22, 12); 51044 unsigned length; 51045 SpacingType spacing = kSingle; 51046 switch ((instr >> 8) & 0xf) { 51047 default: 51048 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 51049 case 0x7: 51050 length = 1; 51051 break; 51052 case 0xa: 51053 length = 2; 51054 break; 51055 case 0x6: 51056 length = 3; 51057 break; 51058 case 0x2: 51059 length = 4; 51060 break; 51061 } 51062 unsigned last = first + length - 1; 51063 TransferType transfer = kMultipleLanes; 51064 unsigned rn = (instr >> 16) & 0xf; 51065 unsigned rm = instr & 0xf; 51066 // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length) 51067 vst1(al, 51068 dt, 51069 NeonRegisterList(DRegister(first), 51070 DRegister(last), 51071 spacing, 51072 transfer), 51073 AlignedMemOperand(Register(rn), 51074 align, 51075 Register(rm), 51076 PostIndex)); 51077 break; 51078 } 51079 case 0x00000800: { 51080 // 0xf4000800 51081 if (((instr & 0xd) == 0xd) || 51082 ((instr & 0xe30) == 0x830)) { 51083 UnallocatedA32(instr); 51084 return; 51085 } 51086 DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3); 51087 if (dt.Is(kDataTypeValueInvalid)) { 51088 UnallocatedA32(instr); 51089 return; 51090 } 51091 Alignment align = 51092 Align_align_2_Decode((instr >> 4) & 0x3); 51093 if (dt.Is(kDataTypeValueInvalid) || 51094 align.Is(kBadAlignment)) { 51095 UnallocatedA32(instr); 51096 return; 51097 } 51098 unsigned first = ExtractDRegister(instr, 22, 12); 51099 unsigned length; 51100 SpacingType spacing; 51101 switch ((instr >> 8) & 0xf) { 51102 default: 51103 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 51104 case 0x8: 51105 length = 2; 51106 spacing = kSingle; 51107 break; 51108 case 0x9: 51109 length = 2; 51110 spacing = kDouble; 51111 break; 51112 case 0x3: 51113 length = 4; 51114 spacing = kSingle; 51115 break; 51116 } 51117 unsigned last = 51118 first + (length - 1) * (spacing == kSingle ? 1 : 2); 51119 TransferType transfer = kMultipleLanes; 51120 unsigned rn = (instr >> 16) & 0xf; 51121 unsigned rm = instr & 0xf; 51122 // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length) 51123 vst2(al, 51124 dt, 51125 NeonRegisterList(DRegister(first), 51126 DRegister(last), 51127 spacing, 51128 transfer), 51129 AlignedMemOperand(Register(rn), 51130 align, 51131 Register(rm), 51132 PostIndex)); 51133 break; 51134 } 51135 case 0x00000900: { 51136 // 0xf4000900 51137 if (((instr & 0xd) == 0xd) || 51138 ((instr & 0xe30) == 0x830)) { 51139 UnallocatedA32(instr); 51140 return; 51141 } 51142 DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3); 51143 if (dt.Is(kDataTypeValueInvalid)) { 51144 UnallocatedA32(instr); 51145 return; 51146 } 51147 Alignment align = 51148 Align_align_2_Decode((instr >> 4) & 0x3); 51149 if (dt.Is(kDataTypeValueInvalid) || 51150 align.Is(kBadAlignment)) { 51151 UnallocatedA32(instr); 51152 return; 51153 } 51154 unsigned first = ExtractDRegister(instr, 22, 12); 51155 unsigned length; 51156 SpacingType spacing; 51157 switch ((instr >> 8) & 0xf) { 51158 default: 51159 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 51160 case 0x8: 51161 length = 2; 51162 spacing = kSingle; 51163 break; 51164 case 0x9: 51165 length = 2; 51166 spacing = kDouble; 51167 break; 51168 case 0x3: 51169 length = 4; 51170 spacing = kSingle; 51171 break; 51172 } 51173 unsigned last = 51174 first + (length - 1) * (spacing == kSingle ? 1 : 2); 51175 TransferType transfer = kMultipleLanes; 51176 unsigned rn = (instr >> 16) & 0xf; 51177 unsigned rm = instr & 0xf; 51178 // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length) 51179 vst2(al, 51180 dt, 51181 NeonRegisterList(DRegister(first), 51182 DRegister(last), 51183 spacing, 51184 transfer), 51185 AlignedMemOperand(Register(rn), 51186 align, 51187 Register(rm), 51188 PostIndex)); 51189 break; 51190 } 51191 case 0x00000a00: { 51192 // 0xf4000a00 51193 if (((instr & 0xd) == 0xd) || 51194 ((instr & 0xe20) == 0x620) || 51195 ((instr & 0xf30) == 0xa30)) { 51196 UnallocatedA32(instr); 51197 return; 51198 } 51199 DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3); 51200 if (dt.Is(kDataTypeValueInvalid)) { 51201 UnallocatedA32(instr); 51202 return; 51203 } 51204 Alignment align = 51205 Align_align_5_Decode((instr >> 4) & 0x3); 51206 if (dt.Is(kDataTypeValueInvalid) || 51207 align.Is(kBadAlignment)) { 51208 UnallocatedA32(instr); 51209 return; 51210 } 51211 unsigned first = ExtractDRegister(instr, 22, 12); 51212 unsigned length; 51213 SpacingType spacing = kSingle; 51214 switch ((instr >> 8) & 0xf) { 51215 default: 51216 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 51217 case 0x7: 51218 length = 1; 51219 break; 51220 case 0xa: 51221 length = 2; 51222 break; 51223 case 0x6: 51224 length = 3; 51225 break; 51226 case 0x2: 51227 length = 4; 51228 break; 51229 } 51230 unsigned last = first + length - 1; 51231 TransferType transfer = kMultipleLanes; 51232 unsigned rn = (instr >> 16) & 0xf; 51233 unsigned rm = instr & 0xf; 51234 // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length) 51235 vst1(al, 51236 dt, 51237 NeonRegisterList(DRegister(first), 51238 DRegister(last), 51239 spacing, 51240 transfer), 51241 AlignedMemOperand(Register(rn), 51242 align, 51243 Register(rm), 51244 PostIndex)); 51245 break; 51246 } 51247 default: 51248 UnallocatedA32(instr); 51249 break; 51250 } 51251 break; 51252 } 51253 } 51254 break; 51255 } 51256 case 0x00800000: { 51257 // 0xf4800000 51258 switch (instr & 0x00000300) { 51259 case 0x00000000: { 51260 // 0xf4800000 51261 switch (instr & 0x00000c00) { 51262 case 0x00000c00: { 51263 // 0xf4800c00 51264 UnallocatedA32(instr); 51265 break; 51266 } 51267 default: { 51268 switch (instr & 0x0000000d) { 51269 case 0x0000000d: { 51270 // 0xf480000d 51271 switch (instr & 0x00000002) { 51272 case 0x00000000: { 51273 // 0xf480000d 51274 if (((instr & 0xc00) == 0xc00)) { 51275 UnallocatedA32(instr); 51276 return; 51277 } 51278 DataType dt = 51279 Dt_size_7_Decode((instr >> 10) & 0x3); 51280 if (dt.Is(kDataTypeValueInvalid)) { 51281 UnallocatedA32(instr); 51282 return; 51283 } 51284 DecodeNeonAndAlign decode_neon = 51285 Align_index_align_1_Decode((instr >> 4) & 51286 0xf, 51287 dt); 51288 if (!decode_neon.IsValid()) { 51289 UnallocatedA32(instr); 51290 return; 51291 } 51292 Alignment align = decode_neon.GetAlign(); 51293 int lane = decode_neon.GetLane(); 51294 SpacingType spacing = decode_neon.GetSpacing(); 51295 unsigned first = 51296 ExtractDRegister(instr, 22, 12); 51297 unsigned length = 1; 51298 unsigned last = first + length - 1; 51299 unsigned rn = (instr >> 16) & 0xf; 51300 // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length) 51301 vst1(al, 51302 dt, 51303 NeonRegisterList(DRegister(first), 51304 DRegister(last), 51305 spacing, 51306 lane), 51307 AlignedMemOperand(Register(rn), 51308 align, 51309 PostIndex)); 51310 break; 51311 } 51312 case 0x00000002: { 51313 // 0xf480000f 51314 if (((instr & 0xc00) == 0xc00)) { 51315 UnallocatedA32(instr); 51316 return; 51317 } 51318 DataType dt = 51319 Dt_size_7_Decode((instr >> 10) & 0x3); 51320 if (dt.Is(kDataTypeValueInvalid)) { 51321 UnallocatedA32(instr); 51322 return; 51323 } 51324 DecodeNeonAndAlign decode_neon = 51325 Align_index_align_1_Decode((instr >> 4) & 51326 0xf, 51327 dt); 51328 if (!decode_neon.IsValid()) { 51329 UnallocatedA32(instr); 51330 return; 51331 } 51332 Alignment align = decode_neon.GetAlign(); 51333 int lane = decode_neon.GetLane(); 51334 SpacingType spacing = decode_neon.GetSpacing(); 51335 unsigned first = 51336 ExtractDRegister(instr, 22, 12); 51337 unsigned length = 1; 51338 unsigned last = first + length - 1; 51339 unsigned rn = (instr >> 16) & 0xf; 51340 // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1 NOLINT(whitespace/line_length) 51341 vst1(al, 51342 dt, 51343 NeonRegisterList(DRegister(first), 51344 DRegister(last), 51345 spacing, 51346 lane), 51347 AlignedMemOperand(Register(rn), 51348 align, 51349 Offset)); 51350 break; 51351 } 51352 } 51353 break; 51354 } 51355 default: { 51356 if (((instr & 0xc00) == 0xc00) || 51357 ((instr & 0xd) == 0xd)) { 51358 UnallocatedA32(instr); 51359 return; 51360 } 51361 DataType dt = Dt_size_7_Decode((instr >> 10) & 0x3); 51362 if (dt.Is(kDataTypeValueInvalid)) { 51363 UnallocatedA32(instr); 51364 return; 51365 } 51366 DecodeNeonAndAlign decode_neon = 51367 Align_index_align_1_Decode((instr >> 4) & 0xf, 51368 dt); 51369 if (!decode_neon.IsValid()) { 51370 UnallocatedA32(instr); 51371 return; 51372 } 51373 Alignment align = decode_neon.GetAlign(); 51374 int lane = decode_neon.GetLane(); 51375 SpacingType spacing = decode_neon.GetSpacing(); 51376 unsigned first = ExtractDRegister(instr, 22, 12); 51377 unsigned length = 1; 51378 unsigned last = first + length - 1; 51379 unsigned rn = (instr >> 16) & 0xf; 51380 unsigned rm = instr & 0xf; 51381 // VST1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length) 51382 vst1(al, 51383 dt, 51384 NeonRegisterList(DRegister(first), 51385 DRegister(last), 51386 spacing, 51387 lane), 51388 AlignedMemOperand(Register(rn), 51389 align, 51390 Register(rm), 51391 PostIndex)); 51392 break; 51393 } 51394 } 51395 break; 51396 } 51397 } 51398 break; 51399 } 51400 case 0x00000100: { 51401 // 0xf4800100 51402 switch (instr & 0x00000c00) { 51403 case 0x00000c00: { 51404 // 0xf4800d00 51405 UnallocatedA32(instr); 51406 break; 51407 } 51408 default: { 51409 switch (instr & 0x0000000d) { 51410 case 0x0000000d: { 51411 // 0xf480010d 51412 switch (instr & 0x00000002) { 51413 case 0x00000000: { 51414 // 0xf480010d 51415 if (((instr & 0xc00) == 0xc00)) { 51416 UnallocatedA32(instr); 51417 return; 51418 } 51419 DataType dt = 51420 Dt_size_7_Decode((instr >> 10) & 0x3); 51421 if (dt.Is(kDataTypeValueInvalid)) { 51422 UnallocatedA32(instr); 51423 return; 51424 } 51425 DecodeNeonAndAlign decode_neon = 51426 Align_index_align_2_Decode((instr >> 4) & 51427 0xf, 51428 dt); 51429 if (!decode_neon.IsValid()) { 51430 UnallocatedA32(instr); 51431 return; 51432 } 51433 Alignment align = decode_neon.GetAlign(); 51434 int lane = decode_neon.GetLane(); 51435 SpacingType spacing = decode_neon.GetSpacing(); 51436 unsigned first = 51437 ExtractDRegister(instr, 22, 12); 51438 unsigned length = 2; 51439 unsigned last = 51440 first + 51441 (length - 1) * (spacing == kSingle ? 1 : 2); 51442 unsigned rn = (instr >> 16) & 0xf; 51443 // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length) 51444 vst2(al, 51445 dt, 51446 NeonRegisterList(DRegister(first), 51447 DRegister(last), 51448 spacing, 51449 lane), 51450 AlignedMemOperand(Register(rn), 51451 align, 51452 PostIndex)); 51453 break; 51454 } 51455 case 0x00000002: { 51456 // 0xf480010f 51457 if (((instr & 0xc00) == 0xc00)) { 51458 UnallocatedA32(instr); 51459 return; 51460 } 51461 DataType dt = 51462 Dt_size_7_Decode((instr >> 10) & 0x3); 51463 if (dt.Is(kDataTypeValueInvalid)) { 51464 UnallocatedA32(instr); 51465 return; 51466 } 51467 DecodeNeonAndAlign decode_neon = 51468 Align_index_align_2_Decode((instr >> 4) & 51469 0xf, 51470 dt); 51471 if (!decode_neon.IsValid()) { 51472 UnallocatedA32(instr); 51473 return; 51474 } 51475 Alignment align = decode_neon.GetAlign(); 51476 int lane = decode_neon.GetLane(); 51477 SpacingType spacing = decode_neon.GetSpacing(); 51478 unsigned first = 51479 ExtractDRegister(instr, 22, 12); 51480 unsigned length = 2; 51481 unsigned last = 51482 first + 51483 (length - 1) * (spacing == kSingle ? 1 : 2); 51484 unsigned rn = (instr >> 16) & 0xf; 51485 // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1 NOLINT(whitespace/line_length) 51486 vst2(al, 51487 dt, 51488 NeonRegisterList(DRegister(first), 51489 DRegister(last), 51490 spacing, 51491 lane), 51492 AlignedMemOperand(Register(rn), 51493 align, 51494 Offset)); 51495 break; 51496 } 51497 } 51498 break; 51499 } 51500 default: { 51501 if (((instr & 0xc00) == 0xc00) || 51502 ((instr & 0xd) == 0xd)) { 51503 UnallocatedA32(instr); 51504 return; 51505 } 51506 DataType dt = Dt_size_7_Decode((instr >> 10) & 0x3); 51507 if (dt.Is(kDataTypeValueInvalid)) { 51508 UnallocatedA32(instr); 51509 return; 51510 } 51511 DecodeNeonAndAlign decode_neon = 51512 Align_index_align_2_Decode((instr >> 4) & 0xf, 51513 dt); 51514 if (!decode_neon.IsValid()) { 51515 UnallocatedA32(instr); 51516 return; 51517 } 51518 Alignment align = decode_neon.GetAlign(); 51519 int lane = decode_neon.GetLane(); 51520 SpacingType spacing = decode_neon.GetSpacing(); 51521 unsigned first = ExtractDRegister(instr, 22, 12); 51522 unsigned length = 2; 51523 unsigned last = 51524 first + 51525 (length - 1) * (spacing == kSingle ? 1 : 2); 51526 unsigned rn = (instr >> 16) & 0xf; 51527 unsigned rm = instr & 0xf; 51528 // VST2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length) 51529 vst2(al, 51530 dt, 51531 NeonRegisterList(DRegister(first), 51532 DRegister(last), 51533 spacing, 51534 lane), 51535 AlignedMemOperand(Register(rn), 51536 align, 51537 Register(rm), 51538 PostIndex)); 51539 break; 51540 } 51541 } 51542 break; 51543 } 51544 } 51545 break; 51546 } 51547 case 0x00000200: { 51548 // 0xf4800200 51549 switch (instr & 0x00000c30) { 51550 case 0x00000010: { 51551 // 0xf4800210 51552 UnallocatedA32(instr); 51553 break; 51554 } 51555 case 0x00000030: { 51556 // 0xf4800230 51557 UnallocatedA32(instr); 51558 break; 51559 } 51560 case 0x00000410: { 51561 // 0xf4800610 51562 UnallocatedA32(instr); 51563 break; 51564 } 51565 case 0x00000430: { 51566 // 0xf4800630 51567 UnallocatedA32(instr); 51568 break; 51569 } 51570 case 0x00000810: { 51571 // 0xf4800a10 51572 UnallocatedA32(instr); 51573 break; 51574 } 51575 case 0x00000820: { 51576 // 0xf4800a20 51577 UnallocatedA32(instr); 51578 break; 51579 } 51580 case 0x00000830: { 51581 // 0xf4800a30 51582 UnallocatedA32(instr); 51583 break; 51584 } 51585 case 0x00000c00: { 51586 // 0xf4800e00 51587 UnallocatedA32(instr); 51588 break; 51589 } 51590 case 0x00000c10: { 51591 // 0xf4800e10 51592 UnallocatedA32(instr); 51593 break; 51594 } 51595 case 0x00000c20: { 51596 // 0xf4800e20 51597 UnallocatedA32(instr); 51598 break; 51599 } 51600 case 0x00000c30: { 51601 // 0xf4800e30 51602 UnallocatedA32(instr); 51603 break; 51604 } 51605 default: { 51606 switch (instr & 0x0000000d) { 51607 case 0x0000000d: { 51608 // 0xf480020d 51609 switch (instr & 0x00000002) { 51610 case 0x00000000: { 51611 // 0xf480020d 51612 if (((instr & 0xc00) == 0xc00) || 51613 ((instr & 0x810) == 0x10) || 51614 ((instr & 0xc30) == 0x810) || 51615 ((instr & 0xc30) == 0x820) || 51616 ((instr & 0xc30) == 0x830)) { 51617 UnallocatedA32(instr); 51618 return; 51619 } 51620 DataType dt = 51621 Dt_size_7_Decode((instr >> 10) & 0x3); 51622 if (dt.Is(kDataTypeValueInvalid)) { 51623 UnallocatedA32(instr); 51624 return; 51625 } 51626 DecodeNeon decode_neon = 51627 Index_1_Decode((instr >> 4) & 0xf, dt); 51628 if (!decode_neon.IsValid()) { 51629 UnallocatedA32(instr); 51630 return; 51631 } 51632 int lane = decode_neon.GetLane(); 51633 SpacingType spacing = decode_neon.GetSpacing(); 51634 unsigned first = 51635 ExtractDRegister(instr, 22, 12); 51636 unsigned length = 3; 51637 unsigned last = 51638 first + 51639 (length - 1) * (spacing == kSingle ? 1 : 2); 51640 unsigned rn = (instr >> 16) & 0xf; 51641 // VST3{<c>}{<q>}.<dt> <list>, [<Rn>]! ; A1 51642 vst3(al, 51643 dt, 51644 NeonRegisterList(DRegister(first), 51645 DRegister(last), 51646 spacing, 51647 lane), 51648 MemOperand(Register(rn), PostIndex)); 51649 break; 51650 } 51651 case 0x00000002: { 51652 // 0xf480020f 51653 if (((instr & 0xc00) == 0xc00) || 51654 ((instr & 0x810) == 0x10) || 51655 ((instr & 0xc30) == 0x810) || 51656 ((instr & 0xc30) == 0x820) || 51657 ((instr & 0xc30) == 0x830)) { 51658 UnallocatedA32(instr); 51659 return; 51660 } 51661 DataType dt = 51662 Dt_size_7_Decode((instr >> 10) & 0x3); 51663 if (dt.Is(kDataTypeValueInvalid)) { 51664 UnallocatedA32(instr); 51665 return; 51666 } 51667 DecodeNeon decode_neon = 51668 Index_1_Decode((instr >> 4) & 0xf, dt); 51669 if (!decode_neon.IsValid()) { 51670 UnallocatedA32(instr); 51671 return; 51672 } 51673 int lane = decode_neon.GetLane(); 51674 SpacingType spacing = decode_neon.GetSpacing(); 51675 unsigned first = 51676 ExtractDRegister(instr, 22, 12); 51677 unsigned length = 3; 51678 unsigned last = 51679 first + 51680 (length - 1) * (spacing == kSingle ? 1 : 2); 51681 unsigned rn = (instr >> 16) & 0xf; 51682 // VST3{<c>}{<q>}.<dt> <list>, [<Rn>] ; A1 51683 vst3(al, 51684 dt, 51685 NeonRegisterList(DRegister(first), 51686 DRegister(last), 51687 spacing, 51688 lane), 51689 MemOperand(Register(rn), Offset)); 51690 break; 51691 } 51692 } 51693 break; 51694 } 51695 default: { 51696 if (((instr & 0xc00) == 0xc00) || 51697 ((instr & 0xd) == 0xd) || 51698 ((instr & 0x810) == 0x10) || 51699 ((instr & 0xc30) == 0x810) || 51700 ((instr & 0xc30) == 0x820) || 51701 ((instr & 0xc30) == 0x830)) { 51702 UnallocatedA32(instr); 51703 return; 51704 } 51705 DataType dt = Dt_size_7_Decode((instr >> 10) & 0x3); 51706 if (dt.Is(kDataTypeValueInvalid)) { 51707 UnallocatedA32(instr); 51708 return; 51709 } 51710 DecodeNeon decode_neon = 51711 Index_1_Decode((instr >> 4) & 0xf, dt); 51712 if (!decode_neon.IsValid()) { 51713 UnallocatedA32(instr); 51714 return; 51715 } 51716 int lane = decode_neon.GetLane(); 51717 SpacingType spacing = decode_neon.GetSpacing(); 51718 unsigned first = ExtractDRegister(instr, 22, 12); 51719 unsigned length = 3; 51720 unsigned last = 51721 first + 51722 (length - 1) * (spacing == kSingle ? 1 : 2); 51723 unsigned rn = (instr >> 16) & 0xf; 51724 Sign sign(plus); 51725 unsigned rm = instr & 0xf; 51726 // VST3{<c>}{<q>}.<dt> <list>, [<Rn>], #<Rm> ; A1 51727 vst3(al, 51728 dt, 51729 NeonRegisterList(DRegister(first), 51730 DRegister(last), 51731 spacing, 51732 lane), 51733 MemOperand(Register(rn), 51734 sign, 51735 Register(rm), 51736 PostIndex)); 51737 break; 51738 } 51739 } 51740 break; 51741 } 51742 } 51743 break; 51744 } 51745 case 0x00000300: { 51746 // 0xf4800300 51747 switch (instr & 0x00000c00) { 51748 case 0x00000c00: { 51749 // 0xf4800f00 51750 UnallocatedA32(instr); 51751 break; 51752 } 51753 default: { 51754 switch (instr & 0x0000000d) { 51755 case 0x0000000d: { 51756 // 0xf480030d 51757 switch (instr & 0x00000002) { 51758 case 0x00000000: { 51759 // 0xf480030d 51760 if (((instr & 0xc00) == 0xc00)) { 51761 UnallocatedA32(instr); 51762 return; 51763 } 51764 DataType dt = 51765 Dt_size_7_Decode((instr >> 10) & 0x3); 51766 if (dt.Is(kDataTypeValueInvalid)) { 51767 UnallocatedA32(instr); 51768 return; 51769 } 51770 DecodeNeonAndAlign decode_neon = 51771 Align_index_align_3_Decode((instr >> 4) & 51772 0xf, 51773 dt); 51774 if (!decode_neon.IsValid()) { 51775 UnallocatedA32(instr); 51776 return; 51777 } 51778 Alignment align = decode_neon.GetAlign(); 51779 int lane = decode_neon.GetLane(); 51780 SpacingType spacing = decode_neon.GetSpacing(); 51781 unsigned first = 51782 ExtractDRegister(instr, 22, 12); 51783 unsigned length = 4; 51784 unsigned last = 51785 first + 51786 (length - 1) * (spacing == kSingle ? 1 : 2); 51787 unsigned rn = (instr >> 16) & 0xf; 51788 // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length) 51789 vst4(al, 51790 dt, 51791 NeonRegisterList(DRegister(first), 51792 DRegister(last), 51793 spacing, 51794 lane), 51795 AlignedMemOperand(Register(rn), 51796 align, 51797 PostIndex)); 51798 break; 51799 } 51800 case 0x00000002: { 51801 // 0xf480030f 51802 if (((instr & 0xc00) == 0xc00)) { 51803 UnallocatedA32(instr); 51804 return; 51805 } 51806 DataType dt = 51807 Dt_size_7_Decode((instr >> 10) & 0x3); 51808 if (dt.Is(kDataTypeValueInvalid)) { 51809 UnallocatedA32(instr); 51810 return; 51811 } 51812 DecodeNeonAndAlign decode_neon = 51813 Align_index_align_3_Decode((instr >> 4) & 51814 0xf, 51815 dt); 51816 if (!decode_neon.IsValid()) { 51817 UnallocatedA32(instr); 51818 return; 51819 } 51820 Alignment align = decode_neon.GetAlign(); 51821 int lane = decode_neon.GetLane(); 51822 SpacingType spacing = decode_neon.GetSpacing(); 51823 unsigned first = 51824 ExtractDRegister(instr, 22, 12); 51825 unsigned length = 4; 51826 unsigned last = 51827 first + 51828 (length - 1) * (spacing == kSingle ? 1 : 2); 51829 unsigned rn = (instr >> 16) & 0xf; 51830 // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1 NOLINT(whitespace/line_length) 51831 vst4(al, 51832 dt, 51833 NeonRegisterList(DRegister(first), 51834 DRegister(last), 51835 spacing, 51836 lane), 51837 AlignedMemOperand(Register(rn), 51838 align, 51839 Offset)); 51840 break; 51841 } 51842 } 51843 break; 51844 } 51845 default: { 51846 if (((instr & 0xc00) == 0xc00) || 51847 ((instr & 0xd) == 0xd)) { 51848 UnallocatedA32(instr); 51849 return; 51850 } 51851 DataType dt = Dt_size_7_Decode((instr >> 10) & 0x3); 51852 if (dt.Is(kDataTypeValueInvalid)) { 51853 UnallocatedA32(instr); 51854 return; 51855 } 51856 DecodeNeonAndAlign decode_neon = 51857 Align_index_align_3_Decode((instr >> 4) & 0xf, 51858 dt); 51859 if (!decode_neon.IsValid()) { 51860 UnallocatedA32(instr); 51861 return; 51862 } 51863 Alignment align = decode_neon.GetAlign(); 51864 int lane = decode_neon.GetLane(); 51865 SpacingType spacing = decode_neon.GetSpacing(); 51866 unsigned first = ExtractDRegister(instr, 22, 12); 51867 unsigned length = 4; 51868 unsigned last = 51869 first + 51870 (length - 1) * (spacing == kSingle ? 1 : 2); 51871 unsigned rn = (instr >> 16) & 0xf; 51872 unsigned rm = instr & 0xf; 51873 // VST4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length) 51874 vst4(al, 51875 dt, 51876 NeonRegisterList(DRegister(first), 51877 DRegister(last), 51878 spacing, 51879 lane), 51880 AlignedMemOperand(Register(rn), 51881 align, 51882 Register(rm), 51883 PostIndex)); 51884 break; 51885 } 51886 } 51887 break; 51888 } 51889 } 51890 break; 51891 } 51892 } 51893 break; 51894 } 51895 } 51896 break; 51897 } 51898 case 0x00100000: { 51899 // 0xf4100000 51900 switch (instr & 0x00400000) { 51901 case 0x00400000: { 51902 // 0xf4500000 51903 switch (instr & 0x000f0000) { 51904 case 0x000f0000: { 51905 // 0xf45f0000 51906 uint32_t U = (instr >> 23) & 0x1; 51907 int32_t imm = instr & 0xfff; 51908 if (U == 0) imm = -imm; 51909 bool minus_zero = (imm == 0) && (U == 0); 51910 Location location(imm, kA32PcDelta); 51911 // PLI{<c>}{<q>} <label> ; A1 51912 if (minus_zero) { 51913 pli(al, MemOperand(pc, minus, 0)); 51914 } else { 51915 pli(al, &location); 51916 } 51917 if (((instr & 0xff7ff000) != 0xf45ff000)) { 51918 UnpredictableA32(instr); 51919 } 51920 break; 51921 } 51922 default: { 51923 if (((instr & 0xf0000) == 0xf0000)) { 51924 UnallocatedA32(instr); 51925 return; 51926 } 51927 unsigned rn = (instr >> 16) & 0xf; 51928 Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus); 51929 int32_t offset = instr & 0xfff; 51930 // PLI{<c>}{<q>} [<Rn>{, #{+/-}<imm_3>}] ; A1 51931 pli(al, MemOperand(Register(rn), sign, offset, Offset)); 51932 if (((instr & 0xff70f000) != 0xf450f000)) { 51933 UnpredictableA32(instr); 51934 } 51935 break; 51936 } 51937 } 51938 break; 51939 } 51940 default: 51941 UnallocatedA32(instr); 51942 break; 51943 } 51944 break; 51945 } 51946 case 0x00200000: { 51947 // 0xf4200000 51948 switch (instr & 0x00800000) { 51949 case 0x00000000: { 51950 // 0xf4200000 51951 switch (instr & 0x0000000d) { 51952 case 0x0000000d: { 51953 // 0xf420000d 51954 switch (instr & 0x00000002) { 51955 case 0x00000000: { 51956 // 0xf420000d 51957 switch (instr & 0x00000f00) { 51958 case 0x00000000: { 51959 // 0xf420000d 51960 DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3); 51961 if (dt.Is(kDataTypeValueInvalid)) { 51962 UnallocatedA32(instr); 51963 return; 51964 } 51965 Alignment align = 51966 Align_align_4_Decode((instr >> 4) & 0x3); 51967 if (dt.Is(kDataTypeValueInvalid) || 51968 align.Is(kBadAlignment)) { 51969 UnallocatedA32(instr); 51970 return; 51971 } 51972 unsigned first = ExtractDRegister(instr, 22, 12); 51973 unsigned length; 51974 SpacingType spacing; 51975 switch ((instr >> 8) & 0xf) { 51976 default: 51977 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 51978 case 0x0: 51979 length = 4; 51980 spacing = kSingle; 51981 break; 51982 case 0x1: 51983 length = 4; 51984 spacing = kDouble; 51985 break; 51986 } 51987 unsigned last = 51988 first + 51989 (length - 1) * (spacing == kSingle ? 1 : 2); 51990 TransferType transfer = kMultipleLanes; 51991 unsigned rn = (instr >> 16) & 0xf; 51992 // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length) 51993 vld4(al, 51994 dt, 51995 NeonRegisterList(DRegister(first), 51996 DRegister(last), 51997 spacing, 51998 transfer), 51999 AlignedMemOperand(Register(rn), 52000 align, 52001 PostIndex)); 52002 break; 52003 } 52004 case 0x00000100: { 52005 // 0xf420010d 52006 DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3); 52007 if (dt.Is(kDataTypeValueInvalid)) { 52008 UnallocatedA32(instr); 52009 return; 52010 } 52011 Alignment align = 52012 Align_align_4_Decode((instr >> 4) & 0x3); 52013 if (dt.Is(kDataTypeValueInvalid) || 52014 align.Is(kBadAlignment)) { 52015 UnallocatedA32(instr); 52016 return; 52017 } 52018 unsigned first = ExtractDRegister(instr, 22, 12); 52019 unsigned length; 52020 SpacingType spacing; 52021 switch ((instr >> 8) & 0xf) { 52022 default: 52023 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 52024 case 0x0: 52025 length = 4; 52026 spacing = kSingle; 52027 break; 52028 case 0x1: 52029 length = 4; 52030 spacing = kDouble; 52031 break; 52032 } 52033 unsigned last = 52034 first + 52035 (length - 1) * (spacing == kSingle ? 1 : 2); 52036 TransferType transfer = kMultipleLanes; 52037 unsigned rn = (instr >> 16) & 0xf; 52038 // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length) 52039 vld4(al, 52040 dt, 52041 NeonRegisterList(DRegister(first), 52042 DRegister(last), 52043 spacing, 52044 transfer), 52045 AlignedMemOperand(Register(rn), 52046 align, 52047 PostIndex)); 52048 break; 52049 } 52050 case 0x00000200: { 52051 // 0xf420020d 52052 if (((instr & 0xe20) == 0x620) || 52053 ((instr & 0xf30) == 0xa30)) { 52054 UnallocatedA32(instr); 52055 return; 52056 } 52057 DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3); 52058 if (dt.Is(kDataTypeValueInvalid)) { 52059 UnallocatedA32(instr); 52060 return; 52061 } 52062 Alignment align = 52063 Align_align_1_Decode((instr >> 4) & 0x3); 52064 if (dt.Is(kDataTypeValueInvalid) || 52065 align.Is(kBadAlignment)) { 52066 UnallocatedA32(instr); 52067 return; 52068 } 52069 unsigned first = ExtractDRegister(instr, 22, 12); 52070 unsigned length; 52071 SpacingType spacing = kSingle; 52072 switch ((instr >> 8) & 0xf) { 52073 default: 52074 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 52075 case 0x7: 52076 length = 1; 52077 break; 52078 case 0xa: 52079 length = 2; 52080 break; 52081 case 0x6: 52082 length = 3; 52083 break; 52084 case 0x2: 52085 length = 4; 52086 break; 52087 } 52088 unsigned last = first + length - 1; 52089 TransferType transfer = kMultipleLanes; 52090 unsigned rn = (instr >> 16) & 0xf; 52091 // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length) 52092 vld1(al, 52093 dt, 52094 NeonRegisterList(DRegister(first), 52095 DRegister(last), 52096 spacing, 52097 transfer), 52098 AlignedMemOperand(Register(rn), 52099 align, 52100 PostIndex)); 52101 break; 52102 } 52103 case 0x00000300: { 52104 // 0xf420030d 52105 if (((instr & 0xe30) == 0x830)) { 52106 UnallocatedA32(instr); 52107 return; 52108 } 52109 DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3); 52110 if (dt.Is(kDataTypeValueInvalid)) { 52111 UnallocatedA32(instr); 52112 return; 52113 } 52114 Alignment align = 52115 Align_align_2_Decode((instr >> 4) & 0x3); 52116 if (dt.Is(kDataTypeValueInvalid) || 52117 align.Is(kBadAlignment)) { 52118 UnallocatedA32(instr); 52119 return; 52120 } 52121 unsigned first = ExtractDRegister(instr, 22, 12); 52122 unsigned length; 52123 SpacingType spacing; 52124 switch ((instr >> 8) & 0xf) { 52125 default: 52126 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 52127 case 0x8: 52128 length = 2; 52129 spacing = kSingle; 52130 break; 52131 case 0x9: 52132 length = 2; 52133 spacing = kDouble; 52134 break; 52135 case 0x3: 52136 length = 4; 52137 spacing = kSingle; 52138 break; 52139 } 52140 unsigned last = 52141 first + 52142 (length - 1) * (spacing == kSingle ? 1 : 2); 52143 TransferType transfer = kMultipleLanes; 52144 unsigned rn = (instr >> 16) & 0xf; 52145 // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length) 52146 vld2(al, 52147 dt, 52148 NeonRegisterList(DRegister(first), 52149 DRegister(last), 52150 spacing, 52151 transfer), 52152 AlignedMemOperand(Register(rn), 52153 align, 52154 PostIndex)); 52155 break; 52156 } 52157 case 0x00000400: { 52158 // 0xf420040d 52159 DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3); 52160 if (dt.Is(kDataTypeValueInvalid)) { 52161 UnallocatedA32(instr); 52162 return; 52163 } 52164 Alignment align = 52165 Align_align_3_Decode((instr >> 4) & 0x3); 52166 if (dt.Is(kDataTypeValueInvalid) || 52167 align.Is(kBadAlignment)) { 52168 UnallocatedA32(instr); 52169 return; 52170 } 52171 unsigned first = ExtractDRegister(instr, 22, 12); 52172 unsigned length; 52173 SpacingType spacing; 52174 switch ((instr >> 8) & 0xf) { 52175 default: 52176 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 52177 case 0x4: 52178 length = 3; 52179 spacing = kSingle; 52180 break; 52181 case 0x5: 52182 length = 3; 52183 spacing = kDouble; 52184 break; 52185 } 52186 unsigned last = 52187 first + 52188 (length - 1) * (spacing == kSingle ? 1 : 2); 52189 TransferType transfer = kMultipleLanes; 52190 unsigned rn = (instr >> 16) & 0xf; 52191 // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length) 52192 vld3(al, 52193 dt, 52194 NeonRegisterList(DRegister(first), 52195 DRegister(last), 52196 spacing, 52197 transfer), 52198 AlignedMemOperand(Register(rn), 52199 align, 52200 PostIndex)); 52201 break; 52202 } 52203 case 0x00000500: { 52204 // 0xf420050d 52205 DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3); 52206 if (dt.Is(kDataTypeValueInvalid)) { 52207 UnallocatedA32(instr); 52208 return; 52209 } 52210 Alignment align = 52211 Align_align_3_Decode((instr >> 4) & 0x3); 52212 if (dt.Is(kDataTypeValueInvalid) || 52213 align.Is(kBadAlignment)) { 52214 UnallocatedA32(instr); 52215 return; 52216 } 52217 unsigned first = ExtractDRegister(instr, 22, 12); 52218 unsigned length; 52219 SpacingType spacing; 52220 switch ((instr >> 8) & 0xf) { 52221 default: 52222 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 52223 case 0x4: 52224 length = 3; 52225 spacing = kSingle; 52226 break; 52227 case 0x5: 52228 length = 3; 52229 spacing = kDouble; 52230 break; 52231 } 52232 unsigned last = 52233 first + 52234 (length - 1) * (spacing == kSingle ? 1 : 2); 52235 TransferType transfer = kMultipleLanes; 52236 unsigned rn = (instr >> 16) & 0xf; 52237 // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length) 52238 vld3(al, 52239 dt, 52240 NeonRegisterList(DRegister(first), 52241 DRegister(last), 52242 spacing, 52243 transfer), 52244 AlignedMemOperand(Register(rn), 52245 align, 52246 PostIndex)); 52247 break; 52248 } 52249 case 0x00000600: { 52250 // 0xf420060d 52251 if (((instr & 0xe20) == 0x620) || 52252 ((instr & 0xf30) == 0xa30)) { 52253 UnallocatedA32(instr); 52254 return; 52255 } 52256 DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3); 52257 if (dt.Is(kDataTypeValueInvalid)) { 52258 UnallocatedA32(instr); 52259 return; 52260 } 52261 Alignment align = 52262 Align_align_1_Decode((instr >> 4) & 0x3); 52263 if (dt.Is(kDataTypeValueInvalid) || 52264 align.Is(kBadAlignment)) { 52265 UnallocatedA32(instr); 52266 return; 52267 } 52268 unsigned first = ExtractDRegister(instr, 22, 12); 52269 unsigned length; 52270 SpacingType spacing = kSingle; 52271 switch ((instr >> 8) & 0xf) { 52272 default: 52273 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 52274 case 0x7: 52275 length = 1; 52276 break; 52277 case 0xa: 52278 length = 2; 52279 break; 52280 case 0x6: 52281 length = 3; 52282 break; 52283 case 0x2: 52284 length = 4; 52285 break; 52286 } 52287 unsigned last = first + length - 1; 52288 TransferType transfer = kMultipleLanes; 52289 unsigned rn = (instr >> 16) & 0xf; 52290 // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length) 52291 vld1(al, 52292 dt, 52293 NeonRegisterList(DRegister(first), 52294 DRegister(last), 52295 spacing, 52296 transfer), 52297 AlignedMemOperand(Register(rn), 52298 align, 52299 PostIndex)); 52300 break; 52301 } 52302 case 0x00000700: { 52303 // 0xf420070d 52304 if (((instr & 0xe20) == 0x620) || 52305 ((instr & 0xf30) == 0xa30)) { 52306 UnallocatedA32(instr); 52307 return; 52308 } 52309 DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3); 52310 if (dt.Is(kDataTypeValueInvalid)) { 52311 UnallocatedA32(instr); 52312 return; 52313 } 52314 Alignment align = 52315 Align_align_1_Decode((instr >> 4) & 0x3); 52316 if (dt.Is(kDataTypeValueInvalid) || 52317 align.Is(kBadAlignment)) { 52318 UnallocatedA32(instr); 52319 return; 52320 } 52321 unsigned first = ExtractDRegister(instr, 22, 12); 52322 unsigned length; 52323 SpacingType spacing = kSingle; 52324 switch ((instr >> 8) & 0xf) { 52325 default: 52326 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 52327 case 0x7: 52328 length = 1; 52329 break; 52330 case 0xa: 52331 length = 2; 52332 break; 52333 case 0x6: 52334 length = 3; 52335 break; 52336 case 0x2: 52337 length = 4; 52338 break; 52339 } 52340 unsigned last = first + length - 1; 52341 TransferType transfer = kMultipleLanes; 52342 unsigned rn = (instr >> 16) & 0xf; 52343 // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length) 52344 vld1(al, 52345 dt, 52346 NeonRegisterList(DRegister(first), 52347 DRegister(last), 52348 spacing, 52349 transfer), 52350 AlignedMemOperand(Register(rn), 52351 align, 52352 PostIndex)); 52353 break; 52354 } 52355 case 0x00000800: { 52356 // 0xf420080d 52357 if (((instr & 0xe30) == 0x830)) { 52358 UnallocatedA32(instr); 52359 return; 52360 } 52361 DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3); 52362 if (dt.Is(kDataTypeValueInvalid)) { 52363 UnallocatedA32(instr); 52364 return; 52365 } 52366 Alignment align = 52367 Align_align_2_Decode((instr >> 4) & 0x3); 52368 if (dt.Is(kDataTypeValueInvalid) || 52369 align.Is(kBadAlignment)) { 52370 UnallocatedA32(instr); 52371 return; 52372 } 52373 unsigned first = ExtractDRegister(instr, 22, 12); 52374 unsigned length; 52375 SpacingType spacing; 52376 switch ((instr >> 8) & 0xf) { 52377 default: 52378 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 52379 case 0x8: 52380 length = 2; 52381 spacing = kSingle; 52382 break; 52383 case 0x9: 52384 length = 2; 52385 spacing = kDouble; 52386 break; 52387 case 0x3: 52388 length = 4; 52389 spacing = kSingle; 52390 break; 52391 } 52392 unsigned last = 52393 first + 52394 (length - 1) * (spacing == kSingle ? 1 : 2); 52395 TransferType transfer = kMultipleLanes; 52396 unsigned rn = (instr >> 16) & 0xf; 52397 // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length) 52398 vld2(al, 52399 dt, 52400 NeonRegisterList(DRegister(first), 52401 DRegister(last), 52402 spacing, 52403 transfer), 52404 AlignedMemOperand(Register(rn), 52405 align, 52406 PostIndex)); 52407 break; 52408 } 52409 case 0x00000900: { 52410 // 0xf420090d 52411 if (((instr & 0xe30) == 0x830)) { 52412 UnallocatedA32(instr); 52413 return; 52414 } 52415 DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3); 52416 if (dt.Is(kDataTypeValueInvalid)) { 52417 UnallocatedA32(instr); 52418 return; 52419 } 52420 Alignment align = 52421 Align_align_2_Decode((instr >> 4) & 0x3); 52422 if (dt.Is(kDataTypeValueInvalid) || 52423 align.Is(kBadAlignment)) { 52424 UnallocatedA32(instr); 52425 return; 52426 } 52427 unsigned first = ExtractDRegister(instr, 22, 12); 52428 unsigned length; 52429 SpacingType spacing; 52430 switch ((instr >> 8) & 0xf) { 52431 default: 52432 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 52433 case 0x8: 52434 length = 2; 52435 spacing = kSingle; 52436 break; 52437 case 0x9: 52438 length = 2; 52439 spacing = kDouble; 52440 break; 52441 case 0x3: 52442 length = 4; 52443 spacing = kSingle; 52444 break; 52445 } 52446 unsigned last = 52447 first + 52448 (length - 1) * (spacing == kSingle ? 1 : 2); 52449 TransferType transfer = kMultipleLanes; 52450 unsigned rn = (instr >> 16) & 0xf; 52451 // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length) 52452 vld2(al, 52453 dt, 52454 NeonRegisterList(DRegister(first), 52455 DRegister(last), 52456 spacing, 52457 transfer), 52458 AlignedMemOperand(Register(rn), 52459 align, 52460 PostIndex)); 52461 break; 52462 } 52463 case 0x00000a00: { 52464 // 0xf4200a0d 52465 if (((instr & 0xe20) == 0x620) || 52466 ((instr & 0xf30) == 0xa30)) { 52467 UnallocatedA32(instr); 52468 return; 52469 } 52470 DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3); 52471 if (dt.Is(kDataTypeValueInvalid)) { 52472 UnallocatedA32(instr); 52473 return; 52474 } 52475 Alignment align = 52476 Align_align_1_Decode((instr >> 4) & 0x3); 52477 if (dt.Is(kDataTypeValueInvalid) || 52478 align.Is(kBadAlignment)) { 52479 UnallocatedA32(instr); 52480 return; 52481 } 52482 unsigned first = ExtractDRegister(instr, 22, 12); 52483 unsigned length; 52484 SpacingType spacing = kSingle; 52485 switch ((instr >> 8) & 0xf) { 52486 default: 52487 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 52488 case 0x7: 52489 length = 1; 52490 break; 52491 case 0xa: 52492 length = 2; 52493 break; 52494 case 0x6: 52495 length = 3; 52496 break; 52497 case 0x2: 52498 length = 4; 52499 break; 52500 } 52501 unsigned last = first + length - 1; 52502 TransferType transfer = kMultipleLanes; 52503 unsigned rn = (instr >> 16) & 0xf; 52504 // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length) 52505 vld1(al, 52506 dt, 52507 NeonRegisterList(DRegister(first), 52508 DRegister(last), 52509 spacing, 52510 transfer), 52511 AlignedMemOperand(Register(rn), 52512 align, 52513 PostIndex)); 52514 break; 52515 } 52516 default: 52517 UnallocatedA32(instr); 52518 break; 52519 } 52520 break; 52521 } 52522 case 0x00000002: { 52523 // 0xf420000f 52524 switch (instr & 0x00000f00) { 52525 case 0x00000000: { 52526 // 0xf420000d 52527 DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3); 52528 if (dt.Is(kDataTypeValueInvalid)) { 52529 UnallocatedA32(instr); 52530 return; 52531 } 52532 Alignment align = 52533 Align_align_4_Decode((instr >> 4) & 0x3); 52534 if (dt.Is(kDataTypeValueInvalid) || 52535 align.Is(kBadAlignment)) { 52536 UnallocatedA32(instr); 52537 return; 52538 } 52539 unsigned first = ExtractDRegister(instr, 22, 12); 52540 unsigned length; 52541 SpacingType spacing; 52542 switch ((instr >> 8) & 0xf) { 52543 default: 52544 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 52545 case 0x0: 52546 length = 4; 52547 spacing = kSingle; 52548 break; 52549 case 0x1: 52550 length = 4; 52551 spacing = kDouble; 52552 break; 52553 } 52554 unsigned last = 52555 first + 52556 (length - 1) * (spacing == kSingle ? 1 : 2); 52557 TransferType transfer = kMultipleLanes; 52558 unsigned rn = (instr >> 16) & 0xf; 52559 // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1 52560 vld4(al, 52561 dt, 52562 NeonRegisterList(DRegister(first), 52563 DRegister(last), 52564 spacing, 52565 transfer), 52566 AlignedMemOperand(Register(rn), 52567 align, 52568 Offset)); 52569 break; 52570 } 52571 case 0x00000100: { 52572 // 0xf420010d 52573 DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3); 52574 if (dt.Is(kDataTypeValueInvalid)) { 52575 UnallocatedA32(instr); 52576 return; 52577 } 52578 Alignment align = 52579 Align_align_4_Decode((instr >> 4) & 0x3); 52580 if (dt.Is(kDataTypeValueInvalid) || 52581 align.Is(kBadAlignment)) { 52582 UnallocatedA32(instr); 52583 return; 52584 } 52585 unsigned first = ExtractDRegister(instr, 22, 12); 52586 unsigned length; 52587 SpacingType spacing; 52588 switch ((instr >> 8) & 0xf) { 52589 default: 52590 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 52591 case 0x0: 52592 length = 4; 52593 spacing = kSingle; 52594 break; 52595 case 0x1: 52596 length = 4; 52597 spacing = kDouble; 52598 break; 52599 } 52600 unsigned last = 52601 first + 52602 (length - 1) * (spacing == kSingle ? 1 : 2); 52603 TransferType transfer = kMultipleLanes; 52604 unsigned rn = (instr >> 16) & 0xf; 52605 // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1 52606 vld4(al, 52607 dt, 52608 NeonRegisterList(DRegister(first), 52609 DRegister(last), 52610 spacing, 52611 transfer), 52612 AlignedMemOperand(Register(rn), 52613 align, 52614 Offset)); 52615 break; 52616 } 52617 case 0x00000200: { 52618 // 0xf420020d 52619 if (((instr & 0xe20) == 0x620) || 52620 ((instr & 0xf30) == 0xa30)) { 52621 UnallocatedA32(instr); 52622 return; 52623 } 52624 DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3); 52625 if (dt.Is(kDataTypeValueInvalid)) { 52626 UnallocatedA32(instr); 52627 return; 52628 } 52629 Alignment align = 52630 Align_align_1_Decode((instr >> 4) & 0x3); 52631 if (dt.Is(kDataTypeValueInvalid) || 52632 align.Is(kBadAlignment)) { 52633 UnallocatedA32(instr); 52634 return; 52635 } 52636 unsigned first = ExtractDRegister(instr, 22, 12); 52637 unsigned length; 52638 SpacingType spacing = kSingle; 52639 switch ((instr >> 8) & 0xf) { 52640 default: 52641 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 52642 case 0x7: 52643 length = 1; 52644 break; 52645 case 0xa: 52646 length = 2; 52647 break; 52648 case 0x6: 52649 length = 3; 52650 break; 52651 case 0x2: 52652 length = 4; 52653 break; 52654 } 52655 unsigned last = first + length - 1; 52656 TransferType transfer = kMultipleLanes; 52657 unsigned rn = (instr >> 16) & 0xf; 52658 // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1 52659 vld1(al, 52660 dt, 52661 NeonRegisterList(DRegister(first), 52662 DRegister(last), 52663 spacing, 52664 transfer), 52665 AlignedMemOperand(Register(rn), 52666 align, 52667 Offset)); 52668 break; 52669 } 52670 case 0x00000300: { 52671 // 0xf420030d 52672 if (((instr & 0xe30) == 0x830)) { 52673 UnallocatedA32(instr); 52674 return; 52675 } 52676 DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3); 52677 if (dt.Is(kDataTypeValueInvalid)) { 52678 UnallocatedA32(instr); 52679 return; 52680 } 52681 Alignment align = 52682 Align_align_2_Decode((instr >> 4) & 0x3); 52683 if (dt.Is(kDataTypeValueInvalid) || 52684 align.Is(kBadAlignment)) { 52685 UnallocatedA32(instr); 52686 return; 52687 } 52688 unsigned first = ExtractDRegister(instr, 22, 12); 52689 unsigned length; 52690 SpacingType spacing; 52691 switch ((instr >> 8) & 0xf) { 52692 default: 52693 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 52694 case 0x8: 52695 length = 2; 52696 spacing = kSingle; 52697 break; 52698 case 0x9: 52699 length = 2; 52700 spacing = kDouble; 52701 break; 52702 case 0x3: 52703 length = 4; 52704 spacing = kSingle; 52705 break; 52706 } 52707 unsigned last = 52708 first + 52709 (length - 1) * (spacing == kSingle ? 1 : 2); 52710 TransferType transfer = kMultipleLanes; 52711 unsigned rn = (instr >> 16) & 0xf; 52712 // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1 52713 vld2(al, 52714 dt, 52715 NeonRegisterList(DRegister(first), 52716 DRegister(last), 52717 spacing, 52718 transfer), 52719 AlignedMemOperand(Register(rn), 52720 align, 52721 Offset)); 52722 break; 52723 } 52724 case 0x00000400: { 52725 // 0xf420040d 52726 DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3); 52727 if (dt.Is(kDataTypeValueInvalid)) { 52728 UnallocatedA32(instr); 52729 return; 52730 } 52731 Alignment align = 52732 Align_align_3_Decode((instr >> 4) & 0x3); 52733 if (dt.Is(kDataTypeValueInvalid) || 52734 align.Is(kBadAlignment)) { 52735 UnallocatedA32(instr); 52736 return; 52737 } 52738 unsigned first = ExtractDRegister(instr, 22, 12); 52739 unsigned length; 52740 SpacingType spacing; 52741 switch ((instr >> 8) & 0xf) { 52742 default: 52743 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 52744 case 0x4: 52745 length = 3; 52746 spacing = kSingle; 52747 break; 52748 case 0x5: 52749 length = 3; 52750 spacing = kDouble; 52751 break; 52752 } 52753 unsigned last = 52754 first + 52755 (length - 1) * (spacing == kSingle ? 1 : 2); 52756 TransferType transfer = kMultipleLanes; 52757 unsigned rn = (instr >> 16) & 0xf; 52758 // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1 52759 vld3(al, 52760 dt, 52761 NeonRegisterList(DRegister(first), 52762 DRegister(last), 52763 spacing, 52764 transfer), 52765 AlignedMemOperand(Register(rn), 52766 align, 52767 Offset)); 52768 break; 52769 } 52770 case 0x00000500: { 52771 // 0xf420050d 52772 DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3); 52773 if (dt.Is(kDataTypeValueInvalid)) { 52774 UnallocatedA32(instr); 52775 return; 52776 } 52777 Alignment align = 52778 Align_align_3_Decode((instr >> 4) & 0x3); 52779 if (dt.Is(kDataTypeValueInvalid) || 52780 align.Is(kBadAlignment)) { 52781 UnallocatedA32(instr); 52782 return; 52783 } 52784 unsigned first = ExtractDRegister(instr, 22, 12); 52785 unsigned length; 52786 SpacingType spacing; 52787 switch ((instr >> 8) & 0xf) { 52788 default: 52789 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 52790 case 0x4: 52791 length = 3; 52792 spacing = kSingle; 52793 break; 52794 case 0x5: 52795 length = 3; 52796 spacing = kDouble; 52797 break; 52798 } 52799 unsigned last = 52800 first + 52801 (length - 1) * (spacing == kSingle ? 1 : 2); 52802 TransferType transfer = kMultipleLanes; 52803 unsigned rn = (instr >> 16) & 0xf; 52804 // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1 52805 vld3(al, 52806 dt, 52807 NeonRegisterList(DRegister(first), 52808 DRegister(last), 52809 spacing, 52810 transfer), 52811 AlignedMemOperand(Register(rn), 52812 align, 52813 Offset)); 52814 break; 52815 } 52816 case 0x00000600: { 52817 // 0xf420060d 52818 if (((instr & 0xe20) == 0x620) || 52819 ((instr & 0xf30) == 0xa30)) { 52820 UnallocatedA32(instr); 52821 return; 52822 } 52823 DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3); 52824 if (dt.Is(kDataTypeValueInvalid)) { 52825 UnallocatedA32(instr); 52826 return; 52827 } 52828 Alignment align = 52829 Align_align_1_Decode((instr >> 4) & 0x3); 52830 if (dt.Is(kDataTypeValueInvalid) || 52831 align.Is(kBadAlignment)) { 52832 UnallocatedA32(instr); 52833 return; 52834 } 52835 unsigned first = ExtractDRegister(instr, 22, 12); 52836 unsigned length; 52837 SpacingType spacing = kSingle; 52838 switch ((instr >> 8) & 0xf) { 52839 default: 52840 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 52841 case 0x7: 52842 length = 1; 52843 break; 52844 case 0xa: 52845 length = 2; 52846 break; 52847 case 0x6: 52848 length = 3; 52849 break; 52850 case 0x2: 52851 length = 4; 52852 break; 52853 } 52854 unsigned last = first + length - 1; 52855 TransferType transfer = kMultipleLanes; 52856 unsigned rn = (instr >> 16) & 0xf; 52857 // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1 52858 vld1(al, 52859 dt, 52860 NeonRegisterList(DRegister(first), 52861 DRegister(last), 52862 spacing, 52863 transfer), 52864 AlignedMemOperand(Register(rn), 52865 align, 52866 Offset)); 52867 break; 52868 } 52869 case 0x00000700: { 52870 // 0xf420070d 52871 if (((instr & 0xe20) == 0x620) || 52872 ((instr & 0xf30) == 0xa30)) { 52873 UnallocatedA32(instr); 52874 return; 52875 } 52876 DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3); 52877 if (dt.Is(kDataTypeValueInvalid)) { 52878 UnallocatedA32(instr); 52879 return; 52880 } 52881 Alignment align = 52882 Align_align_1_Decode((instr >> 4) & 0x3); 52883 if (dt.Is(kDataTypeValueInvalid) || 52884 align.Is(kBadAlignment)) { 52885 UnallocatedA32(instr); 52886 return; 52887 } 52888 unsigned first = ExtractDRegister(instr, 22, 12); 52889 unsigned length; 52890 SpacingType spacing = kSingle; 52891 switch ((instr >> 8) & 0xf) { 52892 default: 52893 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 52894 case 0x7: 52895 length = 1; 52896 break; 52897 case 0xa: 52898 length = 2; 52899 break; 52900 case 0x6: 52901 length = 3; 52902 break; 52903 case 0x2: 52904 length = 4; 52905 break; 52906 } 52907 unsigned last = first + length - 1; 52908 TransferType transfer = kMultipleLanes; 52909 unsigned rn = (instr >> 16) & 0xf; 52910 // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1 52911 vld1(al, 52912 dt, 52913 NeonRegisterList(DRegister(first), 52914 DRegister(last), 52915 spacing, 52916 transfer), 52917 AlignedMemOperand(Register(rn), 52918 align, 52919 Offset)); 52920 break; 52921 } 52922 case 0x00000800: { 52923 // 0xf420080d 52924 if (((instr & 0xe30) == 0x830)) { 52925 UnallocatedA32(instr); 52926 return; 52927 } 52928 DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3); 52929 if (dt.Is(kDataTypeValueInvalid)) { 52930 UnallocatedA32(instr); 52931 return; 52932 } 52933 Alignment align = 52934 Align_align_2_Decode((instr >> 4) & 0x3); 52935 if (dt.Is(kDataTypeValueInvalid) || 52936 align.Is(kBadAlignment)) { 52937 UnallocatedA32(instr); 52938 return; 52939 } 52940 unsigned first = ExtractDRegister(instr, 22, 12); 52941 unsigned length; 52942 SpacingType spacing; 52943 switch ((instr >> 8) & 0xf) { 52944 default: 52945 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 52946 case 0x8: 52947 length = 2; 52948 spacing = kSingle; 52949 break; 52950 case 0x9: 52951 length = 2; 52952 spacing = kDouble; 52953 break; 52954 case 0x3: 52955 length = 4; 52956 spacing = kSingle; 52957 break; 52958 } 52959 unsigned last = 52960 first + 52961 (length - 1) * (spacing == kSingle ? 1 : 2); 52962 TransferType transfer = kMultipleLanes; 52963 unsigned rn = (instr >> 16) & 0xf; 52964 // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1 52965 vld2(al, 52966 dt, 52967 NeonRegisterList(DRegister(first), 52968 DRegister(last), 52969 spacing, 52970 transfer), 52971 AlignedMemOperand(Register(rn), 52972 align, 52973 Offset)); 52974 break; 52975 } 52976 case 0x00000900: { 52977 // 0xf420090d 52978 if (((instr & 0xe30) == 0x830)) { 52979 UnallocatedA32(instr); 52980 return; 52981 } 52982 DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3); 52983 if (dt.Is(kDataTypeValueInvalid)) { 52984 UnallocatedA32(instr); 52985 return; 52986 } 52987 Alignment align = 52988 Align_align_2_Decode((instr >> 4) & 0x3); 52989 if (dt.Is(kDataTypeValueInvalid) || 52990 align.Is(kBadAlignment)) { 52991 UnallocatedA32(instr); 52992 return; 52993 } 52994 unsigned first = ExtractDRegister(instr, 22, 12); 52995 unsigned length; 52996 SpacingType spacing; 52997 switch ((instr >> 8) & 0xf) { 52998 default: 52999 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 53000 case 0x8: 53001 length = 2; 53002 spacing = kSingle; 53003 break; 53004 case 0x9: 53005 length = 2; 53006 spacing = kDouble; 53007 break; 53008 case 0x3: 53009 length = 4; 53010 spacing = kSingle; 53011 break; 53012 } 53013 unsigned last = 53014 first + 53015 (length - 1) * (spacing == kSingle ? 1 : 2); 53016 TransferType transfer = kMultipleLanes; 53017 unsigned rn = (instr >> 16) & 0xf; 53018 // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1 53019 vld2(al, 53020 dt, 53021 NeonRegisterList(DRegister(first), 53022 DRegister(last), 53023 spacing, 53024 transfer), 53025 AlignedMemOperand(Register(rn), 53026 align, 53027 Offset)); 53028 break; 53029 } 53030 case 0x00000a00: { 53031 // 0xf4200a0d 53032 if (((instr & 0xe20) == 0x620) || 53033 ((instr & 0xf30) == 0xa30)) { 53034 UnallocatedA32(instr); 53035 return; 53036 } 53037 DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3); 53038 if (dt.Is(kDataTypeValueInvalid)) { 53039 UnallocatedA32(instr); 53040 return; 53041 } 53042 Alignment align = 53043 Align_align_1_Decode((instr >> 4) & 0x3); 53044 if (dt.Is(kDataTypeValueInvalid) || 53045 align.Is(kBadAlignment)) { 53046 UnallocatedA32(instr); 53047 return; 53048 } 53049 unsigned first = ExtractDRegister(instr, 22, 12); 53050 unsigned length; 53051 SpacingType spacing = kSingle; 53052 switch ((instr >> 8) & 0xf) { 53053 default: 53054 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 53055 case 0x7: 53056 length = 1; 53057 break; 53058 case 0xa: 53059 length = 2; 53060 break; 53061 case 0x6: 53062 length = 3; 53063 break; 53064 case 0x2: 53065 length = 4; 53066 break; 53067 } 53068 unsigned last = first + length - 1; 53069 TransferType transfer = kMultipleLanes; 53070 unsigned rn = (instr >> 16) & 0xf; 53071 // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1 53072 vld1(al, 53073 dt, 53074 NeonRegisterList(DRegister(first), 53075 DRegister(last), 53076 spacing, 53077 transfer), 53078 AlignedMemOperand(Register(rn), 53079 align, 53080 Offset)); 53081 break; 53082 } 53083 default: 53084 UnallocatedA32(instr); 53085 break; 53086 } 53087 break; 53088 } 53089 } 53090 break; 53091 } 53092 default: { 53093 switch (instr & 0x00000f00) { 53094 case 0x00000000: { 53095 // 0xf4200000 53096 if (((instr & 0xd) == 0xd)) { 53097 UnallocatedA32(instr); 53098 return; 53099 } 53100 DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3); 53101 if (dt.Is(kDataTypeValueInvalid)) { 53102 UnallocatedA32(instr); 53103 return; 53104 } 53105 Alignment align = 53106 Align_align_4_Decode((instr >> 4) & 0x3); 53107 if (dt.Is(kDataTypeValueInvalid) || 53108 align.Is(kBadAlignment)) { 53109 UnallocatedA32(instr); 53110 return; 53111 } 53112 unsigned first = ExtractDRegister(instr, 22, 12); 53113 unsigned length; 53114 SpacingType spacing; 53115 switch ((instr >> 8) & 0xf) { 53116 default: 53117 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 53118 case 0x0: 53119 length = 4; 53120 spacing = kSingle; 53121 break; 53122 case 0x1: 53123 length = 4; 53124 spacing = kDouble; 53125 break; 53126 } 53127 unsigned last = 53128 first + (length - 1) * (spacing == kSingle ? 1 : 2); 53129 TransferType transfer = kMultipleLanes; 53130 unsigned rn = (instr >> 16) & 0xf; 53131 unsigned rm = instr & 0xf; 53132 // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length) 53133 vld4(al, 53134 dt, 53135 NeonRegisterList(DRegister(first), 53136 DRegister(last), 53137 spacing, 53138 transfer), 53139 AlignedMemOperand(Register(rn), 53140 align, 53141 Register(rm), 53142 PostIndex)); 53143 break; 53144 } 53145 case 0x00000100: { 53146 // 0xf4200100 53147 if (((instr & 0xd) == 0xd)) { 53148 UnallocatedA32(instr); 53149 return; 53150 } 53151 DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3); 53152 if (dt.Is(kDataTypeValueInvalid)) { 53153 UnallocatedA32(instr); 53154 return; 53155 } 53156 Alignment align = 53157 Align_align_4_Decode((instr >> 4) & 0x3); 53158 if (dt.Is(kDataTypeValueInvalid) || 53159 align.Is(kBadAlignment)) { 53160 UnallocatedA32(instr); 53161 return; 53162 } 53163 unsigned first = ExtractDRegister(instr, 22, 12); 53164 unsigned length; 53165 SpacingType spacing; 53166 switch ((instr >> 8) & 0xf) { 53167 default: 53168 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 53169 case 0x0: 53170 length = 4; 53171 spacing = kSingle; 53172 break; 53173 case 0x1: 53174 length = 4; 53175 spacing = kDouble; 53176 break; 53177 } 53178 unsigned last = 53179 first + (length - 1) * (spacing == kSingle ? 1 : 2); 53180 TransferType transfer = kMultipleLanes; 53181 unsigned rn = (instr >> 16) & 0xf; 53182 unsigned rm = instr & 0xf; 53183 // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length) 53184 vld4(al, 53185 dt, 53186 NeonRegisterList(DRegister(first), 53187 DRegister(last), 53188 spacing, 53189 transfer), 53190 AlignedMemOperand(Register(rn), 53191 align, 53192 Register(rm), 53193 PostIndex)); 53194 break; 53195 } 53196 case 0x00000200: { 53197 // 0xf4200200 53198 if (((instr & 0xd) == 0xd) || 53199 ((instr & 0xe20) == 0x620) || 53200 ((instr & 0xf30) == 0xa30)) { 53201 UnallocatedA32(instr); 53202 return; 53203 } 53204 DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3); 53205 if (dt.Is(kDataTypeValueInvalid)) { 53206 UnallocatedA32(instr); 53207 return; 53208 } 53209 Alignment align = 53210 Align_align_1_Decode((instr >> 4) & 0x3); 53211 if (dt.Is(kDataTypeValueInvalid) || 53212 align.Is(kBadAlignment)) { 53213 UnallocatedA32(instr); 53214 return; 53215 } 53216 unsigned first = ExtractDRegister(instr, 22, 12); 53217 unsigned length; 53218 SpacingType spacing = kSingle; 53219 switch ((instr >> 8) & 0xf) { 53220 default: 53221 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 53222 case 0x7: 53223 length = 1; 53224 break; 53225 case 0xa: 53226 length = 2; 53227 break; 53228 case 0x6: 53229 length = 3; 53230 break; 53231 case 0x2: 53232 length = 4; 53233 break; 53234 } 53235 unsigned last = first + length - 1; 53236 TransferType transfer = kMultipleLanes; 53237 unsigned rn = (instr >> 16) & 0xf; 53238 unsigned rm = instr & 0xf; 53239 // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length) 53240 vld1(al, 53241 dt, 53242 NeonRegisterList(DRegister(first), 53243 DRegister(last), 53244 spacing, 53245 transfer), 53246 AlignedMemOperand(Register(rn), 53247 align, 53248 Register(rm), 53249 PostIndex)); 53250 break; 53251 } 53252 case 0x00000300: { 53253 // 0xf4200300 53254 if (((instr & 0xd) == 0xd) || 53255 ((instr & 0xe30) == 0x830)) { 53256 UnallocatedA32(instr); 53257 return; 53258 } 53259 DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3); 53260 if (dt.Is(kDataTypeValueInvalid)) { 53261 UnallocatedA32(instr); 53262 return; 53263 } 53264 Alignment align = 53265 Align_align_2_Decode((instr >> 4) & 0x3); 53266 if (dt.Is(kDataTypeValueInvalid) || 53267 align.Is(kBadAlignment)) { 53268 UnallocatedA32(instr); 53269 return; 53270 } 53271 unsigned first = ExtractDRegister(instr, 22, 12); 53272 unsigned length; 53273 SpacingType spacing; 53274 switch ((instr >> 8) & 0xf) { 53275 default: 53276 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 53277 case 0x8: 53278 length = 2; 53279 spacing = kSingle; 53280 break; 53281 case 0x9: 53282 length = 2; 53283 spacing = kDouble; 53284 break; 53285 case 0x3: 53286 length = 4; 53287 spacing = kSingle; 53288 break; 53289 } 53290 unsigned last = 53291 first + (length - 1) * (spacing == kSingle ? 1 : 2); 53292 TransferType transfer = kMultipleLanes; 53293 unsigned rn = (instr >> 16) & 0xf; 53294 unsigned rm = instr & 0xf; 53295 // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length) 53296 vld2(al, 53297 dt, 53298 NeonRegisterList(DRegister(first), 53299 DRegister(last), 53300 spacing, 53301 transfer), 53302 AlignedMemOperand(Register(rn), 53303 align, 53304 Register(rm), 53305 PostIndex)); 53306 break; 53307 } 53308 case 0x00000400: { 53309 // 0xf4200400 53310 if (((instr & 0xd) == 0xd)) { 53311 UnallocatedA32(instr); 53312 return; 53313 } 53314 DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3); 53315 if (dt.Is(kDataTypeValueInvalid)) { 53316 UnallocatedA32(instr); 53317 return; 53318 } 53319 Alignment align = 53320 Align_align_3_Decode((instr >> 4) & 0x3); 53321 if (dt.Is(kDataTypeValueInvalid) || 53322 align.Is(kBadAlignment)) { 53323 UnallocatedA32(instr); 53324 return; 53325 } 53326 unsigned first = ExtractDRegister(instr, 22, 12); 53327 unsigned length; 53328 SpacingType spacing; 53329 switch ((instr >> 8) & 0xf) { 53330 default: 53331 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 53332 case 0x4: 53333 length = 3; 53334 spacing = kSingle; 53335 break; 53336 case 0x5: 53337 length = 3; 53338 spacing = kDouble; 53339 break; 53340 } 53341 unsigned last = 53342 first + (length - 1) * (spacing == kSingle ? 1 : 2); 53343 TransferType transfer = kMultipleLanes; 53344 unsigned rn = (instr >> 16) & 0xf; 53345 unsigned rm = instr & 0xf; 53346 // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length) 53347 vld3(al, 53348 dt, 53349 NeonRegisterList(DRegister(first), 53350 DRegister(last), 53351 spacing, 53352 transfer), 53353 AlignedMemOperand(Register(rn), 53354 align, 53355 Register(rm), 53356 PostIndex)); 53357 break; 53358 } 53359 case 0x00000500: { 53360 // 0xf4200500 53361 if (((instr & 0xd) == 0xd)) { 53362 UnallocatedA32(instr); 53363 return; 53364 } 53365 DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3); 53366 if (dt.Is(kDataTypeValueInvalid)) { 53367 UnallocatedA32(instr); 53368 return; 53369 } 53370 Alignment align = 53371 Align_align_3_Decode((instr >> 4) & 0x3); 53372 if (dt.Is(kDataTypeValueInvalid) || 53373 align.Is(kBadAlignment)) { 53374 UnallocatedA32(instr); 53375 return; 53376 } 53377 unsigned first = ExtractDRegister(instr, 22, 12); 53378 unsigned length; 53379 SpacingType spacing; 53380 switch ((instr >> 8) & 0xf) { 53381 default: 53382 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 53383 case 0x4: 53384 length = 3; 53385 spacing = kSingle; 53386 break; 53387 case 0x5: 53388 length = 3; 53389 spacing = kDouble; 53390 break; 53391 } 53392 unsigned last = 53393 first + (length - 1) * (spacing == kSingle ? 1 : 2); 53394 TransferType transfer = kMultipleLanes; 53395 unsigned rn = (instr >> 16) & 0xf; 53396 unsigned rm = instr & 0xf; 53397 // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length) 53398 vld3(al, 53399 dt, 53400 NeonRegisterList(DRegister(first), 53401 DRegister(last), 53402 spacing, 53403 transfer), 53404 AlignedMemOperand(Register(rn), 53405 align, 53406 Register(rm), 53407 PostIndex)); 53408 break; 53409 } 53410 case 0x00000600: { 53411 // 0xf4200600 53412 if (((instr & 0xd) == 0xd) || 53413 ((instr & 0xe20) == 0x620) || 53414 ((instr & 0xf30) == 0xa30)) { 53415 UnallocatedA32(instr); 53416 return; 53417 } 53418 DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3); 53419 if (dt.Is(kDataTypeValueInvalid)) { 53420 UnallocatedA32(instr); 53421 return; 53422 } 53423 Alignment align = 53424 Align_align_1_Decode((instr >> 4) & 0x3); 53425 if (dt.Is(kDataTypeValueInvalid) || 53426 align.Is(kBadAlignment)) { 53427 UnallocatedA32(instr); 53428 return; 53429 } 53430 unsigned first = ExtractDRegister(instr, 22, 12); 53431 unsigned length; 53432 SpacingType spacing = kSingle; 53433 switch ((instr >> 8) & 0xf) { 53434 default: 53435 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 53436 case 0x7: 53437 length = 1; 53438 break; 53439 case 0xa: 53440 length = 2; 53441 break; 53442 case 0x6: 53443 length = 3; 53444 break; 53445 case 0x2: 53446 length = 4; 53447 break; 53448 } 53449 unsigned last = first + length - 1; 53450 TransferType transfer = kMultipleLanes; 53451 unsigned rn = (instr >> 16) & 0xf; 53452 unsigned rm = instr & 0xf; 53453 // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length) 53454 vld1(al, 53455 dt, 53456 NeonRegisterList(DRegister(first), 53457 DRegister(last), 53458 spacing, 53459 transfer), 53460 AlignedMemOperand(Register(rn), 53461 align, 53462 Register(rm), 53463 PostIndex)); 53464 break; 53465 } 53466 case 0x00000700: { 53467 // 0xf4200700 53468 if (((instr & 0xd) == 0xd) || 53469 ((instr & 0xe20) == 0x620) || 53470 ((instr & 0xf30) == 0xa30)) { 53471 UnallocatedA32(instr); 53472 return; 53473 } 53474 DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3); 53475 if (dt.Is(kDataTypeValueInvalid)) { 53476 UnallocatedA32(instr); 53477 return; 53478 } 53479 Alignment align = 53480 Align_align_1_Decode((instr >> 4) & 0x3); 53481 if (dt.Is(kDataTypeValueInvalid) || 53482 align.Is(kBadAlignment)) { 53483 UnallocatedA32(instr); 53484 return; 53485 } 53486 unsigned first = ExtractDRegister(instr, 22, 12); 53487 unsigned length; 53488 SpacingType spacing = kSingle; 53489 switch ((instr >> 8) & 0xf) { 53490 default: 53491 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 53492 case 0x7: 53493 length = 1; 53494 break; 53495 case 0xa: 53496 length = 2; 53497 break; 53498 case 0x6: 53499 length = 3; 53500 break; 53501 case 0x2: 53502 length = 4; 53503 break; 53504 } 53505 unsigned last = first + length - 1; 53506 TransferType transfer = kMultipleLanes; 53507 unsigned rn = (instr >> 16) & 0xf; 53508 unsigned rm = instr & 0xf; 53509 // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length) 53510 vld1(al, 53511 dt, 53512 NeonRegisterList(DRegister(first), 53513 DRegister(last), 53514 spacing, 53515 transfer), 53516 AlignedMemOperand(Register(rn), 53517 align, 53518 Register(rm), 53519 PostIndex)); 53520 break; 53521 } 53522 case 0x00000800: { 53523 // 0xf4200800 53524 if (((instr & 0xd) == 0xd) || 53525 ((instr & 0xe30) == 0x830)) { 53526 UnallocatedA32(instr); 53527 return; 53528 } 53529 DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3); 53530 if (dt.Is(kDataTypeValueInvalid)) { 53531 UnallocatedA32(instr); 53532 return; 53533 } 53534 Alignment align = 53535 Align_align_2_Decode((instr >> 4) & 0x3); 53536 if (dt.Is(kDataTypeValueInvalid) || 53537 align.Is(kBadAlignment)) { 53538 UnallocatedA32(instr); 53539 return; 53540 } 53541 unsigned first = ExtractDRegister(instr, 22, 12); 53542 unsigned length; 53543 SpacingType spacing; 53544 switch ((instr >> 8) & 0xf) { 53545 default: 53546 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 53547 case 0x8: 53548 length = 2; 53549 spacing = kSingle; 53550 break; 53551 case 0x9: 53552 length = 2; 53553 spacing = kDouble; 53554 break; 53555 case 0x3: 53556 length = 4; 53557 spacing = kSingle; 53558 break; 53559 } 53560 unsigned last = 53561 first + (length - 1) * (spacing == kSingle ? 1 : 2); 53562 TransferType transfer = kMultipleLanes; 53563 unsigned rn = (instr >> 16) & 0xf; 53564 unsigned rm = instr & 0xf; 53565 // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length) 53566 vld2(al, 53567 dt, 53568 NeonRegisterList(DRegister(first), 53569 DRegister(last), 53570 spacing, 53571 transfer), 53572 AlignedMemOperand(Register(rn), 53573 align, 53574 Register(rm), 53575 PostIndex)); 53576 break; 53577 } 53578 case 0x00000900: { 53579 // 0xf4200900 53580 if (((instr & 0xd) == 0xd) || 53581 ((instr & 0xe30) == 0x830)) { 53582 UnallocatedA32(instr); 53583 return; 53584 } 53585 DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3); 53586 if (dt.Is(kDataTypeValueInvalid)) { 53587 UnallocatedA32(instr); 53588 return; 53589 } 53590 Alignment align = 53591 Align_align_2_Decode((instr >> 4) & 0x3); 53592 if (dt.Is(kDataTypeValueInvalid) || 53593 align.Is(kBadAlignment)) { 53594 UnallocatedA32(instr); 53595 return; 53596 } 53597 unsigned first = ExtractDRegister(instr, 22, 12); 53598 unsigned length; 53599 SpacingType spacing; 53600 switch ((instr >> 8) & 0xf) { 53601 default: 53602 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 53603 case 0x8: 53604 length = 2; 53605 spacing = kSingle; 53606 break; 53607 case 0x9: 53608 length = 2; 53609 spacing = kDouble; 53610 break; 53611 case 0x3: 53612 length = 4; 53613 spacing = kSingle; 53614 break; 53615 } 53616 unsigned last = 53617 first + (length - 1) * (spacing == kSingle ? 1 : 2); 53618 TransferType transfer = kMultipleLanes; 53619 unsigned rn = (instr >> 16) & 0xf; 53620 unsigned rm = instr & 0xf; 53621 // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length) 53622 vld2(al, 53623 dt, 53624 NeonRegisterList(DRegister(first), 53625 DRegister(last), 53626 spacing, 53627 transfer), 53628 AlignedMemOperand(Register(rn), 53629 align, 53630 Register(rm), 53631 PostIndex)); 53632 break; 53633 } 53634 case 0x00000a00: { 53635 // 0xf4200a00 53636 if (((instr & 0xd) == 0xd) || 53637 ((instr & 0xe20) == 0x620) || 53638 ((instr & 0xf30) == 0xa30)) { 53639 UnallocatedA32(instr); 53640 return; 53641 } 53642 DataType dt = Dt_size_6_Decode((instr >> 6) & 0x3); 53643 if (dt.Is(kDataTypeValueInvalid)) { 53644 UnallocatedA32(instr); 53645 return; 53646 } 53647 Alignment align = 53648 Align_align_1_Decode((instr >> 4) & 0x3); 53649 if (dt.Is(kDataTypeValueInvalid) || 53650 align.Is(kBadAlignment)) { 53651 UnallocatedA32(instr); 53652 return; 53653 } 53654 unsigned first = ExtractDRegister(instr, 22, 12); 53655 unsigned length; 53656 SpacingType spacing = kSingle; 53657 switch ((instr >> 8) & 0xf) { 53658 default: 53659 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 53660 case 0x7: 53661 length = 1; 53662 break; 53663 case 0xa: 53664 length = 2; 53665 break; 53666 case 0x6: 53667 length = 3; 53668 break; 53669 case 0x2: 53670 length = 4; 53671 break; 53672 } 53673 unsigned last = first + length - 1; 53674 TransferType transfer = kMultipleLanes; 53675 unsigned rn = (instr >> 16) & 0xf; 53676 unsigned rm = instr & 0xf; 53677 // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length) 53678 vld1(al, 53679 dt, 53680 NeonRegisterList(DRegister(first), 53681 DRegister(last), 53682 spacing, 53683 transfer), 53684 AlignedMemOperand(Register(rn), 53685 align, 53686 Register(rm), 53687 PostIndex)); 53688 break; 53689 } 53690 default: 53691 UnallocatedA32(instr); 53692 break; 53693 } 53694 break; 53695 } 53696 } 53697 break; 53698 } 53699 case 0x00800000: { 53700 // 0xf4a00000 53701 switch (instr & 0x00000300) { 53702 case 0x00000000: { 53703 // 0xf4a00000 53704 switch (instr & 0x00000c00) { 53705 case 0x00000c00: { 53706 // 0xf4a00c00 53707 switch (instr & 0x0000000d) { 53708 case 0x0000000d: { 53709 // 0xf4a00c0d 53710 switch (instr & 0x00000002) { 53711 case 0x00000000: { 53712 // 0xf4a00c0d 53713 DataType dt = 53714 Dt_size_7_Decode((instr >> 6) & 0x3); 53715 if (dt.Is(kDataTypeValueInvalid)) { 53716 UnallocatedA32(instr); 53717 return; 53718 } 53719 Alignment align = 53720 Align_a_1_Decode((instr >> 4) & 0x1, dt); 53721 if (dt.Is(kDataTypeValueInvalid) || 53722 align.Is(kBadAlignment)) { 53723 UnallocatedA32(instr); 53724 return; 53725 } 53726 unsigned first = 53727 ExtractDRegister(instr, 22, 12); 53728 unsigned length; 53729 SpacingType spacing = kSingle; 53730 switch ((instr >> 5) & 0x1) { 53731 default: 53732 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 53733 case 0x0: 53734 length = 1; 53735 break; 53736 case 0x1: 53737 length = 2; 53738 break; 53739 } 53740 unsigned last = first + length - 1; 53741 TransferType transfer = kAllLanes; 53742 unsigned rn = (instr >> 16) & 0xf; 53743 // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length) 53744 vld1(al, 53745 dt, 53746 NeonRegisterList(DRegister(first), 53747 DRegister(last), 53748 spacing, 53749 transfer), 53750 AlignedMemOperand(Register(rn), 53751 align, 53752 PostIndex)); 53753 break; 53754 } 53755 case 0x00000002: { 53756 // 0xf4a00c0f 53757 DataType dt = 53758 Dt_size_7_Decode((instr >> 6) & 0x3); 53759 if (dt.Is(kDataTypeValueInvalid)) { 53760 UnallocatedA32(instr); 53761 return; 53762 } 53763 Alignment align = 53764 Align_a_1_Decode((instr >> 4) & 0x1, dt); 53765 if (dt.Is(kDataTypeValueInvalid) || 53766 align.Is(kBadAlignment)) { 53767 UnallocatedA32(instr); 53768 return; 53769 } 53770 unsigned first = 53771 ExtractDRegister(instr, 22, 12); 53772 unsigned length; 53773 SpacingType spacing = kSingle; 53774 switch ((instr >> 5) & 0x1) { 53775 default: 53776 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 53777 case 0x0: 53778 length = 1; 53779 break; 53780 case 0x1: 53781 length = 2; 53782 break; 53783 } 53784 unsigned last = first + length - 1; 53785 TransferType transfer = kAllLanes; 53786 unsigned rn = (instr >> 16) & 0xf; 53787 // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1 NOLINT(whitespace/line_length) 53788 vld1(al, 53789 dt, 53790 NeonRegisterList(DRegister(first), 53791 DRegister(last), 53792 spacing, 53793 transfer), 53794 AlignedMemOperand(Register(rn), 53795 align, 53796 Offset)); 53797 break; 53798 } 53799 } 53800 break; 53801 } 53802 default: { 53803 if (((instr & 0xd) == 0xd)) { 53804 UnallocatedA32(instr); 53805 return; 53806 } 53807 DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3); 53808 if (dt.Is(kDataTypeValueInvalid)) { 53809 UnallocatedA32(instr); 53810 return; 53811 } 53812 Alignment align = 53813 Align_a_1_Decode((instr >> 4) & 0x1, dt); 53814 if (dt.Is(kDataTypeValueInvalid) || 53815 align.Is(kBadAlignment)) { 53816 UnallocatedA32(instr); 53817 return; 53818 } 53819 unsigned first = ExtractDRegister(instr, 22, 12); 53820 unsigned length; 53821 SpacingType spacing = kSingle; 53822 switch ((instr >> 5) & 0x1) { 53823 default: 53824 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 53825 case 0x0: 53826 length = 1; 53827 break; 53828 case 0x1: 53829 length = 2; 53830 break; 53831 } 53832 unsigned last = first + length - 1; 53833 TransferType transfer = kAllLanes; 53834 unsigned rn = (instr >> 16) & 0xf; 53835 unsigned rm = instr & 0xf; 53836 // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length) 53837 vld1(al, 53838 dt, 53839 NeonRegisterList(DRegister(first), 53840 DRegister(last), 53841 spacing, 53842 transfer), 53843 AlignedMemOperand(Register(rn), 53844 align, 53845 Register(rm), 53846 PostIndex)); 53847 break; 53848 } 53849 } 53850 break; 53851 } 53852 default: { 53853 switch (instr & 0x0000000d) { 53854 case 0x0000000d: { 53855 // 0xf4a0000d 53856 switch (instr & 0x00000002) { 53857 case 0x00000000: { 53858 // 0xf4a0000d 53859 if (((instr & 0xc00) == 0xc00)) { 53860 UnallocatedA32(instr); 53861 return; 53862 } 53863 DataType dt = 53864 Dt_size_7_Decode((instr >> 10) & 0x3); 53865 if (dt.Is(kDataTypeValueInvalid)) { 53866 UnallocatedA32(instr); 53867 return; 53868 } 53869 DecodeNeonAndAlign decode_neon = 53870 Align_index_align_1_Decode((instr >> 4) & 53871 0xf, 53872 dt); 53873 if (!decode_neon.IsValid()) { 53874 UnallocatedA32(instr); 53875 return; 53876 } 53877 Alignment align = decode_neon.GetAlign(); 53878 int lane = decode_neon.GetLane(); 53879 SpacingType spacing = decode_neon.GetSpacing(); 53880 unsigned first = 53881 ExtractDRegister(instr, 22, 12); 53882 unsigned length = 1; 53883 unsigned last = first + length - 1; 53884 unsigned rn = (instr >> 16) & 0xf; 53885 // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length) 53886 vld1(al, 53887 dt, 53888 NeonRegisterList(DRegister(first), 53889 DRegister(last), 53890 spacing, 53891 lane), 53892 AlignedMemOperand(Register(rn), 53893 align, 53894 PostIndex)); 53895 break; 53896 } 53897 case 0x00000002: { 53898 // 0xf4a0000f 53899 if (((instr & 0xc00) == 0xc00)) { 53900 UnallocatedA32(instr); 53901 return; 53902 } 53903 DataType dt = 53904 Dt_size_7_Decode((instr >> 10) & 0x3); 53905 if (dt.Is(kDataTypeValueInvalid)) { 53906 UnallocatedA32(instr); 53907 return; 53908 } 53909 DecodeNeonAndAlign decode_neon = 53910 Align_index_align_1_Decode((instr >> 4) & 53911 0xf, 53912 dt); 53913 if (!decode_neon.IsValid()) { 53914 UnallocatedA32(instr); 53915 return; 53916 } 53917 Alignment align = decode_neon.GetAlign(); 53918 int lane = decode_neon.GetLane(); 53919 SpacingType spacing = decode_neon.GetSpacing(); 53920 unsigned first = 53921 ExtractDRegister(instr, 22, 12); 53922 unsigned length = 1; 53923 unsigned last = first + length - 1; 53924 unsigned rn = (instr >> 16) & 0xf; 53925 // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1 NOLINT(whitespace/line_length) 53926 vld1(al, 53927 dt, 53928 NeonRegisterList(DRegister(first), 53929 DRegister(last), 53930 spacing, 53931 lane), 53932 AlignedMemOperand(Register(rn), 53933 align, 53934 Offset)); 53935 break; 53936 } 53937 } 53938 break; 53939 } 53940 default: { 53941 if (((instr & 0xc00) == 0xc00) || 53942 ((instr & 0xd) == 0xd)) { 53943 UnallocatedA32(instr); 53944 return; 53945 } 53946 DataType dt = Dt_size_7_Decode((instr >> 10) & 0x3); 53947 if (dt.Is(kDataTypeValueInvalid)) { 53948 UnallocatedA32(instr); 53949 return; 53950 } 53951 DecodeNeonAndAlign decode_neon = 53952 Align_index_align_1_Decode((instr >> 4) & 0xf, 53953 dt); 53954 if (!decode_neon.IsValid()) { 53955 UnallocatedA32(instr); 53956 return; 53957 } 53958 Alignment align = decode_neon.GetAlign(); 53959 int lane = decode_neon.GetLane(); 53960 SpacingType spacing = decode_neon.GetSpacing(); 53961 unsigned first = ExtractDRegister(instr, 22, 12); 53962 unsigned length = 1; 53963 unsigned last = first + length - 1; 53964 unsigned rn = (instr >> 16) & 0xf; 53965 unsigned rm = instr & 0xf; 53966 // VLD1{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length) 53967 vld1(al, 53968 dt, 53969 NeonRegisterList(DRegister(first), 53970 DRegister(last), 53971 spacing, 53972 lane), 53973 AlignedMemOperand(Register(rn), 53974 align, 53975 Register(rm), 53976 PostIndex)); 53977 break; 53978 } 53979 } 53980 break; 53981 } 53982 } 53983 break; 53984 } 53985 case 0x00000100: { 53986 // 0xf4a00100 53987 switch (instr & 0x00000c00) { 53988 case 0x00000c00: { 53989 // 0xf4a00d00 53990 switch (instr & 0x0000000d) { 53991 case 0x0000000d: { 53992 // 0xf4a00d0d 53993 switch (instr & 0x00000002) { 53994 case 0x00000000: { 53995 // 0xf4a00d0d 53996 DataType dt = 53997 Dt_size_7_Decode((instr >> 6) & 0x3); 53998 if (dt.Is(kDataTypeValueInvalid)) { 53999 UnallocatedA32(instr); 54000 return; 54001 } 54002 Alignment align = 54003 Align_a_2_Decode((instr >> 4) & 0x1, dt); 54004 if (dt.Is(kDataTypeValueInvalid) || 54005 align.Is(kBadAlignment)) { 54006 UnallocatedA32(instr); 54007 return; 54008 } 54009 unsigned first = 54010 ExtractDRegister(instr, 22, 12); 54011 unsigned length; 54012 SpacingType spacing; 54013 switch ((instr >> 5) & 0x1) { 54014 default: 54015 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 54016 case 0x0: 54017 length = 2; 54018 spacing = kSingle; 54019 break; 54020 case 0x1: 54021 length = 2; 54022 spacing = kDouble; 54023 break; 54024 } 54025 unsigned last = 54026 first + 54027 (length - 1) * (spacing == kSingle ? 1 : 2); 54028 TransferType transfer = kAllLanes; 54029 unsigned rn = (instr >> 16) & 0xf; 54030 // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length) 54031 vld2(al, 54032 dt, 54033 NeonRegisterList(DRegister(first), 54034 DRegister(last), 54035 spacing, 54036 transfer), 54037 AlignedMemOperand(Register(rn), 54038 align, 54039 PostIndex)); 54040 break; 54041 } 54042 case 0x00000002: { 54043 // 0xf4a00d0f 54044 DataType dt = 54045 Dt_size_7_Decode((instr >> 6) & 0x3); 54046 if (dt.Is(kDataTypeValueInvalid)) { 54047 UnallocatedA32(instr); 54048 return; 54049 } 54050 Alignment align = 54051 Align_a_2_Decode((instr >> 4) & 0x1, dt); 54052 if (dt.Is(kDataTypeValueInvalid) || 54053 align.Is(kBadAlignment)) { 54054 UnallocatedA32(instr); 54055 return; 54056 } 54057 unsigned first = 54058 ExtractDRegister(instr, 22, 12); 54059 unsigned length; 54060 SpacingType spacing; 54061 switch ((instr >> 5) & 0x1) { 54062 default: 54063 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 54064 case 0x0: 54065 length = 2; 54066 spacing = kSingle; 54067 break; 54068 case 0x1: 54069 length = 2; 54070 spacing = kDouble; 54071 break; 54072 } 54073 unsigned last = 54074 first + 54075 (length - 1) * (spacing == kSingle ? 1 : 2); 54076 TransferType transfer = kAllLanes; 54077 unsigned rn = (instr >> 16) & 0xf; 54078 // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1 NOLINT(whitespace/line_length) 54079 vld2(al, 54080 dt, 54081 NeonRegisterList(DRegister(first), 54082 DRegister(last), 54083 spacing, 54084 transfer), 54085 AlignedMemOperand(Register(rn), 54086 align, 54087 Offset)); 54088 break; 54089 } 54090 } 54091 break; 54092 } 54093 default: { 54094 if (((instr & 0xd) == 0xd)) { 54095 UnallocatedA32(instr); 54096 return; 54097 } 54098 DataType dt = Dt_size_7_Decode((instr >> 6) & 0x3); 54099 if (dt.Is(kDataTypeValueInvalid)) { 54100 UnallocatedA32(instr); 54101 return; 54102 } 54103 Alignment align = 54104 Align_a_2_Decode((instr >> 4) & 0x1, dt); 54105 if (dt.Is(kDataTypeValueInvalid) || 54106 align.Is(kBadAlignment)) { 54107 UnallocatedA32(instr); 54108 return; 54109 } 54110 unsigned first = ExtractDRegister(instr, 22, 12); 54111 unsigned length; 54112 SpacingType spacing; 54113 switch ((instr >> 5) & 0x1) { 54114 default: 54115 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 54116 case 0x0: 54117 length = 2; 54118 spacing = kSingle; 54119 break; 54120 case 0x1: 54121 length = 2; 54122 spacing = kDouble; 54123 break; 54124 } 54125 unsigned last = 54126 first + 54127 (length - 1) * (spacing == kSingle ? 1 : 2); 54128 TransferType transfer = kAllLanes; 54129 unsigned rn = (instr >> 16) & 0xf; 54130 unsigned rm = instr & 0xf; 54131 // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length) 54132 vld2(al, 54133 dt, 54134 NeonRegisterList(DRegister(first), 54135 DRegister(last), 54136 spacing, 54137 transfer), 54138 AlignedMemOperand(Register(rn), 54139 align, 54140 Register(rm), 54141 PostIndex)); 54142 break; 54143 } 54144 } 54145 break; 54146 } 54147 default: { 54148 switch (instr & 0x0000000d) { 54149 case 0x0000000d: { 54150 // 0xf4a0010d 54151 switch (instr & 0x00000002) { 54152 case 0x00000000: { 54153 // 0xf4a0010d 54154 if (((instr & 0xc00) == 0xc00)) { 54155 UnallocatedA32(instr); 54156 return; 54157 } 54158 DataType dt = 54159 Dt_size_7_Decode((instr >> 10) & 0x3); 54160 if (dt.Is(kDataTypeValueInvalid)) { 54161 UnallocatedA32(instr); 54162 return; 54163 } 54164 DecodeNeonAndAlign decode_neon = 54165 Align_index_align_2_Decode((instr >> 4) & 54166 0xf, 54167 dt); 54168 if (!decode_neon.IsValid()) { 54169 UnallocatedA32(instr); 54170 return; 54171 } 54172 Alignment align = decode_neon.GetAlign(); 54173 int lane = decode_neon.GetLane(); 54174 SpacingType spacing = decode_neon.GetSpacing(); 54175 unsigned first = 54176 ExtractDRegister(instr, 22, 12); 54177 unsigned length = 2; 54178 unsigned last = 54179 first + 54180 (length - 1) * (spacing == kSingle ? 1 : 2); 54181 unsigned rn = (instr >> 16) & 0xf; 54182 // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length) 54183 vld2(al, 54184 dt, 54185 NeonRegisterList(DRegister(first), 54186 DRegister(last), 54187 spacing, 54188 lane), 54189 AlignedMemOperand(Register(rn), 54190 align, 54191 PostIndex)); 54192 break; 54193 } 54194 case 0x00000002: { 54195 // 0xf4a0010f 54196 if (((instr & 0xc00) == 0xc00)) { 54197 UnallocatedA32(instr); 54198 return; 54199 } 54200 DataType dt = 54201 Dt_size_7_Decode((instr >> 10) & 0x3); 54202 if (dt.Is(kDataTypeValueInvalid)) { 54203 UnallocatedA32(instr); 54204 return; 54205 } 54206 DecodeNeonAndAlign decode_neon = 54207 Align_index_align_2_Decode((instr >> 4) & 54208 0xf, 54209 dt); 54210 if (!decode_neon.IsValid()) { 54211 UnallocatedA32(instr); 54212 return; 54213 } 54214 Alignment align = decode_neon.GetAlign(); 54215 int lane = decode_neon.GetLane(); 54216 SpacingType spacing = decode_neon.GetSpacing(); 54217 unsigned first = 54218 ExtractDRegister(instr, 22, 12); 54219 unsigned length = 2; 54220 unsigned last = 54221 first + 54222 (length - 1) * (spacing == kSingle ? 1 : 2); 54223 unsigned rn = (instr >> 16) & 0xf; 54224 // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1 NOLINT(whitespace/line_length) 54225 vld2(al, 54226 dt, 54227 NeonRegisterList(DRegister(first), 54228 DRegister(last), 54229 spacing, 54230 lane), 54231 AlignedMemOperand(Register(rn), 54232 align, 54233 Offset)); 54234 break; 54235 } 54236 } 54237 break; 54238 } 54239 default: { 54240 if (((instr & 0xc00) == 0xc00) || 54241 ((instr & 0xd) == 0xd)) { 54242 UnallocatedA32(instr); 54243 return; 54244 } 54245 DataType dt = Dt_size_7_Decode((instr >> 10) & 0x3); 54246 if (dt.Is(kDataTypeValueInvalid)) { 54247 UnallocatedA32(instr); 54248 return; 54249 } 54250 DecodeNeonAndAlign decode_neon = 54251 Align_index_align_2_Decode((instr >> 4) & 0xf, 54252 dt); 54253 if (!decode_neon.IsValid()) { 54254 UnallocatedA32(instr); 54255 return; 54256 } 54257 Alignment align = decode_neon.GetAlign(); 54258 int lane = decode_neon.GetLane(); 54259 SpacingType spacing = decode_neon.GetSpacing(); 54260 unsigned first = ExtractDRegister(instr, 22, 12); 54261 unsigned length = 2; 54262 unsigned last = 54263 first + 54264 (length - 1) * (spacing == kSingle ? 1 : 2); 54265 unsigned rn = (instr >> 16) & 0xf; 54266 unsigned rm = instr & 0xf; 54267 // VLD2{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length) 54268 vld2(al, 54269 dt, 54270 NeonRegisterList(DRegister(first), 54271 DRegister(last), 54272 spacing, 54273 lane), 54274 AlignedMemOperand(Register(rn), 54275 align, 54276 Register(rm), 54277 PostIndex)); 54278 break; 54279 } 54280 } 54281 break; 54282 } 54283 } 54284 break; 54285 } 54286 case 0x00000200: { 54287 // 0xf4a00200 54288 switch (instr & 0x00000c00) { 54289 case 0x00000c00: { 54290 // 0xf4a00e00 54291 switch (instr & 0x00000010) { 54292 case 0x00000000: { 54293 // 0xf4a00e00 54294 switch (instr & 0x0000000d) { 54295 case 0x0000000d: { 54296 // 0xf4a00e0d 54297 switch (instr & 0x00000002) { 54298 case 0x00000000: { 54299 // 0xf4a00e0d 54300 DataType dt = 54301 Dt_size_7_Decode((instr >> 6) & 0x3); 54302 if (dt.Is(kDataTypeValueInvalid)) { 54303 UnallocatedA32(instr); 54304 return; 54305 } 54306 unsigned first = 54307 ExtractDRegister(instr, 22, 12); 54308 unsigned length; 54309 SpacingType spacing; 54310 switch ((instr >> 5) & 0x1) { 54311 default: 54312 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 54313 case 0x0: 54314 length = 3; 54315 spacing = kSingle; 54316 break; 54317 case 0x1: 54318 length = 3; 54319 spacing = kDouble; 54320 break; 54321 } 54322 unsigned last = 54323 first + 54324 (length - 1) * 54325 (spacing == kSingle ? 1 : 2); 54326 TransferType transfer = kAllLanes; 54327 unsigned rn = (instr >> 16) & 0xf; 54328 // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>]! ; A1 54329 vld3(al, 54330 dt, 54331 NeonRegisterList(DRegister(first), 54332 DRegister(last), 54333 spacing, 54334 transfer), 54335 MemOperand(Register(rn), PostIndex)); 54336 break; 54337 } 54338 case 0x00000002: { 54339 // 0xf4a00e0f 54340 DataType dt = 54341 Dt_size_7_Decode((instr >> 6) & 0x3); 54342 if (dt.Is(kDataTypeValueInvalid)) { 54343 UnallocatedA32(instr); 54344 return; 54345 } 54346 unsigned first = 54347 ExtractDRegister(instr, 22, 12); 54348 unsigned length; 54349 SpacingType spacing; 54350 switch ((instr >> 5) & 0x1) { 54351 default: 54352 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 54353 case 0x0: 54354 length = 3; 54355 spacing = kSingle; 54356 break; 54357 case 0x1: 54358 length = 3; 54359 spacing = kDouble; 54360 break; 54361 } 54362 unsigned last = 54363 first + 54364 (length - 1) * 54365 (spacing == kSingle ? 1 : 2); 54366 TransferType transfer = kAllLanes; 54367 unsigned rn = (instr >> 16) & 0xf; 54368 // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>] ; A1 54369 vld3(al, 54370 dt, 54371 NeonRegisterList(DRegister(first), 54372 DRegister(last), 54373 spacing, 54374 transfer), 54375 MemOperand(Register(rn), Offset)); 54376 break; 54377 } 54378 } 54379 break; 54380 } 54381 default: { 54382 if (((instr & 0xd) == 0xd)) { 54383 UnallocatedA32(instr); 54384 return; 54385 } 54386 DataType dt = 54387 Dt_size_7_Decode((instr >> 6) & 0x3); 54388 if (dt.Is(kDataTypeValueInvalid)) { 54389 UnallocatedA32(instr); 54390 return; 54391 } 54392 unsigned first = 54393 ExtractDRegister(instr, 22, 12); 54394 unsigned length; 54395 SpacingType spacing; 54396 switch ((instr >> 5) & 0x1) { 54397 default: 54398 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 54399 case 0x0: 54400 length = 3; 54401 spacing = kSingle; 54402 break; 54403 case 0x1: 54404 length = 3; 54405 spacing = kDouble; 54406 break; 54407 } 54408 unsigned last = 54409 first + 54410 (length - 1) * (spacing == kSingle ? 1 : 2); 54411 TransferType transfer = kAllLanes; 54412 unsigned rn = (instr >> 16) & 0xf; 54413 Sign sign(plus); 54414 unsigned rm = instr & 0xf; 54415 // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>], #<Rm> ; A1 NOLINT(whitespace/line_length) 54416 vld3(al, 54417 dt, 54418 NeonRegisterList(DRegister(first), 54419 DRegister(last), 54420 spacing, 54421 transfer), 54422 MemOperand(Register(rn), 54423 sign, 54424 Register(rm), 54425 PostIndex)); 54426 break; 54427 } 54428 } 54429 break; 54430 } 54431 default: 54432 UnallocatedA32(instr); 54433 break; 54434 } 54435 break; 54436 } 54437 default: { 54438 switch (instr & 0x0000000d) { 54439 case 0x0000000d: { 54440 // 0xf4a0020d 54441 switch (instr & 0x00000002) { 54442 case 0x00000000: { 54443 // 0xf4a0020d 54444 if (((instr & 0xc00) == 0xc00)) { 54445 UnallocatedA32(instr); 54446 return; 54447 } 54448 DataType dt = 54449 Dt_size_7_Decode((instr >> 10) & 0x3); 54450 if (dt.Is(kDataTypeValueInvalid)) { 54451 UnallocatedA32(instr); 54452 return; 54453 } 54454 DecodeNeon decode_neon = 54455 Index_1_Decode((instr >> 4) & 0xf, dt); 54456 if (!decode_neon.IsValid()) { 54457 UnallocatedA32(instr); 54458 return; 54459 } 54460 int lane = decode_neon.GetLane(); 54461 SpacingType spacing = decode_neon.GetSpacing(); 54462 unsigned first = 54463 ExtractDRegister(instr, 22, 12); 54464 unsigned length = 3; 54465 unsigned last = 54466 first + 54467 (length - 1) * (spacing == kSingle ? 1 : 2); 54468 unsigned rn = (instr >> 16) & 0xf; 54469 // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>]! ; A1 54470 vld3(al, 54471 dt, 54472 NeonRegisterList(DRegister(first), 54473 DRegister(last), 54474 spacing, 54475 lane), 54476 MemOperand(Register(rn), PostIndex)); 54477 break; 54478 } 54479 case 0x00000002: { 54480 // 0xf4a0020f 54481 if (((instr & 0xc00) == 0xc00)) { 54482 UnallocatedA32(instr); 54483 return; 54484 } 54485 DataType dt = 54486 Dt_size_7_Decode((instr >> 10) & 0x3); 54487 if (dt.Is(kDataTypeValueInvalid)) { 54488 UnallocatedA32(instr); 54489 return; 54490 } 54491 DecodeNeon decode_neon = 54492 Index_1_Decode((instr >> 4) & 0xf, dt); 54493 if (!decode_neon.IsValid()) { 54494 UnallocatedA32(instr); 54495 return; 54496 } 54497 int lane = decode_neon.GetLane(); 54498 SpacingType spacing = decode_neon.GetSpacing(); 54499 unsigned first = 54500 ExtractDRegister(instr, 22, 12); 54501 unsigned length = 3; 54502 unsigned last = 54503 first + 54504 (length - 1) * (spacing == kSingle ? 1 : 2); 54505 unsigned rn = (instr >> 16) & 0xf; 54506 // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>] ; A1 54507 vld3(al, 54508 dt, 54509 NeonRegisterList(DRegister(first), 54510 DRegister(last), 54511 spacing, 54512 lane), 54513 MemOperand(Register(rn), Offset)); 54514 break; 54515 } 54516 } 54517 break; 54518 } 54519 default: { 54520 if (((instr & 0xc00) == 0xc00) || 54521 ((instr & 0xd) == 0xd)) { 54522 UnallocatedA32(instr); 54523 return; 54524 } 54525 DataType dt = Dt_size_7_Decode((instr >> 10) & 0x3); 54526 if (dt.Is(kDataTypeValueInvalid)) { 54527 UnallocatedA32(instr); 54528 return; 54529 } 54530 DecodeNeon decode_neon = 54531 Index_1_Decode((instr >> 4) & 0xf, dt); 54532 if (!decode_neon.IsValid()) { 54533 UnallocatedA32(instr); 54534 return; 54535 } 54536 int lane = decode_neon.GetLane(); 54537 SpacingType spacing = decode_neon.GetSpacing(); 54538 unsigned first = ExtractDRegister(instr, 22, 12); 54539 unsigned length = 3; 54540 unsigned last = 54541 first + 54542 (length - 1) * (spacing == kSingle ? 1 : 2); 54543 unsigned rn = (instr >> 16) & 0xf; 54544 Sign sign(plus); 54545 unsigned rm = instr & 0xf; 54546 // VLD3{<c>}{<q>}.<dt> <list>, [<Rn>], #<Rm> ; A1 54547 vld3(al, 54548 dt, 54549 NeonRegisterList(DRegister(first), 54550 DRegister(last), 54551 spacing, 54552 lane), 54553 MemOperand(Register(rn), 54554 sign, 54555 Register(rm), 54556 PostIndex)); 54557 break; 54558 } 54559 } 54560 break; 54561 } 54562 } 54563 break; 54564 } 54565 case 0x00000300: { 54566 // 0xf4a00300 54567 switch (instr & 0x00000c00) { 54568 case 0x00000c00: { 54569 // 0xf4a00f00 54570 switch (instr & 0x0000000d) { 54571 case 0x0000000d: { 54572 // 0xf4a00f0d 54573 switch (instr & 0x00000002) { 54574 case 0x00000000: { 54575 // 0xf4a00f0d 54576 DataType dt = 54577 Dt_size_8_Decode((instr >> 6) & 0x3); 54578 if (dt.Is(kDataTypeValueInvalid)) { 54579 UnallocatedA32(instr); 54580 return; 54581 } 54582 Alignment align = 54583 Align_a_3_Decode((instr >> 4) & 0x1, 54584 dt, 54585 (instr >> 6) & 0x3); 54586 if (dt.Is(kDataTypeValueInvalid) || 54587 align.Is(kBadAlignment)) { 54588 UnallocatedA32(instr); 54589 return; 54590 } 54591 unsigned first = 54592 ExtractDRegister(instr, 22, 12); 54593 unsigned length; 54594 SpacingType spacing; 54595 switch ((instr >> 5) & 0x1) { 54596 default: 54597 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 54598 case 0x0: 54599 length = 4; 54600 spacing = kSingle; 54601 break; 54602 case 0x1: 54603 length = 4; 54604 spacing = kDouble; 54605 break; 54606 } 54607 unsigned last = 54608 first + 54609 (length - 1) * (spacing == kSingle ? 1 : 2); 54610 TransferType transfer = kAllLanes; 54611 unsigned rn = (instr >> 16) & 0xf; 54612 // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length) 54613 vld4(al, 54614 dt, 54615 NeonRegisterList(DRegister(first), 54616 DRegister(last), 54617 spacing, 54618 transfer), 54619 AlignedMemOperand(Register(rn), 54620 align, 54621 PostIndex)); 54622 break; 54623 } 54624 case 0x00000002: { 54625 // 0xf4a00f0f 54626 DataType dt = 54627 Dt_size_8_Decode((instr >> 6) & 0x3); 54628 if (dt.Is(kDataTypeValueInvalid)) { 54629 UnallocatedA32(instr); 54630 return; 54631 } 54632 Alignment align = 54633 Align_a_3_Decode((instr >> 4) & 0x1, 54634 dt, 54635 (instr >> 6) & 0x3); 54636 if (dt.Is(kDataTypeValueInvalid) || 54637 align.Is(kBadAlignment)) { 54638 UnallocatedA32(instr); 54639 return; 54640 } 54641 unsigned first = 54642 ExtractDRegister(instr, 22, 12); 54643 unsigned length; 54644 SpacingType spacing; 54645 switch ((instr >> 5) & 0x1) { 54646 default: 54647 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 54648 case 0x0: 54649 length = 4; 54650 spacing = kSingle; 54651 break; 54652 case 0x1: 54653 length = 4; 54654 spacing = kDouble; 54655 break; 54656 } 54657 unsigned last = 54658 first + 54659 (length - 1) * (spacing == kSingle ? 1 : 2); 54660 TransferType transfer = kAllLanes; 54661 unsigned rn = (instr >> 16) & 0xf; 54662 // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1 NOLINT(whitespace/line_length) 54663 vld4(al, 54664 dt, 54665 NeonRegisterList(DRegister(first), 54666 DRegister(last), 54667 spacing, 54668 transfer), 54669 AlignedMemOperand(Register(rn), 54670 align, 54671 Offset)); 54672 break; 54673 } 54674 } 54675 break; 54676 } 54677 default: { 54678 if (((instr & 0xd) == 0xd)) { 54679 UnallocatedA32(instr); 54680 return; 54681 } 54682 DataType dt = Dt_size_8_Decode((instr >> 6) & 0x3); 54683 if (dt.Is(kDataTypeValueInvalid)) { 54684 UnallocatedA32(instr); 54685 return; 54686 } 54687 Alignment align = 54688 Align_a_3_Decode((instr >> 4) & 0x1, 54689 dt, 54690 (instr >> 6) & 0x3); 54691 if (dt.Is(kDataTypeValueInvalid) || 54692 align.Is(kBadAlignment)) { 54693 UnallocatedA32(instr); 54694 return; 54695 } 54696 unsigned first = ExtractDRegister(instr, 22, 12); 54697 unsigned length; 54698 SpacingType spacing; 54699 switch ((instr >> 5) & 0x1) { 54700 default: 54701 VIXL_UNREACHABLE_OR_FALLTHROUGH(); 54702 case 0x0: 54703 length = 4; 54704 spacing = kSingle; 54705 break; 54706 case 0x1: 54707 length = 4; 54708 spacing = kDouble; 54709 break; 54710 } 54711 unsigned last = 54712 first + 54713 (length - 1) * (spacing == kSingle ? 1 : 2); 54714 TransferType transfer = kAllLanes; 54715 unsigned rn = (instr >> 16) & 0xf; 54716 unsigned rm = instr & 0xf; 54717 // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length) 54718 vld4(al, 54719 dt, 54720 NeonRegisterList(DRegister(first), 54721 DRegister(last), 54722 spacing, 54723 transfer), 54724 AlignedMemOperand(Register(rn), 54725 align, 54726 Register(rm), 54727 PostIndex)); 54728 break; 54729 } 54730 } 54731 break; 54732 } 54733 default: { 54734 switch (instr & 0x0000000d) { 54735 case 0x0000000d: { 54736 // 0xf4a0030d 54737 switch (instr & 0x00000002) { 54738 case 0x00000000: { 54739 // 0xf4a0030d 54740 if (((instr & 0xc00) == 0xc00)) { 54741 UnallocatedA32(instr); 54742 return; 54743 } 54744 DataType dt = 54745 Dt_size_7_Decode((instr >> 10) & 0x3); 54746 if (dt.Is(kDataTypeValueInvalid)) { 54747 UnallocatedA32(instr); 54748 return; 54749 } 54750 DecodeNeonAndAlign decode_neon = 54751 Align_index_align_3_Decode((instr >> 4) & 54752 0xf, 54753 dt); 54754 if (!decode_neon.IsValid()) { 54755 UnallocatedA32(instr); 54756 return; 54757 } 54758 Alignment align = decode_neon.GetAlign(); 54759 int lane = decode_neon.GetLane(); 54760 SpacingType spacing = decode_neon.GetSpacing(); 54761 unsigned first = 54762 ExtractDRegister(instr, 22, 12); 54763 unsigned length = 4; 54764 unsigned last = 54765 first + 54766 (length - 1) * (spacing == kSingle ? 1 : 2); 54767 unsigned rn = (instr >> 16) & 0xf; 54768 // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}]! ; A1 NOLINT(whitespace/line_length) 54769 vld4(al, 54770 dt, 54771 NeonRegisterList(DRegister(first), 54772 DRegister(last), 54773 spacing, 54774 lane), 54775 AlignedMemOperand(Register(rn), 54776 align, 54777 PostIndex)); 54778 break; 54779 } 54780 case 0x00000002: { 54781 // 0xf4a0030f 54782 if (((instr & 0xc00) == 0xc00)) { 54783 UnallocatedA32(instr); 54784 return; 54785 } 54786 DataType dt = 54787 Dt_size_7_Decode((instr >> 10) & 0x3); 54788 if (dt.Is(kDataTypeValueInvalid)) { 54789 UnallocatedA32(instr); 54790 return; 54791 } 54792 DecodeNeonAndAlign decode_neon = 54793 Align_index_align_3_Decode((instr >> 4) & 54794 0xf, 54795 dt); 54796 if (!decode_neon.IsValid()) { 54797 UnallocatedA32(instr); 54798 return; 54799 } 54800 Alignment align = decode_neon.GetAlign(); 54801 int lane = decode_neon.GetLane(); 54802 SpacingType spacing = decode_neon.GetSpacing(); 54803 unsigned first = 54804 ExtractDRegister(instr, 22, 12); 54805 unsigned length = 4; 54806 unsigned last = 54807 first + 54808 (length - 1) * (spacing == kSingle ? 1 : 2); 54809 unsigned rn = (instr >> 16) & 0xf; 54810 // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}] ; A1 NOLINT(whitespace/line_length) 54811 vld4(al, 54812 dt, 54813 NeonRegisterList(DRegister(first), 54814 DRegister(last), 54815 spacing, 54816 lane), 54817 AlignedMemOperand(Register(rn), 54818 align, 54819 Offset)); 54820 break; 54821 } 54822 } 54823 break; 54824 } 54825 default: { 54826 if (((instr & 0xc00) == 0xc00) || 54827 ((instr & 0xd) == 0xd)) { 54828 UnallocatedA32(instr); 54829 return; 54830 } 54831 DataType dt = Dt_size_7_Decode((instr >> 10) & 0x3); 54832 if (dt.Is(kDataTypeValueInvalid)) { 54833 UnallocatedA32(instr); 54834 return; 54835 } 54836 DecodeNeonAndAlign decode_neon = 54837 Align_index_align_3_Decode((instr >> 4) & 0xf, 54838 dt); 54839 if (!decode_neon.IsValid()) { 54840 UnallocatedA32(instr); 54841 return; 54842 } 54843 Alignment align = decode_neon.GetAlign(); 54844 int lane = decode_neon.GetLane(); 54845 SpacingType spacing = decode_neon.GetSpacing(); 54846 unsigned first = ExtractDRegister(instr, 22, 12); 54847 unsigned length = 4; 54848 unsigned last = 54849 first + 54850 (length - 1) * (spacing == kSingle ? 1 : 2); 54851 unsigned rn = (instr >> 16) & 0xf; 54852 unsigned rm = instr & 0xf; 54853 // VLD4{<c>}{<q>}.<dt> <list>, [<Rn>{:<align>}], <Rm> ; A1 NOLINT(whitespace/line_length) 54854 vld4(al, 54855 dt, 54856 NeonRegisterList(DRegister(first), 54857 DRegister(last), 54858 spacing, 54859 lane), 54860 AlignedMemOperand(Register(rn), 54861 align, 54862 Register(rm), 54863 PostIndex)); 54864 break; 54865 } 54866 } 54867 break; 54868 } 54869 } 54870 break; 54871 } 54872 } 54873 break; 54874 } 54875 } 54876 break; 54877 } 54878 case 0x01100000: { 54879 // 0xf5100000 54880 switch (instr & 0x000f0000) { 54881 case 0x000f0000: { 54882 // 0xf51f0000 54883 uint32_t U = (instr >> 23) & 0x1; 54884 int32_t imm = instr & 0xfff; 54885 if (U == 0) imm = -imm; 54886 bool minus_zero = (imm == 0) && (U == 0); 54887 Location location(imm, kA32PcDelta); 54888 // PLD{<c>}{<q>} <label> ; A1 54889 if (minus_zero) { 54890 pld(al, MemOperand(pc, minus, 0)); 54891 } else { 54892 pld(al, &location); 54893 } 54894 if (((instr & 0xff7ff000) != 0xf55ff000)) { 54895 UnpredictableA32(instr); 54896 } 54897 break; 54898 } 54899 default: { 54900 switch (instr & 0x00400000) { 54901 case 0x00000000: { 54902 // 0xf5100000 54903 if (((instr & 0xf0000) == 0xf0000)) { 54904 UnallocatedA32(instr); 54905 return; 54906 } 54907 unsigned rn = (instr >> 16) & 0xf; 54908 Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus); 54909 int32_t offset = instr & 0xfff; 54910 // PLDW{<c>}{<q>} [<Rn>{, #{+/-}<imm_2>}] ; A1 54911 pldw(al, MemOperand(Register(rn), sign, offset, Offset)); 54912 if (((instr & 0xff70f000) != 0xf510f000)) { 54913 UnpredictableA32(instr); 54914 } 54915 break; 54916 } 54917 case 0x00400000: { 54918 // 0xf5500000 54919 if (((instr & 0xf0000) == 0xf0000)) { 54920 UnallocatedA32(instr); 54921 return; 54922 } 54923 unsigned rn = (instr >> 16) & 0xf; 54924 Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus); 54925 int32_t offset = instr & 0xfff; 54926 // PLD{<c>}{<q>} [<Rn>{, #{+/-}<imm_2>}] ; A1 54927 pld(al, MemOperand(Register(rn), sign, offset, Offset)); 54928 if (((instr & 0xff70f000) != 0xf550f000)) { 54929 UnpredictableA32(instr); 54930 } 54931 break; 54932 } 54933 } 54934 break; 54935 } 54936 } 54937 break; 54938 } 54939 case 0x01300000: { 54940 // 0xf5300000 54941 switch (instr & 0x00c000f0) { 54942 case 0x00400010: { 54943 // 0xf5700010 54944 // CLREX{<c>}{<q>} ; A1 54945 clrex(al); 54946 if (((instr & 0xffffffff) != 0xf57ff01f)) { 54947 UnpredictableA32(instr); 54948 } 54949 break; 54950 } 54951 case 0x00400040: { 54952 // 0xf5700040 54953 MemoryBarrier option(instr & 0xf); 54954 // DSB{<c>}{<q>} {<option>} ; A1 54955 dsb(al, option); 54956 if (((instr & 0xfffffff0) != 0xf57ff040)) { 54957 UnpredictableA32(instr); 54958 } 54959 break; 54960 } 54961 case 0x00400050: { 54962 // 0xf5700050 54963 MemoryBarrier option(instr & 0xf); 54964 // DMB{<c>}{<q>} {<option>} ; A1 54965 dmb(al, option); 54966 if (((instr & 0xfffffff0) != 0xf57ff050)) { 54967 UnpredictableA32(instr); 54968 } 54969 break; 54970 } 54971 case 0x00400060: { 54972 // 0xf5700060 54973 MemoryBarrier option(instr & 0xf); 54974 // ISB{<c>}{<q>} {<option>} ; A1 54975 isb(al, option); 54976 if (((instr & 0xfffffff0) != 0xf57ff060)) { 54977 UnpredictableA32(instr); 54978 } 54979 break; 54980 } 54981 default: 54982 UnallocatedA32(instr); 54983 break; 54984 } 54985 break; 54986 } 54987 default: 54988 UnallocatedA32(instr); 54989 break; 54990 } 54991 break; 54992 } 54993 case 0x06000000: { 54994 // 0xf6000000 54995 switch (instr & 0x01700010) { 54996 case 0x00500000: { 54997 // 0xf6500000 54998 switch (instr & 0x00000fe0) { 54999 case 0x00000060: { 55000 // 0xf6500060 55001 unsigned rn = (instr >> 16) & 0xf; 55002 Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus); 55003 unsigned rm = instr & 0xf; 55004 Shift shift = RRX; 55005 uint32_t amount = 0; 55006 AddrMode addrmode = Offset; 55007 // PLI{<c>}{<q>} [<Rn>, {+/-}<Rm>, RRX] ; A1 55008 pli(al, 55009 MemOperand(Register(rn), 55010 sign, 55011 Register(rm), 55012 shift, 55013 amount, 55014 addrmode)); 55015 if (((instr & 0xff70fff0) != 0xf650f060)) { 55016 UnpredictableA32(instr); 55017 } 55018 break; 55019 } 55020 default: { 55021 if (((instr & 0xfe0) == 0x60)) { 55022 UnallocatedA32(instr); 55023 return; 55024 } 55025 unsigned rn = (instr >> 16) & 0xf; 55026 Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus); 55027 unsigned rm = instr & 0xf; 55028 ImmediateShiftOperand shift_operand((instr >> 5) & 0x3, 55029 (instr >> 7) & 0x1f); 55030 Shift shift = shift_operand.GetShift(); 55031 uint32_t amount = shift_operand.GetAmount(); 55032 AddrMode addrmode = Offset; 55033 // PLI{<c>}{<q>} [<Rn>, {+/-}<Rm>{, <shift> #<amount_1>}] ; A1 55034 pli(al, 55035 MemOperand(Register(rn), 55036 sign, 55037 Register(rm), 55038 shift, 55039 amount, 55040 addrmode)); 55041 if (((instr & 0xff70f010) != 0xf650f000)) { 55042 UnpredictableA32(instr); 55043 } 55044 break; 55045 } 55046 } 55047 break; 55048 } 55049 case 0x01100000: { 55050 // 0xf7100000 55051 switch (instr & 0x00000fe0) { 55052 case 0x00000060: { 55053 // 0xf7100060 55054 unsigned rn = (instr >> 16) & 0xf; 55055 Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus); 55056 unsigned rm = instr & 0xf; 55057 Shift shift = RRX; 55058 uint32_t amount = 0; 55059 AddrMode addrmode = Offset; 55060 // PLDW{<c>}{<q>} [<Rn>, {+/-}<Rm>, RRX] ; A1 55061 pldw(al, 55062 MemOperand(Register(rn), 55063 sign, 55064 Register(rm), 55065 shift, 55066 amount, 55067 addrmode)); 55068 if (((instr & 0xff70fff0) != 0xf710f060)) { 55069 UnpredictableA32(instr); 55070 } 55071 break; 55072 } 55073 default: { 55074 if (((instr & 0xfe0) == 0x60)) { 55075 UnallocatedA32(instr); 55076 return; 55077 } 55078 unsigned rn = (instr >> 16) & 0xf; 55079 Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus); 55080 unsigned rm = instr & 0xf; 55081 ImmediateShiftOperand shift_operand((instr >> 5) & 0x3, 55082 (instr >> 7) & 0x1f); 55083 Shift shift = shift_operand.GetShift(); 55084 uint32_t amount = shift_operand.GetAmount(); 55085 AddrMode addrmode = Offset; 55086 // PLDW{<c>}{<q>} [<Rn>, {+/-}<Rm>{, <shift> #<amount_1>}] ; A1 55087 pldw(al, 55088 MemOperand(Register(rn), 55089 sign, 55090 Register(rm), 55091 shift, 55092 amount, 55093 addrmode)); 55094 if (((instr & 0xff70f010) != 0xf710f000)) { 55095 UnpredictableA32(instr); 55096 } 55097 break; 55098 } 55099 } 55100 break; 55101 } 55102 case 0x01500000: { 55103 // 0xf7500000 55104 switch (instr & 0x00000fe0) { 55105 case 0x00000060: { 55106 // 0xf7500060 55107 unsigned rn = (instr >> 16) & 0xf; 55108 Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus); 55109 unsigned rm = instr & 0xf; 55110 Shift shift = RRX; 55111 uint32_t amount = 0; 55112 AddrMode addrmode = Offset; 55113 // PLD{<c>}{<q>} [<Rn>, {+/-}<Rm>, RRX] ; A1 55114 pld(al, 55115 MemOperand(Register(rn), 55116 sign, 55117 Register(rm), 55118 shift, 55119 amount, 55120 addrmode)); 55121 if (((instr & 0xff70fff0) != 0xf750f060)) { 55122 UnpredictableA32(instr); 55123 } 55124 break; 55125 } 55126 default: { 55127 if (((instr & 0xfe0) == 0x60)) { 55128 UnallocatedA32(instr); 55129 return; 55130 } 55131 unsigned rn = (instr >> 16) & 0xf; 55132 Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus); 55133 unsigned rm = instr & 0xf; 55134 ImmediateShiftOperand shift_operand((instr >> 5) & 0x3, 55135 (instr >> 7) & 0x1f); 55136 Shift shift = shift_operand.GetShift(); 55137 uint32_t amount = shift_operand.GetAmount(); 55138 AddrMode addrmode = Offset; 55139 // PLD{<c>}{<q>} [<Rn>, {+/-}<Rm>{, <shift> #<amount_1>}] ; A1 55140 pld(al, 55141 MemOperand(Register(rn), 55142 sign, 55143 Register(rm), 55144 shift, 55145 amount, 55146 addrmode)); 55147 if (((instr & 0xff70f010) != 0xf750f000)) { 55148 UnpredictableA32(instr); 55149 } 55150 break; 55151 } 55152 } 55153 break; 55154 } 55155 default: 55156 UnallocatedA32(instr); 55157 break; 55158 } 55159 break; 55160 } 55161 case 0x08000000: { 55162 // 0xf8000000 55163 switch (instr & 0x01d00000) { 55164 case 0x00100000: { 55165 // 0xf8100000 55166 UnimplementedA32("RFEDA", instr); 55167 break; 55168 } 55169 case 0x00400000: { 55170 // 0xf8400000 55171 UnimplementedA32("SRSDA", instr); 55172 break; 55173 } 55174 case 0x00900000: { 55175 // 0xf8900000 55176 UnimplementedA32("RFE{IA}", instr); 55177 break; 55178 } 55179 case 0x00c00000: { 55180 // 0xf8c00000 55181 UnimplementedA32("SRS{IA}", instr); 55182 break; 55183 } 55184 case 0x01100000: { 55185 // 0xf9100000 55186 UnimplementedA32("RFEDB", instr); 55187 break; 55188 } 55189 case 0x01400000: { 55190 // 0xf9400000 55191 UnimplementedA32("SRSDB", instr); 55192 break; 55193 } 55194 case 0x01900000: { 55195 // 0xf9900000 55196 UnimplementedA32("RFEIB", instr); 55197 break; 55198 } 55199 case 0x01c00000: { 55200 // 0xf9c00000 55201 UnimplementedA32("SRSIB", instr); 55202 break; 55203 } 55204 default: 55205 UnallocatedA32(instr); 55206 break; 55207 } 55208 break; 55209 } 55210 case 0x0a000000: { 55211 // 0xfa000000 55212 int32_t imm = SignExtend<int32_t>((((instr >> 24) & 0x1) | 55213 ((instr << 1) & 0x1fffffe)) 55214 << 1, 55215 26); 55216 Location location(imm, kA32PcDelta); 55217 // BLX{<c>}{<q>} <label> ; A2 55218 blx(al, &location); 55219 break; 55220 } 55221 case 0x0e000000: { 55222 // 0xfe000000 55223 switch (instr & 0x01b00f50) { 55224 case 0x00000a00: { 55225 // 0xfe000a00 55226 unsigned rd = ExtractSRegister(instr, 22, 12); 55227 unsigned rn = ExtractSRegister(instr, 7, 16); 55228 unsigned rm = ExtractSRegister(instr, 5, 0); 55229 // VSELEQ.F32 <Sd>, <Sn>, <Sm> ; A1 55230 vseleq(F32, SRegister(rd), SRegister(rn), SRegister(rm)); 55231 break; 55232 } 55233 case 0x00000b00: { 55234 // 0xfe000b00 55235 unsigned rd = ExtractDRegister(instr, 22, 12); 55236 unsigned rn = ExtractDRegister(instr, 7, 16); 55237 unsigned rm = ExtractDRegister(instr, 5, 0); 55238 // VSELEQ.F64 <Dd>, <Dn>, <Dm> ; A1 55239 vseleq(F64, DRegister(rd), DRegister(rn), DRegister(rm)); 55240 break; 55241 } 55242 case 0x00100a00: { 55243 // 0xfe100a00 55244 unsigned rd = ExtractSRegister(instr, 22, 12); 55245 unsigned rn = ExtractSRegister(instr, 7, 16); 55246 unsigned rm = ExtractSRegister(instr, 5, 0); 55247 // VSELVS.F32 <Sd>, <Sn>, <Sm> ; A1 55248 vselvs(F32, SRegister(rd), SRegister(rn), SRegister(rm)); 55249 break; 55250 } 55251 case 0x00100b00: { 55252 // 0xfe100b00 55253 unsigned rd = ExtractDRegister(instr, 22, 12); 55254 unsigned rn = ExtractDRegister(instr, 7, 16); 55255 unsigned rm = ExtractDRegister(instr, 5, 0); 55256 // VSELVS.F64 <Dd>, <Dn>, <Dm> ; A1 55257 vselvs(F64, DRegister(rd), DRegister(rn), DRegister(rm)); 55258 break; 55259 } 55260 case 0x00200a00: { 55261 // 0xfe200a00 55262 unsigned rd = ExtractSRegister(instr, 22, 12); 55263 unsigned rn = ExtractSRegister(instr, 7, 16); 55264 unsigned rm = ExtractSRegister(instr, 5, 0); 55265 // VSELGE.F32 <Sd>, <Sn>, <Sm> ; A1 55266 vselge(F32, SRegister(rd), SRegister(rn), SRegister(rm)); 55267 break; 55268 } 55269 case 0x00200b00: { 55270 // 0xfe200b00 55271 unsigned rd = ExtractDRegister(instr, 22, 12); 55272 unsigned rn = ExtractDRegister(instr, 7, 16); 55273 unsigned rm = ExtractDRegister(instr, 5, 0); 55274 // VSELGE.F64 <Dd>, <Dn>, <Dm> ; A1 55275 vselge(F64, DRegister(rd), DRegister(rn), DRegister(rm)); 55276 break; 55277 } 55278 case 0x00300a00: { 55279 // 0xfe300a00 55280 unsigned rd = ExtractSRegister(instr, 22, 12); 55281 unsigned rn = ExtractSRegister(instr, 7, 16); 55282 unsigned rm = ExtractSRegister(instr, 5, 0); 55283 // VSELGT.F32 <Sd>, <Sn>, <Sm> ; A1 55284 vselgt(F32, SRegister(rd), SRegister(rn), SRegister(rm)); 55285 break; 55286 } 55287 case 0x00300b00: { 55288 // 0xfe300b00 55289 unsigned rd = ExtractDRegister(instr, 22, 12); 55290 unsigned rn = ExtractDRegister(instr, 7, 16); 55291 unsigned rm = ExtractDRegister(instr, 5, 0); 55292 // VSELGT.F64 <Dd>, <Dn>, <Dm> ; A1 55293 vselgt(F64, DRegister(rd), DRegister(rn), DRegister(rm)); 55294 break; 55295 } 55296 case 0x00800a00: { 55297 // 0xfe800a00 55298 unsigned rd = ExtractSRegister(instr, 22, 12); 55299 unsigned rn = ExtractSRegister(instr, 7, 16); 55300 unsigned rm = ExtractSRegister(instr, 5, 0); 55301 // VMAXNM{<q>}.F32 <Sd>, <Sn>, <Sm> ; A2 55302 vmaxnm(F32, SRegister(rd), SRegister(rn), SRegister(rm)); 55303 break; 55304 } 55305 case 0x00800a40: { 55306 // 0xfe800a40 55307 unsigned rd = ExtractSRegister(instr, 22, 12); 55308 unsigned rn = ExtractSRegister(instr, 7, 16); 55309 unsigned rm = ExtractSRegister(instr, 5, 0); 55310 // VMINNM{<q>}.F32 <Sd>, <Sn>, <Sm> ; A2 55311 vminnm(F32, SRegister(rd), SRegister(rn), SRegister(rm)); 55312 break; 55313 } 55314 case 0x00800b00: { 55315 // 0xfe800b00 55316 unsigned rd = ExtractDRegister(instr, 22, 12); 55317 unsigned rn = ExtractDRegister(instr, 7, 16); 55318 unsigned rm = ExtractDRegister(instr, 5, 0); 55319 // VMAXNM{<q>}.F64 <Dd>, <Dn>, <Dm> ; A2 55320 vmaxnm(F64, DRegister(rd), DRegister(rn), DRegister(rm)); 55321 break; 55322 } 55323 case 0x00800b40: { 55324 // 0xfe800b40 55325 unsigned rd = ExtractDRegister(instr, 22, 12); 55326 unsigned rn = ExtractDRegister(instr, 7, 16); 55327 unsigned rm = ExtractDRegister(instr, 5, 0); 55328 // VMINNM{<q>}.F64 <Dd>, <Dn>, <Dm> ; A2 55329 vminnm(F64, DRegister(rd), DRegister(rn), DRegister(rm)); 55330 break; 55331 } 55332 case 0x00b00a40: { 55333 // 0xfeb00a40 55334 switch (instr & 0x000f0000) { 55335 case 0x00080000: { 55336 // 0xfeb80a40 55337 if ((instr & 0x00000080) == 0x00000000) { 55338 unsigned rd = ExtractSRegister(instr, 22, 12); 55339 unsigned rm = ExtractSRegister(instr, 5, 0); 55340 // VRINTA{<q>}.F32 <Sd>, <Sm> ; A1 55341 vrinta(F32, SRegister(rd), SRegister(rm)); 55342 } else { 55343 UnallocatedA32(instr); 55344 } 55345 break; 55346 } 55347 case 0x00090000: { 55348 // 0xfeb90a40 55349 if ((instr & 0x00000080) == 0x00000000) { 55350 unsigned rd = ExtractSRegister(instr, 22, 12); 55351 unsigned rm = ExtractSRegister(instr, 5, 0); 55352 // VRINTN{<q>}.F32 <Sd>, <Sm> ; A1 55353 vrintn(F32, SRegister(rd), SRegister(rm)); 55354 } else { 55355 UnallocatedA32(instr); 55356 } 55357 break; 55358 } 55359 case 0x000a0000: { 55360 // 0xfeba0a40 55361 if ((instr & 0x00000080) == 0x00000000) { 55362 unsigned rd = ExtractSRegister(instr, 22, 12); 55363 unsigned rm = ExtractSRegister(instr, 5, 0); 55364 // VRINTP{<q>}.F32 <Sd>, <Sm> ; A1 55365 vrintp(F32, SRegister(rd), SRegister(rm)); 55366 } else { 55367 UnallocatedA32(instr); 55368 } 55369 break; 55370 } 55371 case 0x000b0000: { 55372 // 0xfebb0a40 55373 if ((instr & 0x00000080) == 0x00000000) { 55374 unsigned rd = ExtractSRegister(instr, 22, 12); 55375 unsigned rm = ExtractSRegister(instr, 5, 0); 55376 // VRINTM{<q>}.F32 <Sd>, <Sm> ; A1 55377 vrintm(F32, SRegister(rd), SRegister(rm)); 55378 } else { 55379 UnallocatedA32(instr); 55380 } 55381 break; 55382 } 55383 case 0x000c0000: { 55384 // 0xfebc0a40 55385 DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1); 55386 if (dt.Is(kDataTypeValueInvalid)) { 55387 UnallocatedA32(instr); 55388 return; 55389 } 55390 unsigned rd = ExtractSRegister(instr, 22, 12); 55391 unsigned rm = ExtractSRegister(instr, 5, 0); 55392 // VCVTA{<q>}.<dt>.F32 <Sd>, <Sm> ; A1 55393 vcvta(dt, F32, SRegister(rd), SRegister(rm)); 55394 break; 55395 } 55396 case 0x000d0000: { 55397 // 0xfebd0a40 55398 DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1); 55399 if (dt.Is(kDataTypeValueInvalid)) { 55400 UnallocatedA32(instr); 55401 return; 55402 } 55403 unsigned rd = ExtractSRegister(instr, 22, 12); 55404 unsigned rm = ExtractSRegister(instr, 5, 0); 55405 // VCVTN{<q>}.<dt>.F32 <Sd>, <Sm> ; A1 55406 vcvtn(dt, F32, SRegister(rd), SRegister(rm)); 55407 break; 55408 } 55409 case 0x000e0000: { 55410 // 0xfebe0a40 55411 DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1); 55412 if (dt.Is(kDataTypeValueInvalid)) { 55413 UnallocatedA32(instr); 55414 return; 55415 } 55416 unsigned rd = ExtractSRegister(instr, 22, 12); 55417 unsigned rm = ExtractSRegister(instr, 5, 0); 55418 // VCVTP{<q>}.<dt>.F32 <Sd>, <Sm> ; A1 55419 vcvtp(dt, F32, SRegister(rd), SRegister(rm)); 55420 break; 55421 } 55422 case 0x000f0000: { 55423 // 0xfebf0a40 55424 DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1); 55425 if (dt.Is(kDataTypeValueInvalid)) { 55426 UnallocatedA32(instr); 55427 return; 55428 } 55429 unsigned rd = ExtractSRegister(instr, 22, 12); 55430 unsigned rm = ExtractSRegister(instr, 5, 0); 55431 // VCVTM{<q>}.<dt>.F32 <Sd>, <Sm> ; A1 55432 vcvtm(dt, F32, SRegister(rd), SRegister(rm)); 55433 break; 55434 } 55435 default: 55436 UnallocatedA32(instr); 55437 break; 55438 } 55439 break; 55440 } 55441 case 0x00b00b40: { 55442 // 0xfeb00b40 55443 switch (instr & 0x000f0000) { 55444 case 0x00080000: { 55445 // 0xfeb80b40 55446 if ((instr & 0x00000080) == 0x00000000) { 55447 unsigned rd = ExtractDRegister(instr, 22, 12); 55448 unsigned rm = ExtractDRegister(instr, 5, 0); 55449 // VRINTA{<q>}.F64 <Dd>, <Dm> ; A1 55450 vrinta(F64, DRegister(rd), DRegister(rm)); 55451 } else { 55452 UnallocatedA32(instr); 55453 } 55454 break; 55455 } 55456 case 0x00090000: { 55457 // 0xfeb90b40 55458 if ((instr & 0x00000080) == 0x00000000) { 55459 unsigned rd = ExtractDRegister(instr, 22, 12); 55460 unsigned rm = ExtractDRegister(instr, 5, 0); 55461 // VRINTN{<q>}.F64 <Dd>, <Dm> ; A1 55462 vrintn(F64, DRegister(rd), DRegister(rm)); 55463 } else { 55464 UnallocatedA32(instr); 55465 } 55466 break; 55467 } 55468 case 0x000a0000: { 55469 // 0xfeba0b40 55470 if ((instr & 0x00000080) == 0x00000000) { 55471 unsigned rd = ExtractDRegister(instr, 22, 12); 55472 unsigned rm = ExtractDRegister(instr, 5, 0); 55473 // VRINTP{<q>}.F64 <Dd>, <Dm> ; A1 55474 vrintp(F64, DRegister(rd), DRegister(rm)); 55475 } else { 55476 UnallocatedA32(instr); 55477 } 55478 break; 55479 } 55480 case 0x000b0000: { 55481 // 0xfebb0b40 55482 if ((instr & 0x00000080) == 0x00000000) { 55483 unsigned rd = ExtractDRegister(instr, 22, 12); 55484 unsigned rm = ExtractDRegister(instr, 5, 0); 55485 // VRINTM{<q>}.F64 <Dd>, <Dm> ; A1 55486 vrintm(F64, DRegister(rd), DRegister(rm)); 55487 } else { 55488 UnallocatedA32(instr); 55489 } 55490 break; 55491 } 55492 case 0x000c0000: { 55493 // 0xfebc0b40 55494 DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1); 55495 if (dt.Is(kDataTypeValueInvalid)) { 55496 UnallocatedA32(instr); 55497 return; 55498 } 55499 unsigned rd = ExtractSRegister(instr, 22, 12); 55500 unsigned rm = ExtractDRegister(instr, 5, 0); 55501 // VCVTA{<q>}.<dt>.F64 <Sd>, <Dm> ; A1 55502 vcvta(dt, F64, SRegister(rd), DRegister(rm)); 55503 break; 55504 } 55505 case 0x000d0000: { 55506 // 0xfebd0b40 55507 DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1); 55508 if (dt.Is(kDataTypeValueInvalid)) { 55509 UnallocatedA32(instr); 55510 return; 55511 } 55512 unsigned rd = ExtractSRegister(instr, 22, 12); 55513 unsigned rm = ExtractDRegister(instr, 5, 0); 55514 // VCVTN{<q>}.<dt>.F64 <Sd>, <Dm> ; A1 55515 vcvtn(dt, F64, SRegister(rd), DRegister(rm)); 55516 break; 55517 } 55518 case 0x000e0000: { 55519 // 0xfebe0b40 55520 DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1); 55521 if (dt.Is(kDataTypeValueInvalid)) { 55522 UnallocatedA32(instr); 55523 return; 55524 } 55525 unsigned rd = ExtractSRegister(instr, 22, 12); 55526 unsigned rm = ExtractDRegister(instr, 5, 0); 55527 // VCVTP{<q>}.<dt>.F64 <Sd>, <Dm> ; A1 55528 vcvtp(dt, F64, SRegister(rd), DRegister(rm)); 55529 break; 55530 } 55531 case 0x000f0000: { 55532 // 0xfebf0b40 55533 DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1); 55534 if (dt.Is(kDataTypeValueInvalid)) { 55535 UnallocatedA32(instr); 55536 return; 55537 } 55538 unsigned rd = ExtractSRegister(instr, 22, 12); 55539 unsigned rm = ExtractDRegister(instr, 5, 0); 55540 // VCVTM{<q>}.<dt>.F64 <Sd>, <Dm> ; A1 55541 vcvtm(dt, F64, SRegister(rd), DRegister(rm)); 55542 break; 55543 } 55544 default: 55545 UnallocatedA32(instr); 55546 break; 55547 } 55548 break; 55549 } 55550 default: 55551 UnallocatedA32(instr); 55552 break; 55553 } 55554 break; 55555 } 55556 default: 55557 UnallocatedA32(instr); 55558 break; 55559 } 55560 } else { 55561 switch (instr & 0x0e000000) { 55562 case 0x00000000: { 55563 // 0x00000000 55564 switch (instr & 0x00100010) { 55565 case 0x00000000: { 55566 // 0x00000000 55567 switch (instr & 0x01a00000) { 55568 case 0x00000000: { 55569 // 0x00000000 55570 switch (instr & 0x00400000) { 55571 case 0x00000000: { 55572 // 0x00000000 55573 switch (instr & 0x00000fe0) { 55574 case 0x00000060: { 55575 // 0x00000060 55576 if (((instr & 0xf0000000) == 0xf0000000)) { 55577 UnallocatedA32(instr); 55578 return; 55579 } 55580 Condition condition((instr >> 28) & 0xf); 55581 unsigned rd = (instr >> 12) & 0xf; 55582 unsigned rn = (instr >> 16) & 0xf; 55583 unsigned rm = instr & 0xf; 55584 // AND{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1 55585 and_(condition, 55586 Best, 55587 Register(rd), 55588 Register(rn), 55589 Operand(Register(rm), RRX)); 55590 break; 55591 } 55592 default: { 55593 if (((instr & 0xf0000000) == 0xf0000000) || 55594 ((instr & 0xfe0) == 0x60)) { 55595 UnallocatedA32(instr); 55596 return; 55597 } 55598 Condition condition((instr >> 28) & 0xf); 55599 unsigned rd = (instr >> 12) & 0xf; 55600 unsigned rn = (instr >> 16) & 0xf; 55601 unsigned rm = instr & 0xf; 55602 ImmediateShiftOperand shift_operand((instr >> 5) & 0x3, 55603 (instr >> 7) & 55604 0x1f); 55605 // AND{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length) 55606 and_(condition, 55607 Best, 55608 Register(rd), 55609 Register(rn), 55610 Operand(Register(rm), 55611 shift_operand.GetType(), 55612 shift_operand.GetAmount())); 55613 break; 55614 } 55615 } 55616 break; 55617 } 55618 case 0x00400000: { 55619 // 0x00400000 55620 switch (instr & 0x000f0000) { 55621 case 0x000d0000: { 55622 // 0x004d0000 55623 switch (instr & 0x00000fe0) { 55624 case 0x00000060: { 55625 // 0x004d0060 55626 if (((instr & 0xf0000000) == 0xf0000000)) { 55627 UnallocatedA32(instr); 55628 return; 55629 } 55630 Condition condition((instr >> 28) & 0xf); 55631 unsigned rd = (instr >> 12) & 0xf; 55632 unsigned rm = instr & 0xf; 55633 // SUB{<c>}{<q>} {<Rd>}, SP, <Rm>, RRX ; A1 55634 sub(condition, 55635 Best, 55636 Register(rd), 55637 sp, 55638 Operand(Register(rm), RRX)); 55639 break; 55640 } 55641 default: { 55642 if (((instr & 0xf0000000) == 0xf0000000) || 55643 ((instr & 0xfe0) == 0x60)) { 55644 UnallocatedA32(instr); 55645 return; 55646 } 55647 Condition condition((instr >> 28) & 0xf); 55648 unsigned rd = (instr >> 12) & 0xf; 55649 unsigned rm = instr & 0xf; 55650 ImmediateShiftOperand shift_operand((instr >> 5) & 55651 0x3, 55652 (instr >> 7) & 55653 0x1f); 55654 // SUB{<c>}{<q>} {<Rd>}, SP, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length) 55655 sub(condition, 55656 Best, 55657 Register(rd), 55658 sp, 55659 Operand(Register(rm), 55660 shift_operand.GetType(), 55661 shift_operand.GetAmount())); 55662 break; 55663 } 55664 } 55665 break; 55666 } 55667 default: { 55668 switch (instr & 0x00000fe0) { 55669 case 0x00000060: { 55670 // 0x00400060 55671 if (((instr & 0xf0000000) == 0xf0000000) || 55672 ((instr & 0xf0000) == 0xd0000)) { 55673 UnallocatedA32(instr); 55674 return; 55675 } 55676 Condition condition((instr >> 28) & 0xf); 55677 unsigned rd = (instr >> 12) & 0xf; 55678 unsigned rn = (instr >> 16) & 0xf; 55679 unsigned rm = instr & 0xf; 55680 // SUB{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1 55681 sub(condition, 55682 Best, 55683 Register(rd), 55684 Register(rn), 55685 Operand(Register(rm), RRX)); 55686 break; 55687 } 55688 default: { 55689 if (((instr & 0xf0000000) == 0xf0000000) || 55690 ((instr & 0xf0000) == 0xd0000) || 55691 ((instr & 0xfe0) == 0x60)) { 55692 UnallocatedA32(instr); 55693 return; 55694 } 55695 Condition condition((instr >> 28) & 0xf); 55696 unsigned rd = (instr >> 12) & 0xf; 55697 unsigned rn = (instr >> 16) & 0xf; 55698 unsigned rm = instr & 0xf; 55699 ImmediateShiftOperand shift_operand((instr >> 5) & 55700 0x3, 55701 (instr >> 7) & 55702 0x1f); 55703 // SUB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length) 55704 sub(condition, 55705 Best, 55706 Register(rd), 55707 Register(rn), 55708 Operand(Register(rm), 55709 shift_operand.GetType(), 55710 shift_operand.GetAmount())); 55711 break; 55712 } 55713 } 55714 break; 55715 } 55716 } 55717 break; 55718 } 55719 } 55720 break; 55721 } 55722 case 0x00200000: { 55723 // 0x00200000 55724 switch (instr & 0x00400000) { 55725 case 0x00000000: { 55726 // 0x00200000 55727 switch (instr & 0x00000fe0) { 55728 case 0x00000060: { 55729 // 0x00200060 55730 if (((instr & 0xf0000000) == 0xf0000000)) { 55731 UnallocatedA32(instr); 55732 return; 55733 } 55734 Condition condition((instr >> 28) & 0xf); 55735 unsigned rd = (instr >> 12) & 0xf; 55736 unsigned rn = (instr >> 16) & 0xf; 55737 unsigned rm = instr & 0xf; 55738 // EOR{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1 55739 eor(condition, 55740 Best, 55741 Register(rd), 55742 Register(rn), 55743 Operand(Register(rm), RRX)); 55744 break; 55745 } 55746 default: { 55747 if (((instr & 0xf0000000) == 0xf0000000) || 55748 ((instr & 0xfe0) == 0x60)) { 55749 UnallocatedA32(instr); 55750 return; 55751 } 55752 Condition condition((instr >> 28) & 0xf); 55753 unsigned rd = (instr >> 12) & 0xf; 55754 unsigned rn = (instr >> 16) & 0xf; 55755 unsigned rm = instr & 0xf; 55756 ImmediateShiftOperand shift_operand((instr >> 5) & 0x3, 55757 (instr >> 7) & 55758 0x1f); 55759 // EOR{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length) 55760 eor(condition, 55761 Best, 55762 Register(rd), 55763 Register(rn), 55764 Operand(Register(rm), 55765 shift_operand.GetType(), 55766 shift_operand.GetAmount())); 55767 break; 55768 } 55769 } 55770 break; 55771 } 55772 case 0x00400000: { 55773 // 0x00600000 55774 switch (instr & 0x00000fe0) { 55775 case 0x00000060: { 55776 // 0x00600060 55777 if (((instr & 0xf0000000) == 0xf0000000)) { 55778 UnallocatedA32(instr); 55779 return; 55780 } 55781 Condition condition((instr >> 28) & 0xf); 55782 unsigned rd = (instr >> 12) & 0xf; 55783 unsigned rn = (instr >> 16) & 0xf; 55784 unsigned rm = instr & 0xf; 55785 // RSB{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1 55786 rsb(condition, 55787 Best, 55788 Register(rd), 55789 Register(rn), 55790 Operand(Register(rm), RRX)); 55791 break; 55792 } 55793 default: { 55794 if (((instr & 0xf0000000) == 0xf0000000) || 55795 ((instr & 0xfe0) == 0x60)) { 55796 UnallocatedA32(instr); 55797 return; 55798 } 55799 Condition condition((instr >> 28) & 0xf); 55800 unsigned rd = (instr >> 12) & 0xf; 55801 unsigned rn = (instr >> 16) & 0xf; 55802 unsigned rm = instr & 0xf; 55803 ImmediateShiftOperand shift_operand((instr >> 5) & 0x3, 55804 (instr >> 7) & 55805 0x1f); 55806 // RSB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length) 55807 rsb(condition, 55808 Best, 55809 Register(rd), 55810 Register(rn), 55811 Operand(Register(rm), 55812 shift_operand.GetType(), 55813 shift_operand.GetAmount())); 55814 break; 55815 } 55816 } 55817 break; 55818 } 55819 } 55820 break; 55821 } 55822 case 0x00800000: { 55823 // 0x00800000 55824 switch (instr & 0x00400000) { 55825 case 0x00000000: { 55826 // 0x00800000 55827 switch (instr & 0x000f0000) { 55828 case 0x000d0000: { 55829 // 0x008d0000 55830 switch (instr & 0x00000fe0) { 55831 case 0x00000060: { 55832 // 0x008d0060 55833 if (((instr & 0xf0000000) == 0xf0000000)) { 55834 UnallocatedA32(instr); 55835 return; 55836 } 55837 Condition condition((instr >> 28) & 0xf); 55838 unsigned rd = (instr >> 12) & 0xf; 55839 unsigned rm = instr & 0xf; 55840 // ADD{<c>}{<q>} {<Rd>}, SP, <Rm>, RRX ; A1 55841 add(condition, 55842 Best, 55843 Register(rd), 55844 sp, 55845 Operand(Register(rm), RRX)); 55846 break; 55847 } 55848 default: { 55849 if (((instr & 0xf0000000) == 0xf0000000) || 55850 ((instr & 0xfe0) == 0x60)) { 55851 UnallocatedA32(instr); 55852 return; 55853 } 55854 Condition condition((instr >> 28) & 0xf); 55855 unsigned rd = (instr >> 12) & 0xf; 55856 unsigned rm = instr & 0xf; 55857 ImmediateShiftOperand shift_operand((instr >> 5) & 55858 0x3, 55859 (instr >> 7) & 55860 0x1f); 55861 // ADD{<c>}{<q>} {<Rd>}, SP, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length) 55862 add(condition, 55863 Best, 55864 Register(rd), 55865 sp, 55866 Operand(Register(rm), 55867 shift_operand.GetType(), 55868 shift_operand.GetAmount())); 55869 break; 55870 } 55871 } 55872 break; 55873 } 55874 default: { 55875 switch (instr & 0x00000fe0) { 55876 case 0x00000060: { 55877 // 0x00800060 55878 if (((instr & 0xf0000000) == 0xf0000000) || 55879 ((instr & 0xf0000) == 0xd0000)) { 55880 UnallocatedA32(instr); 55881 return; 55882 } 55883 Condition condition((instr >> 28) & 0xf); 55884 unsigned rd = (instr >> 12) & 0xf; 55885 unsigned rn = (instr >> 16) & 0xf; 55886 unsigned rm = instr & 0xf; 55887 // ADD{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1 55888 add(condition, 55889 Best, 55890 Register(rd), 55891 Register(rn), 55892 Operand(Register(rm), RRX)); 55893 break; 55894 } 55895 default: { 55896 if (((instr & 0xf0000000) == 0xf0000000) || 55897 ((instr & 0xf0000) == 0xd0000) || 55898 ((instr & 0xfe0) == 0x60)) { 55899 UnallocatedA32(instr); 55900 return; 55901 } 55902 Condition condition((instr >> 28) & 0xf); 55903 unsigned rd = (instr >> 12) & 0xf; 55904 unsigned rn = (instr >> 16) & 0xf; 55905 unsigned rm = instr & 0xf; 55906 ImmediateShiftOperand shift_operand((instr >> 5) & 55907 0x3, 55908 (instr >> 7) & 55909 0x1f); 55910 // ADD{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length) 55911 add(condition, 55912 Best, 55913 Register(rd), 55914 Register(rn), 55915 Operand(Register(rm), 55916 shift_operand.GetType(), 55917 shift_operand.GetAmount())); 55918 break; 55919 } 55920 } 55921 break; 55922 } 55923 } 55924 break; 55925 } 55926 case 0x00400000: { 55927 // 0x00c00000 55928 switch (instr & 0x00000fe0) { 55929 case 0x00000060: { 55930 // 0x00c00060 55931 if (((instr & 0xf0000000) == 0xf0000000)) { 55932 UnallocatedA32(instr); 55933 return; 55934 } 55935 Condition condition((instr >> 28) & 0xf); 55936 unsigned rd = (instr >> 12) & 0xf; 55937 unsigned rn = (instr >> 16) & 0xf; 55938 unsigned rm = instr & 0xf; 55939 // SBC{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1 55940 sbc(condition, 55941 Best, 55942 Register(rd), 55943 Register(rn), 55944 Operand(Register(rm), RRX)); 55945 break; 55946 } 55947 default: { 55948 if (((instr & 0xf0000000) == 0xf0000000) || 55949 ((instr & 0xfe0) == 0x60)) { 55950 UnallocatedA32(instr); 55951 return; 55952 } 55953 Condition condition((instr >> 28) & 0xf); 55954 unsigned rd = (instr >> 12) & 0xf; 55955 unsigned rn = (instr >> 16) & 0xf; 55956 unsigned rm = instr & 0xf; 55957 ImmediateShiftOperand shift_operand((instr >> 5) & 0x3, 55958 (instr >> 7) & 55959 0x1f); 55960 // SBC{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length) 55961 sbc(condition, 55962 Best, 55963 Register(rd), 55964 Register(rn), 55965 Operand(Register(rm), 55966 shift_operand.GetType(), 55967 shift_operand.GetAmount())); 55968 break; 55969 } 55970 } 55971 break; 55972 } 55973 } 55974 break; 55975 } 55976 case 0x00a00000: { 55977 // 0x00a00000 55978 switch (instr & 0x00400000) { 55979 case 0x00000000: { 55980 // 0x00a00000 55981 switch (instr & 0x00000fe0) { 55982 case 0x00000060: { 55983 // 0x00a00060 55984 if (((instr & 0xf0000000) == 0xf0000000)) { 55985 UnallocatedA32(instr); 55986 return; 55987 } 55988 Condition condition((instr >> 28) & 0xf); 55989 unsigned rd = (instr >> 12) & 0xf; 55990 unsigned rn = (instr >> 16) & 0xf; 55991 unsigned rm = instr & 0xf; 55992 // ADC{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1 55993 adc(condition, 55994 Best, 55995 Register(rd), 55996 Register(rn), 55997 Operand(Register(rm), RRX)); 55998 break; 55999 } 56000 default: { 56001 if (((instr & 0xf0000000) == 0xf0000000) || 56002 ((instr & 0xfe0) == 0x60)) { 56003 UnallocatedA32(instr); 56004 return; 56005 } 56006 Condition condition((instr >> 28) & 0xf); 56007 unsigned rd = (instr >> 12) & 0xf; 56008 unsigned rn = (instr >> 16) & 0xf; 56009 unsigned rm = instr & 0xf; 56010 ImmediateShiftOperand shift_operand((instr >> 5) & 0x3, 56011 (instr >> 7) & 56012 0x1f); 56013 // ADC{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length) 56014 adc(condition, 56015 Best, 56016 Register(rd), 56017 Register(rn), 56018 Operand(Register(rm), 56019 shift_operand.GetType(), 56020 shift_operand.GetAmount())); 56021 break; 56022 } 56023 } 56024 break; 56025 } 56026 case 0x00400000: { 56027 // 0x00e00000 56028 switch (instr & 0x00000fe0) { 56029 case 0x00000060: { 56030 // 0x00e00060 56031 if (((instr & 0xf0000000) == 0xf0000000)) { 56032 UnallocatedA32(instr); 56033 return; 56034 } 56035 Condition condition((instr >> 28) & 0xf); 56036 unsigned rd = (instr >> 12) & 0xf; 56037 unsigned rn = (instr >> 16) & 0xf; 56038 unsigned rm = instr & 0xf; 56039 // RSC{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1 56040 rsc(condition, 56041 Register(rd), 56042 Register(rn), 56043 Operand(Register(rm), RRX)); 56044 break; 56045 } 56046 default: { 56047 if (((instr & 0xf0000000) == 0xf0000000) || 56048 ((instr & 0xfe0) == 0x60)) { 56049 UnallocatedA32(instr); 56050 return; 56051 } 56052 Condition condition((instr >> 28) & 0xf); 56053 unsigned rd = (instr >> 12) & 0xf; 56054 unsigned rn = (instr >> 16) & 0xf; 56055 unsigned rm = instr & 0xf; 56056 ImmediateShiftOperand shift_operand((instr >> 5) & 0x3, 56057 (instr >> 7) & 56058 0x1f); 56059 // RSC{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length) 56060 rsc(condition, 56061 Register(rd), 56062 Register(rn), 56063 Operand(Register(rm), 56064 shift_operand.GetType(), 56065 shift_operand.GetAmount())); 56066 break; 56067 } 56068 } 56069 break; 56070 } 56071 } 56072 break; 56073 } 56074 case 0x01000000: { 56075 // 0x01000000 56076 switch (instr & 0x000000e0) { 56077 case 0x00000000: { 56078 // 0x01000000 56079 switch (instr & 0x00000200) { 56080 case 0x00000000: { 56081 // 0x01000000 56082 if (((instr & 0xf0000000) == 0xf0000000)) { 56083 UnallocatedA32(instr); 56084 return; 56085 } 56086 Condition condition((instr >> 28) & 0xf); 56087 unsigned rd = (instr >> 12) & 0xf; 56088 unsigned spec_reg = (instr >> 22) & 0x1; 56089 // MRS{<c>}{<q>} <Rd>, <spec_reg> ; A1 56090 mrs(condition, Register(rd), SpecialRegister(spec_reg)); 56091 if (((instr & 0xfbf0fff) != 0x10f0000)) { 56092 UnpredictableA32(instr); 56093 } 56094 break; 56095 } 56096 case 0x00000200: { 56097 // 0x01000200 56098 if (((instr & 0xf0000000) == 0xf0000000)) { 56099 UnallocatedA32(instr); 56100 return; 56101 } 56102 UnimplementedA32("MRS", instr); 56103 break; 56104 } 56105 } 56106 break; 56107 } 56108 case 0x00000040: { 56109 // 0x01000040 56110 switch (instr & 0x00400200) { 56111 case 0x00000000: { 56112 // 0x01000040 56113 if (((instr & 0xf0000000) == 0xf0000000)) { 56114 UnallocatedA32(instr); 56115 return; 56116 } 56117 unsigned rd = (instr >> 12) & 0xf; 56118 unsigned rn = (instr >> 16) & 0xf; 56119 unsigned rm = instr & 0xf; 56120 // CRC32B{<q>} <Rd>, <Rn>, <Rm> ; A1 56121 crc32b(al, Register(rd), Register(rn), Register(rm)); 56122 if (((instr & 0xff00ff0) != 0x1000040)) { 56123 UnpredictableA32(instr); 56124 } 56125 break; 56126 } 56127 case 0x00000200: { 56128 // 0x01000240 56129 if (((instr & 0xf0000000) == 0xf0000000)) { 56130 UnallocatedA32(instr); 56131 return; 56132 } 56133 unsigned rd = (instr >> 12) & 0xf; 56134 unsigned rn = (instr >> 16) & 0xf; 56135 unsigned rm = instr & 0xf; 56136 // CRC32CB{<q>} <Rd>, <Rn>, <Rm> ; A1 56137 crc32cb(al, Register(rd), Register(rn), Register(rm)); 56138 if (((instr & 0xff00ff0) != 0x1000240)) { 56139 UnpredictableA32(instr); 56140 } 56141 break; 56142 } 56143 case 0x00400000: { 56144 // 0x01400040 56145 if (((instr & 0xf0000000) == 0xf0000000)) { 56146 UnallocatedA32(instr); 56147 return; 56148 } 56149 unsigned rd = (instr >> 12) & 0xf; 56150 unsigned rn = (instr >> 16) & 0xf; 56151 unsigned rm = instr & 0xf; 56152 // CRC32W{<q>} <Rd>, <Rn>, <Rm> ; A1 56153 crc32w(al, Register(rd), Register(rn), Register(rm)); 56154 if (((instr & 0xff00ff0) != 0x1400040)) { 56155 UnpredictableA32(instr); 56156 } 56157 break; 56158 } 56159 case 0x00400200: { 56160 // 0x01400240 56161 if (((instr & 0xf0000000) == 0xf0000000)) { 56162 UnallocatedA32(instr); 56163 return; 56164 } 56165 unsigned rd = (instr >> 12) & 0xf; 56166 unsigned rn = (instr >> 16) & 0xf; 56167 unsigned rm = instr & 0xf; 56168 // CRC32CW{<q>} <Rd>, <Rn>, <Rm> ; A1 56169 crc32cw(al, Register(rd), Register(rn), Register(rm)); 56170 if (((instr & 0xff00ff0) != 0x1400240)) { 56171 UnpredictableA32(instr); 56172 } 56173 break; 56174 } 56175 } 56176 break; 56177 } 56178 case 0x00000080: { 56179 // 0x01000080 56180 switch (instr & 0x00400000) { 56181 case 0x00000000: { 56182 // 0x01000080 56183 if (((instr & 0xf0000000) == 0xf0000000)) { 56184 UnallocatedA32(instr); 56185 return; 56186 } 56187 Condition condition((instr >> 28) & 0xf); 56188 unsigned rd = (instr >> 16) & 0xf; 56189 unsigned rn = instr & 0xf; 56190 unsigned rm = (instr >> 8) & 0xf; 56191 unsigned ra = (instr >> 12) & 0xf; 56192 // SMLABB{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1 56193 smlabb(condition, 56194 Register(rd), 56195 Register(rn), 56196 Register(rm), 56197 Register(ra)); 56198 break; 56199 } 56200 case 0x00400000: { 56201 // 0x01400080 56202 if (((instr & 0xf0000000) == 0xf0000000)) { 56203 UnallocatedA32(instr); 56204 return; 56205 } 56206 Condition condition((instr >> 28) & 0xf); 56207 unsigned rdlo = (instr >> 12) & 0xf; 56208 unsigned rdhi = (instr >> 16) & 0xf; 56209 unsigned rn = instr & 0xf; 56210 unsigned rm = (instr >> 8) & 0xf; 56211 // SMLALBB{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1 56212 smlalbb(condition, 56213 Register(rdlo), 56214 Register(rdhi), 56215 Register(rn), 56216 Register(rm)); 56217 break; 56218 } 56219 } 56220 break; 56221 } 56222 case 0x000000a0: { 56223 // 0x010000a0 56224 switch (instr & 0x00400000) { 56225 case 0x00000000: { 56226 // 0x010000a0 56227 if (((instr & 0xf0000000) == 0xf0000000)) { 56228 UnallocatedA32(instr); 56229 return; 56230 } 56231 Condition condition((instr >> 28) & 0xf); 56232 unsigned rd = (instr >> 16) & 0xf; 56233 unsigned rn = instr & 0xf; 56234 unsigned rm = (instr >> 8) & 0xf; 56235 unsigned ra = (instr >> 12) & 0xf; 56236 // SMLATB{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1 56237 smlatb(condition, 56238 Register(rd), 56239 Register(rn), 56240 Register(rm), 56241 Register(ra)); 56242 break; 56243 } 56244 case 0x00400000: { 56245 // 0x014000a0 56246 if (((instr & 0xf0000000) == 0xf0000000)) { 56247 UnallocatedA32(instr); 56248 return; 56249 } 56250 Condition condition((instr >> 28) & 0xf); 56251 unsigned rdlo = (instr >> 12) & 0xf; 56252 unsigned rdhi = (instr >> 16) & 0xf; 56253 unsigned rn = instr & 0xf; 56254 unsigned rm = (instr >> 8) & 0xf; 56255 // SMLALTB{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1 56256 smlaltb(condition, 56257 Register(rdlo), 56258 Register(rdhi), 56259 Register(rn), 56260 Register(rm)); 56261 break; 56262 } 56263 } 56264 break; 56265 } 56266 case 0x000000c0: { 56267 // 0x010000c0 56268 switch (instr & 0x00400000) { 56269 case 0x00000000: { 56270 // 0x010000c0 56271 if (((instr & 0xf0000000) == 0xf0000000)) { 56272 UnallocatedA32(instr); 56273 return; 56274 } 56275 Condition condition((instr >> 28) & 0xf); 56276 unsigned rd = (instr >> 16) & 0xf; 56277 unsigned rn = instr & 0xf; 56278 unsigned rm = (instr >> 8) & 0xf; 56279 unsigned ra = (instr >> 12) & 0xf; 56280 // SMLABT{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1 56281 smlabt(condition, 56282 Register(rd), 56283 Register(rn), 56284 Register(rm), 56285 Register(ra)); 56286 break; 56287 } 56288 case 0x00400000: { 56289 // 0x014000c0 56290 if (((instr & 0xf0000000) == 0xf0000000)) { 56291 UnallocatedA32(instr); 56292 return; 56293 } 56294 Condition condition((instr >> 28) & 0xf); 56295 unsigned rdlo = (instr >> 12) & 0xf; 56296 unsigned rdhi = (instr >> 16) & 0xf; 56297 unsigned rn = instr & 0xf; 56298 unsigned rm = (instr >> 8) & 0xf; 56299 // SMLALBT{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1 56300 smlalbt(condition, 56301 Register(rdlo), 56302 Register(rdhi), 56303 Register(rn), 56304 Register(rm)); 56305 break; 56306 } 56307 } 56308 break; 56309 } 56310 case 0x000000e0: { 56311 // 0x010000e0 56312 switch (instr & 0x00400000) { 56313 case 0x00000000: { 56314 // 0x010000e0 56315 if (((instr & 0xf0000000) == 0xf0000000)) { 56316 UnallocatedA32(instr); 56317 return; 56318 } 56319 Condition condition((instr >> 28) & 0xf); 56320 unsigned rd = (instr >> 16) & 0xf; 56321 unsigned rn = instr & 0xf; 56322 unsigned rm = (instr >> 8) & 0xf; 56323 unsigned ra = (instr >> 12) & 0xf; 56324 // SMLATT{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1 56325 smlatt(condition, 56326 Register(rd), 56327 Register(rn), 56328 Register(rm), 56329 Register(ra)); 56330 break; 56331 } 56332 case 0x00400000: { 56333 // 0x014000e0 56334 if (((instr & 0xf0000000) == 0xf0000000)) { 56335 UnallocatedA32(instr); 56336 return; 56337 } 56338 Condition condition((instr >> 28) & 0xf); 56339 unsigned rdlo = (instr >> 12) & 0xf; 56340 unsigned rdhi = (instr >> 16) & 0xf; 56341 unsigned rn = instr & 0xf; 56342 unsigned rm = (instr >> 8) & 0xf; 56343 // SMLALTT{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1 56344 smlaltt(condition, 56345 Register(rdlo), 56346 Register(rdhi), 56347 Register(rn), 56348 Register(rm)); 56349 break; 56350 } 56351 } 56352 break; 56353 } 56354 default: 56355 UnallocatedA32(instr); 56356 break; 56357 } 56358 break; 56359 } 56360 case 0x01200000: { 56361 // 0x01200000 56362 switch (instr & 0x000000e0) { 56363 case 0x00000000: { 56364 // 0x01200000 56365 switch (instr & 0x00000200) { 56366 case 0x00000000: { 56367 // 0x01200000 56368 if (((instr & 0xf0000000) == 0xf0000000)) { 56369 UnallocatedA32(instr); 56370 return; 56371 } 56372 Condition condition((instr >> 28) & 0xf); 56373 unsigned spec_reg = 56374 ((instr >> 16) & 0xf) | ((instr >> 18) & 0x10); 56375 unsigned rn = instr & 0xf; 56376 // MSR{<c>}{<q>} <spec_reg>, <Rn> ; A1 56377 msr(condition, 56378 MaskedSpecialRegister(spec_reg), 56379 Register(rn)); 56380 if (((instr & 0xfb0fff0) != 0x120f000)) { 56381 UnpredictableA32(instr); 56382 } 56383 break; 56384 } 56385 case 0x00000200: { 56386 // 0x01200200 56387 if (((instr & 0xf0000000) == 0xf0000000)) { 56388 UnallocatedA32(instr); 56389 return; 56390 } 56391 UnimplementedA32("MSR", instr); 56392 break; 56393 } 56394 } 56395 break; 56396 } 56397 case 0x00000020: { 56398 // 0x01200020 56399 if ((instr & 0x00400000) == 0x00000000) { 56400 if (((instr & 0xf0000000) == 0xf0000000)) { 56401 UnallocatedA32(instr); 56402 return; 56403 } 56404 Condition condition((instr >> 28) & 0xf); 56405 unsigned rm = instr & 0xf; 56406 // BXJ{<c>}{<q>} <Rm> ; A1 56407 bxj(condition, Register(rm)); 56408 if (((instr & 0xffffff0) != 0x12fff20)) { 56409 UnpredictableA32(instr); 56410 } 56411 } else { 56412 UnallocatedA32(instr); 56413 } 56414 break; 56415 } 56416 case 0x00000040: { 56417 // 0x01200040 56418 switch (instr & 0x00400200) { 56419 case 0x00000000: { 56420 // 0x01200040 56421 if (((instr & 0xf0000000) == 0xf0000000)) { 56422 UnallocatedA32(instr); 56423 return; 56424 } 56425 unsigned rd = (instr >> 12) & 0xf; 56426 unsigned rn = (instr >> 16) & 0xf; 56427 unsigned rm = instr & 0xf; 56428 // CRC32H{<q>} <Rd>, <Rn>, <Rm> ; A1 56429 crc32h(al, Register(rd), Register(rn), Register(rm)); 56430 if (((instr & 0xff00ff0) != 0x1200040)) { 56431 UnpredictableA32(instr); 56432 } 56433 break; 56434 } 56435 case 0x00000200: { 56436 // 0x01200240 56437 if (((instr & 0xf0000000) == 0xf0000000)) { 56438 UnallocatedA32(instr); 56439 return; 56440 } 56441 unsigned rd = (instr >> 12) & 0xf; 56442 unsigned rn = (instr >> 16) & 0xf; 56443 unsigned rm = instr & 0xf; 56444 // CRC32CH{<q>} <Rd>, <Rn>, <Rm> ; A1 56445 crc32ch(al, Register(rd), Register(rn), Register(rm)); 56446 if (((instr & 0xff00ff0) != 0x1200240)) { 56447 UnpredictableA32(instr); 56448 } 56449 break; 56450 } 56451 default: 56452 UnallocatedA32(instr); 56453 break; 56454 } 56455 break; 56456 } 56457 case 0x00000060: { 56458 // 0x01200060 56459 if ((instr & 0x00400000) == 0x00400000) { 56460 if (((instr & 0xf0000000) == 0xf0000000)) { 56461 UnallocatedA32(instr); 56462 return; 56463 } 56464 UnimplementedA32("ERET", instr); 56465 } else { 56466 UnallocatedA32(instr); 56467 } 56468 break; 56469 } 56470 case 0x00000080: { 56471 // 0x01200080 56472 switch (instr & 0x00400000) { 56473 case 0x00000000: { 56474 // 0x01200080 56475 if (((instr & 0xf0000000) == 0xf0000000)) { 56476 UnallocatedA32(instr); 56477 return; 56478 } 56479 Condition condition((instr >> 28) & 0xf); 56480 unsigned rd = (instr >> 16) & 0xf; 56481 unsigned rn = instr & 0xf; 56482 unsigned rm = (instr >> 8) & 0xf; 56483 unsigned ra = (instr >> 12) & 0xf; 56484 // SMLAWB{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1 56485 smlawb(condition, 56486 Register(rd), 56487 Register(rn), 56488 Register(rm), 56489 Register(ra)); 56490 break; 56491 } 56492 case 0x00400000: { 56493 // 0x01600080 56494 if (((instr & 0xf0000000) == 0xf0000000)) { 56495 UnallocatedA32(instr); 56496 return; 56497 } 56498 Condition condition((instr >> 28) & 0xf); 56499 unsigned rd = (instr >> 16) & 0xf; 56500 unsigned rn = instr & 0xf; 56501 unsigned rm = (instr >> 8) & 0xf; 56502 // SMULBB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1 56503 smulbb(condition, 56504 Register(rd), 56505 Register(rn), 56506 Register(rm)); 56507 if (((instr & 0xff0f0f0) != 0x1600080)) { 56508 UnpredictableA32(instr); 56509 } 56510 break; 56511 } 56512 } 56513 break; 56514 } 56515 case 0x000000a0: { 56516 // 0x012000a0 56517 switch (instr & 0x00400000) { 56518 case 0x00000000: { 56519 // 0x012000a0 56520 if (((instr & 0xf0000000) == 0xf0000000)) { 56521 UnallocatedA32(instr); 56522 return; 56523 } 56524 Condition condition((instr >> 28) & 0xf); 56525 unsigned rd = (instr >> 16) & 0xf; 56526 unsigned rn = instr & 0xf; 56527 unsigned rm = (instr >> 8) & 0xf; 56528 // SMULWB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1 56529 smulwb(condition, 56530 Register(rd), 56531 Register(rn), 56532 Register(rm)); 56533 if (((instr & 0xff0f0f0) != 0x12000a0)) { 56534 UnpredictableA32(instr); 56535 } 56536 break; 56537 } 56538 case 0x00400000: { 56539 // 0x016000a0 56540 if (((instr & 0xf0000000) == 0xf0000000)) { 56541 UnallocatedA32(instr); 56542 return; 56543 } 56544 Condition condition((instr >> 28) & 0xf); 56545 unsigned rd = (instr >> 16) & 0xf; 56546 unsigned rn = instr & 0xf; 56547 unsigned rm = (instr >> 8) & 0xf; 56548 // SMULTB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1 56549 smultb(condition, 56550 Register(rd), 56551 Register(rn), 56552 Register(rm)); 56553 if (((instr & 0xff0f0f0) != 0x16000a0)) { 56554 UnpredictableA32(instr); 56555 } 56556 break; 56557 } 56558 } 56559 break; 56560 } 56561 case 0x000000c0: { 56562 // 0x012000c0 56563 switch (instr & 0x00400000) { 56564 case 0x00000000: { 56565 // 0x012000c0 56566 if (((instr & 0xf0000000) == 0xf0000000)) { 56567 UnallocatedA32(instr); 56568 return; 56569 } 56570 Condition condition((instr >> 28) & 0xf); 56571 unsigned rd = (instr >> 16) & 0xf; 56572 unsigned rn = instr & 0xf; 56573 unsigned rm = (instr >> 8) & 0xf; 56574 unsigned ra = (instr >> 12) & 0xf; 56575 // SMLAWT{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1 56576 smlawt(condition, 56577 Register(rd), 56578 Register(rn), 56579 Register(rm), 56580 Register(ra)); 56581 break; 56582 } 56583 case 0x00400000: { 56584 // 0x016000c0 56585 if (((instr & 0xf0000000) == 0xf0000000)) { 56586 UnallocatedA32(instr); 56587 return; 56588 } 56589 Condition condition((instr >> 28) & 0xf); 56590 unsigned rd = (instr >> 16) & 0xf; 56591 unsigned rn = instr & 0xf; 56592 unsigned rm = (instr >> 8) & 0xf; 56593 // SMULBT{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1 56594 smulbt(condition, 56595 Register(rd), 56596 Register(rn), 56597 Register(rm)); 56598 if (((instr & 0xff0f0f0) != 0x16000c0)) { 56599 UnpredictableA32(instr); 56600 } 56601 break; 56602 } 56603 } 56604 break; 56605 } 56606 case 0x000000e0: { 56607 // 0x012000e0 56608 switch (instr & 0x00400000) { 56609 case 0x00000000: { 56610 // 0x012000e0 56611 if (((instr & 0xf0000000) == 0xf0000000)) { 56612 UnallocatedA32(instr); 56613 return; 56614 } 56615 Condition condition((instr >> 28) & 0xf); 56616 unsigned rd = (instr >> 16) & 0xf; 56617 unsigned rn = instr & 0xf; 56618 unsigned rm = (instr >> 8) & 0xf; 56619 // SMULWT{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1 56620 smulwt(condition, 56621 Register(rd), 56622 Register(rn), 56623 Register(rm)); 56624 if (((instr & 0xff0f0f0) != 0x12000e0)) { 56625 UnpredictableA32(instr); 56626 } 56627 break; 56628 } 56629 case 0x00400000: { 56630 // 0x016000e0 56631 if (((instr & 0xf0000000) == 0xf0000000)) { 56632 UnallocatedA32(instr); 56633 return; 56634 } 56635 Condition condition((instr >> 28) & 0xf); 56636 unsigned rd = (instr >> 16) & 0xf; 56637 unsigned rn = instr & 0xf; 56638 unsigned rm = (instr >> 8) & 0xf; 56639 // SMULTT{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1 56640 smultt(condition, 56641 Register(rd), 56642 Register(rn), 56643 Register(rm)); 56644 if (((instr & 0xff0f0f0) != 0x16000e0)) { 56645 UnpredictableA32(instr); 56646 } 56647 break; 56648 } 56649 } 56650 break; 56651 } 56652 } 56653 break; 56654 } 56655 case 0x01800000: { 56656 // 0x01800000 56657 switch (instr & 0x00400000) { 56658 case 0x00000000: { 56659 // 0x01800000 56660 switch (instr & 0x00000fe0) { 56661 case 0x00000060: { 56662 // 0x01800060 56663 if (((instr & 0xf0000000) == 0xf0000000)) { 56664 UnallocatedA32(instr); 56665 return; 56666 } 56667 Condition condition((instr >> 28) & 0xf); 56668 unsigned rd = (instr >> 12) & 0xf; 56669 unsigned rn = (instr >> 16) & 0xf; 56670 unsigned rm = instr & 0xf; 56671 // ORR{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1 56672 orr(condition, 56673 Best, 56674 Register(rd), 56675 Register(rn), 56676 Operand(Register(rm), RRX)); 56677 break; 56678 } 56679 default: { 56680 if (((instr & 0xf0000000) == 0xf0000000) || 56681 ((instr & 0xfe0) == 0x60)) { 56682 UnallocatedA32(instr); 56683 return; 56684 } 56685 Condition condition((instr >> 28) & 0xf); 56686 unsigned rd = (instr >> 12) & 0xf; 56687 unsigned rn = (instr >> 16) & 0xf; 56688 unsigned rm = instr & 0xf; 56689 ImmediateShiftOperand shift_operand((instr >> 5) & 0x3, 56690 (instr >> 7) & 56691 0x1f); 56692 // ORR{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length) 56693 orr(condition, 56694 Best, 56695 Register(rd), 56696 Register(rn), 56697 Operand(Register(rm), 56698 shift_operand.GetType(), 56699 shift_operand.GetAmount())); 56700 break; 56701 } 56702 } 56703 break; 56704 } 56705 case 0x00400000: { 56706 // 0x01c00000 56707 switch (instr & 0x00000fe0) { 56708 case 0x00000060: { 56709 // 0x01c00060 56710 if (((instr & 0xf0000000) == 0xf0000000)) { 56711 UnallocatedA32(instr); 56712 return; 56713 } 56714 Condition condition((instr >> 28) & 0xf); 56715 unsigned rd = (instr >> 12) & 0xf; 56716 unsigned rn = (instr >> 16) & 0xf; 56717 unsigned rm = instr & 0xf; 56718 // BIC{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1 56719 bic(condition, 56720 Best, 56721 Register(rd), 56722 Register(rn), 56723 Operand(Register(rm), RRX)); 56724 break; 56725 } 56726 default: { 56727 if (((instr & 0xf0000000) == 0xf0000000) || 56728 ((instr & 0xfe0) == 0x60)) { 56729 UnallocatedA32(instr); 56730 return; 56731 } 56732 Condition condition((instr >> 28) & 0xf); 56733 unsigned rd = (instr >> 12) & 0xf; 56734 unsigned rn = (instr >> 16) & 0xf; 56735 unsigned rm = instr & 0xf; 56736 ImmediateShiftOperand shift_operand((instr >> 5) & 0x3, 56737 (instr >> 7) & 56738 0x1f); 56739 // BIC{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length) 56740 bic(condition, 56741 Best, 56742 Register(rd), 56743 Register(rn), 56744 Operand(Register(rm), 56745 shift_operand.GetType(), 56746 shift_operand.GetAmount())); 56747 break; 56748 } 56749 } 56750 break; 56751 } 56752 } 56753 break; 56754 } 56755 case 0x01a00000: { 56756 // 0x01a00000 56757 switch (instr & 0x00400000) { 56758 case 0x00000000: { 56759 // 0x01a00000 56760 switch (instr & 0x00000fe0) { 56761 case 0x00000060: { 56762 // 0x01a00060 56763 if (((instr & 0xf0000000) == 0xf0000000)) { 56764 UnallocatedA32(instr); 56765 return; 56766 } 56767 if (((instr & 0xf0000000) != 0xf0000000)) { 56768 Condition condition((instr >> 28) & 0xf); 56769 unsigned rd = (instr >> 12) & 0xf; 56770 unsigned rm = instr & 0xf; 56771 // RRX{<c>}{<q>} {<Rd>}, <Rm> ; A1 56772 rrx(condition, Register(rd), Register(rm)); 56773 if (((instr & 0xfff0ff0) != 0x1a00060)) { 56774 UnpredictableA32(instr); 56775 } 56776 return; 56777 } 56778 Condition condition((instr >> 28) & 0xf); 56779 unsigned rd = (instr >> 12) & 0xf; 56780 unsigned rm = instr & 0xf; 56781 // MOV{<c>}{<q>} <Rd>, <Rm>, RRX ; A1 56782 mov(condition, 56783 Best, 56784 Register(rd), 56785 Operand(Register(rm), RRX)); 56786 if (((instr & 0xfff0ff0) != 0x1a00060)) { 56787 UnpredictableA32(instr); 56788 } 56789 break; 56790 } 56791 default: { 56792 if (((instr & 0xf0000000) == 0xf0000000) || 56793 ((instr & 0xfe0) == 0x60)) { 56794 UnallocatedA32(instr); 56795 return; 56796 } 56797 if (((Uint32((instr >> 5)) & Uint32(0x3)) == 56798 Uint32(0x2)) && 56799 ((instr & 0xf0000000) != 0xf0000000)) { 56800 Condition condition((instr >> 28) & 0xf); 56801 unsigned rd = (instr >> 12) & 0xf; 56802 unsigned rm = instr & 0xf; 56803 uint32_t amount = (instr >> 7) & 0x1f; 56804 if (amount == 0) amount = 32; 56805 // ASR{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; A1 56806 asr(condition, 56807 Best, 56808 Register(rd), 56809 Register(rm), 56810 amount); 56811 if (((instr & 0xfff0070) != 0x1a00040)) { 56812 UnpredictableA32(instr); 56813 } 56814 return; 56815 } 56816 if (((Uint32((instr >> 5)) & Uint32(0x3)) == 56817 Uint32(0x0)) && 56818 ((instr & 0xf0000000) != 0xf0000000) && 56819 ((instr & 0x00000f80) != 0x00000000)) { 56820 Condition condition((instr >> 28) & 0xf); 56821 unsigned rd = (instr >> 12) & 0xf; 56822 unsigned rm = instr & 0xf; 56823 uint32_t amount = (instr >> 7) & 0x1f; 56824 // LSL{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; A1 56825 lsl(condition, 56826 Best, 56827 Register(rd), 56828 Register(rm), 56829 amount); 56830 if (((instr & 0xfff0070) != 0x1a00000)) { 56831 UnpredictableA32(instr); 56832 } 56833 return; 56834 } 56835 if (((Uint32((instr >> 5)) & Uint32(0x3)) == 56836 Uint32(0x1)) && 56837 ((instr & 0xf0000000) != 0xf0000000)) { 56838 Condition condition((instr >> 28) & 0xf); 56839 unsigned rd = (instr >> 12) & 0xf; 56840 unsigned rm = instr & 0xf; 56841 uint32_t amount = (instr >> 7) & 0x1f; 56842 if (amount == 0) amount = 32; 56843 // LSR{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; A1 56844 lsr(condition, 56845 Best, 56846 Register(rd), 56847 Register(rm), 56848 amount); 56849 if (((instr & 0xfff0070) != 0x1a00020)) { 56850 UnpredictableA32(instr); 56851 } 56852 return; 56853 } 56854 if (((Uint32((instr >> 5)) & Uint32(0x3)) == 56855 Uint32(0x3)) && 56856 ((instr & 0xf0000000) != 0xf0000000) && 56857 ((instr & 0x00000f80) != 0x00000000)) { 56858 Condition condition((instr >> 28) & 0xf); 56859 unsigned rd = (instr >> 12) & 0xf; 56860 unsigned rm = instr & 0xf; 56861 uint32_t amount = (instr >> 7) & 0x1f; 56862 // ROR{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; A1 56863 ror(condition, 56864 Best, 56865 Register(rd), 56866 Register(rm), 56867 amount); 56868 if (((instr & 0xfff0070) != 0x1a00060)) { 56869 UnpredictableA32(instr); 56870 } 56871 return; 56872 } 56873 Condition condition((instr >> 28) & 0xf); 56874 unsigned rd = (instr >> 12) & 0xf; 56875 unsigned rm = instr & 0xf; 56876 ImmediateShiftOperand shift_operand((instr >> 5) & 0x3, 56877 (instr >> 7) & 56878 0x1f); 56879 // MOV{<c>}{<q>} <Rd>, <Rm> {, <shift> #<amount> } ; A1 56880 mov(condition, 56881 Best, 56882 Register(rd), 56883 Operand(Register(rm), 56884 shift_operand.GetType(), 56885 shift_operand.GetAmount())); 56886 if (((instr & 0xfff0010) != 0x1a00000)) { 56887 UnpredictableA32(instr); 56888 } 56889 break; 56890 } 56891 } 56892 break; 56893 } 56894 case 0x00400000: { 56895 // 0x01e00000 56896 switch (instr & 0x00000fe0) { 56897 case 0x00000060: { 56898 // 0x01e00060 56899 if (((instr & 0xf0000000) == 0xf0000000)) { 56900 UnallocatedA32(instr); 56901 return; 56902 } 56903 Condition condition((instr >> 28) & 0xf); 56904 unsigned rd = (instr >> 12) & 0xf; 56905 unsigned rm = instr & 0xf; 56906 // MVN{<c>}{<q>} <Rd>, <Rm>, RRX ; A1 56907 mvn(condition, 56908 Best, 56909 Register(rd), 56910 Operand(Register(rm), RRX)); 56911 if (((instr & 0xfff0ff0) != 0x1e00060)) { 56912 UnpredictableA32(instr); 56913 } 56914 break; 56915 } 56916 default: { 56917 if (((instr & 0xf0000000) == 0xf0000000) || 56918 ((instr & 0xfe0) == 0x60)) { 56919 UnallocatedA32(instr); 56920 return; 56921 } 56922 Condition condition((instr >> 28) & 0xf); 56923 unsigned rd = (instr >> 12) & 0xf; 56924 unsigned rm = instr & 0xf; 56925 ImmediateShiftOperand shift_operand((instr >> 5) & 0x3, 56926 (instr >> 7) & 56927 0x1f); 56928 // MVN{<c>}{<q>} <Rd>, <Rm> {, <shift> #<amount> } ; A1 56929 mvn(condition, 56930 Best, 56931 Register(rd), 56932 Operand(Register(rm), 56933 shift_operand.GetType(), 56934 shift_operand.GetAmount())); 56935 if (((instr & 0xfff0010) != 0x1e00000)) { 56936 UnpredictableA32(instr); 56937 } 56938 break; 56939 } 56940 } 56941 break; 56942 } 56943 } 56944 break; 56945 } 56946 } 56947 break; 56948 } 56949 case 0x00000010: { 56950 // 0x00000010 56951 switch (instr & 0x00400080) { 56952 case 0x00000000: { 56953 // 0x00000010 56954 switch (instr & 0x01a00000) { 56955 case 0x00000000: { 56956 // 0x00000010 56957 if (((instr & 0xf0000000) == 0xf0000000)) { 56958 UnallocatedA32(instr); 56959 return; 56960 } 56961 Condition condition((instr >> 28) & 0xf); 56962 unsigned rd = (instr >> 12) & 0xf; 56963 unsigned rn = (instr >> 16) & 0xf; 56964 unsigned rm = instr & 0xf; 56965 Shift shift((instr >> 5) & 0x3); 56966 unsigned rs = (instr >> 8) & 0xf; 56967 // AND{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1 56968 and_(condition, 56969 Best, 56970 Register(rd), 56971 Register(rn), 56972 Operand(Register(rm), shift.GetType(), Register(rs))); 56973 break; 56974 } 56975 case 0x00200000: { 56976 // 0x00200010 56977 if (((instr & 0xf0000000) == 0xf0000000)) { 56978 UnallocatedA32(instr); 56979 return; 56980 } 56981 Condition condition((instr >> 28) & 0xf); 56982 unsigned rd = (instr >> 12) & 0xf; 56983 unsigned rn = (instr >> 16) & 0xf; 56984 unsigned rm = instr & 0xf; 56985 Shift shift((instr >> 5) & 0x3); 56986 unsigned rs = (instr >> 8) & 0xf; 56987 // EOR{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1 56988 eor(condition, 56989 Best, 56990 Register(rd), 56991 Register(rn), 56992 Operand(Register(rm), shift.GetType(), Register(rs))); 56993 break; 56994 } 56995 case 0x00800000: { 56996 // 0x00800010 56997 if (((instr & 0xf0000000) == 0xf0000000)) { 56998 UnallocatedA32(instr); 56999 return; 57000 } 57001 Condition condition((instr >> 28) & 0xf); 57002 unsigned rd = (instr >> 12) & 0xf; 57003 unsigned rn = (instr >> 16) & 0xf; 57004 unsigned rm = instr & 0xf; 57005 Shift shift((instr >> 5) & 0x3); 57006 unsigned rs = (instr >> 8) & 0xf; 57007 // ADD{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1 57008 add(condition, 57009 Best, 57010 Register(rd), 57011 Register(rn), 57012 Operand(Register(rm), shift.GetType(), Register(rs))); 57013 break; 57014 } 57015 case 0x00a00000: { 57016 // 0x00a00010 57017 if (((instr & 0xf0000000) == 0xf0000000)) { 57018 UnallocatedA32(instr); 57019 return; 57020 } 57021 Condition condition((instr >> 28) & 0xf); 57022 unsigned rd = (instr >> 12) & 0xf; 57023 unsigned rn = (instr >> 16) & 0xf; 57024 unsigned rm = instr & 0xf; 57025 Shift shift((instr >> 5) & 0x3); 57026 unsigned rs = (instr >> 8) & 0xf; 57027 // ADC{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1 57028 adc(condition, 57029 Best, 57030 Register(rd), 57031 Register(rn), 57032 Operand(Register(rm), shift.GetType(), Register(rs))); 57033 break; 57034 } 57035 case 0x01000000: { 57036 // 0x01000010 57037 switch (instr & 0x00000060) { 57038 case 0x00000040: { 57039 // 0x01000050 57040 if (((instr & 0xf0000000) == 0xf0000000)) { 57041 UnallocatedA32(instr); 57042 return; 57043 } 57044 Condition condition((instr >> 28) & 0xf); 57045 unsigned rd = (instr >> 12) & 0xf; 57046 unsigned rm = instr & 0xf; 57047 unsigned rn = (instr >> 16) & 0xf; 57048 // QADD{<c>}{<q>} {<Rd>}, <Rm>, <Rn> ; A1 57049 qadd(condition, 57050 Register(rd), 57051 Register(rm), 57052 Register(rn)); 57053 if (((instr & 0xff00ff0) != 0x1000050)) { 57054 UnpredictableA32(instr); 57055 } 57056 break; 57057 } 57058 case 0x00000060: { 57059 // 0x01000070 57060 if (((instr & 0xf0000000) == 0xf0000000)) { 57061 UnallocatedA32(instr); 57062 return; 57063 } 57064 uint32_t imm = (instr & 0xf) | ((instr >> 4) & 0xfff0); 57065 // HLT{<q>} {#}<imm> ; A1 57066 hlt(al, imm); 57067 break; 57068 } 57069 default: 57070 UnallocatedA32(instr); 57071 break; 57072 } 57073 break; 57074 } 57075 case 0x01200000: { 57076 // 0x01200010 57077 switch (instr & 0x00000060) { 57078 case 0x00000000: { 57079 // 0x01200010 57080 if (((instr & 0xf0000000) == 0xf0000000)) { 57081 UnallocatedA32(instr); 57082 return; 57083 } 57084 Condition condition((instr >> 28) & 0xf); 57085 unsigned rm = instr & 0xf; 57086 // BX{<c>}{<q>} <Rm> ; A1 57087 bx(condition, Register(rm)); 57088 if (((instr & 0xffffff0) != 0x12fff10)) { 57089 UnpredictableA32(instr); 57090 } 57091 break; 57092 } 57093 case 0x00000020: { 57094 // 0x01200030 57095 if (((instr & 0xf0000000) == 0xf0000000)) { 57096 UnallocatedA32(instr); 57097 return; 57098 } 57099 Condition condition((instr >> 28) & 0xf); 57100 unsigned rm = instr & 0xf; 57101 // BLX{<c>}{<q>} <Rm> ; A1 57102 blx(condition, Register(rm)); 57103 if (((instr & 0xffffff0) != 0x12fff30)) { 57104 UnpredictableA32(instr); 57105 } 57106 break; 57107 } 57108 case 0x00000040: { 57109 // 0x01200050 57110 if (((instr & 0xf0000000) == 0xf0000000)) { 57111 UnallocatedA32(instr); 57112 return; 57113 } 57114 Condition condition((instr >> 28) & 0xf); 57115 unsigned rd = (instr >> 12) & 0xf; 57116 unsigned rm = instr & 0xf; 57117 unsigned rn = (instr >> 16) & 0xf; 57118 // QSUB{<c>}{<q>} {<Rd>}, <Rm>, <Rn> ; A1 57119 qsub(condition, 57120 Register(rd), 57121 Register(rm), 57122 Register(rn)); 57123 if (((instr & 0xff00ff0) != 0x1200050)) { 57124 UnpredictableA32(instr); 57125 } 57126 break; 57127 } 57128 case 0x00000060: { 57129 // 0x01200070 57130 if (((instr & 0xf0000000) == 0xf0000000)) { 57131 UnallocatedA32(instr); 57132 return; 57133 } 57134 uint32_t imm = (instr & 0xf) | ((instr >> 4) & 0xfff0); 57135 // BKPT{<q>} {#}<imm> ; A1 57136 bkpt(al, imm); 57137 break; 57138 } 57139 } 57140 break; 57141 } 57142 case 0x01800000: { 57143 // 0x01800010 57144 if (((instr & 0xf0000000) == 0xf0000000)) { 57145 UnallocatedA32(instr); 57146 return; 57147 } 57148 Condition condition((instr >> 28) & 0xf); 57149 unsigned rd = (instr >> 12) & 0xf; 57150 unsigned rn = (instr >> 16) & 0xf; 57151 unsigned rm = instr & 0xf; 57152 Shift shift((instr >> 5) & 0x3); 57153 unsigned rs = (instr >> 8) & 0xf; 57154 // ORR{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1 57155 orr(condition, 57156 Best, 57157 Register(rd), 57158 Register(rn), 57159 Operand(Register(rm), shift.GetType(), Register(rs))); 57160 break; 57161 } 57162 case 0x01a00000: { 57163 // 0x01a00010 57164 if (((instr & 0xf0000000) == 0xf0000000)) { 57165 UnallocatedA32(instr); 57166 return; 57167 } 57168 if (((Uint32((instr >> 5)) & Uint32(0x3)) == Uint32(0x2)) && 57169 ((instr & 0xf0000000) != 0xf0000000)) { 57170 Condition condition((instr >> 28) & 0xf); 57171 unsigned rd = (instr >> 12) & 0xf; 57172 unsigned rm = instr & 0xf; 57173 unsigned rs = (instr >> 8) & 0xf; 57174 // ASR{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; A1 57175 asr(condition, 57176 Best, 57177 Register(rd), 57178 Register(rm), 57179 Register(rs)); 57180 if (((instr & 0xfff00f0) != 0x1a00050)) { 57181 UnpredictableA32(instr); 57182 } 57183 return; 57184 } 57185 if (((Uint32((instr >> 5)) & Uint32(0x3)) == Uint32(0x0)) && 57186 ((instr & 0xf0000000) != 0xf0000000)) { 57187 Condition condition((instr >> 28) & 0xf); 57188 unsigned rd = (instr >> 12) & 0xf; 57189 unsigned rm = instr & 0xf; 57190 unsigned rs = (instr >> 8) & 0xf; 57191 // LSL{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; A1 57192 lsl(condition, 57193 Best, 57194 Register(rd), 57195 Register(rm), 57196 Register(rs)); 57197 if (((instr & 0xfff00f0) != 0x1a00010)) { 57198 UnpredictableA32(instr); 57199 } 57200 return; 57201 } 57202 if (((Uint32((instr >> 5)) & Uint32(0x3)) == Uint32(0x1)) && 57203 ((instr & 0xf0000000) != 0xf0000000)) { 57204 Condition condition((instr >> 28) & 0xf); 57205 unsigned rd = (instr >> 12) & 0xf; 57206 unsigned rm = instr & 0xf; 57207 unsigned rs = (instr >> 8) & 0xf; 57208 // LSR{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; A1 57209 lsr(condition, 57210 Best, 57211 Register(rd), 57212 Register(rm), 57213 Register(rs)); 57214 if (((instr & 0xfff00f0) != 0x1a00030)) { 57215 UnpredictableA32(instr); 57216 } 57217 return; 57218 } 57219 if (((Uint32((instr >> 5)) & Uint32(0x3)) == Uint32(0x3)) && 57220 ((instr & 0xf0000000) != 0xf0000000)) { 57221 Condition condition((instr >> 28) & 0xf); 57222 unsigned rd = (instr >> 12) & 0xf; 57223 unsigned rm = instr & 0xf; 57224 unsigned rs = (instr >> 8) & 0xf; 57225 // ROR{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; A1 57226 ror(condition, 57227 Best, 57228 Register(rd), 57229 Register(rm), 57230 Register(rs)); 57231 if (((instr & 0xfff00f0) != 0x1a00070)) { 57232 UnpredictableA32(instr); 57233 } 57234 return; 57235 } 57236 Condition condition((instr >> 28) & 0xf); 57237 unsigned rd = (instr >> 12) & 0xf; 57238 unsigned rm = instr & 0xf; 57239 Shift shift((instr >> 5) & 0x3); 57240 unsigned rs = (instr >> 8) & 0xf; 57241 // MOV{<c>}{<q>} <Rd>, <Rm>, <shift> <Rs> ; A1 57242 mov(condition, 57243 Best, 57244 Register(rd), 57245 Operand(Register(rm), shift.GetType(), Register(rs))); 57246 if (((instr & 0xfff0090) != 0x1a00010)) { 57247 UnpredictableA32(instr); 57248 } 57249 break; 57250 } 57251 } 57252 break; 57253 } 57254 case 0x00000080: { 57255 // 0x00000090 57256 switch (instr & 0x01200060) { 57257 case 0x00000000: { 57258 // 0x00000090 57259 switch (instr & 0x00800000) { 57260 case 0x00000000: { 57261 // 0x00000090 57262 if (((instr & 0xf0000000) == 0xf0000000)) { 57263 UnallocatedA32(instr); 57264 return; 57265 } 57266 Condition condition((instr >> 28) & 0xf); 57267 unsigned rd = (instr >> 16) & 0xf; 57268 unsigned rn = instr & 0xf; 57269 unsigned rm = (instr >> 8) & 0xf; 57270 // MUL{<c>}{<q>} <Rd>, <Rn>, {<Rm>} ; A1 57271 mul(condition, 57272 Best, 57273 Register(rd), 57274 Register(rn), 57275 Register(rm)); 57276 if (((instr & 0xff0f0f0) != 0x90)) { 57277 UnpredictableA32(instr); 57278 } 57279 break; 57280 } 57281 case 0x00800000: { 57282 // 0x00800090 57283 if (((instr & 0xf0000000) == 0xf0000000)) { 57284 UnallocatedA32(instr); 57285 return; 57286 } 57287 Condition condition((instr >> 28) & 0xf); 57288 unsigned rdlo = (instr >> 12) & 0xf; 57289 unsigned rdhi = (instr >> 16) & 0xf; 57290 unsigned rn = instr & 0xf; 57291 unsigned rm = (instr >> 8) & 0xf; 57292 // UMULL{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1 57293 umull(condition, 57294 Register(rdlo), 57295 Register(rdhi), 57296 Register(rn), 57297 Register(rm)); 57298 break; 57299 } 57300 } 57301 break; 57302 } 57303 case 0x00000020: { 57304 // 0x000000b0 57305 if (((instr & 0xf0000000) == 0xf0000000)) { 57306 UnallocatedA32(instr); 57307 return; 57308 } 57309 Condition condition((instr >> 28) & 0xf); 57310 unsigned rt = (instr >> 12) & 0xf; 57311 unsigned rn = (instr >> 16) & 0xf; 57312 Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus); 57313 unsigned rm = instr & 0xf; 57314 // STRH{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<Rm> ; A1 57315 strh(condition, 57316 Best, 57317 Register(rt), 57318 MemOperand(Register(rn), 57319 sign, 57320 Register(rm), 57321 PostIndex)); 57322 if (((instr & 0xf700ff0) != 0xb0)) { 57323 UnpredictableA32(instr); 57324 } 57325 break; 57326 } 57327 case 0x00000040: { 57328 // 0x000000d0 57329 if (((instr & 0xf0000000) == 0xf0000000)) { 57330 UnallocatedA32(instr); 57331 return; 57332 } 57333 Condition condition((instr >> 28) & 0xf); 57334 unsigned rt = (instr >> 12) & 0xf; 57335 unsigned rn = (instr >> 16) & 0xf; 57336 Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus); 57337 unsigned rm = instr & 0xf; 57338 // LDRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>], #{+/-}<Rm> ; A1 57339 ldrd(condition, 57340 Register(rt), 57341 Register(rt + 1), 57342 MemOperand(Register(rn), 57343 sign, 57344 Register(rm), 57345 PostIndex)); 57346 if (((instr & 0xf700ff0) != 0xd0)) { 57347 UnpredictableA32(instr); 57348 } 57349 break; 57350 } 57351 case 0x00000060: { 57352 // 0x000000f0 57353 if (((instr & 0xf0000000) == 0xf0000000)) { 57354 UnallocatedA32(instr); 57355 return; 57356 } 57357 Condition condition((instr >> 28) & 0xf); 57358 unsigned rt = (instr >> 12) & 0xf; 57359 unsigned rn = (instr >> 16) & 0xf; 57360 Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus); 57361 unsigned rm = instr & 0xf; 57362 // STRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>], #{+/-}<Rm> ; A1 57363 strd(condition, 57364 Register(rt), 57365 Register(rt + 1), 57366 MemOperand(Register(rn), 57367 sign, 57368 Register(rm), 57369 PostIndex)); 57370 if (((instr & 0xf700ff0) != 0xf0)) { 57371 UnpredictableA32(instr); 57372 } 57373 break; 57374 } 57375 case 0x00200000: { 57376 // 0x00200090 57377 switch (instr & 0x00800000) { 57378 case 0x00000000: { 57379 // 0x00200090 57380 if (((instr & 0xf0000000) == 0xf0000000)) { 57381 UnallocatedA32(instr); 57382 return; 57383 } 57384 Condition condition((instr >> 28) & 0xf); 57385 unsigned rd = (instr >> 16) & 0xf; 57386 unsigned rn = instr & 0xf; 57387 unsigned rm = (instr >> 8) & 0xf; 57388 unsigned ra = (instr >> 12) & 0xf; 57389 // MLA{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1 57390 mla(condition, 57391 Register(rd), 57392 Register(rn), 57393 Register(rm), 57394 Register(ra)); 57395 break; 57396 } 57397 case 0x00800000: { 57398 // 0x00a00090 57399 if (((instr & 0xf0000000) == 0xf0000000)) { 57400 UnallocatedA32(instr); 57401 return; 57402 } 57403 Condition condition((instr >> 28) & 0xf); 57404 unsigned rdlo = (instr >> 12) & 0xf; 57405 unsigned rdhi = (instr >> 16) & 0xf; 57406 unsigned rn = instr & 0xf; 57407 unsigned rm = (instr >> 8) & 0xf; 57408 // UMLAL{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1 57409 umlal(condition, 57410 Register(rdlo), 57411 Register(rdhi), 57412 Register(rn), 57413 Register(rm)); 57414 break; 57415 } 57416 } 57417 break; 57418 } 57419 case 0x00200020: { 57420 // 0x002000b0 57421 if (((instr & 0xf0000000) == 0xf0000000)) { 57422 UnallocatedA32(instr); 57423 return; 57424 } 57425 UnimplementedA32("STRHT", instr); 57426 break; 57427 } 57428 case 0x01000000: { 57429 // 0x01000090 57430 switch (instr & 0x00800300) { 57431 case 0x00800000: { 57432 // 0x01800090 57433 if (((instr & 0xf0000000) == 0xf0000000)) { 57434 UnallocatedA32(instr); 57435 return; 57436 } 57437 Condition condition((instr >> 28) & 0xf); 57438 unsigned rt = instr & 0xf; 57439 unsigned rn = (instr >> 16) & 0xf; 57440 // STL{<c>}{<q>} <Rt>, [<Rn>] ; A1 57441 stl(condition, 57442 Register(rt), 57443 MemOperand(Register(rn), Offset)); 57444 if (((instr & 0xff0fff0) != 0x180fc90)) { 57445 UnpredictableA32(instr); 57446 } 57447 break; 57448 } 57449 case 0x00800200: { 57450 // 0x01800290 57451 if (((instr & 0xf0000000) == 0xf0000000)) { 57452 UnallocatedA32(instr); 57453 return; 57454 } 57455 Condition condition((instr >> 28) & 0xf); 57456 unsigned rd = (instr >> 12) & 0xf; 57457 unsigned rt = instr & 0xf; 57458 unsigned rn = (instr >> 16) & 0xf; 57459 // STLEX{<c>}{<q>} <Rd>, <Rt>, [<Rn>] ; A1 57460 stlex(condition, 57461 Register(rd), 57462 Register(rt), 57463 MemOperand(Register(rn), Offset)); 57464 if (((instr & 0xff00ff0) != 0x1800e90)) { 57465 UnpredictableA32(instr); 57466 } 57467 break; 57468 } 57469 case 0x00800300: { 57470 // 0x01800390 57471 if (((instr & 0xf0000000) == 0xf0000000)) { 57472 UnallocatedA32(instr); 57473 return; 57474 } 57475 Condition condition((instr >> 28) & 0xf); 57476 unsigned rd = (instr >> 12) & 0xf; 57477 unsigned rt = instr & 0xf; 57478 unsigned rn = (instr >> 16) & 0xf; 57479 // STREX{<c>}{<q>} <Rd>, <Rt>, [<Rn>{, #<imm_1>}] ; A1 57480 strex(condition, 57481 Register(rd), 57482 Register(rt), 57483 MemOperand(Register(rn), plus, 0, Offset)); 57484 if (((instr & 0xff00ff0) != 0x1800f90)) { 57485 UnpredictableA32(instr); 57486 } 57487 break; 57488 } 57489 default: 57490 UnallocatedA32(instr); 57491 break; 57492 } 57493 break; 57494 } 57495 case 0x01000020: { 57496 // 0x010000b0 57497 if (((instr & 0xf0000000) == 0xf0000000)) { 57498 UnallocatedA32(instr); 57499 return; 57500 } 57501 Condition condition((instr >> 28) & 0xf); 57502 unsigned rt = (instr >> 12) & 0xf; 57503 unsigned rn = (instr >> 16) & 0xf; 57504 Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus); 57505 unsigned rm = instr & 0xf; 57506 AddrMode addrmode = Offset; 57507 // STRH{<c>}{<q>} <Rt>, [<Rn>, #{+/-}<Rm>] ; A1 57508 strh(condition, 57509 Best, 57510 Register(rt), 57511 MemOperand(Register(rn), 57512 sign, 57513 Register(rm), 57514 addrmode)); 57515 if (((instr & 0xf700ff0) != 0x10000b0)) { 57516 UnpredictableA32(instr); 57517 } 57518 break; 57519 } 57520 case 0x01000040: { 57521 // 0x010000d0 57522 if (((instr & 0xf0000000) == 0xf0000000)) { 57523 UnallocatedA32(instr); 57524 return; 57525 } 57526 Condition condition((instr >> 28) & 0xf); 57527 unsigned rt = (instr >> 12) & 0xf; 57528 unsigned rn = (instr >> 16) & 0xf; 57529 Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus); 57530 unsigned rm = instr & 0xf; 57531 AddrMode addrmode = Offset; 57532 // LDRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>, #{+/-}<Rm>] ; A1 57533 ldrd(condition, 57534 Register(rt), 57535 Register(rt + 1), 57536 MemOperand(Register(rn), 57537 sign, 57538 Register(rm), 57539 addrmode)); 57540 if (((instr & 0xf700ff0) != 0x10000d0)) { 57541 UnpredictableA32(instr); 57542 } 57543 break; 57544 } 57545 case 0x01000060: { 57546 // 0x010000f0 57547 if (((instr & 0xf0000000) == 0xf0000000)) { 57548 UnallocatedA32(instr); 57549 return; 57550 } 57551 Condition condition((instr >> 28) & 0xf); 57552 unsigned rt = (instr >> 12) & 0xf; 57553 unsigned rn = (instr >> 16) & 0xf; 57554 Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus); 57555 unsigned rm = instr & 0xf; 57556 AddrMode addrmode = Offset; 57557 // STRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>, #{+/-}<Rm>] ; A1 57558 strd(condition, 57559 Register(rt), 57560 Register(rt + 1), 57561 MemOperand(Register(rn), 57562 sign, 57563 Register(rm), 57564 addrmode)); 57565 if (((instr & 0xf700ff0) != 0x10000f0)) { 57566 UnpredictableA32(instr); 57567 } 57568 break; 57569 } 57570 case 0x01200000: { 57571 // 0x01200090 57572 switch (instr & 0x00800300) { 57573 case 0x00800200: { 57574 // 0x01a00290 57575 if (((instr & 0xf0000000) == 0xf0000000)) { 57576 UnallocatedA32(instr); 57577 return; 57578 } 57579 Condition condition((instr >> 28) & 0xf); 57580 unsigned rd = (instr >> 12) & 0xf; 57581 unsigned rt = instr & 0xf; 57582 unsigned rn = (instr >> 16) & 0xf; 57583 // STLEXD{<c>}{<q>} <Rd>, <Rt>, <Rt2>, [<Rn>] ; A1 57584 stlexd(condition, 57585 Register(rd), 57586 Register(rt), 57587 Register(rt + 1), 57588 MemOperand(Register(rn), Offset)); 57589 if (((instr & 0xff00ff0) != 0x1a00e90)) { 57590 UnpredictableA32(instr); 57591 } 57592 break; 57593 } 57594 case 0x00800300: { 57595 // 0x01a00390 57596 if (((instr & 0xf0000000) == 0xf0000000)) { 57597 UnallocatedA32(instr); 57598 return; 57599 } 57600 Condition condition((instr >> 28) & 0xf); 57601 unsigned rd = (instr >> 12) & 0xf; 57602 unsigned rt = instr & 0xf; 57603 unsigned rn = (instr >> 16) & 0xf; 57604 // STREXD{<c>}{<q>} <Rd>, <Rt>, <Rt2>, [<Rn>] ; A1 57605 strexd(condition, 57606 Register(rd), 57607 Register(rt), 57608 Register(rt + 1), 57609 MemOperand(Register(rn), Offset)); 57610 if (((instr & 0xff00ff0) != 0x1a00f90)) { 57611 UnpredictableA32(instr); 57612 } 57613 break; 57614 } 57615 default: 57616 UnallocatedA32(instr); 57617 break; 57618 } 57619 break; 57620 } 57621 case 0x01200020: { 57622 // 0x012000b0 57623 if (((instr & 0xf0000000) == 0xf0000000)) { 57624 UnallocatedA32(instr); 57625 return; 57626 } 57627 Condition condition((instr >> 28) & 0xf); 57628 unsigned rt = (instr >> 12) & 0xf; 57629 unsigned rn = (instr >> 16) & 0xf; 57630 Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus); 57631 unsigned rm = instr & 0xf; 57632 AddrMode addrmode = PreIndex; 57633 // STRH{<c>}{<q>} <Rt>, [<Rn>, #{+/-}<Rm>]! ; A1 57634 strh(condition, 57635 Best, 57636 Register(rt), 57637 MemOperand(Register(rn), 57638 sign, 57639 Register(rm), 57640 addrmode)); 57641 if (((instr & 0xf700ff0) != 0x12000b0)) { 57642 UnpredictableA32(instr); 57643 } 57644 break; 57645 } 57646 case 0x01200040: { 57647 // 0x012000d0 57648 if (((instr & 0xf0000000) == 0xf0000000)) { 57649 UnallocatedA32(instr); 57650 return; 57651 } 57652 Condition condition((instr >> 28) & 0xf); 57653 unsigned rt = (instr >> 12) & 0xf; 57654 unsigned rn = (instr >> 16) & 0xf; 57655 Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus); 57656 unsigned rm = instr & 0xf; 57657 AddrMode addrmode = PreIndex; 57658 // LDRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>, #{+/-}<Rm>]! ; A1 57659 ldrd(condition, 57660 Register(rt), 57661 Register(rt + 1), 57662 MemOperand(Register(rn), 57663 sign, 57664 Register(rm), 57665 addrmode)); 57666 if (((instr & 0xf700ff0) != 0x12000d0)) { 57667 UnpredictableA32(instr); 57668 } 57669 break; 57670 } 57671 case 0x01200060: { 57672 // 0x012000f0 57673 if (((instr & 0xf0000000) == 0xf0000000)) { 57674 UnallocatedA32(instr); 57675 return; 57676 } 57677 Condition condition((instr >> 28) & 0xf); 57678 unsigned rt = (instr >> 12) & 0xf; 57679 unsigned rn = (instr >> 16) & 0xf; 57680 Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus); 57681 unsigned rm = instr & 0xf; 57682 AddrMode addrmode = PreIndex; 57683 // STRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>, #{+/-}<Rm>]! ; A1 57684 strd(condition, 57685 Register(rt), 57686 Register(rt + 1), 57687 MemOperand(Register(rn), 57688 sign, 57689 Register(rm), 57690 addrmode)); 57691 if (((instr & 0xf700ff0) != 0x12000f0)) { 57692 UnpredictableA32(instr); 57693 } 57694 break; 57695 } 57696 default: 57697 UnallocatedA32(instr); 57698 break; 57699 } 57700 break; 57701 } 57702 case 0x00400000: { 57703 // 0x00400010 57704 switch (instr & 0x01a00000) { 57705 case 0x00000000: { 57706 // 0x00400010 57707 if (((instr & 0xf0000000) == 0xf0000000)) { 57708 UnallocatedA32(instr); 57709 return; 57710 } 57711 Condition condition((instr >> 28) & 0xf); 57712 unsigned rd = (instr >> 12) & 0xf; 57713 unsigned rn = (instr >> 16) & 0xf; 57714 unsigned rm = instr & 0xf; 57715 Shift shift((instr >> 5) & 0x3); 57716 unsigned rs = (instr >> 8) & 0xf; 57717 // SUB{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1 57718 sub(condition, 57719 Best, 57720 Register(rd), 57721 Register(rn), 57722 Operand(Register(rm), shift.GetType(), Register(rs))); 57723 break; 57724 } 57725 case 0x00200000: { 57726 // 0x00600010 57727 if (((instr & 0xf0000000) == 0xf0000000)) { 57728 UnallocatedA32(instr); 57729 return; 57730 } 57731 Condition condition((instr >> 28) & 0xf); 57732 unsigned rd = (instr >> 12) & 0xf; 57733 unsigned rn = (instr >> 16) & 0xf; 57734 unsigned rm = instr & 0xf; 57735 Shift shift((instr >> 5) & 0x3); 57736 unsigned rs = (instr >> 8) & 0xf; 57737 // RSB{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1 57738 rsb(condition, 57739 Best, 57740 Register(rd), 57741 Register(rn), 57742 Operand(Register(rm), shift.GetType(), Register(rs))); 57743 break; 57744 } 57745 case 0x00800000: { 57746 // 0x00c00010 57747 if (((instr & 0xf0000000) == 0xf0000000)) { 57748 UnallocatedA32(instr); 57749 return; 57750 } 57751 Condition condition((instr >> 28) & 0xf); 57752 unsigned rd = (instr >> 12) & 0xf; 57753 unsigned rn = (instr >> 16) & 0xf; 57754 unsigned rm = instr & 0xf; 57755 Shift shift((instr >> 5) & 0x3); 57756 unsigned rs = (instr >> 8) & 0xf; 57757 // SBC{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1 57758 sbc(condition, 57759 Best, 57760 Register(rd), 57761 Register(rn), 57762 Operand(Register(rm), shift.GetType(), Register(rs))); 57763 break; 57764 } 57765 case 0x00a00000: { 57766 // 0x00e00010 57767 if (((instr & 0xf0000000) == 0xf0000000)) { 57768 UnallocatedA32(instr); 57769 return; 57770 } 57771 Condition condition((instr >> 28) & 0xf); 57772 unsigned rd = (instr >> 12) & 0xf; 57773 unsigned rn = (instr >> 16) & 0xf; 57774 unsigned rm = instr & 0xf; 57775 Shift shift((instr >> 5) & 0x3); 57776 unsigned rs = (instr >> 8) & 0xf; 57777 // RSC{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1 57778 rsc(condition, 57779 Register(rd), 57780 Register(rn), 57781 Operand(Register(rm), shift.GetType(), Register(rs))); 57782 break; 57783 } 57784 case 0x01000000: { 57785 // 0x01400010 57786 switch (instr & 0x00000060) { 57787 case 0x00000040: { 57788 // 0x01400050 57789 if (((instr & 0xf0000000) == 0xf0000000)) { 57790 UnallocatedA32(instr); 57791 return; 57792 } 57793 Condition condition((instr >> 28) & 0xf); 57794 unsigned rd = (instr >> 12) & 0xf; 57795 unsigned rm = instr & 0xf; 57796 unsigned rn = (instr >> 16) & 0xf; 57797 // QDADD{<c>}{<q>} {<Rd>}, <Rm>, <Rn> ; A1 57798 qdadd(condition, 57799 Register(rd), 57800 Register(rm), 57801 Register(rn)); 57802 if (((instr & 0xff00ff0) != 0x1400050)) { 57803 UnpredictableA32(instr); 57804 } 57805 break; 57806 } 57807 case 0x00000060: { 57808 // 0x01400070 57809 if (((instr & 0xf0000000) == 0xf0000000)) { 57810 UnallocatedA32(instr); 57811 return; 57812 } 57813 uint32_t imm = (instr & 0xf) | ((instr >> 4) & 0xfff0); 57814 // HVC{<q>} {#}<imm16> ; A1 57815 hvc(al, imm); 57816 break; 57817 } 57818 default: 57819 UnallocatedA32(instr); 57820 break; 57821 } 57822 break; 57823 } 57824 case 0x01200000: { 57825 // 0x01600010 57826 switch (instr & 0x00000060) { 57827 case 0x00000000: { 57828 // 0x01600010 57829 if (((instr & 0xf0000000) == 0xf0000000)) { 57830 UnallocatedA32(instr); 57831 return; 57832 } 57833 Condition condition((instr >> 28) & 0xf); 57834 unsigned rd = (instr >> 12) & 0xf; 57835 unsigned rm = instr & 0xf; 57836 // CLZ{<c>}{<q>} <Rd>, <Rm> ; A1 57837 clz(condition, Register(rd), Register(rm)); 57838 if (((instr & 0xfff0ff0) != 0x16f0f10)) { 57839 UnpredictableA32(instr); 57840 } 57841 break; 57842 } 57843 case 0x00000040: { 57844 // 0x01600050 57845 if (((instr & 0xf0000000) == 0xf0000000)) { 57846 UnallocatedA32(instr); 57847 return; 57848 } 57849 Condition condition((instr >> 28) & 0xf); 57850 unsigned rd = (instr >> 12) & 0xf; 57851 unsigned rm = instr & 0xf; 57852 unsigned rn = (instr >> 16) & 0xf; 57853 // QDSUB{<c>}{<q>} {<Rd>}, <Rm>, <Rn> ; A1 57854 qdsub(condition, 57855 Register(rd), 57856 Register(rm), 57857 Register(rn)); 57858 if (((instr & 0xff00ff0) != 0x1600050)) { 57859 UnpredictableA32(instr); 57860 } 57861 break; 57862 } 57863 case 0x00000060: { 57864 // 0x01600070 57865 if (((instr & 0xf0000000) == 0xf0000000)) { 57866 UnallocatedA32(instr); 57867 return; 57868 } 57869 UnimplementedA32("SMC", instr); 57870 break; 57871 } 57872 default: 57873 UnallocatedA32(instr); 57874 break; 57875 } 57876 break; 57877 } 57878 case 0x01800000: { 57879 // 0x01c00010 57880 if (((instr & 0xf0000000) == 0xf0000000)) { 57881 UnallocatedA32(instr); 57882 return; 57883 } 57884 Condition condition((instr >> 28) & 0xf); 57885 unsigned rd = (instr >> 12) & 0xf; 57886 unsigned rn = (instr >> 16) & 0xf; 57887 unsigned rm = instr & 0xf; 57888 Shift shift((instr >> 5) & 0x3); 57889 unsigned rs = (instr >> 8) & 0xf; 57890 // BIC{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1 57891 bic(condition, 57892 Best, 57893 Register(rd), 57894 Register(rn), 57895 Operand(Register(rm), shift.GetType(), Register(rs))); 57896 break; 57897 } 57898 case 0x01a00000: { 57899 // 0x01e00010 57900 if (((instr & 0xf0000000) == 0xf0000000)) { 57901 UnallocatedA32(instr); 57902 return; 57903 } 57904 Condition condition((instr >> 28) & 0xf); 57905 unsigned rd = (instr >> 12) & 0xf; 57906 unsigned rm = instr & 0xf; 57907 Shift shift((instr >> 5) & 0x3); 57908 unsigned rs = (instr >> 8) & 0xf; 57909 // MVN{<c>}{<q>} <Rd>, <Rm>, <shift> <Rs> ; A1 57910 mvn(condition, 57911 Best, 57912 Register(rd), 57913 Operand(Register(rm), shift.GetType(), Register(rs))); 57914 if (((instr & 0xfff0090) != 0x1e00010)) { 57915 UnpredictableA32(instr); 57916 } 57917 break; 57918 } 57919 } 57920 break; 57921 } 57922 case 0x00400080: { 57923 // 0x00400090 57924 switch (instr & 0x00000060) { 57925 case 0x00000000: { 57926 // 0x00400090 57927 switch (instr & 0x01a00000) { 57928 case 0x00000000: { 57929 // 0x00400090 57930 if (((instr & 0xf0000000) == 0xf0000000)) { 57931 UnallocatedA32(instr); 57932 return; 57933 } 57934 Condition condition((instr >> 28) & 0xf); 57935 unsigned rdlo = (instr >> 12) & 0xf; 57936 unsigned rdhi = (instr >> 16) & 0xf; 57937 unsigned rn = instr & 0xf; 57938 unsigned rm = (instr >> 8) & 0xf; 57939 // UMAAL{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1 57940 umaal(condition, 57941 Register(rdlo), 57942 Register(rdhi), 57943 Register(rn), 57944 Register(rm)); 57945 break; 57946 } 57947 case 0x00200000: { 57948 // 0x00600090 57949 if (((instr & 0xf0000000) == 0xf0000000)) { 57950 UnallocatedA32(instr); 57951 return; 57952 } 57953 Condition condition((instr >> 28) & 0xf); 57954 unsigned rd = (instr >> 16) & 0xf; 57955 unsigned rn = instr & 0xf; 57956 unsigned rm = (instr >> 8) & 0xf; 57957 unsigned ra = (instr >> 12) & 0xf; 57958 // MLS{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1 57959 mls(condition, 57960 Register(rd), 57961 Register(rn), 57962 Register(rm), 57963 Register(ra)); 57964 break; 57965 } 57966 case 0x00800000: { 57967 // 0x00c00090 57968 if (((instr & 0xf0000000) == 0xf0000000)) { 57969 UnallocatedA32(instr); 57970 return; 57971 } 57972 Condition condition((instr >> 28) & 0xf); 57973 unsigned rdlo = (instr >> 12) & 0xf; 57974 unsigned rdhi = (instr >> 16) & 0xf; 57975 unsigned rn = instr & 0xf; 57976 unsigned rm = (instr >> 8) & 0xf; 57977 // SMULL{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1 57978 smull(condition, 57979 Register(rdlo), 57980 Register(rdhi), 57981 Register(rn), 57982 Register(rm)); 57983 break; 57984 } 57985 case 0x00a00000: { 57986 // 0x00e00090 57987 if (((instr & 0xf0000000) == 0xf0000000)) { 57988 UnallocatedA32(instr); 57989 return; 57990 } 57991 Condition condition((instr >> 28) & 0xf); 57992 unsigned rdlo = (instr >> 12) & 0xf; 57993 unsigned rdhi = (instr >> 16) & 0xf; 57994 unsigned rn = instr & 0xf; 57995 unsigned rm = (instr >> 8) & 0xf; 57996 // SMLAL{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1 57997 smlal(condition, 57998 Register(rdlo), 57999 Register(rdhi), 58000 Register(rn), 58001 Register(rm)); 58002 break; 58003 } 58004 case 0x01800000: { 58005 // 0x01c00090 58006 switch (instr & 0x00000300) { 58007 case 0x00000000: { 58008 // 0x01c00090 58009 if (((instr & 0xf0000000) == 0xf0000000)) { 58010 UnallocatedA32(instr); 58011 return; 58012 } 58013 Condition condition((instr >> 28) & 0xf); 58014 unsigned rt = instr & 0xf; 58015 unsigned rn = (instr >> 16) & 0xf; 58016 // STLB{<c>}{<q>} <Rt>, [<Rn>] ; A1 58017 stlb(condition, 58018 Register(rt), 58019 MemOperand(Register(rn), Offset)); 58020 if (((instr & 0xff0fff0) != 0x1c0fc90)) { 58021 UnpredictableA32(instr); 58022 } 58023 break; 58024 } 58025 case 0x00000200: { 58026 // 0x01c00290 58027 if (((instr & 0xf0000000) == 0xf0000000)) { 58028 UnallocatedA32(instr); 58029 return; 58030 } 58031 Condition condition((instr >> 28) & 0xf); 58032 unsigned rd = (instr >> 12) & 0xf; 58033 unsigned rt = instr & 0xf; 58034 unsigned rn = (instr >> 16) & 0xf; 58035 // STLEXB{<c>}{<q>} <Rd>, <Rt>, [<Rn>] ; A1 58036 stlexb(condition, 58037 Register(rd), 58038 Register(rt), 58039 MemOperand(Register(rn), Offset)); 58040 if (((instr & 0xff00ff0) != 0x1c00e90)) { 58041 UnpredictableA32(instr); 58042 } 58043 break; 58044 } 58045 case 0x00000300: { 58046 // 0x01c00390 58047 if (((instr & 0xf0000000) == 0xf0000000)) { 58048 UnallocatedA32(instr); 58049 return; 58050 } 58051 Condition condition((instr >> 28) & 0xf); 58052 unsigned rd = (instr >> 12) & 0xf; 58053 unsigned rt = instr & 0xf; 58054 unsigned rn = (instr >> 16) & 0xf; 58055 // STREXB{<c>}{<q>} <Rd>, <Rt>, [<Rn>] ; A1 58056 strexb(condition, 58057 Register(rd), 58058 Register(rt), 58059 MemOperand(Register(rn), Offset)); 58060 if (((instr & 0xff00ff0) != 0x1c00f90)) { 58061 UnpredictableA32(instr); 58062 } 58063 break; 58064 } 58065 default: 58066 UnallocatedA32(instr); 58067 break; 58068 } 58069 break; 58070 } 58071 case 0x01a00000: { 58072 // 0x01e00090 58073 switch (instr & 0x00000300) { 58074 case 0x00000000: { 58075 // 0x01e00090 58076 if (((instr & 0xf0000000) == 0xf0000000)) { 58077 UnallocatedA32(instr); 58078 return; 58079 } 58080 Condition condition((instr >> 28) & 0xf); 58081 unsigned rt = instr & 0xf; 58082 unsigned rn = (instr >> 16) & 0xf; 58083 // STLH{<c>}{<q>} <Rt>, [<Rn>] ; A1 58084 stlh(condition, 58085 Register(rt), 58086 MemOperand(Register(rn), Offset)); 58087 if (((instr & 0xff0fff0) != 0x1e0fc90)) { 58088 UnpredictableA32(instr); 58089 } 58090 break; 58091 } 58092 case 0x00000200: { 58093 // 0x01e00290 58094 if (((instr & 0xf0000000) == 0xf0000000)) { 58095 UnallocatedA32(instr); 58096 return; 58097 } 58098 Condition condition((instr >> 28) & 0xf); 58099 unsigned rd = (instr >> 12) & 0xf; 58100 unsigned rt = instr & 0xf; 58101 unsigned rn = (instr >> 16) & 0xf; 58102 // STLEXH{<c>}{<q>} <Rd>, <Rt>, [<Rn>] ; A1 58103 stlexh(condition, 58104 Register(rd), 58105 Register(rt), 58106 MemOperand(Register(rn), Offset)); 58107 if (((instr & 0xff00ff0) != 0x1e00e90)) { 58108 UnpredictableA32(instr); 58109 } 58110 break; 58111 } 58112 case 0x00000300: { 58113 // 0x01e00390 58114 if (((instr & 0xf0000000) == 0xf0000000)) { 58115 UnallocatedA32(instr); 58116 return; 58117 } 58118 Condition condition((instr >> 28) & 0xf); 58119 unsigned rd = (instr >> 12) & 0xf; 58120 unsigned rt = instr & 0xf; 58121 unsigned rn = (instr >> 16) & 0xf; 58122 // STREXH{<c>}{<q>} <Rd>, <Rt>, [<Rn>] ; A1 58123 strexh(condition, 58124 Register(rd), 58125 Register(rt), 58126 MemOperand(Register(rn), Offset)); 58127 if (((instr & 0xff00ff0) != 0x1e00f90)) { 58128 UnpredictableA32(instr); 58129 } 58130 break; 58131 } 58132 default: 58133 UnallocatedA32(instr); 58134 break; 58135 } 58136 break; 58137 } 58138 default: 58139 UnallocatedA32(instr); 58140 break; 58141 } 58142 break; 58143 } 58144 case 0x00000020: { 58145 // 0x004000b0 58146 switch (instr & 0x01200000) { 58147 case 0x00000000: { 58148 // 0x004000b0 58149 if (((instr & 0xf0000000) == 0xf0000000)) { 58150 UnallocatedA32(instr); 58151 return; 58152 } 58153 Condition condition((instr >> 28) & 0xf); 58154 unsigned rt = (instr >> 12) & 0xf; 58155 unsigned rn = (instr >> 16) & 0xf; 58156 Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus); 58157 int32_t offset = (instr & 0xf) | ((instr >> 4) & 0xf0); 58158 // STRH{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_3> ; A1 58159 strh(condition, 58160 Best, 58161 Register(rt), 58162 MemOperand(Register(rn), sign, offset, PostIndex)); 58163 break; 58164 } 58165 case 0x00200000: { 58166 // 0x006000b0 58167 if (((instr & 0xf0000000) == 0xf0000000)) { 58168 UnallocatedA32(instr); 58169 return; 58170 } 58171 UnimplementedA32("STRHT", instr); 58172 break; 58173 } 58174 case 0x01000000: { 58175 // 0x014000b0 58176 if (((instr & 0xf0000000) == 0xf0000000)) { 58177 UnallocatedA32(instr); 58178 return; 58179 } 58180 Condition condition((instr >> 28) & 0xf); 58181 unsigned rt = (instr >> 12) & 0xf; 58182 unsigned rn = (instr >> 16) & 0xf; 58183 Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus); 58184 int32_t offset = (instr & 0xf) | ((instr >> 4) & 0xf0); 58185 // STRH{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_3>}] ; A1 58186 strh(condition, 58187 Best, 58188 Register(rt), 58189 MemOperand(Register(rn), sign, offset, Offset)); 58190 break; 58191 } 58192 case 0x01200000: { 58193 // 0x016000b0 58194 if (((instr & 0xf0000000) == 0xf0000000)) { 58195 UnallocatedA32(instr); 58196 return; 58197 } 58198 Condition condition((instr >> 28) & 0xf); 58199 unsigned rt = (instr >> 12) & 0xf; 58200 unsigned rn = (instr >> 16) & 0xf; 58201 Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus); 58202 int32_t offset = (instr & 0xf) | ((instr >> 4) & 0xf0); 58203 // STRH{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_3>}]! ; A1 58204 strh(condition, 58205 Best, 58206 Register(rt), 58207 MemOperand(Register(rn), sign, offset, PreIndex)); 58208 break; 58209 } 58210 } 58211 break; 58212 } 58213 case 0x00000040: { 58214 // 0x004000d0 58215 switch (instr & 0x000f0000) { 58216 case 0x000f0000: { 58217 // 0x004f00d0 58218 if (((instr & 0xf0000000) == 0xf0000000)) { 58219 UnallocatedA32(instr); 58220 return; 58221 } 58222 Condition condition((instr >> 28) & 0xf); 58223 unsigned rt = (instr >> 12) & 0xf; 58224 uint32_t U = (instr >> 23) & 0x1; 58225 int32_t imm = (instr & 0xf) | ((instr >> 4) & 0xf0); 58226 if (U == 0) imm = -imm; 58227 bool minus_zero = (imm == 0) && (U == 0); 58228 Location location(imm, kA32PcDelta); 58229 // LDRD{<c>}{<q>} <Rt>, <Rt2>, <label> ; A1 58230 if (minus_zero) { 58231 ldrd(condition, 58232 Register(rt), 58233 Register(rt + 1), 58234 MemOperand(pc, minus, 0)); 58235 } else { 58236 ldrd(condition, 58237 Register(rt), 58238 Register(rt + 1), 58239 &location); 58240 } 58241 if (((instr & 0xf7f00f0) != 0x14f00d0)) { 58242 UnpredictableA32(instr); 58243 } 58244 break; 58245 } 58246 default: { 58247 switch (instr & 0x01200000) { 58248 case 0x00000000: { 58249 // 0x004000d0 58250 if (((instr & 0xf0000000) == 0xf0000000) || 58251 ((instr & 0xf0000) == 0xf0000)) { 58252 UnallocatedA32(instr); 58253 return; 58254 } 58255 Condition condition((instr >> 28) & 0xf); 58256 unsigned rt = (instr >> 12) & 0xf; 58257 unsigned rn = (instr >> 16) & 0xf; 58258 Sign sign((((instr >> 23) & 0x1) == 0) ? minus 58259 : plus); 58260 int32_t offset = 58261 (instr & 0xf) | ((instr >> 4) & 0xf0); 58262 // LDRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>], #{+/-}<imm_1> ; A1 NOLINT(whitespace/line_length) 58263 ldrd(condition, 58264 Register(rt), 58265 Register(rt + 1), 58266 MemOperand(Register(rn), 58267 sign, 58268 offset, 58269 PostIndex)); 58270 break; 58271 } 58272 case 0x01000000: { 58273 // 0x014000d0 58274 if (((instr & 0xf0000000) == 0xf0000000) || 58275 ((instr & 0xf0000) == 0xf0000)) { 58276 UnallocatedA32(instr); 58277 return; 58278 } 58279 Condition condition((instr >> 28) & 0xf); 58280 unsigned rt = (instr >> 12) & 0xf; 58281 unsigned rn = (instr >> 16) & 0xf; 58282 Sign sign((((instr >> 23) & 0x1) == 0) ? minus 58283 : plus); 58284 int32_t offset = 58285 (instr & 0xf) | ((instr >> 4) & 0xf0); 58286 // LDRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>{, #{+/-}<imm_1>}] ; A1 NOLINT(whitespace/line_length) 58287 ldrd(condition, 58288 Register(rt), 58289 Register(rt + 1), 58290 MemOperand(Register(rn), 58291 sign, 58292 offset, 58293 Offset)); 58294 break; 58295 } 58296 case 0x01200000: { 58297 // 0x016000d0 58298 if (((instr & 0xf0000000) == 0xf0000000) || 58299 ((instr & 0xf0000) == 0xf0000)) { 58300 UnallocatedA32(instr); 58301 return; 58302 } 58303 Condition condition((instr >> 28) & 0xf); 58304 unsigned rt = (instr >> 12) & 0xf; 58305 unsigned rn = (instr >> 16) & 0xf; 58306 Sign sign((((instr >> 23) & 0x1) == 0) ? minus 58307 : plus); 58308 int32_t offset = 58309 (instr & 0xf) | ((instr >> 4) & 0xf0); 58310 // LDRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>{, #{+/-}<imm_1>}]! ; A1 NOLINT(whitespace/line_length) 58311 ldrd(condition, 58312 Register(rt), 58313 Register(rt + 1), 58314 MemOperand(Register(rn), 58315 sign, 58316 offset, 58317 PreIndex)); 58318 break; 58319 } 58320 default: 58321 UnallocatedA32(instr); 58322 break; 58323 } 58324 break; 58325 } 58326 } 58327 break; 58328 } 58329 case 0x00000060: { 58330 // 0x004000f0 58331 switch (instr & 0x01200000) { 58332 case 0x00000000: { 58333 // 0x004000f0 58334 if (((instr & 0xf0000000) == 0xf0000000)) { 58335 UnallocatedA32(instr); 58336 return; 58337 } 58338 Condition condition((instr >> 28) & 0xf); 58339 unsigned rt = (instr >> 12) & 0xf; 58340 unsigned rn = (instr >> 16) & 0xf; 58341 Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus); 58342 int32_t offset = (instr & 0xf) | ((instr >> 4) & 0xf0); 58343 // STRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>], #{+/-}<imm_1> ; A1 NOLINT(whitespace/line_length) 58344 strd(condition, 58345 Register(rt), 58346 Register(rt + 1), 58347 MemOperand(Register(rn), sign, offset, PostIndex)); 58348 break; 58349 } 58350 case 0x01000000: { 58351 // 0x014000f0 58352 if (((instr & 0xf0000000) == 0xf0000000)) { 58353 UnallocatedA32(instr); 58354 return; 58355 } 58356 Condition condition((instr >> 28) & 0xf); 58357 unsigned rt = (instr >> 12) & 0xf; 58358 unsigned rn = (instr >> 16) & 0xf; 58359 Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus); 58360 int32_t offset = (instr & 0xf) | ((instr >> 4) & 0xf0); 58361 // STRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>{, #{+/-}<imm_1>}] ; A1 NOLINT(whitespace/line_length) 58362 strd(condition, 58363 Register(rt), 58364 Register(rt + 1), 58365 MemOperand(Register(rn), sign, offset, Offset)); 58366 break; 58367 } 58368 case 0x01200000: { 58369 // 0x016000f0 58370 if (((instr & 0xf0000000) == 0xf0000000)) { 58371 UnallocatedA32(instr); 58372 return; 58373 } 58374 Condition condition((instr >> 28) & 0xf); 58375 unsigned rt = (instr >> 12) & 0xf; 58376 unsigned rn = (instr >> 16) & 0xf; 58377 Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus); 58378 int32_t offset = (instr & 0xf) | ((instr >> 4) & 0xf0); 58379 // STRD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>{, #{+/-}<imm_1>}]! ; A1 NOLINT(whitespace/line_length) 58380 strd(condition, 58381 Register(rt), 58382 Register(rt + 1), 58383 MemOperand(Register(rn), sign, offset, PreIndex)); 58384 break; 58385 } 58386 default: 58387 UnallocatedA32(instr); 58388 break; 58389 } 58390 break; 58391 } 58392 } 58393 break; 58394 } 58395 } 58396 break; 58397 } 58398 case 0x00100000: { 58399 // 0x00100000 58400 switch (instr & 0x01e00000) { 58401 case 0x00000000: { 58402 // 0x00100000 58403 switch (instr & 0x00000fe0) { 58404 case 0x00000060: { 58405 // 0x00100060 58406 if (((instr & 0xf0000000) == 0xf0000000)) { 58407 UnallocatedA32(instr); 58408 return; 58409 } 58410 Condition condition((instr >> 28) & 0xf); 58411 unsigned rd = (instr >> 12) & 0xf; 58412 unsigned rn = (instr >> 16) & 0xf; 58413 unsigned rm = instr & 0xf; 58414 // ANDS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1 58415 ands(condition, 58416 Best, 58417 Register(rd), 58418 Register(rn), 58419 Operand(Register(rm), RRX)); 58420 break; 58421 } 58422 default: { 58423 if (((instr & 0xf0000000) == 0xf0000000) || 58424 ((instr & 0xfe0) == 0x60)) { 58425 UnallocatedA32(instr); 58426 return; 58427 } 58428 Condition condition((instr >> 28) & 0xf); 58429 unsigned rd = (instr >> 12) & 0xf; 58430 unsigned rn = (instr >> 16) & 0xf; 58431 unsigned rm = instr & 0xf; 58432 ImmediateShiftOperand shift_operand((instr >> 5) & 0x3, 58433 (instr >> 7) & 0x1f); 58434 // ANDS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length) 58435 ands(condition, 58436 Best, 58437 Register(rd), 58438 Register(rn), 58439 Operand(Register(rm), 58440 shift_operand.GetType(), 58441 shift_operand.GetAmount())); 58442 break; 58443 } 58444 } 58445 break; 58446 } 58447 case 0x00200000: { 58448 // 0x00300000 58449 switch (instr & 0x00000fe0) { 58450 case 0x00000060: { 58451 // 0x00300060 58452 if (((instr & 0xf0000000) == 0xf0000000)) { 58453 UnallocatedA32(instr); 58454 return; 58455 } 58456 Condition condition((instr >> 28) & 0xf); 58457 unsigned rd = (instr >> 12) & 0xf; 58458 unsigned rn = (instr >> 16) & 0xf; 58459 unsigned rm = instr & 0xf; 58460 // EORS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1 58461 eors(condition, 58462 Best, 58463 Register(rd), 58464 Register(rn), 58465 Operand(Register(rm), RRX)); 58466 break; 58467 } 58468 default: { 58469 if (((instr & 0xf0000000) == 0xf0000000) || 58470 ((instr & 0xfe0) == 0x60)) { 58471 UnallocatedA32(instr); 58472 return; 58473 } 58474 Condition condition((instr >> 28) & 0xf); 58475 unsigned rd = (instr >> 12) & 0xf; 58476 unsigned rn = (instr >> 16) & 0xf; 58477 unsigned rm = instr & 0xf; 58478 ImmediateShiftOperand shift_operand((instr >> 5) & 0x3, 58479 (instr >> 7) & 0x1f); 58480 // EORS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length) 58481 eors(condition, 58482 Best, 58483 Register(rd), 58484 Register(rn), 58485 Operand(Register(rm), 58486 shift_operand.GetType(), 58487 shift_operand.GetAmount())); 58488 break; 58489 } 58490 } 58491 break; 58492 } 58493 case 0x00400000: { 58494 // 0x00500000 58495 switch (instr & 0x000f0000) { 58496 case 0x000d0000: { 58497 // 0x005d0000 58498 switch (instr & 0x00000fe0) { 58499 case 0x00000060: { 58500 // 0x005d0060 58501 if (((instr & 0xf0000000) == 0xf0000000)) { 58502 UnallocatedA32(instr); 58503 return; 58504 } 58505 Condition condition((instr >> 28) & 0xf); 58506 unsigned rd = (instr >> 12) & 0xf; 58507 unsigned rm = instr & 0xf; 58508 // SUBS{<c>}{<q>} {<Rd>}, SP, <Rm>, RRX ; A1 58509 subs(condition, 58510 Best, 58511 Register(rd), 58512 sp, 58513 Operand(Register(rm), RRX)); 58514 break; 58515 } 58516 default: { 58517 if (((instr & 0xf0000000) == 0xf0000000) || 58518 ((instr & 0xfe0) == 0x60)) { 58519 UnallocatedA32(instr); 58520 return; 58521 } 58522 Condition condition((instr >> 28) & 0xf); 58523 unsigned rd = (instr >> 12) & 0xf; 58524 unsigned rm = instr & 0xf; 58525 ImmediateShiftOperand shift_operand((instr >> 5) & 0x3, 58526 (instr >> 7) & 58527 0x1f); 58528 // SUBS{<c>}{<q>} {<Rd>}, SP, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length) 58529 subs(condition, 58530 Best, 58531 Register(rd), 58532 sp, 58533 Operand(Register(rm), 58534 shift_operand.GetType(), 58535 shift_operand.GetAmount())); 58536 break; 58537 } 58538 } 58539 break; 58540 } 58541 default: { 58542 switch (instr & 0x00000fe0) { 58543 case 0x00000060: { 58544 // 0x00500060 58545 if (((instr & 0xf0000000) == 0xf0000000) || 58546 ((instr & 0xf0000) == 0xd0000)) { 58547 UnallocatedA32(instr); 58548 return; 58549 } 58550 Condition condition((instr >> 28) & 0xf); 58551 unsigned rd = (instr >> 12) & 0xf; 58552 unsigned rn = (instr >> 16) & 0xf; 58553 unsigned rm = instr & 0xf; 58554 // SUBS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1 58555 subs(condition, 58556 Best, 58557 Register(rd), 58558 Register(rn), 58559 Operand(Register(rm), RRX)); 58560 break; 58561 } 58562 default: { 58563 if (((instr & 0xf0000000) == 0xf0000000) || 58564 ((instr & 0xf0000) == 0xd0000) || 58565 ((instr & 0xfe0) == 0x60)) { 58566 UnallocatedA32(instr); 58567 return; 58568 } 58569 Condition condition((instr >> 28) & 0xf); 58570 unsigned rd = (instr >> 12) & 0xf; 58571 unsigned rn = (instr >> 16) & 0xf; 58572 unsigned rm = instr & 0xf; 58573 ImmediateShiftOperand shift_operand((instr >> 5) & 0x3, 58574 (instr >> 7) & 58575 0x1f); 58576 // SUBS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length) 58577 subs(condition, 58578 Best, 58579 Register(rd), 58580 Register(rn), 58581 Operand(Register(rm), 58582 shift_operand.GetType(), 58583 shift_operand.GetAmount())); 58584 break; 58585 } 58586 } 58587 break; 58588 } 58589 } 58590 break; 58591 } 58592 case 0x00600000: { 58593 // 0x00700000 58594 switch (instr & 0x00000fe0) { 58595 case 0x00000060: { 58596 // 0x00700060 58597 if (((instr & 0xf0000000) == 0xf0000000)) { 58598 UnallocatedA32(instr); 58599 return; 58600 } 58601 Condition condition((instr >> 28) & 0xf); 58602 unsigned rd = (instr >> 12) & 0xf; 58603 unsigned rn = (instr >> 16) & 0xf; 58604 unsigned rm = instr & 0xf; 58605 // RSBS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1 58606 rsbs(condition, 58607 Best, 58608 Register(rd), 58609 Register(rn), 58610 Operand(Register(rm), RRX)); 58611 break; 58612 } 58613 default: { 58614 if (((instr & 0xf0000000) == 0xf0000000) || 58615 ((instr & 0xfe0) == 0x60)) { 58616 UnallocatedA32(instr); 58617 return; 58618 } 58619 Condition condition((instr >> 28) & 0xf); 58620 unsigned rd = (instr >> 12) & 0xf; 58621 unsigned rn = (instr >> 16) & 0xf; 58622 unsigned rm = instr & 0xf; 58623 ImmediateShiftOperand shift_operand((instr >> 5) & 0x3, 58624 (instr >> 7) & 0x1f); 58625 // RSBS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length) 58626 rsbs(condition, 58627 Best, 58628 Register(rd), 58629 Register(rn), 58630 Operand(Register(rm), 58631 shift_operand.GetType(), 58632 shift_operand.GetAmount())); 58633 break; 58634 } 58635 } 58636 break; 58637 } 58638 case 0x00800000: { 58639 // 0x00900000 58640 switch (instr & 0x000f0000) { 58641 case 0x000d0000: { 58642 // 0x009d0000 58643 switch (instr & 0x00000fe0) { 58644 case 0x00000060: { 58645 // 0x009d0060 58646 if (((instr & 0xf0000000) == 0xf0000000)) { 58647 UnallocatedA32(instr); 58648 return; 58649 } 58650 Condition condition((instr >> 28) & 0xf); 58651 unsigned rd = (instr >> 12) & 0xf; 58652 unsigned rm = instr & 0xf; 58653 // ADDS{<c>}{<q>} {<Rd>}, SP, <Rm>, RRX ; A1 58654 adds(condition, 58655 Best, 58656 Register(rd), 58657 sp, 58658 Operand(Register(rm), RRX)); 58659 break; 58660 } 58661 default: { 58662 if (((instr & 0xf0000000) == 0xf0000000) || 58663 ((instr & 0xfe0) == 0x60)) { 58664 UnallocatedA32(instr); 58665 return; 58666 } 58667 Condition condition((instr >> 28) & 0xf); 58668 unsigned rd = (instr >> 12) & 0xf; 58669 unsigned rm = instr & 0xf; 58670 ImmediateShiftOperand shift_operand((instr >> 5) & 0x3, 58671 (instr >> 7) & 58672 0x1f); 58673 // ADDS{<c>}{<q>} {<Rd>}, SP, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length) 58674 adds(condition, 58675 Best, 58676 Register(rd), 58677 sp, 58678 Operand(Register(rm), 58679 shift_operand.GetType(), 58680 shift_operand.GetAmount())); 58681 break; 58682 } 58683 } 58684 break; 58685 } 58686 default: { 58687 switch (instr & 0x00000fe0) { 58688 case 0x00000060: { 58689 // 0x00900060 58690 if (((instr & 0xf0000000) == 0xf0000000) || 58691 ((instr & 0xf0000) == 0xd0000)) { 58692 UnallocatedA32(instr); 58693 return; 58694 } 58695 Condition condition((instr >> 28) & 0xf); 58696 unsigned rd = (instr >> 12) & 0xf; 58697 unsigned rn = (instr >> 16) & 0xf; 58698 unsigned rm = instr & 0xf; 58699 // ADDS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1 58700 adds(condition, 58701 Best, 58702 Register(rd), 58703 Register(rn), 58704 Operand(Register(rm), RRX)); 58705 break; 58706 } 58707 default: { 58708 if (((instr & 0xf0000000) == 0xf0000000) || 58709 ((instr & 0xf0000) == 0xd0000) || 58710 ((instr & 0xfe0) == 0x60)) { 58711 UnallocatedA32(instr); 58712 return; 58713 } 58714 Condition condition((instr >> 28) & 0xf); 58715 unsigned rd = (instr >> 12) & 0xf; 58716 unsigned rn = (instr >> 16) & 0xf; 58717 unsigned rm = instr & 0xf; 58718 ImmediateShiftOperand shift_operand((instr >> 5) & 0x3, 58719 (instr >> 7) & 58720 0x1f); 58721 // ADDS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length) 58722 adds(condition, 58723 Best, 58724 Register(rd), 58725 Register(rn), 58726 Operand(Register(rm), 58727 shift_operand.GetType(), 58728 shift_operand.GetAmount())); 58729 break; 58730 } 58731 } 58732 break; 58733 } 58734 } 58735 break; 58736 } 58737 case 0x00a00000: { 58738 // 0x00b00000 58739 switch (instr & 0x00000fe0) { 58740 case 0x00000060: { 58741 // 0x00b00060 58742 if (((instr & 0xf0000000) == 0xf0000000)) { 58743 UnallocatedA32(instr); 58744 return; 58745 } 58746 Condition condition((instr >> 28) & 0xf); 58747 unsigned rd = (instr >> 12) & 0xf; 58748 unsigned rn = (instr >> 16) & 0xf; 58749 unsigned rm = instr & 0xf; 58750 // ADCS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1 58751 adcs(condition, 58752 Best, 58753 Register(rd), 58754 Register(rn), 58755 Operand(Register(rm), RRX)); 58756 break; 58757 } 58758 default: { 58759 if (((instr & 0xf0000000) == 0xf0000000) || 58760 ((instr & 0xfe0) == 0x60)) { 58761 UnallocatedA32(instr); 58762 return; 58763 } 58764 Condition condition((instr >> 28) & 0xf); 58765 unsigned rd = (instr >> 12) & 0xf; 58766 unsigned rn = (instr >> 16) & 0xf; 58767 unsigned rm = instr & 0xf; 58768 ImmediateShiftOperand shift_operand((instr >> 5) & 0x3, 58769 (instr >> 7) & 0x1f); 58770 // ADCS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length) 58771 adcs(condition, 58772 Best, 58773 Register(rd), 58774 Register(rn), 58775 Operand(Register(rm), 58776 shift_operand.GetType(), 58777 shift_operand.GetAmount())); 58778 break; 58779 } 58780 } 58781 break; 58782 } 58783 case 0x00c00000: { 58784 // 0x00d00000 58785 switch (instr & 0x00000fe0) { 58786 case 0x00000060: { 58787 // 0x00d00060 58788 if (((instr & 0xf0000000) == 0xf0000000)) { 58789 UnallocatedA32(instr); 58790 return; 58791 } 58792 Condition condition((instr >> 28) & 0xf); 58793 unsigned rd = (instr >> 12) & 0xf; 58794 unsigned rn = (instr >> 16) & 0xf; 58795 unsigned rm = instr & 0xf; 58796 // SBCS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1 58797 sbcs(condition, 58798 Best, 58799 Register(rd), 58800 Register(rn), 58801 Operand(Register(rm), RRX)); 58802 break; 58803 } 58804 default: { 58805 if (((instr & 0xf0000000) == 0xf0000000) || 58806 ((instr & 0xfe0) == 0x60)) { 58807 UnallocatedA32(instr); 58808 return; 58809 } 58810 Condition condition((instr >> 28) & 0xf); 58811 unsigned rd = (instr >> 12) & 0xf; 58812 unsigned rn = (instr >> 16) & 0xf; 58813 unsigned rm = instr & 0xf; 58814 ImmediateShiftOperand shift_operand((instr >> 5) & 0x3, 58815 (instr >> 7) & 0x1f); 58816 // SBCS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length) 58817 sbcs(condition, 58818 Best, 58819 Register(rd), 58820 Register(rn), 58821 Operand(Register(rm), 58822 shift_operand.GetType(), 58823 shift_operand.GetAmount())); 58824 break; 58825 } 58826 } 58827 break; 58828 } 58829 case 0x00e00000: { 58830 // 0x00f00000 58831 switch (instr & 0x00000fe0) { 58832 case 0x00000060: { 58833 // 0x00f00060 58834 if (((instr & 0xf0000000) == 0xf0000000)) { 58835 UnallocatedA32(instr); 58836 return; 58837 } 58838 Condition condition((instr >> 28) & 0xf); 58839 unsigned rd = (instr >> 12) & 0xf; 58840 unsigned rn = (instr >> 16) & 0xf; 58841 unsigned rm = instr & 0xf; 58842 // RSCS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1 58843 rscs(condition, 58844 Register(rd), 58845 Register(rn), 58846 Operand(Register(rm), RRX)); 58847 break; 58848 } 58849 default: { 58850 if (((instr & 0xf0000000) == 0xf0000000) || 58851 ((instr & 0xfe0) == 0x60)) { 58852 UnallocatedA32(instr); 58853 return; 58854 } 58855 Condition condition((instr >> 28) & 0xf); 58856 unsigned rd = (instr >> 12) & 0xf; 58857 unsigned rn = (instr >> 16) & 0xf; 58858 unsigned rm = instr & 0xf; 58859 ImmediateShiftOperand shift_operand((instr >> 5) & 0x3, 58860 (instr >> 7) & 0x1f); 58861 // RSCS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length) 58862 rscs(condition, 58863 Register(rd), 58864 Register(rn), 58865 Operand(Register(rm), 58866 shift_operand.GetType(), 58867 shift_operand.GetAmount())); 58868 break; 58869 } 58870 } 58871 break; 58872 } 58873 case 0x01000000: { 58874 // 0x01100000 58875 switch (instr & 0x00000fe0) { 58876 case 0x00000060: { 58877 // 0x01100060 58878 if (((instr & 0xf0000000) == 0xf0000000)) { 58879 UnallocatedA32(instr); 58880 return; 58881 } 58882 Condition condition((instr >> 28) & 0xf); 58883 unsigned rn = (instr >> 16) & 0xf; 58884 unsigned rm = instr & 0xf; 58885 // TST{<c>}{<q>} <Rn>, <Rm>, RRX ; A1 58886 tst(condition, 58887 Best, 58888 Register(rn), 58889 Operand(Register(rm), RRX)); 58890 if (((instr & 0xff0fff0) != 0x1100060)) { 58891 UnpredictableA32(instr); 58892 } 58893 break; 58894 } 58895 default: { 58896 if (((instr & 0xf0000000) == 0xf0000000) || 58897 ((instr & 0xfe0) == 0x60)) { 58898 UnallocatedA32(instr); 58899 return; 58900 } 58901 Condition condition((instr >> 28) & 0xf); 58902 unsigned rn = (instr >> 16) & 0xf; 58903 unsigned rm = instr & 0xf; 58904 ImmediateShiftOperand shift_operand((instr >> 5) & 0x3, 58905 (instr >> 7) & 0x1f); 58906 // TST{<c>}{<q>} <Rn>, <Rm> {, <shift> #<amount> } ; A1 58907 tst(condition, 58908 Best, 58909 Register(rn), 58910 Operand(Register(rm), 58911 shift_operand.GetType(), 58912 shift_operand.GetAmount())); 58913 if (((instr & 0xff0f010) != 0x1100000)) { 58914 UnpredictableA32(instr); 58915 } 58916 break; 58917 } 58918 } 58919 break; 58920 } 58921 case 0x01200000: { 58922 // 0x01300000 58923 switch (instr & 0x00000fe0) { 58924 case 0x00000060: { 58925 // 0x01300060 58926 if (((instr & 0xf0000000) == 0xf0000000)) { 58927 UnallocatedA32(instr); 58928 return; 58929 } 58930 Condition condition((instr >> 28) & 0xf); 58931 unsigned rn = (instr >> 16) & 0xf; 58932 unsigned rm = instr & 0xf; 58933 // TEQ{<c>}{<q>} <Rn>, <Rm>, RRX ; A1 58934 teq(condition, Register(rn), Operand(Register(rm), RRX)); 58935 if (((instr & 0xff0fff0) != 0x1300060)) { 58936 UnpredictableA32(instr); 58937 } 58938 break; 58939 } 58940 default: { 58941 if (((instr & 0xf0000000) == 0xf0000000) || 58942 ((instr & 0xfe0) == 0x60)) { 58943 UnallocatedA32(instr); 58944 return; 58945 } 58946 Condition condition((instr >> 28) & 0xf); 58947 unsigned rn = (instr >> 16) & 0xf; 58948 unsigned rm = instr & 0xf; 58949 ImmediateShiftOperand shift_operand((instr >> 5) & 0x3, 58950 (instr >> 7) & 0x1f); 58951 // TEQ{<c>}{<q>} <Rn>, <Rm> {, <shift> #<amount> } ; A1 58952 teq(condition, 58953 Register(rn), 58954 Operand(Register(rm), 58955 shift_operand.GetType(), 58956 shift_operand.GetAmount())); 58957 if (((instr & 0xff0f010) != 0x1300000)) { 58958 UnpredictableA32(instr); 58959 } 58960 break; 58961 } 58962 } 58963 break; 58964 } 58965 case 0x01400000: { 58966 // 0x01500000 58967 switch (instr & 0x00000fe0) { 58968 case 0x00000060: { 58969 // 0x01500060 58970 if (((instr & 0xf0000000) == 0xf0000000)) { 58971 UnallocatedA32(instr); 58972 return; 58973 } 58974 Condition condition((instr >> 28) & 0xf); 58975 unsigned rn = (instr >> 16) & 0xf; 58976 unsigned rm = instr & 0xf; 58977 // CMP{<c>}{<q>} <Rn>, <Rm>, RRX ; A1 58978 cmp(condition, 58979 Best, 58980 Register(rn), 58981 Operand(Register(rm), RRX)); 58982 if (((instr & 0xff0fff0) != 0x1500060)) { 58983 UnpredictableA32(instr); 58984 } 58985 break; 58986 } 58987 default: { 58988 if (((instr & 0xf0000000) == 0xf0000000) || 58989 ((instr & 0xfe0) == 0x60)) { 58990 UnallocatedA32(instr); 58991 return; 58992 } 58993 Condition condition((instr >> 28) & 0xf); 58994 unsigned rn = (instr >> 16) & 0xf; 58995 unsigned rm = instr & 0xf; 58996 ImmediateShiftOperand shift_operand((instr >> 5) & 0x3, 58997 (instr >> 7) & 0x1f); 58998 // CMP{<c>}{<q>} <Rn>, <Rm> {, <shift> #<amount> } ; A1 58999 cmp(condition, 59000 Best, 59001 Register(rn), 59002 Operand(Register(rm), 59003 shift_operand.GetType(), 59004 shift_operand.GetAmount())); 59005 if (((instr & 0xff0f010) != 0x1500000)) { 59006 UnpredictableA32(instr); 59007 } 59008 break; 59009 } 59010 } 59011 break; 59012 } 59013 case 0x01600000: { 59014 // 0x01700000 59015 switch (instr & 0x00000fe0) { 59016 case 0x00000060: { 59017 // 0x01700060 59018 if (((instr & 0xf0000000) == 0xf0000000)) { 59019 UnallocatedA32(instr); 59020 return; 59021 } 59022 Condition condition((instr >> 28) & 0xf); 59023 unsigned rn = (instr >> 16) & 0xf; 59024 unsigned rm = instr & 0xf; 59025 // CMN{<c>}{<q>} <Rn>, <Rm>, RRX ; A1 59026 cmn(condition, 59027 Best, 59028 Register(rn), 59029 Operand(Register(rm), RRX)); 59030 if (((instr & 0xff0fff0) != 0x1700060)) { 59031 UnpredictableA32(instr); 59032 } 59033 break; 59034 } 59035 default: { 59036 if (((instr & 0xf0000000) == 0xf0000000) || 59037 ((instr & 0xfe0) == 0x60)) { 59038 UnallocatedA32(instr); 59039 return; 59040 } 59041 Condition condition((instr >> 28) & 0xf); 59042 unsigned rn = (instr >> 16) & 0xf; 59043 unsigned rm = instr & 0xf; 59044 ImmediateShiftOperand shift_operand((instr >> 5) & 0x3, 59045 (instr >> 7) & 0x1f); 59046 // CMN{<c>}{<q>} <Rn>, <Rm> {, <shift> #<amount> } ; A1 59047 cmn(condition, 59048 Best, 59049 Register(rn), 59050 Operand(Register(rm), 59051 shift_operand.GetType(), 59052 shift_operand.GetAmount())); 59053 if (((instr & 0xff0f010) != 0x1700000)) { 59054 UnpredictableA32(instr); 59055 } 59056 break; 59057 } 59058 } 59059 break; 59060 } 59061 case 0x01800000: { 59062 // 0x01900000 59063 switch (instr & 0x00000fe0) { 59064 case 0x00000060: { 59065 // 0x01900060 59066 if (((instr & 0xf0000000) == 0xf0000000)) { 59067 UnallocatedA32(instr); 59068 return; 59069 } 59070 Condition condition((instr >> 28) & 0xf); 59071 unsigned rd = (instr >> 12) & 0xf; 59072 unsigned rn = (instr >> 16) & 0xf; 59073 unsigned rm = instr & 0xf; 59074 // ORRS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1 59075 orrs(condition, 59076 Best, 59077 Register(rd), 59078 Register(rn), 59079 Operand(Register(rm), RRX)); 59080 break; 59081 } 59082 default: { 59083 if (((instr & 0xf0000000) == 0xf0000000) || 59084 ((instr & 0xfe0) == 0x60)) { 59085 UnallocatedA32(instr); 59086 return; 59087 } 59088 Condition condition((instr >> 28) & 0xf); 59089 unsigned rd = (instr >> 12) & 0xf; 59090 unsigned rn = (instr >> 16) & 0xf; 59091 unsigned rm = instr & 0xf; 59092 ImmediateShiftOperand shift_operand((instr >> 5) & 0x3, 59093 (instr >> 7) & 0x1f); 59094 // ORRS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length) 59095 orrs(condition, 59096 Best, 59097 Register(rd), 59098 Register(rn), 59099 Operand(Register(rm), 59100 shift_operand.GetType(), 59101 shift_operand.GetAmount())); 59102 break; 59103 } 59104 } 59105 break; 59106 } 59107 case 0x01a00000: { 59108 // 0x01b00000 59109 switch (instr & 0x00000fe0) { 59110 case 0x00000060: { 59111 // 0x01b00060 59112 if (((instr & 0xf0000000) == 0xf0000000)) { 59113 UnallocatedA32(instr); 59114 return; 59115 } 59116 if (((instr & 0xf0000000) != 0xf0000000)) { 59117 Condition condition((instr >> 28) & 0xf); 59118 unsigned rd = (instr >> 12) & 0xf; 59119 unsigned rm = instr & 0xf; 59120 // RRXS{<c>}{<q>} {<Rd>}, <Rm> ; A1 59121 rrxs(condition, Register(rd), Register(rm)); 59122 if (((instr & 0xfff0ff0) != 0x1b00060)) { 59123 UnpredictableA32(instr); 59124 } 59125 return; 59126 } 59127 Condition condition((instr >> 28) & 0xf); 59128 unsigned rd = (instr >> 12) & 0xf; 59129 unsigned rm = instr & 0xf; 59130 // MOVS{<c>}{<q>} <Rd>, <Rm>, RRX ; A1 59131 movs(condition, 59132 Best, 59133 Register(rd), 59134 Operand(Register(rm), RRX)); 59135 if (((instr & 0xfff0ff0) != 0x1b00060)) { 59136 UnpredictableA32(instr); 59137 } 59138 break; 59139 } 59140 default: { 59141 if (((instr & 0xf0000000) == 0xf0000000) || 59142 ((instr & 0xfe0) == 0x60)) { 59143 UnallocatedA32(instr); 59144 return; 59145 } 59146 if (((Uint32((instr >> 5)) & Uint32(0x3)) == Uint32(0x2)) && 59147 ((instr & 0xf0000000) != 0xf0000000)) { 59148 Condition condition((instr >> 28) & 0xf); 59149 unsigned rd = (instr >> 12) & 0xf; 59150 unsigned rm = instr & 0xf; 59151 uint32_t amount = (instr >> 7) & 0x1f; 59152 if (amount == 0) amount = 32; 59153 // ASRS{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; A1 59154 asrs(condition, Best, Register(rd), Register(rm), amount); 59155 if (((instr & 0xfff0070) != 0x1b00040)) { 59156 UnpredictableA32(instr); 59157 } 59158 return; 59159 } 59160 if (((Uint32((instr >> 5)) & Uint32(0x3)) == Uint32(0x0)) && 59161 ((instr & 0xf0000000) != 0xf0000000) && 59162 ((instr & 0x00000f80) != 0x00000000)) { 59163 Condition condition((instr >> 28) & 0xf); 59164 unsigned rd = (instr >> 12) & 0xf; 59165 unsigned rm = instr & 0xf; 59166 uint32_t amount = (instr >> 7) & 0x1f; 59167 // LSLS{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; A1 59168 lsls(condition, Best, Register(rd), Register(rm), amount); 59169 if (((instr & 0xfff0070) != 0x1b00000)) { 59170 UnpredictableA32(instr); 59171 } 59172 return; 59173 } 59174 if (((Uint32((instr >> 5)) & Uint32(0x3)) == Uint32(0x1)) && 59175 ((instr & 0xf0000000) != 0xf0000000)) { 59176 Condition condition((instr >> 28) & 0xf); 59177 unsigned rd = (instr >> 12) & 0xf; 59178 unsigned rm = instr & 0xf; 59179 uint32_t amount = (instr >> 7) & 0x1f; 59180 if (amount == 0) amount = 32; 59181 // LSRS{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; A1 59182 lsrs(condition, Best, Register(rd), Register(rm), amount); 59183 if (((instr & 0xfff0070) != 0x1b00020)) { 59184 UnpredictableA32(instr); 59185 } 59186 return; 59187 } 59188 if (((Uint32((instr >> 5)) & Uint32(0x3)) == Uint32(0x3)) && 59189 ((instr & 0xf0000000) != 0xf0000000) && 59190 ((instr & 0x00000f80) != 0x00000000)) { 59191 Condition condition((instr >> 28) & 0xf); 59192 unsigned rd = (instr >> 12) & 0xf; 59193 unsigned rm = instr & 0xf; 59194 uint32_t amount = (instr >> 7) & 0x1f; 59195 // RORS{<c>}{<q>} {<Rd>}, <Rm>, #<imm> ; A1 59196 rors(condition, Best, Register(rd), Register(rm), amount); 59197 if (((instr & 0xfff0070) != 0x1b00060)) { 59198 UnpredictableA32(instr); 59199 } 59200 return; 59201 } 59202 Condition condition((instr >> 28) & 0xf); 59203 unsigned rd = (instr >> 12) & 0xf; 59204 unsigned rm = instr & 0xf; 59205 ImmediateShiftOperand shift_operand((instr >> 5) & 0x3, 59206 (instr >> 7) & 0x1f); 59207 // MOVS{<c>}{<q>} <Rd>, <Rm> {, <shift> #<amount> } ; A1 59208 movs(condition, 59209 Best, 59210 Register(rd), 59211 Operand(Register(rm), 59212 shift_operand.GetType(), 59213 shift_operand.GetAmount())); 59214 if (((instr & 0xfff0010) != 0x1b00000)) { 59215 UnpredictableA32(instr); 59216 } 59217 break; 59218 } 59219 } 59220 break; 59221 } 59222 case 0x01c00000: { 59223 // 0x01d00000 59224 switch (instr & 0x00000fe0) { 59225 case 0x00000060: { 59226 // 0x01d00060 59227 if (((instr & 0xf0000000) == 0xf0000000)) { 59228 UnallocatedA32(instr); 59229 return; 59230 } 59231 Condition condition((instr >> 28) & 0xf); 59232 unsigned rd = (instr >> 12) & 0xf; 59233 unsigned rn = (instr >> 16) & 0xf; 59234 unsigned rm = instr & 0xf; 59235 // BICS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, RRX ; A1 59236 bics(condition, 59237 Best, 59238 Register(rd), 59239 Register(rn), 59240 Operand(Register(rm), RRX)); 59241 break; 59242 } 59243 default: { 59244 if (((instr & 0xf0000000) == 0xf0000000) || 59245 ((instr & 0xfe0) == 0x60)) { 59246 UnallocatedA32(instr); 59247 return; 59248 } 59249 Condition condition((instr >> 28) & 0xf); 59250 unsigned rd = (instr >> 12) & 0xf; 59251 unsigned rn = (instr >> 16) & 0xf; 59252 unsigned rm = instr & 0xf; 59253 ImmediateShiftOperand shift_operand((instr >> 5) & 0x3, 59254 (instr >> 7) & 0x1f); 59255 // BICS{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, <shift> #<amount> } ; A1 NOLINT(whitespace/line_length) 59256 bics(condition, 59257 Best, 59258 Register(rd), 59259 Register(rn), 59260 Operand(Register(rm), 59261 shift_operand.GetType(), 59262 shift_operand.GetAmount())); 59263 break; 59264 } 59265 } 59266 break; 59267 } 59268 case 0x01e00000: { 59269 // 0x01f00000 59270 switch (instr & 0x00000fe0) { 59271 case 0x00000060: { 59272 // 0x01f00060 59273 if (((instr & 0xf0000000) == 0xf0000000)) { 59274 UnallocatedA32(instr); 59275 return; 59276 } 59277 Condition condition((instr >> 28) & 0xf); 59278 unsigned rd = (instr >> 12) & 0xf; 59279 unsigned rm = instr & 0xf; 59280 // MVNS{<c>}{<q>} <Rd>, <Rm>, RRX ; A1 59281 mvns(condition, 59282 Best, 59283 Register(rd), 59284 Operand(Register(rm), RRX)); 59285 if (((instr & 0xfff0ff0) != 0x1f00060)) { 59286 UnpredictableA32(instr); 59287 } 59288 break; 59289 } 59290 default: { 59291 if (((instr & 0xf0000000) == 0xf0000000) || 59292 ((instr & 0xfe0) == 0x60)) { 59293 UnallocatedA32(instr); 59294 return; 59295 } 59296 Condition condition((instr >> 28) & 0xf); 59297 unsigned rd = (instr >> 12) & 0xf; 59298 unsigned rm = instr & 0xf; 59299 ImmediateShiftOperand shift_operand((instr >> 5) & 0x3, 59300 (instr >> 7) & 0x1f); 59301 // MVNS{<c>}{<q>} <Rd>, <Rm> {, <shift> #<amount> } ; A1 59302 mvns(condition, 59303 Best, 59304 Register(rd), 59305 Operand(Register(rm), 59306 shift_operand.GetType(), 59307 shift_operand.GetAmount())); 59308 if (((instr & 0xfff0010) != 0x1f00000)) { 59309 UnpredictableA32(instr); 59310 } 59311 break; 59312 } 59313 } 59314 break; 59315 } 59316 } 59317 break; 59318 } 59319 case 0x00100010: { 59320 // 0x00100010 59321 switch (instr & 0x00400080) { 59322 case 0x00000000: { 59323 // 0x00100010 59324 switch (instr & 0x01a00000) { 59325 case 0x00000000: { 59326 // 0x00100010 59327 if (((instr & 0xf0000000) == 0xf0000000)) { 59328 UnallocatedA32(instr); 59329 return; 59330 } 59331 Condition condition((instr >> 28) & 0xf); 59332 unsigned rd = (instr >> 12) & 0xf; 59333 unsigned rn = (instr >> 16) & 0xf; 59334 unsigned rm = instr & 0xf; 59335 Shift shift((instr >> 5) & 0x3); 59336 unsigned rs = (instr >> 8) & 0xf; 59337 // ANDS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1 59338 ands(condition, 59339 Best, 59340 Register(rd), 59341 Register(rn), 59342 Operand(Register(rm), shift.GetType(), Register(rs))); 59343 break; 59344 } 59345 case 0x00200000: { 59346 // 0x00300010 59347 if (((instr & 0xf0000000) == 0xf0000000)) { 59348 UnallocatedA32(instr); 59349 return; 59350 } 59351 Condition condition((instr >> 28) & 0xf); 59352 unsigned rd = (instr >> 12) & 0xf; 59353 unsigned rn = (instr >> 16) & 0xf; 59354 unsigned rm = instr & 0xf; 59355 Shift shift((instr >> 5) & 0x3); 59356 unsigned rs = (instr >> 8) & 0xf; 59357 // EORS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1 59358 eors(condition, 59359 Best, 59360 Register(rd), 59361 Register(rn), 59362 Operand(Register(rm), shift.GetType(), Register(rs))); 59363 break; 59364 } 59365 case 0x00800000: { 59366 // 0x00900010 59367 if (((instr & 0xf0000000) == 0xf0000000)) { 59368 UnallocatedA32(instr); 59369 return; 59370 } 59371 Condition condition((instr >> 28) & 0xf); 59372 unsigned rd = (instr >> 12) & 0xf; 59373 unsigned rn = (instr >> 16) & 0xf; 59374 unsigned rm = instr & 0xf; 59375 Shift shift((instr >> 5) & 0x3); 59376 unsigned rs = (instr >> 8) & 0xf; 59377 // ADDS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1 59378 adds(condition, 59379 Best, 59380 Register(rd), 59381 Register(rn), 59382 Operand(Register(rm), shift.GetType(), Register(rs))); 59383 break; 59384 } 59385 case 0x00a00000: { 59386 // 0x00b00010 59387 if (((instr & 0xf0000000) == 0xf0000000)) { 59388 UnallocatedA32(instr); 59389 return; 59390 } 59391 Condition condition((instr >> 28) & 0xf); 59392 unsigned rd = (instr >> 12) & 0xf; 59393 unsigned rn = (instr >> 16) & 0xf; 59394 unsigned rm = instr & 0xf; 59395 Shift shift((instr >> 5) & 0x3); 59396 unsigned rs = (instr >> 8) & 0xf; 59397 // ADCS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1 59398 adcs(condition, 59399 Best, 59400 Register(rd), 59401 Register(rn), 59402 Operand(Register(rm), shift.GetType(), Register(rs))); 59403 break; 59404 } 59405 case 0x01000000: { 59406 // 0x01100010 59407 if (((instr & 0xf0000000) == 0xf0000000)) { 59408 UnallocatedA32(instr); 59409 return; 59410 } 59411 Condition condition((instr >> 28) & 0xf); 59412 unsigned rn = (instr >> 16) & 0xf; 59413 unsigned rm = instr & 0xf; 59414 Shift shift((instr >> 5) & 0x3); 59415 unsigned rs = (instr >> 8) & 0xf; 59416 // TST{<c>}{<q>} <Rn>, <Rm>, <shift> <Rs> ; A1 59417 tst(condition, 59418 Best, 59419 Register(rn), 59420 Operand(Register(rm), shift.GetType(), Register(rs))); 59421 if (((instr & 0xff0f090) != 0x1100010)) { 59422 UnpredictableA32(instr); 59423 } 59424 break; 59425 } 59426 case 0x01200000: { 59427 // 0x01300010 59428 if (((instr & 0xf0000000) == 0xf0000000)) { 59429 UnallocatedA32(instr); 59430 return; 59431 } 59432 Condition condition((instr >> 28) & 0xf); 59433 unsigned rn = (instr >> 16) & 0xf; 59434 unsigned rm = instr & 0xf; 59435 Shift shift((instr >> 5) & 0x3); 59436 unsigned rs = (instr >> 8) & 0xf; 59437 // TEQ{<c>}{<q>} <Rn>, <Rm>, <shift> <Rs> ; A1 59438 teq(condition, 59439 Register(rn), 59440 Operand(Register(rm), shift.GetType(), Register(rs))); 59441 if (((instr & 0xff0f090) != 0x1300010)) { 59442 UnpredictableA32(instr); 59443 } 59444 break; 59445 } 59446 case 0x01800000: { 59447 // 0x01900010 59448 if (((instr & 0xf0000000) == 0xf0000000)) { 59449 UnallocatedA32(instr); 59450 return; 59451 } 59452 Condition condition((instr >> 28) & 0xf); 59453 unsigned rd = (instr >> 12) & 0xf; 59454 unsigned rn = (instr >> 16) & 0xf; 59455 unsigned rm = instr & 0xf; 59456 Shift shift((instr >> 5) & 0x3); 59457 unsigned rs = (instr >> 8) & 0xf; 59458 // ORRS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1 59459 orrs(condition, 59460 Best, 59461 Register(rd), 59462 Register(rn), 59463 Operand(Register(rm), shift.GetType(), Register(rs))); 59464 break; 59465 } 59466 case 0x01a00000: { 59467 // 0x01b00010 59468 if (((instr & 0xf0000000) == 0xf0000000)) { 59469 UnallocatedA32(instr); 59470 return; 59471 } 59472 if (((Uint32((instr >> 5)) & Uint32(0x3)) == Uint32(0x2)) && 59473 ((instr & 0xf0000000) != 0xf0000000)) { 59474 Condition condition((instr >> 28) & 0xf); 59475 unsigned rd = (instr >> 12) & 0xf; 59476 unsigned rm = instr & 0xf; 59477 unsigned rs = (instr >> 8) & 0xf; 59478 // ASRS{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; A1 59479 asrs(condition, 59480 Best, 59481 Register(rd), 59482 Register(rm), 59483 Register(rs)); 59484 if (((instr & 0xfff00f0) != 0x1b00050)) { 59485 UnpredictableA32(instr); 59486 } 59487 return; 59488 } 59489 if (((Uint32((instr >> 5)) & Uint32(0x3)) == Uint32(0x0)) && 59490 ((instr & 0xf0000000) != 0xf0000000)) { 59491 Condition condition((instr >> 28) & 0xf); 59492 unsigned rd = (instr >> 12) & 0xf; 59493 unsigned rm = instr & 0xf; 59494 unsigned rs = (instr >> 8) & 0xf; 59495 // LSLS{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; A1 59496 lsls(condition, 59497 Best, 59498 Register(rd), 59499 Register(rm), 59500 Register(rs)); 59501 if (((instr & 0xfff00f0) != 0x1b00010)) { 59502 UnpredictableA32(instr); 59503 } 59504 return; 59505 } 59506 if (((Uint32((instr >> 5)) & Uint32(0x3)) == Uint32(0x1)) && 59507 ((instr & 0xf0000000) != 0xf0000000)) { 59508 Condition condition((instr >> 28) & 0xf); 59509 unsigned rd = (instr >> 12) & 0xf; 59510 unsigned rm = instr & 0xf; 59511 unsigned rs = (instr >> 8) & 0xf; 59512 // LSRS{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; A1 59513 lsrs(condition, 59514 Best, 59515 Register(rd), 59516 Register(rm), 59517 Register(rs)); 59518 if (((instr & 0xfff00f0) != 0x1b00030)) { 59519 UnpredictableA32(instr); 59520 } 59521 return; 59522 } 59523 if (((Uint32((instr >> 5)) & Uint32(0x3)) == Uint32(0x3)) && 59524 ((instr & 0xf0000000) != 0xf0000000)) { 59525 Condition condition((instr >> 28) & 0xf); 59526 unsigned rd = (instr >> 12) & 0xf; 59527 unsigned rm = instr & 0xf; 59528 unsigned rs = (instr >> 8) & 0xf; 59529 // RORS{<c>}{<q>} {<Rd>}, <Rm>, <Rs> ; A1 59530 rors(condition, 59531 Best, 59532 Register(rd), 59533 Register(rm), 59534 Register(rs)); 59535 if (((instr & 0xfff00f0) != 0x1b00070)) { 59536 UnpredictableA32(instr); 59537 } 59538 return; 59539 } 59540 Condition condition((instr >> 28) & 0xf); 59541 unsigned rd = (instr >> 12) & 0xf; 59542 unsigned rm = instr & 0xf; 59543 Shift shift((instr >> 5) & 0x3); 59544 unsigned rs = (instr >> 8) & 0xf; 59545 // MOVS{<c>}{<q>} <Rd>, <Rm>, <shift> <Rs> ; A1 59546 movs(condition, 59547 Best, 59548 Register(rd), 59549 Operand(Register(rm), shift.GetType(), Register(rs))); 59550 if (((instr & 0xfff0090) != 0x1b00010)) { 59551 UnpredictableA32(instr); 59552 } 59553 break; 59554 } 59555 } 59556 break; 59557 } 59558 case 0x00000080: { 59559 // 0x00100090 59560 switch (instr & 0x01200060) { 59561 case 0x00000000: { 59562 // 0x00100090 59563 switch (instr & 0x00800000) { 59564 case 0x00000000: { 59565 // 0x00100090 59566 if (((instr & 0xf0000000) == 0xf0000000)) { 59567 UnallocatedA32(instr); 59568 return; 59569 } 59570 Condition condition((instr >> 28) & 0xf); 59571 unsigned rd = (instr >> 16) & 0xf; 59572 unsigned rn = instr & 0xf; 59573 unsigned rm = (instr >> 8) & 0xf; 59574 // MULS{<c>}{<q>} <Rd>, <Rn>, {<Rm>} ; A1 59575 muls(condition, 59576 Register(rd), 59577 Register(rn), 59578 Register(rm)); 59579 if (((instr & 0xff0f0f0) != 0x100090)) { 59580 UnpredictableA32(instr); 59581 } 59582 break; 59583 } 59584 case 0x00800000: { 59585 // 0x00900090 59586 if (((instr & 0xf0000000) == 0xf0000000)) { 59587 UnallocatedA32(instr); 59588 return; 59589 } 59590 Condition condition((instr >> 28) & 0xf); 59591 unsigned rdlo = (instr >> 12) & 0xf; 59592 unsigned rdhi = (instr >> 16) & 0xf; 59593 unsigned rn = instr & 0xf; 59594 unsigned rm = (instr >> 8) & 0xf; 59595 // UMULLS{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1 59596 umulls(condition, 59597 Register(rdlo), 59598 Register(rdhi), 59599 Register(rn), 59600 Register(rm)); 59601 break; 59602 } 59603 } 59604 break; 59605 } 59606 case 0x00000020: { 59607 // 0x001000b0 59608 if (((instr & 0xf0000000) == 0xf0000000)) { 59609 UnallocatedA32(instr); 59610 return; 59611 } 59612 Condition condition((instr >> 28) & 0xf); 59613 unsigned rt = (instr >> 12) & 0xf; 59614 unsigned rn = (instr >> 16) & 0xf; 59615 Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus); 59616 unsigned rm = instr & 0xf; 59617 // LDRH{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<Rm> ; A1 59618 ldrh(condition, 59619 Best, 59620 Register(rt), 59621 MemOperand(Register(rn), 59622 sign, 59623 Register(rm), 59624 PostIndex)); 59625 if (((instr & 0xf700ff0) != 0x1000b0)) { 59626 UnpredictableA32(instr); 59627 } 59628 break; 59629 } 59630 case 0x00000040: { 59631 // 0x001000d0 59632 if (((instr & 0xf0000000) == 0xf0000000)) { 59633 UnallocatedA32(instr); 59634 return; 59635 } 59636 Condition condition((instr >> 28) & 0xf); 59637 unsigned rt = (instr >> 12) & 0xf; 59638 unsigned rn = (instr >> 16) & 0xf; 59639 Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus); 59640 unsigned rm = instr & 0xf; 59641 // LDRSB{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<Rm> ; A1 59642 ldrsb(condition, 59643 Best, 59644 Register(rt), 59645 MemOperand(Register(rn), 59646 sign, 59647 Register(rm), 59648 PostIndex)); 59649 if (((instr & 0xf700ff0) != 0x1000d0)) { 59650 UnpredictableA32(instr); 59651 } 59652 break; 59653 } 59654 case 0x00000060: { 59655 // 0x001000f0 59656 if (((instr & 0xf0000000) == 0xf0000000)) { 59657 UnallocatedA32(instr); 59658 return; 59659 } 59660 Condition condition((instr >> 28) & 0xf); 59661 unsigned rt = (instr >> 12) & 0xf; 59662 unsigned rn = (instr >> 16) & 0xf; 59663 Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus); 59664 unsigned rm = instr & 0xf; 59665 // LDRSH{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<Rm> ; A1 59666 ldrsh(condition, 59667 Best, 59668 Register(rt), 59669 MemOperand(Register(rn), 59670 sign, 59671 Register(rm), 59672 PostIndex)); 59673 if (((instr & 0xf700ff0) != 0x1000f0)) { 59674 UnpredictableA32(instr); 59675 } 59676 break; 59677 } 59678 case 0x00200000: { 59679 // 0x00300090 59680 switch (instr & 0x00800000) { 59681 case 0x00000000: { 59682 // 0x00300090 59683 if (((instr & 0xf0000000) == 0xf0000000)) { 59684 UnallocatedA32(instr); 59685 return; 59686 } 59687 Condition condition((instr >> 28) & 0xf); 59688 unsigned rd = (instr >> 16) & 0xf; 59689 unsigned rn = instr & 0xf; 59690 unsigned rm = (instr >> 8) & 0xf; 59691 unsigned ra = (instr >> 12) & 0xf; 59692 // MLAS{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1 59693 mlas(condition, 59694 Register(rd), 59695 Register(rn), 59696 Register(rm), 59697 Register(ra)); 59698 break; 59699 } 59700 case 0x00800000: { 59701 // 0x00b00090 59702 if (((instr & 0xf0000000) == 0xf0000000)) { 59703 UnallocatedA32(instr); 59704 return; 59705 } 59706 Condition condition((instr >> 28) & 0xf); 59707 unsigned rdlo = (instr >> 12) & 0xf; 59708 unsigned rdhi = (instr >> 16) & 0xf; 59709 unsigned rn = instr & 0xf; 59710 unsigned rm = (instr >> 8) & 0xf; 59711 // UMLALS{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1 59712 umlals(condition, 59713 Register(rdlo), 59714 Register(rdhi), 59715 Register(rn), 59716 Register(rm)); 59717 break; 59718 } 59719 } 59720 break; 59721 } 59722 case 0x00200020: { 59723 // 0x003000b0 59724 if (((instr & 0xf0000000) == 0xf0000000)) { 59725 UnallocatedA32(instr); 59726 return; 59727 } 59728 UnimplementedA32("LDRHT", instr); 59729 break; 59730 } 59731 case 0x00200040: { 59732 // 0x003000d0 59733 if (((instr & 0xf0000000) == 0xf0000000)) { 59734 UnallocatedA32(instr); 59735 return; 59736 } 59737 UnimplementedA32("LDRSBT", instr); 59738 break; 59739 } 59740 case 0x00200060: { 59741 // 0x003000f0 59742 if (((instr & 0xf0000000) == 0xf0000000)) { 59743 UnallocatedA32(instr); 59744 return; 59745 } 59746 UnimplementedA32("LDRSHT", instr); 59747 break; 59748 } 59749 case 0x01000000: { 59750 // 0x01100090 59751 switch (instr & 0x00800300) { 59752 case 0x00800000: { 59753 // 0x01900090 59754 if (((instr & 0xf0000000) == 0xf0000000)) { 59755 UnallocatedA32(instr); 59756 return; 59757 } 59758 Condition condition((instr >> 28) & 0xf); 59759 unsigned rt = (instr >> 12) & 0xf; 59760 unsigned rn = (instr >> 16) & 0xf; 59761 // LDA{<c>}{<q>} <Rt>, [<Rn>] ; A1 59762 lda(condition, 59763 Register(rt), 59764 MemOperand(Register(rn), Offset)); 59765 if (((instr & 0xff00fff) != 0x1900c9f)) { 59766 UnpredictableA32(instr); 59767 } 59768 break; 59769 } 59770 case 0x00800200: { 59771 // 0x01900290 59772 if (((instr & 0xf0000000) == 0xf0000000)) { 59773 UnallocatedA32(instr); 59774 return; 59775 } 59776 Condition condition((instr >> 28) & 0xf); 59777 unsigned rt = (instr >> 12) & 0xf; 59778 unsigned rn = (instr >> 16) & 0xf; 59779 // LDAEX{<c>}{<q>} <Rt>, [<Rn>] ; A1 59780 ldaex(condition, 59781 Register(rt), 59782 MemOperand(Register(rn), Offset)); 59783 if (((instr & 0xff00fff) != 0x1900e9f)) { 59784 UnpredictableA32(instr); 59785 } 59786 break; 59787 } 59788 case 0x00800300: { 59789 // 0x01900390 59790 if (((instr & 0xf0000000) == 0xf0000000)) { 59791 UnallocatedA32(instr); 59792 return; 59793 } 59794 Condition condition((instr >> 28) & 0xf); 59795 unsigned rt = (instr >> 12) & 0xf; 59796 unsigned rn = (instr >> 16) & 0xf; 59797 // LDREX{<c>}{<q>} <Rt>, [<Rn>{, #<imm_1>}] ; A1 59798 ldrex(condition, 59799 Register(rt), 59800 MemOperand(Register(rn), plus, 0, Offset)); 59801 if (((instr & 0xff00fff) != 0x1900f9f)) { 59802 UnpredictableA32(instr); 59803 } 59804 break; 59805 } 59806 default: 59807 UnallocatedA32(instr); 59808 break; 59809 } 59810 break; 59811 } 59812 case 0x01000020: { 59813 // 0x011000b0 59814 if (((instr & 0xf0000000) == 0xf0000000)) { 59815 UnallocatedA32(instr); 59816 return; 59817 } 59818 Condition condition((instr >> 28) & 0xf); 59819 unsigned rt = (instr >> 12) & 0xf; 59820 unsigned rn = (instr >> 16) & 0xf; 59821 Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus); 59822 unsigned rm = instr & 0xf; 59823 AddrMode addrmode = Offset; 59824 // LDRH{<c>}{<q>} <Rt>, [<Rn>, #{+/-}<Rm>] ; A1 59825 ldrh(condition, 59826 Best, 59827 Register(rt), 59828 MemOperand(Register(rn), 59829 sign, 59830 Register(rm), 59831 addrmode)); 59832 if (((instr & 0xf700ff0) != 0x11000b0)) { 59833 UnpredictableA32(instr); 59834 } 59835 break; 59836 } 59837 case 0x01000040: { 59838 // 0x011000d0 59839 if (((instr & 0xf0000000) == 0xf0000000)) { 59840 UnallocatedA32(instr); 59841 return; 59842 } 59843 Condition condition((instr >> 28) & 0xf); 59844 unsigned rt = (instr >> 12) & 0xf; 59845 unsigned rn = (instr >> 16) & 0xf; 59846 Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus); 59847 unsigned rm = instr & 0xf; 59848 AddrMode addrmode = Offset; 59849 // LDRSB{<c>}{<q>} <Rt>, [<Rn>, #{+/-}<Rm>] ; A1 59850 ldrsb(condition, 59851 Best, 59852 Register(rt), 59853 MemOperand(Register(rn), 59854 sign, 59855 Register(rm), 59856 addrmode)); 59857 if (((instr & 0xf700ff0) != 0x11000d0)) { 59858 UnpredictableA32(instr); 59859 } 59860 break; 59861 } 59862 case 0x01000060: { 59863 // 0x011000f0 59864 if (((instr & 0xf0000000) == 0xf0000000)) { 59865 UnallocatedA32(instr); 59866 return; 59867 } 59868 Condition condition((instr >> 28) & 0xf); 59869 unsigned rt = (instr >> 12) & 0xf; 59870 unsigned rn = (instr >> 16) & 0xf; 59871 Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus); 59872 unsigned rm = instr & 0xf; 59873 AddrMode addrmode = Offset; 59874 // LDRSH{<c>}{<q>} <Rt>, [<Rn>, #{+/-}<Rm>] ; A1 59875 ldrsh(condition, 59876 Best, 59877 Register(rt), 59878 MemOperand(Register(rn), 59879 sign, 59880 Register(rm), 59881 addrmode)); 59882 if (((instr & 0xf700ff0) != 0x11000f0)) { 59883 UnpredictableA32(instr); 59884 } 59885 break; 59886 } 59887 case 0x01200000: { 59888 // 0x01300090 59889 switch (instr & 0x00800300) { 59890 case 0x00800200: { 59891 // 0x01b00290 59892 if (((instr & 0xf0000000) == 0xf0000000)) { 59893 UnallocatedA32(instr); 59894 return; 59895 } 59896 Condition condition((instr >> 28) & 0xf); 59897 unsigned rt = (instr >> 12) & 0xf; 59898 unsigned rn = (instr >> 16) & 0xf; 59899 // LDAEXD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>] ; A1 59900 ldaexd(condition, 59901 Register(rt), 59902 Register(rt + 1), 59903 MemOperand(Register(rn), Offset)); 59904 if (((instr & 0xff00fff) != 0x1b00e9f)) { 59905 UnpredictableA32(instr); 59906 } 59907 break; 59908 } 59909 case 0x00800300: { 59910 // 0x01b00390 59911 if (((instr & 0xf0000000) == 0xf0000000)) { 59912 UnallocatedA32(instr); 59913 return; 59914 } 59915 Condition condition((instr >> 28) & 0xf); 59916 unsigned rt = (instr >> 12) & 0xf; 59917 unsigned rn = (instr >> 16) & 0xf; 59918 // LDREXD{<c>}{<q>} <Rt>, <Rt2>, [<Rn>] ; A1 59919 ldrexd(condition, 59920 Register(rt), 59921 Register(rt + 1), 59922 MemOperand(Register(rn), Offset)); 59923 if (((instr & 0xff00fff) != 0x1b00f9f)) { 59924 UnpredictableA32(instr); 59925 } 59926 break; 59927 } 59928 default: 59929 UnallocatedA32(instr); 59930 break; 59931 } 59932 break; 59933 } 59934 case 0x01200020: { 59935 // 0x013000b0 59936 if (((instr & 0xf0000000) == 0xf0000000)) { 59937 UnallocatedA32(instr); 59938 return; 59939 } 59940 Condition condition((instr >> 28) & 0xf); 59941 unsigned rt = (instr >> 12) & 0xf; 59942 unsigned rn = (instr >> 16) & 0xf; 59943 Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus); 59944 unsigned rm = instr & 0xf; 59945 AddrMode addrmode = PreIndex; 59946 // LDRH{<c>}{<q>} <Rt>, [<Rn>, #{+/-}<Rm>]! ; A1 59947 ldrh(condition, 59948 Best, 59949 Register(rt), 59950 MemOperand(Register(rn), 59951 sign, 59952 Register(rm), 59953 addrmode)); 59954 if (((instr & 0xf700ff0) != 0x13000b0)) { 59955 UnpredictableA32(instr); 59956 } 59957 break; 59958 } 59959 case 0x01200040: { 59960 // 0x013000d0 59961 if (((instr & 0xf0000000) == 0xf0000000)) { 59962 UnallocatedA32(instr); 59963 return; 59964 } 59965 Condition condition((instr >> 28) & 0xf); 59966 unsigned rt = (instr >> 12) & 0xf; 59967 unsigned rn = (instr >> 16) & 0xf; 59968 Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus); 59969 unsigned rm = instr & 0xf; 59970 AddrMode addrmode = PreIndex; 59971 // LDRSB{<c>}{<q>} <Rt>, [<Rn>, #{+/-}<Rm>]! ; A1 59972 ldrsb(condition, 59973 Best, 59974 Register(rt), 59975 MemOperand(Register(rn), 59976 sign, 59977 Register(rm), 59978 addrmode)); 59979 if (((instr & 0xf700ff0) != 0x13000d0)) { 59980 UnpredictableA32(instr); 59981 } 59982 break; 59983 } 59984 case 0x01200060: { 59985 // 0x013000f0 59986 if (((instr & 0xf0000000) == 0xf0000000)) { 59987 UnallocatedA32(instr); 59988 return; 59989 } 59990 Condition condition((instr >> 28) & 0xf); 59991 unsigned rt = (instr >> 12) & 0xf; 59992 unsigned rn = (instr >> 16) & 0xf; 59993 Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus); 59994 unsigned rm = instr & 0xf; 59995 AddrMode addrmode = PreIndex; 59996 // LDRSH{<c>}{<q>} <Rt>, [<Rn>, #{+/-}<Rm>]! ; A1 59997 ldrsh(condition, 59998 Best, 59999 Register(rt), 60000 MemOperand(Register(rn), 60001 sign, 60002 Register(rm), 60003 addrmode)); 60004 if (((instr & 0xf700ff0) != 0x13000f0)) { 60005 UnpredictableA32(instr); 60006 } 60007 break; 60008 } 60009 } 60010 break; 60011 } 60012 case 0x00400000: { 60013 // 0x00500010 60014 switch (instr & 0x01a00000) { 60015 case 0x00000000: { 60016 // 0x00500010 60017 if (((instr & 0xf0000000) == 0xf0000000)) { 60018 UnallocatedA32(instr); 60019 return; 60020 } 60021 Condition condition((instr >> 28) & 0xf); 60022 unsigned rd = (instr >> 12) & 0xf; 60023 unsigned rn = (instr >> 16) & 0xf; 60024 unsigned rm = instr & 0xf; 60025 Shift shift((instr >> 5) & 0x3); 60026 unsigned rs = (instr >> 8) & 0xf; 60027 // SUBS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1 60028 subs(condition, 60029 Best, 60030 Register(rd), 60031 Register(rn), 60032 Operand(Register(rm), shift.GetType(), Register(rs))); 60033 break; 60034 } 60035 case 0x00200000: { 60036 // 0x00700010 60037 if (((instr & 0xf0000000) == 0xf0000000)) { 60038 UnallocatedA32(instr); 60039 return; 60040 } 60041 Condition condition((instr >> 28) & 0xf); 60042 unsigned rd = (instr >> 12) & 0xf; 60043 unsigned rn = (instr >> 16) & 0xf; 60044 unsigned rm = instr & 0xf; 60045 Shift shift((instr >> 5) & 0x3); 60046 unsigned rs = (instr >> 8) & 0xf; 60047 // RSBS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1 60048 rsbs(condition, 60049 Best, 60050 Register(rd), 60051 Register(rn), 60052 Operand(Register(rm), shift.GetType(), Register(rs))); 60053 break; 60054 } 60055 case 0x00800000: { 60056 // 0x00d00010 60057 if (((instr & 0xf0000000) == 0xf0000000)) { 60058 UnallocatedA32(instr); 60059 return; 60060 } 60061 Condition condition((instr >> 28) & 0xf); 60062 unsigned rd = (instr >> 12) & 0xf; 60063 unsigned rn = (instr >> 16) & 0xf; 60064 unsigned rm = instr & 0xf; 60065 Shift shift((instr >> 5) & 0x3); 60066 unsigned rs = (instr >> 8) & 0xf; 60067 // SBCS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1 60068 sbcs(condition, 60069 Best, 60070 Register(rd), 60071 Register(rn), 60072 Operand(Register(rm), shift.GetType(), Register(rs))); 60073 break; 60074 } 60075 case 0x00a00000: { 60076 // 0x00f00010 60077 if (((instr & 0xf0000000) == 0xf0000000)) { 60078 UnallocatedA32(instr); 60079 return; 60080 } 60081 Condition condition((instr >> 28) & 0xf); 60082 unsigned rd = (instr >> 12) & 0xf; 60083 unsigned rn = (instr >> 16) & 0xf; 60084 unsigned rm = instr & 0xf; 60085 Shift shift((instr >> 5) & 0x3); 60086 unsigned rs = (instr >> 8) & 0xf; 60087 // RSCS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1 60088 rscs(condition, 60089 Register(rd), 60090 Register(rn), 60091 Operand(Register(rm), shift.GetType(), Register(rs))); 60092 break; 60093 } 60094 case 0x01000000: { 60095 // 0x01500010 60096 if (((instr & 0xf0000000) == 0xf0000000)) { 60097 UnallocatedA32(instr); 60098 return; 60099 } 60100 Condition condition((instr >> 28) & 0xf); 60101 unsigned rn = (instr >> 16) & 0xf; 60102 unsigned rm = instr & 0xf; 60103 Shift shift((instr >> 5) & 0x3); 60104 unsigned rs = (instr >> 8) & 0xf; 60105 // CMP{<c>}{<q>} <Rn>, <Rm>, <shift> <Rs> ; A1 60106 cmp(condition, 60107 Best, 60108 Register(rn), 60109 Operand(Register(rm), shift.GetType(), Register(rs))); 60110 if (((instr & 0xff0f090) != 0x1500010)) { 60111 UnpredictableA32(instr); 60112 } 60113 break; 60114 } 60115 case 0x01200000: { 60116 // 0x01700010 60117 if (((instr & 0xf0000000) == 0xf0000000)) { 60118 UnallocatedA32(instr); 60119 return; 60120 } 60121 Condition condition((instr >> 28) & 0xf); 60122 unsigned rn = (instr >> 16) & 0xf; 60123 unsigned rm = instr & 0xf; 60124 Shift shift((instr >> 5) & 0x3); 60125 unsigned rs = (instr >> 8) & 0xf; 60126 // CMN{<c>}{<q>} <Rn>, <Rm>, <shift> <Rs> ; A1 60127 cmn(condition, 60128 Best, 60129 Register(rn), 60130 Operand(Register(rm), shift.GetType(), Register(rs))); 60131 if (((instr & 0xff0f090) != 0x1700010)) { 60132 UnpredictableA32(instr); 60133 } 60134 break; 60135 } 60136 case 0x01800000: { 60137 // 0x01d00010 60138 if (((instr & 0xf0000000) == 0xf0000000)) { 60139 UnallocatedA32(instr); 60140 return; 60141 } 60142 Condition condition((instr >> 28) & 0xf); 60143 unsigned rd = (instr >> 12) & 0xf; 60144 unsigned rn = (instr >> 16) & 0xf; 60145 unsigned rm = instr & 0xf; 60146 Shift shift((instr >> 5) & 0x3); 60147 unsigned rs = (instr >> 8) & 0xf; 60148 // BICS{<c>}{<q>} {<Rd>}, <Rn>, <Rm>, <shift> <Rs> ; A1 60149 bics(condition, 60150 Best, 60151 Register(rd), 60152 Register(rn), 60153 Operand(Register(rm), shift.GetType(), Register(rs))); 60154 break; 60155 } 60156 case 0x01a00000: { 60157 // 0x01f00010 60158 if (((instr & 0xf0000000) == 0xf0000000)) { 60159 UnallocatedA32(instr); 60160 return; 60161 } 60162 Condition condition((instr >> 28) & 0xf); 60163 unsigned rd = (instr >> 12) & 0xf; 60164 unsigned rm = instr & 0xf; 60165 Shift shift((instr >> 5) & 0x3); 60166 unsigned rs = (instr >> 8) & 0xf; 60167 // MVNS{<c>}{<q>} <Rd>, <Rm>, <shift> <Rs> ; A1 60168 mvns(condition, 60169 Best, 60170 Register(rd), 60171 Operand(Register(rm), shift.GetType(), Register(rs))); 60172 if (((instr & 0xfff0090) != 0x1f00010)) { 60173 UnpredictableA32(instr); 60174 } 60175 break; 60176 } 60177 } 60178 break; 60179 } 60180 case 0x00400080: { 60181 // 0x00500090 60182 switch (instr & 0x00000060) { 60183 case 0x00000000: { 60184 // 0x00500090 60185 switch (instr & 0x01a00000) { 60186 case 0x00800000: { 60187 // 0x00d00090 60188 if (((instr & 0xf0000000) == 0xf0000000)) { 60189 UnallocatedA32(instr); 60190 return; 60191 } 60192 Condition condition((instr >> 28) & 0xf); 60193 unsigned rdlo = (instr >> 12) & 0xf; 60194 unsigned rdhi = (instr >> 16) & 0xf; 60195 unsigned rn = instr & 0xf; 60196 unsigned rm = (instr >> 8) & 0xf; 60197 // SMULLS{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1 60198 smulls(condition, 60199 Register(rdlo), 60200 Register(rdhi), 60201 Register(rn), 60202 Register(rm)); 60203 break; 60204 } 60205 case 0x00a00000: { 60206 // 0x00f00090 60207 if (((instr & 0xf0000000) == 0xf0000000)) { 60208 UnallocatedA32(instr); 60209 return; 60210 } 60211 Condition condition((instr >> 28) & 0xf); 60212 unsigned rdlo = (instr >> 12) & 0xf; 60213 unsigned rdhi = (instr >> 16) & 0xf; 60214 unsigned rn = instr & 0xf; 60215 unsigned rm = (instr >> 8) & 0xf; 60216 // SMLALS{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1 60217 smlals(condition, 60218 Register(rdlo), 60219 Register(rdhi), 60220 Register(rn), 60221 Register(rm)); 60222 break; 60223 } 60224 case 0x01800000: { 60225 // 0x01d00090 60226 switch (instr & 0x00000300) { 60227 case 0x00000000: { 60228 // 0x01d00090 60229 if (((instr & 0xf0000000) == 0xf0000000)) { 60230 UnallocatedA32(instr); 60231 return; 60232 } 60233 Condition condition((instr >> 28) & 0xf); 60234 unsigned rt = (instr >> 12) & 0xf; 60235 unsigned rn = (instr >> 16) & 0xf; 60236 // LDAB{<c>}{<q>} <Rt>, [<Rn>] ; A1 60237 ldab(condition, 60238 Register(rt), 60239 MemOperand(Register(rn), Offset)); 60240 if (((instr & 0xff00fff) != 0x1d00c9f)) { 60241 UnpredictableA32(instr); 60242 } 60243 break; 60244 } 60245 case 0x00000200: { 60246 // 0x01d00290 60247 if (((instr & 0xf0000000) == 0xf0000000)) { 60248 UnallocatedA32(instr); 60249 return; 60250 } 60251 Condition condition((instr >> 28) & 0xf); 60252 unsigned rt = (instr >> 12) & 0xf; 60253 unsigned rn = (instr >> 16) & 0xf; 60254 // LDAEXB{<c>}{<q>} <Rt>, [<Rn>] ; A1 60255 ldaexb(condition, 60256 Register(rt), 60257 MemOperand(Register(rn), Offset)); 60258 if (((instr & 0xff00fff) != 0x1d00e9f)) { 60259 UnpredictableA32(instr); 60260 } 60261 break; 60262 } 60263 case 0x00000300: { 60264 // 0x01d00390 60265 if (((instr & 0xf0000000) == 0xf0000000)) { 60266 UnallocatedA32(instr); 60267 return; 60268 } 60269 Condition condition((instr >> 28) & 0xf); 60270 unsigned rt = (instr >> 12) & 0xf; 60271 unsigned rn = (instr >> 16) & 0xf; 60272 // LDREXB{<c>}{<q>} <Rt>, [<Rn>] ; A1 60273 ldrexb(condition, 60274 Register(rt), 60275 MemOperand(Register(rn), Offset)); 60276 if (((instr & 0xff00fff) != 0x1d00f9f)) { 60277 UnpredictableA32(instr); 60278 } 60279 break; 60280 } 60281 default: 60282 UnallocatedA32(instr); 60283 break; 60284 } 60285 break; 60286 } 60287 case 0x01a00000: { 60288 // 0x01f00090 60289 switch (instr & 0x00000300) { 60290 case 0x00000000: { 60291 // 0x01f00090 60292 if (((instr & 0xf0000000) == 0xf0000000)) { 60293 UnallocatedA32(instr); 60294 return; 60295 } 60296 Condition condition((instr >> 28) & 0xf); 60297 unsigned rt = (instr >> 12) & 0xf; 60298 unsigned rn = (instr >> 16) & 0xf; 60299 // LDAH{<c>}{<q>} <Rt>, [<Rn>] ; A1 60300 ldah(condition, 60301 Register(rt), 60302 MemOperand(Register(rn), Offset)); 60303 if (((instr & 0xff00fff) != 0x1f00c9f)) { 60304 UnpredictableA32(instr); 60305 } 60306 break; 60307 } 60308 case 0x00000200: { 60309 // 0x01f00290 60310 if (((instr & 0xf0000000) == 0xf0000000)) { 60311 UnallocatedA32(instr); 60312 return; 60313 } 60314 Condition condition((instr >> 28) & 0xf); 60315 unsigned rt = (instr >> 12) & 0xf; 60316 unsigned rn = (instr >> 16) & 0xf; 60317 // LDAEXH{<c>}{<q>} <Rt>, [<Rn>] ; A1 60318 ldaexh(condition, 60319 Register(rt), 60320 MemOperand(Register(rn), Offset)); 60321 if (((instr & 0xff00fff) != 0x1f00e9f)) { 60322 UnpredictableA32(instr); 60323 } 60324 break; 60325 } 60326 case 0x00000300: { 60327 // 0x01f00390 60328 if (((instr & 0xf0000000) == 0xf0000000)) { 60329 UnallocatedA32(instr); 60330 return; 60331 } 60332 Condition condition((instr >> 28) & 0xf); 60333 unsigned rt = (instr >> 12) & 0xf; 60334 unsigned rn = (instr >> 16) & 0xf; 60335 // LDREXH{<c>}{<q>} <Rt>, [<Rn>] ; A1 60336 ldrexh(condition, 60337 Register(rt), 60338 MemOperand(Register(rn), Offset)); 60339 if (((instr & 0xff00fff) != 0x1f00f9f)) { 60340 UnpredictableA32(instr); 60341 } 60342 break; 60343 } 60344 default: 60345 UnallocatedA32(instr); 60346 break; 60347 } 60348 break; 60349 } 60350 default: 60351 UnallocatedA32(instr); 60352 break; 60353 } 60354 break; 60355 } 60356 case 0x00000020: { 60357 // 0x005000b0 60358 switch (instr & 0x01200000) { 60359 case 0x00000000: { 60360 // 0x005000b0 60361 switch (instr & 0x000f0000) { 60362 case 0x000f0000: { 60363 // 0x005f00b0 60364 if (((instr & 0xf0000000) == 0xf0000000) || 60365 ((instr & 0x1200000) == 0x200000)) { 60366 UnallocatedA32(instr); 60367 return; 60368 } 60369 Condition condition((instr >> 28) & 0xf); 60370 unsigned rt = (instr >> 12) & 0xf; 60371 uint32_t U = (instr >> 23) & 0x1; 60372 int32_t imm = (instr & 0xf) | ((instr >> 4) & 0xf0); 60373 if (U == 0) imm = -imm; 60374 bool minus_zero = (imm == 0) && (U == 0); 60375 Location location(imm, kA32PcDelta); 60376 // LDRH{<c>}{<q>} <Rt>, <label> ; A1 60377 if (minus_zero) { 60378 ldrh(condition, 60379 Best, 60380 Register(rt), 60381 MemOperand(pc, minus, 0)); 60382 } else { 60383 ldrh(condition, Register(rt), &location); 60384 } 60385 if (((instr & 0xf7f00f0) != 0x15f00b0)) { 60386 UnpredictableA32(instr); 60387 } 60388 break; 60389 } 60390 default: { 60391 if (((instr & 0xf0000000) == 0xf0000000) || 60392 ((instr & 0xf0000) == 0xf0000)) { 60393 UnallocatedA32(instr); 60394 return; 60395 } 60396 Condition condition((instr >> 28) & 0xf); 60397 unsigned rt = (instr >> 12) & 0xf; 60398 unsigned rn = (instr >> 16) & 0xf; 60399 Sign sign((((instr >> 23) & 0x1) == 0) ? minus 60400 : plus); 60401 int32_t offset = 60402 (instr & 0xf) | ((instr >> 4) & 0xf0); 60403 // LDRH{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_3> ; A1 60404 ldrh(condition, 60405 Best, 60406 Register(rt), 60407 MemOperand(Register(rn), 60408 sign, 60409 offset, 60410 PostIndex)); 60411 break; 60412 } 60413 } 60414 break; 60415 } 60416 case 0x00200000: { 60417 // 0x007000b0 60418 if (((instr & 0xf0000000) == 0xf0000000)) { 60419 UnallocatedA32(instr); 60420 return; 60421 } 60422 UnimplementedA32("LDRHT", instr); 60423 break; 60424 } 60425 case 0x01000000: { 60426 // 0x015000b0 60427 switch (instr & 0x000f0000) { 60428 case 0x000f0000: { 60429 // 0x015f00b0 60430 if (((instr & 0xf0000000) == 0xf0000000) || 60431 ((instr & 0x1200000) == 0x200000)) { 60432 UnallocatedA32(instr); 60433 return; 60434 } 60435 Condition condition((instr >> 28) & 0xf); 60436 unsigned rt = (instr >> 12) & 0xf; 60437 uint32_t U = (instr >> 23) & 0x1; 60438 int32_t imm = (instr & 0xf) | ((instr >> 4) & 0xf0); 60439 if (U == 0) imm = -imm; 60440 bool minus_zero = (imm == 0) && (U == 0); 60441 Location location(imm, kA32PcDelta); 60442 // LDRH{<c>}{<q>} <Rt>, <label> ; A1 60443 if (minus_zero) { 60444 ldrh(condition, 60445 Best, 60446 Register(rt), 60447 MemOperand(pc, minus, 0)); 60448 } else { 60449 ldrh(condition, Register(rt), &location); 60450 } 60451 if (((instr & 0xf7f00f0) != 0x15f00b0)) { 60452 UnpredictableA32(instr); 60453 } 60454 break; 60455 } 60456 default: { 60457 if (((instr & 0xf0000000) == 0xf0000000) || 60458 ((instr & 0xf0000) == 0xf0000)) { 60459 UnallocatedA32(instr); 60460 return; 60461 } 60462 Condition condition((instr >> 28) & 0xf); 60463 unsigned rt = (instr >> 12) & 0xf; 60464 unsigned rn = (instr >> 16) & 0xf; 60465 Sign sign((((instr >> 23) & 0x1) == 0) ? minus 60466 : plus); 60467 int32_t offset = 60468 (instr & 0xf) | ((instr >> 4) & 0xf0); 60469 // LDRH{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_3>}] ; A1 60470 ldrh(condition, 60471 Best, 60472 Register(rt), 60473 MemOperand(Register(rn), 60474 sign, 60475 offset, 60476 Offset)); 60477 break; 60478 } 60479 } 60480 break; 60481 } 60482 case 0x01200000: { 60483 // 0x017000b0 60484 switch (instr & 0x000f0000) { 60485 case 0x000f0000: { 60486 // 0x017f00b0 60487 if (((instr & 0xf0000000) == 0xf0000000) || 60488 ((instr & 0x1200000) == 0x200000)) { 60489 UnallocatedA32(instr); 60490 return; 60491 } 60492 Condition condition((instr >> 28) & 0xf); 60493 unsigned rt = (instr >> 12) & 0xf; 60494 uint32_t U = (instr >> 23) & 0x1; 60495 int32_t imm = (instr & 0xf) | ((instr >> 4) & 0xf0); 60496 if (U == 0) imm = -imm; 60497 bool minus_zero = (imm == 0) && (U == 0); 60498 Location location(imm, kA32PcDelta); 60499 // LDRH{<c>}{<q>} <Rt>, <label> ; A1 60500 if (minus_zero) { 60501 ldrh(condition, 60502 Best, 60503 Register(rt), 60504 MemOperand(pc, minus, 0)); 60505 } else { 60506 ldrh(condition, Register(rt), &location); 60507 } 60508 if (((instr & 0xf7f00f0) != 0x15f00b0)) { 60509 UnpredictableA32(instr); 60510 } 60511 break; 60512 } 60513 default: { 60514 if (((instr & 0xf0000000) == 0xf0000000) || 60515 ((instr & 0xf0000) == 0xf0000)) { 60516 UnallocatedA32(instr); 60517 return; 60518 } 60519 Condition condition((instr >> 28) & 0xf); 60520 unsigned rt = (instr >> 12) & 0xf; 60521 unsigned rn = (instr >> 16) & 0xf; 60522 Sign sign((((instr >> 23) & 0x1) == 0) ? minus 60523 : plus); 60524 int32_t offset = 60525 (instr & 0xf) | ((instr >> 4) & 0xf0); 60526 // LDRH{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_3>}]! ; A1 NOLINT(whitespace/line_length) 60527 ldrh(condition, 60528 Best, 60529 Register(rt), 60530 MemOperand(Register(rn), 60531 sign, 60532 offset, 60533 PreIndex)); 60534 break; 60535 } 60536 } 60537 break; 60538 } 60539 } 60540 break; 60541 } 60542 case 0x00000040: { 60543 // 0x005000d0 60544 switch (instr & 0x01200000) { 60545 case 0x00000000: { 60546 // 0x005000d0 60547 switch (instr & 0x000f0000) { 60548 case 0x000f0000: { 60549 // 0x005f00d0 60550 if (((instr & 0xf0000000) == 0xf0000000) || 60551 ((instr & 0x1200000) == 0x200000)) { 60552 UnallocatedA32(instr); 60553 return; 60554 } 60555 Condition condition((instr >> 28) & 0xf); 60556 unsigned rt = (instr >> 12) & 0xf; 60557 uint32_t U = (instr >> 23) & 0x1; 60558 int32_t imm = (instr & 0xf) | ((instr >> 4) & 0xf0); 60559 if (U == 0) imm = -imm; 60560 bool minus_zero = (imm == 0) && (U == 0); 60561 Location location(imm, kA32PcDelta); 60562 // LDRSB{<c>}{<q>} <Rt>, <label> ; A1 60563 if (minus_zero) { 60564 ldrsb(condition, 60565 Best, 60566 Register(rt), 60567 MemOperand(pc, minus, 0)); 60568 } else { 60569 ldrsb(condition, Register(rt), &location); 60570 } 60571 if (((instr & 0xf7f00f0) != 0x15f00d0)) { 60572 UnpredictableA32(instr); 60573 } 60574 break; 60575 } 60576 default: { 60577 if (((instr & 0xf0000000) == 0xf0000000) || 60578 ((instr & 0xf0000) == 0xf0000)) { 60579 UnallocatedA32(instr); 60580 return; 60581 } 60582 Condition condition((instr >> 28) & 0xf); 60583 unsigned rt = (instr >> 12) & 0xf; 60584 unsigned rn = (instr >> 16) & 0xf; 60585 Sign sign((((instr >> 23) & 0x1) == 0) ? minus 60586 : plus); 60587 int32_t offset = 60588 (instr & 0xf) | ((instr >> 4) & 0xf0); 60589 // LDRSB{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_2> ; A1 60590 ldrsb(condition, 60591 Best, 60592 Register(rt), 60593 MemOperand(Register(rn), 60594 sign, 60595 offset, 60596 PostIndex)); 60597 break; 60598 } 60599 } 60600 break; 60601 } 60602 case 0x00200000: { 60603 // 0x007000d0 60604 if (((instr & 0xf0000000) == 0xf0000000)) { 60605 UnallocatedA32(instr); 60606 return; 60607 } 60608 UnimplementedA32("LDRSBT", instr); 60609 break; 60610 } 60611 case 0x01000000: { 60612 // 0x015000d0 60613 switch (instr & 0x000f0000) { 60614 case 0x000f0000: { 60615 // 0x015f00d0 60616 if (((instr & 0xf0000000) == 0xf0000000) || 60617 ((instr & 0x1200000) == 0x200000)) { 60618 UnallocatedA32(instr); 60619 return; 60620 } 60621 Condition condition((instr >> 28) & 0xf); 60622 unsigned rt = (instr >> 12) & 0xf; 60623 uint32_t U = (instr >> 23) & 0x1; 60624 int32_t imm = (instr & 0xf) | ((instr >> 4) & 0xf0); 60625 if (U == 0) imm = -imm; 60626 bool minus_zero = (imm == 0) && (U == 0); 60627 Location location(imm, kA32PcDelta); 60628 // LDRSB{<c>}{<q>} <Rt>, <label> ; A1 60629 if (minus_zero) { 60630 ldrsb(condition, 60631 Best, 60632 Register(rt), 60633 MemOperand(pc, minus, 0)); 60634 } else { 60635 ldrsb(condition, Register(rt), &location); 60636 } 60637 if (((instr & 0xf7f00f0) != 0x15f00d0)) { 60638 UnpredictableA32(instr); 60639 } 60640 break; 60641 } 60642 default: { 60643 if (((instr & 0xf0000000) == 0xf0000000) || 60644 ((instr & 0xf0000) == 0xf0000)) { 60645 UnallocatedA32(instr); 60646 return; 60647 } 60648 Condition condition((instr >> 28) & 0xf); 60649 unsigned rt = (instr >> 12) & 0xf; 60650 unsigned rn = (instr >> 16) & 0xf; 60651 Sign sign((((instr >> 23) & 0x1) == 0) ? minus 60652 : plus); 60653 int32_t offset = 60654 (instr & 0xf) | ((instr >> 4) & 0xf0); 60655 // LDRSB{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_2>}] ; A1 NOLINT(whitespace/line_length) 60656 ldrsb(condition, 60657 Best, 60658 Register(rt), 60659 MemOperand(Register(rn), 60660 sign, 60661 offset, 60662 Offset)); 60663 break; 60664 } 60665 } 60666 break; 60667 } 60668 case 0x01200000: { 60669 // 0x017000d0 60670 switch (instr & 0x000f0000) { 60671 case 0x000f0000: { 60672 // 0x017f00d0 60673 if (((instr & 0xf0000000) == 0xf0000000) || 60674 ((instr & 0x1200000) == 0x200000)) { 60675 UnallocatedA32(instr); 60676 return; 60677 } 60678 Condition condition((instr >> 28) & 0xf); 60679 unsigned rt = (instr >> 12) & 0xf; 60680 uint32_t U = (instr >> 23) & 0x1; 60681 int32_t imm = (instr & 0xf) | ((instr >> 4) & 0xf0); 60682 if (U == 0) imm = -imm; 60683 bool minus_zero = (imm == 0) && (U == 0); 60684 Location location(imm, kA32PcDelta); 60685 // LDRSB{<c>}{<q>} <Rt>, <label> ; A1 60686 if (minus_zero) { 60687 ldrsb(condition, 60688 Best, 60689 Register(rt), 60690 MemOperand(pc, minus, 0)); 60691 } else { 60692 ldrsb(condition, Register(rt), &location); 60693 } 60694 if (((instr & 0xf7f00f0) != 0x15f00d0)) { 60695 UnpredictableA32(instr); 60696 } 60697 break; 60698 } 60699 default: { 60700 if (((instr & 0xf0000000) == 0xf0000000) || 60701 ((instr & 0xf0000) == 0xf0000)) { 60702 UnallocatedA32(instr); 60703 return; 60704 } 60705 Condition condition((instr >> 28) & 0xf); 60706 unsigned rt = (instr >> 12) & 0xf; 60707 unsigned rn = (instr >> 16) & 0xf; 60708 Sign sign((((instr >> 23) & 0x1) == 0) ? minus 60709 : plus); 60710 int32_t offset = 60711 (instr & 0xf) | ((instr >> 4) & 0xf0); 60712 // LDRSB{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_2>}]! ; A1 NOLINT(whitespace/line_length) 60713 ldrsb(condition, 60714 Best, 60715 Register(rt), 60716 MemOperand(Register(rn), 60717 sign, 60718 offset, 60719 PreIndex)); 60720 break; 60721 } 60722 } 60723 break; 60724 } 60725 } 60726 break; 60727 } 60728 case 0x00000060: { 60729 // 0x005000f0 60730 switch (instr & 0x01200000) { 60731 case 0x00000000: { 60732 // 0x005000f0 60733 switch (instr & 0x000f0000) { 60734 case 0x000f0000: { 60735 // 0x005f00f0 60736 if (((instr & 0xf0000000) == 0xf0000000) || 60737 ((instr & 0x1200000) == 0x200000)) { 60738 UnallocatedA32(instr); 60739 return; 60740 } 60741 Condition condition((instr >> 28) & 0xf); 60742 unsigned rt = (instr >> 12) & 0xf; 60743 uint32_t U = (instr >> 23) & 0x1; 60744 int32_t imm = (instr & 0xf) | ((instr >> 4) & 0xf0); 60745 if (U == 0) imm = -imm; 60746 bool minus_zero = (imm == 0) && (U == 0); 60747 Location location(imm, kA32PcDelta); 60748 // LDRSH{<c>}{<q>} <Rt>, <label> ; A1 60749 if (minus_zero) { 60750 ldrsh(condition, 60751 Best, 60752 Register(rt), 60753 MemOperand(pc, minus, 0)); 60754 } else { 60755 ldrsh(condition, Register(rt), &location); 60756 } 60757 if (((instr & 0xf7f00f0) != 0x15f00f0)) { 60758 UnpredictableA32(instr); 60759 } 60760 break; 60761 } 60762 default: { 60763 if (((instr & 0xf0000000) == 0xf0000000) || 60764 ((instr & 0xf0000) == 0xf0000)) { 60765 UnallocatedA32(instr); 60766 return; 60767 } 60768 Condition condition((instr >> 28) & 0xf); 60769 unsigned rt = (instr >> 12) & 0xf; 60770 unsigned rn = (instr >> 16) & 0xf; 60771 Sign sign((((instr >> 23) & 0x1) == 0) ? minus 60772 : plus); 60773 int32_t offset = 60774 (instr & 0xf) | ((instr >> 4) & 0xf0); 60775 // LDRSH{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_2> ; A1 60776 ldrsh(condition, 60777 Best, 60778 Register(rt), 60779 MemOperand(Register(rn), 60780 sign, 60781 offset, 60782 PostIndex)); 60783 break; 60784 } 60785 } 60786 break; 60787 } 60788 case 0x00200000: { 60789 // 0x007000f0 60790 if (((instr & 0xf0000000) == 0xf0000000)) { 60791 UnallocatedA32(instr); 60792 return; 60793 } 60794 UnimplementedA32("LDRSHT", instr); 60795 break; 60796 } 60797 case 0x01000000: { 60798 // 0x015000f0 60799 switch (instr & 0x000f0000) { 60800 case 0x000f0000: { 60801 // 0x015f00f0 60802 if (((instr & 0xf0000000) == 0xf0000000) || 60803 ((instr & 0x1200000) == 0x200000)) { 60804 UnallocatedA32(instr); 60805 return; 60806 } 60807 Condition condition((instr >> 28) & 0xf); 60808 unsigned rt = (instr >> 12) & 0xf; 60809 uint32_t U = (instr >> 23) & 0x1; 60810 int32_t imm = (instr & 0xf) | ((instr >> 4) & 0xf0); 60811 if (U == 0) imm = -imm; 60812 bool minus_zero = (imm == 0) && (U == 0); 60813 Location location(imm, kA32PcDelta); 60814 // LDRSH{<c>}{<q>} <Rt>, <label> ; A1 60815 if (minus_zero) { 60816 ldrsh(condition, 60817 Best, 60818 Register(rt), 60819 MemOperand(pc, minus, 0)); 60820 } else { 60821 ldrsh(condition, Register(rt), &location); 60822 } 60823 if (((instr & 0xf7f00f0) != 0x15f00f0)) { 60824 UnpredictableA32(instr); 60825 } 60826 break; 60827 } 60828 default: { 60829 if (((instr & 0xf0000000) == 0xf0000000) || 60830 ((instr & 0xf0000) == 0xf0000)) { 60831 UnallocatedA32(instr); 60832 return; 60833 } 60834 Condition condition((instr >> 28) & 0xf); 60835 unsigned rt = (instr >> 12) & 0xf; 60836 unsigned rn = (instr >> 16) & 0xf; 60837 Sign sign((((instr >> 23) & 0x1) == 0) ? minus 60838 : plus); 60839 int32_t offset = 60840 (instr & 0xf) | ((instr >> 4) & 0xf0); 60841 // LDRSH{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_2>}] ; A1 NOLINT(whitespace/line_length) 60842 ldrsh(condition, 60843 Best, 60844 Register(rt), 60845 MemOperand(Register(rn), 60846 sign, 60847 offset, 60848 Offset)); 60849 break; 60850 } 60851 } 60852 break; 60853 } 60854 case 0x01200000: { 60855 // 0x017000f0 60856 switch (instr & 0x000f0000) { 60857 case 0x000f0000: { 60858 // 0x017f00f0 60859 if (((instr & 0xf0000000) == 0xf0000000) || 60860 ((instr & 0x1200000) == 0x200000)) { 60861 UnallocatedA32(instr); 60862 return; 60863 } 60864 Condition condition((instr >> 28) & 0xf); 60865 unsigned rt = (instr >> 12) & 0xf; 60866 uint32_t U = (instr >> 23) & 0x1; 60867 int32_t imm = (instr & 0xf) | ((instr >> 4) & 0xf0); 60868 if (U == 0) imm = -imm; 60869 bool minus_zero = (imm == 0) && (U == 0); 60870 Location location(imm, kA32PcDelta); 60871 // LDRSH{<c>}{<q>} <Rt>, <label> ; A1 60872 if (minus_zero) { 60873 ldrsh(condition, 60874 Best, 60875 Register(rt), 60876 MemOperand(pc, minus, 0)); 60877 } else { 60878 ldrsh(condition, Register(rt), &location); 60879 } 60880 if (((instr & 0xf7f00f0) != 0x15f00f0)) { 60881 UnpredictableA32(instr); 60882 } 60883 break; 60884 } 60885 default: { 60886 if (((instr & 0xf0000000) == 0xf0000000) || 60887 ((instr & 0xf0000) == 0xf0000)) { 60888 UnallocatedA32(instr); 60889 return; 60890 } 60891 Condition condition((instr >> 28) & 0xf); 60892 unsigned rt = (instr >> 12) & 0xf; 60893 unsigned rn = (instr >> 16) & 0xf; 60894 Sign sign((((instr >> 23) & 0x1) == 0) ? minus 60895 : plus); 60896 int32_t offset = 60897 (instr & 0xf) | ((instr >> 4) & 0xf0); 60898 // LDRSH{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_2>}]! ; A1 NOLINT(whitespace/line_length) 60899 ldrsh(condition, 60900 Best, 60901 Register(rt), 60902 MemOperand(Register(rn), 60903 sign, 60904 offset, 60905 PreIndex)); 60906 break; 60907 } 60908 } 60909 break; 60910 } 60911 } 60912 break; 60913 } 60914 } 60915 break; 60916 } 60917 } 60918 break; 60919 } 60920 } 60921 break; 60922 } 60923 case 0x02000000: { 60924 // 0x02000000 60925 switch (instr & 0x01b00000) { 60926 case 0x00000000: { 60927 // 0x02000000 60928 switch (instr & 0x00400000) { 60929 case 0x00000000: { 60930 // 0x02000000 60931 if (((instr & 0xf0000000) == 0xf0000000)) { 60932 UnallocatedA32(instr); 60933 return; 60934 } 60935 Condition condition((instr >> 28) & 0xf); 60936 unsigned rd = (instr >> 12) & 0xf; 60937 unsigned rn = (instr >> 16) & 0xf; 60938 uint32_t imm = ImmediateA32::Decode(instr & 0xfff); 60939 // AND{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1 60940 and_(condition, Best, Register(rd), Register(rn), imm); 60941 break; 60942 } 60943 case 0x00400000: { 60944 // 0x02400000 60945 switch (instr & 0x000d0000) { 60946 case 0x000d0000: { 60947 // 0x024d0000 60948 switch (instr & 0x00020000) { 60949 case 0x00000000: { 60950 // 0x024d0000 60951 if (((instr & 0xf0000000) == 0xf0000000)) { 60952 UnallocatedA32(instr); 60953 return; 60954 } 60955 Condition condition((instr >> 28) & 0xf); 60956 unsigned rd = (instr >> 12) & 0xf; 60957 uint32_t imm = ImmediateA32::Decode(instr & 0xfff); 60958 // SUB{<c>}{<q>} {<Rd>}, SP, #<const> ; A1 60959 sub(condition, Best, Register(rd), sp, imm); 60960 break; 60961 } 60962 case 0x00020000: { 60963 // 0x024f0000 60964 if (((instr & 0xf0000000) == 0xf0000000)) { 60965 UnallocatedA32(instr); 60966 return; 60967 } 60968 if (((instr & 0xf0000000) != 0xf0000000) && 60969 ((Uint32(instr) & Uint32(0xfff)) == Uint32(0x0))) { 60970 Condition condition((instr >> 28) & 0xf); 60971 unsigned rd = (instr >> 12) & 0xf; 60972 uint32_t imm = ImmediateA32::Decode(instr & 0xfff); 60973 // SUB{<c>}{<q>} <Rd>, PC, #<const> ; A2 60974 sub(condition, Best, Register(rd), pc, imm); 60975 return; 60976 } 60977 Condition condition((instr >> 28) & 0xf); 60978 unsigned rd = (instr >> 12) & 0xf; 60979 uint32_t imm = ImmediateA32::Decode(instr & 0xfff); 60980 Location location(UnsignedNegate(imm), kA32PcDelta); 60981 // ADR{<c>}{<q>} <Rd>, <label> ; A2 60982 adr(condition, Best, Register(rd), &location); 60983 break; 60984 } 60985 } 60986 break; 60987 } 60988 default: { 60989 if (((instr & 0xf0000000) == 0xf0000000) || 60990 ((instr & 0xd0000) == 0xd0000)) { 60991 UnallocatedA32(instr); 60992 return; 60993 } 60994 Condition condition((instr >> 28) & 0xf); 60995 unsigned rd = (instr >> 12) & 0xf; 60996 unsigned rn = (instr >> 16) & 0xf; 60997 uint32_t imm = ImmediateA32::Decode(instr & 0xfff); 60998 // SUB{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1 60999 sub(condition, Best, Register(rd), Register(rn), imm); 61000 break; 61001 } 61002 } 61003 break; 61004 } 61005 } 61006 break; 61007 } 61008 case 0x00100000: { 61009 // 0x02100000 61010 switch (instr & 0x00400000) { 61011 case 0x00000000: { 61012 // 0x02100000 61013 if (((instr & 0xf0000000) == 0xf0000000)) { 61014 UnallocatedA32(instr); 61015 return; 61016 } 61017 Condition condition((instr >> 28) & 0xf); 61018 unsigned rd = (instr >> 12) & 0xf; 61019 unsigned rn = (instr >> 16) & 0xf; 61020 uint32_t imm = ImmediateA32::Decode(instr & 0xfff); 61021 // ANDS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1 61022 ands(condition, Best, Register(rd), Register(rn), imm); 61023 break; 61024 } 61025 case 0x00400000: { 61026 // 0x02500000 61027 switch (instr & 0x000f0000) { 61028 case 0x000d0000: { 61029 // 0x025d0000 61030 if (((instr & 0xf0000000) == 0xf0000000)) { 61031 UnallocatedA32(instr); 61032 return; 61033 } 61034 Condition condition((instr >> 28) & 0xf); 61035 unsigned rd = (instr >> 12) & 0xf; 61036 uint32_t imm = ImmediateA32::Decode(instr & 0xfff); 61037 // SUBS{<c>}{<q>} {<Rd>}, SP, #<const> ; A1 61038 subs(condition, Best, Register(rd), sp, imm); 61039 break; 61040 } 61041 default: { 61042 if (((instr & 0xf0000000) == 0xf0000000) || 61043 ((instr & 0xf0000) == 0xd0000)) { 61044 UnallocatedA32(instr); 61045 return; 61046 } 61047 Condition condition((instr >> 28) & 0xf); 61048 unsigned rd = (instr >> 12) & 0xf; 61049 unsigned rn = (instr >> 16) & 0xf; 61050 uint32_t imm = ImmediateA32::Decode(instr & 0xfff); 61051 // SUBS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1 61052 subs(condition, Best, Register(rd), Register(rn), imm); 61053 break; 61054 } 61055 } 61056 break; 61057 } 61058 } 61059 break; 61060 } 61061 case 0x00200000: { 61062 // 0x02200000 61063 switch (instr & 0x00400000) { 61064 case 0x00000000: { 61065 // 0x02200000 61066 if (((instr & 0xf0000000) == 0xf0000000)) { 61067 UnallocatedA32(instr); 61068 return; 61069 } 61070 Condition condition((instr >> 28) & 0xf); 61071 unsigned rd = (instr >> 12) & 0xf; 61072 unsigned rn = (instr >> 16) & 0xf; 61073 uint32_t imm = ImmediateA32::Decode(instr & 0xfff); 61074 // EOR{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1 61075 eor(condition, Best, Register(rd), Register(rn), imm); 61076 break; 61077 } 61078 case 0x00400000: { 61079 // 0x02600000 61080 if (((instr & 0xf0000000) == 0xf0000000)) { 61081 UnallocatedA32(instr); 61082 return; 61083 } 61084 Condition condition((instr >> 28) & 0xf); 61085 unsigned rd = (instr >> 12) & 0xf; 61086 unsigned rn = (instr >> 16) & 0xf; 61087 uint32_t imm = ImmediateA32::Decode(instr & 0xfff); 61088 // RSB{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1 61089 rsb(condition, Best, Register(rd), Register(rn), imm); 61090 break; 61091 } 61092 } 61093 break; 61094 } 61095 case 0x00300000: { 61096 // 0x02300000 61097 switch (instr & 0x00400000) { 61098 case 0x00000000: { 61099 // 0x02300000 61100 if (((instr & 0xf0000000) == 0xf0000000)) { 61101 UnallocatedA32(instr); 61102 return; 61103 } 61104 Condition condition((instr >> 28) & 0xf); 61105 unsigned rd = (instr >> 12) & 0xf; 61106 unsigned rn = (instr >> 16) & 0xf; 61107 uint32_t imm = ImmediateA32::Decode(instr & 0xfff); 61108 // EORS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1 61109 eors(condition, Best, Register(rd), Register(rn), imm); 61110 break; 61111 } 61112 case 0x00400000: { 61113 // 0x02700000 61114 if (((instr & 0xf0000000) == 0xf0000000)) { 61115 UnallocatedA32(instr); 61116 return; 61117 } 61118 Condition condition((instr >> 28) & 0xf); 61119 unsigned rd = (instr >> 12) & 0xf; 61120 unsigned rn = (instr >> 16) & 0xf; 61121 uint32_t imm = ImmediateA32::Decode(instr & 0xfff); 61122 // RSBS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1 61123 rsbs(condition, Best, Register(rd), Register(rn), imm); 61124 break; 61125 } 61126 } 61127 break; 61128 } 61129 case 0x00800000: { 61130 // 0x02800000 61131 switch (instr & 0x00400000) { 61132 case 0x00000000: { 61133 // 0x02800000 61134 switch (instr & 0x000d0000) { 61135 case 0x000d0000: { 61136 // 0x028d0000 61137 switch (instr & 0x00020000) { 61138 case 0x00000000: { 61139 // 0x028d0000 61140 if (((instr & 0xf0000000) == 0xf0000000)) { 61141 UnallocatedA32(instr); 61142 return; 61143 } 61144 Condition condition((instr >> 28) & 0xf); 61145 unsigned rd = (instr >> 12) & 0xf; 61146 uint32_t imm = ImmediateA32::Decode(instr & 0xfff); 61147 // ADD{<c>}{<q>} {<Rd>}, SP, #<const> ; A1 61148 add(condition, Best, Register(rd), sp, imm); 61149 break; 61150 } 61151 case 0x00020000: { 61152 // 0x028f0000 61153 if (((instr & 0xf0000000) == 0xf0000000)) { 61154 UnallocatedA32(instr); 61155 return; 61156 } 61157 Condition condition((instr >> 28) & 0xf); 61158 unsigned rd = (instr >> 12) & 0xf; 61159 uint32_t imm = ImmediateA32::Decode(instr & 0xfff); 61160 Location location(imm, kA32PcDelta); 61161 // ADR{<c>}{<q>} <Rd>, <label> ; A1 61162 adr(condition, Best, Register(rd), &location); 61163 break; 61164 } 61165 } 61166 break; 61167 } 61168 default: { 61169 if (((instr & 0xf0000000) == 0xf0000000) || 61170 ((instr & 0xd0000) == 0xd0000)) { 61171 UnallocatedA32(instr); 61172 return; 61173 } 61174 Condition condition((instr >> 28) & 0xf); 61175 unsigned rd = (instr >> 12) & 0xf; 61176 unsigned rn = (instr >> 16) & 0xf; 61177 uint32_t imm = ImmediateA32::Decode(instr & 0xfff); 61178 // ADD{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1 61179 add(condition, Best, Register(rd), Register(rn), imm); 61180 break; 61181 } 61182 } 61183 break; 61184 } 61185 case 0x00400000: { 61186 // 0x02c00000 61187 if (((instr & 0xf0000000) == 0xf0000000)) { 61188 UnallocatedA32(instr); 61189 return; 61190 } 61191 Condition condition((instr >> 28) & 0xf); 61192 unsigned rd = (instr >> 12) & 0xf; 61193 unsigned rn = (instr >> 16) & 0xf; 61194 uint32_t imm = ImmediateA32::Decode(instr & 0xfff); 61195 // SBC{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1 61196 sbc(condition, Best, Register(rd), Register(rn), imm); 61197 break; 61198 } 61199 } 61200 break; 61201 } 61202 case 0x00900000: { 61203 // 0x02900000 61204 switch (instr & 0x00400000) { 61205 case 0x00000000: { 61206 // 0x02900000 61207 switch (instr & 0x000f0000) { 61208 case 0x000d0000: { 61209 // 0x029d0000 61210 if (((instr & 0xf0000000) == 0xf0000000)) { 61211 UnallocatedA32(instr); 61212 return; 61213 } 61214 Condition condition((instr >> 28) & 0xf); 61215 unsigned rd = (instr >> 12) & 0xf; 61216 uint32_t imm = ImmediateA32::Decode(instr & 0xfff); 61217 // ADDS{<c>}{<q>} {<Rd>}, SP, #<const> ; A1 61218 adds(condition, Best, Register(rd), sp, imm); 61219 break; 61220 } 61221 default: { 61222 if (((instr & 0xf0000000) == 0xf0000000) || 61223 ((instr & 0xf0000) == 0xd0000)) { 61224 UnallocatedA32(instr); 61225 return; 61226 } 61227 Condition condition((instr >> 28) & 0xf); 61228 unsigned rd = (instr >> 12) & 0xf; 61229 unsigned rn = (instr >> 16) & 0xf; 61230 uint32_t imm = ImmediateA32::Decode(instr & 0xfff); 61231 // ADDS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1 61232 adds(condition, Best, Register(rd), Register(rn), imm); 61233 break; 61234 } 61235 } 61236 break; 61237 } 61238 case 0x00400000: { 61239 // 0x02d00000 61240 if (((instr & 0xf0000000) == 0xf0000000)) { 61241 UnallocatedA32(instr); 61242 return; 61243 } 61244 Condition condition((instr >> 28) & 0xf); 61245 unsigned rd = (instr >> 12) & 0xf; 61246 unsigned rn = (instr >> 16) & 0xf; 61247 uint32_t imm = ImmediateA32::Decode(instr & 0xfff); 61248 // SBCS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1 61249 sbcs(condition, Best, Register(rd), Register(rn), imm); 61250 break; 61251 } 61252 } 61253 break; 61254 } 61255 case 0x00a00000: { 61256 // 0x02a00000 61257 switch (instr & 0x00400000) { 61258 case 0x00000000: { 61259 // 0x02a00000 61260 if (((instr & 0xf0000000) == 0xf0000000)) { 61261 UnallocatedA32(instr); 61262 return; 61263 } 61264 Condition condition((instr >> 28) & 0xf); 61265 unsigned rd = (instr >> 12) & 0xf; 61266 unsigned rn = (instr >> 16) & 0xf; 61267 uint32_t imm = ImmediateA32::Decode(instr & 0xfff); 61268 // ADC{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1 61269 adc(condition, Best, Register(rd), Register(rn), imm); 61270 break; 61271 } 61272 case 0x00400000: { 61273 // 0x02e00000 61274 if (((instr & 0xf0000000) == 0xf0000000)) { 61275 UnallocatedA32(instr); 61276 return; 61277 } 61278 Condition condition((instr >> 28) & 0xf); 61279 unsigned rd = (instr >> 12) & 0xf; 61280 unsigned rn = (instr >> 16) & 0xf; 61281 uint32_t imm = ImmediateA32::Decode(instr & 0xfff); 61282 // RSC{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1 61283 rsc(condition, Register(rd), Register(rn), imm); 61284 break; 61285 } 61286 } 61287 break; 61288 } 61289 case 0x00b00000: { 61290 // 0x02b00000 61291 switch (instr & 0x00400000) { 61292 case 0x00000000: { 61293 // 0x02b00000 61294 if (((instr & 0xf0000000) == 0xf0000000)) { 61295 UnallocatedA32(instr); 61296 return; 61297 } 61298 Condition condition((instr >> 28) & 0xf); 61299 unsigned rd = (instr >> 12) & 0xf; 61300 unsigned rn = (instr >> 16) & 0xf; 61301 uint32_t imm = ImmediateA32::Decode(instr & 0xfff); 61302 // ADCS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1 61303 adcs(condition, Best, Register(rd), Register(rn), imm); 61304 break; 61305 } 61306 case 0x00400000: { 61307 // 0x02f00000 61308 if (((instr & 0xf0000000) == 0xf0000000)) { 61309 UnallocatedA32(instr); 61310 return; 61311 } 61312 Condition condition((instr >> 28) & 0xf); 61313 unsigned rd = (instr >> 12) & 0xf; 61314 unsigned rn = (instr >> 16) & 0xf; 61315 uint32_t imm = ImmediateA32::Decode(instr & 0xfff); 61316 // RSCS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1 61317 rscs(condition, Register(rd), Register(rn), imm); 61318 break; 61319 } 61320 } 61321 break; 61322 } 61323 case 0x01000000: { 61324 // 0x03000000 61325 switch (instr & 0x00400000) { 61326 case 0x00000000: { 61327 // 0x03000000 61328 if (((instr & 0xf0000000) == 0xf0000000)) { 61329 UnallocatedA32(instr); 61330 return; 61331 } 61332 Condition condition((instr >> 28) & 0xf); 61333 unsigned rd = (instr >> 12) & 0xf; 61334 uint32_t imm = (instr & 0xfff) | ((instr >> 4) & 0xf000); 61335 if (!ImmediateA32::IsImmediateA32(imm)) { 61336 // MOV{<c>}{<q>} <Rd>, #<imm16> ; A2 61337 mov(condition, Best, Register(rd), imm); 61338 } else { 61339 // MOVW{<c>}{<q>} <Rd>, #<imm16> ; A2 61340 movw(condition, Register(rd), imm); 61341 } 61342 break; 61343 } 61344 case 0x00400000: { 61345 // 0x03400000 61346 if (((instr & 0xf0000000) == 0xf0000000)) { 61347 UnallocatedA32(instr); 61348 return; 61349 } 61350 Condition condition((instr >> 28) & 0xf); 61351 unsigned rd = (instr >> 12) & 0xf; 61352 uint32_t imm = (instr & 0xfff) | ((instr >> 4) & 0xf000); 61353 // MOVT{<c>}{<q>} <Rd>, #<imm16> ; A1 61354 movt(condition, Register(rd), imm); 61355 break; 61356 } 61357 } 61358 break; 61359 } 61360 case 0x01100000: { 61361 // 0x03100000 61362 switch (instr & 0x00400000) { 61363 case 0x00000000: { 61364 // 0x03100000 61365 if (((instr & 0xf0000000) == 0xf0000000)) { 61366 UnallocatedA32(instr); 61367 return; 61368 } 61369 Condition condition((instr >> 28) & 0xf); 61370 unsigned rn = (instr >> 16) & 0xf; 61371 uint32_t imm = ImmediateA32::Decode(instr & 0xfff); 61372 // TST{<c>}{<q>} <Rn>, #<const> ; A1 61373 tst(condition, Best, Register(rn), imm); 61374 if (((instr & 0xff0f000) != 0x3100000)) { 61375 UnpredictableA32(instr); 61376 } 61377 break; 61378 } 61379 case 0x00400000: { 61380 // 0x03500000 61381 if (((instr & 0xf0000000) == 0xf0000000)) { 61382 UnallocatedA32(instr); 61383 return; 61384 } 61385 Condition condition((instr >> 28) & 0xf); 61386 unsigned rn = (instr >> 16) & 0xf; 61387 uint32_t imm = ImmediateA32::Decode(instr & 0xfff); 61388 // CMP{<c>}{<q>} <Rn>, #<const> ; A1 61389 cmp(condition, Best, Register(rn), imm); 61390 if (((instr & 0xff0f000) != 0x3500000)) { 61391 UnpredictableA32(instr); 61392 } 61393 break; 61394 } 61395 } 61396 break; 61397 } 61398 case 0x01200000: { 61399 // 0x03200000 61400 switch (instr & 0x004f0000) { 61401 case 0x00000000: { 61402 // 0x03200000 61403 switch (instr & 0x000000f0) { 61404 case 0x00000000: { 61405 // 0x03200000 61406 switch (instr & 0x0000000f) { 61407 case 0x00000000: { 61408 // 0x03200000 61409 if (((instr & 0xf0000000) == 0xf0000000)) { 61410 UnallocatedA32(instr); 61411 return; 61412 } 61413 Condition condition((instr >> 28) & 0xf); 61414 // NOP{<c>}{<q>} ; A1 61415 nop(condition, Best); 61416 if (((instr & 0xfffffff) != 0x320f000)) { 61417 UnpredictableA32(instr); 61418 } 61419 break; 61420 } 61421 case 0x00000001: { 61422 // 0x03200001 61423 if (((instr & 0xf0000000) == 0xf0000000)) { 61424 UnallocatedA32(instr); 61425 return; 61426 } 61427 Condition condition((instr >> 28) & 0xf); 61428 // YIELD{<c>}{<q>} ; A1 61429 yield(condition, Best); 61430 if (((instr & 0xfffffff) != 0x320f001)) { 61431 UnpredictableA32(instr); 61432 } 61433 break; 61434 } 61435 case 0x00000002: { 61436 // 0x03200002 61437 if (((instr & 0xf0000000) == 0xf0000000)) { 61438 UnallocatedA32(instr); 61439 return; 61440 } 61441 UnimplementedA32("WFE", instr); 61442 break; 61443 } 61444 case 0x00000003: { 61445 // 0x03200003 61446 if (((instr & 0xf0000000) == 0xf0000000)) { 61447 UnallocatedA32(instr); 61448 return; 61449 } 61450 UnimplementedA32("WFI", instr); 61451 break; 61452 } 61453 case 0x00000004: { 61454 // 0x03200004 61455 if (((instr & 0xf0000000) == 0xf0000000)) { 61456 UnallocatedA32(instr); 61457 return; 61458 } 61459 UnimplementedA32("SEV", instr); 61460 break; 61461 } 61462 case 0x00000005: { 61463 // 0x03200005 61464 if (((instr & 0xf0000000) == 0xf0000000)) { 61465 UnallocatedA32(instr); 61466 return; 61467 } 61468 UnimplementedA32("SEVL", instr); 61469 break; 61470 } 61471 default: 61472 UnallocatedA32(instr); 61473 break; 61474 } 61475 break; 61476 } 61477 case 0x000000f0: { 61478 // 0x032000f0 61479 if (((instr & 0xf0000000) == 0xf0000000)) { 61480 UnallocatedA32(instr); 61481 return; 61482 } 61483 UnimplementedA32("DBG", instr); 61484 break; 61485 } 61486 default: 61487 UnallocatedA32(instr); 61488 break; 61489 } 61490 break; 61491 } 61492 default: { 61493 if (((instr & 0xf0000000) == 0xf0000000) || 61494 ((instr & 0x4f0000) == 0x0)) { 61495 UnallocatedA32(instr); 61496 return; 61497 } 61498 Condition condition((instr >> 28) & 0xf); 61499 unsigned spec_reg = 61500 ((instr >> 16) & 0xf) | ((instr >> 18) & 0x10); 61501 uint32_t imm = ImmediateA32::Decode(instr & 0xfff); 61502 // MSR{<c>}{<q>} <spec_reg>, #<imm> ; A1 61503 msr(condition, MaskedSpecialRegister(spec_reg), imm); 61504 if (((instr & 0xfb0f000) != 0x320f000)) { 61505 UnpredictableA32(instr); 61506 } 61507 break; 61508 } 61509 } 61510 break; 61511 } 61512 case 0x01300000: { 61513 // 0x03300000 61514 switch (instr & 0x00400000) { 61515 case 0x00000000: { 61516 // 0x03300000 61517 if (((instr & 0xf0000000) == 0xf0000000)) { 61518 UnallocatedA32(instr); 61519 return; 61520 } 61521 Condition condition((instr >> 28) & 0xf); 61522 unsigned rn = (instr >> 16) & 0xf; 61523 uint32_t imm = ImmediateA32::Decode(instr & 0xfff); 61524 // TEQ{<c>}{<q>} <Rn>, #<const> ; A1 61525 teq(condition, Register(rn), imm); 61526 if (((instr & 0xff0f000) != 0x3300000)) { 61527 UnpredictableA32(instr); 61528 } 61529 break; 61530 } 61531 case 0x00400000: { 61532 // 0x03700000 61533 if (((instr & 0xf0000000) == 0xf0000000)) { 61534 UnallocatedA32(instr); 61535 return; 61536 } 61537 Condition condition((instr >> 28) & 0xf); 61538 unsigned rn = (instr >> 16) & 0xf; 61539 uint32_t imm = ImmediateA32::Decode(instr & 0xfff); 61540 // CMN{<c>}{<q>} <Rn>, #<const> ; A1 61541 cmn(condition, Best, Register(rn), imm); 61542 if (((instr & 0xff0f000) != 0x3700000)) { 61543 UnpredictableA32(instr); 61544 } 61545 break; 61546 } 61547 } 61548 break; 61549 } 61550 case 0x01800000: { 61551 // 0x03800000 61552 switch (instr & 0x00400000) { 61553 case 0x00000000: { 61554 // 0x03800000 61555 if (((instr & 0xf0000000) == 0xf0000000)) { 61556 UnallocatedA32(instr); 61557 return; 61558 } 61559 Condition condition((instr >> 28) & 0xf); 61560 unsigned rd = (instr >> 12) & 0xf; 61561 unsigned rn = (instr >> 16) & 0xf; 61562 uint32_t imm = ImmediateA32::Decode(instr & 0xfff); 61563 // ORR{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1 61564 orr(condition, Best, Register(rd), Register(rn), imm); 61565 break; 61566 } 61567 case 0x00400000: { 61568 // 0x03c00000 61569 if (((instr & 0xf0000000) == 0xf0000000)) { 61570 UnallocatedA32(instr); 61571 return; 61572 } 61573 Condition condition((instr >> 28) & 0xf); 61574 unsigned rd = (instr >> 12) & 0xf; 61575 unsigned rn = (instr >> 16) & 0xf; 61576 uint32_t imm = ImmediateA32::Decode(instr & 0xfff); 61577 // BIC{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1 61578 bic(condition, Best, Register(rd), Register(rn), imm); 61579 break; 61580 } 61581 } 61582 break; 61583 } 61584 case 0x01900000: { 61585 // 0x03900000 61586 switch (instr & 0x00400000) { 61587 case 0x00000000: { 61588 // 0x03900000 61589 if (((instr & 0xf0000000) == 0xf0000000)) { 61590 UnallocatedA32(instr); 61591 return; 61592 } 61593 Condition condition((instr >> 28) & 0xf); 61594 unsigned rd = (instr >> 12) & 0xf; 61595 unsigned rn = (instr >> 16) & 0xf; 61596 uint32_t imm = ImmediateA32::Decode(instr & 0xfff); 61597 // ORRS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1 61598 orrs(condition, Best, Register(rd), Register(rn), imm); 61599 break; 61600 } 61601 case 0x00400000: { 61602 // 0x03d00000 61603 if (((instr & 0xf0000000) == 0xf0000000)) { 61604 UnallocatedA32(instr); 61605 return; 61606 } 61607 Condition condition((instr >> 28) & 0xf); 61608 unsigned rd = (instr >> 12) & 0xf; 61609 unsigned rn = (instr >> 16) & 0xf; 61610 uint32_t imm = ImmediateA32::Decode(instr & 0xfff); 61611 // BICS{<c>}{<q>} {<Rd>}, <Rn>, #<const> ; A1 61612 bics(condition, Best, Register(rd), Register(rn), imm); 61613 break; 61614 } 61615 } 61616 break; 61617 } 61618 case 0x01a00000: { 61619 // 0x03a00000 61620 switch (instr & 0x00400000) { 61621 case 0x00000000: { 61622 // 0x03a00000 61623 if (((instr & 0xf0000000) == 0xf0000000)) { 61624 UnallocatedA32(instr); 61625 return; 61626 } 61627 Condition condition((instr >> 28) & 0xf); 61628 unsigned rd = (instr >> 12) & 0xf; 61629 uint32_t imm = ImmediateA32::Decode(instr & 0xfff); 61630 // MOV{<c>}{<q>} <Rd>, #<const> ; A1 61631 mov(condition, Best, Register(rd), imm); 61632 if (((instr & 0xfff0000) != 0x3a00000)) { 61633 UnpredictableA32(instr); 61634 } 61635 break; 61636 } 61637 case 0x00400000: { 61638 // 0x03e00000 61639 if (((instr & 0xf0000000) == 0xf0000000)) { 61640 UnallocatedA32(instr); 61641 return; 61642 } 61643 Condition condition((instr >> 28) & 0xf); 61644 unsigned rd = (instr >> 12) & 0xf; 61645 uint32_t imm = ImmediateA32::Decode(instr & 0xfff); 61646 // MVN{<c>}{<q>} <Rd>, #<const> ; A1 61647 mvn(condition, Best, Register(rd), imm); 61648 if (((instr & 0xfff0000) != 0x3e00000)) { 61649 UnpredictableA32(instr); 61650 } 61651 break; 61652 } 61653 } 61654 break; 61655 } 61656 case 0x01b00000: { 61657 // 0x03b00000 61658 switch (instr & 0x00400000) { 61659 case 0x00000000: { 61660 // 0x03b00000 61661 if (((instr & 0xf0000000) == 0xf0000000)) { 61662 UnallocatedA32(instr); 61663 return; 61664 } 61665 Condition condition((instr >> 28) & 0xf); 61666 unsigned rd = (instr >> 12) & 0xf; 61667 uint32_t imm = ImmediateA32::Decode(instr & 0xfff); 61668 // MOVS{<c>}{<q>} <Rd>, #<const> ; A1 61669 movs(condition, Best, Register(rd), imm); 61670 if (((instr & 0xfff0000) != 0x3b00000)) { 61671 UnpredictableA32(instr); 61672 } 61673 break; 61674 } 61675 case 0x00400000: { 61676 // 0x03f00000 61677 if (((instr & 0xf0000000) == 0xf0000000)) { 61678 UnallocatedA32(instr); 61679 return; 61680 } 61681 Condition condition((instr >> 28) & 0xf); 61682 unsigned rd = (instr >> 12) & 0xf; 61683 uint32_t imm = ImmediateA32::Decode(instr & 0xfff); 61684 // MVNS{<c>}{<q>} <Rd>, #<const> ; A1 61685 mvns(condition, Best, Register(rd), imm); 61686 if (((instr & 0xfff0000) != 0x3f00000)) { 61687 UnpredictableA32(instr); 61688 } 61689 break; 61690 } 61691 } 61692 break; 61693 } 61694 } 61695 break; 61696 } 61697 case 0x04000000: { 61698 // 0x04000000 61699 switch (instr & 0x00500000) { 61700 case 0x00000000: { 61701 // 0x04000000 61702 switch (instr & 0x01200000) { 61703 case 0x00000000: { 61704 // 0x04000000 61705 if (((instr & 0xf0000000) == 0xf0000000)) { 61706 UnallocatedA32(instr); 61707 return; 61708 } 61709 Condition condition((instr >> 28) & 0xf); 61710 unsigned rt = (instr >> 12) & 0xf; 61711 unsigned rn = (instr >> 16) & 0xf; 61712 Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus); 61713 int32_t offset = instr & 0xfff; 61714 // STR{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_3> ; A1 61715 str(condition, 61716 Best, 61717 Register(rt), 61718 MemOperand(Register(rn), sign, offset, PostIndex)); 61719 break; 61720 } 61721 case 0x00200000: { 61722 // 0x04200000 61723 if (((instr & 0xf0000000) == 0xf0000000)) { 61724 UnallocatedA32(instr); 61725 return; 61726 } 61727 UnimplementedA32("STRT", instr); 61728 break; 61729 } 61730 case 0x01000000: { 61731 // 0x05000000 61732 if (((instr & 0xf0000000) == 0xf0000000)) { 61733 UnallocatedA32(instr); 61734 return; 61735 } 61736 Condition condition((instr >> 28) & 0xf); 61737 unsigned rt = (instr >> 12) & 0xf; 61738 unsigned rn = (instr >> 16) & 0xf; 61739 Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus); 61740 int32_t offset = instr & 0xfff; 61741 // STR{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_3>}] ; A1 61742 str(condition, 61743 Best, 61744 Register(rt), 61745 MemOperand(Register(rn), sign, offset, Offset)); 61746 break; 61747 } 61748 case 0x01200000: { 61749 // 0x05200000 61750 if (((instr & 0xf0000000) == 0xf0000000)) { 61751 UnallocatedA32(instr); 61752 return; 61753 } 61754 if (((Uint32((instr >> 23)) & Uint32(0x1)) == Uint32(0x0)) && 61755 ((Uint32((instr >> 16)) & Uint32(0xf)) == Uint32(0xd)) && 61756 ((Uint32(instr) & Uint32(0xfff)) == Uint32(0x4)) && 61757 ((instr & 0xf0000000) != 0xf0000000)) { 61758 Condition condition((instr >> 28) & 0xf); 61759 unsigned rt = (instr >> 12) & 0xf; 61760 // PUSH{<c>}{<q>} <single_register_list> ; A1 61761 push(condition, Best, Register(rt)); 61762 return; 61763 } 61764 Condition condition((instr >> 28) & 0xf); 61765 unsigned rt = (instr >> 12) & 0xf; 61766 unsigned rn = (instr >> 16) & 0xf; 61767 Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus); 61768 int32_t offset = instr & 0xfff; 61769 // STR{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_3>}]! ; A1 61770 str(condition, 61771 Best, 61772 Register(rt), 61773 MemOperand(Register(rn), sign, offset, PreIndex)); 61774 break; 61775 } 61776 } 61777 break; 61778 } 61779 case 0x00100000: { 61780 // 0x04100000 61781 switch (instr & 0x01200000) { 61782 case 0x00000000: { 61783 // 0x04100000 61784 switch (instr & 0x000f0000) { 61785 case 0x000f0000: { 61786 // 0x041f0000 61787 if (((instr & 0xf0000000) == 0xf0000000) || 61788 ((instr & 0x1200000) == 0x200000)) { 61789 UnallocatedA32(instr); 61790 return; 61791 } 61792 Condition condition((instr >> 28) & 0xf); 61793 unsigned rt = (instr >> 12) & 0xf; 61794 uint32_t U = (instr >> 23) & 0x1; 61795 int32_t imm = instr & 0xfff; 61796 if (U == 0) imm = -imm; 61797 bool minus_zero = (imm == 0) && (U == 0); 61798 Location location(imm, kA32PcDelta); 61799 // LDR{<c>}{<q>} <Rt>, <label> ; A1 61800 if (minus_zero) { 61801 ldr(condition, 61802 Best, 61803 Register(rt), 61804 MemOperand(pc, minus, 0)); 61805 } else { 61806 ldr(condition, Best, Register(rt), &location); 61807 } 61808 if (((instr & 0xf7f0000) != 0x51f0000)) { 61809 UnpredictableA32(instr); 61810 } 61811 break; 61812 } 61813 default: { 61814 if (((instr & 0xf0000000) == 0xf0000000) || 61815 ((instr & 0xf0000) == 0xf0000)) { 61816 UnallocatedA32(instr); 61817 return; 61818 } 61819 if (((Uint32((instr >> 23)) & Uint32(0x1)) == 61820 Uint32(0x1)) && 61821 ((Uint32((instr >> 16)) & Uint32(0xf)) == 61822 Uint32(0xd)) && 61823 ((Uint32(instr) & Uint32(0xfff)) == Uint32(0x4)) && 61824 ((instr & 0xf0000000) != 0xf0000000)) { 61825 Condition condition((instr >> 28) & 0xf); 61826 unsigned rt = (instr >> 12) & 0xf; 61827 // POP{<c>}{<q>} <single_register_list> ; A1 61828 pop(condition, Best, Register(rt)); 61829 return; 61830 } 61831 Condition condition((instr >> 28) & 0xf); 61832 unsigned rt = (instr >> 12) & 0xf; 61833 unsigned rn = (instr >> 16) & 0xf; 61834 Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus); 61835 int32_t offset = instr & 0xfff; 61836 // LDR{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_3> ; A1 61837 ldr(condition, 61838 Best, 61839 Register(rt), 61840 MemOperand(Register(rn), sign, offset, PostIndex)); 61841 break; 61842 } 61843 } 61844 break; 61845 } 61846 case 0x00200000: { 61847 // 0x04300000 61848 if (((instr & 0xf0000000) == 0xf0000000)) { 61849 UnallocatedA32(instr); 61850 return; 61851 } 61852 UnimplementedA32("LDRT", instr); 61853 break; 61854 } 61855 case 0x01000000: { 61856 // 0x05100000 61857 switch (instr & 0x000f0000) { 61858 case 0x000f0000: { 61859 // 0x051f0000 61860 if (((instr & 0xf0000000) == 0xf0000000) || 61861 ((instr & 0x1200000) == 0x200000)) { 61862 UnallocatedA32(instr); 61863 return; 61864 } 61865 Condition condition((instr >> 28) & 0xf); 61866 unsigned rt = (instr >> 12) & 0xf; 61867 uint32_t U = (instr >> 23) & 0x1; 61868 int32_t imm = instr & 0xfff; 61869 if (U == 0) imm = -imm; 61870 bool minus_zero = (imm == 0) && (U == 0); 61871 Location location(imm, kA32PcDelta); 61872 // LDR{<c>}{<q>} <Rt>, <label> ; A1 61873 if (minus_zero) { 61874 ldr(condition, 61875 Best, 61876 Register(rt), 61877 MemOperand(pc, minus, 0)); 61878 } else { 61879 ldr(condition, Best, Register(rt), &location); 61880 } 61881 if (((instr & 0xf7f0000) != 0x51f0000)) { 61882 UnpredictableA32(instr); 61883 } 61884 break; 61885 } 61886 default: { 61887 if (((instr & 0xf0000000) == 0xf0000000) || 61888 ((instr & 0xf0000) == 0xf0000)) { 61889 UnallocatedA32(instr); 61890 return; 61891 } 61892 Condition condition((instr >> 28) & 0xf); 61893 unsigned rt = (instr >> 12) & 0xf; 61894 unsigned rn = (instr >> 16) & 0xf; 61895 Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus); 61896 int32_t offset = instr & 0xfff; 61897 // LDR{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_3>}] ; A1 61898 ldr(condition, 61899 Best, 61900 Register(rt), 61901 MemOperand(Register(rn), sign, offset, Offset)); 61902 break; 61903 } 61904 } 61905 break; 61906 } 61907 case 0x01200000: { 61908 // 0x05300000 61909 switch (instr & 0x000f0000) { 61910 case 0x000f0000: { 61911 // 0x053f0000 61912 if (((instr & 0xf0000000) == 0xf0000000) || 61913 ((instr & 0x1200000) == 0x200000)) { 61914 UnallocatedA32(instr); 61915 return; 61916 } 61917 Condition condition((instr >> 28) & 0xf); 61918 unsigned rt = (instr >> 12) & 0xf; 61919 uint32_t U = (instr >> 23) & 0x1; 61920 int32_t imm = instr & 0xfff; 61921 if (U == 0) imm = -imm; 61922 bool minus_zero = (imm == 0) && (U == 0); 61923 Location location(imm, kA32PcDelta); 61924 // LDR{<c>}{<q>} <Rt>, <label> ; A1 61925 if (minus_zero) { 61926 ldr(condition, 61927 Best, 61928 Register(rt), 61929 MemOperand(pc, minus, 0)); 61930 } else { 61931 ldr(condition, Best, Register(rt), &location); 61932 } 61933 if (((instr & 0xf7f0000) != 0x51f0000)) { 61934 UnpredictableA32(instr); 61935 } 61936 break; 61937 } 61938 default: { 61939 if (((instr & 0xf0000000) == 0xf0000000) || 61940 ((instr & 0xf0000) == 0xf0000)) { 61941 UnallocatedA32(instr); 61942 return; 61943 } 61944 Condition condition((instr >> 28) & 0xf); 61945 unsigned rt = (instr >> 12) & 0xf; 61946 unsigned rn = (instr >> 16) & 0xf; 61947 Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus); 61948 int32_t offset = instr & 0xfff; 61949 // LDR{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_3>}]! ; A1 61950 ldr(condition, 61951 Best, 61952 Register(rt), 61953 MemOperand(Register(rn), sign, offset, PreIndex)); 61954 break; 61955 } 61956 } 61957 break; 61958 } 61959 } 61960 break; 61961 } 61962 case 0x00400000: { 61963 // 0x04400000 61964 switch (instr & 0x01200000) { 61965 case 0x00000000: { 61966 // 0x04400000 61967 if (((instr & 0xf0000000) == 0xf0000000)) { 61968 UnallocatedA32(instr); 61969 return; 61970 } 61971 Condition condition((instr >> 28) & 0xf); 61972 unsigned rt = (instr >> 12) & 0xf; 61973 unsigned rn = (instr >> 16) & 0xf; 61974 Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus); 61975 int32_t offset = instr & 0xfff; 61976 // STRB{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_3> ; A1 61977 strb(condition, 61978 Best, 61979 Register(rt), 61980 MemOperand(Register(rn), sign, offset, PostIndex)); 61981 break; 61982 } 61983 case 0x00200000: { 61984 // 0x04600000 61985 if (((instr & 0xf0000000) == 0xf0000000)) { 61986 UnallocatedA32(instr); 61987 return; 61988 } 61989 UnimplementedA32("STRBT", instr); 61990 break; 61991 } 61992 case 0x01000000: { 61993 // 0x05400000 61994 if (((instr & 0xf0000000) == 0xf0000000)) { 61995 UnallocatedA32(instr); 61996 return; 61997 } 61998 Condition condition((instr >> 28) & 0xf); 61999 unsigned rt = (instr >> 12) & 0xf; 62000 unsigned rn = (instr >> 16) & 0xf; 62001 Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus); 62002 int32_t offset = instr & 0xfff; 62003 // STRB{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_3>}] ; A1 62004 strb(condition, 62005 Best, 62006 Register(rt), 62007 MemOperand(Register(rn), sign, offset, Offset)); 62008 break; 62009 } 62010 case 0x01200000: { 62011 // 0x05600000 62012 if (((instr & 0xf0000000) == 0xf0000000)) { 62013 UnallocatedA32(instr); 62014 return; 62015 } 62016 Condition condition((instr >> 28) & 0xf); 62017 unsigned rt = (instr >> 12) & 0xf; 62018 unsigned rn = (instr >> 16) & 0xf; 62019 Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus); 62020 int32_t offset = instr & 0xfff; 62021 // STRB{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_3>}]! ; A1 62022 strb(condition, 62023 Best, 62024 Register(rt), 62025 MemOperand(Register(rn), sign, offset, PreIndex)); 62026 break; 62027 } 62028 } 62029 break; 62030 } 62031 case 0x00500000: { 62032 // 0x04500000 62033 switch (instr & 0x01200000) { 62034 case 0x00000000: { 62035 // 0x04500000 62036 switch (instr & 0x000f0000) { 62037 case 0x000f0000: { 62038 // 0x045f0000 62039 if (((instr & 0xf0000000) == 0xf0000000) || 62040 ((instr & 0x1200000) == 0x200000)) { 62041 UnallocatedA32(instr); 62042 return; 62043 } 62044 Condition condition((instr >> 28) & 0xf); 62045 unsigned rt = (instr >> 12) & 0xf; 62046 uint32_t U = (instr >> 23) & 0x1; 62047 int32_t imm = instr & 0xfff; 62048 if (U == 0) imm = -imm; 62049 bool minus_zero = (imm == 0) && (U == 0); 62050 Location location(imm, kA32PcDelta); 62051 // LDRB{<c>}{<q>} <Rt>, <label> ; A1 62052 if (minus_zero) { 62053 ldrb(condition, 62054 Best, 62055 Register(rt), 62056 MemOperand(pc, minus, 0)); 62057 } else { 62058 ldrb(condition, Register(rt), &location); 62059 } 62060 if (((instr & 0xf7f0000) != 0x55f0000)) { 62061 UnpredictableA32(instr); 62062 } 62063 break; 62064 } 62065 default: { 62066 if (((instr & 0xf0000000) == 0xf0000000) || 62067 ((instr & 0xf0000) == 0xf0000)) { 62068 UnallocatedA32(instr); 62069 return; 62070 } 62071 Condition condition((instr >> 28) & 0xf); 62072 unsigned rt = (instr >> 12) & 0xf; 62073 unsigned rn = (instr >> 16) & 0xf; 62074 Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus); 62075 int32_t offset = instr & 0xfff; 62076 // LDRB{<c>}{<q>} <Rt>, [<Rn>], #{+/-}<imm_3> ; A1 62077 ldrb(condition, 62078 Best, 62079 Register(rt), 62080 MemOperand(Register(rn), sign, offset, PostIndex)); 62081 break; 62082 } 62083 } 62084 break; 62085 } 62086 case 0x00200000: { 62087 // 0x04700000 62088 if (((instr & 0xf0000000) == 0xf0000000)) { 62089 UnallocatedA32(instr); 62090 return; 62091 } 62092 UnimplementedA32("LDRBT", instr); 62093 break; 62094 } 62095 case 0x01000000: { 62096 // 0x05500000 62097 switch (instr & 0x000f0000) { 62098 case 0x000f0000: { 62099 // 0x055f0000 62100 if (((instr & 0xf0000000) == 0xf0000000) || 62101 ((instr & 0x1200000) == 0x200000)) { 62102 UnallocatedA32(instr); 62103 return; 62104 } 62105 Condition condition((instr >> 28) & 0xf); 62106 unsigned rt = (instr >> 12) & 0xf; 62107 uint32_t U = (instr >> 23) & 0x1; 62108 int32_t imm = instr & 0xfff; 62109 if (U == 0) imm = -imm; 62110 bool minus_zero = (imm == 0) && (U == 0); 62111 Location location(imm, kA32PcDelta); 62112 // LDRB{<c>}{<q>} <Rt>, <label> ; A1 62113 if (minus_zero) { 62114 ldrb(condition, 62115 Best, 62116 Register(rt), 62117 MemOperand(pc, minus, 0)); 62118 } else { 62119 ldrb(condition, Register(rt), &location); 62120 } 62121 if (((instr & 0xf7f0000) != 0x55f0000)) { 62122 UnpredictableA32(instr); 62123 } 62124 break; 62125 } 62126 default: { 62127 if (((instr & 0xf0000000) == 0xf0000000) || 62128 ((instr & 0xf0000) == 0xf0000)) { 62129 UnallocatedA32(instr); 62130 return; 62131 } 62132 Condition condition((instr >> 28) & 0xf); 62133 unsigned rt = (instr >> 12) & 0xf; 62134 unsigned rn = (instr >> 16) & 0xf; 62135 Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus); 62136 int32_t offset = instr & 0xfff; 62137 // LDRB{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_3>}] ; A1 62138 ldrb(condition, 62139 Best, 62140 Register(rt), 62141 MemOperand(Register(rn), sign, offset, Offset)); 62142 break; 62143 } 62144 } 62145 break; 62146 } 62147 case 0x01200000: { 62148 // 0x05700000 62149 switch (instr & 0x000f0000) { 62150 case 0x000f0000: { 62151 // 0x057f0000 62152 if (((instr & 0xf0000000) == 0xf0000000) || 62153 ((instr & 0x1200000) == 0x200000)) { 62154 UnallocatedA32(instr); 62155 return; 62156 } 62157 Condition condition((instr >> 28) & 0xf); 62158 unsigned rt = (instr >> 12) & 0xf; 62159 uint32_t U = (instr >> 23) & 0x1; 62160 int32_t imm = instr & 0xfff; 62161 if (U == 0) imm = -imm; 62162 bool minus_zero = (imm == 0) && (U == 0); 62163 Location location(imm, kA32PcDelta); 62164 // LDRB{<c>}{<q>} <Rt>, <label> ; A1 62165 if (minus_zero) { 62166 ldrb(condition, 62167 Best, 62168 Register(rt), 62169 MemOperand(pc, minus, 0)); 62170 } else { 62171 ldrb(condition, Register(rt), &location); 62172 } 62173 if (((instr & 0xf7f0000) != 0x55f0000)) { 62174 UnpredictableA32(instr); 62175 } 62176 break; 62177 } 62178 default: { 62179 if (((instr & 0xf0000000) == 0xf0000000) || 62180 ((instr & 0xf0000) == 0xf0000)) { 62181 UnallocatedA32(instr); 62182 return; 62183 } 62184 Condition condition((instr >> 28) & 0xf); 62185 unsigned rt = (instr >> 12) & 0xf; 62186 unsigned rn = (instr >> 16) & 0xf; 62187 Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus); 62188 int32_t offset = instr & 0xfff; 62189 // LDRB{<c>}{<q>} <Rt>, [<Rn>{, #{+/-}<imm_3>}]! ; A1 62190 ldrb(condition, 62191 Best, 62192 Register(rt), 62193 MemOperand(Register(rn), sign, offset, PreIndex)); 62194 break; 62195 } 62196 } 62197 break; 62198 } 62199 } 62200 break; 62201 } 62202 } 62203 break; 62204 } 62205 case 0x06000000: { 62206 // 0x06000000 62207 switch (instr & 0x01600010) { 62208 case 0x00000000: { 62209 // 0x06000000 62210 switch (instr & 0x00100000) { 62211 case 0x00000000: { 62212 // 0x06000000 62213 if (((instr & 0xf0000000) == 0xf0000000)) { 62214 UnallocatedA32(instr); 62215 return; 62216 } 62217 Condition condition((instr >> 28) & 0xf); 62218 unsigned rt = (instr >> 12) & 0xf; 62219 unsigned rn = (instr >> 16) & 0xf; 62220 Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus); 62221 unsigned rm = instr & 0xf; 62222 uint32_t imm_and_type_ = ((instr >> 5) & 0x7f); 62223 ImmediateShiftOperand shift_operand(imm_and_type_ & 0x3, 62224 (imm_and_type_ & 0x7c) >> 62225 2); 62226 Shift shift = shift_operand.GetShift(); 62227 uint32_t amount = shift_operand.GetAmount(); 62228 // STR{<c>}{<q>} <Rt>, [<Rn>], {+/-}<Rm>{, <shift>} ; A1 62229 str(condition, 62230 Best, 62231 Register(rt), 62232 MemOperand(Register(rn), 62233 sign, 62234 Register(rm), 62235 shift, 62236 amount, 62237 PostIndex)); 62238 break; 62239 } 62240 case 0x00100000: { 62241 // 0x06100000 62242 if (((instr & 0xf0000000) == 0xf0000000)) { 62243 UnallocatedA32(instr); 62244 return; 62245 } 62246 Condition condition((instr >> 28) & 0xf); 62247 unsigned rt = (instr >> 12) & 0xf; 62248 unsigned rn = (instr >> 16) & 0xf; 62249 Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus); 62250 unsigned rm = instr & 0xf; 62251 uint32_t imm_and_type_ = ((instr >> 5) & 0x7f); 62252 ImmediateShiftOperand shift_operand(imm_and_type_ & 0x3, 62253 (imm_and_type_ & 0x7c) >> 62254 2); 62255 Shift shift = shift_operand.GetShift(); 62256 uint32_t amount = shift_operand.GetAmount(); 62257 // LDR{<c>}{<q>} <Rt>, [<Rn>], {+/-}<Rm>{, <shift>} ; A1 62258 ldr(condition, 62259 Best, 62260 Register(rt), 62261 MemOperand(Register(rn), 62262 sign, 62263 Register(rm), 62264 shift, 62265 amount, 62266 PostIndex)); 62267 break; 62268 } 62269 } 62270 break; 62271 } 62272 case 0x00000010: { 62273 // 0x06000010 62274 switch (instr & 0x00900060) { 62275 case 0x00100000: { 62276 // 0x06100010 62277 switch (instr & 0x00000080) { 62278 case 0x00000000: { 62279 // 0x06100010 62280 if (((instr & 0xf0000000) == 0xf0000000)) { 62281 UnallocatedA32(instr); 62282 return; 62283 } 62284 Condition condition((instr >> 28) & 0xf); 62285 unsigned rd = (instr >> 12) & 0xf; 62286 unsigned rn = (instr >> 16) & 0xf; 62287 unsigned rm = instr & 0xf; 62288 // SADD16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1 62289 sadd16(condition, Register(rd), Register(rn), Register(rm)); 62290 if (((instr & 0xff00ff0) != 0x6100f10)) { 62291 UnpredictableA32(instr); 62292 } 62293 break; 62294 } 62295 case 0x00000080: { 62296 // 0x06100090 62297 if (((instr & 0xf0000000) == 0xf0000000)) { 62298 UnallocatedA32(instr); 62299 return; 62300 } 62301 Condition condition((instr >> 28) & 0xf); 62302 unsigned rd = (instr >> 12) & 0xf; 62303 unsigned rn = (instr >> 16) & 0xf; 62304 unsigned rm = instr & 0xf; 62305 // SADD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1 62306 sadd8(condition, Register(rd), Register(rn), Register(rm)); 62307 if (((instr & 0xff00ff0) != 0x6100f90)) { 62308 UnpredictableA32(instr); 62309 } 62310 break; 62311 } 62312 } 62313 break; 62314 } 62315 case 0x00100020: { 62316 // 0x06100030 62317 if ((instr & 0x00000080) == 0x00000000) { 62318 if (((instr & 0xf0000000) == 0xf0000000)) { 62319 UnallocatedA32(instr); 62320 return; 62321 } 62322 Condition condition((instr >> 28) & 0xf); 62323 unsigned rd = (instr >> 12) & 0xf; 62324 unsigned rn = (instr >> 16) & 0xf; 62325 unsigned rm = instr & 0xf; 62326 // SASX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1 62327 sasx(condition, Register(rd), Register(rn), Register(rm)); 62328 if (((instr & 0xff00ff0) != 0x6100f30)) { 62329 UnpredictableA32(instr); 62330 } 62331 } else { 62332 UnallocatedA32(instr); 62333 } 62334 break; 62335 } 62336 case 0x00100040: { 62337 // 0x06100050 62338 if ((instr & 0x00000080) == 0x00000000) { 62339 if (((instr & 0xf0000000) == 0xf0000000)) { 62340 UnallocatedA32(instr); 62341 return; 62342 } 62343 Condition condition((instr >> 28) & 0xf); 62344 unsigned rd = (instr >> 12) & 0xf; 62345 unsigned rn = (instr >> 16) & 0xf; 62346 unsigned rm = instr & 0xf; 62347 // SSAX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1 62348 ssax(condition, Register(rd), Register(rn), Register(rm)); 62349 if (((instr & 0xff00ff0) != 0x6100f50)) { 62350 UnpredictableA32(instr); 62351 } 62352 } else { 62353 UnallocatedA32(instr); 62354 } 62355 break; 62356 } 62357 case 0x00100060: { 62358 // 0x06100070 62359 switch (instr & 0x00000080) { 62360 case 0x00000000: { 62361 // 0x06100070 62362 if (((instr & 0xf0000000) == 0xf0000000)) { 62363 UnallocatedA32(instr); 62364 return; 62365 } 62366 Condition condition((instr >> 28) & 0xf); 62367 unsigned rd = (instr >> 12) & 0xf; 62368 unsigned rn = (instr >> 16) & 0xf; 62369 unsigned rm = instr & 0xf; 62370 // SSUB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1 62371 ssub16(condition, Register(rd), Register(rn), Register(rm)); 62372 if (((instr & 0xff00ff0) != 0x6100f70)) { 62373 UnpredictableA32(instr); 62374 } 62375 break; 62376 } 62377 case 0x00000080: { 62378 // 0x061000f0 62379 if (((instr & 0xf0000000) == 0xf0000000)) { 62380 UnallocatedA32(instr); 62381 return; 62382 } 62383 Condition condition((instr >> 28) & 0xf); 62384 unsigned rd = (instr >> 12) & 0xf; 62385 unsigned rn = (instr >> 16) & 0xf; 62386 unsigned rm = instr & 0xf; 62387 // SSUB8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1 62388 ssub8(condition, Register(rd), Register(rn), Register(rm)); 62389 if (((instr & 0xff00ff0) != 0x6100ff0)) { 62390 UnpredictableA32(instr); 62391 } 62392 break; 62393 } 62394 } 62395 break; 62396 } 62397 case 0x00800000: { 62398 // 0x06800010 62399 if (((instr & 0xf0000000) == 0xf0000000)) { 62400 UnallocatedA32(instr); 62401 return; 62402 } 62403 Condition condition((instr >> 28) & 0xf); 62404 unsigned rd = (instr >> 12) & 0xf; 62405 unsigned rn = (instr >> 16) & 0xf; 62406 unsigned rm = instr & 0xf; 62407 uint32_t amount = (instr >> 7) & 0x1f; 62408 // PKHBT{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, LSL #<imm> } ; A1 62409 pkhbt(condition, 62410 Register(rd), 62411 Register(rn), 62412 Operand(Register(rm), LSL, amount)); 62413 break; 62414 } 62415 case 0x00800020: { 62416 // 0x06800030 62417 if ((instr & 0x00000080) == 0x00000080) { 62418 if (((instr & 0xf0000000) == 0xf0000000)) { 62419 UnallocatedA32(instr); 62420 return; 62421 } 62422 Condition condition((instr >> 28) & 0xf); 62423 unsigned rd = (instr >> 12) & 0xf; 62424 unsigned rn = (instr >> 16) & 0xf; 62425 unsigned rm = instr & 0xf; 62426 // SEL{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1 62427 sel(condition, Register(rd), Register(rn), Register(rm)); 62428 if (((instr & 0xff00ff0) != 0x6800fb0)) { 62429 UnpredictableA32(instr); 62430 } 62431 } else { 62432 UnallocatedA32(instr); 62433 } 62434 break; 62435 } 62436 case 0x00800040: { 62437 // 0x06800050 62438 if (((instr & 0xf0000000) == 0xf0000000)) { 62439 UnallocatedA32(instr); 62440 return; 62441 } 62442 Condition condition((instr >> 28) & 0xf); 62443 unsigned rd = (instr >> 12) & 0xf; 62444 unsigned rn = (instr >> 16) & 0xf; 62445 unsigned rm = instr & 0xf; 62446 uint32_t amount = (instr >> 7) & 0x1f; 62447 if (amount == 0) amount = 32; 62448 // PKHTB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, ASR #<imm> } ; A1 62449 pkhtb(condition, 62450 Register(rd), 62451 Register(rn), 62452 Operand(Register(rm), ASR, amount)); 62453 break; 62454 } 62455 case 0x00800060: { 62456 // 0x06800070 62457 switch (instr & 0x00000080) { 62458 case 0x00000000: { 62459 // 0x06800070 62460 switch (instr & 0x000f0000) { 62461 case 0x000f0000: { 62462 // 0x068f0070 62463 if (((instr & 0xf0000000) == 0xf0000000)) { 62464 UnallocatedA32(instr); 62465 return; 62466 } 62467 Condition condition((instr >> 28) & 0xf); 62468 unsigned rd = (instr >> 12) & 0xf; 62469 unsigned rm = instr & 0xf; 62470 uint32_t amount = ((instr >> 10) & 0x3) * 8; 62471 // SXTB16{<c>}{<q>} {<Rd>}, <Rm> {, ROR #<amount> } ; A1 62472 sxtb16(condition, 62473 Register(rd), 62474 Operand(Register(rm), ROR, amount)); 62475 if (((instr & 0xfff03f0) != 0x68f0070)) { 62476 UnpredictableA32(instr); 62477 } 62478 break; 62479 } 62480 default: { 62481 if (((instr & 0xf0000000) == 0xf0000000) || 62482 ((instr & 0xf0000) == 0xf0000)) { 62483 UnallocatedA32(instr); 62484 return; 62485 } 62486 Condition condition((instr >> 28) & 0xf); 62487 unsigned rd = (instr >> 12) & 0xf; 62488 unsigned rn = (instr >> 16) & 0xf; 62489 unsigned rm = instr & 0xf; 62490 uint32_t amount = ((instr >> 10) & 0x3) * 8; 62491 // SXTAB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, ROR #<amount> } ; A1 NOLINT(whitespace/line_length) 62492 sxtab16(condition, 62493 Register(rd), 62494 Register(rn), 62495 Operand(Register(rm), ROR, amount)); 62496 if (((instr & 0xff003f0) != 0x6800070)) { 62497 UnpredictableA32(instr); 62498 } 62499 break; 62500 } 62501 } 62502 break; 62503 } 62504 default: 62505 UnallocatedA32(instr); 62506 break; 62507 } 62508 break; 62509 } 62510 default: 62511 UnallocatedA32(instr); 62512 break; 62513 } 62514 break; 62515 } 62516 case 0x00200000: { 62517 // 0x06200000 62518 switch (instr & 0x00100000) { 62519 case 0x00000000: { 62520 // 0x06200000 62521 if (((instr & 0xf0000000) == 0xf0000000)) { 62522 UnallocatedA32(instr); 62523 return; 62524 } 62525 UnimplementedA32("STRT", instr); 62526 break; 62527 } 62528 case 0x00100000: { 62529 // 0x06300000 62530 if (((instr & 0xf0000000) == 0xf0000000)) { 62531 UnallocatedA32(instr); 62532 return; 62533 } 62534 UnimplementedA32("LDRT", instr); 62535 break; 62536 } 62537 } 62538 break; 62539 } 62540 case 0x00200010: { 62541 // 0x06200010 62542 switch (instr & 0x00800060) { 62543 case 0x00000000: { 62544 // 0x06200010 62545 switch (instr & 0x00100080) { 62546 case 0x00000000: { 62547 // 0x06200010 62548 if (((instr & 0xf0000000) == 0xf0000000)) { 62549 UnallocatedA32(instr); 62550 return; 62551 } 62552 Condition condition((instr >> 28) & 0xf); 62553 unsigned rd = (instr >> 12) & 0xf; 62554 unsigned rn = (instr >> 16) & 0xf; 62555 unsigned rm = instr & 0xf; 62556 // QADD16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1 62557 qadd16(condition, Register(rd), Register(rn), Register(rm)); 62558 if (((instr & 0xff00ff0) != 0x6200f10)) { 62559 UnpredictableA32(instr); 62560 } 62561 break; 62562 } 62563 case 0x00000080: { 62564 // 0x06200090 62565 if (((instr & 0xf0000000) == 0xf0000000)) { 62566 UnallocatedA32(instr); 62567 return; 62568 } 62569 Condition condition((instr >> 28) & 0xf); 62570 unsigned rd = (instr >> 12) & 0xf; 62571 unsigned rn = (instr >> 16) & 0xf; 62572 unsigned rm = instr & 0xf; 62573 // QADD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1 62574 qadd8(condition, Register(rd), Register(rn), Register(rm)); 62575 if (((instr & 0xff00ff0) != 0x6200f90)) { 62576 UnpredictableA32(instr); 62577 } 62578 break; 62579 } 62580 case 0x00100000: { 62581 // 0x06300010 62582 if (((instr & 0xf0000000) == 0xf0000000)) { 62583 UnallocatedA32(instr); 62584 return; 62585 } 62586 Condition condition((instr >> 28) & 0xf); 62587 unsigned rd = (instr >> 12) & 0xf; 62588 unsigned rn = (instr >> 16) & 0xf; 62589 unsigned rm = instr & 0xf; 62590 // SHADD16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1 62591 shadd16(condition, 62592 Register(rd), 62593 Register(rn), 62594 Register(rm)); 62595 if (((instr & 0xff00ff0) != 0x6300f10)) { 62596 UnpredictableA32(instr); 62597 } 62598 break; 62599 } 62600 case 0x00100080: { 62601 // 0x06300090 62602 if (((instr & 0xf0000000) == 0xf0000000)) { 62603 UnallocatedA32(instr); 62604 return; 62605 } 62606 Condition condition((instr >> 28) & 0xf); 62607 unsigned rd = (instr >> 12) & 0xf; 62608 unsigned rn = (instr >> 16) & 0xf; 62609 unsigned rm = instr & 0xf; 62610 // SHADD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1 62611 shadd8(condition, Register(rd), Register(rn), Register(rm)); 62612 if (((instr & 0xff00ff0) != 0x6300f90)) { 62613 UnpredictableA32(instr); 62614 } 62615 break; 62616 } 62617 } 62618 break; 62619 } 62620 case 0x00000020: { 62621 // 0x06200030 62622 switch (instr & 0x00100080) { 62623 case 0x00000000: { 62624 // 0x06200030 62625 if (((instr & 0xf0000000) == 0xf0000000)) { 62626 UnallocatedA32(instr); 62627 return; 62628 } 62629 Condition condition((instr >> 28) & 0xf); 62630 unsigned rd = (instr >> 12) & 0xf; 62631 unsigned rn = (instr >> 16) & 0xf; 62632 unsigned rm = instr & 0xf; 62633 // QASX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1 62634 qasx(condition, Register(rd), Register(rn), Register(rm)); 62635 if (((instr & 0xff00ff0) != 0x6200f30)) { 62636 UnpredictableA32(instr); 62637 } 62638 break; 62639 } 62640 case 0x00100000: { 62641 // 0x06300030 62642 if (((instr & 0xf0000000) == 0xf0000000)) { 62643 UnallocatedA32(instr); 62644 return; 62645 } 62646 Condition condition((instr >> 28) & 0xf); 62647 unsigned rd = (instr >> 12) & 0xf; 62648 unsigned rn = (instr >> 16) & 0xf; 62649 unsigned rm = instr & 0xf; 62650 // SHASX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1 62651 shasx(condition, Register(rd), Register(rn), Register(rm)); 62652 if (((instr & 0xff00ff0) != 0x6300f30)) { 62653 UnpredictableA32(instr); 62654 } 62655 break; 62656 } 62657 default: 62658 UnallocatedA32(instr); 62659 break; 62660 } 62661 break; 62662 } 62663 case 0x00000040: { 62664 // 0x06200050 62665 switch (instr & 0x00100080) { 62666 case 0x00000000: { 62667 // 0x06200050 62668 if (((instr & 0xf0000000) == 0xf0000000)) { 62669 UnallocatedA32(instr); 62670 return; 62671 } 62672 Condition condition((instr >> 28) & 0xf); 62673 unsigned rd = (instr >> 12) & 0xf; 62674 unsigned rn = (instr >> 16) & 0xf; 62675 unsigned rm = instr & 0xf; 62676 // QSAX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1 62677 qsax(condition, Register(rd), Register(rn), Register(rm)); 62678 if (((instr & 0xff00ff0) != 0x6200f50)) { 62679 UnpredictableA32(instr); 62680 } 62681 break; 62682 } 62683 case 0x00100000: { 62684 // 0x06300050 62685 if (((instr & 0xf0000000) == 0xf0000000)) { 62686 UnallocatedA32(instr); 62687 return; 62688 } 62689 Condition condition((instr >> 28) & 0xf); 62690 unsigned rd = (instr >> 12) & 0xf; 62691 unsigned rn = (instr >> 16) & 0xf; 62692 unsigned rm = instr & 0xf; 62693 // SHSAX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1 62694 shsax(condition, Register(rd), Register(rn), Register(rm)); 62695 if (((instr & 0xff00ff0) != 0x6300f50)) { 62696 UnpredictableA32(instr); 62697 } 62698 break; 62699 } 62700 default: 62701 UnallocatedA32(instr); 62702 break; 62703 } 62704 break; 62705 } 62706 case 0x00000060: { 62707 // 0x06200070 62708 switch (instr & 0x00100080) { 62709 case 0x00000000: { 62710 // 0x06200070 62711 if (((instr & 0xf0000000) == 0xf0000000)) { 62712 UnallocatedA32(instr); 62713 return; 62714 } 62715 Condition condition((instr >> 28) & 0xf); 62716 unsigned rd = (instr >> 12) & 0xf; 62717 unsigned rn = (instr >> 16) & 0xf; 62718 unsigned rm = instr & 0xf; 62719 // QSUB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1 62720 qsub16(condition, Register(rd), Register(rn), Register(rm)); 62721 if (((instr & 0xff00ff0) != 0x6200f70)) { 62722 UnpredictableA32(instr); 62723 } 62724 break; 62725 } 62726 case 0x00000080: { 62727 // 0x062000f0 62728 if (((instr & 0xf0000000) == 0xf0000000)) { 62729 UnallocatedA32(instr); 62730 return; 62731 } 62732 Condition condition((instr >> 28) & 0xf); 62733 unsigned rd = (instr >> 12) & 0xf; 62734 unsigned rn = (instr >> 16) & 0xf; 62735 unsigned rm = instr & 0xf; 62736 // QSUB8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1 62737 qsub8(condition, Register(rd), Register(rn), Register(rm)); 62738 if (((instr & 0xff00ff0) != 0x6200ff0)) { 62739 UnpredictableA32(instr); 62740 } 62741 break; 62742 } 62743 case 0x00100000: { 62744 // 0x06300070 62745 if (((instr & 0xf0000000) == 0xf0000000)) { 62746 UnallocatedA32(instr); 62747 return; 62748 } 62749 Condition condition((instr >> 28) & 0xf); 62750 unsigned rd = (instr >> 12) & 0xf; 62751 unsigned rn = (instr >> 16) & 0xf; 62752 unsigned rm = instr & 0xf; 62753 // SHSUB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1 62754 shsub16(condition, 62755 Register(rd), 62756 Register(rn), 62757 Register(rm)); 62758 if (((instr & 0xff00ff0) != 0x6300f70)) { 62759 UnpredictableA32(instr); 62760 } 62761 break; 62762 } 62763 case 0x00100080: { 62764 // 0x063000f0 62765 if (((instr & 0xf0000000) == 0xf0000000)) { 62766 UnallocatedA32(instr); 62767 return; 62768 } 62769 Condition condition((instr >> 28) & 0xf); 62770 unsigned rd = (instr >> 12) & 0xf; 62771 unsigned rn = (instr >> 16) & 0xf; 62772 unsigned rm = instr & 0xf; 62773 // SHSUB8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1 62774 shsub8(condition, Register(rd), Register(rn), Register(rm)); 62775 if (((instr & 0xff00ff0) != 0x6300ff0)) { 62776 UnpredictableA32(instr); 62777 } 62778 break; 62779 } 62780 } 62781 break; 62782 } 62783 case 0x00800000: { 62784 // 0x06a00010 62785 if (((instr & 0xf0000000) == 0xf0000000)) { 62786 UnallocatedA32(instr); 62787 return; 62788 } 62789 Condition condition((instr >> 28) & 0xf); 62790 unsigned rd = (instr >> 12) & 0xf; 62791 uint32_t imm = ((instr >> 16) & 0x1f) + 1; 62792 unsigned rn = instr & 0xf; 62793 uint32_t amount = (instr >> 7) & 0x1f; 62794 // SSAT{<c>}{<q>} <Rd>, #<imm>, <Rn> {, LSL #<amount> } ; A1 62795 ssat(condition, 62796 Register(rd), 62797 imm, 62798 Operand(Register(rn), LSL, amount)); 62799 break; 62800 } 62801 case 0x00800020: { 62802 // 0x06a00030 62803 switch (instr & 0x00100080) { 62804 case 0x00000000: { 62805 // 0x06a00030 62806 if (((instr & 0xf0000000) == 0xf0000000)) { 62807 UnallocatedA32(instr); 62808 return; 62809 } 62810 Condition condition((instr >> 28) & 0xf); 62811 unsigned rd = (instr >> 12) & 0xf; 62812 uint32_t imm = ((instr >> 16) & 0xf) + 1; 62813 unsigned rn = instr & 0xf; 62814 // SSAT16{<c>}{<q>} <Rd>, #<imm>, <Rn> ; A1 62815 ssat16(condition, Register(rd), imm, Register(rn)); 62816 if (((instr & 0xff00ff0) != 0x6a00f30)) { 62817 UnpredictableA32(instr); 62818 } 62819 break; 62820 } 62821 case 0x00100000: { 62822 // 0x06b00030 62823 if (((instr & 0xf0000000) == 0xf0000000)) { 62824 UnallocatedA32(instr); 62825 return; 62826 } 62827 Condition condition((instr >> 28) & 0xf); 62828 unsigned rd = (instr >> 12) & 0xf; 62829 unsigned rm = instr & 0xf; 62830 // REV{<c>}{<q>} <Rd>, <Rm> ; A1 62831 rev(condition, Best, Register(rd), Register(rm)); 62832 if (((instr & 0xfff0ff0) != 0x6bf0f30)) { 62833 UnpredictableA32(instr); 62834 } 62835 break; 62836 } 62837 case 0x00100080: { 62838 // 0x06b000b0 62839 if (((instr & 0xf0000000) == 0xf0000000)) { 62840 UnallocatedA32(instr); 62841 return; 62842 } 62843 Condition condition((instr >> 28) & 0xf); 62844 unsigned rd = (instr >> 12) & 0xf; 62845 unsigned rm = instr & 0xf; 62846 // REV16{<c>}{<q>} <Rd>, <Rm> ; A1 62847 rev16(condition, Best, Register(rd), Register(rm)); 62848 if (((instr & 0xfff0ff0) != 0x6bf0fb0)) { 62849 UnpredictableA32(instr); 62850 } 62851 break; 62852 } 62853 default: 62854 UnallocatedA32(instr); 62855 break; 62856 } 62857 break; 62858 } 62859 case 0x00800040: { 62860 // 0x06a00050 62861 if (((instr & 0xf0000000) == 0xf0000000)) { 62862 UnallocatedA32(instr); 62863 return; 62864 } 62865 Condition condition((instr >> 28) & 0xf); 62866 unsigned rd = (instr >> 12) & 0xf; 62867 uint32_t imm = ((instr >> 16) & 0x1f) + 1; 62868 unsigned rn = instr & 0xf; 62869 uint32_t amount = (instr >> 7) & 0x1f; 62870 if (amount == 0) amount = 32; 62871 // SSAT{<c>}{<q>} <Rd>, #<imm>, <Rn>, ASR #<amount> ; A1 62872 ssat(condition, 62873 Register(rd), 62874 imm, 62875 Operand(Register(rn), ASR, amount)); 62876 break; 62877 } 62878 case 0x00800060: { 62879 // 0x06a00070 62880 switch (instr & 0x00100080) { 62881 case 0x00000000: { 62882 // 0x06a00070 62883 switch (instr & 0x000f0000) { 62884 case 0x000f0000: { 62885 // 0x06af0070 62886 if (((instr & 0xf0000000) == 0xf0000000)) { 62887 UnallocatedA32(instr); 62888 return; 62889 } 62890 Condition condition((instr >> 28) & 0xf); 62891 unsigned rd = (instr >> 12) & 0xf; 62892 unsigned rm = instr & 0xf; 62893 uint32_t amount = ((instr >> 10) & 0x3) * 8; 62894 // SXTB{<c>}{<q>} {<Rd>}, <Rm> {, ROR #<amount> } ; A1 62895 sxtb(condition, 62896 Best, 62897 Register(rd), 62898 Operand(Register(rm), ROR, amount)); 62899 if (((instr & 0xfff03f0) != 0x6af0070)) { 62900 UnpredictableA32(instr); 62901 } 62902 break; 62903 } 62904 default: { 62905 if (((instr & 0xf0000000) == 0xf0000000) || 62906 ((instr & 0xf0000) == 0xf0000)) { 62907 UnallocatedA32(instr); 62908 return; 62909 } 62910 Condition condition((instr >> 28) & 0xf); 62911 unsigned rd = (instr >> 12) & 0xf; 62912 unsigned rn = (instr >> 16) & 0xf; 62913 unsigned rm = instr & 0xf; 62914 uint32_t amount = ((instr >> 10) & 0x3) * 8; 62915 // SXTAB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, ROR #<amount> } ; A1 NOLINT(whitespace/line_length) 62916 sxtab(condition, 62917 Register(rd), 62918 Register(rn), 62919 Operand(Register(rm), ROR, amount)); 62920 if (((instr & 0xff003f0) != 0x6a00070)) { 62921 UnpredictableA32(instr); 62922 } 62923 break; 62924 } 62925 } 62926 break; 62927 } 62928 case 0x00100000: { 62929 // 0x06b00070 62930 switch (instr & 0x000f0000) { 62931 case 0x000f0000: { 62932 // 0x06bf0070 62933 if (((instr & 0xf0000000) == 0xf0000000)) { 62934 UnallocatedA32(instr); 62935 return; 62936 } 62937 Condition condition((instr >> 28) & 0xf); 62938 unsigned rd = (instr >> 12) & 0xf; 62939 unsigned rm = instr & 0xf; 62940 uint32_t amount = ((instr >> 10) & 0x3) * 8; 62941 // SXTH{<c>}{<q>} {<Rd>}, <Rm> {, ROR #<amount> } ; A1 62942 sxth(condition, 62943 Best, 62944 Register(rd), 62945 Operand(Register(rm), ROR, amount)); 62946 if (((instr & 0xfff03f0) != 0x6bf0070)) { 62947 UnpredictableA32(instr); 62948 } 62949 break; 62950 } 62951 default: { 62952 if (((instr & 0xf0000000) == 0xf0000000) || 62953 ((instr & 0xf0000) == 0xf0000)) { 62954 UnallocatedA32(instr); 62955 return; 62956 } 62957 Condition condition((instr >> 28) & 0xf); 62958 unsigned rd = (instr >> 12) & 0xf; 62959 unsigned rn = (instr >> 16) & 0xf; 62960 unsigned rm = instr & 0xf; 62961 uint32_t amount = ((instr >> 10) & 0x3) * 8; 62962 // SXTAH{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, ROR #<amount> } ; A1 NOLINT(whitespace/line_length) 62963 sxtah(condition, 62964 Register(rd), 62965 Register(rn), 62966 Operand(Register(rm), ROR, amount)); 62967 if (((instr & 0xff003f0) != 0x6b00070)) { 62968 UnpredictableA32(instr); 62969 } 62970 break; 62971 } 62972 } 62973 break; 62974 } 62975 default: 62976 UnallocatedA32(instr); 62977 break; 62978 } 62979 break; 62980 } 62981 } 62982 break; 62983 } 62984 case 0x00400000: { 62985 // 0x06400000 62986 switch (instr & 0x00100000) { 62987 case 0x00000000: { 62988 // 0x06400000 62989 if (((instr & 0xf0000000) == 0xf0000000)) { 62990 UnallocatedA32(instr); 62991 return; 62992 } 62993 Condition condition((instr >> 28) & 0xf); 62994 unsigned rt = (instr >> 12) & 0xf; 62995 unsigned rn = (instr >> 16) & 0xf; 62996 Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus); 62997 unsigned rm = instr & 0xf; 62998 uint32_t imm_and_type_ = ((instr >> 5) & 0x7f); 62999 ImmediateShiftOperand shift_operand(imm_and_type_ & 0x3, 63000 (imm_and_type_ & 0x7c) >> 63001 2); 63002 Shift shift = shift_operand.GetShift(); 63003 uint32_t amount = shift_operand.GetAmount(); 63004 // STRB{<c>}{<q>} <Rt>, [<Rn>], {+/-}<Rm>{, <shift>} ; A1 63005 strb(condition, 63006 Best, 63007 Register(rt), 63008 MemOperand(Register(rn), 63009 sign, 63010 Register(rm), 63011 shift, 63012 amount, 63013 PostIndex)); 63014 break; 63015 } 63016 case 0x00100000: { 63017 // 0x06500000 63018 if (((instr & 0xf0000000) == 0xf0000000)) { 63019 UnallocatedA32(instr); 63020 return; 63021 } 63022 Condition condition((instr >> 28) & 0xf); 63023 unsigned rt = (instr >> 12) & 0xf; 63024 unsigned rn = (instr >> 16) & 0xf; 63025 Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus); 63026 unsigned rm = instr & 0xf; 63027 uint32_t imm_and_type_ = ((instr >> 5) & 0x7f); 63028 ImmediateShiftOperand shift_operand(imm_and_type_ & 0x3, 63029 (imm_and_type_ & 0x7c) >> 63030 2); 63031 Shift shift = shift_operand.GetShift(); 63032 uint32_t amount = shift_operand.GetAmount(); 63033 // LDRB{<c>}{<q>} <Rt>, [<Rn>], {+/-}<Rm>{, <shift>} ; A1 63034 ldrb(condition, 63035 Best, 63036 Register(rt), 63037 MemOperand(Register(rn), 63038 sign, 63039 Register(rm), 63040 shift, 63041 amount, 63042 PostIndex)); 63043 break; 63044 } 63045 } 63046 break; 63047 } 63048 case 0x00400010: { 63049 // 0x06400010 63050 switch (instr & 0x009000e0) { 63051 case 0x00100000: { 63052 // 0x06500010 63053 if (((instr & 0xf0000000) == 0xf0000000)) { 63054 UnallocatedA32(instr); 63055 return; 63056 } 63057 Condition condition((instr >> 28) & 0xf); 63058 unsigned rd = (instr >> 12) & 0xf; 63059 unsigned rn = (instr >> 16) & 0xf; 63060 unsigned rm = instr & 0xf; 63061 // UADD16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1 63062 uadd16(condition, Register(rd), Register(rn), Register(rm)); 63063 if (((instr & 0xff00ff0) != 0x6500f10)) { 63064 UnpredictableA32(instr); 63065 } 63066 break; 63067 } 63068 case 0x00100020: { 63069 // 0x06500030 63070 if (((instr & 0xf0000000) == 0xf0000000)) { 63071 UnallocatedA32(instr); 63072 return; 63073 } 63074 Condition condition((instr >> 28) & 0xf); 63075 unsigned rd = (instr >> 12) & 0xf; 63076 unsigned rn = (instr >> 16) & 0xf; 63077 unsigned rm = instr & 0xf; 63078 // UASX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1 63079 uasx(condition, Register(rd), Register(rn), Register(rm)); 63080 if (((instr & 0xff00ff0) != 0x6500f30)) { 63081 UnpredictableA32(instr); 63082 } 63083 break; 63084 } 63085 case 0x00100040: { 63086 // 0x06500050 63087 if (((instr & 0xf0000000) == 0xf0000000)) { 63088 UnallocatedA32(instr); 63089 return; 63090 } 63091 Condition condition((instr >> 28) & 0xf); 63092 unsigned rd = (instr >> 12) & 0xf; 63093 unsigned rn = (instr >> 16) & 0xf; 63094 unsigned rm = instr & 0xf; 63095 // USAX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1 63096 usax(condition, Register(rd), Register(rn), Register(rm)); 63097 if (((instr & 0xff00ff0) != 0x6500f50)) { 63098 UnpredictableA32(instr); 63099 } 63100 break; 63101 } 63102 case 0x00100060: { 63103 // 0x06500070 63104 if (((instr & 0xf0000000) == 0xf0000000)) { 63105 UnallocatedA32(instr); 63106 return; 63107 } 63108 Condition condition((instr >> 28) & 0xf); 63109 unsigned rd = (instr >> 12) & 0xf; 63110 unsigned rn = (instr >> 16) & 0xf; 63111 unsigned rm = instr & 0xf; 63112 // USUB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1 63113 usub16(condition, Register(rd), Register(rn), Register(rm)); 63114 if (((instr & 0xff00ff0) != 0x6500f70)) { 63115 UnpredictableA32(instr); 63116 } 63117 break; 63118 } 63119 case 0x00100080: { 63120 // 0x06500090 63121 if (((instr & 0xf0000000) == 0xf0000000)) { 63122 UnallocatedA32(instr); 63123 return; 63124 } 63125 Condition condition((instr >> 28) & 0xf); 63126 unsigned rd = (instr >> 12) & 0xf; 63127 unsigned rn = (instr >> 16) & 0xf; 63128 unsigned rm = instr & 0xf; 63129 // UADD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1 63130 uadd8(condition, Register(rd), Register(rn), Register(rm)); 63131 if (((instr & 0xff00ff0) != 0x6500f90)) { 63132 UnpredictableA32(instr); 63133 } 63134 break; 63135 } 63136 case 0x001000e0: { 63137 // 0x065000f0 63138 if (((instr & 0xf0000000) == 0xf0000000)) { 63139 UnallocatedA32(instr); 63140 return; 63141 } 63142 Condition condition((instr >> 28) & 0xf); 63143 unsigned rd = (instr >> 12) & 0xf; 63144 unsigned rn = (instr >> 16) & 0xf; 63145 unsigned rm = instr & 0xf; 63146 // USUB8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1 63147 usub8(condition, Register(rd), Register(rn), Register(rm)); 63148 if (((instr & 0xff00ff0) != 0x6500ff0)) { 63149 UnpredictableA32(instr); 63150 } 63151 break; 63152 } 63153 case 0x00800060: { 63154 // 0x06c00070 63155 switch (instr & 0x000f0000) { 63156 case 0x000f0000: { 63157 // 0x06cf0070 63158 if (((instr & 0xf0000000) == 0xf0000000)) { 63159 UnallocatedA32(instr); 63160 return; 63161 } 63162 Condition condition((instr >> 28) & 0xf); 63163 unsigned rd = (instr >> 12) & 0xf; 63164 unsigned rm = instr & 0xf; 63165 uint32_t amount = ((instr >> 10) & 0x3) * 8; 63166 // UXTB16{<c>}{<q>} {<Rd>}, <Rm> {, ROR #<amount> } ; A1 63167 uxtb16(condition, 63168 Register(rd), 63169 Operand(Register(rm), ROR, amount)); 63170 if (((instr & 0xfff03f0) != 0x6cf0070)) { 63171 UnpredictableA32(instr); 63172 } 63173 break; 63174 } 63175 default: { 63176 if (((instr & 0xf0000000) == 0xf0000000) || 63177 ((instr & 0xf0000) == 0xf0000)) { 63178 UnallocatedA32(instr); 63179 return; 63180 } 63181 Condition condition((instr >> 28) & 0xf); 63182 unsigned rd = (instr >> 12) & 0xf; 63183 unsigned rn = (instr >> 16) & 0xf; 63184 unsigned rm = instr & 0xf; 63185 uint32_t amount = ((instr >> 10) & 0x3) * 8; 63186 // UXTAB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, ROR #<amount> } ; A1 NOLINT(whitespace/line_length) 63187 uxtab16(condition, 63188 Register(rd), 63189 Register(rn), 63190 Operand(Register(rm), ROR, amount)); 63191 if (((instr & 0xff003f0) != 0x6c00070)) { 63192 UnpredictableA32(instr); 63193 } 63194 break; 63195 } 63196 } 63197 break; 63198 } 63199 default: 63200 UnallocatedA32(instr); 63201 break; 63202 } 63203 break; 63204 } 63205 case 0x00600000: { 63206 // 0x06600000 63207 switch (instr & 0x00100000) { 63208 case 0x00000000: { 63209 // 0x06600000 63210 if (((instr & 0xf0000000) == 0xf0000000)) { 63211 UnallocatedA32(instr); 63212 return; 63213 } 63214 UnimplementedA32("STRBT", instr); 63215 break; 63216 } 63217 case 0x00100000: { 63218 // 0x06700000 63219 if (((instr & 0xf0000000) == 0xf0000000)) { 63220 UnallocatedA32(instr); 63221 return; 63222 } 63223 UnimplementedA32("LDRBT", instr); 63224 break; 63225 } 63226 } 63227 break; 63228 } 63229 case 0x00600010: { 63230 // 0x06600010 63231 switch (instr & 0x00800060) { 63232 case 0x00000000: { 63233 // 0x06600010 63234 switch (instr & 0x00100080) { 63235 case 0x00000000: { 63236 // 0x06600010 63237 if (((instr & 0xf0000000) == 0xf0000000)) { 63238 UnallocatedA32(instr); 63239 return; 63240 } 63241 Condition condition((instr >> 28) & 0xf); 63242 unsigned rd = (instr >> 12) & 0xf; 63243 unsigned rn = (instr >> 16) & 0xf; 63244 unsigned rm = instr & 0xf; 63245 // UQADD16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1 63246 uqadd16(condition, 63247 Register(rd), 63248 Register(rn), 63249 Register(rm)); 63250 if (((instr & 0xff00ff0) != 0x6600f10)) { 63251 UnpredictableA32(instr); 63252 } 63253 break; 63254 } 63255 case 0x00000080: { 63256 // 0x06600090 63257 if (((instr & 0xf0000000) == 0xf0000000)) { 63258 UnallocatedA32(instr); 63259 return; 63260 } 63261 Condition condition((instr >> 28) & 0xf); 63262 unsigned rd = (instr >> 12) & 0xf; 63263 unsigned rn = (instr >> 16) & 0xf; 63264 unsigned rm = instr & 0xf; 63265 // UQADD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1 63266 uqadd8(condition, Register(rd), Register(rn), Register(rm)); 63267 if (((instr & 0xff00ff0) != 0x6600f90)) { 63268 UnpredictableA32(instr); 63269 } 63270 break; 63271 } 63272 case 0x00100000: { 63273 // 0x06700010 63274 if (((instr & 0xf0000000) == 0xf0000000)) { 63275 UnallocatedA32(instr); 63276 return; 63277 } 63278 Condition condition((instr >> 28) & 0xf); 63279 unsigned rd = (instr >> 12) & 0xf; 63280 unsigned rn = (instr >> 16) & 0xf; 63281 unsigned rm = instr & 0xf; 63282 // UHADD16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1 63283 uhadd16(condition, 63284 Register(rd), 63285 Register(rn), 63286 Register(rm)); 63287 if (((instr & 0xff00ff0) != 0x6700f10)) { 63288 UnpredictableA32(instr); 63289 } 63290 break; 63291 } 63292 case 0x00100080: { 63293 // 0x06700090 63294 if (((instr & 0xf0000000) == 0xf0000000)) { 63295 UnallocatedA32(instr); 63296 return; 63297 } 63298 Condition condition((instr >> 28) & 0xf); 63299 unsigned rd = (instr >> 12) & 0xf; 63300 unsigned rn = (instr >> 16) & 0xf; 63301 unsigned rm = instr & 0xf; 63302 // UHADD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1 63303 uhadd8(condition, Register(rd), Register(rn), Register(rm)); 63304 if (((instr & 0xff00ff0) != 0x6700f90)) { 63305 UnpredictableA32(instr); 63306 } 63307 break; 63308 } 63309 } 63310 break; 63311 } 63312 case 0x00000020: { 63313 // 0x06600030 63314 switch (instr & 0x00100080) { 63315 case 0x00000000: { 63316 // 0x06600030 63317 if (((instr & 0xf0000000) == 0xf0000000)) { 63318 UnallocatedA32(instr); 63319 return; 63320 } 63321 Condition condition((instr >> 28) & 0xf); 63322 unsigned rd = (instr >> 12) & 0xf; 63323 unsigned rn = (instr >> 16) & 0xf; 63324 unsigned rm = instr & 0xf; 63325 // UQASX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1 63326 uqasx(condition, Register(rd), Register(rn), Register(rm)); 63327 if (((instr & 0xff00ff0) != 0x6600f30)) { 63328 UnpredictableA32(instr); 63329 } 63330 break; 63331 } 63332 case 0x00100000: { 63333 // 0x06700030 63334 if (((instr & 0xf0000000) == 0xf0000000)) { 63335 UnallocatedA32(instr); 63336 return; 63337 } 63338 Condition condition((instr >> 28) & 0xf); 63339 unsigned rd = (instr >> 12) & 0xf; 63340 unsigned rn = (instr >> 16) & 0xf; 63341 unsigned rm = instr & 0xf; 63342 // UHASX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1 63343 uhasx(condition, Register(rd), Register(rn), Register(rm)); 63344 if (((instr & 0xff00ff0) != 0x6700f30)) { 63345 UnpredictableA32(instr); 63346 } 63347 break; 63348 } 63349 default: 63350 UnallocatedA32(instr); 63351 break; 63352 } 63353 break; 63354 } 63355 case 0x00000040: { 63356 // 0x06600050 63357 switch (instr & 0x00100080) { 63358 case 0x00000000: { 63359 // 0x06600050 63360 if (((instr & 0xf0000000) == 0xf0000000)) { 63361 UnallocatedA32(instr); 63362 return; 63363 } 63364 Condition condition((instr >> 28) & 0xf); 63365 unsigned rd = (instr >> 12) & 0xf; 63366 unsigned rn = (instr >> 16) & 0xf; 63367 unsigned rm = instr & 0xf; 63368 // UQSAX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1 63369 uqsax(condition, Register(rd), Register(rn), Register(rm)); 63370 if (((instr & 0xff00ff0) != 0x6600f50)) { 63371 UnpredictableA32(instr); 63372 } 63373 break; 63374 } 63375 case 0x00100000: { 63376 // 0x06700050 63377 if (((instr & 0xf0000000) == 0xf0000000)) { 63378 UnallocatedA32(instr); 63379 return; 63380 } 63381 Condition condition((instr >> 28) & 0xf); 63382 unsigned rd = (instr >> 12) & 0xf; 63383 unsigned rn = (instr >> 16) & 0xf; 63384 unsigned rm = instr & 0xf; 63385 // UHSAX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1 63386 uhsax(condition, Register(rd), Register(rn), Register(rm)); 63387 if (((instr & 0xff00ff0) != 0x6700f50)) { 63388 UnpredictableA32(instr); 63389 } 63390 break; 63391 } 63392 default: 63393 UnallocatedA32(instr); 63394 break; 63395 } 63396 break; 63397 } 63398 case 0x00000060: { 63399 // 0x06600070 63400 switch (instr & 0x00100080) { 63401 case 0x00000000: { 63402 // 0x06600070 63403 if (((instr & 0xf0000000) == 0xf0000000)) { 63404 UnallocatedA32(instr); 63405 return; 63406 } 63407 Condition condition((instr >> 28) & 0xf); 63408 unsigned rd = (instr >> 12) & 0xf; 63409 unsigned rn = (instr >> 16) & 0xf; 63410 unsigned rm = instr & 0xf; 63411 // UQSUB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1 63412 uqsub16(condition, 63413 Register(rd), 63414 Register(rn), 63415 Register(rm)); 63416 if (((instr & 0xff00ff0) != 0x6600f70)) { 63417 UnpredictableA32(instr); 63418 } 63419 break; 63420 } 63421 case 0x00000080: { 63422 // 0x066000f0 63423 if (((instr & 0xf0000000) == 0xf0000000)) { 63424 UnallocatedA32(instr); 63425 return; 63426 } 63427 Condition condition((instr >> 28) & 0xf); 63428 unsigned rd = (instr >> 12) & 0xf; 63429 unsigned rn = (instr >> 16) & 0xf; 63430 unsigned rm = instr & 0xf; 63431 // UQSUB8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1 63432 uqsub8(condition, Register(rd), Register(rn), Register(rm)); 63433 if (((instr & 0xff00ff0) != 0x6600ff0)) { 63434 UnpredictableA32(instr); 63435 } 63436 break; 63437 } 63438 case 0x00100000: { 63439 // 0x06700070 63440 if (((instr & 0xf0000000) == 0xf0000000)) { 63441 UnallocatedA32(instr); 63442 return; 63443 } 63444 Condition condition((instr >> 28) & 0xf); 63445 unsigned rd = (instr >> 12) & 0xf; 63446 unsigned rn = (instr >> 16) & 0xf; 63447 unsigned rm = instr & 0xf; 63448 // UHSUB16{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1 63449 uhsub16(condition, 63450 Register(rd), 63451 Register(rn), 63452 Register(rm)); 63453 if (((instr & 0xff00ff0) != 0x6700f70)) { 63454 UnpredictableA32(instr); 63455 } 63456 break; 63457 } 63458 case 0x00100080: { 63459 // 0x067000f0 63460 if (((instr & 0xf0000000) == 0xf0000000)) { 63461 UnallocatedA32(instr); 63462 return; 63463 } 63464 Condition condition((instr >> 28) & 0xf); 63465 unsigned rd = (instr >> 12) & 0xf; 63466 unsigned rn = (instr >> 16) & 0xf; 63467 unsigned rm = instr & 0xf; 63468 // UHSUB8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1 63469 uhsub8(condition, Register(rd), Register(rn), Register(rm)); 63470 if (((instr & 0xff00ff0) != 0x6700ff0)) { 63471 UnpredictableA32(instr); 63472 } 63473 break; 63474 } 63475 } 63476 break; 63477 } 63478 case 0x00800000: { 63479 // 0x06e00010 63480 if (((instr & 0xf0000000) == 0xf0000000)) { 63481 UnallocatedA32(instr); 63482 return; 63483 } 63484 Condition condition((instr >> 28) & 0xf); 63485 unsigned rd = (instr >> 12) & 0xf; 63486 uint32_t imm = (instr >> 16) & 0x1f; 63487 unsigned rn = instr & 0xf; 63488 uint32_t amount = (instr >> 7) & 0x1f; 63489 // USAT{<c>}{<q>} <Rd>, #<imm>, <Rn> {, LSL #<amount> } ; A1 63490 usat(condition, 63491 Register(rd), 63492 imm, 63493 Operand(Register(rn), LSL, amount)); 63494 break; 63495 } 63496 case 0x00800020: { 63497 // 0x06e00030 63498 switch (instr & 0x00100080) { 63499 case 0x00000000: { 63500 // 0x06e00030 63501 if (((instr & 0xf0000000) == 0xf0000000)) { 63502 UnallocatedA32(instr); 63503 return; 63504 } 63505 Condition condition((instr >> 28) & 0xf); 63506 unsigned rd = (instr >> 12) & 0xf; 63507 uint32_t imm = (instr >> 16) & 0xf; 63508 unsigned rn = instr & 0xf; 63509 // USAT16{<c>}{<q>} <Rd>, #<imm>, <Rn> ; A1 63510 usat16(condition, Register(rd), imm, Register(rn)); 63511 if (((instr & 0xff00ff0) != 0x6e00f30)) { 63512 UnpredictableA32(instr); 63513 } 63514 break; 63515 } 63516 case 0x00100000: { 63517 // 0x06f00030 63518 if (((instr & 0xf0000000) == 0xf0000000)) { 63519 UnallocatedA32(instr); 63520 return; 63521 } 63522 Condition condition((instr >> 28) & 0xf); 63523 unsigned rd = (instr >> 12) & 0xf; 63524 unsigned rm = instr & 0xf; 63525 // RBIT{<c>}{<q>} <Rd>, <Rm> ; A1 63526 rbit(condition, Register(rd), Register(rm)); 63527 if (((instr & 0xfff0ff0) != 0x6ff0f30)) { 63528 UnpredictableA32(instr); 63529 } 63530 break; 63531 } 63532 case 0x00100080: { 63533 // 0x06f000b0 63534 if (((instr & 0xf0000000) == 0xf0000000)) { 63535 UnallocatedA32(instr); 63536 return; 63537 } 63538 Condition condition((instr >> 28) & 0xf); 63539 unsigned rd = (instr >> 12) & 0xf; 63540 unsigned rm = instr & 0xf; 63541 // REVSH{<c>}{<q>} <Rd>, <Rm> ; A1 63542 revsh(condition, Best, Register(rd), Register(rm)); 63543 if (((instr & 0xfff0ff0) != 0x6ff0fb0)) { 63544 UnpredictableA32(instr); 63545 } 63546 break; 63547 } 63548 default: 63549 UnallocatedA32(instr); 63550 break; 63551 } 63552 break; 63553 } 63554 case 0x00800040: { 63555 // 0x06e00050 63556 if (((instr & 0xf0000000) == 0xf0000000)) { 63557 UnallocatedA32(instr); 63558 return; 63559 } 63560 Condition condition((instr >> 28) & 0xf); 63561 unsigned rd = (instr >> 12) & 0xf; 63562 uint32_t imm = (instr >> 16) & 0x1f; 63563 unsigned rn = instr & 0xf; 63564 uint32_t amount = (instr >> 7) & 0x1f; 63565 if (amount == 0) amount = 32; 63566 // USAT{<c>}{<q>} <Rd>, #<imm>, <Rn>, ASR #<amount> ; A1 63567 usat(condition, 63568 Register(rd), 63569 imm, 63570 Operand(Register(rn), ASR, amount)); 63571 break; 63572 } 63573 case 0x00800060: { 63574 // 0x06e00070 63575 switch (instr & 0x00100080) { 63576 case 0x00000000: { 63577 // 0x06e00070 63578 switch (instr & 0x000f0000) { 63579 case 0x000f0000: { 63580 // 0x06ef0070 63581 if (((instr & 0xf0000000) == 0xf0000000)) { 63582 UnallocatedA32(instr); 63583 return; 63584 } 63585 Condition condition((instr >> 28) & 0xf); 63586 unsigned rd = (instr >> 12) & 0xf; 63587 unsigned rm = instr & 0xf; 63588 uint32_t amount = ((instr >> 10) & 0x3) * 8; 63589 // UXTB{<c>}{<q>} {<Rd>}, <Rm> {, ROR #<amount> } ; A1 63590 uxtb(condition, 63591 Best, 63592 Register(rd), 63593 Operand(Register(rm), ROR, amount)); 63594 if (((instr & 0xfff03f0) != 0x6ef0070)) { 63595 UnpredictableA32(instr); 63596 } 63597 break; 63598 } 63599 default: { 63600 if (((instr & 0xf0000000) == 0xf0000000) || 63601 ((instr & 0xf0000) == 0xf0000)) { 63602 UnallocatedA32(instr); 63603 return; 63604 } 63605 Condition condition((instr >> 28) & 0xf); 63606 unsigned rd = (instr >> 12) & 0xf; 63607 unsigned rn = (instr >> 16) & 0xf; 63608 unsigned rm = instr & 0xf; 63609 uint32_t amount = ((instr >> 10) & 0x3) * 8; 63610 // UXTAB{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, ROR #<amount> } ; A1 NOLINT(whitespace/line_length) 63611 uxtab(condition, 63612 Register(rd), 63613 Register(rn), 63614 Operand(Register(rm), ROR, amount)); 63615 if (((instr & 0xff003f0) != 0x6e00070)) { 63616 UnpredictableA32(instr); 63617 } 63618 break; 63619 } 63620 } 63621 break; 63622 } 63623 case 0x00100000: { 63624 // 0x06f00070 63625 switch (instr & 0x000f0000) { 63626 case 0x000f0000: { 63627 // 0x06ff0070 63628 if (((instr & 0xf0000000) == 0xf0000000)) { 63629 UnallocatedA32(instr); 63630 return; 63631 } 63632 Condition condition((instr >> 28) & 0xf); 63633 unsigned rd = (instr >> 12) & 0xf; 63634 unsigned rm = instr & 0xf; 63635 uint32_t amount = ((instr >> 10) & 0x3) * 8; 63636 // UXTH{<c>}{<q>} {<Rd>}, <Rm> {, ROR #<amount> } ; A1 63637 uxth(condition, 63638 Best, 63639 Register(rd), 63640 Operand(Register(rm), ROR, amount)); 63641 if (((instr & 0xfff03f0) != 0x6ff0070)) { 63642 UnpredictableA32(instr); 63643 } 63644 break; 63645 } 63646 default: { 63647 if (((instr & 0xf0000000) == 0xf0000000) || 63648 ((instr & 0xf0000) == 0xf0000)) { 63649 UnallocatedA32(instr); 63650 return; 63651 } 63652 Condition condition((instr >> 28) & 0xf); 63653 unsigned rd = (instr >> 12) & 0xf; 63654 unsigned rn = (instr >> 16) & 0xf; 63655 unsigned rm = instr & 0xf; 63656 uint32_t amount = ((instr >> 10) & 0x3) * 8; 63657 // UXTAH{<c>}{<q>} {<Rd>}, <Rn>, <Rm> {, ROR #<amount> } ; A1 NOLINT(whitespace/line_length) 63658 uxtah(condition, 63659 Register(rd), 63660 Register(rn), 63661 Operand(Register(rm), ROR, amount)); 63662 if (((instr & 0xff003f0) != 0x6f00070)) { 63663 UnpredictableA32(instr); 63664 } 63665 break; 63666 } 63667 } 63668 break; 63669 } 63670 default: 63671 UnallocatedA32(instr); 63672 break; 63673 } 63674 break; 63675 } 63676 } 63677 break; 63678 } 63679 case 0x01000000: { 63680 // 0x07000000 63681 switch (instr & 0x00100000) { 63682 case 0x00000000: { 63683 // 0x07000000 63684 if (((instr & 0xf0000000) == 0xf0000000)) { 63685 UnallocatedA32(instr); 63686 return; 63687 } 63688 Condition condition((instr >> 28) & 0xf); 63689 unsigned rt = (instr >> 12) & 0xf; 63690 unsigned rn = (instr >> 16) & 0xf; 63691 Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus); 63692 unsigned rm = instr & 0xf; 63693 uint32_t imm_and_type_ = ((instr >> 5) & 0x7f); 63694 ImmediateShiftOperand shift_operand(imm_and_type_ & 0x3, 63695 (imm_and_type_ & 0x7c) >> 63696 2); 63697 Shift shift = shift_operand.GetShift(); 63698 uint32_t amount = shift_operand.GetAmount(); 63699 AddrMode addrmode = Offset; 63700 // STR{<c>}{<q>} <Rt>, [<Rn>, {+/-}<Rm>{, <shift>}] ; A1 63701 str(condition, 63702 Best, 63703 Register(rt), 63704 MemOperand(Register(rn), 63705 sign, 63706 Register(rm), 63707 shift, 63708 amount, 63709 addrmode)); 63710 break; 63711 } 63712 case 0x00100000: { 63713 // 0x07100000 63714 if (((instr & 0xf0000000) == 0xf0000000)) { 63715 UnallocatedA32(instr); 63716 return; 63717 } 63718 Condition condition((instr >> 28) & 0xf); 63719 unsigned rt = (instr >> 12) & 0xf; 63720 unsigned rn = (instr >> 16) & 0xf; 63721 Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus); 63722 unsigned rm = instr & 0xf; 63723 uint32_t imm_and_type_ = ((instr >> 5) & 0x7f); 63724 ImmediateShiftOperand shift_operand(imm_and_type_ & 0x3, 63725 (imm_and_type_ & 0x7c) >> 63726 2); 63727 Shift shift = shift_operand.GetShift(); 63728 uint32_t amount = shift_operand.GetAmount(); 63729 AddrMode addrmode = Offset; 63730 // LDR{<c>}{<q>} <Rt>, [<Rn>, {+/-}<Rm>{, <shift>}] ; A1 63731 ldr(condition, 63732 Best, 63733 Register(rt), 63734 MemOperand(Register(rn), 63735 sign, 63736 Register(rm), 63737 shift, 63738 amount, 63739 addrmode)); 63740 break; 63741 } 63742 } 63743 break; 63744 } 63745 case 0x01000010: { 63746 // 0x07000010 63747 switch (instr & 0x009000e0) { 63748 case 0x00000000: { 63749 // 0x07000010 63750 switch (instr & 0x0000f000) { 63751 case 0x0000f000: { 63752 // 0x0700f010 63753 if (((instr & 0xf0000000) == 0xf0000000)) { 63754 UnallocatedA32(instr); 63755 return; 63756 } 63757 Condition condition((instr >> 28) & 0xf); 63758 unsigned rd = (instr >> 16) & 0xf; 63759 unsigned rn = instr & 0xf; 63760 unsigned rm = (instr >> 8) & 0xf; 63761 // SMUAD{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1 63762 smuad(condition, Register(rd), Register(rn), Register(rm)); 63763 break; 63764 } 63765 default: { 63766 if (((instr & 0xf0000000) == 0xf0000000) || 63767 ((instr & 0xf000) == 0xf000)) { 63768 UnallocatedA32(instr); 63769 return; 63770 } 63771 Condition condition((instr >> 28) & 0xf); 63772 unsigned rd = (instr >> 16) & 0xf; 63773 unsigned rn = instr & 0xf; 63774 unsigned rm = (instr >> 8) & 0xf; 63775 unsigned ra = (instr >> 12) & 0xf; 63776 // SMLAD{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1 63777 smlad(condition, 63778 Register(rd), 63779 Register(rn), 63780 Register(rm), 63781 Register(ra)); 63782 break; 63783 } 63784 } 63785 break; 63786 } 63787 case 0x00000020: { 63788 // 0x07000030 63789 switch (instr & 0x0000f000) { 63790 case 0x0000f000: { 63791 // 0x0700f030 63792 if (((instr & 0xf0000000) == 0xf0000000)) { 63793 UnallocatedA32(instr); 63794 return; 63795 } 63796 Condition condition((instr >> 28) & 0xf); 63797 unsigned rd = (instr >> 16) & 0xf; 63798 unsigned rn = instr & 0xf; 63799 unsigned rm = (instr >> 8) & 0xf; 63800 // SMUADX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1 63801 smuadx(condition, Register(rd), Register(rn), Register(rm)); 63802 break; 63803 } 63804 default: { 63805 if (((instr & 0xf0000000) == 0xf0000000) || 63806 ((instr & 0xf000) == 0xf000)) { 63807 UnallocatedA32(instr); 63808 return; 63809 } 63810 Condition condition((instr >> 28) & 0xf); 63811 unsigned rd = (instr >> 16) & 0xf; 63812 unsigned rn = instr & 0xf; 63813 unsigned rm = (instr >> 8) & 0xf; 63814 unsigned ra = (instr >> 12) & 0xf; 63815 // SMLADX{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1 63816 smladx(condition, 63817 Register(rd), 63818 Register(rn), 63819 Register(rm), 63820 Register(ra)); 63821 break; 63822 } 63823 } 63824 break; 63825 } 63826 case 0x00000040: { 63827 // 0x07000050 63828 switch (instr & 0x0000f000) { 63829 case 0x0000f000: { 63830 // 0x0700f050 63831 if (((instr & 0xf0000000) == 0xf0000000)) { 63832 UnallocatedA32(instr); 63833 return; 63834 } 63835 Condition condition((instr >> 28) & 0xf); 63836 unsigned rd = (instr >> 16) & 0xf; 63837 unsigned rn = instr & 0xf; 63838 unsigned rm = (instr >> 8) & 0xf; 63839 // SMUSD{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1 63840 smusd(condition, Register(rd), Register(rn), Register(rm)); 63841 break; 63842 } 63843 default: { 63844 if (((instr & 0xf0000000) == 0xf0000000) || 63845 ((instr & 0xf000) == 0xf000)) { 63846 UnallocatedA32(instr); 63847 return; 63848 } 63849 Condition condition((instr >> 28) & 0xf); 63850 unsigned rd = (instr >> 16) & 0xf; 63851 unsigned rn = instr & 0xf; 63852 unsigned rm = (instr >> 8) & 0xf; 63853 unsigned ra = (instr >> 12) & 0xf; 63854 // SMLSD{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1 63855 smlsd(condition, 63856 Register(rd), 63857 Register(rn), 63858 Register(rm), 63859 Register(ra)); 63860 break; 63861 } 63862 } 63863 break; 63864 } 63865 case 0x00000060: { 63866 // 0x07000070 63867 switch (instr & 0x0000f000) { 63868 case 0x0000f000: { 63869 // 0x0700f070 63870 if (((instr & 0xf0000000) == 0xf0000000)) { 63871 UnallocatedA32(instr); 63872 return; 63873 } 63874 Condition condition((instr >> 28) & 0xf); 63875 unsigned rd = (instr >> 16) & 0xf; 63876 unsigned rn = instr & 0xf; 63877 unsigned rm = (instr >> 8) & 0xf; 63878 // SMUSDX{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1 63879 smusdx(condition, Register(rd), Register(rn), Register(rm)); 63880 break; 63881 } 63882 default: { 63883 if (((instr & 0xf0000000) == 0xf0000000) || 63884 ((instr & 0xf000) == 0xf000)) { 63885 UnallocatedA32(instr); 63886 return; 63887 } 63888 Condition condition((instr >> 28) & 0xf); 63889 unsigned rd = (instr >> 16) & 0xf; 63890 unsigned rn = instr & 0xf; 63891 unsigned rm = (instr >> 8) & 0xf; 63892 unsigned ra = (instr >> 12) & 0xf; 63893 // SMLSDX{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1 63894 smlsdx(condition, 63895 Register(rd), 63896 Register(rn), 63897 Register(rm), 63898 Register(ra)); 63899 break; 63900 } 63901 } 63902 break; 63903 } 63904 case 0x00100000: { 63905 // 0x07100010 63906 if (((instr & 0xf0000000) == 0xf0000000)) { 63907 UnallocatedA32(instr); 63908 return; 63909 } 63910 Condition condition((instr >> 28) & 0xf); 63911 unsigned rd = (instr >> 16) & 0xf; 63912 unsigned rn = instr & 0xf; 63913 unsigned rm = (instr >> 8) & 0xf; 63914 // SDIV{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1 63915 sdiv(condition, Register(rd), Register(rn), Register(rm)); 63916 if (((instr & 0xff0f0f0) != 0x710f010)) { 63917 UnpredictableA32(instr); 63918 } 63919 break; 63920 } 63921 case 0x00800000: { 63922 // 0x07800010 63923 switch (instr & 0x0000f000) { 63924 case 0x0000f000: { 63925 // 0x0780f010 63926 if (((instr & 0xf0000000) == 0xf0000000)) { 63927 UnallocatedA32(instr); 63928 return; 63929 } 63930 Condition condition((instr >> 28) & 0xf); 63931 unsigned rd = (instr >> 16) & 0xf; 63932 unsigned rn = instr & 0xf; 63933 unsigned rm = (instr >> 8) & 0xf; 63934 // USAD8{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1 63935 usad8(condition, Register(rd), Register(rn), Register(rm)); 63936 break; 63937 } 63938 default: { 63939 if (((instr & 0xf0000000) == 0xf0000000) || 63940 ((instr & 0xf000) == 0xf000)) { 63941 UnallocatedA32(instr); 63942 return; 63943 } 63944 Condition condition((instr >> 28) & 0xf); 63945 unsigned rd = (instr >> 16) & 0xf; 63946 unsigned rn = instr & 0xf; 63947 unsigned rm = (instr >> 8) & 0xf; 63948 unsigned ra = (instr >> 12) & 0xf; 63949 // USADA8{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1 63950 usada8(condition, 63951 Register(rd), 63952 Register(rn), 63953 Register(rm), 63954 Register(ra)); 63955 break; 63956 } 63957 } 63958 break; 63959 } 63960 default: 63961 UnallocatedA32(instr); 63962 break; 63963 } 63964 break; 63965 } 63966 case 0x01200000: { 63967 // 0x07200000 63968 switch (instr & 0x00100000) { 63969 case 0x00000000: { 63970 // 0x07200000 63971 if (((instr & 0xf0000000) == 0xf0000000)) { 63972 UnallocatedA32(instr); 63973 return; 63974 } 63975 Condition condition((instr >> 28) & 0xf); 63976 unsigned rt = (instr >> 12) & 0xf; 63977 unsigned rn = (instr >> 16) & 0xf; 63978 Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus); 63979 unsigned rm = instr & 0xf; 63980 uint32_t imm_and_type_ = ((instr >> 5) & 0x7f); 63981 ImmediateShiftOperand shift_operand(imm_and_type_ & 0x3, 63982 (imm_and_type_ & 0x7c) >> 63983 2); 63984 Shift shift = shift_operand.GetShift(); 63985 uint32_t amount = shift_operand.GetAmount(); 63986 AddrMode addrmode = PreIndex; 63987 // STR{<c>}{<q>} <Rt>, [<Rn>, {+/-}<Rm>{, <shift>}]! ; A1 63988 str(condition, 63989 Best, 63990 Register(rt), 63991 MemOperand(Register(rn), 63992 sign, 63993 Register(rm), 63994 shift, 63995 amount, 63996 addrmode)); 63997 break; 63998 } 63999 case 0x00100000: { 64000 // 0x07300000 64001 if (((instr & 0xf0000000) == 0xf0000000)) { 64002 UnallocatedA32(instr); 64003 return; 64004 } 64005 Condition condition((instr >> 28) & 0xf); 64006 unsigned rt = (instr >> 12) & 0xf; 64007 unsigned rn = (instr >> 16) & 0xf; 64008 Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus); 64009 unsigned rm = instr & 0xf; 64010 uint32_t imm_and_type_ = ((instr >> 5) & 0x7f); 64011 ImmediateShiftOperand shift_operand(imm_and_type_ & 0x3, 64012 (imm_and_type_ & 0x7c) >> 64013 2); 64014 Shift shift = shift_operand.GetShift(); 64015 uint32_t amount = shift_operand.GetAmount(); 64016 AddrMode addrmode = PreIndex; 64017 // LDR{<c>}{<q>} <Rt>, [<Rn>, {+/-}<Rm>{, <shift>}]! ; A1 64018 ldr(condition, 64019 Best, 64020 Register(rt), 64021 MemOperand(Register(rn), 64022 sign, 64023 Register(rm), 64024 shift, 64025 amount, 64026 addrmode)); 64027 break; 64028 } 64029 } 64030 break; 64031 } 64032 case 0x01200010: { 64033 // 0x07200010 64034 switch (instr & 0x00800060) { 64035 case 0x00000000: { 64036 // 0x07200010 64037 if ((instr & 0x00100080) == 0x00100000) { 64038 if (((instr & 0xf0000000) == 0xf0000000)) { 64039 UnallocatedA32(instr); 64040 return; 64041 } 64042 Condition condition((instr >> 28) & 0xf); 64043 unsigned rd = (instr >> 16) & 0xf; 64044 unsigned rn = instr & 0xf; 64045 unsigned rm = (instr >> 8) & 0xf; 64046 // UDIV{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1 64047 udiv(condition, Register(rd), Register(rn), Register(rm)); 64048 if (((instr & 0xff0f0f0) != 0x730f010)) { 64049 UnpredictableA32(instr); 64050 } 64051 } else { 64052 UnallocatedA32(instr); 64053 } 64054 break; 64055 } 64056 case 0x00800040: { 64057 // 0x07a00050 64058 if (((instr & 0xf0000000) == 0xf0000000)) { 64059 UnallocatedA32(instr); 64060 return; 64061 } 64062 Condition condition((instr >> 28) & 0xf); 64063 unsigned rd = (instr >> 12) & 0xf; 64064 unsigned rn = instr & 0xf; 64065 uint32_t lsb = (instr >> 7) & 0x1f; 64066 uint32_t widthm1 = (instr >> 16) & 0x1f; 64067 uint32_t width = widthm1 + 1; 64068 // SBFX{<c>}{<q>} <Rd>, <Rn>, #<lsb>, #<width> ; A1 64069 sbfx(condition, Register(rd), Register(rn), lsb, width); 64070 break; 64071 } 64072 default: 64073 UnallocatedA32(instr); 64074 break; 64075 } 64076 break; 64077 } 64078 case 0x01400000: { 64079 // 0x07400000 64080 switch (instr & 0x00100000) { 64081 case 0x00000000: { 64082 // 0x07400000 64083 if (((instr & 0xf0000000) == 0xf0000000)) { 64084 UnallocatedA32(instr); 64085 return; 64086 } 64087 Condition condition((instr >> 28) & 0xf); 64088 unsigned rt = (instr >> 12) & 0xf; 64089 unsigned rn = (instr >> 16) & 0xf; 64090 Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus); 64091 unsigned rm = instr & 0xf; 64092 uint32_t imm_and_type_ = ((instr >> 5) & 0x7f); 64093 ImmediateShiftOperand shift_operand(imm_and_type_ & 0x3, 64094 (imm_and_type_ & 0x7c) >> 64095 2); 64096 Shift shift = shift_operand.GetShift(); 64097 uint32_t amount = shift_operand.GetAmount(); 64098 AddrMode addrmode = Offset; 64099 // STRB{<c>}{<q>} <Rt>, [<Rn>, {+/-}<Rm>{, <shift>}] ; A1 64100 strb(condition, 64101 Best, 64102 Register(rt), 64103 MemOperand(Register(rn), 64104 sign, 64105 Register(rm), 64106 shift, 64107 amount, 64108 addrmode)); 64109 break; 64110 } 64111 case 0x00100000: { 64112 // 0x07500000 64113 if (((instr & 0xf0000000) == 0xf0000000)) { 64114 UnallocatedA32(instr); 64115 return; 64116 } 64117 Condition condition((instr >> 28) & 0xf); 64118 unsigned rt = (instr >> 12) & 0xf; 64119 unsigned rn = (instr >> 16) & 0xf; 64120 Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus); 64121 unsigned rm = instr & 0xf; 64122 uint32_t imm_and_type_ = ((instr >> 5) & 0x7f); 64123 ImmediateShiftOperand shift_operand(imm_and_type_ & 0x3, 64124 (imm_and_type_ & 0x7c) >> 64125 2); 64126 Shift shift = shift_operand.GetShift(); 64127 uint32_t amount = shift_operand.GetAmount(); 64128 AddrMode addrmode = Offset; 64129 // LDRB{<c>}{<q>} <Rt>, [<Rn>, {+/-}<Rm>{, <shift>}] ; A1 64130 ldrb(condition, 64131 Best, 64132 Register(rt), 64133 MemOperand(Register(rn), 64134 sign, 64135 Register(rm), 64136 shift, 64137 amount, 64138 addrmode)); 64139 break; 64140 } 64141 } 64142 break; 64143 } 64144 case 0x01400010: { 64145 // 0x07400010 64146 switch (instr & 0x00800060) { 64147 case 0x00000000: { 64148 // 0x07400010 64149 switch (instr & 0x00100080) { 64150 case 0x00000000: { 64151 // 0x07400010 64152 if (((instr & 0xf0000000) == 0xf0000000)) { 64153 UnallocatedA32(instr); 64154 return; 64155 } 64156 Condition condition((instr >> 28) & 0xf); 64157 unsigned rdlo = (instr >> 12) & 0xf; 64158 unsigned rdhi = (instr >> 16) & 0xf; 64159 unsigned rn = instr & 0xf; 64160 unsigned rm = (instr >> 8) & 0xf; 64161 // SMLALD{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1 64162 smlald(condition, 64163 Register(rdlo), 64164 Register(rdhi), 64165 Register(rn), 64166 Register(rm)); 64167 break; 64168 } 64169 case 0x00100000: { 64170 // 0x07500010 64171 switch (instr & 0x0000f000) { 64172 case 0x0000f000: { 64173 // 0x0750f010 64174 if (((instr & 0xf0000000) == 0xf0000000)) { 64175 UnallocatedA32(instr); 64176 return; 64177 } 64178 Condition condition((instr >> 28) & 0xf); 64179 unsigned rd = (instr >> 16) & 0xf; 64180 unsigned rn = instr & 0xf; 64181 unsigned rm = (instr >> 8) & 0xf; 64182 // SMMUL{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1 64183 smmul(condition, 64184 Register(rd), 64185 Register(rn), 64186 Register(rm)); 64187 break; 64188 } 64189 default: { 64190 if (((instr & 0xf0000000) == 0xf0000000) || 64191 ((instr & 0xf000) == 0xf000)) { 64192 UnallocatedA32(instr); 64193 return; 64194 } 64195 Condition condition((instr >> 28) & 0xf); 64196 unsigned rd = (instr >> 16) & 0xf; 64197 unsigned rn = instr & 0xf; 64198 unsigned rm = (instr >> 8) & 0xf; 64199 unsigned ra = (instr >> 12) & 0xf; 64200 // SMMLA{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1 64201 smmla(condition, 64202 Register(rd), 64203 Register(rn), 64204 Register(rm), 64205 Register(ra)); 64206 break; 64207 } 64208 } 64209 break; 64210 } 64211 default: 64212 UnallocatedA32(instr); 64213 break; 64214 } 64215 break; 64216 } 64217 case 0x00000020: { 64218 // 0x07400030 64219 switch (instr & 0x00100080) { 64220 case 0x00000000: { 64221 // 0x07400030 64222 if (((instr & 0xf0000000) == 0xf0000000)) { 64223 UnallocatedA32(instr); 64224 return; 64225 } 64226 Condition condition((instr >> 28) & 0xf); 64227 unsigned rdlo = (instr >> 12) & 0xf; 64228 unsigned rdhi = (instr >> 16) & 0xf; 64229 unsigned rn = instr & 0xf; 64230 unsigned rm = (instr >> 8) & 0xf; 64231 // SMLALDX{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1 64232 smlaldx(condition, 64233 Register(rdlo), 64234 Register(rdhi), 64235 Register(rn), 64236 Register(rm)); 64237 break; 64238 } 64239 case 0x00100000: { 64240 // 0x07500030 64241 switch (instr & 0x0000f000) { 64242 case 0x0000f000: { 64243 // 0x0750f030 64244 if (((instr & 0xf0000000) == 0xf0000000)) { 64245 UnallocatedA32(instr); 64246 return; 64247 } 64248 Condition condition((instr >> 28) & 0xf); 64249 unsigned rd = (instr >> 16) & 0xf; 64250 unsigned rn = instr & 0xf; 64251 unsigned rm = (instr >> 8) & 0xf; 64252 // SMMULR{<c>}{<q>} {<Rd>}, <Rn>, <Rm> ; A1 64253 smmulr(condition, 64254 Register(rd), 64255 Register(rn), 64256 Register(rm)); 64257 break; 64258 } 64259 default: { 64260 if (((instr & 0xf0000000) == 0xf0000000) || 64261 ((instr & 0xf000) == 0xf000)) { 64262 UnallocatedA32(instr); 64263 return; 64264 } 64265 Condition condition((instr >> 28) & 0xf); 64266 unsigned rd = (instr >> 16) & 0xf; 64267 unsigned rn = instr & 0xf; 64268 unsigned rm = (instr >> 8) & 0xf; 64269 unsigned ra = (instr >> 12) & 0xf; 64270 // SMMLAR{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1 64271 smmlar(condition, 64272 Register(rd), 64273 Register(rn), 64274 Register(rm), 64275 Register(ra)); 64276 break; 64277 } 64278 } 64279 break; 64280 } 64281 default: 64282 UnallocatedA32(instr); 64283 break; 64284 } 64285 break; 64286 } 64287 case 0x00000040: { 64288 // 0x07400050 64289 switch (instr & 0x00100080) { 64290 case 0x00000000: { 64291 // 0x07400050 64292 if (((instr & 0xf0000000) == 0xf0000000)) { 64293 UnallocatedA32(instr); 64294 return; 64295 } 64296 Condition condition((instr >> 28) & 0xf); 64297 unsigned rdlo = (instr >> 12) & 0xf; 64298 unsigned rdhi = (instr >> 16) & 0xf; 64299 unsigned rn = instr & 0xf; 64300 unsigned rm = (instr >> 8) & 0xf; 64301 // SMLSLD{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1 64302 smlsld(condition, 64303 Register(rdlo), 64304 Register(rdhi), 64305 Register(rn), 64306 Register(rm)); 64307 break; 64308 } 64309 case 0x00100080: { 64310 // 0x075000d0 64311 if (((instr & 0xf0000000) == 0xf0000000)) { 64312 UnallocatedA32(instr); 64313 return; 64314 } 64315 Condition condition((instr >> 28) & 0xf); 64316 unsigned rd = (instr >> 16) & 0xf; 64317 unsigned rn = instr & 0xf; 64318 unsigned rm = (instr >> 8) & 0xf; 64319 unsigned ra = (instr >> 12) & 0xf; 64320 // SMMLS{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1 64321 smmls(condition, 64322 Register(rd), 64323 Register(rn), 64324 Register(rm), 64325 Register(ra)); 64326 break; 64327 } 64328 default: 64329 UnallocatedA32(instr); 64330 break; 64331 } 64332 break; 64333 } 64334 case 0x00000060: { 64335 // 0x07400070 64336 switch (instr & 0x00100080) { 64337 case 0x00000000: { 64338 // 0x07400070 64339 if (((instr & 0xf0000000) == 0xf0000000)) { 64340 UnallocatedA32(instr); 64341 return; 64342 } 64343 Condition condition((instr >> 28) & 0xf); 64344 unsigned rdlo = (instr >> 12) & 0xf; 64345 unsigned rdhi = (instr >> 16) & 0xf; 64346 unsigned rn = instr & 0xf; 64347 unsigned rm = (instr >> 8) & 0xf; 64348 // SMLSLDX{<c>}{<q>} <Rd>, <Rd>, <Rn>, <Rm> ; A1 64349 smlsldx(condition, 64350 Register(rdlo), 64351 Register(rdhi), 64352 Register(rn), 64353 Register(rm)); 64354 break; 64355 } 64356 case 0x00100080: { 64357 // 0x075000f0 64358 if (((instr & 0xf0000000) == 0xf0000000)) { 64359 UnallocatedA32(instr); 64360 return; 64361 } 64362 Condition condition((instr >> 28) & 0xf); 64363 unsigned rd = (instr >> 16) & 0xf; 64364 unsigned rn = instr & 0xf; 64365 unsigned rm = (instr >> 8) & 0xf; 64366 unsigned ra = (instr >> 12) & 0xf; 64367 // SMMLSR{<c>}{<q>} <Rd>, <Rn>, <Rm>, <Ra> ; A1 64368 smmlsr(condition, 64369 Register(rd), 64370 Register(rn), 64371 Register(rm), 64372 Register(ra)); 64373 break; 64374 } 64375 default: 64376 UnallocatedA32(instr); 64377 break; 64378 } 64379 break; 64380 } 64381 case 0x00800000: { 64382 // 0x07c00010 64383 switch (instr & 0x0000000f) { 64384 case 0x0000000f: { 64385 // 0x07c0001f 64386 if (((instr & 0xf0000000) == 0xf0000000)) { 64387 UnallocatedA32(instr); 64388 return; 64389 } 64390 Condition condition((instr >> 28) & 0xf); 64391 unsigned rd = (instr >> 12) & 0xf; 64392 uint32_t lsb = (instr >> 7) & 0x1f; 64393 uint32_t msb = (instr >> 16) & 0x1f; 64394 uint32_t width = msb - lsb + 1; 64395 // BFC{<c>}{<q>} <Rd>, #<lsb>, #<width> ; A1 64396 bfc(condition, Register(rd), lsb, width); 64397 break; 64398 } 64399 default: { 64400 if (((instr & 0xf0000000) == 0xf0000000) || 64401 ((instr & 0xf) == 0xf)) { 64402 UnallocatedA32(instr); 64403 return; 64404 } 64405 Condition condition((instr >> 28) & 0xf); 64406 unsigned rd = (instr >> 12) & 0xf; 64407 unsigned rn = instr & 0xf; 64408 uint32_t lsb = (instr >> 7) & 0x1f; 64409 uint32_t msb = (instr >> 16) & 0x1f; 64410 uint32_t width = msb - lsb + 1; 64411 // BFI{<c>}{<q>} <Rd>, <Rn>, #<lsb>, #<width> ; A1 64412 bfi(condition, Register(rd), Register(rn), lsb, width); 64413 break; 64414 } 64415 } 64416 break; 64417 } 64418 default: 64419 UnallocatedA32(instr); 64420 break; 64421 } 64422 break; 64423 } 64424 case 0x01600000: { 64425 // 0x07600000 64426 switch (instr & 0x00100000) { 64427 case 0x00000000: { 64428 // 0x07600000 64429 if (((instr & 0xf0000000) == 0xf0000000)) { 64430 UnallocatedA32(instr); 64431 return; 64432 } 64433 Condition condition((instr >> 28) & 0xf); 64434 unsigned rt = (instr >> 12) & 0xf; 64435 unsigned rn = (instr >> 16) & 0xf; 64436 Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus); 64437 unsigned rm = instr & 0xf; 64438 uint32_t imm_and_type_ = ((instr >> 5) & 0x7f); 64439 ImmediateShiftOperand shift_operand(imm_and_type_ & 0x3, 64440 (imm_and_type_ & 0x7c) >> 64441 2); 64442 Shift shift = shift_operand.GetShift(); 64443 uint32_t amount = shift_operand.GetAmount(); 64444 AddrMode addrmode = PreIndex; 64445 // STRB{<c>}{<q>} <Rt>, [<Rn>, {+/-}<Rm>{, <shift>}]! ; A1 64446 strb(condition, 64447 Best, 64448 Register(rt), 64449 MemOperand(Register(rn), 64450 sign, 64451 Register(rm), 64452 shift, 64453 amount, 64454 addrmode)); 64455 break; 64456 } 64457 case 0x00100000: { 64458 // 0x07700000 64459 if (((instr & 0xf0000000) == 0xf0000000)) { 64460 UnallocatedA32(instr); 64461 return; 64462 } 64463 Condition condition((instr >> 28) & 0xf); 64464 unsigned rt = (instr >> 12) & 0xf; 64465 unsigned rn = (instr >> 16) & 0xf; 64466 Sign sign(((instr >> 23) & 0x1) == 0 ? minus : plus); 64467 unsigned rm = instr & 0xf; 64468 uint32_t imm_and_type_ = ((instr >> 5) & 0x7f); 64469 ImmediateShiftOperand shift_operand(imm_and_type_ & 0x3, 64470 (imm_and_type_ & 0x7c) >> 64471 2); 64472 Shift shift = shift_operand.GetShift(); 64473 uint32_t amount = shift_operand.GetAmount(); 64474 AddrMode addrmode = PreIndex; 64475 // LDRB{<c>}{<q>} <Rt>, [<Rn>, {+/-}<Rm>{, <shift>}]! ; A1 64476 ldrb(condition, 64477 Best, 64478 Register(rt), 64479 MemOperand(Register(rn), 64480 sign, 64481 Register(rm), 64482 shift, 64483 amount, 64484 addrmode)); 64485 break; 64486 } 64487 } 64488 break; 64489 } 64490 case 0x01600010: { 64491 // 0x07600010 64492 switch (instr & 0x00800060) { 64493 case 0x00800040: { 64494 // 0x07e00050 64495 if (((instr & 0xf0000000) == 0xf0000000)) { 64496 UnallocatedA32(instr); 64497 return; 64498 } 64499 Condition condition((instr >> 28) & 0xf); 64500 unsigned rd = (instr >> 12) & 0xf; 64501 unsigned rn = instr & 0xf; 64502 uint32_t lsb = (instr >> 7) & 0x1f; 64503 uint32_t widthm1 = (instr >> 16) & 0x1f; 64504 uint32_t width = widthm1 + 1; 64505 // UBFX{<c>}{<q>} <Rd>, <Rn>, #<lsb>, #<width> ; A1 64506 ubfx(condition, Register(rd), Register(rn), lsb, width); 64507 break; 64508 } 64509 case 0x00800060: { 64510 // 0x07e00070 64511 if ((instr & 0xf0100080) == 0xe0100080) { 64512 uint32_t imm = (instr & 0xf) | ((instr >> 4) & 0xfff0); 64513 // UDF{<c>}{<q>} {#}<imm> ; A1 64514 udf(al, Best, imm); 64515 } else { 64516 UnallocatedA32(instr); 64517 } 64518 break; 64519 } 64520 default: 64521 UnallocatedA32(instr); 64522 break; 64523 } 64524 break; 64525 } 64526 } 64527 break; 64528 } 64529 case 0x08000000: { 64530 // 0x08000000 64531 switch (instr & 0x00500000) { 64532 case 0x00000000: { 64533 // 0x08000000 64534 switch (instr & 0x01800000) { 64535 case 0x00000000: { 64536 // 0x08000000 64537 if (((instr & 0xf0000000) == 0xf0000000)) { 64538 UnallocatedA32(instr); 64539 return; 64540 } 64541 Condition condition((instr >> 28) & 0xf); 64542 unsigned rn = (instr >> 16) & 0xf; 64543 WriteBack write_back((instr >> 21) & 0x1); 64544 RegisterList registers((instr & 0xffff)); 64545 // STMDA{<c>}{<q>} <Rn>{!}, <registers> ; A1 64546 stmda(condition, Register(rn), write_back, registers); 64547 break; 64548 } 64549 case 0x00800000: { 64550 // 0x08800000 64551 if (((instr & 0xf0000000) == 0xf0000000)) { 64552 UnallocatedA32(instr); 64553 return; 64554 } 64555 Condition condition((instr >> 28) & 0xf); 64556 unsigned rn = (instr >> 16) & 0xf; 64557 WriteBack write_back((instr >> 21) & 0x1); 64558 RegisterList registers((instr & 0xffff)); 64559 // STM{<c>}{<q>} <Rn>{!}, <registers> ; A1 64560 stm(condition, Best, Register(rn), write_back, registers); 64561 break; 64562 } 64563 case 0x01000000: { 64564 // 0x09000000 64565 if (((instr & 0xf0000000) == 0xf0000000)) { 64566 UnallocatedA32(instr); 64567 return; 64568 } 64569 if (((Uint32((instr >> 21)) & Uint32(0x1)) == Uint32(0x1)) && 64570 ((Uint32((instr >> 16)) & Uint32(0xf)) == Uint32(0xd)) && 64571 ((instr & 0xf0000000) != 0xf0000000) && 64572 (BitCount((Uint32(instr) & Uint32(0xffff))) > Int64(1))) { 64573 Condition condition((instr >> 28) & 0xf); 64574 RegisterList registers((instr & 0xffff)); 64575 // PUSH{<c>}{<q>} <registers> ; A1 64576 push(condition, Best, registers); 64577 return; 64578 } 64579 Condition condition((instr >> 28) & 0xf); 64580 unsigned rn = (instr >> 16) & 0xf; 64581 WriteBack write_back((instr >> 21) & 0x1); 64582 RegisterList registers((instr & 0xffff)); 64583 // STMDB{<c>}{<q>} <Rn>{!}, <registers> ; A1 64584 stmdb(condition, Best, Register(rn), write_back, registers); 64585 break; 64586 } 64587 case 0x01800000: { 64588 // 0x09800000 64589 if (((instr & 0xf0000000) == 0xf0000000)) { 64590 UnallocatedA32(instr); 64591 return; 64592 } 64593 Condition condition((instr >> 28) & 0xf); 64594 unsigned rn = (instr >> 16) & 0xf; 64595 WriteBack write_back((instr >> 21) & 0x1); 64596 RegisterList registers((instr & 0xffff)); 64597 // STMIB{<c>}{<q>} <Rn>{!}, <registers> ; A1 64598 stmib(condition, Register(rn), write_back, registers); 64599 break; 64600 } 64601 } 64602 break; 64603 } 64604 case 0x00100000: { 64605 // 0x08100000 64606 switch (instr & 0x01800000) { 64607 case 0x00000000: { 64608 // 0x08100000 64609 if (((instr & 0xf0000000) == 0xf0000000)) { 64610 UnallocatedA32(instr); 64611 return; 64612 } 64613 Condition condition((instr >> 28) & 0xf); 64614 unsigned rn = (instr >> 16) & 0xf; 64615 WriteBack write_back((instr >> 21) & 0x1); 64616 RegisterList registers((instr & 0xffff)); 64617 // LDMDA{<c>}{<q>} <Rn>{!}, <registers> ; A1 64618 ldmda(condition, Register(rn), write_back, registers); 64619 break; 64620 } 64621 case 0x00800000: { 64622 // 0x08900000 64623 if (((instr & 0xf0000000) == 0xf0000000)) { 64624 UnallocatedA32(instr); 64625 return; 64626 } 64627 if (((Uint32((instr >> 21)) & Uint32(0x1)) == Uint32(0x1)) && 64628 ((Uint32((instr >> 16)) & Uint32(0xf)) == Uint32(0xd)) && 64629 ((instr & 0xf0000000) != 0xf0000000) && 64630 (BitCount((Uint32(instr) & Uint32(0xffff))) > Int64(1))) { 64631 Condition condition((instr >> 28) & 0xf); 64632 RegisterList registers((instr & 0xffff)); 64633 // POP{<c>}{<q>} <registers> ; A1 64634 pop(condition, Best, registers); 64635 return; 64636 } 64637 Condition condition((instr >> 28) & 0xf); 64638 unsigned rn = (instr >> 16) & 0xf; 64639 WriteBack write_back((instr >> 21) & 0x1); 64640 RegisterList registers((instr & 0xffff)); 64641 // LDM{<c>}{<q>} <Rn>{!}, <registers> ; A1 64642 ldm(condition, Best, Register(rn), write_back, registers); 64643 break; 64644 } 64645 case 0x01000000: { 64646 // 0x09100000 64647 if (((instr & 0xf0000000) == 0xf0000000)) { 64648 UnallocatedA32(instr); 64649 return; 64650 } 64651 Condition condition((instr >> 28) & 0xf); 64652 unsigned rn = (instr >> 16) & 0xf; 64653 WriteBack write_back((instr >> 21) & 0x1); 64654 RegisterList registers((instr & 0xffff)); 64655 // LDMDB{<c>}{<q>} <Rn>{!}, <registers> ; A1 64656 ldmdb(condition, Register(rn), write_back, registers); 64657 break; 64658 } 64659 case 0x01800000: { 64660 // 0x09900000 64661 if (((instr & 0xf0000000) == 0xf0000000)) { 64662 UnallocatedA32(instr); 64663 return; 64664 } 64665 Condition condition((instr >> 28) & 0xf); 64666 unsigned rn = (instr >> 16) & 0xf; 64667 WriteBack write_back((instr >> 21) & 0x1); 64668 RegisterList registers((instr & 0xffff)); 64669 // LDMIB{<c>}{<q>} <Rn>{!}, <registers> ; A1 64670 ldmib(condition, Register(rn), write_back, registers); 64671 break; 64672 } 64673 } 64674 break; 64675 } 64676 case 0x00400000: { 64677 // 0x08400000 64678 if (((instr & 0xf0000000) == 0xf0000000)) { 64679 UnallocatedA32(instr); 64680 return; 64681 } 64682 UnimplementedA32("STM", instr); 64683 break; 64684 } 64685 case 0x00500000: { 64686 // 0x08500000 64687 switch (instr & 0x00008000) { 64688 case 0x00000000: { 64689 // 0x08500000 64690 if (((instr & 0xf0000000) == 0xf0000000)) { 64691 UnallocatedA32(instr); 64692 return; 64693 } 64694 UnimplementedA32("LDM", instr); 64695 break; 64696 } 64697 case 0x00008000: { 64698 // 0x08508000 64699 if (((instr & 0xf0000000) == 0xf0000000)) { 64700 UnallocatedA32(instr); 64701 return; 64702 } 64703 UnimplementedA32("LDM", instr); 64704 break; 64705 } 64706 } 64707 break; 64708 } 64709 } 64710 break; 64711 } 64712 case 0x0a000000: { 64713 // 0x0a000000 64714 switch (instr & 0x01000000) { 64715 case 0x00000000: { 64716 // 0x0a000000 64717 if (((instr & 0xf0000000) == 0xf0000000)) { 64718 UnallocatedA32(instr); 64719 return; 64720 } 64721 Condition condition((instr >> 28) & 0xf); 64722 int32_t imm = SignExtend<int32_t>((instr & 0xffffff) << 2, 26); 64723 Location location(imm, kA32PcDelta); 64724 // B{<c>}{<q>} <label> ; A1 64725 b(condition, Best, &location); 64726 break; 64727 } 64728 case 0x01000000: { 64729 // 0x0b000000 64730 if (((instr & 0xf0000000) == 0xf0000000)) { 64731 UnallocatedA32(instr); 64732 return; 64733 } 64734 Condition condition((instr >> 28) & 0xf); 64735 int32_t imm = SignExtend<int32_t>((instr & 0xffffff) << 2, 26); 64736 Location location(imm, kA32PcDelta); 64737 // BL{<c>}{<q>} <label> ; A1 64738 bl(condition, &location); 64739 break; 64740 } 64741 } 64742 break; 64743 } 64744 case 0x0c000000: { 64745 // 0x0c000000 64746 switch (instr & 0x01100e00) { 64747 case 0x00000a00: { 64748 // 0x0c000a00 64749 switch (instr & 0x00800100) { 64750 case 0x00000000: { 64751 // 0x0c000a00 64752 if ((instr & 0x006000d0) == 0x00400010) { 64753 if (((instr & 0xf0000000) == 0xf0000000)) { 64754 UnallocatedA32(instr); 64755 return; 64756 } 64757 Condition condition((instr >> 28) & 0xf); 64758 unsigned rm = ExtractSRegister(instr, 5, 0); 64759 unsigned rt = (instr >> 12) & 0xf; 64760 unsigned rt2 = (instr >> 16) & 0xf; 64761 // VMOV{<c>}{<q>} <Sm>, <Sm1>, <Rt>, <Rt2> ; A1 64762 vmov(condition, 64763 SRegister(rm), 64764 SRegister(rm + 1), 64765 Register(rt), 64766 Register(rt2)); 64767 } else { 64768 UnallocatedA32(instr); 64769 } 64770 break; 64771 } 64772 case 0x00000100: { 64773 // 0x0c000b00 64774 if ((instr & 0x006000d0) == 0x00400010) { 64775 if (((instr & 0xf0000000) == 0xf0000000)) { 64776 UnallocatedA32(instr); 64777 return; 64778 } 64779 Condition condition((instr >> 28) & 0xf); 64780 unsigned rm = ExtractDRegister(instr, 5, 0); 64781 unsigned rt = (instr >> 12) & 0xf; 64782 unsigned rt2 = (instr >> 16) & 0xf; 64783 // VMOV{<c>}{<q>} <Dm>, <Rt>, <Rt2> ; A1 64784 vmov(condition, DRegister(rm), Register(rt), Register(rt2)); 64785 } else { 64786 UnallocatedA32(instr); 64787 } 64788 break; 64789 } 64790 case 0x00800000: { 64791 // 0x0c800a00 64792 if (((instr & 0xf0000000) == 0xf0000000)) { 64793 UnallocatedA32(instr); 64794 return; 64795 } 64796 Condition condition((instr >> 28) & 0xf); 64797 unsigned rn = (instr >> 16) & 0xf; 64798 WriteBack write_back((instr >> 21) & 0x1); 64799 unsigned first = ExtractSRegister(instr, 22, 12); 64800 unsigned len = instr & 0xff; 64801 // VSTM{<c>}{<q>}{.<size>} <Rn>{!}, <sreglist> ; A2 64802 vstm(condition, 64803 kDataTypeValueNone, 64804 Register(rn), 64805 write_back, 64806 SRegisterList(SRegister(first), len)); 64807 if ((len == 0) || ((first + len) > kNumberOfSRegisters)) { 64808 UnpredictableA32(instr); 64809 } 64810 break; 64811 } 64812 case 0x00800100: { 64813 // 0x0c800b00 64814 switch (instr & 0x00000001) { 64815 case 0x00000000: { 64816 // 0x0c800b00 64817 if (((instr & 0xf0000000) == 0xf0000000)) { 64818 UnallocatedA32(instr); 64819 return; 64820 } 64821 Condition condition((instr >> 28) & 0xf); 64822 unsigned rn = (instr >> 16) & 0xf; 64823 WriteBack write_back((instr >> 21) & 0x1); 64824 unsigned first = ExtractDRegister(instr, 22, 12); 64825 unsigned imm8 = (instr & 0xff); 64826 unsigned len = imm8 / 2; 64827 unsigned end = first + len; 64828 // VSTM{<c>}{<q>}{.<size>} <Rn>{!}, <dreglist> ; A1 64829 vstm(condition, 64830 kDataTypeValueNone, 64831 Register(rn), 64832 write_back, 64833 DRegisterList(DRegister(first), len)); 64834 if ((len == 0) || (len > 16) || 64835 (end > kMaxNumberOfDRegisters)) { 64836 UnpredictableA32(instr); 64837 } 64838 break; 64839 } 64840 case 0x00000001: { 64841 // 0x0c800b01 64842 if (((instr & 0xf0000000) == 0xf0000000)) { 64843 UnallocatedA32(instr); 64844 return; 64845 } 64846 Condition condition((instr >> 28) & 0xf); 64847 unsigned rn = (instr >> 16) & 0xf; 64848 WriteBack write_back((instr >> 21) & 0x1); 64849 unsigned first = ExtractDRegister(instr, 22, 12); 64850 unsigned imm8 = (instr & 0xff); 64851 unsigned len = imm8 / 2; 64852 unsigned end = first + len; 64853 // FSTMIAX{<c>}{<q>} <Rn>{!}, <dreglist> ; A1 64854 fstmiax(condition, 64855 Register(rn), 64856 write_back, 64857 DRegisterList(DRegister(first), len)); 64858 if ((len == 0) || (len > 16) || (end > 16)) { 64859 UnpredictableA32(instr); 64860 } 64861 break; 64862 } 64863 } 64864 break; 64865 } 64866 } 64867 break; 64868 } 64869 case 0x00000e00: { 64870 // 0x0c000e00 64871 switch (instr & 0x00600000) { 64872 case 0x00000000: { 64873 // 0x0c000e00 64874 if ((instr & 0x0080f100) == 0x00805000) { 64875 if (((instr & 0xf0000000) == 0xf0000000)) { 64876 UnallocatedA32(instr); 64877 return; 64878 } 64879 UnimplementedA32("STC", instr); 64880 } else { 64881 UnallocatedA32(instr); 64882 } 64883 break; 64884 } 64885 case 0x00200000: { 64886 // 0x0c200e00 64887 if ((instr & 0x0000f100) == 0x00005000) { 64888 if (((instr & 0xf0000000) == 0xf0000000)) { 64889 UnallocatedA32(instr); 64890 return; 64891 } 64892 UnimplementedA32("STC", instr); 64893 } else { 64894 UnallocatedA32(instr); 64895 } 64896 break; 64897 } 64898 case 0x00400000: { 64899 // 0x0c400e00 64900 if ((instr & 0x00800000) == 0x00000000) { 64901 if (((instr & 0xf0000000) == 0xf0000000)) { 64902 UnallocatedA32(instr); 64903 return; 64904 } 64905 UnimplementedA32("MCRR", instr); 64906 } else { 64907 UnallocatedA32(instr); 64908 } 64909 break; 64910 } 64911 default: 64912 UnallocatedA32(instr); 64913 break; 64914 } 64915 break; 64916 } 64917 case 0x00100a00: { 64918 // 0x0c100a00 64919 switch (instr & 0x00800100) { 64920 case 0x00000000: { 64921 // 0x0c100a00 64922 if ((instr & 0x006000d0) == 0x00400010) { 64923 if (((instr & 0xf0000000) == 0xf0000000)) { 64924 UnallocatedA32(instr); 64925 return; 64926 } 64927 Condition condition((instr >> 28) & 0xf); 64928 unsigned rt = (instr >> 12) & 0xf; 64929 unsigned rt2 = (instr >> 16) & 0xf; 64930 unsigned rm = ExtractSRegister(instr, 5, 0); 64931 // VMOV{<c>}{<q>} <Rt>, <Rt2>, <Sm>, <Sm1> ; A1 64932 vmov(condition, 64933 Register(rt), 64934 Register(rt2), 64935 SRegister(rm), 64936 SRegister(rm + 1)); 64937 } else { 64938 UnallocatedA32(instr); 64939 } 64940 break; 64941 } 64942 case 0x00000100: { 64943 // 0x0c100b00 64944 if ((instr & 0x006000d0) == 0x00400010) { 64945 if (((instr & 0xf0000000) == 0xf0000000)) { 64946 UnallocatedA32(instr); 64947 return; 64948 } 64949 Condition condition((instr >> 28) & 0xf); 64950 unsigned rt = (instr >> 12) & 0xf; 64951 unsigned rt2 = (instr >> 16) & 0xf; 64952 unsigned rm = ExtractDRegister(instr, 5, 0); 64953 // VMOV{<c>}{<q>} <Rt>, <Rt2>, <Dm> ; A1 64954 vmov(condition, Register(rt), Register(rt2), DRegister(rm)); 64955 } else { 64956 UnallocatedA32(instr); 64957 } 64958 break; 64959 } 64960 case 0x00800000: { 64961 // 0x0c900a00 64962 if (((instr & 0xf0000000) == 0xf0000000)) { 64963 UnallocatedA32(instr); 64964 return; 64965 } 64966 if (((Uint32((instr >> 21)) & Uint32(0x1)) == Uint32(0x1)) && 64967 ((Uint32((instr >> 16)) & Uint32(0xf)) == Uint32(0xd)) && 64968 ((instr & 0xf0000000) != 0xf0000000)) { 64969 Condition condition((instr >> 28) & 0xf); 64970 unsigned first = ExtractSRegister(instr, 22, 12); 64971 unsigned len = instr & 0xff; 64972 // VPOP{<c>}{<q>}{.<size>} <sreglist> ; A2 64973 vpop(condition, 64974 kDataTypeValueNone, 64975 SRegisterList(SRegister(first), len)); 64976 if ((len == 0) || ((first + len) > kNumberOfSRegisters)) { 64977 UnpredictableA32(instr); 64978 } 64979 return; 64980 } 64981 Condition condition((instr >> 28) & 0xf); 64982 unsigned rn = (instr >> 16) & 0xf; 64983 WriteBack write_back((instr >> 21) & 0x1); 64984 unsigned first = ExtractSRegister(instr, 22, 12); 64985 unsigned len = instr & 0xff; 64986 // VLDM{<c>}{<q>}{.<size>} <Rn>{!}, <sreglist> ; A2 64987 vldm(condition, 64988 kDataTypeValueNone, 64989 Register(rn), 64990 write_back, 64991 SRegisterList(SRegister(first), len)); 64992 if ((len == 0) || ((first + len) > kNumberOfSRegisters)) { 64993 UnpredictableA32(instr); 64994 } 64995 break; 64996 } 64997 case 0x00800100: { 64998 // 0x0c900b00 64999 switch (instr & 0x00000001) { 65000 case 0x00000000: { 65001 // 0x0c900b00 65002 if (((instr & 0xf0000000) == 0xf0000000)) { 65003 UnallocatedA32(instr); 65004 return; 65005 } 65006 if (((Uint32((instr >> 21)) & Uint32(0x1)) == 65007 Uint32(0x1)) && 65008 ((Uint32((instr >> 16)) & Uint32(0xf)) == 65009 Uint32(0xd)) && 65010 ((instr & 0xf0000000) != 0xf0000000)) { 65011 Condition condition((instr >> 28) & 0xf); 65012 unsigned first = ExtractDRegister(instr, 22, 12); 65013 unsigned imm8 = (instr & 0xff); 65014 unsigned len = imm8 / 2; 65015 unsigned end = first + len; 65016 // VPOP{<c>}{<q>}{.<size>} <dreglist> ; A1 65017 vpop(condition, 65018 kDataTypeValueNone, 65019 DRegisterList(DRegister(first), len)); 65020 if ((len == 0) || (len > 16) || 65021 (end > kMaxNumberOfDRegisters)) { 65022 UnpredictableA32(instr); 65023 } 65024 return; 65025 } 65026 Condition condition((instr >> 28) & 0xf); 65027 unsigned rn = (instr >> 16) & 0xf; 65028 WriteBack write_back((instr >> 21) & 0x1); 65029 unsigned first = ExtractDRegister(instr, 22, 12); 65030 unsigned imm8 = (instr & 0xff); 65031 unsigned len = imm8 / 2; 65032 unsigned end = first + len; 65033 // VLDM{<c>}{<q>}{.<size>} <Rn>{!}, <dreglist> ; A1 65034 vldm(condition, 65035 kDataTypeValueNone, 65036 Register(rn), 65037 write_back, 65038 DRegisterList(DRegister(first), len)); 65039 if ((len == 0) || (len > 16) || 65040 (end > kMaxNumberOfDRegisters)) { 65041 UnpredictableA32(instr); 65042 } 65043 break; 65044 } 65045 case 0x00000001: { 65046 // 0x0c900b01 65047 if (((instr & 0xf0000000) == 0xf0000000)) { 65048 UnallocatedA32(instr); 65049 return; 65050 } 65051 Condition condition((instr >> 28) & 0xf); 65052 unsigned rn = (instr >> 16) & 0xf; 65053 WriteBack write_back((instr >> 21) & 0x1); 65054 unsigned first = ExtractDRegister(instr, 22, 12); 65055 unsigned imm8 = (instr & 0xff); 65056 unsigned len = imm8 / 2; 65057 unsigned end = first + len; 65058 // FLDMIAX{<c>}{<q>} <Rn>{!}, <dreglist> ; A1 65059 fldmiax(condition, 65060 Register(rn), 65061 write_back, 65062 DRegisterList(DRegister(first), len)); 65063 if ((len == 0) || (len > 16) || (end > 16)) { 65064 UnpredictableA32(instr); 65065 } 65066 break; 65067 } 65068 } 65069 break; 65070 } 65071 } 65072 break; 65073 } 65074 case 0x00100e00: { 65075 // 0x0c100e00 65076 switch (instr & 0x00600000) { 65077 case 0x00000000: { 65078 // 0x0c100e00 65079 switch (instr & 0x0080f100) { 65080 case 0x00805000: { 65081 // 0x0c905e00 65082 switch (instr & 0x000f0000) { 65083 case 0x000f0000: { 65084 // 0x0c9f5e00 65085 if (((instr & 0xf0000000) == 0xf0000000)) { 65086 UnallocatedA32(instr); 65087 return; 65088 } 65089 UnimplementedA32("LDC", instr); 65090 break; 65091 } 65092 default: { 65093 if (((instr & 0xf0000000) == 0xf0000000) || 65094 ((instr & 0xf0000) == 0xf0000)) { 65095 UnallocatedA32(instr); 65096 return; 65097 } 65098 UnimplementedA32("LDC", instr); 65099 break; 65100 } 65101 } 65102 break; 65103 } 65104 default: 65105 UnallocatedA32(instr); 65106 break; 65107 } 65108 break; 65109 } 65110 case 0x00200000: { 65111 // 0x0c300e00 65112 if ((instr & 0x0000f100) == 0x00005000) { 65113 if (((instr & 0xf0000000) == 0xf0000000) || 65114 ((instr & 0xf0000) == 0xf0000)) { 65115 UnallocatedA32(instr); 65116 return; 65117 } 65118 UnimplementedA32("LDC", instr); 65119 } else { 65120 UnallocatedA32(instr); 65121 } 65122 break; 65123 } 65124 case 0x00400000: { 65125 // 0x0c500e00 65126 if ((instr & 0x00800000) == 0x00000000) { 65127 if (((instr & 0xf0000000) == 0xf0000000)) { 65128 UnallocatedA32(instr); 65129 return; 65130 } 65131 UnimplementedA32("MRRC", instr); 65132 } else { 65133 UnallocatedA32(instr); 65134 } 65135 break; 65136 } 65137 default: 65138 UnallocatedA32(instr); 65139 break; 65140 } 65141 break; 65142 } 65143 case 0x01000a00: { 65144 // 0x0d000a00 65145 switch (instr & 0x00200100) { 65146 case 0x00000000: { 65147 // 0x0d000a00 65148 if (((instr & 0xf0000000) == 0xf0000000)) { 65149 UnallocatedA32(instr); 65150 return; 65151 } 65152 Condition condition((instr >> 28) & 0xf); 65153 unsigned rd = ExtractSRegister(instr, 22, 12); 65154 unsigned rn = (instr >> 16) & 0xf; 65155 Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus); 65156 int32_t offset = (instr & 0xff) << 2; 65157 // VSTR{<c>}{<q>}{.32} <Sd>, [<Rn>{, #{+/-}<imm>}] ; A2 65158 vstr(condition, 65159 Untyped32, 65160 SRegister(rd), 65161 MemOperand(Register(rn), sign, offset, Offset)); 65162 break; 65163 } 65164 case 0x00000100: { 65165 // 0x0d000b00 65166 if (((instr & 0xf0000000) == 0xf0000000)) { 65167 UnallocatedA32(instr); 65168 return; 65169 } 65170 Condition condition((instr >> 28) & 0xf); 65171 unsigned rd = ExtractDRegister(instr, 22, 12); 65172 unsigned rn = (instr >> 16) & 0xf; 65173 Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus); 65174 int32_t offset = (instr & 0xff) << 2; 65175 // VSTR{<c>}{<q>}{.64} <Dd>, [<Rn>{, #{+/-}<imm>}] ; A1 65176 vstr(condition, 65177 Untyped64, 65178 DRegister(rd), 65179 MemOperand(Register(rn), sign, offset, Offset)); 65180 break; 65181 } 65182 case 0x00200000: { 65183 // 0x0d200a00 65184 if ((instr & 0x00800000) == 0x00000000) { 65185 if (((instr & 0xf0000000) == 0xf0000000)) { 65186 UnallocatedA32(instr); 65187 return; 65188 } 65189 if (((Uint32((instr >> 16)) & Uint32(0xf)) == Uint32(0xd)) && 65190 ((instr & 0xf0000000) != 0xf0000000)) { 65191 Condition condition((instr >> 28) & 0xf); 65192 unsigned first = ExtractSRegister(instr, 22, 12); 65193 unsigned len = instr & 0xff; 65194 // VPUSH{<c>}{<q>}{.<size>} <sreglist> ; A2 65195 vpush(condition, 65196 kDataTypeValueNone, 65197 SRegisterList(SRegister(first), len)); 65198 if ((len == 0) || ((first + len) > kNumberOfSRegisters)) { 65199 UnpredictableA32(instr); 65200 } 65201 return; 65202 } 65203 Condition condition((instr >> 28) & 0xf); 65204 unsigned rn = (instr >> 16) & 0xf; 65205 unsigned first = ExtractSRegister(instr, 22, 12); 65206 unsigned len = instr & 0xff; 65207 // VSTMDB{<c>}{<q>}{.<size>} <Rn>!, <sreglist> ; A2 65208 vstmdb(condition, 65209 kDataTypeValueNone, 65210 Register(rn), 65211 WriteBack(WRITE_BACK), 65212 SRegisterList(SRegister(first), len)); 65213 if ((len == 0) || ((first + len) > kNumberOfSRegisters)) { 65214 UnpredictableA32(instr); 65215 } 65216 } else { 65217 UnallocatedA32(instr); 65218 } 65219 break; 65220 } 65221 case 0x00200100: { 65222 // 0x0d200b00 65223 switch (instr & 0x00800001) { 65224 case 0x00000000: { 65225 // 0x0d200b00 65226 if (((instr & 0xf0000000) == 0xf0000000)) { 65227 UnallocatedA32(instr); 65228 return; 65229 } 65230 if (((Uint32((instr >> 16)) & Uint32(0xf)) == 65231 Uint32(0xd)) && 65232 ((instr & 0xf0000000) != 0xf0000000)) { 65233 Condition condition((instr >> 28) & 0xf); 65234 unsigned first = ExtractDRegister(instr, 22, 12); 65235 unsigned imm8 = (instr & 0xff); 65236 unsigned len = imm8 / 2; 65237 unsigned end = first + len; 65238 // VPUSH{<c>}{<q>}{.<size>} <dreglist> ; A1 65239 vpush(condition, 65240 kDataTypeValueNone, 65241 DRegisterList(DRegister(first), len)); 65242 if ((len == 0) || (len > 16) || 65243 (end > kMaxNumberOfDRegisters)) { 65244 UnpredictableA32(instr); 65245 } 65246 return; 65247 } 65248 Condition condition((instr >> 28) & 0xf); 65249 unsigned rn = (instr >> 16) & 0xf; 65250 unsigned first = ExtractDRegister(instr, 22, 12); 65251 unsigned imm8 = (instr & 0xff); 65252 unsigned len = imm8 / 2; 65253 unsigned end = first + len; 65254 // VSTMDB{<c>}{<q>}{.<size>} <Rn>!, <dreglist> ; A1 65255 vstmdb(condition, 65256 kDataTypeValueNone, 65257 Register(rn), 65258 WriteBack(WRITE_BACK), 65259 DRegisterList(DRegister(first), len)); 65260 if ((len == 0) || (len > 16) || 65261 (end > kMaxNumberOfDRegisters)) { 65262 UnpredictableA32(instr); 65263 } 65264 break; 65265 } 65266 case 0x00000001: { 65267 // 0x0d200b01 65268 if (((instr & 0xf0000000) == 0xf0000000)) { 65269 UnallocatedA32(instr); 65270 return; 65271 } 65272 Condition condition((instr >> 28) & 0xf); 65273 unsigned rn = (instr >> 16) & 0xf; 65274 unsigned first = ExtractDRegister(instr, 22, 12); 65275 unsigned imm8 = (instr & 0xff); 65276 unsigned len = imm8 / 2; 65277 unsigned end = first + len; 65278 // FSTMDBX{<c>}{<q>} <Rn>!, <dreglist> ; A1 65279 fstmdbx(condition, 65280 Register(rn), 65281 WriteBack(WRITE_BACK), 65282 DRegisterList(DRegister(first), len)); 65283 if ((len == 0) || (len > 16) || (end > 16)) { 65284 UnpredictableA32(instr); 65285 } 65286 break; 65287 } 65288 default: 65289 UnallocatedA32(instr); 65290 break; 65291 } 65292 break; 65293 } 65294 } 65295 break; 65296 } 65297 case 0x01000e00: { 65298 // 0x0d000e00 65299 switch (instr & 0x0060f100) { 65300 case 0x00005000: { 65301 // 0x0d005e00 65302 if (((instr & 0xf0000000) == 0xf0000000)) { 65303 UnallocatedA32(instr); 65304 return; 65305 } 65306 UnimplementedA32("STC", instr); 65307 break; 65308 } 65309 case 0x00205000: { 65310 // 0x0d205e00 65311 if (((instr & 0xf0000000) == 0xf0000000)) { 65312 UnallocatedA32(instr); 65313 return; 65314 } 65315 UnimplementedA32("STC", instr); 65316 break; 65317 } 65318 default: 65319 UnallocatedA32(instr); 65320 break; 65321 } 65322 break; 65323 } 65324 case 0x01100a00: { 65325 // 0x0d100a00 65326 switch (instr & 0x00200100) { 65327 case 0x00000000: { 65328 // 0x0d100a00 65329 switch (instr & 0x000f0000) { 65330 case 0x000f0000: { 65331 // 0x0d1f0a00 65332 if (((instr & 0xf0000000) == 0xf0000000)) { 65333 UnallocatedA32(instr); 65334 return; 65335 } 65336 Condition condition((instr >> 28) & 0xf); 65337 unsigned rd = ExtractSRegister(instr, 22, 12); 65338 uint32_t U = (instr >> 23) & 0x1; 65339 int32_t imm = instr & 0xff; 65340 imm <<= 2; 65341 if (U == 0) imm = -imm; 65342 bool minus_zero = (imm == 0) && (U == 0); 65343 Location location(imm, kA32PcDelta); 65344 // VLDR{<c>}{<q>}{.32} <Sd>, <label> ; A2 65345 if (minus_zero) { 65346 vldr(condition, 65347 Untyped32, 65348 SRegister(rd), 65349 MemOperand(pc, minus, 0)); 65350 } else { 65351 vldr(condition, Untyped32, SRegister(rd), &location); 65352 } 65353 break; 65354 } 65355 default: { 65356 if (((instr & 0xf0000000) == 0xf0000000) || 65357 ((instr & 0xf0000) == 0xf0000)) { 65358 UnallocatedA32(instr); 65359 return; 65360 } 65361 Condition condition((instr >> 28) & 0xf); 65362 unsigned rd = ExtractSRegister(instr, 22, 12); 65363 unsigned rn = (instr >> 16) & 0xf; 65364 Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus); 65365 int32_t offset = (instr & 0xff) << 2; 65366 // VLDR{<c>}{<q>}{.32} <Sd>, [<Rn>{, #{+/-}<imm>}] ; A2 65367 vldr(condition, 65368 Untyped32, 65369 SRegister(rd), 65370 MemOperand(Register(rn), sign, offset, Offset)); 65371 break; 65372 } 65373 } 65374 break; 65375 } 65376 case 0x00000100: { 65377 // 0x0d100b00 65378 switch (instr & 0x000f0000) { 65379 case 0x000f0000: { 65380 // 0x0d1f0b00 65381 if (((instr & 0xf0000000) == 0xf0000000)) { 65382 UnallocatedA32(instr); 65383 return; 65384 } 65385 Condition condition((instr >> 28) & 0xf); 65386 unsigned rd = ExtractDRegister(instr, 22, 12); 65387 uint32_t U = (instr >> 23) & 0x1; 65388 int32_t imm = instr & 0xff; 65389 imm <<= 2; 65390 if (U == 0) imm = -imm; 65391 bool minus_zero = (imm == 0) && (U == 0); 65392 Location location(imm, kA32PcDelta); 65393 // VLDR{<c>}{<q>}{.64} <Dd>, <label> ; A1 65394 if (minus_zero) { 65395 vldr(condition, 65396 Untyped64, 65397 DRegister(rd), 65398 MemOperand(pc, minus, 0)); 65399 } else { 65400 vldr(condition, Untyped64, DRegister(rd), &location); 65401 } 65402 break; 65403 } 65404 default: { 65405 if (((instr & 0xf0000000) == 0xf0000000) || 65406 ((instr & 0xf0000) == 0xf0000)) { 65407 UnallocatedA32(instr); 65408 return; 65409 } 65410 Condition condition((instr >> 28) & 0xf); 65411 unsigned rd = ExtractDRegister(instr, 22, 12); 65412 unsigned rn = (instr >> 16) & 0xf; 65413 Sign sign((((instr >> 23) & 0x1) == 0) ? minus : plus); 65414 int32_t offset = (instr & 0xff) << 2; 65415 // VLDR{<c>}{<q>}{.64} <Dd>, [<Rn>{, #{+/-}<imm>}] ; A1 65416 vldr(condition, 65417 Untyped64, 65418 DRegister(rd), 65419 MemOperand(Register(rn), sign, offset, Offset)); 65420 break; 65421 } 65422 } 65423 break; 65424 } 65425 case 0x00200000: { 65426 // 0x0d300a00 65427 if ((instr & 0x00800000) == 0x00000000) { 65428 if (((instr & 0xf0000000) == 0xf0000000)) { 65429 UnallocatedA32(instr); 65430 return; 65431 } 65432 Condition condition((instr >> 28) & 0xf); 65433 unsigned rn = (instr >> 16) & 0xf; 65434 unsigned first = ExtractSRegister(instr, 22, 12); 65435 unsigned len = instr & 0xff; 65436 // VLDMDB{<c>}{<q>}{.<size>} <Rn>!, <sreglist> ; A2 65437 vldmdb(condition, 65438 kDataTypeValueNone, 65439 Register(rn), 65440 WriteBack(WRITE_BACK), 65441 SRegisterList(SRegister(first), len)); 65442 if ((len == 0) || ((first + len) > kNumberOfSRegisters)) { 65443 UnpredictableA32(instr); 65444 } 65445 } else { 65446 UnallocatedA32(instr); 65447 } 65448 break; 65449 } 65450 case 0x00200100: { 65451 // 0x0d300b00 65452 switch (instr & 0x00800001) { 65453 case 0x00000000: { 65454 // 0x0d300b00 65455 if (((instr & 0xf0000000) == 0xf0000000)) { 65456 UnallocatedA32(instr); 65457 return; 65458 } 65459 Condition condition((instr >> 28) & 0xf); 65460 unsigned rn = (instr >> 16) & 0xf; 65461 unsigned first = ExtractDRegister(instr, 22, 12); 65462 unsigned imm8 = (instr & 0xff); 65463 unsigned len = imm8 / 2; 65464 unsigned end = first + len; 65465 // VLDMDB{<c>}{<q>}{.<size>} <Rn>!, <dreglist> ; A1 65466 vldmdb(condition, 65467 kDataTypeValueNone, 65468 Register(rn), 65469 WriteBack(WRITE_BACK), 65470 DRegisterList(DRegister(first), len)); 65471 if ((len == 0) || (len > 16) || 65472 (end > kMaxNumberOfDRegisters)) { 65473 UnpredictableA32(instr); 65474 } 65475 break; 65476 } 65477 case 0x00000001: { 65478 // 0x0d300b01 65479 if (((instr & 0xf0000000) == 0xf0000000)) { 65480 UnallocatedA32(instr); 65481 return; 65482 } 65483 Condition condition((instr >> 28) & 0xf); 65484 unsigned rn = (instr >> 16) & 0xf; 65485 unsigned first = ExtractDRegister(instr, 22, 12); 65486 unsigned imm8 = (instr & 0xff); 65487 unsigned len = imm8 / 2; 65488 unsigned end = first + len; 65489 // FLDMDBX{<c>}{<q>} <Rn>!, <dreglist> ; A1 65490 fldmdbx(condition, 65491 Register(rn), 65492 WriteBack(WRITE_BACK), 65493 DRegisterList(DRegister(first), len)); 65494 if ((len == 0) || (len > 16) || (end > 16)) { 65495 UnpredictableA32(instr); 65496 } 65497 break; 65498 } 65499 default: 65500 UnallocatedA32(instr); 65501 break; 65502 } 65503 break; 65504 } 65505 } 65506 break; 65507 } 65508 case 0x01100e00: { 65509 // 0x0d100e00 65510 switch (instr & 0x0060f100) { 65511 case 0x00005000: { 65512 // 0x0d105e00 65513 switch (instr & 0x000f0000) { 65514 case 0x000f0000: { 65515 // 0x0d1f5e00 65516 if (((instr & 0xf0000000) == 0xf0000000)) { 65517 UnallocatedA32(instr); 65518 return; 65519 } 65520 UnimplementedA32("LDC", instr); 65521 break; 65522 } 65523 default: { 65524 if (((instr & 0xf0000000) == 0xf0000000) || 65525 ((instr & 0xf0000) == 0xf0000)) { 65526 UnallocatedA32(instr); 65527 return; 65528 } 65529 UnimplementedA32("LDC", instr); 65530 break; 65531 } 65532 } 65533 break; 65534 } 65535 case 0x00205000: { 65536 // 0x0d305e00 65537 if (((instr & 0xf0000000) == 0xf0000000) || 65538 ((instr & 0xf0000) == 0xf0000)) { 65539 UnallocatedA32(instr); 65540 return; 65541 } 65542 UnimplementedA32("LDC", instr); 65543 break; 65544 } 65545 default: 65546 UnallocatedA32(instr); 65547 break; 65548 } 65549 break; 65550 } 65551 default: 65552 UnallocatedA32(instr); 65553 break; 65554 } 65555 break; 65556 } 65557 case 0x0e000000: { 65558 // 0x0e000000 65559 switch (instr & 0x01000000) { 65560 case 0x00000000: { 65561 // 0x0e000000 65562 switch (instr & 0x00100e10) { 65563 case 0x00000a00: { 65564 // 0x0e000a00 65565 switch (instr & 0x00a00140) { 65566 case 0x00000000: { 65567 // 0x0e000a00 65568 if (((instr & 0xf0000000) == 0xf0000000)) { 65569 UnallocatedA32(instr); 65570 return; 65571 } 65572 Condition condition((instr >> 28) & 0xf); 65573 unsigned rd = ExtractSRegister(instr, 22, 12); 65574 unsigned rn = ExtractSRegister(instr, 7, 16); 65575 unsigned rm = ExtractSRegister(instr, 5, 0); 65576 // VMLA{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; A2 65577 vmla(condition, 65578 F32, 65579 SRegister(rd), 65580 SRegister(rn), 65581 SRegister(rm)); 65582 break; 65583 } 65584 case 0x00000040: { 65585 // 0x0e000a40 65586 if (((instr & 0xf0000000) == 0xf0000000)) { 65587 UnallocatedA32(instr); 65588 return; 65589 } 65590 Condition condition((instr >> 28) & 0xf); 65591 unsigned rd = ExtractSRegister(instr, 22, 12); 65592 unsigned rn = ExtractSRegister(instr, 7, 16); 65593 unsigned rm = ExtractSRegister(instr, 5, 0); 65594 // VMLS{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; A2 65595 vmls(condition, 65596 F32, 65597 SRegister(rd), 65598 SRegister(rn), 65599 SRegister(rm)); 65600 break; 65601 } 65602 case 0x00000100: { 65603 // 0x0e000b00 65604 if (((instr & 0xf0000000) == 0xf0000000)) { 65605 UnallocatedA32(instr); 65606 return; 65607 } 65608 Condition condition((instr >> 28) & 0xf); 65609 unsigned rd = ExtractDRegister(instr, 22, 12); 65610 unsigned rn = ExtractDRegister(instr, 7, 16); 65611 unsigned rm = ExtractDRegister(instr, 5, 0); 65612 // VMLA{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; A2 65613 vmla(condition, 65614 F64, 65615 DRegister(rd), 65616 DRegister(rn), 65617 DRegister(rm)); 65618 break; 65619 } 65620 case 0x00000140: { 65621 // 0x0e000b40 65622 if (((instr & 0xf0000000) == 0xf0000000)) { 65623 UnallocatedA32(instr); 65624 return; 65625 } 65626 Condition condition((instr >> 28) & 0xf); 65627 unsigned rd = ExtractDRegister(instr, 22, 12); 65628 unsigned rn = ExtractDRegister(instr, 7, 16); 65629 unsigned rm = ExtractDRegister(instr, 5, 0); 65630 // VMLS{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; A2 65631 vmls(condition, 65632 F64, 65633 DRegister(rd), 65634 DRegister(rn), 65635 DRegister(rm)); 65636 break; 65637 } 65638 case 0x00200000: { 65639 // 0x0e200a00 65640 if (((instr & 0xf0000000) == 0xf0000000)) { 65641 UnallocatedA32(instr); 65642 return; 65643 } 65644 Condition condition((instr >> 28) & 0xf); 65645 unsigned rd = ExtractSRegister(instr, 22, 12); 65646 unsigned rn = ExtractSRegister(instr, 7, 16); 65647 unsigned rm = ExtractSRegister(instr, 5, 0); 65648 // VMUL{<c>}{<q>}.F32 {<Sd>}, <Sn>, <Sm> ; A2 65649 vmul(condition, 65650 F32, 65651 SRegister(rd), 65652 SRegister(rn), 65653 SRegister(rm)); 65654 break; 65655 } 65656 case 0x00200040: { 65657 // 0x0e200a40 65658 if (((instr & 0xf0000000) == 0xf0000000)) { 65659 UnallocatedA32(instr); 65660 return; 65661 } 65662 Condition condition((instr >> 28) & 0xf); 65663 unsigned rd = ExtractSRegister(instr, 22, 12); 65664 unsigned rn = ExtractSRegister(instr, 7, 16); 65665 unsigned rm = ExtractSRegister(instr, 5, 0); 65666 // VNMUL{<c>}{<q>}.F32 {<Sd>}, <Sn>, <Sm> ; A1 65667 vnmul(condition, 65668 F32, 65669 SRegister(rd), 65670 SRegister(rn), 65671 SRegister(rm)); 65672 break; 65673 } 65674 case 0x00200100: { 65675 // 0x0e200b00 65676 if (((instr & 0xf0000000) == 0xf0000000)) { 65677 UnallocatedA32(instr); 65678 return; 65679 } 65680 Condition condition((instr >> 28) & 0xf); 65681 unsigned rd = ExtractDRegister(instr, 22, 12); 65682 unsigned rn = ExtractDRegister(instr, 7, 16); 65683 unsigned rm = ExtractDRegister(instr, 5, 0); 65684 // VMUL{<c>}{<q>}.F64 {<Dd>}, <Dn>, <Dm> ; A2 65685 vmul(condition, 65686 F64, 65687 DRegister(rd), 65688 DRegister(rn), 65689 DRegister(rm)); 65690 break; 65691 } 65692 case 0x00200140: { 65693 // 0x0e200b40 65694 if (((instr & 0xf0000000) == 0xf0000000)) { 65695 UnallocatedA32(instr); 65696 return; 65697 } 65698 Condition condition((instr >> 28) & 0xf); 65699 unsigned rd = ExtractDRegister(instr, 22, 12); 65700 unsigned rn = ExtractDRegister(instr, 7, 16); 65701 unsigned rm = ExtractDRegister(instr, 5, 0); 65702 // VNMUL{<c>}{<q>}.F64 {<Dd>}, <Dn>, <Dm> ; A1 65703 vnmul(condition, 65704 F64, 65705 DRegister(rd), 65706 DRegister(rn), 65707 DRegister(rm)); 65708 break; 65709 } 65710 case 0x00800000: { 65711 // 0x0e800a00 65712 if (((instr & 0xf0000000) == 0xf0000000)) { 65713 UnallocatedA32(instr); 65714 return; 65715 } 65716 Condition condition((instr >> 28) & 0xf); 65717 unsigned rd = ExtractSRegister(instr, 22, 12); 65718 unsigned rn = ExtractSRegister(instr, 7, 16); 65719 unsigned rm = ExtractSRegister(instr, 5, 0); 65720 // VDIV{<c>}{<q>}.F32 {<Sd>}, <Sn>, <Sm> ; A1 65721 vdiv(condition, 65722 F32, 65723 SRegister(rd), 65724 SRegister(rn), 65725 SRegister(rm)); 65726 break; 65727 } 65728 case 0x00800100: { 65729 // 0x0e800b00 65730 if (((instr & 0xf0000000) == 0xf0000000)) { 65731 UnallocatedA32(instr); 65732 return; 65733 } 65734 Condition condition((instr >> 28) & 0xf); 65735 unsigned rd = ExtractDRegister(instr, 22, 12); 65736 unsigned rn = ExtractDRegister(instr, 7, 16); 65737 unsigned rm = ExtractDRegister(instr, 5, 0); 65738 // VDIV{<c>}{<q>}.F64 {<Dd>}, <Dn>, <Dm> ; A1 65739 vdiv(condition, 65740 F64, 65741 DRegister(rd), 65742 DRegister(rn), 65743 DRegister(rm)); 65744 break; 65745 } 65746 case 0x00a00000: { 65747 // 0x0ea00a00 65748 if (((instr & 0xf0000000) == 0xf0000000)) { 65749 UnallocatedA32(instr); 65750 return; 65751 } 65752 Condition condition((instr >> 28) & 0xf); 65753 unsigned rd = ExtractSRegister(instr, 22, 12); 65754 unsigned rn = ExtractSRegister(instr, 7, 16); 65755 unsigned rm = ExtractSRegister(instr, 5, 0); 65756 // VFMA{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; A2 65757 vfma(condition, 65758 F32, 65759 SRegister(rd), 65760 SRegister(rn), 65761 SRegister(rm)); 65762 break; 65763 } 65764 case 0x00a00040: { 65765 // 0x0ea00a40 65766 if (((instr & 0xf0000000) == 0xf0000000)) { 65767 UnallocatedA32(instr); 65768 return; 65769 } 65770 Condition condition((instr >> 28) & 0xf); 65771 unsigned rd = ExtractSRegister(instr, 22, 12); 65772 unsigned rn = ExtractSRegister(instr, 7, 16); 65773 unsigned rm = ExtractSRegister(instr, 5, 0); 65774 // VFMS{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; A2 65775 vfms(condition, 65776 F32, 65777 SRegister(rd), 65778 SRegister(rn), 65779 SRegister(rm)); 65780 break; 65781 } 65782 case 0x00a00100: { 65783 // 0x0ea00b00 65784 if (((instr & 0xf0000000) == 0xf0000000)) { 65785 UnallocatedA32(instr); 65786 return; 65787 } 65788 Condition condition((instr >> 28) & 0xf); 65789 unsigned rd = ExtractDRegister(instr, 22, 12); 65790 unsigned rn = ExtractDRegister(instr, 7, 16); 65791 unsigned rm = ExtractDRegister(instr, 5, 0); 65792 // VFMA{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; A2 65793 vfma(condition, 65794 F64, 65795 DRegister(rd), 65796 DRegister(rn), 65797 DRegister(rm)); 65798 break; 65799 } 65800 case 0x00a00140: { 65801 // 0x0ea00b40 65802 if (((instr & 0xf0000000) == 0xf0000000)) { 65803 UnallocatedA32(instr); 65804 return; 65805 } 65806 Condition condition((instr >> 28) & 0xf); 65807 unsigned rd = ExtractDRegister(instr, 22, 12); 65808 unsigned rn = ExtractDRegister(instr, 7, 16); 65809 unsigned rm = ExtractDRegister(instr, 5, 0); 65810 // VFMS{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; A2 65811 vfms(condition, 65812 F64, 65813 DRegister(rd), 65814 DRegister(rn), 65815 DRegister(rm)); 65816 break; 65817 } 65818 default: 65819 UnallocatedA32(instr); 65820 break; 65821 } 65822 break; 65823 } 65824 case 0x00000a10: { 65825 // 0x0e000a10 65826 switch (instr & 0x00800100) { 65827 case 0x00000000: { 65828 // 0x0e000a10 65829 if ((instr & 0x00600000) == 0x00000000) { 65830 if (((instr & 0xf0000000) == 0xf0000000)) { 65831 UnallocatedA32(instr); 65832 return; 65833 } 65834 Condition condition((instr >> 28) & 0xf); 65835 unsigned rn = ExtractSRegister(instr, 7, 16); 65836 unsigned rt = (instr >> 12) & 0xf; 65837 // VMOV{<c>}{<q>} <Sn>, <Rt> ; A1 65838 vmov(condition, SRegister(rn), Register(rt)); 65839 if (((instr & 0xff00f7f) != 0xe000a10)) { 65840 UnpredictableA32(instr); 65841 } 65842 } else { 65843 UnallocatedA32(instr); 65844 } 65845 break; 65846 } 65847 case 0x00000100: { 65848 // 0x0e000b10 65849 if (((instr & 0xf0000000) == 0xf0000000)) { 65850 UnallocatedA32(instr); 65851 return; 65852 } 65853 Condition condition((instr >> 28) & 0xf); 65854 unsigned lane; 65855 DataType dt = 65856 Dt_opc1_opc2_1_Decode(((instr >> 5) & 0x3) | 65857 ((instr >> 19) & 0xc), 65858 &lane); 65859 if (dt.Is(kDataTypeValueInvalid)) { 65860 UnallocatedA32(instr); 65861 return; 65862 } 65863 unsigned rd = ExtractDRegister(instr, 7, 16); 65864 unsigned rt = (instr >> 12) & 0xf; 65865 // VMOV{<c>}{<q>}{.<size>} <Dd[x]>, <Rt> ; A1 65866 vmov(condition, dt, DRegisterLane(rd, lane), Register(rt)); 65867 if (((instr & 0xf900f1f) != 0xe000b10)) { 65868 UnpredictableA32(instr); 65869 } 65870 break; 65871 } 65872 case 0x00800000: { 65873 // 0x0e800a10 65874 if ((instr & 0x00600000) == 0x00600000) { 65875 if (((instr & 0xf0000000) == 0xf0000000)) { 65876 UnallocatedA32(instr); 65877 return; 65878 } 65879 Condition condition((instr >> 28) & 0xf); 65880 unsigned spec_reg = (instr >> 16) & 0xf; 65881 unsigned rt = (instr >> 12) & 0xf; 65882 switch (spec_reg) { 65883 case 0x0: 65884 case 0x1: 65885 case 0x8: { 65886 // VMSR{<c>}{<q>} <spec_reg>, <Rt> ; A1 65887 vmsr(condition, 65888 SpecialFPRegister(spec_reg), 65889 Register(rt)); 65890 if (((instr & 0xff00fff) != 0xee00a10)) { 65891 UnpredictableA32(instr); 65892 } 65893 break; 65894 } 65895 default: 65896 UnallocatedA32(instr); 65897 break; 65898 } 65899 } else { 65900 UnallocatedA32(instr); 65901 } 65902 break; 65903 } 65904 case 0x00800100: { 65905 // 0x0e800b10 65906 switch (instr & 0x00200040) { 65907 case 0x00000000: { 65908 // 0x0e800b10 65909 if (((instr & 0xf0000000) == 0xf0000000)) { 65910 UnallocatedA32(instr); 65911 return; 65912 } 65913 Condition condition((instr >> 28) & 0xf); 65914 DataType dt = Dt_B_E_1_Decode(((instr >> 5) & 0x1) | 65915 ((instr >> 21) & 0x2)); 65916 if (dt.Is(kDataTypeValueInvalid)) { 65917 UnallocatedA32(instr); 65918 return; 65919 } 65920 unsigned rd = ExtractDRegister(instr, 7, 16); 65921 unsigned rt = (instr >> 12) & 0xf; 65922 // VDUP{<c>}{<q>}.<dt> <Dd>, <Rt> ; A1 65923 vdup(condition, dt, DRegister(rd), Register(rt)); 65924 if (((instr & 0xfb00f5f) != 0xe800b10)) { 65925 UnpredictableA32(instr); 65926 } 65927 break; 65928 } 65929 case 0x00200000: { 65930 // 0x0ea00b10 65931 if (((instr & 0xf0000000) == 0xf0000000)) { 65932 UnallocatedA32(instr); 65933 return; 65934 } 65935 Condition condition((instr >> 28) & 0xf); 65936 DataType dt = Dt_B_E_1_Decode(((instr >> 5) & 0x1) | 65937 ((instr >> 21) & 0x2)); 65938 if (dt.Is(kDataTypeValueInvalid)) { 65939 UnallocatedA32(instr); 65940 return; 65941 } 65942 if (((instr >> 16) & 1) != 0) { 65943 UnallocatedA32(instr); 65944 return; 65945 } 65946 unsigned rd = ExtractQRegister(instr, 7, 16); 65947 unsigned rt = (instr >> 12) & 0xf; 65948 // VDUP{<c>}{<q>}.<dt> <Qd>, <Rt> ; A1 65949 vdup(condition, dt, QRegister(rd), Register(rt)); 65950 if (((instr & 0xfb00f5f) != 0xea00b10)) { 65951 UnpredictableA32(instr); 65952 } 65953 break; 65954 } 65955 default: 65956 UnallocatedA32(instr); 65957 break; 65958 } 65959 break; 65960 } 65961 } 65962 break; 65963 } 65964 case 0x00000e10: { 65965 // 0x0e000e10 65966 if (((instr & 0xf0000000) == 0xf0000000)) { 65967 UnallocatedA32(instr); 65968 return; 65969 } 65970 UnimplementedA32("MCR", instr); 65971 break; 65972 } 65973 case 0x00100a00: { 65974 // 0x0e100a00 65975 switch (instr & 0x00a00140) { 65976 case 0x00000000: { 65977 // 0x0e100a00 65978 if (((instr & 0xf0000000) == 0xf0000000)) { 65979 UnallocatedA32(instr); 65980 return; 65981 } 65982 Condition condition((instr >> 28) & 0xf); 65983 unsigned rd = ExtractSRegister(instr, 22, 12); 65984 unsigned rn = ExtractSRegister(instr, 7, 16); 65985 unsigned rm = ExtractSRegister(instr, 5, 0); 65986 // VNMLS{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; A1 65987 vnmls(condition, 65988 F32, 65989 SRegister(rd), 65990 SRegister(rn), 65991 SRegister(rm)); 65992 break; 65993 } 65994 case 0x00000040: { 65995 // 0x0e100a40 65996 if (((instr & 0xf0000000) == 0xf0000000)) { 65997 UnallocatedA32(instr); 65998 return; 65999 } 66000 Condition condition((instr >> 28) & 0xf); 66001 unsigned rd = ExtractSRegister(instr, 22, 12); 66002 unsigned rn = ExtractSRegister(instr, 7, 16); 66003 unsigned rm = ExtractSRegister(instr, 5, 0); 66004 // VNMLA{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; A1 66005 vnmla(condition, 66006 F32, 66007 SRegister(rd), 66008 SRegister(rn), 66009 SRegister(rm)); 66010 break; 66011 } 66012 case 0x00000100: { 66013 // 0x0e100b00 66014 if (((instr & 0xf0000000) == 0xf0000000)) { 66015 UnallocatedA32(instr); 66016 return; 66017 } 66018 Condition condition((instr >> 28) & 0xf); 66019 unsigned rd = ExtractDRegister(instr, 22, 12); 66020 unsigned rn = ExtractDRegister(instr, 7, 16); 66021 unsigned rm = ExtractDRegister(instr, 5, 0); 66022 // VNMLS{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; A1 66023 vnmls(condition, 66024 F64, 66025 DRegister(rd), 66026 DRegister(rn), 66027 DRegister(rm)); 66028 break; 66029 } 66030 case 0x00000140: { 66031 // 0x0e100b40 66032 if (((instr & 0xf0000000) == 0xf0000000)) { 66033 UnallocatedA32(instr); 66034 return; 66035 } 66036 Condition condition((instr >> 28) & 0xf); 66037 unsigned rd = ExtractDRegister(instr, 22, 12); 66038 unsigned rn = ExtractDRegister(instr, 7, 16); 66039 unsigned rm = ExtractDRegister(instr, 5, 0); 66040 // VNMLA{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; A1 66041 vnmla(condition, 66042 F64, 66043 DRegister(rd), 66044 DRegister(rn), 66045 DRegister(rm)); 66046 break; 66047 } 66048 case 0x00200000: { 66049 // 0x0e300a00 66050 if (((instr & 0xf0000000) == 0xf0000000)) { 66051 UnallocatedA32(instr); 66052 return; 66053 } 66054 Condition condition((instr >> 28) & 0xf); 66055 unsigned rd = ExtractSRegister(instr, 22, 12); 66056 unsigned rn = ExtractSRegister(instr, 7, 16); 66057 unsigned rm = ExtractSRegister(instr, 5, 0); 66058 // VADD{<c>}{<q>}.F32 {<Sd>}, <Sn>, <Sm> ; A2 66059 vadd(condition, 66060 F32, 66061 SRegister(rd), 66062 SRegister(rn), 66063 SRegister(rm)); 66064 break; 66065 } 66066 case 0x00200040: { 66067 // 0x0e300a40 66068 if (((instr & 0xf0000000) == 0xf0000000)) { 66069 UnallocatedA32(instr); 66070 return; 66071 } 66072 Condition condition((instr >> 28) & 0xf); 66073 unsigned rd = ExtractSRegister(instr, 22, 12); 66074 unsigned rn = ExtractSRegister(instr, 7, 16); 66075 unsigned rm = ExtractSRegister(instr, 5, 0); 66076 // VSUB{<c>}{<q>}.F32 {<Sd>}, <Sn>, <Sm> ; A2 66077 vsub(condition, 66078 F32, 66079 SRegister(rd), 66080 SRegister(rn), 66081 SRegister(rm)); 66082 break; 66083 } 66084 case 0x00200100: { 66085 // 0x0e300b00 66086 if (((instr & 0xf0000000) == 0xf0000000)) { 66087 UnallocatedA32(instr); 66088 return; 66089 } 66090 Condition condition((instr >> 28) & 0xf); 66091 unsigned rd = ExtractDRegister(instr, 22, 12); 66092 unsigned rn = ExtractDRegister(instr, 7, 16); 66093 unsigned rm = ExtractDRegister(instr, 5, 0); 66094 // VADD{<c>}{<q>}.F64 {<Dd>}, <Dn>, <Dm> ; A2 66095 vadd(condition, 66096 F64, 66097 DRegister(rd), 66098 DRegister(rn), 66099 DRegister(rm)); 66100 break; 66101 } 66102 case 0x00200140: { 66103 // 0x0e300b40 66104 if (((instr & 0xf0000000) == 0xf0000000)) { 66105 UnallocatedA32(instr); 66106 return; 66107 } 66108 Condition condition((instr >> 28) & 0xf); 66109 unsigned rd = ExtractDRegister(instr, 22, 12); 66110 unsigned rn = ExtractDRegister(instr, 7, 16); 66111 unsigned rm = ExtractDRegister(instr, 5, 0); 66112 // VSUB{<c>}{<q>}.F64 {<Dd>}, <Dn>, <Dm> ; A2 66113 vsub(condition, 66114 F64, 66115 DRegister(rd), 66116 DRegister(rn), 66117 DRegister(rm)); 66118 break; 66119 } 66120 case 0x00800000: { 66121 // 0x0e900a00 66122 if (((instr & 0xf0000000) == 0xf0000000)) { 66123 UnallocatedA32(instr); 66124 return; 66125 } 66126 Condition condition((instr >> 28) & 0xf); 66127 unsigned rd = ExtractSRegister(instr, 22, 12); 66128 unsigned rn = ExtractSRegister(instr, 7, 16); 66129 unsigned rm = ExtractSRegister(instr, 5, 0); 66130 // VFNMS{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; A1 66131 vfnms(condition, 66132 F32, 66133 SRegister(rd), 66134 SRegister(rn), 66135 SRegister(rm)); 66136 break; 66137 } 66138 case 0x00800040: { 66139 // 0x0e900a40 66140 if (((instr & 0xf0000000) == 0xf0000000)) { 66141 UnallocatedA32(instr); 66142 return; 66143 } 66144 Condition condition((instr >> 28) & 0xf); 66145 unsigned rd = ExtractSRegister(instr, 22, 12); 66146 unsigned rn = ExtractSRegister(instr, 7, 16); 66147 unsigned rm = ExtractSRegister(instr, 5, 0); 66148 // VFNMA{<c>}{<q>}.F32 <Sd>, <Sn>, <Sm> ; A1 66149 vfnma(condition, 66150 F32, 66151 SRegister(rd), 66152 SRegister(rn), 66153 SRegister(rm)); 66154 break; 66155 } 66156 case 0x00800100: { 66157 // 0x0e900b00 66158 if (((instr & 0xf0000000) == 0xf0000000)) { 66159 UnallocatedA32(instr); 66160 return; 66161 } 66162 Condition condition((instr >> 28) & 0xf); 66163 unsigned rd = ExtractDRegister(instr, 22, 12); 66164 unsigned rn = ExtractDRegister(instr, 7, 16); 66165 unsigned rm = ExtractDRegister(instr, 5, 0); 66166 // VFNMS{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; A1 66167 vfnms(condition, 66168 F64, 66169 DRegister(rd), 66170 DRegister(rn), 66171 DRegister(rm)); 66172 break; 66173 } 66174 case 0x00800140: { 66175 // 0x0e900b40 66176 if (((instr & 0xf0000000) == 0xf0000000)) { 66177 UnallocatedA32(instr); 66178 return; 66179 } 66180 Condition condition((instr >> 28) & 0xf); 66181 unsigned rd = ExtractDRegister(instr, 22, 12); 66182 unsigned rn = ExtractDRegister(instr, 7, 16); 66183 unsigned rm = ExtractDRegister(instr, 5, 0); 66184 // VFNMA{<c>}{<q>}.F64 <Dd>, <Dn>, <Dm> ; A1 66185 vfnma(condition, 66186 F64, 66187 DRegister(rd), 66188 DRegister(rn), 66189 DRegister(rm)); 66190 break; 66191 } 66192 case 0x00a00000: { 66193 // 0x0eb00a00 66194 if (((instr & 0xf0000000) == 0xf0000000)) { 66195 UnallocatedA32(instr); 66196 return; 66197 } 66198 Condition condition((instr >> 28) & 0xf); 66199 unsigned rd = ExtractSRegister(instr, 22, 12); 66200 uint32_t encoded_imm = 66201 (instr & 0xf) | ((instr >> 12) & 0xf0); 66202 NeonImmediate imm = 66203 ImmediateVFP::Decode<float>(encoded_imm); 66204 // VMOV{<c>}{<q>}.F32 <Sd>, #<imm> ; A2 66205 vmov(condition, F32, SRegister(rd), imm); 66206 if (((instr & 0xfb00ff0) != 0xeb00a00)) { 66207 UnpredictableA32(instr); 66208 } 66209 break; 66210 } 66211 case 0x00a00040: { 66212 // 0x0eb00a40 66213 switch (instr & 0x000e0000) { 66214 case 0x00000000: { 66215 // 0x0eb00a40 66216 switch (instr & 0x00010080) { 66217 case 0x00000000: { 66218 // 0x0eb00a40 66219 if (((instr & 0xf0000000) == 0xf0000000)) { 66220 UnallocatedA32(instr); 66221 return; 66222 } 66223 Condition condition((instr >> 28) & 0xf); 66224 unsigned rd = ExtractSRegister(instr, 22, 12); 66225 unsigned rm = ExtractSRegister(instr, 5, 0); 66226 // VMOV{<c>}{<q>}.F32 <Sd>, <Sm> ; A2 66227 vmov(condition, F32, SRegister(rd), SRegister(rm)); 66228 break; 66229 } 66230 case 0x00000080: { 66231 // 0x0eb00ac0 66232 if (((instr & 0xf0000000) == 0xf0000000)) { 66233 UnallocatedA32(instr); 66234 return; 66235 } 66236 Condition condition((instr >> 28) & 0xf); 66237 unsigned rd = ExtractSRegister(instr, 22, 12); 66238 unsigned rm = ExtractSRegister(instr, 5, 0); 66239 // VABS{<c>}{<q>}.F32 <Sd>, <Sm> ; A2 66240 vabs(condition, F32, SRegister(rd), SRegister(rm)); 66241 break; 66242 } 66243 case 0x00010000: { 66244 // 0x0eb10a40 66245 if (((instr & 0xf0000000) == 0xf0000000)) { 66246 UnallocatedA32(instr); 66247 return; 66248 } 66249 Condition condition((instr >> 28) & 0xf); 66250 unsigned rd = ExtractSRegister(instr, 22, 12); 66251 unsigned rm = ExtractSRegister(instr, 5, 0); 66252 // VNEG{<c>}{<q>}.F32 <Sd>, <Sm> ; A2 66253 vneg(condition, F32, SRegister(rd), SRegister(rm)); 66254 break; 66255 } 66256 case 0x00010080: { 66257 // 0x0eb10ac0 66258 if (((instr & 0xf0000000) == 0xf0000000)) { 66259 UnallocatedA32(instr); 66260 return; 66261 } 66262 Condition condition((instr >> 28) & 0xf); 66263 unsigned rd = ExtractSRegister(instr, 22, 12); 66264 unsigned rm = ExtractSRegister(instr, 5, 0); 66265 // VSQRT{<c>}{<q>}.F32 <Sd>, <Sm> ; A1 66266 vsqrt(condition, F32, SRegister(rd), SRegister(rm)); 66267 break; 66268 } 66269 } 66270 break; 66271 } 66272 case 0x00020000: { 66273 // 0x0eb20a40 66274 switch (instr & 0x00010080) { 66275 case 0x00000000: { 66276 // 0x0eb20a40 66277 if (((instr & 0xf0000000) == 0xf0000000)) { 66278 UnallocatedA32(instr); 66279 return; 66280 } 66281 Condition condition((instr >> 28) & 0xf); 66282 unsigned rd = ExtractSRegister(instr, 22, 12); 66283 unsigned rm = ExtractSRegister(instr, 5, 0); 66284 // VCVTB{<c>}{<q>}.F32.F16 <Sd>, <Sm> ; A1 66285 vcvtb(condition, 66286 F32, 66287 F16, 66288 SRegister(rd), 66289 SRegister(rm)); 66290 break; 66291 } 66292 case 0x00000080: { 66293 // 0x0eb20ac0 66294 if (((instr & 0xf0000000) == 0xf0000000)) { 66295 UnallocatedA32(instr); 66296 return; 66297 } 66298 Condition condition((instr >> 28) & 0xf); 66299 unsigned rd = ExtractSRegister(instr, 22, 12); 66300 unsigned rm = ExtractSRegister(instr, 5, 0); 66301 // VCVTT{<c>}{<q>}.F32.F16 <Sd>, <Sm> ; A1 66302 vcvtt(condition, 66303 F32, 66304 F16, 66305 SRegister(rd), 66306 SRegister(rm)); 66307 break; 66308 } 66309 case 0x00010000: { 66310 // 0x0eb30a40 66311 if (((instr & 0xf0000000) == 0xf0000000)) { 66312 UnallocatedA32(instr); 66313 return; 66314 } 66315 Condition condition((instr >> 28) & 0xf); 66316 unsigned rd = ExtractSRegister(instr, 22, 12); 66317 unsigned rm = ExtractSRegister(instr, 5, 0); 66318 // VCVTB{<c>}{<q>}.F16.F32 <Sd>, <Sm> ; A1 66319 vcvtb(condition, 66320 F16, 66321 F32, 66322 SRegister(rd), 66323 SRegister(rm)); 66324 break; 66325 } 66326 case 0x00010080: { 66327 // 0x0eb30ac0 66328 if (((instr & 0xf0000000) == 0xf0000000)) { 66329 UnallocatedA32(instr); 66330 return; 66331 } 66332 Condition condition((instr >> 28) & 0xf); 66333 unsigned rd = ExtractSRegister(instr, 22, 12); 66334 unsigned rm = ExtractSRegister(instr, 5, 0); 66335 // VCVTT{<c>}{<q>}.F16.F32 <Sd>, <Sm> ; A1 66336 vcvtt(condition, 66337 F16, 66338 F32, 66339 SRegister(rd), 66340 SRegister(rm)); 66341 break; 66342 } 66343 } 66344 break; 66345 } 66346 case 0x00040000: { 66347 // 0x0eb40a40 66348 switch (instr & 0x00010080) { 66349 case 0x00000000: { 66350 // 0x0eb40a40 66351 if (((instr & 0xf0000000) == 0xf0000000)) { 66352 UnallocatedA32(instr); 66353 return; 66354 } 66355 Condition condition((instr >> 28) & 0xf); 66356 unsigned rd = ExtractSRegister(instr, 22, 12); 66357 unsigned rm = ExtractSRegister(instr, 5, 0); 66358 // VCMP{<c>}{<q>}.F32 <Sd>, <Sm> ; A1 66359 vcmp(condition, F32, SRegister(rd), SRegister(rm)); 66360 break; 66361 } 66362 case 0x00000080: { 66363 // 0x0eb40ac0 66364 if (((instr & 0xf0000000) == 0xf0000000)) { 66365 UnallocatedA32(instr); 66366 return; 66367 } 66368 Condition condition((instr >> 28) & 0xf); 66369 unsigned rd = ExtractSRegister(instr, 22, 12); 66370 unsigned rm = ExtractSRegister(instr, 5, 0); 66371 // VCMPE{<c>}{<q>}.F32 <Sd>, <Sm> ; A1 66372 vcmpe(condition, F32, SRegister(rd), SRegister(rm)); 66373 break; 66374 } 66375 case 0x00010000: { 66376 // 0x0eb50a40 66377 if (((instr & 0xf0000000) == 0xf0000000)) { 66378 UnallocatedA32(instr); 66379 return; 66380 } 66381 Condition condition((instr >> 28) & 0xf); 66382 unsigned rd = ExtractSRegister(instr, 22, 12); 66383 // VCMP{<c>}{<q>}.F32 <Sd>, #0.0 ; A2 66384 vcmp(condition, F32, SRegister(rd), 0.0); 66385 if (((instr & 0xfbf0fff) != 0xeb50a40)) { 66386 UnpredictableA32(instr); 66387 } 66388 break; 66389 } 66390 case 0x00010080: { 66391 // 0x0eb50ac0 66392 if (((instr & 0xf0000000) == 0xf0000000)) { 66393 UnallocatedA32(instr); 66394 return; 66395 } 66396 Condition condition((instr >> 28) & 0xf); 66397 unsigned rd = ExtractSRegister(instr, 22, 12); 66398 // VCMPE{<c>}{<q>}.F32 <Sd>, #0.0 ; A2 66399 vcmpe(condition, F32, SRegister(rd), 0.0); 66400 if (((instr & 0xfbf0fff) != 0xeb50ac0)) { 66401 UnpredictableA32(instr); 66402 } 66403 break; 66404 } 66405 } 66406 break; 66407 } 66408 case 0x00060000: { 66409 // 0x0eb60a40 66410 switch (instr & 0x00010080) { 66411 case 0x00000000: { 66412 // 0x0eb60a40 66413 if (((instr & 0xf0000000) == 0xf0000000)) { 66414 UnallocatedA32(instr); 66415 return; 66416 } 66417 Condition condition((instr >> 28) & 0xf); 66418 unsigned rd = ExtractSRegister(instr, 22, 12); 66419 unsigned rm = ExtractSRegister(instr, 5, 0); 66420 // VRINTR{<c>}{<q>}.F32 <Sd>, <Sm> ; A1 66421 vrintr(condition, 66422 F32, 66423 SRegister(rd), 66424 SRegister(rm)); 66425 break; 66426 } 66427 case 0x00000080: { 66428 // 0x0eb60ac0 66429 if (((instr & 0xf0000000) == 0xf0000000)) { 66430 UnallocatedA32(instr); 66431 return; 66432 } 66433 Condition condition((instr >> 28) & 0xf); 66434 unsigned rd = ExtractSRegister(instr, 22, 12); 66435 unsigned rm = ExtractSRegister(instr, 5, 0); 66436 // VRINTZ{<c>}{<q>}.F32 <Sd>, <Sm> ; A1 66437 vrintz(condition, 66438 F32, 66439 SRegister(rd), 66440 SRegister(rm)); 66441 break; 66442 } 66443 case 0x00010000: { 66444 // 0x0eb70a40 66445 if (((instr & 0xf0000000) == 0xf0000000)) { 66446 UnallocatedA32(instr); 66447 return; 66448 } 66449 Condition condition((instr >> 28) & 0xf); 66450 unsigned rd = ExtractSRegister(instr, 22, 12); 66451 unsigned rm = ExtractSRegister(instr, 5, 0); 66452 // VRINTX{<c>}{<q>}.F32 <Sd>, <Sm> ; A1 66453 vrintx(condition, 66454 F32, 66455 SRegister(rd), 66456 SRegister(rm)); 66457 break; 66458 } 66459 case 0x00010080: { 66460 // 0x0eb70ac0 66461 if (((instr & 0xf0000000) == 0xf0000000)) { 66462 UnallocatedA32(instr); 66463 return; 66464 } 66465 Condition condition((instr >> 28) & 0xf); 66466 unsigned rd = ExtractDRegister(instr, 22, 12); 66467 unsigned rm = ExtractSRegister(instr, 5, 0); 66468 // VCVT{<c>}{<q>}.F64.F32 <Dd>, <Sm> ; A1 66469 vcvt(condition, 66470 F64, 66471 F32, 66472 DRegister(rd), 66473 SRegister(rm)); 66474 break; 66475 } 66476 } 66477 break; 66478 } 66479 case 0x00080000: { 66480 // 0x0eb80a40 66481 if ((instr & 0x00010000) == 0x00000000) { 66482 if (((instr & 0xf0000000) == 0xf0000000)) { 66483 UnallocatedA32(instr); 66484 return; 66485 } 66486 Condition condition((instr >> 28) & 0xf); 66487 DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1); 66488 if (dt.Is(kDataTypeValueInvalid)) { 66489 UnallocatedA32(instr); 66490 return; 66491 } 66492 unsigned rd = ExtractSRegister(instr, 22, 12); 66493 unsigned rm = ExtractSRegister(instr, 5, 0); 66494 // VCVT{<c>}{<q>}.F32.<dt> <Sd>, <Sm> ; A1 66495 vcvt(condition, 66496 F32, 66497 dt, 66498 SRegister(rd), 66499 SRegister(rm)); 66500 } else { 66501 UnallocatedA32(instr); 66502 } 66503 break; 66504 } 66505 case 0x000a0000: { 66506 // 0x0eba0a40 66507 if (((instr & 0xf0000000) == 0xf0000000)) { 66508 UnallocatedA32(instr); 66509 return; 66510 } 66511 Condition condition((instr >> 28) & 0xf); 66512 DataType dt = Dt_U_sx_1_Decode(((instr >> 7) & 0x1) | 66513 ((instr >> 15) & 0x2)); 66514 if (dt.Is(kDataTypeValueInvalid)) { 66515 UnallocatedA32(instr); 66516 return; 66517 } 66518 unsigned rd = ExtractSRegister(instr, 22, 12); 66519 unsigned offset = 32; 66520 if (dt.Is(S16) || dt.Is(U16)) { 66521 offset = 16; 66522 } 66523 uint32_t fbits = offset - (((instr >> 5) & 0x1) | 66524 ((instr << 1) & 0x1e)); 66525 // VCVT{<c>}{<q>}.F32.<dt> <Sdm>, <Sdm>, #<fbits> ; A1 66526 vcvt(condition, 66527 F32, 66528 dt, 66529 SRegister(rd), 66530 SRegister(rd), 66531 fbits); 66532 break; 66533 } 66534 case 0x000c0000: { 66535 // 0x0ebc0a40 66536 switch (instr & 0x00010080) { 66537 case 0x00000000: { 66538 // 0x0ebc0a40 66539 if (((instr & 0xf0000000) == 0xf0000000)) { 66540 UnallocatedA32(instr); 66541 return; 66542 } 66543 Condition condition((instr >> 28) & 0xf); 66544 unsigned rd = ExtractSRegister(instr, 22, 12); 66545 unsigned rm = ExtractSRegister(instr, 5, 0); 66546 // VCVTR{<c>}{<q>}.U32.F32 <Sd>, <Sm> ; A1 66547 vcvtr(condition, 66548 U32, 66549 F32, 66550 SRegister(rd), 66551 SRegister(rm)); 66552 break; 66553 } 66554 case 0x00000080: { 66555 // 0x0ebc0ac0 66556 if (((instr & 0xf0000000) == 0xf0000000)) { 66557 UnallocatedA32(instr); 66558 return; 66559 } 66560 Condition condition((instr >> 28) & 0xf); 66561 unsigned rd = ExtractSRegister(instr, 22, 12); 66562 unsigned rm = ExtractSRegister(instr, 5, 0); 66563 // VCVT{<c>}{<q>}.U32.F32 <Sd>, <Sm> ; A1 66564 vcvt(condition, 66565 U32, 66566 F32, 66567 SRegister(rd), 66568 SRegister(rm)); 66569 break; 66570 } 66571 case 0x00010000: { 66572 // 0x0ebd0a40 66573 if (((instr & 0xf0000000) == 0xf0000000)) { 66574 UnallocatedA32(instr); 66575 return; 66576 } 66577 Condition condition((instr >> 28) & 0xf); 66578 unsigned rd = ExtractSRegister(instr, 22, 12); 66579 unsigned rm = ExtractSRegister(instr, 5, 0); 66580 // VCVTR{<c>}{<q>}.S32.F32 <Sd>, <Sm> ; A1 66581 vcvtr(condition, 66582 S32, 66583 F32, 66584 SRegister(rd), 66585 SRegister(rm)); 66586 break; 66587 } 66588 case 0x00010080: { 66589 // 0x0ebd0ac0 66590 if (((instr & 0xf0000000) == 0xf0000000)) { 66591 UnallocatedA32(instr); 66592 return; 66593 } 66594 Condition condition((instr >> 28) & 0xf); 66595 unsigned rd = ExtractSRegister(instr, 22, 12); 66596 unsigned rm = ExtractSRegister(instr, 5, 0); 66597 // VCVT{<c>}{<q>}.S32.F32 <Sd>, <Sm> ; A1 66598 vcvt(condition, 66599 S32, 66600 F32, 66601 SRegister(rd), 66602 SRegister(rm)); 66603 break; 66604 } 66605 } 66606 break; 66607 } 66608 case 0x000e0000: { 66609 // 0x0ebe0a40 66610 if (((instr & 0xf0000000) == 0xf0000000)) { 66611 UnallocatedA32(instr); 66612 return; 66613 } 66614 Condition condition((instr >> 28) & 0xf); 66615 DataType dt = Dt_U_sx_1_Decode(((instr >> 7) & 0x1) | 66616 ((instr >> 15) & 0x2)); 66617 if (dt.Is(kDataTypeValueInvalid)) { 66618 UnallocatedA32(instr); 66619 return; 66620 } 66621 unsigned rd = ExtractSRegister(instr, 22, 12); 66622 unsigned offset = 32; 66623 if (dt.Is(S16) || dt.Is(U16)) { 66624 offset = 16; 66625 } 66626 uint32_t fbits = offset - (((instr >> 5) & 0x1) | 66627 ((instr << 1) & 0x1e)); 66628 // VCVT{<c>}{<q>}.<dt>.F32 <Sdm>, <Sdm>, #<fbits> ; A1 66629 vcvt(condition, 66630 dt, 66631 F32, 66632 SRegister(rd), 66633 SRegister(rd), 66634 fbits); 66635 break; 66636 } 66637 } 66638 break; 66639 } 66640 case 0x00a00100: { 66641 // 0x0eb00b00 66642 if (((instr & 0xf0000000) == 0xf0000000)) { 66643 UnallocatedA32(instr); 66644 return; 66645 } 66646 Condition condition((instr >> 28) & 0xf); 66647 unsigned rd = ExtractDRegister(instr, 22, 12); 66648 uint32_t encoded_imm = 66649 (instr & 0xf) | ((instr >> 12) & 0xf0); 66650 NeonImmediate imm = 66651 ImmediateVFP::Decode<double>(encoded_imm); 66652 // VMOV{<c>}{<q>}.F64 <Dd>, #<imm> ; A2 66653 vmov(condition, F64, DRegister(rd), imm); 66654 if (((instr & 0xfb00ff0) != 0xeb00b00)) { 66655 UnpredictableA32(instr); 66656 } 66657 break; 66658 } 66659 case 0x00a00140: { 66660 // 0x0eb00b40 66661 switch (instr & 0x000e0000) { 66662 case 0x00000000: { 66663 // 0x0eb00b40 66664 switch (instr & 0x00010080) { 66665 case 0x00000000: { 66666 // 0x0eb00b40 66667 if (((instr & 0xf0000000) == 0xf0000000)) { 66668 UnallocatedA32(instr); 66669 return; 66670 } 66671 Condition condition((instr >> 28) & 0xf); 66672 unsigned rd = ExtractDRegister(instr, 22, 12); 66673 unsigned rm = ExtractDRegister(instr, 5, 0); 66674 // VMOV{<c>}{<q>}.F64 <Dd>, <Dm> ; A2 66675 vmov(condition, F64, DRegister(rd), DRegister(rm)); 66676 break; 66677 } 66678 case 0x00000080: { 66679 // 0x0eb00bc0 66680 if (((instr & 0xf0000000) == 0xf0000000)) { 66681 UnallocatedA32(instr); 66682 return; 66683 } 66684 Condition condition((instr >> 28) & 0xf); 66685 unsigned rd = ExtractDRegister(instr, 22, 12); 66686 unsigned rm = ExtractDRegister(instr, 5, 0); 66687 // VABS{<c>}{<q>}.F64 <Dd>, <Dm> ; A2 66688 vabs(condition, F64, DRegister(rd), DRegister(rm)); 66689 break; 66690 } 66691 case 0x00010000: { 66692 // 0x0eb10b40 66693 if (((instr & 0xf0000000) == 0xf0000000)) { 66694 UnallocatedA32(instr); 66695 return; 66696 } 66697 Condition condition((instr >> 28) & 0xf); 66698 unsigned rd = ExtractDRegister(instr, 22, 12); 66699 unsigned rm = ExtractDRegister(instr, 5, 0); 66700 // VNEG{<c>}{<q>}.F64 <Dd>, <Dm> ; A2 66701 vneg(condition, F64, DRegister(rd), DRegister(rm)); 66702 break; 66703 } 66704 case 0x00010080: { 66705 // 0x0eb10bc0 66706 if (((instr & 0xf0000000) == 0xf0000000)) { 66707 UnallocatedA32(instr); 66708 return; 66709 } 66710 Condition condition((instr >> 28) & 0xf); 66711 unsigned rd = ExtractDRegister(instr, 22, 12); 66712 unsigned rm = ExtractDRegister(instr, 5, 0); 66713 // VSQRT{<c>}{<q>}.F64 <Dd>, <Dm> ; A1 66714 vsqrt(condition, F64, DRegister(rd), DRegister(rm)); 66715 break; 66716 } 66717 } 66718 break; 66719 } 66720 case 0x00020000: { 66721 // 0x0eb20b40 66722 switch (instr & 0x00010080) { 66723 case 0x00000000: { 66724 // 0x0eb20b40 66725 if (((instr & 0xf0000000) == 0xf0000000)) { 66726 UnallocatedA32(instr); 66727 return; 66728 } 66729 Condition condition((instr >> 28) & 0xf); 66730 unsigned rd = ExtractDRegister(instr, 22, 12); 66731 unsigned rm = ExtractSRegister(instr, 5, 0); 66732 // VCVTB{<c>}{<q>}.F64.F16 <Dd>, <Sm> ; A1 66733 vcvtb(condition, 66734 F64, 66735 F16, 66736 DRegister(rd), 66737 SRegister(rm)); 66738 break; 66739 } 66740 case 0x00000080: { 66741 // 0x0eb20bc0 66742 if (((instr & 0xf0000000) == 0xf0000000)) { 66743 UnallocatedA32(instr); 66744 return; 66745 } 66746 Condition condition((instr >> 28) & 0xf); 66747 unsigned rd = ExtractDRegister(instr, 22, 12); 66748 unsigned rm = ExtractSRegister(instr, 5, 0); 66749 // VCVTT{<c>}{<q>}.F64.F16 <Dd>, <Sm> ; A1 66750 vcvtt(condition, 66751 F64, 66752 F16, 66753 DRegister(rd), 66754 SRegister(rm)); 66755 break; 66756 } 66757 case 0x00010000: { 66758 // 0x0eb30b40 66759 if (((instr & 0xf0000000) == 0xf0000000)) { 66760 UnallocatedA32(instr); 66761 return; 66762 } 66763 Condition condition((instr >> 28) & 0xf); 66764 unsigned rd = ExtractSRegister(instr, 22, 12); 66765 unsigned rm = ExtractDRegister(instr, 5, 0); 66766 // VCVTB{<c>}{<q>}.F16.F64 <Sd>, <Dm> ; A1 66767 vcvtb(condition, 66768 F16, 66769 F64, 66770 SRegister(rd), 66771 DRegister(rm)); 66772 break; 66773 } 66774 case 0x00010080: { 66775 // 0x0eb30bc0 66776 if (((instr & 0xf0000000) == 0xf0000000)) { 66777 UnallocatedA32(instr); 66778 return; 66779 } 66780 Condition condition((instr >> 28) & 0xf); 66781 unsigned rd = ExtractSRegister(instr, 22, 12); 66782 unsigned rm = ExtractDRegister(instr, 5, 0); 66783 // VCVTT{<c>}{<q>}.F16.F64 <Sd>, <Dm> ; A1 66784 vcvtt(condition, 66785 F16, 66786 F64, 66787 SRegister(rd), 66788 DRegister(rm)); 66789 break; 66790 } 66791 } 66792 break; 66793 } 66794 case 0x00040000: { 66795 // 0x0eb40b40 66796 switch (instr & 0x00010080) { 66797 case 0x00000000: { 66798 // 0x0eb40b40 66799 if (((instr & 0xf0000000) == 0xf0000000)) { 66800 UnallocatedA32(instr); 66801 return; 66802 } 66803 Condition condition((instr >> 28) & 0xf); 66804 unsigned rd = ExtractDRegister(instr, 22, 12); 66805 unsigned rm = ExtractDRegister(instr, 5, 0); 66806 // VCMP{<c>}{<q>}.F64 <Dd>, <Dm> ; A1 66807 vcmp(condition, F64, DRegister(rd), DRegister(rm)); 66808 break; 66809 } 66810 case 0x00000080: { 66811 // 0x0eb40bc0 66812 if (((instr & 0xf0000000) == 0xf0000000)) { 66813 UnallocatedA32(instr); 66814 return; 66815 } 66816 Condition condition((instr >> 28) & 0xf); 66817 unsigned rd = ExtractDRegister(instr, 22, 12); 66818 unsigned rm = ExtractDRegister(instr, 5, 0); 66819 // VCMPE{<c>}{<q>}.F64 <Dd>, <Dm> ; A1 66820 vcmpe(condition, F64, DRegister(rd), DRegister(rm)); 66821 break; 66822 } 66823 case 0x00010000: { 66824 // 0x0eb50b40 66825 if (((instr & 0xf0000000) == 0xf0000000)) { 66826 UnallocatedA32(instr); 66827 return; 66828 } 66829 Condition condition((instr >> 28) & 0xf); 66830 unsigned rd = ExtractDRegister(instr, 22, 12); 66831 // VCMP{<c>}{<q>}.F64 <Dd>, #0.0 ; A2 66832 vcmp(condition, F64, DRegister(rd), 0.0); 66833 if (((instr & 0xfbf0fff) != 0xeb50b40)) { 66834 UnpredictableA32(instr); 66835 } 66836 break; 66837 } 66838 case 0x00010080: { 66839 // 0x0eb50bc0 66840 if (((instr & 0xf0000000) == 0xf0000000)) { 66841 UnallocatedA32(instr); 66842 return; 66843 } 66844 Condition condition((instr >> 28) & 0xf); 66845 unsigned rd = ExtractDRegister(instr, 22, 12); 66846 // VCMPE{<c>}{<q>}.F64 <Dd>, #0.0 ; A2 66847 vcmpe(condition, F64, DRegister(rd), 0.0); 66848 if (((instr & 0xfbf0fff) != 0xeb50bc0)) { 66849 UnpredictableA32(instr); 66850 } 66851 break; 66852 } 66853 } 66854 break; 66855 } 66856 case 0x00060000: { 66857 // 0x0eb60b40 66858 switch (instr & 0x00010080) { 66859 case 0x00000000: { 66860 // 0x0eb60b40 66861 if (((instr & 0xf0000000) == 0xf0000000)) { 66862 UnallocatedA32(instr); 66863 return; 66864 } 66865 Condition condition((instr >> 28) & 0xf); 66866 unsigned rd = ExtractDRegister(instr, 22, 12); 66867 unsigned rm = ExtractDRegister(instr, 5, 0); 66868 // VRINTR{<c>}{<q>}.F64 <Dd>, <Dm> ; A1 66869 vrintr(condition, 66870 F64, 66871 DRegister(rd), 66872 DRegister(rm)); 66873 break; 66874 } 66875 case 0x00000080: { 66876 // 0x0eb60bc0 66877 if (((instr & 0xf0000000) == 0xf0000000)) { 66878 UnallocatedA32(instr); 66879 return; 66880 } 66881 Condition condition((instr >> 28) & 0xf); 66882 unsigned rd = ExtractDRegister(instr, 22, 12); 66883 unsigned rm = ExtractDRegister(instr, 5, 0); 66884 // VRINTZ{<c>}{<q>}.F64 <Dd>, <Dm> ; A1 66885 vrintz(condition, 66886 F64, 66887 DRegister(rd), 66888 DRegister(rm)); 66889 break; 66890 } 66891 case 0x00010000: { 66892 // 0x0eb70b40 66893 if (((instr & 0xf0000000) == 0xf0000000)) { 66894 UnallocatedA32(instr); 66895 return; 66896 } 66897 Condition condition((instr >> 28) & 0xf); 66898 unsigned rd = ExtractDRegister(instr, 22, 12); 66899 unsigned rm = ExtractDRegister(instr, 5, 0); 66900 // VRINTX{<c>}{<q>}.F64 <Dd>, <Dm> ; A1 66901 vrintx(condition, 66902 F64, 66903 DRegister(rd), 66904 DRegister(rm)); 66905 break; 66906 } 66907 case 0x00010080: { 66908 // 0x0eb70bc0 66909 if (((instr & 0xf0000000) == 0xf0000000)) { 66910 UnallocatedA32(instr); 66911 return; 66912 } 66913 Condition condition((instr >> 28) & 0xf); 66914 unsigned rd = ExtractSRegister(instr, 22, 12); 66915 unsigned rm = ExtractDRegister(instr, 5, 0); 66916 // VCVT{<c>}{<q>}.F32.F64 <Sd>, <Dm> ; A1 66917 vcvt(condition, 66918 F32, 66919 F64, 66920 SRegister(rd), 66921 DRegister(rm)); 66922 break; 66923 } 66924 } 66925 break; 66926 } 66927 case 0x00080000: { 66928 // 0x0eb80b40 66929 if ((instr & 0x00010000) == 0x00000000) { 66930 if (((instr & 0xf0000000) == 0xf0000000)) { 66931 UnallocatedA32(instr); 66932 return; 66933 } 66934 Condition condition((instr >> 28) & 0xf); 66935 DataType dt = Dt_op_2_Decode((instr >> 7) & 0x1); 66936 if (dt.Is(kDataTypeValueInvalid)) { 66937 UnallocatedA32(instr); 66938 return; 66939 } 66940 unsigned rd = ExtractDRegister(instr, 22, 12); 66941 unsigned rm = ExtractSRegister(instr, 5, 0); 66942 // VCVT{<c>}{<q>}.F64.<dt> <Dd>, <Sm> ; A1 66943 vcvt(condition, 66944 F64, 66945 dt, 66946 DRegister(rd), 66947 SRegister(rm)); 66948 } else { 66949 UnallocatedA32(instr); 66950 } 66951 break; 66952 } 66953 case 0x000a0000: { 66954 // 0x0eba0b40 66955 if (((instr & 0xf0000000) == 0xf0000000)) { 66956 UnallocatedA32(instr); 66957 return; 66958 } 66959 Condition condition((instr >> 28) & 0xf); 66960 DataType dt = Dt_U_sx_1_Decode(((instr >> 7) & 0x1) | 66961 ((instr >> 15) & 0x2)); 66962 if (dt.Is(kDataTypeValueInvalid)) { 66963 UnallocatedA32(instr); 66964 return; 66965 } 66966 unsigned rd = ExtractDRegister(instr, 22, 12); 66967 unsigned offset = 32; 66968 if (dt.Is(S16) || dt.Is(U16)) { 66969 offset = 16; 66970 } 66971 uint32_t fbits = offset - (((instr >> 5) & 0x1) | 66972 ((instr << 1) & 0x1e)); 66973 // VCVT{<c>}{<q>}.F64.<dt> <Ddm>, <Ddm>, #<fbits> ; A1 66974 vcvt(condition, 66975 F64, 66976 dt, 66977 DRegister(rd), 66978 DRegister(rd), 66979 fbits); 66980 break; 66981 } 66982 case 0x000c0000: { 66983 // 0x0ebc0b40 66984 switch (instr & 0x00010080) { 66985 case 0x00000000: { 66986 // 0x0ebc0b40 66987 if (((instr & 0xf0000000) == 0xf0000000)) { 66988 UnallocatedA32(instr); 66989 return; 66990 } 66991 Condition condition((instr >> 28) & 0xf); 66992 unsigned rd = ExtractSRegister(instr, 22, 12); 66993 unsigned rm = ExtractDRegister(instr, 5, 0); 66994 // VCVTR{<c>}{<q>}.U32.F64 <Sd>, <Dm> ; A1 66995 vcvtr(condition, 66996 U32, 66997 F64, 66998 SRegister(rd), 66999 DRegister(rm)); 67000 break; 67001 } 67002 case 0x00000080: { 67003 // 0x0ebc0bc0 67004 if (((instr & 0xf0000000) == 0xf0000000)) { 67005 UnallocatedA32(instr); 67006 return; 67007 } 67008 Condition condition((instr >> 28) & 0xf); 67009 unsigned rd = ExtractSRegister(instr, 22, 12); 67010 unsigned rm = ExtractDRegister(instr, 5, 0); 67011 // VCVT{<c>}{<q>}.U32.F64 <Sd>, <Dm> ; A1 67012 vcvt(condition, 67013 U32, 67014 F64, 67015 SRegister(rd), 67016 DRegister(rm)); 67017 break; 67018 } 67019 case 0x00010000: { 67020 // 0x0ebd0b40 67021 if (((instr & 0xf0000000) == 0xf0000000)) { 67022 UnallocatedA32(instr); 67023 return; 67024 } 67025 Condition condition((instr >> 28) & 0xf); 67026 unsigned rd = ExtractSRegister(instr, 22, 12); 67027 unsigned rm = ExtractDRegister(instr, 5, 0); 67028 // VCVTR{<c>}{<q>}.S32.F64 <Sd>, <Dm> ; A1 67029 vcvtr(condition, 67030 S32, 67031 F64, 67032 SRegister(rd), 67033 DRegister(rm)); 67034 break; 67035 } 67036 case 0x00010080: { 67037 // 0x0ebd0bc0 67038 if (((instr & 0xf0000000) == 0xf0000000)) { 67039 UnallocatedA32(instr); 67040 return; 67041 } 67042 Condition condition((instr >> 28) & 0xf); 67043 unsigned rd = ExtractSRegister(instr, 22, 12); 67044 unsigned rm = ExtractDRegister(instr, 5, 0); 67045 // VCVT{<c>}{<q>}.S32.F64 <Sd>, <Dm> ; A1 67046 vcvt(condition, 67047 S32, 67048 F64, 67049 SRegister(rd), 67050 DRegister(rm)); 67051 break; 67052 } 67053 } 67054 break; 67055 } 67056 case 0x000e0000: { 67057 // 0x0ebe0b40 67058 if (((instr & 0xf0000000) == 0xf0000000)) { 67059 UnallocatedA32(instr); 67060 return; 67061 } 67062 Condition condition((instr >> 28) & 0xf); 67063 DataType dt = Dt_U_sx_1_Decode(((instr >> 7) & 0x1) | 67064 ((instr >> 15) & 0x2)); 67065 if (dt.Is(kDataTypeValueInvalid)) { 67066 UnallocatedA32(instr); 67067 return; 67068 } 67069 unsigned rd = ExtractDRegister(instr, 22, 12); 67070 unsigned offset = 32; 67071 if (dt.Is(S16) || dt.Is(U16)) { 67072 offset = 16; 67073 } 67074 uint32_t fbits = offset - (((instr >> 5) & 0x1) | 67075 ((instr << 1) & 0x1e)); 67076 // VCVT{<c>}{<q>}.<dt>.F64 <Ddm>, <Ddm>, #<fbits> ; A1 67077 vcvt(condition, 67078 dt, 67079 F64, 67080 DRegister(rd), 67081 DRegister(rd), 67082 fbits); 67083 break; 67084 } 67085 } 67086 break; 67087 } 67088 } 67089 break; 67090 } 67091 case 0x00100a10: { 67092 // 0x0e100a10 67093 switch (instr & 0x00000100) { 67094 case 0x00000000: { 67095 // 0x0e100a10 67096 switch (instr & 0x00e00000) { 67097 case 0x00000000: { 67098 // 0x0e100a10 67099 if (((instr & 0xf0000000) == 0xf0000000)) { 67100 UnallocatedA32(instr); 67101 return; 67102 } 67103 Condition condition((instr >> 28) & 0xf); 67104 unsigned rt = (instr >> 12) & 0xf; 67105 unsigned rn = ExtractSRegister(instr, 7, 16); 67106 // VMOV{<c>}{<q>} <Rt>, <Sn> ; A1 67107 vmov(condition, Register(rt), SRegister(rn)); 67108 if (((instr & 0xff00f7f) != 0xe100a10)) { 67109 UnpredictableA32(instr); 67110 } 67111 break; 67112 } 67113 case 0x00e00000: { 67114 // 0x0ef00a10 67115 if (((instr & 0xf0000000) == 0xf0000000)) { 67116 UnallocatedA32(instr); 67117 return; 67118 } 67119 Condition condition((instr >> 28) & 0xf); 67120 unsigned rt = (instr >> 12) & 0xf; 67121 unsigned spec_reg = (instr >> 16) & 0xf; 67122 switch (spec_reg) { 67123 case 0x0: 67124 case 0x1: 67125 case 0x5: 67126 case 0x6: 67127 case 0x7: 67128 case 0x8: { 67129 // VMRS{<c>}{<q>} <Rt>, <spec_reg> ; A1 67130 vmrs(condition, 67131 RegisterOrAPSR_nzcv(rt), 67132 SpecialFPRegister(spec_reg)); 67133 if (((instr & 0xff00fff) != 0xef00a10)) { 67134 UnpredictableA32(instr); 67135 } 67136 break; 67137 } 67138 default: 67139 UnallocatedA32(instr); 67140 break; 67141 } 67142 break; 67143 } 67144 default: 67145 UnallocatedA32(instr); 67146 break; 67147 } 67148 break; 67149 } 67150 case 0x00000100: { 67151 // 0x0e100b10 67152 if (((instr & 0xf0000000) == 0xf0000000)) { 67153 UnallocatedA32(instr); 67154 return; 67155 } 67156 Condition condition((instr >> 28) & 0xf); 67157 unsigned lane; 67158 DataType dt = 67159 Dt_U_opc1_opc2_1_Decode(((instr >> 5) & 0x3) | 67160 ((instr >> 19) & 0xc) | 67161 ((instr >> 19) & 0x10), 67162 &lane); 67163 if (dt.Is(kDataTypeValueInvalid)) { 67164 UnallocatedA32(instr); 67165 return; 67166 } 67167 unsigned rt = (instr >> 12) & 0xf; 67168 unsigned rn = ExtractDRegister(instr, 7, 16); 67169 // VMOV{<c>}{<q>}{.<dt>} <Rt>, <Dn[x]> ; A1 67170 vmov(condition, dt, Register(rt), DRegisterLane(rn, lane)); 67171 if (((instr & 0xf100f1f) != 0xe100b10)) { 67172 UnpredictableA32(instr); 67173 } 67174 break; 67175 } 67176 } 67177 break; 67178 } 67179 case 0x00100e10: { 67180 // 0x0e100e10 67181 if (((instr & 0xf0000000) == 0xf0000000)) { 67182 UnallocatedA32(instr); 67183 return; 67184 } 67185 UnimplementedA32("MRC", instr); 67186 break; 67187 } 67188 default: 67189 UnallocatedA32(instr); 67190 break; 67191 } 67192 break; 67193 } 67194 case 0x01000000: { 67195 // 0x0f000000 67196 if (((instr & 0xf0000000) == 0xf0000000)) { 67197 UnallocatedA32(instr); 67198 return; 67199 } 67200 Condition condition((instr >> 28) & 0xf); 67201 uint32_t imm = instr & 0xffffff; 67202 // SVC{<c>}{<q>} {#}<imm> ; A1 67203 svc(condition, imm); 67204 break; 67205 } 67206 } 67207 break; 67208 } 67209 } 67210 } 67211 } // NOLINT(readability/fn_size) 67212 // End of generated code. 67213 67214 const uint16_t* PrintDisassembler::DecodeT32At( 67215 const uint16_t* instruction_address, const uint16_t* buffer_end) { 67216 uint32_t instruction = *instruction_address++ << 16; 67217 67218 if (instruction >= kLowestT32_32Opcode) { 67219 if (instruction_address >= buffer_end) { 67220 os() << "?\n"; 67221 return instruction_address; 67222 } 67223 instruction |= *instruction_address++; 67224 } 67225 67226 DecodeT32(instruction); 67227 return instruction_address; 67228 } 67229 67230 void PrintDisassembler::DecodeT32(uint32_t instruction) { 67231 PrintCodeAddress(GetCodeAddress()); 67232 if (T32Size(instruction) == 2) { 67233 PrintOpcode16(instruction >> 16); 67234 Disassembler::DecodeT32(instruction); 67235 } else { 67236 PrintOpcode32(instruction); 67237 Disassembler::DecodeT32(instruction); 67238 } 67239 os() << "\n"; 67240 } 67241 67242 67243 void PrintDisassembler::DecodeA32(uint32_t instruction) { 67244 PrintCodeAddress(GetCodeAddress()); 67245 PrintOpcode32(instruction); 67246 Disassembler::DecodeA32(instruction); 67247 os() << "\n"; 67248 } 67249 67250 67251 void PrintDisassembler::DisassembleA32Buffer(const uint32_t* buffer, 67252 size_t size_in_bytes) { 67253 VIXL_ASSERT(IsAligned<sizeof(buffer[0])>(buffer)); 67254 VIXL_ASSERT(IsMultiple<sizeof(buffer[0])>(size_in_bytes)); 67255 const uint32_t* const end_buffer = 67256 buffer + (size_in_bytes / sizeof(uint32_t)); 67257 while (buffer < end_buffer) { 67258 DecodeA32(*buffer++); 67259 } 67260 } 67261 67262 67263 void PrintDisassembler::DisassembleT32Buffer(const uint16_t* buffer, 67264 size_t size_in_bytes) { 67265 VIXL_ASSERT(IsAligned<sizeof(buffer[0])>(buffer)); 67266 VIXL_ASSERT(IsMultiple<sizeof(buffer[0])>(size_in_bytes)); 67267 const uint16_t* const end_buffer = 67268 buffer + (size_in_bytes / sizeof(uint16_t)); 67269 while (buffer < end_buffer) { 67270 buffer = DecodeT32At(buffer, end_buffer); 67271 } 67272 VIXL_ASSERT(buffer == end_buffer); 67273 } 67274 67275 } // namespace aarch32 67276 } // namespace vixl