--- nono/m88xx0/m88100disasm.cpp 2026/04/29 17:04:49 1.1.1.5 +++ nono/m88xx0/m88100disasm.cpp 2026/04/29 17:04:52 1.1.1.6 @@ -68,7 +68,7 @@ m88100disasm::Exec() if (!arg1.empty()) { if (!args.empty()) { args += ","; - while (args.length() < 4) + while (args.length() % 4 != 0) args += " "; } args += arg1; @@ -76,7 +76,7 @@ m88100disasm::Exec() if (!arg2.empty()) { if (!args.empty()) { args += ","; - while (args.length() < 8) + while (args.length() % 4 != 0) args += " "; } args += arg2; @@ -134,6 +134,12 @@ m88100disasm::d16() return string_format("0x%08x", xip + D16); } +std::string +m88100disasm::d26() +{ + return string_format("0x%08x", xip + D26); +} + // 制御レジスタ名 std::string m88100disasm::crs() @@ -261,148 +267,111 @@ m88100disasm::op_unimpl() name = "unimplemented"; } -// 000000_DDDDDSSSSS_nnnnnn_nnnnnnnnnn -OP_DEF(xmem_bu_imm) +// ld_imm, st_imm, xmem_imm の共通部 +// namebase にはサイズプレフィックスを含む。 +void +m88100disasm::ops_ldst_imm(const std::string& namebase) { - name = "xmem.bu"; + name = namebase; arg0 = rd(); arg1 = rs1(); arg2 = imm16(); } +// 000000_DDDDDSSSSS_nnnnnn_nnnnnnnnnn +OP_DEF(xmem_bu_imm) +{ + ops_ldst_imm("xmem.bu"); +} + // 000001_DDDDDSSSSS_nnnnnn_nnnnnnnnnn OP_DEF(xmem_w_imm) { - name = "xmem"; - arg0 = rd(); - arg1 = rs1(); - arg2 = imm16(); + ops_ldst_imm("xmem"); } // 000010_DDDDDSSSSS_nnnnnn_nnnnnnnnnn OP_DEF(ld_hu_imm) { - name = "ld.hu"; - arg0 = rd(); - arg1 = rs1(); - arg2 = imm16(); + ops_ldst_imm("ld.hu"); } // 000011_DDDDDSSSSS_nnnnnn_nnnnnnnnnn OP_DEF(ld_bu_imm) { - name = "ld.bu"; - arg0 = rd(); - arg1 = rs1(); - arg2 = imm16(); + ops_ldst_imm("ld.bu"); } // 000100_DDDDDSSSSS_nnnnnn_nnnnnnnnnn OP_DEF(ld_d_imm) { - name = "ld.d"; - arg0 = rd(); - arg1 = rs1(); - arg2 = imm16(); + ops_ldst_imm("ld.d"); } // 000101_DDDDDSSSSS_nnnnnn_nnnnnnnnnn OP_DEF(ld_w_imm) { - name = "ld"; - arg0 = rd(); - arg1 = rs1(); - arg2 = imm16(); + ops_ldst_imm("ld"); } // 000110_DDDDDSSSSS_nnnnnn_nnnnnnnnnn OP_DEF(ld_h_imm) { - name = "ld.h"; - arg0 = rd(); - arg1 = rs1(); - arg2 = imm16(); + ops_ldst_imm("ld.h"); } // 000111_DDDDDSSSSS_nnnnnn_nnnnnnnnnn OP_DEF(ld_b_imm) { - name = "ld.b"; - arg0 = rd(); - arg1 = rs1(); - arg2 = imm16(); + ops_ldst_imm("ld.b"); } // 001000_DDDDDSSSSS_nnnnnn_nnnnnnnnnn OP_DEF(st_d_imm) { - name = "st.d"; - arg0 = rd(); - arg1 = rs1(); - arg2 = imm16(); + ops_ldst_imm("st.d"); } // 001001_DDDDDSSSSS_nnnnnn_nnnnnnnnnn OP_DEF(st_w_imm) { - name = "st"; - arg0 = rd(); - arg1 = rs1(); - arg2 = imm16(); + ops_ldst_imm("st"); } // 001010_DDDDDSSSSS_nnnnnn_nnnnnnnnnn OP_DEF(st_h_imm) { - name = "st.h"; - arg0 = rd(); - arg1 = rs1(); - arg2 = imm16(); + ops_ldst_imm("st.h"); } // 001011_DDDDDSSSSS_nnnnnn_nnnnnnnnnn OP_DEF(st_b_imm) { - name = "st.b"; - arg0 = rd(); - arg1 = rs1(); - arg2 = imm16(); + ops_ldst_imm("st.b"); } // 001100_DDDDDSSSSS_nnnnnn_nnnnnnnnnn OP_DEF(lda_d_imm) { - name = "lda.d"; - arg0 = rd(); - arg1 = rs1(); - arg2 = imm16(); + ops_ldst_imm("lda.d"); } // 001101_DDDDDSSSSS_nnnnnn_nnnnnnnnnn OP_DEF(lda_w_imm) { - name = "lda"; - arg0 = rd(); - arg1 = rs1(); - arg2 = imm16(); + ops_ldst_imm("lda"); } // 001110_DDDDDSSSSS_nnnnnn_nnnnnnnnnn OP_DEF(lda_h_imm) { - name = "lda.h"; - arg0 = rd(); - arg1 = rs1(); - arg2 = imm16(); + ops_ldst_imm("lda.h"); } // 001111_DDDDDSSSSS_nnnnnn_nnnnnnnnnn OP_DEF(lda_b_imm) { - name = "lda.b"; - arg0 = rd(); - arg1 = rs1(); - arg2 = imm16(); + ops_ldst_imm("lda.b"); } // 010000_DDDDDSSSSS_nnnnnn_nnnnnnnnnn @@ -708,28 +677,28 @@ OP_DEF(fdiv) OP_DEF(br) { name = "br"; - arg0 = string_format("%08x", xip + D26); + arg0 = d26(); } // 110001_nnnnnnnnnn_nnnnnn_nnnnnnnnnn OP_DEF(br_n) { name = "br.n"; - arg0 = string_format("%08x", xip + D26); + arg0 = d26(); } // 110010_nnnnnnnnnn_nnnnnn_nnnnnnnnnn OP_DEF(bsr) { name = "bsr"; - arg0 = string_format("%08x", xip + D26); + arg0 = d26(); } // 110011_nnnnnnnnnn_nnnnnn_nnnnnnnnnn OP_DEF(bsr_n) { name = "bsr.n"; - arg0 = string_format("%08x", xip + D26); + arg0 = d26(); } // bb の共通部