xref: /csrg-svn/sys/vax/inline/machdep.c (revision 16960)
1*16960Smckusick /* Copyright (c) 1984 Regents of the University of California */
2*16960Smckusick 
3*16960Smckusick #ifndef lint
4*16960Smckusick static char sccsid[] = "@(#)machdep.c	1.1	(Berkeley)	08/18/84";
5*16960Smckusick #endif not lint
6*16960Smckusick 
7*16960Smckusick #include <stdio.h>
8*16960Smckusick #include <ctype.h>
9*16960Smckusick 
10*16960Smckusick /*
11*16960Smckusick  * The routines in this file must be rewritten for each
12*16960Smckusick  * new machine that this program is ported to.
13*16960Smckusick  */
14*16960Smckusick 
15*16960Smckusick /*
16*16960Smckusick  * Check to see if a line is a candidate for replacement.
17*16960Smckusick  * Return pointer to name to be looked up in pattern table.
18*16960Smckusick  */
19*16960Smckusick char *
20*16960Smckusick doreplaceon(cp)
21*16960Smckusick 	char *cp;
22*16960Smckusick {
23*16960Smckusick 
24*16960Smckusick 	if (bcmp(cp, "calls\t$", 7) == 0)
25*16960Smckusick 		return (cp + 7);
26*16960Smckusick 	return (0);
27*16960Smckusick }
28*16960Smckusick 
29*16960Smckusick /*
30*16960Smckusick  * Find the next argument to the function being expanded.
31*16960Smckusick  * MACHINE DEPENDENT
32*16960Smckusick  */
33*16960Smckusick nextarg(argc, argv)
34*16960Smckusick 	int argc;
35*16960Smckusick 	char *argv[];
36*16960Smckusick {
37*16960Smckusick 	register char *lastarg = argv[2];
38*16960Smckusick 
39*16960Smckusick 	if (argc == 3 &&
40*16960Smckusick 	    bcmp(argv[0], "mov", 3) == 0 &&
41*16960Smckusick 	    bcmp(argv[1], "(sp)+", 6) == 0 &&
42*16960Smckusick 	    lastarg[0] == 'r' && isdigit(lastarg[1]) && lastarg[2] == '\0')
43*16960Smckusick 		return (lastarg[1] - '0');
44*16960Smckusick 	return (-1);
45*16960Smckusick }
46*16960Smckusick 
47*16960Smckusick /*
48*16960Smckusick  * Determine whether the current line pushes an argument.
49*16960Smckusick  * MACHINE DEPENDENT
50*16960Smckusick  */
51*16960Smckusick  ispusharg(argc, argv)
52*16960Smckusick 	int argc;
53*16960Smckusick 	char *argv[];
54*16960Smckusick {
55*16960Smckusick 
56*16960Smckusick 	if (argc < 2)
57*16960Smckusick 		return (0);
58*16960Smckusick 	if (argc == 2 && bcmp(argv[0], "push", 4) == 0)
59*16960Smckusick 		return (1);
60*16960Smckusick 	if (bcmp(argv[argc - 1], "-(sp)", 6) == 0)
61*16960Smckusick 		return (1);
62*16960Smckusick 	return (0);
63*16960Smckusick }
64*16960Smckusick 
65*16960Smckusick /*
66*16960Smckusick  * Determine which (if any) registers are modified
67*16960Smckusick  * Return register number that is modified, -1 if none are modified.
68*16960Smckusick  * MACHINE DEPENDENT
69*16960Smckusick  */
70*16960Smckusick modifies(argc, argv)
71*16960Smckusick 	int argc;
72*16960Smckusick 	char *argv[];
73*16960Smckusick {
74*16960Smckusick 	/*
75*16960Smckusick 	 * For the VAX all we care about are r0 to r5
76*16960Smckusick 	 */
77*16960Smckusick 	register char *lastarg = argv[argc - 1];
78*16960Smckusick 
79*16960Smckusick 	if (lastarg[0] == 'r' && isdigit(lastarg[1]) && lastarg[2] == '\0')
80*16960Smckusick 		return (lastarg[1] - '0');
81*16960Smckusick 	return (-1);
82*16960Smckusick }
83*16960Smckusick 
84*16960Smckusick /*
85*16960Smckusick  * Rewrite the instruction in (argc, argv) to store its
86*16960Smckusick  * contents into arg instead of onto the stack. The new
87*16960Smckusick  * instruction is placed in the buffer that is provided.
88*16960Smckusick  * MACHINE DEPENDENT
89*16960Smckusick  */
90*16960Smckusick rewrite(instbuf, argc, argv, target)
91*16960Smckusick 	char *instbuf;
92*16960Smckusick 	int argc;
93*16960Smckusick 	char *argv[];
94*16960Smckusick 	int target;
95*16960Smckusick {
96*16960Smckusick 
97*16960Smckusick 	switch (argc) {
98*16960Smckusick 	case 0:
99*16960Smckusick 		instbuf[0] = '\0';
100*16960Smckusick 		fprintf("blank line to rewrite?\n");
101*16960Smckusick 		return;
102*16960Smckusick 	case 1:
103*16960Smckusick 		sprintf(instbuf, "\t%s\n", argv[0]);
104*16960Smckusick 		fprintf(stderr, "rewrite?-> %s", instbuf);
105*16960Smckusick 		return;
106*16960Smckusick 	case 2:
107*16960Smckusick 		if (bcmp(argv[0], "push", 4) == 0) {
108*16960Smckusick 			sprintf(instbuf, "\tmov%s\t%s,r%d\n",
109*16960Smckusick 				&argv[0][4], argv[1], target);
110*16960Smckusick 			return;
111*16960Smckusick 		}
112*16960Smckusick 		sprintf(instbuf, "\t%s\tr%d\n", argv[0], target);
113*16960Smckusick 		return;
114*16960Smckusick 	case 3:
115*16960Smckusick 		sprintf(instbuf, "\t%s\t%s,r%d\n", argv[0], argv[1], target);
116*16960Smckusick 		return;
117*16960Smckusick 	case 4:
118*16960Smckusick 		sprintf(instbuf, "\t%s\t%s,%s,r%d\n",
119*16960Smckusick 			argv[0], argv[1], argv[2], target);
120*16960Smckusick 		return;
121*16960Smckusick 	default:
122*16960Smckusick 		sprintf(instbuf, "\t%s\t%s", argv[0], argv[1]);
123*16960Smckusick 		argc -= 2, argv += 2;
124*16960Smckusick 		while (argc-- > 0) {
125*16960Smckusick 			strcat(instbuf, ",");
126*16960Smckusick 			strcat(instbuf, *argv++);
127*16960Smckusick 		}
128*16960Smckusick 		strcat(instbuf, "\n");
129*16960Smckusick 		fprintf(stderr, "rewrite?-> %s", instbuf);
130*16960Smckusick 		return;
131*16960Smckusick 	}
132*16960Smckusick }
133