1 /* Simulator/Opcode generator for the Hitachi Super-H architecture.
3 Written by Steve Chamberlain of Cygnus Support.
6 This file is part of SH sim
9 THIS SOFTWARE IS NOT COPYRIGHTED
11 Cygnus offers the following for use in the public domain. Cygnus
12 makes no warranty with regard to the software or it's performance
13 and the user accepts the software "AS IS" with all faults.
15 CYGNUS DISCLAIMS ANY WARRANTIES, EXPRESS OR IMPLIED, WITH REGARD TO
16 THIS SOFTWARE INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17 MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
21 /* This program generates the opcode table for the assembler and
24 -t prints a pretty table for the assembler manual
25 -s generates the simulator code jump table
26 -d generates a define table
27 -x generates the simulator code switch statement
28 default generates the opcode tables
50 {"n","","add #<imm>,<REG_N>", "0111nnnni8*1....", "R[n] += SEXT(i);if (i == 0) { UNDEF(n); break; } "},
51 {"n","mn","add <REG_M>,<REG_N>", "0011nnnnmmmm1100", "R[n] += R[m];"},
52 {"n","mn","addc <REG_M>,<REG_N>", "0011nnnnmmmm1110", "ult=R[n]+T;T=ult<T;ult=ult+R[m];T=T|(ult<R[m]);R[n]=ult;"},
53 {"n","mn","addv <REG_M>,<REG_N>", "0011nnnnmmmm1111",
55 " ans = R[n] + R[m];",
56 "T = ((~R[n] & R[m] & ans) | (R[n] & R[m] & ~ans)) >>31;",
59 {"0","","and #<imm>,R0", "11001001i8*1....", ";R0&=i;"},
60 {"n","nm","and <REG_M>,<REG_N>", "0010nnnnmmmm1001", " R[n]&=R[m];"},
61 {"","0","and.b #<imm>,@(R0,GBR)", "11001101i8*1....", ";WBAT(GBR+R0, RBAT(GBR+R0) & i);"},
63 {"","","bra <bdisp12>", "1010i12.........", "ult = PC; PC=PC+(i<<1)+2;SL(ult+2);"},
64 {"","","bsr <bdisp12>", "1011i12.........", "PR = PC; PC=PC+(i<<1)+2;SL(PR+2);"},
65 {"","","bt <bdisp8>", "10001001i8p1....", "if(T) {PC+=(SEXT(i)<<1)+2;C+=2;}"},
66 {"","","bf <bdisp8>", "10001011i8p1....", "if(T==0) {PC+=(SEXT(i)<<1)+2;C+=2;}"},
67 {"","","bt.s <bdisp8>", "10001101i8p1....","if(T) {ult = PC; PC+=(SEXT(i)<<1)+2;C+=2;SL(ult+2);}"},
68 {"","","bf.s <bdisp8>", "10001111i8p1....","if(!T) {ult = PC; PC+=(SEXT(i)<<1)+2;C+=2;SL(ult+2);}"},
69 {"","","clrmac", "0000000000101000", "MACH = MACL = 0;"},
70 {"","","clrt", "0000000000001000", "T= 0;"},
71 {"","0","cmp/eq #<imm>,R0", "10001000i8*1....", ";T = R0 == SEXT(i);"},
72 {"","mn","cmp/eq <REG_M>,<REG_N>", "0011nnnnmmmm0000", "T=R[n]==R[m];"},
73 {"","mn","cmp/ge <REG_M>,<REG_N>", "0011nnnnmmmm0011", "T=R[n]>=R[m];"},
74 {"","mn","cmp/gt <REG_M>,<REG_N>", "0011nnnnmmmm0111", "T=R[n]>R[m];"},
75 {"","mn","cmp/hi <REG_M>,<REG_N>", "0011nnnnmmmm0110", "T=UR[n]>UR[m];"},
76 {"","mn","cmp/hs <REG_M>,<REG_N>", "0011nnnnmmmm0010", "T=UR[n]>=UR[m];"},
77 {"","n","cmp/pl <REG_N>", "0100nnnn00010101", "T = R[n]>0;"},
78 {"","n","cmp/pz <REG_N>", "0100nnnn00010001", "T = R[n]>=0;"},
79 {"","mn","cmp/str <REG_M>,<REG_N>", "0010nnnnmmmm1100",
80 "ult = R[n] ^ R[m]; T=((ult&0xff000000)==0) |((ult&0xff0000)==0) |((ult&0xff00)==0) |((ult&0xff)==0); "},
81 {"","mn","div0s <REG_M>,<REG_N>", "0010nnnnmmmm0111", "Q=(R[n]&sbit)!=0; M=(R[m]&sbit)!=0; T=M!=Q;;"},
82 {"","","div0u", "0000000000011001", "M=Q=T=0;"},
83 {"","","div1 <REG_M>,<REG_N>", "0011nnnnmmmm0100", "T=div1(R,m,n,T);"},
84 {"n","m","exts.b <REG_M>,<REG_N>", "0110nnnnmmmm1110", "R[n] = SEXT(R[m]);"},
85 {"n","m","exts.w <REG_M>,<REG_N>", "0110nnnnmmmm1111", "R[n] = SEXTW(R[m]);"},
86 {"n","m","extu.b <REG_M>,<REG_N>", "0110nnnnmmmm1100", "R[n] = R[m] & 0xff;"},
87 {"n","m","extu.w <REG_M>,<REG_N>", "0110nnnnmmmm1101", "R[n] = R[m] & 0xffff;"},
88 {"","n","jmp @<REG_N>", "0100nnnn00101011", "ult = PC; PC=R[n]-2; SL(ult+2);"},
89 {"","n","jsr @<REG_N>", "0100nnnn00001011", "PR = PC; PC=R[n]-2; if (~doprofile) gotcall(PR,PC+2);SL(PR+2);"},
90 {"","n","ldc <REG_N>,GBR", "0100nnnn00011110", "GBR=R[n];"},
91 {"","n","ldc <REG_N>,SR", "0100nnnn00001110", "SET_SR(R[n]);"},
92 {"","n","ldc <REG_N>,VBR", "0100nnnn00101110", "VBR=R[n];"},
93 {"","n","ldc.l @<REG_N>+,GBR", "0100nnnn00010111", "GBR=RLAT(R[n]);R[n]+=4;;"},
94 {"","n","ldc.l @<REG_N>+,SR", "0100nnnn00000111", "SET_SR(RLAT(R[n]));R[n]+=4;;"},
95 {"","n","ldc.l @<REG_N>+,VBR", "0100nnnn00100111", "VBR=RLAT(R[n]);R[n]+=4;;"},
96 {"","n","lds <REG_N>,MACH", "0100nnnn00001010", "MACH = R[n];"},
97 {"","n","lds <REG_N>,MACL", "0100nnnn00011010", "MACL= R[n];"},
98 {"","n","lds <REG_N>,PR", "0100nnnn00101010", "PR = R[n];"},
99 {"","n","lds.l @<REG_N>+,MACH", "0100nnnn00000110", "MACH = SEXT(RLAT(R[n]));R[n]+=4;"},
100 {"","n","lds.l @<REG_N>+,MACL", "0100nnnn00010110", "MACL = RLAT(R[n]);R[n]+=4;"},
101 {"","n","lds.l @<REG_N>+,PR", "0100nnnn00100110", "PR = RLAT(R[n]);R[n]+=4;;"},
102 {"","n","mac.w @<REG_M>+,@<REG_N>+", "0100nnnnmmmm1111", "abort();"},
103 {"n","","mov #<imm>,<REG_N>", "1110nnnni8*1....", "R[n] = SEXT(i);"},
104 {"n","m","mov <REG_M>,<REG_N>", "0110nnnnmmmm0011", "R[n] = R[m];"},
105 {"","mn0","mov.b <REG_M>,@(R0,<REG_N>)", "0000nnnnmmmm0100", "WBAT(R[n]+R0, R[m]);"},
106 {"","nm","mov.b <REG_M>,@-<REG_N>", "0010nnnnmmmm0100", "R[n]--; WBAT(R[n],R[m]);"},
107 {"","mn","mov.b <REG_M>,@<REG_N>", "0010nnnnmmmm0000", "WBAT(R[n], R[m]);"},
108 {"0","m","mov.b @(<disp>,<REG_M>),R0", "10000100mmmmi4*1", "R0=RSBAT(i+R[m]);L(0);"},
109 {"0","","mov.b @(<disp>,GBR),R0", "11000100i8*1....", "R0=RSBAT(i+GBR);L(0);"},
110 {"n","0m","mov.b @(R0,<REG_M>),<REG_N>", "0000nnnnmmmm1100", "R[n]=RSBAT(R0+R[m]);L(n);"},
111 {"n","m","mov.b @<REG_M>+,<REG_N>", "0110nnnnmmmm0100", "R[n] = RSBAT(R[m]);L(n);R[m]++;"},
112 {"n","m","mov.b @<REG_M>,<REG_N>", "0110nnnnmmmm0000", "R[n]=RSBAT(R[m]);L(n);"},
113 {"","m0","mov.b R0,@(<disp>,<REG_M>)", "10000000mmmmi4*1", "WBAT(i+R[m],R0);"},
114 {"","0","mov.b R0,@(<disp>,GBR)", "11000000i8*1....", "WBAT(i+GBR,R0);"},
115 {"","nm","mov.l <REG_M>,@(<disp>,<REG_N>)", "0001nnnnmmmmi4*4", "WLAT(i+R[n],R[m]);"},
116 {"","nm0","mov.l <REG_M>,@(R0,<REG_N>)", "0000nnnnmmmm0110", "WLAT(R0+R[n],R[m]);"},
117 {"","nm","mov.l <REG_M>,@-<REG_N>", "0010nnnnmmmm0110", "R[n]-=4;WLAT(R[n],R[m]);"},
118 {"","nm","mov.l <REG_M>,@<REG_N>", "0010nnnnmmmm0010", "WLAT(R[n], R[m]);"},
119 {"n","m","mov.l @(<disp>,<REG_M>),<REG_N>","0101nnnnmmmmi4*4", "R[n]=RLAT(i+R[m]);L(n);"},
120 {"0","","mov.l @(<disp>,GBR),R0", "11000110i8*4....", "R0=RLAT(i+GBR);L(0);"},
121 {"n","","mov.l @(<disp>,PC),<REG_N>", "1101nnnni8p4....", "R[n]=RLAT((i+4+PC) & ~3);L(n);"},
122 {"n","m","mov.l @(R0,<REG_M>),<REG_N>", "0000nnnnmmmm1110", "R[n]=RLAT(R0+R[m]);L(n);"},
123 {"nm","m","mov.l @<REG_M>+,<REG_N>", "0110nnnnmmmm0110", "R[n]=RLAT(R[m]);R[m]+=4;L(n);"},
124 {"n","m","mov.l @<REG_M>,<REG_N>", "0110nnnnmmmm0010", "R[n]=RLAT(R[m]);L(n);"},
125 {"","0","mov.l R0,@(<disp>,GBR)", "11000010i8*4....", "WLAT(i+GBR,R0);"},
126 {"","m0n","mov.w <REG_M>,@(R0,<REG_N>)", "0000nnnnmmmm0101", "WWAT(R0+R[n],R[m]);"},
127 {"n","mn","mov.w <REG_M>,@-<REG_N>", "0010nnnnmmmm0101", "R[n]-=2;WWAT(R[n],R[m]);"},
128 {"","nm","mov.w <REG_M>,@<REG_N>", "0010nnnnmmmm0001", "WWAT(R[n],R[m]);"},
129 {"0","m","mov.w @(<disp>,<REG_M>),R0", "10000101mmmmi4*2", "R0=RSWAT(i+R[m]);L(0);"},
130 {"0","","mov.w @(<disp>,GBR),R0", "11000101i8*2....", "R0=RSWAT(i+GBR);L(0);"},
131 {"n","","mov.w @(<disp>,PC),<REG_N>", "1001nnnni8p2....", "R[n]=RSWAT(PC+i+4);L(n);"},
132 {"n","m0","mov.w @(R0,<REG_M>),<REG_N>", "0000nnnnmmmm1101", "R[n]=RSWAT(R0+R[m]);L(n);"},
133 {"nm","n","mov.w @<REG_M>+,<REG_N>", "0110nnnnmmmm0101", "R[n]=RSWAT(R[m]);R[m]+=2;L(n);"},
134 {"n","m","mov.w @<REG_M>,<REG_N>", "0110nnnnmmmm0001", "R[n]=RSWAT(R[m]);L(n);"},
135 {"","0m","mov.w R0,@(<disp>,<REG_M>)", "10000001mmmmi4*2", "WWAT(i+R[m],R0);"},
136 {"","0","mov.w R0,@(<disp>,GBR)", "11000001i8*2....", "WWAT(i+GBR,R0);"},
137 {"0","","mova @(<disp>,PC),R0", "11000111i8p4....", "R0=((i+4+PC) & ~0x3);"},
138 {"n","","movt <REG_N>", "0000nnnn00101001", "R[n]=T;"},
139 {"","mn","muls <REG_M>,<REG_N>", "0010nnnnmmmm1111","MACL=((int)(short)R[n])*((int)(short)R[m]);"},
140 {"","mn","mul.l <REG_M>,<REG_N>","0000nnnnmmmm0111","MACL=((int)R[n])*((int)R[m]);"},
141 {"","mn","mulu <REG_M>,<REG_N>", "0010nnnnmmmm1110","MACL=((unsigned int)(unsigned short)R[n])*((unsigned int)(unsigned short)R[m]);"},
142 {"n","m","neg <REG_M>,<REG_N>", "0110nnnnmmmm1011", "R[n] = - R[m];"},
143 {"n","m","negc <REG_M>,<REG_N>", "0110nnnnmmmm1010",
144 "ult=R[m]; R[n]=0-R[m]-T;T=SBIT(R[n])!=SBIT(ult); "},
145 {"","","nop", "0000000000001001", ""},
146 {"n","m","not <REG_M>,<REG_N>", "0110nnnnmmmm0111", "R[n]=~R[m];"},
147 {"0","","or #<imm>,R0", "11001011i8*1....", "R0|=i;"},
148 {"n","m","or <REG_M>,<REG_N>", "0010nnnnmmmm1011", "R[n]|=R[m];"},
149 {"","0","or.b #<imm>,@(R0,GBR)", "11001111i8*1....", "WBAT(R0+GBR,RBAT(R0+GBR)|i);"},
150 {"n","n","rotcl <REG_N>", "0100nnnn00100100", "ult=R[n]<0;R[n]=(R[n]<<1)|T;T=ult;"},
151 {"n","n","rotcr <REG_N>", "0100nnnn00100101", "ult=R[n]&1;R[n]=(UR[n]>>1)|(T<<31);T=ult;"},
152 {"n","n","rotl <REG_N>", "0100nnnn00000100", "T=R[n]<0;R[n]<<=1;R[n]|=T;"},
153 {"n","n","rotr <REG_N>", "0100nnnn00000101", "T=R[n]&1;R[n] = UR[n]>> 1;R[n]|=(T<<31);"},
154 {"","","rte", "0000000000101011",
155 "{ int tmp = PC; PC=RLAT(R[15])+2;R[15]+=4;SET_SR(RLAT(R[15]) & 0x3f3);R[15]+=4;SL(tmp+2);}"},
156 {"","","rts", "0000000000001011", "ult=PC;PC=PR+2;SL(ult+2);"},
157 {"","","sett", "0000000000011000", "T=1;"},
159 /* start-sanitize-sh3 */
160 {"n","mn","shad <REG_M>,<REG_N>", "0100nnnnmmmm1100",
161 "R[n] = (R[m] < 0) ? (((int)R[n]) >> -(R[m]&0x1f) ): (R[n] << ((R[m]) & 0x1f)) ;"},
163 {"n","mn","shld <REG_M>,<REG_N>", "0100nnnnmmmm1101",
164 "R[n] = (R[m] < 0) ? (((unsigned int)R[n]) >> -(R[m]&0x1f) ): (R[n] << ((R[m]) & 0x1f)) ;"},
165 /* end-sanitize-sh3 */
166 {"n","n","shal <REG_N>", "0100nnnn00100000", "T=R[n]<0; R[n]<<=1;"},
167 {"n","n","shar <REG_N>", "0100nnnn00100001", "T=R[n]&1; R[n] = R[n] >> 1;"},
168 {"n","n","shll <REG_N>", "0100nnnn00000000", "T=R[n]<0; R[n]<<=1;"},
169 {"n","n","shll16 <REG_N>", "0100nnnn00101000", "R[n]<<=16;"},
170 {"n","n","shll2 <REG_N>", "0100nnnn00001000", "R[n]<<=2;"},
171 {"n","n","shll8 <REG_N>", "0100nnnn00011000", "R[n]<<=8;"},
172 {"n","n","shlr <REG_N>", "0100nnnn00000001", "T=R[n]&1;R[n]=UR[n]>>1;"},
173 {"n","n","shlr16 <REG_N>", "0100nnnn00101001", "R[n]=UR[n]>>16;"},
174 {"n","n","shlr2 <REG_N>", "0100nnnn00001001", "R[n]=UR[n]>>2;"},
175 {"n","n","shlr8 <REG_N>", "0100nnnn00011001", "R[n]=UR[n]>>8;"},
176 {"","","sleep", "0000000000011011", "trap(0xc3,R0,memory,maskl,maskw,little_endian);PC-=2;"},
177 {"n","","stc GBR,<REG_N>", "0000nnnn00010010", "R[n]=GBR;"},
178 {"n","","stc SR,<REG_N>", "0000nnnn00000010", "R[n]=GET_SR();"},
179 {"n","","stc VBR,<REG_N>", "0000nnnn00100010", "R[n]=VBR;"},
180 {"n","n","stc.l GBR,@-<REG_N>", "0100nnnn00010011", "R[n]-=4;WLAT(R[n],GBR);;"},
181 {"n","n","stc.l SR,@-<REG_N>", "0100nnnn00000011", "R[n]-=4;WLAT(R[n],GET_SR());"},
182 {"n","n","stc.l VBR,@-<REG_N>", "0100nnnn00100011", "R[n]-=4;WLAT(R[n],VBR);"},
183 {"n","","sts MACH,<REG_N>", "0000nnnn00001010", "R[n]=MACH;"},
184 {"n","","sts MACL,<REG_N>", "0000nnnn00011010", "R[n]=MACL;"},
185 {"n","","sts PR,<REG_N>", "0000nnnn00101010", "R[n]=PR;"},
186 {"n","n","sts.l MACH,@-<REG_N>", "0100nnnn00000010", "R[n]-=4;WLAT(R[n],MACH);"},
187 {"n","n","sts.l MACL,@-<REG_N>", "0100nnnn00010010", "R[n]-=4;WLAT(R[n],MACL);"},
188 {"n","n","sts.l PR,@-<REG_N>", "0100nnnn00100010", "R[n]-=4;WLAT(R[n],PR);"},
189 {"n","nm","sub <REG_M>,<REG_N>", "0011nnnnmmmm1000", "R[n]-=R[m];"},
190 {"n","nm","subc <REG_M>,<REG_N>", "0011nnnnmmmm1010", "ult=R[n]-T;T=ult>T;ult=ult-R[m];T=T|(ult>R[m]);R[n]=ult;"},
191 {"n","nm","subv <REG_M>,<REG_N>", "0011nnnnmmmm1011", "abort();"},
192 {"n","nm","swap.b <REG_M>,<REG_N>", "0110nnnnmmmm1000", "R[n]=((R[m]<<8)&0xff00)|((R[m]>>8)&0x00ff);"},
193 {"n","nm","swap.w <REG_M>,<REG_N>", "0110nnnnmmmm1001", "R[n]=((R[m]<<16)&0xffff0000)|((R[m]>>16)&0x00ffff);"},
194 {"","n","tas.b @<REG_N>", "0100nnnn00011011", "ult=RBAT(R[n]);T=ult==0;WBAT(R[n],ult|0x80);"},
195 {"0","","trapa #<imm>", "11000011i8*1....",
196 "{ long imm = 0xff & i; if (i<20||i==0xc3) trap(i,R,memory,maskl,maskw,little_endian); else { R[15]-=4; WLAT(R[15],GET_SR()); R[15]-=4;WLAT(R[15],PC+2); PC=RLAT(VBR+(imm<<2))-2;}}"},
197 {"","0","tst #<imm>,R0", "11001000i8*1....", "T=(R0&i)==0;"},
198 {"","mn","tst <REG_M>,<REG_N>", "0010nnnnmmmm1000", "T=(R[n]&R[m])==0;"},
199 {"","0","tst.b #<imm>,@(R0,GBR)", "11001100i8*1....", "T=(RBAT(GBR+R0)&i)==0;"},
200 {"","0","xor #<imm>,R0", "11001010i8*1....", "R0^=i;"},
201 {"n","mn","xor <REG_M>,<REG_N>", "0010nnnnmmmm1010", "R[n]^=R[m];"},
202 {"","0","xor.b #<imm>,@(R0,GBR)", "11001110i8*1....", "ult=RBAT(GBR+R0);ult^=i;WBAT(GBR+R0,ult);"},
203 {"n","nm","xtrct <REG_M>,<REG_N>", "0010nnnnmmmm1101", "R[n]=((R[n]>>16)&0xffff)|((R[m]<<16)&0xffff0000);"},
204 {"","nm","mul.l <REG_M>,<REG_N>", "0000nnnnmmmm0111", " MACL = R[n] * R[m];"},
205 {"n","n","dt <REG_N>", "0100nnnn00010000", "R[n]--; T=R[n] == 0;"},
206 {"","nm","dmuls.l <REG_M>,<REG_N>", "0011nnnnmmmm1101", "dmul(1,R[n],R[m]);"},
207 {"","nm","dmulu.l <REG_M>,<REG_N>", "0011nnnnmmmm0101", "dmul(0,R[n],R[m]);"},
208 {"","nm","mac.l @<REG_M>+,@<REG_N>+", "0000nnnnmmmm1111", ""},
211 {"braf @<REG_N>", "0000nnnn00100011", ""},
212 {"bsrf @<REG_N>", "0000nnnn00000011", ""},
213 {"divs.l <REG_M>,<REG_N>", "0100nnnnmmmm1110", "divl(0,R[n],R[m]);"},
214 {"divu.l <REG_M>,<REG_N>", "0100nnnnmmmm1101", "divl(0,R[n],R[m]);"},
219 /* Tables of things to put into enums for sh-opc.h */
220 static char *nibble_type_list[] =
255 char *arg_type_list[] =
287 make_enum_list (name, s)
292 printf ("typedef enum {\n");
295 printf ("\t%s,\n", *s);
299 printf ("} %s;\n", name);
309 memcpy (bufa, a->code, 4);
310 memcpy (bufa + 4, a->code + 12, 4);
313 memcpy (bufb, b->code, 4);
314 memcpy (bufb + 4, b->code + 12, 4);
316 return (strcmp (bufa, bufb));
330 qsort (tab, len, sizeof (*p), qfunc);
334 printonmatch (ptr, a, rep)
340 if (strncmp (*ptr, a, l) == 0)
360 while (*n && *n != ' ')
375 while (*p == ',' || *p == ' ')
377 printonmatch (&p, "#<imm>", "A_IMM");
378 printonmatch (&p, "R0", "A_R0");
379 printonmatch (&p, "<REG_N>", "A_REG_N");
380 printonmatch (&p, "@<REG_N>+", "A_INC_N");
381 printonmatch (&p, "@<REG_N>", "A_IND_N");
382 printonmatch (&p, "@-<REG_N>", "A_DEC_N");
383 printonmatch (&p, "<REG_M>", " A_REG_M");
384 printonmatch (&p, "@<REG_M>+", "A_INC_M");
385 printonmatch (&p, "@<REG_M>", "A_IND_M");
386 printonmatch (&p, "@-<REG_M>", "A_DEC_M");
387 printonmatch (&p, "@(<disp>,PC)", "A_DISP_PC");
388 printonmatch (&p, "@(<disp>,<REG_M>)", "A_DISP_REG_M");
389 printonmatch (&p, "@(<disp>,<REG_N>)", "A_DISP_REG_N");
390 printonmatch (&p, "@(R0,<REG_N>)", "A_IND_R0_REG_N");
391 printonmatch (&p, "@(R0,<REG_M>)", "A_IND_R0_REG_M");
392 printonmatch (&p, "@(<disp>,GBR)", "A_DISP_GBR");
393 printonmatch (&p, "@(R0,GBR)", "A_R0_GBR");
394 printonmatch (&p, "<bdisp8>", "A_BDISP8");
395 printonmatch (&p, "<bdisp12>", "A_BDISP12");
396 printonmatch (&p, "SR", "A_SR");
397 printonmatch (&p, "GBR", "A_GBR");
398 printonmatch (&p, "VBR", "A_VBR");
399 printonmatch (&p, "MACH", "A_MACH");
400 printonmatch (&p, "MACL", "A_MACL");
401 printonmatch (&p, "PR", "A_PR");
409 printonmatch (&p, "0000", "HEX_0");
410 printonmatch (&p, "0001", "HEX_1");
411 printonmatch (&p, "0010", "HEX_2");
412 printonmatch (&p, "0011", "HEX_3");
413 printonmatch (&p, "0100", "HEX_4");
414 printonmatch (&p, "0101", "HEX_5");
415 printonmatch (&p, "0110", "HEX_6");
416 printonmatch (&p, "0111", "HEX_7");
418 printonmatch (&p, "1000", "HEX_8");
419 printonmatch (&p, "1001", "HEX_9");
420 printonmatch (&p, "1010", "HEX_A");
421 printonmatch (&p, "1011", "HEX_B");
422 printonmatch (&p, "1100", "HEX_C");
423 printonmatch (&p, "1101", "HEX_D");
424 printonmatch (&p, "1110", "HEX_E");
425 printonmatch (&p, "1111", "HEX_F");
426 printonmatch (&p, "i8*1....", "IMM_8");
427 printonmatch (&p, "i4*1", "IMM_4");
428 printonmatch (&p, "i8p4....", "PCRELIMM_8BY4");
429 printonmatch (&p, "i8p2....", "PCRELIMM_8BY2");
430 printonmatch (&p, "i8*2....", "IMM_8BY2");
431 printonmatch (&p, "i4*2", "IMM_4BY2");
432 printonmatch (&p, "i8*4....", "IMM_8BY4");
433 printonmatch (&p, "i4*4", "IMM_4BY4");
434 printonmatch (&p, "i12.........", "BRANCH_12");
435 printonmatch (&p, "i8p1....", "BRANCH_8");
436 printonmatch (&p, "nnnn", "REG_N");
437 printonmatch (&p, "mmmm", "REG_M");
448 for (p = tab; p->name; p++)
450 printf ("%s %-30s\n", p->code, p->name);
461 make_enum_list ("sh_nibble_type", nibble_type_list);
462 make_enum_list ("sh_arg_type", arg_type_list);
464 printf ("typedef struct {\n");
465 printf ("char *name;\n");
466 printf ("sh_arg_type arg[3];\n");
467 printf ("sh_nibble_type nibbles[4];\n");
468 printf ("} sh_opcode_info;\n");
469 printf ("#ifdef DEFINE_TABLE\n");
470 printf ("sh_opcode_info sh_table[]={\n");
471 for (p = tab; p->name; p++)
473 printf ("\n\/\* %s %-20s*/", p->code, p->name);
485 /* Convert a string of 4 binary digits into an int */
505 static unsigned char table[1 << 16];
507 /* Take an opcode expand all varying fields in it out and fill all the
508 right entries in 'table' with the opcode index*/
511 expand_opcode (shift, val, i, s)
535 expand_opcode (shift - 4, val | (n << shift), i, s + 4);
541 for (j = 0; j < 16; j++)
543 expand_opcode (shift - 4, val | (j << shift), i, s + 4);
549 for (j = 0; j < (1 << (shift + 4)); j++)
557 /* Print the jump table used to index an opcode into a switch
572 printf ("unsigned char sh_jump_table%x[%d]={\n", i, lump);
579 printf ("%2d", table[i + j + k]);
602 for (p = tab; p->name; p++)
605 expand_opcode (12, 0, p->index, p->code);
616 printf ("switch (jump_table[iword]) {\n");
618 for (p = tab; p->name; p++)
626 printf ("\/\* %s %s *\/\n", p->name, p->code);
627 printf ("case %d: \n", p->index);
640 printf ("int n = (iword >>8) & 0xf;\n");
645 printf ("int m = (iword >>4) & 0xf;\n");
652 printf ("int i = (iword & 0x");
687 printf ("i = (i ^ (1<<%d))-(1<<%d);\n", sextbit - 1, sextbit - 1);
695 for (j = 0; j < 10; j++)
699 printf ("%s\n", p->stuff[j]);
705 /* Do the defs and refs */
707 for (r = p->refs; *r; r++) {
708 if (*r == '0') printf("CREF(0);\n");
709 if (*r == 'n') printf("CREF(n);\n");
710 if (*r == 'm') printf("CREF(m);\n");
713 for (r = p->defs; *r; r++)
715 if (*r == '0') printf("CDEF(0);\n");
716 if (*r == 'n') printf("CDEF(n);\n");
717 if (*r == 'm') printf("CDEF(m);\n");
734 for (p = tab; p->name; p++)
737 printf ("#define OPC_");
741 if (isalpha(*s)) printf("%c", *s);
742 if (*s == ' ') printf("_");
743 if (*s == '@') printf("ind_");
744 if (*s == ',') printf("_");
747 printf(" %d\n",p->index);
758 if (strcmp (av[1], "-t") == 0)
762 else if (strcmp (av[1], "-d") == 0)
766 else if (strcmp (av[1], "-s") == 0)
772 else if (strcmp (av[1], "-x") == 0)