data.isa (7212:746657ee59a2) data.isa (7213:beadb1dc1be6)
1// Copyright (c) 2010 ARM Limited
2// All rights reserved
3//
4// The license below extends only to copyright in the software and shall
5// not be construed as granting a license to any other intellectual
6// property including but not limited to intellectual property relating
7// to a hardware implementation of the functionality of the software
8// licensed hereunder. You may use the software subject to the license

--- 446 unchanged lines hidden (view full) ---

455 return new QdsubRegCc(machInst, rd, rm, rn, 0, LSL);
456 default:
457 return new Unknown(machInst);
458 }
459 }
460 '''
461}};
462
1// Copyright (c) 2010 ARM Limited
2// All rights reserved
3//
4// The license below extends only to copyright in the software and shall
5// not be construed as granting a license to any other intellectual
6// property including but not limited to intellectual property relating
7// to a hardware implementation of the functionality of the software
8// licensed hereunder. You may use the software subject to the license

--- 446 unchanged lines hidden (view full) ---

455 return new QdsubRegCc(machInst, rd, rm, rn, 0, LSL);
456 default:
457 return new Unknown(machInst);
458 }
459 }
460 '''
461}};
462
463def format Thumb32DataProcReg() {{
464 decode_block = '''
465 {
466 const uint32_t op1 = bits(machInst, 23, 20);
467 const IntRegIndex rn = (IntRegIndex)(uint32_t)bits(machInst, 19, 16);
468 const uint32_t op2 = bits(machInst, 7, 4);
469 if (bits(op1, 3) != 1) {
470 if (op2 == 0) {
471 IntRegIndex rd = (IntRegIndex)(uint32_t)bits(machInst, 11, 8);
472 IntRegIndex rm = (IntRegIndex)(uint32_t)bits(machInst, 3, 0);
473 switch (bits(op1, 2, 0)) {
474 case 0x0:
475 return new MovRegReg(machInst, rd,
476 INTREG_ZERO, rn, rm, LSL);
477 case 0x1:
478 return new MovRegRegCc(machInst, rd,
479 INTREG_ZERO, rn, rm, LSL);
480 case 0x2:
481 return new MovRegReg(machInst, rd,
482 INTREG_ZERO, rn, rm, LSR);
483 case 0x3:
484 return new MovRegRegCc(machInst, rd,
485 INTREG_ZERO, rn, rm, LSR);
486 case 0x4:
487 return new MovRegReg(machInst, rd,
488 INTREG_ZERO, rn, rm, ASR);
489 case 0x5:
490 return new MovRegRegCc(machInst, rd,
491 INTREG_ZERO, rn, rm, ASR);
492 case 0x6:
493 return new MovRegReg(machInst, rd,
494 INTREG_ZERO, rn, rm, ROR);
495 case 0x7:
496 return new MovRegRegCc(machInst, rd,
497 INTREG_ZERO, rn, rm, ROR);
498 }
499 }
500 switch (bits(op1, 2, 0)) {
501 case 0x0:
502 if (rn == 0xf) {
503 return new WarnUnimplemented("sxth", machInst);
504 } else {
505 return new WarnUnimplemented("sxtah", machInst);
506 }
507 case 0x1:
508 if (rn == 0xf) {
509 return new WarnUnimplemented("uxth", machInst);
510 } else {
511 return new WarnUnimplemented("uxtah", machInst);
512 }
513 case 0x2:
514 if (rn == 0xf) {
515 return new WarnUnimplemented("sxtb16", machInst);
516 } else {
517 return new WarnUnimplemented("sxtab16", machInst);
518 }
519 case 0x3:
520 if (rn == 0xf) {
521 return new WarnUnimplemented("uxtb16", machInst);
522 } else {
523 return new WarnUnimplemented("uxtab16", machInst);
524 }
525 case 0x4:
526 if (rn == 0xf) {
527 return new WarnUnimplemented("sxtb", machInst);
528 } else {
529 return new WarnUnimplemented("sxtab", machInst);
530 }
531 case 0x5:
532 if (rn == 0xf) {
533 return new WarnUnimplemented("uxtb", machInst);
534 } else {
535 return new WarnUnimplemented("uxtab", machInst);
536 }
537 default:
538 return new Unknown(machInst);
539 }
540 } else {
541 if (bits(op2, 3) == 0) {
542 if (bits(op2, 2) == 0x0) {
543 const uint32_t op1 = bits(machInst, 22, 20);
544 const uint32_t op2 = bits(machInst, 5, 4);
545 switch (op2) {
546 case 0x0:
547 switch (op1) {
548 case 0x1:
549 return new WarnUnimplemented("sadd16", machInst);
550 case 0x2:
551 return new WarnUnimplemented("sasx", machInst);
552 case 0x6:
553 return new WarnUnimplemented("ssax", machInst);
554 case 0x5:
555 return new WarnUnimplemented("ssub16", machInst);
556 case 0x0:
557 return new WarnUnimplemented("sadd8", machInst);
558 case 0x4:
559 return new WarnUnimplemented("ssub8", machInst);
560 }
561 break;
562 case 0x1:
563 {
564 IntRegIndex rn =
565 (IntRegIndex)(uint32_t)bits(machInst, 19, 16);
566 IntRegIndex rd =
567 (IntRegIndex)(uint32_t)bits(machInst, 11, 8);
568 IntRegIndex rm =
569 (IntRegIndex)(uint32_t)bits(machInst, 3, 0);
570 switch (op1) {
571 case 0x1:
572 return new Qadd16Reg(machInst, rd,
573 rn, rm, 0, LSL);
574 case 0x2:
575 return new QasxReg(machInst, rd,
576 rn, rm, 0, LSL);
577 case 0x6:
578 return new QsaxReg(machInst, rd,
579 rn, rm, 0, LSL);
580 case 0x5:
581 return new Qsub16Reg(machInst, rd,
582 rn, rm, 0, LSL);
583 case 0x0:
584 return new Qsub8Reg(machInst, rd,
585 rn, rm, 0, LSL);
586 case 0x4:
587 return new Qsub8Reg(machInst, rd,
588 rn, rm, 0, LSL);
589 }
590 }
591 break;
592 case 0x2:
593 switch (op1) {
594 case 0x1:
595 return new WarnUnimplemented("shadd16", machInst);
596 case 0x2:
597 return new WarnUnimplemented("shasx", machInst);
598 case 0x6:
599 return new WarnUnimplemented("shsax", machInst);
600 case 0x5:
601 return new WarnUnimplemented("shsub16", machInst);
602 case 0x0:
603 return new WarnUnimplemented("shadd8", machInst);
604 case 0x4:
605 return new WarnUnimplemented("shsub8", machInst);
606 }
607 break;
608 }
609 } else {
610 const uint32_t op1 = bits(machInst, 22, 20);
611 const uint32_t op2 = bits(machInst, 5, 4);
612 switch (op2) {
613 case 0x0:
614 switch (op1) {
615 case 0x1:
616 return new WarnUnimplemented("uadd16", machInst);
617 case 0x2:
618 return new WarnUnimplemented("uasx", machInst);
619 case 0x6:
620 return new WarnUnimplemented("usax", machInst);
621 case 0x5:
622 return new WarnUnimplemented("usub16", machInst);
623 case 0x0:
624 return new WarnUnimplemented("uadd8", machInst);
625 case 0x4:
626 return new WarnUnimplemented("usub8", machInst);
627 }
628 break;
629 case 0x1:
630 switch (op1) {
631 case 0x1:
632 return new WarnUnimplemented("uqadd16", machInst);
633 case 0x2:
634 return new WarnUnimplemented("uqasx", machInst);
635 case 0x6:
636 return new WarnUnimplemented("uqsax", machInst);
637 case 0x5:
638 return new WarnUnimplemented("uqsub16", machInst);
639 case 0x0:
640 return new WarnUnimplemented("uqadd8", machInst);
641 case 0x4:
642 return new WarnUnimplemented("uqsub8", machInst);
643 }
644 break;
645 case 0x2:
646 switch (op1) {
647 case 0x1:
648 return new WarnUnimplemented("uhadd16", machInst);
649 case 0x2:
650 return new WarnUnimplemented("uhasx", machInst);
651 case 0x6:
652 return new WarnUnimplemented("uhsax", machInst);
653 case 0x5:
654 return new WarnUnimplemented("uhsub16", machInst);
655 case 0x0:
656 return new WarnUnimplemented("uhadd8", machInst);
657 case 0x4:
658 return new WarnUnimplemented("uhsub8", machInst);
659 }
660 break;
661 }
662 }
663 } else if (bits(op1, 3, 2) == 0x2 && bits(op2, 3, 2) == 0x2) {
664 const uint32_t op1 = bits(machInst, 21, 20);
665 const uint32_t op2 = bits(machInst, 5, 4);
666 switch (op1) {
667 case 0x0:
668 {
669 IntRegIndex rd =
670 (IntRegIndex)(uint32_t)bits(machInst, 11, 8);
671 IntRegIndex rm =
672 (IntRegIndex)(uint32_t)bits(machInst, 3, 0);
673 switch (op2) {
674 case 0x0:
675 return new QaddRegCc(machInst, rd,
676 rm, rn, 0, LSL);
677 case 0x1:
678 return new QdaddRegCc(machInst, rd,
679 rm, rn, 0, LSL);
680 case 0x2:
681 return new QsubRegCc(machInst, rd,
682 rm, rn, 0, LSL);
683 case 0x3:
684 return new QdsubRegCc(machInst, rd,
685 rm, rn, 0, LSL);
686 }
687 }
688 break;
689 case 0x1:
690 {
691 IntRegIndex rd =
692 (IntRegIndex)(uint32_t)bits(machInst, 11, 8);
693 IntRegIndex rm = rn;
694 switch (op2) {
695 case 0x0:
696 return new Rev(machInst, rd, rm);
697 case 0x1:
698 return new Rev16(machInst, rd, rm);
699 case 0x2:
700 return new WarnUnimplemented("rbit", machInst);
701 case 0x3:
702 return new Revsh(machInst, rd, rm);
703 }
704 }
705 break;
706 case 0x2:
707 if (op2 == 0) {
708 return new WarnUnimplemented("sel", machInst);
709 }
710 break;
711 case 0x3:
712 if (op2 == 0) {
713 return new WarnUnimplemented("clz", machInst);
714 }
715 }
716 }
717 return new Unknown(machInst);
718 }
719 }
720 '''
721}};
722
463def format Thumb16ShiftAddSubMoveCmp() {{
464 decode_block = '''
465 {
466 const uint32_t imm5 = bits(machInst, 10, 6);
467 const uint32_t imm3 = bits(machInst, 8, 6);
468 const uint32_t imm8 = bits(machInst, 7, 0);
469 const IntRegIndex rd = (IntRegIndex)(uint32_t)bits(machInst, 2, 0);
470 const IntRegIndex rd8 = (IntRegIndex)(uint32_t)bits(machInst, 10, 8);

--- 500 unchanged lines hidden ---
723def format Thumb16ShiftAddSubMoveCmp() {{
724 decode_block = '''
725 {
726 const uint32_t imm5 = bits(machInst, 10, 6);
727 const uint32_t imm3 = bits(machInst, 8, 6);
728 const uint32_t imm8 = bits(machInst, 7, 0);
729 const IntRegIndex rd = (IntRegIndex)(uint32_t)bits(machInst, 2, 0);
730 const IntRegIndex rd8 = (IntRegIndex)(uint32_t)bits(machInst, 10, 8);

--- 500 unchanged lines hidden ---