|
|
1.1 root 1: /*
2: * C compiler - intermediate file printer.
3: * machine and assembly format dependent output routines.
4: */
5: #ifdef vax
6: #include "INC$LIB:cc3.h"
7: #else
8: #include "cc3.h"
9: #endif
10:
11: /*
12: * How to enter or leave a segment.
13: */
14: char *seg_enter[] = {
15: #if AS_FORMAT
16: ".shri",
17: ".prvi",
18: ".shrd",
19: ".strn",
20: ".prvd",
21: ".bssd"
22: #else
23: "code",
24: "linkage",
25: "pure",
26: "strings",
27: "impure",
28: "bss"
29: #endif
30: };
31:
32: char *seg_leave[] = {
33: NULL,
34: NULL,
35: NULL,
36: NULL,
37: NULL,
38: NULL
39: };
40:
41: /*
42: * Process AUTOS items.
43: * The opcode byte has been read.
44: * Read in whatever operands are used by the
45: * target machine and print them out in a nice
46: * way. The registers on the 8086 are named.
47: */
48: genautos()
49: {
50: register int numauto;
51: register int regmask;
52: register int reg;
53: register int sepchar;
54:
55: numauto = iget();
56: regmask = iget();
57: fprintf(ofp, "\tautos\t%d", numauto);
58: sepchar = '\t';
59: for (reg=AX; reg<=DS; ++reg) {
60: if ((regmask&01) != 0) {
61: fprintf(ofp, "%c%s", sepchar, regnames[reg]);
62: sepchar = ' ';
63: }
64: regmask >>= 1;
65: }
66: fprintf(ofp, "\n");
67: }
68:
69: /*
70: * Output a double value.
71: */
72: gendval(dp)
73: register dval_t dp;
74: {
75: register int i;
76:
77: for (i = 0; i < sizeof(dval_t); i += 1)
78: fprintf(ofp, "%02x", dp[i] & 0377);
79: }
80:
81: /*
82: * Generate a machine dependent leaf node.
83: */
84: genmdl(op)
85: {
86: cbotch("bad mdl: %d", op);
87: }
88:
89: /*
90: * Generate a machine dependent operator node.
91: */
92: genmdo(op)
93: {
94: cbotch("bad mdo: %d", op);
95: }
96:
97: /*
98: * Generat a .comm record.
99: * The operands must be read.
100: */
101: gencomm()
102: {
103: sget(id, NCSYMB);
104: if (isvariant(VASM))
105: #if AS_FORMAT
106: fprintf(ofp, "\t.comm\t");
107: #else
108: fprintf(ofp, "%s\tcommon\t", CMTSTR);
109: #endif
110: else
111: fprintf(ofp, "common\t");
112: fprintf(ofp, "%s\t%ld\n", id, (long)zget());
113: }
114:
115: /*
116: * Generate an assembly operator involving a name.
117: */
118: genname(op, id)
119: char *id;
120: {
121: switch (op) {
122: case FNAME:
123: fprintf(ofp, "%s\tfile name %s\n", CMTSTR, id);
124: break;
125: case MNAME:
126: #if AS_FORMAT
127: fprintf(ofp, "%s\tmodule name %s\n", CMTSTR, id);
128: #else
129: fprintf(ofp, "\tname %s\n", id);
130: #endif
131: break;
132: case GLABEL:
133: #if AS_FORMAT
134: fprintf(ofp, "\t.globl %s\n%s:\n", id, id);
135: #else
136: fprintf(ofp, "\tpublic %s\n%s:\n", id, id);
137: #endif
138: break;
139: case SLABEL:
140: fprintf(ofp, "%s:\n", id);
141: break;
142: #ifdef UREFER
143: case UREFER:
144: fprintf(ofp, "%s\tundefined reference %s\n", CMTSTR, id);
145: break;
146: #endif
147: default:
148: cbotch("genname: bad op: %d", op);
149: }
150: }
151:
152: /*
153: * Generate an assembly operator involving an integer value.
154: */
155: genival(op, i)
156: long i;
157: {
158: register char *s;
159:
160: switch (op) {
161: case LINE:
162: fprintf(ofp, "%s\tline number %ld\n", CMTSTR, i);
163: break;
164: case BLOCK:
165: #if AS_FORMAT
166: fprintf(ofp, "\t.blkb\t0x%lx\n", i);
167: #else
168: fprintf(ofp, "\tdb\t0%lxh dup(0)\n", i);
169: #endif
170: break;
171: case ALIGN:
172: #if AS_FORMAT
173: fprintf(ofp, "\t.even\n");
174: #else
175: fprintf(ofp, "\teven\n");
176: #endif
177: break;
178: case ENTER:
179: if (dotseg >= 0 && (s=seg_leave[dotseg]) != NULL)
180: fprintf(ofp, "\n\t%s\n\n", s);
181: dotseg = i;
182: if (dotseg >= 0 && (s=seg_enter[dotseg]) != NULL)
183: fprintf(ofp, "\n\t%s\n\n", s);
184: break;
185: case LLABEL:
186: fprintf(ofp, "L%ld:\n", i);
187: break;
188: default:
189: cbotch("genival: bad op: %d", op);
190: }
191: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.