static void falcon_prep(struct disisa *isa) { isa->vardata = vardata_new("falcon"); int f_fuc0op = vardata_add_feature(isa->vardata, "fuc0op", "v0 exclusive opcodes"); /* XXX rename variants */ int f_fuc3op = vardata_add_feature(isa->vardata, "fuc3op", "v3+ opcodes"); int f_fuc4op = vardata_add_feature(isa->vardata, "fuc4op", "v4+ opcodes"); int f_crypt = vardata_add_feature(isa->vardata, "crypt", "Cryptographic coprocessor"); int f_fuc5op = vardata_add_feature(isa->vardata, "fuc5op", "v5+ opcodes"); int f_fucold = vardata_add_feature(isa->vardata, "fucold", "v0-v4 opcodes"); if (f_fuc0op == -1 || f_fuc3op == -1 || f_fuc4op == -1 || f_crypt == -1 || f_fuc5op == -1 || f_fucold == -1) abort(); int vs_fucver = vardata_add_varset(isa->vardata, "version", "falcon version"); if (vs_fucver == -1) abort(); int v_fuc0 = vardata_add_variant(isa->vardata, "fuc0", "falcon v0", vs_fucver); int v_fuc3 = vardata_add_variant(isa->vardata, "fuc3", "falcon v3", vs_fucver); int v_fuc4 = vardata_add_variant(isa->vardata, "fuc4", "falcon v4", vs_fucver); int v_fuc5 = vardata_add_variant(isa->vardata, "fuc5", "falcon v5", vs_fucver); if (v_fuc0 == -1 || v_fuc3 == -1 || v_fuc4 == -1 || v_fuc5 == -1) abort(); vardata_variant_feature(isa->vardata, v_fuc0, f_fuc0op); vardata_variant_feature(isa->vardata, v_fuc0, f_fucold); vardata_variant_feature(isa->vardata, v_fuc3, f_fuc3op); vardata_variant_feature(isa->vardata, v_fuc3, f_fucold); vardata_variant_feature(isa->vardata, v_fuc4, f_fuc3op); vardata_variant_feature(isa->vardata, v_fuc4, f_fucold); vardata_variant_feature(isa->vardata, v_fuc4, f_fuc4op); vardata_variant_feature(isa->vardata, v_fuc5, f_fuc3op); vardata_variant_feature(isa->vardata, v_fuc5, f_fuc4op); vardata_variant_feature(isa->vardata, v_fuc5, f_fuc5op); if (vardata_validate(isa->vardata)) abort(); }
static void hwsq_prep(struct disisa *isa) { isa->vardata = vardata_new("hwsq"); int f_nv41op = vardata_add_feature(isa->vardata, "nv41op", "NV41+ opcodes"); if (f_nv41op == -1) abort(); int vs_chipset = vardata_add_varset(isa->vardata, "chipset", "GPU chipset"); if (vs_chipset == -1) abort(); int v_nv17 = vardata_add_variant(isa->vardata, "nv17", "NV17:NV41", vs_chipset); int v_nv41 = vardata_add_variant(isa->vardata, "nv41", "NV41+", vs_chipset); if (v_nv17 == -1 || v_nv41 == -1) abort(); vardata_variant_feature(isa->vardata, v_nv41, f_nv41op); if (vardata_validate(isa->vardata)) abort(); }
const struct disisa *ed_getisa(const char *name) { int i; for (i = 0; i < sizeof isas / sizeof *isas; i++) if (!strcmp(name, isas[i].name)) { struct disisa *isa = isas[i].isa; if (!isa->prepdone) { if (isa->prep) isa->prep(isa); if (!isa->vardata) { isa->vardata = vardata_new("empty"); vardata_validate(isa->vardata); } isa->prepdone = 1; } return isa; } return 0; };
static void fuc_prep(struct disisa *isa) { isa->vardata = vardata_new("fuc"); int f_fuc0op = vardata_add_feature(isa->vardata, "fuc0op", "v0 exclusive opcodes"); int f_fuc3op = vardata_add_feature(isa->vardata, "fuc3op", "v3+ opcodes"); int f_pc24 = vardata_add_feature(isa->vardata, "pc24", "24-bit PC opcodes"); int f_crypt = vardata_add_feature(isa->vardata, "crypt", "Cryptographic coprocessor"); if (f_fuc0op == -1 || f_fuc3op == -1 || f_pc24 == -1 || f_crypt == -1) abort(); int vs_fucver = vardata_add_varset(isa->vardata, "fucver", "fµc version"); if (vs_fucver == -1) abort(); int v_fuc0 = vardata_add_variant(isa->vardata, "fuc0", "fµc v0", vs_fucver); int v_fuc3 = vardata_add_variant(isa->vardata, "fuc3", "fµc v3", vs_fucver); int v_fuc4 = vardata_add_variant(isa->vardata, "fuc4", "fµc v4", vs_fucver); if (v_fuc0 == -1 || v_fuc3 == -1 || v_fuc4 == -1) abort(); vardata_variant_feature(isa->vardata, v_fuc0, f_fuc0op); vardata_variant_feature(isa->vardata, v_fuc3, f_fuc3op); vardata_variant_feature(isa->vardata, v_fuc4, f_fuc3op); vardata_variant_feature(isa->vardata, v_fuc4, f_pc24); if (vardata_validate(isa->vardata)) abort(); }