Commit | Line | Data |
---|---|---|
2a24676e DF |
1 | /* |
2 | * Copyright (c) 1983 Regents of the University of California. | |
3 | * All rights reserved. The Berkeley software License Agreement | |
4 | * specifies the terms and conditions for redistribution. | |
5 | */ | |
be1518bb | 6 | |
2a24676e | 7 | #ifndef lint |
5b756389 | 8 | static char sccsid[] = "@(#)ops.vax.c 5.5 (Berkeley) %G%"; |
2a24676e | 9 | #endif not lint |
0022c355 | 10 | |
5b756389 | 11 | static char rcsid[] = "$Header: ops.vax.c,v 1.3 88/10/26 19:12:17 donn Exp $"; |
be1518bb ML |
12 | |
13 | /* | |
14 | * Machine operators. | |
15 | */ | |
16 | ||
17 | #include "defs.h" | |
c372bb62 | 18 | #include "ops.h" |
be1518bb ML |
19 | |
20 | #ifndef public | |
21 | typedef unsigned char VaxOpcode; | |
22 | ||
23 | #define O_HALT 0x00 /* halt */ | |
24 | #define O_NOP 0x01 /* no operation */ | |
25 | #define O_REI 0x02 /* return from exception or interrupt */ | |
26 | #define O_BPT 0x03 /* break point fault */ | |
27 | #define O_RET 0x04 /* return from called procedure */ | |
28 | #define O_RSB 0x05 /* return from subroutine */ | |
29 | #define O_LDPCTX 0x06 /* load process context */ | |
30 | #define O_SVPCTX 0x07 /* save process context */ | |
31 | #define O_CVTPS 0x08 /* convert packed to leading separate numeric */ | |
32 | #define O_CVTSP 0x09 /* convert leading separate numeric to packed */ | |
33 | #define O_INDEX 0x0A /* compute index */ | |
34 | #define O_CRC 0x0B /* calculate cyclic redundancy check */ | |
35 | #define O_PROBER 0x0C /* probe read access */ | |
36 | #define O_PROBEW 0x0D /* probe write access */ | |
37 | #define O_INSQUE 0x0E /* insert into queue */ | |
38 | #define O_REMQUE 0x0F /* remove from queue */ | |
39 | #define O_BSBB 0x10 /* branch to subroutine with byte disp */ | |
40 | #define O_BRB 0x11 /* branch with byte disp */ | |
41 | #define O_BNEQ 0x12 /* branch on not equal (also BNEQU) */ | |
42 | #define O_BEQL 0x13 /* branch on equal (also BEQLU */ | |
43 | #define O_BGTR 0x14 /* branch on greater */ | |
44 | #define O_BLEQ 0x15 /* branch on less or equal */ | |
45 | #define O_JSB 0x16 /* jump to subroutine */ | |
46 | #define O_JMP 0x17 /* jump */ | |
47 | #define O_BGEQ 0x18 /* branch on greater or equal */ | |
48 | #define O_BLSS 0x19 /* branch on less */ | |
49 | #define O_BGTRU 0x1A /* branch on greater unsigned */ | |
50 | #define O_BLEQU 0x1B /* branch on less of equal unsigned */ | |
51 | #define O_BVC 0x1C /* branch on overflow clear */ | |
52 | #define O_BVS 0x1D /* branch on overflow set */ | |
53 | #define O_BCC 0x1E /* branch on carry clear (also BGEQU) */ | |
54 | #define O_BCS 0x1F /* branch on carry set (also BLSSU) */ | |
55 | #define O_ADDP4 0x20 /* add packed 4 operand */ | |
56 | #define O_ADDP6 0x21 /* add packed 6 operand */ | |
57 | #define O_SUBP4 0x22 /* subtract packed 4 operand */ | |
58 | #define O_SUBP6 0x23 /* subtract packed 6 operand */ | |
59 | #define O_CVTPT 0x24 /* convert packed to trailing numeric */ | |
60 | #define O_MULP 0x25 /* multiply packed */ | |
61 | #define O_CVTTP 0x26 /* convert trailing numeric to packed */ | |
62 | #define O_DIVP 0x27 /* divide packed */ | |
63 | #define O_MOVC3 0x28 /* move character 3 operand */ | |
64 | #define O_CMPC3 0x29 /* compare character 3 operand */ | |
65 | #define O_SCANC 0x2A /* scan for character */ | |
66 | #define O_SPANC 0x2B /* span characters */ | |
67 | #define O_MOVC5 0x2C /* move character 5 operand */ | |
68 | #define O_CMPC5 0x2D /* compare character 5 operand */ | |
69 | #define O_MOVTC 0x2E /* move translated characters */ | |
70 | #define O_MOVTUC 0x2F /* move translated until character */ | |
71 | #define O_BSBW 0x30 /* branch to subroutine with word disp */ | |
72 | #define O_BRW 0x31 /* branch with word disp */ | |
73 | #define O_CVTWL 0x32 /* convert word to long */ | |
74 | #define O_CVTWB 0x33 /* convert word to byte */ | |
75 | #define O_MOVP 0x34 /* move packed */ | |
76 | #define O_CMPP3 0x35 /* compare packed 3 operand */ | |
77 | #define O_CVTPL 0x36 /* convert packed to long */ | |
78 | #define O_CMPP4 0x37 /* compare packed 4 operand */ | |
79 | #define O_EDITPC 0x38 /* edit packed to character */ | |
80 | #define O_MATCHC 0x39 /* match characters */ | |
81 | #define O_LOCC 0x3A /* locate characters */ | |
82 | #define O_SKPC 0x3B /* skip character */ | |
83 | #define O_MOVZWL 0x3C /* move zero-extended word to long */ | |
84 | #define O_ACBW 0x3D /* add compare and branch word */ | |
85 | #define O_MOVAW 0x3E /* move address of word */ | |
86 | #define O_PUSHAW 0x3F /* push address of word */ | |
87 | #define O_ADDF2 0x40 /* add floating 2 operand */ | |
88 | #define O_ADDF3 0x41 /* add floating 3 operand */ | |
89 | #define O_SUBF2 0x42 /* subtract floating 2 operand */ | |
90 | #define O_SUBF3 0x43 /* subtract floating 3 operand */ | |
91 | #define O_MULF2 0x44 /* multiply floating 2 operand */ | |
92 | #define O_MULF3 0x45 /* multiply floating 3 operand */ | |
93 | #define O_DIVF2 0x46 /* divide floating 2 operand */ | |
94 | #define O_DIVF3 0x47 /* divide floating 3 operand */ | |
95 | #define O_CVTFB 0x48 /* convert float to byte */ | |
96 | #define O_CVTFW 0x49 /* convert float to word */ | |
97 | #define O_CVTFL 0x4A /* convert float to long */ | |
98 | #define O_CVTRFL 0x4B /* convert rounded float to long */ | |
99 | #define O_CVTBF 0x4C /* convert byte to float */ | |
100 | #define O_CVTWF 0x4D /* convert word to float */ | |
101 | #define O_CVTLF 0x4E /* convert long to float */ | |
102 | #define O_ACBF 0x4F /* add compare and branch floating */ | |
103 | #define O_MOVF 0x50 /* move float */ | |
104 | #define O_CMPF 0x51 /* compare floating */ | |
105 | #define O_MNEGF 0x52 /* move negated floating */ | |
106 | #define O_TSTF 0x53 /* test float */ | |
107 | #define O_EMODF 0x54 /* extended modulus floating */ | |
108 | #define O_POLYF 0x55 /* evaluate polynomial floating */ | |
109 | #define O_CVTFD 0x56 /* convert float to double */ | |
110 | #define O_DUMMY57 0x57 /* RESERVED to DIGITAL */ | |
111 | #define O_ADAWI 0x58 /* add aligned word interlocked */ | |
112 | #define O_DUMMY59 0x59 /* RESERVED to DIGITAL */ | |
113 | #define O_DUMMY5a 0x5A /* RESERVED to DIGITAL */ | |
114 | #define O_DUMMY5b 0x5B /* RESERVED to DIGITAL */ | |
115 | #define O_INSQHI 0x5C /* insert into queue head, interlocked */ | |
116 | #define O_INSQTI 0x5D /* insert into queue tail, interlocked */ | |
117 | #define O_REMQHI 0x5E /* remove from queue head, interlocked */ | |
118 | #define O_REMQTI 0x5F /* remove from queue tail, interlocked */ | |
119 | #define O_ADDD2 0x60 /* add double 2 operand */ | |
120 | #define O_ADDD3 0x61 /* add double 3 operand */ | |
121 | #define O_SUBD2 0x62 /* subtract double 2 operand */ | |
122 | #define O_SUBD3 0x63 /* subtrace double 3 operand */ | |
123 | #define O_MULD2 0x64 /* multiply double 2 operand */ | |
124 | #define O_MULD3 0x65 /* multiply double 3 operand */ | |
125 | #define O_DIVD2 0x66 /* divide double 2 operand */ | |
126 | #define O_DIVD3 0x67 /* divide double 3 operand */ | |
127 | #define O_CVTDB 0x68 /* convert double to byte */ | |
128 | #define O_CVTDW 0x69 /* convert double to word */ | |
129 | #define O_CVTDL 0x6A /* convert double to long */ | |
130 | #define O_CVTRDL 0x6B /* convert rounded double to long */ | |
131 | #define O_CVTBD 0x6C /* convert byte to double */ | |
132 | #define O_CVTWD 0x6D /* convert word to double */ | |
133 | #define O_CVTLD 0x6E /* convert long to double */ | |
134 | #define O_ACBD 0x6F /* add compare and branch double */ | |
135 | #define O_MOVD 0x70 /* move double */ | |
136 | #define O_CMPD 0x71 /* compare double */ | |
137 | #define O_MNEGD 0x72 /* move negated double */ | |
138 | #define O_TSTD 0x73 /* test double */ | |
139 | #define O_EMODD 0x74 /* extended modulus double */ | |
140 | #define O_POLYD 0x75 /* evaluate polynomial double */ | |
141 | #define O_CVTDF 0x76 /* convert double to float */ | |
142 | #define O_DUMMY77 0x77 /* RESERVED to DIGITAL */ | |
143 | #define O_ASHL 0x78 /* arithmetic shift long */ | |
144 | #define O_ASHQ 0x79 /* arithmetic shift quad */ | |
145 | #define O_EMUL 0x7A /* extended multiply */ | |
146 | #define O_EDIV 0x7B /* extended divide */ | |
147 | #define O_CLRQ 0x7C /* clear quad (also CLRD) */ | |
148 | #define O_MOVQ 0x7D /* move quad */ | |
149 | #define O_MOVAQ 0x7E /* move address of quad (also MOVAD) */ | |
150 | #define O_PUSHAQ 0x7F /* push address of quad (also PUSHAD) */ | |
151 | #define O_ADDB2 0x80 /* add byte 2 operand */ | |
152 | #define O_ADDB3 0x81 /* add byte 3 operand */ | |
153 | #define O_SUBB2 0x82 /* subtract byte 2 operand */ | |
154 | #define O_SUBB3 0x83 /* subtract byte 3 operand */ | |
155 | #define O_MULB2 0x84 /* multiply byte 2 operand */ | |
156 | #define O_MULB3 0x85 /* multiply byte 3 operand */ | |
157 | #define O_DIVB2 0x86 /* divide byte 2 operand */ | |
158 | #define O_DIVB3 0x87 /* divide byte 3 operand */ | |
159 | #define O_BISB2 0x88 /* bit set byte 2 operand */ | |
160 | #define O_BISB3 0x89 /* bit set byte 3 operand */ | |
161 | #define O_BICB2 0x8A /* bit clear byte 2 operand */ | |
162 | #define O_BICB3 0x8B /* bit clear byte 3 operand */ | |
163 | #define O_XORB2 0x8C /* exclusive or byte 2 operand */ | |
164 | #define O_XORB3 0x8D /* exclusive or byte 3 operand */ | |
165 | #define O_MNEGB 0x8E /* move negated byte */ | |
166 | #define O_CASEB 0x8F /* case byte */ | |
167 | #define O_MOVB 0x90 /* move byte */ | |
168 | #define O_CMPB 0x91 /* compare byte */ | |
169 | #define O_MCOMB 0x92 /* move complemented byte */ | |
170 | #define O_BITB 0x93 /* bit test byte */ | |
171 | #define O_CLRB 0x94 /* clear byte */ | |
172 | #define O_TSTB 0x95 /* test byte */ | |
173 | #define O_INCB 0x96 /* increment byte */ | |
174 | #define O_DECB 0x97 /* decrement byte */ | |
175 | #define O_CVTBL 0x98 /* convert byte to long */ | |
176 | #define O_CVTBW 0x99 /* convert byte to word */ | |
177 | #define O_MOVZBL 0x9A /* move zero-extended byte to long */ | |
178 | #define O_MOVZBW 0x9B /* move zero-extended byte to word */ | |
179 | #define O_ROTL 0x9C /* rotate long */ | |
180 | #define O_ACBB 0x9D /* add compare and branch byte */ | |
181 | #define O_MOVAB 0x9E /* move address of byte */ | |
182 | #define O_PUSHAB 0x9F /* push address of byte */ | |
183 | #define O_ADDW2 0xA0 /* add word 2 operand */ | |
184 | #define O_ADDW3 0xA1 /* add word 3 operand */ | |
185 | #define O_SUBW2 0xA2 /* subtract word 2 operand */ | |
186 | #define O_SUBW3 0xA3 /* subtract word 3 operand */ | |
187 | #define O_MULW2 0xA4 /* multiply word 2 operand */ | |
188 | #define O_MULW3 0xA5 /* multiply word 3 operand */ | |
189 | #define O_DIVW2 0xA6 /* divide word 2 operand */ | |
190 | #define O_DIVW3 0xA7 /* divide word 3 operand */ | |
191 | #define O_BISW2 0xA8 /* bit set word 2 operand */ | |
192 | #define O_BISW3 0xA9 /* bit set word 3 operand */ | |
193 | #define O_BICW2 0xAA /* bit clear word 2 operand */ | |
194 | #define O_BICW3 0xAB /* bit clear word 3 operand */ | |
195 | #define O_XORW2 0xAC /* exclusive or word 2 operand */ | |
196 | #define O_XORW3 0xAD /* exclusive or word 3 operand */ | |
197 | #define O_MNEGW 0xAE /* move negated word */ | |
198 | #define O_CASEW 0xAF /* case word */ | |
199 | #define O_MOVW 0xB0 /* move word */ | |
200 | #define O_CMPW 0xB1 /* compare word */ | |
201 | #define O_MCOMW 0xB2 /* move complemented word */ | |
202 | #define O_BITW 0xB3 /* bit test word */ | |
203 | #define O_CLRW 0xB4 /* clear word */ | |
204 | #define O_TSTW 0xB5 /* test word */ | |
205 | #define O_INCW 0xB6 /* increment word */ | |
206 | #define O_DECW 0xB7 /* decrement word */ | |
207 | #define O_BISPSW 0xB8 /* bit set processor status word */ | |
208 | #define O_BICPSW 0xB9 /* bit clear processor status word */ | |
209 | #define O_POPR 0xBA /* pop register */ | |
210 | #define O_PUSHR 0xBB /* push register */ | |
211 | #define O_CHMK 0xBC /* change mode to kernel */ | |
212 | #define O_CHME 0xBD /* change mode to executive */ | |
213 | #define O_CHMS 0xBE /* change mode to supervisor */ | |
214 | #define O_CHMU 0xBF /* change mode to user */ | |
215 | #define O_ADDL2 0xC0 /* add long 2 operand */ | |
216 | #define O_ADDL3 0xC1 /* add long 3 operand */ | |
217 | #define O_SUBL2 0xC2 /* subtract long 2 operand */ | |
218 | #define O_SUBL3 0xC3 /* subtract long 3 operand */ | |
219 | #define O_MULL2 0xC4 /* multiply long 2 operand */ | |
220 | #define O_MULL3 0xC5 /* multiply long 3 operand */ | |
221 | #define O_DIVL2 0xC6 /* divide long 2 operand */ | |
222 | #define O_DIVL3 0xC7 /* divide long 3 operand */ | |
223 | #define O_BISL2 0xC8 /* bit set long 2 operand */ | |
224 | #define O_BISL3 0xC9 /* bit set long 3 operand */ | |
225 | #define O_BICL2 0xCA /* bit clear long 2 operand */ | |
226 | #define O_BICL3 0xCB /* bit clear long 3 operand */ | |
227 | #define O_XORL2 0xCC /* exclusive or long 2 operand */ | |
228 | #define O_XORL3 0xCD /* exclusive or long 3 operand */ | |
229 | #define O_MNEGL 0xCE /* move negated long */ | |
230 | #define O_CASEL 0xCF /* case long */ | |
231 | #define O_MOVL 0xD0 /* move long */ | |
232 | #define O_CMPL 0xD1 /* compare long */ | |
233 | #define O_MCOML 0xD2 /* move complemented long */ | |
234 | #define O_BITL 0xD3 /* bit test long */ | |
235 | #define O_CLRL 0xD4 /* clear long (also CLRF) */ | |
236 | #define O_TSTL 0xD5 /* test long */ | |
237 | #define O_INCL 0xD6 /* increment long */ | |
238 | #define O_DECL 0xD7 /* decrement long */ | |
239 | #define O_ADWC 0xD8 /* add with carry */ | |
240 | #define O_SBWC 0xD9 /* subtrace with carry */ | |
241 | #define O_MTPR 0xDA /* move to processor register */ | |
242 | #define O_MFPR 0xDB /* move from processor register */ | |
243 | #define O_MOVPSL 0xDC /* move processor status longword */ | |
244 | #define O_PUSHL 0xDD /* push long */ | |
245 | #define O_MOVAL 0xDE /* move address of long (also MOVAF) */ | |
246 | #define O_PUSHAL 0xDF /* push address of long (also PUSHAF) */ | |
247 | #define O_BBS 0xE0 /* branch on bit set */ | |
248 | #define O_BBC 0xE1 /* branch on bit clear */ | |
249 | #define O_BBSS 0xE2 /* branch on bit set and set */ | |
250 | #define O_BBCS 0xE3 /* branch on bit clear and set */ | |
251 | #define O_BBSC 0xE4 /* branch on bit set and clear */ | |
252 | #define O_BBCC 0xE5 /* branch on bit clear and clear */ | |
253 | #define O_BBSSI 0xE6 /* branch on bit set and set interlocked */ | |
254 | #define O_BBCCI 0xE7 /* branch on bit clear and clear interlocked */ | |
255 | #define O_BLBS 0xE8 /* branch on low bit set */ | |
256 | #define O_BLBC 0xE9 /* branch on low bit clear */ | |
257 | #define O_FFS 0xEA /* find first set bit */ | |
258 | #define O_FFC 0xEB /* find first clear bit */ | |
259 | #define O_CMPV 0xEC /* compare field */ | |
260 | #define O_CMPZV 0xED /* compare zero-extended field */ | |
261 | #define O_EXTV 0xEE /* extract field */ | |
262 | #define O_EXTZV 0xEF /* extract zero-extended field */ | |
263 | #define O_INSV 0xF0 /* insert field */ | |
264 | #define O_ACBL 0xF1 /* add compare and branch long */ | |
265 | #define O_AOBLSS 0xF2 /* add one and branch on less */ | |
266 | #define O_AOBLEQ 0xF3 /* add one and branch on less or equal */ | |
267 | #define O_SOBGEQ 0xF4 /* subtract one and branch on gtr or equal */ | |
268 | #define O_SOBGTR 0xF5 /* subtract one and branch on greater */ | |
269 | #define O_CVTLB 0xF6 /* convert long to byte */ | |
270 | #define O_CVTLW 0xF7 /* convert long to word */ | |
271 | #define O_ASHP 0xF8 /* arithmetic shift and round packed */ | |
272 | #define O_CVTLP 0xF9 /* convert long to packed */ | |
273 | #define O_CALLG 0xFA /* call with general argument list */ | |
274 | #define O_CALLS 0xFB /* call with stack */ | |
275 | #define O_XFC 0xFC /* extended function call */ | |
276 | #define O_ESCD 0xFD /* ESCD to DIGITAL */ | |
277 | #define O_ESCE 0xFE /* ESCE to DIGITAL */ | |
278 | #define O_ESCF 0xFF /* ESCF to DIGITAL */ | |
279 | ||
be1518bb ML |
280 | /* |
281 | * Addressing modes. | |
282 | */ | |
283 | ||
284 | #define LITSHORT 0x0 /* short literals */ | |
285 | #define LITUPTO31 0x1 | |
286 | #define LITUPTO47 0x2 | |
287 | #define LITUPTO63 0x3 | |
288 | #define INDEX 0x4 /* i[r] */ | |
289 | #define REG 0x5 /* r */ | |
290 | #define REGDEF 0x6 /* (r) */ | |
291 | #define AUTODEC 0x7 /* -(r) */ | |
292 | #define AUTOINC 0x8 /* (r)+ */ | |
293 | #define AUTOINCDEF 0x9 /* *(r)+ */ | |
294 | #define BYTEDISP 0xA /* BD(r) */ | |
295 | #define BYTEDISPDEF 0xB /* *BD(r) */ | |
296 | #define WORDDISP 0xC /* WD(r) */ | |
297 | #define WORDDISPDEF 0xD /* *WD(r) */ | |
298 | #define LONGDISP 0xE /* LD(r) */ | |
299 | #define LONGDISPDEF 0xF /* *LD(r) */ | |
300 | ||
301 | #define is_branch_disp(arg) ((arg & ACCB) != 0) | |
5b756389 | 302 | #define typelen(arg) (arg & 0xF) |
be1518bb ML |
303 | #define regnm(mode) (mode & 0xF) |
304 | #define addrmode(mode) (mode >> 4) | |
305 | ||
306 | /* | |
307 | * Operator information structure. | |
308 | */ | |
309 | ||
310 | typedef struct { | |
311 | char *iname; | |
5b756389 DS |
312 | unsigned char format; |
313 | unsigned char val; | |
be1518bb ML |
314 | char numargs; |
315 | char argtype[6]; | |
316 | } Optab; | |
317 | ||
f7d73473 DS |
318 | #ifndef ASINSTRS |
319 | #define ASINSTRS "../../bin/as/as.vax/instrs.h" | |
be1518bb ML |
320 | #endif |
321 | ||
f7d73473 DS |
322 | #ifndef ADBINSTRS |
323 | #define ADBINSTRS "../../bin/adb/adb.vax/instrs.adb" | |
324 | #endif | |
325 | ||
326 | #define INSTTAB | |
327 | #include ASINSTRS | |
328 | ||
329 | #endif | |
330 | ||
331 | #define OP(name,eopcode,popdcode,nargs,a1,a2,a3,a4,a5,a6) {name,eopcode,popdcode,nargs,a1,a2,a3,a4,a5,a6} | |
332 | ||
be1518bb | 333 | public Optab optab[] = { |
f7d73473 DS |
334 | #include ADBINSTRS |
335 | 0}; | |
be1518bb ML |
336 | |
337 | /* | |
338 | * Register names. | |
339 | */ | |
340 | ||
341 | public String regname[] = { | |
342 | "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", | |
343 | "r8", "r9", "r10","r11","ap", "fp", "sp", "pc" | |
344 | }; | |
345 | ||
346 | /* | |
347 | * Floating point immediate operands. | |
348 | */ | |
349 | ||
350 | public String fltimm[] = { | |
351 | "0.5", "0.5625", "0.625", "0.6875", "0.75", "0.8125", "0.875", "0.9375", | |
352 | "1.0", "1.125", "1.25", "1.375", "1.5", "1.625", "1.75", "1.875", | |
353 | "2.0", "2.25", "2.5", "2.75", "3.0", "3.25", "3.5", "3.75", | |
354 | "4.0", "4.5", "5.0", "5.5", "6.0", "6.5", "7.0", "7.5", | |
355 | "8.0", "9.0", "10.0", "11.0", "12.0", "13.0", "14.0", "15.0", | |
356 | "16.0", "18.0", "20.0", "22.0", "24.0", "26.0", "28.0", "30.0", | |
357 | "32.0", "36.0", "40.0", "44.0", "48.0", "52.0", "56.0", "60.0", | |
358 | "64.0", "72.0", "80.0", "88.0", "96.0", "104.0", "112.0", "120.0" | |
359 | }; |