1 /* Simulator instruction semantics for m32rxf.
3 THIS FILE IS MACHINE GENERATED WITH CGEN.
5 Copyright (C) 1996, 1997, 1998, 1999 Free Software Foundation, Inc.
7 This file is part of the GNU Simulators.
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 2, or (at your option)
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.
19 You should have received a copy of the GNU General Public License along
20 with this program; if not, write to the Free Software Foundation, Inc.,
21 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
27 /* The labels have the case they have because the enum of insn types
28 is all uppercase and in the non-stdc case the insn symbol is built
29 into the enum name. */
35 { M32RXF_INSN_X_INVALID
, && case_sem_INSN_X_INVALID
},
36 { M32RXF_INSN_X_AFTER
, && case_sem_INSN_X_AFTER
},
37 { M32RXF_INSN_X_BEFORE
, && case_sem_INSN_X_BEFORE
},
38 { M32RXF_INSN_X_CTI_CHAIN
, && case_sem_INSN_X_CTI_CHAIN
},
39 { M32RXF_INSN_X_CHAIN
, && case_sem_INSN_X_CHAIN
},
40 { M32RXF_INSN_X_BEGIN
, && case_sem_INSN_X_BEGIN
},
41 { M32RXF_INSN_ADD
, && case_sem_INSN_ADD
},
42 { M32RXF_INSN_ADD3
, && case_sem_INSN_ADD3
},
43 { M32RXF_INSN_AND
, && case_sem_INSN_AND
},
44 { M32RXF_INSN_AND3
, && case_sem_INSN_AND3
},
45 { M32RXF_INSN_OR
, && case_sem_INSN_OR
},
46 { M32RXF_INSN_OR3
, && case_sem_INSN_OR3
},
47 { M32RXF_INSN_XOR
, && case_sem_INSN_XOR
},
48 { M32RXF_INSN_XOR3
, && case_sem_INSN_XOR3
},
49 { M32RXF_INSN_ADDI
, && case_sem_INSN_ADDI
},
50 { M32RXF_INSN_ADDV
, && case_sem_INSN_ADDV
},
51 { M32RXF_INSN_ADDV3
, && case_sem_INSN_ADDV3
},
52 { M32RXF_INSN_ADDX
, && case_sem_INSN_ADDX
},
53 { M32RXF_INSN_BC8
, && case_sem_INSN_BC8
},
54 { M32RXF_INSN_BC24
, && case_sem_INSN_BC24
},
55 { M32RXF_INSN_BEQ
, && case_sem_INSN_BEQ
},
56 { M32RXF_INSN_BEQZ
, && case_sem_INSN_BEQZ
},
57 { M32RXF_INSN_BGEZ
, && case_sem_INSN_BGEZ
},
58 { M32RXF_INSN_BGTZ
, && case_sem_INSN_BGTZ
},
59 { M32RXF_INSN_BLEZ
, && case_sem_INSN_BLEZ
},
60 { M32RXF_INSN_BLTZ
, && case_sem_INSN_BLTZ
},
61 { M32RXF_INSN_BNEZ
, && case_sem_INSN_BNEZ
},
62 { M32RXF_INSN_BL8
, && case_sem_INSN_BL8
},
63 { M32RXF_INSN_BL24
, && case_sem_INSN_BL24
},
64 { M32RXF_INSN_BCL8
, && case_sem_INSN_BCL8
},
65 { M32RXF_INSN_BCL24
, && case_sem_INSN_BCL24
},
66 { M32RXF_INSN_BNC8
, && case_sem_INSN_BNC8
},
67 { M32RXF_INSN_BNC24
, && case_sem_INSN_BNC24
},
68 { M32RXF_INSN_BNE
, && case_sem_INSN_BNE
},
69 { M32RXF_INSN_BRA8
, && case_sem_INSN_BRA8
},
70 { M32RXF_INSN_BRA24
, && case_sem_INSN_BRA24
},
71 { M32RXF_INSN_BNCL8
, && case_sem_INSN_BNCL8
},
72 { M32RXF_INSN_BNCL24
, && case_sem_INSN_BNCL24
},
73 { M32RXF_INSN_CMP
, && case_sem_INSN_CMP
},
74 { M32RXF_INSN_CMPI
, && case_sem_INSN_CMPI
},
75 { M32RXF_INSN_CMPU
, && case_sem_INSN_CMPU
},
76 { M32RXF_INSN_CMPUI
, && case_sem_INSN_CMPUI
},
77 { M32RXF_INSN_CMPEQ
, && case_sem_INSN_CMPEQ
},
78 { M32RXF_INSN_CMPZ
, && case_sem_INSN_CMPZ
},
79 { M32RXF_INSN_DIV
, && case_sem_INSN_DIV
},
80 { M32RXF_INSN_DIVU
, && case_sem_INSN_DIVU
},
81 { M32RXF_INSN_REM
, && case_sem_INSN_REM
},
82 { M32RXF_INSN_REMU
, && case_sem_INSN_REMU
},
83 { M32RXF_INSN_DIVH
, && case_sem_INSN_DIVH
},
84 { M32RXF_INSN_JC
, && case_sem_INSN_JC
},
85 { M32RXF_INSN_JNC
, && case_sem_INSN_JNC
},
86 { M32RXF_INSN_JL
, && case_sem_INSN_JL
},
87 { M32RXF_INSN_JMP
, && case_sem_INSN_JMP
},
88 { M32RXF_INSN_LD
, && case_sem_INSN_LD
},
89 { M32RXF_INSN_LD_D
, && case_sem_INSN_LD_D
},
90 { M32RXF_INSN_LDB
, && case_sem_INSN_LDB
},
91 { M32RXF_INSN_LDB_D
, && case_sem_INSN_LDB_D
},
92 { M32RXF_INSN_LDH
, && case_sem_INSN_LDH
},
93 { M32RXF_INSN_LDH_D
, && case_sem_INSN_LDH_D
},
94 { M32RXF_INSN_LDUB
, && case_sem_INSN_LDUB
},
95 { M32RXF_INSN_LDUB_D
, && case_sem_INSN_LDUB_D
},
96 { M32RXF_INSN_LDUH
, && case_sem_INSN_LDUH
},
97 { M32RXF_INSN_LDUH_D
, && case_sem_INSN_LDUH_D
},
98 { M32RXF_INSN_LD_PLUS
, && case_sem_INSN_LD_PLUS
},
99 { M32RXF_INSN_LD24
, && case_sem_INSN_LD24
},
100 { M32RXF_INSN_LDI8
, && case_sem_INSN_LDI8
},
101 { M32RXF_INSN_LDI16
, && case_sem_INSN_LDI16
},
102 { M32RXF_INSN_LOCK
, && case_sem_INSN_LOCK
},
103 { M32RXF_INSN_MACHI_A
, && case_sem_INSN_MACHI_A
},
104 { M32RXF_INSN_MACLO_A
, && case_sem_INSN_MACLO_A
},
105 { M32RXF_INSN_MACWHI_A
, && case_sem_INSN_MACWHI_A
},
106 { M32RXF_INSN_MACWLO_A
, && case_sem_INSN_MACWLO_A
},
107 { M32RXF_INSN_MUL
, && case_sem_INSN_MUL
},
108 { M32RXF_INSN_MULHI_A
, && case_sem_INSN_MULHI_A
},
109 { M32RXF_INSN_MULLO_A
, && case_sem_INSN_MULLO_A
},
110 { M32RXF_INSN_MULWHI_A
, && case_sem_INSN_MULWHI_A
},
111 { M32RXF_INSN_MULWLO_A
, && case_sem_INSN_MULWLO_A
},
112 { M32RXF_INSN_MV
, && case_sem_INSN_MV
},
113 { M32RXF_INSN_MVFACHI_A
, && case_sem_INSN_MVFACHI_A
},
114 { M32RXF_INSN_MVFACLO_A
, && case_sem_INSN_MVFACLO_A
},
115 { M32RXF_INSN_MVFACMI_A
, && case_sem_INSN_MVFACMI_A
},
116 { M32RXF_INSN_MVFC
, && case_sem_INSN_MVFC
},
117 { M32RXF_INSN_MVTACHI_A
, && case_sem_INSN_MVTACHI_A
},
118 { M32RXF_INSN_MVTACLO_A
, && case_sem_INSN_MVTACLO_A
},
119 { M32RXF_INSN_MVTC
, && case_sem_INSN_MVTC
},
120 { M32RXF_INSN_NEG
, && case_sem_INSN_NEG
},
121 { M32RXF_INSN_NOP
, && case_sem_INSN_NOP
},
122 { M32RXF_INSN_NOT
, && case_sem_INSN_NOT
},
123 { M32RXF_INSN_RAC_DSI
, && case_sem_INSN_RAC_DSI
},
124 { M32RXF_INSN_RACH_DSI
, && case_sem_INSN_RACH_DSI
},
125 { M32RXF_INSN_RTE
, && case_sem_INSN_RTE
},
126 { M32RXF_INSN_SETH
, && case_sem_INSN_SETH
},
127 { M32RXF_INSN_SLL
, && case_sem_INSN_SLL
},
128 { M32RXF_INSN_SLL3
, && case_sem_INSN_SLL3
},
129 { M32RXF_INSN_SLLI
, && case_sem_INSN_SLLI
},
130 { M32RXF_INSN_SRA
, && case_sem_INSN_SRA
},
131 { M32RXF_INSN_SRA3
, && case_sem_INSN_SRA3
},
132 { M32RXF_INSN_SRAI
, && case_sem_INSN_SRAI
},
133 { M32RXF_INSN_SRL
, && case_sem_INSN_SRL
},
134 { M32RXF_INSN_SRL3
, && case_sem_INSN_SRL3
},
135 { M32RXF_INSN_SRLI
, && case_sem_INSN_SRLI
},
136 { M32RXF_INSN_ST
, && case_sem_INSN_ST
},
137 { M32RXF_INSN_ST_D
, && case_sem_INSN_ST_D
},
138 { M32RXF_INSN_STB
, && case_sem_INSN_STB
},
139 { M32RXF_INSN_STB_D
, && case_sem_INSN_STB_D
},
140 { M32RXF_INSN_STH
, && case_sem_INSN_STH
},
141 { M32RXF_INSN_STH_D
, && case_sem_INSN_STH_D
},
142 { M32RXF_INSN_ST_PLUS
, && case_sem_INSN_ST_PLUS
},
143 { M32RXF_INSN_ST_MINUS
, && case_sem_INSN_ST_MINUS
},
144 { M32RXF_INSN_SUB
, && case_sem_INSN_SUB
},
145 { M32RXF_INSN_SUBV
, && case_sem_INSN_SUBV
},
146 { M32RXF_INSN_SUBX
, && case_sem_INSN_SUBX
},
147 { M32RXF_INSN_TRAP
, && case_sem_INSN_TRAP
},
148 { M32RXF_INSN_UNLOCK
, && case_sem_INSN_UNLOCK
},
149 { M32RXF_INSN_SATB
, && case_sem_INSN_SATB
},
150 { M32RXF_INSN_SATH
, && case_sem_INSN_SATH
},
151 { M32RXF_INSN_SAT
, && case_sem_INSN_SAT
},
152 { M32RXF_INSN_PCMPBZ
, && case_sem_INSN_PCMPBZ
},
153 { M32RXF_INSN_SADD
, && case_sem_INSN_SADD
},
154 { M32RXF_INSN_MACWU1
, && case_sem_INSN_MACWU1
},
155 { M32RXF_INSN_MSBLO
, && case_sem_INSN_MSBLO
},
156 { M32RXF_INSN_MULWU1
, && case_sem_INSN_MULWU1
},
157 { M32RXF_INSN_MACLH1
, && case_sem_INSN_MACLH1
},
158 { M32RXF_INSN_SC
, && case_sem_INSN_SC
},
159 { M32RXF_INSN_SNC
, && case_sem_INSN_SNC
},
160 { M32RXF_INSN_PAR_ADD
, && case_sem_INSN_PAR_ADD
},
161 { M32RXF_INSN_WRITE_ADD
, && case_sem_INSN_WRITE_ADD
},
162 { M32RXF_INSN_PAR_AND
, && case_sem_INSN_PAR_AND
},
163 { M32RXF_INSN_WRITE_AND
, && case_sem_INSN_WRITE_AND
},
164 { M32RXF_INSN_PAR_OR
, && case_sem_INSN_PAR_OR
},
165 { M32RXF_INSN_WRITE_OR
, && case_sem_INSN_WRITE_OR
},
166 { M32RXF_INSN_PAR_XOR
, && case_sem_INSN_PAR_XOR
},
167 { M32RXF_INSN_WRITE_XOR
, && case_sem_INSN_WRITE_XOR
},
168 { M32RXF_INSN_PAR_ADDI
, && case_sem_INSN_PAR_ADDI
},
169 { M32RXF_INSN_WRITE_ADDI
, && case_sem_INSN_WRITE_ADDI
},
170 { M32RXF_INSN_PAR_ADDV
, && case_sem_INSN_PAR_ADDV
},
171 { M32RXF_INSN_WRITE_ADDV
, && case_sem_INSN_WRITE_ADDV
},
172 { M32RXF_INSN_PAR_ADDX
, && case_sem_INSN_PAR_ADDX
},
173 { M32RXF_INSN_WRITE_ADDX
, && case_sem_INSN_WRITE_ADDX
},
174 { M32RXF_INSN_PAR_BC8
, && case_sem_INSN_PAR_BC8
},
175 { M32RXF_INSN_WRITE_BC8
, && case_sem_INSN_WRITE_BC8
},
176 { M32RXF_INSN_PAR_BL8
, && case_sem_INSN_PAR_BL8
},
177 { M32RXF_INSN_WRITE_BL8
, && case_sem_INSN_WRITE_BL8
},
178 { M32RXF_INSN_PAR_BCL8
, && case_sem_INSN_PAR_BCL8
},
179 { M32RXF_INSN_WRITE_BCL8
, && case_sem_INSN_WRITE_BCL8
},
180 { M32RXF_INSN_PAR_BNC8
, && case_sem_INSN_PAR_BNC8
},
181 { M32RXF_INSN_WRITE_BNC8
, && case_sem_INSN_WRITE_BNC8
},
182 { M32RXF_INSN_PAR_BRA8
, && case_sem_INSN_PAR_BRA8
},
183 { M32RXF_INSN_WRITE_BRA8
, && case_sem_INSN_WRITE_BRA8
},
184 { M32RXF_INSN_PAR_BNCL8
, && case_sem_INSN_PAR_BNCL8
},
185 { M32RXF_INSN_WRITE_BNCL8
, && case_sem_INSN_WRITE_BNCL8
},
186 { M32RXF_INSN_PAR_CMP
, && case_sem_INSN_PAR_CMP
},
187 { M32RXF_INSN_WRITE_CMP
, && case_sem_INSN_WRITE_CMP
},
188 { M32RXF_INSN_PAR_CMPU
, && case_sem_INSN_PAR_CMPU
},
189 { M32RXF_INSN_WRITE_CMPU
, && case_sem_INSN_WRITE_CMPU
},
190 { M32RXF_INSN_PAR_CMPEQ
, && case_sem_INSN_PAR_CMPEQ
},
191 { M32RXF_INSN_WRITE_CMPEQ
, && case_sem_INSN_WRITE_CMPEQ
},
192 { M32RXF_INSN_PAR_CMPZ
, && case_sem_INSN_PAR_CMPZ
},
193 { M32RXF_INSN_WRITE_CMPZ
, && case_sem_INSN_WRITE_CMPZ
},
194 { M32RXF_INSN_PAR_JC
, && case_sem_INSN_PAR_JC
},
195 { M32RXF_INSN_WRITE_JC
, && case_sem_INSN_WRITE_JC
},
196 { M32RXF_INSN_PAR_JNC
, && case_sem_INSN_PAR_JNC
},
197 { M32RXF_INSN_WRITE_JNC
, && case_sem_INSN_WRITE_JNC
},
198 { M32RXF_INSN_PAR_JL
, && case_sem_INSN_PAR_JL
},
199 { M32RXF_INSN_WRITE_JL
, && case_sem_INSN_WRITE_JL
},
200 { M32RXF_INSN_PAR_JMP
, && case_sem_INSN_PAR_JMP
},
201 { M32RXF_INSN_WRITE_JMP
, && case_sem_INSN_WRITE_JMP
},
202 { M32RXF_INSN_PAR_LD
, && case_sem_INSN_PAR_LD
},
203 { M32RXF_INSN_WRITE_LD
, && case_sem_INSN_WRITE_LD
},
204 { M32RXF_INSN_PAR_LDB
, && case_sem_INSN_PAR_LDB
},
205 { M32RXF_INSN_WRITE_LDB
, && case_sem_INSN_WRITE_LDB
},
206 { M32RXF_INSN_PAR_LDH
, && case_sem_INSN_PAR_LDH
},
207 { M32RXF_INSN_WRITE_LDH
, && case_sem_INSN_WRITE_LDH
},
208 { M32RXF_INSN_PAR_LDUB
, && case_sem_INSN_PAR_LDUB
},
209 { M32RXF_INSN_WRITE_LDUB
, && case_sem_INSN_WRITE_LDUB
},
210 { M32RXF_INSN_PAR_LDUH
, && case_sem_INSN_PAR_LDUH
},
211 { M32RXF_INSN_WRITE_LDUH
, && case_sem_INSN_WRITE_LDUH
},
212 { M32RXF_INSN_PAR_LD_PLUS
, && case_sem_INSN_PAR_LD_PLUS
},
213 { M32RXF_INSN_WRITE_LD_PLUS
, && case_sem_INSN_WRITE_LD_PLUS
},
214 { M32RXF_INSN_PAR_LDI8
, && case_sem_INSN_PAR_LDI8
},
215 { M32RXF_INSN_WRITE_LDI8
, && case_sem_INSN_WRITE_LDI8
},
216 { M32RXF_INSN_PAR_LOCK
, && case_sem_INSN_PAR_LOCK
},
217 { M32RXF_INSN_WRITE_LOCK
, && case_sem_INSN_WRITE_LOCK
},
218 { M32RXF_INSN_PAR_MACHI_A
, && case_sem_INSN_PAR_MACHI_A
},
219 { M32RXF_INSN_WRITE_MACHI_A
, && case_sem_INSN_WRITE_MACHI_A
},
220 { M32RXF_INSN_PAR_MACLO_A
, && case_sem_INSN_PAR_MACLO_A
},
221 { M32RXF_INSN_WRITE_MACLO_A
, && case_sem_INSN_WRITE_MACLO_A
},
222 { M32RXF_INSN_PAR_MACWHI_A
, && case_sem_INSN_PAR_MACWHI_A
},
223 { M32RXF_INSN_WRITE_MACWHI_A
, && case_sem_INSN_WRITE_MACWHI_A
},
224 { M32RXF_INSN_PAR_MACWLO_A
, && case_sem_INSN_PAR_MACWLO_A
},
225 { M32RXF_INSN_WRITE_MACWLO_A
, && case_sem_INSN_WRITE_MACWLO_A
},
226 { M32RXF_INSN_PAR_MUL
, && case_sem_INSN_PAR_MUL
},
227 { M32RXF_INSN_WRITE_MUL
, && case_sem_INSN_WRITE_MUL
},
228 { M32RXF_INSN_PAR_MULHI_A
, && case_sem_INSN_PAR_MULHI_A
},
229 { M32RXF_INSN_WRITE_MULHI_A
, && case_sem_INSN_WRITE_MULHI_A
},
230 { M32RXF_INSN_PAR_MULLO_A
, && case_sem_INSN_PAR_MULLO_A
},
231 { M32RXF_INSN_WRITE_MULLO_A
, && case_sem_INSN_WRITE_MULLO_A
},
232 { M32RXF_INSN_PAR_MULWHI_A
, && case_sem_INSN_PAR_MULWHI_A
},
233 { M32RXF_INSN_WRITE_MULWHI_A
, && case_sem_INSN_WRITE_MULWHI_A
},
234 { M32RXF_INSN_PAR_MULWLO_A
, && case_sem_INSN_PAR_MULWLO_A
},
235 { M32RXF_INSN_WRITE_MULWLO_A
, && case_sem_INSN_WRITE_MULWLO_A
},
236 { M32RXF_INSN_PAR_MV
, && case_sem_INSN_PAR_MV
},
237 { M32RXF_INSN_WRITE_MV
, && case_sem_INSN_WRITE_MV
},
238 { M32RXF_INSN_PAR_MVFACHI_A
, && case_sem_INSN_PAR_MVFACHI_A
},
239 { M32RXF_INSN_WRITE_MVFACHI_A
, && case_sem_INSN_WRITE_MVFACHI_A
},
240 { M32RXF_INSN_PAR_MVFACLO_A
, && case_sem_INSN_PAR_MVFACLO_A
},
241 { M32RXF_INSN_WRITE_MVFACLO_A
, && case_sem_INSN_WRITE_MVFACLO_A
},
242 { M32RXF_INSN_PAR_MVFACMI_A
, && case_sem_INSN_PAR_MVFACMI_A
},
243 { M32RXF_INSN_WRITE_MVFACMI_A
, && case_sem_INSN_WRITE_MVFACMI_A
},
244 { M32RXF_INSN_PAR_MVFC
, && case_sem_INSN_PAR_MVFC
},
245 { M32RXF_INSN_WRITE_MVFC
, && case_sem_INSN_WRITE_MVFC
},
246 { M32RXF_INSN_PAR_MVTACHI_A
, && case_sem_INSN_PAR_MVTACHI_A
},
247 { M32RXF_INSN_WRITE_MVTACHI_A
, && case_sem_INSN_WRITE_MVTACHI_A
},
248 { M32RXF_INSN_PAR_MVTACLO_A
, && case_sem_INSN_PAR_MVTACLO_A
},
249 { M32RXF_INSN_WRITE_MVTACLO_A
, && case_sem_INSN_WRITE_MVTACLO_A
},
250 { M32RXF_INSN_PAR_MVTC
, && case_sem_INSN_PAR_MVTC
},
251 { M32RXF_INSN_WRITE_MVTC
, && case_sem_INSN_WRITE_MVTC
},
252 { M32RXF_INSN_PAR_NEG
, && case_sem_INSN_PAR_NEG
},
253 { M32RXF_INSN_WRITE_NEG
, && case_sem_INSN_WRITE_NEG
},
254 { M32RXF_INSN_PAR_NOP
, && case_sem_INSN_PAR_NOP
},
255 { M32RXF_INSN_WRITE_NOP
, && case_sem_INSN_WRITE_NOP
},
256 { M32RXF_INSN_PAR_NOT
, && case_sem_INSN_PAR_NOT
},
257 { M32RXF_INSN_WRITE_NOT
, && case_sem_INSN_WRITE_NOT
},
258 { M32RXF_INSN_PAR_RAC_DSI
, && case_sem_INSN_PAR_RAC_DSI
},
259 { M32RXF_INSN_WRITE_RAC_DSI
, && case_sem_INSN_WRITE_RAC_DSI
},
260 { M32RXF_INSN_PAR_RACH_DSI
, && case_sem_INSN_PAR_RACH_DSI
},
261 { M32RXF_INSN_WRITE_RACH_DSI
, && case_sem_INSN_WRITE_RACH_DSI
},
262 { M32RXF_INSN_PAR_RTE
, && case_sem_INSN_PAR_RTE
},
263 { M32RXF_INSN_WRITE_RTE
, && case_sem_INSN_WRITE_RTE
},
264 { M32RXF_INSN_PAR_SLL
, && case_sem_INSN_PAR_SLL
},
265 { M32RXF_INSN_WRITE_SLL
, && case_sem_INSN_WRITE_SLL
},
266 { M32RXF_INSN_PAR_SLLI
, && case_sem_INSN_PAR_SLLI
},
267 { M32RXF_INSN_WRITE_SLLI
, && case_sem_INSN_WRITE_SLLI
},
268 { M32RXF_INSN_PAR_SRA
, && case_sem_INSN_PAR_SRA
},
269 { M32RXF_INSN_WRITE_SRA
, && case_sem_INSN_WRITE_SRA
},
270 { M32RXF_INSN_PAR_SRAI
, && case_sem_INSN_PAR_SRAI
},
271 { M32RXF_INSN_WRITE_SRAI
, && case_sem_INSN_WRITE_SRAI
},
272 { M32RXF_INSN_PAR_SRL
, && case_sem_INSN_PAR_SRL
},
273 { M32RXF_INSN_WRITE_SRL
, && case_sem_INSN_WRITE_SRL
},
274 { M32RXF_INSN_PAR_SRLI
, && case_sem_INSN_PAR_SRLI
},
275 { M32RXF_INSN_WRITE_SRLI
, && case_sem_INSN_WRITE_SRLI
},
276 { M32RXF_INSN_PAR_ST
, && case_sem_INSN_PAR_ST
},
277 { M32RXF_INSN_WRITE_ST
, && case_sem_INSN_WRITE_ST
},
278 { M32RXF_INSN_PAR_STB
, && case_sem_INSN_PAR_STB
},
279 { M32RXF_INSN_WRITE_STB
, && case_sem_INSN_WRITE_STB
},
280 { M32RXF_INSN_PAR_STH
, && case_sem_INSN_PAR_STH
},
281 { M32RXF_INSN_WRITE_STH
, && case_sem_INSN_WRITE_STH
},
282 { M32RXF_INSN_PAR_ST_PLUS
, && case_sem_INSN_PAR_ST_PLUS
},
283 { M32RXF_INSN_WRITE_ST_PLUS
, && case_sem_INSN_WRITE_ST_PLUS
},
284 { M32RXF_INSN_PAR_ST_MINUS
, && case_sem_INSN_PAR_ST_MINUS
},
285 { M32RXF_INSN_WRITE_ST_MINUS
, && case_sem_INSN_WRITE_ST_MINUS
},
286 { M32RXF_INSN_PAR_SUB
, && case_sem_INSN_PAR_SUB
},
287 { M32RXF_INSN_WRITE_SUB
, && case_sem_INSN_WRITE_SUB
},
288 { M32RXF_INSN_PAR_SUBV
, && case_sem_INSN_PAR_SUBV
},
289 { M32RXF_INSN_WRITE_SUBV
, && case_sem_INSN_WRITE_SUBV
},
290 { M32RXF_INSN_PAR_SUBX
, && case_sem_INSN_PAR_SUBX
},
291 { M32RXF_INSN_WRITE_SUBX
, && case_sem_INSN_WRITE_SUBX
},
292 { M32RXF_INSN_PAR_TRAP
, && case_sem_INSN_PAR_TRAP
},
293 { M32RXF_INSN_WRITE_TRAP
, && case_sem_INSN_WRITE_TRAP
},
294 { M32RXF_INSN_PAR_UNLOCK
, && case_sem_INSN_PAR_UNLOCK
},
295 { M32RXF_INSN_WRITE_UNLOCK
, && case_sem_INSN_WRITE_UNLOCK
},
296 { M32RXF_INSN_PAR_PCMPBZ
, && case_sem_INSN_PAR_PCMPBZ
},
297 { M32RXF_INSN_WRITE_PCMPBZ
, && case_sem_INSN_WRITE_PCMPBZ
},
298 { M32RXF_INSN_PAR_SADD
, && case_sem_INSN_PAR_SADD
},
299 { M32RXF_INSN_WRITE_SADD
, && case_sem_INSN_WRITE_SADD
},
300 { M32RXF_INSN_PAR_MACWU1
, && case_sem_INSN_PAR_MACWU1
},
301 { M32RXF_INSN_WRITE_MACWU1
, && case_sem_INSN_WRITE_MACWU1
},
302 { M32RXF_INSN_PAR_MSBLO
, && case_sem_INSN_PAR_MSBLO
},
303 { M32RXF_INSN_WRITE_MSBLO
, && case_sem_INSN_WRITE_MSBLO
},
304 { M32RXF_INSN_PAR_MULWU1
, && case_sem_INSN_PAR_MULWU1
},
305 { M32RXF_INSN_WRITE_MULWU1
, && case_sem_INSN_WRITE_MULWU1
},
306 { M32RXF_INSN_PAR_MACLH1
, && case_sem_INSN_PAR_MACLH1
},
307 { M32RXF_INSN_WRITE_MACLH1
, && case_sem_INSN_WRITE_MACLH1
},
308 { M32RXF_INSN_PAR_SC
, && case_sem_INSN_PAR_SC
},
309 { M32RXF_INSN_WRITE_SC
, && case_sem_INSN_WRITE_SC
},
310 { M32RXF_INSN_PAR_SNC
, && case_sem_INSN_PAR_SNC
},
311 { M32RXF_INSN_WRITE_SNC
, && case_sem_INSN_WRITE_SNC
},
316 for (i
= 0; labels
[i
].label
!= 0; ++i
)
319 CPU_IDESC (current_cpu
) [labels
[i
].index
].sem_fast_lab
= labels
[i
].label
;
321 CPU_IDESC (current_cpu
) [labels
[i
].index
].sem_full_lab
= labels
[i
].label
;
326 #endif /* DEFINE_LABELS */
330 /* If hyper-fast [well not unnecessarily slow] execution is selected, turn
331 off frills like tracing and profiling. */
332 /* FIXME: A better way would be to have TRACE_RESULT check for something
333 that can cause it to be optimized out. Another way would be to emit
334 special handlers into the instruction "stream". */
338 #define TRACE_RESULT(cpu, abuf, name, type, val)
342 #define GET_ATTR(cpu, num, attr) CGEN_ATTR_VALUE (NULL, abuf->idesc->attrs, CGEN_INSN_##attr)
348 /* Branch to next handler without going around main loop. */
349 #define NEXT(vpc) goto * SEM_ARGBUF (vpc) -> semantic.sem_case
350 SWITCH (sem
, SEM_ARGBUF (vpc
) -> semantic
.sem_case
)
352 #else /* ! WITH_SCACHE_PBB */
354 #define NEXT(vpc) BREAK (sem)
357 SWITCH (sem
, SEM_ARGBUF (sc
) -> idesc
->sem_fast_lab
)
359 SWITCH (sem
, SEM_ARGBUF (sc
) -> idesc
->sem_full_lab
)
362 SWITCH (sem
, SEM_ARGBUF (sc
) -> idesc
->num
)
365 #endif /* ! WITH_SCACHE_PBB */
369 CASE (sem
, INSN_X_INVALID
) : /* --invalid-- */
371 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
372 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
373 #define FLD(f) abuf->fields.fmt_empty.f
374 int UNUSED written
= 0;
375 IADDR UNUSED pc
= abuf
->addr
;
376 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 0);
379 /* Update the recorded pc in the cpu state struct.
380 Only necessary for WITH_SCACHE case, but to avoid the
381 conditional compilation .... */
383 /* Virtual insns have zero size. Overwrite vpc with address of next insn
384 using the default-insn-bitsize spec. When executing insns in parallel
385 we may want to queue the fault and continue execution. */
386 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 4);
387 vpc
= sim_engine_invalid_insn (current_cpu
, pc
, vpc
);
394 CASE (sem
, INSN_X_AFTER
) : /* --after-- */
396 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
397 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
398 #define FLD(f) abuf->fields.fmt_empty.f
399 int UNUSED written
= 0;
400 IADDR UNUSED pc
= abuf
->addr
;
401 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 0);
404 #if WITH_SCACHE_PBB_M32RXF
405 m32rxf_pbb_after (current_cpu
, sem_arg
);
413 CASE (sem
, INSN_X_BEFORE
) : /* --before-- */
415 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
416 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
417 #define FLD(f) abuf->fields.fmt_empty.f
418 int UNUSED written
= 0;
419 IADDR UNUSED pc
= abuf
->addr
;
420 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 0);
423 #if WITH_SCACHE_PBB_M32RXF
424 m32rxf_pbb_before (current_cpu
, sem_arg
);
432 CASE (sem
, INSN_X_CTI_CHAIN
) : /* --cti-chain-- */
434 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
435 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
436 #define FLD(f) abuf->fields.fmt_empty.f
437 int UNUSED written
= 0;
438 IADDR UNUSED pc
= abuf
->addr
;
439 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 0);
442 #if WITH_SCACHE_PBB_M32RXF
444 vpc
= m32rxf_pbb_cti_chain (current_cpu
, sem_arg
,
445 pbb_br_type
, pbb_br_npc
);
448 /* FIXME: Allow provision of explicit ifmt spec in insn spec. */
449 vpc
= m32rxf_pbb_cti_chain (current_cpu
, sem_arg
,
450 CPU_PBB_BR_TYPE (current_cpu
),
451 CPU_PBB_BR_NPC (current_cpu
));
460 CASE (sem
, INSN_X_CHAIN
) : /* --chain-- */
462 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
463 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
464 #define FLD(f) abuf->fields.fmt_empty.f
465 int UNUSED written
= 0;
466 IADDR UNUSED pc
= abuf
->addr
;
467 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 0);
470 #if WITH_SCACHE_PBB_M32RXF
471 vpc
= m32rxf_pbb_chain (current_cpu
, sem_arg
);
482 CASE (sem
, INSN_X_BEGIN
) : /* --begin-- */
484 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
485 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
486 #define FLD(f) abuf->fields.fmt_empty.f
487 int UNUSED written
= 0;
488 IADDR UNUSED pc
= abuf
->addr
;
489 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 0);
492 #if WITH_SCACHE_PBB_M32RXF
494 /* In the switch case FAST_P is a constant, allowing several optimizations
495 in any called inline functions. */
496 vpc
= m32rxf_pbb_begin (current_cpu
, FAST_P
);
498 vpc
= m32rxf_pbb_begin (current_cpu
, STATE_RUN_FAST_P (CPU_STATE (current_cpu
)));
507 CASE (sem
, INSN_ADD
) : /* add $dr,$sr */
509 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
510 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
511 #define FLD(f) abuf->fields.sfmt_add.f
512 int UNUSED written
= 0;
513 IADDR UNUSED pc
= abuf
->addr
;
514 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
517 SI opval
= ADDSI (* FLD (i_dr
), * FLD (i_sr
));
518 * FLD (i_dr
) = opval
;
519 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
526 CASE (sem
, INSN_ADD3
) : /* add3 $dr,$sr,$hash$slo16 */
528 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
529 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
530 #define FLD(f) abuf->fields.sfmt_add3.f
531 int UNUSED written
= 0;
532 IADDR UNUSED pc
= abuf
->addr
;
533 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 4);
536 SI opval
= ADDSI (* FLD (i_sr
), FLD (f_simm16
));
537 * FLD (i_dr
) = opval
;
538 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
545 CASE (sem
, INSN_AND
) : /* and $dr,$sr */
547 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
548 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
549 #define FLD(f) abuf->fields.sfmt_add.f
550 int UNUSED written
= 0;
551 IADDR UNUSED pc
= abuf
->addr
;
552 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
555 SI opval
= ANDSI (* FLD (i_dr
), * FLD (i_sr
));
556 * FLD (i_dr
) = opval
;
557 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
564 CASE (sem
, INSN_AND3
) : /* and3 $dr,$sr,$uimm16 */
566 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
567 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
568 #define FLD(f) abuf->fields.sfmt_and3.f
569 int UNUSED written
= 0;
570 IADDR UNUSED pc
= abuf
->addr
;
571 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 4);
574 SI opval
= ANDSI (* FLD (i_sr
), FLD (f_uimm16
));
575 * FLD (i_dr
) = opval
;
576 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
583 CASE (sem
, INSN_OR
) : /* or $dr,$sr */
585 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
586 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
587 #define FLD(f) abuf->fields.sfmt_add.f
588 int UNUSED written
= 0;
589 IADDR UNUSED pc
= abuf
->addr
;
590 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
593 SI opval
= ORSI (* FLD (i_dr
), * FLD (i_sr
));
594 * FLD (i_dr
) = opval
;
595 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
602 CASE (sem
, INSN_OR3
) : /* or3 $dr,$sr,$hash$ulo16 */
604 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
605 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
606 #define FLD(f) abuf->fields.sfmt_and3.f
607 int UNUSED written
= 0;
608 IADDR UNUSED pc
= abuf
->addr
;
609 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 4);
612 SI opval
= ORSI (* FLD (i_sr
), FLD (f_uimm16
));
613 * FLD (i_dr
) = opval
;
614 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
621 CASE (sem
, INSN_XOR
) : /* xor $dr,$sr */
623 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
624 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
625 #define FLD(f) abuf->fields.sfmt_add.f
626 int UNUSED written
= 0;
627 IADDR UNUSED pc
= abuf
->addr
;
628 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
631 SI opval
= XORSI (* FLD (i_dr
), * FLD (i_sr
));
632 * FLD (i_dr
) = opval
;
633 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
640 CASE (sem
, INSN_XOR3
) : /* xor3 $dr,$sr,$uimm16 */
642 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
643 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
644 #define FLD(f) abuf->fields.sfmt_and3.f
645 int UNUSED written
= 0;
646 IADDR UNUSED pc
= abuf
->addr
;
647 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 4);
650 SI opval
= XORSI (* FLD (i_sr
), FLD (f_uimm16
));
651 * FLD (i_dr
) = opval
;
652 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
659 CASE (sem
, INSN_ADDI
) : /* addi $dr,$simm8 */
661 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
662 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
663 #define FLD(f) abuf->fields.sfmt_addi.f
664 int UNUSED written
= 0;
665 IADDR UNUSED pc
= abuf
->addr
;
666 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
669 SI opval
= ADDSI (* FLD (i_dr
), FLD (f_simm8
));
670 * FLD (i_dr
) = opval
;
671 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
678 CASE (sem
, INSN_ADDV
) : /* addv $dr,$sr */
680 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
681 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
682 #define FLD(f) abuf->fields.sfmt_add.f
683 int UNUSED written
= 0;
684 IADDR UNUSED pc
= abuf
->addr
;
685 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
689 temp0
= ADDSI (* FLD (i_dr
), * FLD (i_sr
));
690 temp1
= ADDOFSI (* FLD (i_dr
), * FLD (i_sr
), 0);
693 * FLD (i_dr
) = opval
;
694 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
698 CPU (h_cond
) = opval
;
699 TRACE_RESULT (current_cpu
, abuf
, "condbit", 'x', opval
);
707 CASE (sem
, INSN_ADDV3
) : /* addv3 $dr,$sr,$simm16 */
709 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
710 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
711 #define FLD(f) abuf->fields.sfmt_add3.f
712 int UNUSED written
= 0;
713 IADDR UNUSED pc
= abuf
->addr
;
714 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 4);
718 temp0
= ADDSI (* FLD (i_sr
), FLD (f_simm16
));
719 temp1
= ADDOFSI (* FLD (i_sr
), FLD (f_simm16
), 0);
722 * FLD (i_dr
) = opval
;
723 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
727 CPU (h_cond
) = opval
;
728 TRACE_RESULT (current_cpu
, abuf
, "condbit", 'x', opval
);
736 CASE (sem
, INSN_ADDX
) : /* addx $dr,$sr */
738 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
739 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
740 #define FLD(f) abuf->fields.sfmt_add.f
741 int UNUSED written
= 0;
742 IADDR UNUSED pc
= abuf
->addr
;
743 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
747 temp0
= ADDCSI (* FLD (i_dr
), * FLD (i_sr
), CPU (h_cond
));
748 temp1
= ADDCFSI (* FLD (i_dr
), * FLD (i_sr
), CPU (h_cond
));
751 * FLD (i_dr
) = opval
;
752 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
756 CPU (h_cond
) = opval
;
757 TRACE_RESULT (current_cpu
, abuf
, "condbit", 'x', opval
);
765 CASE (sem
, INSN_BC8
) : /* bc.s $disp8 */
767 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
768 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
769 #define FLD(f) abuf->fields.sfmt_bl8.f
770 int UNUSED written
= 0;
771 IADDR UNUSED pc
= abuf
->addr
;
773 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
777 USI opval
= FLD (i_disp8
);
778 SEM_BRANCH_VIA_CACHE (current_cpu
, sem_arg
, opval
, vpc
);
780 TRACE_RESULT (current_cpu
, abuf
, "pc", 'x', opval
);
784 abuf
->written
= written
;
785 SEM_BRANCH_FINI (vpc
);
790 CASE (sem
, INSN_BC24
) : /* bc.l $disp24 */
792 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
793 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
794 #define FLD(f) abuf->fields.sfmt_bl24.f
795 int UNUSED written
= 0;
796 IADDR UNUSED pc
= abuf
->addr
;
798 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 4);
802 USI opval
= FLD (i_disp24
);
803 SEM_BRANCH_VIA_CACHE (current_cpu
, sem_arg
, opval
, vpc
);
805 TRACE_RESULT (current_cpu
, abuf
, "pc", 'x', opval
);
809 abuf
->written
= written
;
810 SEM_BRANCH_FINI (vpc
);
815 CASE (sem
, INSN_BEQ
) : /* beq $src1,$src2,$disp16 */
817 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
818 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
819 #define FLD(f) abuf->fields.sfmt_beq.f
820 int UNUSED written
= 0;
821 IADDR UNUSED pc
= abuf
->addr
;
823 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 4);
825 if (EQSI (* FLD (i_src1
), * FLD (i_src2
))) {
827 USI opval
= FLD (i_disp16
);
828 SEM_BRANCH_VIA_CACHE (current_cpu
, sem_arg
, opval
, vpc
);
830 TRACE_RESULT (current_cpu
, abuf
, "pc", 'x', opval
);
834 abuf
->written
= written
;
835 SEM_BRANCH_FINI (vpc
);
840 CASE (sem
, INSN_BEQZ
) : /* beqz $src2,$disp16 */
842 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
843 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
844 #define FLD(f) abuf->fields.sfmt_beq.f
845 int UNUSED written
= 0;
846 IADDR UNUSED pc
= abuf
->addr
;
848 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 4);
850 if (EQSI (* FLD (i_src2
), 0)) {
852 USI opval
= FLD (i_disp16
);
853 SEM_BRANCH_VIA_CACHE (current_cpu
, sem_arg
, opval
, vpc
);
855 TRACE_RESULT (current_cpu
, abuf
, "pc", 'x', opval
);
859 abuf
->written
= written
;
860 SEM_BRANCH_FINI (vpc
);
865 CASE (sem
, INSN_BGEZ
) : /* bgez $src2,$disp16 */
867 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
868 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
869 #define FLD(f) abuf->fields.sfmt_beq.f
870 int UNUSED written
= 0;
871 IADDR UNUSED pc
= abuf
->addr
;
873 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 4);
875 if (GESI (* FLD (i_src2
), 0)) {
877 USI opval
= FLD (i_disp16
);
878 SEM_BRANCH_VIA_CACHE (current_cpu
, sem_arg
, opval
, vpc
);
880 TRACE_RESULT (current_cpu
, abuf
, "pc", 'x', opval
);
884 abuf
->written
= written
;
885 SEM_BRANCH_FINI (vpc
);
890 CASE (sem
, INSN_BGTZ
) : /* bgtz $src2,$disp16 */
892 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
893 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
894 #define FLD(f) abuf->fields.sfmt_beq.f
895 int UNUSED written
= 0;
896 IADDR UNUSED pc
= abuf
->addr
;
898 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 4);
900 if (GTSI (* FLD (i_src2
), 0)) {
902 USI opval
= FLD (i_disp16
);
903 SEM_BRANCH_VIA_CACHE (current_cpu
, sem_arg
, opval
, vpc
);
905 TRACE_RESULT (current_cpu
, abuf
, "pc", 'x', opval
);
909 abuf
->written
= written
;
910 SEM_BRANCH_FINI (vpc
);
915 CASE (sem
, INSN_BLEZ
) : /* blez $src2,$disp16 */
917 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
918 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
919 #define FLD(f) abuf->fields.sfmt_beq.f
920 int UNUSED written
= 0;
921 IADDR UNUSED pc
= abuf
->addr
;
923 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 4);
925 if (LESI (* FLD (i_src2
), 0)) {
927 USI opval
= FLD (i_disp16
);
928 SEM_BRANCH_VIA_CACHE (current_cpu
, sem_arg
, opval
, vpc
);
930 TRACE_RESULT (current_cpu
, abuf
, "pc", 'x', opval
);
934 abuf
->written
= written
;
935 SEM_BRANCH_FINI (vpc
);
940 CASE (sem
, INSN_BLTZ
) : /* bltz $src2,$disp16 */
942 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
943 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
944 #define FLD(f) abuf->fields.sfmt_beq.f
945 int UNUSED written
= 0;
946 IADDR UNUSED pc
= abuf
->addr
;
948 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 4);
950 if (LTSI (* FLD (i_src2
), 0)) {
952 USI opval
= FLD (i_disp16
);
953 SEM_BRANCH_VIA_CACHE (current_cpu
, sem_arg
, opval
, vpc
);
955 TRACE_RESULT (current_cpu
, abuf
, "pc", 'x', opval
);
959 abuf
->written
= written
;
960 SEM_BRANCH_FINI (vpc
);
965 CASE (sem
, INSN_BNEZ
) : /* bnez $src2,$disp16 */
967 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
968 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
969 #define FLD(f) abuf->fields.sfmt_beq.f
970 int UNUSED written
= 0;
971 IADDR UNUSED pc
= abuf
->addr
;
973 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 4);
975 if (NESI (* FLD (i_src2
), 0)) {
977 USI opval
= FLD (i_disp16
);
978 SEM_BRANCH_VIA_CACHE (current_cpu
, sem_arg
, opval
, vpc
);
980 TRACE_RESULT (current_cpu
, abuf
, "pc", 'x', opval
);
984 abuf
->written
= written
;
985 SEM_BRANCH_FINI (vpc
);
990 CASE (sem
, INSN_BL8
) : /* bl.s $disp8 */
992 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
993 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
994 #define FLD(f) abuf->fields.sfmt_bl8.f
995 int UNUSED written
= 0;
996 IADDR UNUSED pc
= abuf
->addr
;
998 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
1002 SI opval
= ADDSI (ANDSI (pc
, -4), 4);
1003 CPU (h_gr
[((UINT
) 14)]) = opval
;
1004 TRACE_RESULT (current_cpu
, abuf
, "gr-14", 'x', opval
);
1007 USI opval
= FLD (i_disp8
);
1008 SEM_BRANCH_VIA_CACHE (current_cpu
, sem_arg
, opval
, vpc
);
1009 TRACE_RESULT (current_cpu
, abuf
, "pc", 'x', opval
);
1013 SEM_BRANCH_FINI (vpc
);
1018 CASE (sem
, INSN_BL24
) : /* bl.l $disp24 */
1020 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
1021 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1022 #define FLD(f) abuf->fields.sfmt_bl24.f
1023 int UNUSED written
= 0;
1024 IADDR UNUSED pc
= abuf
->addr
;
1026 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 4);
1030 SI opval
= ADDSI (pc
, 4);
1031 CPU (h_gr
[((UINT
) 14)]) = opval
;
1032 TRACE_RESULT (current_cpu
, abuf
, "gr-14", 'x', opval
);
1035 USI opval
= FLD (i_disp24
);
1036 SEM_BRANCH_VIA_CACHE (current_cpu
, sem_arg
, opval
, vpc
);
1037 TRACE_RESULT (current_cpu
, abuf
, "pc", 'x', opval
);
1041 SEM_BRANCH_FINI (vpc
);
1046 CASE (sem
, INSN_BCL8
) : /* bcl.s $disp8 */
1048 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
1049 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1050 #define FLD(f) abuf->fields.sfmt_bl8.f
1051 int UNUSED written
= 0;
1052 IADDR UNUSED pc
= abuf
->addr
;
1054 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
1059 SI opval
= ADDSI (ANDSI (pc
, -4), 4);
1060 CPU (h_gr
[((UINT
) 14)]) = opval
;
1061 written
|= (1 << 3);
1062 TRACE_RESULT (current_cpu
, abuf
, "gr-14", 'x', opval
);
1065 USI opval
= FLD (i_disp8
);
1066 SEM_BRANCH_VIA_CACHE (current_cpu
, sem_arg
, opval
, vpc
);
1067 written
|= (1 << 4);
1068 TRACE_RESULT (current_cpu
, abuf
, "pc", 'x', opval
);
1073 abuf
->written
= written
;
1074 SEM_BRANCH_FINI (vpc
);
1079 CASE (sem
, INSN_BCL24
) : /* bcl.l $disp24 */
1081 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
1082 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1083 #define FLD(f) abuf->fields.sfmt_bl24.f
1084 int UNUSED written
= 0;
1085 IADDR UNUSED pc
= abuf
->addr
;
1087 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 4);
1092 SI opval
= ADDSI (pc
, 4);
1093 CPU (h_gr
[((UINT
) 14)]) = opval
;
1094 written
|= (1 << 3);
1095 TRACE_RESULT (current_cpu
, abuf
, "gr-14", 'x', opval
);
1098 USI opval
= FLD (i_disp24
);
1099 SEM_BRANCH_VIA_CACHE (current_cpu
, sem_arg
, opval
, vpc
);
1100 written
|= (1 << 4);
1101 TRACE_RESULT (current_cpu
, abuf
, "pc", 'x', opval
);
1106 abuf
->written
= written
;
1107 SEM_BRANCH_FINI (vpc
);
1112 CASE (sem
, INSN_BNC8
) : /* bnc.s $disp8 */
1114 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
1115 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1116 #define FLD(f) abuf->fields.sfmt_bl8.f
1117 int UNUSED written
= 0;
1118 IADDR UNUSED pc
= abuf
->addr
;
1120 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
1122 if (NOTBI (CPU (h_cond
))) {
1124 USI opval
= FLD (i_disp8
);
1125 SEM_BRANCH_VIA_CACHE (current_cpu
, sem_arg
, opval
, vpc
);
1126 written
|= (1 << 2);
1127 TRACE_RESULT (current_cpu
, abuf
, "pc", 'x', opval
);
1131 abuf
->written
= written
;
1132 SEM_BRANCH_FINI (vpc
);
1137 CASE (sem
, INSN_BNC24
) : /* bnc.l $disp24 */
1139 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
1140 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1141 #define FLD(f) abuf->fields.sfmt_bl24.f
1142 int UNUSED written
= 0;
1143 IADDR UNUSED pc
= abuf
->addr
;
1145 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 4);
1147 if (NOTBI (CPU (h_cond
))) {
1149 USI opval
= FLD (i_disp24
);
1150 SEM_BRANCH_VIA_CACHE (current_cpu
, sem_arg
, opval
, vpc
);
1151 written
|= (1 << 2);
1152 TRACE_RESULT (current_cpu
, abuf
, "pc", 'x', opval
);
1156 abuf
->written
= written
;
1157 SEM_BRANCH_FINI (vpc
);
1162 CASE (sem
, INSN_BNE
) : /* bne $src1,$src2,$disp16 */
1164 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
1165 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1166 #define FLD(f) abuf->fields.sfmt_beq.f
1167 int UNUSED written
= 0;
1168 IADDR UNUSED pc
= abuf
->addr
;
1170 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 4);
1172 if (NESI (* FLD (i_src1
), * FLD (i_src2
))) {
1174 USI opval
= FLD (i_disp16
);
1175 SEM_BRANCH_VIA_CACHE (current_cpu
, sem_arg
, opval
, vpc
);
1176 written
|= (1 << 3);
1177 TRACE_RESULT (current_cpu
, abuf
, "pc", 'x', opval
);
1181 abuf
->written
= written
;
1182 SEM_BRANCH_FINI (vpc
);
1187 CASE (sem
, INSN_BRA8
) : /* bra.s $disp8 */
1189 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
1190 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1191 #define FLD(f) abuf->fields.sfmt_bl8.f
1192 int UNUSED written
= 0;
1193 IADDR UNUSED pc
= abuf
->addr
;
1195 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
1198 USI opval
= FLD (i_disp8
);
1199 SEM_BRANCH_VIA_CACHE (current_cpu
, sem_arg
, opval
, vpc
);
1200 TRACE_RESULT (current_cpu
, abuf
, "pc", 'x', opval
);
1203 SEM_BRANCH_FINI (vpc
);
1208 CASE (sem
, INSN_BRA24
) : /* bra.l $disp24 */
1210 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
1211 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1212 #define FLD(f) abuf->fields.sfmt_bl24.f
1213 int UNUSED written
= 0;
1214 IADDR UNUSED pc
= abuf
->addr
;
1216 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 4);
1219 USI opval
= FLD (i_disp24
);
1220 SEM_BRANCH_VIA_CACHE (current_cpu
, sem_arg
, opval
, vpc
);
1221 TRACE_RESULT (current_cpu
, abuf
, "pc", 'x', opval
);
1224 SEM_BRANCH_FINI (vpc
);
1229 CASE (sem
, INSN_BNCL8
) : /* bncl.s $disp8 */
1231 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
1232 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1233 #define FLD(f) abuf->fields.sfmt_bl8.f
1234 int UNUSED written
= 0;
1235 IADDR UNUSED pc
= abuf
->addr
;
1237 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
1239 if (NOTBI (CPU (h_cond
))) {
1242 SI opval
= ADDSI (ANDSI (pc
, -4), 4);
1243 CPU (h_gr
[((UINT
) 14)]) = opval
;
1244 written
|= (1 << 3);
1245 TRACE_RESULT (current_cpu
, abuf
, "gr-14", 'x', opval
);
1248 USI opval
= FLD (i_disp8
);
1249 SEM_BRANCH_VIA_CACHE (current_cpu
, sem_arg
, opval
, vpc
);
1250 written
|= (1 << 4);
1251 TRACE_RESULT (current_cpu
, abuf
, "pc", 'x', opval
);
1256 abuf
->written
= written
;
1257 SEM_BRANCH_FINI (vpc
);
1262 CASE (sem
, INSN_BNCL24
) : /* bncl.l $disp24 */
1264 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
1265 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1266 #define FLD(f) abuf->fields.sfmt_bl24.f
1267 int UNUSED written
= 0;
1268 IADDR UNUSED pc
= abuf
->addr
;
1270 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 4);
1272 if (NOTBI (CPU (h_cond
))) {
1275 SI opval
= ADDSI (pc
, 4);
1276 CPU (h_gr
[((UINT
) 14)]) = opval
;
1277 written
|= (1 << 3);
1278 TRACE_RESULT (current_cpu
, abuf
, "gr-14", 'x', opval
);
1281 USI opval
= FLD (i_disp24
);
1282 SEM_BRANCH_VIA_CACHE (current_cpu
, sem_arg
, opval
, vpc
);
1283 written
|= (1 << 4);
1284 TRACE_RESULT (current_cpu
, abuf
, "pc", 'x', opval
);
1289 abuf
->written
= written
;
1290 SEM_BRANCH_FINI (vpc
);
1295 CASE (sem
, INSN_CMP
) : /* cmp $src1,$src2 */
1297 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
1298 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1299 #define FLD(f) abuf->fields.sfmt_st_plus.f
1300 int UNUSED written
= 0;
1301 IADDR UNUSED pc
= abuf
->addr
;
1302 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
1305 BI opval
= LTSI (* FLD (i_src1
), * FLD (i_src2
));
1306 CPU (h_cond
) = opval
;
1307 TRACE_RESULT (current_cpu
, abuf
, "condbit", 'x', opval
);
1314 CASE (sem
, INSN_CMPI
) : /* cmpi $src2,$simm16 */
1316 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
1317 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1318 #define FLD(f) abuf->fields.sfmt_st_d.f
1319 int UNUSED written
= 0;
1320 IADDR UNUSED pc
= abuf
->addr
;
1321 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 4);
1324 BI opval
= LTSI (* FLD (i_src2
), FLD (f_simm16
));
1325 CPU (h_cond
) = opval
;
1326 TRACE_RESULT (current_cpu
, abuf
, "condbit", 'x', opval
);
1333 CASE (sem
, INSN_CMPU
) : /* cmpu $src1,$src2 */
1335 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
1336 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1337 #define FLD(f) abuf->fields.sfmt_st_plus.f
1338 int UNUSED written
= 0;
1339 IADDR UNUSED pc
= abuf
->addr
;
1340 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
1343 BI opval
= LTUSI (* FLD (i_src1
), * FLD (i_src2
));
1344 CPU (h_cond
) = opval
;
1345 TRACE_RESULT (current_cpu
, abuf
, "condbit", 'x', opval
);
1352 CASE (sem
, INSN_CMPUI
) : /* cmpui $src2,$simm16 */
1354 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
1355 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1356 #define FLD(f) abuf->fields.sfmt_st_d.f
1357 int UNUSED written
= 0;
1358 IADDR UNUSED pc
= abuf
->addr
;
1359 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 4);
1362 BI opval
= LTUSI (* FLD (i_src2
), FLD (f_simm16
));
1363 CPU (h_cond
) = opval
;
1364 TRACE_RESULT (current_cpu
, abuf
, "condbit", 'x', opval
);
1371 CASE (sem
, INSN_CMPEQ
) : /* cmpeq $src1,$src2 */
1373 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
1374 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1375 #define FLD(f) abuf->fields.sfmt_st_plus.f
1376 int UNUSED written
= 0;
1377 IADDR UNUSED pc
= abuf
->addr
;
1378 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
1381 BI opval
= EQSI (* FLD (i_src1
), * FLD (i_src2
));
1382 CPU (h_cond
) = opval
;
1383 TRACE_RESULT (current_cpu
, abuf
, "condbit", 'x', opval
);
1390 CASE (sem
, INSN_CMPZ
) : /* cmpz $src2 */
1392 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
1393 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1394 #define FLD(f) abuf->fields.sfmt_st_plus.f
1395 int UNUSED written
= 0;
1396 IADDR UNUSED pc
= abuf
->addr
;
1397 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
1400 BI opval
= EQSI (* FLD (i_src2
), 0);
1401 CPU (h_cond
) = opval
;
1402 TRACE_RESULT (current_cpu
, abuf
, "condbit", 'x', opval
);
1409 CASE (sem
, INSN_DIV
) : /* div $dr,$sr */
1411 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
1412 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1413 #define FLD(f) abuf->fields.sfmt_add.f
1414 int UNUSED written
= 0;
1415 IADDR UNUSED pc
= abuf
->addr
;
1416 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 4);
1418 if (NESI (* FLD (i_sr
), 0)) {
1420 SI opval
= DIVSI (* FLD (i_dr
), * FLD (i_sr
));
1421 * FLD (i_dr
) = opval
;
1422 written
|= (1 << 2);
1423 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
1427 abuf
->written
= written
;
1432 CASE (sem
, INSN_DIVU
) : /* divu $dr,$sr */
1434 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
1435 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1436 #define FLD(f) abuf->fields.sfmt_add.f
1437 int UNUSED written
= 0;
1438 IADDR UNUSED pc
= abuf
->addr
;
1439 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 4);
1441 if (NESI (* FLD (i_sr
), 0)) {
1443 SI opval
= UDIVSI (* FLD (i_dr
), * FLD (i_sr
));
1444 * FLD (i_dr
) = opval
;
1445 written
|= (1 << 2);
1446 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
1450 abuf
->written
= written
;
1455 CASE (sem
, INSN_REM
) : /* rem $dr,$sr */
1457 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
1458 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1459 #define FLD(f) abuf->fields.sfmt_add.f
1460 int UNUSED written
= 0;
1461 IADDR UNUSED pc
= abuf
->addr
;
1462 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 4);
1464 if (NESI (* FLD (i_sr
), 0)) {
1466 SI opval
= MODSI (* FLD (i_dr
), * FLD (i_sr
));
1467 * FLD (i_dr
) = opval
;
1468 written
|= (1 << 2);
1469 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
1473 abuf
->written
= written
;
1478 CASE (sem
, INSN_REMU
) : /* remu $dr,$sr */
1480 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
1481 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1482 #define FLD(f) abuf->fields.sfmt_add.f
1483 int UNUSED written
= 0;
1484 IADDR UNUSED pc
= abuf
->addr
;
1485 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 4);
1487 if (NESI (* FLD (i_sr
), 0)) {
1489 SI opval
= UMODSI (* FLD (i_dr
), * FLD (i_sr
));
1490 * FLD (i_dr
) = opval
;
1491 written
|= (1 << 2);
1492 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
1496 abuf
->written
= written
;
1501 CASE (sem
, INSN_DIVH
) : /* divh $dr,$sr */
1503 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
1504 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1505 #define FLD(f) abuf->fields.sfmt_add.f
1506 int UNUSED written
= 0;
1507 IADDR UNUSED pc
= abuf
->addr
;
1508 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 4);
1510 if (NESI (* FLD (i_sr
), 0)) {
1512 SI opval
= DIVSI (EXTHISI (TRUNCSIHI (* FLD (i_dr
))), * FLD (i_sr
));
1513 * FLD (i_dr
) = opval
;
1514 written
|= (1 << 2);
1515 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
1519 abuf
->written
= written
;
1524 CASE (sem
, INSN_JC
) : /* jc $sr */
1526 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
1527 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1528 #define FLD(f) abuf->fields.sfmt_jl.f
1529 int UNUSED written
= 0;
1530 IADDR UNUSED pc
= abuf
->addr
;
1532 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
1536 USI opval
= ANDSI (* FLD (i_sr
), -4);
1537 SEM_BRANCH_VIA_ADDR (current_cpu
, sem_arg
, opval
, vpc
);
1538 written
|= (1 << 2);
1539 TRACE_RESULT (current_cpu
, abuf
, "pc", 'x', opval
);
1543 abuf
->written
= written
;
1544 SEM_BRANCH_FINI (vpc
);
1549 CASE (sem
, INSN_JNC
) : /* jnc $sr */
1551 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
1552 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1553 #define FLD(f) abuf->fields.sfmt_jl.f
1554 int UNUSED written
= 0;
1555 IADDR UNUSED pc
= abuf
->addr
;
1557 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
1559 if (NOTBI (CPU (h_cond
))) {
1561 USI opval
= ANDSI (* FLD (i_sr
), -4);
1562 SEM_BRANCH_VIA_ADDR (current_cpu
, sem_arg
, opval
, vpc
);
1563 written
|= (1 << 2);
1564 TRACE_RESULT (current_cpu
, abuf
, "pc", 'x', opval
);
1568 abuf
->written
= written
;
1569 SEM_BRANCH_FINI (vpc
);
1574 CASE (sem
, INSN_JL
) : /* jl $sr */
1576 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
1577 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1578 #define FLD(f) abuf->fields.sfmt_jl.f
1579 int UNUSED written
= 0;
1580 IADDR UNUSED pc
= abuf
->addr
;
1582 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
1586 temp0
= ADDSI (ANDSI (pc
, -4), 4);
1587 temp1
= ANDSI (* FLD (i_sr
), -4);
1590 CPU (h_gr
[((UINT
) 14)]) = opval
;
1591 TRACE_RESULT (current_cpu
, abuf
, "gr-14", 'x', opval
);
1595 SEM_BRANCH_VIA_ADDR (current_cpu
, sem_arg
, opval
, vpc
);
1596 TRACE_RESULT (current_cpu
, abuf
, "pc", 'x', opval
);
1600 SEM_BRANCH_FINI (vpc
);
1605 CASE (sem
, INSN_JMP
) : /* jmp $sr */
1607 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
1608 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1609 #define FLD(f) abuf->fields.sfmt_jl.f
1610 int UNUSED written
= 0;
1611 IADDR UNUSED pc
= abuf
->addr
;
1613 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
1616 USI opval
= ANDSI (* FLD (i_sr
), -4);
1617 SEM_BRANCH_VIA_ADDR (current_cpu
, sem_arg
, opval
, vpc
);
1618 TRACE_RESULT (current_cpu
, abuf
, "pc", 'x', opval
);
1621 SEM_BRANCH_FINI (vpc
);
1626 CASE (sem
, INSN_LD
) : /* ld $dr,@$sr */
1628 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
1629 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1630 #define FLD(f) abuf->fields.sfmt_ld_plus.f
1631 int UNUSED written
= 0;
1632 IADDR UNUSED pc
= abuf
->addr
;
1633 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
1636 SI opval
= GETMEMSI (current_cpu
, pc
, * FLD (i_sr
));
1637 * FLD (i_dr
) = opval
;
1638 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
1645 CASE (sem
, INSN_LD_D
) : /* ld $dr,@($slo16,$sr) */
1647 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
1648 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1649 #define FLD(f) abuf->fields.sfmt_add3.f
1650 int UNUSED written
= 0;
1651 IADDR UNUSED pc
= abuf
->addr
;
1652 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 4);
1655 SI opval
= GETMEMSI (current_cpu
, pc
, ADDSI (* FLD (i_sr
), FLD (f_simm16
)));
1656 * FLD (i_dr
) = opval
;
1657 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
1664 CASE (sem
, INSN_LDB
) : /* ldb $dr,@$sr */
1666 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
1667 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1668 #define FLD(f) abuf->fields.sfmt_ld_plus.f
1669 int UNUSED written
= 0;
1670 IADDR UNUSED pc
= abuf
->addr
;
1671 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
1674 SI opval
= EXTQISI (GETMEMQI (current_cpu
, pc
, * FLD (i_sr
)));
1675 * FLD (i_dr
) = opval
;
1676 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
1683 CASE (sem
, INSN_LDB_D
) : /* ldb $dr,@($slo16,$sr) */
1685 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
1686 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1687 #define FLD(f) abuf->fields.sfmt_add3.f
1688 int UNUSED written
= 0;
1689 IADDR UNUSED pc
= abuf
->addr
;
1690 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 4);
1693 SI opval
= EXTQISI (GETMEMQI (current_cpu
, pc
, ADDSI (* FLD (i_sr
), FLD (f_simm16
))));
1694 * FLD (i_dr
) = opval
;
1695 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
1702 CASE (sem
, INSN_LDH
) : /* ldh $dr,@$sr */
1704 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
1705 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1706 #define FLD(f) abuf->fields.sfmt_ld_plus.f
1707 int UNUSED written
= 0;
1708 IADDR UNUSED pc
= abuf
->addr
;
1709 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
1712 SI opval
= EXTHISI (GETMEMHI (current_cpu
, pc
, * FLD (i_sr
)));
1713 * FLD (i_dr
) = opval
;
1714 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
1721 CASE (sem
, INSN_LDH_D
) : /* ldh $dr,@($slo16,$sr) */
1723 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
1724 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1725 #define FLD(f) abuf->fields.sfmt_add3.f
1726 int UNUSED written
= 0;
1727 IADDR UNUSED pc
= abuf
->addr
;
1728 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 4);
1731 SI opval
= EXTHISI (GETMEMHI (current_cpu
, pc
, ADDSI (* FLD (i_sr
), FLD (f_simm16
))));
1732 * FLD (i_dr
) = opval
;
1733 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
1740 CASE (sem
, INSN_LDUB
) : /* ldub $dr,@$sr */
1742 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
1743 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1744 #define FLD(f) abuf->fields.sfmt_ld_plus.f
1745 int UNUSED written
= 0;
1746 IADDR UNUSED pc
= abuf
->addr
;
1747 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
1750 SI opval
= ZEXTQISI (GETMEMQI (current_cpu
, pc
, * FLD (i_sr
)));
1751 * FLD (i_dr
) = opval
;
1752 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
1759 CASE (sem
, INSN_LDUB_D
) : /* ldub $dr,@($slo16,$sr) */
1761 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
1762 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1763 #define FLD(f) abuf->fields.sfmt_add3.f
1764 int UNUSED written
= 0;
1765 IADDR UNUSED pc
= abuf
->addr
;
1766 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 4);
1769 SI opval
= ZEXTQISI (GETMEMQI (current_cpu
, pc
, ADDSI (* FLD (i_sr
), FLD (f_simm16
))));
1770 * FLD (i_dr
) = opval
;
1771 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
1778 CASE (sem
, INSN_LDUH
) : /* lduh $dr,@$sr */
1780 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
1781 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1782 #define FLD(f) abuf->fields.sfmt_ld_plus.f
1783 int UNUSED written
= 0;
1784 IADDR UNUSED pc
= abuf
->addr
;
1785 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
1788 SI opval
= ZEXTHISI (GETMEMHI (current_cpu
, pc
, * FLD (i_sr
)));
1789 * FLD (i_dr
) = opval
;
1790 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
1797 CASE (sem
, INSN_LDUH_D
) : /* lduh $dr,@($slo16,$sr) */
1799 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
1800 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1801 #define FLD(f) abuf->fields.sfmt_add3.f
1802 int UNUSED written
= 0;
1803 IADDR UNUSED pc
= abuf
->addr
;
1804 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 4);
1807 SI opval
= ZEXTHISI (GETMEMHI (current_cpu
, pc
, ADDSI (* FLD (i_sr
), FLD (f_simm16
))));
1808 * FLD (i_dr
) = opval
;
1809 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
1816 CASE (sem
, INSN_LD_PLUS
) : /* ld $dr,@$sr+ */
1818 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
1819 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1820 #define FLD(f) abuf->fields.sfmt_ld_plus.f
1821 int UNUSED written
= 0;
1822 IADDR UNUSED pc
= abuf
->addr
;
1823 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
1827 temp0
= GETMEMSI (current_cpu
, pc
, * FLD (i_sr
));
1828 temp1
= ADDSI (* FLD (i_sr
), 4);
1831 * FLD (i_dr
) = opval
;
1832 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
1836 * FLD (i_sr
) = opval
;
1837 TRACE_RESULT (current_cpu
, abuf
, "sr", 'x', opval
);
1845 CASE (sem
, INSN_LD24
) : /* ld24 $dr,$uimm24 */
1847 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
1848 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1849 #define FLD(f) abuf->fields.sfmt_ld24.f
1850 int UNUSED written
= 0;
1851 IADDR UNUSED pc
= abuf
->addr
;
1852 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 4);
1855 SI opval
= FLD (i_uimm24
);
1856 * FLD (i_dr
) = opval
;
1857 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
1864 CASE (sem
, INSN_LDI8
) : /* ldi8 $dr,$simm8 */
1866 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
1867 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1868 #define FLD(f) abuf->fields.sfmt_addi.f
1869 int UNUSED written
= 0;
1870 IADDR UNUSED pc
= abuf
->addr
;
1871 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
1874 SI opval
= FLD (f_simm8
);
1875 * FLD (i_dr
) = opval
;
1876 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
1883 CASE (sem
, INSN_LDI16
) : /* ldi16 $dr,$hash$slo16 */
1885 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
1886 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1887 #define FLD(f) abuf->fields.sfmt_add3.f
1888 int UNUSED written
= 0;
1889 IADDR UNUSED pc
= abuf
->addr
;
1890 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 4);
1893 SI opval
= FLD (f_simm16
);
1894 * FLD (i_dr
) = opval
;
1895 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
1902 CASE (sem
, INSN_LOCK
) : /* lock $dr,@$sr */
1904 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
1905 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1906 #define FLD(f) abuf->fields.sfmt_ld_plus.f
1907 int UNUSED written
= 0;
1908 IADDR UNUSED pc
= abuf
->addr
;
1909 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
1914 CPU (h_lock
) = opval
;
1915 TRACE_RESULT (current_cpu
, abuf
, "lock", 'x', opval
);
1918 SI opval
= GETMEMSI (current_cpu
, pc
, * FLD (i_sr
));
1919 * FLD (i_dr
) = opval
;
1920 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
1928 CASE (sem
, INSN_MACHI_A
) : /* machi $src1,$src2,$acc */
1930 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
1931 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1932 #define FLD(f) abuf->fields.sfmt_machi_a.f
1933 int UNUSED written
= 0;
1934 IADDR UNUSED pc
= abuf
->addr
;
1935 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
1938 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);
1939 SET_H_ACCUMS (FLD (f_acc
), opval
);
1940 TRACE_RESULT (current_cpu
, abuf
, "acc", 'D', opval
);
1947 CASE (sem
, INSN_MACLO_A
) : /* maclo $src1,$src2,$acc */
1949 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
1950 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1951 #define FLD(f) abuf->fields.sfmt_machi_a.f
1952 int UNUSED written
= 0;
1953 IADDR UNUSED pc
= abuf
->addr
;
1954 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
1957 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);
1958 SET_H_ACCUMS (FLD (f_acc
), opval
);
1959 TRACE_RESULT (current_cpu
, abuf
, "acc", 'D', opval
);
1966 CASE (sem
, INSN_MACWHI_A
) : /* macwhi $src1,$src2,$acc */
1968 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
1969 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1970 #define FLD(f) abuf->fields.sfmt_machi_a.f
1971 int UNUSED written
= 0;
1972 IADDR UNUSED pc
= abuf
->addr
;
1973 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
1976 DI opval
= ADDDI (GET_H_ACCUMS (FLD (f_acc
)), MULDI (EXTSIDI (* FLD (i_src1
)), EXTHIDI (TRUNCSIHI (SRASI (* FLD (i_src2
), 16)))));
1977 SET_H_ACCUMS (FLD (f_acc
), opval
);
1978 TRACE_RESULT (current_cpu
, abuf
, "acc", 'D', opval
);
1985 CASE (sem
, INSN_MACWLO_A
) : /* macwlo $src1,$src2,$acc */
1987 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
1988 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1989 #define FLD(f) abuf->fields.sfmt_machi_a.f
1990 int UNUSED written
= 0;
1991 IADDR UNUSED pc
= abuf
->addr
;
1992 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
1995 DI opval
= ADDDI (GET_H_ACCUMS (FLD (f_acc
)), MULDI (EXTSIDI (* FLD (i_src1
)), EXTHIDI (TRUNCSIHI (* FLD (i_src2
)))));
1996 SET_H_ACCUMS (FLD (f_acc
), opval
);
1997 TRACE_RESULT (current_cpu
, abuf
, "acc", 'D', opval
);
2004 CASE (sem
, INSN_MUL
) : /* mul $dr,$sr */
2006 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
2007 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
2008 #define FLD(f) abuf->fields.sfmt_add.f
2009 int UNUSED written
= 0;
2010 IADDR UNUSED pc
= abuf
->addr
;
2011 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
2014 SI opval
= MULSI (* FLD (i_dr
), * FLD (i_sr
));
2015 * FLD (i_dr
) = opval
;
2016 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
2023 CASE (sem
, INSN_MULHI_A
) : /* mulhi $src1,$src2,$acc */
2025 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
2026 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
2027 #define FLD(f) abuf->fields.sfmt_machi_a.f
2028 int UNUSED written
= 0;
2029 IADDR UNUSED pc
= abuf
->addr
;
2030 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
2033 DI opval
= SRADI (SLLDI (MULDI (EXTSIDI (ANDSI (* FLD (i_src1
), 0xffff0000)), EXTHIDI (TRUNCSIHI (SRASI (* FLD (i_src2
), 16)))), 16), 16);
2034 SET_H_ACCUMS (FLD (f_acc
), opval
);
2035 TRACE_RESULT (current_cpu
, abuf
, "acc", 'D', opval
);
2042 CASE (sem
, INSN_MULLO_A
) : /* mullo $src1,$src2,$acc */
2044 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
2045 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
2046 #define FLD(f) abuf->fields.sfmt_machi_a.f
2047 int UNUSED written
= 0;
2048 IADDR UNUSED pc
= abuf
->addr
;
2049 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
2052 DI opval
= SRADI (SLLDI (MULDI (EXTSIDI (SLLSI (* FLD (i_src1
), 16)), EXTHIDI (TRUNCSIHI (* FLD (i_src2
)))), 16), 16);
2053 SET_H_ACCUMS (FLD (f_acc
), opval
);
2054 TRACE_RESULT (current_cpu
, abuf
, "acc", 'D', opval
);
2061 CASE (sem
, INSN_MULWHI_A
) : /* mulwhi $src1,$src2,$acc */
2063 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
2064 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
2065 #define FLD(f) abuf->fields.sfmt_machi_a.f
2066 int UNUSED written
= 0;
2067 IADDR UNUSED pc
= abuf
->addr
;
2068 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
2071 DI opval
= MULDI (EXTSIDI (* FLD (i_src1
)), EXTHIDI (TRUNCSIHI (SRASI (* FLD (i_src2
), 16))));
2072 SET_H_ACCUMS (FLD (f_acc
), opval
);
2073 TRACE_RESULT (current_cpu
, abuf
, "acc", 'D', opval
);
2080 CASE (sem
, INSN_MULWLO_A
) : /* mulwlo $src1,$src2,$acc */
2082 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
2083 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
2084 #define FLD(f) abuf->fields.sfmt_machi_a.f
2085 int UNUSED written
= 0;
2086 IADDR UNUSED pc
= abuf
->addr
;
2087 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
2090 DI opval
= MULDI (EXTSIDI (* FLD (i_src1
)), EXTHIDI (TRUNCSIHI (* FLD (i_src2
))));
2091 SET_H_ACCUMS (FLD (f_acc
), opval
);
2092 TRACE_RESULT (current_cpu
, abuf
, "acc", 'D', opval
);
2099 CASE (sem
, INSN_MV
) : /* mv $dr,$sr */
2101 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
2102 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
2103 #define FLD(f) abuf->fields.sfmt_ld_plus.f
2104 int UNUSED written
= 0;
2105 IADDR UNUSED pc
= abuf
->addr
;
2106 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
2109 SI opval
= * FLD (i_sr
);
2110 * FLD (i_dr
) = opval
;
2111 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
2118 CASE (sem
, INSN_MVFACHI_A
) : /* mvfachi $dr,$accs */
2120 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
2121 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
2122 #define FLD(f) abuf->fields.sfmt_mvfachi_a.f
2123 int UNUSED written
= 0;
2124 IADDR UNUSED pc
= abuf
->addr
;
2125 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
2128 SI opval
= TRUNCDISI (SRADI (GET_H_ACCUMS (FLD (f_accs
)), 32));
2129 * FLD (i_dr
) = opval
;
2130 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
2137 CASE (sem
, INSN_MVFACLO_A
) : /* mvfaclo $dr,$accs */
2139 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
2140 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
2141 #define FLD(f) abuf->fields.sfmt_mvfachi_a.f
2142 int UNUSED written
= 0;
2143 IADDR UNUSED pc
= abuf
->addr
;
2144 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
2147 SI opval
= TRUNCDISI (GET_H_ACCUMS (FLD (f_accs
)));
2148 * FLD (i_dr
) = opval
;
2149 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
2156 CASE (sem
, INSN_MVFACMI_A
) : /* mvfacmi $dr,$accs */
2158 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
2159 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
2160 #define FLD(f) abuf->fields.sfmt_mvfachi_a.f
2161 int UNUSED written
= 0;
2162 IADDR UNUSED pc
= abuf
->addr
;
2163 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
2166 SI opval
= TRUNCDISI (SRADI (GET_H_ACCUMS (FLD (f_accs
)), 16));
2167 * FLD (i_dr
) = opval
;
2168 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
2175 CASE (sem
, INSN_MVFC
) : /* mvfc $dr,$scr */
2177 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
2178 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
2179 #define FLD(f) abuf->fields.sfmt_ld_plus.f
2180 int UNUSED written
= 0;
2181 IADDR UNUSED pc
= abuf
->addr
;
2182 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
2185 SI opval
= GET_H_CR (FLD (f_r2
));
2186 * FLD (i_dr
) = opval
;
2187 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
2194 CASE (sem
, INSN_MVTACHI_A
) : /* mvtachi $src1,$accs */
2196 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
2197 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
2198 #define FLD(f) abuf->fields.sfmt_mvtachi_a.f
2199 int UNUSED written
= 0;
2200 IADDR UNUSED pc
= abuf
->addr
;
2201 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
2204 DI opval
= ORDI (ANDDI (GET_H_ACCUMS (FLD (f_accs
)), MAKEDI (0, 0xffffffff)), SLLDI (EXTSIDI (* FLD (i_src1
)), 32));
2205 SET_H_ACCUMS (FLD (f_accs
), opval
);
2206 TRACE_RESULT (current_cpu
, abuf
, "accs", 'D', opval
);
2213 CASE (sem
, INSN_MVTACLO_A
) : /* mvtaclo $src1,$accs */
2215 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
2216 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
2217 #define FLD(f) abuf->fields.sfmt_mvtachi_a.f
2218 int UNUSED written
= 0;
2219 IADDR UNUSED pc
= abuf
->addr
;
2220 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
2223 DI opval
= ORDI (ANDDI (GET_H_ACCUMS (FLD (f_accs
)), MAKEDI (0xffffffff, 0)), ZEXTSIDI (* FLD (i_src1
)));
2224 SET_H_ACCUMS (FLD (f_accs
), opval
);
2225 TRACE_RESULT (current_cpu
, abuf
, "accs", 'D', opval
);
2232 CASE (sem
, INSN_MVTC
) : /* mvtc $sr,$dcr */
2234 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
2235 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
2236 #define FLD(f) abuf->fields.sfmt_ld_plus.f
2237 int UNUSED written
= 0;
2238 IADDR UNUSED pc
= abuf
->addr
;
2239 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
2242 USI opval
= * FLD (i_sr
);
2243 SET_H_CR (FLD (f_r1
), opval
);
2244 TRACE_RESULT (current_cpu
, abuf
, "dcr", 'x', opval
);
2251 CASE (sem
, INSN_NEG
) : /* neg $dr,$sr */
2253 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
2254 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
2255 #define FLD(f) abuf->fields.sfmt_ld_plus.f
2256 int UNUSED written
= 0;
2257 IADDR UNUSED pc
= abuf
->addr
;
2258 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
2261 SI opval
= NEGSI (* FLD (i_sr
));
2262 * FLD (i_dr
) = opval
;
2263 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
2270 CASE (sem
, INSN_NOP
) : /* nop */
2272 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
2273 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
2274 #define FLD(f) abuf->fields.fmt_empty.f
2275 int UNUSED written
= 0;
2276 IADDR UNUSED pc
= abuf
->addr
;
2277 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
2279 PROFILE_COUNT_FILLNOPS (current_cpu
, abuf
->addr
);
2285 CASE (sem
, INSN_NOT
) : /* not $dr,$sr */
2287 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
2288 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
2289 #define FLD(f) abuf->fields.sfmt_ld_plus.f
2290 int UNUSED written
= 0;
2291 IADDR UNUSED pc
= abuf
->addr
;
2292 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
2295 SI opval
= INVSI (* FLD (i_sr
));
2296 * FLD (i_dr
) = opval
;
2297 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
2304 CASE (sem
, INSN_RAC_DSI
) : /* rac $accd,$accs,$imm1 */
2306 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
2307 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
2308 #define FLD(f) abuf->fields.sfmt_rac_dsi.f
2309 int UNUSED written
= 0;
2310 IADDR UNUSED pc
= abuf
->addr
;
2311 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
2315 tmp_tmp1
= SLLDI (GET_H_ACCUMS (FLD (f_accs
)), FLD (f_imm1
));
2316 tmp_tmp1
= ADDDI (tmp_tmp1
, MAKEDI (0, 32768));
2318 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)));
2319 SET_H_ACCUMS (FLD (f_accd
), opval
);
2320 TRACE_RESULT (current_cpu
, abuf
, "accd", 'D', opval
);
2328 CASE (sem
, INSN_RACH_DSI
) : /* rach $accd,$accs,$imm1 */
2330 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
2331 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
2332 #define FLD(f) abuf->fields.sfmt_rac_dsi.f
2333 int UNUSED written
= 0;
2334 IADDR UNUSED pc
= abuf
->addr
;
2335 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
2339 tmp_tmp1
= SLLDI (GET_H_ACCUMS (FLD (f_accs
)), FLD (f_imm1
));
2340 tmp_tmp1
= ADDDI (tmp_tmp1
, MAKEDI (0, 0x80000000));
2342 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)));
2343 SET_H_ACCUMS (FLD (f_accd
), opval
);
2344 TRACE_RESULT (current_cpu
, abuf
, "accd", 'D', opval
);
2352 CASE (sem
, INSN_RTE
) : /* rte */
2354 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
2355 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
2356 #define FLD(f) abuf->fields.fmt_empty.f
2357 int UNUSED written
= 0;
2358 IADDR UNUSED pc
= abuf
->addr
;
2360 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
2364 USI opval
= ANDSI (GET_H_CR (((UINT
) 6)), -4);
2365 SEM_BRANCH_VIA_ADDR (current_cpu
, sem_arg
, opval
, vpc
);
2366 TRACE_RESULT (current_cpu
, abuf
, "pc", 'x', opval
);
2369 USI opval
= GET_H_CR (((UINT
) 14));
2370 SET_H_CR (((UINT
) 6), opval
);
2371 TRACE_RESULT (current_cpu
, abuf
, "cr-6", 'x', opval
);
2374 UQI opval
= CPU (h_bpsw
);
2376 TRACE_RESULT (current_cpu
, abuf
, "psw", 'x', opval
);
2379 UQI opval
= CPU (h_bbpsw
);
2380 CPU (h_bpsw
) = opval
;
2381 TRACE_RESULT (current_cpu
, abuf
, "bpsw", 'x', opval
);
2385 SEM_BRANCH_FINI (vpc
);
2390 CASE (sem
, INSN_SETH
) : /* seth $dr,$hash$hi16 */
2392 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
2393 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
2394 #define FLD(f) abuf->fields.sfmt_seth.f
2395 int UNUSED written
= 0;
2396 IADDR UNUSED pc
= abuf
->addr
;
2397 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 4);
2400 SI opval
= SLLSI (FLD (f_hi16
), 16);
2401 * FLD (i_dr
) = opval
;
2402 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
2409 CASE (sem
, INSN_SLL
) : /* sll $dr,$sr */
2411 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
2412 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
2413 #define FLD(f) abuf->fields.sfmt_add.f
2414 int UNUSED written
= 0;
2415 IADDR UNUSED pc
= abuf
->addr
;
2416 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
2419 SI opval
= SLLSI (* FLD (i_dr
), ANDSI (* FLD (i_sr
), 31));
2420 * FLD (i_dr
) = opval
;
2421 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
2428 CASE (sem
, INSN_SLL3
) : /* sll3 $dr,$sr,$simm16 */
2430 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
2431 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
2432 #define FLD(f) abuf->fields.sfmt_add3.f
2433 int UNUSED written
= 0;
2434 IADDR UNUSED pc
= abuf
->addr
;
2435 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 4);
2438 SI opval
= SLLSI (* FLD (i_sr
), ANDSI (FLD (f_simm16
), 31));
2439 * FLD (i_dr
) = opval
;
2440 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
2447 CASE (sem
, INSN_SLLI
) : /* slli $dr,$uimm5 */
2449 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
2450 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
2451 #define FLD(f) abuf->fields.sfmt_slli.f
2452 int UNUSED written
= 0;
2453 IADDR UNUSED pc
= abuf
->addr
;
2454 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
2457 SI opval
= SLLSI (* FLD (i_dr
), FLD (f_uimm5
));
2458 * FLD (i_dr
) = opval
;
2459 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
2466 CASE (sem
, INSN_SRA
) : /* sra $dr,$sr */
2468 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
2469 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
2470 #define FLD(f) abuf->fields.sfmt_add.f
2471 int UNUSED written
= 0;
2472 IADDR UNUSED pc
= abuf
->addr
;
2473 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
2476 SI opval
= SRASI (* FLD (i_dr
), ANDSI (* FLD (i_sr
), 31));
2477 * FLD (i_dr
) = opval
;
2478 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
2485 CASE (sem
, INSN_SRA3
) : /* sra3 $dr,$sr,$simm16 */
2487 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
2488 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
2489 #define FLD(f) abuf->fields.sfmt_add3.f
2490 int UNUSED written
= 0;
2491 IADDR UNUSED pc
= abuf
->addr
;
2492 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 4);
2495 SI opval
= SRASI (* FLD (i_sr
), ANDSI (FLD (f_simm16
), 31));
2496 * FLD (i_dr
) = opval
;
2497 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
2504 CASE (sem
, INSN_SRAI
) : /* srai $dr,$uimm5 */
2506 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
2507 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
2508 #define FLD(f) abuf->fields.sfmt_slli.f
2509 int UNUSED written
= 0;
2510 IADDR UNUSED pc
= abuf
->addr
;
2511 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
2514 SI opval
= SRASI (* FLD (i_dr
), FLD (f_uimm5
));
2515 * FLD (i_dr
) = opval
;
2516 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
2523 CASE (sem
, INSN_SRL
) : /* srl $dr,$sr */
2525 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
2526 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
2527 #define FLD(f) abuf->fields.sfmt_add.f
2528 int UNUSED written
= 0;
2529 IADDR UNUSED pc
= abuf
->addr
;
2530 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
2533 SI opval
= SRLSI (* FLD (i_dr
), ANDSI (* FLD (i_sr
), 31));
2534 * FLD (i_dr
) = opval
;
2535 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
2542 CASE (sem
, INSN_SRL3
) : /* srl3 $dr,$sr,$simm16 */
2544 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
2545 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
2546 #define FLD(f) abuf->fields.sfmt_add3.f
2547 int UNUSED written
= 0;
2548 IADDR UNUSED pc
= abuf
->addr
;
2549 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 4);
2552 SI opval
= SRLSI (* FLD (i_sr
), ANDSI (FLD (f_simm16
), 31));
2553 * FLD (i_dr
) = opval
;
2554 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
2561 CASE (sem
, INSN_SRLI
) : /* srli $dr,$uimm5 */
2563 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
2564 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
2565 #define FLD(f) abuf->fields.sfmt_slli.f
2566 int UNUSED written
= 0;
2567 IADDR UNUSED pc
= abuf
->addr
;
2568 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
2571 SI opval
= SRLSI (* FLD (i_dr
), FLD (f_uimm5
));
2572 * FLD (i_dr
) = opval
;
2573 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
2580 CASE (sem
, INSN_ST
) : /* st $src1,@$src2 */
2582 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
2583 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
2584 #define FLD(f) abuf->fields.sfmt_st_plus.f
2585 int UNUSED written
= 0;
2586 IADDR UNUSED pc
= abuf
->addr
;
2587 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
2590 SI opval
= * FLD (i_src1
);
2591 SETMEMSI (current_cpu
, pc
, * FLD (i_src2
), opval
);
2592 TRACE_RESULT (current_cpu
, abuf
, "memory", 'x', opval
);
2599 CASE (sem
, INSN_ST_D
) : /* st $src1,@($slo16,$src2) */
2601 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
2602 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
2603 #define FLD(f) abuf->fields.sfmt_st_d.f
2604 int UNUSED written
= 0;
2605 IADDR UNUSED pc
= abuf
->addr
;
2606 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 4);
2609 SI opval
= * FLD (i_src1
);
2610 SETMEMSI (current_cpu
, pc
, ADDSI (* FLD (i_src2
), FLD (f_simm16
)), opval
);
2611 TRACE_RESULT (current_cpu
, abuf
, "memory", 'x', opval
);
2618 CASE (sem
, INSN_STB
) : /* stb $src1,@$src2 */
2620 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
2621 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
2622 #define FLD(f) abuf->fields.sfmt_st_plus.f
2623 int UNUSED written
= 0;
2624 IADDR UNUSED pc
= abuf
->addr
;
2625 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
2628 QI opval
= * FLD (i_src1
);
2629 SETMEMQI (current_cpu
, pc
, * FLD (i_src2
), opval
);
2630 TRACE_RESULT (current_cpu
, abuf
, "memory", 'x', opval
);
2637 CASE (sem
, INSN_STB_D
) : /* stb $src1,@($slo16,$src2) */
2639 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
2640 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
2641 #define FLD(f) abuf->fields.sfmt_st_d.f
2642 int UNUSED written
= 0;
2643 IADDR UNUSED pc
= abuf
->addr
;
2644 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 4);
2647 QI opval
= * FLD (i_src1
);
2648 SETMEMQI (current_cpu
, pc
, ADDSI (* FLD (i_src2
), FLD (f_simm16
)), opval
);
2649 TRACE_RESULT (current_cpu
, abuf
, "memory", 'x', opval
);
2656 CASE (sem
, INSN_STH
) : /* sth $src1,@$src2 */
2658 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
2659 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
2660 #define FLD(f) abuf->fields.sfmt_st_plus.f
2661 int UNUSED written
= 0;
2662 IADDR UNUSED pc
= abuf
->addr
;
2663 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
2666 HI opval
= * FLD (i_src1
);
2667 SETMEMHI (current_cpu
, pc
, * FLD (i_src2
), opval
);
2668 TRACE_RESULT (current_cpu
, abuf
, "memory", 'x', opval
);
2675 CASE (sem
, INSN_STH_D
) : /* sth $src1,@($slo16,$src2) */
2677 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
2678 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
2679 #define FLD(f) abuf->fields.sfmt_st_d.f
2680 int UNUSED written
= 0;
2681 IADDR UNUSED pc
= abuf
->addr
;
2682 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 4);
2685 HI opval
= * FLD (i_src1
);
2686 SETMEMHI (current_cpu
, pc
, ADDSI (* FLD (i_src2
), FLD (f_simm16
)), opval
);
2687 TRACE_RESULT (current_cpu
, abuf
, "memory", 'x', opval
);
2694 CASE (sem
, INSN_ST_PLUS
) : /* st $src1,@+$src2 */
2696 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
2697 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
2698 #define FLD(f) abuf->fields.sfmt_st_plus.f
2699 int UNUSED written
= 0;
2700 IADDR UNUSED pc
= abuf
->addr
;
2701 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
2705 tmp_new_src2
= ADDSI (* FLD (i_src2
), 4);
2707 SI opval
= * FLD (i_src1
);
2708 SETMEMSI (current_cpu
, pc
, tmp_new_src2
, opval
);
2709 TRACE_RESULT (current_cpu
, abuf
, "memory", 'x', opval
);
2712 SI opval
= tmp_new_src2
;
2713 * FLD (i_src2
) = opval
;
2714 TRACE_RESULT (current_cpu
, abuf
, "src2", 'x', opval
);
2722 CASE (sem
, INSN_ST_MINUS
) : /* st $src1,@-$src2 */
2724 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
2725 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
2726 #define FLD(f) abuf->fields.sfmt_st_plus.f
2727 int UNUSED written
= 0;
2728 IADDR UNUSED pc
= abuf
->addr
;
2729 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
2733 tmp_new_src2
= SUBSI (* FLD (i_src2
), 4);
2735 SI opval
= * FLD (i_src1
);
2736 SETMEMSI (current_cpu
, pc
, tmp_new_src2
, opval
);
2737 TRACE_RESULT (current_cpu
, abuf
, "memory", 'x', opval
);
2740 SI opval
= tmp_new_src2
;
2741 * FLD (i_src2
) = opval
;
2742 TRACE_RESULT (current_cpu
, abuf
, "src2", 'x', opval
);
2750 CASE (sem
, INSN_SUB
) : /* sub $dr,$sr */
2752 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
2753 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
2754 #define FLD(f) abuf->fields.sfmt_add.f
2755 int UNUSED written
= 0;
2756 IADDR UNUSED pc
= abuf
->addr
;
2757 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
2760 SI opval
= SUBSI (* FLD (i_dr
), * FLD (i_sr
));
2761 * FLD (i_dr
) = opval
;
2762 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
2769 CASE (sem
, INSN_SUBV
) : /* subv $dr,$sr */
2771 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
2772 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
2773 #define FLD(f) abuf->fields.sfmt_add.f
2774 int UNUSED written
= 0;
2775 IADDR UNUSED pc
= abuf
->addr
;
2776 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
2780 temp0
= SUBSI (* FLD (i_dr
), * FLD (i_sr
));
2781 temp1
= SUBOFSI (* FLD (i_dr
), * FLD (i_sr
), 0);
2784 * FLD (i_dr
) = opval
;
2785 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
2789 CPU (h_cond
) = opval
;
2790 TRACE_RESULT (current_cpu
, abuf
, "condbit", 'x', opval
);
2798 CASE (sem
, INSN_SUBX
) : /* subx $dr,$sr */
2800 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
2801 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
2802 #define FLD(f) abuf->fields.sfmt_add.f
2803 int UNUSED written
= 0;
2804 IADDR UNUSED pc
= abuf
->addr
;
2805 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
2809 temp0
= SUBCSI (* FLD (i_dr
), * FLD (i_sr
), CPU (h_cond
));
2810 temp1
= SUBCFSI (* FLD (i_dr
), * FLD (i_sr
), CPU (h_cond
));
2813 * FLD (i_dr
) = opval
;
2814 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
2818 CPU (h_cond
) = opval
;
2819 TRACE_RESULT (current_cpu
, abuf
, "condbit", 'x', opval
);
2827 CASE (sem
, INSN_TRAP
) : /* trap $uimm4 */
2829 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
2830 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
2831 #define FLD(f) abuf->fields.sfmt_trap.f
2832 int UNUSED written
= 0;
2833 IADDR UNUSED pc
= abuf
->addr
;
2835 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
2839 USI opval
= GET_H_CR (((UINT
) 6));
2840 SET_H_CR (((UINT
) 14), opval
);
2841 TRACE_RESULT (current_cpu
, abuf
, "cr-14", 'x', opval
);
2844 USI opval
= ADDSI (pc
, 4);
2845 SET_H_CR (((UINT
) 6), opval
);
2846 TRACE_RESULT (current_cpu
, abuf
, "cr-6", 'x', opval
);
2849 UQI opval
= CPU (h_bpsw
);
2850 CPU (h_bbpsw
) = opval
;
2851 TRACE_RESULT (current_cpu
, abuf
, "bbpsw", 'x', opval
);
2854 UQI opval
= GET_H_PSW ();
2855 CPU (h_bpsw
) = opval
;
2856 TRACE_RESULT (current_cpu
, abuf
, "bpsw", 'x', opval
);
2859 UQI opval
= ANDQI (GET_H_PSW (), 128);
2861 TRACE_RESULT (current_cpu
, abuf
, "psw", 'x', opval
);
2864 SI opval
= m32r_trap (current_cpu
, pc
, FLD (f_uimm4
));
2865 SEM_BRANCH_VIA_ADDR (current_cpu
, sem_arg
, opval
, vpc
);
2866 TRACE_RESULT (current_cpu
, abuf
, "pc", 'x', opval
);
2870 SEM_BRANCH_FINI (vpc
);
2875 CASE (sem
, INSN_UNLOCK
) : /* unlock $src1,@$src2 */
2877 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
2878 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
2879 #define FLD(f) abuf->fields.sfmt_st_plus.f
2880 int UNUSED written
= 0;
2881 IADDR UNUSED pc
= abuf
->addr
;
2882 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
2887 SI opval
= * FLD (i_src1
);
2888 SETMEMSI (current_cpu
, pc
, * FLD (i_src2
), opval
);
2889 written
|= (1 << 4);
2890 TRACE_RESULT (current_cpu
, abuf
, "memory", 'x', opval
);
2895 CPU (h_lock
) = opval
;
2896 TRACE_RESULT (current_cpu
, abuf
, "lock", 'x', opval
);
2900 abuf
->written
= written
;
2905 CASE (sem
, INSN_SATB
) : /* satb $dr,$sr */
2907 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
2908 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
2909 #define FLD(f) abuf->fields.sfmt_ld_plus.f
2910 int UNUSED written
= 0;
2911 IADDR UNUSED pc
= abuf
->addr
;
2912 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 4);
2915 SI opval
= (GESI (* FLD (i_sr
), 127)) ? (127) : (LESI (* FLD (i_sr
), -128)) ? (-128) : (* FLD (i_sr
));
2916 * FLD (i_dr
) = opval
;
2917 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
2924 CASE (sem
, INSN_SATH
) : /* sath $dr,$sr */
2926 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
2927 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
2928 #define FLD(f) abuf->fields.sfmt_ld_plus.f
2929 int UNUSED written
= 0;
2930 IADDR UNUSED pc
= abuf
->addr
;
2931 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 4);
2934 SI opval
= (GESI (* FLD (i_sr
), 32767)) ? (32767) : (LESI (* FLD (i_sr
), -32768)) ? (-32768) : (* FLD (i_sr
));
2935 * FLD (i_dr
) = opval
;
2936 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
2943 CASE (sem
, INSN_SAT
) : /* sat $dr,$sr */
2945 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
2946 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
2947 #define FLD(f) abuf->fields.sfmt_ld_plus.f
2948 int UNUSED written
= 0;
2949 IADDR UNUSED pc
= abuf
->addr
;
2950 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 4);
2953 SI opval
= ((CPU (h_cond
)) ? (((LTSI (* FLD (i_sr
), 0)) ? (2147483647) : (0x80000000))) : (* FLD (i_sr
)));
2954 * FLD (i_dr
) = opval
;
2955 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
2962 CASE (sem
, INSN_PCMPBZ
) : /* pcmpbz $src2 */
2964 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
2965 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
2966 #define FLD(f) abuf->fields.sfmt_st_plus.f
2967 int UNUSED written
= 0;
2968 IADDR UNUSED pc
= abuf
->addr
;
2969 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
2972 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);
2973 CPU (h_cond
) = opval
;
2974 TRACE_RESULT (current_cpu
, abuf
, "condbit", 'x', opval
);
2981 CASE (sem
, INSN_SADD
) : /* sadd */
2983 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
2984 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
2985 #define FLD(f) abuf->fields.fmt_empty.f
2986 int UNUSED written
= 0;
2987 IADDR UNUSED pc
= abuf
->addr
;
2988 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
2991 DI opval
= ADDDI (SRADI (GET_H_ACCUMS (((UINT
) 1)), 16), GET_H_ACCUMS (((UINT
) 0)));
2992 SET_H_ACCUMS (((UINT
) 0), opval
);
2993 TRACE_RESULT (current_cpu
, abuf
, "accums-0", 'D', opval
);
3000 CASE (sem
, INSN_MACWU1
) : /* macwu1 $src1,$src2 */
3002 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
3003 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
3004 #define FLD(f) abuf->fields.sfmt_st_plus.f
3005 int UNUSED written
= 0;
3006 IADDR UNUSED pc
= abuf
->addr
;
3007 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
3010 DI opval
= SRADI (SLLDI (ADDDI (GET_H_ACCUMS (((UINT
) 1)), MULDI (EXTSIDI (* FLD (i_src1
)), EXTSIDI (ANDSI (* FLD (i_src2
), 65535)))), 8), 8);
3011 SET_H_ACCUMS (((UINT
) 1), opval
);
3012 TRACE_RESULT (current_cpu
, abuf
, "accums-1", 'D', opval
);
3019 CASE (sem
, INSN_MSBLO
) : /* msblo $src1,$src2 */
3021 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
3022 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
3023 #define FLD(f) abuf->fields.sfmt_st_plus.f
3024 int UNUSED written
= 0;
3025 IADDR UNUSED pc
= abuf
->addr
;
3026 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
3029 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);
3030 SET_H_ACCUM (opval
);
3031 TRACE_RESULT (current_cpu
, abuf
, "accum", 'D', opval
);
3038 CASE (sem
, INSN_MULWU1
) : /* mulwu1 $src1,$src2 */
3040 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
3041 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
3042 #define FLD(f) abuf->fields.sfmt_st_plus.f
3043 int UNUSED written
= 0;
3044 IADDR UNUSED pc
= abuf
->addr
;
3045 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
3048 DI opval
= SRADI (SLLDI (MULDI (EXTSIDI (* FLD (i_src1
)), EXTSIDI (ANDSI (* FLD (i_src2
), 65535))), 16), 16);
3049 SET_H_ACCUMS (((UINT
) 1), opval
);
3050 TRACE_RESULT (current_cpu
, abuf
, "accums-1", 'D', opval
);
3057 CASE (sem
, INSN_MACLH1
) : /* maclh1 $src1,$src2 */
3059 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
3060 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
3061 #define FLD(f) abuf->fields.sfmt_st_plus.f
3062 int UNUSED written
= 0;
3063 IADDR UNUSED pc
= abuf
->addr
;
3064 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
3067 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);
3068 SET_H_ACCUMS (((UINT
) 1), opval
);
3069 TRACE_RESULT (current_cpu
, abuf
, "accums-1", 'D', opval
);
3076 CASE (sem
, INSN_SC
) : /* sc */
3078 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
3079 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
3080 #define FLD(f) abuf->fields.fmt_empty.f
3081 int UNUSED written
= 0;
3082 IADDR UNUSED pc
= abuf
->addr
;
3083 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
3085 if (ZEXTBISI (CPU (h_cond
)))
3086 SEM_SKIP_INSN (current_cpu
, sem_arg
, vpc
);
3092 CASE (sem
, INSN_SNC
) : /* snc */
3094 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
3095 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
3096 #define FLD(f) abuf->fields.fmt_empty.f
3097 int UNUSED written
= 0;
3098 IADDR UNUSED pc
= abuf
->addr
;
3099 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
3101 if (ZEXTBISI (NOTBI (CPU (h_cond
))))
3102 SEM_SKIP_INSN (current_cpu
, sem_arg
, vpc
);
3108 CASE (sem
, INSN_PAR_ADD
) : /* add $dr,$sr */
3110 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
3111 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
3112 #define FLD(f) abuf->fields.sfmt_add.f
3113 #define OPRND(f) par_exec->operands.sfmt_add.f
3114 int UNUSED written
= 0;
3115 IADDR UNUSED pc
= abuf
->addr
;
3116 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
3119 SI opval
= ADDSI (* FLD (i_dr
), * FLD (i_sr
));
3121 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
3129 CASE (sem
, INSN_WRITE_ADD
) : /* add $dr,$sr */
3131 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
3132 const ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
)->fields
.write
.abuf
;
3133 #define FLD(f) abuf->fields.sfmt_add.f
3134 #define OPRND(f) par_exec->operands.sfmt_add.f
3135 int UNUSED written
= abuf
->written
;
3136 IADDR UNUSED pc
= abuf
->addr
;
3137 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 0);
3139 * FLD (i_dr
) = OPRND (dr
);
3146 CASE (sem
, INSN_PAR_AND
) : /* and $dr,$sr */
3148 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
3149 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
3150 #define FLD(f) abuf->fields.sfmt_add.f
3151 #define OPRND(f) par_exec->operands.sfmt_add.f
3152 int UNUSED written
= 0;
3153 IADDR UNUSED pc
= abuf
->addr
;
3154 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
3157 SI opval
= ANDSI (* FLD (i_dr
), * FLD (i_sr
));
3159 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
3167 CASE (sem
, INSN_WRITE_AND
) : /* and $dr,$sr */
3169 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
3170 const ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
)->fields
.write
.abuf
;
3171 #define FLD(f) abuf->fields.sfmt_add.f
3172 #define OPRND(f) par_exec->operands.sfmt_add.f
3173 int UNUSED written
= abuf
->written
;
3174 IADDR UNUSED pc
= abuf
->addr
;
3175 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 0);
3177 * FLD (i_dr
) = OPRND (dr
);
3184 CASE (sem
, INSN_PAR_OR
) : /* or $dr,$sr */
3186 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
3187 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
3188 #define FLD(f) abuf->fields.sfmt_add.f
3189 #define OPRND(f) par_exec->operands.sfmt_add.f
3190 int UNUSED written
= 0;
3191 IADDR UNUSED pc
= abuf
->addr
;
3192 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
3195 SI opval
= ORSI (* FLD (i_dr
), * FLD (i_sr
));
3197 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
3205 CASE (sem
, INSN_WRITE_OR
) : /* or $dr,$sr */
3207 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
3208 const ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
)->fields
.write
.abuf
;
3209 #define FLD(f) abuf->fields.sfmt_add.f
3210 #define OPRND(f) par_exec->operands.sfmt_add.f
3211 int UNUSED written
= abuf
->written
;
3212 IADDR UNUSED pc
= abuf
->addr
;
3213 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 0);
3215 * FLD (i_dr
) = OPRND (dr
);
3222 CASE (sem
, INSN_PAR_XOR
) : /* xor $dr,$sr */
3224 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
3225 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
3226 #define FLD(f) abuf->fields.sfmt_add.f
3227 #define OPRND(f) par_exec->operands.sfmt_add.f
3228 int UNUSED written
= 0;
3229 IADDR UNUSED pc
= abuf
->addr
;
3230 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
3233 SI opval
= XORSI (* FLD (i_dr
), * FLD (i_sr
));
3235 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
3243 CASE (sem
, INSN_WRITE_XOR
) : /* xor $dr,$sr */
3245 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
3246 const ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
)->fields
.write
.abuf
;
3247 #define FLD(f) abuf->fields.sfmt_add.f
3248 #define OPRND(f) par_exec->operands.sfmt_add.f
3249 int UNUSED written
= abuf
->written
;
3250 IADDR UNUSED pc
= abuf
->addr
;
3251 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 0);
3253 * FLD (i_dr
) = OPRND (dr
);
3260 CASE (sem
, INSN_PAR_ADDI
) : /* addi $dr,$simm8 */
3262 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
3263 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
3264 #define FLD(f) abuf->fields.sfmt_addi.f
3265 #define OPRND(f) par_exec->operands.sfmt_addi.f
3266 int UNUSED written
= 0;
3267 IADDR UNUSED pc
= abuf
->addr
;
3268 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
3271 SI opval
= ADDSI (* FLD (i_dr
), FLD (f_simm8
));
3273 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
3281 CASE (sem
, INSN_WRITE_ADDI
) : /* addi $dr,$simm8 */
3283 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
3284 const ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
)->fields
.write
.abuf
;
3285 #define FLD(f) abuf->fields.sfmt_addi.f
3286 #define OPRND(f) par_exec->operands.sfmt_addi.f
3287 int UNUSED written
= abuf
->written
;
3288 IADDR UNUSED pc
= abuf
->addr
;
3289 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 0);
3291 * FLD (i_dr
) = OPRND (dr
);
3298 CASE (sem
, INSN_PAR_ADDV
) : /* addv $dr,$sr */
3300 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
3301 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
3302 #define FLD(f) abuf->fields.sfmt_add.f
3303 #define OPRND(f) par_exec->operands.sfmt_addv.f
3304 int UNUSED written
= 0;
3305 IADDR UNUSED pc
= abuf
->addr
;
3306 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
3310 temp0
= ADDSI (* FLD (i_dr
), * FLD (i_sr
));
3311 temp1
= ADDOFSI (* FLD (i_dr
), * FLD (i_sr
), 0);
3315 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
3319 OPRND (condbit
) = opval
;
3320 TRACE_RESULT (current_cpu
, abuf
, "condbit", 'x', opval
);
3329 CASE (sem
, INSN_WRITE_ADDV
) : /* addv $dr,$sr */
3331 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
3332 const ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
)->fields
.write
.abuf
;
3333 #define FLD(f) abuf->fields.sfmt_add.f
3334 #define OPRND(f) par_exec->operands.sfmt_addv.f
3335 int UNUSED written
= abuf
->written
;
3336 IADDR UNUSED pc
= abuf
->addr
;
3337 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 0);
3339 CPU (h_cond
) = OPRND (condbit
);
3340 * FLD (i_dr
) = OPRND (dr
);
3347 CASE (sem
, INSN_PAR_ADDX
) : /* addx $dr,$sr */
3349 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
3350 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
3351 #define FLD(f) abuf->fields.sfmt_add.f
3352 #define OPRND(f) par_exec->operands.sfmt_addx.f
3353 int UNUSED written
= 0;
3354 IADDR UNUSED pc
= abuf
->addr
;
3355 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
3359 temp0
= ADDCSI (* FLD (i_dr
), * FLD (i_sr
), CPU (h_cond
));
3360 temp1
= ADDCFSI (* FLD (i_dr
), * FLD (i_sr
), CPU (h_cond
));
3364 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
3368 OPRND (condbit
) = opval
;
3369 TRACE_RESULT (current_cpu
, abuf
, "condbit", 'x', opval
);
3378 CASE (sem
, INSN_WRITE_ADDX
) : /* addx $dr,$sr */
3380 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
3381 const ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
)->fields
.write
.abuf
;
3382 #define FLD(f) abuf->fields.sfmt_add.f
3383 #define OPRND(f) par_exec->operands.sfmt_addx.f
3384 int UNUSED written
= abuf
->written
;
3385 IADDR UNUSED pc
= abuf
->addr
;
3386 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 0);
3388 CPU (h_cond
) = OPRND (condbit
);
3389 * FLD (i_dr
) = OPRND (dr
);
3396 CASE (sem
, INSN_PAR_BC8
) : /* bc.s $disp8 */
3398 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
3399 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
3400 #define FLD(f) abuf->fields.sfmt_bl8.f
3401 #define OPRND(f) par_exec->operands.sfmt_bc8.f
3402 int UNUSED written
= 0;
3403 IADDR UNUSED pc
= abuf
->addr
;
3404 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
3408 USI opval
= FLD (i_disp8
);
3410 written
|= (1 << 2);
3411 TRACE_RESULT (current_cpu
, abuf
, "pc", 'x', opval
);
3415 abuf
->written
= written
;
3421 CASE (sem
, INSN_WRITE_BC8
) : /* bc.s $disp8 */
3423 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
3424 const ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
)->fields
.write
.abuf
;
3425 #define FLD(f) abuf->fields.sfmt_bl8.f
3426 #define OPRND(f) par_exec->operands.sfmt_bc8.f
3427 int UNUSED written
= abuf
->written
;
3428 IADDR UNUSED pc
= abuf
->addr
;
3430 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 0);
3432 if (written
& (1 << 2))
3434 SEM_BRANCH_VIA_ADDR (current_cpu
, sem_arg
, OPRND (pc
), vpc
);
3437 SEM_BRANCH_FINI (vpc
);
3443 CASE (sem
, INSN_PAR_BL8
) : /* bl.s $disp8 */
3445 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
3446 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
3447 #define FLD(f) abuf->fields.sfmt_bl8.f
3448 #define OPRND(f) par_exec->operands.sfmt_bl8.f
3449 int UNUSED written
= 0;
3450 IADDR UNUSED pc
= abuf
->addr
;
3451 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
3455 SI opval
= ADDSI (ANDSI (pc
, -4), 4);
3456 OPRND (h_gr_14
) = opval
;
3457 TRACE_RESULT (current_cpu
, abuf
, "gr-14", 'x', opval
);
3460 USI opval
= FLD (i_disp8
);
3462 TRACE_RESULT (current_cpu
, abuf
, "pc", 'x', opval
);
3471 CASE (sem
, INSN_WRITE_BL8
) : /* bl.s $disp8 */
3473 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
3474 const ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
)->fields
.write
.abuf
;
3475 #define FLD(f) abuf->fields.sfmt_bl8.f
3476 #define OPRND(f) par_exec->operands.sfmt_bl8.f
3477 int UNUSED written
= abuf
->written
;
3478 IADDR UNUSED pc
= abuf
->addr
;
3480 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 0);
3482 CPU (h_gr
[((UINT
) 14)]) = OPRND (h_gr_14
);
3483 SEM_BRANCH_VIA_ADDR (current_cpu
, sem_arg
, OPRND (pc
), vpc
);
3485 SEM_BRANCH_FINI (vpc
);
3491 CASE (sem
, INSN_PAR_BCL8
) : /* bcl.s $disp8 */
3493 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
3494 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
3495 #define FLD(f) abuf->fields.sfmt_bl8.f
3496 #define OPRND(f) par_exec->operands.sfmt_bcl8.f
3497 int UNUSED written
= 0;
3498 IADDR UNUSED pc
= abuf
->addr
;
3499 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
3504 SI opval
= ADDSI (ANDSI (pc
, -4), 4);
3505 OPRND (h_gr_14
) = opval
;
3506 written
|= (1 << 3);
3507 TRACE_RESULT (current_cpu
, abuf
, "gr-14", 'x', opval
);
3510 USI opval
= FLD (i_disp8
);
3512 written
|= (1 << 4);
3513 TRACE_RESULT (current_cpu
, abuf
, "pc", 'x', opval
);
3518 abuf
->written
= written
;
3524 CASE (sem
, INSN_WRITE_BCL8
) : /* bcl.s $disp8 */
3526 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
3527 const ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
)->fields
.write
.abuf
;
3528 #define FLD(f) abuf->fields.sfmt_bl8.f
3529 #define OPRND(f) par_exec->operands.sfmt_bcl8.f
3530 int UNUSED written
= abuf
->written
;
3531 IADDR UNUSED pc
= abuf
->addr
;
3533 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 0);
3535 if (written
& (1 << 3))
3537 CPU (h_gr
[((UINT
) 14)]) = OPRND (h_gr_14
);
3539 if (written
& (1 << 4))
3541 SEM_BRANCH_VIA_ADDR (current_cpu
, sem_arg
, OPRND (pc
), vpc
);
3544 SEM_BRANCH_FINI (vpc
);
3550 CASE (sem
, INSN_PAR_BNC8
) : /* bnc.s $disp8 */
3552 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
3553 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
3554 #define FLD(f) abuf->fields.sfmt_bl8.f
3555 #define OPRND(f) par_exec->operands.sfmt_bc8.f
3556 int UNUSED written
= 0;
3557 IADDR UNUSED pc
= abuf
->addr
;
3558 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
3560 if (NOTBI (CPU (h_cond
))) {
3562 USI opval
= FLD (i_disp8
);
3564 written
|= (1 << 2);
3565 TRACE_RESULT (current_cpu
, abuf
, "pc", 'x', opval
);
3569 abuf
->written
= written
;
3575 CASE (sem
, INSN_WRITE_BNC8
) : /* bnc.s $disp8 */
3577 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
3578 const ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
)->fields
.write
.abuf
;
3579 #define FLD(f) abuf->fields.sfmt_bl8.f
3580 #define OPRND(f) par_exec->operands.sfmt_bc8.f
3581 int UNUSED written
= abuf
->written
;
3582 IADDR UNUSED pc
= abuf
->addr
;
3584 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 0);
3586 if (written
& (1 << 2))
3588 SEM_BRANCH_VIA_ADDR (current_cpu
, sem_arg
, OPRND (pc
), vpc
);
3591 SEM_BRANCH_FINI (vpc
);
3597 CASE (sem
, INSN_PAR_BRA8
) : /* bra.s $disp8 */
3599 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
3600 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
3601 #define FLD(f) abuf->fields.sfmt_bl8.f
3602 #define OPRND(f) par_exec->operands.sfmt_bra8.f
3603 int UNUSED written
= 0;
3604 IADDR UNUSED pc
= abuf
->addr
;
3605 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
3608 USI opval
= FLD (i_disp8
);
3610 TRACE_RESULT (current_cpu
, abuf
, "pc", 'x', opval
);
3618 CASE (sem
, INSN_WRITE_BRA8
) : /* bra.s $disp8 */
3620 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
3621 const ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
)->fields
.write
.abuf
;
3622 #define FLD(f) abuf->fields.sfmt_bl8.f
3623 #define OPRND(f) par_exec->operands.sfmt_bra8.f
3624 int UNUSED written
= abuf
->written
;
3625 IADDR UNUSED pc
= abuf
->addr
;
3627 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 0);
3629 SEM_BRANCH_VIA_ADDR (current_cpu
, sem_arg
, OPRND (pc
), vpc
);
3631 SEM_BRANCH_FINI (vpc
);
3637 CASE (sem
, INSN_PAR_BNCL8
) : /* bncl.s $disp8 */
3639 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
3640 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
3641 #define FLD(f) abuf->fields.sfmt_bl8.f
3642 #define OPRND(f) par_exec->operands.sfmt_bcl8.f
3643 int UNUSED written
= 0;
3644 IADDR UNUSED pc
= abuf
->addr
;
3645 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
3647 if (NOTBI (CPU (h_cond
))) {
3650 SI opval
= ADDSI (ANDSI (pc
, -4), 4);
3651 OPRND (h_gr_14
) = opval
;
3652 written
|= (1 << 3);
3653 TRACE_RESULT (current_cpu
, abuf
, "gr-14", 'x', opval
);
3656 USI opval
= FLD (i_disp8
);
3658 written
|= (1 << 4);
3659 TRACE_RESULT (current_cpu
, abuf
, "pc", 'x', opval
);
3664 abuf
->written
= written
;
3670 CASE (sem
, INSN_WRITE_BNCL8
) : /* bncl.s $disp8 */
3672 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
3673 const ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
)->fields
.write
.abuf
;
3674 #define FLD(f) abuf->fields.sfmt_bl8.f
3675 #define OPRND(f) par_exec->operands.sfmt_bcl8.f
3676 int UNUSED written
= abuf
->written
;
3677 IADDR UNUSED pc
= abuf
->addr
;
3679 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 0);
3681 if (written
& (1 << 3))
3683 CPU (h_gr
[((UINT
) 14)]) = OPRND (h_gr_14
);
3685 if (written
& (1 << 4))
3687 SEM_BRANCH_VIA_ADDR (current_cpu
, sem_arg
, OPRND (pc
), vpc
);
3690 SEM_BRANCH_FINI (vpc
);
3696 CASE (sem
, INSN_PAR_CMP
) : /* cmp $src1,$src2 */
3698 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
3699 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
3700 #define FLD(f) abuf->fields.sfmt_st_plus.f
3701 #define OPRND(f) par_exec->operands.sfmt_cmp.f
3702 int UNUSED written
= 0;
3703 IADDR UNUSED pc
= abuf
->addr
;
3704 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
3707 BI opval
= LTSI (* FLD (i_src1
), * FLD (i_src2
));
3708 OPRND (condbit
) = opval
;
3709 TRACE_RESULT (current_cpu
, abuf
, "condbit", 'x', opval
);
3717 CASE (sem
, INSN_WRITE_CMP
) : /* cmp $src1,$src2 */
3719 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
3720 const ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
)->fields
.write
.abuf
;
3721 #define FLD(f) abuf->fields.sfmt_st_plus.f
3722 #define OPRND(f) par_exec->operands.sfmt_cmp.f
3723 int UNUSED written
= abuf
->written
;
3724 IADDR UNUSED pc
= abuf
->addr
;
3725 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 0);
3727 CPU (h_cond
) = OPRND (condbit
);
3734 CASE (sem
, INSN_PAR_CMPU
) : /* cmpu $src1,$src2 */
3736 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
3737 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
3738 #define FLD(f) abuf->fields.sfmt_st_plus.f
3739 #define OPRND(f) par_exec->operands.sfmt_cmp.f
3740 int UNUSED written
= 0;
3741 IADDR UNUSED pc
= abuf
->addr
;
3742 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
3745 BI opval
= LTUSI (* FLD (i_src1
), * FLD (i_src2
));
3746 OPRND (condbit
) = opval
;
3747 TRACE_RESULT (current_cpu
, abuf
, "condbit", 'x', opval
);
3755 CASE (sem
, INSN_WRITE_CMPU
) : /* cmpu $src1,$src2 */
3757 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
3758 const ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
)->fields
.write
.abuf
;
3759 #define FLD(f) abuf->fields.sfmt_st_plus.f
3760 #define OPRND(f) par_exec->operands.sfmt_cmp.f
3761 int UNUSED written
= abuf
->written
;
3762 IADDR UNUSED pc
= abuf
->addr
;
3763 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 0);
3765 CPU (h_cond
) = OPRND (condbit
);
3772 CASE (sem
, INSN_PAR_CMPEQ
) : /* cmpeq $src1,$src2 */
3774 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
3775 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
3776 #define FLD(f) abuf->fields.sfmt_st_plus.f
3777 #define OPRND(f) par_exec->operands.sfmt_cmp.f
3778 int UNUSED written
= 0;
3779 IADDR UNUSED pc
= abuf
->addr
;
3780 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
3783 BI opval
= EQSI (* FLD (i_src1
), * FLD (i_src2
));
3784 OPRND (condbit
) = opval
;
3785 TRACE_RESULT (current_cpu
, abuf
, "condbit", 'x', opval
);
3793 CASE (sem
, INSN_WRITE_CMPEQ
) : /* cmpeq $src1,$src2 */
3795 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
3796 const ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
)->fields
.write
.abuf
;
3797 #define FLD(f) abuf->fields.sfmt_st_plus.f
3798 #define OPRND(f) par_exec->operands.sfmt_cmp.f
3799 int UNUSED written
= abuf
->written
;
3800 IADDR UNUSED pc
= abuf
->addr
;
3801 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 0);
3803 CPU (h_cond
) = OPRND (condbit
);
3810 CASE (sem
, INSN_PAR_CMPZ
) : /* cmpz $src2 */
3812 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
3813 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
3814 #define FLD(f) abuf->fields.sfmt_st_plus.f
3815 #define OPRND(f) par_exec->operands.sfmt_cmpz.f
3816 int UNUSED written
= 0;
3817 IADDR UNUSED pc
= abuf
->addr
;
3818 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
3821 BI opval
= EQSI (* FLD (i_src2
), 0);
3822 OPRND (condbit
) = opval
;
3823 TRACE_RESULT (current_cpu
, abuf
, "condbit", 'x', opval
);
3831 CASE (sem
, INSN_WRITE_CMPZ
) : /* cmpz $src2 */
3833 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
3834 const ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
)->fields
.write
.abuf
;
3835 #define FLD(f) abuf->fields.sfmt_st_plus.f
3836 #define OPRND(f) par_exec->operands.sfmt_cmpz.f
3837 int UNUSED written
= abuf
->written
;
3838 IADDR UNUSED pc
= abuf
->addr
;
3839 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 0);
3841 CPU (h_cond
) = OPRND (condbit
);
3848 CASE (sem
, INSN_PAR_JC
) : /* jc $sr */
3850 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
3851 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
3852 #define FLD(f) abuf->fields.sfmt_jl.f
3853 #define OPRND(f) par_exec->operands.sfmt_jc.f
3854 int UNUSED written
= 0;
3855 IADDR UNUSED pc
= abuf
->addr
;
3856 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
3860 USI opval
= ANDSI (* FLD (i_sr
), -4);
3862 written
|= (1 << 2);
3863 TRACE_RESULT (current_cpu
, abuf
, "pc", 'x', opval
);
3867 abuf
->written
= written
;
3873 CASE (sem
, INSN_WRITE_JC
) : /* jc $sr */
3875 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
3876 const ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
)->fields
.write
.abuf
;
3877 #define FLD(f) abuf->fields.sfmt_jl.f
3878 #define OPRND(f) par_exec->operands.sfmt_jc.f
3879 int UNUSED written
= abuf
->written
;
3880 IADDR UNUSED pc
= abuf
->addr
;
3882 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 0);
3884 if (written
& (1 << 2))
3886 SEM_BRANCH_VIA_ADDR (current_cpu
, sem_arg
, OPRND (pc
), vpc
);
3889 SEM_BRANCH_FINI (vpc
);
3895 CASE (sem
, INSN_PAR_JNC
) : /* jnc $sr */
3897 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
3898 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
3899 #define FLD(f) abuf->fields.sfmt_jl.f
3900 #define OPRND(f) par_exec->operands.sfmt_jc.f
3901 int UNUSED written
= 0;
3902 IADDR UNUSED pc
= abuf
->addr
;
3903 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
3905 if (NOTBI (CPU (h_cond
))) {
3907 USI opval
= ANDSI (* FLD (i_sr
), -4);
3909 written
|= (1 << 2);
3910 TRACE_RESULT (current_cpu
, abuf
, "pc", 'x', opval
);
3914 abuf
->written
= written
;
3920 CASE (sem
, INSN_WRITE_JNC
) : /* jnc $sr */
3922 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
3923 const ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
)->fields
.write
.abuf
;
3924 #define FLD(f) abuf->fields.sfmt_jl.f
3925 #define OPRND(f) par_exec->operands.sfmt_jc.f
3926 int UNUSED written
= abuf
->written
;
3927 IADDR UNUSED pc
= abuf
->addr
;
3929 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 0);
3931 if (written
& (1 << 2))
3933 SEM_BRANCH_VIA_ADDR (current_cpu
, sem_arg
, OPRND (pc
), vpc
);
3936 SEM_BRANCH_FINI (vpc
);
3942 CASE (sem
, INSN_PAR_JL
) : /* jl $sr */
3944 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
3945 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
3946 #define FLD(f) abuf->fields.sfmt_jl.f
3947 #define OPRND(f) par_exec->operands.sfmt_jl.f
3948 int UNUSED written
= 0;
3949 IADDR UNUSED pc
= abuf
->addr
;
3950 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
3954 temp0
= ADDSI (ANDSI (pc
, -4), 4);
3955 temp1
= ANDSI (* FLD (i_sr
), -4);
3958 OPRND (h_gr_14
) = opval
;
3959 TRACE_RESULT (current_cpu
, abuf
, "gr-14", 'x', opval
);
3964 TRACE_RESULT (current_cpu
, abuf
, "pc", 'x', opval
);
3973 CASE (sem
, INSN_WRITE_JL
) : /* jl $sr */
3975 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
3976 const ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
)->fields
.write
.abuf
;
3977 #define FLD(f) abuf->fields.sfmt_jl.f
3978 #define OPRND(f) par_exec->operands.sfmt_jl.f
3979 int UNUSED written
= abuf
->written
;
3980 IADDR UNUSED pc
= abuf
->addr
;
3982 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 0);
3984 CPU (h_gr
[((UINT
) 14)]) = OPRND (h_gr_14
);
3985 SEM_BRANCH_VIA_ADDR (current_cpu
, sem_arg
, OPRND (pc
), vpc
);
3987 SEM_BRANCH_FINI (vpc
);
3993 CASE (sem
, INSN_PAR_JMP
) : /* jmp $sr */
3995 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
3996 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
3997 #define FLD(f) abuf->fields.sfmt_jl.f
3998 #define OPRND(f) par_exec->operands.sfmt_jmp.f
3999 int UNUSED written
= 0;
4000 IADDR UNUSED pc
= abuf
->addr
;
4001 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
4004 USI opval
= ANDSI (* FLD (i_sr
), -4);
4006 TRACE_RESULT (current_cpu
, abuf
, "pc", 'x', opval
);
4014 CASE (sem
, INSN_WRITE_JMP
) : /* jmp $sr */
4016 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
4017 const ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
)->fields
.write
.abuf
;
4018 #define FLD(f) abuf->fields.sfmt_jl.f
4019 #define OPRND(f) par_exec->operands.sfmt_jmp.f
4020 int UNUSED written
= abuf
->written
;
4021 IADDR UNUSED pc
= abuf
->addr
;
4023 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 0);
4025 SEM_BRANCH_VIA_ADDR (current_cpu
, sem_arg
, OPRND (pc
), vpc
);
4027 SEM_BRANCH_FINI (vpc
);
4033 CASE (sem
, INSN_PAR_LD
) : /* ld $dr,@$sr */
4035 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
4036 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
4037 #define FLD(f) abuf->fields.sfmt_ld_plus.f
4038 #define OPRND(f) par_exec->operands.sfmt_ld.f
4039 int UNUSED written
= 0;
4040 IADDR UNUSED pc
= abuf
->addr
;
4041 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
4044 SI opval
= GETMEMSI (current_cpu
, pc
, * FLD (i_sr
));
4046 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
4054 CASE (sem
, INSN_WRITE_LD
) : /* ld $dr,@$sr */
4056 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
4057 const ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
)->fields
.write
.abuf
;
4058 #define FLD(f) abuf->fields.sfmt_ld_plus.f
4059 #define OPRND(f) par_exec->operands.sfmt_ld.f
4060 int UNUSED written
= abuf
->written
;
4061 IADDR UNUSED pc
= abuf
->addr
;
4062 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 0);
4064 * FLD (i_dr
) = OPRND (dr
);
4071 CASE (sem
, INSN_PAR_LDB
) : /* ldb $dr,@$sr */
4073 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
4074 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
4075 #define FLD(f) abuf->fields.sfmt_ld_plus.f
4076 #define OPRND(f) par_exec->operands.sfmt_ld.f
4077 int UNUSED written
= 0;
4078 IADDR UNUSED pc
= abuf
->addr
;
4079 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
4082 SI opval
= EXTQISI (GETMEMQI (current_cpu
, pc
, * FLD (i_sr
)));
4084 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
4092 CASE (sem
, INSN_WRITE_LDB
) : /* ldb $dr,@$sr */
4094 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
4095 const ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
)->fields
.write
.abuf
;
4096 #define FLD(f) abuf->fields.sfmt_ld_plus.f
4097 #define OPRND(f) par_exec->operands.sfmt_ld.f
4098 int UNUSED written
= abuf
->written
;
4099 IADDR UNUSED pc
= abuf
->addr
;
4100 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 0);
4102 * FLD (i_dr
) = OPRND (dr
);
4109 CASE (sem
, INSN_PAR_LDH
) : /* ldh $dr,@$sr */
4111 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
4112 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
4113 #define FLD(f) abuf->fields.sfmt_ld_plus.f
4114 #define OPRND(f) par_exec->operands.sfmt_ld.f
4115 int UNUSED written
= 0;
4116 IADDR UNUSED pc
= abuf
->addr
;
4117 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
4120 SI opval
= EXTHISI (GETMEMHI (current_cpu
, pc
, * FLD (i_sr
)));
4122 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
4130 CASE (sem
, INSN_WRITE_LDH
) : /* ldh $dr,@$sr */
4132 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
4133 const ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
)->fields
.write
.abuf
;
4134 #define FLD(f) abuf->fields.sfmt_ld_plus.f
4135 #define OPRND(f) par_exec->operands.sfmt_ld.f
4136 int UNUSED written
= abuf
->written
;
4137 IADDR UNUSED pc
= abuf
->addr
;
4138 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 0);
4140 * FLD (i_dr
) = OPRND (dr
);
4147 CASE (sem
, INSN_PAR_LDUB
) : /* ldub $dr,@$sr */
4149 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
4150 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
4151 #define FLD(f) abuf->fields.sfmt_ld_plus.f
4152 #define OPRND(f) par_exec->operands.sfmt_ld.f
4153 int UNUSED written
= 0;
4154 IADDR UNUSED pc
= abuf
->addr
;
4155 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
4158 SI opval
= ZEXTQISI (GETMEMQI (current_cpu
, pc
, * FLD (i_sr
)));
4160 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
4168 CASE (sem
, INSN_WRITE_LDUB
) : /* ldub $dr,@$sr */
4170 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
4171 const ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
)->fields
.write
.abuf
;
4172 #define FLD(f) abuf->fields.sfmt_ld_plus.f
4173 #define OPRND(f) par_exec->operands.sfmt_ld.f
4174 int UNUSED written
= abuf
->written
;
4175 IADDR UNUSED pc
= abuf
->addr
;
4176 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 0);
4178 * FLD (i_dr
) = OPRND (dr
);
4185 CASE (sem
, INSN_PAR_LDUH
) : /* lduh $dr,@$sr */
4187 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
4188 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
4189 #define FLD(f) abuf->fields.sfmt_ld_plus.f
4190 #define OPRND(f) par_exec->operands.sfmt_ld.f
4191 int UNUSED written
= 0;
4192 IADDR UNUSED pc
= abuf
->addr
;
4193 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
4196 SI opval
= ZEXTHISI (GETMEMHI (current_cpu
, pc
, * FLD (i_sr
)));
4198 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
4206 CASE (sem
, INSN_WRITE_LDUH
) : /* lduh $dr,@$sr */
4208 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
4209 const ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
)->fields
.write
.abuf
;
4210 #define FLD(f) abuf->fields.sfmt_ld_plus.f
4211 #define OPRND(f) par_exec->operands.sfmt_ld.f
4212 int UNUSED written
= abuf
->written
;
4213 IADDR UNUSED pc
= abuf
->addr
;
4214 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 0);
4216 * FLD (i_dr
) = OPRND (dr
);
4223 CASE (sem
, INSN_PAR_LD_PLUS
) : /* ld $dr,@$sr+ */
4225 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
4226 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
4227 #define FLD(f) abuf->fields.sfmt_ld_plus.f
4228 #define OPRND(f) par_exec->operands.sfmt_ld_plus.f
4229 int UNUSED written
= 0;
4230 IADDR UNUSED pc
= abuf
->addr
;
4231 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
4235 temp0
= GETMEMSI (current_cpu
, pc
, * FLD (i_sr
));
4236 temp1
= ADDSI (* FLD (i_sr
), 4);
4240 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
4245 TRACE_RESULT (current_cpu
, abuf
, "sr", 'x', opval
);
4254 CASE (sem
, INSN_WRITE_LD_PLUS
) : /* ld $dr,@$sr+ */
4256 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
4257 const ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
)->fields
.write
.abuf
;
4258 #define FLD(f) abuf->fields.sfmt_ld_plus.f
4259 #define OPRND(f) par_exec->operands.sfmt_ld_plus.f
4260 int UNUSED written
= abuf
->written
;
4261 IADDR UNUSED pc
= abuf
->addr
;
4262 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 0);
4264 * FLD (i_dr
) = OPRND (dr
);
4265 * FLD (i_sr
) = OPRND (sr
);
4272 CASE (sem
, INSN_PAR_LDI8
) : /* ldi8 $dr,$simm8 */
4274 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
4275 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
4276 #define FLD(f) abuf->fields.sfmt_addi.f
4277 #define OPRND(f) par_exec->operands.sfmt_ldi8.f
4278 int UNUSED written
= 0;
4279 IADDR UNUSED pc
= abuf
->addr
;
4280 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
4283 SI opval
= FLD (f_simm8
);
4285 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
4293 CASE (sem
, INSN_WRITE_LDI8
) : /* ldi8 $dr,$simm8 */
4295 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
4296 const ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
)->fields
.write
.abuf
;
4297 #define FLD(f) abuf->fields.sfmt_addi.f
4298 #define OPRND(f) par_exec->operands.sfmt_ldi8.f
4299 int UNUSED written
= abuf
->written
;
4300 IADDR UNUSED pc
= abuf
->addr
;
4301 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 0);
4303 * FLD (i_dr
) = OPRND (dr
);
4310 CASE (sem
, INSN_PAR_LOCK
) : /* lock $dr,@$sr */
4312 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
4313 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
4314 #define FLD(f) abuf->fields.sfmt_ld_plus.f
4315 #define OPRND(f) par_exec->operands.sfmt_lock.f
4316 int UNUSED written
= 0;
4317 IADDR UNUSED pc
= abuf
->addr
;
4318 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
4323 OPRND (h_lock
) = opval
;
4324 TRACE_RESULT (current_cpu
, abuf
, "lock", 'x', opval
);
4327 SI opval
= GETMEMSI (current_cpu
, pc
, * FLD (i_sr
));
4329 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
4338 CASE (sem
, INSN_WRITE_LOCK
) : /* lock $dr,@$sr */
4340 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
4341 const ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
)->fields
.write
.abuf
;
4342 #define FLD(f) abuf->fields.sfmt_ld_plus.f
4343 #define OPRND(f) par_exec->operands.sfmt_lock.f
4344 int UNUSED written
= abuf
->written
;
4345 IADDR UNUSED pc
= abuf
->addr
;
4346 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 0);
4348 * FLD (i_dr
) = OPRND (dr
);
4349 CPU (h_lock
) = OPRND (h_lock
);
4356 CASE (sem
, INSN_PAR_MACHI_A
) : /* machi $src1,$src2,$acc */
4358 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
4359 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
4360 #define FLD(f) abuf->fields.sfmt_machi_a.f
4361 #define OPRND(f) par_exec->operands.sfmt_machi_a.f
4362 int UNUSED written
= 0;
4363 IADDR UNUSED pc
= abuf
->addr
;
4364 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
4367 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);
4368 OPRND (acc
) = opval
;
4369 TRACE_RESULT (current_cpu
, abuf
, "acc", 'D', opval
);
4377 CASE (sem
, INSN_WRITE_MACHI_A
) : /* machi $src1,$src2,$acc */
4379 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
4380 const ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
)->fields
.write
.abuf
;
4381 #define FLD(f) abuf->fields.sfmt_machi_a.f
4382 #define OPRND(f) par_exec->operands.sfmt_machi_a.f
4383 int UNUSED written
= abuf
->written
;
4384 IADDR UNUSED pc
= abuf
->addr
;
4385 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 0);
4387 SET_H_ACCUMS (FLD (f_acc
), OPRND (acc
));
4394 CASE (sem
, INSN_PAR_MACLO_A
) : /* maclo $src1,$src2,$acc */
4396 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
4397 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
4398 #define FLD(f) abuf->fields.sfmt_machi_a.f
4399 #define OPRND(f) par_exec->operands.sfmt_machi_a.f
4400 int UNUSED written
= 0;
4401 IADDR UNUSED pc
= abuf
->addr
;
4402 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
4405 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);
4406 OPRND (acc
) = opval
;
4407 TRACE_RESULT (current_cpu
, abuf
, "acc", 'D', opval
);
4415 CASE (sem
, INSN_WRITE_MACLO_A
) : /* maclo $src1,$src2,$acc */
4417 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
4418 const ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
)->fields
.write
.abuf
;
4419 #define FLD(f) abuf->fields.sfmt_machi_a.f
4420 #define OPRND(f) par_exec->operands.sfmt_machi_a.f
4421 int UNUSED written
= abuf
->written
;
4422 IADDR UNUSED pc
= abuf
->addr
;
4423 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 0);
4425 SET_H_ACCUMS (FLD (f_acc
), OPRND (acc
));
4432 CASE (sem
, INSN_PAR_MACWHI_A
) : /* macwhi $src1,$src2,$acc */
4434 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
4435 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
4436 #define FLD(f) abuf->fields.sfmt_machi_a.f
4437 #define OPRND(f) par_exec->operands.sfmt_machi_a.f
4438 int UNUSED written
= 0;
4439 IADDR UNUSED pc
= abuf
->addr
;
4440 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
4443 DI opval
= ADDDI (GET_H_ACCUMS (FLD (f_acc
)), MULDI (EXTSIDI (* FLD (i_src1
)), EXTHIDI (TRUNCSIHI (SRASI (* FLD (i_src2
), 16)))));
4444 OPRND (acc
) = opval
;
4445 TRACE_RESULT (current_cpu
, abuf
, "acc", 'D', opval
);
4453 CASE (sem
, INSN_WRITE_MACWHI_A
) : /* macwhi $src1,$src2,$acc */
4455 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
4456 const ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
)->fields
.write
.abuf
;
4457 #define FLD(f) abuf->fields.sfmt_machi_a.f
4458 #define OPRND(f) par_exec->operands.sfmt_machi_a.f
4459 int UNUSED written
= abuf
->written
;
4460 IADDR UNUSED pc
= abuf
->addr
;
4461 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 0);
4463 SET_H_ACCUMS (FLD (f_acc
), OPRND (acc
));
4470 CASE (sem
, INSN_PAR_MACWLO_A
) : /* macwlo $src1,$src2,$acc */
4472 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
4473 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
4474 #define FLD(f) abuf->fields.sfmt_machi_a.f
4475 #define OPRND(f) par_exec->operands.sfmt_machi_a.f
4476 int UNUSED written
= 0;
4477 IADDR UNUSED pc
= abuf
->addr
;
4478 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
4481 DI opval
= ADDDI (GET_H_ACCUMS (FLD (f_acc
)), MULDI (EXTSIDI (* FLD (i_src1
)), EXTHIDI (TRUNCSIHI (* FLD (i_src2
)))));
4482 OPRND (acc
) = opval
;
4483 TRACE_RESULT (current_cpu
, abuf
, "acc", 'D', opval
);
4491 CASE (sem
, INSN_WRITE_MACWLO_A
) : /* macwlo $src1,$src2,$acc */
4493 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
4494 const ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
)->fields
.write
.abuf
;
4495 #define FLD(f) abuf->fields.sfmt_machi_a.f
4496 #define OPRND(f) par_exec->operands.sfmt_machi_a.f
4497 int UNUSED written
= abuf
->written
;
4498 IADDR UNUSED pc
= abuf
->addr
;
4499 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 0);
4501 SET_H_ACCUMS (FLD (f_acc
), OPRND (acc
));
4508 CASE (sem
, INSN_PAR_MUL
) : /* mul $dr,$sr */
4510 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
4511 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
4512 #define FLD(f) abuf->fields.sfmt_add.f
4513 #define OPRND(f) par_exec->operands.sfmt_add.f
4514 int UNUSED written
= 0;
4515 IADDR UNUSED pc
= abuf
->addr
;
4516 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
4519 SI opval
= MULSI (* FLD (i_dr
), * FLD (i_sr
));
4521 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
4529 CASE (sem
, INSN_WRITE_MUL
) : /* mul $dr,$sr */
4531 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
4532 const ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
)->fields
.write
.abuf
;
4533 #define FLD(f) abuf->fields.sfmt_add.f
4534 #define OPRND(f) par_exec->operands.sfmt_add.f
4535 int UNUSED written
= abuf
->written
;
4536 IADDR UNUSED pc
= abuf
->addr
;
4537 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 0);
4539 * FLD (i_dr
) = OPRND (dr
);
4546 CASE (sem
, INSN_PAR_MULHI_A
) : /* mulhi $src1,$src2,$acc */
4548 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
4549 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
4550 #define FLD(f) abuf->fields.sfmt_machi_a.f
4551 #define OPRND(f) par_exec->operands.sfmt_mulhi_a.f
4552 int UNUSED written
= 0;
4553 IADDR UNUSED pc
= abuf
->addr
;
4554 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
4557 DI opval
= SRADI (SLLDI (MULDI (EXTSIDI (ANDSI (* FLD (i_src1
), 0xffff0000)), EXTHIDI (TRUNCSIHI (SRASI (* FLD (i_src2
), 16)))), 16), 16);
4558 OPRND (acc
) = opval
;
4559 TRACE_RESULT (current_cpu
, abuf
, "acc", 'D', opval
);
4567 CASE (sem
, INSN_WRITE_MULHI_A
) : /* mulhi $src1,$src2,$acc */
4569 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
4570 const ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
)->fields
.write
.abuf
;
4571 #define FLD(f) abuf->fields.sfmt_machi_a.f
4572 #define OPRND(f) par_exec->operands.sfmt_mulhi_a.f
4573 int UNUSED written
= abuf
->written
;
4574 IADDR UNUSED pc
= abuf
->addr
;
4575 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 0);
4577 SET_H_ACCUMS (FLD (f_acc
), OPRND (acc
));
4584 CASE (sem
, INSN_PAR_MULLO_A
) : /* mullo $src1,$src2,$acc */
4586 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
4587 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
4588 #define FLD(f) abuf->fields.sfmt_machi_a.f
4589 #define OPRND(f) par_exec->operands.sfmt_mulhi_a.f
4590 int UNUSED written
= 0;
4591 IADDR UNUSED pc
= abuf
->addr
;
4592 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
4595 DI opval
= SRADI (SLLDI (MULDI (EXTSIDI (SLLSI (* FLD (i_src1
), 16)), EXTHIDI (TRUNCSIHI (* FLD (i_src2
)))), 16), 16);
4596 OPRND (acc
) = opval
;
4597 TRACE_RESULT (current_cpu
, abuf
, "acc", 'D', opval
);
4605 CASE (sem
, INSN_WRITE_MULLO_A
) : /* mullo $src1,$src2,$acc */
4607 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
4608 const ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
)->fields
.write
.abuf
;
4609 #define FLD(f) abuf->fields.sfmt_machi_a.f
4610 #define OPRND(f) par_exec->operands.sfmt_mulhi_a.f
4611 int UNUSED written
= abuf
->written
;
4612 IADDR UNUSED pc
= abuf
->addr
;
4613 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 0);
4615 SET_H_ACCUMS (FLD (f_acc
), OPRND (acc
));
4622 CASE (sem
, INSN_PAR_MULWHI_A
) : /* mulwhi $src1,$src2,$acc */
4624 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
4625 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
4626 #define FLD(f) abuf->fields.sfmt_machi_a.f
4627 #define OPRND(f) par_exec->operands.sfmt_mulhi_a.f
4628 int UNUSED written
= 0;
4629 IADDR UNUSED pc
= abuf
->addr
;
4630 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
4633 DI opval
= MULDI (EXTSIDI (* FLD (i_src1
)), EXTHIDI (TRUNCSIHI (SRASI (* FLD (i_src2
), 16))));
4634 OPRND (acc
) = opval
;
4635 TRACE_RESULT (current_cpu
, abuf
, "acc", 'D', opval
);
4643 CASE (sem
, INSN_WRITE_MULWHI_A
) : /* mulwhi $src1,$src2,$acc */
4645 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
4646 const ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
)->fields
.write
.abuf
;
4647 #define FLD(f) abuf->fields.sfmt_machi_a.f
4648 #define OPRND(f) par_exec->operands.sfmt_mulhi_a.f
4649 int UNUSED written
= abuf
->written
;
4650 IADDR UNUSED pc
= abuf
->addr
;
4651 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 0);
4653 SET_H_ACCUMS (FLD (f_acc
), OPRND (acc
));
4660 CASE (sem
, INSN_PAR_MULWLO_A
) : /* mulwlo $src1,$src2,$acc */
4662 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
4663 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
4664 #define FLD(f) abuf->fields.sfmt_machi_a.f
4665 #define OPRND(f) par_exec->operands.sfmt_mulhi_a.f
4666 int UNUSED written
= 0;
4667 IADDR UNUSED pc
= abuf
->addr
;
4668 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
4671 DI opval
= MULDI (EXTSIDI (* FLD (i_src1
)), EXTHIDI (TRUNCSIHI (* FLD (i_src2
))));
4672 OPRND (acc
) = opval
;
4673 TRACE_RESULT (current_cpu
, abuf
, "acc", 'D', opval
);
4681 CASE (sem
, INSN_WRITE_MULWLO_A
) : /* mulwlo $src1,$src2,$acc */
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_machi_a.f
4686 #define OPRND(f) par_exec->operands.sfmt_mulhi_a.f
4687 int UNUSED written
= abuf
->written
;
4688 IADDR UNUSED pc
= abuf
->addr
;
4689 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 0);
4691 SET_H_ACCUMS (FLD (f_acc
), OPRND (acc
));
4698 CASE (sem
, INSN_PAR_MV
) : /* mv $dr,$sr */
4700 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
4701 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
4702 #define FLD(f) abuf->fields.sfmt_ld_plus.f
4703 #define OPRND(f) par_exec->operands.sfmt_mv.f
4704 int UNUSED written
= 0;
4705 IADDR UNUSED pc
= abuf
->addr
;
4706 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
4709 SI opval
= * FLD (i_sr
);
4711 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
4719 CASE (sem
, INSN_WRITE_MV
) : /* mv $dr,$sr */
4721 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
4722 const ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
)->fields
.write
.abuf
;
4723 #define FLD(f) abuf->fields.sfmt_ld_plus.f
4724 #define OPRND(f) par_exec->operands.sfmt_mv.f
4725 int UNUSED written
= abuf
->written
;
4726 IADDR UNUSED pc
= abuf
->addr
;
4727 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 0);
4729 * FLD (i_dr
) = OPRND (dr
);
4736 CASE (sem
, INSN_PAR_MVFACHI_A
) : /* mvfachi $dr,$accs */
4738 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
4739 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
4740 #define FLD(f) abuf->fields.sfmt_mvfachi_a.f
4741 #define OPRND(f) par_exec->operands.sfmt_mvfachi_a.f
4742 int UNUSED written
= 0;
4743 IADDR UNUSED pc
= abuf
->addr
;
4744 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
4747 SI opval
= TRUNCDISI (SRADI (GET_H_ACCUMS (FLD (f_accs
)), 32));
4749 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
4757 CASE (sem
, INSN_WRITE_MVFACHI_A
) : /* mvfachi $dr,$accs */
4759 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
4760 const ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
)->fields
.write
.abuf
;
4761 #define FLD(f) abuf->fields.sfmt_mvfachi_a.f
4762 #define OPRND(f) par_exec->operands.sfmt_mvfachi_a.f
4763 int UNUSED written
= abuf
->written
;
4764 IADDR UNUSED pc
= abuf
->addr
;
4765 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 0);
4767 * FLD (i_dr
) = OPRND (dr
);
4774 CASE (sem
, INSN_PAR_MVFACLO_A
) : /* mvfaclo $dr,$accs */
4776 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
4777 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
4778 #define FLD(f) abuf->fields.sfmt_mvfachi_a.f
4779 #define OPRND(f) par_exec->operands.sfmt_mvfachi_a.f
4780 int UNUSED written
= 0;
4781 IADDR UNUSED pc
= abuf
->addr
;
4782 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
4785 SI opval
= TRUNCDISI (GET_H_ACCUMS (FLD (f_accs
)));
4787 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
4795 CASE (sem
, INSN_WRITE_MVFACLO_A
) : /* mvfaclo $dr,$accs */
4797 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
4798 const ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
)->fields
.write
.abuf
;
4799 #define FLD(f) abuf->fields.sfmt_mvfachi_a.f
4800 #define OPRND(f) par_exec->operands.sfmt_mvfachi_a.f
4801 int UNUSED written
= abuf
->written
;
4802 IADDR UNUSED pc
= abuf
->addr
;
4803 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 0);
4805 * FLD (i_dr
) = OPRND (dr
);
4812 CASE (sem
, INSN_PAR_MVFACMI_A
) : /* mvfacmi $dr,$accs */
4814 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
4815 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
4816 #define FLD(f) abuf->fields.sfmt_mvfachi_a.f
4817 #define OPRND(f) par_exec->operands.sfmt_mvfachi_a.f
4818 int UNUSED written
= 0;
4819 IADDR UNUSED pc
= abuf
->addr
;
4820 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
4823 SI opval
= TRUNCDISI (SRADI (GET_H_ACCUMS (FLD (f_accs
)), 16));
4825 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
4833 CASE (sem
, INSN_WRITE_MVFACMI_A
) : /* mvfacmi $dr,$accs */
4835 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
4836 const ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
)->fields
.write
.abuf
;
4837 #define FLD(f) abuf->fields.sfmt_mvfachi_a.f
4838 #define OPRND(f) par_exec->operands.sfmt_mvfachi_a.f
4839 int UNUSED written
= abuf
->written
;
4840 IADDR UNUSED pc
= abuf
->addr
;
4841 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 0);
4843 * FLD (i_dr
) = OPRND (dr
);
4850 CASE (sem
, INSN_PAR_MVFC
) : /* mvfc $dr,$scr */
4852 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
4853 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
4854 #define FLD(f) abuf->fields.sfmt_ld_plus.f
4855 #define OPRND(f) par_exec->operands.sfmt_mvfc.f
4856 int UNUSED written
= 0;
4857 IADDR UNUSED pc
= abuf
->addr
;
4858 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
4861 SI opval
= GET_H_CR (FLD (f_r2
));
4863 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
4871 CASE (sem
, INSN_WRITE_MVFC
) : /* mvfc $dr,$scr */
4873 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
4874 const ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
)->fields
.write
.abuf
;
4875 #define FLD(f) abuf->fields.sfmt_ld_plus.f
4876 #define OPRND(f) par_exec->operands.sfmt_mvfc.f
4877 int UNUSED written
= abuf
->written
;
4878 IADDR UNUSED pc
= abuf
->addr
;
4879 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 0);
4881 * FLD (i_dr
) = OPRND (dr
);
4888 CASE (sem
, INSN_PAR_MVTACHI_A
) : /* mvtachi $src1,$accs */
4890 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
4891 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
4892 #define FLD(f) abuf->fields.sfmt_mvtachi_a.f
4893 #define OPRND(f) par_exec->operands.sfmt_mvtachi_a.f
4894 int UNUSED written
= 0;
4895 IADDR UNUSED pc
= abuf
->addr
;
4896 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
4899 DI opval
= ORDI (ANDDI (GET_H_ACCUMS (FLD (f_accs
)), MAKEDI (0, 0xffffffff)), SLLDI (EXTSIDI (* FLD (i_src1
)), 32));
4900 OPRND (accs
) = opval
;
4901 TRACE_RESULT (current_cpu
, abuf
, "accs", 'D', opval
);
4909 CASE (sem
, INSN_WRITE_MVTACHI_A
) : /* mvtachi $src1,$accs */
4911 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
4912 const ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
)->fields
.write
.abuf
;
4913 #define FLD(f) abuf->fields.sfmt_mvtachi_a.f
4914 #define OPRND(f) par_exec->operands.sfmt_mvtachi_a.f
4915 int UNUSED written
= abuf
->written
;
4916 IADDR UNUSED pc
= abuf
->addr
;
4917 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 0);
4919 SET_H_ACCUMS (FLD (f_accs
), OPRND (accs
));
4926 CASE (sem
, INSN_PAR_MVTACLO_A
) : /* mvtaclo $src1,$accs */
4928 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
4929 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
4930 #define FLD(f) abuf->fields.sfmt_mvtachi_a.f
4931 #define OPRND(f) par_exec->operands.sfmt_mvtachi_a.f
4932 int UNUSED written
= 0;
4933 IADDR UNUSED pc
= abuf
->addr
;
4934 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
4937 DI opval
= ORDI (ANDDI (GET_H_ACCUMS (FLD (f_accs
)), MAKEDI (0xffffffff, 0)), ZEXTSIDI (* FLD (i_src1
)));
4938 OPRND (accs
) = opval
;
4939 TRACE_RESULT (current_cpu
, abuf
, "accs", 'D', opval
);
4947 CASE (sem
, INSN_WRITE_MVTACLO_A
) : /* mvtaclo $src1,$accs */
4949 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
4950 const ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
)->fields
.write
.abuf
;
4951 #define FLD(f) abuf->fields.sfmt_mvtachi_a.f
4952 #define OPRND(f) par_exec->operands.sfmt_mvtachi_a.f
4953 int UNUSED written
= abuf
->written
;
4954 IADDR UNUSED pc
= abuf
->addr
;
4955 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 0);
4957 SET_H_ACCUMS (FLD (f_accs
), OPRND (accs
));
4964 CASE (sem
, INSN_PAR_MVTC
) : /* mvtc $sr,$dcr */
4966 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
4967 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
4968 #define FLD(f) abuf->fields.sfmt_ld_plus.f
4969 #define OPRND(f) par_exec->operands.sfmt_mvtc.f
4970 int UNUSED written
= 0;
4971 IADDR UNUSED pc
= abuf
->addr
;
4972 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
4975 USI opval
= * FLD (i_sr
);
4976 OPRND (dcr
) = opval
;
4977 TRACE_RESULT (current_cpu
, abuf
, "dcr", 'x', opval
);
4985 CASE (sem
, INSN_WRITE_MVTC
) : /* mvtc $sr,$dcr */
4987 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
4988 const ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
)->fields
.write
.abuf
;
4989 #define FLD(f) abuf->fields.sfmt_ld_plus.f
4990 #define OPRND(f) par_exec->operands.sfmt_mvtc.f
4991 int UNUSED written
= abuf
->written
;
4992 IADDR UNUSED pc
= abuf
->addr
;
4993 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 0);
4995 SET_H_CR (FLD (f_r1
), OPRND (dcr
));
5002 CASE (sem
, INSN_PAR_NEG
) : /* neg $dr,$sr */
5004 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
5005 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
5006 #define FLD(f) abuf->fields.sfmt_ld_plus.f
5007 #define OPRND(f) par_exec->operands.sfmt_mv.f
5008 int UNUSED written
= 0;
5009 IADDR UNUSED pc
= abuf
->addr
;
5010 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
5013 SI opval
= NEGSI (* FLD (i_sr
));
5015 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
5023 CASE (sem
, INSN_WRITE_NEG
) : /* neg $dr,$sr */
5025 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
5026 const ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
)->fields
.write
.abuf
;
5027 #define FLD(f) abuf->fields.sfmt_ld_plus.f
5028 #define OPRND(f) par_exec->operands.sfmt_mv.f
5029 int UNUSED written
= abuf
->written
;
5030 IADDR UNUSED pc
= abuf
->addr
;
5031 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 0);
5033 * FLD (i_dr
) = OPRND (dr
);
5040 CASE (sem
, INSN_PAR_NOP
) : /* nop */
5042 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
5043 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
5044 #define FLD(f) abuf->fields.fmt_empty.f
5045 #define OPRND(f) par_exec->operands.sfmt_nop.f
5046 int UNUSED written
= 0;
5047 IADDR UNUSED pc
= abuf
->addr
;
5048 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
5050 PROFILE_COUNT_FILLNOPS (current_cpu
, abuf
->addr
);
5057 CASE (sem
, INSN_WRITE_NOP
) : /* nop */
5059 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
5060 const ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
)->fields
.write
.abuf
;
5061 #define FLD(f) abuf->fields.fmt_empty.f
5062 #define OPRND(f) par_exec->operands.sfmt_nop.f
5063 int UNUSED written
= abuf
->written
;
5064 IADDR UNUSED pc
= abuf
->addr
;
5065 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 0);
5073 CASE (sem
, INSN_PAR_NOT
) : /* not $dr,$sr */
5075 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
5076 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
5077 #define FLD(f) abuf->fields.sfmt_ld_plus.f
5078 #define OPRND(f) par_exec->operands.sfmt_mv.f
5079 int UNUSED written
= 0;
5080 IADDR UNUSED pc
= abuf
->addr
;
5081 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
5084 SI opval
= INVSI (* FLD (i_sr
));
5086 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
5094 CASE (sem
, INSN_WRITE_NOT
) : /* not $dr,$sr */
5096 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
5097 const ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
)->fields
.write
.abuf
;
5098 #define FLD(f) abuf->fields.sfmt_ld_plus.f
5099 #define OPRND(f) par_exec->operands.sfmt_mv.f
5100 int UNUSED written
= abuf
->written
;
5101 IADDR UNUSED pc
= abuf
->addr
;
5102 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 0);
5104 * FLD (i_dr
) = OPRND (dr
);
5111 CASE (sem
, INSN_PAR_RAC_DSI
) : /* rac $accd,$accs,$imm1 */
5113 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
5114 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
5115 #define FLD(f) abuf->fields.sfmt_rac_dsi.f
5116 #define OPRND(f) par_exec->operands.sfmt_rac_dsi.f
5117 int UNUSED written
= 0;
5118 IADDR UNUSED pc
= abuf
->addr
;
5119 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
5123 tmp_tmp1
= SLLDI (GET_H_ACCUMS (FLD (f_accs
)), FLD (f_imm1
));
5124 tmp_tmp1
= ADDDI (tmp_tmp1
, MAKEDI (0, 32768));
5126 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)));
5127 OPRND (accd
) = opval
;
5128 TRACE_RESULT (current_cpu
, abuf
, "accd", 'D', opval
);
5137 CASE (sem
, INSN_WRITE_RAC_DSI
) : /* rac $accd,$accs,$imm1 */
5139 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
5140 const ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
)->fields
.write
.abuf
;
5141 #define FLD(f) abuf->fields.sfmt_rac_dsi.f
5142 #define OPRND(f) par_exec->operands.sfmt_rac_dsi.f
5143 int UNUSED written
= abuf
->written
;
5144 IADDR UNUSED pc
= abuf
->addr
;
5145 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 0);
5147 SET_H_ACCUMS (FLD (f_accd
), OPRND (accd
));
5154 CASE (sem
, INSN_PAR_RACH_DSI
) : /* rach $accd,$accs,$imm1 */
5156 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
5157 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
5158 #define FLD(f) abuf->fields.sfmt_rac_dsi.f
5159 #define OPRND(f) par_exec->operands.sfmt_rac_dsi.f
5160 int UNUSED written
= 0;
5161 IADDR UNUSED pc
= abuf
->addr
;
5162 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
5166 tmp_tmp1
= SLLDI (GET_H_ACCUMS (FLD (f_accs
)), FLD (f_imm1
));
5167 tmp_tmp1
= ADDDI (tmp_tmp1
, MAKEDI (0, 0x80000000));
5169 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)));
5170 OPRND (accd
) = opval
;
5171 TRACE_RESULT (current_cpu
, abuf
, "accd", 'D', opval
);
5180 CASE (sem
, INSN_WRITE_RACH_DSI
) : /* rach $accd,$accs,$imm1 */
5182 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
5183 const ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
)->fields
.write
.abuf
;
5184 #define FLD(f) abuf->fields.sfmt_rac_dsi.f
5185 #define OPRND(f) par_exec->operands.sfmt_rac_dsi.f
5186 int UNUSED written
= abuf
->written
;
5187 IADDR UNUSED pc
= abuf
->addr
;
5188 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 0);
5190 SET_H_ACCUMS (FLD (f_accd
), OPRND (accd
));
5197 CASE (sem
, INSN_PAR_RTE
) : /* rte */
5199 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
5200 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
5201 #define FLD(f) abuf->fields.fmt_empty.f
5202 #define OPRND(f) par_exec->operands.sfmt_rte.f
5203 int UNUSED written
= 0;
5204 IADDR UNUSED pc
= abuf
->addr
;
5205 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
5209 USI opval
= ANDSI (GET_H_CR (((UINT
) 6)), -4);
5211 TRACE_RESULT (current_cpu
, abuf
, "pc", 'x', opval
);
5214 USI opval
= GET_H_CR (((UINT
) 14));
5215 OPRND (h_cr_6
) = opval
;
5216 TRACE_RESULT (current_cpu
, abuf
, "cr-6", 'x', opval
);
5219 UQI opval
= CPU (h_bpsw
);
5220 OPRND (h_psw
) = opval
;
5221 TRACE_RESULT (current_cpu
, abuf
, "psw", 'x', opval
);
5224 UQI opval
= CPU (h_bbpsw
);
5225 OPRND (h_bpsw
) = opval
;
5226 TRACE_RESULT (current_cpu
, abuf
, "bpsw", 'x', opval
);
5235 CASE (sem
, INSN_WRITE_RTE
) : /* rte */
5237 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
5238 const ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
)->fields
.write
.abuf
;
5239 #define FLD(f) abuf->fields.fmt_empty.f
5240 #define OPRND(f) par_exec->operands.sfmt_rte.f
5241 int UNUSED written
= abuf
->written
;
5242 IADDR UNUSED pc
= abuf
->addr
;
5244 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 0);
5246 CPU (h_bpsw
) = OPRND (h_bpsw
);
5247 SET_H_CR (((UINT
) 6), OPRND (h_cr_6
));
5248 SET_H_PSW (OPRND (h_psw
));
5249 SEM_BRANCH_VIA_ADDR (current_cpu
, sem_arg
, OPRND (pc
), vpc
);
5251 SEM_BRANCH_FINI (vpc
);
5257 CASE (sem
, INSN_PAR_SLL
) : /* sll $dr,$sr */
5259 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
5260 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
5261 #define FLD(f) abuf->fields.sfmt_add.f
5262 #define OPRND(f) par_exec->operands.sfmt_add.f
5263 int UNUSED written
= 0;
5264 IADDR UNUSED pc
= abuf
->addr
;
5265 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
5268 SI opval
= SLLSI (* FLD (i_dr
), ANDSI (* FLD (i_sr
), 31));
5270 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
5278 CASE (sem
, INSN_WRITE_SLL
) : /* sll $dr,$sr */
5280 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
5281 const ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
)->fields
.write
.abuf
;
5282 #define FLD(f) abuf->fields.sfmt_add.f
5283 #define OPRND(f) par_exec->operands.sfmt_add.f
5284 int UNUSED written
= abuf
->written
;
5285 IADDR UNUSED pc
= abuf
->addr
;
5286 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 0);
5288 * FLD (i_dr
) = OPRND (dr
);
5295 CASE (sem
, INSN_PAR_SLLI
) : /* slli $dr,$uimm5 */
5297 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
5298 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
5299 #define FLD(f) abuf->fields.sfmt_slli.f
5300 #define OPRND(f) par_exec->operands.sfmt_slli.f
5301 int UNUSED written
= 0;
5302 IADDR UNUSED pc
= abuf
->addr
;
5303 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
5306 SI opval
= SLLSI (* FLD (i_dr
), FLD (f_uimm5
));
5308 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
5316 CASE (sem
, INSN_WRITE_SLLI
) : /* slli $dr,$uimm5 */
5318 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
5319 const ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
)->fields
.write
.abuf
;
5320 #define FLD(f) abuf->fields.sfmt_slli.f
5321 #define OPRND(f) par_exec->operands.sfmt_slli.f
5322 int UNUSED written
= abuf
->written
;
5323 IADDR UNUSED pc
= abuf
->addr
;
5324 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 0);
5326 * FLD (i_dr
) = OPRND (dr
);
5333 CASE (sem
, INSN_PAR_SRA
) : /* sra $dr,$sr */
5335 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
5336 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
5337 #define FLD(f) abuf->fields.sfmt_add.f
5338 #define OPRND(f) par_exec->operands.sfmt_add.f
5339 int UNUSED written
= 0;
5340 IADDR UNUSED pc
= abuf
->addr
;
5341 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
5344 SI opval
= SRASI (* FLD (i_dr
), ANDSI (* FLD (i_sr
), 31));
5346 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
5354 CASE (sem
, INSN_WRITE_SRA
) : /* sra $dr,$sr */
5356 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
5357 const ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
)->fields
.write
.abuf
;
5358 #define FLD(f) abuf->fields.sfmt_add.f
5359 #define OPRND(f) par_exec->operands.sfmt_add.f
5360 int UNUSED written
= abuf
->written
;
5361 IADDR UNUSED pc
= abuf
->addr
;
5362 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 0);
5364 * FLD (i_dr
) = OPRND (dr
);
5371 CASE (sem
, INSN_PAR_SRAI
) : /* srai $dr,$uimm5 */
5373 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
5374 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
5375 #define FLD(f) abuf->fields.sfmt_slli.f
5376 #define OPRND(f) par_exec->operands.sfmt_slli.f
5377 int UNUSED written
= 0;
5378 IADDR UNUSED pc
= abuf
->addr
;
5379 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
5382 SI opval
= SRASI (* FLD (i_dr
), FLD (f_uimm5
));
5384 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
5392 CASE (sem
, INSN_WRITE_SRAI
) : /* srai $dr,$uimm5 */
5394 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
5395 const ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
)->fields
.write
.abuf
;
5396 #define FLD(f) abuf->fields.sfmt_slli.f
5397 #define OPRND(f) par_exec->operands.sfmt_slli.f
5398 int UNUSED written
= abuf
->written
;
5399 IADDR UNUSED pc
= abuf
->addr
;
5400 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 0);
5402 * FLD (i_dr
) = OPRND (dr
);
5409 CASE (sem
, INSN_PAR_SRL
) : /* srl $dr,$sr */
5411 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
5412 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
5413 #define FLD(f) abuf->fields.sfmt_add.f
5414 #define OPRND(f) par_exec->operands.sfmt_add.f
5415 int UNUSED written
= 0;
5416 IADDR UNUSED pc
= abuf
->addr
;
5417 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
5420 SI opval
= SRLSI (* FLD (i_dr
), ANDSI (* FLD (i_sr
), 31));
5422 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
5430 CASE (sem
, INSN_WRITE_SRL
) : /* srl $dr,$sr */
5432 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
5433 const ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
)->fields
.write
.abuf
;
5434 #define FLD(f) abuf->fields.sfmt_add.f
5435 #define OPRND(f) par_exec->operands.sfmt_add.f
5436 int UNUSED written
= abuf
->written
;
5437 IADDR UNUSED pc
= abuf
->addr
;
5438 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 0);
5440 * FLD (i_dr
) = OPRND (dr
);
5447 CASE (sem
, INSN_PAR_SRLI
) : /* srli $dr,$uimm5 */
5449 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
5450 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
5451 #define FLD(f) abuf->fields.sfmt_slli.f
5452 #define OPRND(f) par_exec->operands.sfmt_slli.f
5453 int UNUSED written
= 0;
5454 IADDR UNUSED pc
= abuf
->addr
;
5455 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
5458 SI opval
= SRLSI (* FLD (i_dr
), FLD (f_uimm5
));
5460 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
5468 CASE (sem
, INSN_WRITE_SRLI
) : /* srli $dr,$uimm5 */
5470 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
5471 const ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
)->fields
.write
.abuf
;
5472 #define FLD(f) abuf->fields.sfmt_slli.f
5473 #define OPRND(f) par_exec->operands.sfmt_slli.f
5474 int UNUSED written
= abuf
->written
;
5475 IADDR UNUSED pc
= abuf
->addr
;
5476 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 0);
5478 * FLD (i_dr
) = OPRND (dr
);
5485 CASE (sem
, INSN_PAR_ST
) : /* st $src1,@$src2 */
5487 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
5488 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
5489 #define FLD(f) abuf->fields.sfmt_st_plus.f
5490 #define OPRND(f) par_exec->operands.sfmt_st.f
5491 int UNUSED written
= 0;
5492 IADDR UNUSED pc
= abuf
->addr
;
5493 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
5496 SI opval
= * FLD (i_src1
);
5497 OPRND (h_memory_src2_idx
) = * FLD (i_src2
);
5498 OPRND (h_memory_src2
) = opval
;
5499 TRACE_RESULT (current_cpu
, abuf
, "memory", 'x', opval
);
5507 CASE (sem
, INSN_WRITE_ST
) : /* st $src1,@$src2 */
5509 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
5510 const ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
)->fields
.write
.abuf
;
5511 #define FLD(f) abuf->fields.sfmt_st_plus.f
5512 #define OPRND(f) par_exec->operands.sfmt_st.f
5513 int UNUSED written
= abuf
->written
;
5514 IADDR UNUSED pc
= abuf
->addr
;
5515 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 0);
5517 SETMEMSI (current_cpu
, pc
, OPRND (h_memory_src2_idx
), OPRND (h_memory_src2
));
5524 CASE (sem
, INSN_PAR_STB
) : /* stb $src1,@$src2 */
5526 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
5527 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
5528 #define FLD(f) abuf->fields.sfmt_st_plus.f
5529 #define OPRND(f) par_exec->operands.sfmt_stb.f
5530 int UNUSED written
= 0;
5531 IADDR UNUSED pc
= abuf
->addr
;
5532 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
5535 QI opval
= * FLD (i_src1
);
5536 OPRND (h_memory_src2_idx
) = * FLD (i_src2
);
5537 OPRND (h_memory_src2
) = opval
;
5538 TRACE_RESULT (current_cpu
, abuf
, "memory", 'x', opval
);
5546 CASE (sem
, INSN_WRITE_STB
) : /* stb $src1,@$src2 */
5548 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
5549 const ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
)->fields
.write
.abuf
;
5550 #define FLD(f) abuf->fields.sfmt_st_plus.f
5551 #define OPRND(f) par_exec->operands.sfmt_stb.f
5552 int UNUSED written
= abuf
->written
;
5553 IADDR UNUSED pc
= abuf
->addr
;
5554 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 0);
5556 SETMEMQI (current_cpu
, pc
, OPRND (h_memory_src2_idx
), OPRND (h_memory_src2
));
5563 CASE (sem
, INSN_PAR_STH
) : /* sth $src1,@$src2 */
5565 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
5566 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
5567 #define FLD(f) abuf->fields.sfmt_st_plus.f
5568 #define OPRND(f) par_exec->operands.sfmt_sth.f
5569 int UNUSED written
= 0;
5570 IADDR UNUSED pc
= abuf
->addr
;
5571 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
5574 HI opval
= * FLD (i_src1
);
5575 OPRND (h_memory_src2_idx
) = * FLD (i_src2
);
5576 OPRND (h_memory_src2
) = opval
;
5577 TRACE_RESULT (current_cpu
, abuf
, "memory", 'x', opval
);
5585 CASE (sem
, INSN_WRITE_STH
) : /* sth $src1,@$src2 */
5587 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
5588 const ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
)->fields
.write
.abuf
;
5589 #define FLD(f) abuf->fields.sfmt_st_plus.f
5590 #define OPRND(f) par_exec->operands.sfmt_sth.f
5591 int UNUSED written
= abuf
->written
;
5592 IADDR UNUSED pc
= abuf
->addr
;
5593 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 0);
5595 SETMEMHI (current_cpu
, pc
, OPRND (h_memory_src2_idx
), OPRND (h_memory_src2
));
5602 CASE (sem
, INSN_PAR_ST_PLUS
) : /* st $src1,@+$src2 */
5604 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
5605 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
5606 #define FLD(f) abuf->fields.sfmt_st_plus.f
5607 #define OPRND(f) par_exec->operands.sfmt_st_plus.f
5608 int UNUSED written
= 0;
5609 IADDR UNUSED pc
= abuf
->addr
;
5610 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
5614 tmp_new_src2
= ADDSI (* FLD (i_src2
), 4);
5616 SI opval
= * FLD (i_src1
);
5617 OPRND (h_memory_new_src2_idx
) = tmp_new_src2
;
5618 OPRND (h_memory_new_src2
) = opval
;
5619 TRACE_RESULT (current_cpu
, abuf
, "memory", 'x', opval
);
5622 SI opval
= tmp_new_src2
;
5623 OPRND (src2
) = opval
;
5624 TRACE_RESULT (current_cpu
, abuf
, "src2", 'x', opval
);
5633 CASE (sem
, INSN_WRITE_ST_PLUS
) : /* st $src1,@+$src2 */
5635 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
5636 const ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
)->fields
.write
.abuf
;
5637 #define FLD(f) abuf->fields.sfmt_st_plus.f
5638 #define OPRND(f) par_exec->operands.sfmt_st_plus.f
5639 int UNUSED written
= abuf
->written
;
5640 IADDR UNUSED pc
= abuf
->addr
;
5641 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 0);
5643 SETMEMSI (current_cpu
, pc
, OPRND (h_memory_new_src2_idx
), OPRND (h_memory_new_src2
));
5644 * FLD (i_src2
) = OPRND (src2
);
5651 CASE (sem
, INSN_PAR_ST_MINUS
) : /* st $src1,@-$src2 */
5653 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
5654 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
5655 #define FLD(f) abuf->fields.sfmt_st_plus.f
5656 #define OPRND(f) par_exec->operands.sfmt_st_plus.f
5657 int UNUSED written
= 0;
5658 IADDR UNUSED pc
= abuf
->addr
;
5659 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
5663 tmp_new_src2
= SUBSI (* FLD (i_src2
), 4);
5665 SI opval
= * FLD (i_src1
);
5666 OPRND (h_memory_new_src2_idx
) = tmp_new_src2
;
5667 OPRND (h_memory_new_src2
) = opval
;
5668 TRACE_RESULT (current_cpu
, abuf
, "memory", 'x', opval
);
5671 SI opval
= tmp_new_src2
;
5672 OPRND (src2
) = opval
;
5673 TRACE_RESULT (current_cpu
, abuf
, "src2", 'x', opval
);
5682 CASE (sem
, INSN_WRITE_ST_MINUS
) : /* st $src1,@-$src2 */
5684 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
5685 const ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
)->fields
.write
.abuf
;
5686 #define FLD(f) abuf->fields.sfmt_st_plus.f
5687 #define OPRND(f) par_exec->operands.sfmt_st_plus.f
5688 int UNUSED written
= abuf
->written
;
5689 IADDR UNUSED pc
= abuf
->addr
;
5690 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 0);
5692 SETMEMSI (current_cpu
, pc
, OPRND (h_memory_new_src2_idx
), OPRND (h_memory_new_src2
));
5693 * FLD (i_src2
) = OPRND (src2
);
5700 CASE (sem
, INSN_PAR_SUB
) : /* sub $dr,$sr */
5702 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
5703 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
5704 #define FLD(f) abuf->fields.sfmt_add.f
5705 #define OPRND(f) par_exec->operands.sfmt_add.f
5706 int UNUSED written
= 0;
5707 IADDR UNUSED pc
= abuf
->addr
;
5708 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
5711 SI opval
= SUBSI (* FLD (i_dr
), * FLD (i_sr
));
5713 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
5721 CASE (sem
, INSN_WRITE_SUB
) : /* sub $dr,$sr */
5723 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
5724 const ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
)->fields
.write
.abuf
;
5725 #define FLD(f) abuf->fields.sfmt_add.f
5726 #define OPRND(f) par_exec->operands.sfmt_add.f
5727 int UNUSED written
= abuf
->written
;
5728 IADDR UNUSED pc
= abuf
->addr
;
5729 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 0);
5731 * FLD (i_dr
) = OPRND (dr
);
5738 CASE (sem
, INSN_PAR_SUBV
) : /* subv $dr,$sr */
5740 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
5741 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
5742 #define FLD(f) abuf->fields.sfmt_add.f
5743 #define OPRND(f) par_exec->operands.sfmt_addv.f
5744 int UNUSED written
= 0;
5745 IADDR UNUSED pc
= abuf
->addr
;
5746 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
5750 temp0
= SUBSI (* FLD (i_dr
), * FLD (i_sr
));
5751 temp1
= SUBOFSI (* FLD (i_dr
), * FLD (i_sr
), 0);
5755 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
5759 OPRND (condbit
) = opval
;
5760 TRACE_RESULT (current_cpu
, abuf
, "condbit", 'x', opval
);
5769 CASE (sem
, INSN_WRITE_SUBV
) : /* subv $dr,$sr */
5771 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
5772 const ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
)->fields
.write
.abuf
;
5773 #define FLD(f) abuf->fields.sfmt_add.f
5774 #define OPRND(f) par_exec->operands.sfmt_addv.f
5775 int UNUSED written
= abuf
->written
;
5776 IADDR UNUSED pc
= abuf
->addr
;
5777 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 0);
5779 CPU (h_cond
) = OPRND (condbit
);
5780 * FLD (i_dr
) = OPRND (dr
);
5787 CASE (sem
, INSN_PAR_SUBX
) : /* subx $dr,$sr */
5789 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
5790 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
5791 #define FLD(f) abuf->fields.sfmt_add.f
5792 #define OPRND(f) par_exec->operands.sfmt_addx.f
5793 int UNUSED written
= 0;
5794 IADDR UNUSED pc
= abuf
->addr
;
5795 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
5799 temp0
= SUBCSI (* FLD (i_dr
), * FLD (i_sr
), CPU (h_cond
));
5800 temp1
= SUBCFSI (* FLD (i_dr
), * FLD (i_sr
), CPU (h_cond
));
5804 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
5808 OPRND (condbit
) = opval
;
5809 TRACE_RESULT (current_cpu
, abuf
, "condbit", 'x', opval
);
5818 CASE (sem
, INSN_WRITE_SUBX
) : /* subx $dr,$sr */
5820 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
5821 const ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
)->fields
.write
.abuf
;
5822 #define FLD(f) abuf->fields.sfmt_add.f
5823 #define OPRND(f) par_exec->operands.sfmt_addx.f
5824 int UNUSED written
= abuf
->written
;
5825 IADDR UNUSED pc
= abuf
->addr
;
5826 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 0);
5828 CPU (h_cond
) = OPRND (condbit
);
5829 * FLD (i_dr
) = OPRND (dr
);
5836 CASE (sem
, INSN_PAR_TRAP
) : /* trap $uimm4 */
5838 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
5839 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
5840 #define FLD(f) abuf->fields.sfmt_trap.f
5841 #define OPRND(f) par_exec->operands.sfmt_trap.f
5842 int UNUSED written
= 0;
5843 IADDR UNUSED pc
= abuf
->addr
;
5844 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
5848 USI opval
= GET_H_CR (((UINT
) 6));
5849 OPRND (h_cr_14
) = opval
;
5850 TRACE_RESULT (current_cpu
, abuf
, "cr-14", 'x', opval
);
5853 USI opval
= ADDSI (pc
, 4);
5854 OPRND (h_cr_6
) = opval
;
5855 TRACE_RESULT (current_cpu
, abuf
, "cr-6", 'x', opval
);
5858 UQI opval
= CPU (h_bpsw
);
5859 OPRND (h_bbpsw
) = opval
;
5860 TRACE_RESULT (current_cpu
, abuf
, "bbpsw", 'x', opval
);
5863 UQI opval
= GET_H_PSW ();
5864 OPRND (h_bpsw
) = opval
;
5865 TRACE_RESULT (current_cpu
, abuf
, "bpsw", 'x', opval
);
5868 UQI opval
= ANDQI (GET_H_PSW (), 128);
5869 OPRND (h_psw
) = opval
;
5870 TRACE_RESULT (current_cpu
, abuf
, "psw", 'x', opval
);
5873 SI opval
= m32r_trap (current_cpu
, pc
, FLD (f_uimm4
));
5875 TRACE_RESULT (current_cpu
, abuf
, "pc", 'x', opval
);
5884 CASE (sem
, INSN_WRITE_TRAP
) : /* trap $uimm4 */
5886 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
5887 const ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
)->fields
.write
.abuf
;
5888 #define FLD(f) abuf->fields.sfmt_trap.f
5889 #define OPRND(f) par_exec->operands.sfmt_trap.f
5890 int UNUSED written
= abuf
->written
;
5891 IADDR UNUSED pc
= abuf
->addr
;
5893 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 0);
5895 CPU (h_bbpsw
) = OPRND (h_bbpsw
);
5896 CPU (h_bpsw
) = OPRND (h_bpsw
);
5897 SET_H_CR (((UINT
) 14), OPRND (h_cr_14
));
5898 SET_H_CR (((UINT
) 6), OPRND (h_cr_6
));
5899 SET_H_PSW (OPRND (h_psw
));
5900 SEM_BRANCH_VIA_ADDR (current_cpu
, sem_arg
, OPRND (pc
), vpc
);
5902 SEM_BRANCH_FINI (vpc
);
5908 CASE (sem
, INSN_PAR_UNLOCK
) : /* unlock $src1,@$src2 */
5910 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
5911 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
5912 #define FLD(f) abuf->fields.sfmt_st_plus.f
5913 #define OPRND(f) par_exec->operands.sfmt_unlock.f
5914 int UNUSED written
= 0;
5915 IADDR UNUSED pc
= abuf
->addr
;
5916 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
5921 SI opval
= * FLD (i_src1
);
5922 OPRND (h_memory_src2_idx
) = * FLD (i_src2
);
5923 OPRND (h_memory_src2
) = opval
;
5924 written
|= (1 << 4);
5925 TRACE_RESULT (current_cpu
, abuf
, "memory", 'x', opval
);
5930 OPRND (h_lock
) = opval
;
5931 TRACE_RESULT (current_cpu
, abuf
, "lock", 'x', opval
);
5935 abuf
->written
= written
;
5941 CASE (sem
, INSN_WRITE_UNLOCK
) : /* unlock $src1,@$src2 */
5943 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
5944 const ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
)->fields
.write
.abuf
;
5945 #define FLD(f) abuf->fields.sfmt_st_plus.f
5946 #define OPRND(f) par_exec->operands.sfmt_unlock.f
5947 int UNUSED written
= abuf
->written
;
5948 IADDR UNUSED pc
= abuf
->addr
;
5949 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 0);
5951 CPU (h_lock
) = OPRND (h_lock
);
5952 if (written
& (1 << 4))
5954 SETMEMSI (current_cpu
, pc
, OPRND (h_memory_src2_idx
), OPRND (h_memory_src2
));
5962 CASE (sem
, INSN_PAR_PCMPBZ
) : /* pcmpbz $src2 */
5964 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
5965 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
5966 #define FLD(f) abuf->fields.sfmt_st_plus.f
5967 #define OPRND(f) par_exec->operands.sfmt_cmpz.f
5968 int UNUSED written
= 0;
5969 IADDR UNUSED pc
= abuf
->addr
;
5970 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
5973 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);
5974 OPRND (condbit
) = opval
;
5975 TRACE_RESULT (current_cpu
, abuf
, "condbit", 'x', opval
);
5983 CASE (sem
, INSN_WRITE_PCMPBZ
) : /* pcmpbz $src2 */
5985 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
5986 const ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
)->fields
.write
.abuf
;
5987 #define FLD(f) abuf->fields.sfmt_st_plus.f
5988 #define OPRND(f) par_exec->operands.sfmt_cmpz.f
5989 int UNUSED written
= abuf
->written
;
5990 IADDR UNUSED pc
= abuf
->addr
;
5991 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 0);
5993 CPU (h_cond
) = OPRND (condbit
);
6000 CASE (sem
, INSN_PAR_SADD
) : /* sadd */
6002 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
6003 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
6004 #define FLD(f) abuf->fields.fmt_empty.f
6005 #define OPRND(f) par_exec->operands.sfmt_sadd.f
6006 int UNUSED written
= 0;
6007 IADDR UNUSED pc
= abuf
->addr
;
6008 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
6011 DI opval
= ADDDI (SRADI (GET_H_ACCUMS (((UINT
) 1)), 16), GET_H_ACCUMS (((UINT
) 0)));
6012 OPRND (h_accums_0
) = opval
;
6013 TRACE_RESULT (current_cpu
, abuf
, "accums-0", 'D', opval
);
6021 CASE (sem
, INSN_WRITE_SADD
) : /* sadd */
6023 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
6024 const ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
)->fields
.write
.abuf
;
6025 #define FLD(f) abuf->fields.fmt_empty.f
6026 #define OPRND(f) par_exec->operands.sfmt_sadd.f
6027 int UNUSED written
= abuf
->written
;
6028 IADDR UNUSED pc
= abuf
->addr
;
6029 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 0);
6031 SET_H_ACCUMS (((UINT
) 0), OPRND (h_accums_0
));
6038 CASE (sem
, INSN_PAR_MACWU1
) : /* macwu1 $src1,$src2 */
6040 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
6041 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
6042 #define FLD(f) abuf->fields.sfmt_st_plus.f
6043 #define OPRND(f) par_exec->operands.sfmt_macwu1.f
6044 int UNUSED written
= 0;
6045 IADDR UNUSED pc
= abuf
->addr
;
6046 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
6049 DI opval
= SRADI (SLLDI (ADDDI (GET_H_ACCUMS (((UINT
) 1)), MULDI (EXTSIDI (* FLD (i_src1
)), EXTSIDI (ANDSI (* FLD (i_src2
), 65535)))), 8), 8);
6050 OPRND (h_accums_1
) = opval
;
6051 TRACE_RESULT (current_cpu
, abuf
, "accums-1", 'D', opval
);
6059 CASE (sem
, INSN_WRITE_MACWU1
) : /* macwu1 $src1,$src2 */
6061 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
6062 const ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
)->fields
.write
.abuf
;
6063 #define FLD(f) abuf->fields.sfmt_st_plus.f
6064 #define OPRND(f) par_exec->operands.sfmt_macwu1.f
6065 int UNUSED written
= abuf
->written
;
6066 IADDR UNUSED pc
= abuf
->addr
;
6067 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 0);
6069 SET_H_ACCUMS (((UINT
) 1), OPRND (h_accums_1
));
6076 CASE (sem
, INSN_PAR_MSBLO
) : /* msblo $src1,$src2 */
6078 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
6079 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
6080 #define FLD(f) abuf->fields.sfmt_st_plus.f
6081 #define OPRND(f) par_exec->operands.sfmt_msblo.f
6082 int UNUSED written
= 0;
6083 IADDR UNUSED pc
= abuf
->addr
;
6084 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
6087 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);
6088 OPRND (accum
) = opval
;
6089 TRACE_RESULT (current_cpu
, abuf
, "accum", 'D', opval
);
6097 CASE (sem
, INSN_WRITE_MSBLO
) : /* msblo $src1,$src2 */
6099 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
6100 const ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
)->fields
.write
.abuf
;
6101 #define FLD(f) abuf->fields.sfmt_st_plus.f
6102 #define OPRND(f) par_exec->operands.sfmt_msblo.f
6103 int UNUSED written
= abuf
->written
;
6104 IADDR UNUSED pc
= abuf
->addr
;
6105 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 0);
6107 SET_H_ACCUM (OPRND (accum
));
6114 CASE (sem
, INSN_PAR_MULWU1
) : /* mulwu1 $src1,$src2 */
6116 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
6117 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
6118 #define FLD(f) abuf->fields.sfmt_st_plus.f
6119 #define OPRND(f) par_exec->operands.sfmt_mulwu1.f
6120 int UNUSED written
= 0;
6121 IADDR UNUSED pc
= abuf
->addr
;
6122 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
6125 DI opval
= SRADI (SLLDI (MULDI (EXTSIDI (* FLD (i_src1
)), EXTSIDI (ANDSI (* FLD (i_src2
), 65535))), 16), 16);
6126 OPRND (h_accums_1
) = opval
;
6127 TRACE_RESULT (current_cpu
, abuf
, "accums-1", 'D', opval
);
6135 CASE (sem
, INSN_WRITE_MULWU1
) : /* mulwu1 $src1,$src2 */
6137 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
6138 const ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
)->fields
.write
.abuf
;
6139 #define FLD(f) abuf->fields.sfmt_st_plus.f
6140 #define OPRND(f) par_exec->operands.sfmt_mulwu1.f
6141 int UNUSED written
= abuf
->written
;
6142 IADDR UNUSED pc
= abuf
->addr
;
6143 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 0);
6145 SET_H_ACCUMS (((UINT
) 1), OPRND (h_accums_1
));
6152 CASE (sem
, INSN_PAR_MACLH1
) : /* maclh1 $src1,$src2 */
6154 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
6155 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
6156 #define FLD(f) abuf->fields.sfmt_st_plus.f
6157 #define OPRND(f) par_exec->operands.sfmt_macwu1.f
6158 int UNUSED written
= 0;
6159 IADDR UNUSED pc
= abuf
->addr
;
6160 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
6163 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);
6164 OPRND (h_accums_1
) = opval
;
6165 TRACE_RESULT (current_cpu
, abuf
, "accums-1", 'D', opval
);
6173 CASE (sem
, INSN_WRITE_MACLH1
) : /* maclh1 $src1,$src2 */
6175 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
6176 const ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
)->fields
.write
.abuf
;
6177 #define FLD(f) abuf->fields.sfmt_st_plus.f
6178 #define OPRND(f) par_exec->operands.sfmt_macwu1.f
6179 int UNUSED written
= abuf
->written
;
6180 IADDR UNUSED pc
= abuf
->addr
;
6181 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 0);
6183 SET_H_ACCUMS (((UINT
) 1), OPRND (h_accums_1
));
6190 CASE (sem
, INSN_PAR_SC
) : /* sc */
6192 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
6193 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
6194 #define FLD(f) abuf->fields.fmt_empty.f
6195 #define OPRND(f) par_exec->operands.sfmt_sc.f
6196 int UNUSED written
= 0;
6197 IADDR UNUSED pc
= abuf
->addr
;
6198 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
6200 if (ZEXTBISI (CPU (h_cond
)))
6201 SEM_SKIP_INSN (current_cpu
, sem_arg
, vpc
);
6208 CASE (sem
, INSN_WRITE_SC
) : /* sc */
6210 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
6211 const ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
)->fields
.write
.abuf
;
6212 #define FLD(f) abuf->fields.fmt_empty.f
6213 #define OPRND(f) par_exec->operands.sfmt_sc.f
6214 int UNUSED written
= abuf
->written
;
6215 IADDR UNUSED pc
= abuf
->addr
;
6216 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 0);
6224 CASE (sem
, INSN_PAR_SNC
) : /* snc */
6226 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
6227 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
6228 #define FLD(f) abuf->fields.fmt_empty.f
6229 #define OPRND(f) par_exec->operands.sfmt_sc.f
6230 int UNUSED written
= 0;
6231 IADDR UNUSED pc
= abuf
->addr
;
6232 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
6234 if (ZEXTBISI (NOTBI (CPU (h_cond
))))
6235 SEM_SKIP_INSN (current_cpu
, sem_arg
, vpc
);
6242 CASE (sem
, INSN_WRITE_SNC
) : /* snc */
6244 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
6245 const ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
)->fields
.write
.abuf
;
6246 #define FLD(f) abuf->fields.fmt_empty.f
6247 #define OPRND(f) par_exec->operands.sfmt_sc.f
6248 int UNUSED written
= abuf
->written
;
6249 IADDR UNUSED pc
= abuf
->addr
;
6250 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 0);
6260 ENDSWITCH (sem
) /* End of semantic switch. */
6262 /* At this point `vpc' contains the next insn to execute. */
6265 #undef DEFINE_SWITCH
6266 #endif /* DEFINE_SWITCH */