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