7 #include "mn10300_sim.h"
9 #include "sys/syscall.h"
13 #include <sys/times.h>
21 static void trace_input
PARAMS ((char *name
, enum op_types type
, int size
));
22 static void trace_output
PARAMS ((enum op_types result
));
23 static int init_text_p
= 0;
24 static asection
*text
;
25 static bfd_vma text_start
;
26 static bfd_vma text_end
;
29 #ifndef SIZE_INSTRUCTION
30 #define SIZE_INSTRUCTION 6
34 #define SIZE_OPERANDS 16
38 #define SIZE_VALUES 11
42 #define SIZE_LOCATION 40
46 trace_input (name
, type
, size
)
60 #define trace_input(NAME, IN1, IN2)
61 #define trace_output(RESULT)
103 State
.regs
[REG_SP
] = State
.regs
[REG_A0
+ (insn
& 0x3)];
356 value
= (insn
& 0xffff) << 16 | extension
;
357 State
.regs
[REG_A0
+ ((insn
& 0x30000) >> 16)] = value
;
413 store_mem (State
.regs
[REG_A0
+ ((insn
& 0xc) >> 2)], 1,
414 State
.regs
[REG_D0
+ (insn
& 0x3)]);
600 State
.regs
[REG_D0
+ ((insn
& 0xc) >> 2)] = 0;
603 PSW
&= ~(PSW_V
| PSW_C
| PSW_N
);
610 unsigned long reg1
, reg2
, value
;
612 reg1
= State
.regs
[REG_D0
+ ((insn
& 0xc) >> 2)];
613 reg2
= State
.regs
[REG_D0
+ (insn
& 0x3)];
615 State
.regs
[REG_D0
+ (insn
& 0x3)] = value
;
618 n
= (value
& 0x80000000);
620 v
= ((reg2
& 0x8000000) != (reg1
& 0x80000000)
621 && (reg2
& 0x8000000) != (value
& 0x80000000));
623 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
624 PSW
|= ((z
? PSW_Z
: 0) | ( n
? PSW_N
: 0)
625 | (c
? PSW_C
: 0) | (v
? PSW_V
: 0));
632 unsigned long reg1
, reg2
, value
;
634 reg1
= State
.regs
[REG_D0
+ ((insn
& 0xc) >> 2)];
635 reg2
= State
.regs
[REG_A0
+ (insn
& 0x3)];
637 State
.regs
[REG_A0
+ (insn
& 0x3)] = value
;
640 n
= (value
& 0x80000000);
642 v
= ((reg2
& 0x8000000) != (reg1
& 0x80000000)
643 && (reg2
& 0x8000000) != (value
& 0x80000000));
645 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
646 PSW
|= ((z
? PSW_Z
: 0) | ( n
? PSW_N
: 0)
647 | (c
? PSW_C
: 0) | (v
? PSW_V
: 0));
654 unsigned long reg1
, reg2
, value
;
656 reg1
= State
.regs
[REG_A0
+ ((insn
& 0xc) >> 2)];
657 reg2
= State
.regs
[REG_D0
+ (insn
& 0x3)];
659 State
.regs
[REG_D0
+ (insn
& 0x3)] = value
;
662 n
= (value
& 0x80000000);
664 v
= ((reg2
& 0x8000000) != (reg1
& 0x80000000)
665 && (reg2
& 0x8000000) != (value
& 0x80000000));
667 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
668 PSW
|= ((z
? PSW_Z
: 0) | ( n
? PSW_N
: 0)
669 | (c
? PSW_C
: 0) | (v
? PSW_V
: 0));
676 unsigned long reg1
, reg2
, value
;
678 reg1
= State
.regs
[REG_A0
+ ((insn
& 0xc) >> 2)];
679 reg2
= State
.regs
[REG_A0
+ (insn
& 0x3)];
681 State
.regs
[REG_A0
+ (insn
& 0x3)] = value
;
684 n
= (value
& 0x80000000);
686 v
= ((reg2
& 0x8000000) != (reg1
& 0x80000000)
687 && (reg2
& 0x8000000) != (value
& 0x80000000));
689 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
690 PSW
|= ((z
? PSW_Z
: 0) | ( n
? PSW_N
: 0)
691 | (c
? PSW_C
: 0) | (v
? PSW_V
: 0));
698 unsigned long reg1
, imm
, value
;
700 reg1
= State
.regs
[REG_D0
+ ((insn
& 0xc00) >> 8)];
701 imm
= SEXT8 (insn
& 0xff);
703 State
.regs
[REG_D0
+ ((insn
& 0xc00) >> 8)] = value
;
706 n
= (value
& 0x80000000);
708 v
= ((imm
& 0x8000000) != (reg1
& 0x80000000)
709 && (imm
& 0x8000000) != (value
& 0x80000000));
711 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
712 PSW
|= ((z
? PSW_Z
: 0) | ( n
? PSW_N
: 0)
713 | (c
? PSW_C
: 0) | (v
? PSW_V
: 0));
720 unsigned long reg1
, imm
, value
;
722 reg1
= State
.regs
[REG_D0
+ ((insn
& 0xc0000) >> 16)];
723 imm
= SEXT16 (insn
& 0xffff);
725 State
.regs
[REG_D0
+ ((insn
& 0xc0000) >> 16)] = value
;
728 n
= (value
& 0x80000000);
730 v
= ((imm
& 0x8000000) != (reg1
& 0x80000000)
731 && (imm
& 0x8000000) != (value
& 0x80000000));
733 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
734 PSW
|= ((z
? PSW_Z
: 0) | ( n
? PSW_N
: 0)
735 | (c
? PSW_C
: 0) | (v
? PSW_V
: 0));
742 unsigned long reg1
, imm
, value
;
744 reg1
= State
.regs
[REG_D0
+ ((insn
& 0xc0000) >> 16)];
745 imm
= ((insn
& 0xffff) << 16) | extension
;
747 State
.regs
[REG_D0
+ ((insn
& 0xc0000) >> 16)] = value
;
750 n
= (value
& 0x80000000);
752 v
= ((imm
& 0x8000000) != (reg1
& 0x80000000)
753 && (imm
& 0x8000000) != (value
& 0x80000000));
755 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
756 PSW
|= ((z
? PSW_Z
: 0) | ( n
? PSW_N
: 0)
757 | (c
? PSW_C
: 0) | (v
? PSW_V
: 0));
764 unsigned long reg1
, imm
, value
;
766 reg1
= State
.regs
[REG_A0
+ ((insn
& 0xc00) >> 8)];
769 State
.regs
[REG_A0
+ ((insn
& 0xc00) >> 8)] = value
;
772 n
= (value
& 0x80000000);
774 v
= ((imm
& 0x8000000) != (reg1
& 0x80000000)
775 && (imm
& 0x8000000) != (value
& 0x80000000));
777 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
778 PSW
|= ((z
? PSW_Z
: 0) | ( n
? PSW_N
: 0)
779 | (c
? PSW_C
: 0) | (v
? PSW_V
: 0));
786 unsigned long reg1
, imm
, value
;
788 reg1
= State
.regs
[REG_A0
+ ((insn
& 0xc0000) >> 16)];
791 State
.regs
[REG_A0
+ ((insn
& 0xc0000) >> 16)] = value
;
794 n
= (value
& 0x80000000);
796 v
= ((imm
& 0x8000000) != (reg1
& 0x80000000)
797 && (imm
& 0x8000000) != (value
& 0x80000000));
799 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
800 PSW
|= ((z
? PSW_Z
: 0) | ( n
? PSW_N
: 0)
801 | (c
? PSW_C
: 0) | (v
? PSW_V
: 0));
808 unsigned long reg1
, imm
, value
;
810 reg1
= State
.regs
[REG_A0
+ ((insn
& 0xc0000) >> 16)];
811 imm
= ((insn
& 0xffff) << 16) | extension
;
813 State
.regs
[REG_A0
+ ((insn
& 0xc0000) >> 16)] = value
;
816 n
= (value
& 0x80000000);
818 v
= ((imm
& 0x8000000) != (reg1
& 0x80000000)
819 && (imm
& 0x8000000) != (value
& 0x80000000));
821 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
822 PSW
|= ((z
? PSW_Z
: 0) | ( n
? PSW_N
: 0)
823 | (c
? PSW_C
: 0) | (v
? PSW_V
: 0));
830 unsigned long reg1
, imm
, value
;
832 reg1
= State
.regs
[REG_SP
];
833 imm
= SEXT8 (insn
& 0xff);
835 State
.regs
[REG_SP
] = value
;
838 n
= (value
& 0x80000000);
840 v
= ((imm
& 0x8000000) != (reg1
& 0x80000000)
841 && (imm
& 0x8000000) != (value
& 0x80000000));
843 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
844 PSW
|= ((z
? PSW_Z
: 0) | ( n
? PSW_N
: 0)
845 | (c
? PSW_C
: 0) | (v
? PSW_V
: 0));
852 unsigned long reg1
, imm
, value
;
854 reg1
= State
.regs
[REG_SP
];
855 imm
= SEXT16 (insn
& 0xffff);
857 State
.regs
[REG_SP
] = value
;
860 n
= (value
& 0x80000000);
862 v
= ((imm
& 0x8000000) != (reg1
& 0x80000000)
863 && (imm
& 0x8000000) != (value
& 0x80000000));
865 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
866 PSW
|= ((z
? PSW_Z
: 0) | ( n
? PSW_N
: 0)
867 | (c
? PSW_C
: 0) | (v
? PSW_V
: 0));
874 unsigned long reg1
, imm
, value
;
876 reg1
= State
.regs
[REG_SP
];
877 imm
= ((insn
& 0xffff) << 16) | extension
;
879 State
.regs
[REG_SP
] = value
;
882 n
= (value
& 0x80000000);
884 v
= ((imm
& 0x8000000) != (reg1
& 0x80000000)
885 && (imm
& 0x8000000) != (value
& 0x80000000));
887 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
888 PSW
|= ((z
? PSW_Z
: 0) | ( n
? PSW_N
: 0)
889 | (c
? PSW_C
: 0) | (v
? PSW_V
: 0));
896 unsigned long reg1
, reg2
, value
;
898 reg1
= State
.regs
[REG_D0
+ ((insn
& 0xc) >> 2)];
899 reg2
= State
.regs
[REG_D0
+ (insn
& 0x3)];
900 value
= reg1
+ reg2
+ ((PSW
& PSW_C
) != 0);
901 State
.regs
[REG_D0
+ (insn
& 0x3)] = value
;
904 n
= (value
& 0x80000000);
906 v
= ((reg2
& 0x8000000) != (reg1
& 0x80000000)
907 && (reg2
& 0x8000000) != (value
& 0x80000000));
909 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
910 PSW
|= ((z
? PSW_Z
: 0) | ( n
? PSW_N
: 0)
911 | (c
? PSW_C
: 0) | (v
? PSW_V
: 0));
972 State
.regs
[REG_D0
+ ((insn
& 0xc) >> 2)] += 1;
978 State
.regs
[REG_A0
+ ((insn
& 0xc) >> 2)] += 1;
984 State
.regs
[REG_A0
+ (insn
& 0x3)] += 4;
1016 unsigned long reg1
, reg2
, value
;
1018 reg1
= State
.regs
[REG_A0
+ ((insn
& 0xc) >> 2)];
1019 reg2
= State
.regs
[REG_A0
+ (insn
& 0x3)];
1020 value
= reg1
- reg2
;
1023 n
= (value
& 0x80000000);
1025 v
= ((reg2
& 0x8000000) != (reg1
& 0x80000000)
1026 && (reg2
& 0x8000000) != (value
& 0x80000000));
1028 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
1029 PSW
|= ((z
? PSW_Z
: 0) | ( n
? PSW_N
: 0)
1030 | (c
? PSW_C
: 0) | (v
? PSW_V
: 0));
1226 /* The dispatching code will add 2 after we return, so
1227 we subtract two here to make things right. */
1229 State
.pc
+= SEXT8 (insn
& 0xff) - 2;
1235 /* The dispatching code will add 2 after we return, so
1236 we subtract two here to make things right. */
1238 State
.pc
+= SEXT8 (insn
& 0xff) - 2;