xref: /csrg-svn/sys/vax/inline/machdep.c (revision 16971)
116960Smckusick /* Copyright (c) 1984 Regents of the University of California */
216960Smckusick 
316960Smckusick #ifndef lint
4*16971Smckusick static char sccsid[] = "@(#)machdep.c	1.2	(Berkeley)	08/19/84";
516960Smckusick #endif not lint
616960Smckusick 
716960Smckusick #include <stdio.h>
816960Smckusick #include <ctype.h>
916960Smckusick 
1016960Smckusick /*
1116960Smckusick  * The routines in this file must be rewritten for each
1216960Smckusick  * new machine that this program is ported to.
1316960Smckusick  */
1416960Smckusick 
1516960Smckusick /*
1616960Smckusick  * Check to see if a line is a candidate for replacement.
1716960Smckusick  * Return pointer to name to be looked up in pattern table.
1816960Smckusick  */
1916960Smckusick char *
2016960Smckusick doreplaceon(cp)
2116960Smckusick 	char *cp;
2216960Smckusick {
2316960Smckusick 
2416960Smckusick 	if (bcmp(cp, "calls\t$", 7) == 0)
2516960Smckusick 		return (cp + 7);
2616960Smckusick 	return (0);
2716960Smckusick }
2816960Smckusick 
2916960Smckusick /*
3016960Smckusick  * Find the next argument to the function being expanded.
3116960Smckusick  * MACHINE DEPENDENT
3216960Smckusick  */
3316960Smckusick nextarg(argc, argv)
3416960Smckusick 	int argc;
3516960Smckusick 	char *argv[];
3616960Smckusick {
3716960Smckusick 	register char *lastarg = argv[2];
3816960Smckusick 
3916960Smckusick 	if (argc == 3 &&
4016960Smckusick 	    bcmp(argv[0], "mov", 3) == 0 &&
4116960Smckusick 	    bcmp(argv[1], "(sp)+", 6) == 0 &&
4216960Smckusick 	    lastarg[0] == 'r' && isdigit(lastarg[1]) && lastarg[2] == '\0')
4316960Smckusick 		return (lastarg[1] - '0');
4416960Smckusick 	return (-1);
4516960Smckusick }
4616960Smckusick 
4716960Smckusick /*
4816960Smckusick  * Determine whether the current line pushes an argument.
4916960Smckusick  * MACHINE DEPENDENT
5016960Smckusick  */
5116960Smckusick  ispusharg(argc, argv)
5216960Smckusick 	int argc;
5316960Smckusick 	char *argv[];
5416960Smckusick {
5516960Smckusick 
5616960Smckusick 	if (argc < 2)
5716960Smckusick 		return (0);
5816960Smckusick 	if (argc == 2 && bcmp(argv[0], "push", 4) == 0)
5916960Smckusick 		return (1);
6016960Smckusick 	if (bcmp(argv[argc - 1], "-(sp)", 6) == 0)
6116960Smckusick 		return (1);
6216960Smckusick 	return (0);
6316960Smckusick }
6416960Smckusick 
6516960Smckusick /*
6616960Smckusick  * Determine which (if any) registers are modified
6716960Smckusick  * Return register number that is modified, -1 if none are modified.
6816960Smckusick  * MACHINE DEPENDENT
6916960Smckusick  */
7016960Smckusick modifies(argc, argv)
7116960Smckusick 	int argc;
7216960Smckusick 	char *argv[];
7316960Smckusick {
7416960Smckusick 	/*
7516960Smckusick 	 * For the VAX all we care about are r0 to r5
7616960Smckusick 	 */
7716960Smckusick 	register char *lastarg = argv[argc - 1];
7816960Smckusick 
7916960Smckusick 	if (lastarg[0] == 'r' && isdigit(lastarg[1]) && lastarg[2] == '\0')
8016960Smckusick 		return (lastarg[1] - '0');
8116960Smckusick 	return (-1);
8216960Smckusick }
8316960Smckusick 
8416960Smckusick /*
8516960Smckusick  * Rewrite the instruction in (argc, argv) to store its
8616960Smckusick  * contents into arg instead of onto the stack. The new
8716960Smckusick  * instruction is placed in the buffer that is provided.
8816960Smckusick  * MACHINE DEPENDENT
8916960Smckusick  */
9016960Smckusick rewrite(instbuf, argc, argv, target)
9116960Smckusick 	char *instbuf;
9216960Smckusick 	int argc;
9316960Smckusick 	char *argv[];
9416960Smckusick 	int target;
9516960Smckusick {
9616960Smckusick 
9716960Smckusick 	switch (argc) {
9816960Smckusick 	case 0:
9916960Smckusick 		instbuf[0] = '\0';
10016960Smckusick 		fprintf("blank line to rewrite?\n");
10116960Smckusick 		return;
10216960Smckusick 	case 1:
10316960Smckusick 		sprintf(instbuf, "\t%s\n", argv[0]);
10416960Smckusick 		fprintf(stderr, "rewrite?-> %s", instbuf);
10516960Smckusick 		return;
10616960Smckusick 	case 2:
10716960Smckusick 		if (bcmp(argv[0], "push", 4) == 0) {
10816960Smckusick 			sprintf(instbuf, "\tmov%s\t%s,r%d\n",
10916960Smckusick 				&argv[0][4], argv[1], target);
11016960Smckusick 			return;
11116960Smckusick 		}
11216960Smckusick 		sprintf(instbuf, "\t%s\tr%d\n", argv[0], target);
11316960Smckusick 		return;
11416960Smckusick 	case 3:
11516960Smckusick 		sprintf(instbuf, "\t%s\t%s,r%d\n", argv[0], argv[1], target);
11616960Smckusick 		return;
11716960Smckusick 	case 4:
11816960Smckusick 		sprintf(instbuf, "\t%s\t%s,%s,r%d\n",
11916960Smckusick 			argv[0], argv[1], argv[2], target);
12016960Smckusick 		return;
121*16971Smckusick 	case 5:
122*16971Smckusick 		sprintf(instbuf, "\t%s\t%s,%s,%s,r%d\n",
123*16971Smckusick 			argv[0], argv[1], argv[2], argv[3], target);
124*16971Smckusick 		return;
12516960Smckusick 	default:
12616960Smckusick 		sprintf(instbuf, "\t%s\t%s", argv[0], argv[1]);
12716960Smckusick 		argc -= 2, argv += 2;
12816960Smckusick 		while (argc-- > 0) {
12916960Smckusick 			strcat(instbuf, ",");
13016960Smckusick 			strcat(instbuf, *argv++);
13116960Smckusick 		}
13216960Smckusick 		strcat(instbuf, "\n");
13316960Smckusick 		fprintf(stderr, "rewrite?-> %s", instbuf);
13416960Smckusick 		return;
13516960Smckusick 	}
13616960Smckusick }
137