mem.isa (7246:e366ee883a74) | mem.isa (7277:85e4f11ad2c3) |
---|---|
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 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); 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 if (bits(op1, 1) == 1) { 486 // Unallocated memory hint 487 return new NopInst(machInst); 488 } else { 489 return new Unknown(machInst); 490 } 491 } else { 492 if (bits(op1, 1) == 1) { 493 if (bits(machInst, 23)) { 494 return new %(ldrsh_lit_u)s(machInst, rt, INTREG_PC, 495 true, imm12); 496 } else { 497 return new %(ldrsh_lit)s(machInst, rt, INTREG_PC, 498 false, imm12); 499 } 500 } else { 501 if (bits(machInst, 23)) { 502 return new %(ldrh_lit_u)s(machInst, rt, INTREG_PC, 503 true, imm12); 504 } else { 505 return new %(ldrh_lit)s(machInst, rt, INTREG_PC, 506 false, imm12); 507 } 508 } 509 } 510 } else if (rt == 0xf) { 511 switch (op1) { 512 case 0x0: 513 if (op2 == 0x0) { 514 if (pldw) { 515 return new %(pldw_radd)s(machInst, INTREG_ZERO, 516 rn, true, imm2, LSL, rm); 517 } else { 518 return new %(pld_radd)s(machInst, INTREG_ZERO, 519 rn, true, imm2, LSL, rm); 520 } 521 } else if (bits(op2, 5, 2) == 0xc) { 522 if (pldw) { 523 return new %(pldw_isub)s(machInst, INTREG_ZERO, 524 rn, false, imm8); 525 } else { 526 return new %(pld_isub)s(machInst, INTREG_ZERO, 527 rn, false, imm8); 528 } 529 } 530 break; 531 case 0x1: 532 if (pldw) { 533 return new %(pldw_iadd)s(machInst, INTREG_ZERO, 534 rn, true, imm12); 535 } else { 536 return new %(pld_iadd)s(machInst, INTREG_ZERO, 537 rn, true, imm12); 538 } 539 case 0x2: 540 if (op2 == 0x0 || bits(op2, 5, 2) == 0xc) { 541 // Unallocated memory hint 542 return new NopInst(machInst); 543 } 544 break; 545 case 0x3: 546 return new NopInst(machInst); 547 } 548 return new Unknown(machInst); 549 } else { 550 switch (op1) { 551 case 0x0: 552 if (op2 == 0) { 553 return new %(ldrh_radd)s(machInst, rt, rn, true, 554 imm2, LSL, rm); 555 } else if (bits(op2, 5, 2) == 0xe) { 556 return new %(ldrht)s(machInst, rt, rn, true, imm8); 557 } else if ((op2 & 0x24) == 0x24 || bits(op2, 5, 2) == 0xc) { 558 const uint32_t puw = bits(machInst, 10, 8); 559 switch (puw) { 560 case 0x1: 561 return new %(ldrh_iw)s(machInst, rt, 562 rn, false, imm8); 563 case 0x3: 564 return new %(ldrh_iuw)s(machInst, rt, 565 rn, true, imm8); 566 case 0x4: 567 return new %(ldrh_ip)s(machInst, rt, 568 rn, false, imm8); 569 case 0x5: 570 return new %(ldrh_ipw)s(machInst, rt, 571 rn, false, imm8); 572 case 0x7: 573 return new %(ldrh_ipuw)s(machInst, rt, 574 rn, true, imm8); 575 } 576 } 577 break; 578 case 0x1: 579 return new %(ldrh_iadd)s(machInst, rt, rn, true, imm12); 580 case 0x2: 581 if (op2 == 0) { 582 return new %(ldrsh_radd)s(machInst, rt, rn, true, 583 imm2, LSL, rm); 584 } else if (bits(op2, 5, 2) == 0xe) { 585 return new %(ldrsht)s(machInst, rt, rn, true, imm8); 586 } else if ((op2 & 0x24) == 0x24 || bits(op2, 5, 2) == 0xc) { 587 const uint32_t puw = bits(machInst, 10, 8); 588 switch (puw) { 589 case 0x1: 590 return new %(ldrsh_iw)s(machInst, rt, 591 rn, false, imm8); 592 case 0x3: 593 return new %(ldrsh_iuw)s(machInst, rt, 594 rn, true, imm8); 595 case 0x4: 596 return new %(ldrsh_ip)s(machInst, rt, 597 rn, false, imm8); 598 case 0x5: 599 return new %(ldrsh_ipw)s(machInst, rt, 600 rn, false, imm8); 601 case 0x7: 602 return new %(ldrsh_ipuw)s(machInst, rt, 603 rn, true, imm8); 604 } 605 } 606 break; 607 case 0x3: 608 return new %(ldrsh_iadd)s(machInst, rt, rn, true, imm12); 609 } 610 return new Unknown(machInst); 611 } 612 } 613 ''' 614 substDict = { 615 "ldrsh_lit_u" : loadImmClassName(False, True, False, 2, True), 616 "ldrsh_lit" : loadImmClassName(False, False, False, 2, True), 617 "ldrh_lit_u" : loadImmClassName(False, True, False, 2), 618 "ldrh_lit" : loadImmClassName(False, False, False, 2), 619 "ldrsh_radd" : loadRegClassName(False, True, False, 2, True), 620 "ldrh_radd" : loadRegClassName(False, True, False, 2), 621 "ldrsh_iw" : loadImmClassName(True, False, True, 2, True), 622 "ldrsh_iuw" : loadImmClassName(True, True, True, 2, True), 623 "ldrsh_ip" : loadImmClassName(False, False, False, 2, True), 624 "ldrsh_ipw" : loadImmClassName(False, False, True, 2, True), 625 "ldrsh_ipuw" : loadImmClassName(False, True, True, 2, True), 626 "ldrsh_iadd" : loadImmClassName(False, True, False, 2, True), 627 "ldrh_iw" : loadImmClassName(True, False, True, 2), 628 "ldrh_iuw" : loadImmClassName(True, True, True, 2), 629 "ldrh_ip" : loadImmClassName(False, False, False, 2), 630 "ldrh_ipw" : loadImmClassName(False, False, True, 2), 631 "ldrh_ipuw" : loadImmClassName(False, True, True, 2), 632 "ldrh_iadd" : loadImmClassName(False, True, False, 2), 633 "ldrht" : loadImmClassName(False, True, False, 2, user=True), 634 "ldrsht" : loadImmClassName(False, True, False, 2, True, user=True), 635 "pldw_radd" : "PLDW_" + loadRegClassName(False, True, False, 1), 636 "pld_radd" : "PLD_" + loadRegClassName(False, True, False, 1), 637 "pldw_isub" : "PLDW_" + loadImmClassName(False, False, False, 1), 638 "pld_isub" : "PLD_" + loadImmClassName(False, False, False, 1), 639 "pldw_iadd" : "PLDW_" + loadImmClassName(False, True, False, 1), 640 "pld_iadd" : "PLD_" + loadImmClassName(False, True, False, 1) 641 } 642 decode_block = decode % substDict 643}}; 644 |
|
471def format Thumb16MemReg() {{ 472 decode = ''' 473 { 474 const uint32_t opb = bits(machInst, 11, 9); 475 const uint32_t rt = bits(machInst, 2, 0); 476 const uint32_t rn = bits(machInst, 5, 3); 477 const uint32_t rm = bits(machInst, 8, 6); 478 switch (opb) { --- 94 unchanged lines hidden --- | 645def format Thumb16MemReg() {{ 646 decode = ''' 647 { 648 const uint32_t opb = bits(machInst, 11, 9); 649 const uint32_t rt = bits(machInst, 2, 0); 650 const uint32_t rn = bits(machInst, 5, 3); 651 const uint32_t rm = bits(machInst, 8, 6); 652 switch (opb) { --- 94 unchanged lines hidden --- |