36 printf(
"X(multi_%cw_%i_%ce)\n{\n",
37 store?
's' :
'l', n, endianness?
'b' :
'l');
39 printf(
"\tuint32_t *page;\n"
40 "\tMODE_uint_t rX = reg(ic[0].arg[1])");
46 printf(
"\tMODE_uint_t addr%i = rX + (int32_t)ic[%i].arg[2];\n",
50 printf(
"\tconst uint32_t mask1 = (1 << DYNTRANS_L1N) - 1;\n");
51 printf(
"\tconst uint32_t mask2 = (1 << DYNTRANS_L2N) - 1;\n");
52 printf(
"\tconst uint32_t mask3 = (1 << DYNTRANS_L3N) - 1;\n");
53 printf(
"\tuint32_t x1, x2, x3;\n");
54 printf(
"\tstruct DYNTRANS_L2_64_TABLE *l2;\n");
55 printf(
"\tstruct DYNTRANS_L3_64_TABLE *l3;\n");
56 printf(
"\tx1 = (addr0 >> (64-DYNTRANS_L1N)) & mask1;\n");
57 printf(
"\tx2 = (addr0 >> (64-DYNTRANS_L1N-DYNTRANS_L2N)) & mask2;\n");
58 printf(
"\tx3 = (addr0 >> (64-DYNTRANS_L1N-DYNTRANS_L2N-DYNTRANS_L3N)) & mask3;\n");
59 printf(
"\tl2 = cpu->cd.DYNTRANS_ARCH.l1_64[x1];\n");
60 printf(
"\tl3 = l2->l3[x2];\n");
61 printf(
"\tpage = (uint32_t *) l3->host_%s[x3];\n",
62 store?
"store" :
"load");
64 printf(
"\tuint32_t index%i = addr%i >> 12;\n", 0, 0);
65 printf(
"\tpage = (uint32_t *) cpu->cd.mips.host_%s[index0];\n",
66 store?
"store" :
"load");
69 printf(
"\tif (cpu->delay_slot ||\n"
72 printf(
" || (addr%i & 3)", i);
75 printf(
" || ((addr%i ^ addr0) & ~0xfff)", i);
85 printf(
"\t\tmips%s_loadstore[%i](cpu, ic);\n", sixtyfourbit ?
"" :
"32", nr);
87 printf(
"\t\treturn;\n\t}\n");
90 printf(
"\taddr%i = (addr%i >> 2) & 0x3ff;\n", i, i);
94 printf(
"\tr%i = reg(ic[%i].arg[0]);\n", i, i);
96 printf(
"\tr%i = %cE32_TO_HOST(r%i);\n", i,
97 endianness?
'B' :
'L', i);
99 printf(
"\tpage[addr%i] = r%i;\n", i, i);
102 printf(
"\tr%i = page[addr%i];\n", i, i);
104 printf(
"\tr%i = %cE32_TO_HOST(r%i);\n", i,
105 endianness?
'B' :
'L', i);
107 printf(
"\treg(ic[%i].arg[0]) = (MODE_int_t)(int32_t)r%i;\n", i, i);
110 printf(
"\tcpu->n_translated_instrs += %i;\n", n - 1);
111 printf(
"\tcpu->cd.mips.next_ic += %i;\n", n - 1);
117 int main(
int argc,
char *argv[])
119 int store, endianness, n;
121 printf(
"\n/* AUTOMATICALLY GENERATED! Do not edit. */\n\n");
123 for (endianness=0; endianness<=1; endianness++)
124 for (store=0; store<=1; store++)
125 for (n=2; n<=5; n++) {
126 printf(
"#ifdef MODE32\n");
130 printf(
"#endif\n\n");