1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23: #include <stdio.h>
24: #include "dis-asm.h"
25:
26:
27:
28: struct alpha_opcode
29: {
30:
31: const char *name;
32:
33:
34:
35: unsigned opcode;
36:
37:
38:
39:
40:
41: unsigned mask;
42:
43:
44:
45:
46: unsigned flags;
47:
48:
49:
50:
51: unsigned char operands[4];
52: };
53:
54:
55:
56:
57: extern const struct alpha_opcode alpha_opcodes[];
58: extern const unsigned alpha_num_opcodes;
59:
60:
61:
62:
63: #define AXP_OPCODE_BASE 0x0001
64: #define AXP_OPCODE_EV4 0x0002
65: #define AXP_OPCODE_EV5 0x0004
66: #define AXP_OPCODE_EV6 0x0008
67: #define AXP_OPCODE_BWX 0x0100
68: #define AXP_OPCODE_CIX 0x0200
69: #define AXP_OPCODE_MAX 0x0400
70:
71: #define AXP_OPCODE_NOPAL (~(AXP_OPCODE_EV4|AXP_OPCODE_EV5|AXP_OPCODE_EV6))
72:
73:
74: #define AXP_OP(i) (((i) >> 26) & 0x3F)
75:
76:
77: #define AXP_NOPS 0x40
78:
79: ^L
80:
81:
82: struct alpha_operand
83: {
84:
85: unsigned int bits : 5;
86:
87:
88: unsigned int shift : 5;
89:
90:
91: signed int default_reloc : 16;
92:
93:
94: unsigned int flags : 16;
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112: unsigned (*insert) PARAMS ((unsigned instruction, int op,
113: const char **errmsg));
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132: int (*extract) PARAMS ((unsigned instruction, int *invalid));
133: };
134:
135:
136:
137:
138: extern const struct alpha_operand alpha_operands[];
139: extern const unsigned alpha_num_operands;
140:
141:
142:
143:
144: #define AXP_OPERAND_TYPECHECK_MASK \
145: (AXP_OPERAND_PARENS | AXP_OPERAND_COMMA | AXP_OPERAND_IR | \
146: AXP_OPERAND_FPR | AXP_OPERAND_RELATIVE | AXP_OPERAND_SIGNED | \
147: AXP_OPERAND_UNSIGNED)
148:
149:
150:
151:
152:
153:
154:
155: #define AXP_OPERAND_FAKE 01
156:
157:
158:
159:
160: #define AXP_OPERAND_PARENS 02
161:
162:
163:
164: #define AXP_OPERAND_COMMA 04
165:
166:
167: #define AXP_OPERAND_IR 010
168:
169:
170: #define AXP_OPERAND_FPR 020
171:
172:
173:
174: #define AXP_OPERAND_RELATIVE 040
175:
176:
177: #define AXP_OPERAND_SIGNED 0100
178:
179:
180:
181: #define AXP_OPERAND_UNSIGNED 0200
182:
183:
184: #define AXP_OPERAND_NOOVERFLOW 0400
185:
186:
187: #define AXP_OPERAND_OPTIONAL_MASK 07000
188:
189:
190: #define AXP_OPERAND_DEFAULT_ZERO 01000
191:
192:
193:
194:
195:
196: #define AXP_OPERAND_DEFAULT_FIRST 02000
197:
198:
199:
200: #define AXP_OPERAND_DEFAULT_SECOND 04000
201:
202: ^L
203:
204:
205: #define AXP_REG_V0 0
206: #define AXP_REG_T0 1
207: #define AXP_REG_T1 2
208: #define AXP_REG_T2 3
209: #define AXP_REG_T3 4
210: #define AXP_REG_T4 5
211: #define AXP_REG_T5 6
212: #define AXP_REG_T6 7
213: #define AXP_REG_T7 8
214: #define AXP_REG_S0 9
215: #define AXP_REG_S1 10
216: #define AXP_REG_S2 11
217: #define AXP_REG_S3 12
218: #define AXP_REG_S4 13
219: #define AXP_REG_S5 14
220: #define AXP_REG_FP 15
221: #define AXP_REG_A0 16
222: #define AXP_REG_A1 17
223: #define AXP_REG_A2 18
224: #define AXP_REG_A3 19
225: #define AXP_REG_A4 20
226: #define AXP_REG_A5 21
227: #define AXP_REG_T8 22
228: #define AXP_REG_T9 23
229: #define AXP_REG_T10 24
230: #define AXP_REG_T11 25
231: #define AXP_REG_RA 26
232: #define AXP_REG_PV 27
233: #define AXP_REG_T12 27
234: #define AXP_REG_AT 28
235: #define AXP_REG_GP 29
236: #define AXP_REG_SP 30
237: #define AXP_REG_ZERO 31
238:
239: #define bfd_mach_alpha_ev4 0x10
240: #define bfd_mach_alpha_ev5 0x20
241: #define bfd_mach_alpha_ev6 0x30
242:
243: enum bfd_reloc_code_real {
244: BFD_RELOC_23_PCREL_S2,
245: BFD_RELOC_ALPHA_HINT
246: };
247:
248:
249:
250:
251:
252:
253:
254:
255:
256:
257:
258:
259:
260:
261:
262:
263:
264:
265:
266:
267:
268:
269:
270:
271:
272:
273:
274: ^L
275:
276:
277: static unsigned insert_rba PARAMS((unsigned, int, const char **));
278: static unsigned insert_rca PARAMS((unsigned, int, const char **));
279: static unsigned insert_za PARAMS((unsigned, int, const char **));
280: static unsigned insert_zb PARAMS((unsigned, int, const char **));
281: static unsigned insert_zc PARAMS((unsigned, int, const char **));
282: static unsigned insert_bdisp PARAMS((unsigned, int, const char **));
283: static unsigned insert_jhint PARAMS((unsigned, int, const char **));
284: static unsigned insert_ev6hwjhint PARAMS((unsigned, int, const char **));
285:
286: static int extract_rba PARAMS((unsigned, int *));
287: static int extract_rca PARAMS((unsigned, int *));
288: static int extract_za PARAMS((unsigned, int *));
289: static int extract_zb PARAMS((unsigned, int *));
290: static int extract_zc PARAMS((unsigned, int *));
291: static int extract_bdisp PARAMS((unsigned, int *));
292: static int extract_jhint PARAMS((unsigned, int *));
293: static int extract_ev6hwjhint PARAMS((unsigned, int *));
294:
295: ^L
296:
297:
298: const struct alpha_operand alpha_operands[] =
299: {
300:
301:
302: #define UNUSED 0
303: { 0, 0, 0, 0, 0, 0 },
304:
305:
306: #define RA (UNUSED + 1)
307: { 5, 21, 0, AXP_OPERAND_IR, 0, 0 },
308: #define RB (RA + 1)
309: { 5, 16, 0, AXP_OPERAND_IR, 0, 0 },
310: #define RC (RB + 1)
311: { 5, 0, 0, AXP_OPERAND_IR, 0, 0 },
312:
313:
314: #define FA (RC + 1)
315: { 5, 21, 0, AXP_OPERAND_FPR, 0, 0 },
316: #define FB (FA + 1)
317: { 5, 16, 0, AXP_OPERAND_FPR, 0, 0 },
318: #define FC (FB + 1)
319: { 5, 0, 0, AXP_OPERAND_FPR, 0, 0 },
320:
321:
322: #define ZA (FC + 1)
323: { 5, 21, 0, AXP_OPERAND_FAKE, insert_za, extract_za },
324: #define ZB (ZA + 1)
325: { 5, 16, 0, AXP_OPERAND_FAKE, insert_zb, extract_zb },
326: #define ZC (ZB + 1)
327: { 5, 0, 0, AXP_OPERAND_FAKE, insert_zc, extract_zc },
328:
329:
330: #define PRB (ZC + 1)
331: { 5, 16, 0, AXP_OPERAND_IR|AXP_OPERAND_PARENS, 0, 0 },
332:
333:
334: #define CPRB (PRB + 1)
335: { 5, 16, 0,
336: AXP_OPERAND_IR|AXP_OPERAND_PARENS|AXP_OPERAND_COMMA, 0, 0 },
337:
338:
339: #define RBA (CPRB + 1)
340: { 5, 16, 0, AXP_OPERAND_FAKE, insert_rba, extract_rba },
341:
342:
343: #define RCA (RBA + 1)
344: { 5, 0, 0, AXP_OPERAND_FAKE, insert_rca, extract_rca },
345:
346:
347: #define DRC1 (RCA + 1)
348: { 5, 0, 0,
349: AXP_OPERAND_IR|AXP_OPERAND_DEFAULT_FIRST, 0, 0 },
350:
351:
352: #define DRC2 (DRC1 + 1)
353: { 5, 0, 0,
354: AXP_OPERAND_IR|AXP_OPERAND_DEFAULT_SECOND, 0, 0 },
355:
356:
357: #define DFC1 (DRC2 + 1)
358: { 5, 0, 0,
359: AXP_OPERAND_FPR|AXP_OPERAND_DEFAULT_FIRST, 0, 0 },
360:
361:
362: #define DFC2 (DFC1 + 1)
363: { 5, 0, 0,
364: AXP_OPERAND_FPR|AXP_OPERAND_DEFAULT_SECOND, 0, 0 },
365:
366:
367: #define LIT (DFC2 + 1)
368: { 8, 13, -LIT, AXP_OPERAND_UNSIGNED, 0, 0 },
369:
370:
371:
372: #define MDISP (LIT + 1)
373: { 16, 0, -MDISP, AXP_OPERAND_SIGNED, 0, 0 },
374:
375:
376: #define BDISP (MDISP + 1)
377: { 21, 0, BFD_RELOC_23_PCREL_S2,
378: AXP_OPERAND_RELATIVE, insert_bdisp, extract_bdisp },
379:
380:
381: #define PALFN (BDISP + 1)
382: { 26, 0, -PALFN, AXP_OPERAND_UNSIGNED, 0, 0 },
383:
384:
385: #define JMPHINT (PALFN + 1)
386: { 14, 0, BFD_RELOC_ALPHA_HINT,
387: AXP_OPERAND_RELATIVE|AXP_OPERAND_DEFAULT_ZERO|AXP_OPERAND_NOOVERFLOW,
388: insert_jhint, extract_jhint },
389:
390:
391: #define RETHINT (JMPHINT + 1)
392: { 14, 0, -RETHINT,
393: AXP_OPERAND_UNSIGNED|AXP_OPERAND_DEFAULT_ZERO, 0, 0 },
394:
395:
396: #define EV4HWDISP (RETHINT + 1)
397: #define EV6HWDISP (EV4HWDISP)
398: { 12, 0, -EV4HWDISP, AXP_OPERAND_SIGNED, 0, 0 },
399:
400:
401: #define EV4HWINDEX (EV4HWDISP + 1)
402: { 5, 0, -EV4HWINDEX, AXP_OPERAND_UNSIGNED, 0, 0 },
403:
404:
405:
406: #define EV4EXTHWINDEX (EV4HWINDEX + 1)
407: { 8, 0, -EV4EXTHWINDEX, AXP_OPERAND_UNSIGNED, 0, 0 },
408:
409:
410: #define EV5HWDISP (EV4EXTHWINDEX + 1)
411: { 10, 0, -EV5HWDISP, AXP_OPERAND_SIGNED, 0, 0 },
412:
413:
414: #define EV5HWINDEX (EV5HWDISP + 1)
415: { 16, 0, -EV5HWINDEX, AXP_OPERAND_UNSIGNED, 0, 0 },
416:
417:
418:
419: #define EV6HWINDEX (EV5HWINDEX + 1)
420: { 16, 0, -EV6HWINDEX, AXP_OPERAND_UNSIGNED, 0, 0 },
421:
422:
423: #define EV6HWJMPHINT (EV6HWINDEX+ 1)
424: { 8, 0, -EV6HWJMPHINT,
425: AXP_OPERAND_RELATIVE|AXP_OPERAND_DEFAULT_ZERO|AXP_OPERAND_NOOVERFLOW,
426: insert_ev6hwjhint, extract_ev6hwjhint }
427: };
428:
429: const unsigned alpha_num_operands = sizeof(alpha_operands)/sizeof(*alpha_operands);
430:
431:
432:
433:
434:
435:
436:
437: static unsigned
438: insert_rba(insn, value, errmsg)
439: unsigned insn;
440: int value ATTRIBUTE_UNUSED;
441: const char **errmsg ATTRIBUTE_UNUSED;
442: {
443: return insn | (((insn >> 21) & 0x1f) << 16);
444: }
445:
446: static int
447: extract_rba(insn, invalid)
448: unsigned insn;
449: int *invalid;
450: {
451: if (invalid != (int *) NULL
452: && ((insn >> 21) & 0x1f) != ((insn >> 16) & 0x1f))
453: *invalid = 1;
454: return 0;
455: }
456:
457:
458:
459:
460:
461: static unsigned
462: insert_rca(insn, value, errmsg)
463: unsigned insn;
464: int value ATTRIBUTE_UNUSED;
465: const char **errmsg ATTRIBUTE_UNUSED;
466: {
467: return insn | ((insn >> 21) & 0x1f);
468: }
469:
470: static int
471: extract_rca(insn, invalid)
472: unsigned insn;
473: int *invalid;
474: {
475: if (invalid != (int *) NULL
476: && ((insn >> 21) & 0x1f) != (insn & 0x1f))
477: *invalid = 1;
478: return 0;
479: }
480:
481:
482:
483:
484:
485: static unsigned
486: insert_za(insn, value, errmsg)
487: unsigned insn;
488: int value ATTRIBUTE_UNUSED;
489: const char **errmsg ATTRIBUTE_UNUSED;
490: {
491: return insn | (31 << 21);
492: }
493:
494: static int
495: extract_za(insn, invalid)
496: unsigned insn;
497: int *invalid;
498: {
499: if (invalid != (int *) NULL && ((insn >> 21) & 0x1f) != 31)
500: *invalid = 1;
501: return 0;
502: }
503:
504:
505: static unsigned
506: insert_zb(insn, value, errmsg)
507: unsigned insn;
508: int value ATTRIBUTE_UNUSED;
509: const char **errmsg ATTRIBUTE_UNUSED;
510: {
511: return insn | (31 << 16);
512: }
513:
514: static int
515: extract_zb(insn, invalid)
516: unsigned insn;
517: int *invalid;
518: {
519: if (invalid != (int *) NULL && ((insn >> 16) & 0x1f) != 31)
520: *invalid = 1;
521: return 0;
522: }
523:
524:
525: static unsigned
526: insert_zc(insn, value, errmsg)
527: unsigned insn;
528: int value ATTRIBUTE_UNUSED;
529: const char **errmsg ATTRIBUTE_UNUSED;
530: {
531: return insn | 31;
532: }
533:
534: static int
535: extract_zc(insn, invalid)
536: unsigned insn;
537: int *invalid;
538: {
539: if (invalid != (int *) NULL && (insn & 0x1f) != 31)
540: *invalid = 1;
541: return 0;
542: }
543:
544:
545:
546:
547: static unsigned
548: insert_bdisp(insn, value, errmsg)
549: unsigned insn;
550: int value;
551: const char **errmsg;
552: {
553: if (errmsg != (const char **)NULL && (value & 3))
554: *errmsg = _("branch operand unaligned");
555: return insn | ((value / 4) & 0x1FFFFF);
556: }
557:
558:
559: static int
560: extract_bdisp(insn, invalid)
561: unsigned insn;
562: int *invalid ATTRIBUTE_UNUSED;
563: {
564: