OpenCores
URL https://opencores.org/ocsvn/openrisc_2011-10-31/openrisc_2011-10-31/trunk

Subversion Repositories openrisc_2011-10-31

[/] [openrisc/] [trunk/] [gnu-src/] [gdb-6.8/] [sim/] [m32r/] [sem2-switch.c] - Blame information for rev 165

Go to most recent revision | Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.