|
|
1.1 root 1: /*
2: * n2/i386/optab.c
3: * Opcode table.
4: * i386.
5: */
6:
7: #ifdef vax
8: #include "INC$LIB:cc2.h"
9: #else
10: #include "cc2.h"
11: #endif
12:
13: /*
14: * Opcode table.
15: * Indexed by opcode number, as defined in header file h/i8086/opcode.h.
16: * Contains the number of address expressions,
17: * the opcode and the basic format (style) of each instruction.
18: * This table is parallel to the table in cc3/i8086/icode.c
19: * and to the definitions of machine ops in h/i8086/opcode.h;
20: * modifications must be made in parallel.
21: */
22: OPINFO opinfo[] = {
23: /* mnemonic op_naddr op_flag op_opcode op_style */
24: /* adc */ 2, 0, 0x11, OF_DOPS,
25: /* add */ 2, 0, 0x01, OF_DOPS,
26: /* addb */ 2, OP_BYTE, 0x00, OF_DOP,
27: /* addw */ 2, OP_WORD, 0x01, OF_DOPS,
28: /* and */ 2, 0, 0x21, OF_DOPS,
29: /* andb */ 2, OP_BYTE, 0x20, OF_DOP,
30: /* andw */ 2, OP_WORD, 0x21, OF_DOPS,
31: /* call */ 1, OP_NPTR, 0xE8, OF_CALL,
32: /* cbw */ 0, OP_WORD, 0x98, OF_INH,
33: /* cdq */ 0, 0, 0x99, OF_INH,
34: /* clc */ 0, 0, 0xF8, OF_INH,
35: /* cld */ 0, 0, 0xFC, OF_INH,
36: /* cli */ 0, 0, 0xFA, OF_INH,
37: /* cmc */ 0, 0, 0xF5, OF_INH,
38: /* cmp */ 2, 0, 0x39, OF_DOPS,
39: /* cmpb */ 2, OP_BYTE, 0x38, OF_DOP,
40: /* cmpw */ 2, OP_WORD, 0x39, OF_DOPS,
41: /* cmpsw */ 0, 0, 0xA7, OF_INH,
42: /* cmpsb */ 0, 0, 0xA6, OF_INH,
43: /* cmpsw */ 0, OP_WORD, 0xA7, OF_INH,
44: /* cwd */ 0, OP_WORD, 0x99, OF_INH,
45: /* cwde */ 0, 0, 0x98, OF_INH,
46: /* dec */ 1, 0, 0x09, OF_SOP,
47: /* decb */ 1, OP_BYTE, 0x08, OF_SOP,
48: /* decw */ 1, OP_WORD, 0x09, OF_SOP,
49: /* div */ 1, 0, 0x31, OF_MUL,
50: /* divb */ 1, OP_BYTE, 0x30, OF_MUL,
51: /* divw */ 1, OP_WORD, 0x31, OF_MUL,
52: /* enter */ 2, 0, 0xC8, OF_INH,
53: /* hlt */ 0, 0, 0xF4, OF_INH,
54: /* icall */ 1, 0, 0x10, OF_ICALL,
55: /* idiv */ 1, 0, 0x39, OF_MUL,
56: /* idivb */ 1, OP_BYTE, 0x38, OF_MUL,
57: /* idivw */ 1, OP_WORD, 0x39, OF_MUL,
58: /* ijmp */ 1, 0, 0x20, OF_ICALL,
59: /* imul */ 1, 0, 0x29, OF_MUL,
60: /* imulb */ 1, OP_BYTE, 0x28, OF_MUL,
61: /* imulw */ 1, OP_WORD, 0x29, OF_MUL,
62: /* imul immediate */ 3, 0, 0x69, OF_MUL3,
63: /* inc */ 1, 0, 0x01, OF_SOP,
64: /* incb */ 1, OP_BYTE, 0x00, OF_SOP,
65: /* incw */ 1, OP_WORD, 0x01, OF_SOP,
66: /* iret */ 0, 0, 0xCF, OF_INH,
67: /* xicall */ 1, OP_DWORD, 0x18, OF_ICALL,
68: /* xijmp */ 1, OP_NPTR, 0x28, OF_ICALL,
69: /* ja */ 1, OP_JUMP, 0x77, OF_JMP,
70: /* jae */ 1, OP_JUMP, 0x73, OF_JMP,
71: /* jb */ 1, OP_JUMP, 0x72, OF_JMP,
72: /* jbe */ 1, OP_JUMP, 0x76, OF_JMP,
73: /* jcxz */ 1, OP_JUMP, 0xE3, OF_REL,
74: /* je */ 1, OP_JUMP, 0x74, OF_JMP,
75: /* jg */ 1, OP_JUMP, 0x7F, OF_JMP,
76: /* jge */ 1, OP_JUMP, 0x7D, OF_JMP,
77: /* jl */ 1, OP_JUMP, 0x7C, OF_JMP,
78: /* jle */ 1, OP_JUMP, 0x7E, OF_JMP,
79: /* jmp */ 1, OP_JUMP, 0xEB, OF_JMP,
80: /* jne */ 1, OP_JUMP, 0x75, OF_JMP,
81: /* jno */ 1, OP_JUMP, 0x71, OF_JMP,
82: /* jns */ 1, OP_JUMP, 0x79, OF_JMP,
83: /* jo */ 1, OP_JUMP, 0x70, OF_JMP,
84: /* jpe */ 1, OP_JUMP, 0x7A, OF_JMP,
85: /* jpo */ 1, OP_JUMP, 0x7B, OF_JMP,
86: /* js */ 1, OP_JUMP, 0x78, OF_JMP,
87: /* lea */ 2, 0, 0x8D, OF_LEA,
88: /* leave */ 0, 0, 0xC9, OF_INH,
89: /* lock */ 0, 0, 0xF0, OF_INH,
90: /* lodsw */ 0, 0, 0xAD, OF_INH,
91: /* lodsb */ 0, 0, 0xAC, OF_INH,
92: /* loop */ 1, OP_JUMP, 0xE2, OF_REL,
93: /* loope */ 1, OP_JUMP, 0xE1, OF_REL,
94: /* loopne */ 1, OP_JUMP, 0xE0, OF_REL,
95: /* mov */ 2, 0, 0x89, OF_MOV,
96: /* movb */ 2, OP_BYTE, 0x88, OF_MOV,
97: /* movw */ 2, OP_WORD, 0x89, OF_MOV,
98: /* movsw */ 0, 0, 0xA5, OF_INH,
99: /* movsb */ 0, 0, 0xA4, OF_INH,
100: /* movsx */ 2, 0, 0xBF, OF_2B,
101: /* movsxb */ 2, OP_BYTE, 0xBE, OF_2B,
102: /* movzx */ 2, 0, 0xB7, OF_2B,
103: /* movzxb */ 2, OP_BYTE, 0xB6, OF_2B,
104: /* mul */ 1, 0, 0x21, OF_MUL,
105: /* mulb */ 1, OP_BYTE, 0x20, OF_MUL,
106: /* mulw */ 1, OP_WORD, 0x21, OF_MUL,
107: /* neg */ 1, 0, 0x19, OF_SOP,
108: /* negb */ 1, OP_BYTE, 0x18, OF_SOP,
109: /* negw */ 1, OP_WORD, 0x19, OF_SOP,
110: /* not */ 1, 0, 0x11, OF_SOP,
111: /* notb */ 1, OP_BYTE, 0x10, OF_SOP,
112: /* notw */ 1, OP_WORD, 0x11, OF_SOP,
113: /* ret */ 1, OP_NPTR, 0xC2, OF_NRET,
114: /* ret */ 1, OP_NPTR, 0xCB, OF_NRET,
115: /* or */ 2, 0, 0x09, OF_DOPS,
116: /* orb */ 2, OP_BYTE, 0x08, OF_DOP,
117: /* orw */ 2, OP_WORD, 0x09, OF_DOPS,
118: /* pop */ 1, 0, 0x8F, OF_POP,
119: /* popf */ 0, 0, 0x9D, OF_INH,
120: /* push */ 1, 0, 0xFF, OF_PUSH,
121: /* pushf */ 0, 0, 0x9C, OF_INH,
122: /* rcl */ 2, 0, 0x11, OF_SHR,
123: /* rclb */ 2, OP_BYTE, 0x10, OF_SHR,
124: /* rcr */ 2, 0, 0x19, OF_SHR,
125: /* rcrb */ 2, OP_BYTE, 0x18, OF_SHR,
126: /* repe */ 0, 0, 0xF3, OF_INH,
127: /* repne */ 0, 0, 0xF2, OF_INH,
128: /* ret */ 0, 0, 0xC3, OF_INH,
129: /* rol */ 2, 0, 0x01, OF_SHR,
130: /* rolb */ 2, OP_BYTE, 0x00, OF_SHR,
131: /* ror */ 2, 0, 0x09, OF_SHR,
132: /* rorb */ 2, OP_BYTE, 0x08, OF_SHR,
133: /* sal */ 2, 0, 0x21, OF_SHR,
134: /* salb */ 2, OP_BYTE, 0x20, OF_SHR,
135: /* salw */ 2, OP_WORD, 0x21, OF_SHR,
136: /* sar */ 2, 0, 0x39, OF_SHR,
137: /* sarb */ 2, OP_BYTE, 0x38, OF_SHR,
138: /* sarw */ 2, OP_WORD, 0x39, OF_SHR,
139: /* sbb */ 2, 0, 0x19, OF_DOPS,
140: /* scasw */ 0, 0, 0xAF, OF_INH,
141: /* scasb */ 0, 0, 0xAE, OF_INH,
142: /* shl */ 2, 0, 0x21, OF_SHR,
143: /* shlb */ 2, OP_BYTE, 0x20, OF_SHR,
144: /* shlw */ 2, OP_WORD, 0x21, OF_SHR,
145: /* shr */ 2, 0, 0x29, OF_SHR,
146: /* shrb */ 2, OP_BYTE, 0x28, OF_SHR,
147: /* shrw */ 2, OP_WORD, 0x29, OF_SHR,
148: /* stc */ 0, 0, 0xF9, OF_INH,
149: /* std */ 0, 0, 0xFD, OF_INH,
150: /* sti */ 0, 0, 0xFB, OF_INH,
151: /* stosw */ 0, 0, 0xAB, OF_INH,
152: /* stosb */ 0, 0, 0xAA, OF_INH,
153: /* sub */ 2, 0, 0x29, OF_DOPS,
154: /* subb */ 2, OP_BYTE, 0x28, OF_DOP,
155: /* subw */ 2, OP_WORD, 0x29, OF_DOPS,
156: /* test */ 2, 0, 0x85, OF_DOP,
157: /* testb */ 2, OP_BYTE, 0x84, OF_DOP,
158: /* testw */ 2, OP_WORD, 0x85, OF_DOP,
159: /* wait */ 0, 0, 0x9B, OF_INH,
160: /* xcall */ 1, OP_NPTR, 0x9A, OF_XCALL,
161: /* xchg */ 2, 0, 0x87, OF_DOP,
162: /* xchgb */ 2, OP_BYTE, 0x86, OF_DOP,
163: /* xjmp */ 1, OP_NPTR, 0xEA, OF_XCALL,
164: /* xor */ 2, 0, 0x31, OF_DOPS,
165: /* xorb */ 2, OP_BYTE, 0x30, OF_DOP,
166: /* xorw */ 2, OP_WORD, 0x31, OF_DOPS,
167: /* xret */ 0, 0, 0xCB, OF_INH,
168:
169: /* Specials. */
170: /* .byte */ 1, OP_DD|OP_NPTR, 0x00, OF_BYTE,
171: /* .word */ 1, OP_DD|OP_NPTR, 0x00, OF_WORD,
172: /* .long */ 1, OP_DD|OP_NPTR, 0x00, OF_LONG,
173: /* .long */ 1, OP_DD|OP_NPTR, 0x00, OF_LPTR,
174: /* .long */ 1, OP_DD|OP_NPTR, 0x00, OF_GPTR,
175:
176: /* Old, now unused, retained for no good reason. */
177: #if 0
178: /* aaa */ 0, 0, 0x37, OF_INH,
179: /* aad */ 0, 0, 0xD5, OF_INH2,
180: /* aam */ 0, 0, 0xD4, OF_INH2,
181: /* aas */ 0, 0, 0x3F, OF_INH,
182: /* adcb */ 2, OP_BYTE, 0x10, OF_DOP,
183: /* daa */ 0, 0, 0x27, OF_INH,
184: /* das */ 0, 0, 0x2F, OF_INH,
185: /* in */ 1, 0, 0xE5, OF_IN,
186: /* inb */ 1, OP_BYTE, 0xE4, OF_IN,
187: /* int */ 1, OP_NPTR, 0xCD, OF_INT,
188: /* into */ 0, 0, 0xCE, OF_INH,
189: /* lahf */ 0, 0, 0x9F, OF_INH,
190: /* lds */ 2, OP_DWORD, 0xC5, OF_LEA,
191: /* les */ 2, OP_DWORD, 0xC4, OF_LEA,
192: /* out */ 1, 0, 0xE7, OF_OUT,
193: /* outb */ 1, OP_BYTE, 0xE6, OF_OUT,
194: /* sahf */ 0, 0, 0x9E, OF_INH,
195: /* sbbb */ 2, OP_BYTE, 0x18, OF_DOP,
196: /* xlat */ 0, 0, 0xD7, OF_INH,
197: #endif
198:
199: #if 1
200: /* faddd */ 1, 0, 0x04, OF_FRM,
201: /* faddf */ 1, 0, 0x00, OF_FRM,
202: /* faddl */ 1, 0, 0x02, OF_FRM,
203: /* faddi */ 1, 0, 0x06, OF_FRM,
204: /* fsubd */ 1, 0, 0x24, OF_FRM,
205: /* fsubf */ 1, 0, 0x20, OF_FRM,
206: /* fsubl */ 1, 0, 0x22, OF_FRM,
207: /* fsubi */ 1, 0, 0x26, OF_FRM,
208: /* frsubd */ 1, 0, 0x2C, OF_FRM,
209: /* frsubf */ 1, 0, 0x28, OF_FRM,
210: /* frsubl */ 1, 0, 0x2A, OF_FRM,
211: /* frsubi */ 1, 0, 0x2E, OF_FRM,
212: /* fcompp */ 0, 0, 0xD9, OF_FDE,
213: /* fcompd */ 1, 0, 0x1C, OF_FRM,
214: /* fcompf */ 1, 0, 0x18, OF_FRM,
215: /* fcompl */ 1, 0, 0x1A, OF_FRM,
216: /* fcompi */ 1, 0, 0x1E, OF_FRM,
217: /* fmuld */ 1, 0, 0x0C, OF_FRM,
218: /* fmulf */ 1, 0, 0x08, OF_FRM,
219: /* fmull */ 1, 0, 0x0A, OF_FRM,
220: /* fmuli */ 1, 0, 0x0E, OF_FRM,
221: /* fdivd */ 1, 0, 0x34, OF_FRM,
222: /* fdivf */ 1, 0, 0x30, OF_FRM,
223: /* fdivl */ 1, 0, 0x32, OF_FRM,
224: /* fdivi */ 1, 0, 0x36, OF_FRM,
225: /* frdivd */ 1, 0, 0x3C, OF_FRM,
226: /* frdivf */ 1, 0, 0x38, OF_FRM,
227: /* frdivl */ 1, 0, 0x3A, OF_FRM,
228: /* frdivi */ 1, 0, 0x3E, OF_FRM,
229: /* fchs */ 0, 0, 0xE0, OF_FD9,
230: /* ftst */ 0, 0, 0xE4, OF_FD9,
231: /* fldz */ 0, 0, 0xEE, OF_FD9,
232: /* fld1 */ 0, 0, 0xE8, OF_FD9,
233: /* fstsw */ 1, 0, 0x3D, OF_FRM,
234: /* fldd */ 1, 0, 0x05, OF_FRM,
235: /* fldf */ 1, 0, 0x01, OF_FRM,
236: /* fldl */ 1, 0, 0x03, OF_FRM,
237: /* fldi */ 1, 0, 0x07, OF_FRM,
238: /* fldt */ 1, 0, 0x2B, OF_FRM,
239: /* fstd */ 1, 0, 0x15, OF_FRM,
240: /* fstf */ 1, 0, 0x11, OF_FRM,
241: /* fstl */ 1, 0, 0x13, OF_FRM,
242: /* fsti */ 1, 0, 0x17, OF_FRM,
243: /* fstpd */ 1, 0, 0x1D, OF_FRM,
244: /* fstpf */ 1, 0, 0x19, OF_FRM,
245: /* fstpl */ 1, 0, 0x1B, OF_FRM,
246: /* fstpi */ 1, 0, 0x1F, OF_FRM,
247: /* fstpt */ 1, 0, 0x3B, OF_FRM,
248: /* fwait */ 0, 0, 0x9B, OF_FWAIT,
249: /* fdrop */ 0, 0, 0xD8, OF_FDD,
250:
251: /* Unused, retained for no good reason. */
252: #if 0
253: /* fadd */ 0, 0, 0xC1, OF_FDE,
254: /* fsub */ 0, 0, 0xE1, OF_FDE,
255: /* frsub */ 0, 0, 0xE9, OF_FDE,
256: /* fmul */ 0, 0, 0xC9, OF_FDE,
257: /* fdiv */ 0, 0, 0xF1, OF_FDE,
258: /* frdiv */ 0, 0, 0xF9, OF_FDE,
259: #endif
260: #endif
261: };
262:
263: /* end of n2/i386/optab.c */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.