rewrite `rename' and `rmdir' to properly invalidate the cache
[unix-history] / usr / src / sys / vax / inline / langpats.c
CommitLineData
2a48bcf5 1#ifndef lint
3845fbd6 2static char sccsid[] = "@(#)langpats.c 1.2 (Berkeley) %G%";
2a48bcf5
SL
3#endif
4
5/*
6 * In-line assembly code expander for
3845fbd6 7 * the kernel. This code is based on
2a48bcf5
SL
8 * pc2 and the old asm.sed script.
9 */
10#include <stdio.h>
11#include <ctype.h>
12
13/*
14 * The hash table must be at least twice as big as the number
15 * of patterns, preferably bigger. It must also be a prime number
16 */
17#define HSHSIZ 139
18
19/*
20 * Pattern table.
21 */
22struct pats {
23 char *name;
24 char *replace;
25} ptab[] = {
3845fbd6 26 { "_spl0\n",
2a48bcf5
SL
27" mfpr $18,r0\n\
28 mtpr $0,$18\n" },
29
3845fbd6 30 { "_spl1\n",
2a48bcf5
SL
31" mfpr $18,r0\n\
32 mtpr $1,$18\n" },
33
3845fbd6 34 { "_splsoftclock\n",
2a48bcf5
SL
35" mfpr $18,r0\n\
36 mtpr $0x8,$18\n" },
37
3845fbd6 38 { "_splnet\n",
2a48bcf5
SL
39" mfpr $18,r0\n\
40 mtpr $0xc,$18\n" },
41
3845fbd6 42 { "_splimp\n",
2a48bcf5
SL
43" mfpr $18,r0\n\
44 mtpr $0x16,$18\n" },
45
3845fbd6 46 { "_spl4\n",
2a48bcf5
SL
47" mfpr $18,r0\n\
48 mtpr $0x14,$18\n" },
49
3845fbd6 50 { "_splbio\n",
2a48bcf5
SL
51" mfpr $18,r0\n\
52 mtpr $0x15,$18\n" },
53
3845fbd6 54 { "_spltty\n",
2a48bcf5
SL
55" mfpr $18,r0\n\
56 mtpr $0x15,$18\n" },
2a48bcf5 57
3845fbd6 58 { "_spl5\n",
2a48bcf5
SL
59" mfpr $18,r0\n\
60 mtpr $0x15,$18\n" },
61
3845fbd6 62 { "_splclock\n",
2a48bcf5
SL
63" mfpr $18,r0\n\
64 mtpr $0x18,$18\n" },
65
3845fbd6 66 { "_spl6\n",
2a48bcf5
SL
67" mfpr $18,r0\n\
68 mtpr $0x18,$18\n" },
69
3845fbd6 70 { "_spl7\n",
2a48bcf5
SL
71" mfpr $18,r0\n\
72 mtpr $0x1f,$18\n" },
73
3845fbd6 74 { "_splx\n",
2a48bcf5
SL
75" mfpr $18,r0\n\
76 mtpr (sp)+,$18\n" },
77
3845fbd6 78 { "_mfpr\n",
2a48bcf5
SL
79" mfpr (sp)+,r0\n" },
80
3845fbd6 81 { "_mtpr\n",
2a48bcf5
SL
82" mtpr 4(sp),(sp)\n\
83 addl2 $8,sp\n" },
84
3845fbd6 85 { "_setsoftclock\n",
2a48bcf5
SL
86" mtpr $0x8,$0x14\n" },
87
3845fbd6 88 { "_resume\n",
2a48bcf5
SL
89" ashl $9,(sp)+,r0 \n\
90 movpsl -(sp) \n\
91 jsb _Resume\n" },
92
3845fbd6 93 { "_bcopy\n",
2a48bcf5
SL
94" movc3 8(sp),*(sp),*4(sp)\n\
95 addl2 $12,sp\n" },
96
3845fbd6 97 { "_ovbcopy\n",
2a48bcf5
SL
98" movc3 8(sp),*(sp),*4(sp)\n\
99 addl2 $12,sp\n" },
100
3845fbd6 101 { "_bzero\n",
2a48bcf5
SL
102" movc5 $0,(r0),$0,4(sp),*(sp)\n\
103 addl2 $8,sp\n" },
104
3845fbd6 105 { "_bcmp\n",
2a48bcf5
SL
106" popr $0x7\n\
107 cmpc3 r2,(r0),(r1)\n" },
108
3845fbd6 109 { "_strncmp\n",
2a48bcf5
SL
110" cmpc3 8(sp),*(sp),*4(sp)\n\
111 addl2 $12,sp\n" },
112
3845fbd6 113 { "_blkclr\n",
2a48bcf5
SL
114" movl (sp)+,r3\n\
115 jbr 2f\n\
1161:\n\
117 subl2 r0,(sp)\n\
118 movc5 $0,(r3),$0,r0,(r3)\n\
1192:\n\
120 movzwl $65535,r0\n\
121 cmpl (sp),r0\n\
122 jgtr 1b\n\
123 movl (sp)+,r0\n\
124 movc5 $0,(r3),$0,r0,(r3)\n" },
125
3845fbd6 126 { "_strlen\n",
2a48bcf5
SL
127" movl (sp),r1\n\
1281:\n\
129 locc $0,$65535,(r1)\n\
130 jeql 1b\n\
131 subl3 (sp)+,r1,r0\n" },
132
3845fbd6 133 { "_scanc\n",
2a48bcf5
SL
134" popr $0xf\n\
135 scanc r0,(r1),(r2),r3\n" },
136
3845fbd6 137 { "_copyin\n",
2a48bcf5
SL
138" jsb _Copyin\n\
139 addl2 $12,sp\n" },
140
3845fbd6 141 { "_copyout\n",
2a48bcf5
SL
142" jsb _Copyout\n\
143 addl2 $12,sp\n" },
144
3845fbd6 145 { "_fubyte\n",
2a48bcf5
SL
146" movl (sp)+,r0\n\
147 jsb _Fubyte\n" },
148
3845fbd6 149 { "_fuibyte\n",
2a48bcf5
SL
150" movl (sp)+,r0\n\
151 jsb _Fubyte\n" },
152
3845fbd6 153 { "_fuword\n",
2a48bcf5
SL
154" movl (sp)+,r0\n\
155 jsb _Fuword\n" },
156
3845fbd6 157 { "_fuiword\n",
2a48bcf5
SL
158" movl (sp)+,r0\n\
159 jsb _Fuword\n" },
160
3845fbd6 161 { "_subyte\n",
2a48bcf5
SL
162" movl (sp)+,r0\n\
163 movl (sp)+,r1\n\
164 jsb _Subyte\n" },
165
3845fbd6 166 { "_suibyte\n",
2a48bcf5
SL
167" movl (sp)+,r0\n\
168 movl (sp)+,r1\n\
169 jsb _Subyte\n" },
170
3845fbd6 171 { "_suword\n",
2a48bcf5
SL
172" movl (sp)+,r0\n\
173 movl (sp)+,r1\n\
174 jsb _Suword\n" },
175
3845fbd6 176 { "_suiword\n",
2a48bcf5
SL
177" movl (sp)+,r0\n\
178 movl (sp)+,r1\n\
179 jsb _Suword\n" },
180
3845fbd6 181 { "_setrq\n",
2a48bcf5
SL
182" movl (sp)+,r0 \n\
183 jsb _Setrq\n" },
184
3845fbd6 185 { "_remrq\n",
2a48bcf5
SL
186" movl (sp)+,r0 \n\
187 jsb _Remrq\n" },
188
3845fbd6 189 { "_swtch\n",
2a48bcf5
SL
190" movpsl -(sp)\n\
191 jsb _Swtch\n" },
192
3845fbd6 193 { "_setjmp\n",
2a48bcf5
SL
194" movl (sp)+,r0 \n\
195 jsb _Setjmp\n" },
196
3845fbd6 197 { "_longjmp\n",
2a48bcf5
SL
198" movl (sp)+,r0 \n\
199 jsb _Longjmp\n" },
200
3845fbd6 201 { "_ffs\n",
2a48bcf5
SL
202" movl (sp)+,r1\n\
203 ffs $0,$32,r1,r0 \n\
204 bneq 1f \n\
205 mnegl $1,r0 \n\
2061: \n\
207 incl r0\n" },
208
3845fbd6 209 { "_htons\n",
2a48bcf5
SL
210" rotl $8,(sp),r0\n\
211 movb 1(sp),r0\n\
212 movzwl r0,r0\n\
213 addl2 $4,sp\n" },
214
3845fbd6 215 { "_ntohs\n",
2a48bcf5
SL
216" rotl $8,(sp),r0\n\
217 movb 1(sp),r0\n\
218 movzwl r0,r0\n\
219 addl2 $4,sp\n" },
220
3845fbd6 221 { "_htonl\n",
2a48bcf5
SL
222" rotl $-8,(sp),r0\n\
223 insv r0,$16,$8,r0\n\
224 movb 3(sp),r0\n\
225 addl2 $4,sp\n" },
226
3845fbd6 227 { "_ntohl\n",
2a48bcf5
SL
228" rotl $-8,(sp),r0\n\
229 insv r0,$16,$8,r0\n\
230 movb 3(sp),r0\n\
231 addl2 $4,sp\n" },
232
3845fbd6 233 { "__insque\n",
2a48bcf5
SL
234" insque *(sp)+,*(sp)+\n" },
235
3845fbd6 236 { "__remque\n",
2a48bcf5
SL
237" remque *(sp)+,r0\n" },
238
3845fbd6 239 { "__queue\n",
2a48bcf5
SL
240" movl (sp)+,r0\n\
241 movl (sp)+,r1\n\
242 insque r1,*4(r0)\n" },
243
3845fbd6 244 { "__dequeue\n",
2a48bcf5
SL
245" movl (sp)+,r0\n\
246 remque *(r0),r0\n" },
247};
248struct pats *htbl[HSHSIZ];
249
250#define HASH(cp, hp) {\
251 hash = 0; rehash = 1; ccp = cp; \
252 do { \
253 hash *= (int)*ccp++; \
254 } while (*ccp && *ccp != '\n'); \
255 hash >>= 7; hash %= HSHSIZ; hp = &htbl[hash]; size = ccp - cp + 1; \
256}
257
258#define REHASH(hp) {\
259 hp += rehash; rehash += 2; \
260 if (hp >= &htbl[HSHSIZ]) \
261 hp -= HSHSIZ; \
262}
263
264main(argc, argv)
265 char *argv[];
266{
267 register struct pats *pp, **hp;
268 register char *cp, *ccp, *lp;
269 register int hash, rehash, size;
270 char line[BUFSIZ];
271 extern char *index();
272
273 if (argc > 1)
274 freopen(argv[1], "r", stdin);
275 if (argc > 2)
276 freopen(argv[2], "w", stdout);
277 /*
278 * Set up the hash table.
279 */
280 for (pp = ptab; pp < &ptab[sizeof (ptab)/sizeof (ptab[0])]; pp++) {
281 HASH(pp->name, hp);
282 while (*hp)
283 REHASH(hp);
284 *hp = pp;
285 }
286 /*
287 * Check each line and replace as appropriate.
288 */
289 while (fgets(line, BUFSIZ, stdin)) {
290 lp = index(line, ':');
291 for (cp = (lp != NULL) ? ++lp : line; *cp == '\t'; )
292 cp++;
293#define CALLS "calls\t"
294 if (strncmp(cp, CALLS, sizeof (CALLS) - 1) != 0) {
295 fputs(line, stdout);
296 continue;
297 }
3845fbd6
SL
298 for (cp += sizeof (CALLS) - 1; *cp && *cp != ','; cp++)
299 ;
300 if (*cp != ',') {
301 fputs(line, stdout);
302 continue;
303 }
304 cp++;
2a48bcf5
SL
305 HASH(cp, hp);
306 while (*hp) {
307 if (strncmp((*hp)->name, cp, size) == NULL) {
308 if (lp != NULL) {
309 *lp++ = '\n';
310 *lp = '\0';
311 fputs(line, stdout);
312 }
313 fputs((*hp)->replace, stdout);
314 goto nextline;
315 }
316 REHASH(hp);
317 }
318 fputs(line, stdout);
319nextline:
320 ;
321 }
322 exit(0);
323}