#include #include #include #include #include #include int main(int argc, char *argv[]) { printf( "// this file is autogenerated DO NOT MODIFY\n" "#pragma once\n" ); FILE* fp = fopen(argv[1], "rt"); if (fp) { char line[80]; while (fgets(line, sizeof line, fp) != NULL) { bool with_o = strstr(line, "[o]"), with_d = strstr(line, "[.]"); char* p = strchr(line, '\n'), *name = strchr(line, ','), *mem = line; if (p) *p = '\0'; if (name) { *name++ = '\0'; char *form = strchr(name, ','); if (form) { *form++ = '\0'; char *opc = strchr(form, ','); if (opc) { *opc++ = '\0'; char *sec = strchr(opc, ','); if (sec) { struct b_info { const char *s; int o; int p; } infos[] = { {"",1,0}, {"LT",1,12}, {"LE",2,4}, {"NG",2,4}, {"EQ",3,12}, {"GE",1,4}, {"NL",1,4}, {"GT",2,12}, {"NE",3,4}, {"SO",4,12}, {"UN",4,12}, {"NS",4,4}, {"NU",4,4}, }; #define OP_EXT ((i_opcode << 26) | (i_extopc << 1)) #define OP_EXT_XS ((i_opcode << 26) | (i_extopc << 2)) if (strchr(mem, '[') != NULL) *strchr(mem, '[') = '\0'; if (strchr(mem, '.') != NULL) *strchr(mem, '.') = '_'; *sec++ = '\0'; for (int i = 0; i < strlen(mem); ++i) mem[i] = toupper(mem[i]); int i_opcode = atoi(opc); int i_extopc = atoi(sec); //printf("// %s\n", mem); if (!strcmp(form, "XO")) { if (!strcmp(mem, "EXTSH")) { printf( "void %s(GPR const rt, GPR const ra) {" " emit_%s(0x%08x, rt, ra, R0, false, false); " "}\n" , mem, form, OP_EXT); printf( "void %sC(GPR const rt, GPR const ra) {" " emit_%s(0x%08x, rt, ra, R0, true, false); " "}\n" , mem, form, OP_EXT); printf( "void %s_(GPR const rt, GPR const ra) {" " emit_%s(0x%08x, rt, ra, R0, false, true); " "}\n" , mem, form, OP_EXT); printf( "void %sC_(GPR const rt, GPR const ra) {" " emit_%s(0x%08x, rt, ra, R0, true, true); " "}\n" , mem, form, OP_EXT); } else { printf( "void %s(GPR const rt, GPR const ra, GPR const rb) {" " emit_%s(0x%08x, rt, ra, rb, false, false); " "}\n" , mem, form, OP_EXT); printf( "void %sO(GPR const rt, GPR const ra, GPR const rb) {" " emit_%s(0x%08x, rt, ra, rb, true, false); " "}\n" , mem, form, OP_EXT); printf( "void %s_(GPR const rt, GPR const ra, GPR const rb) {" " emit_%s(0x%08x, rt, ra, rb, false, true); " "}\n" , mem, form, OP_EXT); printf( "void %sO_(GPR const rt, GPR const ra, GPR const rb) {" " emit_%s(0x%08x, rt, ra, rb, true, true); " "}\n" , mem, form, OP_EXT); } } else if (!strcmp(form, "X")) { if (!strcmp(mem, "CMPL") || !strcmp(mem, "CMP")) { printf( "void %s(uint32_t bf, uint32_t l, GPR const ra, GPR const rb) {" " emit_%s(0x%08x, GPR{(bf << 2) | l}, ra, rb, false); " "}\n" , mem, form, OP_EXT); } else if (!strcmp(mem, "CNTLZD") || !strcmp(mem, "CNTLZW") || !strcmp(mem, "EXTSB") || !strcmp(mem, "EXTSH") || !strcmp(mem, "EXTSW")) { printf( "void %s(GPR const rt, GPR const ra) {" " emit_%s(0x%08x, ra, rt, R0, false); " "}\n" , mem, form, OP_EXT); printf( "void %s_(GPR const rt, GPR const ra) {" " emit_%s(0x%08x, ra, rt, R0, true); " "}\n" , mem, form, OP_EXT); } else { printf( "void %s(GPR const rt, GPR const ra, GPR const rb) {" " emit_%s(0x%08x, ra, rt, rb, false); " "}\n" , mem, form, OP_EXT); printf( "void %s_(GPR const rt, GPR const ra, GPR const rb) {" " emit_%s(0x%08x, ra, rt, rb, true); " "}\n" , mem, form, OP_EXT); } } else if (!strcmp(form, "I")) { printf( "void %s(Label const& i) {" " emit_reloc_%s(0x%08x, i, false); " "}\n" , mem, form, i_opcode << 26); printf( "void %sL(Label const& i) {" " emit_reloc_%s(0x%08x, i, true); " "}\n" , mem, form, i_opcode << 26); } else if (!strcmp(form, "B")) { for (int i = 0; i < 12; ++i) { printf( "void %s%s(CPR const cr, Label const& i) {" " emit_reloc_%s(0x%08x, %i, cr.index + %i, i, false); " "}\n" , mem, infos[i].s, form, i_opcode << 26, infos[i].p, infos[i].o - 1); printf( "void %s%sL(CPR const cr, Label const& i) {" " emit_reloc_%s(0x%08x, %i, cr.index + %i, i, true); " "}\n" , mem, infos[i].s, form, i_opcode << 26, infos[i].p, infos[i].o - 1); if (!strcmp(mem, "BC")) mem[1] = '\0'; } } else if (!strcmp(form, "D")) { if (!strcmp(mem, "CMPLI") || !strcmp(mem, "CMPI")) { printf( "void %s(uint32_t bf, uint32_t l, GPR const ra, uint32_t d) {" " emit_%s(0x%08x, GPR{(bf << 2) | l}, ra, d); " "}\n" , mem, form, i_opcode << 26); } else if (!strcmp(mem, "ANDIS_") || !strcmp(mem, "ANDI_") || !strcmp(mem, "ORI") || !strcmp(mem, "ORIS") || !strcmp(mem, "XORI") || !strcmp(mem, "XORIS")) { printf( "void %s(GPR const rt, GPR const ra, uint32_t d) {" " emit_%s(0x%08x, ra, rt, d); " "}\n" , mem, form, i_opcode << 26); } else { printf( "void %s(GPR const rt, GPR const ra, uint32_t d) {" " emit_%s(0x%08x, rt, ra, d); " "}\n" , mem, form, i_opcode << 26); } } else if (!strcmp(form, "SC")) { printf( "void %s(uint32_t lev) {" " emit_%s(0x%08x, lev); " "}\n" , mem, form, i_opcode << 26); } else if (!strcmp(form, "DS")) { printf( "void %s(GPR const rt, GPR const ra, uint32_t d) {" " emit_%s(0x%08x, rt, ra, d); " "}\n" , mem, form, OP_EXT); } else if (!strcmp(form, "XS")) { /* HUGE DIFFERENCE DO NOT REMOVE */ printf( "void %s(GPR const rt, GPR const ra, uint32_t sh) {" " emit_%s(0x%08x, ra, rt, sh, false); " "}\n" , mem, form, OP_EXT_XS); printf( "void %s_(GPR const rt, GPR const ra, uint32_t sh) {" " emit_%s(0x%08x, ra, rt, sh, true); " "}\n" , mem, form, OP_EXT_XS); } else if (!strcmp(form, "XL")) { if (!strcmp(mem, "BCLR")) { printf( "void %s(GPR const bt, CPR const ba, GPR const bb) {" " emit_%s(0x%08x, bt.index, ba.index, bb.index, false); " "}\n" , mem, form, OP_EXT); printf( "void %sL(GPR const bt, CPR const ba, GPR const bb) {" " emit_%s(0x%08x, bt.index, ba.index, bb.index, true); " "}\n" , mem, form, OP_EXT); if (!strcmp(mem, "BCLR")) mem[1] = '\0'; for (int i = 1; i < 12; ++i) { printf( "void %s%sLR(CPR const cr) {" " emit_%s(0x%08x, %i, cr.index + %i, 0, false); " "}\n" , mem, infos[i].s, form, OP_EXT, infos[i].p, infos[i].o - 1); printf( "void %s%sLRL(CPR const cr) {" " emit_%s(0x%08x, %i, cr.index + %i, 0, true); " "}\n" , mem, infos[i].s, form, OP_EXT, infos[i].p, infos[i].o - 1); } } else if (mem[0] == 'B') { printf( "void %s(GPR const bt, CPR const ba, GPR const bb) {" " emit_%s(0x%08x, bt.index, ba.index, bb.index, false); " "}\n" , mem, form, OP_EXT); printf( "void %sL(GPR const bt, CPR const ba, GPR const bb) {" " emit_%s(0x%08x, bt.index, ba.index, bb.index, true); " "}\n" , mem, form, OP_EXT); printf( "void %s(GPR const bt, Cond const ba, GPR const bb) {" " emit_%s(0x%08x, bt.index, cond2offset(ba), bb.index, false); " "}\n" , mem, form, OP_EXT); printf( "void %sL(GPR const bt, Cond const ba, GPR const bb) {" " emit_%s(0x%08x, bt.index, cond2offset(ba), bb.index, true); " "}\n" , mem, form, OP_EXT); } else { printf( "void %s(CPR const bt, CPR const ba, CPR const bb) {" " emit_%s(0x%08x, bt.index, ba.index, bb.index, false); " "}\n" , mem, form, OP_EXT); printf( "void %sL(CPR const bt, CPR const ba, CPR const bb) {" " emit_%s(0x%08x, bt.index, ba.index, bb.index, true); " "}\n" , mem, form, OP_EXT); } } else if (!strcmp(form, "M")) { if (!strcmp(mem, "RLWNM")) { printf( "void %s(GPR const rs, GPR const ra, GPR const rb, uint32_t mb, uint32_t me = 0) {" " emit_%s(0x%08x, ra, rs, rb.index, mb, me, false); " "}\n" , mem, form, OP_EXT); printf( "void %s_(GPR const rs, GPR const ra, GPR const rb, uint32_t mb, uint32_t me = 0) {" " emit_%s(0x%08x, ra, rs, rb.index, mb, me, true); " "}\n" , mem, form, OP_EXT); } else { printf( "void %s(GPR const rs, GPR const ra, uint32_t sh, uint32_t mb, uint32_t me = 0) {" " emit_%s(0x%08x, ra, rs, sh, mb, me, false); " "}\n" , mem, form, OP_EXT); printf( "void %s_(GPR const rs, GPR const ra, uint32_t sh, uint32_t mb, uint32_t me = 0) {" " emit_%s(0x%08x, ra, rs, sh, mb, me, true); " "}\n" , mem, form, OP_EXT); } } else if (!strcmp(form, "MD")) { printf( "void %s(GPR const rs, GPR const ra, uint32_t mb, uint32_t sh) {" " emit_%s(0x%08x, ra, rs, mb, sh, false); " "}\n" , mem, form, (i_opcode << 26) | (i_extopc << 2)); printf( "void %s_(GPR const rs, GPR const ra, uint32_t mb, uint32_t sh) {" " emit_%s(0x%08x, ra, rs, mb, sh, true); " "}\n" , mem, form, (i_opcode << 26) | (i_extopc << 2)); } else if (!strcmp(form, "MDS")) { printf( "void %s(GPR const rs, GPR const ra, GPR const rb, uint32_t mb) {" " emit_%s(0x%08x, ra, rs, rb, mb, false); " "}\n" , mem, form, OP_EXT); printf( "void %s_(GPR const rs, GPR const ra, GPR const rb, uint32_t mb) {" " emit_%s(0x%08x, ra, rs, rb, mb, true); " "}\n" , mem, form, OP_EXT); } else if (!strcmp(form, "A")) { printf( "void %s(FPR const frt, FPR const fra, FPR const frb, FPR const frc) {" " emit_%s(0x%08x, frt, fra, frb, frc, false); " "}\n" , mem, form, OP_EXT); printf( "void %s_(FPR const frt, FPR const fra, FPR const frb, FPR const frc) {" " emit_%s(0x%08x, frt, fra, frb, frc, true); " "}\n" , mem, form, OP_EXT); } else if (!strcmp(form, "XFX")) { printf( "void %s(GPR const rt, uint32_t spr) {" " emit_%s(0x%08x, rt, spr); " "}\n" , mem, form, OP_EXT); } else { printf( "void %s() {" " emit_%s(0x%08x); " "}\n" , mem, form, OP_EXT); } } } } } //printf("%s\n", line); } fclose(fp); return 0; } return 1; }