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)
98 State
.regs
[REG_A0
+ (insn
& 0x3)] = State
.regs
[REG_SP
];
104 State
.regs
[REG_SP
] = State
.regs
[REG_A0
+ ((insn
& 0xc) >> 2)];
357 value
= (insn
& 0xffff) << 16 | extension
;
358 State
.regs
[REG_A0
+ ((insn
& 0x30000) >> 16)] = value
;
414 store_mem (State
.regs
[REG_A0
+ ((insn
& 0xc) >> 2)], 1,
415 State
.regs
[REG_D0
+ (insn
& 0x3)]);
601 State
.regs
[REG_D0
+ ((insn
& 0xc) >> 2)] = 0;
604 PSW
&= ~(PSW_V
| PSW_C
| PSW_N
);
611 unsigned long reg1
, reg2
, value
;
613 reg1
= State
.regs
[REG_D0
+ ((insn
& 0xc) >> 2)];
614 reg2
= State
.regs
[REG_D0
+ (insn
& 0x3)];
616 State
.regs
[REG_D0
+ (insn
& 0x3)] = value
;
619 n
= (value
& 0x80000000);
621 v
= ((reg2
& 0x8000000) != (reg1
& 0x80000000)
622 && (reg2
& 0x8000000) != (value
& 0x80000000));
624 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
625 PSW
|= ((z
? PSW_Z
: 0) | ( n
? PSW_N
: 0)
626 | (c
? PSW_C
: 0) | (v
? PSW_V
: 0));
633 unsigned long reg1
, reg2
, value
;
635 reg1
= State
.regs
[REG_D0
+ ((insn
& 0xc) >> 2)];
636 reg2
= State
.regs
[REG_A0
+ (insn
& 0x3)];
638 State
.regs
[REG_A0
+ (insn
& 0x3)] = value
;
641 n
= (value
& 0x80000000);
643 v
= ((reg2
& 0x8000000) != (reg1
& 0x80000000)
644 && (reg2
& 0x8000000) != (value
& 0x80000000));
646 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
647 PSW
|= ((z
? PSW_Z
: 0) | ( n
? PSW_N
: 0)
648 | (c
? PSW_C
: 0) | (v
? PSW_V
: 0));
655 unsigned long reg1
, reg2
, value
;
657 reg1
= State
.regs
[REG_A0
+ ((insn
& 0xc) >> 2)];
658 reg2
= State
.regs
[REG_D0
+ (insn
& 0x3)];
660 State
.regs
[REG_D0
+ (insn
& 0x3)] = value
;
663 n
= (value
& 0x80000000);
665 v
= ((reg2
& 0x8000000) != (reg1
& 0x80000000)
666 && (reg2
& 0x8000000) != (value
& 0x80000000));
668 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
669 PSW
|= ((z
? PSW_Z
: 0) | ( n
? PSW_N
: 0)
670 | (c
? PSW_C
: 0) | (v
? PSW_V
: 0));
677 unsigned long reg1
, reg2
, value
;
679 reg1
= State
.regs
[REG_A0
+ ((insn
& 0xc) >> 2)];
680 reg2
= State
.regs
[REG_A0
+ (insn
& 0x3)];
682 State
.regs
[REG_A0
+ (insn
& 0x3)] = value
;
685 n
= (value
& 0x80000000);
687 v
= ((reg2
& 0x8000000) != (reg1
& 0x80000000)
688 && (reg2
& 0x8000000) != (value
& 0x80000000));
690 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
691 PSW
|= ((z
? PSW_Z
: 0) | ( n
? PSW_N
: 0)
692 | (c
? PSW_C
: 0) | (v
? PSW_V
: 0));
699 unsigned long reg1
, imm
, value
;
701 reg1
= State
.regs
[REG_D0
+ ((insn
& 0xc00) >> 8)];
702 imm
= SEXT8 (insn
& 0xff);
704 State
.regs
[REG_D0
+ ((insn
& 0xc00) >> 8)] = value
;
707 n
= (value
& 0x80000000);
709 v
= ((imm
& 0x8000000) != (reg1
& 0x80000000)
710 && (imm
& 0x8000000) != (value
& 0x80000000));
712 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
713 PSW
|= ((z
? PSW_Z
: 0) | ( n
? PSW_N
: 0)
714 | (c
? PSW_C
: 0) | (v
? PSW_V
: 0));
721 unsigned long reg1
, imm
, value
;
723 reg1
= State
.regs
[REG_D0
+ ((insn
& 0xc0000) >> 16)];
724 imm
= SEXT16 (insn
& 0xffff);
726 State
.regs
[REG_D0
+ ((insn
& 0xc0000) >> 16)] = value
;
729 n
= (value
& 0x80000000);
731 v
= ((imm
& 0x8000000) != (reg1
& 0x80000000)
732 && (imm
& 0x8000000) != (value
& 0x80000000));
734 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
735 PSW
|= ((z
? PSW_Z
: 0) | ( n
? PSW_N
: 0)
736 | (c
? PSW_C
: 0) | (v
? PSW_V
: 0));
743 unsigned long reg1
, imm
, value
;
745 reg1
= State
.regs
[REG_D0
+ ((insn
& 0xc0000) >> 16)];
746 imm
= ((insn
& 0xffff) << 16) | extension
;
748 State
.regs
[REG_D0
+ ((insn
& 0xc0000) >> 16)] = value
;
751 n
= (value
& 0x80000000);
753 v
= ((imm
& 0x8000000) != (reg1
& 0x80000000)
754 && (imm
& 0x8000000) != (value
& 0x80000000));
756 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
757 PSW
|= ((z
? PSW_Z
: 0) | ( n
? PSW_N
: 0)
758 | (c
? PSW_C
: 0) | (v
? PSW_V
: 0));
765 unsigned long reg1
, imm
, value
;
767 reg1
= State
.regs
[REG_A0
+ ((insn
& 0xc00) >> 8)];
770 State
.regs
[REG_A0
+ ((insn
& 0xc00) >> 8)] = value
;
773 n
= (value
& 0x80000000);
775 v
= ((imm
& 0x8000000) != (reg1
& 0x80000000)
776 && (imm
& 0x8000000) != (value
& 0x80000000));
778 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
779 PSW
|= ((z
? PSW_Z
: 0) | ( n
? PSW_N
: 0)
780 | (c
? PSW_C
: 0) | (v
? PSW_V
: 0));
787 unsigned long reg1
, imm
, value
;
789 reg1
= State
.regs
[REG_A0
+ ((insn
& 0xc0000) >> 16)];
792 State
.regs
[REG_A0
+ ((insn
& 0xc0000) >> 16)] = value
;
795 n
= (value
& 0x80000000);
797 v
= ((imm
& 0x8000000) != (reg1
& 0x80000000)
798 && (imm
& 0x8000000) != (value
& 0x80000000));
800 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
801 PSW
|= ((z
? PSW_Z
: 0) | ( n
? PSW_N
: 0)
802 | (c
? PSW_C
: 0) | (v
? PSW_V
: 0));
809 unsigned long reg1
, imm
, value
;
811 reg1
= State
.regs
[REG_A0
+ ((insn
& 0xc0000) >> 16)];
812 imm
= ((insn
& 0xffff) << 16) | extension
;
814 State
.regs
[REG_A0
+ ((insn
& 0xc0000) >> 16)] = value
;
817 n
= (value
& 0x80000000);
819 v
= ((imm
& 0x8000000) != (reg1
& 0x80000000)
820 && (imm
& 0x8000000) != (value
& 0x80000000));
822 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
823 PSW
|= ((z
? PSW_Z
: 0) | ( n
? PSW_N
: 0)
824 | (c
? PSW_C
: 0) | (v
? PSW_V
: 0));
831 unsigned long reg1
, imm
, value
;
833 reg1
= State
.regs
[REG_SP
];
834 imm
= SEXT8 (insn
& 0xff);
836 State
.regs
[REG_SP
] = value
;
839 n
= (value
& 0x80000000);
841 v
= ((imm
& 0x8000000) != (reg1
& 0x80000000)
842 && (imm
& 0x8000000) != (value
& 0x80000000));
844 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
845 PSW
|= ((z
? PSW_Z
: 0) | ( n
? PSW_N
: 0)
846 | (c
? PSW_C
: 0) | (v
? PSW_V
: 0));
853 unsigned long reg1
, imm
, value
;
855 reg1
= State
.regs
[REG_SP
];
856 imm
= SEXT16 (insn
& 0xffff);
858 State
.regs
[REG_SP
] = value
;
861 n
= (value
& 0x80000000);
863 v
= ((imm
& 0x8000000) != (reg1
& 0x80000000)
864 && (imm
& 0x8000000) != (value
& 0x80000000));
866 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
867 PSW
|= ((z
? PSW_Z
: 0) | ( n
? PSW_N
: 0)
868 | (c
? PSW_C
: 0) | (v
? PSW_V
: 0));
875 unsigned long reg1
, imm
, value
;
877 reg1
= State
.regs
[REG_SP
];
878 imm
= ((insn
& 0xffff) << 16) | extension
;
880 State
.regs
[REG_SP
] = value
;
883 n
= (value
& 0x80000000);
885 v
= ((imm
& 0x8000000) != (reg1
& 0x80000000)
886 && (imm
& 0x8000000) != (value
& 0x80000000));
888 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
889 PSW
|= ((z
? PSW_Z
: 0) | ( n
? PSW_N
: 0)
890 | (c
? PSW_C
: 0) | (v
? PSW_V
: 0));
897 unsigned long reg1
, reg2
, value
;
899 reg1
= State
.regs
[REG_D0
+ ((insn
& 0xc) >> 2)];
900 reg2
= State
.regs
[REG_D0
+ (insn
& 0x3)];
901 value
= reg1
+ reg2
+ ((PSW
& PSW_C
) != 0);
902 State
.regs
[REG_D0
+ (insn
& 0x3)] = value
;
905 n
= (value
& 0x80000000);
907 v
= ((reg2
& 0x8000000) != (reg1
& 0x80000000)
908 && (reg2
& 0x8000000) != (value
& 0x80000000));
910 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
911 PSW
|= ((z
? PSW_Z
: 0) | ( n
? PSW_N
: 0)
912 | (c
? PSW_C
: 0) | (v
? PSW_V
: 0));
973 State
.regs
[REG_D0
+ ((insn
& 0xc) >> 2)] += 1;
979 State
.regs
[REG_A0
+ ((insn
& 0xc) >> 2)] += 1;
985 State
.regs
[REG_A0
+ (insn
& 0x3)] += 4;
992 unsigned long reg1
, imm
, value
;
994 reg1
= State
.regs
[REG_D0
+ ((insn
& 0x300) >> 8)];
995 imm
= SEXT8 (insn
& 0xff);
999 n
= (value
& 0x80000000);
1001 v
= ((imm
& 0x8000000) != (reg1
& 0x80000000)
1002 && (imm
& 0x8000000) != (value
& 0x80000000));
1004 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
1005 PSW
|= ((z
? PSW_Z
: 0) | ( n
? PSW_N
: 0)
1006 | (c
? PSW_C
: 0) | (v
? PSW_V
: 0));
1013 unsigned long reg1
, reg2
, value
;
1015 reg1
= State
.regs
[REG_D0
+ ((insn
& 0xc) >> 2)];
1016 reg2
= State
.regs
[REG_D0
+ (insn
& 0x3)];
1017 value
= reg1
- reg2
;
1020 n
= (value
& 0x80000000);
1022 v
= ((reg2
& 0x8000000) != (reg1
& 0x80000000)
1023 && (reg2
& 0x8000000) != (value
& 0x80000000));
1025 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
1026 PSW
|= ((z
? PSW_Z
: 0) | ( n
? PSW_N
: 0)
1027 | (c
? PSW_C
: 0) | (v
? PSW_V
: 0));
1034 unsigned long reg1
, reg2
, value
;
1036 reg1
= State
.regs
[REG_D0
+ ((insn
& 0xc) >> 2)];
1037 reg2
= State
.regs
[REG_A0
+ (insn
& 0x3)];
1038 value
= reg1
- reg2
;
1041 n
= (value
& 0x80000000);
1043 v
= ((reg2
& 0x8000000) != (reg1
& 0x80000000)
1044 && (reg2
& 0x8000000) != (value
& 0x80000000));
1046 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
1047 PSW
|= ((z
? PSW_Z
: 0) | ( n
? PSW_N
: 0)
1048 | (c
? PSW_C
: 0) | (v
? PSW_V
: 0));
1055 unsigned long reg1
, reg2
, value
;
1057 reg1
= State
.regs
[REG_A0
+ ((insn
& 0xc) >> 2)];
1058 reg2
= State
.regs
[REG_D0
+ (insn
& 0x3)];
1059 value
= reg1
- reg2
;
1062 n
= (value
& 0x80000000);
1064 v
= ((reg2
& 0x8000000) != (reg1
& 0x80000000)
1065 && (reg2
& 0x8000000) != (value
& 0x80000000));
1067 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
1068 PSW
|= ((z
? PSW_Z
: 0) | ( n
? PSW_N
: 0)
1069 | (c
? PSW_C
: 0) | (v
? PSW_V
: 0));
1076 unsigned long reg1
, imm
, value
;
1078 reg1
= State
.regs
[REG_A0
+ ((insn
& 0x300) >> 8)];
1083 n
= (value
& 0x80000000);
1085 v
= ((imm
& 0x8000000) != (reg1
& 0x80000000)
1086 && (imm
& 0x8000000) != (value
& 0x80000000));
1088 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
1089 PSW
|= ((z
? PSW_Z
: 0) | ( n
? PSW_N
: 0)
1090 | (c
? PSW_C
: 0) | (v
? PSW_V
: 0));
1097 unsigned long reg1
, reg2
, value
;
1099 reg1
= State
.regs
[REG_A0
+ ((insn
& 0xc) >> 2)];
1100 reg2
= State
.regs
[REG_A0
+ (insn
& 0x3)];
1101 value
= reg1
- reg2
;
1104 n
= (value
& 0x80000000);
1106 v
= ((reg2
& 0x8000000) != (reg1
& 0x80000000)
1107 && (reg2
& 0x8000000) != (value
& 0x80000000));
1109 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
1110 PSW
|= ((z
? PSW_Z
: 0) | ( n
? PSW_N
: 0)
1111 | (c
? PSW_C
: 0) | (v
? PSW_V
: 0));
1118 unsigned long reg1
, imm
, value
;
1120 reg1
= State
.regs
[REG_D0
+ ((insn
& 0x300) >> 16)];
1121 imm
= SEXT16 (insn
& 0xffff);
1125 n
= (value
& 0x80000000);
1127 v
= ((imm
& 0x8000000) != (reg1
& 0x80000000)
1128 && (imm
& 0x8000000) != (value
& 0x80000000));
1130 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
1131 PSW
|= ((z
? PSW_Z
: 0) | ( n
? PSW_N
: 0)
1132 | (c
? PSW_C
: 0) | (v
? PSW_V
: 0));
1139 unsigned long reg1
, imm
, value
;
1141 reg1
= State
.regs
[REG_D0
+ ((insn
& 0x300) >> 16)];
1142 imm
= ((insn
& 0xffff) << 16) | extension
;
1146 n
= (value
& 0x80000000);
1148 v
= ((imm
& 0x8000000) != (reg1
& 0x80000000)
1149 && (imm
& 0x8000000) != (value
& 0x80000000));
1151 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
1152 PSW
|= ((z
? PSW_Z
: 0) | ( n
? PSW_N
: 0)
1153 | (c
? PSW_C
: 0) | (v
? PSW_V
: 0));
1160 unsigned long reg1
, imm
, value
;
1162 reg1
= State
.regs
[REG_A0
+ ((insn
& 0x300) >> 16)];
1163 imm
= insn
& 0xffff;
1167 n
= (value
& 0x80000000);
1169 v
= ((imm
& 0x8000000) != (reg1
& 0x80000000)
1170 && (imm
& 0x8000000) != (value
& 0x80000000));
1172 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
1173 PSW
|= ((z
? PSW_Z
: 0) | ( n
? PSW_N
: 0)
1174 | (c
? PSW_C
: 0) | (v
? PSW_V
: 0));
1181 unsigned long reg1
, imm
, value
;
1183 reg1
= State
.regs
[REG_A0
+ ((insn
& 0x300) >> 16)];
1184 imm
= ((insn
& 0xffff) << 16) | extension
;
1188 n
= (value
& 0x80000000);
1190 v
= ((imm
& 0x8000000) != (reg1
& 0x80000000)
1191 && (imm
& 0x8000000) != (value
& 0x80000000));
1193 PSW
&= ~(PSW_Z
| PSW_N
| PSW_C
| PSW_V
);
1194 PSW
|= ((z
? PSW_Z
: 0) | ( n
? PSW_N
: 0)
1195 | (c
? PSW_C
: 0) | (v
? PSW_V
: 0));
1371 /* The dispatching code will add 2 after we return, so
1372 we subtract two here to make things right. */
1374 State
.pc
+= SEXT8 (insn
& 0xff) - 2;
1380 /* The dispatching code will add 2 after we return, so
1381 we subtract two here to make things right. */
1383 State
.pc
+= SEXT8 (insn
& 0xff) - 2;
1514 State
.pc
= State
.regs
[REG_A0
+ (insn
& 0x3)] - 2;
1520 State
.pc
+= SEXT16 (insn
& 0xffff) - 3;
1526 State
.pc
+= (((insn
& 0xffffff) << 8) | extension
) - 5;
1542 unsigned int next_pc
, sp
;
1544 sp
= State
.regs
[REG_SP
];
1545 next_pc
= State
.pc
+ 2;
1546 State
.mem
[sp
] = next_pc
& 0xff;
1547 State
.mem
[sp
+1] = next_pc
& 0xff00;
1548 State
.mem
[sp
+2] = next_pc
& 0xff0000;
1549 State
.mem
[sp
+3] = next_pc
& 0xff000000;
1550 State
.regs
[REG_MDR
] = next_pc
;
1551 State
.pc
= State
.regs
[REG_A0
+ (insn
& 0x3)] - 2;
1557 unsigned int next_pc
, sp
;
1559 sp
= State
.regs
[REG_SP
];
1560 next_pc
= State
.pc
+ 4;
1561 State
.mem
[sp
] = next_pc
& 0xff;
1562 State
.mem
[sp
+1] = next_pc
& 0xff00;
1563 State
.mem
[sp
+2] = next_pc
& 0xff0000;
1564 State
.mem
[sp
+3] = next_pc
& 0xff000000;
1565 State
.regs
[REG_MDR
] = next_pc
;
1566 State
.pc
+= SEXT16 (insn
& 0xffff) - 4;
1572 unsigned int next_pc
, sp
;
1574 sp
= State
.regs
[REG_SP
];
1575 next_pc
= State
.pc
+ 6;
1576 State
.mem
[sp
] = next_pc
& 0xff;
1577 State
.mem
[sp
+1] = next_pc
& 0xff00;
1578 State
.mem
[sp
+2] = next_pc
& 0xff0000;
1579 State
.mem
[sp
+3] = next_pc
& 0xff000000;
1580 State
.regs
[REG_MDR
] = next_pc
;
1581 State
.pc
+= (((insn
& 0xffff) << 16) | extension
) - 6;
1599 sp
= State
.regs
[REG_SP
];
1600 State
.pc
= (State
.mem
[sp
] | (State
.mem
[sp
+1] << 8)
1601 | (State
.mem
[sp
+2] << 16) | (State
.mem
[sp
+3] << 24));