semx-switch.c revision 1.1 1 1.1 christos /* Simulator instruction semantics for m32rxf.
2 1.1 christos
3 1.1 christos THIS FILE IS MACHINE GENERATED WITH CGEN.
4 1.1 christos
5 1.1 christos Copyright 1996-2014 Free Software Foundation, Inc.
6 1.1 christos
7 1.1 christos This file is part of the GNU simulators.
8 1.1 christos
9 1.1 christos This file is free software; you can redistribute it and/or modify
10 1.1 christos it under the terms of the GNU General Public License as published by
11 1.1 christos the Free Software Foundation; either version 3, or (at your option)
12 1.1 christos any later version.
13 1.1 christos
14 1.1 christos It is distributed in the hope that it will be useful, but WITHOUT
15 1.1 christos ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
16 1.1 christos or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
17 1.1 christos License for more details.
18 1.1 christos
19 1.1 christos You should have received a copy of the GNU General Public License along
20 1.1 christos with this program; if not, see <http://www.gnu.org/licenses/>.
21 1.1 christos
22 1.1 christos */
23 1.1 christos
24 1.1 christos #ifdef DEFINE_LABELS
25 1.1 christos
26 1.1 christos /* The labels have the case they have because the enum of insn types
27 1.1 christos is all uppercase and in the non-stdc case the insn symbol is built
28 1.1 christos into the enum name. */
29 1.1 christos
30 1.1 christos static struct {
31 1.1 christos int index;
32 1.1 christos void *label;
33 1.1 christos } labels[] = {
34 1.1 christos { M32RXF_INSN_X_INVALID, && case_sem_INSN_X_INVALID },
35 1.1 christos { M32RXF_INSN_X_AFTER, && case_sem_INSN_X_AFTER },
36 1.1 christos { M32RXF_INSN_X_BEFORE, && case_sem_INSN_X_BEFORE },
37 1.1 christos { M32RXF_INSN_X_CTI_CHAIN, && case_sem_INSN_X_CTI_CHAIN },
38 1.1 christos { M32RXF_INSN_X_CHAIN, && case_sem_INSN_X_CHAIN },
39 1.1 christos { M32RXF_INSN_X_BEGIN, && case_sem_INSN_X_BEGIN },
40 1.1 christos { M32RXF_INSN_ADD, && case_sem_INSN_ADD },
41 1.1 christos { M32RXF_INSN_ADD3, && case_sem_INSN_ADD3 },
42 1.1 christos { M32RXF_INSN_AND, && case_sem_INSN_AND },
43 1.1 christos { M32RXF_INSN_AND3, && case_sem_INSN_AND3 },
44 1.1 christos { M32RXF_INSN_OR, && case_sem_INSN_OR },
45 1.1 christos { M32RXF_INSN_OR3, && case_sem_INSN_OR3 },
46 1.1 christos { M32RXF_INSN_XOR, && case_sem_INSN_XOR },
47 1.1 christos { M32RXF_INSN_XOR3, && case_sem_INSN_XOR3 },
48 1.1 christos { M32RXF_INSN_ADDI, && case_sem_INSN_ADDI },
49 1.1 christos { M32RXF_INSN_ADDV, && case_sem_INSN_ADDV },
50 1.1 christos { M32RXF_INSN_ADDV3, && case_sem_INSN_ADDV3 },
51 1.1 christos { M32RXF_INSN_ADDX, && case_sem_INSN_ADDX },
52 1.1 christos { M32RXF_INSN_BC8, && case_sem_INSN_BC8 },
53 1.1 christos { M32RXF_INSN_BC24, && case_sem_INSN_BC24 },
54 1.1 christos { M32RXF_INSN_BEQ, && case_sem_INSN_BEQ },
55 1.1 christos { M32RXF_INSN_BEQZ, && case_sem_INSN_BEQZ },
56 1.1 christos { M32RXF_INSN_BGEZ, && case_sem_INSN_BGEZ },
57 1.1 christos { M32RXF_INSN_BGTZ, && case_sem_INSN_BGTZ },
58 1.1 christos { M32RXF_INSN_BLEZ, && case_sem_INSN_BLEZ },
59 1.1 christos { M32RXF_INSN_BLTZ, && case_sem_INSN_BLTZ },
60 1.1 christos { M32RXF_INSN_BNEZ, && case_sem_INSN_BNEZ },
61 1.1 christos { M32RXF_INSN_BL8, && case_sem_INSN_BL8 },
62 1.1 christos { M32RXF_INSN_BL24, && case_sem_INSN_BL24 },
63 1.1 christos { M32RXF_INSN_BCL8, && case_sem_INSN_BCL8 },
64 1.1 christos { M32RXF_INSN_BCL24, && case_sem_INSN_BCL24 },
65 1.1 christos { M32RXF_INSN_BNC8, && case_sem_INSN_BNC8 },
66 1.1 christos { M32RXF_INSN_BNC24, && case_sem_INSN_BNC24 },
67 1.1 christos { M32RXF_INSN_BNE, && case_sem_INSN_BNE },
68 1.1 christos { M32RXF_INSN_BRA8, && case_sem_INSN_BRA8 },
69 1.1 christos { M32RXF_INSN_BRA24, && case_sem_INSN_BRA24 },
70 1.1 christos { M32RXF_INSN_BNCL8, && case_sem_INSN_BNCL8 },
71 1.1 christos { M32RXF_INSN_BNCL24, && case_sem_INSN_BNCL24 },
72 1.1 christos { M32RXF_INSN_CMP, && case_sem_INSN_CMP },
73 1.1 christos { M32RXF_INSN_CMPI, && case_sem_INSN_CMPI },
74 1.1 christos { M32RXF_INSN_CMPU, && case_sem_INSN_CMPU },
75 1.1 christos { M32RXF_INSN_CMPUI, && case_sem_INSN_CMPUI },
76 1.1 christos { M32RXF_INSN_CMPEQ, && case_sem_INSN_CMPEQ },
77 1.1 christos { M32RXF_INSN_CMPZ, && case_sem_INSN_CMPZ },
78 1.1 christos { M32RXF_INSN_DIV, && case_sem_INSN_DIV },
79 1.1 christos { M32RXF_INSN_DIVU, && case_sem_INSN_DIVU },
80 1.1 christos { M32RXF_INSN_REM, && case_sem_INSN_REM },
81 1.1 christos { M32RXF_INSN_REMU, && case_sem_INSN_REMU },
82 1.1 christos { M32RXF_INSN_DIVH, && case_sem_INSN_DIVH },
83 1.1 christos { M32RXF_INSN_JC, && case_sem_INSN_JC },
84 1.1 christos { M32RXF_INSN_JNC, && case_sem_INSN_JNC },
85 1.1 christos { M32RXF_INSN_JL, && case_sem_INSN_JL },
86 1.1 christos { M32RXF_INSN_JMP, && case_sem_INSN_JMP },
87 1.1 christos { M32RXF_INSN_LD, && case_sem_INSN_LD },
88 1.1 christos { M32RXF_INSN_LD_D, && case_sem_INSN_LD_D },
89 1.1 christos { M32RXF_INSN_LDB, && case_sem_INSN_LDB },
90 1.1 christos { M32RXF_INSN_LDB_D, && case_sem_INSN_LDB_D },
91 1.1 christos { M32RXF_INSN_LDH, && case_sem_INSN_LDH },
92 1.1 christos { M32RXF_INSN_LDH_D, && case_sem_INSN_LDH_D },
93 1.1 christos { M32RXF_INSN_LDUB, && case_sem_INSN_LDUB },
94 1.1 christos { M32RXF_INSN_LDUB_D, && case_sem_INSN_LDUB_D },
95 1.1 christos { M32RXF_INSN_LDUH, && case_sem_INSN_LDUH },
96 1.1 christos { M32RXF_INSN_LDUH_D, && case_sem_INSN_LDUH_D },
97 1.1 christos { M32RXF_INSN_LD_PLUS, && case_sem_INSN_LD_PLUS },
98 1.1 christos { M32RXF_INSN_LD24, && case_sem_INSN_LD24 },
99 1.1 christos { M32RXF_INSN_LDI8, && case_sem_INSN_LDI8 },
100 1.1 christos { M32RXF_INSN_LDI16, && case_sem_INSN_LDI16 },
101 1.1 christos { M32RXF_INSN_LOCK, && case_sem_INSN_LOCK },
102 1.1 christos { M32RXF_INSN_MACHI_A, && case_sem_INSN_MACHI_A },
103 1.1 christos { M32RXF_INSN_MACLO_A, && case_sem_INSN_MACLO_A },
104 1.1 christos { M32RXF_INSN_MACWHI_A, && case_sem_INSN_MACWHI_A },
105 1.1 christos { M32RXF_INSN_MACWLO_A, && case_sem_INSN_MACWLO_A },
106 1.1 christos { M32RXF_INSN_MUL, && case_sem_INSN_MUL },
107 1.1 christos { M32RXF_INSN_MULHI_A, && case_sem_INSN_MULHI_A },
108 1.1 christos { M32RXF_INSN_MULLO_A, && case_sem_INSN_MULLO_A },
109 1.1 christos { M32RXF_INSN_MULWHI_A, && case_sem_INSN_MULWHI_A },
110 1.1 christos { M32RXF_INSN_MULWLO_A, && case_sem_INSN_MULWLO_A },
111 1.1 christos { M32RXF_INSN_MV, && case_sem_INSN_MV },
112 1.1 christos { M32RXF_INSN_MVFACHI_A, && case_sem_INSN_MVFACHI_A },
113 1.1 christos { M32RXF_INSN_MVFACLO_A, && case_sem_INSN_MVFACLO_A },
114 1.1 christos { M32RXF_INSN_MVFACMI_A, && case_sem_INSN_MVFACMI_A },
115 1.1 christos { M32RXF_INSN_MVFC, && case_sem_INSN_MVFC },
116 1.1 christos { M32RXF_INSN_MVTACHI_A, && case_sem_INSN_MVTACHI_A },
117 1.1 christos { M32RXF_INSN_MVTACLO_A, && case_sem_INSN_MVTACLO_A },
118 1.1 christos { M32RXF_INSN_MVTC, && case_sem_INSN_MVTC },
119 1.1 christos { M32RXF_INSN_NEG, && case_sem_INSN_NEG },
120 1.1 christos { M32RXF_INSN_NOP, && case_sem_INSN_NOP },
121 1.1 christos { M32RXF_INSN_NOT, && case_sem_INSN_NOT },
122 1.1 christos { M32RXF_INSN_RAC_DSI, && case_sem_INSN_RAC_DSI },
123 1.1 christos { M32RXF_INSN_RACH_DSI, && case_sem_INSN_RACH_DSI },
124 1.1 christos { M32RXF_INSN_RTE, && case_sem_INSN_RTE },
125 1.1 christos { M32RXF_INSN_SETH, && case_sem_INSN_SETH },
126 1.1 christos { M32RXF_INSN_SLL, && case_sem_INSN_SLL },
127 1.1 christos { M32RXF_INSN_SLL3, && case_sem_INSN_SLL3 },
128 1.1 christos { M32RXF_INSN_SLLI, && case_sem_INSN_SLLI },
129 1.1 christos { M32RXF_INSN_SRA, && case_sem_INSN_SRA },
130 1.1 christos { M32RXF_INSN_SRA3, && case_sem_INSN_SRA3 },
131 1.1 christos { M32RXF_INSN_SRAI, && case_sem_INSN_SRAI },
132 1.1 christos { M32RXF_INSN_SRL, && case_sem_INSN_SRL },
133 1.1 christos { M32RXF_INSN_SRL3, && case_sem_INSN_SRL3 },
134 1.1 christos { M32RXF_INSN_SRLI, && case_sem_INSN_SRLI },
135 1.1 christos { M32RXF_INSN_ST, && case_sem_INSN_ST },
136 1.1 christos { M32RXF_INSN_ST_D, && case_sem_INSN_ST_D },
137 1.1 christos { M32RXF_INSN_STB, && case_sem_INSN_STB },
138 1.1 christos { M32RXF_INSN_STB_D, && case_sem_INSN_STB_D },
139 1.1 christos { M32RXF_INSN_STH, && case_sem_INSN_STH },
140 1.1 christos { M32RXF_INSN_STH_D, && case_sem_INSN_STH_D },
141 1.1 christos { M32RXF_INSN_ST_PLUS, && case_sem_INSN_ST_PLUS },
142 1.1 christos { M32RXF_INSN_STH_PLUS, && case_sem_INSN_STH_PLUS },
143 1.1 christos { M32RXF_INSN_STB_PLUS, && case_sem_INSN_STB_PLUS },
144 1.1 christos { M32RXF_INSN_ST_MINUS, && case_sem_INSN_ST_MINUS },
145 1.1 christos { M32RXF_INSN_SUB, && case_sem_INSN_SUB },
146 1.1 christos { M32RXF_INSN_SUBV, && case_sem_INSN_SUBV },
147 1.1 christos { M32RXF_INSN_SUBX, && case_sem_INSN_SUBX },
148 1.1 christos { M32RXF_INSN_TRAP, && case_sem_INSN_TRAP },
149 1.1 christos { M32RXF_INSN_UNLOCK, && case_sem_INSN_UNLOCK },
150 1.1 christos { M32RXF_INSN_SATB, && case_sem_INSN_SATB },
151 1.1 christos { M32RXF_INSN_SATH, && case_sem_INSN_SATH },
152 1.1 christos { M32RXF_INSN_SAT, && case_sem_INSN_SAT },
153 1.1 christos { M32RXF_INSN_PCMPBZ, && case_sem_INSN_PCMPBZ },
154 1.1 christos { M32RXF_INSN_SADD, && case_sem_INSN_SADD },
155 1.1 christos { M32RXF_INSN_MACWU1, && case_sem_INSN_MACWU1 },
156 1.1 christos { M32RXF_INSN_MSBLO, && case_sem_INSN_MSBLO },
157 1.1 christos { M32RXF_INSN_MULWU1, && case_sem_INSN_MULWU1 },
158 1.1 christos { M32RXF_INSN_MACLH1, && case_sem_INSN_MACLH1 },
159 1.1 christos { M32RXF_INSN_SC, && case_sem_INSN_SC },
160 1.1 christos { M32RXF_INSN_SNC, && case_sem_INSN_SNC },
161 1.1 christos { M32RXF_INSN_CLRPSW, && case_sem_INSN_CLRPSW },
162 1.1 christos { M32RXF_INSN_SETPSW, && case_sem_INSN_SETPSW },
163 1.1 christos { M32RXF_INSN_BSET, && case_sem_INSN_BSET },
164 1.1 christos { M32RXF_INSN_BCLR, && case_sem_INSN_BCLR },
165 1.1 christos { M32RXF_INSN_BTST, && case_sem_INSN_BTST },
166 1.1 christos { M32RXF_INSN_PAR_ADD, && case_sem_INSN_PAR_ADD },
167 1.1 christos { M32RXF_INSN_WRITE_ADD, && case_sem_INSN_WRITE_ADD },
168 1.1 christos { M32RXF_INSN_PAR_AND, && case_sem_INSN_PAR_AND },
169 1.1 christos { M32RXF_INSN_WRITE_AND, && case_sem_INSN_WRITE_AND },
170 1.1 christos { M32RXF_INSN_PAR_OR, && case_sem_INSN_PAR_OR },
171 1.1 christos { M32RXF_INSN_WRITE_OR, && case_sem_INSN_WRITE_OR },
172 1.1 christos { M32RXF_INSN_PAR_XOR, && case_sem_INSN_PAR_XOR },
173 1.1 christos { M32RXF_INSN_WRITE_XOR, && case_sem_INSN_WRITE_XOR },
174 1.1 christos { M32RXF_INSN_PAR_ADDI, && case_sem_INSN_PAR_ADDI },
175 1.1 christos { M32RXF_INSN_WRITE_ADDI, && case_sem_INSN_WRITE_ADDI },
176 1.1 christos { M32RXF_INSN_PAR_ADDV, && case_sem_INSN_PAR_ADDV },
177 1.1 christos { M32RXF_INSN_WRITE_ADDV, && case_sem_INSN_WRITE_ADDV },
178 1.1 christos { M32RXF_INSN_PAR_ADDX, && case_sem_INSN_PAR_ADDX },
179 1.1 christos { M32RXF_INSN_WRITE_ADDX, && case_sem_INSN_WRITE_ADDX },
180 1.1 christos { M32RXF_INSN_PAR_BC8, && case_sem_INSN_PAR_BC8 },
181 1.1 christos { M32RXF_INSN_WRITE_BC8, && case_sem_INSN_WRITE_BC8 },
182 1.1 christos { M32RXF_INSN_PAR_BL8, && case_sem_INSN_PAR_BL8 },
183 1.1 christos { M32RXF_INSN_WRITE_BL8, && case_sem_INSN_WRITE_BL8 },
184 1.1 christos { M32RXF_INSN_PAR_BCL8, && case_sem_INSN_PAR_BCL8 },
185 1.1 christos { M32RXF_INSN_WRITE_BCL8, && case_sem_INSN_WRITE_BCL8 },
186 1.1 christos { M32RXF_INSN_PAR_BNC8, && case_sem_INSN_PAR_BNC8 },
187 1.1 christos { M32RXF_INSN_WRITE_BNC8, && case_sem_INSN_WRITE_BNC8 },
188 1.1 christos { M32RXF_INSN_PAR_BRA8, && case_sem_INSN_PAR_BRA8 },
189 1.1 christos { M32RXF_INSN_WRITE_BRA8, && case_sem_INSN_WRITE_BRA8 },
190 1.1 christos { M32RXF_INSN_PAR_BNCL8, && case_sem_INSN_PAR_BNCL8 },
191 1.1 christos { M32RXF_INSN_WRITE_BNCL8, && case_sem_INSN_WRITE_BNCL8 },
192 1.1 christos { M32RXF_INSN_PAR_CMP, && case_sem_INSN_PAR_CMP },
193 1.1 christos { M32RXF_INSN_WRITE_CMP, && case_sem_INSN_WRITE_CMP },
194 1.1 christos { M32RXF_INSN_PAR_CMPU, && case_sem_INSN_PAR_CMPU },
195 1.1 christos { M32RXF_INSN_WRITE_CMPU, && case_sem_INSN_WRITE_CMPU },
196 1.1 christos { M32RXF_INSN_PAR_CMPEQ, && case_sem_INSN_PAR_CMPEQ },
197 1.1 christos { M32RXF_INSN_WRITE_CMPEQ, && case_sem_INSN_WRITE_CMPEQ },
198 1.1 christos { M32RXF_INSN_PAR_CMPZ, && case_sem_INSN_PAR_CMPZ },
199 1.1 christos { M32RXF_INSN_WRITE_CMPZ, && case_sem_INSN_WRITE_CMPZ },
200 1.1 christos { M32RXF_INSN_PAR_JC, && case_sem_INSN_PAR_JC },
201 1.1 christos { M32RXF_INSN_WRITE_JC, && case_sem_INSN_WRITE_JC },
202 1.1 christos { M32RXF_INSN_PAR_JNC, && case_sem_INSN_PAR_JNC },
203 1.1 christos { M32RXF_INSN_WRITE_JNC, && case_sem_INSN_WRITE_JNC },
204 1.1 christos { M32RXF_INSN_PAR_JL, && case_sem_INSN_PAR_JL },
205 1.1 christos { M32RXF_INSN_WRITE_JL, && case_sem_INSN_WRITE_JL },
206 1.1 christos { M32RXF_INSN_PAR_JMP, && case_sem_INSN_PAR_JMP },
207 1.1 christos { M32RXF_INSN_WRITE_JMP, && case_sem_INSN_WRITE_JMP },
208 1.1 christos { M32RXF_INSN_PAR_LD, && case_sem_INSN_PAR_LD },
209 1.1 christos { M32RXF_INSN_WRITE_LD, && case_sem_INSN_WRITE_LD },
210 1.1 christos { M32RXF_INSN_PAR_LDB, && case_sem_INSN_PAR_LDB },
211 1.1 christos { M32RXF_INSN_WRITE_LDB, && case_sem_INSN_WRITE_LDB },
212 1.1 christos { M32RXF_INSN_PAR_LDH, && case_sem_INSN_PAR_LDH },
213 1.1 christos { M32RXF_INSN_WRITE_LDH, && case_sem_INSN_WRITE_LDH },
214 1.1 christos { M32RXF_INSN_PAR_LDUB, && case_sem_INSN_PAR_LDUB },
215 1.1 christos { M32RXF_INSN_WRITE_LDUB, && case_sem_INSN_WRITE_LDUB },
216 1.1 christos { M32RXF_INSN_PAR_LDUH, && case_sem_INSN_PAR_LDUH },
217 1.1 christos { M32RXF_INSN_WRITE_LDUH, && case_sem_INSN_WRITE_LDUH },
218 1.1 christos { M32RXF_INSN_PAR_LD_PLUS, && case_sem_INSN_PAR_LD_PLUS },
219 1.1 christos { M32RXF_INSN_WRITE_LD_PLUS, && case_sem_INSN_WRITE_LD_PLUS },
220 1.1 christos { M32RXF_INSN_PAR_LDI8, && case_sem_INSN_PAR_LDI8 },
221 1.1 christos { M32RXF_INSN_WRITE_LDI8, && case_sem_INSN_WRITE_LDI8 },
222 1.1 christos { M32RXF_INSN_PAR_LOCK, && case_sem_INSN_PAR_LOCK },
223 1.1 christos { M32RXF_INSN_WRITE_LOCK, && case_sem_INSN_WRITE_LOCK },
224 1.1 christos { M32RXF_INSN_PAR_MACHI_A, && case_sem_INSN_PAR_MACHI_A },
225 1.1 christos { M32RXF_INSN_WRITE_MACHI_A, && case_sem_INSN_WRITE_MACHI_A },
226 1.1 christos { M32RXF_INSN_PAR_MACLO_A, && case_sem_INSN_PAR_MACLO_A },
227 1.1 christos { M32RXF_INSN_WRITE_MACLO_A, && case_sem_INSN_WRITE_MACLO_A },
228 1.1 christos { M32RXF_INSN_PAR_MACWHI_A, && case_sem_INSN_PAR_MACWHI_A },
229 1.1 christos { M32RXF_INSN_WRITE_MACWHI_A, && case_sem_INSN_WRITE_MACWHI_A },
230 1.1 christos { M32RXF_INSN_PAR_MACWLO_A, && case_sem_INSN_PAR_MACWLO_A },
231 1.1 christos { M32RXF_INSN_WRITE_MACWLO_A, && case_sem_INSN_WRITE_MACWLO_A },
232 1.1 christos { M32RXF_INSN_PAR_MUL, && case_sem_INSN_PAR_MUL },
233 1.1 christos { M32RXF_INSN_WRITE_MUL, && case_sem_INSN_WRITE_MUL },
234 1.1 christos { M32RXF_INSN_PAR_MULHI_A, && case_sem_INSN_PAR_MULHI_A },
235 1.1 christos { M32RXF_INSN_WRITE_MULHI_A, && case_sem_INSN_WRITE_MULHI_A },
236 1.1 christos { M32RXF_INSN_PAR_MULLO_A, && case_sem_INSN_PAR_MULLO_A },
237 1.1 christos { M32RXF_INSN_WRITE_MULLO_A, && case_sem_INSN_WRITE_MULLO_A },
238 1.1 christos { M32RXF_INSN_PAR_MULWHI_A, && case_sem_INSN_PAR_MULWHI_A },
239 1.1 christos { M32RXF_INSN_WRITE_MULWHI_A, && case_sem_INSN_WRITE_MULWHI_A },
240 1.1 christos { M32RXF_INSN_PAR_MULWLO_A, && case_sem_INSN_PAR_MULWLO_A },
241 1.1 christos { M32RXF_INSN_WRITE_MULWLO_A, && case_sem_INSN_WRITE_MULWLO_A },
242 1.1 christos { M32RXF_INSN_PAR_MV, && case_sem_INSN_PAR_MV },
243 1.1 christos { M32RXF_INSN_WRITE_MV, && case_sem_INSN_WRITE_MV },
244 1.1 christos { M32RXF_INSN_PAR_MVFACHI_A, && case_sem_INSN_PAR_MVFACHI_A },
245 1.1 christos { M32RXF_INSN_WRITE_MVFACHI_A, && case_sem_INSN_WRITE_MVFACHI_A },
246 1.1 christos { M32RXF_INSN_PAR_MVFACLO_A, && case_sem_INSN_PAR_MVFACLO_A },
247 1.1 christos { M32RXF_INSN_WRITE_MVFACLO_A, && case_sem_INSN_WRITE_MVFACLO_A },
248 1.1 christos { M32RXF_INSN_PAR_MVFACMI_A, && case_sem_INSN_PAR_MVFACMI_A },
249 1.1 christos { M32RXF_INSN_WRITE_MVFACMI_A, && case_sem_INSN_WRITE_MVFACMI_A },
250 1.1 christos { M32RXF_INSN_PAR_MVFC, && case_sem_INSN_PAR_MVFC },
251 1.1 christos { M32RXF_INSN_WRITE_MVFC, && case_sem_INSN_WRITE_MVFC },
252 1.1 christos { M32RXF_INSN_PAR_MVTACHI_A, && case_sem_INSN_PAR_MVTACHI_A },
253 1.1 christos { M32RXF_INSN_WRITE_MVTACHI_A, && case_sem_INSN_WRITE_MVTACHI_A },
254 1.1 christos { M32RXF_INSN_PAR_MVTACLO_A, && case_sem_INSN_PAR_MVTACLO_A },
255 1.1 christos { M32RXF_INSN_WRITE_MVTACLO_A, && case_sem_INSN_WRITE_MVTACLO_A },
256 1.1 christos { M32RXF_INSN_PAR_MVTC, && case_sem_INSN_PAR_MVTC },
257 1.1 christos { M32RXF_INSN_WRITE_MVTC, && case_sem_INSN_WRITE_MVTC },
258 1.1 christos { M32RXF_INSN_PAR_NEG, && case_sem_INSN_PAR_NEG },
259 1.1 christos { M32RXF_INSN_WRITE_NEG, && case_sem_INSN_WRITE_NEG },
260 1.1 christos { M32RXF_INSN_PAR_NOP, && case_sem_INSN_PAR_NOP },
261 1.1 christos { M32RXF_INSN_WRITE_NOP, && case_sem_INSN_WRITE_NOP },
262 1.1 christos { M32RXF_INSN_PAR_NOT, && case_sem_INSN_PAR_NOT },
263 1.1 christos { M32RXF_INSN_WRITE_NOT, && case_sem_INSN_WRITE_NOT },
264 1.1 christos { M32RXF_INSN_PAR_RAC_DSI, && case_sem_INSN_PAR_RAC_DSI },
265 1.1 christos { M32RXF_INSN_WRITE_RAC_DSI, && case_sem_INSN_WRITE_RAC_DSI },
266 1.1 christos { M32RXF_INSN_PAR_RACH_DSI, && case_sem_INSN_PAR_RACH_DSI },
267 1.1 christos { M32RXF_INSN_WRITE_RACH_DSI, && case_sem_INSN_WRITE_RACH_DSI },
268 1.1 christos { M32RXF_INSN_PAR_RTE, && case_sem_INSN_PAR_RTE },
269 1.1 christos { M32RXF_INSN_WRITE_RTE, && case_sem_INSN_WRITE_RTE },
270 1.1 christos { M32RXF_INSN_PAR_SLL, && case_sem_INSN_PAR_SLL },
271 1.1 christos { M32RXF_INSN_WRITE_SLL, && case_sem_INSN_WRITE_SLL },
272 1.1 christos { M32RXF_INSN_PAR_SLLI, && case_sem_INSN_PAR_SLLI },
273 1.1 christos { M32RXF_INSN_WRITE_SLLI, && case_sem_INSN_WRITE_SLLI },
274 1.1 christos { M32RXF_INSN_PAR_SRA, && case_sem_INSN_PAR_SRA },
275 1.1 christos { M32RXF_INSN_WRITE_SRA, && case_sem_INSN_WRITE_SRA },
276 1.1 christos { M32RXF_INSN_PAR_SRAI, && case_sem_INSN_PAR_SRAI },
277 1.1 christos { M32RXF_INSN_WRITE_SRAI, && case_sem_INSN_WRITE_SRAI },
278 1.1 christos { M32RXF_INSN_PAR_SRL, && case_sem_INSN_PAR_SRL },
279 1.1 christos { M32RXF_INSN_WRITE_SRL, && case_sem_INSN_WRITE_SRL },
280 1.1 christos { M32RXF_INSN_PAR_SRLI, && case_sem_INSN_PAR_SRLI },
281 1.1 christos { M32RXF_INSN_WRITE_SRLI, && case_sem_INSN_WRITE_SRLI },
282 1.1 christos { M32RXF_INSN_PAR_ST, && case_sem_INSN_PAR_ST },
283 1.1 christos { M32RXF_INSN_WRITE_ST, && case_sem_INSN_WRITE_ST },
284 1.1 christos { M32RXF_INSN_PAR_STB, && case_sem_INSN_PAR_STB },
285 1.1 christos { M32RXF_INSN_WRITE_STB, && case_sem_INSN_WRITE_STB },
286 1.1 christos { M32RXF_INSN_PAR_STH, && case_sem_INSN_PAR_STH },
287 1.1 christos { M32RXF_INSN_WRITE_STH, && case_sem_INSN_WRITE_STH },
288 1.1 christos { M32RXF_INSN_PAR_ST_PLUS, && case_sem_INSN_PAR_ST_PLUS },
289 1.1 christos { M32RXF_INSN_WRITE_ST_PLUS, && case_sem_INSN_WRITE_ST_PLUS },
290 1.1 christos { M32RXF_INSN_PAR_STH_PLUS, && case_sem_INSN_PAR_STH_PLUS },
291 1.1 christos { M32RXF_INSN_WRITE_STH_PLUS, && case_sem_INSN_WRITE_STH_PLUS },
292 1.1 christos { M32RXF_INSN_PAR_STB_PLUS, && case_sem_INSN_PAR_STB_PLUS },
293 1.1 christos { M32RXF_INSN_WRITE_STB_PLUS, && case_sem_INSN_WRITE_STB_PLUS },
294 1.1 christos { M32RXF_INSN_PAR_ST_MINUS, && case_sem_INSN_PAR_ST_MINUS },
295 1.1 christos { M32RXF_INSN_WRITE_ST_MINUS, && case_sem_INSN_WRITE_ST_MINUS },
296 1.1 christos { M32RXF_INSN_PAR_SUB, && case_sem_INSN_PAR_SUB },
297 1.1 christos { M32RXF_INSN_WRITE_SUB, && case_sem_INSN_WRITE_SUB },
298 1.1 christos { M32RXF_INSN_PAR_SUBV, && case_sem_INSN_PAR_SUBV },
299 1.1 christos { M32RXF_INSN_WRITE_SUBV, && case_sem_INSN_WRITE_SUBV },
300 1.1 christos { M32RXF_INSN_PAR_SUBX, && case_sem_INSN_PAR_SUBX },
301 1.1 christos { M32RXF_INSN_WRITE_SUBX, && case_sem_INSN_WRITE_SUBX },
302 1.1 christos { M32RXF_INSN_PAR_TRAP, && case_sem_INSN_PAR_TRAP },
303 1.1 christos { M32RXF_INSN_WRITE_TRAP, && case_sem_INSN_WRITE_TRAP },
304 1.1 christos { M32RXF_INSN_PAR_UNLOCK, && case_sem_INSN_PAR_UNLOCK },
305 1.1 christos { M32RXF_INSN_WRITE_UNLOCK, && case_sem_INSN_WRITE_UNLOCK },
306 1.1 christos { M32RXF_INSN_PAR_PCMPBZ, && case_sem_INSN_PAR_PCMPBZ },
307 1.1 christos { M32RXF_INSN_WRITE_PCMPBZ, && case_sem_INSN_WRITE_PCMPBZ },
308 1.1 christos { M32RXF_INSN_PAR_SADD, && case_sem_INSN_PAR_SADD },
309 1.1 christos { M32RXF_INSN_WRITE_SADD, && case_sem_INSN_WRITE_SADD },
310 1.1 christos { M32RXF_INSN_PAR_MACWU1, && case_sem_INSN_PAR_MACWU1 },
311 1.1 christos { M32RXF_INSN_WRITE_MACWU1, && case_sem_INSN_WRITE_MACWU1 },
312 1.1 christos { M32RXF_INSN_PAR_MSBLO, && case_sem_INSN_PAR_MSBLO },
313 1.1 christos { M32RXF_INSN_WRITE_MSBLO, && case_sem_INSN_WRITE_MSBLO },
314 1.1 christos { M32RXF_INSN_PAR_MULWU1, && case_sem_INSN_PAR_MULWU1 },
315 1.1 christos { M32RXF_INSN_WRITE_MULWU1, && case_sem_INSN_WRITE_MULWU1 },
316 1.1 christos { M32RXF_INSN_PAR_MACLH1, && case_sem_INSN_PAR_MACLH1 },
317 1.1 christos { M32RXF_INSN_WRITE_MACLH1, && case_sem_INSN_WRITE_MACLH1 },
318 1.1 christos { M32RXF_INSN_PAR_SC, && case_sem_INSN_PAR_SC },
319 1.1 christos { M32RXF_INSN_WRITE_SC, && case_sem_INSN_WRITE_SC },
320 1.1 christos { M32RXF_INSN_PAR_SNC, && case_sem_INSN_PAR_SNC },
321 1.1 christos { M32RXF_INSN_WRITE_SNC, && case_sem_INSN_WRITE_SNC },
322 1.1 christos { M32RXF_INSN_PAR_CLRPSW, && case_sem_INSN_PAR_CLRPSW },
323 1.1 christos { M32RXF_INSN_WRITE_CLRPSW, && case_sem_INSN_WRITE_CLRPSW },
324 1.1 christos { M32RXF_INSN_PAR_SETPSW, && case_sem_INSN_PAR_SETPSW },
325 1.1 christos { M32RXF_INSN_WRITE_SETPSW, && case_sem_INSN_WRITE_SETPSW },
326 1.1 christos { M32RXF_INSN_PAR_BTST, && case_sem_INSN_PAR_BTST },
327 1.1 christos { M32RXF_INSN_WRITE_BTST, && case_sem_INSN_WRITE_BTST },
328 1.1 christos { 0, 0 }
329 1.1 christos };
330 1.1 christos int i;
331 1.1 christos
332 1.1 christos for (i = 0; labels[i].label != 0; ++i)
333 1.1 christos {
334 1.1 christos #if FAST_P
335 1.1 christos CPU_IDESC (current_cpu) [labels[i].index].sem_fast_lab = labels[i].label;
336 1.1 christos #else
337 1.1 christos CPU_IDESC (current_cpu) [labels[i].index].sem_full_lab = labels[i].label;
338 1.1 christos #endif
339 1.1 christos }
340 1.1 christos
341 1.1 christos #undef DEFINE_LABELS
342 1.1 christos #endif /* DEFINE_LABELS */
343 1.1 christos
344 1.1 christos #ifdef DEFINE_SWITCH
345 1.1 christos
346 1.1 christos /* If hyper-fast [well not unnecessarily slow] execution is selected, turn
347 1.1 christos off frills like tracing and profiling. */
348 1.1 christos /* FIXME: A better way would be to have TRACE_RESULT check for something
349 1.1 christos that can cause it to be optimized out. Another way would be to emit
350 1.1 christos special handlers into the instruction "stream". */
351 1.1 christos
352 1.1 christos #if FAST_P
353 1.1 christos #undef TRACE_RESULT
354 1.1 christos #define TRACE_RESULT(cpu, abuf, name, type, val)
355 1.1 christos #endif
356 1.1 christos
357 1.1 christos #undef GET_ATTR
358 1.1 christos #define GET_ATTR(cpu, num, attr) CGEN_ATTR_VALUE (NULL, abuf->idesc->attrs, CGEN_INSN_##attr)
359 1.1 christos
360 1.1 christos {
361 1.1 christos
362 1.1 christos #if WITH_SCACHE_PBB
363 1.1 christos
364 1.1 christos /* Branch to next handler without going around main loop. */
365 1.1 christos #define NEXT(vpc) goto * SEM_ARGBUF (vpc) -> semantic.sem_case
366 1.1 christos SWITCH (sem, SEM_ARGBUF (vpc) -> semantic.sem_case)
367 1.1 christos
368 1.1 christos #else /* ! WITH_SCACHE_PBB */
369 1.1 christos
370 1.1 christos #define NEXT(vpc) BREAK (sem)
371 1.1 christos #ifdef __GNUC__
372 1.1 christos #if FAST_P
373 1.1 christos SWITCH (sem, SEM_ARGBUF (sc) -> idesc->sem_fast_lab)
374 1.1 christos #else
375 1.1 christos SWITCH (sem, SEM_ARGBUF (sc) -> idesc->sem_full_lab)
376 1.1 christos #endif
377 1.1 christos #else
378 1.1 christos SWITCH (sem, SEM_ARGBUF (sc) -> idesc->num)
379 1.1 christos #endif
380 1.1 christos
381 1.1 christos #endif /* ! WITH_SCACHE_PBB */
382 1.1 christos
383 1.1 christos {
384 1.1 christos
385 1.1 christos CASE (sem, INSN_X_INVALID) : /* --invalid-- */
386 1.1 christos {
387 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
388 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
389 1.1 christos #define FLD(f) abuf->fields.sfmt_empty.f
390 1.1 christos int UNUSED written = 0;
391 1.1 christos IADDR UNUSED pc = abuf->addr;
392 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
393 1.1 christos
394 1.1 christos {
395 1.1 christos /* Update the recorded pc in the cpu state struct.
396 1.1 christos Only necessary for WITH_SCACHE case, but to avoid the
397 1.1 christos conditional compilation .... */
398 1.1 christos SET_H_PC (pc);
399 1.1 christos /* Virtual insns have zero size. Overwrite vpc with address of next insn
400 1.1 christos using the default-insn-bitsize spec. When executing insns in parallel
401 1.1 christos we may want to queue the fault and continue execution. */
402 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
403 1.1 christos vpc = sim_engine_invalid_insn (current_cpu, pc, vpc);
404 1.1 christos }
405 1.1 christos
406 1.1 christos #undef FLD
407 1.1 christos }
408 1.1 christos NEXT (vpc);
409 1.1 christos
410 1.1 christos CASE (sem, INSN_X_AFTER) : /* --after-- */
411 1.1 christos {
412 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
413 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
414 1.1 christos #define FLD(f) abuf->fields.sfmt_empty.f
415 1.1 christos int UNUSED written = 0;
416 1.1 christos IADDR UNUSED pc = abuf->addr;
417 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
418 1.1 christos
419 1.1 christos {
420 1.1 christos #if WITH_SCACHE_PBB_M32RXF
421 1.1 christos m32rxf_pbb_after (current_cpu, sem_arg);
422 1.1 christos #endif
423 1.1 christos }
424 1.1 christos
425 1.1 christos #undef FLD
426 1.1 christos }
427 1.1 christos NEXT (vpc);
428 1.1 christos
429 1.1 christos CASE (sem, INSN_X_BEFORE) : /* --before-- */
430 1.1 christos {
431 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
432 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
433 1.1 christos #define FLD(f) abuf->fields.sfmt_empty.f
434 1.1 christos int UNUSED written = 0;
435 1.1 christos IADDR UNUSED pc = abuf->addr;
436 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
437 1.1 christos
438 1.1 christos {
439 1.1 christos #if WITH_SCACHE_PBB_M32RXF
440 1.1 christos m32rxf_pbb_before (current_cpu, sem_arg);
441 1.1 christos #endif
442 1.1 christos }
443 1.1 christos
444 1.1 christos #undef FLD
445 1.1 christos }
446 1.1 christos NEXT (vpc);
447 1.1 christos
448 1.1 christos CASE (sem, INSN_X_CTI_CHAIN) : /* --cti-chain-- */
449 1.1 christos {
450 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
451 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
452 1.1 christos #define FLD(f) abuf->fields.sfmt_empty.f
453 1.1 christos int UNUSED written = 0;
454 1.1 christos IADDR UNUSED pc = abuf->addr;
455 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
456 1.1 christos
457 1.1 christos {
458 1.1 christos #if WITH_SCACHE_PBB_M32RXF
459 1.1 christos #ifdef DEFINE_SWITCH
460 1.1 christos vpc = m32rxf_pbb_cti_chain (current_cpu, sem_arg,
461 1.1 christos pbb_br_type, pbb_br_npc);
462 1.1 christos BREAK (sem);
463 1.1 christos #else
464 1.1 christos /* FIXME: Allow provision of explicit ifmt spec in insn spec. */
465 1.1 christos vpc = m32rxf_pbb_cti_chain (current_cpu, sem_arg,
466 1.1 christos CPU_PBB_BR_TYPE (current_cpu),
467 1.1 christos CPU_PBB_BR_NPC (current_cpu));
468 1.1 christos #endif
469 1.1 christos #endif
470 1.1 christos }
471 1.1 christos
472 1.1 christos #undef FLD
473 1.1 christos }
474 1.1 christos NEXT (vpc);
475 1.1 christos
476 1.1 christos CASE (sem, INSN_X_CHAIN) : /* --chain-- */
477 1.1 christos {
478 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
479 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
480 1.1 christos #define FLD(f) abuf->fields.sfmt_empty.f
481 1.1 christos int UNUSED written = 0;
482 1.1 christos IADDR UNUSED pc = abuf->addr;
483 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
484 1.1 christos
485 1.1 christos {
486 1.1 christos #if WITH_SCACHE_PBB_M32RXF
487 1.1 christos vpc = m32rxf_pbb_chain (current_cpu, sem_arg);
488 1.1 christos #ifdef DEFINE_SWITCH
489 1.1 christos BREAK (sem);
490 1.1 christos #endif
491 1.1 christos #endif
492 1.1 christos }
493 1.1 christos
494 1.1 christos #undef FLD
495 1.1 christos }
496 1.1 christos NEXT (vpc);
497 1.1 christos
498 1.1 christos CASE (sem, INSN_X_BEGIN) : /* --begin-- */
499 1.1 christos {
500 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
501 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
502 1.1 christos #define FLD(f) abuf->fields.sfmt_empty.f
503 1.1 christos int UNUSED written = 0;
504 1.1 christos IADDR UNUSED pc = abuf->addr;
505 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
506 1.1 christos
507 1.1 christos {
508 1.1 christos #if WITH_SCACHE_PBB_M32RXF
509 1.1 christos #if defined DEFINE_SWITCH || defined FAST_P
510 1.1 christos /* In the switch case FAST_P is a constant, allowing several optimizations
511 1.1 christos in any called inline functions. */
512 1.1 christos vpc = m32rxf_pbb_begin (current_cpu, FAST_P);
513 1.1 christos #else
514 1.1 christos #if 0 /* cgen engine can't handle dynamic fast/full switching yet. */
515 1.1 christos vpc = m32rxf_pbb_begin (current_cpu, STATE_RUN_FAST_P (CPU_STATE (current_cpu)));
516 1.1 christos #else
517 1.1 christos vpc = m32rxf_pbb_begin (current_cpu, 0);
518 1.1 christos #endif
519 1.1 christos #endif
520 1.1 christos #endif
521 1.1 christos }
522 1.1 christos
523 1.1 christos #undef FLD
524 1.1 christos }
525 1.1 christos NEXT (vpc);
526 1.1 christos
527 1.1 christos CASE (sem, INSN_ADD) : /* add $dr,$sr */
528 1.1 christos {
529 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
530 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
531 1.1 christos #define FLD(f) abuf->fields.sfmt_add.f
532 1.1 christos int UNUSED written = 0;
533 1.1 christos IADDR UNUSED pc = abuf->addr;
534 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
535 1.1 christos
536 1.1 christos {
537 1.1 christos SI opval = ADDSI (* FLD (i_dr), * FLD (i_sr));
538 1.1 christos * FLD (i_dr) = opval;
539 1.1 christos TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
540 1.1 christos }
541 1.1 christos
542 1.1 christos #undef FLD
543 1.1 christos }
544 1.1 christos NEXT (vpc);
545 1.1 christos
546 1.1 christos CASE (sem, INSN_ADD3) : /* add3 $dr,$sr,$hash$slo16 */
547 1.1 christos {
548 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
549 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
550 1.1 christos #define FLD(f) abuf->fields.sfmt_add3.f
551 1.1 christos int UNUSED written = 0;
552 1.1 christos IADDR UNUSED pc = abuf->addr;
553 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
554 1.1 christos
555 1.1 christos {
556 1.1 christos SI opval = ADDSI (* FLD (i_sr), FLD (f_simm16));
557 1.1 christos * FLD (i_dr) = opval;
558 1.1 christos TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
559 1.1 christos }
560 1.1 christos
561 1.1 christos #undef FLD
562 1.1 christos }
563 1.1 christos NEXT (vpc);
564 1.1 christos
565 1.1 christos CASE (sem, INSN_AND) : /* and $dr,$sr */
566 1.1 christos {
567 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
568 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
569 1.1 christos #define FLD(f) abuf->fields.sfmt_add.f
570 1.1 christos int UNUSED written = 0;
571 1.1 christos IADDR UNUSED pc = abuf->addr;
572 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
573 1.1 christos
574 1.1 christos {
575 1.1 christos SI opval = ANDSI (* FLD (i_dr), * FLD (i_sr));
576 1.1 christos * FLD (i_dr) = opval;
577 1.1 christos TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
578 1.1 christos }
579 1.1 christos
580 1.1 christos #undef FLD
581 1.1 christos }
582 1.1 christos NEXT (vpc);
583 1.1 christos
584 1.1 christos CASE (sem, INSN_AND3) : /* and3 $dr,$sr,$uimm16 */
585 1.1 christos {
586 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
587 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
588 1.1 christos #define FLD(f) abuf->fields.sfmt_and3.f
589 1.1 christos int UNUSED written = 0;
590 1.1 christos IADDR UNUSED pc = abuf->addr;
591 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
592 1.1 christos
593 1.1 christos {
594 1.1 christos SI opval = ANDSI (* FLD (i_sr), FLD (f_uimm16));
595 1.1 christos * FLD (i_dr) = opval;
596 1.1 christos TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
597 1.1 christos }
598 1.1 christos
599 1.1 christos #undef FLD
600 1.1 christos }
601 1.1 christos NEXT (vpc);
602 1.1 christos
603 1.1 christos CASE (sem, INSN_OR) : /* or $dr,$sr */
604 1.1 christos {
605 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
606 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
607 1.1 christos #define FLD(f) abuf->fields.sfmt_add.f
608 1.1 christos int UNUSED written = 0;
609 1.1 christos IADDR UNUSED pc = abuf->addr;
610 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
611 1.1 christos
612 1.1 christos {
613 1.1 christos SI opval = ORSI (* FLD (i_dr), * FLD (i_sr));
614 1.1 christos * FLD (i_dr) = opval;
615 1.1 christos TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
616 1.1 christos }
617 1.1 christos
618 1.1 christos #undef FLD
619 1.1 christos }
620 1.1 christos NEXT (vpc);
621 1.1 christos
622 1.1 christos CASE (sem, INSN_OR3) : /* or3 $dr,$sr,$hash$ulo16 */
623 1.1 christos {
624 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
625 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
626 1.1 christos #define FLD(f) abuf->fields.sfmt_and3.f
627 1.1 christos int UNUSED written = 0;
628 1.1 christos IADDR UNUSED pc = abuf->addr;
629 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
630 1.1 christos
631 1.1 christos {
632 1.1 christos SI opval = ORSI (* FLD (i_sr), FLD (f_uimm16));
633 1.1 christos * FLD (i_dr) = opval;
634 1.1 christos TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
635 1.1 christos }
636 1.1 christos
637 1.1 christos #undef FLD
638 1.1 christos }
639 1.1 christos NEXT (vpc);
640 1.1 christos
641 1.1 christos CASE (sem, INSN_XOR) : /* xor $dr,$sr */
642 1.1 christos {
643 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
644 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
645 1.1 christos #define FLD(f) abuf->fields.sfmt_add.f
646 1.1 christos int UNUSED written = 0;
647 1.1 christos IADDR UNUSED pc = abuf->addr;
648 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
649 1.1 christos
650 1.1 christos {
651 1.1 christos SI opval = XORSI (* FLD (i_dr), * FLD (i_sr));
652 1.1 christos * FLD (i_dr) = opval;
653 1.1 christos TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
654 1.1 christos }
655 1.1 christos
656 1.1 christos #undef FLD
657 1.1 christos }
658 1.1 christos NEXT (vpc);
659 1.1 christos
660 1.1 christos CASE (sem, INSN_XOR3) : /* xor3 $dr,$sr,$uimm16 */
661 1.1 christos {
662 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
663 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
664 1.1 christos #define FLD(f) abuf->fields.sfmt_and3.f
665 1.1 christos int UNUSED written = 0;
666 1.1 christos IADDR UNUSED pc = abuf->addr;
667 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
668 1.1 christos
669 1.1 christos {
670 1.1 christos SI opval = XORSI (* FLD (i_sr), FLD (f_uimm16));
671 1.1 christos * FLD (i_dr) = opval;
672 1.1 christos TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
673 1.1 christos }
674 1.1 christos
675 1.1 christos #undef FLD
676 1.1 christos }
677 1.1 christos NEXT (vpc);
678 1.1 christos
679 1.1 christos CASE (sem, INSN_ADDI) : /* addi $dr,$simm8 */
680 1.1 christos {
681 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
682 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
683 1.1 christos #define FLD(f) abuf->fields.sfmt_addi.f
684 1.1 christos int UNUSED written = 0;
685 1.1 christos IADDR UNUSED pc = abuf->addr;
686 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
687 1.1 christos
688 1.1 christos {
689 1.1 christos SI opval = ADDSI (* FLD (i_dr), FLD (f_simm8));
690 1.1 christos * FLD (i_dr) = opval;
691 1.1 christos TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
692 1.1 christos }
693 1.1 christos
694 1.1 christos #undef FLD
695 1.1 christos }
696 1.1 christos NEXT (vpc);
697 1.1 christos
698 1.1 christos CASE (sem, INSN_ADDV) : /* addv $dr,$sr */
699 1.1 christos {
700 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
701 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
702 1.1 christos #define FLD(f) abuf->fields.sfmt_add.f
703 1.1 christos int UNUSED written = 0;
704 1.1 christos IADDR UNUSED pc = abuf->addr;
705 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
706 1.1 christos
707 1.1 christos {
708 1.1 christos SI temp0;BI temp1;
709 1.1 christos temp0 = ADDSI (* FLD (i_dr), * FLD (i_sr));
710 1.1 christos temp1 = ADDOFSI (* FLD (i_dr), * FLD (i_sr), 0);
711 1.1 christos {
712 1.1 christos SI opval = temp0;
713 1.1 christos * FLD (i_dr) = opval;
714 1.1 christos TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
715 1.1 christos }
716 1.1 christos {
717 1.1 christos BI opval = temp1;
718 1.1 christos CPU (h_cond) = opval;
719 1.1 christos TRACE_RESULT (current_cpu, abuf, "cond", 'x', opval);
720 1.1 christos }
721 1.1 christos }
722 1.1 christos
723 1.1 christos #undef FLD
724 1.1 christos }
725 1.1 christos NEXT (vpc);
726 1.1 christos
727 1.1 christos CASE (sem, INSN_ADDV3) : /* addv3 $dr,$sr,$simm16 */
728 1.1 christos {
729 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
730 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
731 1.1 christos #define FLD(f) abuf->fields.sfmt_add3.f
732 1.1 christos int UNUSED written = 0;
733 1.1 christos IADDR UNUSED pc = abuf->addr;
734 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
735 1.1 christos
736 1.1 christos {
737 1.1 christos SI temp0;BI temp1;
738 1.1 christos temp0 = ADDSI (* FLD (i_sr), FLD (f_simm16));
739 1.1 christos temp1 = ADDOFSI (* FLD (i_sr), FLD (f_simm16), 0);
740 1.1 christos {
741 1.1 christos SI opval = temp0;
742 1.1 christos * FLD (i_dr) = opval;
743 1.1 christos TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
744 1.1 christos }
745 1.1 christos {
746 1.1 christos BI opval = temp1;
747 1.1 christos CPU (h_cond) = opval;
748 1.1 christos TRACE_RESULT (current_cpu, abuf, "cond", 'x', opval);
749 1.1 christos }
750 1.1 christos }
751 1.1 christos
752 1.1 christos #undef FLD
753 1.1 christos }
754 1.1 christos NEXT (vpc);
755 1.1 christos
756 1.1 christos CASE (sem, INSN_ADDX) : /* addx $dr,$sr */
757 1.1 christos {
758 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
759 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
760 1.1 christos #define FLD(f) abuf->fields.sfmt_add.f
761 1.1 christos int UNUSED written = 0;
762 1.1 christos IADDR UNUSED pc = abuf->addr;
763 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
764 1.1 christos
765 1.1 christos {
766 1.1 christos SI temp0;BI temp1;
767 1.1 christos temp0 = ADDCSI (* FLD (i_dr), * FLD (i_sr), CPU (h_cond));
768 1.1 christos temp1 = ADDCFSI (* FLD (i_dr), * FLD (i_sr), CPU (h_cond));
769 1.1 christos {
770 1.1 christos SI opval = temp0;
771 1.1 christos * FLD (i_dr) = opval;
772 1.1 christos TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
773 1.1 christos }
774 1.1 christos {
775 1.1 christos BI opval = temp1;
776 1.1 christos CPU (h_cond) = opval;
777 1.1 christos TRACE_RESULT (current_cpu, abuf, "cond", 'x', opval);
778 1.1 christos }
779 1.1 christos }
780 1.1 christos
781 1.1 christos #undef FLD
782 1.1 christos }
783 1.1 christos NEXT (vpc);
784 1.1 christos
785 1.1 christos CASE (sem, INSN_BC8) : /* bc.s $disp8 */
786 1.1 christos {
787 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
788 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
789 1.1 christos #define FLD(f) abuf->fields.sfmt_bl8.f
790 1.1 christos int UNUSED written = 0;
791 1.1 christos IADDR UNUSED pc = abuf->addr;
792 1.1 christos SEM_BRANCH_INIT
793 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
794 1.1 christos
795 1.1 christos if (CPU (h_cond)) {
796 1.1 christos {
797 1.1 christos USI opval = FLD (i_disp8);
798 1.1 christos SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
799 1.1 christos written |= (1 << 2);
800 1.1 christos TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
801 1.1 christos }
802 1.1 christos }
803 1.1 christos
804 1.1 christos abuf->written = written;
805 1.1 christos SEM_BRANCH_FINI (vpc);
806 1.1 christos #undef FLD
807 1.1 christos }
808 1.1 christos NEXT (vpc);
809 1.1 christos
810 1.1 christos CASE (sem, INSN_BC24) : /* bc.l $disp24 */
811 1.1 christos {
812 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
813 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
814 1.1 christos #define FLD(f) abuf->fields.sfmt_bl24.f
815 1.1 christos int UNUSED written = 0;
816 1.1 christos IADDR UNUSED pc = abuf->addr;
817 1.1 christos SEM_BRANCH_INIT
818 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
819 1.1 christos
820 1.1 christos if (CPU (h_cond)) {
821 1.1 christos {
822 1.1 christos USI opval = FLD (i_disp24);
823 1.1 christos SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
824 1.1 christos written |= (1 << 2);
825 1.1 christos TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
826 1.1 christos }
827 1.1 christos }
828 1.1 christos
829 1.1 christos abuf->written = written;
830 1.1 christos SEM_BRANCH_FINI (vpc);
831 1.1 christos #undef FLD
832 1.1 christos }
833 1.1 christos NEXT (vpc);
834 1.1 christos
835 1.1 christos CASE (sem, INSN_BEQ) : /* beq $src1,$src2,$disp16 */
836 1.1 christos {
837 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
838 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
839 1.1 christos #define FLD(f) abuf->fields.sfmt_beq.f
840 1.1 christos int UNUSED written = 0;
841 1.1 christos IADDR UNUSED pc = abuf->addr;
842 1.1 christos SEM_BRANCH_INIT
843 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
844 1.1 christos
845 1.1 christos if (EQSI (* FLD (i_src1), * FLD (i_src2))) {
846 1.1 christos {
847 1.1 christos USI opval = FLD (i_disp16);
848 1.1 christos SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
849 1.1 christos written |= (1 << 3);
850 1.1 christos TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
851 1.1 christos }
852 1.1 christos }
853 1.1 christos
854 1.1 christos abuf->written = written;
855 1.1 christos SEM_BRANCH_FINI (vpc);
856 1.1 christos #undef FLD
857 1.1 christos }
858 1.1 christos NEXT (vpc);
859 1.1 christos
860 1.1 christos CASE (sem, INSN_BEQZ) : /* beqz $src2,$disp16 */
861 1.1 christos {
862 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
863 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
864 1.1 christos #define FLD(f) abuf->fields.sfmt_beq.f
865 1.1 christos int UNUSED written = 0;
866 1.1 christos IADDR UNUSED pc = abuf->addr;
867 1.1 christos SEM_BRANCH_INIT
868 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
869 1.1 christos
870 1.1 christos if (EQSI (* FLD (i_src2), 0)) {
871 1.1 christos {
872 1.1 christos USI opval = FLD (i_disp16);
873 1.1 christos SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
874 1.1 christos written |= (1 << 2);
875 1.1 christos TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
876 1.1 christos }
877 1.1 christos }
878 1.1 christos
879 1.1 christos abuf->written = written;
880 1.1 christos SEM_BRANCH_FINI (vpc);
881 1.1 christos #undef FLD
882 1.1 christos }
883 1.1 christos NEXT (vpc);
884 1.1 christos
885 1.1 christos CASE (sem, INSN_BGEZ) : /* bgez $src2,$disp16 */
886 1.1 christos {
887 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
888 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
889 1.1 christos #define FLD(f) abuf->fields.sfmt_beq.f
890 1.1 christos int UNUSED written = 0;
891 1.1 christos IADDR UNUSED pc = abuf->addr;
892 1.1 christos SEM_BRANCH_INIT
893 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
894 1.1 christos
895 1.1 christos if (GESI (* FLD (i_src2), 0)) {
896 1.1 christos {
897 1.1 christos USI opval = FLD (i_disp16);
898 1.1 christos SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
899 1.1 christos written |= (1 << 2);
900 1.1 christos TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
901 1.1 christos }
902 1.1 christos }
903 1.1 christos
904 1.1 christos abuf->written = written;
905 1.1 christos SEM_BRANCH_FINI (vpc);
906 1.1 christos #undef FLD
907 1.1 christos }
908 1.1 christos NEXT (vpc);
909 1.1 christos
910 1.1 christos CASE (sem, INSN_BGTZ) : /* bgtz $src2,$disp16 */
911 1.1 christos {
912 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
913 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
914 1.1 christos #define FLD(f) abuf->fields.sfmt_beq.f
915 1.1 christos int UNUSED written = 0;
916 1.1 christos IADDR UNUSED pc = abuf->addr;
917 1.1 christos SEM_BRANCH_INIT
918 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
919 1.1 christos
920 1.1 christos if (GTSI (* FLD (i_src2), 0)) {
921 1.1 christos {
922 1.1 christos USI opval = FLD (i_disp16);
923 1.1 christos SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
924 1.1 christos written |= (1 << 2);
925 1.1 christos TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
926 1.1 christos }
927 1.1 christos }
928 1.1 christos
929 1.1 christos abuf->written = written;
930 1.1 christos SEM_BRANCH_FINI (vpc);
931 1.1 christos #undef FLD
932 1.1 christos }
933 1.1 christos NEXT (vpc);
934 1.1 christos
935 1.1 christos CASE (sem, INSN_BLEZ) : /* blez $src2,$disp16 */
936 1.1 christos {
937 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
938 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
939 1.1 christos #define FLD(f) abuf->fields.sfmt_beq.f
940 1.1 christos int UNUSED written = 0;
941 1.1 christos IADDR UNUSED pc = abuf->addr;
942 1.1 christos SEM_BRANCH_INIT
943 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
944 1.1 christos
945 1.1 christos if (LESI (* FLD (i_src2), 0)) {
946 1.1 christos {
947 1.1 christos USI opval = FLD (i_disp16);
948 1.1 christos SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
949 1.1 christos written |= (1 << 2);
950 1.1 christos TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
951 1.1 christos }
952 1.1 christos }
953 1.1 christos
954 1.1 christos abuf->written = written;
955 1.1 christos SEM_BRANCH_FINI (vpc);
956 1.1 christos #undef FLD
957 1.1 christos }
958 1.1 christos NEXT (vpc);
959 1.1 christos
960 1.1 christos CASE (sem, INSN_BLTZ) : /* bltz $src2,$disp16 */
961 1.1 christos {
962 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
963 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
964 1.1 christos #define FLD(f) abuf->fields.sfmt_beq.f
965 1.1 christos int UNUSED written = 0;
966 1.1 christos IADDR UNUSED pc = abuf->addr;
967 1.1 christos SEM_BRANCH_INIT
968 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
969 1.1 christos
970 1.1 christos if (LTSI (* FLD (i_src2), 0)) {
971 1.1 christos {
972 1.1 christos USI opval = FLD (i_disp16);
973 1.1 christos SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
974 1.1 christos written |= (1 << 2);
975 1.1 christos TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
976 1.1 christos }
977 1.1 christos }
978 1.1 christos
979 1.1 christos abuf->written = written;
980 1.1 christos SEM_BRANCH_FINI (vpc);
981 1.1 christos #undef FLD
982 1.1 christos }
983 1.1 christos NEXT (vpc);
984 1.1 christos
985 1.1 christos CASE (sem, INSN_BNEZ) : /* bnez $src2,$disp16 */
986 1.1 christos {
987 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
988 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
989 1.1 christos #define FLD(f) abuf->fields.sfmt_beq.f
990 1.1 christos int UNUSED written = 0;
991 1.1 christos IADDR UNUSED pc = abuf->addr;
992 1.1 christos SEM_BRANCH_INIT
993 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
994 1.1 christos
995 1.1 christos if (NESI (* FLD (i_src2), 0)) {
996 1.1 christos {
997 1.1 christos USI opval = FLD (i_disp16);
998 1.1 christos SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
999 1.1 christos written |= (1 << 2);
1000 1.1 christos TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
1001 1.1 christos }
1002 1.1 christos }
1003 1.1 christos
1004 1.1 christos abuf->written = written;
1005 1.1 christos SEM_BRANCH_FINI (vpc);
1006 1.1 christos #undef FLD
1007 1.1 christos }
1008 1.1 christos NEXT (vpc);
1009 1.1 christos
1010 1.1 christos CASE (sem, INSN_BL8) : /* bl.s $disp8 */
1011 1.1 christos {
1012 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1013 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1014 1.1 christos #define FLD(f) abuf->fields.sfmt_bl8.f
1015 1.1 christos int UNUSED written = 0;
1016 1.1 christos IADDR UNUSED pc = abuf->addr;
1017 1.1 christos SEM_BRANCH_INIT
1018 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1019 1.1 christos
1020 1.1 christos {
1021 1.1 christos {
1022 1.1 christos SI opval = ADDSI (ANDSI (pc, -4), 4);
1023 1.1 christos CPU (h_gr[((UINT) 14)]) = opval;
1024 1.1 christos TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1025 1.1 christos }
1026 1.1 christos {
1027 1.1 christos USI opval = FLD (i_disp8);
1028 1.1 christos SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
1029 1.1 christos TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
1030 1.1 christos }
1031 1.1 christos }
1032 1.1 christos
1033 1.1 christos SEM_BRANCH_FINI (vpc);
1034 1.1 christos #undef FLD
1035 1.1 christos }
1036 1.1 christos NEXT (vpc);
1037 1.1 christos
1038 1.1 christos CASE (sem, INSN_BL24) : /* bl.l $disp24 */
1039 1.1 christos {
1040 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1041 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1042 1.1 christos #define FLD(f) abuf->fields.sfmt_bl24.f
1043 1.1 christos int UNUSED written = 0;
1044 1.1 christos IADDR UNUSED pc = abuf->addr;
1045 1.1 christos SEM_BRANCH_INIT
1046 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1047 1.1 christos
1048 1.1 christos {
1049 1.1 christos {
1050 1.1 christos SI opval = ADDSI (pc, 4);
1051 1.1 christos CPU (h_gr[((UINT) 14)]) = opval;
1052 1.1 christos TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1053 1.1 christos }
1054 1.1 christos {
1055 1.1 christos USI opval = FLD (i_disp24);
1056 1.1 christos SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
1057 1.1 christos TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
1058 1.1 christos }
1059 1.1 christos }
1060 1.1 christos
1061 1.1 christos SEM_BRANCH_FINI (vpc);
1062 1.1 christos #undef FLD
1063 1.1 christos }
1064 1.1 christos NEXT (vpc);
1065 1.1 christos
1066 1.1 christos CASE (sem, INSN_BCL8) : /* bcl.s $disp8 */
1067 1.1 christos {
1068 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1069 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1070 1.1 christos #define FLD(f) abuf->fields.sfmt_bl8.f
1071 1.1 christos int UNUSED written = 0;
1072 1.1 christos IADDR UNUSED pc = abuf->addr;
1073 1.1 christos SEM_BRANCH_INIT
1074 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1075 1.1 christos
1076 1.1 christos if (CPU (h_cond)) {
1077 1.1 christos {
1078 1.1 christos {
1079 1.1 christos SI opval = ADDSI (ANDSI (pc, -4), 4);
1080 1.1 christos CPU (h_gr[((UINT) 14)]) = opval;
1081 1.1 christos written |= (1 << 3);
1082 1.1 christos TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1083 1.1 christos }
1084 1.1 christos {
1085 1.1 christos USI opval = FLD (i_disp8);
1086 1.1 christos SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
1087 1.1 christos written |= (1 << 4);
1088 1.1 christos TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
1089 1.1 christos }
1090 1.1 christos }
1091 1.1 christos }
1092 1.1 christos
1093 1.1 christos abuf->written = written;
1094 1.1 christos SEM_BRANCH_FINI (vpc);
1095 1.1 christos #undef FLD
1096 1.1 christos }
1097 1.1 christos NEXT (vpc);
1098 1.1 christos
1099 1.1 christos CASE (sem, INSN_BCL24) : /* bcl.l $disp24 */
1100 1.1 christos {
1101 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1102 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1103 1.1 christos #define FLD(f) abuf->fields.sfmt_bl24.f
1104 1.1 christos int UNUSED written = 0;
1105 1.1 christos IADDR UNUSED pc = abuf->addr;
1106 1.1 christos SEM_BRANCH_INIT
1107 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1108 1.1 christos
1109 1.1 christos if (CPU (h_cond)) {
1110 1.1 christos {
1111 1.1 christos {
1112 1.1 christos SI opval = ADDSI (pc, 4);
1113 1.1 christos CPU (h_gr[((UINT) 14)]) = opval;
1114 1.1 christos written |= (1 << 3);
1115 1.1 christos TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1116 1.1 christos }
1117 1.1 christos {
1118 1.1 christos USI opval = FLD (i_disp24);
1119 1.1 christos SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
1120 1.1 christos written |= (1 << 4);
1121 1.1 christos TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
1122 1.1 christos }
1123 1.1 christos }
1124 1.1 christos }
1125 1.1 christos
1126 1.1 christos abuf->written = written;
1127 1.1 christos SEM_BRANCH_FINI (vpc);
1128 1.1 christos #undef FLD
1129 1.1 christos }
1130 1.1 christos NEXT (vpc);
1131 1.1 christos
1132 1.1 christos CASE (sem, INSN_BNC8) : /* bnc.s $disp8 */
1133 1.1 christos {
1134 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1135 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1136 1.1 christos #define FLD(f) abuf->fields.sfmt_bl8.f
1137 1.1 christos int UNUSED written = 0;
1138 1.1 christos IADDR UNUSED pc = abuf->addr;
1139 1.1 christos SEM_BRANCH_INIT
1140 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1141 1.1 christos
1142 1.1 christos if (NOTBI (CPU (h_cond))) {
1143 1.1 christos {
1144 1.1 christos USI opval = FLD (i_disp8);
1145 1.1 christos SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
1146 1.1 christos written |= (1 << 2);
1147 1.1 christos TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
1148 1.1 christos }
1149 1.1 christos }
1150 1.1 christos
1151 1.1 christos abuf->written = written;
1152 1.1 christos SEM_BRANCH_FINI (vpc);
1153 1.1 christos #undef FLD
1154 1.1 christos }
1155 1.1 christos NEXT (vpc);
1156 1.1 christos
1157 1.1 christos CASE (sem, INSN_BNC24) : /* bnc.l $disp24 */
1158 1.1 christos {
1159 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1160 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1161 1.1 christos #define FLD(f) abuf->fields.sfmt_bl24.f
1162 1.1 christos int UNUSED written = 0;
1163 1.1 christos IADDR UNUSED pc = abuf->addr;
1164 1.1 christos SEM_BRANCH_INIT
1165 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1166 1.1 christos
1167 1.1 christos if (NOTBI (CPU (h_cond))) {
1168 1.1 christos {
1169 1.1 christos USI opval = FLD (i_disp24);
1170 1.1 christos SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
1171 1.1 christos written |= (1 << 2);
1172 1.1 christos TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
1173 1.1 christos }
1174 1.1 christos }
1175 1.1 christos
1176 1.1 christos abuf->written = written;
1177 1.1 christos SEM_BRANCH_FINI (vpc);
1178 1.1 christos #undef FLD
1179 1.1 christos }
1180 1.1 christos NEXT (vpc);
1181 1.1 christos
1182 1.1 christos CASE (sem, INSN_BNE) : /* bne $src1,$src2,$disp16 */
1183 1.1 christos {
1184 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1185 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1186 1.1 christos #define FLD(f) abuf->fields.sfmt_beq.f
1187 1.1 christos int UNUSED written = 0;
1188 1.1 christos IADDR UNUSED pc = abuf->addr;
1189 1.1 christos SEM_BRANCH_INIT
1190 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1191 1.1 christos
1192 1.1 christos if (NESI (* FLD (i_src1), * FLD (i_src2))) {
1193 1.1 christos {
1194 1.1 christos USI opval = FLD (i_disp16);
1195 1.1 christos SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
1196 1.1 christos written |= (1 << 3);
1197 1.1 christos TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
1198 1.1 christos }
1199 1.1 christos }
1200 1.1 christos
1201 1.1 christos abuf->written = written;
1202 1.1 christos SEM_BRANCH_FINI (vpc);
1203 1.1 christos #undef FLD
1204 1.1 christos }
1205 1.1 christos NEXT (vpc);
1206 1.1 christos
1207 1.1 christos CASE (sem, INSN_BRA8) : /* bra.s $disp8 */
1208 1.1 christos {
1209 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1210 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1211 1.1 christos #define FLD(f) abuf->fields.sfmt_bl8.f
1212 1.1 christos int UNUSED written = 0;
1213 1.1 christos IADDR UNUSED pc = abuf->addr;
1214 1.1 christos SEM_BRANCH_INIT
1215 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1216 1.1 christos
1217 1.1 christos {
1218 1.1 christos USI opval = FLD (i_disp8);
1219 1.1 christos SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
1220 1.1 christos TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
1221 1.1 christos }
1222 1.1 christos
1223 1.1 christos SEM_BRANCH_FINI (vpc);
1224 1.1 christos #undef FLD
1225 1.1 christos }
1226 1.1 christos NEXT (vpc);
1227 1.1 christos
1228 1.1 christos CASE (sem, INSN_BRA24) : /* bra.l $disp24 */
1229 1.1 christos {
1230 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1231 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1232 1.1 christos #define FLD(f) abuf->fields.sfmt_bl24.f
1233 1.1 christos int UNUSED written = 0;
1234 1.1 christos IADDR UNUSED pc = abuf->addr;
1235 1.1 christos SEM_BRANCH_INIT
1236 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1237 1.1 christos
1238 1.1 christos {
1239 1.1 christos USI opval = FLD (i_disp24);
1240 1.1 christos SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
1241 1.1 christos TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
1242 1.1 christos }
1243 1.1 christos
1244 1.1 christos SEM_BRANCH_FINI (vpc);
1245 1.1 christos #undef FLD
1246 1.1 christos }
1247 1.1 christos NEXT (vpc);
1248 1.1 christos
1249 1.1 christos CASE (sem, INSN_BNCL8) : /* bncl.s $disp8 */
1250 1.1 christos {
1251 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1252 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1253 1.1 christos #define FLD(f) abuf->fields.sfmt_bl8.f
1254 1.1 christos int UNUSED written = 0;
1255 1.1 christos IADDR UNUSED pc = abuf->addr;
1256 1.1 christos SEM_BRANCH_INIT
1257 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1258 1.1 christos
1259 1.1 christos if (NOTBI (CPU (h_cond))) {
1260 1.1 christos {
1261 1.1 christos {
1262 1.1 christos SI opval = ADDSI (ANDSI (pc, -4), 4);
1263 1.1 christos CPU (h_gr[((UINT) 14)]) = opval;
1264 1.1 christos written |= (1 << 3);
1265 1.1 christos TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1266 1.1 christos }
1267 1.1 christos {
1268 1.1 christos USI opval = FLD (i_disp8);
1269 1.1 christos SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
1270 1.1 christos written |= (1 << 4);
1271 1.1 christos TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
1272 1.1 christos }
1273 1.1 christos }
1274 1.1 christos }
1275 1.1 christos
1276 1.1 christos abuf->written = written;
1277 1.1 christos SEM_BRANCH_FINI (vpc);
1278 1.1 christos #undef FLD
1279 1.1 christos }
1280 1.1 christos NEXT (vpc);
1281 1.1 christos
1282 1.1 christos CASE (sem, INSN_BNCL24) : /* bncl.l $disp24 */
1283 1.1 christos {
1284 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1285 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1286 1.1 christos #define FLD(f) abuf->fields.sfmt_bl24.f
1287 1.1 christos int UNUSED written = 0;
1288 1.1 christos IADDR UNUSED pc = abuf->addr;
1289 1.1 christos SEM_BRANCH_INIT
1290 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1291 1.1 christos
1292 1.1 christos if (NOTBI (CPU (h_cond))) {
1293 1.1 christos {
1294 1.1 christos {
1295 1.1 christos SI opval = ADDSI (pc, 4);
1296 1.1 christos CPU (h_gr[((UINT) 14)]) = opval;
1297 1.1 christos written |= (1 << 3);
1298 1.1 christos TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1299 1.1 christos }
1300 1.1 christos {
1301 1.1 christos USI opval = FLD (i_disp24);
1302 1.1 christos SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
1303 1.1 christos written |= (1 << 4);
1304 1.1 christos TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
1305 1.1 christos }
1306 1.1 christos }
1307 1.1 christos }
1308 1.1 christos
1309 1.1 christos abuf->written = written;
1310 1.1 christos SEM_BRANCH_FINI (vpc);
1311 1.1 christos #undef FLD
1312 1.1 christos }
1313 1.1 christos NEXT (vpc);
1314 1.1 christos
1315 1.1 christos CASE (sem, INSN_CMP) : /* cmp $src1,$src2 */
1316 1.1 christos {
1317 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1318 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1319 1.1 christos #define FLD(f) abuf->fields.sfmt_st_plus.f
1320 1.1 christos int UNUSED written = 0;
1321 1.1 christos IADDR UNUSED pc = abuf->addr;
1322 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1323 1.1 christos
1324 1.1 christos {
1325 1.1 christos BI opval = LTSI (* FLD (i_src1), * FLD (i_src2));
1326 1.1 christos CPU (h_cond) = opval;
1327 1.1 christos TRACE_RESULT (current_cpu, abuf, "cond", 'x', opval);
1328 1.1 christos }
1329 1.1 christos
1330 1.1 christos #undef FLD
1331 1.1 christos }
1332 1.1 christos NEXT (vpc);
1333 1.1 christos
1334 1.1 christos CASE (sem, INSN_CMPI) : /* cmpi $src2,$simm16 */
1335 1.1 christos {
1336 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1337 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1338 1.1 christos #define FLD(f) abuf->fields.sfmt_st_d.f
1339 1.1 christos int UNUSED written = 0;
1340 1.1 christos IADDR UNUSED pc = abuf->addr;
1341 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1342 1.1 christos
1343 1.1 christos {
1344 1.1 christos BI opval = LTSI (* FLD (i_src2), FLD (f_simm16));
1345 1.1 christos CPU (h_cond) = opval;
1346 1.1 christos TRACE_RESULT (current_cpu, abuf, "cond", 'x', opval);
1347 1.1 christos }
1348 1.1 christos
1349 1.1 christos #undef FLD
1350 1.1 christos }
1351 1.1 christos NEXT (vpc);
1352 1.1 christos
1353 1.1 christos CASE (sem, INSN_CMPU) : /* cmpu $src1,$src2 */
1354 1.1 christos {
1355 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1356 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1357 1.1 christos #define FLD(f) abuf->fields.sfmt_st_plus.f
1358 1.1 christos int UNUSED written = 0;
1359 1.1 christos IADDR UNUSED pc = abuf->addr;
1360 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1361 1.1 christos
1362 1.1 christos {
1363 1.1 christos BI opval = LTUSI (* FLD (i_src1), * FLD (i_src2));
1364 1.1 christos CPU (h_cond) = opval;
1365 1.1 christos TRACE_RESULT (current_cpu, abuf, "cond", 'x', opval);
1366 1.1 christos }
1367 1.1 christos
1368 1.1 christos #undef FLD
1369 1.1 christos }
1370 1.1 christos NEXT (vpc);
1371 1.1 christos
1372 1.1 christos CASE (sem, INSN_CMPUI) : /* cmpui $src2,$simm16 */
1373 1.1 christos {
1374 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1375 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1376 1.1 christos #define FLD(f) abuf->fields.sfmt_st_d.f
1377 1.1 christos int UNUSED written = 0;
1378 1.1 christos IADDR UNUSED pc = abuf->addr;
1379 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1380 1.1 christos
1381 1.1 christos {
1382 1.1 christos BI opval = LTUSI (* FLD (i_src2), FLD (f_simm16));
1383 1.1 christos CPU (h_cond) = opval;
1384 1.1 christos TRACE_RESULT (current_cpu, abuf, "cond", 'x', opval);
1385 1.1 christos }
1386 1.1 christos
1387 1.1 christos #undef FLD
1388 1.1 christos }
1389 1.1 christos NEXT (vpc);
1390 1.1 christos
1391 1.1 christos CASE (sem, INSN_CMPEQ) : /* cmpeq $src1,$src2 */
1392 1.1 christos {
1393 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1394 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1395 1.1 christos #define FLD(f) abuf->fields.sfmt_st_plus.f
1396 1.1 christos int UNUSED written = 0;
1397 1.1 christos IADDR UNUSED pc = abuf->addr;
1398 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1399 1.1 christos
1400 1.1 christos {
1401 1.1 christos BI opval = EQSI (* FLD (i_src1), * FLD (i_src2));
1402 1.1 christos CPU (h_cond) = opval;
1403 1.1 christos TRACE_RESULT (current_cpu, abuf, "cond", 'x', opval);
1404 1.1 christos }
1405 1.1 christos
1406 1.1 christos #undef FLD
1407 1.1 christos }
1408 1.1 christos NEXT (vpc);
1409 1.1 christos
1410 1.1 christos CASE (sem, INSN_CMPZ) : /* cmpz $src2 */
1411 1.1 christos {
1412 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1413 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1414 1.1 christos #define FLD(f) abuf->fields.sfmt_st_plus.f
1415 1.1 christos int UNUSED written = 0;
1416 1.1 christos IADDR UNUSED pc = abuf->addr;
1417 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1418 1.1 christos
1419 1.1 christos {
1420 1.1 christos BI opval = EQSI (* FLD (i_src2), 0);
1421 1.1 christos CPU (h_cond) = opval;
1422 1.1 christos TRACE_RESULT (current_cpu, abuf, "cond", 'x', opval);
1423 1.1 christos }
1424 1.1 christos
1425 1.1 christos #undef FLD
1426 1.1 christos }
1427 1.1 christos NEXT (vpc);
1428 1.1 christos
1429 1.1 christos CASE (sem, INSN_DIV) : /* div $dr,$sr */
1430 1.1 christos {
1431 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1432 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1433 1.1 christos #define FLD(f) abuf->fields.sfmt_add.f
1434 1.1 christos int UNUSED written = 0;
1435 1.1 christos IADDR UNUSED pc = abuf->addr;
1436 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1437 1.1 christos
1438 1.1 christos if (NESI (* FLD (i_sr), 0)) {
1439 1.1 christos {
1440 1.1 christos SI opval = DIVSI (* FLD (i_dr), * FLD (i_sr));
1441 1.1 christos * FLD (i_dr) = opval;
1442 1.1 christos written |= (1 << 2);
1443 1.1 christos TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1444 1.1 christos }
1445 1.1 christos }
1446 1.1 christos
1447 1.1 christos abuf->written = written;
1448 1.1 christos #undef FLD
1449 1.1 christos }
1450 1.1 christos NEXT (vpc);
1451 1.1 christos
1452 1.1 christos CASE (sem, INSN_DIVU) : /* divu $dr,$sr */
1453 1.1 christos {
1454 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1455 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1456 1.1 christos #define FLD(f) abuf->fields.sfmt_add.f
1457 1.1 christos int UNUSED written = 0;
1458 1.1 christos IADDR UNUSED pc = abuf->addr;
1459 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1460 1.1 christos
1461 1.1 christos if (NESI (* FLD (i_sr), 0)) {
1462 1.1 christos {
1463 1.1 christos SI opval = UDIVSI (* FLD (i_dr), * FLD (i_sr));
1464 1.1 christos * FLD (i_dr) = opval;
1465 1.1 christos written |= (1 << 2);
1466 1.1 christos TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1467 1.1 christos }
1468 1.1 christos }
1469 1.1 christos
1470 1.1 christos abuf->written = written;
1471 1.1 christos #undef FLD
1472 1.1 christos }
1473 1.1 christos NEXT (vpc);
1474 1.1 christos
1475 1.1 christos CASE (sem, INSN_REM) : /* rem $dr,$sr */
1476 1.1 christos {
1477 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1478 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1479 1.1 christos #define FLD(f) abuf->fields.sfmt_add.f
1480 1.1 christos int UNUSED written = 0;
1481 1.1 christos IADDR UNUSED pc = abuf->addr;
1482 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1483 1.1 christos
1484 1.1 christos if (NESI (* FLD (i_sr), 0)) {
1485 1.1 christos {
1486 1.1 christos SI opval = MODSI (* FLD (i_dr), * FLD (i_sr));
1487 1.1 christos * FLD (i_dr) = opval;
1488 1.1 christos written |= (1 << 2);
1489 1.1 christos TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1490 1.1 christos }
1491 1.1 christos }
1492 1.1 christos
1493 1.1 christos abuf->written = written;
1494 1.1 christos #undef FLD
1495 1.1 christos }
1496 1.1 christos NEXT (vpc);
1497 1.1 christos
1498 1.1 christos CASE (sem, INSN_REMU) : /* remu $dr,$sr */
1499 1.1 christos {
1500 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1501 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1502 1.1 christos #define FLD(f) abuf->fields.sfmt_add.f
1503 1.1 christos int UNUSED written = 0;
1504 1.1 christos IADDR UNUSED pc = abuf->addr;
1505 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1506 1.1 christos
1507 1.1 christos if (NESI (* FLD (i_sr), 0)) {
1508 1.1 christos {
1509 1.1 christos SI opval = UMODSI (* FLD (i_dr), * FLD (i_sr));
1510 1.1 christos * FLD (i_dr) = opval;
1511 1.1 christos written |= (1 << 2);
1512 1.1 christos TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1513 1.1 christos }
1514 1.1 christos }
1515 1.1 christos
1516 1.1 christos abuf->written = written;
1517 1.1 christos #undef FLD
1518 1.1 christos }
1519 1.1 christos NEXT (vpc);
1520 1.1 christos
1521 1.1 christos CASE (sem, INSN_DIVH) : /* divh $dr,$sr */
1522 1.1 christos {
1523 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1524 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1525 1.1 christos #define FLD(f) abuf->fields.sfmt_add.f
1526 1.1 christos int UNUSED written = 0;
1527 1.1 christos IADDR UNUSED pc = abuf->addr;
1528 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1529 1.1 christos
1530 1.1 christos if (NESI (* FLD (i_sr), 0)) {
1531 1.1 christos {
1532 1.1 christos SI opval = DIVSI (EXTHISI (TRUNCSIHI (* FLD (i_dr))), * FLD (i_sr));
1533 1.1 christos * FLD (i_dr) = opval;
1534 1.1 christos written |= (1 << 2);
1535 1.1 christos TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1536 1.1 christos }
1537 1.1 christos }
1538 1.1 christos
1539 1.1 christos abuf->written = written;
1540 1.1 christos #undef FLD
1541 1.1 christos }
1542 1.1 christos NEXT (vpc);
1543 1.1 christos
1544 1.1 christos CASE (sem, INSN_JC) : /* jc $sr */
1545 1.1 christos {
1546 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1547 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1548 1.1 christos #define FLD(f) abuf->fields.sfmt_jl.f
1549 1.1 christos int UNUSED written = 0;
1550 1.1 christos IADDR UNUSED pc = abuf->addr;
1551 1.1 christos SEM_BRANCH_INIT
1552 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1553 1.1 christos
1554 1.1 christos if (CPU (h_cond)) {
1555 1.1 christos {
1556 1.1 christos USI opval = ANDSI (* FLD (i_sr), -4);
1557 1.1 christos SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, opval, vpc);
1558 1.1 christos written |= (1 << 2);
1559 1.1 christos TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
1560 1.1 christos }
1561 1.1 christos }
1562 1.1 christos
1563 1.1 christos abuf->written = written;
1564 1.1 christos SEM_BRANCH_FINI (vpc);
1565 1.1 christos #undef FLD
1566 1.1 christos }
1567 1.1 christos NEXT (vpc);
1568 1.1 christos
1569 1.1 christos CASE (sem, INSN_JNC) : /* jnc $sr */
1570 1.1 christos {
1571 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1572 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1573 1.1 christos #define FLD(f) abuf->fields.sfmt_jl.f
1574 1.1 christos int UNUSED written = 0;
1575 1.1 christos IADDR UNUSED pc = abuf->addr;
1576 1.1 christos SEM_BRANCH_INIT
1577 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1578 1.1 christos
1579 1.1 christos if (NOTBI (CPU (h_cond))) {
1580 1.1 christos {
1581 1.1 christos USI opval = ANDSI (* FLD (i_sr), -4);
1582 1.1 christos SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, opval, vpc);
1583 1.1 christos written |= (1 << 2);
1584 1.1 christos TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
1585 1.1 christos }
1586 1.1 christos }
1587 1.1 christos
1588 1.1 christos abuf->written = written;
1589 1.1 christos SEM_BRANCH_FINI (vpc);
1590 1.1 christos #undef FLD
1591 1.1 christos }
1592 1.1 christos NEXT (vpc);
1593 1.1 christos
1594 1.1 christos CASE (sem, INSN_JL) : /* jl $sr */
1595 1.1 christos {
1596 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1597 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1598 1.1 christos #define FLD(f) abuf->fields.sfmt_jl.f
1599 1.1 christos int UNUSED written = 0;
1600 1.1 christos IADDR UNUSED pc = abuf->addr;
1601 1.1 christos SEM_BRANCH_INIT
1602 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1603 1.1 christos
1604 1.1 christos {
1605 1.1 christos SI temp0;USI temp1;
1606 1.1 christos temp0 = ADDSI (ANDSI (pc, -4), 4);
1607 1.1 christos temp1 = ANDSI (* FLD (i_sr), -4);
1608 1.1 christos {
1609 1.1 christos SI opval = temp0;
1610 1.1 christos CPU (h_gr[((UINT) 14)]) = opval;
1611 1.1 christos TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1612 1.1 christos }
1613 1.1 christos {
1614 1.1 christos USI opval = temp1;
1615 1.1 christos SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, opval, vpc);
1616 1.1 christos TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
1617 1.1 christos }
1618 1.1 christos }
1619 1.1 christos
1620 1.1 christos SEM_BRANCH_FINI (vpc);
1621 1.1 christos #undef FLD
1622 1.1 christos }
1623 1.1 christos NEXT (vpc);
1624 1.1 christos
1625 1.1 christos CASE (sem, INSN_JMP) : /* jmp $sr */
1626 1.1 christos {
1627 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1628 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1629 1.1 christos #define FLD(f) abuf->fields.sfmt_jl.f
1630 1.1 christos int UNUSED written = 0;
1631 1.1 christos IADDR UNUSED pc = abuf->addr;
1632 1.1 christos SEM_BRANCH_INIT
1633 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1634 1.1 christos
1635 1.1 christos {
1636 1.1 christos USI opval = ANDSI (* FLD (i_sr), -4);
1637 1.1 christos SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, opval, vpc);
1638 1.1 christos TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
1639 1.1 christos }
1640 1.1 christos
1641 1.1 christos SEM_BRANCH_FINI (vpc);
1642 1.1 christos #undef FLD
1643 1.1 christos }
1644 1.1 christos NEXT (vpc);
1645 1.1 christos
1646 1.1 christos CASE (sem, INSN_LD) : /* ld $dr,@$sr */
1647 1.1 christos {
1648 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1649 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1650 1.1 christos #define FLD(f) abuf->fields.sfmt_ld_plus.f
1651 1.1 christos int UNUSED written = 0;
1652 1.1 christos IADDR UNUSED pc = abuf->addr;
1653 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1654 1.1 christos
1655 1.1 christos {
1656 1.1 christos SI opval = GETMEMSI (current_cpu, pc, * FLD (i_sr));
1657 1.1 christos * FLD (i_dr) = opval;
1658 1.1 christos TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1659 1.1 christos }
1660 1.1 christos
1661 1.1 christos #undef FLD
1662 1.1 christos }
1663 1.1 christos NEXT (vpc);
1664 1.1 christos
1665 1.1 christos CASE (sem, INSN_LD_D) : /* ld $dr,@($slo16,$sr) */
1666 1.1 christos {
1667 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1668 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1669 1.1 christos #define FLD(f) abuf->fields.sfmt_add3.f
1670 1.1 christos int UNUSED written = 0;
1671 1.1 christos IADDR UNUSED pc = abuf->addr;
1672 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1673 1.1 christos
1674 1.1 christos {
1675 1.1 christos SI opval = GETMEMSI (current_cpu, pc, ADDSI (* FLD (i_sr), FLD (f_simm16)));
1676 1.1 christos * FLD (i_dr) = opval;
1677 1.1 christos TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1678 1.1 christos }
1679 1.1 christos
1680 1.1 christos #undef FLD
1681 1.1 christos }
1682 1.1 christos NEXT (vpc);
1683 1.1 christos
1684 1.1 christos CASE (sem, INSN_LDB) : /* ldb $dr,@$sr */
1685 1.1 christos {
1686 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1687 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1688 1.1 christos #define FLD(f) abuf->fields.sfmt_ld_plus.f
1689 1.1 christos int UNUSED written = 0;
1690 1.1 christos IADDR UNUSED pc = abuf->addr;
1691 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1692 1.1 christos
1693 1.1 christos {
1694 1.1 christos SI opval = EXTQISI (GETMEMQI (current_cpu, pc, * FLD (i_sr)));
1695 1.1 christos * FLD (i_dr) = opval;
1696 1.1 christos TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1697 1.1 christos }
1698 1.1 christos
1699 1.1 christos #undef FLD
1700 1.1 christos }
1701 1.1 christos NEXT (vpc);
1702 1.1 christos
1703 1.1 christos CASE (sem, INSN_LDB_D) : /* ldb $dr,@($slo16,$sr) */
1704 1.1 christos {
1705 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1706 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1707 1.1 christos #define FLD(f) abuf->fields.sfmt_add3.f
1708 1.1 christos int UNUSED written = 0;
1709 1.1 christos IADDR UNUSED pc = abuf->addr;
1710 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1711 1.1 christos
1712 1.1 christos {
1713 1.1 christos SI opval = EXTQISI (GETMEMQI (current_cpu, pc, ADDSI (* FLD (i_sr), FLD (f_simm16))));
1714 1.1 christos * FLD (i_dr) = opval;
1715 1.1 christos TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1716 1.1 christos }
1717 1.1 christos
1718 1.1 christos #undef FLD
1719 1.1 christos }
1720 1.1 christos NEXT (vpc);
1721 1.1 christos
1722 1.1 christos CASE (sem, INSN_LDH) : /* ldh $dr,@$sr */
1723 1.1 christos {
1724 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1725 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1726 1.1 christos #define FLD(f) abuf->fields.sfmt_ld_plus.f
1727 1.1 christos int UNUSED written = 0;
1728 1.1 christos IADDR UNUSED pc = abuf->addr;
1729 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1730 1.1 christos
1731 1.1 christos {
1732 1.1 christos SI opval = EXTHISI (GETMEMHI (current_cpu, pc, * FLD (i_sr)));
1733 1.1 christos * FLD (i_dr) = opval;
1734 1.1 christos TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1735 1.1 christos }
1736 1.1 christos
1737 1.1 christos #undef FLD
1738 1.1 christos }
1739 1.1 christos NEXT (vpc);
1740 1.1 christos
1741 1.1 christos CASE (sem, INSN_LDH_D) : /* ldh $dr,@($slo16,$sr) */
1742 1.1 christos {
1743 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1744 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1745 1.1 christos #define FLD(f) abuf->fields.sfmt_add3.f
1746 1.1 christos int UNUSED written = 0;
1747 1.1 christos IADDR UNUSED pc = abuf->addr;
1748 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1749 1.1 christos
1750 1.1 christos {
1751 1.1 christos SI opval = EXTHISI (GETMEMHI (current_cpu, pc, ADDSI (* FLD (i_sr), FLD (f_simm16))));
1752 1.1 christos * FLD (i_dr) = opval;
1753 1.1 christos TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1754 1.1 christos }
1755 1.1 christos
1756 1.1 christos #undef FLD
1757 1.1 christos }
1758 1.1 christos NEXT (vpc);
1759 1.1 christos
1760 1.1 christos CASE (sem, INSN_LDUB) : /* ldub $dr,@$sr */
1761 1.1 christos {
1762 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1763 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1764 1.1 christos #define FLD(f) abuf->fields.sfmt_ld_plus.f
1765 1.1 christos int UNUSED written = 0;
1766 1.1 christos IADDR UNUSED pc = abuf->addr;
1767 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1768 1.1 christos
1769 1.1 christos {
1770 1.1 christos SI opval = ZEXTQISI (GETMEMQI (current_cpu, pc, * FLD (i_sr)));
1771 1.1 christos * FLD (i_dr) = opval;
1772 1.1 christos TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1773 1.1 christos }
1774 1.1 christos
1775 1.1 christos #undef FLD
1776 1.1 christos }
1777 1.1 christos NEXT (vpc);
1778 1.1 christos
1779 1.1 christos CASE (sem, INSN_LDUB_D) : /* ldub $dr,@($slo16,$sr) */
1780 1.1 christos {
1781 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1782 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1783 1.1 christos #define FLD(f) abuf->fields.sfmt_add3.f
1784 1.1 christos int UNUSED written = 0;
1785 1.1 christos IADDR UNUSED pc = abuf->addr;
1786 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1787 1.1 christos
1788 1.1 christos {
1789 1.1 christos SI opval = ZEXTQISI (GETMEMQI (current_cpu, pc, ADDSI (* FLD (i_sr), FLD (f_simm16))));
1790 1.1 christos * FLD (i_dr) = opval;
1791 1.1 christos TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1792 1.1 christos }
1793 1.1 christos
1794 1.1 christos #undef FLD
1795 1.1 christos }
1796 1.1 christos NEXT (vpc);
1797 1.1 christos
1798 1.1 christos CASE (sem, INSN_LDUH) : /* lduh $dr,@$sr */
1799 1.1 christos {
1800 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1801 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1802 1.1 christos #define FLD(f) abuf->fields.sfmt_ld_plus.f
1803 1.1 christos int UNUSED written = 0;
1804 1.1 christos IADDR UNUSED pc = abuf->addr;
1805 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1806 1.1 christos
1807 1.1 christos {
1808 1.1 christos SI opval = ZEXTHISI (GETMEMHI (current_cpu, pc, * FLD (i_sr)));
1809 1.1 christos * FLD (i_dr) = opval;
1810 1.1 christos TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1811 1.1 christos }
1812 1.1 christos
1813 1.1 christos #undef FLD
1814 1.1 christos }
1815 1.1 christos NEXT (vpc);
1816 1.1 christos
1817 1.1 christos CASE (sem, INSN_LDUH_D) : /* lduh $dr,@($slo16,$sr) */
1818 1.1 christos {
1819 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1820 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1821 1.1 christos #define FLD(f) abuf->fields.sfmt_add3.f
1822 1.1 christos int UNUSED written = 0;
1823 1.1 christos IADDR UNUSED pc = abuf->addr;
1824 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1825 1.1 christos
1826 1.1 christos {
1827 1.1 christos SI opval = ZEXTHISI (GETMEMHI (current_cpu, pc, ADDSI (* FLD (i_sr), FLD (f_simm16))));
1828 1.1 christos * FLD (i_dr) = opval;
1829 1.1 christos TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1830 1.1 christos }
1831 1.1 christos
1832 1.1 christos #undef FLD
1833 1.1 christos }
1834 1.1 christos NEXT (vpc);
1835 1.1 christos
1836 1.1 christos CASE (sem, INSN_LD_PLUS) : /* ld $dr,@$sr+ */
1837 1.1 christos {
1838 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1839 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1840 1.1 christos #define FLD(f) abuf->fields.sfmt_ld_plus.f
1841 1.1 christos int UNUSED written = 0;
1842 1.1 christos IADDR UNUSED pc = abuf->addr;
1843 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1844 1.1 christos
1845 1.1 christos {
1846 1.1 christos SI temp0;SI temp1;
1847 1.1 christos temp0 = GETMEMSI (current_cpu, pc, * FLD (i_sr));
1848 1.1 christos temp1 = ADDSI (* FLD (i_sr), 4);
1849 1.1 christos {
1850 1.1 christos SI opval = temp0;
1851 1.1 christos * FLD (i_dr) = opval;
1852 1.1 christos TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1853 1.1 christos }
1854 1.1 christos {
1855 1.1 christos SI opval = temp1;
1856 1.1 christos * FLD (i_sr) = opval;
1857 1.1 christos TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1858 1.1 christos }
1859 1.1 christos }
1860 1.1 christos
1861 1.1 christos #undef FLD
1862 1.1 christos }
1863 1.1 christos NEXT (vpc);
1864 1.1 christos
1865 1.1 christos CASE (sem, INSN_LD24) : /* ld24 $dr,$uimm24 */
1866 1.1 christos {
1867 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1868 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1869 1.1 christos #define FLD(f) abuf->fields.sfmt_ld24.f
1870 1.1 christos int UNUSED written = 0;
1871 1.1 christos IADDR UNUSED pc = abuf->addr;
1872 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1873 1.1 christos
1874 1.1 christos {
1875 1.1 christos SI opval = FLD (i_uimm24);
1876 1.1 christos * FLD (i_dr) = opval;
1877 1.1 christos TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1878 1.1 christos }
1879 1.1 christos
1880 1.1 christos #undef FLD
1881 1.1 christos }
1882 1.1 christos NEXT (vpc);
1883 1.1 christos
1884 1.1 christos CASE (sem, INSN_LDI8) : /* ldi8 $dr,$simm8 */
1885 1.1 christos {
1886 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1887 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1888 1.1 christos #define FLD(f) abuf->fields.sfmt_addi.f
1889 1.1 christos int UNUSED written = 0;
1890 1.1 christos IADDR UNUSED pc = abuf->addr;
1891 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1892 1.1 christos
1893 1.1 christos {
1894 1.1 christos SI opval = FLD (f_simm8);
1895 1.1 christos * FLD (i_dr) = opval;
1896 1.1 christos TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1897 1.1 christos }
1898 1.1 christos
1899 1.1 christos #undef FLD
1900 1.1 christos }
1901 1.1 christos NEXT (vpc);
1902 1.1 christos
1903 1.1 christos CASE (sem, INSN_LDI16) : /* ldi16 $dr,$hash$slo16 */
1904 1.1 christos {
1905 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1906 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1907 1.1 christos #define FLD(f) abuf->fields.sfmt_add3.f
1908 1.1 christos int UNUSED written = 0;
1909 1.1 christos IADDR UNUSED pc = abuf->addr;
1910 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1911 1.1 christos
1912 1.1 christos {
1913 1.1 christos SI opval = FLD (f_simm16);
1914 1.1 christos * FLD (i_dr) = opval;
1915 1.1 christos TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1916 1.1 christos }
1917 1.1 christos
1918 1.1 christos #undef FLD
1919 1.1 christos }
1920 1.1 christos NEXT (vpc);
1921 1.1 christos
1922 1.1 christos CASE (sem, INSN_LOCK) : /* lock $dr,@$sr */
1923 1.1 christos {
1924 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1925 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1926 1.1 christos #define FLD(f) abuf->fields.sfmt_ld_plus.f
1927 1.1 christos int UNUSED written = 0;
1928 1.1 christos IADDR UNUSED pc = abuf->addr;
1929 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1930 1.1 christos
1931 1.1 christos {
1932 1.1 christos {
1933 1.1 christos BI opval = 1;
1934 1.1 christos CPU (h_lock) = opval;
1935 1.1 christos TRACE_RESULT (current_cpu, abuf, "lock", 'x', opval);
1936 1.1 christos }
1937 1.1 christos {
1938 1.1 christos SI opval = GETMEMSI (current_cpu, pc, * FLD (i_sr));
1939 1.1 christos * FLD (i_dr) = opval;
1940 1.1 christos TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1941 1.1 christos }
1942 1.1 christos }
1943 1.1 christos
1944 1.1 christos #undef FLD
1945 1.1 christos }
1946 1.1 christos NEXT (vpc);
1947 1.1 christos
1948 1.1 christos CASE (sem, INSN_MACHI_A) : /* machi $src1,$src2,$acc */
1949 1.1 christos {
1950 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1951 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1952 1.1 christos #define FLD(f) abuf->fields.sfmt_machi_a.f
1953 1.1 christos int UNUSED written = 0;
1954 1.1 christos IADDR UNUSED pc = abuf->addr;
1955 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1956 1.1 christos
1957 1.1 christos {
1958 1.1 christos DI opval = SRADI (SLLDI (ADDDI (GET_H_ACCUMS (FLD (f_acc)), MULDI (EXTSIDI (ANDSI (* FLD (i_src1), 0xffff0000)), EXTHIDI (TRUNCSIHI (SRASI (* FLD (i_src2), 16))))), 8), 8);
1959 1.1 christos SET_H_ACCUMS (FLD (f_acc), opval);
1960 1.1 christos TRACE_RESULT (current_cpu, abuf, "accums", 'D', opval);
1961 1.1 christos }
1962 1.1 christos
1963 1.1 christos #undef FLD
1964 1.1 christos }
1965 1.1 christos NEXT (vpc);
1966 1.1 christos
1967 1.1 christos CASE (sem, INSN_MACLO_A) : /* maclo $src1,$src2,$acc */
1968 1.1 christos {
1969 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1970 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1971 1.1 christos #define FLD(f) abuf->fields.sfmt_machi_a.f
1972 1.1 christos int UNUSED written = 0;
1973 1.1 christos IADDR UNUSED pc = abuf->addr;
1974 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1975 1.1 christos
1976 1.1 christos {
1977 1.1 christos DI opval = SRADI (SLLDI (ADDDI (GET_H_ACCUMS (FLD (f_acc)), MULDI (EXTSIDI (SLLSI (* FLD (i_src1), 16)), EXTHIDI (TRUNCSIHI (* FLD (i_src2))))), 8), 8);
1978 1.1 christos SET_H_ACCUMS (FLD (f_acc), opval);
1979 1.1 christos TRACE_RESULT (current_cpu, abuf, "accums", 'D', opval);
1980 1.1 christos }
1981 1.1 christos
1982 1.1 christos #undef FLD
1983 1.1 christos }
1984 1.1 christos NEXT (vpc);
1985 1.1 christos
1986 1.1 christos CASE (sem, INSN_MACWHI_A) : /* macwhi $src1,$src2,$acc */
1987 1.1 christos {
1988 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1989 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1990 1.1 christos #define FLD(f) abuf->fields.sfmt_machi_a.f
1991 1.1 christos int UNUSED written = 0;
1992 1.1 christos IADDR UNUSED pc = abuf->addr;
1993 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1994 1.1 christos
1995 1.1 christos {
1996 1.1 christos DI opval = ADDDI (GET_H_ACCUMS (FLD (f_acc)), MULDI (EXTSIDI (* FLD (i_src1)), EXTHIDI (TRUNCSIHI (SRASI (* FLD (i_src2), 16)))));
1997 1.1 christos SET_H_ACCUMS (FLD (f_acc), opval);
1998 1.1 christos TRACE_RESULT (current_cpu, abuf, "accums", 'D', opval);
1999 1.1 christos }
2000 1.1 christos
2001 1.1 christos #undef FLD
2002 1.1 christos }
2003 1.1 christos NEXT (vpc);
2004 1.1 christos
2005 1.1 christos CASE (sem, INSN_MACWLO_A) : /* macwlo $src1,$src2,$acc */
2006 1.1 christos {
2007 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2008 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2009 1.1 christos #define FLD(f) abuf->fields.sfmt_machi_a.f
2010 1.1 christos int UNUSED written = 0;
2011 1.1 christos IADDR UNUSED pc = abuf->addr;
2012 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2013 1.1 christos
2014 1.1 christos {
2015 1.1 christos DI opval = ADDDI (GET_H_ACCUMS (FLD (f_acc)), MULDI (EXTSIDI (* FLD (i_src1)), EXTHIDI (TRUNCSIHI (* FLD (i_src2)))));
2016 1.1 christos SET_H_ACCUMS (FLD (f_acc), opval);
2017 1.1 christos TRACE_RESULT (current_cpu, abuf, "accums", 'D', opval);
2018 1.1 christos }
2019 1.1 christos
2020 1.1 christos #undef FLD
2021 1.1 christos }
2022 1.1 christos NEXT (vpc);
2023 1.1 christos
2024 1.1 christos CASE (sem, INSN_MUL) : /* mul $dr,$sr */
2025 1.1 christos {
2026 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2027 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2028 1.1 christos #define FLD(f) abuf->fields.sfmt_add.f
2029 1.1 christos int UNUSED written = 0;
2030 1.1 christos IADDR UNUSED pc = abuf->addr;
2031 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2032 1.1 christos
2033 1.1 christos {
2034 1.1 christos SI opval = MULSI (* FLD (i_dr), * FLD (i_sr));
2035 1.1 christos * FLD (i_dr) = opval;
2036 1.1 christos TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
2037 1.1 christos }
2038 1.1 christos
2039 1.1 christos #undef FLD
2040 1.1 christos }
2041 1.1 christos NEXT (vpc);
2042 1.1 christos
2043 1.1 christos CASE (sem, INSN_MULHI_A) : /* mulhi $src1,$src2,$acc */
2044 1.1 christos {
2045 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2046 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2047 1.1 christos #define FLD(f) abuf->fields.sfmt_machi_a.f
2048 1.1 christos int UNUSED written = 0;
2049 1.1 christos IADDR UNUSED pc = abuf->addr;
2050 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2051 1.1 christos
2052 1.1 christos {
2053 1.1 christos DI opval = SRADI (SLLDI (MULDI (EXTSIDI (ANDSI (* FLD (i_src1), 0xffff0000)), EXTHIDI (TRUNCSIHI (SRASI (* FLD (i_src2), 16)))), 16), 16);
2054 1.1 christos SET_H_ACCUMS (FLD (f_acc), opval);
2055 1.1 christos TRACE_RESULT (current_cpu, abuf, "accums", 'D', opval);
2056 1.1 christos }
2057 1.1 christos
2058 1.1 christos #undef FLD
2059 1.1 christos }
2060 1.1 christos NEXT (vpc);
2061 1.1 christos
2062 1.1 christos CASE (sem, INSN_MULLO_A) : /* mullo $src1,$src2,$acc */
2063 1.1 christos {
2064 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2065 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2066 1.1 christos #define FLD(f) abuf->fields.sfmt_machi_a.f
2067 1.1 christos int UNUSED written = 0;
2068 1.1 christos IADDR UNUSED pc = abuf->addr;
2069 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2070 1.1 christos
2071 1.1 christos {
2072 1.1 christos DI opval = SRADI (SLLDI (MULDI (EXTSIDI (SLLSI (* FLD (i_src1), 16)), EXTHIDI (TRUNCSIHI (* FLD (i_src2)))), 16), 16);
2073 1.1 christos SET_H_ACCUMS (FLD (f_acc), opval);
2074 1.1 christos TRACE_RESULT (current_cpu, abuf, "accums", 'D', opval);
2075 1.1 christos }
2076 1.1 christos
2077 1.1 christos #undef FLD
2078 1.1 christos }
2079 1.1 christos NEXT (vpc);
2080 1.1 christos
2081 1.1 christos CASE (sem, INSN_MULWHI_A) : /* mulwhi $src1,$src2,$acc */
2082 1.1 christos {
2083 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2084 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2085 1.1 christos #define FLD(f) abuf->fields.sfmt_machi_a.f
2086 1.1 christos int UNUSED written = 0;
2087 1.1 christos IADDR UNUSED pc = abuf->addr;
2088 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2089 1.1 christos
2090 1.1 christos {
2091 1.1 christos DI opval = MULDI (EXTSIDI (* FLD (i_src1)), EXTHIDI (TRUNCSIHI (SRASI (* FLD (i_src2), 16))));
2092 1.1 christos SET_H_ACCUMS (FLD (f_acc), opval);
2093 1.1 christos TRACE_RESULT (current_cpu, abuf, "accums", 'D', opval);
2094 1.1 christos }
2095 1.1 christos
2096 1.1 christos #undef FLD
2097 1.1 christos }
2098 1.1 christos NEXT (vpc);
2099 1.1 christos
2100 1.1 christos CASE (sem, INSN_MULWLO_A) : /* mulwlo $src1,$src2,$acc */
2101 1.1 christos {
2102 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2103 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2104 1.1 christos #define FLD(f) abuf->fields.sfmt_machi_a.f
2105 1.1 christos int UNUSED written = 0;
2106 1.1 christos IADDR UNUSED pc = abuf->addr;
2107 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2108 1.1 christos
2109 1.1 christos {
2110 1.1 christos DI opval = MULDI (EXTSIDI (* FLD (i_src1)), EXTHIDI (TRUNCSIHI (* FLD (i_src2))));
2111 1.1 christos SET_H_ACCUMS (FLD (f_acc), opval);
2112 1.1 christos TRACE_RESULT (current_cpu, abuf, "accums", 'D', opval);
2113 1.1 christos }
2114 1.1 christos
2115 1.1 christos #undef FLD
2116 1.1 christos }
2117 1.1 christos NEXT (vpc);
2118 1.1 christos
2119 1.1 christos CASE (sem, INSN_MV) : /* mv $dr,$sr */
2120 1.1 christos {
2121 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2122 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2123 1.1 christos #define FLD(f) abuf->fields.sfmt_ld_plus.f
2124 1.1 christos int UNUSED written = 0;
2125 1.1 christos IADDR UNUSED pc = abuf->addr;
2126 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2127 1.1 christos
2128 1.1 christos {
2129 1.1 christos SI opval = * FLD (i_sr);
2130 1.1 christos * FLD (i_dr) = opval;
2131 1.1 christos TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
2132 1.1 christos }
2133 1.1 christos
2134 1.1 christos #undef FLD
2135 1.1 christos }
2136 1.1 christos NEXT (vpc);
2137 1.1 christos
2138 1.1 christos CASE (sem, INSN_MVFACHI_A) : /* mvfachi $dr,$accs */
2139 1.1 christos {
2140 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2141 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2142 1.1 christos #define FLD(f) abuf->fields.sfmt_mvfachi_a.f
2143 1.1 christos int UNUSED written = 0;
2144 1.1 christos IADDR UNUSED pc = abuf->addr;
2145 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2146 1.1 christos
2147 1.1 christos {
2148 1.1 christos SI opval = TRUNCDISI (SRADI (GET_H_ACCUMS (FLD (f_accs)), 32));
2149 1.1 christos * FLD (i_dr) = opval;
2150 1.1 christos TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
2151 1.1 christos }
2152 1.1 christos
2153 1.1 christos #undef FLD
2154 1.1 christos }
2155 1.1 christos NEXT (vpc);
2156 1.1 christos
2157 1.1 christos CASE (sem, INSN_MVFACLO_A) : /* mvfaclo $dr,$accs */
2158 1.1 christos {
2159 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2160 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2161 1.1 christos #define FLD(f) abuf->fields.sfmt_mvfachi_a.f
2162 1.1 christos int UNUSED written = 0;
2163 1.1 christos IADDR UNUSED pc = abuf->addr;
2164 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2165 1.1 christos
2166 1.1 christos {
2167 1.1 christos SI opval = TRUNCDISI (GET_H_ACCUMS (FLD (f_accs)));
2168 1.1 christos * FLD (i_dr) = opval;
2169 1.1 christos TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
2170 1.1 christos }
2171 1.1 christos
2172 1.1 christos #undef FLD
2173 1.1 christos }
2174 1.1 christos NEXT (vpc);
2175 1.1 christos
2176 1.1 christos CASE (sem, INSN_MVFACMI_A) : /* mvfacmi $dr,$accs */
2177 1.1 christos {
2178 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2179 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2180 1.1 christos #define FLD(f) abuf->fields.sfmt_mvfachi_a.f
2181 1.1 christos int UNUSED written = 0;
2182 1.1 christos IADDR UNUSED pc = abuf->addr;
2183 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2184 1.1 christos
2185 1.1 christos {
2186 1.1 christos SI opval = TRUNCDISI (SRADI (GET_H_ACCUMS (FLD (f_accs)), 16));
2187 1.1 christos * FLD (i_dr) = opval;
2188 1.1 christos TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
2189 1.1 christos }
2190 1.1 christos
2191 1.1 christos #undef FLD
2192 1.1 christos }
2193 1.1 christos NEXT (vpc);
2194 1.1 christos
2195 1.1 christos CASE (sem, INSN_MVFC) : /* mvfc $dr,$scr */
2196 1.1 christos {
2197 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2198 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2199 1.1 christos #define FLD(f) abuf->fields.sfmt_ld_plus.f
2200 1.1 christos int UNUSED written = 0;
2201 1.1 christos IADDR UNUSED pc = abuf->addr;
2202 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2203 1.1 christos
2204 1.1 christos {
2205 1.1 christos SI opval = GET_H_CR (FLD (f_r2));
2206 1.1 christos * FLD (i_dr) = opval;
2207 1.1 christos TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
2208 1.1 christos }
2209 1.1 christos
2210 1.1 christos #undef FLD
2211 1.1 christos }
2212 1.1 christos NEXT (vpc);
2213 1.1 christos
2214 1.1 christos CASE (sem, INSN_MVTACHI_A) : /* mvtachi $src1,$accs */
2215 1.1 christos {
2216 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2217 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2218 1.1 christos #define FLD(f) abuf->fields.sfmt_mvtachi_a.f
2219 1.1 christos int UNUSED written = 0;
2220 1.1 christos IADDR UNUSED pc = abuf->addr;
2221 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2222 1.1 christos
2223 1.1 christos {
2224 1.1 christos DI opval = ORDI (ANDDI (GET_H_ACCUMS (FLD (f_accs)), MAKEDI (0, 0xffffffff)), SLLDI (EXTSIDI (* FLD (i_src1)), 32));
2225 1.1 christos SET_H_ACCUMS (FLD (f_accs), opval);
2226 1.1 christos TRACE_RESULT (current_cpu, abuf, "accums", 'D', opval);
2227 1.1 christos }
2228 1.1 christos
2229 1.1 christos #undef FLD
2230 1.1 christos }
2231 1.1 christos NEXT (vpc);
2232 1.1 christos
2233 1.1 christos CASE (sem, INSN_MVTACLO_A) : /* mvtaclo $src1,$accs */
2234 1.1 christos {
2235 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2236 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2237 1.1 christos #define FLD(f) abuf->fields.sfmt_mvtachi_a.f
2238 1.1 christos int UNUSED written = 0;
2239 1.1 christos IADDR UNUSED pc = abuf->addr;
2240 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2241 1.1 christos
2242 1.1 christos {
2243 1.1 christos DI opval = ORDI (ANDDI (GET_H_ACCUMS (FLD (f_accs)), MAKEDI (0xffffffff, 0)), ZEXTSIDI (* FLD (i_src1)));
2244 1.1 christos SET_H_ACCUMS (FLD (f_accs), opval);
2245 1.1 christos TRACE_RESULT (current_cpu, abuf, "accums", 'D', opval);
2246 1.1 christos }
2247 1.1 christos
2248 1.1 christos #undef FLD
2249 1.1 christos }
2250 1.1 christos NEXT (vpc);
2251 1.1 christos
2252 1.1 christos CASE (sem, INSN_MVTC) : /* mvtc $sr,$dcr */
2253 1.1 christos {
2254 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2255 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2256 1.1 christos #define FLD(f) abuf->fields.sfmt_ld_plus.f
2257 1.1 christos int UNUSED written = 0;
2258 1.1 christos IADDR UNUSED pc = abuf->addr;
2259 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2260 1.1 christos
2261 1.1 christos {
2262 1.1 christos USI opval = * FLD (i_sr);
2263 1.1 christos SET_H_CR (FLD (f_r1), opval);
2264 1.1 christos TRACE_RESULT (current_cpu, abuf, "cr", 'x', opval);
2265 1.1 christos }
2266 1.1 christos
2267 1.1 christos #undef FLD
2268 1.1 christos }
2269 1.1 christos NEXT (vpc);
2270 1.1 christos
2271 1.1 christos CASE (sem, INSN_NEG) : /* neg $dr,$sr */
2272 1.1 christos {
2273 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2274 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2275 1.1 christos #define FLD(f) abuf->fields.sfmt_ld_plus.f
2276 1.1 christos int UNUSED written = 0;
2277 1.1 christos IADDR UNUSED pc = abuf->addr;
2278 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2279 1.1 christos
2280 1.1 christos {
2281 1.1 christos SI opval = NEGSI (* FLD (i_sr));
2282 1.1 christos * FLD (i_dr) = opval;
2283 1.1 christos TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
2284 1.1 christos }
2285 1.1 christos
2286 1.1 christos #undef FLD
2287 1.1 christos }
2288 1.1 christos NEXT (vpc);
2289 1.1 christos
2290 1.1 christos CASE (sem, INSN_NOP) : /* nop */
2291 1.1 christos {
2292 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2293 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2294 1.1 christos #define FLD(f) abuf->fields.sfmt_empty.f
2295 1.1 christos int UNUSED written = 0;
2296 1.1 christos IADDR UNUSED pc = abuf->addr;
2297 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2298 1.1 christos
2299 1.1 christos PROFILE_COUNT_FILLNOPS (current_cpu, abuf->addr);
2300 1.1 christos
2301 1.1 christos #undef FLD
2302 1.1 christos }
2303 1.1 christos NEXT (vpc);
2304 1.1 christos
2305 1.1 christos CASE (sem, INSN_NOT) : /* not $dr,$sr */
2306 1.1 christos {
2307 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2308 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2309 1.1 christos #define FLD(f) abuf->fields.sfmt_ld_plus.f
2310 1.1 christos int UNUSED written = 0;
2311 1.1 christos IADDR UNUSED pc = abuf->addr;
2312 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2313 1.1 christos
2314 1.1 christos {
2315 1.1 christos SI opval = INVSI (* FLD (i_sr));
2316 1.1 christos * FLD (i_dr) = opval;
2317 1.1 christos TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
2318 1.1 christos }
2319 1.1 christos
2320 1.1 christos #undef FLD
2321 1.1 christos }
2322 1.1 christos NEXT (vpc);
2323 1.1 christos
2324 1.1 christos CASE (sem, INSN_RAC_DSI) : /* rac $accd,$accs,$imm1 */
2325 1.1 christos {
2326 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2327 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2328 1.1 christos #define FLD(f) abuf->fields.sfmt_rac_dsi.f
2329 1.1 christos int UNUSED written = 0;
2330 1.1 christos IADDR UNUSED pc = abuf->addr;
2331 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2332 1.1 christos
2333 1.1 christos {
2334 1.1 christos DI tmp_tmp1;
2335 1.1 christos tmp_tmp1 = SLLDI (GET_H_ACCUMS (FLD (f_accs)), FLD (f_imm1));
2336 1.1 christos tmp_tmp1 = ADDDI (tmp_tmp1, MAKEDI (0, 32768));
2337 1.1 christos {
2338 1.1 christos DI opval = (GTDI (tmp_tmp1, MAKEDI (32767, 0xffff0000))) ? (MAKEDI (32767, 0xffff0000)) : (LTDI (tmp_tmp1, MAKEDI (0xffff8000, 0))) ? (MAKEDI (0xffff8000, 0)) : (ANDDI (tmp_tmp1, MAKEDI (0xffffffff, 0xffff0000)));
2339 1.1 christos SET_H_ACCUMS (FLD (f_accd), opval);
2340 1.1 christos TRACE_RESULT (current_cpu, abuf, "accums", 'D', opval);
2341 1.1 christos }
2342 1.1 christos }
2343 1.1 christos
2344 1.1 christos #undef FLD
2345 1.1 christos }
2346 1.1 christos NEXT (vpc);
2347 1.1 christos
2348 1.1 christos CASE (sem, INSN_RACH_DSI) : /* rach $accd,$accs,$imm1 */
2349 1.1 christos {
2350 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2351 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2352 1.1 christos #define FLD(f) abuf->fields.sfmt_rac_dsi.f
2353 1.1 christos int UNUSED written = 0;
2354 1.1 christos IADDR UNUSED pc = abuf->addr;
2355 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2356 1.1 christos
2357 1.1 christos {
2358 1.1 christos DI tmp_tmp1;
2359 1.1 christos tmp_tmp1 = SLLDI (GET_H_ACCUMS (FLD (f_accs)), FLD (f_imm1));
2360 1.1 christos tmp_tmp1 = ADDDI (tmp_tmp1, MAKEDI (0, 0x80000000));
2361 1.1 christos {
2362 1.1 christos DI opval = (GTDI (tmp_tmp1, MAKEDI (32767, 0))) ? (MAKEDI (32767, 0)) : (LTDI (tmp_tmp1, MAKEDI (0xffff8000, 0))) ? (MAKEDI (0xffff8000, 0)) : (ANDDI (tmp_tmp1, MAKEDI (0xffffffff, 0)));
2363 1.1 christos SET_H_ACCUMS (FLD (f_accd), opval);
2364 1.1 christos TRACE_RESULT (current_cpu, abuf, "accums", 'D', opval);
2365 1.1 christos }
2366 1.1 christos }
2367 1.1 christos
2368 1.1 christos #undef FLD
2369 1.1 christos }
2370 1.1 christos NEXT (vpc);
2371 1.1 christos
2372 1.1 christos CASE (sem, INSN_RTE) : /* rte */
2373 1.1 christos {
2374 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2375 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2376 1.1 christos #define FLD(f) abuf->fields.sfmt_empty.f
2377 1.1 christos int UNUSED written = 0;
2378 1.1 christos IADDR UNUSED pc = abuf->addr;
2379 1.1 christos SEM_BRANCH_INIT
2380 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2381 1.1 christos
2382 1.1 christos {
2383 1.1 christos {
2384 1.1 christos USI opval = ANDSI (GET_H_CR (((UINT) 6)), -4);
2385 1.1 christos SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, opval, vpc);
2386 1.1 christos TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
2387 1.1 christos }
2388 1.1 christos {
2389 1.1 christos USI opval = GET_H_CR (((UINT) 14));
2390 1.1 christos SET_H_CR (((UINT) 6), opval);
2391 1.1 christos TRACE_RESULT (current_cpu, abuf, "cr", 'x', opval);
2392 1.1 christos }
2393 1.1 christos {
2394 1.1 christos UQI opval = CPU (h_bpsw);
2395 1.1 christos SET_H_PSW (opval);
2396 1.1 christos TRACE_RESULT (current_cpu, abuf, "psw", 'x', opval);
2397 1.1 christos }
2398 1.1 christos {
2399 1.1 christos UQI opval = CPU (h_bbpsw);
2400 1.1 christos CPU (h_bpsw) = opval;
2401 1.1 christos TRACE_RESULT (current_cpu, abuf, "bpsw", 'x', opval);
2402 1.1 christos }
2403 1.1 christos }
2404 1.1 christos
2405 1.1 christos SEM_BRANCH_FINI (vpc);
2406 1.1 christos #undef FLD
2407 1.1 christos }
2408 1.1 christos NEXT (vpc);
2409 1.1 christos
2410 1.1 christos CASE (sem, INSN_SETH) : /* seth $dr,$hash$hi16 */
2411 1.1 christos {
2412 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2413 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2414 1.1 christos #define FLD(f) abuf->fields.sfmt_seth.f
2415 1.1 christos int UNUSED written = 0;
2416 1.1 christos IADDR UNUSED pc = abuf->addr;
2417 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2418 1.1 christos
2419 1.1 christos {
2420 1.1 christos SI opval = SLLSI (FLD (f_hi16), 16);
2421 1.1 christos * FLD (i_dr) = opval;
2422 1.1 christos TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
2423 1.1 christos }
2424 1.1 christos
2425 1.1 christos #undef FLD
2426 1.1 christos }
2427 1.1 christos NEXT (vpc);
2428 1.1 christos
2429 1.1 christos CASE (sem, INSN_SLL) : /* sll $dr,$sr */
2430 1.1 christos {
2431 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2432 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2433 1.1 christos #define FLD(f) abuf->fields.sfmt_add.f
2434 1.1 christos int UNUSED written = 0;
2435 1.1 christos IADDR UNUSED pc = abuf->addr;
2436 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2437 1.1 christos
2438 1.1 christos {
2439 1.1 christos SI opval = SLLSI (* FLD (i_dr), ANDSI (* FLD (i_sr), 31));
2440 1.1 christos * FLD (i_dr) = opval;
2441 1.1 christos TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
2442 1.1 christos }
2443 1.1 christos
2444 1.1 christos #undef FLD
2445 1.1 christos }
2446 1.1 christos NEXT (vpc);
2447 1.1 christos
2448 1.1 christos CASE (sem, INSN_SLL3) : /* sll3 $dr,$sr,$simm16 */
2449 1.1 christos {
2450 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2451 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2452 1.1 christos #define FLD(f) abuf->fields.sfmt_add3.f
2453 1.1 christos int UNUSED written = 0;
2454 1.1 christos IADDR UNUSED pc = abuf->addr;
2455 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2456 1.1 christos
2457 1.1 christos {
2458 1.1 christos SI opval = SLLSI (* FLD (i_sr), ANDSI (FLD (f_simm16), 31));
2459 1.1 christos * FLD (i_dr) = opval;
2460 1.1 christos TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
2461 1.1 christos }
2462 1.1 christos
2463 1.1 christos #undef FLD
2464 1.1 christos }
2465 1.1 christos NEXT (vpc);
2466 1.1 christos
2467 1.1 christos CASE (sem, INSN_SLLI) : /* slli $dr,$uimm5 */
2468 1.1 christos {
2469 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2470 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2471 1.1 christos #define FLD(f) abuf->fields.sfmt_slli.f
2472 1.1 christos int UNUSED written = 0;
2473 1.1 christos IADDR UNUSED pc = abuf->addr;
2474 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2475 1.1 christos
2476 1.1 christos {
2477 1.1 christos SI opval = SLLSI (* FLD (i_dr), FLD (f_uimm5));
2478 1.1 christos * FLD (i_dr) = opval;
2479 1.1 christos TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
2480 1.1 christos }
2481 1.1 christos
2482 1.1 christos #undef FLD
2483 1.1 christos }
2484 1.1 christos NEXT (vpc);
2485 1.1 christos
2486 1.1 christos CASE (sem, INSN_SRA) : /* sra $dr,$sr */
2487 1.1 christos {
2488 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2489 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2490 1.1 christos #define FLD(f) abuf->fields.sfmt_add.f
2491 1.1 christos int UNUSED written = 0;
2492 1.1 christos IADDR UNUSED pc = abuf->addr;
2493 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2494 1.1 christos
2495 1.1 christos {
2496 1.1 christos SI opval = SRASI (* FLD (i_dr), ANDSI (* FLD (i_sr), 31));
2497 1.1 christos * FLD (i_dr) = opval;
2498 1.1 christos TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
2499 1.1 christos }
2500 1.1 christos
2501 1.1 christos #undef FLD
2502 1.1 christos }
2503 1.1 christos NEXT (vpc);
2504 1.1 christos
2505 1.1 christos CASE (sem, INSN_SRA3) : /* sra3 $dr,$sr,$simm16 */
2506 1.1 christos {
2507 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2508 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2509 1.1 christos #define FLD(f) abuf->fields.sfmt_add3.f
2510 1.1 christos int UNUSED written = 0;
2511 1.1 christos IADDR UNUSED pc = abuf->addr;
2512 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2513 1.1 christos
2514 1.1 christos {
2515 1.1 christos SI opval = SRASI (* FLD (i_sr), ANDSI (FLD (f_simm16), 31));
2516 1.1 christos * FLD (i_dr) = opval;
2517 1.1 christos TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
2518 1.1 christos }
2519 1.1 christos
2520 1.1 christos #undef FLD
2521 1.1 christos }
2522 1.1 christos NEXT (vpc);
2523 1.1 christos
2524 1.1 christos CASE (sem, INSN_SRAI) : /* srai $dr,$uimm5 */
2525 1.1 christos {
2526 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2527 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2528 1.1 christos #define FLD(f) abuf->fields.sfmt_slli.f
2529 1.1 christos int UNUSED written = 0;
2530 1.1 christos IADDR UNUSED pc = abuf->addr;
2531 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2532 1.1 christos
2533 1.1 christos {
2534 1.1 christos SI opval = SRASI (* FLD (i_dr), FLD (f_uimm5));
2535 1.1 christos * FLD (i_dr) = opval;
2536 1.1 christos TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
2537 1.1 christos }
2538 1.1 christos
2539 1.1 christos #undef FLD
2540 1.1 christos }
2541 1.1 christos NEXT (vpc);
2542 1.1 christos
2543 1.1 christos CASE (sem, INSN_SRL) : /* srl $dr,$sr */
2544 1.1 christos {
2545 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2546 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2547 1.1 christos #define FLD(f) abuf->fields.sfmt_add.f
2548 1.1 christos int UNUSED written = 0;
2549 1.1 christos IADDR UNUSED pc = abuf->addr;
2550 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2551 1.1 christos
2552 1.1 christos {
2553 1.1 christos SI opval = SRLSI (* FLD (i_dr), ANDSI (* FLD (i_sr), 31));
2554 1.1 christos * FLD (i_dr) = opval;
2555 1.1 christos TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
2556 1.1 christos }
2557 1.1 christos
2558 1.1 christos #undef FLD
2559 1.1 christos }
2560 1.1 christos NEXT (vpc);
2561 1.1 christos
2562 1.1 christos CASE (sem, INSN_SRL3) : /* srl3 $dr,$sr,$simm16 */
2563 1.1 christos {
2564 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2565 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2566 1.1 christos #define FLD(f) abuf->fields.sfmt_add3.f
2567 1.1 christos int UNUSED written = 0;
2568 1.1 christos IADDR UNUSED pc = abuf->addr;
2569 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2570 1.1 christos
2571 1.1 christos {
2572 1.1 christos SI opval = SRLSI (* FLD (i_sr), ANDSI (FLD (f_simm16), 31));
2573 1.1 christos * FLD (i_dr) = opval;
2574 1.1 christos TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
2575 1.1 christos }
2576 1.1 christos
2577 1.1 christos #undef FLD
2578 1.1 christos }
2579 1.1 christos NEXT (vpc);
2580 1.1 christos
2581 1.1 christos CASE (sem, INSN_SRLI) : /* srli $dr,$uimm5 */
2582 1.1 christos {
2583 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2584 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2585 1.1 christos #define FLD(f) abuf->fields.sfmt_slli.f
2586 1.1 christos int UNUSED written = 0;
2587 1.1 christos IADDR UNUSED pc = abuf->addr;
2588 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2589 1.1 christos
2590 1.1 christos {
2591 1.1 christos SI opval = SRLSI (* FLD (i_dr), FLD (f_uimm5));
2592 1.1 christos * FLD (i_dr) = opval;
2593 1.1 christos TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
2594 1.1 christos }
2595 1.1 christos
2596 1.1 christos #undef FLD
2597 1.1 christos }
2598 1.1 christos NEXT (vpc);
2599 1.1 christos
2600 1.1 christos CASE (sem, INSN_ST) : /* st $src1,@$src2 */
2601 1.1 christos {
2602 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2603 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2604 1.1 christos #define FLD(f) abuf->fields.sfmt_st_plus.f
2605 1.1 christos int UNUSED written = 0;
2606 1.1 christos IADDR UNUSED pc = abuf->addr;
2607 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2608 1.1 christos
2609 1.1 christos {
2610 1.1 christos SI opval = * FLD (i_src1);
2611 1.1 christos SETMEMSI (current_cpu, pc, * FLD (i_src2), opval);
2612 1.1 christos TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
2613 1.1 christos }
2614 1.1 christos
2615 1.1 christos #undef FLD
2616 1.1 christos }
2617 1.1 christos NEXT (vpc);
2618 1.1 christos
2619 1.1 christos CASE (sem, INSN_ST_D) : /* st $src1,@($slo16,$src2) */
2620 1.1 christos {
2621 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2622 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2623 1.1 christos #define FLD(f) abuf->fields.sfmt_st_d.f
2624 1.1 christos int UNUSED written = 0;
2625 1.1 christos IADDR UNUSED pc = abuf->addr;
2626 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2627 1.1 christos
2628 1.1 christos {
2629 1.1 christos SI opval = * FLD (i_src1);
2630 1.1 christos SETMEMSI (current_cpu, pc, ADDSI (* FLD (i_src2), FLD (f_simm16)), opval);
2631 1.1 christos TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
2632 1.1 christos }
2633 1.1 christos
2634 1.1 christos #undef FLD
2635 1.1 christos }
2636 1.1 christos NEXT (vpc);
2637 1.1 christos
2638 1.1 christos CASE (sem, INSN_STB) : /* stb $src1,@$src2 */
2639 1.1 christos {
2640 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2641 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2642 1.1 christos #define FLD(f) abuf->fields.sfmt_st_plus.f
2643 1.1 christos int UNUSED written = 0;
2644 1.1 christos IADDR UNUSED pc = abuf->addr;
2645 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2646 1.1 christos
2647 1.1 christos {
2648 1.1 christos QI opval = * FLD (i_src1);
2649 1.1 christos SETMEMQI (current_cpu, pc, * FLD (i_src2), opval);
2650 1.1 christos TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
2651 1.1 christos }
2652 1.1 christos
2653 1.1 christos #undef FLD
2654 1.1 christos }
2655 1.1 christos NEXT (vpc);
2656 1.1 christos
2657 1.1 christos CASE (sem, INSN_STB_D) : /* stb $src1,@($slo16,$src2) */
2658 1.1 christos {
2659 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2660 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2661 1.1 christos #define FLD(f) abuf->fields.sfmt_st_d.f
2662 1.1 christos int UNUSED written = 0;
2663 1.1 christos IADDR UNUSED pc = abuf->addr;
2664 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2665 1.1 christos
2666 1.1 christos {
2667 1.1 christos QI opval = * FLD (i_src1);
2668 1.1 christos SETMEMQI (current_cpu, pc, ADDSI (* FLD (i_src2), FLD (f_simm16)), opval);
2669 1.1 christos TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
2670 1.1 christos }
2671 1.1 christos
2672 1.1 christos #undef FLD
2673 1.1 christos }
2674 1.1 christos NEXT (vpc);
2675 1.1 christos
2676 1.1 christos CASE (sem, INSN_STH) : /* sth $src1,@$src2 */
2677 1.1 christos {
2678 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2679 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2680 1.1 christos #define FLD(f) abuf->fields.sfmt_st_plus.f
2681 1.1 christos int UNUSED written = 0;
2682 1.1 christos IADDR UNUSED pc = abuf->addr;
2683 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2684 1.1 christos
2685 1.1 christos {
2686 1.1 christos HI opval = * FLD (i_src1);
2687 1.1 christos SETMEMHI (current_cpu, pc, * FLD (i_src2), opval);
2688 1.1 christos TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
2689 1.1 christos }
2690 1.1 christos
2691 1.1 christos #undef FLD
2692 1.1 christos }
2693 1.1 christos NEXT (vpc);
2694 1.1 christos
2695 1.1 christos CASE (sem, INSN_STH_D) : /* sth $src1,@($slo16,$src2) */
2696 1.1 christos {
2697 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2698 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2699 1.1 christos #define FLD(f) abuf->fields.sfmt_st_d.f
2700 1.1 christos int UNUSED written = 0;
2701 1.1 christos IADDR UNUSED pc = abuf->addr;
2702 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2703 1.1 christos
2704 1.1 christos {
2705 1.1 christos HI opval = * FLD (i_src1);
2706 1.1 christos SETMEMHI (current_cpu, pc, ADDSI (* FLD (i_src2), FLD (f_simm16)), opval);
2707 1.1 christos TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
2708 1.1 christos }
2709 1.1 christos
2710 1.1 christos #undef FLD
2711 1.1 christos }
2712 1.1 christos NEXT (vpc);
2713 1.1 christos
2714 1.1 christos CASE (sem, INSN_ST_PLUS) : /* st $src1,@+$src2 */
2715 1.1 christos {
2716 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2717 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2718 1.1 christos #define FLD(f) abuf->fields.sfmt_st_plus.f
2719 1.1 christos int UNUSED written = 0;
2720 1.1 christos IADDR UNUSED pc = abuf->addr;
2721 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2722 1.1 christos
2723 1.1 christos {
2724 1.1 christos SI tmp_new_src2;
2725 1.1 christos tmp_new_src2 = ADDSI (* FLD (i_src2), 4);
2726 1.1 christos {
2727 1.1 christos SI opval = * FLD (i_src1);
2728 1.1 christos SETMEMSI (current_cpu, pc, tmp_new_src2, opval);
2729 1.1 christos TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
2730 1.1 christos }
2731 1.1 christos {
2732 1.1 christos SI opval = tmp_new_src2;
2733 1.1 christos * FLD (i_src2) = opval;
2734 1.1 christos TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
2735 1.1 christos }
2736 1.1 christos }
2737 1.1 christos
2738 1.1 christos #undef FLD
2739 1.1 christos }
2740 1.1 christos NEXT (vpc);
2741 1.1 christos
2742 1.1 christos CASE (sem, INSN_STH_PLUS) : /* sth $src1,@$src2+ */
2743 1.1 christos {
2744 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2745 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2746 1.1 christos #define FLD(f) abuf->fields.sfmt_st_plus.f
2747 1.1 christos int UNUSED written = 0;
2748 1.1 christos IADDR UNUSED pc = abuf->addr;
2749 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2750 1.1 christos
2751 1.1 christos {
2752 1.1 christos SI tmp_new_src2;
2753 1.1 christos tmp_new_src2 = * FLD (i_src2);
2754 1.1 christos {
2755 1.1 christos HI opval = * FLD (i_src1);
2756 1.1 christos SETMEMHI (current_cpu, pc, tmp_new_src2, opval);
2757 1.1 christos TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
2758 1.1 christos }
2759 1.1 christos {
2760 1.1 christos SI opval = ADDSI (tmp_new_src2, 2);
2761 1.1 christos * FLD (i_src2) = opval;
2762 1.1 christos TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
2763 1.1 christos }
2764 1.1 christos }
2765 1.1 christos
2766 1.1 christos #undef FLD
2767 1.1 christos }
2768 1.1 christos NEXT (vpc);
2769 1.1 christos
2770 1.1 christos CASE (sem, INSN_STB_PLUS) : /* stb $src1,@$src2+ */
2771 1.1 christos {
2772 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2773 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2774 1.1 christos #define FLD(f) abuf->fields.sfmt_st_plus.f
2775 1.1 christos int UNUSED written = 0;
2776 1.1 christos IADDR UNUSED pc = abuf->addr;
2777 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2778 1.1 christos
2779 1.1 christos {
2780 1.1 christos SI tmp_new_src2;
2781 1.1 christos tmp_new_src2 = * FLD (i_src2);
2782 1.1 christos {
2783 1.1 christos QI opval = * FLD (i_src1);
2784 1.1 christos SETMEMQI (current_cpu, pc, tmp_new_src2, opval);
2785 1.1 christos TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
2786 1.1 christos }
2787 1.1 christos {
2788 1.1 christos SI opval = ADDSI (tmp_new_src2, 1);
2789 1.1 christos * FLD (i_src2) = opval;
2790 1.1 christos TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
2791 1.1 christos }
2792 1.1 christos }
2793 1.1 christos
2794 1.1 christos #undef FLD
2795 1.1 christos }
2796 1.1 christos NEXT (vpc);
2797 1.1 christos
2798 1.1 christos CASE (sem, INSN_ST_MINUS) : /* st $src1,@-$src2 */
2799 1.1 christos {
2800 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2801 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2802 1.1 christos #define FLD(f) abuf->fields.sfmt_st_plus.f
2803 1.1 christos int UNUSED written = 0;
2804 1.1 christos IADDR UNUSED pc = abuf->addr;
2805 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2806 1.1 christos
2807 1.1 christos {
2808 1.1 christos SI tmp_new_src2;
2809 1.1 christos tmp_new_src2 = SUBSI (* FLD (i_src2), 4);
2810 1.1 christos {
2811 1.1 christos SI opval = * FLD (i_src1);
2812 1.1 christos SETMEMSI (current_cpu, pc, tmp_new_src2, opval);
2813 1.1 christos TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
2814 1.1 christos }
2815 1.1 christos {
2816 1.1 christos SI opval = tmp_new_src2;
2817 1.1 christos * FLD (i_src2) = opval;
2818 1.1 christos TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
2819 1.1 christos }
2820 1.1 christos }
2821 1.1 christos
2822 1.1 christos #undef FLD
2823 1.1 christos }
2824 1.1 christos NEXT (vpc);
2825 1.1 christos
2826 1.1 christos CASE (sem, INSN_SUB) : /* sub $dr,$sr */
2827 1.1 christos {
2828 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2829 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2830 1.1 christos #define FLD(f) abuf->fields.sfmt_add.f
2831 1.1 christos int UNUSED written = 0;
2832 1.1 christos IADDR UNUSED pc = abuf->addr;
2833 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2834 1.1 christos
2835 1.1 christos {
2836 1.1 christos SI opval = SUBSI (* FLD (i_dr), * FLD (i_sr));
2837 1.1 christos * FLD (i_dr) = opval;
2838 1.1 christos TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
2839 1.1 christos }
2840 1.1 christos
2841 1.1 christos #undef FLD
2842 1.1 christos }
2843 1.1 christos NEXT (vpc);
2844 1.1 christos
2845 1.1 christos CASE (sem, INSN_SUBV) : /* subv $dr,$sr */
2846 1.1 christos {
2847 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2848 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2849 1.1 christos #define FLD(f) abuf->fields.sfmt_add.f
2850 1.1 christos int UNUSED written = 0;
2851 1.1 christos IADDR UNUSED pc = abuf->addr;
2852 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2853 1.1 christos
2854 1.1 christos {
2855 1.1 christos SI temp0;BI temp1;
2856 1.1 christos temp0 = SUBSI (* FLD (i_dr), * FLD (i_sr));
2857 1.1 christos temp1 = SUBOFSI (* FLD (i_dr), * FLD (i_sr), 0);
2858 1.1 christos {
2859 1.1 christos SI opval = temp0;
2860 1.1 christos * FLD (i_dr) = opval;
2861 1.1 christos TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
2862 1.1 christos }
2863 1.1 christos {
2864 1.1 christos BI opval = temp1;
2865 1.1 christos CPU (h_cond) = opval;
2866 1.1 christos TRACE_RESULT (current_cpu, abuf, "cond", 'x', opval);
2867 1.1 christos }
2868 1.1 christos }
2869 1.1 christos
2870 1.1 christos #undef FLD
2871 1.1 christos }
2872 1.1 christos NEXT (vpc);
2873 1.1 christos
2874 1.1 christos CASE (sem, INSN_SUBX) : /* subx $dr,$sr */
2875 1.1 christos {
2876 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2877 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2878 1.1 christos #define FLD(f) abuf->fields.sfmt_add.f
2879 1.1 christos int UNUSED written = 0;
2880 1.1 christos IADDR UNUSED pc = abuf->addr;
2881 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2882 1.1 christos
2883 1.1 christos {
2884 1.1 christos SI temp0;BI temp1;
2885 1.1 christos temp0 = SUBCSI (* FLD (i_dr), * FLD (i_sr), CPU (h_cond));
2886 1.1 christos temp1 = SUBCFSI (* FLD (i_dr), * FLD (i_sr), CPU (h_cond));
2887 1.1 christos {
2888 1.1 christos SI opval = temp0;
2889 1.1 christos * FLD (i_dr) = opval;
2890 1.1 christos TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
2891 1.1 christos }
2892 1.1 christos {
2893 1.1 christos BI opval = temp1;
2894 1.1 christos CPU (h_cond) = opval;
2895 1.1 christos TRACE_RESULT (current_cpu, abuf, "cond", 'x', opval);
2896 1.1 christos }
2897 1.1 christos }
2898 1.1 christos
2899 1.1 christos #undef FLD
2900 1.1 christos }
2901 1.1 christos NEXT (vpc);
2902 1.1 christos
2903 1.1 christos CASE (sem, INSN_TRAP) : /* trap $uimm4 */
2904 1.1 christos {
2905 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2906 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2907 1.1 christos #define FLD(f) abuf->fields.sfmt_trap.f
2908 1.1 christos int UNUSED written = 0;
2909 1.1 christos IADDR UNUSED pc = abuf->addr;
2910 1.1 christos SEM_BRANCH_INIT
2911 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2912 1.1 christos
2913 1.1 christos {
2914 1.1 christos {
2915 1.1 christos USI opval = GET_H_CR (((UINT) 6));
2916 1.1 christos SET_H_CR (((UINT) 14), opval);
2917 1.1 christos TRACE_RESULT (current_cpu, abuf, "cr", 'x', opval);
2918 1.1 christos }
2919 1.1 christos {
2920 1.1 christos USI opval = ADDSI (pc, 4);
2921 1.1 christos SET_H_CR (((UINT) 6), opval);
2922 1.1 christos TRACE_RESULT (current_cpu, abuf, "cr", 'x', opval);
2923 1.1 christos }
2924 1.1 christos {
2925 1.1 christos UQI opval = CPU (h_bpsw);
2926 1.1 christos CPU (h_bbpsw) = opval;
2927 1.1 christos TRACE_RESULT (current_cpu, abuf, "bbpsw", 'x', opval);
2928 1.1 christos }
2929 1.1 christos {
2930 1.1 christos UQI opval = GET_H_PSW ();
2931 1.1 christos CPU (h_bpsw) = opval;
2932 1.1 christos TRACE_RESULT (current_cpu, abuf, "bpsw", 'x', opval);
2933 1.1 christos }
2934 1.1 christos {
2935 1.1 christos UQI opval = ANDQI (GET_H_PSW (), 128);
2936 1.1 christos SET_H_PSW (opval);
2937 1.1 christos TRACE_RESULT (current_cpu, abuf, "psw", 'x', opval);
2938 1.1 christos }
2939 1.1 christos {
2940 1.1 christos SI opval = m32r_trap (current_cpu, pc, FLD (f_uimm4));
2941 1.1 christos SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, opval, vpc);
2942 1.1 christos TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
2943 1.1 christos }
2944 1.1 christos }
2945 1.1 christos
2946 1.1 christos SEM_BRANCH_FINI (vpc);
2947 1.1 christos #undef FLD
2948 1.1 christos }
2949 1.1 christos NEXT (vpc);
2950 1.1 christos
2951 1.1 christos CASE (sem, INSN_UNLOCK) : /* unlock $src1,@$src2 */
2952 1.1 christos {
2953 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2954 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2955 1.1 christos #define FLD(f) abuf->fields.sfmt_st_plus.f
2956 1.1 christos int UNUSED written = 0;
2957 1.1 christos IADDR UNUSED pc = abuf->addr;
2958 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2959 1.1 christos
2960 1.1 christos {
2961 1.1 christos if (CPU (h_lock)) {
2962 1.1 christos {
2963 1.1 christos SI opval = * FLD (i_src1);
2964 1.1 christos SETMEMSI (current_cpu, pc, * FLD (i_src2), opval);
2965 1.1 christos written |= (1 << 4);
2966 1.1 christos TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
2967 1.1 christos }
2968 1.1 christos }
2969 1.1 christos {
2970 1.1 christos BI opval = 0;
2971 1.1 christos CPU (h_lock) = opval;
2972 1.1 christos TRACE_RESULT (current_cpu, abuf, "lock", 'x', opval);
2973 1.1 christos }
2974 1.1 christos }
2975 1.1 christos
2976 1.1 christos abuf->written = written;
2977 1.1 christos #undef FLD
2978 1.1 christos }
2979 1.1 christos NEXT (vpc);
2980 1.1 christos
2981 1.1 christos CASE (sem, INSN_SATB) : /* satb $dr,$sr */
2982 1.1 christos {
2983 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2984 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2985 1.1 christos #define FLD(f) abuf->fields.sfmt_ld_plus.f
2986 1.1 christos int UNUSED written = 0;
2987 1.1 christos IADDR UNUSED pc = abuf->addr;
2988 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2989 1.1 christos
2990 1.1 christos {
2991 1.1 christos SI opval = (GESI (* FLD (i_sr), 127)) ? (127) : (LESI (* FLD (i_sr), -128)) ? (-128) : (* FLD (i_sr));
2992 1.1 christos * FLD (i_dr) = opval;
2993 1.1 christos TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
2994 1.1 christos }
2995 1.1 christos
2996 1.1 christos #undef FLD
2997 1.1 christos }
2998 1.1 christos NEXT (vpc);
2999 1.1 christos
3000 1.1 christos CASE (sem, INSN_SATH) : /* sath $dr,$sr */
3001 1.1 christos {
3002 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
3003 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3004 1.1 christos #define FLD(f) abuf->fields.sfmt_ld_plus.f
3005 1.1 christos int UNUSED written = 0;
3006 1.1 christos IADDR UNUSED pc = abuf->addr;
3007 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
3008 1.1 christos
3009 1.1 christos {
3010 1.1 christos SI opval = (GESI (* FLD (i_sr), 32767)) ? (32767) : (LESI (* FLD (i_sr), -32768)) ? (-32768) : (* FLD (i_sr));
3011 1.1 christos * FLD (i_dr) = opval;
3012 1.1 christos TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
3013 1.1 christos }
3014 1.1 christos
3015 1.1 christos #undef FLD
3016 1.1 christos }
3017 1.1 christos NEXT (vpc);
3018 1.1 christos
3019 1.1 christos CASE (sem, INSN_SAT) : /* sat $dr,$sr */
3020 1.1 christos {
3021 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
3022 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3023 1.1 christos #define FLD(f) abuf->fields.sfmt_ld_plus.f
3024 1.1 christos int UNUSED written = 0;
3025 1.1 christos IADDR UNUSED pc = abuf->addr;
3026 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
3027 1.1 christos
3028 1.1 christos {
3029 1.1 christos SI opval = ((CPU (h_cond)) ? (((LTSI (* FLD (i_sr), 0)) ? (2147483647) : (0x80000000))) : (* FLD (i_sr)));
3030 1.1 christos * FLD (i_dr) = opval;
3031 1.1 christos TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
3032 1.1 christos }
3033 1.1 christos
3034 1.1 christos #undef FLD
3035 1.1 christos }
3036 1.1 christos NEXT (vpc);
3037 1.1 christos
3038 1.1 christos CASE (sem, INSN_PCMPBZ) : /* pcmpbz $src2 */
3039 1.1 christos {
3040 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
3041 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3042 1.1 christos #define FLD(f) abuf->fields.sfmt_st_plus.f
3043 1.1 christos int UNUSED written = 0;
3044 1.1 christos IADDR UNUSED pc = abuf->addr;
3045 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
3046 1.1 christos
3047 1.1 christos {
3048 1.1 christos BI opval = (EQSI (ANDSI (* FLD (i_src2), 255), 0)) ? (1) : (EQSI (ANDSI (* FLD (i_src2), 65280), 0)) ? (1) : (EQSI (ANDSI (* FLD (i_src2), 16711680), 0)) ? (1) : (EQSI (ANDSI (* FLD (i_src2), 0xff000000), 0)) ? (1) : (0);
3049 1.1 christos CPU (h_cond) = opval;
3050 1.1 christos TRACE_RESULT (current_cpu, abuf, "cond", 'x', opval);
3051 1.1 christos }
3052 1.1 christos
3053 1.1 christos #undef FLD
3054 1.1 christos }
3055 1.1 christos NEXT (vpc);
3056 1.1 christos
3057 1.1 christos CASE (sem, INSN_SADD) : /* sadd */
3058 1.1 christos {
3059 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
3060 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3061 1.1 christos #define FLD(f) abuf->fields.sfmt_empty.f
3062 1.1 christos int UNUSED written = 0;
3063 1.1 christos IADDR UNUSED pc = abuf->addr;
3064 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
3065 1.1 christos
3066 1.1 christos {
3067 1.1 christos DI opval = ADDDI (SRADI (GET_H_ACCUMS (((UINT) 1)), 16), GET_H_ACCUMS (((UINT) 0)));
3068 1.1 christos SET_H_ACCUMS (((UINT) 0), opval);
3069 1.1 christos TRACE_RESULT (current_cpu, abuf, "accums", 'D', opval);
3070 1.1 christos }
3071 1.1 christos
3072 1.1 christos #undef FLD
3073 1.1 christos }
3074 1.1 christos NEXT (vpc);
3075 1.1 christos
3076 1.1 christos CASE (sem, INSN_MACWU1) : /* macwu1 $src1,$src2 */
3077 1.1 christos {
3078 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
3079 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3080 1.1 christos #define FLD(f) abuf->fields.sfmt_st_plus.f
3081 1.1 christos int UNUSED written = 0;
3082 1.1 christos IADDR UNUSED pc = abuf->addr;
3083 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
3084 1.1 christos
3085 1.1 christos {
3086 1.1 christos DI opval = SRADI (SLLDI (ADDDI (GET_H_ACCUMS (((UINT) 1)), MULDI (EXTSIDI (* FLD (i_src1)), EXTSIDI (ANDSI (* FLD (i_src2), 65535)))), 8), 8);
3087 1.1 christos SET_H_ACCUMS (((UINT) 1), opval);
3088 1.1 christos TRACE_RESULT (current_cpu, abuf, "accums", 'D', opval);
3089 1.1 christos }
3090 1.1 christos
3091 1.1 christos #undef FLD
3092 1.1 christos }
3093 1.1 christos NEXT (vpc);
3094 1.1 christos
3095 1.1 christos CASE (sem, INSN_MSBLO) : /* msblo $src1,$src2 */
3096 1.1 christos {
3097 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
3098 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3099 1.1 christos #define FLD(f) abuf->fields.sfmt_st_plus.f
3100 1.1 christos int UNUSED written = 0;
3101 1.1 christos IADDR UNUSED pc = abuf->addr;
3102 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
3103 1.1 christos
3104 1.1 christos {
3105 1.1 christos DI opval = SRADI (SLLDI (SUBDI (GET_H_ACCUM (), SRADI (SLLDI (MULDI (EXTHIDI (TRUNCSIHI (* FLD (i_src1))), EXTHIDI (TRUNCSIHI (* FLD (i_src2)))), 32), 16)), 8), 8);
3106 1.1 christos SET_H_ACCUM (opval);
3107 1.1 christos TRACE_RESULT (current_cpu, abuf, "accum", 'D', opval);
3108 1.1 christos }
3109 1.1 christos
3110 1.1 christos #undef FLD
3111 1.1 christos }
3112 1.1 christos NEXT (vpc);
3113 1.1 christos
3114 1.1 christos CASE (sem, INSN_MULWU1) : /* mulwu1 $src1,$src2 */
3115 1.1 christos {
3116 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
3117 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3118 1.1 christos #define FLD(f) abuf->fields.sfmt_st_plus.f
3119 1.1 christos int UNUSED written = 0;
3120 1.1 christos IADDR UNUSED pc = abuf->addr;
3121 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
3122 1.1 christos
3123 1.1 christos {
3124 1.1 christos DI opval = SRADI (SLLDI (MULDI (EXTSIDI (* FLD (i_src1)), EXTSIDI (ANDSI (* FLD (i_src2), 65535))), 16), 16);
3125 1.1 christos SET_H_ACCUMS (((UINT) 1), opval);
3126 1.1 christos TRACE_RESULT (current_cpu, abuf, "accums", 'D', opval);
3127 1.1 christos }
3128 1.1 christos
3129 1.1 christos #undef FLD
3130 1.1 christos }
3131 1.1 christos NEXT (vpc);
3132 1.1 christos
3133 1.1 christos CASE (sem, INSN_MACLH1) : /* maclh1 $src1,$src2 */
3134 1.1 christos {
3135 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
3136 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3137 1.1 christos #define FLD(f) abuf->fields.sfmt_st_plus.f
3138 1.1 christos int UNUSED written = 0;
3139 1.1 christos IADDR UNUSED pc = abuf->addr;
3140 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
3141 1.1 christos
3142 1.1 christos {
3143 1.1 christos DI opval = SRADI (SLLDI (ADDDI (GET_H_ACCUMS (((UINT) 1)), SLLDI (EXTSIDI (MULSI (EXTHISI (TRUNCSIHI (* FLD (i_src1))), SRASI (* FLD (i_src2), 16))), 16)), 8), 8);
3144 1.1 christos SET_H_ACCUMS (((UINT) 1), opval);
3145 1.1 christos TRACE_RESULT (current_cpu, abuf, "accums", 'D', opval);
3146 1.1 christos }
3147 1.1 christos
3148 1.1 christos #undef FLD
3149 1.1 christos }
3150 1.1 christos NEXT (vpc);
3151 1.1 christos
3152 1.1 christos CASE (sem, INSN_SC) : /* sc */
3153 1.1 christos {
3154 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
3155 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3156 1.1 christos #define FLD(f) abuf->fields.sfmt_empty.f
3157 1.1 christos int UNUSED written = 0;
3158 1.1 christos IADDR UNUSED pc = abuf->addr;
3159 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
3160 1.1 christos
3161 1.1 christos if (ZEXTBISI (CPU (h_cond)))
3162 1.1 christos SEM_SKIP_INSN (current_cpu, sem_arg, vpc);
3163 1.1 christos
3164 1.1 christos #undef FLD
3165 1.1 christos }
3166 1.1 christos NEXT (vpc);
3167 1.1 christos
3168 1.1 christos CASE (sem, INSN_SNC) : /* snc */
3169 1.1 christos {
3170 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
3171 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3172 1.1 christos #define FLD(f) abuf->fields.sfmt_empty.f
3173 1.1 christos int UNUSED written = 0;
3174 1.1 christos IADDR UNUSED pc = abuf->addr;
3175 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
3176 1.1 christos
3177 1.1 christos if (ZEXTBISI (NOTBI (CPU (h_cond))))
3178 1.1 christos SEM_SKIP_INSN (current_cpu, sem_arg, vpc);
3179 1.1 christos
3180 1.1 christos #undef FLD
3181 1.1 christos }
3182 1.1 christos NEXT (vpc);
3183 1.1 christos
3184 1.1 christos CASE (sem, INSN_CLRPSW) : /* clrpsw $uimm8 */
3185 1.1 christos {
3186 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
3187 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3188 1.1 christos #define FLD(f) abuf->fields.sfmt_clrpsw.f
3189 1.1 christos int UNUSED written = 0;
3190 1.1 christos IADDR UNUSED pc = abuf->addr;
3191 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
3192 1.1 christos
3193 1.1 christos {
3194 1.1 christos USI opval = ANDSI (GET_H_CR (((UINT) 0)), ORSI (ZEXTQISI (INVQI (FLD (f_uimm8))), 65280));
3195 1.1 christos SET_H_CR (((UINT) 0), opval);
3196 1.1 christos TRACE_RESULT (current_cpu, abuf, "cr", 'x', opval);
3197 1.1 christos }
3198 1.1 christos
3199 1.1 christos #undef FLD
3200 1.1 christos }
3201 1.1 christos NEXT (vpc);
3202 1.1 christos
3203 1.1 christos CASE (sem, INSN_SETPSW) : /* setpsw $uimm8 */
3204 1.1 christos {
3205 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
3206 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3207 1.1 christos #define FLD(f) abuf->fields.sfmt_clrpsw.f
3208 1.1 christos int UNUSED written = 0;
3209 1.1 christos IADDR UNUSED pc = abuf->addr;
3210 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
3211 1.1 christos
3212 1.1 christos {
3213 1.1 christos USI opval = FLD (f_uimm8);
3214 1.1 christos SET_H_CR (((UINT) 0), opval);
3215 1.1 christos TRACE_RESULT (current_cpu, abuf, "cr", 'x', opval);
3216 1.1 christos }
3217 1.1 christos
3218 1.1 christos #undef FLD
3219 1.1 christos }
3220 1.1 christos NEXT (vpc);
3221 1.1 christos
3222 1.1 christos CASE (sem, INSN_BSET) : /* bset $uimm3,@($slo16,$sr) */
3223 1.1 christos {
3224 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
3225 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3226 1.1 christos #define FLD(f) abuf->fields.sfmt_bset.f
3227 1.1 christos int UNUSED written = 0;
3228 1.1 christos IADDR UNUSED pc = abuf->addr;
3229 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
3230 1.1 christos
3231 1.1 christos {
3232 1.1 christos QI opval = ORQI (GETMEMQI (current_cpu, pc, ADDSI (* FLD (i_sr), FLD (f_simm16))), SLLQI (1, SUBSI (7, FLD (f_uimm3))));
3233 1.1 christos SETMEMQI (current_cpu, pc, ADDSI (* FLD (i_sr), FLD (f_simm16)), opval);
3234 1.1 christos TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
3235 1.1 christos }
3236 1.1 christos
3237 1.1 christos #undef FLD
3238 1.1 christos }
3239 1.1 christos NEXT (vpc);
3240 1.1 christos
3241 1.1 christos CASE (sem, INSN_BCLR) : /* bclr $uimm3,@($slo16,$sr) */
3242 1.1 christos {
3243 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
3244 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3245 1.1 christos #define FLD(f) abuf->fields.sfmt_bset.f
3246 1.1 christos int UNUSED written = 0;
3247 1.1 christos IADDR UNUSED pc = abuf->addr;
3248 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
3249 1.1 christos
3250 1.1 christos {
3251 1.1 christos QI opval = ANDQI (GETMEMQI (current_cpu, pc, ADDSI (* FLD (i_sr), FLD (f_simm16))), INVQI (SLLQI (1, SUBSI (7, FLD (f_uimm3)))));
3252 1.1 christos SETMEMQI (current_cpu, pc, ADDSI (* FLD (i_sr), FLD (f_simm16)), opval);
3253 1.1 christos TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
3254 1.1 christos }
3255 1.1 christos
3256 1.1 christos #undef FLD
3257 1.1 christos }
3258 1.1 christos NEXT (vpc);
3259 1.1 christos
3260 1.1 christos CASE (sem, INSN_BTST) : /* btst $uimm3,$sr */
3261 1.1 christos {
3262 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
3263 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3264 1.1 christos #define FLD(f) abuf->fields.sfmt_bset.f
3265 1.1 christos int UNUSED written = 0;
3266 1.1 christos IADDR UNUSED pc = abuf->addr;
3267 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
3268 1.1 christos
3269 1.1 christos {
3270 1.1 christos BI opval = ANDQI (SRLQI (* FLD (i_sr), SUBSI (7, FLD (f_uimm3))), 1);
3271 1.1 christos CPU (h_cond) = opval;
3272 1.1 christos TRACE_RESULT (current_cpu, abuf, "cond", 'x', opval);
3273 1.1 christos }
3274 1.1 christos
3275 1.1 christos #undef FLD
3276 1.1 christos }
3277 1.1 christos NEXT (vpc);
3278 1.1 christos
3279 1.1 christos CASE (sem, INSN_PAR_ADD) : /* add $dr,$sr */
3280 1.1 christos {
3281 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
3282 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3283 1.1 christos #define FLD(f) abuf->fields.sfmt_add.f
3284 1.1 christos #define OPRND(f) par_exec->operands.sfmt_add.f
3285 1.1 christos int UNUSED written = 0;
3286 1.1 christos IADDR UNUSED pc = abuf->addr;
3287 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
3288 1.1 christos
3289 1.1 christos {
3290 1.1 christos SI opval = ADDSI (* FLD (i_dr), * FLD (i_sr));
3291 1.1 christos OPRND (dr) = opval;
3292 1.1 christos TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
3293 1.1 christos }
3294 1.1 christos
3295 1.1 christos #undef OPRND
3296 1.1 christos #undef FLD
3297 1.1 christos }
3298 1.1 christos NEXT (vpc);
3299 1.1 christos
3300 1.1 christos CASE (sem, INSN_WRITE_ADD) : /* add $dr,$sr */
3301 1.1 christos {
3302 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
3303 1.1 christos const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
3304 1.1 christos #define FLD(f) abuf->fields.sfmt_add.f
3305 1.1 christos #define OPRND(f) par_exec->operands.sfmt_add.f
3306 1.1 christos int UNUSED written = abuf->written;
3307 1.1 christos IADDR UNUSED pc = abuf->addr;
3308 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
3309 1.1 christos
3310 1.1 christos * FLD (i_dr) = OPRND (dr);
3311 1.1 christos
3312 1.1 christos #undef OPRND
3313 1.1 christos #undef FLD
3314 1.1 christos }
3315 1.1 christos NEXT (vpc);
3316 1.1 christos
3317 1.1 christos CASE (sem, INSN_PAR_AND) : /* and $dr,$sr */
3318 1.1 christos {
3319 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
3320 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3321 1.1 christos #define FLD(f) abuf->fields.sfmt_add.f
3322 1.1 christos #define OPRND(f) par_exec->operands.sfmt_add.f
3323 1.1 christos int UNUSED written = 0;
3324 1.1 christos IADDR UNUSED pc = abuf->addr;
3325 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
3326 1.1 christos
3327 1.1 christos {
3328 1.1 christos SI opval = ANDSI (* FLD (i_dr), * FLD (i_sr));
3329 1.1 christos OPRND (dr) = opval;
3330 1.1 christos TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
3331 1.1 christos }
3332 1.1 christos
3333 1.1 christos #undef OPRND
3334 1.1 christos #undef FLD
3335 1.1 christos }
3336 1.1 christos NEXT (vpc);
3337 1.1 christos
3338 1.1 christos CASE (sem, INSN_WRITE_AND) : /* and $dr,$sr */
3339 1.1 christos {
3340 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
3341 1.1 christos const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
3342 1.1 christos #define FLD(f) abuf->fields.sfmt_add.f
3343 1.1 christos #define OPRND(f) par_exec->operands.sfmt_add.f
3344 1.1 christos int UNUSED written = abuf->written;
3345 1.1 christos IADDR UNUSED pc = abuf->addr;
3346 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
3347 1.1 christos
3348 1.1 christos * FLD (i_dr) = OPRND (dr);
3349 1.1 christos
3350 1.1 christos #undef OPRND
3351 1.1 christos #undef FLD
3352 1.1 christos }
3353 1.1 christos NEXT (vpc);
3354 1.1 christos
3355 1.1 christos CASE (sem, INSN_PAR_OR) : /* or $dr,$sr */
3356 1.1 christos {
3357 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
3358 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3359 1.1 christos #define FLD(f) abuf->fields.sfmt_add.f
3360 1.1 christos #define OPRND(f) par_exec->operands.sfmt_add.f
3361 1.1 christos int UNUSED written = 0;
3362 1.1 christos IADDR UNUSED pc = abuf->addr;
3363 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
3364 1.1 christos
3365 1.1 christos {
3366 1.1 christos SI opval = ORSI (* FLD (i_dr), * FLD (i_sr));
3367 1.1 christos OPRND (dr) = opval;
3368 1.1 christos TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
3369 1.1 christos }
3370 1.1 christos
3371 1.1 christos #undef OPRND
3372 1.1 christos #undef FLD
3373 1.1 christos }
3374 1.1 christos NEXT (vpc);
3375 1.1 christos
3376 1.1 christos CASE (sem, INSN_WRITE_OR) : /* or $dr,$sr */
3377 1.1 christos {
3378 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
3379 1.1 christos const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
3380 1.1 christos #define FLD(f) abuf->fields.sfmt_add.f
3381 1.1 christos #define OPRND(f) par_exec->operands.sfmt_add.f
3382 1.1 christos int UNUSED written = abuf->written;
3383 1.1 christos IADDR UNUSED pc = abuf->addr;
3384 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
3385 1.1 christos
3386 1.1 christos * FLD (i_dr) = OPRND (dr);
3387 1.1 christos
3388 1.1 christos #undef OPRND
3389 1.1 christos #undef FLD
3390 1.1 christos }
3391 1.1 christos NEXT (vpc);
3392 1.1 christos
3393 1.1 christos CASE (sem, INSN_PAR_XOR) : /* xor $dr,$sr */
3394 1.1 christos {
3395 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
3396 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3397 1.1 christos #define FLD(f) abuf->fields.sfmt_add.f
3398 1.1 christos #define OPRND(f) par_exec->operands.sfmt_add.f
3399 1.1 christos int UNUSED written = 0;
3400 1.1 christos IADDR UNUSED pc = abuf->addr;
3401 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
3402 1.1 christos
3403 1.1 christos {
3404 1.1 christos SI opval = XORSI (* FLD (i_dr), * FLD (i_sr));
3405 1.1 christos OPRND (dr) = opval;
3406 1.1 christos TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
3407 1.1 christos }
3408 1.1 christos
3409 1.1 christos #undef OPRND
3410 1.1 christos #undef FLD
3411 1.1 christos }
3412 1.1 christos NEXT (vpc);
3413 1.1 christos
3414 1.1 christos CASE (sem, INSN_WRITE_XOR) : /* xor $dr,$sr */
3415 1.1 christos {
3416 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
3417 1.1 christos const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
3418 1.1 christos #define FLD(f) abuf->fields.sfmt_add.f
3419 1.1 christos #define OPRND(f) par_exec->operands.sfmt_add.f
3420 1.1 christos int UNUSED written = abuf->written;
3421 1.1 christos IADDR UNUSED pc = abuf->addr;
3422 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
3423 1.1 christos
3424 1.1 christos * FLD (i_dr) = OPRND (dr);
3425 1.1 christos
3426 1.1 christos #undef OPRND
3427 1.1 christos #undef FLD
3428 1.1 christos }
3429 1.1 christos NEXT (vpc);
3430 1.1 christos
3431 1.1 christos CASE (sem, INSN_PAR_ADDI) : /* addi $dr,$simm8 */
3432 1.1 christos {
3433 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
3434 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3435 1.1 christos #define FLD(f) abuf->fields.sfmt_addi.f
3436 1.1 christos #define OPRND(f) par_exec->operands.sfmt_addi.f
3437 1.1 christos int UNUSED written = 0;
3438 1.1 christos IADDR UNUSED pc = abuf->addr;
3439 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
3440 1.1 christos
3441 1.1 christos {
3442 1.1 christos SI opval = ADDSI (* FLD (i_dr), FLD (f_simm8));
3443 1.1 christos OPRND (dr) = opval;
3444 1.1 christos TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
3445 1.1 christos }
3446 1.1 christos
3447 1.1 christos #undef OPRND
3448 1.1 christos #undef FLD
3449 1.1 christos }
3450 1.1 christos NEXT (vpc);
3451 1.1 christos
3452 1.1 christos CASE (sem, INSN_WRITE_ADDI) : /* addi $dr,$simm8 */
3453 1.1 christos {
3454 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
3455 1.1 christos const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
3456 1.1 christos #define FLD(f) abuf->fields.sfmt_addi.f
3457 1.1 christos #define OPRND(f) par_exec->operands.sfmt_addi.f
3458 1.1 christos int UNUSED written = abuf->written;
3459 1.1 christos IADDR UNUSED pc = abuf->addr;
3460 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
3461 1.1 christos
3462 1.1 christos * FLD (i_dr) = OPRND (dr);
3463 1.1 christos
3464 1.1 christos #undef OPRND
3465 1.1 christos #undef FLD
3466 1.1 christos }
3467 1.1 christos NEXT (vpc);
3468 1.1 christos
3469 1.1 christos CASE (sem, INSN_PAR_ADDV) : /* addv $dr,$sr */
3470 1.1 christos {
3471 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
3472 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3473 1.1 christos #define FLD(f) abuf->fields.sfmt_add.f
3474 1.1 christos #define OPRND(f) par_exec->operands.sfmt_addv.f
3475 1.1 christos int UNUSED written = 0;
3476 1.1 christos IADDR UNUSED pc = abuf->addr;
3477 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
3478 1.1 christos
3479 1.1 christos {
3480 1.1 christos SI temp0;BI temp1;
3481 1.1 christos temp0 = ADDSI (* FLD (i_dr), * FLD (i_sr));
3482 1.1 christos temp1 = ADDOFSI (* FLD (i_dr), * FLD (i_sr), 0);
3483 1.1 christos {
3484 1.1 christos SI opval = temp0;
3485 1.1 christos OPRND (dr) = opval;
3486 1.1 christos TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
3487 1.1 christos }
3488 1.1 christos {
3489 1.1 christos BI opval = temp1;
3490 1.1 christos OPRND (condbit) = opval;
3491 1.1 christos TRACE_RESULT (current_cpu, abuf, "cond", 'x', opval);
3492 1.1 christos }
3493 1.1 christos }
3494 1.1 christos
3495 1.1 christos #undef OPRND
3496 1.1 christos #undef FLD
3497 1.1 christos }
3498 1.1 christos NEXT (vpc);
3499 1.1 christos
3500 1.1 christos CASE (sem, INSN_WRITE_ADDV) : /* addv $dr,$sr */
3501 1.1 christos {
3502 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
3503 1.1 christos const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
3504 1.1 christos #define FLD(f) abuf->fields.sfmt_add.f
3505 1.1 christos #define OPRND(f) par_exec->operands.sfmt_addv.f
3506 1.1 christos int UNUSED written = abuf->written;
3507 1.1 christos IADDR UNUSED pc = abuf->addr;
3508 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
3509 1.1 christos
3510 1.1 christos CPU (h_cond) = OPRND (condbit);
3511 1.1 christos * FLD (i_dr) = OPRND (dr);
3512 1.1 christos
3513 1.1 christos #undef OPRND
3514 1.1 christos #undef FLD
3515 1.1 christos }
3516 1.1 christos NEXT (vpc);
3517 1.1 christos
3518 1.1 christos CASE (sem, INSN_PAR_ADDX) : /* addx $dr,$sr */
3519 1.1 christos {
3520 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
3521 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3522 1.1 christos #define FLD(f) abuf->fields.sfmt_add.f
3523 1.1 christos #define OPRND(f) par_exec->operands.sfmt_addx.f
3524 1.1 christos int UNUSED written = 0;
3525 1.1 christos IADDR UNUSED pc = abuf->addr;
3526 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
3527 1.1 christos
3528 1.1 christos {
3529 1.1 christos SI temp0;BI temp1;
3530 1.1 christos temp0 = ADDCSI (* FLD (i_dr), * FLD (i_sr), CPU (h_cond));
3531 1.1 christos temp1 = ADDCFSI (* FLD (i_dr), * FLD (i_sr), CPU (h_cond));
3532 1.1 christos {
3533 1.1 christos SI opval = temp0;
3534 1.1 christos OPRND (dr) = opval;
3535 1.1 christos TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
3536 1.1 christos }
3537 1.1 christos {
3538 1.1 christos BI opval = temp1;
3539 1.1 christos OPRND (condbit) = opval;
3540 1.1 christos TRACE_RESULT (current_cpu, abuf, "cond", 'x', opval);
3541 1.1 christos }
3542 1.1 christos }
3543 1.1 christos
3544 1.1 christos #undef OPRND
3545 1.1 christos #undef FLD
3546 1.1 christos }
3547 1.1 christos NEXT (vpc);
3548 1.1 christos
3549 1.1 christos CASE (sem, INSN_WRITE_ADDX) : /* addx $dr,$sr */
3550 1.1 christos {
3551 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
3552 1.1 christos const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
3553 1.1 christos #define FLD(f) abuf->fields.sfmt_add.f
3554 1.1 christos #define OPRND(f) par_exec->operands.sfmt_addx.f
3555 1.1 christos int UNUSED written = abuf->written;
3556 1.1 christos IADDR UNUSED pc = abuf->addr;
3557 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
3558 1.1 christos
3559 1.1 christos CPU (h_cond) = OPRND (condbit);
3560 1.1 christos * FLD (i_dr) = OPRND (dr);
3561 1.1 christos
3562 1.1 christos #undef OPRND
3563 1.1 christos #undef FLD
3564 1.1 christos }
3565 1.1 christos NEXT (vpc);
3566 1.1 christos
3567 1.1 christos CASE (sem, INSN_PAR_BC8) : /* bc.s $disp8 */
3568 1.1 christos {
3569 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
3570 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3571 1.1 christos #define FLD(f) abuf->fields.sfmt_bl8.f
3572 1.1 christos #define OPRND(f) par_exec->operands.sfmt_bc8.f
3573 1.1 christos int UNUSED written = 0;
3574 1.1 christos IADDR UNUSED pc = abuf->addr;
3575 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
3576 1.1 christos
3577 1.1 christos if (CPU (h_cond)) {
3578 1.1 christos {
3579 1.1 christos USI opval = FLD (i_disp8);
3580 1.1 christos OPRND (pc) = opval;
3581 1.1 christos written |= (1 << 2);
3582 1.1 christos TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
3583 1.1 christos }
3584 1.1 christos }
3585 1.1 christos
3586 1.1 christos abuf->written = written;
3587 1.1 christos #undef OPRND
3588 1.1 christos #undef FLD
3589 1.1 christos }
3590 1.1 christos NEXT (vpc);
3591 1.1 christos
3592 1.1 christos CASE (sem, INSN_WRITE_BC8) : /* bc.s $disp8 */
3593 1.1 christos {
3594 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
3595 1.1 christos const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
3596 1.1 christos #define FLD(f) abuf->fields.sfmt_bl8.f
3597 1.1 christos #define OPRND(f) par_exec->operands.sfmt_bc8.f
3598 1.1 christos int UNUSED written = abuf->written;
3599 1.1 christos IADDR UNUSED pc = abuf->addr;
3600 1.1 christos SEM_BRANCH_INIT
3601 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
3602 1.1 christos
3603 1.1 christos if (written & (1 << 2))
3604 1.1 christos {
3605 1.1 christos SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, OPRND (pc), vpc);
3606 1.1 christos }
3607 1.1 christos
3608 1.1 christos SEM_BRANCH_FINI (vpc);
3609 1.1 christos #undef OPRND
3610 1.1 christos #undef FLD
3611 1.1 christos }
3612 1.1 christos NEXT (vpc);
3613 1.1 christos
3614 1.1 christos CASE (sem, INSN_PAR_BL8) : /* bl.s $disp8 */
3615 1.1 christos {
3616 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
3617 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3618 1.1 christos #define FLD(f) abuf->fields.sfmt_bl8.f
3619 1.1 christos #define OPRND(f) par_exec->operands.sfmt_bl8.f
3620 1.1 christos int UNUSED written = 0;
3621 1.1 christos IADDR UNUSED pc = abuf->addr;
3622 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
3623 1.1 christos
3624 1.1 christos {
3625 1.1 christos {
3626 1.1 christos SI opval = ADDSI (ANDSI (pc, -4), 4);
3627 1.1 christos OPRND (h_gr_SI_14) = opval;
3628 1.1 christos TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
3629 1.1 christos }
3630 1.1 christos {
3631 1.1 christos USI opval = FLD (i_disp8);
3632 1.1 christos OPRND (pc) = opval;
3633 1.1 christos TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
3634 1.1 christos }
3635 1.1 christos }
3636 1.1 christos
3637 1.1 christos #undef OPRND
3638 1.1 christos #undef FLD
3639 1.1 christos }
3640 1.1 christos NEXT (vpc);
3641 1.1 christos
3642 1.1 christos CASE (sem, INSN_WRITE_BL8) : /* bl.s $disp8 */
3643 1.1 christos {
3644 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
3645 1.1 christos const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
3646 1.1 christos #define FLD(f) abuf->fields.sfmt_bl8.f
3647 1.1 christos #define OPRND(f) par_exec->operands.sfmt_bl8.f
3648 1.1 christos int UNUSED written = abuf->written;
3649 1.1 christos IADDR UNUSED pc = abuf->addr;
3650 1.1 christos SEM_BRANCH_INIT
3651 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
3652 1.1 christos
3653 1.1 christos CPU (h_gr[((UINT) 14)]) = OPRND (h_gr_SI_14);
3654 1.1 christos SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, OPRND (pc), vpc);
3655 1.1 christos
3656 1.1 christos SEM_BRANCH_FINI (vpc);
3657 1.1 christos #undef OPRND
3658 1.1 christos #undef FLD
3659 1.1 christos }
3660 1.1 christos NEXT (vpc);
3661 1.1 christos
3662 1.1 christos CASE (sem, INSN_PAR_BCL8) : /* bcl.s $disp8 */
3663 1.1 christos {
3664 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
3665 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3666 1.1 christos #define FLD(f) abuf->fields.sfmt_bl8.f
3667 1.1 christos #define OPRND(f) par_exec->operands.sfmt_bcl8.f
3668 1.1 christos int UNUSED written = 0;
3669 1.1 christos IADDR UNUSED pc = abuf->addr;
3670 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
3671 1.1 christos
3672 1.1 christos if (CPU (h_cond)) {
3673 1.1 christos {
3674 1.1 christos {
3675 1.1 christos SI opval = ADDSI (ANDSI (pc, -4), 4);
3676 1.1 christos OPRND (h_gr_SI_14) = opval;
3677 1.1 christos written |= (1 << 3);
3678 1.1 christos TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
3679 1.1 christos }
3680 1.1 christos {
3681 1.1 christos USI opval = FLD (i_disp8);
3682 1.1 christos OPRND (pc) = opval;
3683 1.1 christos written |= (1 << 4);
3684 1.1 christos TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
3685 1.1 christos }
3686 1.1 christos }
3687 1.1 christos }
3688 1.1 christos
3689 1.1 christos abuf->written = written;
3690 1.1 christos #undef OPRND
3691 1.1 christos #undef FLD
3692 1.1 christos }
3693 1.1 christos NEXT (vpc);
3694 1.1 christos
3695 1.1 christos CASE (sem, INSN_WRITE_BCL8) : /* bcl.s $disp8 */
3696 1.1 christos {
3697 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
3698 1.1 christos const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
3699 1.1 christos #define FLD(f) abuf->fields.sfmt_bl8.f
3700 1.1 christos #define OPRND(f) par_exec->operands.sfmt_bcl8.f
3701 1.1 christos int UNUSED written = abuf->written;
3702 1.1 christos IADDR UNUSED pc = abuf->addr;
3703 1.1 christos SEM_BRANCH_INIT
3704 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
3705 1.1 christos
3706 1.1 christos if (written & (1 << 3))
3707 1.1 christos {
3708 1.1 christos CPU (h_gr[((UINT) 14)]) = OPRND (h_gr_SI_14);
3709 1.1 christos }
3710 1.1 christos if (written & (1 << 4))
3711 1.1 christos {
3712 1.1 christos SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, OPRND (pc), vpc);
3713 1.1 christos }
3714 1.1 christos
3715 1.1 christos SEM_BRANCH_FINI (vpc);
3716 1.1 christos #undef OPRND
3717 1.1 christos #undef FLD
3718 1.1 christos }
3719 1.1 christos NEXT (vpc);
3720 1.1 christos
3721 1.1 christos CASE (sem, INSN_PAR_BNC8) : /* bnc.s $disp8 */
3722 1.1 christos {
3723 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
3724 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3725 1.1 christos #define FLD(f) abuf->fields.sfmt_bl8.f
3726 1.1 christos #define OPRND(f) par_exec->operands.sfmt_bc8.f
3727 1.1 christos int UNUSED written = 0;
3728 1.1 christos IADDR UNUSED pc = abuf->addr;
3729 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
3730 1.1 christos
3731 1.1 christos if (NOTBI (CPU (h_cond))) {
3732 1.1 christos {
3733 1.1 christos USI opval = FLD (i_disp8);
3734 1.1 christos OPRND (pc) = opval;
3735 1.1 christos written |= (1 << 2);
3736 1.1 christos TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
3737 1.1 christos }
3738 1.1 christos }
3739 1.1 christos
3740 1.1 christos abuf->written = written;
3741 1.1 christos #undef OPRND
3742 1.1 christos #undef FLD
3743 1.1 christos }
3744 1.1 christos NEXT (vpc);
3745 1.1 christos
3746 1.1 christos CASE (sem, INSN_WRITE_BNC8) : /* bnc.s $disp8 */
3747 1.1 christos {
3748 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
3749 1.1 christos const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
3750 1.1 christos #define FLD(f) abuf->fields.sfmt_bl8.f
3751 1.1 christos #define OPRND(f) par_exec->operands.sfmt_bc8.f
3752 1.1 christos int UNUSED written = abuf->written;
3753 1.1 christos IADDR UNUSED pc = abuf->addr;
3754 1.1 christos SEM_BRANCH_INIT
3755 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
3756 1.1 christos
3757 1.1 christos if (written & (1 << 2))
3758 1.1 christos {
3759 1.1 christos SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, OPRND (pc), vpc);
3760 1.1 christos }
3761 1.1 christos
3762 1.1 christos SEM_BRANCH_FINI (vpc);
3763 1.1 christos #undef OPRND
3764 1.1 christos #undef FLD
3765 1.1 christos }
3766 1.1 christos NEXT (vpc);
3767 1.1 christos
3768 1.1 christos CASE (sem, INSN_PAR_BRA8) : /* bra.s $disp8 */
3769 1.1 christos {
3770 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
3771 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3772 1.1 christos #define FLD(f) abuf->fields.sfmt_bl8.f
3773 1.1 christos #define OPRND(f) par_exec->operands.sfmt_bra8.f
3774 1.1 christos int UNUSED written = 0;
3775 1.1 christos IADDR UNUSED pc = abuf->addr;
3776 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
3777 1.1 christos
3778 1.1 christos {
3779 1.1 christos USI opval = FLD (i_disp8);
3780 1.1 christos OPRND (pc) = opval;
3781 1.1 christos TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
3782 1.1 christos }
3783 1.1 christos
3784 1.1 christos #undef OPRND
3785 1.1 christos #undef FLD
3786 1.1 christos }
3787 1.1 christos NEXT (vpc);
3788 1.1 christos
3789 1.1 christos CASE (sem, INSN_WRITE_BRA8) : /* bra.s $disp8 */
3790 1.1 christos {
3791 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
3792 1.1 christos const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
3793 1.1 christos #define FLD(f) abuf->fields.sfmt_bl8.f
3794 1.1 christos #define OPRND(f) par_exec->operands.sfmt_bra8.f
3795 1.1 christos int UNUSED written = abuf->written;
3796 1.1 christos IADDR UNUSED pc = abuf->addr;
3797 1.1 christos SEM_BRANCH_INIT
3798 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
3799 1.1 christos
3800 1.1 christos SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, OPRND (pc), vpc);
3801 1.1 christos
3802 1.1 christos SEM_BRANCH_FINI (vpc);
3803 1.1 christos #undef OPRND
3804 1.1 christos #undef FLD
3805 1.1 christos }
3806 1.1 christos NEXT (vpc);
3807 1.1 christos
3808 1.1 christos CASE (sem, INSN_PAR_BNCL8) : /* bncl.s $disp8 */
3809 1.1 christos {
3810 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
3811 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3812 1.1 christos #define FLD(f) abuf->fields.sfmt_bl8.f
3813 1.1 christos #define OPRND(f) par_exec->operands.sfmt_bcl8.f
3814 1.1 christos int UNUSED written = 0;
3815 1.1 christos IADDR UNUSED pc = abuf->addr;
3816 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
3817 1.1 christos
3818 1.1 christos if (NOTBI (CPU (h_cond))) {
3819 1.1 christos {
3820 1.1 christos {
3821 1.1 christos SI opval = ADDSI (ANDSI (pc, -4), 4);
3822 1.1 christos OPRND (h_gr_SI_14) = opval;
3823 1.1 christos written |= (1 << 3);
3824 1.1 christos TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
3825 1.1 christos }
3826 1.1 christos {
3827 1.1 christos USI opval = FLD (i_disp8);
3828 1.1 christos OPRND (pc) = opval;
3829 1.1 christos written |= (1 << 4);
3830 1.1 christos TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
3831 1.1 christos }
3832 1.1 christos }
3833 1.1 christos }
3834 1.1 christos
3835 1.1 christos abuf->written = written;
3836 1.1 christos #undef OPRND
3837 1.1 christos #undef FLD
3838 1.1 christos }
3839 1.1 christos NEXT (vpc);
3840 1.1 christos
3841 1.1 christos CASE (sem, INSN_WRITE_BNCL8) : /* bncl.s $disp8 */
3842 1.1 christos {
3843 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
3844 1.1 christos const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
3845 1.1 christos #define FLD(f) abuf->fields.sfmt_bl8.f
3846 1.1 christos #define OPRND(f) par_exec->operands.sfmt_bcl8.f
3847 1.1 christos int UNUSED written = abuf->written;
3848 1.1 christos IADDR UNUSED pc = abuf->addr;
3849 1.1 christos SEM_BRANCH_INIT
3850 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
3851 1.1 christos
3852 1.1 christos if (written & (1 << 3))
3853 1.1 christos {
3854 1.1 christos CPU (h_gr[((UINT) 14)]) = OPRND (h_gr_SI_14);
3855 1.1 christos }
3856 1.1 christos if (written & (1 << 4))
3857 1.1 christos {
3858 1.1 christos SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, OPRND (pc), vpc);
3859 1.1 christos }
3860 1.1 christos
3861 1.1 christos SEM_BRANCH_FINI (vpc);
3862 1.1 christos #undef OPRND
3863 1.1 christos #undef FLD
3864 1.1 christos }
3865 1.1 christos NEXT (vpc);
3866 1.1 christos
3867 1.1 christos CASE (sem, INSN_PAR_CMP) : /* cmp $src1,$src2 */
3868 1.1 christos {
3869 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
3870 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3871 1.1 christos #define FLD(f) abuf->fields.sfmt_st_plus.f
3872 1.1 christos #define OPRND(f) par_exec->operands.sfmt_cmp.f
3873 1.1 christos int UNUSED written = 0;
3874 1.1 christos IADDR UNUSED pc = abuf->addr;
3875 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
3876 1.1 christos
3877 1.1 christos {
3878 1.1 christos BI opval = LTSI (* FLD (i_src1), * FLD (i_src2));
3879 1.1 christos OPRND (condbit) = opval;
3880 1.1 christos TRACE_RESULT (current_cpu, abuf, "cond", 'x', opval);
3881 1.1 christos }
3882 1.1 christos
3883 1.1 christos #undef OPRND
3884 1.1 christos #undef FLD
3885 1.1 christos }
3886 1.1 christos NEXT (vpc);
3887 1.1 christos
3888 1.1 christos CASE (sem, INSN_WRITE_CMP) : /* cmp $src1,$src2 */
3889 1.1 christos {
3890 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
3891 1.1 christos const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
3892 1.1 christos #define FLD(f) abuf->fields.sfmt_st_plus.f
3893 1.1 christos #define OPRND(f) par_exec->operands.sfmt_cmp.f
3894 1.1 christos int UNUSED written = abuf->written;
3895 1.1 christos IADDR UNUSED pc = abuf->addr;
3896 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
3897 1.1 christos
3898 1.1 christos CPU (h_cond) = OPRND (condbit);
3899 1.1 christos
3900 1.1 christos #undef OPRND
3901 1.1 christos #undef FLD
3902 1.1 christos }
3903 1.1 christos NEXT (vpc);
3904 1.1 christos
3905 1.1 christos CASE (sem, INSN_PAR_CMPU) : /* cmpu $src1,$src2 */
3906 1.1 christos {
3907 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
3908 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3909 1.1 christos #define FLD(f) abuf->fields.sfmt_st_plus.f
3910 1.1 christos #define OPRND(f) par_exec->operands.sfmt_cmp.f
3911 1.1 christos int UNUSED written = 0;
3912 1.1 christos IADDR UNUSED pc = abuf->addr;
3913 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
3914 1.1 christos
3915 1.1 christos {
3916 1.1 christos BI opval = LTUSI (* FLD (i_src1), * FLD (i_src2));
3917 1.1 christos OPRND (condbit) = opval;
3918 1.1 christos TRACE_RESULT (current_cpu, abuf, "cond", 'x', opval);
3919 1.1 christos }
3920 1.1 christos
3921 1.1 christos #undef OPRND
3922 1.1 christos #undef FLD
3923 1.1 christos }
3924 1.1 christos NEXT (vpc);
3925 1.1 christos
3926 1.1 christos CASE (sem, INSN_WRITE_CMPU) : /* cmpu $src1,$src2 */
3927 1.1 christos {
3928 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
3929 1.1 christos const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
3930 1.1 christos #define FLD(f) abuf->fields.sfmt_st_plus.f
3931 1.1 christos #define OPRND(f) par_exec->operands.sfmt_cmp.f
3932 1.1 christos int UNUSED written = abuf->written;
3933 1.1 christos IADDR UNUSED pc = abuf->addr;
3934 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
3935 1.1 christos
3936 1.1 christos CPU (h_cond) = OPRND (condbit);
3937 1.1 christos
3938 1.1 christos #undef OPRND
3939 1.1 christos #undef FLD
3940 1.1 christos }
3941 1.1 christos NEXT (vpc);
3942 1.1 christos
3943 1.1 christos CASE (sem, INSN_PAR_CMPEQ) : /* cmpeq $src1,$src2 */
3944 1.1 christos {
3945 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
3946 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3947 1.1 christos #define FLD(f) abuf->fields.sfmt_st_plus.f
3948 1.1 christos #define OPRND(f) par_exec->operands.sfmt_cmp.f
3949 1.1 christos int UNUSED written = 0;
3950 1.1 christos IADDR UNUSED pc = abuf->addr;
3951 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
3952 1.1 christos
3953 1.1 christos {
3954 1.1 christos BI opval = EQSI (* FLD (i_src1), * FLD (i_src2));
3955 1.1 christos OPRND (condbit) = opval;
3956 1.1 christos TRACE_RESULT (current_cpu, abuf, "cond", 'x', opval);
3957 1.1 christos }
3958 1.1 christos
3959 1.1 christos #undef OPRND
3960 1.1 christos #undef FLD
3961 1.1 christos }
3962 1.1 christos NEXT (vpc);
3963 1.1 christos
3964 1.1 christos CASE (sem, INSN_WRITE_CMPEQ) : /* cmpeq $src1,$src2 */
3965 1.1 christos {
3966 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
3967 1.1 christos const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
3968 1.1 christos #define FLD(f) abuf->fields.sfmt_st_plus.f
3969 1.1 christos #define OPRND(f) par_exec->operands.sfmt_cmp.f
3970 1.1 christos int UNUSED written = abuf->written;
3971 1.1 christos IADDR UNUSED pc = abuf->addr;
3972 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
3973 1.1 christos
3974 1.1 christos CPU (h_cond) = OPRND (condbit);
3975 1.1 christos
3976 1.1 christos #undef OPRND
3977 1.1 christos #undef FLD
3978 1.1 christos }
3979 1.1 christos NEXT (vpc);
3980 1.1 christos
3981 1.1 christos CASE (sem, INSN_PAR_CMPZ) : /* cmpz $src2 */
3982 1.1 christos {
3983 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
3984 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3985 1.1 christos #define FLD(f) abuf->fields.sfmt_st_plus.f
3986 1.1 christos #define OPRND(f) par_exec->operands.sfmt_cmpz.f
3987 1.1 christos int UNUSED written = 0;
3988 1.1 christos IADDR UNUSED pc = abuf->addr;
3989 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
3990 1.1 christos
3991 1.1 christos {
3992 1.1 christos BI opval = EQSI (* FLD (i_src2), 0);
3993 1.1 christos OPRND (condbit) = opval;
3994 1.1 christos TRACE_RESULT (current_cpu, abuf, "cond", 'x', opval);
3995 1.1 christos }
3996 1.1 christos
3997 1.1 christos #undef OPRND
3998 1.1 christos #undef FLD
3999 1.1 christos }
4000 1.1 christos NEXT (vpc);
4001 1.1 christos
4002 1.1 christos CASE (sem, INSN_WRITE_CMPZ) : /* cmpz $src2 */
4003 1.1 christos {
4004 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
4005 1.1 christos const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
4006 1.1 christos #define FLD(f) abuf->fields.sfmt_st_plus.f
4007 1.1 christos #define OPRND(f) par_exec->operands.sfmt_cmpz.f
4008 1.1 christos int UNUSED written = abuf->written;
4009 1.1 christos IADDR UNUSED pc = abuf->addr;
4010 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
4011 1.1 christos
4012 1.1 christos CPU (h_cond) = OPRND (condbit);
4013 1.1 christos
4014 1.1 christos #undef OPRND
4015 1.1 christos #undef FLD
4016 1.1 christos }
4017 1.1 christos NEXT (vpc);
4018 1.1 christos
4019 1.1 christos CASE (sem, INSN_PAR_JC) : /* jc $sr */
4020 1.1 christos {
4021 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
4022 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4023 1.1 christos #define FLD(f) abuf->fields.sfmt_jl.f
4024 1.1 christos #define OPRND(f) par_exec->operands.sfmt_jc.f
4025 1.1 christos int UNUSED written = 0;
4026 1.1 christos IADDR UNUSED pc = abuf->addr;
4027 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
4028 1.1 christos
4029 1.1 christos if (CPU (h_cond)) {
4030 1.1 christos {
4031 1.1 christos USI opval = ANDSI (* FLD (i_sr), -4);
4032 1.1 christos OPRND (pc) = opval;
4033 1.1 christos written |= (1 << 2);
4034 1.1 christos TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
4035 1.1 christos }
4036 1.1 christos }
4037 1.1 christos
4038 1.1 christos abuf->written = written;
4039 1.1 christos #undef OPRND
4040 1.1 christos #undef FLD
4041 1.1 christos }
4042 1.1 christos NEXT (vpc);
4043 1.1 christos
4044 1.1 christos CASE (sem, INSN_WRITE_JC) : /* jc $sr */
4045 1.1 christos {
4046 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
4047 1.1 christos const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
4048 1.1 christos #define FLD(f) abuf->fields.sfmt_jl.f
4049 1.1 christos #define OPRND(f) par_exec->operands.sfmt_jc.f
4050 1.1 christos int UNUSED written = abuf->written;
4051 1.1 christos IADDR UNUSED pc = abuf->addr;
4052 1.1 christos SEM_BRANCH_INIT
4053 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
4054 1.1 christos
4055 1.1 christos if (written & (1 << 2))
4056 1.1 christos {
4057 1.1 christos SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, OPRND (pc), vpc);
4058 1.1 christos }
4059 1.1 christos
4060 1.1 christos SEM_BRANCH_FINI (vpc);
4061 1.1 christos #undef OPRND
4062 1.1 christos #undef FLD
4063 1.1 christos }
4064 1.1 christos NEXT (vpc);
4065 1.1 christos
4066 1.1 christos CASE (sem, INSN_PAR_JNC) : /* jnc $sr */
4067 1.1 christos {
4068 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
4069 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4070 1.1 christos #define FLD(f) abuf->fields.sfmt_jl.f
4071 1.1 christos #define OPRND(f) par_exec->operands.sfmt_jc.f
4072 1.1 christos int UNUSED written = 0;
4073 1.1 christos IADDR UNUSED pc = abuf->addr;
4074 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
4075 1.1 christos
4076 1.1 christos if (NOTBI (CPU (h_cond))) {
4077 1.1 christos {
4078 1.1 christos USI opval = ANDSI (* FLD (i_sr), -4);
4079 1.1 christos OPRND (pc) = opval;
4080 1.1 christos written |= (1 << 2);
4081 1.1 christos TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
4082 1.1 christos }
4083 1.1 christos }
4084 1.1 christos
4085 1.1 christos abuf->written = written;
4086 1.1 christos #undef OPRND
4087 1.1 christos #undef FLD
4088 1.1 christos }
4089 1.1 christos NEXT (vpc);
4090 1.1 christos
4091 1.1 christos CASE (sem, INSN_WRITE_JNC) : /* jnc $sr */
4092 1.1 christos {
4093 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
4094 1.1 christos const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
4095 1.1 christos #define FLD(f) abuf->fields.sfmt_jl.f
4096 1.1 christos #define OPRND(f) par_exec->operands.sfmt_jc.f
4097 1.1 christos int UNUSED written = abuf->written;
4098 1.1 christos IADDR UNUSED pc = abuf->addr;
4099 1.1 christos SEM_BRANCH_INIT
4100 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
4101 1.1 christos
4102 1.1 christos if (written & (1 << 2))
4103 1.1 christos {
4104 1.1 christos SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, OPRND (pc), vpc);
4105 1.1 christos }
4106 1.1 christos
4107 1.1 christos SEM_BRANCH_FINI (vpc);
4108 1.1 christos #undef OPRND
4109 1.1 christos #undef FLD
4110 1.1 christos }
4111 1.1 christos NEXT (vpc);
4112 1.1 christos
4113 1.1 christos CASE (sem, INSN_PAR_JL) : /* jl $sr */
4114 1.1 christos {
4115 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
4116 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4117 1.1 christos #define FLD(f) abuf->fields.sfmt_jl.f
4118 1.1 christos #define OPRND(f) par_exec->operands.sfmt_jl.f
4119 1.1 christos int UNUSED written = 0;
4120 1.1 christos IADDR UNUSED pc = abuf->addr;
4121 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
4122 1.1 christos
4123 1.1 christos {
4124 1.1 christos SI temp0;USI temp1;
4125 1.1 christos temp0 = ADDSI (ANDSI (pc, -4), 4);
4126 1.1 christos temp1 = ANDSI (* FLD (i_sr), -4);
4127 1.1 christos {
4128 1.1 christos SI opval = temp0;
4129 1.1 christos OPRND (h_gr_SI_14) = opval;
4130 1.1 christos TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
4131 1.1 christos }
4132 1.1 christos {
4133 1.1 christos USI opval = temp1;
4134 1.1 christos OPRND (pc) = opval;
4135 1.1 christos TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
4136 1.1 christos }
4137 1.1 christos }
4138 1.1 christos
4139 1.1 christos #undef OPRND
4140 1.1 christos #undef FLD
4141 1.1 christos }
4142 1.1 christos NEXT (vpc);
4143 1.1 christos
4144 1.1 christos CASE (sem, INSN_WRITE_JL) : /* jl $sr */
4145 1.1 christos {
4146 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
4147 1.1 christos const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
4148 1.1 christos #define FLD(f) abuf->fields.sfmt_jl.f
4149 1.1 christos #define OPRND(f) par_exec->operands.sfmt_jl.f
4150 1.1 christos int UNUSED written = abuf->written;
4151 1.1 christos IADDR UNUSED pc = abuf->addr;
4152 1.1 christos SEM_BRANCH_INIT
4153 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
4154 1.1 christos
4155 1.1 christos CPU (h_gr[((UINT) 14)]) = OPRND (h_gr_SI_14);
4156 1.1 christos SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, OPRND (pc), vpc);
4157 1.1 christos
4158 1.1 christos SEM_BRANCH_FINI (vpc);
4159 1.1 christos #undef OPRND
4160 1.1 christos #undef FLD
4161 1.1 christos }
4162 1.1 christos NEXT (vpc);
4163 1.1 christos
4164 1.1 christos CASE (sem, INSN_PAR_JMP) : /* jmp $sr */
4165 1.1 christos {
4166 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
4167 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4168 1.1 christos #define FLD(f) abuf->fields.sfmt_jl.f
4169 1.1 christos #define OPRND(f) par_exec->operands.sfmt_jmp.f
4170 1.1 christos int UNUSED written = 0;
4171 1.1 christos IADDR UNUSED pc = abuf->addr;
4172 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
4173 1.1 christos
4174 1.1 christos {
4175 1.1 christos USI opval = ANDSI (* FLD (i_sr), -4);
4176 1.1 christos OPRND (pc) = opval;
4177 1.1 christos TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
4178 1.1 christos }
4179 1.1 christos
4180 1.1 christos #undef OPRND
4181 1.1 christos #undef FLD
4182 1.1 christos }
4183 1.1 christos NEXT (vpc);
4184 1.1 christos
4185 1.1 christos CASE (sem, INSN_WRITE_JMP) : /* jmp $sr */
4186 1.1 christos {
4187 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
4188 1.1 christos const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
4189 1.1 christos #define FLD(f) abuf->fields.sfmt_jl.f
4190 1.1 christos #define OPRND(f) par_exec->operands.sfmt_jmp.f
4191 1.1 christos int UNUSED written = abuf->written;
4192 1.1 christos IADDR UNUSED pc = abuf->addr;
4193 1.1 christos SEM_BRANCH_INIT
4194 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
4195 1.1 christos
4196 1.1 christos SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, OPRND (pc), vpc);
4197 1.1 christos
4198 1.1 christos SEM_BRANCH_FINI (vpc);
4199 1.1 christos #undef OPRND
4200 1.1 christos #undef FLD
4201 1.1 christos }
4202 1.1 christos NEXT (vpc);
4203 1.1 christos
4204 1.1 christos CASE (sem, INSN_PAR_LD) : /* ld $dr,@$sr */
4205 1.1 christos {
4206 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
4207 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4208 1.1 christos #define FLD(f) abuf->fields.sfmt_ld_plus.f
4209 1.1 christos #define OPRND(f) par_exec->operands.sfmt_ld.f
4210 1.1 christos int UNUSED written = 0;
4211 1.1 christos IADDR UNUSED pc = abuf->addr;
4212 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
4213 1.1 christos
4214 1.1 christos {
4215 1.1 christos SI opval = GETMEMSI (current_cpu, pc, * FLD (i_sr));
4216 1.1 christos OPRND (dr) = opval;
4217 1.1 christos TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
4218 1.1 christos }
4219 1.1 christos
4220 1.1 christos #undef OPRND
4221 1.1 christos #undef FLD
4222 1.1 christos }
4223 1.1 christos NEXT (vpc);
4224 1.1 christos
4225 1.1 christos CASE (sem, INSN_WRITE_LD) : /* ld $dr,@$sr */
4226 1.1 christos {
4227 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
4228 1.1 christos const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
4229 1.1 christos #define FLD(f) abuf->fields.sfmt_ld_plus.f
4230 1.1 christos #define OPRND(f) par_exec->operands.sfmt_ld.f
4231 1.1 christos int UNUSED written = abuf->written;
4232 1.1 christos IADDR UNUSED pc = abuf->addr;
4233 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
4234 1.1 christos
4235 1.1 christos * FLD (i_dr) = OPRND (dr);
4236 1.1 christos
4237 1.1 christos #undef OPRND
4238 1.1 christos #undef FLD
4239 1.1 christos }
4240 1.1 christos NEXT (vpc);
4241 1.1 christos
4242 1.1 christos CASE (sem, INSN_PAR_LDB) : /* ldb $dr,@$sr */
4243 1.1 christos {
4244 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
4245 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4246 1.1 christos #define FLD(f) abuf->fields.sfmt_ld_plus.f
4247 1.1 christos #define OPRND(f) par_exec->operands.sfmt_ldb.f
4248 1.1 christos int UNUSED written = 0;
4249 1.1 christos IADDR UNUSED pc = abuf->addr;
4250 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
4251 1.1 christos
4252 1.1 christos {
4253 1.1 christos SI opval = EXTQISI (GETMEMQI (current_cpu, pc, * FLD (i_sr)));
4254 1.1 christos OPRND (dr) = opval;
4255 1.1 christos TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
4256 1.1 christos }
4257 1.1 christos
4258 1.1 christos #undef OPRND
4259 1.1 christos #undef FLD
4260 1.1 christos }
4261 1.1 christos NEXT (vpc);
4262 1.1 christos
4263 1.1 christos CASE (sem, INSN_WRITE_LDB) : /* ldb $dr,@$sr */
4264 1.1 christos {
4265 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
4266 1.1 christos const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
4267 1.1 christos #define FLD(f) abuf->fields.sfmt_ld_plus.f
4268 1.1 christos #define OPRND(f) par_exec->operands.sfmt_ldb.f
4269 1.1 christos int UNUSED written = abuf->written;
4270 1.1 christos IADDR UNUSED pc = abuf->addr;
4271 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
4272 1.1 christos
4273 1.1 christos * FLD (i_dr) = OPRND (dr);
4274 1.1 christos
4275 1.1 christos #undef OPRND
4276 1.1 christos #undef FLD
4277 1.1 christos }
4278 1.1 christos NEXT (vpc);
4279 1.1 christos
4280 1.1 christos CASE (sem, INSN_PAR_LDH) : /* ldh $dr,@$sr */
4281 1.1 christos {
4282 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
4283 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4284 1.1 christos #define FLD(f) abuf->fields.sfmt_ld_plus.f
4285 1.1 christos #define OPRND(f) par_exec->operands.sfmt_ldh.f
4286 1.1 christos int UNUSED written = 0;
4287 1.1 christos IADDR UNUSED pc = abuf->addr;
4288 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
4289 1.1 christos
4290 1.1 christos {
4291 1.1 christos SI opval = EXTHISI (GETMEMHI (current_cpu, pc, * FLD (i_sr)));
4292 1.1 christos OPRND (dr) = opval;
4293 1.1 christos TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
4294 1.1 christos }
4295 1.1 christos
4296 1.1 christos #undef OPRND
4297 1.1 christos #undef FLD
4298 1.1 christos }
4299 1.1 christos NEXT (vpc);
4300 1.1 christos
4301 1.1 christos CASE (sem, INSN_WRITE_LDH) : /* ldh $dr,@$sr */
4302 1.1 christos {
4303 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
4304 1.1 christos const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
4305 1.1 christos #define FLD(f) abuf->fields.sfmt_ld_plus.f
4306 1.1 christos #define OPRND(f) par_exec->operands.sfmt_ldh.f
4307 1.1 christos int UNUSED written = abuf->written;
4308 1.1 christos IADDR UNUSED pc = abuf->addr;
4309 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
4310 1.1 christos
4311 1.1 christos * FLD (i_dr) = OPRND (dr);
4312 1.1 christos
4313 1.1 christos #undef OPRND
4314 1.1 christos #undef FLD
4315 1.1 christos }
4316 1.1 christos NEXT (vpc);
4317 1.1 christos
4318 1.1 christos CASE (sem, INSN_PAR_LDUB) : /* ldub $dr,@$sr */
4319 1.1 christos {
4320 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
4321 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4322 1.1 christos #define FLD(f) abuf->fields.sfmt_ld_plus.f
4323 1.1 christos #define OPRND(f) par_exec->operands.sfmt_ldb.f
4324 1.1 christos int UNUSED written = 0;
4325 1.1 christos IADDR UNUSED pc = abuf->addr;
4326 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
4327 1.1 christos
4328 1.1 christos {
4329 1.1 christos SI opval = ZEXTQISI (GETMEMQI (current_cpu, pc, * FLD (i_sr)));
4330 1.1 christos OPRND (dr) = opval;
4331 1.1 christos TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
4332 1.1 christos }
4333 1.1 christos
4334 1.1 christos #undef OPRND
4335 1.1 christos #undef FLD
4336 1.1 christos }
4337 1.1 christos NEXT (vpc);
4338 1.1 christos
4339 1.1 christos CASE (sem, INSN_WRITE_LDUB) : /* ldub $dr,@$sr */
4340 1.1 christos {
4341 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
4342 1.1 christos const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
4343 1.1 christos #define FLD(f) abuf->fields.sfmt_ld_plus.f
4344 1.1 christos #define OPRND(f) par_exec->operands.sfmt_ldb.f
4345 1.1 christos int UNUSED written = abuf->written;
4346 1.1 christos IADDR UNUSED pc = abuf->addr;
4347 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
4348 1.1 christos
4349 1.1 christos * FLD (i_dr) = OPRND (dr);
4350 1.1 christos
4351 1.1 christos #undef OPRND
4352 1.1 christos #undef FLD
4353 1.1 christos }
4354 1.1 christos NEXT (vpc);
4355 1.1 christos
4356 1.1 christos CASE (sem, INSN_PAR_LDUH) : /* lduh $dr,@$sr */
4357 1.1 christos {
4358 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
4359 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4360 1.1 christos #define FLD(f) abuf->fields.sfmt_ld_plus.f
4361 1.1 christos #define OPRND(f) par_exec->operands.sfmt_ldh.f
4362 1.1 christos int UNUSED written = 0;
4363 1.1 christos IADDR UNUSED pc = abuf->addr;
4364 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
4365 1.1 christos
4366 1.1 christos {
4367 1.1 christos SI opval = ZEXTHISI (GETMEMHI (current_cpu, pc, * FLD (i_sr)));
4368 1.1 christos OPRND (dr) = opval;
4369 1.1 christos TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
4370 1.1 christos }
4371 1.1 christos
4372 1.1 christos #undef OPRND
4373 1.1 christos #undef FLD
4374 1.1 christos }
4375 1.1 christos NEXT (vpc);
4376 1.1 christos
4377 1.1 christos CASE (sem, INSN_WRITE_LDUH) : /* lduh $dr,@$sr */
4378 1.1 christos {
4379 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
4380 1.1 christos const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
4381 1.1 christos #define FLD(f) abuf->fields.sfmt_ld_plus.f
4382 1.1 christos #define OPRND(f) par_exec->operands.sfmt_ldh.f
4383 1.1 christos int UNUSED written = abuf->written;
4384 1.1 christos IADDR UNUSED pc = abuf->addr;
4385 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
4386 1.1 christos
4387 1.1 christos * FLD (i_dr) = OPRND (dr);
4388 1.1 christos
4389 1.1 christos #undef OPRND
4390 1.1 christos #undef FLD
4391 1.1 christos }
4392 1.1 christos NEXT (vpc);
4393 1.1 christos
4394 1.1 christos CASE (sem, INSN_PAR_LD_PLUS) : /* ld $dr,@$sr+ */
4395 1.1 christos {
4396 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
4397 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4398 1.1 christos #define FLD(f) abuf->fields.sfmt_ld_plus.f
4399 1.1 christos #define OPRND(f) par_exec->operands.sfmt_ld_plus.f
4400 1.1 christos int UNUSED written = 0;
4401 1.1 christos IADDR UNUSED pc = abuf->addr;
4402 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
4403 1.1 christos
4404 1.1 christos {
4405 1.1 christos SI temp0;SI temp1;
4406 1.1 christos temp0 = GETMEMSI (current_cpu, pc, * FLD (i_sr));
4407 1.1 christos temp1 = ADDSI (* FLD (i_sr), 4);
4408 1.1 christos {
4409 1.1 christos SI opval = temp0;
4410 1.1 christos OPRND (dr) = opval;
4411 1.1 christos TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
4412 1.1 christos }
4413 1.1 christos {
4414 1.1 christos SI opval = temp1;
4415 1.1 christos OPRND (sr) = opval;
4416 1.1 christos TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
4417 1.1 christos }
4418 1.1 christos }
4419 1.1 christos
4420 1.1 christos #undef OPRND
4421 1.1 christos #undef FLD
4422 1.1 christos }
4423 1.1 christos NEXT (vpc);
4424 1.1 christos
4425 1.1 christos CASE (sem, INSN_WRITE_LD_PLUS) : /* ld $dr,@$sr+ */
4426 1.1 christos {
4427 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
4428 1.1 christos const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
4429 1.1 christos #define FLD(f) abuf->fields.sfmt_ld_plus.f
4430 1.1 christos #define OPRND(f) par_exec->operands.sfmt_ld_plus.f
4431 1.1 christos int UNUSED written = abuf->written;
4432 1.1 christos IADDR UNUSED pc = abuf->addr;
4433 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
4434 1.1 christos
4435 1.1 christos * FLD (i_dr) = OPRND (dr);
4436 1.1 christos * FLD (i_sr) = OPRND (sr);
4437 1.1 christos
4438 1.1 christos #undef OPRND
4439 1.1 christos #undef FLD
4440 1.1 christos }
4441 1.1 christos NEXT (vpc);
4442 1.1 christos
4443 1.1 christos CASE (sem, INSN_PAR_LDI8) : /* ldi8 $dr,$simm8 */
4444 1.1 christos {
4445 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
4446 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4447 1.1 christos #define FLD(f) abuf->fields.sfmt_addi.f
4448 1.1 christos #define OPRND(f) par_exec->operands.sfmt_ldi8.f
4449 1.1 christos int UNUSED written = 0;
4450 1.1 christos IADDR UNUSED pc = abuf->addr;
4451 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
4452 1.1 christos
4453 1.1 christos {
4454 1.1 christos SI opval = FLD (f_simm8);
4455 1.1 christos OPRND (dr) = opval;
4456 1.1 christos TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
4457 1.1 christos }
4458 1.1 christos
4459 1.1 christos #undef OPRND
4460 1.1 christos #undef FLD
4461 1.1 christos }
4462 1.1 christos NEXT (vpc);
4463 1.1 christos
4464 1.1 christos CASE (sem, INSN_WRITE_LDI8) : /* ldi8 $dr,$simm8 */
4465 1.1 christos {
4466 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
4467 1.1 christos const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
4468 1.1 christos #define FLD(f) abuf->fields.sfmt_addi.f
4469 1.1 christos #define OPRND(f) par_exec->operands.sfmt_ldi8.f
4470 1.1 christos int UNUSED written = abuf->written;
4471 1.1 christos IADDR UNUSED pc = abuf->addr;
4472 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
4473 1.1 christos
4474 1.1 christos * FLD (i_dr) = OPRND (dr);
4475 1.1 christos
4476 1.1 christos #undef OPRND
4477 1.1 christos #undef FLD
4478 1.1 christos }
4479 1.1 christos NEXT (vpc);
4480 1.1 christos
4481 1.1 christos CASE (sem, INSN_PAR_LOCK) : /* lock $dr,@$sr */
4482 1.1 christos {
4483 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
4484 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4485 1.1 christos #define FLD(f) abuf->fields.sfmt_ld_plus.f
4486 1.1 christos #define OPRND(f) par_exec->operands.sfmt_lock.f
4487 1.1 christos int UNUSED written = 0;
4488 1.1 christos IADDR UNUSED pc = abuf->addr;
4489 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
4490 1.1 christos
4491 1.1 christos {
4492 1.1 christos {
4493 1.1 christos BI opval = 1;
4494 1.1 christos OPRND (h_lock_BI) = opval;
4495 1.1 christos TRACE_RESULT (current_cpu, abuf, "lock", 'x', opval);
4496 1.1 christos }
4497 1.1 christos {
4498 1.1 christos SI opval = GETMEMSI (current_cpu, pc, * FLD (i_sr));
4499 1.1 christos OPRND (dr) = opval;
4500 1.1 christos TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
4501 1.1 christos }
4502 1.1 christos }
4503 1.1 christos
4504 1.1 christos #undef OPRND
4505 1.1 christos #undef FLD
4506 1.1 christos }
4507 1.1 christos NEXT (vpc);
4508 1.1 christos
4509 1.1 christos CASE (sem, INSN_WRITE_LOCK) : /* lock $dr,@$sr */
4510 1.1 christos {
4511 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
4512 1.1 christos const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
4513 1.1 christos #define FLD(f) abuf->fields.sfmt_ld_plus.f
4514 1.1 christos #define OPRND(f) par_exec->operands.sfmt_lock.f
4515 1.1 christos int UNUSED written = abuf->written;
4516 1.1 christos IADDR UNUSED pc = abuf->addr;
4517 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
4518 1.1 christos
4519 1.1 christos * FLD (i_dr) = OPRND (dr);
4520 1.1 christos CPU (h_lock) = OPRND (h_lock_BI);
4521 1.1 christos
4522 1.1 christos #undef OPRND
4523 1.1 christos #undef FLD
4524 1.1 christos }
4525 1.1 christos NEXT (vpc);
4526 1.1 christos
4527 1.1 christos CASE (sem, INSN_PAR_MACHI_A) : /* machi $src1,$src2,$acc */
4528 1.1 christos {
4529 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
4530 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4531 1.1 christos #define FLD(f) abuf->fields.sfmt_machi_a.f
4532 1.1 christos #define OPRND(f) par_exec->operands.sfmt_machi_a.f
4533 1.1 christos int UNUSED written = 0;
4534 1.1 christos IADDR UNUSED pc = abuf->addr;
4535 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
4536 1.1 christos
4537 1.1 christos {
4538 1.1 christos DI opval = SRADI (SLLDI (ADDDI (GET_H_ACCUMS (FLD (f_acc)), MULDI (EXTSIDI (ANDSI (* FLD (i_src1), 0xffff0000)), EXTHIDI (TRUNCSIHI (SRASI (* FLD (i_src2), 16))))), 8), 8);
4539 1.1 christos OPRND (acc) = opval;
4540 1.1 christos TRACE_RESULT (current_cpu, abuf, "accums", 'D', opval);
4541 1.1 christos }
4542 1.1 christos
4543 1.1 christos #undef OPRND
4544 1.1 christos #undef FLD
4545 1.1 christos }
4546 1.1 christos NEXT (vpc);
4547 1.1 christos
4548 1.1 christos CASE (sem, INSN_WRITE_MACHI_A) : /* machi $src1,$src2,$acc */
4549 1.1 christos {
4550 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
4551 1.1 christos const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
4552 1.1 christos #define FLD(f) abuf->fields.sfmt_machi_a.f
4553 1.1 christos #define OPRND(f) par_exec->operands.sfmt_machi_a.f
4554 1.1 christos int UNUSED written = abuf->written;
4555 1.1 christos IADDR UNUSED pc = abuf->addr;
4556 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
4557 1.1 christos
4558 1.1 christos SET_H_ACCUMS (FLD (f_acc), OPRND (acc));
4559 1.1 christos
4560 1.1 christos #undef OPRND
4561 1.1 christos #undef FLD
4562 1.1 christos }
4563 1.1 christos NEXT (vpc);
4564 1.1 christos
4565 1.1 christos CASE (sem, INSN_PAR_MACLO_A) : /* maclo $src1,$src2,$acc */
4566 1.1 christos {
4567 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
4568 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4569 1.1 christos #define FLD(f) abuf->fields.sfmt_machi_a.f
4570 1.1 christos #define OPRND(f) par_exec->operands.sfmt_machi_a.f
4571 1.1 christos int UNUSED written = 0;
4572 1.1 christos IADDR UNUSED pc = abuf->addr;
4573 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
4574 1.1 christos
4575 1.1 christos {
4576 1.1 christos DI opval = SRADI (SLLDI (ADDDI (GET_H_ACCUMS (FLD (f_acc)), MULDI (EXTSIDI (SLLSI (* FLD (i_src1), 16)), EXTHIDI (TRUNCSIHI (* FLD (i_src2))))), 8), 8);
4577 1.1 christos OPRND (acc) = opval;
4578 1.1 christos TRACE_RESULT (current_cpu, abuf, "accums", 'D', opval);
4579 1.1 christos }
4580 1.1 christos
4581 1.1 christos #undef OPRND
4582 1.1 christos #undef FLD
4583 1.1 christos }
4584 1.1 christos NEXT (vpc);
4585 1.1 christos
4586 1.1 christos CASE (sem, INSN_WRITE_MACLO_A) : /* maclo $src1,$src2,$acc */
4587 1.1 christos {
4588 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
4589 1.1 christos const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
4590 1.1 christos #define FLD(f) abuf->fields.sfmt_machi_a.f
4591 1.1 christos #define OPRND(f) par_exec->operands.sfmt_machi_a.f
4592 1.1 christos int UNUSED written = abuf->written;
4593 1.1 christos IADDR UNUSED pc = abuf->addr;
4594 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
4595 1.1 christos
4596 1.1 christos SET_H_ACCUMS (FLD (f_acc), OPRND (acc));
4597 1.1 christos
4598 1.1 christos #undef OPRND
4599 1.1 christos #undef FLD
4600 1.1 christos }
4601 1.1 christos NEXT (vpc);
4602 1.1 christos
4603 1.1 christos CASE (sem, INSN_PAR_MACWHI_A) : /* macwhi $src1,$src2,$acc */
4604 1.1 christos {
4605 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
4606 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4607 1.1 christos #define FLD(f) abuf->fields.sfmt_machi_a.f
4608 1.1 christos #define OPRND(f) par_exec->operands.sfmt_machi_a.f
4609 1.1 christos int UNUSED written = 0;
4610 1.1 christos IADDR UNUSED pc = abuf->addr;
4611 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
4612 1.1 christos
4613 1.1 christos {
4614 1.1 christos DI opval = ADDDI (GET_H_ACCUMS (FLD (f_acc)), MULDI (EXTSIDI (* FLD (i_src1)), EXTHIDI (TRUNCSIHI (SRASI (* FLD (i_src2), 16)))));
4615 1.1 christos OPRND (acc) = opval;
4616 1.1 christos TRACE_RESULT (current_cpu, abuf, "accums", 'D', opval);
4617 1.1 christos }
4618 1.1 christos
4619 1.1 christos #undef OPRND
4620 1.1 christos #undef FLD
4621 1.1 christos }
4622 1.1 christos NEXT (vpc);
4623 1.1 christos
4624 1.1 christos CASE (sem, INSN_WRITE_MACWHI_A) : /* macwhi $src1,$src2,$acc */
4625 1.1 christos {
4626 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
4627 1.1 christos const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
4628 1.1 christos #define FLD(f) abuf->fields.sfmt_machi_a.f
4629 1.1 christos #define OPRND(f) par_exec->operands.sfmt_machi_a.f
4630 1.1 christos int UNUSED written = abuf->written;
4631 1.1 christos IADDR UNUSED pc = abuf->addr;
4632 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
4633 1.1 christos
4634 1.1 christos SET_H_ACCUMS (FLD (f_acc), OPRND (acc));
4635 1.1 christos
4636 1.1 christos #undef OPRND
4637 1.1 christos #undef FLD
4638 1.1 christos }
4639 1.1 christos NEXT (vpc);
4640 1.1 christos
4641 1.1 christos CASE (sem, INSN_PAR_MACWLO_A) : /* macwlo $src1,$src2,$acc */
4642 1.1 christos {
4643 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
4644 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4645 1.1 christos #define FLD(f) abuf->fields.sfmt_machi_a.f
4646 1.1 christos #define OPRND(f) par_exec->operands.sfmt_machi_a.f
4647 1.1 christos int UNUSED written = 0;
4648 1.1 christos IADDR UNUSED pc = abuf->addr;
4649 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
4650 1.1 christos
4651 1.1 christos {
4652 1.1 christos DI opval = ADDDI (GET_H_ACCUMS (FLD (f_acc)), MULDI (EXTSIDI (* FLD (i_src1)), EXTHIDI (TRUNCSIHI (* FLD (i_src2)))));
4653 1.1 christos OPRND (acc) = opval;
4654 1.1 christos TRACE_RESULT (current_cpu, abuf, "accums", 'D', opval);
4655 1.1 christos }
4656 1.1 christos
4657 1.1 christos #undef OPRND
4658 1.1 christos #undef FLD
4659 1.1 christos }
4660 1.1 christos NEXT (vpc);
4661 1.1 christos
4662 1.1 christos CASE (sem, INSN_WRITE_MACWLO_A) : /* macwlo $src1,$src2,$acc */
4663 1.1 christos {
4664 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
4665 1.1 christos const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
4666 1.1 christos #define FLD(f) abuf->fields.sfmt_machi_a.f
4667 1.1 christos #define OPRND(f) par_exec->operands.sfmt_machi_a.f
4668 1.1 christos int UNUSED written = abuf->written;
4669 1.1 christos IADDR UNUSED pc = abuf->addr;
4670 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
4671 1.1 christos
4672 1.1 christos SET_H_ACCUMS (FLD (f_acc), OPRND (acc));
4673 1.1 christos
4674 1.1 christos #undef OPRND
4675 1.1 christos #undef FLD
4676 1.1 christos }
4677 1.1 christos NEXT (vpc);
4678 1.1 christos
4679 1.1 christos CASE (sem, INSN_PAR_MUL) : /* mul $dr,$sr */
4680 1.1 christos {
4681 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
4682 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4683 1.1 christos #define FLD(f) abuf->fields.sfmt_add.f
4684 1.1 christos #define OPRND(f) par_exec->operands.sfmt_add.f
4685 1.1 christos int UNUSED written = 0;
4686 1.1 christos IADDR UNUSED pc = abuf->addr;
4687 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
4688 1.1 christos
4689 1.1 christos {
4690 1.1 christos SI opval = MULSI (* FLD (i_dr), * FLD (i_sr));
4691 1.1 christos OPRND (dr) = opval;
4692 1.1 christos TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
4693 1.1 christos }
4694 1.1 christos
4695 1.1 christos #undef OPRND
4696 1.1 christos #undef FLD
4697 1.1 christos }
4698 1.1 christos NEXT (vpc);
4699 1.1 christos
4700 1.1 christos CASE (sem, INSN_WRITE_MUL) : /* mul $dr,$sr */
4701 1.1 christos {
4702 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
4703 1.1 christos const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
4704 1.1 christos #define FLD(f) abuf->fields.sfmt_add.f
4705 1.1 christos #define OPRND(f) par_exec->operands.sfmt_add.f
4706 1.1 christos int UNUSED written = abuf->written;
4707 1.1 christos IADDR UNUSED pc = abuf->addr;
4708 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
4709 1.1 christos
4710 1.1 christos * FLD (i_dr) = OPRND (dr);
4711 1.1 christos
4712 1.1 christos #undef OPRND
4713 1.1 christos #undef FLD
4714 1.1 christos }
4715 1.1 christos NEXT (vpc);
4716 1.1 christos
4717 1.1 christos CASE (sem, INSN_PAR_MULHI_A) : /* mulhi $src1,$src2,$acc */
4718 1.1 christos {
4719 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
4720 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4721 1.1 christos #define FLD(f) abuf->fields.sfmt_machi_a.f
4722 1.1 christos #define OPRND(f) par_exec->operands.sfmt_mulhi_a.f
4723 1.1 christos int UNUSED written = 0;
4724 1.1 christos IADDR UNUSED pc = abuf->addr;
4725 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
4726 1.1 christos
4727 1.1 christos {
4728 1.1 christos DI opval = SRADI (SLLDI (MULDI (EXTSIDI (ANDSI (* FLD (i_src1), 0xffff0000)), EXTHIDI (TRUNCSIHI (SRASI (* FLD (i_src2), 16)))), 16), 16);
4729 1.1 christos OPRND (acc) = opval;
4730 1.1 christos TRACE_RESULT (current_cpu, abuf, "accums", 'D', opval);
4731 1.1 christos }
4732 1.1 christos
4733 1.1 christos #undef OPRND
4734 1.1 christos #undef FLD
4735 1.1 christos }
4736 1.1 christos NEXT (vpc);
4737 1.1 christos
4738 1.1 christos CASE (sem, INSN_WRITE_MULHI_A) : /* mulhi $src1,$src2,$acc */
4739 1.1 christos {
4740 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
4741 1.1 christos const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
4742 1.1 christos #define FLD(f) abuf->fields.sfmt_machi_a.f
4743 1.1 christos #define OPRND(f) par_exec->operands.sfmt_mulhi_a.f
4744 1.1 christos int UNUSED written = abuf->written;
4745 1.1 christos IADDR UNUSED pc = abuf->addr;
4746 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
4747 1.1 christos
4748 1.1 christos SET_H_ACCUMS (FLD (f_acc), OPRND (acc));
4749 1.1 christos
4750 1.1 christos #undef OPRND
4751 1.1 christos #undef FLD
4752 1.1 christos }
4753 1.1 christos NEXT (vpc);
4754 1.1 christos
4755 1.1 christos CASE (sem, INSN_PAR_MULLO_A) : /* mullo $src1,$src2,$acc */
4756 1.1 christos {
4757 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
4758 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4759 1.1 christos #define FLD(f) abuf->fields.sfmt_machi_a.f
4760 1.1 christos #define OPRND(f) par_exec->operands.sfmt_mulhi_a.f
4761 1.1 christos int UNUSED written = 0;
4762 1.1 christos IADDR UNUSED pc = abuf->addr;
4763 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
4764 1.1 christos
4765 1.1 christos {
4766 1.1 christos DI opval = SRADI (SLLDI (MULDI (EXTSIDI (SLLSI (* FLD (i_src1), 16)), EXTHIDI (TRUNCSIHI (* FLD (i_src2)))), 16), 16);
4767 1.1 christos OPRND (acc) = opval;
4768 1.1 christos TRACE_RESULT (current_cpu, abuf, "accums", 'D', opval);
4769 1.1 christos }
4770 1.1 christos
4771 1.1 christos #undef OPRND
4772 1.1 christos #undef FLD
4773 1.1 christos }
4774 1.1 christos NEXT (vpc);
4775 1.1 christos
4776 1.1 christos CASE (sem, INSN_WRITE_MULLO_A) : /* mullo $src1,$src2,$acc */
4777 1.1 christos {
4778 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
4779 1.1 christos const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
4780 1.1 christos #define FLD(f) abuf->fields.sfmt_machi_a.f
4781 1.1 christos #define OPRND(f) par_exec->operands.sfmt_mulhi_a.f
4782 1.1 christos int UNUSED written = abuf->written;
4783 1.1 christos IADDR UNUSED pc = abuf->addr;
4784 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
4785 1.1 christos
4786 1.1 christos SET_H_ACCUMS (FLD (f_acc), OPRND (acc));
4787 1.1 christos
4788 1.1 christos #undef OPRND
4789 1.1 christos #undef FLD
4790 1.1 christos }
4791 1.1 christos NEXT (vpc);
4792 1.1 christos
4793 1.1 christos CASE (sem, INSN_PAR_MULWHI_A) : /* mulwhi $src1,$src2,$acc */
4794 1.1 christos {
4795 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
4796 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4797 1.1 christos #define FLD(f) abuf->fields.sfmt_machi_a.f
4798 1.1 christos #define OPRND(f) par_exec->operands.sfmt_mulhi_a.f
4799 1.1 christos int UNUSED written = 0;
4800 1.1 christos IADDR UNUSED pc = abuf->addr;
4801 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
4802 1.1 christos
4803 1.1 christos {
4804 1.1 christos DI opval = MULDI (EXTSIDI (* FLD (i_src1)), EXTHIDI (TRUNCSIHI (SRASI (* FLD (i_src2), 16))));
4805 1.1 christos OPRND (acc) = opval;
4806 1.1 christos TRACE_RESULT (current_cpu, abuf, "accums", 'D', opval);
4807 1.1 christos }
4808 1.1 christos
4809 1.1 christos #undef OPRND
4810 1.1 christos #undef FLD
4811 1.1 christos }
4812 1.1 christos NEXT (vpc);
4813 1.1 christos
4814 1.1 christos CASE (sem, INSN_WRITE_MULWHI_A) : /* mulwhi $src1,$src2,$acc */
4815 1.1 christos {
4816 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
4817 1.1 christos const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
4818 1.1 christos #define FLD(f) abuf->fields.sfmt_machi_a.f
4819 1.1 christos #define OPRND(f) par_exec->operands.sfmt_mulhi_a.f
4820 1.1 christos int UNUSED written = abuf->written;
4821 1.1 christos IADDR UNUSED pc = abuf->addr;
4822 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
4823 1.1 christos
4824 1.1 christos SET_H_ACCUMS (FLD (f_acc), OPRND (acc));
4825 1.1 christos
4826 1.1 christos #undef OPRND
4827 1.1 christos #undef FLD
4828 1.1 christos }
4829 1.1 christos NEXT (vpc);
4830 1.1 christos
4831 1.1 christos CASE (sem, INSN_PAR_MULWLO_A) : /* mulwlo $src1,$src2,$acc */
4832 1.1 christos {
4833 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
4834 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4835 1.1 christos #define FLD(f) abuf->fields.sfmt_machi_a.f
4836 1.1 christos #define OPRND(f) par_exec->operands.sfmt_mulhi_a.f
4837 1.1 christos int UNUSED written = 0;
4838 1.1 christos IADDR UNUSED pc = abuf->addr;
4839 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
4840 1.1 christos
4841 1.1 christos {
4842 1.1 christos DI opval = MULDI (EXTSIDI (* FLD (i_src1)), EXTHIDI (TRUNCSIHI (* FLD (i_src2))));
4843 1.1 christos OPRND (acc) = opval;
4844 1.1 christos TRACE_RESULT (current_cpu, abuf, "accums", 'D', opval);
4845 1.1 christos }
4846 1.1 christos
4847 1.1 christos #undef OPRND
4848 1.1 christos #undef FLD
4849 1.1 christos }
4850 1.1 christos NEXT (vpc);
4851 1.1 christos
4852 1.1 christos CASE (sem, INSN_WRITE_MULWLO_A) : /* mulwlo $src1,$src2,$acc */
4853 1.1 christos {
4854 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
4855 1.1 christos const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
4856 1.1 christos #define FLD(f) abuf->fields.sfmt_machi_a.f
4857 1.1 christos #define OPRND(f) par_exec->operands.sfmt_mulhi_a.f
4858 1.1 christos int UNUSED written = abuf->written;
4859 1.1 christos IADDR UNUSED pc = abuf->addr;
4860 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
4861 1.1 christos
4862 1.1 christos SET_H_ACCUMS (FLD (f_acc), OPRND (acc));
4863 1.1 christos
4864 1.1 christos #undef OPRND
4865 1.1 christos #undef FLD
4866 1.1 christos }
4867 1.1 christos NEXT (vpc);
4868 1.1 christos
4869 1.1 christos CASE (sem, INSN_PAR_MV) : /* mv $dr,$sr */
4870 1.1 christos {
4871 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
4872 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4873 1.1 christos #define FLD(f) abuf->fields.sfmt_ld_plus.f
4874 1.1 christos #define OPRND(f) par_exec->operands.sfmt_mv.f
4875 1.1 christos int UNUSED written = 0;
4876 1.1 christos IADDR UNUSED pc = abuf->addr;
4877 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
4878 1.1 christos
4879 1.1 christos {
4880 1.1 christos SI opval = * FLD (i_sr);
4881 1.1 christos OPRND (dr) = opval;
4882 1.1 christos TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
4883 1.1 christos }
4884 1.1 christos
4885 1.1 christos #undef OPRND
4886 1.1 christos #undef FLD
4887 1.1 christos }
4888 1.1 christos NEXT (vpc);
4889 1.1 christos
4890 1.1 christos CASE (sem, INSN_WRITE_MV) : /* mv $dr,$sr */
4891 1.1 christos {
4892 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
4893 1.1 christos const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
4894 1.1 christos #define FLD(f) abuf->fields.sfmt_ld_plus.f
4895 1.1 christos #define OPRND(f) par_exec->operands.sfmt_mv.f
4896 1.1 christos int UNUSED written = abuf->written;
4897 1.1 christos IADDR UNUSED pc = abuf->addr;
4898 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
4899 1.1 christos
4900 1.1 christos * FLD (i_dr) = OPRND (dr);
4901 1.1 christos
4902 1.1 christos #undef OPRND
4903 1.1 christos #undef FLD
4904 1.1 christos }
4905 1.1 christos NEXT (vpc);
4906 1.1 christos
4907 1.1 christos CASE (sem, INSN_PAR_MVFACHI_A) : /* mvfachi $dr,$accs */
4908 1.1 christos {
4909 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
4910 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4911 1.1 christos #define FLD(f) abuf->fields.sfmt_mvfachi_a.f
4912 1.1 christos #define OPRND(f) par_exec->operands.sfmt_mvfachi_a.f
4913 1.1 christos int UNUSED written = 0;
4914 1.1 christos IADDR UNUSED pc = abuf->addr;
4915 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
4916 1.1 christos
4917 1.1 christos {
4918 1.1 christos SI opval = TRUNCDISI (SRADI (GET_H_ACCUMS (FLD (f_accs)), 32));
4919 1.1 christos OPRND (dr) = opval;
4920 1.1 christos TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
4921 1.1 christos }
4922 1.1 christos
4923 1.1 christos #undef OPRND
4924 1.1 christos #undef FLD
4925 1.1 christos }
4926 1.1 christos NEXT (vpc);
4927 1.1 christos
4928 1.1 christos CASE (sem, INSN_WRITE_MVFACHI_A) : /* mvfachi $dr,$accs */
4929 1.1 christos {
4930 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
4931 1.1 christos const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
4932 1.1 christos #define FLD(f) abuf->fields.sfmt_mvfachi_a.f
4933 1.1 christos #define OPRND(f) par_exec->operands.sfmt_mvfachi_a.f
4934 1.1 christos int UNUSED written = abuf->written;
4935 1.1 christos IADDR UNUSED pc = abuf->addr;
4936 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
4937 1.1 christos
4938 1.1 christos * FLD (i_dr) = OPRND (dr);
4939 1.1 christos
4940 1.1 christos #undef OPRND
4941 1.1 christos #undef FLD
4942 1.1 christos }
4943 1.1 christos NEXT (vpc);
4944 1.1 christos
4945 1.1 christos CASE (sem, INSN_PAR_MVFACLO_A) : /* mvfaclo $dr,$accs */
4946 1.1 christos {
4947 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
4948 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4949 1.1 christos #define FLD(f) abuf->fields.sfmt_mvfachi_a.f
4950 1.1 christos #define OPRND(f) par_exec->operands.sfmt_mvfachi_a.f
4951 1.1 christos int UNUSED written = 0;
4952 1.1 christos IADDR UNUSED pc = abuf->addr;
4953 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
4954 1.1 christos
4955 1.1 christos {
4956 1.1 christos SI opval = TRUNCDISI (GET_H_ACCUMS (FLD (f_accs)));
4957 1.1 christos OPRND (dr) = opval;
4958 1.1 christos TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
4959 1.1 christos }
4960 1.1 christos
4961 1.1 christos #undef OPRND
4962 1.1 christos #undef FLD
4963 1.1 christos }
4964 1.1 christos NEXT (vpc);
4965 1.1 christos
4966 1.1 christos CASE (sem, INSN_WRITE_MVFACLO_A) : /* mvfaclo $dr,$accs */
4967 1.1 christos {
4968 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
4969 1.1 christos const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
4970 1.1 christos #define FLD(f) abuf->fields.sfmt_mvfachi_a.f
4971 1.1 christos #define OPRND(f) par_exec->operands.sfmt_mvfachi_a.f
4972 1.1 christos int UNUSED written = abuf->written;
4973 1.1 christos IADDR UNUSED pc = abuf->addr;
4974 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
4975 1.1 christos
4976 1.1 christos * FLD (i_dr) = OPRND (dr);
4977 1.1 christos
4978 1.1 christos #undef OPRND
4979 1.1 christos #undef FLD
4980 1.1 christos }
4981 1.1 christos NEXT (vpc);
4982 1.1 christos
4983 1.1 christos CASE (sem, INSN_PAR_MVFACMI_A) : /* mvfacmi $dr,$accs */
4984 1.1 christos {
4985 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
4986 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4987 1.1 christos #define FLD(f) abuf->fields.sfmt_mvfachi_a.f
4988 1.1 christos #define OPRND(f) par_exec->operands.sfmt_mvfachi_a.f
4989 1.1 christos int UNUSED written = 0;
4990 1.1 christos IADDR UNUSED pc = abuf->addr;
4991 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
4992 1.1 christos
4993 1.1 christos {
4994 1.1 christos SI opval = TRUNCDISI (SRADI (GET_H_ACCUMS (FLD (f_accs)), 16));
4995 1.1 christos OPRND (dr) = opval;
4996 1.1 christos TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
4997 1.1 christos }
4998 1.1 christos
4999 1.1 christos #undef OPRND
5000 1.1 christos #undef FLD
5001 1.1 christos }
5002 1.1 christos NEXT (vpc);
5003 1.1 christos
5004 1.1 christos CASE (sem, INSN_WRITE_MVFACMI_A) : /* mvfacmi $dr,$accs */
5005 1.1 christos {
5006 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
5007 1.1 christos const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
5008 1.1 christos #define FLD(f) abuf->fields.sfmt_mvfachi_a.f
5009 1.1 christos #define OPRND(f) par_exec->operands.sfmt_mvfachi_a.f
5010 1.1 christos int UNUSED written = abuf->written;
5011 1.1 christos IADDR UNUSED pc = abuf->addr;
5012 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
5013 1.1 christos
5014 1.1 christos * FLD (i_dr) = OPRND (dr);
5015 1.1 christos
5016 1.1 christos #undef OPRND
5017 1.1 christos #undef FLD
5018 1.1 christos }
5019 1.1 christos NEXT (vpc);
5020 1.1 christos
5021 1.1 christos CASE (sem, INSN_PAR_MVFC) : /* mvfc $dr,$scr */
5022 1.1 christos {
5023 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
5024 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
5025 1.1 christos #define FLD(f) abuf->fields.sfmt_ld_plus.f
5026 1.1 christos #define OPRND(f) par_exec->operands.sfmt_mvfc.f
5027 1.1 christos int UNUSED written = 0;
5028 1.1 christos IADDR UNUSED pc = abuf->addr;
5029 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
5030 1.1 christos
5031 1.1 christos {
5032 1.1 christos SI opval = GET_H_CR (FLD (f_r2));
5033 1.1 christos OPRND (dr) = opval;
5034 1.1 christos TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
5035 1.1 christos }
5036 1.1 christos
5037 1.1 christos #undef OPRND
5038 1.1 christos #undef FLD
5039 1.1 christos }
5040 1.1 christos NEXT (vpc);
5041 1.1 christos
5042 1.1 christos CASE (sem, INSN_WRITE_MVFC) : /* mvfc $dr,$scr */
5043 1.1 christos {
5044 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
5045 1.1 christos const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
5046 1.1 christos #define FLD(f) abuf->fields.sfmt_ld_plus.f
5047 1.1 christos #define OPRND(f) par_exec->operands.sfmt_mvfc.f
5048 1.1 christos int UNUSED written = abuf->written;
5049 1.1 christos IADDR UNUSED pc = abuf->addr;
5050 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
5051 1.1 christos
5052 1.1 christos * FLD (i_dr) = OPRND (dr);
5053 1.1 christos
5054 1.1 christos #undef OPRND
5055 1.1 christos #undef FLD
5056 1.1 christos }
5057 1.1 christos NEXT (vpc);
5058 1.1 christos
5059 1.1 christos CASE (sem, INSN_PAR_MVTACHI_A) : /* mvtachi $src1,$accs */
5060 1.1 christos {
5061 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
5062 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
5063 1.1 christos #define FLD(f) abuf->fields.sfmt_mvtachi_a.f
5064 1.1 christos #define OPRND(f) par_exec->operands.sfmt_mvtachi_a.f
5065 1.1 christos int UNUSED written = 0;
5066 1.1 christos IADDR UNUSED pc = abuf->addr;
5067 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
5068 1.1 christos
5069 1.1 christos {
5070 1.1 christos DI opval = ORDI (ANDDI (GET_H_ACCUMS (FLD (f_accs)), MAKEDI (0, 0xffffffff)), SLLDI (EXTSIDI (* FLD (i_src1)), 32));
5071 1.1 christos OPRND (accs) = opval;
5072 1.1 christos TRACE_RESULT (current_cpu, abuf, "accums", 'D', opval);
5073 1.1 christos }
5074 1.1 christos
5075 1.1 christos #undef OPRND
5076 1.1 christos #undef FLD
5077 1.1 christos }
5078 1.1 christos NEXT (vpc);
5079 1.1 christos
5080 1.1 christos CASE (sem, INSN_WRITE_MVTACHI_A) : /* mvtachi $src1,$accs */
5081 1.1 christos {
5082 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
5083 1.1 christos const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
5084 1.1 christos #define FLD(f) abuf->fields.sfmt_mvtachi_a.f
5085 1.1 christos #define OPRND(f) par_exec->operands.sfmt_mvtachi_a.f
5086 1.1 christos int UNUSED written = abuf->written;
5087 1.1 christos IADDR UNUSED pc = abuf->addr;
5088 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
5089 1.1 christos
5090 1.1 christos SET_H_ACCUMS (FLD (f_accs), OPRND (accs));
5091 1.1 christos
5092 1.1 christos #undef OPRND
5093 1.1 christos #undef FLD
5094 1.1 christos }
5095 1.1 christos NEXT (vpc);
5096 1.1 christos
5097 1.1 christos CASE (sem, INSN_PAR_MVTACLO_A) : /* mvtaclo $src1,$accs */
5098 1.1 christos {
5099 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
5100 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
5101 1.1 christos #define FLD(f) abuf->fields.sfmt_mvtachi_a.f
5102 1.1 christos #define OPRND(f) par_exec->operands.sfmt_mvtachi_a.f
5103 1.1 christos int UNUSED written = 0;
5104 1.1 christos IADDR UNUSED pc = abuf->addr;
5105 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
5106 1.1 christos
5107 1.1 christos {
5108 1.1 christos DI opval = ORDI (ANDDI (GET_H_ACCUMS (FLD (f_accs)), MAKEDI (0xffffffff, 0)), ZEXTSIDI (* FLD (i_src1)));
5109 1.1 christos OPRND (accs) = opval;
5110 1.1 christos TRACE_RESULT (current_cpu, abuf, "accums", 'D', opval);
5111 1.1 christos }
5112 1.1 christos
5113 1.1 christos #undef OPRND
5114 1.1 christos #undef FLD
5115 1.1 christos }
5116 1.1 christos NEXT (vpc);
5117 1.1 christos
5118 1.1 christos CASE (sem, INSN_WRITE_MVTACLO_A) : /* mvtaclo $src1,$accs */
5119 1.1 christos {
5120 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
5121 1.1 christos const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
5122 1.1 christos #define FLD(f) abuf->fields.sfmt_mvtachi_a.f
5123 1.1 christos #define OPRND(f) par_exec->operands.sfmt_mvtachi_a.f
5124 1.1 christos int UNUSED written = abuf->written;
5125 1.1 christos IADDR UNUSED pc = abuf->addr;
5126 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
5127 1.1 christos
5128 1.1 christos SET_H_ACCUMS (FLD (f_accs), OPRND (accs));
5129 1.1 christos
5130 1.1 christos #undef OPRND
5131 1.1 christos #undef FLD
5132 1.1 christos }
5133 1.1 christos NEXT (vpc);
5134 1.1 christos
5135 1.1 christos CASE (sem, INSN_PAR_MVTC) : /* mvtc $sr,$dcr */
5136 1.1 christos {
5137 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
5138 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
5139 1.1 christos #define FLD(f) abuf->fields.sfmt_ld_plus.f
5140 1.1 christos #define OPRND(f) par_exec->operands.sfmt_mvtc.f
5141 1.1 christos int UNUSED written = 0;
5142 1.1 christos IADDR UNUSED pc = abuf->addr;
5143 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
5144 1.1 christos
5145 1.1 christos {
5146 1.1 christos USI opval = * FLD (i_sr);
5147 1.1 christos OPRND (dcr) = opval;
5148 1.1 christos TRACE_RESULT (current_cpu, abuf, "cr", 'x', opval);
5149 1.1 christos }
5150 1.1 christos
5151 1.1 christos #undef OPRND
5152 1.1 christos #undef FLD
5153 1.1 christos }
5154 1.1 christos NEXT (vpc);
5155 1.1 christos
5156 1.1 christos CASE (sem, INSN_WRITE_MVTC) : /* mvtc $sr,$dcr */
5157 1.1 christos {
5158 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
5159 1.1 christos const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
5160 1.1 christos #define FLD(f) abuf->fields.sfmt_ld_plus.f
5161 1.1 christos #define OPRND(f) par_exec->operands.sfmt_mvtc.f
5162 1.1 christos int UNUSED written = abuf->written;
5163 1.1 christos IADDR UNUSED pc = abuf->addr;
5164 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
5165 1.1 christos
5166 1.1 christos SET_H_CR (FLD (f_r1), OPRND (dcr));
5167 1.1 christos
5168 1.1 christos #undef OPRND
5169 1.1 christos #undef FLD
5170 1.1 christos }
5171 1.1 christos NEXT (vpc);
5172 1.1 christos
5173 1.1 christos CASE (sem, INSN_PAR_NEG) : /* neg $dr,$sr */
5174 1.1 christos {
5175 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
5176 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
5177 1.1 christos #define FLD(f) abuf->fields.sfmt_ld_plus.f
5178 1.1 christos #define OPRND(f) par_exec->operands.sfmt_mv.f
5179 1.1 christos int UNUSED written = 0;
5180 1.1 christos IADDR UNUSED pc = abuf->addr;
5181 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
5182 1.1 christos
5183 1.1 christos {
5184 1.1 christos SI opval = NEGSI (* FLD (i_sr));
5185 1.1 christos OPRND (dr) = opval;
5186 1.1 christos TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
5187 1.1 christos }
5188 1.1 christos
5189 1.1 christos #undef OPRND
5190 1.1 christos #undef FLD
5191 1.1 christos }
5192 1.1 christos NEXT (vpc);
5193 1.1 christos
5194 1.1 christos CASE (sem, INSN_WRITE_NEG) : /* neg $dr,$sr */
5195 1.1 christos {
5196 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
5197 1.1 christos const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
5198 1.1 christos #define FLD(f) abuf->fields.sfmt_ld_plus.f
5199 1.1 christos #define OPRND(f) par_exec->operands.sfmt_mv.f
5200 1.1 christos int UNUSED written = abuf->written;
5201 1.1 christos IADDR UNUSED pc = abuf->addr;
5202 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
5203 1.1 christos
5204 1.1 christos * FLD (i_dr) = OPRND (dr);
5205 1.1 christos
5206 1.1 christos #undef OPRND
5207 1.1 christos #undef FLD
5208 1.1 christos }
5209 1.1 christos NEXT (vpc);
5210 1.1 christos
5211 1.1 christos CASE (sem, INSN_PAR_NOP) : /* nop */
5212 1.1 christos {
5213 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
5214 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
5215 1.1 christos #define FLD(f) abuf->fields.sfmt_empty.f
5216 1.1 christos #define OPRND(f) par_exec->operands.sfmt_nop.f
5217 1.1 christos int UNUSED written = 0;
5218 1.1 christos IADDR UNUSED pc = abuf->addr;
5219 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
5220 1.1 christos
5221 1.1 christos PROFILE_COUNT_FILLNOPS (current_cpu, abuf->addr);
5222 1.1 christos
5223 1.1 christos #undef OPRND
5224 1.1 christos #undef FLD
5225 1.1 christos }
5226 1.1 christos NEXT (vpc);
5227 1.1 christos
5228 1.1 christos CASE (sem, INSN_WRITE_NOP) : /* nop */
5229 1.1 christos {
5230 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
5231 1.1 christos const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
5232 1.1 christos #define FLD(f) abuf->fields.sfmt_empty.f
5233 1.1 christos #define OPRND(f) par_exec->operands.sfmt_nop.f
5234 1.1 christos int UNUSED written = abuf->written;
5235 1.1 christos IADDR UNUSED pc = abuf->addr;
5236 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
5237 1.1 christos
5238 1.1 christos
5239 1.1 christos #undef OPRND
5240 1.1 christos #undef FLD
5241 1.1 christos }
5242 1.1 christos NEXT (vpc);
5243 1.1 christos
5244 1.1 christos CASE (sem, INSN_PAR_NOT) : /* not $dr,$sr */
5245 1.1 christos {
5246 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
5247 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
5248 1.1 christos #define FLD(f) abuf->fields.sfmt_ld_plus.f
5249 1.1 christos #define OPRND(f) par_exec->operands.sfmt_mv.f
5250 1.1 christos int UNUSED written = 0;
5251 1.1 christos IADDR UNUSED pc = abuf->addr;
5252 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
5253 1.1 christos
5254 1.1 christos {
5255 1.1 christos SI opval = INVSI (* FLD (i_sr));
5256 1.1 christos OPRND (dr) = opval;
5257 1.1 christos TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
5258 1.1 christos }
5259 1.1 christos
5260 1.1 christos #undef OPRND
5261 1.1 christos #undef FLD
5262 1.1 christos }
5263 1.1 christos NEXT (vpc);
5264 1.1 christos
5265 1.1 christos CASE (sem, INSN_WRITE_NOT) : /* not $dr,$sr */
5266 1.1 christos {
5267 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
5268 1.1 christos const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
5269 1.1 christos #define FLD(f) abuf->fields.sfmt_ld_plus.f
5270 1.1 christos #define OPRND(f) par_exec->operands.sfmt_mv.f
5271 1.1 christos int UNUSED written = abuf->written;
5272 1.1 christos IADDR UNUSED pc = abuf->addr;
5273 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
5274 1.1 christos
5275 1.1 christos * FLD (i_dr) = OPRND (dr);
5276 1.1 christos
5277 1.1 christos #undef OPRND
5278 1.1 christos #undef FLD
5279 1.1 christos }
5280 1.1 christos NEXT (vpc);
5281 1.1 christos
5282 1.1 christos CASE (sem, INSN_PAR_RAC_DSI) : /* rac $accd,$accs,$imm1 */
5283 1.1 christos {
5284 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
5285 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
5286 1.1 christos #define FLD(f) abuf->fields.sfmt_rac_dsi.f
5287 1.1 christos #define OPRND(f) par_exec->operands.sfmt_rac_dsi.f
5288 1.1 christos int UNUSED written = 0;
5289 1.1 christos IADDR UNUSED pc = abuf->addr;
5290 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
5291 1.1 christos
5292 1.1 christos {
5293 1.1 christos DI tmp_tmp1;
5294 1.1 christos tmp_tmp1 = SLLDI (GET_H_ACCUMS (FLD (f_accs)), FLD (f_imm1));
5295 1.1 christos tmp_tmp1 = ADDDI (tmp_tmp1, MAKEDI (0, 32768));
5296 1.1 christos {
5297 1.1 christos DI opval = (GTDI (tmp_tmp1, MAKEDI (32767, 0xffff0000))) ? (MAKEDI (32767, 0xffff0000)) : (LTDI (tmp_tmp1, MAKEDI (0xffff8000, 0))) ? (MAKEDI (0xffff8000, 0)) : (ANDDI (tmp_tmp1, MAKEDI (0xffffffff, 0xffff0000)));
5298 1.1 christos OPRND (accd) = opval;
5299 1.1 christos TRACE_RESULT (current_cpu, abuf, "accums", 'D', opval);
5300 1.1 christos }
5301 1.1 christos }
5302 1.1 christos
5303 1.1 christos #undef OPRND
5304 1.1 christos #undef FLD
5305 1.1 christos }
5306 1.1 christos NEXT (vpc);
5307 1.1 christos
5308 1.1 christos CASE (sem, INSN_WRITE_RAC_DSI) : /* rac $accd,$accs,$imm1 */
5309 1.1 christos {
5310 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
5311 1.1 christos const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
5312 1.1 christos #define FLD(f) abuf->fields.sfmt_rac_dsi.f
5313 1.1 christos #define OPRND(f) par_exec->operands.sfmt_rac_dsi.f
5314 1.1 christos int UNUSED written = abuf->written;
5315 1.1 christos IADDR UNUSED pc = abuf->addr;
5316 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
5317 1.1 christos
5318 1.1 christos SET_H_ACCUMS (FLD (f_accd), OPRND (accd));
5319 1.1 christos
5320 1.1 christos #undef OPRND
5321 1.1 christos #undef FLD
5322 1.1 christos }
5323 1.1 christos NEXT (vpc);
5324 1.1 christos
5325 1.1 christos CASE (sem, INSN_PAR_RACH_DSI) : /* rach $accd,$accs,$imm1 */
5326 1.1 christos {
5327 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
5328 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
5329 1.1 christos #define FLD(f) abuf->fields.sfmt_rac_dsi.f
5330 1.1 christos #define OPRND(f) par_exec->operands.sfmt_rac_dsi.f
5331 1.1 christos int UNUSED written = 0;
5332 1.1 christos IADDR UNUSED pc = abuf->addr;
5333 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
5334 1.1 christos
5335 1.1 christos {
5336 1.1 christos DI tmp_tmp1;
5337 1.1 christos tmp_tmp1 = SLLDI (GET_H_ACCUMS (FLD (f_accs)), FLD (f_imm1));
5338 1.1 christos tmp_tmp1 = ADDDI (tmp_tmp1, MAKEDI (0, 0x80000000));
5339 1.1 christos {
5340 1.1 christos DI opval = (GTDI (tmp_tmp1, MAKEDI (32767, 0))) ? (MAKEDI (32767, 0)) : (LTDI (tmp_tmp1, MAKEDI (0xffff8000, 0))) ? (MAKEDI (0xffff8000, 0)) : (ANDDI (tmp_tmp1, MAKEDI (0xffffffff, 0)));
5341 1.1 christos OPRND (accd) = opval;
5342 1.1 christos TRACE_RESULT (current_cpu, abuf, "accums", 'D', opval);
5343 1.1 christos }
5344 1.1 christos }
5345 1.1 christos
5346 1.1 christos #undef OPRND
5347 1.1 christos #undef FLD
5348 1.1 christos }
5349 1.1 christos NEXT (vpc);
5350 1.1 christos
5351 1.1 christos CASE (sem, INSN_WRITE_RACH_DSI) : /* rach $accd,$accs,$imm1 */
5352 1.1 christos {
5353 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
5354 1.1 christos const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
5355 1.1 christos #define FLD(f) abuf->fields.sfmt_rac_dsi.f
5356 1.1 christos #define OPRND(f) par_exec->operands.sfmt_rac_dsi.f
5357 1.1 christos int UNUSED written = abuf->written;
5358 1.1 christos IADDR UNUSED pc = abuf->addr;
5359 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
5360 1.1 christos
5361 1.1 christos SET_H_ACCUMS (FLD (f_accd), OPRND (accd));
5362 1.1 christos
5363 1.1 christos #undef OPRND
5364 1.1 christos #undef FLD
5365 1.1 christos }
5366 1.1 christos NEXT (vpc);
5367 1.1 christos
5368 1.1 christos CASE (sem, INSN_PAR_RTE) : /* rte */
5369 1.1 christos {
5370 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
5371 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
5372 1.1 christos #define FLD(f) abuf->fields.sfmt_empty.f
5373 1.1 christos #define OPRND(f) par_exec->operands.sfmt_rte.f
5374 1.1 christos int UNUSED written = 0;
5375 1.1 christos IADDR UNUSED pc = abuf->addr;
5376 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
5377 1.1 christos
5378 1.1 christos {
5379 1.1 christos {
5380 1.1 christos USI opval = ANDSI (GET_H_CR (((UINT) 6)), -4);
5381 1.1 christos OPRND (pc) = opval;
5382 1.1 christos TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
5383 1.1 christos }
5384 1.1 christos {
5385 1.1 christos USI opval = GET_H_CR (((UINT) 14));
5386 1.1 christos OPRND (h_cr_USI_6) = opval;
5387 1.1 christos TRACE_RESULT (current_cpu, abuf, "cr", 'x', opval);
5388 1.1 christos }
5389 1.1 christos {
5390 1.1 christos UQI opval = CPU (h_bpsw);
5391 1.1 christos OPRND (h_psw_UQI) = opval;
5392 1.1 christos TRACE_RESULT (current_cpu, abuf, "psw", 'x', opval);
5393 1.1 christos }
5394 1.1 christos {
5395 1.1 christos UQI opval = CPU (h_bbpsw);
5396 1.1 christos OPRND (h_bpsw_UQI) = opval;
5397 1.1 christos TRACE_RESULT (current_cpu, abuf, "bpsw", 'x', opval);
5398 1.1 christos }
5399 1.1 christos }
5400 1.1 christos
5401 1.1 christos #undef OPRND
5402 1.1 christos #undef FLD
5403 1.1 christos }
5404 1.1 christos NEXT (vpc);
5405 1.1 christos
5406 1.1 christos CASE (sem, INSN_WRITE_RTE) : /* rte */
5407 1.1 christos {
5408 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
5409 1.1 christos const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
5410 1.1 christos #define FLD(f) abuf->fields.sfmt_empty.f
5411 1.1 christos #define OPRND(f) par_exec->operands.sfmt_rte.f
5412 1.1 christos int UNUSED written = abuf->written;
5413 1.1 christos IADDR UNUSED pc = abuf->addr;
5414 1.1 christos SEM_BRANCH_INIT
5415 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
5416 1.1 christos
5417 1.1 christos CPU (h_bpsw) = OPRND (h_bpsw_UQI);
5418 1.1 christos SET_H_CR (((UINT) 6), OPRND (h_cr_USI_6));
5419 1.1 christos SET_H_PSW (OPRND (h_psw_UQI));
5420 1.1 christos SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, OPRND (pc), vpc);
5421 1.1 christos
5422 1.1 christos SEM_BRANCH_FINI (vpc);
5423 1.1 christos #undef OPRND
5424 1.1 christos #undef FLD
5425 1.1 christos }
5426 1.1 christos NEXT (vpc);
5427 1.1 christos
5428 1.1 christos CASE (sem, INSN_PAR_SLL) : /* sll $dr,$sr */
5429 1.1 christos {
5430 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
5431 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
5432 1.1 christos #define FLD(f) abuf->fields.sfmt_add.f
5433 1.1 christos #define OPRND(f) par_exec->operands.sfmt_add.f
5434 1.1 christos int UNUSED written = 0;
5435 1.1 christos IADDR UNUSED pc = abuf->addr;
5436 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
5437 1.1 christos
5438 1.1 christos {
5439 1.1 christos SI opval = SLLSI (* FLD (i_dr), ANDSI (* FLD (i_sr), 31));
5440 1.1 christos OPRND (dr) = opval;
5441 1.1 christos TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
5442 1.1 christos }
5443 1.1 christos
5444 1.1 christos #undef OPRND
5445 1.1 christos #undef FLD
5446 1.1 christos }
5447 1.1 christos NEXT (vpc);
5448 1.1 christos
5449 1.1 christos CASE (sem, INSN_WRITE_SLL) : /* sll $dr,$sr */
5450 1.1 christos {
5451 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
5452 1.1 christos const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
5453 1.1 christos #define FLD(f) abuf->fields.sfmt_add.f
5454 1.1 christos #define OPRND(f) par_exec->operands.sfmt_add.f
5455 1.1 christos int UNUSED written = abuf->written;
5456 1.1 christos IADDR UNUSED pc = abuf->addr;
5457 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
5458 1.1 christos
5459 1.1 christos * FLD (i_dr) = OPRND (dr);
5460 1.1 christos
5461 1.1 christos #undef OPRND
5462 1.1 christos #undef FLD
5463 1.1 christos }
5464 1.1 christos NEXT (vpc);
5465 1.1 christos
5466 1.1 christos CASE (sem, INSN_PAR_SLLI) : /* slli $dr,$uimm5 */
5467 1.1 christos {
5468 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
5469 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
5470 1.1 christos #define FLD(f) abuf->fields.sfmt_slli.f
5471 1.1 christos #define OPRND(f) par_exec->operands.sfmt_slli.f
5472 1.1 christos int UNUSED written = 0;
5473 1.1 christos IADDR UNUSED pc = abuf->addr;
5474 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
5475 1.1 christos
5476 1.1 christos {
5477 1.1 christos SI opval = SLLSI (* FLD (i_dr), FLD (f_uimm5));
5478 1.1 christos OPRND (dr) = opval;
5479 1.1 christos TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
5480 1.1 christos }
5481 1.1 christos
5482 1.1 christos #undef OPRND
5483 1.1 christos #undef FLD
5484 1.1 christos }
5485 1.1 christos NEXT (vpc);
5486 1.1 christos
5487 1.1 christos CASE (sem, INSN_WRITE_SLLI) : /* slli $dr,$uimm5 */
5488 1.1 christos {
5489 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
5490 1.1 christos const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
5491 1.1 christos #define FLD(f) abuf->fields.sfmt_slli.f
5492 1.1 christos #define OPRND(f) par_exec->operands.sfmt_slli.f
5493 1.1 christos int UNUSED written = abuf->written;
5494 1.1 christos IADDR UNUSED pc = abuf->addr;
5495 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
5496 1.1 christos
5497 1.1 christos * FLD (i_dr) = OPRND (dr);
5498 1.1 christos
5499 1.1 christos #undef OPRND
5500 1.1 christos #undef FLD
5501 1.1 christos }
5502 1.1 christos NEXT (vpc);
5503 1.1 christos
5504 1.1 christos CASE (sem, INSN_PAR_SRA) : /* sra $dr,$sr */
5505 1.1 christos {
5506 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
5507 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
5508 1.1 christos #define FLD(f) abuf->fields.sfmt_add.f
5509 1.1 christos #define OPRND(f) par_exec->operands.sfmt_add.f
5510 1.1 christos int UNUSED written = 0;
5511 1.1 christos IADDR UNUSED pc = abuf->addr;
5512 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
5513 1.1 christos
5514 1.1 christos {
5515 1.1 christos SI opval = SRASI (* FLD (i_dr), ANDSI (* FLD (i_sr), 31));
5516 1.1 christos OPRND (dr) = opval;
5517 1.1 christos TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
5518 1.1 christos }
5519 1.1 christos
5520 1.1 christos #undef OPRND
5521 1.1 christos #undef FLD
5522 1.1 christos }
5523 1.1 christos NEXT (vpc);
5524 1.1 christos
5525 1.1 christos CASE (sem, INSN_WRITE_SRA) : /* sra $dr,$sr */
5526 1.1 christos {
5527 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
5528 1.1 christos const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
5529 1.1 christos #define FLD(f) abuf->fields.sfmt_add.f
5530 1.1 christos #define OPRND(f) par_exec->operands.sfmt_add.f
5531 1.1 christos int UNUSED written = abuf->written;
5532 1.1 christos IADDR UNUSED pc = abuf->addr;
5533 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
5534 1.1 christos
5535 1.1 christos * FLD (i_dr) = OPRND (dr);
5536 1.1 christos
5537 1.1 christos #undef OPRND
5538 1.1 christos #undef FLD
5539 1.1 christos }
5540 1.1 christos NEXT (vpc);
5541 1.1 christos
5542 1.1 christos CASE (sem, INSN_PAR_SRAI) : /* srai $dr,$uimm5 */
5543 1.1 christos {
5544 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
5545 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
5546 1.1 christos #define FLD(f) abuf->fields.sfmt_slli.f
5547 1.1 christos #define OPRND(f) par_exec->operands.sfmt_slli.f
5548 1.1 christos int UNUSED written = 0;
5549 1.1 christos IADDR UNUSED pc = abuf->addr;
5550 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
5551 1.1 christos
5552 1.1 christos {
5553 1.1 christos SI opval = SRASI (* FLD (i_dr), FLD (f_uimm5));
5554 1.1 christos OPRND (dr) = opval;
5555 1.1 christos TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
5556 1.1 christos }
5557 1.1 christos
5558 1.1 christos #undef OPRND
5559 1.1 christos #undef FLD
5560 1.1 christos }
5561 1.1 christos NEXT (vpc);
5562 1.1 christos
5563 1.1 christos CASE (sem, INSN_WRITE_SRAI) : /* srai $dr,$uimm5 */
5564 1.1 christos {
5565 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
5566 1.1 christos const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
5567 1.1 christos #define FLD(f) abuf->fields.sfmt_slli.f
5568 1.1 christos #define OPRND(f) par_exec->operands.sfmt_slli.f
5569 1.1 christos int UNUSED written = abuf->written;
5570 1.1 christos IADDR UNUSED pc = abuf->addr;
5571 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
5572 1.1 christos
5573 1.1 christos * FLD (i_dr) = OPRND (dr);
5574 1.1 christos
5575 1.1 christos #undef OPRND
5576 1.1 christos #undef FLD
5577 1.1 christos }
5578 1.1 christos NEXT (vpc);
5579 1.1 christos
5580 1.1 christos CASE (sem, INSN_PAR_SRL) : /* srl $dr,$sr */
5581 1.1 christos {
5582 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
5583 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
5584 1.1 christos #define FLD(f) abuf->fields.sfmt_add.f
5585 1.1 christos #define OPRND(f) par_exec->operands.sfmt_add.f
5586 1.1 christos int UNUSED written = 0;
5587 1.1 christos IADDR UNUSED pc = abuf->addr;
5588 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
5589 1.1 christos
5590 1.1 christos {
5591 1.1 christos SI opval = SRLSI (* FLD (i_dr), ANDSI (* FLD (i_sr), 31));
5592 1.1 christos OPRND (dr) = opval;
5593 1.1 christos TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
5594 1.1 christos }
5595 1.1 christos
5596 1.1 christos #undef OPRND
5597 1.1 christos #undef FLD
5598 1.1 christos }
5599 1.1 christos NEXT (vpc);
5600 1.1 christos
5601 1.1 christos CASE (sem, INSN_WRITE_SRL) : /* srl $dr,$sr */
5602 1.1 christos {
5603 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
5604 1.1 christos const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
5605 1.1 christos #define FLD(f) abuf->fields.sfmt_add.f
5606 1.1 christos #define OPRND(f) par_exec->operands.sfmt_add.f
5607 1.1 christos int UNUSED written = abuf->written;
5608 1.1 christos IADDR UNUSED pc = abuf->addr;
5609 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
5610 1.1 christos
5611 1.1 christos * FLD (i_dr) = OPRND (dr);
5612 1.1 christos
5613 1.1 christos #undef OPRND
5614 1.1 christos #undef FLD
5615 1.1 christos }
5616 1.1 christos NEXT (vpc);
5617 1.1 christos
5618 1.1 christos CASE (sem, INSN_PAR_SRLI) : /* srli $dr,$uimm5 */
5619 1.1 christos {
5620 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
5621 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
5622 1.1 christos #define FLD(f) abuf->fields.sfmt_slli.f
5623 1.1 christos #define OPRND(f) par_exec->operands.sfmt_slli.f
5624 1.1 christos int UNUSED written = 0;
5625 1.1 christos IADDR UNUSED pc = abuf->addr;
5626 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
5627 1.1 christos
5628 1.1 christos {
5629 1.1 christos SI opval = SRLSI (* FLD (i_dr), FLD (f_uimm5));
5630 1.1 christos OPRND (dr) = opval;
5631 1.1 christos TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
5632 1.1 christos }
5633 1.1 christos
5634 1.1 christos #undef OPRND
5635 1.1 christos #undef FLD
5636 1.1 christos }
5637 1.1 christos NEXT (vpc);
5638 1.1 christos
5639 1.1 christos CASE (sem, INSN_WRITE_SRLI) : /* srli $dr,$uimm5 */
5640 1.1 christos {
5641 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
5642 1.1 christos const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
5643 1.1 christos #define FLD(f) abuf->fields.sfmt_slli.f
5644 1.1 christos #define OPRND(f) par_exec->operands.sfmt_slli.f
5645 1.1 christos int UNUSED written = abuf->written;
5646 1.1 christos IADDR UNUSED pc = abuf->addr;
5647 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
5648 1.1 christos
5649 1.1 christos * FLD (i_dr) = OPRND (dr);
5650 1.1 christos
5651 1.1 christos #undef OPRND
5652 1.1 christos #undef FLD
5653 1.1 christos }
5654 1.1 christos NEXT (vpc);
5655 1.1 christos
5656 1.1 christos CASE (sem, INSN_PAR_ST) : /* st $src1,@$src2 */
5657 1.1 christos {
5658 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
5659 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
5660 1.1 christos #define FLD(f) abuf->fields.sfmt_st_plus.f
5661 1.1 christos #define OPRND(f) par_exec->operands.sfmt_st.f
5662 1.1 christos int UNUSED written = 0;
5663 1.1 christos IADDR UNUSED pc = abuf->addr;
5664 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
5665 1.1 christos
5666 1.1 christos {
5667 1.1 christos SI opval = * FLD (i_src1);
5668 1.1 christos OPRND (h_memory_SI_src2_idx) = * FLD (i_src2);
5669 1.1 christos OPRND (h_memory_SI_src2) = opval;
5670 1.1 christos TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
5671 1.1 christos }
5672 1.1 christos
5673 1.1 christos #undef OPRND
5674 1.1 christos #undef FLD
5675 1.1 christos }
5676 1.1 christos NEXT (vpc);
5677 1.1 christos
5678 1.1 christos CASE (sem, INSN_WRITE_ST) : /* st $src1,@$src2 */
5679 1.1 christos {
5680 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
5681 1.1 christos const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
5682 1.1 christos #define FLD(f) abuf->fields.sfmt_st_plus.f
5683 1.1 christos #define OPRND(f) par_exec->operands.sfmt_st.f
5684 1.1 christos int UNUSED written = abuf->written;
5685 1.1 christos IADDR UNUSED pc = abuf->addr;
5686 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
5687 1.1 christos
5688 1.1 christos SETMEMSI (current_cpu, pc, OPRND (h_memory_SI_src2_idx), OPRND (h_memory_SI_src2));
5689 1.1 christos
5690 1.1 christos #undef OPRND
5691 1.1 christos #undef FLD
5692 1.1 christos }
5693 1.1 christos NEXT (vpc);
5694 1.1 christos
5695 1.1 christos CASE (sem, INSN_PAR_STB) : /* stb $src1,@$src2 */
5696 1.1 christos {
5697 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
5698 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
5699 1.1 christos #define FLD(f) abuf->fields.sfmt_st_plus.f
5700 1.1 christos #define OPRND(f) par_exec->operands.sfmt_stb.f
5701 1.1 christos int UNUSED written = 0;
5702 1.1 christos IADDR UNUSED pc = abuf->addr;
5703 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
5704 1.1 christos
5705 1.1 christos {
5706 1.1 christos QI opval = * FLD (i_src1);
5707 1.1 christos OPRND (h_memory_QI_src2_idx) = * FLD (i_src2);
5708 1.1 christos OPRND (h_memory_QI_src2) = opval;
5709 1.1 christos TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
5710 1.1 christos }
5711 1.1 christos
5712 1.1 christos #undef OPRND
5713 1.1 christos #undef FLD
5714 1.1 christos }
5715 1.1 christos NEXT (vpc);
5716 1.1 christos
5717 1.1 christos CASE (sem, INSN_WRITE_STB) : /* stb $src1,@$src2 */
5718 1.1 christos {
5719 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
5720 1.1 christos const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
5721 1.1 christos #define FLD(f) abuf->fields.sfmt_st_plus.f
5722 1.1 christos #define OPRND(f) par_exec->operands.sfmt_stb.f
5723 1.1 christos int UNUSED written = abuf->written;
5724 1.1 christos IADDR UNUSED pc = abuf->addr;
5725 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
5726 1.1 christos
5727 1.1 christos SETMEMQI (current_cpu, pc, OPRND (h_memory_QI_src2_idx), OPRND (h_memory_QI_src2));
5728 1.1 christos
5729 1.1 christos #undef OPRND
5730 1.1 christos #undef FLD
5731 1.1 christos }
5732 1.1 christos NEXT (vpc);
5733 1.1 christos
5734 1.1 christos CASE (sem, INSN_PAR_STH) : /* sth $src1,@$src2 */
5735 1.1 christos {
5736 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
5737 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
5738 1.1 christos #define FLD(f) abuf->fields.sfmt_st_plus.f
5739 1.1 christos #define OPRND(f) par_exec->operands.sfmt_sth.f
5740 1.1 christos int UNUSED written = 0;
5741 1.1 christos IADDR UNUSED pc = abuf->addr;
5742 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
5743 1.1 christos
5744 1.1 christos {
5745 1.1 christos HI opval = * FLD (i_src1);
5746 1.1 christos OPRND (h_memory_HI_src2_idx) = * FLD (i_src2);
5747 1.1 christos OPRND (h_memory_HI_src2) = opval;
5748 1.1 christos TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
5749 1.1 christos }
5750 1.1 christos
5751 1.1 christos #undef OPRND
5752 1.1 christos #undef FLD
5753 1.1 christos }
5754 1.1 christos NEXT (vpc);
5755 1.1 christos
5756 1.1 christos CASE (sem, INSN_WRITE_STH) : /* sth $src1,@$src2 */
5757 1.1 christos {
5758 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
5759 1.1 christos const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
5760 1.1 christos #define FLD(f) abuf->fields.sfmt_st_plus.f
5761 1.1 christos #define OPRND(f) par_exec->operands.sfmt_sth.f
5762 1.1 christos int UNUSED written = abuf->written;
5763 1.1 christos IADDR UNUSED pc = abuf->addr;
5764 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
5765 1.1 christos
5766 1.1 christos SETMEMHI (current_cpu, pc, OPRND (h_memory_HI_src2_idx), OPRND (h_memory_HI_src2));
5767 1.1 christos
5768 1.1 christos #undef OPRND
5769 1.1 christos #undef FLD
5770 1.1 christos }
5771 1.1 christos NEXT (vpc);
5772 1.1 christos
5773 1.1 christos CASE (sem, INSN_PAR_ST_PLUS) : /* st $src1,@+$src2 */
5774 1.1 christos {
5775 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
5776 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
5777 1.1 christos #define FLD(f) abuf->fields.sfmt_st_plus.f
5778 1.1 christos #define OPRND(f) par_exec->operands.sfmt_st_plus.f
5779 1.1 christos int UNUSED written = 0;
5780 1.1 christos IADDR UNUSED pc = abuf->addr;
5781 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
5782 1.1 christos
5783 1.1 christos {
5784 1.1 christos SI tmp_new_src2;
5785 1.1 christos tmp_new_src2 = ADDSI (* FLD (i_src2), 4);
5786 1.1 christos {
5787 1.1 christos SI opval = * FLD (i_src1);
5788 1.1 christos OPRND (h_memory_SI_new_src2_idx) = tmp_new_src2;
5789 1.1 christos OPRND (h_memory_SI_new_src2) = opval;
5790 1.1 christos TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
5791 1.1 christos }
5792 1.1 christos {
5793 1.1 christos SI opval = tmp_new_src2;
5794 1.1 christos OPRND (src2) = opval;
5795 1.1 christos TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
5796 1.1 christos }
5797 1.1 christos }
5798 1.1 christos
5799 1.1 christos #undef OPRND
5800 1.1 christos #undef FLD
5801 1.1 christos }
5802 1.1 christos NEXT (vpc);
5803 1.1 christos
5804 1.1 christos CASE (sem, INSN_WRITE_ST_PLUS) : /* st $src1,@+$src2 */
5805 1.1 christos {
5806 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
5807 1.1 christos const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
5808 1.1 christos #define FLD(f) abuf->fields.sfmt_st_plus.f
5809 1.1 christos #define OPRND(f) par_exec->operands.sfmt_st_plus.f
5810 1.1 christos int UNUSED written = abuf->written;
5811 1.1 christos IADDR UNUSED pc = abuf->addr;
5812 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
5813 1.1 christos
5814 1.1 christos SETMEMSI (current_cpu, pc, OPRND (h_memory_SI_new_src2_idx), OPRND (h_memory_SI_new_src2));
5815 1.1 christos * FLD (i_src2) = OPRND (src2);
5816 1.1 christos
5817 1.1 christos #undef OPRND
5818 1.1 christos #undef FLD
5819 1.1 christos }
5820 1.1 christos NEXT (vpc);
5821 1.1 christos
5822 1.1 christos CASE (sem, INSN_PAR_STH_PLUS) : /* sth $src1,@$src2+ */
5823 1.1 christos {
5824 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
5825 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
5826 1.1 christos #define FLD(f) abuf->fields.sfmt_st_plus.f
5827 1.1 christos #define OPRND(f) par_exec->operands.sfmt_sth_plus.f
5828 1.1 christos int UNUSED written = 0;
5829 1.1 christos IADDR UNUSED pc = abuf->addr;
5830 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
5831 1.1 christos
5832 1.1 christos {
5833 1.1 christos SI tmp_new_src2;
5834 1.1 christos tmp_new_src2 = * FLD (i_src2);
5835 1.1 christos {
5836 1.1 christos HI opval = * FLD (i_src1);
5837 1.1 christos OPRND (h_memory_HI_new_src2_idx) = tmp_new_src2;
5838 1.1 christos OPRND (h_memory_HI_new_src2) = opval;
5839 1.1 christos TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
5840 1.1 christos }
5841 1.1 christos {
5842 1.1 christos SI opval = ADDSI (tmp_new_src2, 2);
5843 1.1 christos OPRND (src2) = opval;
5844 1.1 christos TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
5845 1.1 christos }
5846 1.1 christos }
5847 1.1 christos
5848 1.1 christos #undef OPRND
5849 1.1 christos #undef FLD
5850 1.1 christos }
5851 1.1 christos NEXT (vpc);
5852 1.1 christos
5853 1.1 christos CASE (sem, INSN_WRITE_STH_PLUS) : /* sth $src1,@$src2+ */
5854 1.1 christos {
5855 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
5856 1.1 christos const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
5857 1.1 christos #define FLD(f) abuf->fields.sfmt_st_plus.f
5858 1.1 christos #define OPRND(f) par_exec->operands.sfmt_sth_plus.f
5859 1.1 christos int UNUSED written = abuf->written;
5860 1.1 christos IADDR UNUSED pc = abuf->addr;
5861 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
5862 1.1 christos
5863 1.1 christos SETMEMHI (current_cpu, pc, OPRND (h_memory_HI_new_src2_idx), OPRND (h_memory_HI_new_src2));
5864 1.1 christos * FLD (i_src2) = OPRND (src2);
5865 1.1 christos
5866 1.1 christos #undef OPRND
5867 1.1 christos #undef FLD
5868 1.1 christos }
5869 1.1 christos NEXT (vpc);
5870 1.1 christos
5871 1.1 christos CASE (sem, INSN_PAR_STB_PLUS) : /* stb $src1,@$src2+ */
5872 1.1 christos {
5873 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
5874 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
5875 1.1 christos #define FLD(f) abuf->fields.sfmt_st_plus.f
5876 1.1 christos #define OPRND(f) par_exec->operands.sfmt_stb_plus.f
5877 1.1 christos int UNUSED written = 0;
5878 1.1 christos IADDR UNUSED pc = abuf->addr;
5879 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
5880 1.1 christos
5881 1.1 christos {
5882 1.1 christos SI tmp_new_src2;
5883 1.1 christos tmp_new_src2 = * FLD (i_src2);
5884 1.1 christos {
5885 1.1 christos QI opval = * FLD (i_src1);
5886 1.1 christos OPRND (h_memory_QI_new_src2_idx) = tmp_new_src2;
5887 1.1 christos OPRND (h_memory_QI_new_src2) = opval;
5888 1.1 christos TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
5889 1.1 christos }
5890 1.1 christos {
5891 1.1 christos SI opval = ADDSI (tmp_new_src2, 1);
5892 1.1 christos OPRND (src2) = opval;
5893 1.1 christos TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
5894 1.1 christos }
5895 1.1 christos }
5896 1.1 christos
5897 1.1 christos #undef OPRND
5898 1.1 christos #undef FLD
5899 1.1 christos }
5900 1.1 christos NEXT (vpc);
5901 1.1 christos
5902 1.1 christos CASE (sem, INSN_WRITE_STB_PLUS) : /* stb $src1,@$src2+ */
5903 1.1 christos {
5904 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
5905 1.1 christos const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
5906 1.1 christos #define FLD(f) abuf->fields.sfmt_st_plus.f
5907 1.1 christos #define OPRND(f) par_exec->operands.sfmt_stb_plus.f
5908 1.1 christos int UNUSED written = abuf->written;
5909 1.1 christos IADDR UNUSED pc = abuf->addr;
5910 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
5911 1.1 christos
5912 1.1 christos SETMEMQI (current_cpu, pc, OPRND (h_memory_QI_new_src2_idx), OPRND (h_memory_QI_new_src2));
5913 1.1 christos * FLD (i_src2) = OPRND (src2);
5914 1.1 christos
5915 1.1 christos #undef OPRND
5916 1.1 christos #undef FLD
5917 1.1 christos }
5918 1.1 christos NEXT (vpc);
5919 1.1 christos
5920 1.1 christos CASE (sem, INSN_PAR_ST_MINUS) : /* st $src1,@-$src2 */
5921 1.1 christos {
5922 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
5923 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
5924 1.1 christos #define FLD(f) abuf->fields.sfmt_st_plus.f
5925 1.1 christos #define OPRND(f) par_exec->operands.sfmt_st_plus.f
5926 1.1 christos int UNUSED written = 0;
5927 1.1 christos IADDR UNUSED pc = abuf->addr;
5928 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
5929 1.1 christos
5930 1.1 christos {
5931 1.1 christos SI tmp_new_src2;
5932 1.1 christos tmp_new_src2 = SUBSI (* FLD (i_src2), 4);
5933 1.1 christos {
5934 1.1 christos SI opval = * FLD (i_src1);
5935 1.1 christos OPRND (h_memory_SI_new_src2_idx) = tmp_new_src2;
5936 1.1 christos OPRND (h_memory_SI_new_src2) = opval;
5937 1.1 christos TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
5938 1.1 christos }
5939 1.1 christos {
5940 1.1 christos SI opval = tmp_new_src2;
5941 1.1 christos OPRND (src2) = opval;
5942 1.1 christos TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
5943 1.1 christos }
5944 1.1 christos }
5945 1.1 christos
5946 1.1 christos #undef OPRND
5947 1.1 christos #undef FLD
5948 1.1 christos }
5949 1.1 christos NEXT (vpc);
5950 1.1 christos
5951 1.1 christos CASE (sem, INSN_WRITE_ST_MINUS) : /* st $src1,@-$src2 */
5952 1.1 christos {
5953 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
5954 1.1 christos const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
5955 1.1 christos #define FLD(f) abuf->fields.sfmt_st_plus.f
5956 1.1 christos #define OPRND(f) par_exec->operands.sfmt_st_plus.f
5957 1.1 christos int UNUSED written = abuf->written;
5958 1.1 christos IADDR UNUSED pc = abuf->addr;
5959 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
5960 1.1 christos
5961 1.1 christos SETMEMSI (current_cpu, pc, OPRND (h_memory_SI_new_src2_idx), OPRND (h_memory_SI_new_src2));
5962 1.1 christos * FLD (i_src2) = OPRND (src2);
5963 1.1 christos
5964 1.1 christos #undef OPRND
5965 1.1 christos #undef FLD
5966 1.1 christos }
5967 1.1 christos NEXT (vpc);
5968 1.1 christos
5969 1.1 christos CASE (sem, INSN_PAR_SUB) : /* sub $dr,$sr */
5970 1.1 christos {
5971 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
5972 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
5973 1.1 christos #define FLD(f) abuf->fields.sfmt_add.f
5974 1.1 christos #define OPRND(f) par_exec->operands.sfmt_add.f
5975 1.1 christos int UNUSED written = 0;
5976 1.1 christos IADDR UNUSED pc = abuf->addr;
5977 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
5978 1.1 christos
5979 1.1 christos {
5980 1.1 christos SI opval = SUBSI (* FLD (i_dr), * FLD (i_sr));
5981 1.1 christos OPRND (dr) = opval;
5982 1.1 christos TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
5983 1.1 christos }
5984 1.1 christos
5985 1.1 christos #undef OPRND
5986 1.1 christos #undef FLD
5987 1.1 christos }
5988 1.1 christos NEXT (vpc);
5989 1.1 christos
5990 1.1 christos CASE (sem, INSN_WRITE_SUB) : /* sub $dr,$sr */
5991 1.1 christos {
5992 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
5993 1.1 christos const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
5994 1.1 christos #define FLD(f) abuf->fields.sfmt_add.f
5995 1.1 christos #define OPRND(f) par_exec->operands.sfmt_add.f
5996 1.1 christos int UNUSED written = abuf->written;
5997 1.1 christos IADDR UNUSED pc = abuf->addr;
5998 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
5999 1.1 christos
6000 1.1 christos * FLD (i_dr) = OPRND (dr);
6001 1.1 christos
6002 1.1 christos #undef OPRND
6003 1.1 christos #undef FLD
6004 1.1 christos }
6005 1.1 christos NEXT (vpc);
6006 1.1 christos
6007 1.1 christos CASE (sem, INSN_PAR_SUBV) : /* subv $dr,$sr */
6008 1.1 christos {
6009 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
6010 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
6011 1.1 christos #define FLD(f) abuf->fields.sfmt_add.f
6012 1.1 christos #define OPRND(f) par_exec->operands.sfmt_addv.f
6013 1.1 christos int UNUSED written = 0;
6014 1.1 christos IADDR UNUSED pc = abuf->addr;
6015 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
6016 1.1 christos
6017 1.1 christos {
6018 1.1 christos SI temp0;BI temp1;
6019 1.1 christos temp0 = SUBSI (* FLD (i_dr), * FLD (i_sr));
6020 1.1 christos temp1 = SUBOFSI (* FLD (i_dr), * FLD (i_sr), 0);
6021 1.1 christos {
6022 1.1 christos SI opval = temp0;
6023 1.1 christos OPRND (dr) = opval;
6024 1.1 christos TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
6025 1.1 christos }
6026 1.1 christos {
6027 1.1 christos BI opval = temp1;
6028 1.1 christos OPRND (condbit) = opval;
6029 1.1 christos TRACE_RESULT (current_cpu, abuf, "cond", 'x', opval);
6030 1.1 christos }
6031 1.1 christos }
6032 1.1 christos
6033 1.1 christos #undef OPRND
6034 1.1 christos #undef FLD
6035 1.1 christos }
6036 1.1 christos NEXT (vpc);
6037 1.1 christos
6038 1.1 christos CASE (sem, INSN_WRITE_SUBV) : /* subv $dr,$sr */
6039 1.1 christos {
6040 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
6041 1.1 christos const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
6042 1.1 christos #define FLD(f) abuf->fields.sfmt_add.f
6043 1.1 christos #define OPRND(f) par_exec->operands.sfmt_addv.f
6044 1.1 christos int UNUSED written = abuf->written;
6045 1.1 christos IADDR UNUSED pc = abuf->addr;
6046 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
6047 1.1 christos
6048 1.1 christos CPU (h_cond) = OPRND (condbit);
6049 1.1 christos * FLD (i_dr) = OPRND (dr);
6050 1.1 christos
6051 1.1 christos #undef OPRND
6052 1.1 christos #undef FLD
6053 1.1 christos }
6054 1.1 christos NEXT (vpc);
6055 1.1 christos
6056 1.1 christos CASE (sem, INSN_PAR_SUBX) : /* subx $dr,$sr */
6057 1.1 christos {
6058 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
6059 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
6060 1.1 christos #define FLD(f) abuf->fields.sfmt_add.f
6061 1.1 christos #define OPRND(f) par_exec->operands.sfmt_addx.f
6062 1.1 christos int UNUSED written = 0;
6063 1.1 christos IADDR UNUSED pc = abuf->addr;
6064 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
6065 1.1 christos
6066 1.1 christos {
6067 1.1 christos SI temp0;BI temp1;
6068 1.1 christos temp0 = SUBCSI (* FLD (i_dr), * FLD (i_sr), CPU (h_cond));
6069 1.1 christos temp1 = SUBCFSI (* FLD (i_dr), * FLD (i_sr), CPU (h_cond));
6070 1.1 christos {
6071 1.1 christos SI opval = temp0;
6072 1.1 christos OPRND (dr) = opval;
6073 1.1 christos TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
6074 1.1 christos }
6075 1.1 christos {
6076 1.1 christos BI opval = temp1;
6077 1.1 christos OPRND (condbit) = opval;
6078 1.1 christos TRACE_RESULT (current_cpu, abuf, "cond", 'x', opval);
6079 1.1 christos }
6080 1.1 christos }
6081 1.1 christos
6082 1.1 christos #undef OPRND
6083 1.1 christos #undef FLD
6084 1.1 christos }
6085 1.1 christos NEXT (vpc);
6086 1.1 christos
6087 1.1 christos CASE (sem, INSN_WRITE_SUBX) : /* subx $dr,$sr */
6088 1.1 christos {
6089 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
6090 1.1 christos const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
6091 1.1 christos #define FLD(f) abuf->fields.sfmt_add.f
6092 1.1 christos #define OPRND(f) par_exec->operands.sfmt_addx.f
6093 1.1 christos int UNUSED written = abuf->written;
6094 1.1 christos IADDR UNUSED pc = abuf->addr;
6095 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
6096 1.1 christos
6097 1.1 christos CPU (h_cond) = OPRND (condbit);
6098 1.1 christos * FLD (i_dr) = OPRND (dr);
6099 1.1 christos
6100 1.1 christos #undef OPRND
6101 1.1 christos #undef FLD
6102 1.1 christos }
6103 1.1 christos NEXT (vpc);
6104 1.1 christos
6105 1.1 christos CASE (sem, INSN_PAR_TRAP) : /* trap $uimm4 */
6106 1.1 christos {
6107 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
6108 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
6109 1.1 christos #define FLD(f) abuf->fields.sfmt_trap.f
6110 1.1 christos #define OPRND(f) par_exec->operands.sfmt_trap.f
6111 1.1 christos int UNUSED written = 0;
6112 1.1 christos IADDR UNUSED pc = abuf->addr;
6113 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
6114 1.1 christos
6115 1.1 christos {
6116 1.1 christos {
6117 1.1 christos USI opval = GET_H_CR (((UINT) 6));
6118 1.1 christos OPRND (h_cr_USI_14) = opval;
6119 1.1 christos TRACE_RESULT (current_cpu, abuf, "cr", 'x', opval);
6120 1.1 christos }
6121 1.1 christos {
6122 1.1 christos USI opval = ADDSI (pc, 4);
6123 1.1 christos OPRND (h_cr_USI_6) = opval;
6124 1.1 christos TRACE_RESULT (current_cpu, abuf, "cr", 'x', opval);
6125 1.1 christos }
6126 1.1 christos {
6127 1.1 christos UQI opval = CPU (h_bpsw);
6128 1.1 christos OPRND (h_bbpsw_UQI) = opval;
6129 1.1 christos TRACE_RESULT (current_cpu, abuf, "bbpsw", 'x', opval);
6130 1.1 christos }
6131 1.1 christos {
6132 1.1 christos UQI opval = GET_H_PSW ();
6133 1.1 christos OPRND (h_bpsw_UQI) = opval;
6134 1.1 christos TRACE_RESULT (current_cpu, abuf, "bpsw", 'x', opval);
6135 1.1 christos }
6136 1.1 christos {
6137 1.1 christos UQI opval = ANDQI (GET_H_PSW (), 128);
6138 1.1 christos OPRND (h_psw_UQI) = opval;
6139 1.1 christos TRACE_RESULT (current_cpu, abuf, "psw", 'x', opval);
6140 1.1 christos }
6141 1.1 christos {
6142 1.1 christos SI opval = m32r_trap (current_cpu, pc, FLD (f_uimm4));
6143 1.1 christos OPRND (pc) = opval;
6144 1.1 christos TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
6145 1.1 christos }
6146 1.1 christos }
6147 1.1 christos
6148 1.1 christos #undef OPRND
6149 1.1 christos #undef FLD
6150 1.1 christos }
6151 1.1 christos NEXT (vpc);
6152 1.1 christos
6153 1.1 christos CASE (sem, INSN_WRITE_TRAP) : /* trap $uimm4 */
6154 1.1 christos {
6155 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
6156 1.1 christos const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
6157 1.1 christos #define FLD(f) abuf->fields.sfmt_trap.f
6158 1.1 christos #define OPRND(f) par_exec->operands.sfmt_trap.f
6159 1.1 christos int UNUSED written = abuf->written;
6160 1.1 christos IADDR UNUSED pc = abuf->addr;
6161 1.1 christos SEM_BRANCH_INIT
6162 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
6163 1.1 christos
6164 1.1 christos CPU (h_bbpsw) = OPRND (h_bbpsw_UQI);
6165 1.1 christos CPU (h_bpsw) = OPRND (h_bpsw_UQI);
6166 1.1 christos SET_H_CR (((UINT) 14), OPRND (h_cr_USI_14));
6167 1.1 christos SET_H_CR (((UINT) 6), OPRND (h_cr_USI_6));
6168 1.1 christos SET_H_PSW (OPRND (h_psw_UQI));
6169 1.1 christos SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, OPRND (pc), vpc);
6170 1.1 christos
6171 1.1 christos SEM_BRANCH_FINI (vpc);
6172 1.1 christos #undef OPRND
6173 1.1 christos #undef FLD
6174 1.1 christos }
6175 1.1 christos NEXT (vpc);
6176 1.1 christos
6177 1.1 christos CASE (sem, INSN_PAR_UNLOCK) : /* unlock $src1,@$src2 */
6178 1.1 christos {
6179 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
6180 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
6181 1.1 christos #define FLD(f) abuf->fields.sfmt_st_plus.f
6182 1.1 christos #define OPRND(f) par_exec->operands.sfmt_unlock.f
6183 1.1 christos int UNUSED written = 0;
6184 1.1 christos IADDR UNUSED pc = abuf->addr;
6185 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
6186 1.1 christos
6187 1.1 christos {
6188 1.1 christos if (CPU (h_lock)) {
6189 1.1 christos {
6190 1.1 christos SI opval = * FLD (i_src1);
6191 1.1 christos OPRND (h_memory_SI_src2_idx) = * FLD (i_src2);
6192 1.1 christos OPRND (h_memory_SI_src2) = opval;
6193 1.1 christos written |= (1 << 4);
6194 1.1 christos TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
6195 1.1 christos }
6196 1.1 christos }
6197 1.1 christos {
6198 1.1 christos BI opval = 0;
6199 1.1 christos OPRND (h_lock_BI) = opval;
6200 1.1 christos TRACE_RESULT (current_cpu, abuf, "lock", 'x', opval);
6201 1.1 christos }
6202 1.1 christos }
6203 1.1 christos
6204 1.1 christos abuf->written = written;
6205 1.1 christos #undef OPRND
6206 1.1 christos #undef FLD
6207 1.1 christos }
6208 1.1 christos NEXT (vpc);
6209 1.1 christos
6210 1.1 christos CASE (sem, INSN_WRITE_UNLOCK) : /* unlock $src1,@$src2 */
6211 1.1 christos {
6212 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
6213 1.1 christos const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
6214 1.1 christos #define FLD(f) abuf->fields.sfmt_st_plus.f
6215 1.1 christos #define OPRND(f) par_exec->operands.sfmt_unlock.f
6216 1.1 christos int UNUSED written = abuf->written;
6217 1.1 christos IADDR UNUSED pc = abuf->addr;
6218 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
6219 1.1 christos
6220 1.1 christos CPU (h_lock) = OPRND (h_lock_BI);
6221 1.1 christos if (written & (1 << 4))
6222 1.1 christos {
6223 1.1 christos SETMEMSI (current_cpu, pc, OPRND (h_memory_SI_src2_idx), OPRND (h_memory_SI_src2));
6224 1.1 christos }
6225 1.1 christos
6226 1.1 christos #undef OPRND
6227 1.1 christos #undef FLD
6228 1.1 christos }
6229 1.1 christos NEXT (vpc);
6230 1.1 christos
6231 1.1 christos CASE (sem, INSN_PAR_PCMPBZ) : /* pcmpbz $src2 */
6232 1.1 christos {
6233 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
6234 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
6235 1.1 christos #define FLD(f) abuf->fields.sfmt_st_plus.f
6236 1.1 christos #define OPRND(f) par_exec->operands.sfmt_cmpz.f
6237 1.1 christos int UNUSED written = 0;
6238 1.1 christos IADDR UNUSED pc = abuf->addr;
6239 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
6240 1.1 christos
6241 1.1 christos {
6242 1.1 christos BI opval = (EQSI (ANDSI (* FLD (i_src2), 255), 0)) ? (1) : (EQSI (ANDSI (* FLD (i_src2), 65280), 0)) ? (1) : (EQSI (ANDSI (* FLD (i_src2), 16711680), 0)) ? (1) : (EQSI (ANDSI (* FLD (i_src2), 0xff000000), 0)) ? (1) : (0);
6243 1.1 christos OPRND (condbit) = opval;
6244 1.1 christos TRACE_RESULT (current_cpu, abuf, "cond", 'x', opval);
6245 1.1 christos }
6246 1.1 christos
6247 1.1 christos #undef OPRND
6248 1.1 christos #undef FLD
6249 1.1 christos }
6250 1.1 christos NEXT (vpc);
6251 1.1 christos
6252 1.1 christos CASE (sem, INSN_WRITE_PCMPBZ) : /* pcmpbz $src2 */
6253 1.1 christos {
6254 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
6255 1.1 christos const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
6256 1.1 christos #define FLD(f) abuf->fields.sfmt_st_plus.f
6257 1.1 christos #define OPRND(f) par_exec->operands.sfmt_cmpz.f
6258 1.1 christos int UNUSED written = abuf->written;
6259 1.1 christos IADDR UNUSED pc = abuf->addr;
6260 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
6261 1.1 christos
6262 1.1 christos CPU (h_cond) = OPRND (condbit);
6263 1.1 christos
6264 1.1 christos #undef OPRND
6265 1.1 christos #undef FLD
6266 1.1 christos }
6267 1.1 christos NEXT (vpc);
6268 1.1 christos
6269 1.1 christos CASE (sem, INSN_PAR_SADD) : /* sadd */
6270 1.1 christos {
6271 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
6272 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
6273 1.1 christos #define FLD(f) abuf->fields.sfmt_empty.f
6274 1.1 christos #define OPRND(f) par_exec->operands.sfmt_sadd.f
6275 1.1 christos int UNUSED written = 0;
6276 1.1 christos IADDR UNUSED pc = abuf->addr;
6277 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
6278 1.1 christos
6279 1.1 christos {
6280 1.1 christos DI opval = ADDDI (SRADI (GET_H_ACCUMS (((UINT) 1)), 16), GET_H_ACCUMS (((UINT) 0)));
6281 1.1 christos OPRND (h_accums_DI_0) = opval;
6282 1.1 christos TRACE_RESULT (current_cpu, abuf, "accums", 'D', opval);
6283 1.1 christos }
6284 1.1 christos
6285 1.1 christos #undef OPRND
6286 1.1 christos #undef FLD
6287 1.1 christos }
6288 1.1 christos NEXT (vpc);
6289 1.1 christos
6290 1.1 christos CASE (sem, INSN_WRITE_SADD) : /* sadd */
6291 1.1 christos {
6292 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
6293 1.1 christos const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
6294 1.1 christos #define FLD(f) abuf->fields.sfmt_empty.f
6295 1.1 christos #define OPRND(f) par_exec->operands.sfmt_sadd.f
6296 1.1 christos int UNUSED written = abuf->written;
6297 1.1 christos IADDR UNUSED pc = abuf->addr;
6298 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
6299 1.1 christos
6300 1.1 christos SET_H_ACCUMS (((UINT) 0), OPRND (h_accums_DI_0));
6301 1.1 christos
6302 1.1 christos #undef OPRND
6303 1.1 christos #undef FLD
6304 1.1 christos }
6305 1.1 christos NEXT (vpc);
6306 1.1 christos
6307 1.1 christos CASE (sem, INSN_PAR_MACWU1) : /* macwu1 $src1,$src2 */
6308 1.1 christos {
6309 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
6310 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
6311 1.1 christos #define FLD(f) abuf->fields.sfmt_st_plus.f
6312 1.1 christos #define OPRND(f) par_exec->operands.sfmt_macwu1.f
6313 1.1 christos int UNUSED written = 0;
6314 1.1 christos IADDR UNUSED pc = abuf->addr;
6315 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
6316 1.1 christos
6317 1.1 christos {
6318 1.1 christos DI opval = SRADI (SLLDI (ADDDI (GET_H_ACCUMS (((UINT) 1)), MULDI (EXTSIDI (* FLD (i_src1)), EXTSIDI (ANDSI (* FLD (i_src2), 65535)))), 8), 8);
6319 1.1 christos OPRND (h_accums_DI_1) = opval;
6320 1.1 christos TRACE_RESULT (current_cpu, abuf, "accums", 'D', opval);
6321 1.1 christos }
6322 1.1 christos
6323 1.1 christos #undef OPRND
6324 1.1 christos #undef FLD
6325 1.1 christos }
6326 1.1 christos NEXT (vpc);
6327 1.1 christos
6328 1.1 christos CASE (sem, INSN_WRITE_MACWU1) : /* macwu1 $src1,$src2 */
6329 1.1 christos {
6330 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
6331 1.1 christos const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
6332 1.1 christos #define FLD(f) abuf->fields.sfmt_st_plus.f
6333 1.1 christos #define OPRND(f) par_exec->operands.sfmt_macwu1.f
6334 1.1 christos int UNUSED written = abuf->written;
6335 1.1 christos IADDR UNUSED pc = abuf->addr;
6336 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
6337 1.1 christos
6338 1.1 christos SET_H_ACCUMS (((UINT) 1), OPRND (h_accums_DI_1));
6339 1.1 christos
6340 1.1 christos #undef OPRND
6341 1.1 christos #undef FLD
6342 1.1 christos }
6343 1.1 christos NEXT (vpc);
6344 1.1 christos
6345 1.1 christos CASE (sem, INSN_PAR_MSBLO) : /* msblo $src1,$src2 */
6346 1.1 christos {
6347 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
6348 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
6349 1.1 christos #define FLD(f) abuf->fields.sfmt_st_plus.f
6350 1.1 christos #define OPRND(f) par_exec->operands.sfmt_msblo.f
6351 1.1 christos int UNUSED written = 0;
6352 1.1 christos IADDR UNUSED pc = abuf->addr;
6353 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
6354 1.1 christos
6355 1.1 christos {
6356 1.1 christos DI opval = SRADI (SLLDI (SUBDI (GET_H_ACCUM (), SRADI (SLLDI (MULDI (EXTHIDI (TRUNCSIHI (* FLD (i_src1))), EXTHIDI (TRUNCSIHI (* FLD (i_src2)))), 32), 16)), 8), 8);
6357 1.1 christos OPRND (accum) = opval;
6358 1.1 christos TRACE_RESULT (current_cpu, abuf, "accum", 'D', opval);
6359 1.1 christos }
6360 1.1 christos
6361 1.1 christos #undef OPRND
6362 1.1 christos #undef FLD
6363 1.1 christos }
6364 1.1 christos NEXT (vpc);
6365 1.1 christos
6366 1.1 christos CASE (sem, INSN_WRITE_MSBLO) : /* msblo $src1,$src2 */
6367 1.1 christos {
6368 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
6369 1.1 christos const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
6370 1.1 christos #define FLD(f) abuf->fields.sfmt_st_plus.f
6371 1.1 christos #define OPRND(f) par_exec->operands.sfmt_msblo.f
6372 1.1 christos int UNUSED written = abuf->written;
6373 1.1 christos IADDR UNUSED pc = abuf->addr;
6374 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
6375 1.1 christos
6376 1.1 christos SET_H_ACCUM (OPRND (accum));
6377 1.1 christos
6378 1.1 christos #undef OPRND
6379 1.1 christos #undef FLD
6380 1.1 christos }
6381 1.1 christos NEXT (vpc);
6382 1.1 christos
6383 1.1 christos CASE (sem, INSN_PAR_MULWU1) : /* mulwu1 $src1,$src2 */
6384 1.1 christos {
6385 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
6386 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
6387 1.1 christos #define FLD(f) abuf->fields.sfmt_st_plus.f
6388 1.1 christos #define OPRND(f) par_exec->operands.sfmt_mulwu1.f
6389 1.1 christos int UNUSED written = 0;
6390 1.1 christos IADDR UNUSED pc = abuf->addr;
6391 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
6392 1.1 christos
6393 1.1 christos {
6394 1.1 christos DI opval = SRADI (SLLDI (MULDI (EXTSIDI (* FLD (i_src1)), EXTSIDI (ANDSI (* FLD (i_src2), 65535))), 16), 16);
6395 1.1 christos OPRND (h_accums_DI_1) = opval;
6396 1.1 christos TRACE_RESULT (current_cpu, abuf, "accums", 'D', opval);
6397 1.1 christos }
6398 1.1 christos
6399 1.1 christos #undef OPRND
6400 1.1 christos #undef FLD
6401 1.1 christos }
6402 1.1 christos NEXT (vpc);
6403 1.1 christos
6404 1.1 christos CASE (sem, INSN_WRITE_MULWU1) : /* mulwu1 $src1,$src2 */
6405 1.1 christos {
6406 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
6407 1.1 christos const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
6408 1.1 christos #define FLD(f) abuf->fields.sfmt_st_plus.f
6409 1.1 christos #define OPRND(f) par_exec->operands.sfmt_mulwu1.f
6410 1.1 christos int UNUSED written = abuf->written;
6411 1.1 christos IADDR UNUSED pc = abuf->addr;
6412 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
6413 1.1 christos
6414 1.1 christos SET_H_ACCUMS (((UINT) 1), OPRND (h_accums_DI_1));
6415 1.1 christos
6416 1.1 christos #undef OPRND
6417 1.1 christos #undef FLD
6418 1.1 christos }
6419 1.1 christos NEXT (vpc);
6420 1.1 christos
6421 1.1 christos CASE (sem, INSN_PAR_MACLH1) : /* maclh1 $src1,$src2 */
6422 1.1 christos {
6423 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
6424 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
6425 1.1 christos #define FLD(f) abuf->fields.sfmt_st_plus.f
6426 1.1 christos #define OPRND(f) par_exec->operands.sfmt_macwu1.f
6427 1.1 christos int UNUSED written = 0;
6428 1.1 christos IADDR UNUSED pc = abuf->addr;
6429 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
6430 1.1 christos
6431 1.1 christos {
6432 1.1 christos DI opval = SRADI (SLLDI (ADDDI (GET_H_ACCUMS (((UINT) 1)), SLLDI (EXTSIDI (MULSI (EXTHISI (TRUNCSIHI (* FLD (i_src1))), SRASI (* FLD (i_src2), 16))), 16)), 8), 8);
6433 1.1 christos OPRND (h_accums_DI_1) = opval;
6434 1.1 christos TRACE_RESULT (current_cpu, abuf, "accums", 'D', opval);
6435 1.1 christos }
6436 1.1 christos
6437 1.1 christos #undef OPRND
6438 1.1 christos #undef FLD
6439 1.1 christos }
6440 1.1 christos NEXT (vpc);
6441 1.1 christos
6442 1.1 christos CASE (sem, INSN_WRITE_MACLH1) : /* maclh1 $src1,$src2 */
6443 1.1 christos {
6444 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
6445 1.1 christos const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
6446 1.1 christos #define FLD(f) abuf->fields.sfmt_st_plus.f
6447 1.1 christos #define OPRND(f) par_exec->operands.sfmt_macwu1.f
6448 1.1 christos int UNUSED written = abuf->written;
6449 1.1 christos IADDR UNUSED pc = abuf->addr;
6450 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
6451 1.1 christos
6452 1.1 christos SET_H_ACCUMS (((UINT) 1), OPRND (h_accums_DI_1));
6453 1.1 christos
6454 1.1 christos #undef OPRND
6455 1.1 christos #undef FLD
6456 1.1 christos }
6457 1.1 christos NEXT (vpc);
6458 1.1 christos
6459 1.1 christos CASE (sem, INSN_PAR_SC) : /* sc */
6460 1.1 christos {
6461 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
6462 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
6463 1.1 christos #define FLD(f) abuf->fields.sfmt_empty.f
6464 1.1 christos #define OPRND(f) par_exec->operands.sfmt_sc.f
6465 1.1 christos int UNUSED written = 0;
6466 1.1 christos IADDR UNUSED pc = abuf->addr;
6467 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
6468 1.1 christos
6469 1.1 christos if (ZEXTBISI (CPU (h_cond)))
6470 1.1 christos SEM_SKIP_INSN (current_cpu, sem_arg, vpc);
6471 1.1 christos
6472 1.1 christos #undef OPRND
6473 1.1 christos #undef FLD
6474 1.1 christos }
6475 1.1 christos NEXT (vpc);
6476 1.1 christos
6477 1.1 christos CASE (sem, INSN_WRITE_SC) : /* sc */
6478 1.1 christos {
6479 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
6480 1.1 christos const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
6481 1.1 christos #define FLD(f) abuf->fields.sfmt_empty.f
6482 1.1 christos #define OPRND(f) par_exec->operands.sfmt_sc.f
6483 1.1 christos int UNUSED written = abuf->written;
6484 1.1 christos IADDR UNUSED pc = abuf->addr;
6485 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
6486 1.1 christos
6487 1.1 christos
6488 1.1 christos #undef OPRND
6489 1.1 christos #undef FLD
6490 1.1 christos }
6491 1.1 christos NEXT (vpc);
6492 1.1 christos
6493 1.1 christos CASE (sem, INSN_PAR_SNC) : /* snc */
6494 1.1 christos {
6495 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
6496 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
6497 1.1 christos #define FLD(f) abuf->fields.sfmt_empty.f
6498 1.1 christos #define OPRND(f) par_exec->operands.sfmt_sc.f
6499 1.1 christos int UNUSED written = 0;
6500 1.1 christos IADDR UNUSED pc = abuf->addr;
6501 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
6502 1.1 christos
6503 1.1 christos if (ZEXTBISI (NOTBI (CPU (h_cond))))
6504 1.1 christos SEM_SKIP_INSN (current_cpu, sem_arg, vpc);
6505 1.1 christos
6506 1.1 christos #undef OPRND
6507 1.1 christos #undef FLD
6508 1.1 christos }
6509 1.1 christos NEXT (vpc);
6510 1.1 christos
6511 1.1 christos CASE (sem, INSN_WRITE_SNC) : /* snc */
6512 1.1 christos {
6513 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
6514 1.1 christos const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
6515 1.1 christos #define FLD(f) abuf->fields.sfmt_empty.f
6516 1.1 christos #define OPRND(f) par_exec->operands.sfmt_sc.f
6517 1.1 christos int UNUSED written = abuf->written;
6518 1.1 christos IADDR UNUSED pc = abuf->addr;
6519 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
6520 1.1 christos
6521 1.1 christos
6522 1.1 christos #undef OPRND
6523 1.1 christos #undef FLD
6524 1.1 christos }
6525 1.1 christos NEXT (vpc);
6526 1.1 christos
6527 1.1 christos CASE (sem, INSN_PAR_CLRPSW) : /* clrpsw $uimm8 */
6528 1.1 christos {
6529 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
6530 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
6531 1.1 christos #define FLD(f) abuf->fields.sfmt_clrpsw.f
6532 1.1 christos #define OPRND(f) par_exec->operands.sfmt_clrpsw.f
6533 1.1 christos int UNUSED written = 0;
6534 1.1 christos IADDR UNUSED pc = abuf->addr;
6535 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
6536 1.1 christos
6537 1.1 christos {
6538 1.1 christos USI opval = ANDSI (GET_H_CR (((UINT) 0)), ORSI (ZEXTQISI (INVQI (FLD (f_uimm8))), 65280));
6539 1.1 christos OPRND (h_cr_USI_0) = opval;
6540 1.1 christos TRACE_RESULT (current_cpu, abuf, "cr", 'x', opval);
6541 1.1 christos }
6542 1.1 christos
6543 1.1 christos #undef OPRND
6544 1.1 christos #undef FLD
6545 1.1 christos }
6546 1.1 christos NEXT (vpc);
6547 1.1 christos
6548 1.1 christos CASE (sem, INSN_WRITE_CLRPSW) : /* clrpsw $uimm8 */
6549 1.1 christos {
6550 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
6551 1.1 christos const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
6552 1.1 christos #define FLD(f) abuf->fields.sfmt_clrpsw.f
6553 1.1 christos #define OPRND(f) par_exec->operands.sfmt_clrpsw.f
6554 1.1 christos int UNUSED written = abuf->written;
6555 1.1 christos IADDR UNUSED pc = abuf->addr;
6556 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
6557 1.1 christos
6558 1.1 christos SET_H_CR (((UINT) 0), OPRND (h_cr_USI_0));
6559 1.1 christos
6560 1.1 christos #undef OPRND
6561 1.1 christos #undef FLD
6562 1.1 christos }
6563 1.1 christos NEXT (vpc);
6564 1.1 christos
6565 1.1 christos CASE (sem, INSN_PAR_SETPSW) : /* setpsw $uimm8 */
6566 1.1 christos {
6567 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
6568 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
6569 1.1 christos #define FLD(f) abuf->fields.sfmt_clrpsw.f
6570 1.1 christos #define OPRND(f) par_exec->operands.sfmt_setpsw.f
6571 1.1 christos int UNUSED written = 0;
6572 1.1 christos IADDR UNUSED pc = abuf->addr;
6573 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
6574 1.1 christos
6575 1.1 christos {
6576 1.1 christos USI opval = FLD (f_uimm8);
6577 1.1 christos OPRND (h_cr_USI_0) = opval;
6578 1.1 christos TRACE_RESULT (current_cpu, abuf, "cr", 'x', opval);
6579 1.1 christos }
6580 1.1 christos
6581 1.1 christos #undef OPRND
6582 1.1 christos #undef FLD
6583 1.1 christos }
6584 1.1 christos NEXT (vpc);
6585 1.1 christos
6586 1.1 christos CASE (sem, INSN_WRITE_SETPSW) : /* setpsw $uimm8 */
6587 1.1 christos {
6588 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
6589 1.1 christos const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
6590 1.1 christos #define FLD(f) abuf->fields.sfmt_clrpsw.f
6591 1.1 christos #define OPRND(f) par_exec->operands.sfmt_setpsw.f
6592 1.1 christos int UNUSED written = abuf->written;
6593 1.1 christos IADDR UNUSED pc = abuf->addr;
6594 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
6595 1.1 christos
6596 1.1 christos SET_H_CR (((UINT) 0), OPRND (h_cr_USI_0));
6597 1.1 christos
6598 1.1 christos #undef OPRND
6599 1.1 christos #undef FLD
6600 1.1 christos }
6601 1.1 christos NEXT (vpc);
6602 1.1 christos
6603 1.1 christos CASE (sem, INSN_PAR_BTST) : /* btst $uimm3,$sr */
6604 1.1 christos {
6605 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
6606 1.1 christos ARGBUF *abuf = SEM_ARGBUF (sem_arg);
6607 1.1 christos #define FLD(f) abuf->fields.sfmt_bset.f
6608 1.1 christos #define OPRND(f) par_exec->operands.sfmt_btst.f
6609 1.1 christos int UNUSED written = 0;
6610 1.1 christos IADDR UNUSED pc = abuf->addr;
6611 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
6612 1.1 christos
6613 1.1 christos {
6614 1.1 christos BI opval = ANDQI (SRLQI (* FLD (i_sr), SUBSI (7, FLD (f_uimm3))), 1);
6615 1.1 christos OPRND (condbit) = opval;
6616 1.1 christos TRACE_RESULT (current_cpu, abuf, "cond", 'x', opval);
6617 1.1 christos }
6618 1.1 christos
6619 1.1 christos #undef OPRND
6620 1.1 christos #undef FLD
6621 1.1 christos }
6622 1.1 christos NEXT (vpc);
6623 1.1 christos
6624 1.1 christos CASE (sem, INSN_WRITE_BTST) : /* btst $uimm3,$sr */
6625 1.1 christos {
6626 1.1 christos SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
6627 1.1 christos const ARGBUF *abuf = SEM_ARGBUF (sem_arg)->fields.write.abuf;
6628 1.1 christos #define FLD(f) abuf->fields.sfmt_bset.f
6629 1.1 christos #define OPRND(f) par_exec->operands.sfmt_btst.f
6630 1.1 christos int UNUSED written = abuf->written;
6631 1.1 christos IADDR UNUSED pc = abuf->addr;
6632 1.1 christos vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
6633 1.1 christos
6634 1.1 christos CPU (h_cond) = OPRND (condbit);
6635 1.1 christos
6636 1.1 christos #undef OPRND
6637 1.1 christos #undef FLD
6638 1.1 christos }
6639 1.1 christos NEXT (vpc);
6640 1.1 christos
6641 1.1 christos
6642 1.1 christos }
6643 1.1 christos ENDSWITCH (sem) /* End of semantic switch. */
6644 1.1 christos
6645 1.1 christos /* At this point `vpc' contains the next insn to execute. */
6646 1.1 christos }
6647 1.1 christos
6648 1.1 christos #undef DEFINE_SWITCH
6649 1.1 christos #endif /* DEFINE_SWITCH */
6650