xref: /csrg-svn/sys/vax/inline/langpats.c (revision 16778)
1 #ifndef lint
2 static char sccsid[] = "@(#)langpats.c	1.3 (Berkeley) 07/27/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 	{ "_copyin\n",
142 "	jsb	_Copyin\n\
143 	addl2	$12,sp\n" },
144 
145 	{ "_copyout\n",
146 "	jsb	_Copyout\n\
147 	addl2	$12,sp\n" },
148 
149 	{ "_fubyte\n",
150 "	movl	(sp)+,r0\n\
151 	jsb	_Fubyte\n" },
152 
153 	{ "_fuibyte\n",
154 "	movl (sp)+,r0\n\
155 	jsb	_Fubyte\n" },
156 
157 	{ "_fuword\n",
158 "	movl (sp)+,r0\n\
159 	jsb	_Fuword\n" },
160 
161 	{ "_fuiword\n",
162 "	movl (sp)+,r0\n\
163 	jsb	_Fuword\n" },
164 
165 	{ "_subyte\n",
166 "	movl	(sp)+,r0\n\
167 	movl	(sp)+,r1\n\
168 	jsb	_Subyte\n" },
169 
170 	{ "_suibyte\n",
171 "	movl (sp)+,r0\n\
172 	movl	(sp)+,r1\n\
173 	jsb	_Subyte\n" },
174 
175 	{ "_suword\n",
176 "	movl (sp)+,r0\n\
177 	movl	(sp)+,r1\n\
178 	jsb	_Suword\n" },
179 
180 	{ "_suiword\n",
181 "	movl (sp)+,r0\n\
182 	movl	(sp)+,r1\n\
183 	jsb	_Suword\n" },
184 
185 	{ "_setrq\n",
186 "	movl	(sp)+,r0 \n\
187 	jsb	_Setrq\n" },
188 
189 	{ "_remrq\n",
190 "	movl	(sp)+,r0 \n\
191 	jsb	_Remrq\n" },
192 
193 	{ "_swtch\n",
194 "	movpsl	-(sp)\n\
195 	jsb	_Swtch\n" },
196 
197 	{ "_setjmp\n",
198 "	movl	(sp)+,r0 \n\
199 	jsb	_Setjmp\n" },
200 
201 	{ "_longjmp\n",
202 "	movl	(sp)+,r0 \n\
203 	jsb	_Longjmp\n" },
204 
205 	{ "_ffs\n",
206 "	movl	(sp)+,r1\n\
207 	ffs	$0,$32,r1,r0 \n\
208 	bneq	1f \n\
209 	mnegl	$1,r0 \n\
210 1: \n\
211 	incl	r0\n" },
212 
213 	{ "_htons\n",
214 "	rotl	$8,(sp),r0\n\
215 	movb	1(sp),r0\n\
216 	movzwl	r0,r0\n\
217 	addl2	$4,sp\n" },
218 
219 	{ "_ntohs\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 	{ "_htonl\n",
226 "	rotl	$-8,(sp),r0\n\
227 	insv	r0,$16,$8,r0\n\
228 	movb	3(sp),r0\n\
229 	addl2	$4,sp\n" },
230 
231 	{ "_ntohl\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 	{ "__insque\n",
238 "	insque	*(sp)+,*(sp)+\n" },
239 
240 	{ "__remque\n",
241 "	remque	*(sp)+,r0\n" },
242 
243 	{ "__queue\n",
244 "	movl	(sp)+,r0\n\
245 	movl	(sp)+,r1\n\
246 	insque	r1,*4(r0)\n" },
247 
248 	{ "__dequeue\n",
249 "	movl	(sp)+,r0\n\
250 	remque	*(r0),r0\n" },
251 };
252 struct pats *htbl[HSHSIZ];
253 
254 #define HASH(cp, hp) {\
255     hash = 0; rehash = 1; ccp = cp; \
256     do	{ \
257     	hash *= (int)*ccp++; \
258     } while (*ccp && *ccp != '\n'); \
259     hash >>= 7; hash %= HSHSIZ; hp = &htbl[hash]; size = ccp - cp + 1; \
260 }
261 
262 #define REHASH(hp) {\
263     hp += rehash; rehash += 2; \
264     if (hp >= &htbl[HSHSIZ]) \
265     	hp -= HSHSIZ; \
266 }
267 
268 main(argc, argv)
269 	char *argv[];
270 {
271 	register struct pats *pp, **hp;
272 	register char *cp, *ccp, *lp;
273 	register int hash, rehash, size;
274 	char line[BUFSIZ];
275 	extern char *index();
276 
277 	if (argc > 1)
278 		freopen(argv[1], "r", stdin);
279 	if (argc > 2)
280 		freopen(argv[2], "w", stdout);
281 	/*
282 	 * Set up the hash table.
283 	 */
284 	for (pp = ptab; pp < &ptab[sizeof (ptab)/sizeof (ptab[0])]; pp++) {
285 		HASH(pp->name, hp);
286 		while (*hp)
287 			REHASH(hp);
288 		*hp = pp;
289 	}
290 	/*
291 	 * Check each line and replace as appropriate.
292 	 */
293 	while (fgets(line, BUFSIZ, stdin)) {
294 		lp = index(line, ':');
295 		for (cp = (lp != NULL) ? ++lp : line; *cp == '\t'; )
296 			cp++;
297 #define	CALLS	"calls\t"
298 		if (strncmp(cp, CALLS, sizeof (CALLS) - 1) != 0) {
299 			fputs(line, stdout);
300 			continue;
301 		}
302 		for (cp += sizeof (CALLS) - 1; *cp && *cp != ','; cp++)
303 			;
304 		if (*cp != ',') {
305 			fputs(line, stdout);
306 			continue;
307 		}
308 		cp++;
309 		HASH(cp, hp);
310 		while (*hp) {
311 			if (strncmp((*hp)->name, cp, size) == NULL) {
312 				if (lp != NULL) {
313 					*lp++ = '\n';
314 					*lp = '\0';
315 					fputs(line, stdout);
316 				}
317 				fputs((*hp)->replace, stdout);
318 				goto nextline;
319 			}
320 			REHASH(hp);
321 		}
322 		fputs(line, stdout);
323 nextline:
324 		;
325 	}
326 	exit(0);
327 }
328