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

1.1       root        1: //
                      2: // nono
                      3: // Copyright (C) 2020 nono project
                      4: // Licensed under nono-license.txt
                      5: //
                      6: 
                      7: #include "m88100disasm.h"
1.1.1.2 ! root        8: #include "config.h"
1.1       root        9: #include "mystring.h"
                     10: 
1.1.1.2 ! root       11: #define O(inst, expstd)                        { __LINE__, inst, expstd }
        !            12: #define T(inst, expstd, expalt) { __LINE__, inst, expstd, expalt }
        !            13: #define M(b, d, s1, s2)                ((b) | ((d)<<21) | ((s1)<<16) | (s2))
        !            14: 
1.1       root       15: struct {
1.1.1.2 ! root       16:        int line;
1.1       root       17:        uint32 inst;
1.1.1.2 ! root       18:        std::string expstd;
        !            19:        std::string expalt;
1.1       root       20: } table[] = {
1.1.1.2 ! root       21:  T(0x02328765, "xmem.bu r17,r18,#0x8765",      "{xmem.bu r17,(r18,#0x8765)}"),
        !            22:  T(0x06328765, "xmem    r17,r18,#0x8765",      "{xmem   r17,(r18,#0x8765)}"),
        !            23:  T(0x06320000, "xmem    r17,r18,#0x0000",      "{xmem   r17,(r18)}"),
        !            24:  T(0x06200001, "xmem    r17,r0, #0x0001",      "{xmem   r17,(r0,#0x0001)}"),
        !            25:  T(0x0a328765, "ld.hu   r17,r18,#0x8765",      "{ld.hu  r17,(r18,#0x8765)}"),
        !            26:  T(0x0e328765, "ld.bu   r17,r18,#0x8765",      "{ld.bu  r17,(r18,#0x8765)}"),
        !            27:  T(0x12328765, "ld.d    r17,r18,#0x8765",      "{ld.d   r17,(r18,#0x8765)}"),
        !            28:  T(0x16328765, "ld      r17,r18,#0x8765",      "{ld     r17,(r18,#0x8765)}"),
        !            29:  T(0x1a328765, "ld.h    r17,r18,#0x8765",      "{ld.h   r17,(r18,#0x8765)}"),
        !            30:  T(0x1e328765, "ld.b    r17,r18,#0x8765",      "{ld.b   r17,(r18,#0x8765)}"),
        !            31:  T(0x22328765, "st.d    r17,r18,#0x8765",      "{st.d   r17,(r18,#0x8765)}"),
        !            32:  T(0x26328765, "st      r17,r18,#0x8765",      "{st     r17,(r18,#0x8765)}"),
        !            33:  T(0x2a328765, "st.h    r17,r18,#0x8765",      "{st.h   r17,(r18,#0x8765)}"),
        !            34:  T(0x2e328765, "st.b    r17,r18,#0x8765",      "{st.b   r17,(r18,#0x8765)}"),
        !            35:  T(0x32328765, "lda.d   r17,r18,#0x8765",      "{lda.d  r17,r18,#0x8765}"),
        !            36:  T(0x36328765, "lda     r17,r18,#0x8765",      "{lda    r17,r18,#0x8765}"),
        !            37:  T(0x3a328765, "lda.h   r17,r18,#0x8765",      "{lda.h  r17,r18,#0x8765}"),
        !            38:  T(0x3e328765, "lda.b   r17,r18,#0x8765",      "{lda.b  r17,r18,#0x8765}"),
        !            39:  T(0x36320000, "lda     r17,r18,#0x0000",      "{lda    r17,r18}"),
        !            40:  T(0x36200001, "lda     r17,r0, #0x0001",      "{lda    r17,r0,#0x0001}"),
        !            41: 
        !            42:  T(0x40128765, "and     r0, r18,#0x8765",      "{nop}"),
        !            43:  T(0x42208765, "and     r17,r0, #0x8765",      "{clr    r17}"),
        !            44:  T(0x42318765, "and     r17,r17,#0x8765",      "{and    r17,#0xffff8765}"),
        !            45:  T(0x42328765, "and     r17,r18,#0x8765",      "{and    r17,r18,#0xffff8765}"),
        !            46:  T(0x44128765, "and.u   r0, r18,#0x8765",      "{nop}"),
        !            47:  T(0x46208765, "and.u   r17,r0, #0x8765",      "{clr    r17}"),
        !            48:  T(0x46318765, "and.u   r17,r17,#0x8765",      "{and    r17,#0x8765ffff}"),
        !            49:  T(0x46328765, "and.u   r17,r18,#0x8765",      "{and    r17,r18,#0x8765ffff}"),
        !            50:  T(0x48128765, "mask    r0, r18,#0x8765",      "{nop}"),
        !            51:  T(0x4a208765, "mask    r17,r0, #0x8765",      "{clr    r17}"),
        !            52:  T(0x4a318765, "mask    r17,r17,#0x8765",      "{and    r17,#0x00008765}"),
        !            53:  T(0x4a328765, "mask    r17,r18,#0x8765",      "{and    r17,r18,#0x00008765}"),
        !            54:  T(0x4c128765, "mask.u  r0, r18,#0x8765",      "{nop}"),
        !            55:  T(0x4e208765, "mask.u  r17,r0, #0x8765",      "{clr    r17}"),
        !            56:  T(0x4e318765, "mask.u  r17,r17,#0x8765",      "{and    r17,#0x87650000}"),
        !            57:  T(0x4e328765, "mask.u  r17,r18,#0x8765",      "{and    r17,r18,#0x87650000}"),
        !            58: 
        !            59:  T(0x50128765, "xor     r0, r18,#0x8765",      "{nop}"),
        !            60:  T(0x52208765, "xor     r17,r0, #0x8765",      "{mov    r17,#0x8765}"),
        !            61:  T(0x52318765, "xor     r17,r17,#0x8765",      "{xor    r17,#0x8765}"),
        !            62:  T(0x52328765, "xor     r17,r18,#0x8765",      "{xor    r17,r18,#0x8765}"),
        !            63:  T(0x54128765, "xor.u   r0, r18,#0x8765",      "{nop}"),
        !            64:  T(0x56208765, "xor.u   r17,r0, #0x8765",      "{mov    r17,#0x87650000}"),
        !            65:  T(0x56318765, "xor.u   r17,r17,#0x8765",      "{xor    r17,#0x87650000}"),
        !            66:  T(0x56328765, "xor.u   r17,r18,#0x8765",      "{xor    r17,r18,#0x87650000}"),
        !            67:  T(0x58128765, "or      r0, r18,#0x8765",      "{nop}"),
        !            68:  T(0x5a208765, "or      r17,r0, #0x8765",      "{mov    r17,#0x8765}"),
        !            69:  T(0x5a318765, "or      r17,r17,#0x8765",      "{or     r17,#0x8765}"),
        !            70:  T(0x5a328765, "or      r17,r18,#0x8765",      "{or     r17,r18,#0x8765}"),
        !            71:  T(0x5c128765, "or.u    r0, r18,#0x8765",      "{nop}"),
        !            72:  T(0x5e208765, "or.u    r17,r0, #0x8765",      "{mov    r17,#0x87650000}"),
        !            73:  T(0x5e318765, "or.u    r17,r17,#0x8765",      "{or     r17,#0x87650000}"),
        !            74:  T(0x5e328765, "or.u    r17,r18,#0x8765",      "{or     r17,r18,#0x87650000}"),
        !            75: 
        !            76:  T(0x60128765, "addu    r0, r18,#0x8765",      "{nop}"),
        !            77:  T(0x62208765, "addu    r17,r0, #0x8765",      "{mov    r17,#0x00008765}"),
        !            78:  T(0x62318765, "addu    r17,r17,#0x8765",      "{addu   r17,#0x00008765}"),
        !            79:  T(0x62328765, "addu    r17,r18,#0x8765",      "{addu   r17,r18,#0x00008765}"),
        !            80:  T(0x64128765, "subu    r0, r18,#0x8765",      "{nop}"),
        !            81:  T(0x66208765, "subu    r17,r0, #0x8765",      "{mov    r17,#0xffff789b}"),
        !            82:  T(0x66318765, "subu    r17,r17,#0x8765",      "{subu   r17,#0x00008765}"),
        !            83:  T(0x66328765, "subu    r17,r18,#0x8765",      "{subu   r17,r18,#0x00008765}"),
        !            84:  T(0x68128765, "divu    r0, r18,#0x8765",      "{divu   r0, r18,#0x00008765}"),
        !            85:  T(0x6a208765, "divu    r17,r0, #0x8765",      "{divu   r17,r0, #0x00008765}"),
        !            86:  T(0x6a318765, "divu    r17,r17,#0x8765",      "{divu   r17,#0x00008765}"),
        !            87:  T(0x6a328765, "divu    r17,r18,#0x8765",      "{divu   r17,r18,#0x00008765}"),
        !            88:  T(0x6c128765, "mul     r0, r18,#0x8765",      "{mul    r0, r18,#0x00008765}"),
        !            89:  T(0x6e208765, "mul     r17,r0, #0x8765",      "{mul    r17,r0, #0x00008765}"),
        !            90:  T(0x6e318765, "mul     r17,r17,#0x8765",      "{mul    r17,#0x00008765}"),
        !            91:  T(0x6e328765, "mul     r17,r18,#0x8765",      "{mul    r17,r18,#0x00008765}"),
        !            92: 
        !            93:  T(0x70128765, "add     r0, r18,#0x8765",      "{adds   r0, r18,#0x00008765}"),
        !            94:  T(0x72208765, "add     r17,r0, #0x8765",      "{adds   r17,r0, #0x00008765}"),
        !            95:  T(0x72318765, "add     r17,r17,#0x8765",      "{adds   r17,#0x00008765}"),
        !            96:  T(0x72328765, "add     r17,r18,#0x8765",      "{adds   r17,r18,#0x00008765}"),
        !            97:  T(0x74128765, "sub     r0, r18,#0x8765",      "{subs   r0, r18,#0x00008765}"),
        !            98:  T(0x76208765, "sub     r17,r0, #0x8765",      "{subs   r17,r0, #0x00008765}"),
        !            99:  T(0x76318765, "sub     r17,r17,#0x8765",      "{subs   r17,#0x00008765}"),
        !           100:  T(0x76328765, "sub     r17,r18,#0x8765",      "{subs   r17,r18,#0x00008765}"),
        !           101:  T(0x78128765, "div     r0, r18,#0x8765",      "{div    r0, r18,#0x00008765}"),
        !           102:  T(0x7a208765, "div     r17,r0, #0x8765",      "{div    r17,r0, #0x00008765}"),
        !           103:  T(0x7a318765, "div     r17,r17,#0x8765",      "{div    r17,#0x00008765}"),
        !           104:  T(0x7a328765, "div     r17,r18,#0x8765",      "{div    r17,r18,#0x00008765}"),
        !           105:  T(0x7c128765, "cmp     r0, r18,#0x8765",      "{nop}"),
        !           106:  T(0x7e208765, "cmp     r17,r0, #0x8765",      "{cmp    r17,r0, #0x00008765}"),
        !           107:  T(0x7e318765, "cmp     r17,r17,#0x8765",      "{cmp    r17,r17,#0x00008765}"),
        !           108:  T(0x7e328765, "cmp     r17,r18,#0x8765",      "{cmp    r17,r18,#0x00008765}"),
        !           109: 
        !           110:  O(0x82204260, "ldcr    r17,sr2"),
        !           111:  O(0x82204fe0, "fldcr   r17,fpcr"),
        !           112:  O(0x80118271, "stcr    r17,sr2"),
        !           113:  O(0x80118ff1, "fstcr   r17,fpcr"),
        !           114:  O(0x8232c272, "xcr     r17,r18,sr2"),
        !           115:  O(0x8232cff2, "fxcr    r17,r18,fpcr"),
        !           116: 
        !           117:  O(0x86320001, "fmul.sss r17,r18,r1"),
        !           118:  O(0x86202001, "flt.ss  r17,r1"),
        !           119:  O(0x86322801, "fadd.sss r17,r18,r1"),
        !           120:  O(0x86323001, "fsub.sss r17,r18,r1"),
        !           121:  O(0x86323801, "fcmp.sss r17,r18,r1"),
        !           122:  O(0x86204801, "int.ss  r17,r1"),
        !           123:  O(0x86205001, "nint.ss r17,r1"),
        !           124:  O(0x86205801, "trnc.ss r17,r1"),
        !           125:  O(0x86327001, "fdiv.sss r17,r18,r1"),
1.1       root      126:  // fmul のサイズ
1.1.1.2 ! root      127:  O(0x86320021, "fmul.dss r17,r18,r1"),
        !           128:  O(0x86320081, "fmul.ssd r17,r18,r1"),
        !           129:  O(0x863200a1, "fmul.dsd r17,r18,r1"),
        !           130:  O(0x86320201, "fmul.sds r17,r18,r1"),
        !           131:  O(0x86320221, "fmul.dds r17,r18,r1"),
        !           132:  O(0x86320281, "fmul.sdd r17,r18,r1"),
        !           133:  O(0x863202a1, "fmul.ddd r17,r18,r1"),
        !           134: 
        !           135:  O(0xc3ffffff, "br      0x000000fc"),
        !           136:  O(0xc7ffffff, "br.n    0x000000fc"),
        !           137:  O(0xcbffffff, "bsr     0x000000fc"),
        !           138:  O(0xcfffffff, "bsr.n   0x000000fc"),
        !           139:  O(0xd232ffff, "bb0     #17,r18,0x000000fc"),
        !           140:  O(0xd632ffff, "bb0.n   #17,r18,0x000000fc"),
        !           141:  O(0xda32ffff, "bb1     #17,r18,0x000000fc"),
        !           142:  O(0xde32ffff, "bb1.n   #17,r18,0x000000fc"),
        !           143:  O(0xe852ffff, "bcnd    eq0,r18,0x000000fc"),
        !           144:  O(0xec52ffff, "bcnd.n  eq0,r18,0x000000fc"),
1.1       root      145:  // bcnd の M5
1.1.1.2 ! root      146:  O(0xe9b2ffff, "bcnd    ne0,r18,0x000000fc"),
        !           147:  O(0xe832ffff, "bcnd    gt0,r18,0x000000fc"),
        !           148:  O(0xe992ffff, "bcnd    lt0,r18,0x000000fc"),
        !           149:  O(0xe872ffff, "bcnd    ge0,r18,0x000000fc"),
        !           150:  O(0xe9d2ffff, "bcnd    le0,r18,0x000000fc"),
        !           151: 
        !           152:  T(0xf2328034, "clr     r17,r18,1<20>",                "{bitclr r17,r18,#20}"),
        !           153:  T(0xf2328274, "clr     r17,r18,19<20>",       "{bfclr  r17,r18,19<20>}"),
        !           154:  T(0xf2328834, "set     r17,r18,1<20>",                "{bitset r17,r18,#20}"),
        !           155:  T(0xf2328a74, "set     r17,r18,19<20>",       "{bfset  r17,r18,19<20>}"),
        !           156: 
        !           157:  T(0xf0129274, "ext     r0, r18,19<20>",       "{nop}"),
        !           158:  T(0xf2209274, "ext     r17,r0, 19<20>",       "{clr    r17}"),
        !           159:  T(0xf2319014, "ext     r17,r17,32<20>",       "{asr    r17,#20}"),
        !           160:  T(0xf2329014, "ext     r17,r18,32<20>",       "{asr    r17,r18,#20}"),
        !           161:  T(0xf2319194, "ext     r17,r17,12<20>",       "{asr    r17,#20}"),
        !           162:  T(0xf2319174, "ext     r17,r17,11<20>",       "{bfexts r17,11<20>}"),
        !           163:  T(0xf2329194, "ext     r17,r18,12<20>",       "{asr    r17,r18,#20}"),
        !           164:  T(0xf2329174, "ext     r17,r18,11<20>",       "{bfexts r17,r18,11<20>}"),
        !           165:  T(0xf0129a74, "extu    r0, r18,19<20>",       "{nop}"),
        !           166:  T(0xf2209a74, "extu    r17,r0, 19<20>",       "{clr    r17}"),
        !           167:  T(0xf2319814, "extu    r17,r17,32<20>",       "{lsr    r17,#20}"),
        !           168:  T(0xf2329814, "extu    r17,r18,32<20>",       "{lsr    r17,r18,#20}"),
        !           169:  T(0xf2319994, "extu    r17,r17,12<20>",       "{lsr    r17,#20}"),
        !           170:  T(0xf2319974, "extu    r17,r17,11<20>",       "{bfextu r17,11<20>}"),
        !           171:  T(0xf2329994, "extu    r17,r18,12<20>",       "{lsr    r17,r18,#20}"),
        !           172:  T(0xf2329974, "extu    r17,r18,11<20>",       "{bfextu r17,r18,11<20>}"),
        !           173: 
        !           174:  T(0xf012a274, "mak     r0, r18,19<20>",       "{nop}"),
        !           175:  T(0xf220a274, "mak     r17,r0, 19<20>",       "{clr    r17}"),
        !           176:  T(0xf231a014, "mak     r17,r17,32<20>",       "{lsl    r17,#20}"),
        !           177:  T(0xf232a014, "mak     r17,r18,32<20>",       "{lsl    r17,r18,#20}"),
        !           178:  T(0xf231a194, "mak     r17,r17,12<20>",       "{lsl    r17,#20}"),
        !           179:  T(0xf231a174, "mak     r17,r17,11<20>",       "{bfmak  r17,11<20>}"),
        !           180:  T(0xf232a194, "mak     r17,r18,12<20>",       "{lsl    r17,r18,#20}"),
        !           181:  T(0xf232a174, "mak     r17,r18,11<20>",       "{bfmak  r17,r18,11<20>}"),
        !           182:  T(0xf012a814, "rot     r0, r18,<20>",         "{nop}"),
        !           183:  T(0xf231a800, "rot     r17,r17,<0>",          "{nop}"),
        !           184:  T(0xf220a814, "rot     r17,r0, <20>",         "{clr    r17}"),
        !           185:  T(0xf231a810, "rot     r17,r17,<16>",         "{ror    r17,#16}"),
        !           186:  T(0xf232a810, "rot     r17,r18,<16>",         "{ror    r17,r18,#16}"),
        !           187:  T(0xf231a814, "rot     r17,r17,<20>",         "{rol    r17,#12}"),
        !           188:  T(0xf232a814, "rot     r17,r18,<20>",         "{rol    r17,r18,#12}"),
        !           189: 
        !           190:  O(0xf232d101, "tb0     #17,r18,#0x101"),
        !           191:  O(0xf232d901, "tb1     #17,r18,#0x101"),
        !           192:  T(0xf220d87f, "tb1     #17,r0, #0x07f",       "{ssync}"),
        !           193:  T(0xf220d880, "tb1     #17,r0, #0x080",       "{usync}"),
        !           194:  O(0xf052e901, "tcnd    eq0,r18,#0x101"),
        !           195: 
        !           196:  T(0xf6320001, "xmem.bu r17,r18,r1",           "{xmem.bu r17,(r18,r1)}"),
        !           197:  T(0xf6320401, "xmem    r17,r18,r1",           "{xmem   r17,(r18,r1)}"),
        !           198:  T(0xf6320801, "ld.hu   r17,r18,r1",           "{ld.hu  r17,(r18,r1)}"),
        !           199:  T(0xf6320c01, "ld.bu   r17,r18,r1",           "{ld.bu  r17,(r18,r1)}"),
        !           200:  T(0xf6321001, "ld.d    r17,r18,r1",           "{ld.d   r17,(r18,r1)}"),
        !           201:  T(0xf6321401, "ld      r17,r18,r1",           "{ld     r17,(r18,r1)}"),
        !           202:  T(0xf6321801, "ld.h    r17,r18,r1",           "{ld.h   r17,(r18,r1)}"),
        !           203:  T(0xf6321c01, "ld.b    r17,r18,r1",           "{ld.b   r17,(r18,r1)}"),
        !           204:  T(0xf6322001, "st.d    r17,r18,r1",           "{st.d   r17,(r18,r1)}"),
        !           205:  T(0xf6322401, "st      r17,r18,r1",           "{st     r17,(r18,r1)}"),
        !           206:  T(0xf6322801, "st.h    r17,r18,r1",           "{st.h   r17,(r18,r1)}"),
        !           207:  T(0xf6322c01, "st.b    r17,r18,r1",           "{st.b   r17,(r18,r1)}"),
1.1       root      208:  // 全種について全引数パターンはつらいので ld だけで引数を変える
1.1.1.2 ! root      209:  T(0xf6321000, "ld.d    r17,r18,r0",           "{ld.d   r17,(r18)}"),
        !           210:  T(0xf6321200, "ld.d    r17,r18[r0]",          "{ld.d   r17,(r18)}"),
        !           211:  T(0xf6201001, "ld.d    r17,r0, r1",           "{ld.d   r17,(r1)}"),
        !           212:  T(0xf6321001, "ld.d    r17,r18,r1",           "{ld.d   r17,(r18,r1)}"),
        !           213:  T(0xf6201201, "ld.d    r17,r0[r1]",           "{ld.d   r17,(r0[r1])}"),
        !           214:  T(0xf6321201, "ld.d    r17,r18[r1]",          "{ld.d   r17,(r18[r1])}"),
1.1       root      215:  // .usr も一部代表だけ
1.1.1.2 ! root      216:  T(0xf6321101, "ld.d.usr r17,r18,r1",          "{ldusr.d r17,(r18,r1)}"),
        !           217:  T(0xf6321401, "ld      r17,r18,r1",           "{ld     r17,(r18,r1)}"),
        !           218:  T(0xf6321501, "ld.usr  r17,r18,r1",           "{ldusr  r17,(r18,r1)}"),
1.1       root      219:  // lda
1.1.1.2 ! root      220:  T(0xf6323001, "lda.d   r17,r18,r1",           "{lda.d  r17,r18,r1}"),
        !           221:  T(0xf6323401, "lda     r17,r18,r1",           "{lda    r17,r18,r1}"),
        !           222:  T(0xf6323801, "lda.h   r17,r18,r1",           "{lda.h  r17,r18,r1}"),
        !           223:  T(0xf6323c01, "lda.b   r17,r18,r1",           "{lda.b  r17,r18,r1}"),
        !           224: 
        !           225:  // ここから3項になってパターンが増えるので r17, r18 ではなく r1, r2 を使う
        !           226: #define A(d, s1, s2)   M(0xf400'4000, d, s1, s2)
        !           227:  T(A(0, 0, 0), "and     r0, r0, r0",           "{nop}"),
        !           228:  T(A(0, 0, 1), "and     r0, r0, r1",           "{nop}"),
        !           229:  T(A(0, 1, 0), "and     r0, r1, r0",           "{nop}"),
        !           230:  T(A(0, 1, 1), "and     r0, r1, r1",           "{nop}"),
        !           231:  T(A(0, 1, 2), "and     r0, r1, r2",           "{nop}"),
        !           232:  T(A(0, 2, 1), "and     r0, r2, r1",           "{nop}"),
        !           233:  T(A(1, 0, 0), "and     r1, r0, r0",           "{clr    r1}"),
        !           234:  T(A(1, 0, 1), "and     r1, r0, r1",           "{clr    r1}"),
        !           235:  T(A(1, 0, 2), "and     r1, r0, r2",           "{clr    r1}"),
        !           236:  T(A(1, 1, 0), "and     r1, r1, r0",           "{clr    r1}"),
        !           237:  T(A(1, 1, 1), "and     r1, r1, r1",           "{nop}"),
        !           238:  T(A(1, 1, 2), "and     r1, r1, r2",           "{and    r1, r2}"),
        !           239:  T(A(1, 2, 0), "and     r1, r2, r0",           "{clr    r1}"),
        !           240:  T(A(1, 2, 1), "and     r1, r2, r1",           "{and    r1, r2}"),
        !           241:  T(A(1, 2, 2), "and     r1, r2, r2",           "{mov    r1, r2}"),
        !           242:  T(A(1, 2, 3), "and     r1, r2, r3",           "{and    r1, r2, r3}"),
        !           243: #undef A
        !           244: 
        !           245: #define A(d, s1, s2)   M(0xf400'4400, d, s1, s2)
        !           246:  T(A(0, 0, 0), "and.c   r0, r0, r0",           "{nop}"),
        !           247:  T(A(0, 0, 1), "and.c   r0, r0, r1",           "{nop}"),
        !           248:  T(A(0, 1, 0), "and.c   r0, r1, r0",           "{nop}"),
        !           249:  T(A(0, 1, 1), "and.c   r0, r1, r1",           "{nop}"),
        !           250:  T(A(0, 1, 2), "and.c   r0, r1, r2",           "{nop}"),
        !           251:  T(A(0, 2, 1), "and.c   r0, r2, r1",           "{nop}"),
        !           252:  T(A(1, 0, 0), "and.c   r1, r0, r0",           "{clr    r1}"),
        !           253:  T(A(1, 0, 1), "and.c   r1, r0, r1",           "{clr    r1}"),
        !           254:  T(A(1, 0, 2), "and.c   r1, r0, r2",           "{clr    r1}"),
        !           255:  T(A(1, 1, 0), "and.c   r1, r1, r0",           "{nop}"),
        !           256:  T(A(1, 1, 1), "and.c   r1, r1, r1",           "{clr    r1}"),
        !           257:  T(A(1, 1, 2), "and.c   r1, r1, r2",           "{and    r1, ~r2}"),
        !           258:  T(A(1, 2, 0), "and.c   r1, r2, r0",           "{mov    r1, r2}"),
        !           259:  T(A(1, 2, 1), "and.c   r1, r2, r1",           "{and    r1, r2, ~r1}"),
        !           260:  T(A(1, 2, 2), "and.c   r1, r2, r2",           "{clr    r1}"),
        !           261:  T(A(1, 2, 3), "and.c   r1, r2, r3",           "{and    r1, r2, ~r3}"),
        !           262: #undef A
        !           263: 
        !           264: #define A(d, s1, s2)   M(0xf400'5000, d, s1, s2)
        !           265:  T(A(0, 0, 0), "xor     r0, r0, r0",           "{nop}"),
        !           266:  T(A(0, 0, 1), "xor     r0, r0, r1",           "{nop}"),
        !           267:  T(A(0, 1, 0), "xor     r0, r1, r0",           "{nop}"),
        !           268:  T(A(0, 1, 1), "xor     r0, r1, r1",           "{nop}"),
        !           269:  T(A(0, 1, 2), "xor     r0, r1, r2",           "{nop}"),
        !           270:  T(A(0, 2, 1), "xor     r0, r2, r1",           "{nop}"),
        !           271:  T(A(1, 0, 0), "xor     r1, r0, r0",           "{clr    r1}"),
        !           272:  T(A(1, 0, 1), "xor     r1, r0, r1",           "{nop}"),
        !           273:  T(A(1, 0, 2), "xor     r1, r0, r2",           "{mov    r1, r2}"),
        !           274:  T(A(1, 1, 0), "xor     r1, r1, r0",           "{nop}"),
        !           275:  T(A(1, 1, 1), "xor     r1, r1, r1",           "{clr    r1}"),
        !           276:  T(A(1, 1, 2), "xor     r1, r1, r2",           "{xor    r1, r2}"),
        !           277:  T(A(1, 2, 0), "xor     r1, r2, r0",           "{mov    r1, r2}"),
        !           278:  T(A(1, 2, 1), "xor     r1, r2, r1",           "{xor    r1, r2}"),
        !           279:  T(A(1, 2, 2), "xor     r1, r2, r2",           "{clr    r1}"),
        !           280:  T(A(1, 2, 3), "xor     r1, r2, r3",           "{xor    r1, r2, r3}"),
        !           281: #undef A
        !           282: 
        !           283:  // 独自ニーモニック側の XOR rD,rS1,~rS2 はもうちょっと演算したい
        !           284: #define A(d, s1, s2)   M(0xf400'5400, d, s1, s2)
        !           285:  T(A(0, 0, 0), "xor.c   r0, r0, r0",           "{nop}"),
        !           286:  T(A(0, 0, 1), "xor.c   r0, r0, r1",           "{nop}"),
        !           287:  T(A(0, 1, 0), "xor.c   r0, r1, r0",           "{nop}"),
        !           288:  T(A(0, 1, 1), "xor.c   r0, r1, r1",           "{nop}"),
        !           289:  T(A(0, 1, 2), "xor.c   r0, r1, r2",           "{nop}"),
        !           290:  T(A(0, 2, 1), "xor.c   r0, r2, r1",           "{nop}"),
        !           291:  T(A(1, 0, 0), "xor.c   r1, r0, r0",           "{mov    r1, #0xffffffff}"),
        !           292:  T(A(1, 0, 1), "xor.c   r1, r0, r1",           "{not    r1}"),
        !           293:  T(A(1, 0, 2), "xor.c   r1, r0, r2",           "{not    r1, r2}"),
        !           294:  T(A(1, 1, 0), "xor.c   r1, r1, r0",           "{not    r1}"),
        !           295:  T(A(1, 1, 1), "xor.c   r1, r1, r1",           "{mov    r1, #0xffffffff}"),
        !           296:  T(A(1, 1, 2), "xor.c   r1, r1, r2",           "{xor    r1, ~r2}"),
        !           297:  T(A(1, 2, 0), "xor.c   r1, r2, r0",           "{not    r1, r2}"),
        !           298:  T(A(1, 2, 1), "xor.c   r1, r2, r1",           "{xor    r1, r2, ~r1}"),
        !           299:  T(A(1, 2, 2), "xor.c   r1, r2, r2",           "{mov    r1, #0xffffffff}"),
        !           300:  T(A(1, 2, 3), "xor.c   r1, r2, r3",           "{xor    r1, r2, ~r3}"),
        !           301: #undef A
        !           302: 
        !           303: #define A(d, s1, s2)   M(0xf400'5800, d, s1, s2)
        !           304:  T(A(0, 0, 0), "or      r0, r0, r0",           "{nop}"),
        !           305:  T(A(0, 0, 1), "or      r0, r0, r1",           "{nop}"),
        !           306:  T(A(0, 1, 0), "or      r0, r1, r0",           "{nop}"),
        !           307:  T(A(0, 1, 1), "or      r0, r1, r1",           "{nop}"),
        !           308:  T(A(0, 1, 2), "or      r0, r1, r2",           "{nop}"),
        !           309:  T(A(0, 2, 1), "or      r0, r2, r1",           "{nop}"),
        !           310:  T(A(1, 0, 0), "or      r1, r0, r0",           "{clr    r1}"),
        !           311:  T(A(1, 0, 1), "or      r1, r0, r1",           "{nop}"),
        !           312:  T(A(1, 0, 2), "or      r1, r0, r2",           "{mov    r1, r2}"),
        !           313:  T(A(1, 1, 0), "or      r1, r1, r0",           "{nop}"),
        !           314:  T(A(1, 1, 1), "or      r1, r1, r1",           "{nop}"),
        !           315:  T(A(1, 1, 2), "or      r1, r1, r2",           "{or     r1, r2}"),
        !           316:  T(A(1, 2, 0), "or      r1, r2, r0",           "{mov    r1, r2}"),
        !           317:  T(A(1, 2, 1), "or      r1, r2, r1",           "{or     r1, r2}"),
        !           318:  T(A(1, 2, 2), "or      r1, r2, r2",           "{mov    r1, r2}"),
        !           319:  T(A(1, 2, 3), "or      r1, r2, r3",           "{or     r1, r2, r3}"),
        !           320: #undef A
        !           321: 
        !           322: #define A(d, s1, s2)   M(0xf400'5c00, d, s1, s2)
        !           323:  T(A(0, 0, 0), "or.c    r0, r0, r0",           "{nop}"),
        !           324:  T(A(0, 0, 1), "or.c    r0, r0, r1",           "{nop}"),
        !           325:  T(A(0, 1, 0), "or.c    r0, r1, r0",           "{nop}"),
        !           326:  T(A(0, 1, 1), "or.c    r0, r1, r1",           "{nop}"),
        !           327:  T(A(0, 1, 2), "or.c    r0, r1, r2",           "{nop}"),
        !           328:  T(A(0, 2, 1), "or.c    r0, r2, r1",           "{nop}"),
        !           329:  T(A(1, 0, 0), "or.c    r1, r0, r0",           "{mov    r1, #0xffffffff}"),
        !           330:  T(A(1, 0, 1), "or.c    r1, r0, r1",           "{not    r1}"),
        !           331:  T(A(1, 0, 2), "or.c    r1, r0, r2",           "{not    r1, r2}"),
        !           332:  T(A(1, 1, 0), "or.c    r1, r1, r0",           "{mov    r1, #0xffffffff}"),
        !           333:  T(A(1, 1, 1), "or.c    r1, r1, r1",           "{mov    r1, #0xffffffff}"),
        !           334:  T(A(1, 1, 2), "or.c    r1, r1, r2",           "{or     r1, ~r2}"),
        !           335:  T(A(1, 2, 0), "or.c    r1, r2, r0",           "{mov    r1, #0xffffffff}"),
        !           336:  T(A(1, 2, 1), "or.c    r1, r2, r1",           "{or     r1, r2, ~r1}"),
        !           337:  T(A(1, 2, 2), "or.c    r1, r2, r2",           "{mov    r1, #0xffffffff}"),
        !           338:  T(A(1, 2, 3), "or.c    r1, r2, r3",           "{or     r1, r2, ~r3}"),
        !           339: #undef A
        !           340: 
        !           341: #define A(d, s1, s2)   M(0xf400'6000, d, s1, s2)
        !           342:  T(A(0, 0, 0), "addu    r0, r0, r0",           "{nop}"),
        !           343:  T(A(0, 0, 1), "addu    r0, r0, r1",           "{nop}"),
        !           344:  T(A(0, 1, 0), "addu    r0, r1, r0",           "{nop}"),
        !           345:  T(A(0, 1, 1), "addu    r0, r1, r1",           "{nop}"),
        !           346:  T(A(0, 1, 2), "addu    r0, r1, r2",           "{nop}"),
        !           347:  T(A(0, 2, 1), "addu    r0, r2, r1",           "{nop}"),
        !           348:  T(A(1, 0, 0), "addu    r1, r0, r0",           "{clr    r1}"),
        !           349:  T(A(1, 0, 1), "addu    r1, r0, r1",           "{nop}"),
        !           350:  T(A(1, 0, 2), "addu    r1, r0, r2",           "{mov    r1, r2}"),
        !           351:  T(A(1, 1, 0), "addu    r1, r1, r0",           "{nop}"),
        !           352:  T(A(1, 1, 1), "addu    r1, r1, r1",           "{addu   r1, r1}"),
        !           353:  T(A(1, 1, 2), "addu    r1, r1, r2",           "{addu   r1, r2}"),
        !           354:  T(A(1, 2, 0), "addu    r1, r2, r0",           "{mov    r1, r2}"),
        !           355:  T(A(1, 2, 1), "addu    r1, r2, r1",           "{addu   r1, r2}"),
        !           356:  T(A(1, 2, 2), "addu    r1, r2, r2",           "{addu   r1, r2, r2}"),
        !           357:  T(A(1, 2, 3), "addu    r1, r2, r3",           "{addu   r1, r2, r3}"),
        !           358: #undef A
        !           359: 
        !           360:  // Carry In/Out を含むやつは 2オペランドへの省略のみ (.coだけ代表でテスト)
        !           361: #define A(d, s1, s2)   M(0xf400'6100, d, s1, s2)
        !           362:  T(A(0, 0, 0), "addu.co r0, r0, r0",           "{addu.co r0, r0}"),
        !           363:  T(A(0, 0, 1), "addu.co r0, r0, r1",           "{addu.co r0, r1}"),
        !           364:  T(A(0, 1, 0), "addu.co r0, r1, r0",           "{addu.co r0, r1, r0}"),
        !           365:  T(A(0, 1, 1), "addu.co r0, r1, r1",           "{addu.co r0, r1, r1}"),
        !           366:  T(A(0, 1, 2), "addu.co r0, r1, r2",           "{addu.co r0, r1, r2}"),
        !           367:  T(A(0, 2, 1), "addu.co r0, r2, r1",           "{addu.co r0, r2, r1}"),
        !           368:  T(A(1, 0, 0), "addu.co r1, r0, r0",           "{addu.co r1, r0, r0}"),
        !           369:  T(A(1, 0, 1), "addu.co r1, r0, r1",           "{addu.co r1, r0, r1}"),
        !           370:  T(A(1, 0, 2), "addu.co r1, r0, r2",           "{addu.co r1, r0, r2}"),
        !           371:  T(A(1, 1, 0), "addu.co r1, r1, r0",           "{addu.co r1, r0}"),
        !           372:  T(A(1, 1, 1), "addu.co r1, r1, r1",           "{addu.co r1, r1}"),
        !           373:  T(A(1, 1, 2), "addu.co r1, r1, r2",           "{addu.co r1, r2}"),
        !           374:  T(A(1, 2, 0), "addu.co r1, r2, r0",           "{addu.co r1, r2, r0}"),
        !           375:  T(A(1, 2, 1), "addu.co r1, r2, r1",           "{addu.co r1, r2, r1}"),
        !           376:  T(A(1, 2, 2), "addu.co r1, r2, r2",           "{addu.co r1, r2, r2}"),
        !           377:  T(A(1, 2, 3), "addu.co r1, r2, r3",           "{addu.co r1, r2, r3}"),
        !           378: #undef A
        !           379:  T(0xf6326201, "addu.ci r17,r18,r1",           "{addu.ci r17,r18,r1}"),
        !           380:  T(0xf6326301, "addu.cio r17,r18,r1",          "{addu.cio r17,r18,r1}"),
        !           381: 
        !           382: #define A(d, s1, s2)   M(0xf400'6400, d, s1, s2)
        !           383:  T(A(0, 0, 0), "subu    r0, r0, r0",           "{nop}"),
        !           384:  T(A(0, 0, 1), "subu    r0, r0, r1",           "{nop}"),
        !           385:  T(A(0, 1, 0), "subu    r0, r1, r0",           "{nop}"),
        !           386:  T(A(0, 1, 1), "subu    r0, r1, r1",           "{nop}"),
        !           387:  T(A(0, 1, 2), "subu    r0, r1, r2",           "{nop}"),
        !           388:  T(A(0, 2, 1), "subu    r0, r2, r1",           "{nop}"),
        !           389:  T(A(1, 0, 0), "subu    r1, r0, r0",           "{clr    r1}"),
        !           390:  T(A(1, 0, 1), "subu    r1, r0, r1",           "{subu   r1, r0, r1}"),
        !           391:  T(A(1, 0, 2), "subu    r1, r0, r2",           "{subu   r1, r0, r2}"),
        !           392:  T(A(1, 1, 0), "subu    r1, r1, r0",           "{nop}"),
        !           393:  T(A(1, 1, 1), "subu    r1, r1, r1",           "{clr    r1}"),
        !           394:  T(A(1, 1, 2), "subu    r1, r1, r2",           "{subu   r1, r2}"),
        !           395:  T(A(1, 2, 0), "subu    r1, r2, r0",           "{mov    r1, r2}"),
        !           396:  T(A(1, 2, 1), "subu    r1, r2, r1",           "{subu   r1, r2, r1}"),
        !           397:  T(A(1, 2, 2), "subu    r1, r2, r2",           "{clr    r1}"),
        !           398:  T(A(1, 2, 3), "subu    r1, r2, r3",           "{subu   r1, r2, r3}"),
        !           399: #undef A
        !           400: 
        !           401:  // Carry In/Out を含むやつは 2オペランドへの省略のみ (.coだけ代表でテスト)
        !           402: #define A(d, s1, s2)   M(0xf400'6500, d, s1, s2)
        !           403:  T(A(0, 0, 0), "subu.co r0, r0, r0",           "{subu.co r0, r0}"),
        !           404:  T(A(0, 0, 1), "subu.co r0, r0, r1",           "{subu.co r0, r1}"),
        !           405:  T(A(0, 1, 0), "subu.co r0, r1, r0",           "{subu.co r0, r1, r0}"),
        !           406:  T(A(0, 1, 1), "subu.co r0, r1, r1",           "{subu.co r0, r1, r1}"),
        !           407:  T(A(0, 1, 2), "subu.co r0, r1, r2",           "{subu.co r0, r1, r2}"),
        !           408:  T(A(0, 2, 1), "subu.co r0, r2, r1",           "{subu.co r0, r2, r1}"),
        !           409:  T(A(1, 0, 0), "subu.co r1, r0, r0",           "{subu.co r1, r0, r0}"),
        !           410:  T(A(1, 0, 1), "subu.co r1, r0, r1",           "{subu.co r1, r0, r1}"),
        !           411:  T(A(1, 0, 2), "subu.co r1, r0, r2",           "{subu.co r1, r0, r2}"),
        !           412:  T(A(1, 1, 0), "subu.co r1, r1, r0",           "{subu.co r1, r0}"),
        !           413:  T(A(1, 1, 1), "subu.co r1, r1, r1",           "{subu.co r1, r1}"),
        !           414:  T(A(1, 1, 2), "subu.co r1, r1, r2",           "{subu.co r1, r2}"),
        !           415:  T(A(1, 2, 0), "subu.co r1, r2, r0",           "{subu.co r1, r2, r0}"),
        !           416:  T(A(1, 2, 1), "subu.co r1, r2, r1",           "{subu.co r1, r2, r1}"),
        !           417:  T(A(1, 2, 2), "subu.co r1, r2, r2",           "{subu.co r1, r2, r2}"),
        !           418:  T(A(1, 2, 3), "subu.co r1, r2, r3",           "{subu.co r1, r2, r3}"),
        !           419: #undef A
        !           420:  T(0xf6326601, "subu.ci r17,r18,r1",           "{subu.ci r17,r18,r1}"),
        !           421:  T(0xf6326701, "subu.cio r17,r18,r1",          "{subu.cio r17,r18,r1}"),
        !           422: 
        !           423: #define A(d, s1, s2)   M(0xf400'6800, d, s1, s2)
        !           424:  T(A(0, 0, 0), "divu    r0, r0, r0",           "{divu   r0, r0}"),
        !           425:  T(A(0, 0, 1), "divu    r0, r0, r1",           "{divu   r0, r1}"),
        !           426:  T(A(0, 1, 0), "divu    r0, r1, r0",           "{divu   r0, r1, r0}"),
        !           427:  T(A(0, 1, 1), "divu    r0, r1, r1",           "{divu   r0, r1, r1}"),
        !           428:  T(A(0, 1, 2), "divu    r0, r1, r2",           "{divu   r0, r1, r2}"),
        !           429:  T(A(0, 2, 1), "divu    r0, r2, r1",           "{divu   r0, r2, r1}"),
        !           430:  T(A(1, 0, 0), "divu    r1, r0, r0",           "{divu   r1, r0, r0}"),
        !           431:  T(A(1, 0, 1), "divu    r1, r0, r1",           "{divu   r1, r0, r1}"),
        !           432:  T(A(1, 0, 2), "divu    r1, r0, r2",           "{divu   r1, r0, r2}"),
        !           433:  T(A(1, 1, 0), "divu    r1, r1, r0",           "{divu   r1, r0}"),
        !           434:  T(A(1, 1, 1), "divu    r1, r1, r1",           "{divu   r1, r1}"),
        !           435:  T(A(1, 1, 2), "divu    r1, r1, r2",           "{divu   r1, r2}"),
        !           436:  T(A(1, 2, 0), "divu    r1, r2, r0",           "{divu   r1, r2, r0}"),
        !           437:  T(A(1, 2, 1), "divu    r1, r2, r1",           "{divu   r1, r2, r1}"),
        !           438:  T(A(1, 2, 2), "divu    r1, r2, r2",           "{divu   r1, r2, r2}"),
        !           439:  T(A(1, 2, 3), "divu    r1, r2, r3",           "{divu   r1, r2, r3}"),
        !           440: #undef A
        !           441: 
        !           442: #define A(d, s1, s2)   M(0xf400'6c00, d, s1, s2)
        !           443:  T(A(0, 0, 0), "mul     r0, r0, r0",           "{mul    r0, r0}"),
        !           444:  T(A(0, 0, 1), "mul     r0, r0, r1",           "{mul    r0, r1}"),
        !           445:  T(A(0, 1, 0), "mul     r0, r1, r0",           "{mul    r0, r1, r0}"),
        !           446:  T(A(0, 1, 1), "mul     r0, r1, r1",           "{mul    r0, r1, r1}"),
        !           447:  T(A(0, 1, 2), "mul     r0, r1, r2",           "{mul    r0, r1, r2}"),
        !           448:  T(A(0, 2, 1), "mul     r0, r2, r1",           "{mul    r0, r2, r1}"),
        !           449:  T(A(1, 0, 0), "mul     r1, r0, r0",           "{mul    r1, r0, r0}"),
        !           450:  T(A(1, 0, 1), "mul     r1, r0, r1",           "{mul    r1, r0, r1}"),
        !           451:  T(A(1, 0, 2), "mul     r1, r0, r2",           "{mul    r1, r0, r2}"),
        !           452:  T(A(1, 1, 0), "mul     r1, r1, r0",           "{mul    r1, r0}"),
        !           453:  T(A(1, 1, 1), "mul     r1, r1, r1",           "{mul    r1, r1}"),
        !           454:  T(A(1, 1, 2), "mul     r1, r1, r2",           "{mul    r1, r2}"),
        !           455:  T(A(1, 2, 0), "mul     r1, r2, r0",           "{mul    r1, r2, r0}"),
        !           456:  T(A(1, 2, 1), "mul     r1, r2, r1",           "{mul    r1, r2, r1}"),
        !           457:  T(A(1, 2, 2), "mul     r1, r2, r2",           "{mul    r1, r2, r2}"),
        !           458:  T(A(1, 2, 3), "mul     r1, r2, r3",           "{mul    r1, r2, r3}"),
        !           459: #undef A
        !           460: 
        !           461: #define A(d, s1, s2)   M(0xf400'7000, d, s1, s2)
        !           462:  T(A(0, 0, 0), "add     r0, r0, r0",           "{nop}"),
        !           463:  T(A(0, 0, 1), "add     r0, r0, r1",           "{nop}"),
        !           464:  T(A(0, 1, 0), "add     r0, r1, r0",           "{nop}"),
        !           465:  T(A(0, 1, 1), "add     r0, r1, r1",           "{adds   r0, r1, r1}"),
        !           466:  T(A(0, 1, 2), "add     r0, r1, r2",           "{adds   r0, r1, r2}"),
        !           467:  T(A(0, 2, 1), "add     r0, r2, r1",           "{adds   r0, r2, r1}"),
        !           468:  T(A(1, 0, 0), "add     r1, r0, r0",           "{clr    r1}"),
        !           469:  T(A(1, 0, 1), "add     r1, r0, r1",           "{nop}"),
        !           470:  T(A(1, 0, 2), "add     r1, r0, r2",           "{mov    r1, r2}"),
        !           471:  T(A(1, 1, 0), "add     r1, r1, r0",           "{nop}"),
        !           472:  T(A(1, 1, 1), "add     r1, r1, r1",           "{adds   r1, r1}"),
        !           473:  T(A(1, 1, 2), "add     r1, r1, r2",           "{adds   r1, r2}"),
        !           474:  T(A(1, 2, 0), "add     r1, r2, r0",           "{mov    r1, r2}"),
        !           475:  T(A(1, 2, 1), "add     r1, r2, r1",           "{adds   r1, r2, r1}"),
        !           476:  T(A(1, 2, 2), "add     r1, r2, r2",           "{adds   r1, r2, r2}"),
        !           477:  T(A(1, 2, 3), "add     r1, r2, r3",           "{adds   r1, r2, r3}"),
        !           478: #undef A
        !           479: 
        !           480:  // Carry In/Out を含むやつは 2オペランドへの省略のみ (.coだけ代表でテスト)
        !           481: #define A(d, s1, s2)   M(0xf400'7100, d, s1, s2)
        !           482:  T(A(0, 0, 0), "add.co  r0, r0, r0",           "{adds.co r0, r0}"),
        !           483:  T(A(0, 0, 1), "add.co  r0, r0, r1",           "{adds.co r0, r1}"),
        !           484:  T(A(0, 1, 0), "add.co  r0, r1, r0",           "{adds.co r0, r1, r0}"),
        !           485:  T(A(0, 1, 1), "add.co  r0, r1, r1",           "{adds.co r0, r1, r1}"),
        !           486:  T(A(0, 1, 2), "add.co  r0, r1, r2",           "{adds.co r0, r1, r2}"),
        !           487:  T(A(0, 2, 1), "add.co  r0, r2, r1",           "{adds.co r0, r2, r1}"),
        !           488:  T(A(1, 0, 0), "add.co  r1, r0, r0",           "{adds.co r1, r0, r0}"),
        !           489:  T(A(1, 0, 1), "add.co  r1, r0, r1",           "{adds.co r1, r0, r1}"),
        !           490:  T(A(1, 0, 2), "add.co  r1, r0, r2",           "{adds.co r1, r0, r2}"),
        !           491:  T(A(1, 1, 0), "add.co  r1, r1, r0",           "{adds.co r1, r0}"),
        !           492:  T(A(1, 1, 1), "add.co  r1, r1, r1",           "{adds.co r1, r1}"),
        !           493:  T(A(1, 1, 2), "add.co  r1, r1, r2",           "{adds.co r1, r2}"),
        !           494:  T(A(1, 2, 0), "add.co  r1, r2, r0",           "{adds.co r1, r2, r0}"),
        !           495:  T(A(1, 2, 1), "add.co  r1, r2, r1",           "{adds.co r1, r2, r1}"),
        !           496:  T(A(1, 2, 2), "add.co  r1, r2, r2",           "{adds.co r1, r2, r2}"),
        !           497:  T(A(1, 2, 3), "add.co  r1, r2, r3",           "{adds.co r1, r2, r3}"),
        !           498: #undef A
        !           499:  T(0xf6327201, "add.ci  r17,r18,r1",           "{adds.ci r17,r18,r1}"),
        !           500:  T(0xf6327301, "add.cio r17,r18,r1",           "{adds.cio r17,r18,r1}"),
        !           501: 
        !           502: #define A(d, s1, s2)   M(0xf400'7400, d, s1, s2)
        !           503:  T(A(0, 0, 0), "sub     r0, r0, r0",           "{nop}"),
        !           504:  T(A(0, 0, 1), "sub     r0, r0, r1",           "{subs   r0, r1}"),
        !           505:  T(A(0, 1, 0), "sub     r0, r1, r0",           "{nop}"),
        !           506:  T(A(0, 1, 1), "sub     r0, r1, r1",           "{subs   r0, r1, r1}"),
        !           507:  T(A(0, 1, 2), "sub     r0, r1, r2",           "{subs   r0, r1, r2}"),
        !           508:  T(A(0, 2, 1), "sub     r0, r2, r1",           "{subs   r0, r2, r1}"),
        !           509:  T(A(1, 0, 0), "sub     r1, r0, r0",           "{clr    r1}"),
        !           510:  T(A(1, 0, 1), "sub     r1, r0, r1",           "{subs   r1, r0, r1}"),
        !           511:  T(A(1, 0, 2), "sub     r1, r0, r2",           "{subs   r1, r0, r2}"),
        !           512:  T(A(1, 1, 0), "sub     r1, r1, r0",           "{nop}"),
        !           513:  T(A(1, 1, 1), "sub     r1, r1, r1",           "{subs   r1, r1}"),
        !           514:  T(A(1, 1, 2), "sub     r1, r1, r2",           "{subs   r1, r2}"),
        !           515:  T(A(1, 2, 0), "sub     r1, r2, r0",           "{mov    r1, r2}"),
        !           516:  T(A(1, 2, 1), "sub     r1, r2, r1",           "{subs   r1, r2, r1}"),
        !           517:  T(A(1, 2, 2), "sub     r1, r2, r2",           "{subs   r1, r2, r2}"),
        !           518:  T(A(1, 2, 3), "sub     r1, r2, r3",           "{subs   r1, r2, r3}"),
        !           519: #undef A
        !           520: 
        !           521:  // Carry In/Out を含むやつは 2オペランドへの省略のみ (.coだけ代表でテスト)
        !           522: #define A(d, s1, s2)   M(0xf400'7500, d, s1, s2)
        !           523:  T(A(0, 0, 0), "sub.co  r0, r0, r0",           "{subs.co r0, r0}"),
        !           524:  T(A(0, 0, 1), "sub.co  r0, r0, r1",           "{subs.co r0, r1}"),
        !           525:  T(A(0, 1, 0), "sub.co  r0, r1, r0",           "{subs.co r0, r1, r0}"),
        !           526:  T(A(0, 1, 1), "sub.co  r0, r1, r1",           "{subs.co r0, r1, r1}"),
        !           527:  T(A(0, 1, 2), "sub.co  r0, r1, r2",           "{subs.co r0, r1, r2}"),
        !           528:  T(A(0, 2, 1), "sub.co  r0, r2, r1",           "{subs.co r0, r2, r1}"),
        !           529:  T(A(1, 0, 0), "sub.co  r1, r0, r0",           "{subs.co r1, r0, r0}"),
        !           530:  T(A(1, 0, 1), "sub.co  r1, r0, r1",           "{subs.co r1, r0, r1}"),
        !           531:  T(A(1, 0, 2), "sub.co  r1, r0, r2",           "{subs.co r1, r0, r2}"),
        !           532:  T(A(1, 1, 0), "sub.co  r1, r1, r0",           "{subs.co r1, r0}"),
        !           533:  T(A(1, 1, 1), "sub.co  r1, r1, r1",           "{subs.co r1, r1}"),
        !           534:  T(A(1, 1, 2), "sub.co  r1, r1, r2",           "{subs.co r1, r2}"),
        !           535:  T(A(1, 2, 0), "sub.co  r1, r2, r0",           "{subs.co r1, r2, r0}"),
        !           536:  T(A(1, 2, 1), "sub.co  r1, r2, r1",           "{subs.co r1, r2, r1}"),
        !           537:  T(A(1, 2, 2), "sub.co  r1, r2, r2",           "{subs.co r1, r2, r2}"),
        !           538:  T(A(1, 2, 3), "sub.co  r1, r2, r3",           "{subs.co r1, r2, r3}"),
        !           539: #undef A
        !           540:  T(0xf6327601, "sub.ci  r17,r18,r1",           "{subs.ci r17,r18,r1}"),
        !           541:  T(0xf6327701, "sub.cio r17,r18,r1",           "{subs.cio r17,r18,r1}"),
        !           542: 
        !           543: #define A(d, s1, s2)   M(0xf400'7800, d, s1, s2)
        !           544:  T(A(0, 0, 0), "div     r0, r0, r0",           "{div    r0, r0}"),
        !           545:  T(A(0, 0, 1), "div     r0, r0, r1",           "{div    r0, r1}"),
        !           546:  T(A(0, 1, 0), "div     r0, r1, r0",           "{div    r0, r1, r0}"),
        !           547:  T(A(0, 1, 1), "div     r0, r1, r1",           "{div    r0, r1, r1}"),
        !           548:  T(A(0, 1, 2), "div     r0, r1, r2",           "{div    r0, r1, r2}"),
        !           549:  T(A(0, 2, 1), "div     r0, r2, r1",           "{div    r0, r2, r1}"),
        !           550:  T(A(1, 0, 0), "div     r1, r0, r0",           "{div    r1, r0, r0}"),
        !           551:  T(A(1, 0, 1), "div     r1, r0, r1",           "{div    r1, r0, r1}"),
        !           552:  T(A(1, 0, 2), "div     r1, r0, r2",           "{div    r1, r0, r2}"),
        !           553:  T(A(1, 1, 0), "div     r1, r1, r0",           "{div    r1, r0}"),
        !           554:  T(A(1, 1, 1), "div     r1, r1, r1",           "{div    r1, r1}"),
        !           555:  T(A(1, 1, 2), "div     r1, r1, r2",           "{div    r1, r2}"),
        !           556:  T(A(1, 2, 0), "div     r1, r2, r0",           "{div    r1, r2, r0}"),
        !           557:  T(A(1, 2, 1), "div     r1, r2, r1",           "{div    r1, r2, r1}"),
        !           558:  T(A(1, 2, 2), "div     r1, r2, r2",           "{div    r1, r2, r2}"),
        !           559:  T(A(1, 2, 3), "div     r1, r2, r3",           "{div    r1, r2, r3}"),
        !           560: #undef A
        !           561: 
        !           562: #define A(d, s1, s2)   M(0xf400'7c00, d, s1, s2)
        !           563:  T(A(0, 0, 0), "cmp     r0, r0, r0",           "{nop}"),
        !           564:  T(A(0, 0, 1), "cmp     r0, r0, r1",           "{nop}"),
        !           565:  T(A(0, 1, 0), "cmp     r0, r1, r0",           "{nop}"),
        !           566:  T(A(0, 1, 1), "cmp     r0, r1, r1",           "{nop}"),
        !           567:  T(A(0, 1, 2), "cmp     r0, r1, r2",           "{nop}"),
        !           568:  T(A(0, 2, 1), "cmp     r0, r2, r1",           "{nop}"),
        !           569:  O(A(1, 0, 0), "cmp     r1, r0, r0"),
        !           570:  O(A(1, 0, 1), "cmp     r1, r0, r1"),
        !           571:  O(A(1, 0, 2), "cmp     r1, r0, r2"),
        !           572:  O(A(1, 1, 0), "cmp     r1, r1, r0"),
        !           573:  O(A(1, 1, 1), "cmp     r1, r1, r1"),
        !           574:  O(A(1, 1, 2), "cmp     r1, r1, r2"),
        !           575:  O(A(1, 2, 0), "cmp     r1, r2, r0"),
        !           576:  O(A(1, 2, 1), "cmp     r1, r2, r1"),
        !           577:  O(A(1, 2, 2), "cmp     r1, r2, r2"),
        !           578:  O(A(1, 2, 3), "cmp     r1, r2, r3"),
        !           579: #undef A
        !           580: 
        !           581: #define A(d, s1, s2)   M(0xf400'8000, d, s1, s2)
        !           582:  T(A(0, 0, 0), "clr     r0, r0, r0",           "{nop}"),
        !           583:  T(A(0, 0, 1), "clr     r0, r0, r1",           "{nop}"),
        !           584:  T(A(0, 1, 0), "clr     r0, r1, r0",           "{nop}"),
        !           585:  T(A(0, 1, 1), "clr     r0, r1, r1",           "{nop}"),
        !           586:  T(A(0, 1, 2), "clr     r0, r1, r2",           "{nop}"),
        !           587:  T(A(0, 2, 1), "clr     r0, r2, r1",           "{nop}"),
        !           588:  T(A(1, 0, 0), "clr     r1, r0, r0",           "{clr    r1}"),
        !           589:  T(A(1, 0, 1), "clr     r1, r0, r1",           "{clr    r1}"),
        !           590:  T(A(1, 0, 2), "clr     r1, r0, r2",           "{clr    r1}"),
        !           591:  T(A(1, 1, 0), "clr     r1, r1, r0",           "{nop}"),
        !           592:  T(A(1, 1, 1), "clr     r1, r1, r1",           "{bfclr  r1, r1}"),
        !           593:  T(A(1, 1, 2), "clr     r1, r1, r2",           "{bfclr  r1, r2}"),
        !           594:  T(A(1, 2, 0), "clr     r1, r2, r0",           "{mov    r1, r2}"),
        !           595:  T(A(1, 2, 1), "clr     r1, r2, r1",           "{bfclr  r1, r2, r1}"),
        !           596:  T(A(1, 2, 2), "clr     r1, r2, r2",           "{bfclr  r1, r2, r2}"),
        !           597:  T(A(1, 2, 3), "clr     r1, r2, r3",           "{bfclr  r1, r2, r3}"),
        !           598: #undef A
        !           599: 
        !           600: #define A(d, s1, s2)   M(0xf400'8800, d, s1, s2)
        !           601:  T(A(0, 0, 0), "set     r0, r0, r0",           "{nop}"),
        !           602:  T(A(0, 0, 1), "set     r0, r0, r1",           "{nop}"),
        !           603:  T(A(0, 1, 0), "set     r0, r1, r0",           "{nop}"),
        !           604:  T(A(0, 1, 1), "set     r0, r1, r1",           "{nop}"),
        !           605:  T(A(0, 1, 2), "set     r0, r1, r2",           "{nop}"),
        !           606:  T(A(0, 2, 1), "set     r0, r2, r1",           "{nop}"),
        !           607:  T(A(1, 0, 0), "set     r1, r0, r0",           "{mov    r1, #0xffffffff}"),
        !           608:  T(A(1, 0, 1), "set     r1, r0, r1",           "{bfset  r1, r0, r1}"),
        !           609:  T(A(1, 0, 2), "set     r1, r0, r2",           "{bfset  r1, r0, r2}"),
        !           610:  T(A(1, 1, 0), "set     r1, r1, r0",           "{mov    r1, #0xffffffff}"),
        !           611:  T(A(1, 1, 1), "set     r1, r1, r1",           "{bfset  r1, r1}"),
        !           612:  T(A(1, 1, 2), "set     r1, r1, r2",           "{bfset  r1, r2}"),
        !           613:  T(A(1, 2, 0), "set     r1, r2, r0",           "{mov    r1, #0xffffffff}"),
        !           614:  T(A(1, 2, 1), "set     r1, r2, r1",           "{bfset  r1, r2, r1}"),
        !           615:  T(A(1, 2, 2), "set     r1, r2, r2",           "{bfset  r1, r2, r2}"),
        !           616:  T(A(1, 2, 3), "set     r1, r2, r3",           "{bfset  r1, r2, r3}"),
        !           617: #undef A
        !           618: 
        !           619: #define A(d, s1, s2)   M(0xf400'9000, d, s1, s2)
        !           620:  T(A(0, 0, 0), "ext     r0, r0, r0",           "{nop}"),
        !           621:  T(A(0, 0, 1), "ext     r0, r0, r1",           "{nop}"),
        !           622:  T(A(0, 1, 0), "ext     r0, r1, r0",           "{nop}"),
        !           623:  T(A(0, 1, 1), "ext     r0, r1, r1",           "{nop}"),
        !           624:  T(A(0, 1, 2), "ext     r0, r1, r2",           "{nop}"),
        !           625:  T(A(0, 2, 1), "ext     r0, r2, r1",           "{nop}"),
        !           626:  T(A(1, 0, 0), "ext     r1, r0, r0",           "{mov    r1, r0}"),
        !           627:  T(A(1, 0, 1), "ext     r1, r0, r1",           "{bfexts r1, r0, r1}"),
        !           628:  T(A(1, 0, 2), "ext     r1, r0, r2",           "{bfexts r1, r0, r2}"),
        !           629:  T(A(1, 1, 0), "ext     r1, r1, r0",           "{nop}"),
        !           630:  T(A(1, 1, 1), "ext     r1, r1, r1",           "{bfexts r1, r1}"),
        !           631:  T(A(1, 1, 2), "ext     r1, r1, r2",           "{bfexts r1, r2}"),
        !           632:  T(A(1, 2, 0), "ext     r1, r2, r0",           "{mov    r1, r2}"),
        !           633:  T(A(1, 2, 1), "ext     r1, r2, r1",           "{bfexts r1, r2, r1}"),
        !           634:  T(A(1, 2, 2), "ext     r1, r2, r2",           "{bfexts r1, r2, r2}"),
        !           635:  T(A(1, 2, 3), "ext     r1, r2, r3",           "{bfexts r1, r2, r3}"),
        !           636: #undef A
        !           637: 
        !           638: #define A(d, s1, s2)   M(0xf400'9800, d, s1, s2)
        !           639:  T(A(0, 0, 0), "extu    r0, r0, r0",           "{nop}"),
        !           640:  T(A(0, 0, 1), "extu    r0, r0, r1",           "{nop}"),
        !           641:  T(A(0, 1, 0), "extu    r0, r1, r0",           "{nop}"),
        !           642:  T(A(0, 1, 1), "extu    r0, r1, r1",           "{nop}"),
        !           643:  T(A(0, 1, 2), "extu    r0, r1, r2",           "{nop}"),
        !           644:  T(A(0, 2, 1), "extu    r0, r2, r1",           "{nop}"),
        !           645:  T(A(1, 0, 0), "extu    r1, r0, r0",           "{mov    r1, r0}"),
        !           646:  T(A(1, 0, 1), "extu    r1, r0, r1",           "{bfextu r1, r0, r1}"),
        !           647:  T(A(1, 0, 2), "extu    r1, r0, r2",           "{bfextu r1, r0, r2}"),
        !           648:  T(A(1, 1, 0), "extu    r1, r1, r0",           "{nop}"),
        !           649:  T(A(1, 1, 1), "extu    r1, r1, r1",           "{bfextu r1, r1}"),
        !           650:  T(A(1, 1, 2), "extu    r1, r1, r2",           "{bfextu r1, r2}"),
        !           651:  T(A(1, 2, 0), "extu    r1, r2, r0",           "{mov    r1, r2}"),
        !           652:  T(A(1, 2, 1), "extu    r1, r2, r1",           "{bfextu r1, r2, r1}"),
        !           653:  T(A(1, 2, 2), "extu    r1, r2, r2",           "{bfextu r1, r2, r2}"),
        !           654:  T(A(1, 2, 3), "extu    r1, r2, r3",           "{bfextu r1, r2, r3}"),
        !           655: #undef A
        !           656: 
        !           657: #define A(d, s1, s2)   M(0xf400'a000, d, s1, s2)
        !           658:  T(A(0, 0, 0), "mak     r0, r0, r0",           "{nop}"),
        !           659:  T(A(0, 0, 1), "mak     r0, r0, r1",           "{nop}"),
        !           660:  T(A(0, 1, 0), "mak     r0, r1, r0",           "{nop}"),
        !           661:  T(A(0, 1, 1), "mak     r0, r1, r1",           "{nop}"),
        !           662:  T(A(0, 1, 2), "mak     r0, r1, r2",           "{nop}"),
        !           663:  T(A(0, 2, 1), "mak     r0, r2, r1",           "{nop}"),
        !           664:  T(A(1, 0, 0), "mak     r1, r0, r0",           "{clr    r1}"),
        !           665:  T(A(1, 0, 1), "mak     r1, r0, r1",           "{clr    r1}"),
        !           666:  T(A(1, 0, 2), "mak     r1, r0, r2",           "{clr    r1}"),
        !           667:  T(A(1, 1, 0), "mak     r1, r1, r0",           "{nop}"),
        !           668:  T(A(1, 1, 1), "mak     r1, r1, r1",           "{bfmak  r1, r1}"),
        !           669:  T(A(1, 1, 2), "mak     r1, r1, r2",           "{bfmak  r1, r2}"),
        !           670:  T(A(1, 2, 0), "mak     r1, r2, r0",           "{mov    r1, r2}"),
        !           671:  T(A(1, 2, 1), "mak     r1, r2, r1",           "{bfmak  r1, r2, r1}"),
        !           672:  T(A(1, 2, 2), "mak     r1, r2, r2",           "{bfmak  r1, r2, r2}"),
        !           673:  T(A(1, 2, 3), "mak     r1, r2, r3",           "{bfmak  r1, r2, r3}"),
        !           674: #undef A
        !           675: 
        !           676: #define A(d, s1, s2)   M(0xf400'a800, d, s1, s2)
        !           677:  T(A(0, 0, 0), "rot     r0, r0, r0",           "{nop}"),
        !           678:  T(A(0, 0, 1), "rot     r0, r0, r1",           "{nop}"),
        !           679:  T(A(0, 1, 0), "rot     r0, r1, r0",           "{nop}"),
        !           680:  T(A(0, 1, 1), "rot     r0, r1, r1",           "{nop}"),
        !           681:  T(A(0, 1, 2), "rot     r0, r1, r2",           "{nop}"),
        !           682:  T(A(0, 2, 1), "rot     r0, r2, r1",           "{nop}"),
        !           683:  T(A(1, 0, 0), "rot     r1, r0, r0",           "{clr    r1}"),
        !           684:  T(A(1, 0, 1), "rot     r1, r0, r1",           "{clr    r1}"),
        !           685:  T(A(1, 0, 2), "rot     r1, r0, r2",           "{clr    r1}"),
        !           686:  T(A(1, 1, 0), "rot     r1, r1, r0",           "{nop}"),
        !           687:  T(A(1, 1, 1), "rot     r1, r1, r1",           "{ror    r1, r1}"),
        !           688:  T(A(1, 1, 2), "rot     r1, r1, r2",           "{ror    r1, r2}"),
        !           689:  T(A(1, 2, 0), "rot     r1, r2, r0",           "{mov    r1, r2}"),
        !           690:  T(A(1, 2, 1), "rot     r1, r2, r1",           "{ror    r1, r2, r1}"),
        !           691:  T(A(1, 2, 2), "rot     r1, r2, r2",           "{ror    r1, r2, r2}"),
        !           692:  T(A(1, 2, 3), "rot     r1, r2, r3",           "{ror    r1, r2, r3}"),
        !           693: #undef A
        !           694: 
        !           695:  O(0xf400c011, "jmp     r17"),
        !           696:  O(0xf400c411, "jmp.n   r17"),
        !           697:  O(0xf400c811, "jsr     r17"),
        !           698:  O(0xf400cc11, "jsr.n   r17"),
        !           699: 
        !           700: #define A(d, s2)               M(0xf400'e800, d, 0, s2)
        !           701:  T(A(0, 0),    "ff1     r0, r0",                       "{nop}"),
        !           702:  T(A(0, 1),    "ff1     r0, r1",                       "{nop}"),
        !           703:  T(A(1, 0),    "ff1     r1, r0",                       "{mov    r1, #32}"),
        !           704:  T(A(1, 1),    "ff1     r1, r1",                       "{ff1    r1, r1}"),
        !           705:  T(A(1, 2),    "ff1     r1, r2",                       "{ff1    r1, r2}"),
        !           706: #undef A
        !           707: #define A(d, s2)               M(0xf400'ec00, d, 0, s2)
        !           708:  T(A(0, 0),    "ff0     r0, r0",                       "{nop}"),
        !           709:  T(A(0, 1),    "ff0     r0, r1",                       "{nop}"),
        !           710:  T(A(1, 0),    "ff0     r1, r0",                       "{clr    r1}"),
        !           711:  T(A(1, 1),    "ff0     r1, r1",                       "{ff0    r1, r1}"),
        !           712:  T(A(1, 2),    "ff0     r1, r2",                       "{ff0    r1, r2}"),
        !           713: #undef A
        !           714: 
        !           715:  O(0xf400fc00, "rte"),
        !           716:  O(0xf411f801, "tbnd    r17,r1"),
        !           717:  O(0xf8118765, "tbnd    r17,#0x8765"),
1.1       root      718: };
                    719: 
                    720: static uint8 ram[1024];
                    721: static int failed;
                    722: 
                    723: uint64
                    724: vm_phys_peek_8(uint32 addr)
                    725: {
                    726:        assertmsg(addr < sizeof(ram), "addr=0x%x", addr);
                    727: 
                    728:        // XXX endian
                    729:        return ram[addr ^ 1];
                    730: }
                    731: 
                    732: // リンカを通すためのダミー
                    733: Disasm::~Disasm() { }
                    734: DebuggerMD::~DebuggerMD() { }
                    735: 
                    736: int
                    737: main(int ac, char *av[])
                    738: {
                    739:        saddr_t saddr;
                    740: 
1.1.1.2 ! root      741:        gConfig.reset(new Config());
        !           742:        gConfig->Update(std::vector<std::string> { ".m88k-altname=1" });
        !           743: 
1.1       root      744:        // DebuggerMD (の継承クラス)を用意するのは芋づる式に大変なので、
                    745:        // 中でアクセスする変数だけ強引に用意する。
                    746:        DebuggerMD *md = (DebuggerMD *)malloc(sizeof(DebuggerMD));
                    747:        md->inst_bytes = 4;
                    748: 
                    749:        for (int i = 0; i < countof(table); i++) {
1.1.1.2 ! root      750:                int line = table[i].line;
        !           751:                std::string expstd = table[i].expstd;
        !           752:                std::string expalt = table[i].expalt;
1.1       root      753:                uint32 inst = table[i].inst;
                    754: 
                    755:                // エラー表示用
1.1.1.2 ! root      756:                std::string inst_str = string_format("%d: $%08x", line, inst);
1.1       root      757: 
                    758:                // 全体を初期化
                    759:                memset(ram, 0xdd, sizeof(ram));
                    760:                // 100番地に命令列を書き込む
                    761:                *(uint16 *)(ram + 0x100) = inst >> 16;
                    762:                *(uint16 *)(ram + 0x102) = inst & 0xffff;
                    763:                // 検査
                    764:                saddr = 0x100;
                    765:                DebuggerMemoryStream mem(md, saddr, MemoryMode::Physical);
                    766:                m88100disasm dis(mem);
                    767:                dis.Exec();
                    768:                // 照合
1.1.1.2 ! root      769:                if (dis.text != expstd) {
        !           770:                        printf("%s std expects \"%s\" but \"%s\"\n", inst_str.c_str(),
        !           771:                                expstd.c_str(), dis.text.c_str());
1.1       root      772:                        failed++;
                    773:                        continue;
                    774:                }
                    775:                uint32 expected_len = 4;
                    776:                if (dis.bin.size() != expected_len) {
1.1.1.2 ! root      777:                        printf("%s std expects len=$%x but $%x\n", inst_str.c_str(),
1.1       root      778:                                expected_len, (uint)dis.bin.size());
                    779:                        failed++;
                    780:                        continue;
                    781:                }
1.1.1.2 ! root      782: 
        !           783:                // 照合(別名)
        !           784:                if (dis.alttext != expalt) {
        !           785:                        printf("%s alt expects \"%s\" but \"%s\"\n", inst_str.c_str(),
        !           786:                                expalt.c_str(), dis.alttext.c_str());
        !           787:                        failed++;
        !           788:                        continue;
        !           789:                }
1.1       root      790:        }
                    791: 
                    792:        int total = countof(table);
                    793:        printf("%d tests, %d success", total, total - failed);
                    794:        if (failed > 0) {
                    795:                printf(", %d failed", failed);
                    796:        }
                    797:        printf("\n");
                    798:        return 0;
                    799: }

unix.superglobalmegacorp.com

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