* configure.tgt (spu-*-elf*): Delete targ_extra_ofiles.
[deliverable/binutils-gdb.git] / opcodes / maxq-dis.c
1 /* Instruction printing code for the MAXQ
2
3 Copyright 2004, 2005 Free Software Foundation, Inc.
4
5 Written by Vineet Sharma(vineets@noida.hcltech.com) Inderpreet
6 S.(inderpreetb@noida.hcltech.com)
7
8 This file is part of GDB.
9
10 This program is free software; you can redistribute it and/or modify it
11 under the terms of the GNU General Public License as published by the Free
12 Software Foundation; either version 2 of the License, or (at your option)
13 any later version.
14
15 This program is distributed in the hope that it will be useful, but
16 WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
17 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
18 for more details.
19
20 You should have received a copy of the GNU General Public License along
21 with this program; if not, write to the Free Software Foundation, Inc.,
22 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */
23
24 #include "sysdep.h"
25 #include "dis-asm.h"
26 #include "opcode/maxq.h"
27
28 struct _group_info
29 {
30 unsigned char group_no;
31 unsigned char sub_opcode;
32 unsigned char src;
33 unsigned char dst;
34 unsigned char fbit;
35 unsigned char bit_no;
36 unsigned char flag;
37
38 };
39
40 typedef struct _group_info group_info;
41
42 #define SRC 0x01
43 #define DST 0x02
44 #define FORMAT 0x04
45 #define BIT_NO 0x08
46 #define SUB_OP 0x10
47
48 #define MASK_LOW_BYTE 0x0f
49 #define MASK_HIGH_BYTE 0xf0
50
51 /* Flags for retrieving the bits from the op-code. */
52 #define _DECODE_LOWNIB_LOWBYTE 0x000f
53 #define _DECODE_HIGHNIB_LOWBYTE 0x00f0
54 #define _DECODE_LOWNIB_HIGHBYTE 0x0f00
55 #define _DECODE_HIGHNIB_HIGHBYTE 0xf000
56 #define _DECODE_HIGHBYTE 0xff00
57 #define _DECODE_LOWBYTE 0x00ff
58 #define _DECODE_4TO6_HIGHBYTE 0x7000
59 #define _DECODE_4TO6_LOWBYTE 0x0070
60 #define _DECODE_0TO6_HIGHBYTE 0x7f00
61 #define _DECODE_0TO2_HIGHBYTE 0x0700
62 #define _DECODE_GET_F_HIGHBYTE 0x8000
63 #define _DECODE_BIT7_HIGHBYTE 0x8000
64 #define _DECODE_BIT7_LOWBYTE 0x0080
65 #define _DECODE_GET_CARRY 0x10000
66 #define _DECODE_BIT0_LOWBYTE 0x1
67 #define _DECODE_BIT6AND7_HIGHBYTE 0xc000
68
69 /* Module and Register Indexed of System Registers. */
70 #define _CURR_ACC_MODINDEX 0xa
71 #define _CURR_ACC_REGINDEX 0x0
72 #define _PSF_REG_MODINDEX 0x8
73 #define _PSF_REG_REGINDEX 0x4
74 #define _PFX_REG_MODINDEX 0xb
75 #define _PFX0_REG_REGINDEX 0x0
76 #define _PFX2_REG_REGINDEX 0x2
77 #define _DP_REG_MODINDEX 0xf
78 #define _DP0_REG_REGINDEX 0x3
79 #define _DP1_REG_REGINDEX 0x7
80 #define _IP_REG_MODINDEX 0xc
81 #define _IP_REG_REGINDEX 0x0
82 #define _IIR_REG_MODINDEX 0x8
83 #define _IIR_REG_REGINDEX 0xb
84 #define _SP_REG_MODINDEX 0xd
85 #define _SP_REG_REGINDEX 0x1
86 #define _IC_REG_MODINDEX 0x8
87 #define _IC_REG_REGINDEX 0x5
88 #define _LC_REG_MODINDEX 0xe
89 #define _LC0_REG_REGINDEX 0x0
90 #define _LC1_REG_REGINDEX 0x1
91 #define _LC2_REG_REGINDEX 0x2
92 #define _LC3_REG_REGINDEX 0x3
93
94 /* Flags for finding the bits in PSF Register. */
95 #define SIM_ALU_DECODE_CARRY_BIT_POS 0x2
96 #define SIM_ALU_DECODE_SIGN_BIT_POS 0x40
97 #define SIM_ALU_DECODE_ZERO_BIT_POS 0x80
98 #define SIM_ALU_DECODE_EQUAL_BIT_POS 0x1
99 #define SIM_ALU_DECODE_IGE_BIT_POS 0x1
100
101 /* Number Of Op-code Groups. */
102 unsigned char const SIM_ALU_DECODE_OPCODE_GROUPS = 11;
103
104 /* Op-code Groups. */
105 unsigned char const SIM_ALU_DECODE_LOGICAL_XCHG_OP_GROUP = 1;
106
107 /* Group1: AND/OR/XOR/ADD/SUB Operations: fxxx 1010 ssss ssss. */
108 unsigned char const SIM_ALU_DECODE_AND_OR_ADD_SUB_OP_GROUP = 2;
109
110 /* Group2: Logical Operations: 1000 1010 xxxx 1010. */
111 unsigned char const SIM_ALU_DECODE_BIT_OP_GROUP = 3;
112
113 /* XCHG/Bit Operations: 1xxx 1010 xxxx 1010. */
114 unsigned char const SIM_ALU_DECODE_SET_DEST_BIT_GROUP = 4;
115
116 /* Move value in bit of destination register: 1ddd dddd xbbb 0111. */
117 unsigned char const SIM_ALU_DECODE_JUMP_OP_GROUP = 5;
118
119 #define JUMP_CHECK(insn) \
120 ( ((insn & _DECODE_4TO6_HIGHBYTE) == 0x0000) \
121 || ((insn & _DECODE_4TO6_HIGHBYTE) == 0x2000) \
122 || ((insn & _DECODE_4TO6_HIGHBYTE) == 0x6000) \
123 || ((insn & _DECODE_4TO6_HIGHBYTE) == 0x1000) \
124 || ((insn & _DECODE_4TO6_HIGHBYTE) == 0x5000) \
125 || ((insn & _DECODE_4TO6_HIGHBYTE) == 0x3000) \
126 || ((insn & _DECODE_4TO6_HIGHBYTE) == 0x7000) \
127 || ((insn & _DECODE_4TO6_HIGHBYTE) == 0x4000) )
128
129 /* JUMP operations: fxxx 1100 ssss ssss */
130 unsigned char const SIM_ALU_DECODE_RET_OP_GROUP = 6;
131
132 /* RET Operations: 1xxx 1100 0000 1101 */
133 unsigned char const SIM_ALU_DECODE_MOVE_SRC_DST_GROUP = 7;
134
135 /* Move src into dest register: fddd dddd ssss ssss */
136 unsigned char const SIM_ALU_DECODE_SET_SRC_BIT_GROUP = 8;
137
138 /* Move value in bit of source register: fbbb 0111 ssss ssss */
139 unsigned char const SIM_ALU_DECODE_DJNZ_CALL_PUSH_OP_GROUP = 9;
140
141 /* PUSH, DJNZ and CALL operations: fxxx 1101 ssss ssss */
142 unsigned char const SIM_ALU_DECODE_POP_OP_GROUP = 10;
143
144 /* POP operation: 1ddd dddd 0000 1101 */
145 unsigned char const SIM_ALU_DECODE_CMP_SRC_OP_GROUP = 11;
146
147 /* GLOBAL */
148 char unres_reg_name[20];
149
150 static char *
151 get_reg_name (unsigned char reg_code, type1 arg_pos)
152 {
153 unsigned char module;
154 unsigned char index;
155 int ix = 0;
156 reg_entry const *reg_x;
157 mem_access_syntax const *syntax;
158 mem_access *mem_acc;
159
160 module = 0;
161 index = 0;
162 module = (reg_code & MASK_LOW_BYTE);
163 index = (reg_code & MASK_HIGH_BYTE);
164 index = index >> 4;
165
166 /* Search the system register table. */
167 for (reg_x = &system_reg_table[0]; reg_x->reg_name != NULL; ++reg_x)
168 if ((reg_x->Mod_name == module) && (reg_x->Mod_index == index))
169 return reg_x->reg_name;
170
171 /* Serch pheripheral table. */
172 for (ix = 0; ix < num_of_reg; ix++)
173 {
174 reg_x = &new_reg_table[ix];
175
176 if ((reg_x->Mod_name == module) && (reg_x->Mod_index == index))
177 return reg_x->reg_name;
178 }
179
180 for (mem_acc = &mem_table[0]; mem_acc->name != NULL || !mem_acc; ++mem_acc)
181 {
182 if (reg_code == mem_acc->opcode)
183 {
184 for (syntax = mem_access_syntax_table;
185 mem_access_syntax_table != NULL || mem_access_syntax_table->name;
186 ++syntax)
187 if (!strcmp (mem_acc->name, syntax->name))
188 {
189 if ((arg_pos == syntax->type) || (syntax->type == BOTH))
190 return mem_acc->name;
191
192 break;
193 }
194 }
195 }
196
197 memset (unres_reg_name, 0, 20);
198 sprintf (unres_reg_name, "%01x%01xh", index, module);
199
200 return unres_reg_name;
201 }
202
203 static bfd_boolean
204 check_move (unsigned char insn0, unsigned char insn8)
205 {
206 bfd_boolean first = FALSE;
207 bfd_boolean second = FALSE;
208 char *first_reg;
209 char *second_reg;
210 reg_entry const *reg_x;
211 const unsigned char module1 = insn0 & MASK_LOW_BYTE;
212 const unsigned char index1 = ((insn0 & 0x70) >> 4);
213 const unsigned char module2 = insn8 & MASK_LOW_BYTE;
214 const unsigned char index2 = ((insn8 & MASK_HIGH_BYTE) >> 4);
215
216 /* DST */
217 if (((insn0 & MASK_LOW_BYTE) == MASK_LOW_BYTE)
218 && ((index1 == 0) || (index1 == 1) || (index1 == 2) || (index1 == 5)
219 || (index1 == 4) || (index1 == 6)))
220 first = TRUE;
221
222 else if (((insn0 & MASK_LOW_BYTE) == 0x0D) && (index1 == 0))
223 first = TRUE;
224
225 else if ((module1 == 0x0E)
226 && ((index1 == 0) || (index1 == 1) || (index1 == 2)))
227 first = TRUE;
228
229 else
230 {
231 for (reg_x = &system_reg_table[0]; reg_x->reg_name != NULL && reg_x;
232 ++reg_x)
233 {
234 if ((reg_x->Mod_name == module1) && (reg_x->Mod_index == index1)
235 && ((reg_x->rtype == Reg_16W) || (reg_x->rtype == Reg_8W)))
236 {
237 /* IP not allowed. */
238 if ((reg_x->Mod_name == 0x0C) && (reg_x->Mod_index == 0x00))
239 continue;
240
241 /* A[AP] not allowed. */
242 if ((reg_x->Mod_name == 0x0A) && (reg_x->Mod_index == 0x01))
243 continue;
244 first_reg = reg_x->reg_name;
245 first = TRUE;
246 break;
247 }
248 }
249 }
250
251 if (!first)
252 /* No need to check further. */
253 return FALSE;
254
255 if (insn0 & 0x80)
256 {
257 /* SRC */
258 if (((insn8 & MASK_LOW_BYTE) == MASK_LOW_BYTE)
259 && ((index2 == 0) || (index2 == 1) || (index2 == 2) || (index2 == 4)
260 || (index2 == 5) || (index2 == 6)))
261 second = TRUE;
262
263 else if (((insn8 & MASK_LOW_BYTE) == 0x0D) && (index2 == 0))
264 second = TRUE;
265
266 else if ((module2 == 0x0E)
267 && ((index2 == 0) || (index2 == 1) || (index2 == 2)))
268 second = TRUE;
269
270 else
271 {
272 for (reg_x = &system_reg_table[0];
273 reg_x->reg_name != NULL && reg_x;
274 ++reg_x)
275 {
276 if ((reg_x->Mod_name == (insn8 & MASK_LOW_BYTE))
277 && (reg_x->Mod_index == (((insn8 & 0xf0) >> 4))))
278 {
279 second = TRUE;
280 second_reg = reg_x->reg_name;
281 break;
282 }
283 }
284 }
285
286 if (second)
287 {
288 if ((module1 == 0x0A && index1 == 0x0)
289 && (module2 == 0x0A && index2 == 0x01))
290 return FALSE;
291
292 return TRUE;
293 }
294
295 return FALSE;
296 }
297
298 return first;
299 }
300
301 static void
302 maxq_print_arg (MAX_ARG_TYPE arg,
303 struct disassemble_info * info,
304 group_info grp)
305 {
306 switch (arg)
307 {
308 case FLAG_C:
309 info->fprintf_func (info->stream, "C");
310 break;
311 case FLAG_NC:
312 info->fprintf_func (info->stream, "NC");
313 break;
314
315 case FLAG_Z:
316 info->fprintf_func (info->stream, "Z");
317 break;
318
319 case FLAG_NZ:
320 info->fprintf_func (info->stream, "NZ");
321 break;
322
323 case FLAG_S:
324 info->fprintf_func (info->stream, "S");
325 break;
326
327 case FLAG_E:
328 info->fprintf_func (info->stream, "E");
329 break;
330
331 case FLAG_NE:
332 info->fprintf_func (info->stream, "NE");
333 break;
334
335 case ACC_BIT:
336 info->fprintf_func (info->stream, "Acc");
337 if ((grp.flag & BIT_NO) == BIT_NO)
338 info->fprintf_func (info->stream, ".%d", grp.bit_no);
339 break;
340
341 case A_BIT_0:
342 info->fprintf_func (info->stream, "#0");
343 break;
344 case A_BIT_1:
345 info->fprintf_func (info->stream, "#1");
346 break;
347
348 default:
349 break;
350 }
351 }
352
353 static unsigned char
354 get_group (const unsigned int insn)
355 {
356 if (check_move ((insn >> 8), (insn & _DECODE_LOWBYTE)))
357 return 8;
358
359 if ((insn & _DECODE_LOWNIB_HIGHBYTE) == 0x0A00)
360 {
361 /* && condition with sec part added on 26 May for resolving 2 & 3 grp
362 conflict. */
363 if (((insn & _DECODE_LOWNIB_LOWBYTE) == 0x000A)
364 && ((insn & _DECODE_GET_F_HIGHBYTE) == 0x8000))
365 {
366 if ((insn & _DECODE_HIGHNIB_HIGHBYTE) == 0x8000)
367 return 2;
368 else
369 return 3;
370 }
371
372 return 1;
373 }
374 else if ((insn & _DECODE_LOWNIB_HIGHBYTE) == 0x0C00)
375 {
376 if (((insn & _DECODE_LOWBYTE) == 0x000D) && JUMP_CHECK (insn)
377 && ((insn & _DECODE_GET_F_HIGHBYTE) == 0x8000))
378 return 6;
379 else if ((insn & _DECODE_LOWBYTE) == 0x008D)
380 return 7;
381
382 return 5;
383 }
384 else if (((insn & _DECODE_LOWNIB_HIGHBYTE) == 0x0D00)
385 && (((insn & _DECODE_4TO6_HIGHBYTE) == 0x3000)
386 || ((insn & _DECODE_4TO6_HIGHBYTE) == 0x4000)
387 || ((insn & _DECODE_4TO6_HIGHBYTE) == 0x5000)
388 || ((insn & _DECODE_4TO6_HIGHBYTE) == 0x0000)))
389 return 10;
390
391 else if ((insn & _DECODE_LOWBYTE) == 0x000D)
392 return 11;
393
394 else if ((insn & _DECODE_LOWBYTE) == 0x008D)
395 return 12;
396
397 else if ((insn & _DECODE_0TO6_HIGHBYTE) == 0x7800)
398 return 13;
399
400 else if ((insn & _DECODE_LOWNIB_HIGHBYTE) == 0x0700)
401 return 9;
402
403 else if (((insn & _DECODE_LOWNIB_LOWBYTE) == 0x0007)
404 && ((insn & _DECODE_GET_F_HIGHBYTE) == 0x8000))
405 return 4;
406
407 return 8;
408 }
409
410 static void
411 get_insn_opcode (const unsigned int insn, group_info *i)
412 {
413 static unsigned char pfx_flag = 0;
414 static unsigned char count_for_pfx = 0;
415
416 i->flag ^= i->flag;
417 i->bit_no ^= i->bit_no;
418 i->dst ^= i->dst;
419 i->fbit ^= i->fbit;
420 i->group_no ^= i->group_no;
421 i->src ^= i->src;
422 i->sub_opcode ^= i->sub_opcode;
423
424 if (count_for_pfx > 0)
425 count_for_pfx++;
426
427 if (((insn >> 8) == 0x0b) || ((insn >> 8) == 0x2b))
428 {
429 pfx_flag = 1;
430 count_for_pfx = 1;
431 }
432
433 i->group_no = get_group (insn);
434
435 if (pfx_flag && (i->group_no == 0x0D) && (count_for_pfx == 2)
436 && ((insn & _DECODE_0TO6_HIGHBYTE) == 0x7800))
437 {
438 i->group_no = 0x08;
439 count_for_pfx = 0;
440 pfx_flag ^= pfx_flag;
441 }
442
443 switch (i->group_no)
444 {
445 case 1:
446 i->sub_opcode = ((insn & _DECODE_4TO6_HIGHBYTE) >> 12);
447 i->flag |= SUB_OP;
448 i->src = ((insn & _DECODE_LOWBYTE));
449 i->flag |= SRC;
450 i->fbit = ((insn & _DECODE_GET_F_HIGHBYTE) >> 15);
451 i->flag |= FORMAT;
452 break;
453
454 case 2:
455 i->sub_opcode = ((insn & _DECODE_HIGHNIB_LOWBYTE) >> 4);
456 i->flag |= SUB_OP;
457 break;
458
459 case 3:
460 i->sub_opcode = ((insn & _DECODE_HIGHNIB_HIGHBYTE) >> 12);
461 i->flag |= SUB_OP;
462 i->bit_no = ((insn & _DECODE_HIGHNIB_LOWBYTE) >> 4);
463 i->flag |= BIT_NO;
464 break;
465
466 case 4:
467 i->sub_opcode = ((insn & _DECODE_BIT7_LOWBYTE) >> 7);
468 i->flag |= SUB_OP;
469 i->dst = ((insn & _DECODE_0TO6_HIGHBYTE) >> 8);
470 i->flag |= DST;
471 i->bit_no = ((insn & _DECODE_4TO6_LOWBYTE) >> 4);
472 i->flag |= BIT_NO;
473 break;
474
475 case 5:
476 i->sub_opcode = ((insn & _DECODE_4TO6_HIGHBYTE) >> 12);
477 i->flag |= SUB_OP;
478 i->src = ((insn & _DECODE_LOWBYTE));
479 i->flag |= SRC;
480 i->fbit = ((insn & _DECODE_GET_F_HIGHBYTE) >> 15);
481 i->flag |= FORMAT;
482 break;
483
484 case 6:
485 i->sub_opcode = ((insn & _DECODE_HIGHNIB_HIGHBYTE) >> 12);
486 i->flag |= SUB_OP;
487 break;
488
489 case 7:
490 i->sub_opcode = ((insn & _DECODE_HIGHNIB_HIGHBYTE) >> 12);
491 i->flag |= SUB_OP;
492 break;
493
494 case 8:
495 i->dst = ((insn & _DECODE_0TO6_HIGHBYTE) >> 8);
496 i->flag |= DST;
497 i->src = ((insn & _DECODE_LOWBYTE));
498 i->flag |= SRC;
499 i->fbit = ((insn & _DECODE_GET_F_HIGHBYTE) >> 15);
500 i->flag |= FORMAT;
501 break;
502
503 case 9:
504 i->sub_opcode = ((insn & _DECODE_0TO2_HIGHBYTE) >> 8);
505 i->flag |= SUB_OP;
506 i->bit_no = ((insn & _DECODE_4TO6_HIGHBYTE) >> 12);
507 i->flag |= BIT_NO;
508 i->fbit = ((insn & _DECODE_GET_F_HIGHBYTE) >> 15);
509 i->flag |= FORMAT;
510 i->src = ((insn & _DECODE_LOWBYTE));
511 i->flag |= SRC;
512 break;
513
514 case 10:
515 i->sub_opcode = ((insn & _DECODE_4TO6_HIGHBYTE) >> 12);
516 i->flag |= SUB_OP;
517 i->src = ((insn & _DECODE_LOWBYTE));
518 i->flag |= SRC;
519 i->fbit = ((insn & _DECODE_GET_F_HIGHBYTE) >> 15);
520 i->flag |= FORMAT;
521 break;
522
523 case 11:
524 i->dst = ((insn & _DECODE_0TO6_HIGHBYTE) >> 8);
525 i->flag |= DST;
526 break;
527
528 case 12:
529 i->dst = ((insn & _DECODE_0TO6_HIGHBYTE) >> 8);
530 i->flag |= DST;
531 break;
532
533 case 13:
534 i->sub_opcode = ((insn & _DECODE_4TO6_HIGHBYTE) >> 12);
535 i->flag |= SUB_OP;
536 i->src = ((insn & _DECODE_LOWBYTE));
537 i->flag |= SRC;
538 i->fbit = ((insn & _DECODE_GET_F_HIGHBYTE) >> 15);
539 i->flag |= FORMAT;
540 break;
541
542 }
543 return;
544 }
545
546
547 /* Print one instruction from MEMADDR on INFO->STREAM. Return the size of the
548 instruction (always 2 on MAXQ20). */
549
550 static int
551 print_insn (bfd_vma memaddr, struct disassemble_info *info,
552 enum bfd_endian endianess)
553 {
554 /* The raw instruction. */
555 unsigned char insn[2], insn0, insn8, derived_code;
556 unsigned int format;
557 unsigned int actual_operands;
558 unsigned int i;
559 /* The group_info collected/decoded. */
560 group_info grp;
561 MAXQ20_OPCODE_INFO const *opcode;
562 int status;
563
564 format = 0;
565
566 status = info->read_memory_func (memaddr, (bfd_byte *) & insn[0], 2, info);
567
568 if (status != 0)
569 {
570 info->memory_error_func (status, memaddr, info);
571 return -1;
572 }
573
574 insn8 = insn[1];
575 insn0 = insn[0];
576
577 /* FIXME: Endianness always little. */
578 if (endianess == BFD_ENDIAN_BIG)
579 get_insn_opcode (((insn[0] << 8) | (insn[1])), &grp);
580 else
581 get_insn_opcode (((insn[1] << 8) | (insn[0])), &grp);
582
583 derived_code = ((grp.group_no << 4) | grp.sub_opcode);
584
585 if (insn[0] == 0 && insn[1] == 0)
586 {
587 info->fprintf_func (info->stream, "00 00");
588 return 2;
589 }
590
591 /* The opcode is always in insn0. */
592 for (opcode = &op_table[0]; opcode->name != NULL; ++opcode)
593 {
594 if (opcode->instr_id == derived_code)
595 {
596 if (opcode->instr_id == 0x3D)
597 {
598 if ((grp.bit_no == 0) && (opcode->arg[1] != A_BIT_0))
599 continue;
600 if ((grp.bit_no == 1) && (opcode->arg[1] != A_BIT_1))
601 continue;
602 if ((grp.bit_no == 3) && (opcode->arg[0] != 0))
603 continue;
604 }
605
606 info->fprintf_func (info->stream, "%s ", opcode->name);
607
608 actual_operands = 0;
609
610 if ((grp.flag & SRC) == SRC)
611 actual_operands++;
612
613 if ((grp.flag & DST) == DST)
614 actual_operands++;
615
616 /* If Implict FLAG in the Instruction. */
617 if ((opcode->op_number > actual_operands)
618 && !((grp.flag & SRC) == SRC) && !((grp.flag & DST) == DST))
619 {
620 for (i = 0; i < opcode->op_number; i++)
621 {
622 if (i == 1 && (opcode->arg[1] != NO_ARG))
623 info->fprintf_func (info->stream, ",");
624 maxq_print_arg (opcode->arg[i], info, grp);
625 }
626 }
627
628 /* DST is ABSENT in the grp. */
629 if ((opcode->op_number > actual_operands)
630 && ((grp.flag & SRC) == SRC))
631 {
632 maxq_print_arg (opcode->arg[0], info, grp);
633 info->fprintf_func (info->stream, " ");
634
635 if (opcode->instr_id == 0xA4)
636 info->fprintf_func (info->stream, "LC[0]");
637
638 if (opcode->instr_id == 0xA5)
639 info->fprintf_func (info->stream, "LC[1]");
640
641 if ((grp.flag & SRC) == SRC)
642 info->fprintf_func (info->stream, ",");
643 }
644
645 if ((grp.flag & DST) == DST)
646 {
647 if ((grp.flag & BIT_NO) == BIT_NO)
648 {
649 info->fprintf_func (info->stream, " %s.%d",
650 get_reg_name (grp.dst,
651 (type1) 0 /*DST*/),
652 grp.bit_no);
653 }
654 else
655 info->fprintf_func (info->stream, " %s",
656 get_reg_name (grp.dst, (type1) 0));
657 }
658
659 /* SRC is ABSENT in the grp. */
660 if ((opcode->op_number > actual_operands)
661 && ((grp.flag & DST) == DST))
662 {
663 info->fprintf_func (info->stream, ",");
664 maxq_print_arg (opcode->arg[1], info, grp);
665 info->fprintf_func (info->stream, " ");
666 }
667
668 if ((grp.flag & SRC) == SRC)
669 {
670 if ((grp.flag & DST) == DST)
671 info->fprintf_func (info->stream, ",");
672
673 if ((grp.flag & BIT_NO) == BIT_NO)
674 {
675 format = opcode->format;
676
677 if ((grp.flag & FORMAT) == FORMAT)
678 format = grp.fbit;
679 if (format == 1)
680 info->fprintf_func (info->stream, " %s.%d",
681 get_reg_name (grp.src,
682 (type1) 1 /*SRC*/),
683 grp.bit_no);
684 if (format == 0)
685 info->fprintf_func (info->stream, " #%02xh.%d",
686 grp.src, grp.bit_no);
687 }
688 else
689 {
690 format = opcode->format;
691
692 if ((grp.flag & FORMAT) == FORMAT)
693 format = grp.fbit;
694 if (format == 1)
695 info->fprintf_func (info->stream, " %s",
696 get_reg_name (grp.src,
697 (type1) 1 /*SRC*/));
698 if (format == 0)
699 info->fprintf_func (info->stream, " #%02xh",
700 (grp.src));
701 }
702 }
703
704 return 2;
705 }
706 }
707
708 info->fprintf_func (info->stream, "Unable to Decode : %02x %02x",
709 insn[0], insn[1]);
710 return 2;
711 }
712
713 int
714 print_insn_maxq_little (bfd_vma memaddr, struct disassemble_info *info)
715 {
716 return print_insn (memaddr, info, BFD_ENDIAN_LITTLE);
717 }
This page took 0.043659 seconds and 4 git commands to generate.