-static int lookup_opcode PARAMS (( struct d30v_insn *insn, long num, int is_long ));
-static void print_insn PARAMS (( struct disassemble_info *info, bfd_vma memaddr, long long num,
- struct d30v_insn *insn, int is_long ));
-static int extract_value PARAMS (( long long num, struct d30v_operand *oper, int is_long ));
-
-int
-print_insn_d30v (memaddr, info)
- bfd_vma memaddr;
- struct disassemble_info *info;
-{
- int status, i;
- bfd_byte buffer[12];
- unsigned long in1,in2;
- struct d30v_insn insn;
- long long num;
-
- insn.form = (struct d30v_format *)NULL;
-
- status = (*info->read_memory_func) (memaddr, buffer, 8, info);
- if (status != 0)
- {
- (*info->memory_error_func) (status, memaddr, info);
- return -1;
- }
- info->bytes_per_line = 8;
- info->bytes_per_chunk = 4;
- info->display_endian = BFD_ENDIAN_BIG;
- in1 = bfd_getb32 (buffer);
- in2 = bfd_getb32 (buffer+4);
-
- if (in1 & in2 & FM01)
- {
- /* LONG instruction */
- if (!lookup_opcode(&insn, in1, 1))
- {
- (*info->fprintf_func) (info->stream, ".long\t0x%x,0x%x",in1,in2);
- return 8;
- }
- num = (long long)in1 << 32 | in2;
- print_insn(info, memaddr, num, &insn, 1);
- }
- else
- {
- num = in1;
- if (!lookup_opcode(&insn, in1, 0))
- (*info->fprintf_func) (info->stream, ".long\t0x%x",in1);
- else
- print_insn(info, memaddr, num, &insn, 0);
-
- switch ( ((in1>>31)<<1) | (in2>>31) )
- {
- case 0:
- (*info->fprintf_func) (info->stream, "\t||\t");
- break;
- case 1:
- (*info->fprintf_func) (info->stream, "\t->\t");
- break;
- case 2:
- (*info->fprintf_func) (info->stream, "\t<-\t");
- default:
- break;
- }
-
- insn.form = (struct d30v_format *)NULL;
- num = in2;
- if (!lookup_opcode(&insn, in2, 0))
- (*info->fprintf_func) (info->stream, ".long\t0x%x",in2);
- else
- print_insn(info, memaddr, num, &insn, 0);
-
- }
- return 8;
-}
-