13e12c5d1SDavid du Colombier #include <ctype.h>
27dd7cddfSDavid du Colombier #define EXTERN
33e12c5d1SDavid du Colombier #include "a.h"
43e12c5d1SDavid du Colombier #include "y.tab.h"
53e12c5d1SDavid du Colombier
63e12c5d1SDavid du Colombier void
main(int argc,char * argv[])73e12c5d1SDavid du Colombier main(int argc, char *argv[])
83e12c5d1SDavid du Colombier {
97dd7cddfSDavid du Colombier char *p;
107dd7cddfSDavid du Colombier int nout, nproc, status, i, c;
113e12c5d1SDavid du Colombier
123e12c5d1SDavid du Colombier thechar = 'k';
133e12c5d1SDavid du Colombier thestring = "sparc";
143e12c5d1SDavid du Colombier memset(debug, 0, sizeof(debug));
153e12c5d1SDavid du Colombier cinit();
163e12c5d1SDavid du Colombier outfile = 0;
173e12c5d1SDavid du Colombier include[ninclude++] = ".";
183e12c5d1SDavid du Colombier ARGBEGIN {
193e12c5d1SDavid du Colombier default:
203e12c5d1SDavid du Colombier c = ARGC();
213e12c5d1SDavid du Colombier if(c >= 0 || c < sizeof(debug))
223e12c5d1SDavid du Colombier debug[c] = 1;
233e12c5d1SDavid du Colombier break;
243e12c5d1SDavid du Colombier
253e12c5d1SDavid du Colombier case 'o':
263e12c5d1SDavid du Colombier outfile = ARGF();
273e12c5d1SDavid du Colombier break;
283e12c5d1SDavid du Colombier
293e12c5d1SDavid du Colombier case 'D':
303e12c5d1SDavid du Colombier p = ARGF();
313e12c5d1SDavid du Colombier if(p)
32219b2ee8SDavid du Colombier Dlist[nDlist++] = p;
333e12c5d1SDavid du Colombier break;
343e12c5d1SDavid du Colombier
353e12c5d1SDavid du Colombier case 'I':
363e12c5d1SDavid du Colombier p = ARGF();
377dd7cddfSDavid du Colombier setinclude(p);
383e12c5d1SDavid du Colombier break;
393e12c5d1SDavid du Colombier } ARGEND
403e12c5d1SDavid du Colombier if(*argv == 0) {
413e12c5d1SDavid du Colombier print("usage: %ca [-options] file.s\n", thechar);
423e12c5d1SDavid du Colombier errorexit();
433e12c5d1SDavid du Colombier }
447dd7cddfSDavid du Colombier if(argc > 1 && systemtype(Windows)){
457dd7cddfSDavid du Colombier print("can't assemble multiple files on windows\n");
467dd7cddfSDavid du Colombier errorexit();
477dd7cddfSDavid du Colombier }
487dd7cddfSDavid du Colombier if(argc > 1 && !systemtype(Windows)) {
497dd7cddfSDavid du Colombier nproc = 1;
503e12c5d1SDavid du Colombier if(p = getenv("NPROC"))
517dd7cddfSDavid du Colombier nproc = atol(p); /* */
523e12c5d1SDavid du Colombier c = 0;
533e12c5d1SDavid du Colombier nout = 0;
543e12c5d1SDavid du Colombier for(;;) {
553e12c5d1SDavid du Colombier while(nout < nproc && argc > 0) {
567dd7cddfSDavid du Colombier i = myfork();
573e12c5d1SDavid du Colombier if(i < 0) {
583e12c5d1SDavid du Colombier i = mywait(&status);
593e12c5d1SDavid du Colombier if(i < 0)
603e12c5d1SDavid du Colombier errorexit();
613e12c5d1SDavid du Colombier if(status)
623e12c5d1SDavid du Colombier c++;
633e12c5d1SDavid du Colombier nout--;
643e12c5d1SDavid du Colombier continue;
653e12c5d1SDavid du Colombier }
663e12c5d1SDavid du Colombier if(i == 0) {
673e12c5d1SDavid du Colombier print("%s:\n", *argv);
687dd7cddfSDavid du Colombier if(assemble(*argv))
697dd7cddfSDavid du Colombier errorexit();
707dd7cddfSDavid du Colombier exits(0);
713e12c5d1SDavid du Colombier }
723e12c5d1SDavid du Colombier nout++;
733e12c5d1SDavid du Colombier argc--;
743e12c5d1SDavid du Colombier argv++;
753e12c5d1SDavid du Colombier }
763e12c5d1SDavid du Colombier i = mywait(&status);
773e12c5d1SDavid du Colombier if(i < 0) {
783e12c5d1SDavid du Colombier if(c)
793e12c5d1SDavid du Colombier errorexit();
803e12c5d1SDavid du Colombier exits(0);
813e12c5d1SDavid du Colombier }
823e12c5d1SDavid du Colombier if(status)
833e12c5d1SDavid du Colombier c++;
843e12c5d1SDavid du Colombier nout--;
853e12c5d1SDavid du Colombier }
863e12c5d1SDavid du Colombier }
877dd7cddfSDavid du Colombier if(assemble(argv[0]))
887dd7cddfSDavid du Colombier errorexit();
897dd7cddfSDavid du Colombier exits(0);
907dd7cddfSDavid du Colombier }
913e12c5d1SDavid du Colombier
927dd7cddfSDavid du Colombier int
assemble(char * file)937dd7cddfSDavid du Colombier assemble(char *file)
947dd7cddfSDavid du Colombier {
957dd7cddfSDavid du Colombier char ofile[100], incfile[20], *p;
967dd7cddfSDavid du Colombier int i, of;
977dd7cddfSDavid du Colombier
987dd7cddfSDavid du Colombier strcpy(ofile, file);
997dd7cddfSDavid du Colombier p = utfrrune(ofile, pathchar());
1007dd7cddfSDavid du Colombier if(p) {
1013e12c5d1SDavid du Colombier include[0] = ofile;
1023e12c5d1SDavid du Colombier *p++ = 0;
1033e12c5d1SDavid du Colombier } else
1043e12c5d1SDavid du Colombier p = ofile;
1053e12c5d1SDavid du Colombier if(outfile == 0) {
1063e12c5d1SDavid du Colombier outfile = p;
1077dd7cddfSDavid du Colombier if(outfile){
1087dd7cddfSDavid du Colombier p = utfrrune(outfile, '.');
1097dd7cddfSDavid du Colombier if(p)
1103e12c5d1SDavid du Colombier if(p[1] == 's' && p[2] == 0)
1113e12c5d1SDavid du Colombier p[0] = 0;
1127dd7cddfSDavid du Colombier p = utfrune(outfile, 0);
1133e12c5d1SDavid du Colombier p[0] = '.';
1143e12c5d1SDavid du Colombier p[1] = thechar;
1153e12c5d1SDavid du Colombier p[2] = 0;
1167dd7cddfSDavid du Colombier } else
1177dd7cddfSDavid du Colombier outfile = "/dev/null";
1183e12c5d1SDavid du Colombier }
1197dd7cddfSDavid du Colombier p = getenv("INCLUDE");
1207dd7cddfSDavid du Colombier if(p) {
1217dd7cddfSDavid du Colombier setinclude(p);
1223e12c5d1SDavid du Colombier } else {
1237dd7cddfSDavid du Colombier if(systemtype(Plan9)) {
1247dd7cddfSDavid du Colombier sprint(incfile,"/%s/include", thestring);
1257dd7cddfSDavid du Colombier setinclude(strdup(incfile));
1263e12c5d1SDavid du Colombier }
1277dd7cddfSDavid du Colombier }
1287dd7cddfSDavid du Colombier
1293e12c5d1SDavid du Colombier of = mycreat(outfile, 0664);
1303e12c5d1SDavid du Colombier if(of < 0) {
1313e12c5d1SDavid du Colombier yyerror("%ca: cannot create %s", thechar, outfile);
1323e12c5d1SDavid du Colombier errorexit();
1333e12c5d1SDavid du Colombier }
1343e12c5d1SDavid du Colombier Binit(&obuf, of, OWRITE);
1353e12c5d1SDavid du Colombier
1363e12c5d1SDavid du Colombier pass = 1;
1377dd7cddfSDavid du Colombier pinit(file);
138219b2ee8SDavid du Colombier for(i=0; i<nDlist; i++)
139219b2ee8SDavid du Colombier dodefine(Dlist[i]);
1403e12c5d1SDavid du Colombier yyparse();
1413e12c5d1SDavid du Colombier if(nerrors) {
1423e12c5d1SDavid du Colombier cclean();
1437dd7cddfSDavid du Colombier return nerrors;
1443e12c5d1SDavid du Colombier }
1453e12c5d1SDavid du Colombier
1463e12c5d1SDavid du Colombier pass = 2;
1473e12c5d1SDavid du Colombier outhist();
1487dd7cddfSDavid du Colombier pinit(file);
149219b2ee8SDavid du Colombier for(i=0; i<nDlist; i++)
150219b2ee8SDavid du Colombier dodefine(Dlist[i]);
1513e12c5d1SDavid du Colombier yyparse();
1523e12c5d1SDavid du Colombier cclean();
1537dd7cddfSDavid du Colombier return nerrors;
1543e12c5d1SDavid du Colombier }
1553e12c5d1SDavid du Colombier
1563e12c5d1SDavid du Colombier struct
1573e12c5d1SDavid du Colombier {
1583e12c5d1SDavid du Colombier char *name;
1593e12c5d1SDavid du Colombier ushort type;
1603e12c5d1SDavid du Colombier ushort value;
1613e12c5d1SDavid du Colombier } itab[] =
1623e12c5d1SDavid du Colombier {
1633e12c5d1SDavid du Colombier "SP", LSP, D_AUTO,
1643e12c5d1SDavid du Colombier "SB", LSB, D_EXTERN,
1653e12c5d1SDavid du Colombier "FP", LFP, D_PARAM,
1663e12c5d1SDavid du Colombier "PC", LPC, D_BRANCH,
1673e12c5d1SDavid du Colombier
1683e12c5d1SDavid du Colombier "FSR", LFSR, D_FSR,
1693e12c5d1SDavid du Colombier "CSR", LFSR, D_CSR,
1703e12c5d1SDavid du Colombier
1713e12c5d1SDavid du Colombier "FQ", LFPQ, D_FPQ,
1723e12c5d1SDavid du Colombier "CQ", LFPQ, D_CPQ,
1733e12c5d1SDavid du Colombier
1743e12c5d1SDavid du Colombier "Y", LPSR, D_Y,
1753e12c5d1SDavid du Colombier "PSR", LPSR, D_PSR,
1763e12c5d1SDavid du Colombier "WIM", LPSR, D_WIM,
1773e12c5d1SDavid du Colombier "TBR", LPSR, D_TBR,
1783e12c5d1SDavid du Colombier
1793e12c5d1SDavid du Colombier "R", LR, 0,
1803e12c5d1SDavid du Colombier "R0", LREG, 0,
1813e12c5d1SDavid du Colombier "R1", LREG, 1,
1823e12c5d1SDavid du Colombier "R2", LREG, 2,
1833e12c5d1SDavid du Colombier "R3", LREG, 3,
1843e12c5d1SDavid du Colombier "R4", LREG, 4,
1853e12c5d1SDavid du Colombier "R5", LREG, 5,
1863e12c5d1SDavid du Colombier "R6", LREG, 6,
1873e12c5d1SDavid du Colombier "R7", LREG, 7,
1883e12c5d1SDavid du Colombier "R8", LREG, 8,
1893e12c5d1SDavid du Colombier "R9", LREG, 9,
1903e12c5d1SDavid du Colombier "R10", LREG, 10,
1913e12c5d1SDavid du Colombier "R11", LREG, 11,
1923e12c5d1SDavid du Colombier "R12", LREG, 12,
1933e12c5d1SDavid du Colombier "R13", LREG, 13,
1943e12c5d1SDavid du Colombier "R14", LREG, 14,
1953e12c5d1SDavid du Colombier "R15", LREG, 15,
1963e12c5d1SDavid du Colombier "R16", LREG, 16,
1973e12c5d1SDavid du Colombier "R17", LREG, 17,
1983e12c5d1SDavid du Colombier "R18", LREG, 18,
1993e12c5d1SDavid du Colombier "R19", LREG, 19,
2003e12c5d1SDavid du Colombier "R20", LREG, 20,
2013e12c5d1SDavid du Colombier "R21", LREG, 21,
2023e12c5d1SDavid du Colombier "R22", LREG, 22,
2033e12c5d1SDavid du Colombier "R23", LREG, 23,
2043e12c5d1SDavid du Colombier "R24", LREG, 24,
2053e12c5d1SDavid du Colombier "R25", LREG, 25,
2063e12c5d1SDavid du Colombier "R26", LREG, 26,
2073e12c5d1SDavid du Colombier "R27", LREG, 27,
2083e12c5d1SDavid du Colombier "R28", LREG, 28,
2093e12c5d1SDavid du Colombier "R29", LREG, 29,
2103e12c5d1SDavid du Colombier "R30", LREG, 30,
2113e12c5d1SDavid du Colombier "R31", LREG, 31,
2123e12c5d1SDavid du Colombier
2133e12c5d1SDavid du Colombier "C", LC, 0,
2143e12c5d1SDavid du Colombier "C0", LCREG, 0,
2153e12c5d1SDavid du Colombier "C1", LCREG, 1,
2163e12c5d1SDavid du Colombier "C2", LCREG, 2,
2173e12c5d1SDavid du Colombier "C3", LCREG, 3,
2183e12c5d1SDavid du Colombier "C4", LCREG, 4,
2193e12c5d1SDavid du Colombier "C5", LCREG, 5,
2203e12c5d1SDavid du Colombier "C6", LCREG, 6,
2213e12c5d1SDavid du Colombier "C7", LCREG, 7,
2223e12c5d1SDavid du Colombier "C8", LCREG, 8,
2233e12c5d1SDavid du Colombier "C9", LCREG, 9,
2243e12c5d1SDavid du Colombier "C10", LCREG, 10,
2253e12c5d1SDavid du Colombier "C11", LCREG, 11,
2263e12c5d1SDavid du Colombier "C12", LCREG, 12,
2273e12c5d1SDavid du Colombier "C13", LCREG, 13,
2283e12c5d1SDavid du Colombier "C14", LCREG, 14,
2293e12c5d1SDavid du Colombier "C15", LCREG, 15,
2303e12c5d1SDavid du Colombier "C16", LCREG, 16,
2313e12c5d1SDavid du Colombier "C17", LCREG, 17,
2323e12c5d1SDavid du Colombier "C18", LCREG, 18,
2333e12c5d1SDavid du Colombier "C19", LCREG, 19,
2343e12c5d1SDavid du Colombier "C20", LCREG, 20,
2353e12c5d1SDavid du Colombier "C21", LCREG, 21,
2363e12c5d1SDavid du Colombier "C22", LCREG, 22,
2373e12c5d1SDavid du Colombier "C23", LCREG, 23,
2383e12c5d1SDavid du Colombier "C24", LCREG, 24,
2393e12c5d1SDavid du Colombier "C25", LCREG, 25,
2403e12c5d1SDavid du Colombier "C26", LCREG, 26,
2413e12c5d1SDavid du Colombier "C27", LCREG, 27,
2423e12c5d1SDavid du Colombier "C28", LCREG, 28,
2433e12c5d1SDavid du Colombier "C29", LCREG, 29,
2443e12c5d1SDavid du Colombier "C30", LCREG, 30,
2453e12c5d1SDavid du Colombier "C31", LCREG, 31,
2463e12c5d1SDavid du Colombier
2473e12c5d1SDavid du Colombier "F", LF, 0,
2483e12c5d1SDavid du Colombier "F0", LFREG, 0,
2493e12c5d1SDavid du Colombier "F2", LFREG, 2,
2503e12c5d1SDavid du Colombier "F4", LFREG, 4,
2513e12c5d1SDavid du Colombier "F6", LFREG, 6,
2523e12c5d1SDavid du Colombier "F8", LFREG, 8,
2533e12c5d1SDavid du Colombier "F10", LFREG, 10,
2543e12c5d1SDavid du Colombier "F12", LFREG, 12,
2553e12c5d1SDavid du Colombier "F14", LFREG, 14,
2563e12c5d1SDavid du Colombier "F16", LFREG, 16,
2573e12c5d1SDavid du Colombier "F18", LFREG, 18,
2583e12c5d1SDavid du Colombier "F20", LFREG, 20,
2593e12c5d1SDavid du Colombier "F22", LFREG, 22,
2603e12c5d1SDavid du Colombier "F24", LFREG, 24,
2613e12c5d1SDavid du Colombier "F26", LFREG, 26,
2623e12c5d1SDavid du Colombier "F28", LFREG, 28,
2633e12c5d1SDavid du Colombier "F30", LFREG, 30,
2643e12c5d1SDavid du Colombier "F1", LFREG, 1,
2653e12c5d1SDavid du Colombier "F3", LFREG, 3,
2663e12c5d1SDavid du Colombier "F5", LFREG, 5,
2673e12c5d1SDavid du Colombier "F7", LFREG, 7,
2683e12c5d1SDavid du Colombier "F9", LFREG, 9,
2693e12c5d1SDavid du Colombier "F11", LFREG, 11,
2703e12c5d1SDavid du Colombier "F13", LFREG, 13,
2713e12c5d1SDavid du Colombier "F15", LFREG, 15,
2723e12c5d1SDavid du Colombier "F17", LFREG, 17,
2733e12c5d1SDavid du Colombier "F19", LFREG, 19,
2743e12c5d1SDavid du Colombier "F21", LFREG, 21,
2753e12c5d1SDavid du Colombier "F23", LFREG, 23,
2763e12c5d1SDavid du Colombier "F25", LFREG, 25,
2773e12c5d1SDavid du Colombier "F27", LFREG, 27,
2783e12c5d1SDavid du Colombier "F29", LFREG, 29,
2793e12c5d1SDavid du Colombier "F31", LFREG, 31,
2803e12c5d1SDavid du Colombier
2813e12c5d1SDavid du Colombier "ADD", LADDW, AADD,
2823e12c5d1SDavid du Colombier "ADDCC", LADDW, AADDCC,
2833e12c5d1SDavid du Colombier "ADDX", LADDW, AADDX,
2843e12c5d1SDavid du Colombier "ADDXCC", LADDW, AADDXCC,
2853e12c5d1SDavid du Colombier "AND", LADDW, AAND,
2863e12c5d1SDavid du Colombier "ANDCC", LADDW, AANDCC,
2873e12c5d1SDavid du Colombier "ANDN", LADDW, AANDN,
2883e12c5d1SDavid du Colombier "ANDNCC", LADDW, AANDNCC,
2893e12c5d1SDavid du Colombier "BA", LBRA, ABA,
2903e12c5d1SDavid du Colombier "BCC", LBRA, ABCC,
2913e12c5d1SDavid du Colombier "BCS", LBRA, ABCS,
2923e12c5d1SDavid du Colombier "BE", LBRA, ABE,
2933e12c5d1SDavid du Colombier "BG", LBRA, ABG,
2943e12c5d1SDavid du Colombier "BGE", LBRA, ABGE,
2953e12c5d1SDavid du Colombier "BGU", LBRA, ABGU,
2963e12c5d1SDavid du Colombier "BL", LBRA, ABL,
2973e12c5d1SDavid du Colombier "BLE", LBRA, ABLE,
2983e12c5d1SDavid du Colombier "BLEU", LBRA, ABLEU,
2993e12c5d1SDavid du Colombier "BN", LBRA, ABN,
3003e12c5d1SDavid du Colombier "BNE", LBRA, ABNE,
3013e12c5d1SDavid du Colombier "BNEG", LBRA, ABNEG,
3023e12c5d1SDavid du Colombier "BPOS", LBRA, ABPOS,
3033e12c5d1SDavid du Colombier "BVC", LBRA, ABVC,
3043e12c5d1SDavid du Colombier "BVS", LBRA, ABVS,
3053e12c5d1SDavid du Colombier "CB0", LBRA, ACB0,
3063e12c5d1SDavid du Colombier "CB01", LBRA, ACB01,
3073e12c5d1SDavid du Colombier "CB012", LBRA, ACB012,
3083e12c5d1SDavid du Colombier "CB013", LBRA, ACB013,
3093e12c5d1SDavid du Colombier "CB02", LBRA, ACB02,
3103e12c5d1SDavid du Colombier "CB023", LBRA, ACB023,
3113e12c5d1SDavid du Colombier "CB03", LBRA, ACB03,
3123e12c5d1SDavid du Colombier "CB1", LBRA, ACB1,
3133e12c5d1SDavid du Colombier "CB12", LBRA, ACB12,
3143e12c5d1SDavid du Colombier "CB123", LBRA, ACB123,
3153e12c5d1SDavid du Colombier "CB13", LBRA, ACB13,
3163e12c5d1SDavid du Colombier "CB2", LBRA, ACB2,
3173e12c5d1SDavid du Colombier "CB23", LBRA, ACB23,
3183e12c5d1SDavid du Colombier "CB3", LBRA, ACB3,
3193e12c5d1SDavid du Colombier "CBA", LBRA, ACBA,
3203e12c5d1SDavid du Colombier "CBN", LBRA, ACBN,
3213e12c5d1SDavid du Colombier "CMP", LCMP, ACMP,
3223e12c5d1SDavid du Colombier "CPOP1", LCPOP, ACPOP1,
3233e12c5d1SDavid du Colombier "CPOP2", LCPOP, ACPOP2,
3243e12c5d1SDavid du Colombier "DATA", LDATA, ADATA,
3253e12c5d1SDavid du Colombier "DIV", LADDW, ADIV,
3263e12c5d1SDavid du Colombier "DIVL", LADDW, ADIVL,
3273e12c5d1SDavid du Colombier "END", LEND, AEND,
3283e12c5d1SDavid du Colombier "FABSD", LFCONV, AFABSD,
3293e12c5d1SDavid du Colombier "FABSF", LFCONV, AFABSF,
3303e12c5d1SDavid du Colombier "FABSX", LFCONV, AFABSX,
3313e12c5d1SDavid du Colombier "FADDD", LFADD, AFADDD,
3323e12c5d1SDavid du Colombier "FADDF", LFADD, AFADDF,
3333e12c5d1SDavid du Colombier "FADDX", LFADD, AFADDX,
3343e12c5d1SDavid du Colombier "FBA", LBRA, AFBA,
3353e12c5d1SDavid du Colombier "FBE", LBRA, AFBE,
3363e12c5d1SDavid du Colombier "FBG", LBRA, AFBG,
3373e12c5d1SDavid du Colombier "FBGE", LBRA, AFBGE,
3383e12c5d1SDavid du Colombier "FBL", LBRA, AFBL,
3393e12c5d1SDavid du Colombier "FBLE", LBRA, AFBLE,
3403e12c5d1SDavid du Colombier "FBLG", LBRA, AFBLG,
3413e12c5d1SDavid du Colombier "FBN", LBRA, AFBN,
3423e12c5d1SDavid du Colombier "FBNE", LBRA, AFBNE,
3433e12c5d1SDavid du Colombier "FBO", LBRA, AFBO,
3443e12c5d1SDavid du Colombier "FBU", LBRA, AFBU,
3453e12c5d1SDavid du Colombier "FBUE", LBRA, AFBUE,
3463e12c5d1SDavid du Colombier "FBUG", LBRA, AFBUG,
3473e12c5d1SDavid du Colombier "FBUGE", LBRA, AFBUGE,
3483e12c5d1SDavid du Colombier "FBUL", LBRA, AFBUL,
3493e12c5d1SDavid du Colombier "FBULE", LBRA, AFBULE,
3503e12c5d1SDavid du Colombier "FCMPD", LFADD, AFCMPD,
3513e12c5d1SDavid du Colombier "FCMPED", LFADD, AFCMPED,
3523e12c5d1SDavid du Colombier "FCMPEF", LFADD, AFCMPEF,
3533e12c5d1SDavid du Colombier "FCMPEX", LFADD, AFCMPEX,
3543e12c5d1SDavid du Colombier "FCMPF", LFADD, AFCMPF,
3553e12c5d1SDavid du Colombier "FCMPX", LFADD, AFCMPX,
3563e12c5d1SDavid du Colombier "FDIVD", LFADD, AFDIVD,
3573e12c5d1SDavid du Colombier "FDIVF", LFADD, AFDIVF,
3583e12c5d1SDavid du Colombier "FDIVX", LFADD, AFDIVX,
3593e12c5d1SDavid du Colombier "FMOVD", LFMOV, AFMOVD,
3603e12c5d1SDavid du Colombier "FMOVDF", LFCONV, AFMOVDF,
3613e12c5d1SDavid du Colombier "FMOVDW", LFCONV, AFMOVDW,
3623e12c5d1SDavid du Colombier "FMOVDX", LFCONV, AFMOVDX,
3633e12c5d1SDavid du Colombier "FMOVF", LFMOV, AFMOVF,
3643e12c5d1SDavid du Colombier "FMOVFD", LFCONV, AFMOVFD,
3653e12c5d1SDavid du Colombier "FMOVFW", LFCONV, AFMOVFW,
3663e12c5d1SDavid du Colombier "FMOVFX", LFCONV, AFMOVFX,
3673e12c5d1SDavid du Colombier "FMOVWD", LFCONV, AFMOVWD,
3683e12c5d1SDavid du Colombier "FMOVWF", LFCONV, AFMOVWF,
3693e12c5d1SDavid du Colombier "FMOVWX", LFCONV, AFMOVWX,
3703e12c5d1SDavid du Colombier "FMOVX", LFCONV, AFMOVX,
3713e12c5d1SDavid du Colombier "FMOVXD", LFCONV, AFMOVXD,
3723e12c5d1SDavid du Colombier "FMOVXF", LFCONV, AFMOVXF,
3733e12c5d1SDavid du Colombier "FMOVXW", LFCONV, AFMOVXW,
3743e12c5d1SDavid du Colombier "FMULD", LFADD, AFMULD,
3753e12c5d1SDavid du Colombier "FMULF", LFADD, AFMULF,
3763e12c5d1SDavid du Colombier "FMULX", LFADD, AFMULX,
3773e12c5d1SDavid du Colombier "FNEGD", LFCONV, AFNEGD,
3783e12c5d1SDavid du Colombier "FNEGF", LFCONV, AFNEGF,
3793e12c5d1SDavid du Colombier "FNEGX", LFCONV, AFNEGX,
3803e12c5d1SDavid du Colombier "FSQRTD", LFCONV, AFSQRTD,
3813e12c5d1SDavid du Colombier "FSQRTF", LFCONV, AFSQRTF,
3823e12c5d1SDavid du Colombier "FSQRTX", LFCONV, AFSQRTX,
3833e12c5d1SDavid du Colombier "FSUBD", LFADD, AFSUBD,
3843e12c5d1SDavid du Colombier "FSUBF", LFADD, AFSUBF,
3853e12c5d1SDavid du Colombier "FSUBX", LFADD, AFSUBX,
3863e12c5d1SDavid du Colombier "GLOBL", LTEXT, AGLOBL,
3873e12c5d1SDavid du Colombier "IFLUSH", LFLUSH, AIFLUSH,
3883e12c5d1SDavid du Colombier "JMPL", LJMPL, AJMPL,
3893e12c5d1SDavid du Colombier "JMP", LJMPL, AJMP,
3903e12c5d1SDavid du Colombier "MOD", LADDW, AMOD,
3913e12c5d1SDavid du Colombier "MODL", LADDW, AMODL,
3923e12c5d1SDavid du Colombier "MOVB", LMOVB, AMOVB,
3933e12c5d1SDavid du Colombier "MOVBU", LMOVB, AMOVBU,
3943e12c5d1SDavid du Colombier "MOVD", LMOVD, AMOVD,
3953e12c5d1SDavid du Colombier "MOVH", LMOVB, AMOVH,
3963e12c5d1SDavid du Colombier "MOVHU", LMOVB, AMOVHU,
3973e12c5d1SDavid du Colombier "MOVW", LMOVW, AMOVW,
3983e12c5d1SDavid du Colombier "MUL", LADDW, AMUL,
3993e12c5d1SDavid du Colombier "MULSCC", LADDW, AMULSCC,
4003e12c5d1SDavid du Colombier "NOP", LNOP, ANOP,
4013e12c5d1SDavid du Colombier "OR", LADDW, AOR,
4023e12c5d1SDavid du Colombier "ORCC", LADDW, AORCC,
4033e12c5d1SDavid du Colombier "ORN", LADDW, AORN,
4043e12c5d1SDavid du Colombier "ORNCC", LADDW, AORNCC,
4053e12c5d1SDavid du Colombier "RESTORE", LADDW, ARESTORE,
4063e12c5d1SDavid du Colombier "RETT", LRETT, ARETT,
4073e12c5d1SDavid du Colombier "RETURN", LRETRN, ARETURN,
4083e12c5d1SDavid du Colombier "SAVE", LADDW, ASAVE,
4093e12c5d1SDavid du Colombier "SLL", LADDW, ASLL,
4103e12c5d1SDavid du Colombier "SRA", LADDW, ASRA,
4113e12c5d1SDavid du Colombier "SRL", LADDW, ASRL,
4123e12c5d1SDavid du Colombier "SUB", LADDW, ASUB,
4133e12c5d1SDavid du Colombier "SUBCC", LADDW, ASUBCC,
4143e12c5d1SDavid du Colombier "SUBX", LADDW, ASUBX,
4153e12c5d1SDavid du Colombier "SUBXCC", LADDW, ASUBXCC,
4163e12c5d1SDavid du Colombier "SWAP", LSWAP, ASWAP,
4173e12c5d1SDavid du Colombier "TA", LTRAP, ATA,
4183e12c5d1SDavid du Colombier "TADDCC", LADDW, ATADDCC,
4193e12c5d1SDavid du Colombier "TADDCCTV", LADDW, ATADDCCTV,
4203e12c5d1SDavid du Colombier "TAS", LSWAP, ATAS,
4213e12c5d1SDavid du Colombier "TCC", LTRAP, ATCC,
4223e12c5d1SDavid du Colombier "TCS", LTRAP, ATCS,
4233e12c5d1SDavid du Colombier "TE", LTRAP, ATE,
4243e12c5d1SDavid du Colombier "TEXT", LTEXT, ATEXT,
4253e12c5d1SDavid du Colombier "TG", LTRAP, ATG,
4263e12c5d1SDavid du Colombier "TGE", LTRAP, ATGE,
4273e12c5d1SDavid du Colombier "TGU", LTRAP, ATGU,
4283e12c5d1SDavid du Colombier "TL", LTRAP, ATL,
4293e12c5d1SDavid du Colombier "TLE", LTRAP, ATLE,
4303e12c5d1SDavid du Colombier "TLEU", LTRAP, ATLEU,
4313e12c5d1SDavid du Colombier "TN", LTRAP, ATN,
4323e12c5d1SDavid du Colombier "TNE", LTRAP, ATNE,
4333e12c5d1SDavid du Colombier "TNEG", LTRAP, ATNEG,
4343e12c5d1SDavid du Colombier "TPOS", LTRAP, ATPOS,
4353e12c5d1SDavid du Colombier "TSUBCC", LADDW, ATSUBCC,
4363e12c5d1SDavid du Colombier "TSUBCCTV", LADDW, ATSUBCCTV,
4373e12c5d1SDavid du Colombier "TVC", LTRAP, ATVC,
4383e12c5d1SDavid du Colombier "TVS", LTRAP, ATVS,
4393e12c5d1SDavid du Colombier "UNIMP", LUNIMP, AUNIMP,
4403e12c5d1SDavid du Colombier "WORD", LUNIMP, AWORD,
4413e12c5d1SDavid du Colombier "XNOR", LADDW, AXNOR,
4423e12c5d1SDavid du Colombier "XNORCC", LADDW, AXNORCC,
4433e12c5d1SDavid du Colombier "XOR", LXORW, AXOR,
4443e12c5d1SDavid du Colombier "XORCC", LADDW, AXORCC,
4453e12c5d1SDavid du Colombier
446219b2ee8SDavid du Colombier "SCHED", LSCHED, 0,
447219b2ee8SDavid du Colombier "NOSCHED", LSCHED, 0x80,
448219b2ee8SDavid du Colombier
4493e12c5d1SDavid du Colombier 0
4503e12c5d1SDavid du Colombier };
4513e12c5d1SDavid du Colombier
4523e12c5d1SDavid du Colombier void
cinit(void)4533e12c5d1SDavid du Colombier cinit(void)
4543e12c5d1SDavid du Colombier {
4553e12c5d1SDavid du Colombier Sym *s;
4563e12c5d1SDavid du Colombier int i;
4573e12c5d1SDavid du Colombier
4583e12c5d1SDavid du Colombier nullgen.sym = S;
4593e12c5d1SDavid du Colombier nullgen.offset = 0;
4603e12c5d1SDavid du Colombier nullgen.type = D_NONE;
4613e12c5d1SDavid du Colombier nullgen.name = D_NONE;
4623e12c5d1SDavid du Colombier nullgen.reg = NREG;
4633e12c5d1SDavid du Colombier nullgen.xreg = NREG;
4643e12c5d1SDavid du Colombier if(FPCHIP)
4653e12c5d1SDavid du Colombier nullgen.dval = 0;
4663e12c5d1SDavid du Colombier for(i=0; i<sizeof(nullgen.sval); i++)
4673e12c5d1SDavid du Colombier nullgen.sval[i] = 0;
4683e12c5d1SDavid du Colombier
4693e12c5d1SDavid du Colombier nerrors = 0;
4703e12c5d1SDavid du Colombier iostack = I;
4713e12c5d1SDavid du Colombier iofree = I;
4723e12c5d1SDavid du Colombier peekc = IGN;
4733e12c5d1SDavid du Colombier nhunk = 0;
4743e12c5d1SDavid du Colombier for(i=0; i<NHASH; i++)
4753e12c5d1SDavid du Colombier hash[i] = S;
4763e12c5d1SDavid du Colombier for(i=0; itab[i].name; i++) {
4773e12c5d1SDavid du Colombier s = slookup(itab[i].name);
4783e12c5d1SDavid du Colombier s->type = itab[i].type;
4793e12c5d1SDavid du Colombier s->value = itab[i].value;
4803e12c5d1SDavid du Colombier }
481219b2ee8SDavid du Colombier
4827dd7cddfSDavid du Colombier pathname = allocn(pathname, 0, 100);
4837dd7cddfSDavid du Colombier if(mygetwd(pathname, 99) == 0) {
4847dd7cddfSDavid du Colombier pathname = allocn(pathname, 100, 900);
4857dd7cddfSDavid du Colombier if(mygetwd(pathname, 999) == 0)
486219b2ee8SDavid du Colombier strcpy(pathname, "/???");
487219b2ee8SDavid du Colombier }
4883e12c5d1SDavid du Colombier }
4893e12c5d1SDavid du Colombier
4903e12c5d1SDavid du Colombier void
syminit(Sym * s)4913e12c5d1SDavid du Colombier syminit(Sym *s)
4923e12c5d1SDavid du Colombier {
4933e12c5d1SDavid du Colombier
4943e12c5d1SDavid du Colombier s->type = LNAME;
4953e12c5d1SDavid du Colombier s->value = 0;
4963e12c5d1SDavid du Colombier }
4973e12c5d1SDavid du Colombier
4983e12c5d1SDavid du Colombier void
cclean(void)4993e12c5d1SDavid du Colombier cclean(void)
5003e12c5d1SDavid du Colombier {
5013e12c5d1SDavid du Colombier
5023e12c5d1SDavid du Colombier outcode(AEND, &nullgen, NREG, &nullgen);
5033e12c5d1SDavid du Colombier Bflush(&obuf);
5043e12c5d1SDavid du Colombier }
5053e12c5d1SDavid du Colombier
5063e12c5d1SDavid du Colombier void
zname(char * n,int t,int s)5073e12c5d1SDavid du Colombier zname(char *n, int t, int s)
5083e12c5d1SDavid du Colombier {
5093e12c5d1SDavid du Colombier
5103e12c5d1SDavid du Colombier Bputc(&obuf, ANAME);
5113e12c5d1SDavid du Colombier Bputc(&obuf, t); /* type */
5123e12c5d1SDavid du Colombier Bputc(&obuf, s); /* sym */
5133e12c5d1SDavid du Colombier while(*n) {
5143e12c5d1SDavid du Colombier Bputc(&obuf, *n);
5153e12c5d1SDavid du Colombier n++;
5163e12c5d1SDavid du Colombier }
5173e12c5d1SDavid du Colombier Bputc(&obuf, 0);
5183e12c5d1SDavid du Colombier }
5193e12c5d1SDavid du Colombier
5203e12c5d1SDavid du Colombier void
zaddr(Gen * a,int s)5213e12c5d1SDavid du Colombier zaddr(Gen *a, int s)
5223e12c5d1SDavid du Colombier {
5233e12c5d1SDavid du Colombier long l;
5243e12c5d1SDavid du Colombier int i;
5253e12c5d1SDavid du Colombier char *n;
5263e12c5d1SDavid du Colombier Ieee e;
5273e12c5d1SDavid du Colombier
5283e12c5d1SDavid du Colombier Bputc(&obuf, a->type);
5293e12c5d1SDavid du Colombier Bputc(&obuf, a->reg);
5303e12c5d1SDavid du Colombier Bputc(&obuf, s);
5313e12c5d1SDavid du Colombier Bputc(&obuf, a->name);
5323e12c5d1SDavid du Colombier switch(a->type) {
5333e12c5d1SDavid du Colombier default:
5343e12c5d1SDavid du Colombier print("unknown type %d\n", a->type);
5353e12c5d1SDavid du Colombier exits("arg");
5363e12c5d1SDavid du Colombier
5373e12c5d1SDavid du Colombier case D_NONE:
5383e12c5d1SDavid du Colombier case D_REG:
5393e12c5d1SDavid du Colombier case D_FREG:
5403e12c5d1SDavid du Colombier case D_CREG:
5413e12c5d1SDavid du Colombier case D_PREG:
5423e12c5d1SDavid du Colombier break;
5433e12c5d1SDavid du Colombier
5443e12c5d1SDavid du Colombier case D_OREG:
5453e12c5d1SDavid du Colombier case D_ASI:
5463e12c5d1SDavid du Colombier case D_CONST:
5473e12c5d1SDavid du Colombier case D_BRANCH:
5483e12c5d1SDavid du Colombier l = a->offset;
5493e12c5d1SDavid du Colombier Bputc(&obuf, l);
5503e12c5d1SDavid du Colombier Bputc(&obuf, l>>8);
5513e12c5d1SDavid du Colombier Bputc(&obuf, l>>16);
5523e12c5d1SDavid du Colombier Bputc(&obuf, l>>24);
5533e12c5d1SDavid du Colombier break;
5543e12c5d1SDavid du Colombier
5553e12c5d1SDavid du Colombier case D_SCONST:
5563e12c5d1SDavid du Colombier n = a->sval;
5573e12c5d1SDavid du Colombier for(i=0; i<NSNAME; i++) {
5583e12c5d1SDavid du Colombier Bputc(&obuf, *n);
5593e12c5d1SDavid du Colombier n++;
5603e12c5d1SDavid du Colombier }
5613e12c5d1SDavid du Colombier break;
5623e12c5d1SDavid du Colombier
5633e12c5d1SDavid du Colombier case D_FCONST:
5643e12c5d1SDavid du Colombier ieeedtod(&e, a->dval);
5653e12c5d1SDavid du Colombier Bputc(&obuf, e.l);
5663e12c5d1SDavid du Colombier Bputc(&obuf, e.l>>8);
5673e12c5d1SDavid du Colombier Bputc(&obuf, e.l>>16);
5683e12c5d1SDavid du Colombier Bputc(&obuf, e.l>>24);
5693e12c5d1SDavid du Colombier Bputc(&obuf, e.h);
5703e12c5d1SDavid du Colombier Bputc(&obuf, e.h>>8);
5713e12c5d1SDavid du Colombier Bputc(&obuf, e.h>>16);
5723e12c5d1SDavid du Colombier Bputc(&obuf, e.h>>24);
5733e12c5d1SDavid du Colombier break;
5743e12c5d1SDavid du Colombier }
5753e12c5d1SDavid du Colombier }
5763e12c5d1SDavid du Colombier
5773e12c5d1SDavid du Colombier void
outcode(int a,Gen * g1,int reg,Gen * g2)5783e12c5d1SDavid du Colombier outcode(int a, Gen *g1, int reg, Gen *g2)
5793e12c5d1SDavid du Colombier {
5803e12c5d1SDavid du Colombier int sf, st, t;
5813e12c5d1SDavid du Colombier Sym *s;
5823e12c5d1SDavid du Colombier
5833e12c5d1SDavid du Colombier if(pass == 1)
5843e12c5d1SDavid du Colombier goto out;
5853e12c5d1SDavid du Colombier if(g1->xreg != NREG) {
5863e12c5d1SDavid du Colombier if(reg != NREG || g2->xreg != NREG)
5873e12c5d1SDavid du Colombier yyerror("bad addressing modes");
5883e12c5d1SDavid du Colombier reg = g1->xreg;
5893e12c5d1SDavid du Colombier } else
5903e12c5d1SDavid du Colombier if(g2->xreg != NREG) {
5913e12c5d1SDavid du Colombier if(reg != NREG)
5923e12c5d1SDavid du Colombier yyerror("bad addressing modes");
5933e12c5d1SDavid du Colombier reg = g2->xreg;
5943e12c5d1SDavid du Colombier }
5953e12c5d1SDavid du Colombier jackpot:
5963e12c5d1SDavid du Colombier sf = 0;
5973e12c5d1SDavid du Colombier s = g1->sym;
5983e12c5d1SDavid du Colombier while(s != S) {
5993e12c5d1SDavid du Colombier sf = s->sym;
6003e12c5d1SDavid du Colombier if(sf < 0 || sf >= NSYM)
6013e12c5d1SDavid du Colombier sf = 0;
6023e12c5d1SDavid du Colombier t = g1->name;
6033e12c5d1SDavid du Colombier if(h[sf].type == t)
6043e12c5d1SDavid du Colombier if(h[sf].sym == s)
6053e12c5d1SDavid du Colombier break;
6063e12c5d1SDavid du Colombier zname(s->name, t, sym);
6073e12c5d1SDavid du Colombier s->sym = sym;
6083e12c5d1SDavid du Colombier h[sym].sym = s;
6093e12c5d1SDavid du Colombier h[sym].type = t;
6103e12c5d1SDavid du Colombier sf = sym;
6113e12c5d1SDavid du Colombier sym++;
6123e12c5d1SDavid du Colombier if(sym >= NSYM)
6133e12c5d1SDavid du Colombier sym = 1;
6143e12c5d1SDavid du Colombier break;
6153e12c5d1SDavid du Colombier }
6163e12c5d1SDavid du Colombier st = 0;
6173e12c5d1SDavid du Colombier s = g2->sym;
6183e12c5d1SDavid du Colombier while(s != S) {
6193e12c5d1SDavid du Colombier st = s->sym;
6203e12c5d1SDavid du Colombier if(st < 0 || st >= NSYM)
6213e12c5d1SDavid du Colombier st = 0;
6223e12c5d1SDavid du Colombier t = g2->name;
6233e12c5d1SDavid du Colombier if(h[st].type == t)
6243e12c5d1SDavid du Colombier if(h[st].sym == s)
6253e12c5d1SDavid du Colombier break;
6263e12c5d1SDavid du Colombier zname(s->name, t, sym);
6273e12c5d1SDavid du Colombier s->sym = sym;
6283e12c5d1SDavid du Colombier h[sym].sym = s;
6293e12c5d1SDavid du Colombier h[sym].type = t;
6303e12c5d1SDavid du Colombier st = sym;
6313e12c5d1SDavid du Colombier sym++;
6323e12c5d1SDavid du Colombier if(sym >= NSYM)
6333e12c5d1SDavid du Colombier sym = 1;
6343e12c5d1SDavid du Colombier if(st == sf)
6353e12c5d1SDavid du Colombier goto jackpot;
6363e12c5d1SDavid du Colombier break;
6373e12c5d1SDavid du Colombier }
6383e12c5d1SDavid du Colombier Bputc(&obuf, a);
639219b2ee8SDavid du Colombier Bputc(&obuf, reg|nosched);
6403e12c5d1SDavid du Colombier Bputc(&obuf, lineno);
6413e12c5d1SDavid du Colombier Bputc(&obuf, lineno>>8);
6423e12c5d1SDavid du Colombier Bputc(&obuf, lineno>>16);
6433e12c5d1SDavid du Colombier Bputc(&obuf, lineno>>24);
6443e12c5d1SDavid du Colombier zaddr(g1, sf);
6453e12c5d1SDavid du Colombier zaddr(g2, st);
6463e12c5d1SDavid du Colombier
6473e12c5d1SDavid du Colombier out:
6483e12c5d1SDavid du Colombier if(a != AGLOBL && a != ADATA)
6493e12c5d1SDavid du Colombier pc++;
6503e12c5d1SDavid du Colombier }
6513e12c5d1SDavid du Colombier
6523e12c5d1SDavid du Colombier void
outhist(void)6533e12c5d1SDavid du Colombier outhist(void)
6543e12c5d1SDavid du Colombier {
6553e12c5d1SDavid du Colombier Gen g;
6563e12c5d1SDavid du Colombier Hist *h;
6577dd7cddfSDavid du Colombier char *p, *q, *op, c;
6583e12c5d1SDavid du Colombier int n;
6593e12c5d1SDavid du Colombier
6603e12c5d1SDavid du Colombier g = nullgen;
6617dd7cddfSDavid du Colombier c = pathchar();
6623e12c5d1SDavid du Colombier for(h = hist; h != H; h = h->link) {
6633e12c5d1SDavid du Colombier p = h->name;
664219b2ee8SDavid du Colombier op = 0;
665*375daca8SDavid du Colombier /* on windows skip drive specifier in pathname */
666*375daca8SDavid du Colombier if(systemtype(Windows) && p && p[1] == ':'){
667*375daca8SDavid du Colombier p += 2;
668*375daca8SDavid du Colombier c = *p;
669*375daca8SDavid du Colombier }
6707dd7cddfSDavid du Colombier if(p && p[0] != c && h->offset == 0 && pathname){
6717dd7cddfSDavid du Colombier /* on windows skip drive specifier in pathname */
672*375daca8SDavid du Colombier if(systemtype(Windows) && pathname[1] == ':') {
6737dd7cddfSDavid du Colombier op = p;
6747dd7cddfSDavid du Colombier p = pathname+2;
675*375daca8SDavid du Colombier c = *p;
6767dd7cddfSDavid du Colombier } else if(pathname[0] == c){
677219b2ee8SDavid du Colombier op = p;
678219b2ee8SDavid du Colombier p = pathname;
679219b2ee8SDavid du Colombier }
6807dd7cddfSDavid du Colombier }
6813e12c5d1SDavid du Colombier while(p) {
6827dd7cddfSDavid du Colombier q = strchr(p, c);
6833e12c5d1SDavid du Colombier if(q) {
6843e12c5d1SDavid du Colombier n = q-p;
685*375daca8SDavid du Colombier if(n == 0){
6863e12c5d1SDavid du Colombier n = 1; /* leading "/" */
687*375daca8SDavid du Colombier *p = '/'; /* don't emit "\" on windows */
688*375daca8SDavid du Colombier }
6893e12c5d1SDavid du Colombier q++;
6903e12c5d1SDavid du Colombier } else {
6913e12c5d1SDavid du Colombier n = strlen(p);
6923e12c5d1SDavid du Colombier q = 0;
6933e12c5d1SDavid du Colombier }
6943e12c5d1SDavid du Colombier if(n) {
695219b2ee8SDavid du Colombier Bputc(&obuf, ANAME);
696219b2ee8SDavid du Colombier Bputc(&obuf, D_FILE); /* type */
697219b2ee8SDavid du Colombier Bputc(&obuf, 1); /* sym */
698219b2ee8SDavid du Colombier Bputc(&obuf, '<');
699219b2ee8SDavid du Colombier Bwrite(&obuf, p, n);
700219b2ee8SDavid du Colombier Bputc(&obuf, 0);
7013e12c5d1SDavid du Colombier }
7023e12c5d1SDavid du Colombier p = q;
703219b2ee8SDavid du Colombier if(p == 0 && op) {
704219b2ee8SDavid du Colombier p = op;
705219b2ee8SDavid du Colombier op = 0;
706219b2ee8SDavid du Colombier }
7073e12c5d1SDavid du Colombier }
7083e12c5d1SDavid du Colombier g.offset = h->offset;
7093e12c5d1SDavid du Colombier
7103e12c5d1SDavid du Colombier Bputc(&obuf, AHISTORY);
7113e12c5d1SDavid du Colombier Bputc(&obuf, 0);
7123e12c5d1SDavid du Colombier Bputc(&obuf, h->line);
7133e12c5d1SDavid du Colombier Bputc(&obuf, h->line>>8);
7143e12c5d1SDavid du Colombier Bputc(&obuf, h->line>>16);
7153e12c5d1SDavid du Colombier Bputc(&obuf, h->line>>24);
7163e12c5d1SDavid du Colombier zaddr(&nullgen, 0);
7173e12c5d1SDavid du Colombier zaddr(&g, 0);
7183e12c5d1SDavid du Colombier }
7193e12c5d1SDavid du Colombier }
7203e12c5d1SDavid du Colombier
7213e12c5d1SDavid du Colombier #include "../cc/lexbody"
7223e12c5d1SDavid du Colombier #include "../cc/macbody"
7237dd7cddfSDavid du Colombier #include "../cc/compat"
724