You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
339 lines
20 KiB
339 lines
20 KiB
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <unistd.h>
|
|
#include <stdbool.h>
|
|
#include <ctype.h>
|
|
#include <string.h>
|
|
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;
|
|
}
|