|
|
1.1 root 1: #ifndef lint
2: static char sccsid[] = "@(#)inst.c 1.1 86/02/03 Copyr 1985 Sun Micro";
3: #endif
4:
5: /*
6: * Copyright (c) 1985 by Sun Microsystems, Inc.
7: */
8:
9:
10: #include "as.h"
11: #include "c2.h"
12:
13: #if AS
14: extern int no_op(), stop(), one_op(), ctrl_op(), move_op(), two_op(), jbrnch(),
15: cbrnch(), branch(), brnchs(), regmem(), shift_op(), reg_op(), postinc(),
16: bit_op(), memreg(), regbrnch(), exg_op(), addr_op(), link_op(),
17: movem_op(), movep_op(), moveq(), trap(), rts(), movec_op(), moves_op();
18: #endif
19:
20: #define I( a, b, c, d, e, f, g, h ) {a, b, c, d, e, f, g, h },
21: #define P( a, b, c, d, e ) {a, b, e, d, c },
22:
23: #define A_ONE( a ) { a }
24: #define A_TWO( a, b ) { a, b }
25: #define A_TH3( a, b, c ) { a, b, c }
26: #define A_4R( a, b, c, d ) { a, b, c, d }
27: #define A_5V( a, b, c, d, e ) { a, b, c, d, e }
28: #define A_6X( a, b, c, d, e, f ) { a, b, c, d, e, f }
29: #define A_8T( a, b, c, d, e, f, g, h ) { a, b, c, d, e, f, g, h }
30:
31: #define T_X 0
32: #define T_ONE(a) (a)
33: #define T_TWO(a,b) (((b)<<TOUCHWIDTH)|(a))
34: #define T_THREE(a,b,c) (((((c)<<TOUCHWIDTH)|(b))<<TOUCHWIDTH)|(a))
35:
36: /* List of 68000 op codes */
37: struct ins_bkt op_codes[] = {
38:
39: # include "characteristics"
40:
41: 0 };
42:
43: d_ins()
44: {
45: register struct ins_bkt *insp;
46: register struct ins_ptr *ipp;
47: register int save;
48: char *calloc();
49:
50: inst = (struct ins_ptr *) calloc( sizeof op_codes / sizeof op_codes[0], sizeof *inst);
51: if (inst == NULL) sys_error("could not allocate instruction symbol space ");
52: for ( ipp = &inst[0], insp = &op_codes[0]; insp->text_i; ipp++, insp++){
53: ipp->this_p = insp;
54: ipp->name_p = insp->text_i;
55: ipp->next_p = ins_hash_tab[save = hash(ipp->name_p)];
56: ins_hash_tab[save] = ipp;
57: }
58: }
59:
60: struct regdef{ char * name_r ; short regno_r; } defregs[] = {
61: { "d0", D0REG+0 },
62: { "d1", D0REG+1 },
63: { "d2", D0REG+2 },
64: { "d3", D0REG+3 },
65: { "d4", D0REG+4 },
66: { "d5", D0REG+5 },
67: { "d6", D0REG+6 },
68: { "d7", D0REG+7 },
69: { "a0", A0REG+0 },
70: { "a1", A0REG+1 },
71: { "a2", A0REG+2 },
72: { "a3", A0REG+3 },
73: { "a4", A0REG+4 },
74: { "a5", A0REG+5 },
75: { "a6", A6REG },
76: { "a7", A7REG },
77: { "sp", A7REG },
78: { "fp0", FP0REG+0 },
79: { "fp1", FP0REG+1 },
80: { "fp2", FP0REG+2 },
81: { "fp3", FP0REG+3 },
82: { "fp4", FP0REG+4 },
83: { "fp5", FP0REG+5 },
84: { "fp6", FP0REG+6 },
85: { "fp7", FP0REG+7 },
86: { "cc", CCREG },
87: /* fpcc */
88: { "pc", PCREG },
89: { "sr", SRREG },
90: { "usp", USPREG+0 },
91: { "sfc", USPREG+1 },
92: { "dfc", USPREG+2 },
93: { "vbr", USPREG+3 },
94: { "cacr",USPREG+4 },
95: { "caar",USPREG+5 },
96: { "msp", USPREG+6 },
97: { "isp", USPREG+7 },
98: { "fpc", FPCREG },
99: { "fps", FPSREG },
100: { "fpi", FPIREG },
101: 0, 0
102: };
103:
104: unsigned reg_access[] = {
105: /* d0 d1 d2 d3 d4 d5 d6 d7 */
106: AM_DREG, AM_DREG, AM_DREG, AM_DREG, AM_DREG, AM_DREG, AM_DREG, AM_DREG,
107: /* a0 a1 a2 a3 a4 a5 a6 a7 */
108: AM_AREG, AM_AREG, AM_AREG, AM_AREG, AM_AREG, AM_AREG, AM_AREG, AM_AREG,
109: /* fp0 fp1 fp2 fp3 fp4 fp5 fp6 fp7 */
110: AM_FREG, AM_FREG, AM_FREG, AM_FREG, AM_FREG, AM_FREG, AM_FREG, AM_FREG,
111: /* fpcc */
112: 0,
113: /* cc pc sr usp */
114: AM_CCREG,AM_PCREG,AM_CCREG,AM_USPREG|AM_CTRLREG,
115: /* src dfc vbr cacr */
116: AM_CTRLREG, AM_CTRLREG, AM_CTRLREG, AM_CTRLREG,
117: /* caar msp isp */
118: AM_CTRLREG, AM_CTRLREG, AM_CTRLREG,
119: /* fpc fps fpi */
120: AM_FCTRLREG, AM_FCTRLREG, AM_FCTRLREG,
121: };
122:
123: init_regs()
124: { register struct sym_bkt *sbp;
125: register struct regdef *p = defregs;
126: register i;
127:
128: i = 0;
129: while (p->name_r) {
130: sbp = lookup(p->name_r); /* Make a sym_bkt for it */
131: sbp->value_s = p->regno_r; /* Load the sym_bkt */
132: sbp->csect_s = C_UNDEF;
133: sbp->attr_s = S_DEC | S_DEF | S_REG;
134: p++;
135: i++;
136: }
137: }
138:
139: #if C2
140: struct def_builtin { char *bname; short ruse[4]; } def_builtins[] = {
141: "lmult", LR+LW, LR+LW, 0, 0,
142: "ulmult", LR+LW, LR+LW, 0, 0,
143: "ldivt", LR+LW, LR+LW, 0, 0,
144: "lmodt", LR+LW, LR+LW, 0, 0,
145: "uldivt", LR+LW, LR+LW, 0, 0,
146: "ulmodt", LR+LW, LR+LW, 0, 0,
147: "mcount", 0, 0, LR, 0,
148: /* floating-point, too */
149: "Faddd", LR+LW, LR+LW, LR+LW, LW, /* fvaddi */
150: "Fsubd", LR+LW, LR+LW, LR+LW, LW, /* fvsubi */
151: "Fmuld", LR+LW, LR+LW, LR+LW, LW, /* fvmuli */
152: "Fdivd", LR+LW, LR+LW, LR+LW, LW, /* fvdivi */
153: "Fcmpd", LR+LW, LR+LW, LR+LW, LW, /* fvcmpi */
154: "Fadds", LR+LW, LR+LW, LW, LW, /* fvaddis */
155: "Fsubs", LR+LW, LR+LW, LW, LW, /* fvsubis */
156: "Fmuls", LR+LW, LR+LW, LW, LW, /* fvmulis */
157: "Fdivs", LR+LW, LR+LW, LW, LW, /* fvdivis */
158: "Fcmps", LR+LW, LR+LW, LW, LW, /* fvcmpis */
159: "Ffltd", LR+LW, LW, LW, LW, /* fvflti */
160: "Fflts", LR+LW, LW, LW, LW, /* fvfltis */
161: "Fintd", LR+LW, LR+LW, LW, LW, /* fvfixi */
162: "Fints", LR+LW, LW, LW, LW, /* fvfixis */
163: "Fstod", LR+LW, LW, LW, LW, /* fvdoublei */
164: "Fdtos", LR+LW, LR+LW, LW, LW, /* fvsinglei */
165: /* fortrash */
166: "Fcosd", LR+LW, LR+LW, LW, LW, /* fvcosi */
167: "Fsind", LR+LW, LR+LW, LW, LW, /* fvsini */
168: "Ftand", LR+LW, LR+LW, LW, LW, /* fvtani */
169: "Facosd", LR+LW, LR+LW, LW, LW, /* fvacosi */
170: "Fasind", LR+LW, LR+LW, LW, LW, /* fvasini */
171: "Fatand", LR+LW, LR+LW, LW, LW, /* fvatani */
172: "Fcoshd", LR+LW, LR+LW, LW, LW, /* fvcoshi */
173: "Fsinhd", LR+LW, LR+LW, LW, LW, /* fvsinhi */
174: "Ftanhd", LR+LW, LR+LW, LW, LW, /* fvtanhi */
175: "Fexpd", LR+LW, LR+LW, LW, LW, /* fvexpi */
176: "Fpow10d", LR+LW, LR+LW, LW, LW, /* fv10toxi */
177: "Fpow2d", LR+LW, LR+LW, LW, LW, /* fv2toxi */
178: "Flogd", LR+LW, LR+LW, LW, LW, /* fvlogi */
179: "Flog10d", LR+LW, LR+LW, LW, LW, /* fvlog10i */
180: "Flog2d", LR+LW, LR+LW, LW, LW, /* fvlog2i */
181: "Fsqrd", LR+LW, LR+LW, LW, LW, /* fvsqri */
182: "Fsqrtd", LR+LW, LR+LW, LW, LW, /* fvsqrti */
183: "Faintd", LR+LW, LR+LW, LW, LW, /* fvainti */
184: "Fanintd", LR+LW, LR+LW, LW, LW, /* fvaninti */
185: "Fnintd", LR+LW, LR+LW, LW, LW, /* fvninti */
186: "Fcoss", LR+LW, LW, LW, LW, /* fvcosis */
187: "Fsins", LR+LW, LW, LW, LW, /* fvsinis */
188: "Ftans", LR+LW, LW, LW, LW, /* fvtanis */
189: "Facoss", LR+LW, LW, LW, LW, /* fvacosis */
190: "Fasins", LR+LW, LW, LW, LW, /* fvasinis */
191: "Fatans", LR+LW, LW, LW, LW, /* fvatanis */
192: "Fcoshs", LR+LW, LW, LW, LW, /* fvcoshis */
193: "Fsinhs", LR+LW, LW, LW, LW, /* fvsinhis */
194: "Ftanhs", LR+LW, LW, LW, LW, /* fvtanhis */
195: "Fexps", LR+LW, LW, LW, LW, /* fvexpis */
196: "Fpow10s", LR+LW, LW, LW, LW, /* fv10toxis */
197: "Fpow2s", LR+LW, LW, LW, LW, /* fv2toxis */
198: "Flogs", LR+LW, LW, LW, LW, /* fvlogis */
199: "Flog10s", LR+LW, LW, LW, LW, /* fvlog10is */
200: "Flog2s", LR+LW, LW, LW, LW, /* fvlog2is */
201: "Fsqrs", LR+LW, LW, LW, LW, /* fvsqris */
202: "Fsqrts", LR+LW, LW, LW, LW, /* fvsqrtis */
203: "Faints", LR+LW, LW, LW, LW, /* fvaintis */
204: "Fanints", LR+LW, LW, LW, LW, /* fvanintis */
205: "Fnints", LR+LW, LW, LW, LW, /* fvnintis */
206: 0
207: };
208:
209: static void
210: add_builtin(d)
211: register struct def_builtin * d;
212: {
213: register i;
214: register struct sym_bkt *s;
215:
216: s = lookup(d->bname);
217: s->csect_s = C_UNDEF;
218: s->attr_s = S_DEC | S_CRT;
219: for (i=0; i < sizeof d->ruse / sizeof d->ruse[0] ; i++){
220: s->builtin_s[i] = d->ruse[i];
221: }
222: }
223:
224: void
225: init_builtins()
226: {
227: register struct def_builtin * d;
228:
229: for (d = def_builtins; d->bname != NULL; d++){
230: if (d->bname[0] == 'F') {
231: /* must make a copy for each flavor of floating point. BLEAGH! */
232: add_builtin(d);
233: d->bname[0] = 'V'; /* vectored */
234: add_builtin(d);
235: d->bname[0] = 'S'; /* sky */
236: add_builtin(d);
237: d->bname[0] = 'M'; /* motorola */
238: add_builtin(d);
239: d->bname[0] = 'W'; /* Weitek */
240: add_builtin(d);
241: } else {
242: add_builtin(d);
243: }
244: }
245: }
246: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.