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