|
|
1.1 root 1: /* @(#)inst.h 1.1 86/02/03 SMI */
2:
3: /*
4: * Copyright (c) 1985 by Sun Microsystems, Inc.
5: */
6:
7:
8:
9: /*
10: * When this table is changed, we must also change:
11: * the table in instruction.c that is indexed by it.
12: */
13: typedef enum{
14: OP_FIRST = 0, OP_COMMENT, OP_LABEL,
15: OP_LONG, OP_WORD, OP_BYTE, OP_TEXT,
16: OP_DATA, OP_DATA1, OP_DATA2, OP_BSS,
17: OP_PROC, OP_GLOBL, OP_COMM, OP_EVEN, OP_ALIGN,
18: OP_ASCIZ, OP_ASCII, OP_FLOAT, OP_DOUBLE,
19: OP_STABS, OP_STABD, OP_STABN, OP_SKIP, OP_LCOMM, OP_CPID,
20: OP_CSWITCH, OP_FSWITCH, OP_BRANCH, OP_MOVE, OP_MOVEM,
21: OP_EXIT, OP_DBRA, OP_CALL, OP_JUMP, OP_DJMP,
22: OP_LINK, OP_CMP, OP_PEA, OP_ADD, OP_AND,
23: OP_EXT, OP_OR, OP_TST, OP_ASL, OP_ASR,
24: OP_SUB, OP_UNLK, OP_LEA, OP_CLR , OP_BOP,
25: OP_EOR,
26: OP_OTHER
27: } opcode_t;
28:
29: typedef enum{ /* First eight are 68881 data types. */
30: SUBOP_L = 0, SUBOP_S = 1, SUBOP_X = 2,
31: SUBOP_P = 3, SUBOP_W = 4, SUBOP_D = 5,
32: SUBOP_B = 6, SUBOP_C = 7,
33: JEQ = 8, JNE, JLE, JGE, JLT, JGT, JLS, JHI, JMI, JPL,
34: JALL, JCS, JCC, JVS, JVC, JNONE, JIND,
35: SUBOP_Z /* Last type for typeless instructions. */
36: } subop_t;
37:
38: #if AS
39:
40: #define N_OPTYPES 8 /* Maximum number of operand type descriptors. */
41:
42: struct ins_bkt {
43: char *text_i;
44: int (*routine_i)();
45: opcode_t op_i:8;
46: subop_t subop_i:8;
47: short noper_i:8;
48: short align_i:8;
49: unsigned short touchop_i;
50: unsigned short
51: opval_i[5]; /* info, usually opcodes */
52: unsigned optype_i[8]; /* up to 4 pairs of 2 operands */
53: short xflags_i;
54: };
55:
56: /* instruction flags */
57: #define I20 1 /* instruction only on 68020 */
58: #define I81 2 /* instruction only on 68881 */
59:
60: struct ins_ptr { /* arranged so op-code table can be read-only */
61: char *name_p;
62: struct ins_ptr *next_p;
63: struct ins_bkt *this_p;
64: };
65:
66: #endif
67: extern struct ins_ptr *inst;
68:
69: extern char opcodetypes[];
70: #define INSTRTYPE 1
71: #define PSEUDONOCODE 2
72: #define PSEUDOCODE 4
73: #define ISINSTRUC( op ) (opcodetypes[(int)(op)]&INSTRTYPE)
74: #define ISPSEUDO( op ) (opcodetypes[(int)(op)]&(PSEUDOCODE|PSEUDONOCODE))
75: #define ISDIRECTIVE( op ) (opcodetypes[(int)(op)]&PSEUDONOCODE)
76:
77: /* operand access bits */
78: # define RMASK 3
79: # define WMASK 014
80: # define TOUCHWIDTH 5
81: # define TOUCHMASK 037
82: # define BR 1
83: # define WR 2
84: # define LR 3
85: # define BW 4
86: # define WW 8
87: # define LW 12
88: # define SPEC(n) (16+n)
89: # define TOUCH1(a) ((a)<<2*TOUCHWIDTH)
90: # define TOUCH2(a) ((a)<<TOUCHWIDTH)
91: # define TOUCH3(a) (a)
92: /* operand access bits for floating point */
93: # define SR LR
94: # define XR LR
95: # define PR LR
96: # define DR LR
97: # define CR LR
98: # define FR LR
99: # define SW LW
100: # define XW LW
101: # define PW LW
102: # define DW LW
103: # define CW LW
104: # define FW LW
105:
106: /* size code fields for floating point */
107:
108: # define L_SIZE 0*02000
109: # define S_SIZE 1*02000
110: # define X_SIZE 2*02000
111: # define P_SIZE 3*02000
112: # define W_SIZE 4*02000
113: # define D_SIZE 5*02000
114: # define B_SIZE 6*02000
115: # define C_SIZE 7*02000
116:
117: /* floating point condition code fields */
118:
119: # define FCC_F 00
120: # define FCC_EQ 01
121: # define FCC_OGT 02
122: # define FCC_OGE 03
123: # define FCC_OLT 04
124: # define FCC_OLE 05
125: # define FCC_OGL 06
126: # define FCC_OR 07
127: # define FCC_UN 010
128: # define FCC_UEQ 011
129: # define FCC_UGT 012
130: # define FCC_UGE 013
131: # define FCC_ULT 014
132: # define FCC_ULE 015
133: # define FCC_NEQ 016
134: # define FCC_T 017
135: # define FCC_SF 020
136: # define FCC_SEQ 021
137: # define FCC_GT 022
138: # define FCC_GE 023
139: # define FCC_LT 024
140: # define FCC_LE 025
141: # define FCC_GL 026
142: # define FCC_GLE 027
143: # define FCC_NGLE 030
144: # define FCC_NGL 031
145: # define FCC_NLE 032
146: # define FCC_NLT 033
147: # define FCC_NGE 034
148: # define FCC_NGT 035
149: # define FCC_SNEQ 036
150: # define FCC_ST 037
151:
152: /* operand addressing mode bits */
153:
154: # define AM_DREG 01
155: # define AM_AREG 02
156: # define AM_DEFER 04
157: # define AM_POSTINC 010
158: # define AM_PREDEC 020
159: # define AM_DISPL 040
160: # define AM_INDEX 0100
161: # define AM_ABSS 0200
162: # define AM_ABSL 0400
163: # define AM_IMMED 01000
164: # define AM_PCDISPL 02000
165: # define AM_PCINDEX 04000
166: # define AM_NORMAL 010000
167: # define AM_REG (AM_DREG|AM_AREG)
168: # define AM_ALL 017777
169: # define AM_FREG 020000
170: # define AM_CCREG 040000
171: # define AM_CTRLREG 0100000
172: # define AM_USPREG 0200000
173: # define AM_PCREG 0400000
174: # define AM_REGPAIR 01000000
175: # define AM_FCTRLREG 02000000
176: # define AM_REGLIST 04000000
177: # define AM_FREGLIST 010000000
178: # define AM_FCREGLIST 020000000
179:
180: # define AM_AMEM (AM_DEFER|AM_POSTINC|AM_PREDEC|AM_DISPL|AM_INDEX|AM_ABSS|AM_ABSL|AM_NORMAL)
181: # define AM_ADAT (AM_AMEM|AM_DREG)
182: # define AM_CTRL (AM_DEFER|AM_DISPL|AM_INDEX|AM_ABSS|AM_ABSL|AM_NORMAL|AM_PCDISPL|AM_PCINDEX)
183: # define AM_ACTRL (AM_DEFER|AM_DISPL|AM_INDEX|AM_ABSS|AM_ABSL|AM_NORMAL)
184: # define AM_MEM (AM_ALL&~AM_REG)
185: # define AM_ADDR (AM_ALL&~AM_REG&~AM_IMMED)
186: # define AM_DATA (AM_ALL&~AM_AREG)
187: # define AM_AA (AM_ALL&~(AM_PCDISPL|AM_PCINDEX|AM_IMMED))
188:
189: #if C2
190: /* cc set */
191: # define CC0 0
192: # define CC1 1
193: # define CC2 2
194: # define CCX 3
195: # define CCR 0100
196: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.