37 printf(
"\tuint32_t tmp, low_pc = ((size_t)ic - (size_t)\n" 38 "\t cpu->cd.arm.cur_ic_page)/sizeof(struct arm_instr_call);\n");
39 printf(
"\ttmp = cpu->pc & ~((ARM_IC_ENTRIES_PER_PAGE-1) <<\n" 40 "\t ARM_INSTR_ALIGNMENT_SHIFT);\n");
41 printf(
"\ttmp += (low_pc << ARM_INSTR_ALIGNMENT_SHIFT) + 8;\n");
45 void f(
int s,
int func,
int only_name)
48 int c = (func >> 7) & 31;
49 int t = (func >> 4) & 7;
51 int pc = rm == 15, rc = c >> 1;
53 snprintf(name,
sizeof(name),
"arm_r%s_r%i_t%i_c%i", s?
"s" :
"",
60 printf(
"uint32_t %s(struct cpu *cpu, struct arm_instr_call *ic)" 69 printf(
"{ uint32_t x = ");
73 printf(
"cpu->cd.arm.r[%i]", rm);
76 printf(
"cpu->cd.arm.flags &= ~ARM_F_C;\n");
77 printf(
"if (x & 0x%x)\n" 78 "\tcpu->cd.arm.flags |= ARM_F_C;\n",
79 (
int)(0x80000000 >> (c-1)));
80 printf(
"x <<= %i;\n", c);
82 printf(
" return x; }\n");
85 printf(
"\treturn tmp");
87 printf(
"\treturn cpu->cd.arm.r[%i]", rm);
96 printf(
"{ uint32_t x = ");
100 printf(
"cpu->cd.arm.r[%i]", rm);
102 printf(
" uint32_t y = cpu->cd.arm.r[%i] & 255;\n", rc);
103 printf(
" if (y != 0) {\n");
104 printf(
" cpu->cd.arm.flags &= ~ARM_F_C;\n");
105 printf(
" if (y >= 32) return 0;\n");
106 printf(
" x <<= (y - 1);\n");
107 printf(
" if (x & 0x80000000)\n" 108 "\tcpu->cd.arm.flags |= ARM_F_C;\n");
109 printf(
" x <<= 1;\n");
111 printf(
" return x; }\n");
113 printf(
"{ uint32_t y = cpu->cd.arm.r[%i] & 255;\n", rc);
114 printf(
" uint32_t x =");
118 printf(
"cpu->cd.arm.r[%i]", rm);
120 printf(
"if (y > 31) return 0; else x <<= y;\n");
121 printf(
"return x; }\n");
128 printf(
"{ uint32_t x = ");
132 printf(
"cpu->cd.arm.r[%i]", rm);
136 printf(
"cpu->cd.arm.flags &= ~ARM_F_C;\n");
137 printf(
"if (x & 0x%x)\n" 138 "\tcpu->cd.arm.flags |= ARM_F_C;\n",
143 printf(
"x >>= %i;\n", c);
144 printf(
" return x; }\n");
147 printf(
"\treturn 0;\n");
150 printf(
"\treturn tmp");
152 printf(
"\treturn cpu->cd.arm.r[%i]",rm);
153 printf(
" >> %i;\n", c);
160 printf(
"{ uint32_t x = ");
164 printf(
"cpu->cd.arm.r[%i]", rm);
165 printf(
",y=cpu->cd.arm.r[%i]&255;\n", rc);
166 printf(
"if(y==0) return x;\n");
167 printf(
"cpu->cd.arm.flags &= ~ARM_F_C;\n");
168 printf(
"if(y>31) y=32;\n");
169 printf(
"y--; x >>= y;\n");
171 "cpu->cd.arm.flags |= ARM_F_C;\n");
172 printf(
" return x >> 1; }\n");
174 printf(
"{ uint32_t y=cpu->cd.arm.r[%i]&255;\n", rc);
175 printf(
"uint32_t x=");
179 printf(
"cpu->cd.arm.r[%i]",rm);
181 printf(
"if (y>=32) return 0;\n");
182 printf(
"return x >> y; } ");
189 printf(
"{ int32_t x = ");
193 printf(
"cpu->cd.arm.r[%i]", rm);
197 printf(
"cpu->cd.arm.flags &= ~ARM_F_C;\n");
198 printf(
"if (x & 0x%x)\n" 199 "\tcpu->cd.arm.flags |= ARM_F_C;\n",
202 printf(
"x = (x<0)? 0xffffffff : 0;\n");
204 printf(
"x >>= %i;\n", c);
205 printf(
" return x; }\n");
212 printf(
"cpu->cd.arm.r[%i]",rm);
213 printf(
" & 0x80000000? 0xffffffff : 0;\n");
215 printf(
"return (int32_t)");
219 printf(
"cpu->cd.arm.r[%i]",rm);
220 printf(
" >> %i;\n", c);
227 printf(
"{ int32_t x = ");
231 printf(
"cpu->cd.arm.r[%i]", rm);
232 printf(
",y=cpu->cd.arm.r[%i]&255;\n", rc);
233 printf(
"if(y==0) return x;\n");
234 printf(
"cpu->cd.arm.flags &= ~ARM_F_C;\n");
235 printf(
"if(y>31) y=31;\n");
236 printf(
"y--; x >>= y;\n");
238 "cpu->cd.arm.flags |= ARM_F_C;\n");
239 printf(
" return (int32_t)x >> 1; }\n");
241 printf(
"{ int32_t y=cpu->cd.arm.r[%i]&255;\n", rc);
242 printf(
"int32_t x=");
246 printf(
"cpu->cd.arm.r[%i]",rm);
248 printf(
"if (y>=31) return (x<0)?0xffffffff:0;\n");
249 printf(
"return (int32_t)x >> y; } ");
256 printf(
"{ uint64_t x=");
260 printf(
"cpu->cd.arm.r[%i]",rm);
261 printf(
"; if (cpu->cd.arm.flags & ARM_F_C)" 262 " x |= 0x100000000ULL;");
264 printf(
"cpu->cd.arm.flags &= ~ARM_F_C;" 265 "if(x&1) cpu->cd.arm.flags |= " 268 printf(
"return x >> 1; }\n");
270 printf(
"{ uint64_t x = ");
274 printf(
"cpu->cd.arm.r[%i]", rm);
275 printf(
"; x |= (x << 32);\n");
276 printf(
"cpu->cd.arm.flags &= ~ARM_F_C;\n");
277 printf(
"if (x & 0x%x)\n" 278 "\tcpu->cd.arm.flags |= ARM_F_C;\n",
280 printf(
" return x >> %i; }\n", c);
282 printf(
"{ uint64_t x=");
286 printf(
"cpu->cd.arm.r[%i]",rm);
287 printf(
"; x |= (x << 32); ");
288 printf(
"return x >> %i; }\n", c);
294 printf(
"{ uint64_t x = ");
298 printf(
"cpu->cd.arm.r[%i]", rm);
299 printf(
"; int y=cpu->cd.arm.r[%i]&255;\n", rc);
300 printf(
"if(y==0) return x;\n");
301 printf(
"y --; y &= 31; x >>= y;\n");
302 printf(
"cpu->cd.arm.flags &= ~ARM_F_C;\n");
304 "cpu->cd.arm.flags |= ARM_F_C;\n");
305 printf(
" return x >> 1; }\n");
307 printf(
"{ int y=cpu->cd.arm.r[%i]&31;\n", rc);
308 printf(
"uint64_t x=");
312 printf(
"cpu->cd.arm.r[%i]",rm);
313 printf(
"; x |= (x << 32); ");
314 printf(
"return (x >> y); } ");
319 printf(
"\tprintf(\"%s\\n\");\n", name);
320 printf(
"\texit(1); /* TODO */\n\treturn 0;\n");
327 int main(
int argc,
char *argv[])
329 int s, func, f_start, f_end;
332 fprintf(stderr,
"usage: %s start end\n", argv[0]);
336 f_start = strtol(argv[1], NULL, 0);
337 f_end = strtol(argv[2], NULL, 0);
339 printf(
"/*\n * DO NOT EDIT! AUTOMATICALLY GENERATED!\n */\n\n");
340 printf(
"#include <stdio.h>\n");
341 printf(
"#include <stdlib.h>\n");
342 printf(
"#include \"cpu.h\"\n");
343 printf(
"#include \"misc.h\"\n");
346 if (f_start != 0 || f_end != 0) {
348 for (func=f_start; func<=f_end; func++)
352 for (func=0; func<=0xfff; func++) {
353 printf(
"extern uint32_t ");
355 printf(
"(struct cpu *, struct arm_" 359 printf(
"\nuint32_t (*arm_r[8192])(struct cpu *," 360 " struct arm_instr_call *) = {\n");
362 for (func=0; func<=0xfff; func++) {
365 if (s!=1 || func!=0xfff)
int main(int argc, char *argv[])
void f(int s, int func, int only_name)