Lines Matching +full:ext +full:- +full:address

9  * Copyright 1998-2001 Karl Stenerud.  All rights reserved.
31 * Daniel Collin <[email protected]> 2015-2016 */
154 #define BITFIELD_MASK(sb,eb) (((1 << ((sb) + 1))-1) & (~((1 << (eb))-1)))
161 const uint16_t v0 = info->code[addr + 0]; in m68k_read_disassembler_16()
162 const uint16_t v1 = info->code[addr + 1]; in m68k_read_disassembler_16()
168 const uint32_t v0 = info->code[addr + 0]; in m68k_read_disassembler_32()
169 const uint32_t v1 = info->code[addr + 1]; in m68k_read_disassembler_32()
170 const uint32_t v2 = info->code[addr + 2]; in m68k_read_disassembler_32()
171 const uint32_t v3 = info->code[addr + 3]; in m68k_read_disassembler_32()
177 const uint64_t v0 = info->code[addr + 0]; in m68k_read_disassembler_64()
178 const uint64_t v1 = info->code[addr + 1]; in m68k_read_disassembler_64()
179 const uint64_t v2 = info->code[addr + 2]; in m68k_read_disassembler_64()
180 const uint64_t v3 = info->code[addr + 3]; in m68k_read_disassembler_64()
181 const uint64_t v4 = info->code[addr + 4]; in m68k_read_disassembler_64()
182 const uint64_t v5 = info->code[addr + 5]; in m68k_read_disassembler_64()
183 const uint64_t v6 = info->code[addr + 6]; in m68k_read_disassembler_64()
184 const uint64_t v7 = info->code[addr + 7]; in m68k_read_disassembler_64()
188 static unsigned int m68k_read_safe_16(const m68k_info *info, const uint64_t address) in m68k_read_safe_16() argument
190 const uint64_t addr = (address - info->baseAddress) & info->address_mask; in m68k_read_safe_16()
191 if (info->code_len < addr + 2) { in m68k_read_safe_16()
197 static unsigned int m68k_read_safe_32(const m68k_info *info, const uint64_t address) in m68k_read_safe_32() argument
199 const uint64_t addr = (address - info->baseAddress) & info->address_mask; in m68k_read_safe_32()
200 if (info->code_len < addr + 4) { in m68k_read_safe_32()
206 static uint64_t m68k_read_safe_64(const m68k_info *info, const uint64_t address) in m68k_read_safe_64() argument
208 const uint64_t addr = (address - info->baseAddress) & info->address_mask; in m68k_read_safe_64()
209 if (info->code_len < addr + 8) { in m68k_read_safe_64()
295 if (!(info->type & ALLOWED_CPU_TYPES)) { \
301 static unsigned int peek_imm_8(const m68k_info *info) { return (m68k_read_safe_16((info), (info)->… in peek_imm_8()
302 static unsigned int peek_imm_16(const m68k_info *info) { return m68k_read_safe_16((info), (info)->p… in peek_imm_16()
303 static unsigned int peek_imm_32(const m68k_info *info) { return m68k_read_safe_32((info), (info)->p… in peek_imm_32()
304 …gned long long peek_imm_64(const m68k_info *info) { return m68k_read_safe_64((info), (info)->pc); } in peek_imm_64()
306 …m_8(m68k_info *info) { const unsigned int value = peek_imm_8(info); (info)->pc+=2; return value;… in read_imm_8()
307 …m_16(m68k_info *info) { const unsigned int value = peek_imm_16(info); (info)->pc+=2; return value;… in read_imm_16()
308 …m_32(m68k_info *info) { const unsigned int value = peek_imm_32(info); (info)->pc+=4; return value;… in read_imm_32()
309 …68k_info *info) { const unsigned long long value = peek_imm_64(info); (info)->pc+=8; return value;… in read_imm_64()
340 op->address_mode = M68K_AM_AREGI_INDEX_BASE_DISP; in get_with_index_address_mode()
346 op->mem.base_reg = M68K_REG_INVALID; in get_with_index_address_mode()
347 op->mem.index_reg = M68K_REG_INVALID; in get_with_index_address_mode()
356 …op->mem.in_disp = EXT_BASE_DISPLACEMENT_PRESENT(extension) ? (EXT_BASE_DISPLACEMENT_LONG(extension… in get_with_index_address_mode()
357 …op->mem.out_disp = EXT_OUTER_DISPLACEMENT_PRESENT(extension) ? (EXT_OUTER_DISPLACEMENT_LONG(extens… in get_with_index_address_mode()
361 op->mem.base_reg = M68K_REG_PC; in get_with_index_address_mode()
363 op->mem.base_reg = M68K_REG_A0 + (instruction & 7); in get_with_index_address_mode()
369 op->mem.index_reg = M68K_REG_A0 + EXT_INDEX_REGISTER(extension); in get_with_index_address_mode()
371 op->mem.index_reg = M68K_REG_D0 + EXT_INDEX_REGISTER(extension); in get_with_index_address_mode()
374 op->mem.index_size = EXT_INDEX_LONG(extension) ? 1 : 0; in get_with_index_address_mode()
377 op->mem.scale = 1 << EXT_INDEX_SCALE(extension); in get_with_index_address_mode()
385 op->address_mode = is_pc ? M68K_AM_PC_MEMI_PRE_INDEX : M68K_AM_MEMI_PRE_INDEX; in get_with_index_address_mode()
387 op->address_mode = is_pc ? M68K_AM_PC_MEMI_POST_INDEX : M68K_AM_MEMI_POST_INDEX; in get_with_index_address_mode()
393 …op->mem.index_reg = (EXT_INDEX_AR(extension) ? M68K_REG_A0 : M68K_REG_D0) + EXT_INDEX_REGISTER(ext… in get_with_index_address_mode()
394 op->mem.index_size = EXT_INDEX_LONG(extension) ? 1 : 0; in get_with_index_address_mode()
398 op->mem.base_reg = M68K_REG_PC; in get_with_index_address_mode()
399 op->address_mode = M68K_AM_PCI_INDEX_BASE_DISP; in get_with_index_address_mode()
401 op->mem.base_reg = M68K_REG_A0 + (instruction & 7); in get_with_index_address_mode()
405 op->mem.base_reg = M68K_REG_PC; in get_with_index_address_mode()
406 op->address_mode = M68K_AM_PCI_INDEX_8_BIT_DISP; in get_with_index_address_mode()
408 op->mem.base_reg = M68K_REG_A0 + (instruction & 7); in get_with_index_address_mode()
409 op->address_mode = M68K_AM_AREGI_INDEX_8_BIT_DISP; in get_with_index_address_mode()
412 op->mem.disp = (int8_t)(extension & 0xff); in get_with_index_address_mode()
416 op->mem.scale = 1 << EXT_INDEX_SCALE(extension); in get_with_index_address_mode()
420 /* Make string of effective address mode */
425 op->type = M68K_OP_MEM; in get_ea_mode_op()
430 op->address_mode = M68K_AM_REG_DIRECT_DATA; in get_ea_mode_op()
431 op->reg = M68K_REG_D0 + (instruction & 7); in get_ea_mode_op()
432 op->type = M68K_OP_REG; in get_ea_mode_op()
436 /* address register direct */ in get_ea_mode_op()
437 op->address_mode = M68K_AM_REG_DIRECT_ADDR; in get_ea_mode_op()
438 op->reg = M68K_REG_A0 + (instruction & 7); in get_ea_mode_op()
439 op->type = M68K_OP_REG; in get_ea_mode_op()
443 /* address register indirect */ in get_ea_mode_op()
444 op->address_mode = M68K_AM_REGI_ADDR; in get_ea_mode_op()
445 op->reg = M68K_REG_A0 + (instruction & 7); in get_ea_mode_op()
449 /* address register indirect with postincrement */ in get_ea_mode_op()
450 op->address_mode = M68K_AM_REGI_ADDR_POST_INC; in get_ea_mode_op()
451 op->reg = M68K_REG_A0 + (instruction & 7); in get_ea_mode_op()
455 /* address register indirect with predecrement */ in get_ea_mode_op()
456 op->address_mode = M68K_AM_REGI_ADDR_PRE_DEC; in get_ea_mode_op()
457 op->reg = M68K_REG_A0 + (instruction & 7); in get_ea_mode_op()
461 /* address register indirect with displacement*/ in get_ea_mode_op()
462 op->address_mode = M68K_AM_REGI_ADDR_DISP; in get_ea_mode_op()
463 op->mem.base_reg = M68K_REG_A0 + (instruction & 7); in get_ea_mode_op()
464 op->mem.disp = (int16_t)read_imm_16(info); in get_ea_mode_op()
468 /* address register indirect with index */ in get_ea_mode_op()
473 /* absolute short address */ in get_ea_mode_op()
474 op->address_mode = M68K_AM_ABSOLUTE_DATA_SHORT; in get_ea_mode_op()
475 op->imm = read_imm_16(info); in get_ea_mode_op()
479 /* absolute long address */ in get_ea_mode_op()
480 op->address_mode = M68K_AM_ABSOLUTE_DATA_LONG; in get_ea_mode_op()
481 op->imm = read_imm_32(info); in get_ea_mode_op()
486 op->address_mode = M68K_AM_PCI_DISP; in get_ea_mode_op()
487 op->mem.disp = (int16_t)read_imm_16(info); in get_ea_mode_op()
496 op->address_mode = M68K_AM_IMMEDIATE; in get_ea_mode_op()
497 op->type = M68K_OP_IMM; in get_ea_mode_op()
500 op->imm = read_imm_8(info) & 0xff; in get_ea_mode_op()
502 op->imm = read_imm_16(info) & 0xffff; in get_ea_mode_op()
504 op->imm = read_imm_32(info); in get_ea_mode_op()
506 op->imm = read_imm_64(info); in get_ea_mode_op()
517 info->groups[info->groups_count++] = (uint8_t)group; in set_insn_group()
522 cs_m68k* ext; in build_init_op() local
524 MCInst_setOpcode(info->inst, opcode); in build_init_op()
526 ext = &info->extension; in build_init_op()
528 ext->op_count = (uint8_t)count; in build_init_op()
529 ext->op_size.type = M68K_SIZE_TYPE_CPU; in build_init_op()
530 ext->op_size.cpu_size = size; in build_init_op()
532 return ext; in build_init_op()
539 cs_m68k* ext = build_init_op(info, opcode, 2, size); in build_re_gen_1() local
541 op0 = &ext->operands[0]; in build_re_gen_1()
542 op1 = &ext->operands[1]; in build_re_gen_1()
545 op0->address_mode = M68K_AM_REG_DIRECT_DATA; in build_re_gen_1()
546 op0->reg = M68K_REG_D0 + ((info->ir >> 9 ) & 7); in build_re_gen_1()
548 op0->address_mode = M68K_AM_REG_DIRECT_ADDR; in build_re_gen_1()
549 op0->reg = M68K_REG_A0 + ((info->ir >> 9 ) & 7); in build_re_gen_1()
552 get_ea_mode_op(info, op1, info->ir, size); in build_re_gen_1()
564 cs_m68k* ext = build_init_op(info, opcode, 2, size); in build_er_gen_1() local
566 op0 = &ext->operands[0]; in build_er_gen_1()
567 op1 = &ext->operands[1]; in build_er_gen_1()
569 get_ea_mode_op(info, op0, info->ir, size); in build_er_gen_1()
572 op1->address_mode = M68K_AM_REG_DIRECT_DATA; in build_er_gen_1()
573 op1->reg = M68K_REG_D0 + ((info->ir >> 9) & 7); in build_er_gen_1()
575 op1->address_mode = M68K_AM_REG_DIRECT_ADDR; in build_er_gen_1()
576 op1->reg = M68K_REG_A0 + ((info->ir >> 9) & 7); in build_er_gen_1()
585 cs_m68k* ext = build_init_op(info, opcode, 2, size); in build_rr() local
587 op0 = &ext->operands[0]; in build_rr()
588 op1 = &ext->operands[1]; in build_rr()
589 op2 = &ext->operands[2]; in build_rr()
591 op0->address_mode = M68K_AM_REG_DIRECT_DATA; in build_rr()
592 op0->reg = M68K_REG_D0 + (info->ir & 7); in build_rr()
594 op1->address_mode = M68K_AM_REG_DIRECT_DATA; in build_rr()
595 op1->reg = M68K_REG_D0 + ((info->ir >> 9) & 7); in build_rr()
598 ext->op_count = 3; in build_rr()
599 op2->type = M68K_OP_IMM; in build_rr()
600 op2->address_mode = M68K_AM_IMMEDIATE; in build_rr()
601 op2->imm = imm; in build_rr()
609 cs_m68k* ext = build_init_op(info, opcode, 2, size); in build_r() local
611 op0 = &ext->operands[0]; in build_r()
612 op1 = &ext->operands[1]; in build_r()
614 op0->address_mode = M68K_AM_REG_DIRECT_DATA; in build_r()
615 op0->reg = M68K_REG_D0 + ((info->ir >> 9) & 7); in build_r()
617 op1->address_mode = M68K_AM_REG_DIRECT_DATA; in build_r()
618 op1->reg = M68K_REG_D0 + (info->ir & 7); in build_r()
625 cs_m68k* ext = build_init_op(info, opcode, 2, size); in build_imm_ea() local
627 op0 = &ext->operands[0]; in build_imm_ea()
628 op1 = &ext->operands[1]; in build_imm_ea()
630 op0->type = M68K_OP_IMM; in build_imm_ea()
631 op0->address_mode = M68K_AM_IMMEDIATE; in build_imm_ea()
632 op0->imm = imm; in build_imm_ea()
634 get_ea_mode_op(info, op1, info->ir, size); in build_imm_ea()
641 cs_m68k* ext = build_init_op(info, opcode, 2, size); in build_3bit_d() local
643 op0 = &ext->operands[0]; in build_3bit_d()
644 op1 = &ext->operands[1]; in build_3bit_d()
646 op0->type = M68K_OP_IMM; in build_3bit_d()
647 op0->address_mode = M68K_AM_IMMEDIATE; in build_3bit_d()
648 op0->imm = g_3bit_qdata_table[(info->ir >> 9) & 7]; in build_3bit_d()
650 op1->address_mode = M68K_AM_REG_DIRECT_DATA; in build_3bit_d()
651 op1->reg = M68K_REG_D0 + (info->ir & 7); in build_3bit_d()
658 cs_m68k* ext = build_init_op(info, opcode, 2, size); in build_3bit_ea() local
660 op0 = &ext->operands[0]; in build_3bit_ea()
661 op1 = &ext->operands[1]; in build_3bit_ea()
663 op0->type = M68K_OP_IMM; in build_3bit_ea()
664 op0->address_mode = M68K_AM_IMMEDIATE; in build_3bit_ea()
665 op0->imm = g_3bit_qdata_table[(info->ir >> 9) & 7]; in build_3bit_ea()
667 get_ea_mode_op(info, op1, info->ir, size); in build_3bit_ea()
675 cs_m68k* ext = build_init_op(info, opcode, 2, size); in build_mm() local
677 op0 = &ext->operands[0]; in build_mm()
678 op1 = &ext->operands[1]; in build_mm()
679 op2 = &ext->operands[2]; in build_mm()
681 op0->address_mode = M68K_AM_REGI_ADDR_PRE_DEC; in build_mm()
682 op0->reg = M68K_REG_A0 + (info->ir & 7); in build_mm()
684 op1->address_mode = M68K_AM_REGI_ADDR_PRE_DEC; in build_mm()
685 op1->reg = M68K_REG_A0 + ((info->ir >> 9) & 7); in build_mm()
688 ext->op_count = 3; in build_mm()
689 op2->type = M68K_OP_IMM; in build_mm()
690 op2->address_mode = M68K_AM_IMMEDIATE; in build_mm()
691 op2->imm = imm; in build_mm()
697 cs_m68k* ext = build_init_op(info, opcode, 1, size); in build_ea() local
698 get_ea_mode_op(info, &ext->operands[0], info->ir, size); in build_ea()
705 cs_m68k* ext = build_init_op(info, opcode, 2, size); in build_ea_a() local
707 op0 = &ext->operands[0]; in build_ea_a()
708 op1 = &ext->operands[1]; in build_ea_a()
710 get_ea_mode_op(info, op0, info->ir, size); in build_ea_a()
712 op1->address_mode = M68K_AM_REG_DIRECT_ADDR; in build_ea_a()
713 op1->reg = M68K_REG_A0 + ((info->ir >> 9) & 7); in build_ea_a()
720 cs_m68k* ext = build_init_op(info, opcode, 2, size); in build_ea_ea() local
722 op0 = &ext->operands[0]; in build_ea_ea()
723 op1 = &ext->operands[1]; in build_ea_ea()
725 get_ea_mode_op(info, op0, info->ir, size); in build_ea_ea()
726 get_ea_mode_op(info, op1, (((info->ir>>9) & 7) | ((info->ir>>3) & 0x38)), size); in build_ea_ea()
733 cs_m68k* ext = build_init_op(info, opcode, 2, size); in build_pi_pi() local
735 op0 = &ext->operands[0]; in build_pi_pi()
736 op1 = &ext->operands[1]; in build_pi_pi()
738 op0->address_mode = M68K_AM_REGI_ADDR_POST_INC; in build_pi_pi()
739 op0->reg = M68K_REG_A0 + (info->ir & 7); in build_pi_pi()
741 op1->address_mode = M68K_AM_REGI_ADDR_POST_INC; in build_pi_pi()
742 op1->reg = M68K_REG_A0 + ((info->ir >> 9) & 7); in build_pi_pi()
749 cs_m68k* ext = build_init_op(info, opcode, 2, size); in build_imm_special_reg() local
751 op0 = &ext->operands[0]; in build_imm_special_reg()
752 op1 = &ext->operands[1]; in build_imm_special_reg()
754 op0->type = M68K_OP_IMM; in build_imm_special_reg()
755 op0->address_mode = M68K_AM_IMMEDIATE; in build_imm_special_reg()
756 op0->imm = imm; in build_imm_special_reg()
758 op1->address_mode = M68K_AM_NONE; in build_imm_special_reg()
759 op1->reg = reg; in build_imm_special_reg()
765 cs_m68k* ext = build_init_op(info, opcode, 1, size); in build_relative_branch() local
767 op = &ext->operands[0]; in build_relative_branch()
769 op->type = M68K_OP_BR_DISP; in build_relative_branch()
770 op->address_mode = M68K_AM_BRANCH_DISPLACEMENT; in build_relative_branch()
771 op->br_disp.disp = displacement; in build_relative_branch()
772 op->br_disp.disp_size = size; in build_relative_branch()
781 cs_m68k* ext = build_init_op(info, opcode, 1, size); in build_absolute_jump_with_immediate() local
783 op = &ext->operands[0]; in build_absolute_jump_with_immediate()
785 op->type = M68K_OP_IMM; in build_absolute_jump_with_immediate()
786 op->address_mode = M68K_AM_IMMEDIATE; in build_absolute_jump_with_immediate()
787 op->imm = immediate; in build_absolute_jump_with_immediate()
794 build_relative_branch(info, s_branch_lut[(info->ir >> 8) & 0xf], size, displacement); in build_bcc()
799 build_absolute_jump_with_immediate(info, s_trap_lut[(info->ir >> 8) & 0xf], size, immediate); in build_trap()
806 cs_m68k* ext = build_init_op(info, opcode, 2, size); in build_dbxx() local
808 op0 = &ext->operands[0]; in build_dbxx()
809 op1 = &ext->operands[1]; in build_dbxx()
811 op0->address_mode = M68K_AM_REG_DIRECT_DATA; in build_dbxx()
812 op0->reg = M68K_REG_D0 + (info->ir & 7); in build_dbxx()
814 op1->type = M68K_OP_BR_DISP; in build_dbxx()
815 op1->address_mode = M68K_AM_BRANCH_DISPLACEMENT; in build_dbxx()
816 op1->br_disp.disp = displacement; in build_dbxx()
817 op1->br_disp.disp_size = M68K_OP_BR_DISP_SIZE_LONG; in build_dbxx()
825 build_dbxx(info, s_dbcc_lut[(info->ir >> 8) & 0xf], size, displacement); in build_dbcc()
834 cs_m68k* ext = build_init_op(info, opcode, 3, size); in build_d_d_ea() local
836 op0 = &ext->operands[0]; in build_d_d_ea()
837 op1 = &ext->operands[1]; in build_d_d_ea()
838 op2 = &ext->operands[2]; in build_d_d_ea()
840 op0->address_mode = M68K_AM_REG_DIRECT_DATA; in build_d_d_ea()
841 op0->reg = M68K_REG_D0 + (extension & 7); in build_d_d_ea()
843 op1->address_mode = M68K_AM_REG_DIRECT_DATA; in build_d_d_ea()
844 op1->reg = M68K_REG_D0 + ((extension >> 6) & 7); in build_d_d_ea()
846 get_ea_mode_op(info, op2, info->ir, size); in build_d_d_ea()
855 cs_m68k* ext = build_init_op(info, opcode, 1, 0); in build_bitfield_ins() local
858 op_ea = &ext->operands[0]; in build_bitfield_ins()
859 op1 = &ext->operands[1]; in build_bitfield_ins()
872 ext->op_count = 2; in build_bitfield_ins()
873 op1->address_mode = M68K_AM_REG_DIRECT_DATA; in build_bitfield_ins()
874 op1->reg = M68K_REG_D0 + ((extension >> 12) & 7); in build_bitfield_ins()
877 get_ea_mode_op(info, op_ea, info->ir, 1); in build_bitfield_ins()
879 op_ea->mem.bitfield = 1; in build_bitfield_ins()
880 op_ea->mem.width = width; in build_bitfield_ins()
881 op_ea->mem.offset = offset; in build_bitfield_ins()
886 cs_m68k* ext = build_init_op(info, opcode, 1, size); in build_d() local
889 op = &ext->operands[0]; in build_d()
891 op->address_mode = M68K_AM_REG_DIRECT_DATA; in build_d()
892 op->reg = M68K_REG_D0 + (info->ir & 7); in build_d()
898 uint s = 16 - 1; // extra shift needed at end in reverse_bits()
903 s--; in reverse_bits()
912 uint s = 8 - 1; // extra shift needed at end in reverse_bits_8()
917 s--; in reverse_bits_8()
928 cs_m68k* ext = build_init_op(info, opcode, 2, size); in build_movem_re() local
930 op0 = &ext->operands[0]; in build_movem_re()
931 op1 = &ext->operands[1]; in build_movem_re()
933 op0->type = M68K_OP_REG_BITS; in build_movem_re()
934 op0->register_bits = read_imm_16(info); in build_movem_re()
936 get_ea_mode_op(info, op1, info->ir, size); in build_movem_re()
938 if (op1->address_mode == M68K_AM_REGI_ADDR_PRE_DEC) in build_movem_re()
939 op0->register_bits = reverse_bits(op0->register_bits); in build_movem_re()
946 cs_m68k* ext = build_init_op(info, opcode, 2, size); in build_movem_er() local
948 op0 = &ext->operands[0]; in build_movem_er()
949 op1 = &ext->operands[1]; in build_movem_er()
951 op1->type = M68K_OP_REG_BITS; in build_movem_er()
952 op1->register_bits = read_imm_16(info); in build_movem_er()
954 get_ea_mode_op(info, op0, info->ir, size); in build_movem_er()
960 cs_m68k* ext = build_init_op(info, opcode, 1, 0); in build_imm() local
962 MCInst_setOpcode(info->inst, opcode); in build_imm()
964 op = &ext->operands[0]; in build_imm()
966 op->type = M68K_OP_IMM; in build_imm()
967 op->address_mode = M68K_AM_IMMEDIATE; in build_imm()
968 op->imm = data; in build_imm()
988 cs_m68k* ext = build_init_op(info, M68K_INS_CAS2, 3, size); in build_cas2() local
996 op0 = &ext->operands[0]; in build_cas2()
997 op1 = &ext->operands[1]; in build_cas2()
998 op2 = &ext->operands[2]; in build_cas2()
1002 op0->address_mode = M68K_AM_NONE; in build_cas2()
1003 op0->type = M68K_OP_REG_PAIR; in build_cas2()
1004 op0->reg_pair.reg_0 = (extension >> 16) & 7; in build_cas2()
1005 op0->reg_pair.reg_1 = extension & 7; in build_cas2()
1007 op1->address_mode = M68K_AM_NONE; in build_cas2()
1008 op1->type = M68K_OP_REG_PAIR; in build_cas2()
1009 op1->reg_pair.reg_0 = (extension >> 22) & 7; in build_cas2()
1010 op1->reg_pair.reg_1 = (extension >> 6) & 7; in build_cas2()
1015 op2->address_mode = M68K_AM_NONE; in build_cas2()
1016 op2->type = M68K_OP_REG_PAIR; in build_cas2()
1017 op2->reg_pair.reg_0 = reg_0 + (BIT_1F(extension) ? 8 : 0); in build_cas2()
1018 op2->reg_pair.reg_1 = reg_1 + (BIT_F(extension) ? 8 : 0); in build_cas2()
1025 cs_m68k* ext = build_init_op(info, M68K_INS_CHK2, 2, size); in build_chk2_cmp2() local
1030 MCInst_setOpcode(info->inst, M68K_INS_CHK2); in build_chk2_cmp2()
1032 MCInst_setOpcode(info->inst, M68K_INS_CMP2); in build_chk2_cmp2()
1034 op0 = &ext->operands[0]; in build_chk2_cmp2()
1035 op1 = &ext->operands[1]; in build_chk2_cmp2()
1037 get_ea_mode_op(info, op0, info->ir, size); in build_chk2_cmp2()
1039 op1->address_mode = M68K_AM_NONE; in build_chk2_cmp2()
1040 op1->type = M68K_OP_REG; in build_chk2_cmp2()
1041 op1->reg = (BIT_F(extension) ? M68K_REG_A0 : M68K_REG_D0) + ((extension >> 12) & 7); in build_chk2_cmp2()
1046 cs_m68k* ext = build_init_op(info, M68K_INS_MOVE16, 2, 0); in build_move16() local
1050 cs_m68k_op* op = &ext->operands[i]; in build_move16()
1054 op->type = M68K_OP_MEM; in build_move16()
1057 op->address_mode = m; in build_move16()
1058 op->reg = M68K_REG_A0 + d; in build_move16()
1060 op->address_mode = m; in build_move16()
1061 op->imm = d; in build_move16()
1070 cs_m68k* ext = build_init_op(info, M68K_INS_LINK, 2, size); in build_link() local
1072 op0 = &ext->operands[0]; in build_link()
1073 op1 = &ext->operands[1]; in build_link()
1075 op0->address_mode = M68K_AM_NONE; in build_link()
1076 op0->reg = M68K_REG_A0 + (info->ir & 7); in build_link()
1078 op1->address_mode = M68K_AM_IMMEDIATE; in build_link()
1079 op1->type = M68K_OP_IMM; in build_link()
1080 op1->imm = disp; in build_link()
1087 cs_m68k* ext = build_init_op(info, M68K_INS_INVALID, 2, 0); in build_cpush_cinv() local
1089 switch ((info->ir >> 3) & 3) { // scope in build_cpush_cinv()
1096 MCInst_setOpcode(info->inst, op_offset + 0); in build_cpush_cinv()
1100 MCInst_setOpcode(info->inst, op_offset + 1); in build_cpush_cinv()
1104 ext->op_count = 1; in build_cpush_cinv()
1105 MCInst_setOpcode(info->inst, op_offset + 2); in build_cpush_cinv()
1109 op0 = &ext->operands[0]; in build_cpush_cinv()
1110 op1 = &ext->operands[1]; in build_cpush_cinv()
1112 op0->address_mode = M68K_AM_IMMEDIATE; in build_cpush_cinv()
1113 op0->type = M68K_OP_IMM; in build_cpush_cinv()
1114 op0->imm = (info->ir >> 6) & 3; in build_cpush_cinv()
1116 op1->type = M68K_OP_MEM; in build_cpush_cinv()
1117 op1->address_mode = M68K_AM_REG_DIRECT_ADDR; in build_cpush_cinv()
1118 op1->imm = M68K_REG_A0 + (info->ir & 7); in build_cpush_cinv()
1125 cs_m68k* ext = build_init_op(info, M68K_INS_MOVEP, 2, size); in build_movep_re() local
1127 op0 = &ext->operands[0]; in build_movep_re()
1128 op1 = &ext->operands[1]; in build_movep_re()
1130 op0->reg = M68K_REG_D0 + ((info->ir >> 9) & 7); in build_movep_re()
1132 op1->address_mode = M68K_AM_REGI_ADDR_DISP; in build_movep_re()
1133 op1->type = M68K_OP_MEM; in build_movep_re()
1134 op1->mem.base_reg = M68K_REG_A0 + (info->ir & 7); in build_movep_re()
1135 op1->mem.disp = (int16_t)read_imm_16(info); in build_movep_re()
1142 cs_m68k* ext = build_init_op(info, M68K_INS_MOVEP, 2, size); in build_movep_er() local
1144 op0 = &ext->operands[0]; in build_movep_er()
1145 op1 = &ext->operands[1]; in build_movep_er()
1147 op0->address_mode = M68K_AM_REGI_ADDR_DISP; in build_movep_er()
1148 op0->type = M68K_OP_MEM; in build_movep_er()
1149 op0->mem.base_reg = M68K_REG_A0 + (info->ir & 7); in build_movep_er()
1150 op0->mem.disp = (int16_t)read_imm_16(info); in build_movep_er()
1152 op1->reg = M68K_REG_D0 + ((info->ir >> 9) & 7); in build_movep_er()
1159 cs_m68k* ext = build_init_op(info, M68K_INS_MOVES, 2, size); in build_moves() local
1162 op0 = &ext->operands[0]; in build_moves()
1163 op1 = &ext->operands[1]; in build_moves()
1166 op0->reg = (BIT_F(extension) ? M68K_REG_A0 : M68K_REG_D0) + ((extension >> 12) & 7); in build_moves()
1167 get_ea_mode_op(info, op1, info->ir, size); in build_moves()
1169 get_ea_mode_op(info, op0, info->ir, size); in build_moves()
1170 op1->reg = (BIT_F(extension) ? M68K_REG_A0 : M68K_REG_D0) + ((extension >> 12) & 7); in build_moves()
1189 * d68000_add_er_8(): add opcode, from effective address to register,
1203 * er : effective address -> register
1204 * re : register -> effective address
1205 * ea : using effective address mode of operation
1207 * a : address register direct
1208 * ai : address register indirect
1209 * pi : address register indirect with postincrement
1210 * pd : address register indirect with predecrement
1211 * di : address register indirect with displacement
1212 * ix : address register indirect with index
1220 build_invalid(info, info->ir); in d68000_invalid()
1225 build_illegal(info, info->ir); in d68000_illegal()
1230 build_invalid(info, info->ir); in d68000_1010()
1235 build_invalid(info, info->ir); in d68000_1111()
1475 build_bcc(info, 1, make_int_8(info->ir)); in d68000_bcc_8()
1512 build_absolute_jump_with_immediate(info, M68K_INS_BKPT, 0, info->ir & 7); in d68010_bkpt()
1548 cs_m68k* ext = &info->extension; in d68020_bfins() local
1556 temp = ext->operands[0]; in d68020_bfins()
1557 ext->operands[0] = ext->operands[1]; in d68020_bfins()
1558 ext->operands[1] = temp; in d68020_bfins()
1574 build_relative_branch(info, M68K_INS_BRA, 1, make_int_8(info->ir)); in d68000_bra_8()
1600 build_relative_branch(info, M68K_INS_BSR, 1, make_int_8(info->ir)); in d68000_bsr_8()
1801 op->address_mode = M68K_AM_BRANCH_DISPLACEMENT; in make_cpbcc_operand()
1802 op->type = M68K_OP_BR_DISP; in make_cpbcc_operand()
1803 op->br_disp.disp = displacement; in make_cpbcc_operand()
1804 op->br_disp.disp_size = size; in make_cpbcc_operand()
1810 cs_m68k* ext; in d68020_cpbcc_16() local
1814 info->inst->Opcode += (info->ir & 0x2f); in d68020_cpbcc_16()
1816 ext = build_init_op(info, M68K_INS_FBF, 1, 2); in d68020_cpbcc_16()
1817 op0 = &ext->operands[0]; in d68020_cpbcc_16()
1827 cs_m68k* ext; in d68020_cpbcc_32() local
1835 info->inst->Opcode += (info->ir & 0x2f); in d68020_cpbcc_32()
1837 ext = build_init_op(info, M68K_INS_FBF, 1, 4); in d68020_cpbcc_32()
1838 op0 = &ext->operands[0]; in d68020_cpbcc_32()
1848 cs_m68k* ext; in d68020_cpdbcc() local
1859 info->inst->Opcode += (ext1 & 0x2f); in d68020_cpdbcc()
1861 ext = build_init_op(info, M68K_INS_FDBF, 2, 0); in d68020_cpdbcc()
1862 op0 = &ext->operands[0]; in d68020_cpdbcc()
1863 op1 = &ext->operands[1]; in d68020_cpdbcc()
1865 op0->reg = M68K_REG_D0 + (info->ir & 7); in d68020_cpdbcc()
1881 cs_m68k* ext = build_init_op(info, M68K_INS_FMOVE, 2, 4); in fmove_fpcr() local
1883 special = &ext->operands[0]; in fmove_fpcr()
1884 op_ea = &ext->operands[1]; in fmove_fpcr()
1892 get_ea_mode_op(info, op_ea, info->ir, 4); in fmove_fpcr()
1895 special->reg = M68K_REG_FPCR; in fmove_fpcr()
1897 special->reg = M68K_REG_FPSR; in fmove_fpcr()
1899 special->reg = M68K_REG_FPIAR; in fmove_fpcr()
1909 cs_m68k* ext = build_init_op(info, M68K_INS_FMOVEM, 2, 0); in fmovem() local
1911 op_reglist = &ext->operands[0]; in fmovem()
1912 op_ea = &ext->operands[1]; in fmovem()
1922 get_ea_mode_op(info, op_ea, info->ir, 0); in fmovem()
1926 op_reglist->reg = M68K_REG_D0 + ((reglist >> 4) & 7); in fmovem()
1930 op_reglist->address_mode = M68K_AM_NONE; in fmovem()
1931 op_reglist->type = M68K_OP_REG_BITS; in fmovem()
1932 op_reglist->register_bits = reglist << 16; in fmovem()
1936 op_reglist->address_mode = M68K_AM_NONE; in fmovem()
1937 op_reglist->type = M68K_OP_REG_BITS; in fmovem()
1938 op_reglist->register_bits = ((uint32_t)reverse_bits_8(reglist)) << 16; in fmovem()
1945 cs_m68k *ext; in d68020_cpgen() local
1966 if (BITFIELD(info->ir, 5, 0) == 0 && BITFIELD(next, 15, 10) == 0x17) { in d68020_cpgen()
1969 cs_m68k* ext = build_init_op(info, M68K_INS_FMOVECR, 2, 0); in d68020_cpgen() local
1971 op0 = &ext->operands[0]; in d68020_cpgen()
1972 op1 = &ext->operands[1]; in d68020_cpgen()
1974 op0->address_mode = M68K_AM_IMMEDIATE; in d68020_cpgen()
1975 op0->type = M68K_OP_IMM; in d68020_cpgen()
1976 op0->imm = next & 0x3f; in d68020_cpgen()
1978 op1->reg = M68K_REG_FP0 + ((next >> 7) & 7); in d68020_cpgen()
2007 case 0x00: MCInst_setOpcode(info->inst, M68K_INS_FMOVE); supports_single_op = false; break; in d68020_cpgen()
2008 case 0x01: MCInst_setOpcode(info->inst, M68K_INS_FINT); break; in d68020_cpgen()
2009 case 0x02: MCInst_setOpcode(info->inst, M68K_INS_FSINH); break; in d68020_cpgen()
2010 case 0x03: MCInst_setOpcode(info->inst, M68K_INS_FINTRZ); break; in d68020_cpgen()
2011 case 0x04: MCInst_setOpcode(info->inst, M68K_INS_FSQRT); break; in d68020_cpgen()
2012 case 0x06: MCInst_setOpcode(info->inst, M68K_INS_FLOGNP1); break; in d68020_cpgen()
2013 case 0x08: MCInst_setOpcode(info->inst, M68K_INS_FETOXM1); break; in d68020_cpgen()
2014 case 0x09: MCInst_setOpcode(info->inst, M68K_INS_FATANH); break; in d68020_cpgen()
2015 case 0x0a: MCInst_setOpcode(info->inst, M68K_INS_FATAN); break; in d68020_cpgen()
2016 case 0x0c: MCInst_setOpcode(info->inst, M68K_INS_FASIN); break; in d68020_cpgen()
2017 case 0x0d: MCInst_setOpcode(info->inst, M68K_INS_FATANH); break; in d68020_cpgen()
2018 case 0x0e: MCInst_setOpcode(info->inst, M68K_INS_FSIN); break; in d68020_cpgen()
2019 case 0x0f: MCInst_setOpcode(info->inst, M68K_INS_FTAN); break; in d68020_cpgen()
2020 case 0x10: MCInst_setOpcode(info->inst, M68K_INS_FETOX); break; in d68020_cpgen()
2021 case 0x11: MCInst_setOpcode(info->inst, M68K_INS_FTWOTOX); break; in d68020_cpgen()
2022 case 0x12: MCInst_setOpcode(info->inst, M68K_INS_FTENTOX); break; in d68020_cpgen()
2023 case 0x14: MCInst_setOpcode(info->inst, M68K_INS_FLOGN); break; in d68020_cpgen()
2024 case 0x15: MCInst_setOpcode(info->inst, M68K_INS_FLOG10); break; in d68020_cpgen()
2025 case 0x16: MCInst_setOpcode(info->inst, M68K_INS_FLOG2); break; in d68020_cpgen()
2026 case 0x18: MCInst_setOpcode(info->inst, M68K_INS_FABS); break; in d68020_cpgen()
2027 case 0x19: MCInst_setOpcode(info->inst, M68K_INS_FCOSH); break; in d68020_cpgen()
2028 case 0x1a: MCInst_setOpcode(info->inst, M68K_INS_FNEG); break; in d68020_cpgen()
2029 case 0x1c: MCInst_setOpcode(info->inst, M68K_INS_FACOS); break; in d68020_cpgen()
2030 case 0x1d: MCInst_setOpcode(info->inst, M68K_INS_FCOS); break; in d68020_cpgen()
2031 case 0x1e: MCInst_setOpcode(info->inst, M68K_INS_FGETEXP); break; in d68020_cpgen()
2032 case 0x1f: MCInst_setOpcode(info->inst, M68K_INS_FGETMAN); break; in d68020_cpgen()
2033 case 0x20: MCInst_setOpcode(info->inst, M68K_INS_FDIV); supports_single_op = false; break; in d68020_cpgen()
2034 case 0x21: MCInst_setOpcode(info->inst, M68K_INS_FMOD); supports_single_op = false; break; in d68020_cpgen()
2035 case 0x22: MCInst_setOpcode(info->inst, M68K_INS_FADD); supports_single_op = false; break; in d68020_cpgen()
2036 case 0x23: MCInst_setOpcode(info->inst, M68K_INS_FMUL); supports_single_op = false; break; in d68020_cpgen()
2037 case 0x24: MCInst_setOpcode(info->inst, M68K_INS_FSGLDIV); supports_single_op = false; break; in d68020_cpgen()
2038 case 0x25: MCInst_setOpcode(info->inst, M68K_INS_FREM); break; in d68020_cpgen()
2039 case 0x26: MCInst_setOpcode(info->inst, M68K_INS_FSCALE); break; in d68020_cpgen()
2040 case 0x27: MCInst_setOpcode(info->inst, M68K_INS_FSGLMUL); break; in d68020_cpgen()
2041 case 0x28: MCInst_setOpcode(info->inst, M68K_INS_FSUB); supports_single_op = false; break; in d68020_cpgen()
2042 case 0x38: MCInst_setOpcode(info->inst, M68K_INS_FCMP); supports_single_op = false; break; in d68020_cpgen()
2043 case 0x3a: MCInst_setOpcode(info->inst, M68K_INS_FTST); break; in d68020_cpgen()
2054 info->inst->Opcode += 2; in d68020_cpgen()
2056 info->inst->Opcode += 1; in d68020_cpgen()
2059 ext = &info->extension; in d68020_cpgen()
2061 ext->op_count = 2; in d68020_cpgen()
2062 ext->op_size.type = M68K_SIZE_TYPE_CPU; in d68020_cpgen()
2063 ext->op_size.cpu_size = 0; in d68020_cpgen()
2065 // Special case - adjust direction of fmove in d68020_cpgen()
2067 op0 = &ext->operands[1]; in d68020_cpgen()
2068 op1 = &ext->operands[0]; in d68020_cpgen()
2070 op0 = &ext->operands[0]; in d68020_cpgen()
2071 op1 = &ext->operands[1]; in d68020_cpgen()
2075 ext->op_count = 1; in d68020_cpgen()
2076 op0->reg = M68K_REG_FP0 + dst; in d68020_cpgen()
2083 ext->op_size.cpu_size = M68K_CPU_SIZE_LONG; in d68020_cpgen()
2084 get_ea_mode_op(info, op0, info->ir, 4); in d68020_cpgen()
2088 ext->op_size.cpu_size = M68K_CPU_SIZE_BYTE; in d68020_cpgen()
2089 get_ea_mode_op(info, op0, info->ir, 1); in d68020_cpgen()
2093 ext->op_size.cpu_size = M68K_CPU_SIZE_WORD; in d68020_cpgen()
2094 get_ea_mode_op(info, op0, info->ir, 2); in d68020_cpgen()
2098 ext->op_size.type = M68K_SIZE_TYPE_FPU; in d68020_cpgen()
2099 ext->op_size.fpu_size = M68K_FPU_SIZE_SINGLE; in d68020_cpgen()
2100 get_ea_mode_op(info, op0, info->ir, 4); in d68020_cpgen()
2101 op0->type = M68K_OP_FP_SINGLE; in d68020_cpgen()
2105 ext->op_size.type = M68K_SIZE_TYPE_FPU; in d68020_cpgen()
2106 ext->op_size.fpu_size = M68K_FPU_SIZE_DOUBLE; in d68020_cpgen()
2107 get_ea_mode_op(info, op0, info->ir, 8); in d68020_cpgen()
2108 op0->type = M68K_OP_FP_DOUBLE; in d68020_cpgen()
2112 ext->op_size.type = M68K_SIZE_TYPE_FPU; in d68020_cpgen()
2113 ext->op_size.fpu_size = M68K_FPU_SIZE_EXTENDED; in d68020_cpgen()
2117 op0->reg = M68K_REG_FP0 + src; in d68020_cpgen()
2120 op1->reg = M68K_REG_FP0 + dst; in d68020_cpgen()
2125 cs_m68k* ext; in d68020_cprestore() local
2128 ext = build_init_op(info, M68K_INS_FRESTORE, 1, 0); in d68020_cprestore()
2129 get_ea_mode_op(info, &ext->operands[0], info->ir, 1); in d68020_cprestore()
2134 cs_m68k* ext; in d68020_cpsave() local
2138 ext = build_init_op(info, M68K_INS_FSAVE, 1, 0); in d68020_cpsave()
2139 get_ea_mode_op(info, &ext->operands[0], info->ir, 1); in d68020_cpsave()
2144 cs_m68k* ext; in d68020_cpscc() local
2147 ext = build_init_op(info, M68K_INS_FSF, 1, 1); in d68020_cpscc()
2150 info->inst->Opcode += (read_imm_16(info) & 0x2f); in d68020_cpscc()
2152 get_ea_mode_op(info, &ext->operands[0], info->ir, 1); in d68020_cpscc()
2165 info->inst->Opcode += (extension1 & 0x2f); in d68020_cptrapcc_0()
2172 cs_m68k* ext; in d68020_cptrapcc_16() local
2179 ext = build_init_op(info, M68K_INS_FTRAPF, 1, 2); in d68020_cptrapcc_16()
2182 info->inst->Opcode += (extension1 & 0x2f); in d68020_cptrapcc_16()
2184 op0 = &ext->operands[0]; in d68020_cptrapcc_16()
2186 op0->address_mode = M68K_AM_IMMEDIATE; in d68020_cptrapcc_16()
2187 op0->type = M68K_OP_IMM; in d68020_cptrapcc_16()
2188 op0->imm = extension2; in d68020_cptrapcc_16()
2194 cs_m68k* ext; in d68020_cptrapcc_32() local
2202 ext = build_init_op(info, M68K_INS_FTRAPF, 1, 2); in d68020_cptrapcc_32()
2205 info->inst->Opcode += (extension1 & 0x2f); in d68020_cptrapcc_32()
2207 op0 = &ext->operands[0]; in d68020_cptrapcc_32()
2209 op0->address_mode = M68K_AM_IMMEDIATE; in d68020_cptrapcc_32()
2210 op0->type = M68K_OP_IMM; in d68020_cptrapcc_32()
2211 op0->imm = extension2; in d68020_cptrapcc_32()
2243 cs_m68k* ext; in d68020_divl() local
2256 ext = build_init_op(info, insn_signed ? M68K_INS_DIVS : M68K_INS_DIVU, 2, 4); in d68020_divl()
2258 op0 = &ext->operands[0]; in d68020_divl()
2259 op1 = &ext->operands[1]; in d68020_divl()
2261 get_ea_mode_op(info, op0, info->ir, 4); in d68020_divl()
2266 op1->address_mode = M68K_AM_NONE; in d68020_divl()
2267 op1->type = M68K_OP_REG_PAIR; in d68020_divl()
2268 op1->reg_pair.reg_0 = reg_0; in d68020_divl()
2269 op1->reg_pair.reg_1 = reg_1; in d68020_divl()
2272 op1->type = M68K_OP_REG; in d68020_divl()
2273 op1->reg = M68K_REG_D0 + reg_1; in d68020_divl()
2326 cs_m68k* ext = build_init_op(info, M68K_INS_EXG, 2, 4); in d68000_exg_aa() local
2328 op0 = &ext->operands[0]; in d68000_exg_aa()
2329 op1 = &ext->operands[1]; in d68000_exg_aa()
2331 op0->address_mode = M68K_AM_NONE; in d68000_exg_aa()
2332 op0->reg = M68K_REG_A0 + ((info->ir >> 9) & 7); in d68000_exg_aa()
2334 op1->address_mode = M68K_AM_NONE; in d68000_exg_aa()
2335 op1->reg = M68K_REG_A0 + (info->ir & 7); in d68000_exg_aa()
2342 cs_m68k* ext = build_init_op(info, M68K_INS_EXG, 2, 4); in d68000_exg_da() local
2344 op0 = &ext->operands[0]; in d68000_exg_da()
2345 op1 = &ext->operands[1]; in d68000_exg_da()
2347 op0->address_mode = M68K_AM_NONE; in d68000_exg_da()
2348 op0->reg = M68K_REG_D0 + ((info->ir >> 9) & 7); in d68000_exg_da()
2350 op1->address_mode = M68K_AM_NONE; in d68000_exg_da()
2351 op1->reg = M68K_REG_A0 + (info->ir & 7); in d68000_exg_da()
2372 cs_m68k* ext = build_init_op(info, M68K_INS_JMP, 1, 0); in d68000_jmp() local
2374 get_ea_mode_op(info, &ext->operands[0], info->ir, 4); in d68000_jmp()
2379 cs_m68k* ext = build_init_op(info, M68K_INS_JSR, 1, 0); in d68000_jsr() local
2381 get_ea_mode_op(info, &ext->operands[0], info->ir, 4); in d68000_jsr()
2499 cs_m68k* ext = build_init_op(info, M68K_INS_MOVE, 2, 2); in d68000_move_to_ccr() local
2501 op0 = &ext->operands[0]; in d68000_move_to_ccr()
2502 op1 = &ext->operands[1]; in d68000_move_to_ccr()
2504 get_ea_mode_op(info, op0, info->ir, 1); in d68000_move_to_ccr()
2506 op1->address_mode = M68K_AM_NONE; in d68000_move_to_ccr()
2507 op1->reg = M68K_REG_CCR; in d68000_move_to_ccr()
2514 cs_m68k* ext; in d68010_move_fr_ccr() local
2518 ext = build_init_op(info, M68K_INS_MOVE, 2, 2); in d68010_move_fr_ccr()
2520 op0 = &ext->operands[0]; in d68010_move_fr_ccr()
2521 op1 = &ext->operands[1]; in d68010_move_fr_ccr()
2523 op0->address_mode = M68K_AM_NONE; in d68010_move_fr_ccr()
2524 op0->reg = M68K_REG_CCR; in d68010_move_fr_ccr()
2526 get_ea_mode_op(info, op1, info->ir, 1); in d68010_move_fr_ccr()
2533 cs_m68k* ext = build_init_op(info, M68K_INS_MOVE, 2, 2); in d68000_move_fr_sr() local
2535 op0 = &ext->operands[0]; in d68000_move_fr_sr()
2536 op1 = &ext->operands[1]; in d68000_move_fr_sr()
2538 op0->address_mode = M68K_AM_NONE; in d68000_move_fr_sr()
2539 op0->reg = M68K_REG_SR; in d68000_move_fr_sr()
2541 get_ea_mode_op(info, op1, info->ir, 2); in d68000_move_fr_sr()
2548 cs_m68k* ext = build_init_op(info, M68K_INS_MOVE, 2, 2); in d68000_move_to_sr() local
2550 op0 = &ext->operands[0]; in d68000_move_to_sr()
2551 op1 = &ext->operands[1]; in d68000_move_to_sr()
2553 get_ea_mode_op(info, op0, info->ir, 2); in d68000_move_to_sr()
2555 op1->address_mode = M68K_AM_NONE; in d68000_move_to_sr()
2556 op1->reg = M68K_REG_SR; in d68000_move_to_sr()
2563 cs_m68k* ext = build_init_op(info, M68K_INS_MOVE, 2, 0); in d68000_move_fr_usp() local
2565 op0 = &ext->operands[0]; in d68000_move_fr_usp()
2566 op1 = &ext->operands[1]; in d68000_move_fr_usp()
2568 op0->address_mode = M68K_AM_NONE; in d68000_move_fr_usp()
2569 op0->reg = M68K_REG_USP; in d68000_move_fr_usp()
2571 op1->address_mode = M68K_AM_NONE; in d68000_move_fr_usp()
2572 op1->reg = M68K_REG_A0 + (info->ir & 7); in d68000_move_fr_usp()
2579 cs_m68k* ext = build_init_op(info, M68K_INS_MOVE, 2, 0); in d68000_move_to_usp() local
2581 op0 = &ext->operands[0]; in d68000_move_to_usp()
2582 op1 = &ext->operands[1]; in d68000_move_to_usp()
2584 op0->address_mode = M68K_AM_NONE; in d68000_move_to_usp()
2585 op0->reg = M68K_REG_A0 + (info->ir & 7); in d68000_move_to_usp()
2587 op1->address_mode = M68K_AM_NONE; in d68000_move_to_usp()
2588 op1->reg = M68K_REG_USP; in d68000_move_to_usp()
2595 cs_m68k* ext; in d68010_movec() local
2605 ext = build_init_op(info, M68K_INS_MOVEC, 2, 0); in d68010_movec()
2607 op0 = &ext->operands[0]; in d68010_movec()
2608 op1 = &ext->operands[1]; in d68010_movec()
2629 if (BIT_1(info->ir)) { in d68010_movec()
2630 op0->reg = (BIT_F(extension) ? M68K_REG_A0 : M68K_REG_D0) + ((extension >> 12) & 7); in d68010_movec()
2631 op1->reg = reg; in d68010_movec()
2633 op0->reg = reg; in d68010_movec()
2634 op1->reg = (BIT_F(extension) ? M68K_REG_A0 : M68K_REG_D0) + ((extension >> 12) & 7); in d68010_movec()
2712 cs_m68k* ext = build_init_op(info, M68K_INS_MOVEQ, 2, 0); in d68000_moveq() local
2714 op0 = &ext->operands[0]; in d68000_moveq()
2715 op1 = &ext->operands[1]; in d68000_moveq()
2717 op0->type = M68K_OP_IMM; in d68000_moveq()
2718 op0->address_mode = M68K_AM_IMMEDIATE; in d68000_moveq()
2719 op0->imm = (info->ir & 0xff); in d68000_moveq()
2721 op1->address_mode = M68K_AM_REG_DIRECT_DATA; in d68000_moveq()
2722 op1->reg = M68K_REG_D0 + ((info->ir >> 9) & 7); in d68000_moveq()
2727 int data[] = { info->ir & 7, (read_imm_16(info) >> 12) & 7 }; in d68040_move16_pi_pi()
2737 int data[] = { info->ir & 7, read_imm_32(info) }; in d68040_move16_pi_al()
2747 int data[] = { read_imm_32(info), info->ir & 7 }; in d68040_move16_al_pi()
2757 int data[] = { info->ir & 7, read_imm_32(info) }; in d68040_move16_ai_al()
2767 int data[] = { read_imm_32(info), info->ir & 7 }; in d68040_move16_al_ai()
2788 cs_m68k* ext; in d68020_mull() local
2802 ext = build_init_op(info, insn_signed ? M68K_INS_MULS : M68K_INS_MULU, 2, 4); in d68020_mull()
2804 op0 = &ext->operands[0]; in d68020_mull()
2805 op1 = &ext->operands[1]; in d68020_mull()
2807 get_ea_mode_op(info, op0, info->ir, 4); in d68020_mull()
2812 op1->address_mode = M68K_AM_NONE; in d68020_mull()
2813 op1->type = M68K_OP_REG_PAIR; in d68020_mull()
2814 op1->reg_pair.reg_0 = reg_0; in d68020_mull()
2815 op1->reg_pair.reg_1 = reg_1; in d68020_mull()
2818 op1->type = M68K_OP_REG; in d68020_mull()
2819 op1->reg = M68K_REG_D0 + reg_1; in d68020_mull()
2860 MCInst_setOpcode(info->inst, M68K_INS_NOP); in d68000_nop()
2952 MCInst_setOpcode(info->inst, M68K_INS_RESET); in d68000_reset()
3105 MCInst_setOpcode(info->inst, M68K_INS_RTE); in d68000_rte()
3110 cs_m68k* ext; in d68020_rtm() local
3119 ext = &info->extension; in d68020_rtm()
3120 op = &ext->operands[0]; in d68020_rtm()
3122 op->address_mode = M68K_AM_NONE; in d68020_rtm()
3123 op->type = M68K_OP_REG; in d68020_rtm()
3125 if (BIT_3(info->ir)) { in d68020_rtm()
3126 op->reg = M68K_REG_A0 + (info->ir & 7); in d68020_rtm()
3128 op->reg = M68K_REG_D0 + (info->ir & 7); in d68020_rtm()
3135 MCInst_setOpcode(info->inst, M68K_INS_RTR); in d68000_rtr()
3141 MCInst_setOpcode(info->inst, M68K_INS_RTS); in d68000_rts()
3156 cs_m68k* ext = build_init_op(info, s_scc_lut[(info->ir >> 8) & 0xf], 1, 1); in d68000_scc() local
3157 get_ea_mode_op(info, &ext->operands[0], info->ir, 1); in d68000_scc()
3277 build_absolute_jump_with_immediate(info, M68K_INS_TRAP, 0, info->ir&0xf); in d68000_trap()
3285 info->extension.op_count = 0; in d68020_trapcc_0()
3302 MCInst_setOpcode(info->inst, M68K_INS_TRAPV); in d68000_trapv()
3389 cs_m68k* ext = build_init_op(info, M68K_INS_UNLK, 1, 0); in d68000_unlk() local
3391 op = &ext->operands[0]; in d68000_unlk()
3393 op->address_mode = M68K_AM_REG_DIRECT_ADDR; in d68000_unlk()
3394 op->reg = M68K_REG_A0 + (info->ir & 7); in d68000_unlk()
3415 400 = address register direct
3416 200 = address register indirect
3418 80 = ARI pre-decrement
3777 uint a = ((const opcode_struct*)aptr)->mask; in compare_nof_true_bits()
3778 uint b = ((const opcode_struct*)bptr)->mask; in compare_nof_true_bits()
3790 return b - a; /* reversed to get greatest to least sorting */ in compare_nof_true_bits()
3806 for(ostruct = g_opcode_info;ostruct->opcode_handler != 0;ostruct++) in build_opcode_table()
3815 for(ostruct = g_opcode_info;ostruct->opcode_handler != 0;ostruct++) { in build_opcode_table()
3817 if ((opcode & ostruct->mask) == ostruct->match) { in build_opcode_table()
3819 if ((ostruct->opcode_handler == d68000_move_8 || in build_opcode_table()
3820 ostruct->opcode_handler == d68000_move_16 || in build_opcode_table()
3821 ostruct->opcode_handler == d68000_move_32) && in build_opcode_table()
3824 if (valid_ea(opcode, ostruct->ea_mask)) { in build_opcode_table()
3825 g_instruction_table[i].instruction = ostruct->opcode_handler; in build_opcode_table()
3826 g_instruction_table[i].word2_mask = ostruct->mask2; in build_opcode_table()
3827 g_instruction_table[i].word2_match = ostruct->match2; in build_opcode_table()
3837 const unsigned int instruction = info->ir; in instruction_is_valid()
3840 if ( (i->word2_mask && ((word_check & i->word2_mask) != i->word2_match)) || in instruction_is_valid()
3841 (i->instruction == d68000_invalid) ) { in instruction_is_valid()
3868 if (exists_reg_list(info->regs_write, info->regs_write_count, reg)) in add_reg_to_rw_list()
3871 info->regs_write[info->regs_write_count] = (uint16_t)reg; in add_reg_to_rw_list()
3872 info->regs_write_count++; in add_reg_to_rw_list()
3876 if (exists_reg_list(info->regs_read, info->regs_read_count, reg)) in add_reg_to_rw_list()
3879 info->regs_read[info->regs_read_count] = (uint16_t)reg; in add_reg_to_rw_list()
3880 info->regs_read_count++; in add_reg_to_rw_list()
3886 switch (op->address_mode) { in update_am_reg_list()
3889 add_reg_to_rw_list(info, op->reg, write); in update_am_reg_list()
3894 add_reg_to_rw_list(info, op->reg, 1); in update_am_reg_list()
3899 add_reg_to_rw_list(info, op->reg, 0); in update_am_reg_list()
3910 add_reg_to_rw_list(info, op->mem.index_reg, 0); in update_am_reg_list()
3911 add_reg_to_rw_list(info, op->mem.base_reg, 0); in update_am_reg_list()
3933 uint32_t bits = op->register_bits; in update_reg_list_regbits()
3941 switch ((int)op->type) { in update_op_reg_list()
3943 add_reg_to_rw_list(info, op->reg, write); in update_op_reg_list()
3955 add_reg_to_rw_list(info, M68K_REG_D0 + op->reg_pair.reg_0, write); in update_op_reg_list()
3956 add_reg_to_rw_list(info, M68K_REG_D0 + op->reg_pair.reg_1, write); in update_op_reg_list()
3965 if (!info->extension.op_count) in build_regs_read_write_counts()
3968 if (info->extension.op_count == 1) { in build_regs_read_write_counts()
3969 update_op_reg_list(info, &info->extension.operands[0], 1); in build_regs_read_write_counts()
3972 update_op_reg_list(info, &info->extension.operands[0], 0); in build_regs_read_write_counts()
3975 for (i = 1; i < info->extension.op_count; ++i) in build_regs_read_write_counts()
3976 update_op_reg_list(info, &info->extension.operands[i], 1); in build_regs_read_write_counts()
3982 info->inst = inst; in m68k_setup_internals()
3983 info->pc = pc; in m68k_setup_internals()
3984 info->ir = 0; in m68k_setup_internals()
3985 info->type = cpu_type; in m68k_setup_internals()
3986 info->address_mask = 0xffffffff; in m68k_setup_internals()
3988 switch(info->type) { in m68k_setup_internals()
3990 info->type = TYPE_68000; in m68k_setup_internals()
3991 info->address_mask = 0x00ffffff; in m68k_setup_internals()
3994 info->type = TYPE_68010; in m68k_setup_internals()
3995 info->address_mask = 0x00ffffff; in m68k_setup_internals()
3998 info->type = TYPE_68020; in m68k_setup_internals()
3999 info->address_mask = 0x00ffffff; in m68k_setup_internals()
4002 info->type = TYPE_68020; in m68k_setup_internals()
4003 info->address_mask = 0xffffffff; in m68k_setup_internals()
4006 info->type = TYPE_68030; in m68k_setup_internals()
4007 info->address_mask = 0xffffffff; in m68k_setup_internals()
4010 info->type = TYPE_68040; in m68k_setup_internals()
4011 info->address_mask = 0xffffffff; in m68k_setup_internals()
4014 info->address_mask = 0; in m68k_setup_internals()
4026 MCInst *inst = info->inst; in m68k_disassemble()
4027 cs_m68k* ext = &info->extension; in m68k_disassemble() local
4031 inst->Opcode = M68K_INS_INVALID; in m68k_disassemble()
4035 memset(ext, 0, sizeof(cs_m68k)); in m68k_disassemble()
4036 ext->op_size.type = M68K_SIZE_TYPE_CPU; in m68k_disassemble()
4039 ext->operands[i].type = M68K_OP_REG; in m68k_disassemble()
4041 info->ir = peek_imm_16(info); in m68k_disassemble()
4043 info->ir = read_imm_16(info); in m68k_disassemble()
4044 g_instruction_table[info->ir].instruction(info); in m68k_disassemble()
4047 size = info->pc - (unsigned int)pc; in m68k_disassemble()
4048 info->pc = (unsigned int)pc; in m68k_disassemble()
4053 …t uint8_t* code, size_t code_len, MCInst* instr, uint16_t* size, uint64_t address, void* inst_info) in M68K_getInstruction() argument
4060 cs_struct* handle = instr->csh; in M68K_getInstruction()
4061 m68k_info *info = (m68k_info*)handle->printer_info; in M68K_getInstruction()
4070 if (instr->flat_insn->detail) { in M68K_getInstruction()
4071 memset(instr->flat_insn->detail, 0, offsetof(cs_detail, m68k)+sizeof(cs_m68k)); in M68K_getInstruction()
4074 info->groups_count = 0; in M68K_getInstruction()
4075 info->regs_read_count = 0; in M68K_getInstruction()
4076 info->regs_write_count = 0; in M68K_getInstruction()
4077 info->code = code; in M68K_getInstruction()
4078 info->code_len = code_len; in M68K_getInstruction()
4079 info->baseAddress = address; in M68K_getInstruction()
4081 if (handle->mode & CS_MODE_M68K_010) in M68K_getInstruction()
4083 if (handle->mode & CS_MODE_M68K_020) in M68K_getInstruction()
4085 if (handle->mode & CS_MODE_M68K_030) in M68K_getInstruction()
4087 if (handle->mode & CS_MODE_M68K_040) in M68K_getInstruction()
4089 if (handle->mode & CS_MODE_M68K_060) in M68K_getInstruction()
4092 m68k_setup_internals(info, instr, (unsigned int)address, cpu_type); in M68K_getInstruction()
4093 s = m68k_disassemble(info, address); in M68K_getInstruction()