Annotation of nono/m88xx0/testdis.cpp, revision 1.1.1.1

1.1       root        1: //
                      2: // nono
                      3: // Copyright (C) 2020 nono project
                      4: // Licensed under nono-license.txt
                      5: //
                      6: 
                      7: #include "m88100disasm.h"
                      8: #include "mystring.h"
                      9: 
                     10: struct {
                     11:        uint32 inst;
                     12:        std::string expected;
                     13: } table[] = {
                     14:  { 0x02328765, "xmem.bu r17,r18,#0x8765" },
                     15:  { 0x06328765, "xmem    r17,r18,#0x8765" },
                     16:  { 0x0a328765, "ld.hu   r17,r18,#0x8765" },
                     17:  { 0x0e328765, "ld.bu   r17,r18,#0x8765" },
                     18:  { 0x12328765, "ld.d    r17,r18,#0x8765" },
                     19:  { 0x16328765, "ld      r17,r18,#0x8765" },
                     20:  { 0x1a328765, "ld.h    r17,r18,#0x8765" },
                     21:  { 0x1e328765, "ld.b    r17,r18,#0x8765" },
                     22:  { 0x22328765, "st.d    r17,r18,#0x8765" },
                     23:  { 0x26328765, "st      r17,r18,#0x8765" },
                     24:  { 0x2a328765, "st.h    r17,r18,#0x8765" },
                     25:  { 0x2e328765, "st.b    r17,r18,#0x8765" },
                     26:  { 0x32328765, "lda.d   r17,r18,#0x8765" },
                     27:  { 0x36328765, "lda     r17,r18,#0x8765" },
                     28:  { 0x3a328765, "lda.h   r17,r18,#0x8765" },
                     29:  { 0x3e328765, "lda.b   r17,r18,#0x8765" },
                     30: 
                     31:  { 0x42328765, "and     r17,r18,#0x8765" },
                     32:  { 0x46328765, "and.u   r17,r18,#0x8765" },
                     33:  { 0x4a328765, "mask    r17,r18,#0x8765" },
                     34:  { 0x4e328765, "mask.u  r17,r18,#0x8765" },
                     35:  { 0x52328765, "xor     r17,r18,#0x8765" },
                     36:  { 0x56328765, "xor.u   r17,r18,#0x8765" },
                     37:  { 0x5a328765, "or      r17,r18,#0x8765" },
                     38:  { 0x5e328765, "or.u    r17,r18,#0x8765" },
                     39: 
                     40:  { 0x62328765, "addu    r17,r18,#0x8765" },
                     41:  { 0x66328765, "subu    r17,r18,#0x8765" },
                     42:  { 0x6a328765, "divu    r17,r18,#0x8765" },
                     43:  { 0x6e328765, "mul     r17,r18,#0x8765" },
                     44:  { 0x72328765, "add     r17,r18,#0x8765" },
                     45:  { 0x76328765, "sub     r17,r18,#0x8765" },
                     46:  { 0x7a328765, "div     r17,r18,#0x8765" },
                     47:  { 0x7e328765, "cmp     r17,r18,#0x8765" },
                     48: 
                     49:  { 0x82204260, "ldcr    r17,sr2" },
                     50:  { 0x82204fe0, "fldcr   r17,fpcr" },
                     51:  { 0x80118271, "stcr    r17,sr2" },
                     52:  { 0x80118ff1, "fstcr   r17,fpcr" },
                     53:  { 0x8232c272, "xcr     r17,r18,sr2" },
                     54:  { 0x8232cff2, "fxcr    r17,r18,fpcr" },
                     55: 
                     56:  { 0x86320001, "fmul.sss r17,r18,r1" },
                     57:  { 0x86202001, "flt.ss  r17,r1" },
                     58:  { 0x86322801, "fadd.sss r17,r18,r1" },
                     59:  { 0x86323001, "fsub.sss r17,r18,r1" },
                     60:  { 0x86323801, "fcmp.sss r17,r18,r1" },
                     61:  { 0x86204801, "int.ss  r17,r1" },
                     62:  { 0x86205001, "nint.ss r17,r1" },
                     63:  { 0x86205801, "trnc.ss r17,r1" },
                     64:  { 0x86327001, "fdiv.sss r17,r18,r1" },
                     65:  // fmul のサイズ
                     66:  { 0x86320021, "fmul.dss r17,r18,r1" },
                     67:  { 0x86320081, "fmul.ssd r17,r18,r1" },
                     68:  { 0x863200a1, "fmul.dsd r17,r18,r1" },
                     69:  { 0x86320201, "fmul.sds r17,r18,r1" },
                     70:  { 0x86320221, "fmul.dds r17,r18,r1" },
                     71:  { 0x86320281, "fmul.sdd r17,r18,r1" },
                     72:  { 0x863202a1, "fmul.ddd r17,r18,r1" },
                     73: 
                     74:  { 0xc3ffffff, "br      0x000000fc" },
                     75:  { 0xc7ffffff, "br.n    0x000000fc" },
                     76:  { 0xcbffffff, "bsr     0x000000fc" },
                     77:  { 0xcfffffff, "bsr.n   0x000000fc" },
                     78:  { 0xd232ffff, "bb0     #17,r18,0x000000fc" },
                     79:  { 0xd632ffff, "bb0.n   #17,r18,0x000000fc" },
                     80:  { 0xda32ffff, "bb1     #17,r18,0x000000fc" },
                     81:  { 0xde32ffff, "bb1.n   #17,r18,0x000000fc" },
                     82:  { 0xe852ffff, "bcnd    eq0,r18,0x000000fc" },
                     83:  { 0xec52ffff, "bcnd.n  eq0,r18,0x000000fc" },
                     84:  // bcnd の M5
                     85:  { 0xe9b2ffff, "bcnd    ne0,r18,0x000000fc" },
                     86:  { 0xe832ffff, "bcnd    gt0,r18,0x000000fc" },
                     87:  { 0xe992ffff, "bcnd    lt0,r18,0x000000fc" },
                     88:  { 0xe872ffff, "bcnd    ge0,r18,0x000000fc" },
                     89:  { 0xe9d2ffff, "bcnd    le0,r18,0x000000fc" },
                     90: 
                     91:  { 0xf2328274, "clr     r17,r18,19<20>" },
                     92:  { 0xf2328a74, "set     r17,r18,19<20>" },
                     93:  { 0xf2329274, "ext     r17,r18,19<20>" },
                     94:  { 0xf2329a74, "extu    r17,r18,19<20>" },
                     95:  { 0xf232a274, "mak     r17,r18,19<20>" },
                     96:  { 0xf232a814, "rot     r17,r18,<20>" },
                     97: 
                     98:  { 0xf232d101, "tb0     #17,r18,#0x101" },
                     99:  { 0xf232d901, "tb1     #17,r18,#0x101" },
                    100:  { 0xf052e901, "tcnd    eq0,r18,#0x101" },
                    101: 
                    102:  { 0xf6320001, "xmem.bu r17,r18,r1" },
                    103:  { 0xf6320401, "xmem    r17,r18,r1" },
                    104:  { 0xf6320801, "ld.hu   r17,r18,r1" },
                    105:  { 0xf6320c01, "ld.bu   r17,r18,r1" },
                    106:  { 0xf6321001, "ld.d    r17,r18,r1" },
                    107:  { 0xf6321401, "ld      r17,r18,r1" },
                    108:  { 0xf6321801, "ld.h    r17,r18,r1" },
                    109:  { 0xf6321c01, "ld.b    r17,r18,r1" },
                    110:  { 0xf6322001, "st.d    r17,r18,r1" },
                    111:  { 0xf6322401, "st      r17,r18,r1" },
                    112:  { 0xf6322801, "st.h    r17,r18,r1" },
                    113:  { 0xf6322c01, "st.b    r17,r18,r1" },
                    114:  // 全種について全引数パターンはつらいので ld だけで引数を変える
                    115:  { 0xf6321000, "ld.d    r17,r18,r0" },
                    116:  { 0xf6321200, "ld.d    r17,r18[r0]" },
                    117:  { 0xf6201001, "ld.d    r17,r0, r1" },
                    118:  { 0xf6321001, "ld.d    r17,r18,r1" },
                    119:  { 0xf6201201, "ld.d    r17,r0[r1]" },
                    120:  { 0xf6321201, "ld.d    r17,r18[r1]" },
                    121:  // .usr も一部代表だけ
                    122:  { 0xf6321101, "ld.d.usr r17,r18,r1" },
                    123:  { 0xf6321401, "ld      r17,r18,r1" },
                    124:  { 0xf6321501, "ld.usr  r17,r18,r1" },
                    125:  // lda
                    126:  { 0xf6323001, "lda.d   r17,r18,r1" },
                    127:  { 0xf6323401, "lda     r17,r18,r1" },
                    128:  { 0xf6323801, "lda.h   r17,r18,r1" },
                    129:  { 0xf6323c01, "lda.b   r17,r18,r1" },
                    130: 
                    131:  { 0xf6324001, "and     r17,r18,r1" },
                    132:  { 0xf6324401, "and.c   r17,r18,r1" },
                    133:  { 0xf6325001, "xor     r17,r18,r1" },
                    134:  { 0xf6325401, "xor.c   r17,r18,r1" },
                    135:  { 0xf6325801, "or      r17,r18,r1" },
                    136:  { 0xf6325c01, "or.c    r17,r18,r1" },
                    137:  { 0xf6326001, "addu    r17,r18,r1" },
                    138:  { 0xf6326101, "addu.co r17,r18,r1" },
                    139:  { 0xf6326201, "addu.ci r17,r18,r1" },
                    140:  { 0xf6326301, "addu.cio r17,r18,r1" },
                    141:  { 0xf6326401, "subu    r17,r18,r1" },
                    142:  { 0xf6326801, "divu    r17,r18,r1" },
                    143:  { 0xf6326401, "subu    r17,r18,r1" },
                    144:  { 0xf6326801, "divu    r17,r18,r1" },
                    145:  { 0xf6326c01, "mul     r17,r18,r1" },
                    146:  { 0xf6327001, "add     r17,r18,r1" },
                    147:  { 0xf6327401, "sub     r17,r18,r1" },
                    148:  { 0xf6327801, "div     r17,r18,r1" },
                    149:  { 0xf6327c01, "cmp     r17,r18,r1" },
                    150: 
                    151:  { 0xf6328001, "clr     r17,r18,r1" },
                    152:  { 0xf6328801, "set     r17,r18,r1" },
                    153:  { 0xf6329001, "ext     r17,r18,r1" },
                    154:  { 0xf6329801, "extu    r17,r18,r1" },
                    155:  { 0xf632a001, "mak     r17,r18,r1" },
                    156:  { 0xf632a801, "rot     r17,r18,r1" },
                    157: 
                    158:  { 0xf400c011, "jmp     r17" },
                    159:  { 0xf400c411, "jmp.n   r17" },
                    160:  { 0xf400c811, "jsr     r17" },
                    161:  { 0xf400cc11, "jsr.n   r17" },
                    162: 
                    163:  { 0xf620e801, "ff1     r17,r1" },
                    164:  { 0xf620ec01, "ff0     r17,r1" },
                    165: 
                    166:  { 0xf400fc00, "rte" },
                    167:  { 0xf411f801, "tbnd    r17,r1" },
                    168:  { 0xf8118765, "tbnd    r17,#0x8765" },
                    169: };
                    170: 
                    171: static uint8 ram[1024];
                    172: static int failed;
                    173: 
                    174: uint64
                    175: vm_phys_peek_8(uint32 addr)
                    176: {
                    177:        assertmsg(addr < sizeof(ram), "addr=0x%x", addr);
                    178: 
                    179:        // XXX endian
                    180:        return ram[addr ^ 1];
                    181: }
                    182: 
                    183: // リンカを通すためのダミー
                    184: Disasm::~Disasm() { }
                    185: DebuggerMD::~DebuggerMD() { }
                    186: 
                    187: int
                    188: main(int ac, char *av[])
                    189: {
                    190:        saddr_t saddr;
                    191: 
                    192:        // DebuggerMD (の継承クラス)を用意するのは芋づる式に大変なので、
                    193:        // 中でアクセスする変数だけ強引に用意する。
                    194:        DebuggerMD *md = (DebuggerMD *)malloc(sizeof(DebuggerMD));
                    195:        md->inst_bytes = 4;
                    196: 
                    197:        for (int i = 0; i < countof(table); i++) {
                    198:                std::string expected = table[i].expected;
                    199:                uint32 inst = table[i].inst;
                    200: 
                    201:                // エラー表示用
                    202:                std::string inst_str = string_format("%08x", inst);
                    203: 
                    204:                // 全体を初期化
                    205:                memset(ram, 0xdd, sizeof(ram));
                    206:                // 100番地に命令列を書き込む
                    207:                *(uint16 *)(ram + 0x100) = inst >> 16;
                    208:                *(uint16 *)(ram + 0x102) = inst & 0xffff;
                    209:                // 検査
                    210:                saddr = 0x100;
                    211:                DebuggerMemoryStream mem(md, saddr, MemoryMode::Physical);
                    212:                m88100disasm dis(mem);
                    213:                dis.Exec();
                    214:                // 照合
                    215:                if (dis.text != expected) {
                    216:                        printf(">%s expects \"%s\" but \"%s\"\n", inst_str.c_str(),
                    217:                                expected.c_str(), dis.text.c_str());
                    218:                        failed++;
                    219:                        continue;
                    220:                }
                    221:                uint32 expected_len = 4;
                    222:                if (dis.bin.size() != expected_len) {
                    223:                        printf(">%s expects len=$%x but $%x\n", inst_str.c_str(),
                    224:                                expected_len, (uint)dis.bin.size());
                    225:                        failed++;
                    226:                        continue;
                    227:                }
                    228:        }
                    229: 
                    230:        int total = countof(table);
                    231:        printf("%d tests, %d success", total, total - failed);
                    232:        if (failed > 0) {
                    233:                printf(", %d failed", failed);
                    234:        }
                    235:        printf("\n");
                    236:        return 0;
                    237: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.