mem.isa (7277:85e4f11ad2c3) mem.isa (7278:562ced200e54)
1// -*- mode:c++ -*-
2
3// Copyright (c) 2010 ARM Limited
4// All rights reserved
5//
6// The license below extends only to copyright in the software and shall
7// not be construed as granting a license to any other intellectual
8// property including but not limited to intellectual property relating

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

463 "str_imm" : storeImmClassName(False, True, False),
464 "str_puw" : buildPuwDecode(4),
465 "strt" : storeImmClassName(False, True, False, user=True),
466 "str_reg" : storeRegClassName(False, True, False)
467 }
468 decode_block = decode % classNames
469}};
470
1// -*- mode:c++ -*-
2
3// Copyright (c) 2010 ARM Limited
4// All rights reserved
5//
6// The license below extends only to copyright in the software and shall
7// not be construed as granting a license to any other intellectual
8// property including but not limited to intellectual property relating

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

463 "str_imm" : storeImmClassName(False, True, False),
464 "str_puw" : buildPuwDecode(4),
465 "strt" : storeImmClassName(False, True, False, user=True),
466 "str_reg" : storeRegClassName(False, True, False)
467 }
468 decode_block = decode % classNames
469}};
470
471def format LoadByteMemoryHints() {{
472 decode = '''
473 {
474 const uint32_t op1 = bits(machInst, 24, 23);
475 const uint32_t op2 = bits(machInst, 11, 6);
476 const IntRegIndex rn = (IntRegIndex)(uint32_t)bits(machInst, 19, 16);
477 const IntRegIndex rt = (IntRegIndex)(uint32_t)bits(machInst, 15, 12);
478 const IntRegIndex rm = (IntRegIndex)(uint32_t)bits(machInst, 3, 0);
479 const uint32_t imm12 = bits(machInst, 11, 0);
480 const uint32_t imm8 = bits(machInst, 7, 0);
481 bool pldw = bits(machInst, 21);
482 const uint32_t imm2 = bits(machInst, 5, 4);
483 if (rn == 0xf) {
484 if (rt == 0xf) {
485 const bool add = bits(machInst, 23);
486 if (bits(op1, 1) == 1) {
487 if (add) {
488 return new %(pli_iulit)s(machInst, INTREG_ZERO,
489 INTREG_PC, true, imm12);
490 } else {
491 return new %(pli_ilit)s(machInst, INTREG_ZERO,
492 INTREG_PC, false, imm12);
493 }
494 } else {
495 if (add) {
496 return new %(pld_iulit)s(machInst, INTREG_ZERO,
497 INTREG_PC, true, imm12);
498 } else {
499 return new %(pld_ilit)s(machInst, INTREG_ZERO,
500 INTREG_PC, false, imm12);
501 }
502 }
503 } else {
504 if (bits(op1, 1) == 1) {
505 if (bits(machInst, 23)) {
506 return new %(ldrsb_lit_u)s(machInst, rt, INTREG_PC,
507 true, imm12);
508 } else {
509 return new %(ldrsb_lit)s(machInst, rt, INTREG_PC,
510 false, imm12);
511 }
512 } else {
513 if (bits(machInst, 23)) {
514 return new %(ldrb_lit_u)s(machInst, rt, INTREG_PC,
515 true, imm12);
516 } else {
517 return new %(ldrb_lit)s(machInst, rt, INTREG_PC,
518 false, imm12);
519 }
520 }
521 }
522 } else if (rt == 0xf) {
523 switch (op1) {
524 case 0x0:
525 if (op2 == 0x0) {
526 if (pldw) {
527 return new %(pldw_radd)s(machInst, INTREG_ZERO,
528 rn, true, imm2, LSL, rm);
529 } else {
530 return new %(pld_radd)s(machInst, INTREG_ZERO,
531 rn, true, imm2, LSL, rm);
532 }
533 } else if (bits(op2, 5, 2) == 0xc) {
534 if (pldw) {
535 return new %(pldw_isub)s(machInst, INTREG_ZERO,
536 rn, false, imm8);
537 } else {
538 return new %(pld_isub)s(machInst, INTREG_ZERO,
539 rn, false, imm8);
540 }
541 }
542 break;
543 case 0x1:
544 if (pldw) {
545 return new %(pldw_iadd)s(machInst, INTREG_ZERO,
546 rn, true, imm12);
547 } else {
548 return new %(pld_iadd)s(machInst, INTREG_ZERO,
549 rn, true, imm12);
550 }
551 case 0x2:
552 if (op2 == 0x0) {
553 return new %(pli_radd)s(machInst, INTREG_ZERO, rn,
554 true, imm2, LSL, rm);
555 } else if (bits(op2, 5, 2) == 0xc) {
556 return new %(pli_ilit)s(machInst, INTREG_ZERO,
557 INTREG_PC, false, imm8);
558 }
559 break;
560 case 0x3:
561 return new %(pli_iulit)s(machInst, INTREG_ZERO,
562 INTREG_PC, true, imm12);
563 }
564 return new Unknown(machInst);
565 } else {
566 switch (op1) {
567 case 0x0:
568 if (op2 == 0) {
569 return new %(ldrb_radd)s(machInst, rt, rn, true,
570 imm2, LSL, rm);
571 } else if (bits(op2, 5, 2) == 0xe) {
572 return new %(ldrbt)s(machInst, rt, rn, true, imm8);
573 } else if ((op2 & 0x24) == 0x24 || bits(op2, 5, 2) == 0xc) {
574 const uint32_t puw = bits(machInst, 10, 8);
575 switch (puw) {
576 case 0x1:
577 return new %(ldrb_iw)s(machInst, rt,
578 rn, false, imm8);
579 case 0x3:
580 return new %(ldrb_iuw)s(machInst, rt,
581 rn, true, imm8);
582 case 0x4:
583 return new %(ldrb_ip)s(machInst, rt,
584 rn, false, imm8);
585 case 0x5:
586 return new %(ldrb_ipw)s(machInst, rt,
587 rn, false, imm8);
588 case 0x7:
589 return new %(ldrb_ipuw)s(machInst, rt,
590 rn, true, imm8);
591 }
592 }
593 break;
594 case 0x1:
595 return new %(ldrb_iadd)s(machInst, rt, rn, true, imm12);
596 case 0x2:
597 if (op2 == 0) {
598 return new %(ldrsb_radd)s(machInst, rt, rn, true,
599 imm2, LSL, rm);
600 } else if (bits(op2, 5, 2) == 0xe) {
601 return new %(ldrsbt)s(machInst, rt, rn, true, imm8);
602 } else if ((op2 & 0x24) == 0x24 || bits(op2, 5, 2) == 0xc) {
603 const uint32_t puw = bits(machInst, 10, 8);
604 switch (puw) {
605 case 0x1:
606 return new %(ldrsb_iw)s(machInst, rt,
607 rn, false, imm8);
608 case 0x3:
609 return new %(ldrsb_iuw)s(machInst, rt,
610 rn, true, imm8);
611 case 0x4:
612 return new %(ldrsb_ip)s(machInst, rt,
613 rn, false, imm8);
614 case 0x5:
615 return new %(ldrsb_ipw)s(machInst, rt,
616 rn, false, imm8);
617 case 0x7:
618 return new %(ldrsb_ipuw)s(machInst, rt,
619 rn, true, imm8);
620 }
621 }
622 break;
623 case 0x3:
624 return new %(ldrsb_iadd)s(machInst, rt, rn, true, imm12);
625 }
626 return new Unknown(machInst);
627 }
628 }
629 '''
630 substDict = {
631 "ldrsb_lit_u" : loadImmClassName(False, True, False, 1, True),
632 "ldrsb_lit" : loadImmClassName(False, False, False, 1, True),
633 "ldrb_lit_u" : loadImmClassName(False, True, False, 1),
634 "ldrb_lit" : loadImmClassName(False, False, False, 1),
635 "ldrsb_radd" : loadRegClassName(False, True, False, 1, True),
636 "ldrb_radd" : loadRegClassName(False, True, False, 1),
637 "ldrsb_iw" : loadImmClassName(True, False, True, 1, True),
638 "ldrsb_iuw" : loadImmClassName(True, True, True, 1, True),
639 "ldrsb_ip" : loadImmClassName(False, False, False, 1, True),
640 "ldrsb_ipw" : loadImmClassName(False, False, True, 1, True),
641 "ldrsb_ipuw" : loadImmClassName(False, True, True, 1, True),
642 "ldrsb_iadd" : loadImmClassName(False, True, False, 1, True),
643 "ldrb_iw" : loadImmClassName(True, False, True, 1),
644 "ldrb_iuw" : loadImmClassName(True, True, True, 1),
645 "ldrb_ip" : loadImmClassName(False, False, False, 1),
646 "ldrb_ipw" : loadImmClassName(False, False, True, 1),
647 "ldrb_ipuw" : loadImmClassName(False, True, True, 1),
648 "ldrb_iadd" : loadImmClassName(False, True, False, 1),
649 "ldrbt" : loadImmClassName(False, True, False, 1, user=True),
650 "ldrsbt" : loadImmClassName(False, True, False, 1, True, user=True),
651 "pldw_radd" : "PLDW_" + loadRegClassName(False, True, False, 1),
652 "pld_radd" : "PLD_" + loadRegClassName(False, True, False, 1),
653 "pldw_isub" : "PLDW_" + loadImmClassName(False, False, False, 1),
654 "pld_isub" : "PLD_" + loadImmClassName(False, False, False, 1),
655 "pldw_iadd" : "PLDW_" + loadImmClassName(False, True, False, 1),
656 "pld_iadd" : "PLD_" + loadImmClassName(False, True, False, 1),
657 "pld_iulit" : "PLD_" + loadImmClassName(False, True, False, 1),
658 "pld_ilit" : "PLD_" + loadImmClassName(False, False, False, 1),
659 "pli_iulit" : "PLI_" + loadImmClassName(False, True, False, 1),
660 "pli_ilit" : "PLI_" + loadImmClassName(False, False, False, 1),
661 "pli_radd" : "PLI_" + loadRegClassName(False, True, False, 1),
662 "pli_iulit" : "PLI_" + loadImmClassName(False, True, False, 1),
663 "pli_ilit" : "PLI_" + loadImmClassName(False, False, False, 1)
664 }
665 decode_block = decode % substDict
666}};
667
471def format LoadHalfwordMemoryHints() {{
472 decode = '''
473 {
474 const uint32_t op1 = bits(machInst, 24, 23);
475 const uint32_t op2 = bits(machInst, 11, 6);
476 const IntRegIndex rn = (IntRegIndex)(uint32_t)bits(machInst, 19, 16);
477 const IntRegIndex rt = (IntRegIndex)(uint32_t)bits(machInst, 15, 12);
478 const IntRegIndex rm = (IntRegIndex)(uint32_t)bits(machInst, 3, 0);

--- 268 unchanged lines hidden ---
668def format LoadHalfwordMemoryHints() {{
669 decode = '''
670 {
671 const uint32_t op1 = bits(machInst, 24, 23);
672 const uint32_t op2 = bits(machInst, 11, 6);
673 const IntRegIndex rn = (IntRegIndex)(uint32_t)bits(machInst, 19, 16);
674 const IntRegIndex rt = (IntRegIndex)(uint32_t)bits(machInst, 15, 12);
675 const IntRegIndex rm = (IntRegIndex)(uint32_t)bits(machInst, 3, 0);

--- 268 unchanged lines hidden ---