/[gxemul]/upstream/0.3.6.2/src/cpus/generate_arm_dpi.c
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Contents of /upstream/0.3.6.2/src/cpus/generate_arm_dpi.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 19 - (show annotations)
Mon Oct 8 16:19:16 2007 UTC (16 years, 8 months ago) by dpavlin
File MIME type: text/plain
File size: 4210 byte(s)
0.3.6.2
1 /*
2 * Copyright (C) 2005 Anders Gavare. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are met:
6 *
7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * 3. The name of the author may not be used to endorse or promote products
13 * derived from this software without specific prior written permission.
14 *
15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25 * SUCH DAMAGE.
26 *
27 *
28 * $Id: generate_arm_dpi.c,v 1.2 2005/10/22 12:22:13 debug Exp $
29 */
30
31 #include <stdio.h>
32
33 char *cond[16] = {
34 "eq", "ne", "cs", "cc", "mi", "pl", "vs", "vc",
35 "hi", "ls", "ge", "lt", "gt", "le", "", "" };
36
37 char *op[16] = {
38 "and", "eor", "sub", "rsb", "add", "adc", "sbc", "rsc",
39 "tst", "teq", "cmp", "cmn", "orr", "mov", "bic", "mvn" };
40
41
42 char *uppercase(char *l)
43 {
44 static char staticbuf[1000];
45 int i = 0;
46
47 while (*l && i < sizeof(staticbuf)) {
48 char u = *l++;
49 if (u >= 'a' && u <= 'z')
50 u -= 32;
51 staticbuf[i++] = u;
52 }
53 if (i == sizeof(staticbuf))
54 i--;
55 staticbuf[i] = 0;
56 return staticbuf;
57 }
58
59
60 int main(int argc, char *argv[])
61 {
62 int n, a, reg, pc, s, c;
63
64 printf("\n/* AUTOMATICALLY GENERATED! Do not edit. */\n\n");
65 printf("#include <stdio.h>\n#include <stdlib.h>\n"
66 "#include \"cpu.h\"\n"
67 "#include \"misc.h\"\n"
68 "#include \"arm_quick_pc_to_pointers.h\"\n"
69 "#define reg(x) (*((uint32_t *)(x)))\n");
70 printf("extern void arm_instr_nop(struct cpu *, "
71 "struct arm_instr_call *);\n");
72 printf("extern void arm_instr_invalid(struct cpu *, "
73 "struct arm_instr_call *);\n");
74
75 for (reg=0; reg<=1; reg++)
76 for (pc=0; pc<=1; pc++)
77 for (s=0; s<=1; s++)
78 for (a=0; a<16; a++) {
79 if (a >= 8 && a <= 11 && s == 0)
80 continue;
81 printf("#define A__NAME arm_instr_%s%s%s%s\n",
82 op[a], s? "s" : "", pc? "_pc" : "", reg? "_reg" : "");
83
84 for (c=0; c<14; c++)
85 printf("#define A__NAME__%s arm_instr_%s%s%s%s__%s\n",
86 cond[c], op[a], s? "s" : "", pc? "_pc" : "",
87 reg? "_reg" : "", cond[c]);
88 if (s) printf("#define A__S\n");
89 if (reg)printf("#define A__REG\n");
90 if (pc) printf("#define A__PC\n");
91 printf("#define A__%s\n", uppercase(op[a]));
92 printf("#include \"cpu_arm_instr_dpi.c\"\n");
93 printf("#undef A__%s\n", uppercase(op[a]));
94 if (s) printf("#undef A__S\n");
95 if (reg)printf("#undef A__REG\n");
96 if (pc) printf("#undef A__PC\n");
97 for (c=0; c<14; c++)
98 printf("#undef A__NAME__%s\n", cond[c]);
99 printf("#undef A__NAME\n");
100 }
101
102 printf("\n\tvoid (*arm_dpi_instr[2 * 2 * 2 * 16 * 16])(struct cpu *,\n"
103 "\t\tstruct arm_instr_call *) = {\n");
104 n = 0;
105 for (reg=0; reg<=1; reg++)
106 for (pc=0; pc<=1; pc++)
107 for (s=0; s<=1; s++)
108 for (a=0; a<16; a++)
109 for (c=0; c<16; c++) {
110 if (c == 15)
111 printf("\tarm_instr_nop");
112 else if (a >= 8 && a <= 11 && s == 0)
113 printf("\tarm_instr_invalid");
114 else
115 printf("\tarm_instr_%s%s%s%s%s%s",
116 op[a], s? "s" : "", pc? "_pc" : "",
117 reg? "_reg" : "",
118 c!=14? "__" : "", cond[c]);
119 n++;
120 if (n != 2 * 2 * 2 * 16 * 16)
121 printf(",");
122 printf("\n");
123 }
124
125 printf("};\n\n");
126
127 return 0;
128 }
129

  ViewVC Help
Powered by ViewVC 1.1.26