blob: 75b7bfda4c8f8db34d28a5de0c9895efbbe9694c [file] [log] [blame]
Max Filippov23288262011-09-06 03:55:25 +04001/*
2 * Xtensa ISA:
3 * http://www.tensilica.com/products/literature-docs/documentation/xtensa-isa-databook.htm
4 *
5 * Copyright (c) 2011, Max Filippov, Open Source and Linux Lab.
6 * All rights reserved.
7 *
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions are met:
10 * * Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * * Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 * * Neither the name of the Open Source and Linux Lab nor the
16 * names of its contributors may be used to endorse or promote products
17 * derived from this software without specific prior written permission.
18 *
19 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
23 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
24 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
25 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
26 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
28 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 */
30
Peter Maydell09aae232016-01-26 18:17:21 +000031#include "qemu/osdep.h"
Max Filippov23288262011-09-06 03:55:25 +040032
33#include "cpu.h"
Paolo Bonzini022c62c2012-12-17 18:19:49 +010034#include "exec/exec-all.h"
Philippe Mathieu-Daudédcb32f12020-01-01 12:23:00 +010035#include "tcg/tcg-op.h"
Paolo Bonzini1de7afc2012-12-17 18:20:00 +010036#include "qemu/log.h"
Markus Armbruster90c84c52019-04-17 21:18:02 +020037#include "qemu/qemu-print.h"
Philippe Mathieu-Daudé6b5fe132021-03-05 13:54:49 +000038#include "semihosting/semihost.h"
Lluís Vilanova77fc6f52017-07-14 11:21:37 +030039#include "exec/translator.h"
Max Filippov23288262011-09-06 03:55:25 +040040
Richard Henderson2ef61752014-04-07 22:31:41 -070041#include "exec/helper-proto.h"
42#include "exec/helper-gen.h"
Max Filippovdedc5ea2011-09-06 03:55:27 +040043
Paolo Bonzini508127e2016-01-07 16:55:28 +030044#include "exec/log.h"
Lluís Vilanovaa7e30d82014-05-30 14:12:25 +020045
Richard Hendersond53106c2023-03-31 10:37:04 -070046#define HELPER_H "helper.h"
47#include "exec/helper-info.c.inc"
48#undef HELPER_H
49
Lluís Vilanovaa7e30d82014-05-30 14:12:25 +020050
Peter Maydella3380cf2018-01-12 13:08:48 +000051struct DisasContext {
Richard Henderson3cc18ee2018-05-12 10:57:22 -070052 DisasContextBase base;
Max Filippovdedc5ea2011-09-06 03:55:27 +040053 const XtensaConfig *config;
Max Filippovdedc5ea2011-09-06 03:55:27 +040054 uint32_t pc;
Max Filippovf0a548b2011-09-06 03:55:40 +040055 int cring;
56 int ring;
Max Filippov5d630ce2018-10-03 15:59:11 -070057 uint32_t lbeg_off;
Max Filippov797d7802011-09-06 03:55:44 +040058 uint32_t lend;
Max Filippov3580eca2011-09-06 03:55:35 +040059
60 bool sar_5bit;
61 bool sar_m32_5bit;
Max Filippov3580eca2011-09-06 03:55:35 +040062 TCGv_i32 sar_m32;
Max Filippovb994e912011-09-06 03:55:48 +040063
Max Filippov2db59a72014-10-30 18:07:47 +030064 unsigned window;
Max Filippov6416d162018-08-29 10:37:29 -070065 unsigned callinc;
Max Filippov09460972018-08-27 21:43:43 -070066 bool cwoe;
Max Filippove61dc8f2012-01-13 09:21:32 +040067
68 bool debug;
Max Filippov35b5c042012-01-15 05:40:50 +040069 bool icount;
70 TCGv_i32 next_icount;
Max Filippovef04a842012-09-19 04:23:59 +040071
72 unsigned cpenable;
Max Filippov168c12b2017-11-03 18:29:27 -070073
Max Filippov45b71a72019-01-30 14:48:22 -080074 uint32_t op_flags;
Max Filippovfde557a2020-04-06 20:59:54 -070075 xtensa_insnbuf_word insnbuf[MAX_INSNBUF_LENGTH];
76 xtensa_insnbuf_word slotbuf[MAX_INSNBUF_LENGTH];
Peter Maydella3380cf2018-01-12 13:08:48 +000077};
Max Filippovdedc5ea2011-09-06 03:55:27 +040078
Max Filippovdedc5ea2011-09-06 03:55:27 +040079static TCGv_i32 cpu_pc;
80static TCGv_i32 cpu_R[16];
Max Filippovdd519cb2012-09-19 04:23:54 +040081static TCGv_i32 cpu_FR[16];
Max Filippovcfa9f052020-06-30 19:27:02 -070082static TCGv_i64 cpu_FRD[16];
Max Filippov7aa78342019-02-11 19:16:14 -080083static TCGv_i32 cpu_MR[4];
Max Filippov575e9622019-02-14 13:27:50 -080084static TCGv_i32 cpu_BR[16];
85static TCGv_i32 cpu_BR4[4];
86static TCGv_i32 cpu_BR8[2];
Max Filippov2af3da92011-09-06 03:55:33 +040087static TCGv_i32 cpu_SR[256];
88static TCGv_i32 cpu_UR[256];
Max Filippov8df3fd32019-01-30 14:56:29 -080089static TCGv_i32 cpu_windowbase_next;
Max Filippovb345e142019-04-18 16:37:00 -070090static TCGv_i32 cpu_exclusive_addr;
91static TCGv_i32 cpu_exclusive_val;
Max Filippovdedc5ea2011-09-06 03:55:27 +040092
Max Filippovb0b24bd2019-02-11 18:53:19 -080093static GHashTable *xtensa_regfile_table;
94
Max Filippov59419602019-03-18 17:10:38 -070095static char *sr_name[256];
96static char *ur_name[256];
Max Filippovfe0bd472012-12-05 07:15:22 +040097
Max Filippov59419602019-03-18 17:10:38 -070098void xtensa_collect_sr_names(const XtensaConfig *config)
99{
100 xtensa_isa isa = config->isa;
101 int n = xtensa_isa_num_sysregs(isa);
102 int i;
103
104 for (i = 0; i < n; ++i) {
105 int sr = xtensa_sysreg_number(isa, i);
106
107 if (sr >= 0 && sr < 256) {
108 const char *name = xtensa_sysreg_name(isa, i);
109 char **pname =
110 (xtensa_sysreg_is_user(isa, i) ? ur_name : sr_name) + sr;
111
112 if (*pname) {
113 if (strstr(*pname, name) == NULL) {
114 char *new_name =
115 malloc(strlen(*pname) + strlen(name) + 2);
116
117 strcpy(new_name, *pname);
118 strcat(new_name, "/");
119 strcat(new_name, name);
120 free(*pname);
121 *pname = new_name;
122 }
123 } else {
124 *pname = strdup(name);
125 }
126 }
Max Filippovfe0bd472012-12-05 07:15:22 +0400127 }
Max Filippov59419602019-03-18 17:10:38 -0700128}
Max Filippov2af3da92011-09-06 03:55:33 +0400129
Max Filippov23288262011-09-06 03:55:25 +0400130void xtensa_translate_init(void)
131{
Max Filippovdedc5ea2011-09-06 03:55:27 +0400132 static const char * const regnames[] = {
133 "ar0", "ar1", "ar2", "ar3",
134 "ar4", "ar5", "ar6", "ar7",
135 "ar8", "ar9", "ar10", "ar11",
136 "ar12", "ar13", "ar14", "ar15",
137 };
Max Filippovdd519cb2012-09-19 04:23:54 +0400138 static const char * const fregnames[] = {
139 "f0", "f1", "f2", "f3",
140 "f4", "f5", "f6", "f7",
141 "f8", "f9", "f10", "f11",
142 "f12", "f13", "f14", "f15",
143 };
Max Filippov7aa78342019-02-11 19:16:14 -0800144 static const char * const mregnames[] = {
145 "m0", "m1", "m2", "m3",
146 };
Max Filippov575e9622019-02-14 13:27:50 -0800147 static const char * const bregnames[] = {
148 "b0", "b1", "b2", "b3",
149 "b4", "b5", "b6", "b7",
150 "b8", "b9", "b10", "b11",
151 "b12", "b13", "b14", "b15",
152 };
Max Filippovdedc5ea2011-09-06 03:55:27 +0400153 int i;
154
Richard Hendersonad75a512023-09-13 16:37:36 -0700155 cpu_pc = tcg_global_mem_new_i32(tcg_env,
Andreas Färber97129ac2012-03-14 01:38:23 +0100156 offsetof(CPUXtensaState, pc), "pc");
Max Filippovdedc5ea2011-09-06 03:55:27 +0400157
158 for (i = 0; i < 16; i++) {
Richard Hendersonad75a512023-09-13 16:37:36 -0700159 cpu_R[i] = tcg_global_mem_new_i32(tcg_env,
Max Filippov7aa78342019-02-11 19:16:14 -0800160 offsetof(CPUXtensaState, regs[i]),
161 regnames[i]);
Max Filippovdedc5ea2011-09-06 03:55:27 +0400162 }
Max Filippov2af3da92011-09-06 03:55:33 +0400163
Max Filippovdd519cb2012-09-19 04:23:54 +0400164 for (i = 0; i < 16; i++) {
Richard Hendersonad75a512023-09-13 16:37:36 -0700165 cpu_FR[i] = tcg_global_mem_new_i32(tcg_env,
Max Filippov7aa78342019-02-11 19:16:14 -0800166 offsetof(CPUXtensaState,
167 fregs[i].f32[FP_F32_LOW]),
168 fregnames[i]);
169 }
170
Max Filippovcfa9f052020-06-30 19:27:02 -0700171 for (i = 0; i < 16; i++) {
Richard Hendersonad75a512023-09-13 16:37:36 -0700172 cpu_FRD[i] = tcg_global_mem_new_i64(tcg_env,
Max Filippovcfa9f052020-06-30 19:27:02 -0700173 offsetof(CPUXtensaState,
174 fregs[i].f64),
175 fregnames[i]);
176 }
177
Max Filippov7aa78342019-02-11 19:16:14 -0800178 for (i = 0; i < 4; i++) {
Richard Hendersonad75a512023-09-13 16:37:36 -0700179 cpu_MR[i] = tcg_global_mem_new_i32(tcg_env,
Max Filippov7aa78342019-02-11 19:16:14 -0800180 offsetof(CPUXtensaState,
181 sregs[MR + i]),
182 mregnames[i]);
Max Filippovdd519cb2012-09-19 04:23:54 +0400183 }
184
Max Filippov575e9622019-02-14 13:27:50 -0800185 for (i = 0; i < 16; i++) {
Richard Hendersonad75a512023-09-13 16:37:36 -0700186 cpu_BR[i] = tcg_global_mem_new_i32(tcg_env,
Max Filippov575e9622019-02-14 13:27:50 -0800187 offsetof(CPUXtensaState,
188 sregs[BR]),
189 bregnames[i]);
190 if (i % 4 == 0) {
Richard Hendersonad75a512023-09-13 16:37:36 -0700191 cpu_BR4[i / 4] = tcg_global_mem_new_i32(tcg_env,
Max Filippov575e9622019-02-14 13:27:50 -0800192 offsetof(CPUXtensaState,
193 sregs[BR]),
194 bregnames[i]);
195 }
196 if (i % 8 == 0) {
Richard Hendersonad75a512023-09-13 16:37:36 -0700197 cpu_BR8[i / 8] = tcg_global_mem_new_i32(tcg_env,
Max Filippov575e9622019-02-14 13:27:50 -0800198 offsetof(CPUXtensaState,
199 sregs[BR]),
200 bregnames[i]);
201 }
202 }
203
Max Filippov2af3da92011-09-06 03:55:33 +0400204 for (i = 0; i < 256; ++i) {
Max Filippov59419602019-03-18 17:10:38 -0700205 if (sr_name[i]) {
Richard Hendersonad75a512023-09-13 16:37:36 -0700206 cpu_SR[i] = tcg_global_mem_new_i32(tcg_env,
Max Filippov59419602019-03-18 17:10:38 -0700207 offsetof(CPUXtensaState,
208 sregs[i]),
209 sr_name[i]);
Max Filippov2af3da92011-09-06 03:55:33 +0400210 }
211 }
212
213 for (i = 0; i < 256; ++i) {
Max Filippov59419602019-03-18 17:10:38 -0700214 if (ur_name[i]) {
Richard Hendersonad75a512023-09-13 16:37:36 -0700215 cpu_UR[i] = tcg_global_mem_new_i32(tcg_env,
Max Filippov59419602019-03-18 17:10:38 -0700216 offsetof(CPUXtensaState,
217 uregs[i]),
218 ur_name[i]);
Max Filippov2af3da92011-09-06 03:55:33 +0400219 }
220 }
Max Filippov8df3fd32019-01-30 14:56:29 -0800221
222 cpu_windowbase_next =
Richard Hendersonad75a512023-09-13 16:37:36 -0700223 tcg_global_mem_new_i32(tcg_env,
Max Filippov8df3fd32019-01-30 14:56:29 -0800224 offsetof(CPUXtensaState, windowbase_next),
225 "windowbase_next");
Max Filippovb345e142019-04-18 16:37:00 -0700226 cpu_exclusive_addr =
Richard Hendersonad75a512023-09-13 16:37:36 -0700227 tcg_global_mem_new_i32(tcg_env,
Max Filippovb345e142019-04-18 16:37:00 -0700228 offsetof(CPUXtensaState, exclusive_addr),
229 "exclusive_addr");
230 cpu_exclusive_val =
Richard Hendersonad75a512023-09-13 16:37:36 -0700231 tcg_global_mem_new_i32(tcg_env,
Max Filippovb345e142019-04-18 16:37:00 -0700232 offsetof(CPUXtensaState, exclusive_val),
233 "exclusive_val");
Max Filippovdedc5ea2011-09-06 03:55:27 +0400234}
235
Max Filippovee659da2020-06-28 02:53:32 -0700236void **xtensa_get_regfile_by_name(const char *name, int entries, int bits)
Max Filippovb0b24bd2019-02-11 18:53:19 -0800237{
Max Filippovee659da2020-06-28 02:53:32 -0700238 char *geometry_name;
239 void **res;
240
Max Filippovb0b24bd2019-02-11 18:53:19 -0800241 if (xtensa_regfile_table == NULL) {
242 xtensa_regfile_table = g_hash_table_new(g_str_hash, g_str_equal);
Max Filippovee659da2020-06-28 02:53:32 -0700243 /*
244 * AR is special. Xtensa translator uses it as a current register
245 * window, but configuration overlays represent it as a complete
246 * physical register file.
247 */
Max Filippovb0b24bd2019-02-11 18:53:19 -0800248 g_hash_table_insert(xtensa_regfile_table,
Max Filippovee659da2020-06-28 02:53:32 -0700249 (void *)"AR 16x32", (void *)cpu_R);
Max Filippovb0b24bd2019-02-11 18:53:19 -0800250 g_hash_table_insert(xtensa_regfile_table,
Max Filippovee659da2020-06-28 02:53:32 -0700251 (void *)"AR 32x32", (void *)cpu_R);
Max Filippov7aa78342019-02-11 19:16:14 -0800252 g_hash_table_insert(xtensa_regfile_table,
Max Filippovee659da2020-06-28 02:53:32 -0700253 (void *)"AR 64x32", (void *)cpu_R);
254
Max Filippov575e9622019-02-14 13:27:50 -0800255 g_hash_table_insert(xtensa_regfile_table,
Max Filippovee659da2020-06-28 02:53:32 -0700256 (void *)"MR 4x32", (void *)cpu_MR);
257
Max Filippov575e9622019-02-14 13:27:50 -0800258 g_hash_table_insert(xtensa_regfile_table,
Max Filippovee659da2020-06-28 02:53:32 -0700259 (void *)"FR 16x32", (void *)cpu_FR);
Max Filippovcfa9f052020-06-30 19:27:02 -0700260 g_hash_table_insert(xtensa_regfile_table,
261 (void *)"FR 16x64", (void *)cpu_FRD);
Max Filippovee659da2020-06-28 02:53:32 -0700262
Max Filippov575e9622019-02-14 13:27:50 -0800263 g_hash_table_insert(xtensa_regfile_table,
Max Filippovee659da2020-06-28 02:53:32 -0700264 (void *)"BR 16x1", (void *)cpu_BR);
265 g_hash_table_insert(xtensa_regfile_table,
266 (void *)"BR4 4x4", (void *)cpu_BR4);
267 g_hash_table_insert(xtensa_regfile_table,
268 (void *)"BR8 2x8", (void *)cpu_BR8);
Max Filippovb0b24bd2019-02-11 18:53:19 -0800269 }
Max Filippovee659da2020-06-28 02:53:32 -0700270
271 geometry_name = g_strdup_printf("%s %dx%d", name, entries, bits);
272 res = (void **)g_hash_table_lookup(xtensa_regfile_table, geometry_name);
273 g_free(geometry_name);
274 return res;
Max Filippovb0b24bd2019-02-11 18:53:19 -0800275}
276
Max Filippovdedc5ea2011-09-06 03:55:27 +0400277static inline bool option_enabled(DisasContext *dc, int opt)
278{
279 return xtensa_option_enabled(dc->config, opt);
280}
281
Max Filippov3580eca2011-09-06 03:55:35 +0400282static void init_sar_tracker(DisasContext *dc)
283{
284 dc->sar_5bit = false;
285 dc->sar_m32_5bit = false;
Richard Hendersona49f3a22023-02-24 21:53:49 -1000286 dc->sar_m32 = NULL;
Max Filippov3580eca2011-09-06 03:55:35 +0400287}
288
289static void gen_right_shift_sar(DisasContext *dc, TCGv_i32 sa)
290{
291 tcg_gen_andi_i32(cpu_SR[SAR], sa, 0x1f);
292 if (dc->sar_m32_5bit) {
293 tcg_gen_discard_i32(dc->sar_m32);
294 }
295 dc->sar_5bit = true;
296 dc->sar_m32_5bit = false;
297}
298
299static void gen_left_shift_sar(DisasContext *dc, TCGv_i32 sa)
300{
Richard Hendersona49f3a22023-02-24 21:53:49 -1000301 if (!dc->sar_m32) {
Richard Henderson177bbc82023-01-29 14:45:57 -1000302 dc->sar_m32 = tcg_temp_new_i32();
Max Filippov3580eca2011-09-06 03:55:35 +0400303 }
304 tcg_gen_andi_i32(dc->sar_m32, sa, 0x1f);
Max Filippov2b570a12022-04-21 13:27:27 -0700305 tcg_gen_sub_i32(cpu_SR[SAR], tcg_constant_i32(32), dc->sar_m32);
Max Filippov3580eca2011-09-06 03:55:35 +0400306 dc->sar_5bit = false;
307 dc->sar_m32_5bit = true;
Max Filippov3580eca2011-09-06 03:55:35 +0400308}
309
Max Filippovb994e912011-09-06 03:55:48 +0400310static void gen_exception(DisasContext *dc, int excp)
Max Filippovdedc5ea2011-09-06 03:55:27 +0400311{
Richard Hendersonad75a512023-09-13 16:37:36 -0700312 gen_helper_exception(tcg_env, tcg_constant_i32(excp));
Max Filippovdedc5ea2011-09-06 03:55:27 +0400313}
314
Max Filippov40643d72011-09-06 03:55:41 +0400315static void gen_exception_cause(DisasContext *dc, uint32_t cause)
316{
Max Filippovf99fbd12022-04-21 13:38:58 -0700317 TCGv_i32 pc = tcg_constant_i32(dc->pc);
Richard Hendersonad75a512023-09-13 16:37:36 -0700318 gen_helper_exception_cause(tcg_env, pc, tcg_constant_i32(cause));
Max Filippov6b814712011-10-25 18:24:09 +0400319 if (cause == ILLEGAL_INSTRUCTION_CAUSE ||
320 cause == SYSCALL_CAUSE) {
Richard Henderson3cc18ee2018-05-12 10:57:22 -0700321 dc->base.is_jmp = DISAS_NORETURN;
Max Filippov6b814712011-10-25 18:24:09 +0400322 }
Max Filippov40643d72011-09-06 03:55:41 +0400323}
324
Max Filippove61dc8f2012-01-13 09:21:32 +0400325static void gen_debug_exception(DisasContext *dc, uint32_t cause)
326{
Max Filippovf99fbd12022-04-21 13:38:58 -0700327 TCGv_i32 pc = tcg_constant_i32(dc->pc);
Richard Hendersonad75a512023-09-13 16:37:36 -0700328 gen_helper_debug_exception(tcg_env, pc, tcg_constant_i32(cause));
Max Filippove61dc8f2012-01-13 09:21:32 +0400329 if (cause & (DEBUGCAUSE_IB | DEBUGCAUSE_BI | DEBUGCAUSE_BN)) {
Richard Henderson3cc18ee2018-05-12 10:57:22 -0700330 dc->base.is_jmp = DISAS_NORETURN;
Max Filippove61dc8f2012-01-13 09:21:32 +0400331 }
332}
333
Max Filippov97e89ee2014-11-08 19:00:55 +0300334static bool gen_check_privilege(DisasContext *dc)
Max Filippov40643d72011-09-06 03:55:41 +0400335{
Max Filippovba7651f2017-01-25 10:54:11 -0800336#ifndef CONFIG_USER_ONLY
337 if (!dc->cring) {
338 return true;
Max Filippov40643d72011-09-06 03:55:41 +0400339 }
Max Filippovba7651f2017-01-25 10:54:11 -0800340#endif
341 gen_exception_cause(dc, PRIVILEGED_CAUSE);
Richard Henderson3cc18ee2018-05-12 10:57:22 -0700342 dc->base.is_jmp = DISAS_NORETURN;
Max Filippovba7651f2017-01-25 10:54:11 -0800343 return false;
Max Filippov40643d72011-09-06 03:55:41 +0400344}
345
Max Filippov582fef02018-08-31 13:57:08 -0700346static bool gen_check_cpenable(DisasContext *dc, uint32_t cp_mask)
Max Filippovef04a842012-09-19 04:23:59 +0400347{
Max Filippov582fef02018-08-31 13:57:08 -0700348 cp_mask &= ~dc->cpenable;
349
350 if (option_enabled(dc, XTENSA_OPTION_COPROCESSOR) && cp_mask) {
351 gen_exception_cause(dc, COPROCESSOR0_DISABLED + ctz32(cp_mask));
Richard Henderson3cc18ee2018-05-12 10:57:22 -0700352 dc->base.is_jmp = DISAS_NORETURN;
Max Filippov97e89ee2014-11-08 19:00:55 +0300353 return false;
Max Filippovef04a842012-09-19 04:23:59 +0400354 }
Max Filippov97e89ee2014-11-08 19:00:55 +0300355 return true;
Max Filippovef04a842012-09-19 04:23:59 +0400356}
357
Max Filippov45b71a72019-01-30 14:48:22 -0800358static int gen_postprocess(DisasContext *dc, int slot);
359
Max Filippovdedc5ea2011-09-06 03:55:27 +0400360static void gen_jump_slot(DisasContext *dc, TCGv dest, int slot)
361{
362 tcg_gen_mov_i32(cpu_pc, dest);
Max Filippov35b5c042012-01-15 05:40:50 +0400363 if (dc->icount) {
364 tcg_gen_mov_i32(cpu_SR[ICOUNT], dc->next_icount);
365 }
Richard Henderson02bf7fa2021-07-19 15:02:11 -1000366 if (dc->op_flags & XTENSA_OP_POSTPROCESS) {
367 slot = gen_postprocess(dc, slot);
368 }
369 if (slot >= 0) {
370 tcg_gen_goto_tb(slot);
371 tcg_gen_exit_tb(dc->base.tb, slot);
Max Filippovdedc5ea2011-09-06 03:55:27 +0400372 } else {
Richard Henderson02bf7fa2021-07-19 15:02:11 -1000373 tcg_gen_exit_tb(NULL, 0);
Max Filippovdedc5ea2011-09-06 03:55:27 +0400374 }
Richard Henderson3cc18ee2018-05-12 10:57:22 -0700375 dc->base.is_jmp = DISAS_NORETURN;
Max Filippovdedc5ea2011-09-06 03:55:27 +0400376}
377
Max Filippov67882fd2011-09-06 03:55:28 +0400378static void gen_jump(DisasContext *dc, TCGv dest)
379{
380 gen_jump_slot(dc, dest, -1);
381}
382
Max Filippov9791e7e2019-02-11 02:00:06 -0800383static int adjust_jump_slot(DisasContext *dc, uint32_t dest, int slot)
384{
Richard Henderson70c6eb42021-06-20 17:05:35 -0700385 return translator_use_goto_tb(&dc->base, dest) ? slot : -1;
Max Filippov9791e7e2019-02-11 02:00:06 -0800386}
387
Max Filippovdedc5ea2011-09-06 03:55:27 +0400388static void gen_jumpi(DisasContext *dc, uint32_t dest, int slot)
389{
Max Filippov6ade0ce2022-04-21 13:46:20 -0700390 gen_jump_slot(dc, tcg_constant_i32(dest),
391 adjust_jump_slot(dc, dest, slot));
Max Filippovdedc5ea2011-09-06 03:55:27 +0400392}
393
Max Filippov553e44f2011-09-06 03:55:43 +0400394static void gen_callw_slot(DisasContext *dc, int callinc, TCGv_i32 dest,
395 int slot)
396{
Max Filippov553e44f2011-09-06 03:55:43 +0400397 tcg_gen_deposit_i32(cpu_SR[PS], cpu_SR[PS],
Max Filippov6ade0ce2022-04-21 13:46:20 -0700398 tcg_constant_i32(callinc), PS_CALLINC_SHIFT, PS_CALLINC_LEN);
Max Filippov553e44f2011-09-06 03:55:43 +0400399 tcg_gen_movi_i32(cpu_R[callinc << 2],
Richard Henderson3cc18ee2018-05-12 10:57:22 -0700400 (callinc << 30) | (dc->base.pc_next & 0x3fffffff));
Max Filippov553e44f2011-09-06 03:55:43 +0400401 gen_jump_slot(dc, dest, slot);
402}
403
Max Filippov797d7802011-09-06 03:55:44 +0400404static bool gen_check_loop_end(DisasContext *dc, int slot)
405{
Max Filippov5d630ce2018-10-03 15:59:11 -0700406 if (dc->base.pc_next == dc->lend) {
Richard Henderson42a268c2015-02-13 12:51:55 -0800407 TCGLabel *label = gen_new_label();
Max Filippov797d7802011-09-06 03:55:44 +0400408
409 tcg_gen_brcondi_i32(TCG_COND_EQ, cpu_SR[LCOUNT], 0, label);
410 tcg_gen_subi_i32(cpu_SR[LCOUNT], cpu_SR[LCOUNT], 1);
Max Filippov5d630ce2018-10-03 15:59:11 -0700411 if (dc->lbeg_off) {
412 gen_jumpi(dc, dc->base.pc_next - dc->lbeg_off, slot);
413 } else {
414 gen_jump(dc, cpu_SR[LBEG]);
415 }
Max Filippov797d7802011-09-06 03:55:44 +0400416 gen_set_label(label);
Richard Henderson3cc18ee2018-05-12 10:57:22 -0700417 gen_jumpi(dc, dc->base.pc_next, -1);
Max Filippov797d7802011-09-06 03:55:44 +0400418 return true;
419 }
420 return false;
421}
422
423static void gen_jumpi_check_loop_end(DisasContext *dc, int slot)
424{
425 if (!gen_check_loop_end(dc, slot)) {
Richard Henderson3cc18ee2018-05-12 10:57:22 -0700426 gen_jumpi(dc, dc->base.pc_next, slot);
Max Filippov797d7802011-09-06 03:55:44 +0400427 }
428}
429
Max Filippovbd57fb92011-09-06 03:55:31 +0400430static void gen_brcond(DisasContext *dc, TCGCond cond,
Max Filippov33071f62017-11-03 19:44:46 -0700431 TCGv_i32 t0, TCGv_i32 t1, uint32_t addr)
Max Filippovbd57fb92011-09-06 03:55:31 +0400432{
Richard Henderson42a268c2015-02-13 12:51:55 -0800433 TCGLabel *label = gen_new_label();
Max Filippovbd57fb92011-09-06 03:55:31 +0400434
435 tcg_gen_brcond_i32(cond, t0, t1, label);
Max Filippov797d7802011-09-06 03:55:44 +0400436 gen_jumpi_check_loop_end(dc, 0);
Max Filippovbd57fb92011-09-06 03:55:31 +0400437 gen_set_label(label);
Max Filippov33071f62017-11-03 19:44:46 -0700438 gen_jumpi(dc, addr, 1);
Max Filippovbd57fb92011-09-06 03:55:31 +0400439}
440
441static void gen_brcondi(DisasContext *dc, TCGCond cond,
Max Filippov33071f62017-11-03 19:44:46 -0700442 TCGv_i32 t0, uint32_t t1, uint32_t addr)
Max Filippovbd57fb92011-09-06 03:55:31 +0400443{
Max Filippov6ade0ce2022-04-21 13:46:20 -0700444 gen_brcond(dc, cond, t0, tcg_constant_i32(t1), addr);
Max Filippovbd57fb92011-09-06 03:55:31 +0400445}
446
Max Filippov91dc2b22020-05-04 14:08:40 -0700447static uint32_t test_exceptions_sr(DisasContext *dc, const OpcodeArg arg[],
448 const uint32_t par[])
Max Filippovfe0bd472012-12-05 07:15:22 +0400449{
Max Filippov91dc2b22020-05-04 14:08:40 -0700450 return xtensa_option_enabled(dc->config, par[1]) ? 0 : XTENSA_OP_ILL;
Max Filippov59419602019-03-18 17:10:38 -0700451}
452
Max Filippov91dc2b22020-05-04 14:08:40 -0700453static uint32_t test_exceptions_ccompare(DisasContext *dc,
454 const OpcodeArg arg[],
455 const uint32_t par[])
Max Filippov59419602019-03-18 17:10:38 -0700456{
457 unsigned n = par[0] - CCOMPARE;
458
Max Filippov91dc2b22020-05-04 14:08:40 -0700459 if (n >= dc->config->nccompare) {
460 return XTENSA_OP_ILL;
461 }
462 return test_exceptions_sr(dc, arg, par);
Max Filippov59419602019-03-18 17:10:38 -0700463}
464
Max Filippov91dc2b22020-05-04 14:08:40 -0700465static uint32_t test_exceptions_dbreak(DisasContext *dc, const OpcodeArg arg[],
466 const uint32_t par[])
Max Filippov59419602019-03-18 17:10:38 -0700467{
468 unsigned n = MAX_NDBREAK;
469
470 if (par[0] >= DBREAKA && par[0] < DBREAKA + MAX_NDBREAK) {
471 n = par[0] - DBREAKA;
Max Filippovfe0bd472012-12-05 07:15:22 +0400472 }
Max Filippov59419602019-03-18 17:10:38 -0700473 if (par[0] >= DBREAKC && par[0] < DBREAKC + MAX_NDBREAK) {
474 n = par[0] - DBREAKC;
Max Filippovd2132512013-07-22 08:02:43 +0400475 }
Max Filippov91dc2b22020-05-04 14:08:40 -0700476 if (n >= dc->config->ndbreak) {
477 return XTENSA_OP_ILL;
478 }
479 return test_exceptions_sr(dc, arg, par);
Max Filippov59419602019-03-18 17:10:38 -0700480}
481
Max Filippov91dc2b22020-05-04 14:08:40 -0700482static uint32_t test_exceptions_ibreak(DisasContext *dc, const OpcodeArg arg[],
483 const uint32_t par[])
Max Filippov59419602019-03-18 17:10:38 -0700484{
485 unsigned n = par[0] - IBREAKA;
486
Max Filippov91dc2b22020-05-04 14:08:40 -0700487 if (n >= dc->config->nibreak) {
488 return XTENSA_OP_ILL;
489 }
490 return test_exceptions_sr(dc, arg, par);
Max Filippov59419602019-03-18 17:10:38 -0700491}
492
Max Filippov91dc2b22020-05-04 14:08:40 -0700493static uint32_t test_exceptions_hpi(DisasContext *dc, const OpcodeArg arg[],
494 const uint32_t par[])
Max Filippov59419602019-03-18 17:10:38 -0700495{
496 unsigned n = MAX_NLEVEL + 1;
497
498 if (par[0] >= EXCSAVE1 && par[0] < EXCSAVE1 + MAX_NLEVEL) {
499 n = par[0] - EXCSAVE1 + 1;
Max Filippovd2132512013-07-22 08:02:43 +0400500 }
Max Filippov59419602019-03-18 17:10:38 -0700501 if (par[0] >= EPC1 && par[0] < EPC1 + MAX_NLEVEL) {
502 n = par[0] - EPC1 + 1;
Max Filippovb8132eff2011-09-06 03:55:34 +0400503 }
Max Filippov59419602019-03-18 17:10:38 -0700504 if (par[0] >= EPS2 && par[0] < EPS2 + MAX_NLEVEL - 1) {
505 n = par[0] - EPS2 + 2;
Max Filippov3580eca2011-09-06 03:55:35 +0400506 }
Max Filippov91dc2b22020-05-04 14:08:40 -0700507 if (n > dc->config->nlevel) {
508 return XTENSA_OP_ILL;
509 }
510 return test_exceptions_sr(dc, arg, par);
Max Filippovdd519cb2012-09-19 04:23:54 +0400511}
512
Max Filippov583e6a52021-05-17 12:31:08 -0700513static MemOp gen_load_store_alignment(DisasContext *dc, MemOp mop,
514 TCGv_i32 addr)
Max Filippov5b4e4812011-09-06 03:55:46 +0400515{
Max Filippov583e6a52021-05-17 12:31:08 -0700516 if ((mop & MO_SIZE) == MO_8) {
517 return mop;
Max Filippov5b4e4812011-09-06 03:55:46 +0400518 }
Max Filippov583e6a52021-05-17 12:31:08 -0700519 if ((mop & MO_AMASK) == MO_UNALN &&
520 !option_enabled(dc, XTENSA_OPTION_HW_ALIGNMENT)) {
521 mop |= MO_ALIGN;
522 }
523 if (!option_enabled(dc, XTENSA_OPTION_UNALIGNED_EXCEPTION)) {
524 tcg_gen_andi_i32(addr, addr, ~0 << get_alignment_bits(mop));
525 }
526 return mop;
Max Filippov5b4e4812011-09-06 03:55:46 +0400527}
528
Max Filippov6416d162018-08-29 10:37:29 -0700529static bool gen_window_check(DisasContext *dc, uint32_t mask)
Max Filippov772177c2011-09-06 03:55:49 +0400530{
Max Filippov6416d162018-08-29 10:37:29 -0700531 unsigned r = 31 - clz32(mask);
532
533 if (r / 4 > dc->window) {
Max Filippov0269a6c2022-04-21 13:08:23 -0700534 TCGv_i32 pc = tcg_constant_i32(dc->pc);
535 TCGv_i32 w = tcg_constant_i32(r / 4);
Max Filippov772177c2011-09-06 03:55:49 +0400536
Richard Hendersonad75a512023-09-13 16:37:36 -0700537 gen_helper_window_check(tcg_env, pc, w);
Richard Henderson3cc18ee2018-05-12 10:57:22 -0700538 dc->base.is_jmp = DISAS_NORETURN;
Max Filippov97e89ee2014-11-08 19:00:55 +0300539 return false;
Max Filippov772177c2011-09-06 03:55:49 +0400540 }
Max Filippov97e89ee2014-11-08 19:00:55 +0300541 return true;
Max Filippov772177c2011-09-06 03:55:49 +0400542}
543
Max Filippov6825b6c2011-10-10 06:25:40 +0400544static TCGv_i32 gen_mac16_m(TCGv_i32 v, bool hi, bool is_unsigned)
545{
546 TCGv_i32 m = tcg_temp_new_i32();
547
548 if (hi) {
549 (is_unsigned ? tcg_gen_shri_i32 : tcg_gen_sari_i32)(m, v, 16);
550 } else {
551 (is_unsigned ? tcg_gen_ext16u_i32 : tcg_gen_ext16s_i32)(m, v);
552 }
553 return m;
554}
555
Max Filippovb0b24bd2019-02-11 18:53:19 -0800556static void gen_zero_check(DisasContext *dc, const OpcodeArg arg[])
Max Filippov4a038952018-08-31 21:26:54 -0700557{
558 TCGLabel *label = gen_new_label();
559
Max Filippovb0b24bd2019-02-11 18:53:19 -0800560 tcg_gen_brcondi_i32(TCG_COND_NE, arg[2].in, 0, label);
Max Filippov4a038952018-08-31 21:26:54 -0700561 gen_exception_cause(dc, INTEGER_DIVIDE_BY_ZERO_CAUSE);
562 gen_set_label(label);
563}
564
Max Filippov33071f62017-11-03 19:44:46 -0700565static inline unsigned xtensa_op0_insn_len(DisasContext *dc, uint8_t op0)
Max Filippov01673a32014-12-14 07:50:55 +0300566{
Max Filippov33071f62017-11-03 19:44:46 -0700567 return xtensa_isa_length_from_chars(dc->config->isa, &op0);
Max Filippov01673a32014-12-14 07:50:55 +0300568}
569
Max Filippov45b71a72019-01-30 14:48:22 -0800570static int gen_postprocess(DisasContext *dc, int slot)
571{
572 uint32_t op_flags = dc->op_flags;
573
Max Filippov59419602019-03-18 17:10:38 -0700574#ifndef CONFIG_USER_ONLY
Max Filippov45b71a72019-01-30 14:48:22 -0800575 if (op_flags & XTENSA_OP_CHECK_INTERRUPTS) {
Richard Hendersondfd1b812023-05-22 23:08:01 -0700576 translator_io_start(&dc->base);
Richard Hendersonad75a512023-09-13 16:37:36 -0700577 gen_helper_check_interrupts(tcg_env);
Max Filippov45b71a72019-01-30 14:48:22 -0800578 }
Max Filippov59419602019-03-18 17:10:38 -0700579#endif
Max Filippov8df3fd32019-01-30 14:56:29 -0800580 if (op_flags & XTENSA_OP_SYNC_REGISTER_WINDOW) {
Richard Hendersonad75a512023-09-13 16:37:36 -0700581 gen_helper_sync_windowbase(tcg_env);
Max Filippov8df3fd32019-01-30 14:56:29 -0800582 }
Max Filippov45b71a72019-01-30 14:48:22 -0800583 if (op_flags & XTENSA_OP_EXIT_TB_M1) {
584 slot = -1;
585 }
586 return slot;
587}
588
Max Filippov89bec9e2019-02-12 19:10:24 -0800589struct opcode_arg_copy {
590 uint32_t resource;
591 void *temp;
592 OpcodeArg *arg;
593};
594
Max Filippov20e9fd02019-01-29 19:21:10 -0800595struct opcode_arg_info {
596 uint32_t resource;
597 int index;
598};
599
600struct slot_prop {
601 XtensaOpcodeOps *ops;
Max Filippovb0b24bd2019-02-11 18:53:19 -0800602 OpcodeArg arg[MAX_OPCODE_ARGS];
Max Filippov20e9fd02019-01-29 19:21:10 -0800603 struct opcode_arg_info in[MAX_OPCODE_ARGS];
604 struct opcode_arg_info out[MAX_OPCODE_ARGS];
605 unsigned n_in;
606 unsigned n_out;
607 uint32_t op_flags;
608};
609
610enum resource_type {
611 RES_REGFILE,
612 RES_STATE,
613 RES_MAX,
614};
615
616static uint32_t encode_resource(enum resource_type r, unsigned g, unsigned n)
617{
618 assert(r < RES_MAX && g < 256 && n < 65536);
619 return (r << 24) | (g << 16) | n;
620}
621
Max Filippov89bec9e2019-02-12 19:10:24 -0800622static enum resource_type get_resource_type(uint32_t resource)
623{
624 return resource >> 24;
625}
626
Max Filippov20e9fd02019-01-29 19:21:10 -0800627/*
628 * a depends on b if b must be executed before a,
629 * because a's side effects will destroy b's inputs.
630 */
631static bool op_depends_on(const struct slot_prop *a,
632 const struct slot_prop *b)
633{
634 unsigned i = 0;
635 unsigned j = 0;
636
637 if (a->op_flags & XTENSA_OP_CONTROL_FLOW) {
638 return true;
639 }
Max Filippov068e5382019-02-13 17:36:30 -0800640 if ((a->op_flags & XTENSA_OP_LOAD_STORE) <
641 (b->op_flags & XTENSA_OP_LOAD_STORE)) {
642 return true;
643 }
Max Filippov20e9fd02019-01-29 19:21:10 -0800644 while (i < a->n_out && j < b->n_in) {
645 if (a->out[i].resource < b->in[j].resource) {
646 ++i;
647 } else if (a->out[i].resource > b->in[j].resource) {
648 ++j;
649 } else {
650 return true;
651 }
652 }
653 return false;
654}
655
656/*
Max Filippov89bec9e2019-02-12 19:10:24 -0800657 * Try to break a dependency on b, append temporary register copy records
658 * to the end of copy and update n_copy in case of success.
659 * This is not always possible: e.g. control flow must always be the last,
660 * load/store must be first and state dependencies are not supported yet.
661 */
662static bool break_dependency(struct slot_prop *a,
663 struct slot_prop *b,
664 struct opcode_arg_copy *copy,
665 unsigned *n_copy)
666{
667 unsigned i = 0;
668 unsigned j = 0;
669 unsigned n = *n_copy;
670 bool rv = false;
671
672 if (a->op_flags & XTENSA_OP_CONTROL_FLOW) {
673 return false;
674 }
Max Filippov068e5382019-02-13 17:36:30 -0800675 if ((a->op_flags & XTENSA_OP_LOAD_STORE) <
676 (b->op_flags & XTENSA_OP_LOAD_STORE)) {
677 return false;
678 }
Max Filippov89bec9e2019-02-12 19:10:24 -0800679 while (i < a->n_out && j < b->n_in) {
680 if (a->out[i].resource < b->in[j].resource) {
681 ++i;
682 } else if (a->out[i].resource > b->in[j].resource) {
683 ++j;
684 } else {
685 int index = b->in[j].index;
686
687 if (get_resource_type(a->out[i].resource) != RES_REGFILE ||
688 index < 0) {
689 return false;
690 }
691 copy[n].resource = b->in[j].resource;
692 copy[n].arg = b->arg + index;
693 ++n;
Max Filippov89bec9e2019-02-12 19:10:24 -0800694 ++j;
695 rv = true;
696 }
697 }
698 *n_copy = n;
699 return rv;
700}
701
702/*
Max Filippov20e9fd02019-01-29 19:21:10 -0800703 * Calculate evaluation order for slot opcodes.
704 * Build opcode order graph and output its nodes in topological sort order.
705 * An edge a -> b in the graph means that opcode a must be followed by
706 * opcode b.
707 */
708static bool tsort(struct slot_prop *slot,
709 struct slot_prop *sorted[],
Max Filippov89bec9e2019-02-12 19:10:24 -0800710 unsigned n,
711 struct opcode_arg_copy *copy,
712 unsigned *n_copy)
Max Filippov20e9fd02019-01-29 19:21:10 -0800713{
714 struct tsnode {
715 unsigned n_in_edge;
716 unsigned n_out_edge;
717 unsigned out_edge[MAX_INSN_SLOTS];
718 } node[MAX_INSN_SLOTS];
719
720 unsigned in[MAX_INSN_SLOTS];
721 unsigned i, j;
722 unsigned n_in = 0;
723 unsigned n_out = 0;
724 unsigned n_edge = 0;
Max Filippov89bec9e2019-02-12 19:10:24 -0800725 unsigned in_idx = 0;
726 unsigned node_idx = 0;
Max Filippov20e9fd02019-01-29 19:21:10 -0800727
728 for (i = 0; i < n; ++i) {
729 node[i].n_in_edge = 0;
730 node[i].n_out_edge = 0;
731 }
732
733 for (i = 0; i < n; ++i) {
734 unsigned n_out_edge = 0;
735
736 for (j = 0; j < n; ++j) {
737 if (i != j && op_depends_on(slot + j, slot + i)) {
738 node[i].out_edge[n_out_edge] = j;
739 ++node[j].n_in_edge;
740 ++n_out_edge;
741 ++n_edge;
742 }
743 }
744 node[i].n_out_edge = n_out_edge;
745 }
746
747 for (i = 0; i < n; ++i) {
748 if (!node[i].n_in_edge) {
749 in[n_in] = i;
750 ++n_in;
751 }
752 }
753
Max Filippov89bec9e2019-02-12 19:10:24 -0800754again:
755 for (; in_idx < n_in; ++in_idx) {
Max Filippov20e9fd02019-01-29 19:21:10 -0800756 i = in[in_idx];
757 sorted[n_out] = slot + i;
758 ++n_out;
759 for (j = 0; j < node[i].n_out_edge; ++j) {
760 --n_edge;
761 if (--node[node[i].out_edge[j]].n_in_edge == 0) {
762 in[n_in] = node[i].out_edge[j];
763 ++n_in;
764 }
765 }
766 }
Max Filippov89bec9e2019-02-12 19:10:24 -0800767 if (n_edge) {
768 for (; node_idx < n; ++node_idx) {
769 struct tsnode *cnode = node + node_idx;
770
771 if (cnode->n_in_edge) {
772 for (j = 0; j < cnode->n_out_edge; ++j) {
773 unsigned k = cnode->out_edge[j];
774
775 if (break_dependency(slot + k, slot + node_idx,
776 copy, n_copy) &&
777 --node[k].n_in_edge == 0) {
778 in[n_in] = k;
779 ++n_in;
780 --n_edge;
781 cnode->out_edge[j] =
782 cnode->out_edge[cnode->n_out_edge - 1];
783 --cnode->n_out_edge;
784 goto again;
785 }
786 }
787 }
788 }
789 }
Max Filippov20e9fd02019-01-29 19:21:10 -0800790 return n_edge == 0;
791}
792
793static void opcode_add_resource(struct slot_prop *op,
794 uint32_t resource, char direction,
795 int index)
796{
797 switch (direction) {
798 case 'm':
799 case 'i':
800 assert(op->n_in < ARRAY_SIZE(op->in));
801 op->in[op->n_in].resource = resource;
802 op->in[op->n_in].index = index;
803 ++op->n_in;
804 /* fall through */
805 case 'o':
806 if (direction == 'm' || direction == 'o') {
807 assert(op->n_out < ARRAY_SIZE(op->out));
808 op->out[op->n_out].resource = resource;
809 op->out[op->n_out].index = index;
810 ++op->n_out;
811 }
812 break;
813 default:
814 g_assert_not_reached();
815 }
816}
817
818static int resource_compare(const void *a, const void *b)
819{
820 const struct opcode_arg_info *pa = a;
821 const struct opcode_arg_info *pb = b;
822
823 return pa->resource < pb->resource ?
824 -1 : (pa->resource > pb->resource ? 1 : 0);
825}
826
Max Filippov89bec9e2019-02-12 19:10:24 -0800827static int arg_copy_compare(const void *a, const void *b)
828{
829 const struct opcode_arg_copy *pa = a;
830 const struct opcode_arg_copy *pb = b;
831
832 return pa->resource < pb->resource ?
833 -1 : (pa->resource > pb->resource ? 1 : 0);
834}
835
Blue Swirl0c4fabe2012-09-08 13:09:07 +0000836static void disas_xtensa_insn(CPUXtensaState *env, DisasContext *dc)
Max Filippovdedc5ea2011-09-06 03:55:27 +0400837{
Max Filippov33071f62017-11-03 19:44:46 -0700838 xtensa_isa isa = dc->config->isa;
Ilya Leoshkevich4e116892021-08-09 12:32:59 -1000839 unsigned char b[MAX_INSN_LENGTH] = {translator_ldub(env, &dc->base,
840 dc->pc)};
Max Filippov33071f62017-11-03 19:44:46 -0700841 unsigned len = xtensa_op0_insn_len(dc, b[0]);
842 xtensa_format fmt;
Max Filippov847a6472018-01-18 10:08:49 -0800843 int slot, slots;
Max Filippov33071f62017-11-03 19:44:46 -0700844 unsigned i;
Max Filippov09460972018-08-27 21:43:43 -0700845 uint32_t op_flags = 0;
Max Filippov20e9fd02019-01-29 19:21:10 -0800846 struct slot_prop slot_prop[MAX_INSN_SLOTS];
847 struct slot_prop *ordered[MAX_INSN_SLOTS];
Max Filippov89bec9e2019-02-12 19:10:24 -0800848 struct opcode_arg_copy arg_copy[MAX_INSN_SLOTS * MAX_OPCODE_ARGS];
849 unsigned n_arg_copy = 0;
Max Filippov15477812018-08-28 14:52:27 -0700850 uint32_t debug_cause = 0;
Max Filippov6416d162018-08-29 10:37:29 -0700851 uint32_t windowed_register = 0;
Max Filippov582fef02018-08-31 13:57:08 -0700852 uint32_t coprocessor = 0;
Max Filippovdedc5ea2011-09-06 03:55:27 +0400853
Max Filippov33071f62017-11-03 19:44:46 -0700854 if (len == XTENSA_UNDEFINED) {
855 qemu_log_mask(LOG_GUEST_ERROR,
856 "unknown instruction length (pc = %08x)\n",
857 dc->pc);
858 gen_exception_cause(dc, ILLEGAL_INSTRUCTION_CAUSE);
Ilya Leoshkevichf689bef2021-04-16 17:49:38 +0200859 dc->base.pc_next = dc->pc + 1;
Max Filippov33071f62017-11-03 19:44:46 -0700860 return;
Max Filippovdedc5ea2011-09-06 03:55:27 +0400861 }
Max Filippov33071f62017-11-03 19:44:46 -0700862
Richard Henderson3cc18ee2018-05-12 10:57:22 -0700863 dc->base.pc_next = dc->pc + len;
Max Filippov33071f62017-11-03 19:44:46 -0700864 for (i = 1; i < len; ++i) {
Ilya Leoshkevich4e116892021-08-09 12:32:59 -1000865 b[i] = translator_ldub(env, &dc->base, dc->pc + i);
Max Filippovdedc5ea2011-09-06 03:55:27 +0400866 }
Max Filippov33071f62017-11-03 19:44:46 -0700867 xtensa_insnbuf_from_chars(isa, dc->insnbuf, b, len);
868 fmt = xtensa_format_decode(isa, dc->insnbuf);
869 if (fmt == XTENSA_UNDEFINED) {
870 qemu_log_mask(LOG_GUEST_ERROR,
871 "unrecognized instruction format (pc = %08x)\n",
872 dc->pc);
873 gen_exception_cause(dc, ILLEGAL_INSTRUCTION_CAUSE);
874 return;
875 }
876 slots = xtensa_format_num_slots(isa, fmt);
877 for (slot = 0; slot < slots; ++slot) {
878 xtensa_opcode opc;
Max Filippov847a6472018-01-18 10:08:49 -0800879 int opnd, vopnd, opnds;
Max Filippovb0b24bd2019-02-11 18:53:19 -0800880 OpcodeArg *arg = slot_prop[slot].arg;
Max Filippov33071f62017-11-03 19:44:46 -0700881 XtensaOpcodeOps *ops;
Max Filippovdedc5ea2011-09-06 03:55:27 +0400882
Max Filippov33071f62017-11-03 19:44:46 -0700883 xtensa_format_get_slot(isa, fmt, slot, dc->insnbuf, dc->slotbuf);
884 opc = xtensa_opcode_decode(isa, fmt, slot, dc->slotbuf);
885 if (opc == XTENSA_UNDEFINED) {
886 qemu_log_mask(LOG_GUEST_ERROR,
887 "unrecognized opcode in slot %d (pc = %08x)\n",
888 slot, dc->pc);
889 gen_exception_cause(dc, ILLEGAL_INSTRUCTION_CAUSE);
890 return;
891 }
892 opnds = xtensa_opcode_num_operands(isa, opc);
893
894 for (opnd = vopnd = 0; opnd < opnds; ++opnd) {
Max Filippovb0b24bd2019-02-11 18:53:19 -0800895 void **register_file = NULL;
Max Filippoved07f682020-01-25 00:53:39 -0800896 xtensa_regfile rf;
Max Filippovfe7869d2019-02-09 18:30:00 -0800897
Max Filippovb0b24bd2019-02-11 18:53:19 -0800898 if (xtensa_operand_is_register(isa, opc, opnd)) {
Max Filippoved07f682020-01-25 00:53:39 -0800899 rf = xtensa_operand_regfile(isa, opc, opnd);
Max Filippovb0b24bd2019-02-11 18:53:19 -0800900 register_file = dc->config->regfile[rf];
901
902 if (rf == dc->config->a_regfile) {
903 uint32_t v;
904
905 xtensa_operand_get_field(isa, opc, opnd, fmt, slot,
906 dc->slotbuf, &v);
907 xtensa_operand_decode(isa, opc, opnd, &v);
908 windowed_register |= 1u << v;
909 }
Max Filippovfe7869d2019-02-09 18:30:00 -0800910 }
Max Filippov33071f62017-11-03 19:44:46 -0700911 if (xtensa_operand_is_visible(isa, opc, opnd)) {
912 uint32_t v;
913
914 xtensa_operand_get_field(isa, opc, opnd, fmt, slot,
915 dc->slotbuf, &v);
916 xtensa_operand_decode(isa, opc, opnd, &v);
Max Filippovb0b24bd2019-02-11 18:53:19 -0800917 arg[vopnd].raw_imm = v;
Max Filippov33071f62017-11-03 19:44:46 -0700918 if (xtensa_operand_is_PCrelative(isa, opc, opnd)) {
919 xtensa_operand_undo_reloc(isa, opc, opnd, &v, dc->pc);
920 }
Max Filippovb0b24bd2019-02-11 18:53:19 -0800921 arg[vopnd].imm = v;
922 if (register_file) {
923 arg[vopnd].in = register_file[v];
924 arg[vopnd].out = register_file[v];
Max Filippoved07f682020-01-25 00:53:39 -0800925 arg[vopnd].num_bits = xtensa_regfile_num_bits(isa, rf);
926 } else {
927 arg[vopnd].num_bits = 32;
Max Filippovb0b24bd2019-02-11 18:53:19 -0800928 }
Max Filippov33071f62017-11-03 19:44:46 -0700929 ++vopnd;
930 }
931 }
932 ops = dc->config->opcode_ops[opc];
Max Filippov09460972018-08-27 21:43:43 -0700933 slot_prop[slot].ops = ops;
934
Max Filippov33071f62017-11-03 19:44:46 -0700935 if (ops) {
Max Filippov09460972018-08-27 21:43:43 -0700936 op_flags |= ops->op_flags;
Max Filippov91dc2b22020-05-04 14:08:40 -0700937 if (ops->test_exceptions) {
938 op_flags |= ops->test_exceptions(dc, arg, ops->par);
939 }
Max Filippov33071f62017-11-03 19:44:46 -0700940 } else {
Max Filippov09460972018-08-27 21:43:43 -0700941 qemu_log_mask(LOG_UNIMP,
Max Filippov33071f62017-11-03 19:44:46 -0700942 "unimplemented opcode '%s' in slot %d (pc = %08x)\n",
943 xtensa_opcode_name(isa, opc), slot, dc->pc);
Max Filippov09460972018-08-27 21:43:43 -0700944 op_flags |= XTENSA_OP_ILL;
945 }
Max Filippov91dc2b22020-05-04 14:08:40 -0700946 if (op_flags & XTENSA_OP_ILL) {
Max Filippov33071f62017-11-03 19:44:46 -0700947 gen_exception_cause(dc, ILLEGAL_INSTRUCTION_CAUSE);
948 return;
949 }
Max Filippov91dc2b22020-05-04 14:08:40 -0700950 if (op_flags & XTENSA_OP_DEBUG_BREAK) {
Max Filippov15477812018-08-28 14:52:27 -0700951 debug_cause |= ops->par[0];
952 }
Max Filippov6416d162018-08-29 10:37:29 -0700953 if (ops->test_overflow) {
954 windowed_register |= ops->test_overflow(dc, arg, ops->par);
955 }
Max Filippov582fef02018-08-31 13:57:08 -0700956 coprocessor |= ops->coprocessor;
Max Filippov20e9fd02019-01-29 19:21:10 -0800957
958 if (slots > 1) {
959 slot_prop[slot].n_in = 0;
960 slot_prop[slot].n_out = 0;
Max Filippov068e5382019-02-13 17:36:30 -0800961 slot_prop[slot].op_flags = ops->op_flags & XTENSA_OP_LOAD_STORE;
Max Filippov20e9fd02019-01-29 19:21:10 -0800962
963 opnds = xtensa_opcode_num_operands(isa, opc);
964
965 for (opnd = vopnd = 0; opnd < opnds; ++opnd) {
966 bool visible = xtensa_operand_is_visible(isa, opc, opnd);
967
968 if (xtensa_operand_is_register(isa, opc, opnd)) {
969 xtensa_regfile rf = xtensa_operand_regfile(isa, opc, opnd);
970 uint32_t v = 0;
971
972 xtensa_operand_get_field(isa, opc, opnd, fmt, slot,
973 dc->slotbuf, &v);
974 xtensa_operand_decode(isa, opc, opnd, &v);
975 opcode_add_resource(slot_prop + slot,
976 encode_resource(RES_REGFILE, rf, v),
977 xtensa_operand_inout(isa, opc, opnd),
978 visible ? vopnd : -1);
979 }
980 if (visible) {
981 ++vopnd;
982 }
983 }
984
985 opnds = xtensa_opcode_num_stateOperands(isa, opc);
986
987 for (opnd = 0; opnd < opnds; ++opnd) {
988 xtensa_state state = xtensa_stateOperand_state(isa, opc, opnd);
989
990 opcode_add_resource(slot_prop + slot,
991 encode_resource(RES_STATE, 0, state),
992 xtensa_stateOperand_inout(isa, opc, opnd),
993 -1);
994 }
995 if (xtensa_opcode_is_branch(isa, opc) ||
996 xtensa_opcode_is_jump(isa, opc) ||
997 xtensa_opcode_is_loop(isa, opc) ||
998 xtensa_opcode_is_call(isa, opc)) {
999 slot_prop[slot].op_flags |= XTENSA_OP_CONTROL_FLOW;
1000 }
1001
1002 qsort(slot_prop[slot].in, slot_prop[slot].n_in,
1003 sizeof(slot_prop[slot].in[0]), resource_compare);
1004 qsort(slot_prop[slot].out, slot_prop[slot].n_out,
1005 sizeof(slot_prop[slot].out[0]), resource_compare);
1006 }
1007 }
1008
1009 if (slots > 1) {
Max Filippov89bec9e2019-02-12 19:10:24 -08001010 if (!tsort(slot_prop, ordered, slots, arg_copy, &n_arg_copy)) {
Max Filippov20e9fd02019-01-29 19:21:10 -08001011 qemu_log_mask(LOG_UNIMP,
1012 "Circular resource dependencies (pc = %08x)\n",
1013 dc->pc);
1014 gen_exception_cause(dc, ILLEGAL_INSTRUCTION_CAUSE);
1015 return;
1016 }
1017 } else {
1018 ordered[0] = slot_prop + 0;
Max Filippov33071f62017-11-03 19:44:46 -07001019 }
Max Filippov09460972018-08-27 21:43:43 -07001020
Max Filippov21a2dad2018-08-27 22:17:50 -07001021 if ((op_flags & XTENSA_OP_PRIVILEGED) &&
1022 !gen_check_privilege(dc)) {
1023 return;
1024 }
1025
Max Filippov4c6ec5f2018-08-27 22:18:48 -07001026 if (op_flags & XTENSA_OP_SYSCALL) {
1027 gen_exception_cause(dc, SYSCALL_CAUSE);
1028 return;
1029 }
1030
Max Filippov15477812018-08-28 14:52:27 -07001031 if ((op_flags & XTENSA_OP_DEBUG_BREAK) && dc->debug) {
1032 gen_debug_exception(dc, debug_cause);
1033 return;
1034 }
1035
Max Filippov6416d162018-08-29 10:37:29 -07001036 if (windowed_register && !gen_window_check(dc, windowed_register)) {
1037 return;
1038 }
1039
Max Filippovf4730192018-08-30 17:55:33 -07001040 if (op_flags & XTENSA_OP_UNDERFLOW) {
Max Filippov6ade0ce2022-04-21 13:46:20 -07001041 TCGv_i32 pc = tcg_constant_i32(dc->pc);
Max Filippovf4730192018-08-30 17:55:33 -07001042
Richard Hendersonad75a512023-09-13 16:37:36 -07001043 gen_helper_test_underflow_retw(tcg_env, pc);
Max Filippovf4730192018-08-30 17:55:33 -07001044 }
1045
Max Filippov90d64942018-08-30 18:21:22 -07001046 if (op_flags & XTENSA_OP_ALLOCA) {
Max Filippov6ade0ce2022-04-21 13:46:20 -07001047 TCGv_i32 pc = tcg_constant_i32(dc->pc);
Max Filippov90d64942018-08-30 18:21:22 -07001048
Richard Hendersonad75a512023-09-13 16:37:36 -07001049 gen_helper_movsp(tcg_env, pc);
Max Filippov90d64942018-08-30 18:21:22 -07001050 }
1051
Max Filippov582fef02018-08-31 13:57:08 -07001052 if (coprocessor && !gen_check_cpenable(dc, coprocessor)) {
1053 return;
1054 }
1055
Max Filippov89bec9e2019-02-12 19:10:24 -08001056 if (n_arg_copy) {
1057 uint32_t resource;
1058 void *temp;
1059 unsigned j;
1060
1061 qsort(arg_copy, n_arg_copy, sizeof(*arg_copy), arg_copy_compare);
1062 for (i = j = 0; i < n_arg_copy; ++i) {
1063 if (i == 0 || arg_copy[i].resource != resource) {
1064 resource = arg_copy[i].resource;
Max Filippoved07f682020-01-25 00:53:39 -08001065 if (arg_copy[i].arg->num_bits <= 32) {
Richard Henderson177bbc82023-01-29 14:45:57 -10001066 temp = tcg_temp_new_i32();
Max Filippoved07f682020-01-25 00:53:39 -08001067 tcg_gen_mov_i32(temp, arg_copy[i].arg->in);
1068 } else if (arg_copy[i].arg->num_bits <= 64) {
Richard Henderson177bbc82023-01-29 14:45:57 -10001069 temp = tcg_temp_new_i64();
Max Filippoved07f682020-01-25 00:53:39 -08001070 tcg_gen_mov_i64(temp, arg_copy[i].arg->in);
1071 } else {
1072 g_assert_not_reached();
1073 }
Max Filippov89bec9e2019-02-12 19:10:24 -08001074 arg_copy[i].temp = temp;
1075
1076 if (i != j) {
1077 arg_copy[j] = arg_copy[i];
1078 }
1079 ++j;
1080 }
1081 arg_copy[i].arg->in = temp;
1082 }
1083 n_arg_copy = j;
1084 }
1085
Max Filippov4a038952018-08-31 21:26:54 -07001086 if (op_flags & XTENSA_OP_DIVIDE_BY_ZERO) {
1087 for (slot = 0; slot < slots; ++slot) {
1088 if (slot_prop[slot].ops->op_flags & XTENSA_OP_DIVIDE_BY_ZERO) {
1089 gen_zero_check(dc, slot_prop[slot].arg);
1090 }
1091 }
1092 }
1093
Max Filippov45b71a72019-01-30 14:48:22 -08001094 dc->op_flags = op_flags;
1095
Max Filippov09460972018-08-27 21:43:43 -07001096 for (slot = 0; slot < slots; ++slot) {
Max Filippov20e9fd02019-01-29 19:21:10 -08001097 struct slot_prop *pslot = ordered[slot];
1098 XtensaOpcodeOps *ops = pslot->ops;
Max Filippov09460972018-08-27 21:43:43 -07001099
Max Filippov20e9fd02019-01-29 19:21:10 -08001100 ops->translate(dc, pslot->arg, ops->par);
Max Filippov09460972018-08-27 21:43:43 -07001101 }
Max Filippov226444a2018-09-01 00:47:55 -07001102
1103 if (dc->base.is_jmp == DISAS_NEXT) {
Max Filippov45b71a72019-01-30 14:48:22 -08001104 gen_postprocess(dc, 0);
1105 dc->op_flags = 0;
Max Filippov226444a2018-09-01 00:47:55 -07001106 if (op_flags & XTENSA_OP_EXIT_TB_M1) {
1107 /* Change in mmu index, memory mapping or tb->flags; exit tb */
1108 gen_jumpi_check_loop_end(dc, -1);
Max Filippovbf525102018-09-01 00:47:55 -07001109 } else if (op_flags & XTENSA_OP_EXIT_TB_0) {
1110 gen_jumpi_check_loop_end(dc, 0);
Max Filippov45b71a72019-01-30 14:48:22 -08001111 } else {
1112 gen_check_loop_end(dc, 0);
Max Filippov226444a2018-09-01 00:47:55 -07001113 }
1114 }
Richard Henderson3cc18ee2018-05-12 10:57:22 -07001115 dc->pc = dc->base.pc_next;
Max Filippovdedc5ea2011-09-06 03:55:27 +04001116}
1117
Max Filippov01673a32014-12-14 07:50:55 +03001118static inline unsigned xtensa_insn_len(CPUXtensaState *env, DisasContext *dc)
1119{
Richard Hendersona41cd1e2024-04-04 23:53:24 -10001120 uint8_t b0 = translator_ldub(env, &dc->base, dc->pc);
Max Filippov33071f62017-11-03 19:44:46 -07001121 return xtensa_op0_insn_len(dc, b0);
Max Filippov01673a32014-12-14 07:50:55 +03001122}
1123
Richard Henderson9c509ff2018-05-12 10:57:24 -07001124static void xtensa_tr_init_disas_context(DisasContextBase *dcbase,
1125 CPUState *cpu)
Max Filippovdedc5ea2011-09-06 03:55:27 +04001126{
Richard Henderson9c509ff2018-05-12 10:57:24 -07001127 DisasContext *dc = container_of(dcbase, DisasContext, base);
Richard Henderson9c509ff2018-05-12 10:57:24 -07001128 uint32_t tb_flags = dc->base.tb->flags;
Max Filippovdedc5ea2011-09-06 03:55:27 +04001129
Philippe Mathieu-Daudé52049262024-01-29 17:45:10 +01001130 dc->config = cpu_env(cpu)->config;
Richard Henderson9c509ff2018-05-12 10:57:24 -07001131 dc->pc = dc->base.pc_first;
1132 dc->ring = tb_flags & XTENSA_TBFLAG_RING_MASK;
1133 dc->cring = (tb_flags & XTENSA_TBFLAG_EXCM) ? 0 : dc->ring;
Max Filippov5d630ce2018-10-03 15:59:11 -07001134 dc->lbeg_off = (dc->base.tb->cs_base & XTENSA_CSBASE_LBEG_OFF_MASK) >>
1135 XTENSA_CSBASE_LBEG_OFF_SHIFT;
1136 dc->lend = (dc->base.tb->cs_base & XTENSA_CSBASE_LEND_MASK) +
1137 (dc->base.pc_first & TARGET_PAGE_MASK);
Richard Henderson9c509ff2018-05-12 10:57:24 -07001138 dc->debug = tb_flags & XTENSA_TBFLAG_DEBUG;
1139 dc->icount = tb_flags & XTENSA_TBFLAG_ICOUNT;
1140 dc->cpenable = (tb_flags & XTENSA_TBFLAG_CPENABLE_MASK) >>
Max Filippovef04a842012-09-19 04:23:59 +04001141 XTENSA_TBFLAG_CPENABLE_SHIFT;
Richard Henderson9c509ff2018-05-12 10:57:24 -07001142 dc->window = ((tb_flags & XTENSA_TBFLAG_WINDOW_MASK) >>
Max Filippov2db59a72014-10-30 18:07:47 +03001143 XTENSA_TBFLAG_WINDOW_SHIFT);
Max Filippov09460972018-08-27 21:43:43 -07001144 dc->cwoe = tb_flags & XTENSA_TBFLAG_CWOE;
Max Filippov6416d162018-08-29 10:37:29 -07001145 dc->callinc = ((tb_flags & XTENSA_TBFLAG_CALLINC_MASK) >>
1146 XTENSA_TBFLAG_CALLINC_SHIFT);
Richard Henderson1d38a702018-05-12 10:57:23 -07001147 init_sar_tracker(dc);
Richard Henderson9c509ff2018-05-12 10:57:24 -07001148}
1149
1150static void xtensa_tr_tb_start(DisasContextBase *dcbase, CPUState *cpu)
1151{
1152 DisasContext *dc = container_of(dcbase, DisasContext, base);
1153
Richard Henderson1d38a702018-05-12 10:57:23 -07001154 if (dc->icount) {
Richard Henderson177bbc82023-01-29 14:45:57 -10001155 dc->next_icount = tcg_temp_new_i32();
Max Filippov35b5c042012-01-15 05:40:50 +04001156 }
Richard Henderson9c509ff2018-05-12 10:57:24 -07001157}
Max Filippov3580eca2011-09-06 03:55:35 +04001158
Richard Henderson9c509ff2018-05-12 10:57:24 -07001159static void xtensa_tr_insn_start(DisasContextBase *dcbase, CPUState *cpu)
1160{
1161 tcg_gen_insn_start(dcbase->pc_next);
1162}
Max Filippovdedc5ea2011-09-06 03:55:27 +04001163
Richard Henderson9c509ff2018-05-12 10:57:24 -07001164static void xtensa_tr_translate_insn(DisasContextBase *dcbase, CPUState *cpu)
1165{
1166 DisasContext *dc = container_of(dcbase, DisasContext, base);
Richard Hendersonb77af262023-09-13 17:22:49 -07001167 CPUXtensaState *env = cpu_env(cpu);
Richard Henderson9c509ff2018-05-12 10:57:24 -07001168 target_ulong page_start;
1169
1170 /* These two conditions only apply to the first insn in the TB,
1171 but this is the first TranslateOps hook that allows exiting. */
1172 if ((tb_cflags(dc->base.tb) & CF_USE_ICOUNT)
1173 && (dc->base.tb->flags & XTENSA_TBFLAG_YIELD)) {
Richard Henderson1d38a702018-05-12 10:57:23 -07001174 gen_exception(dc, EXCP_YIELD);
Ilya Leoshkevichf689bef2021-04-16 17:49:38 +02001175 dc->base.pc_next = dc->pc + 1;
Richard Henderson1d38a702018-05-12 10:57:23 -07001176 dc->base.is_jmp = DISAS_NORETURN;
Richard Henderson9c509ff2018-05-12 10:57:24 -07001177 return;
Max Filippovd2132512013-07-22 08:02:43 +04001178 }
Max Filippov40643d72011-09-06 03:55:41 +04001179
Richard Henderson1d38a702018-05-12 10:57:23 -07001180 if (dc->icount) {
Richard Henderson9c509ff2018-05-12 10:57:24 -07001181 TCGLabel *label = gen_new_label();
1182
1183 tcg_gen_addi_i32(dc->next_icount, cpu_SR[ICOUNT], 1);
1184 tcg_gen_brcondi_i32(TCG_COND_NE, dc->next_icount, 0, label);
1185 tcg_gen_mov_i32(dc->next_icount, cpu_SR[ICOUNT]);
1186 if (dc->debug) {
1187 gen_debug_exception(dc, DEBUGCAUSE_IC);
1188 }
1189 gen_set_label(label);
Max Filippov35b5c042012-01-15 05:40:50 +04001190 }
Richard Henderson9c509ff2018-05-12 10:57:24 -07001191
Richard Henderson9c509ff2018-05-12 10:57:24 -07001192 disas_xtensa_insn(env, dc);
1193
1194 if (dc->icount) {
1195 tcg_gen_mov_i32(cpu_SR[ICOUNT], dc->next_icount);
1196 }
1197
1198 /* End the TB if the next insn will cross into the next page. */
1199 page_start = dc->base.pc_first & TARGET_PAGE_MASK;
1200 if (dc->base.is_jmp == DISAS_NEXT &&
1201 (dc->pc - page_start >= TARGET_PAGE_SIZE ||
1202 dc->pc - page_start + xtensa_insn_len(env, dc) > TARGET_PAGE_SIZE)) {
1203 dc->base.is_jmp = DISAS_TOO_MANY;
1204 }
1205}
1206
1207static void xtensa_tr_tb_stop(DisasContextBase *dcbase, CPUState *cpu)
1208{
1209 DisasContext *dc = container_of(dcbase, DisasContext, base);
1210
Richard Henderson9c509ff2018-05-12 10:57:24 -07001211 switch (dc->base.is_jmp) {
1212 case DISAS_NORETURN:
1213 break;
1214 case DISAS_TOO_MANY:
Richard Henderson02bf7fa2021-07-19 15:02:11 -10001215 gen_jumpi(dc, dc->pc, 0);
Richard Henderson9c509ff2018-05-12 10:57:24 -07001216 break;
1217 default:
1218 g_assert_not_reached();
Max Filippovdedc5ea2011-09-06 03:55:27 +04001219 }
Richard Henderson9c509ff2018-05-12 10:57:24 -07001220}
Max Filippovdedc5ea2011-09-06 03:55:27 +04001221
Richard Henderson9c509ff2018-05-12 10:57:24 -07001222static const TranslatorOps xtensa_translator_ops = {
1223 .init_disas_context = xtensa_tr_init_disas_context,
1224 .tb_start = xtensa_tr_tb_start,
1225 .insn_start = xtensa_tr_insn_start,
Richard Henderson9c509ff2018-05-12 10:57:24 -07001226 .translate_insn = xtensa_tr_translate_insn,
1227 .tb_stop = xtensa_tr_tb_stop,
Richard Henderson9c509ff2018-05-12 10:57:24 -07001228};
1229
Richard Henderson597f9b22023-01-28 15:19:22 -10001230void gen_intermediate_code(CPUState *cpu, TranslationBlock *tb, int *max_insns,
Anton Johansson32f0c392024-01-19 15:39:58 +01001231 vaddr pc, void *host_pc)
Richard Henderson9c509ff2018-05-12 10:57:24 -07001232{
1233 DisasContext dc = {};
Richard Henderson306c8722022-08-11 13:48:03 -07001234 translator_loop(cpu, tb, max_insns, pc, host_pc,
1235 &xtensa_translator_ops, &dc.base);
Max Filippov23288262011-09-06 03:55:25 +04001236}
1237
Markus Armbruster90c84c52019-04-17 21:18:02 +02001238void xtensa_cpu_dump_state(CPUState *cs, FILE *f, int flags)
Max Filippov23288262011-09-06 03:55:25 +04001239{
Philippe Mathieu-Daudé52049262024-01-29 17:45:10 +01001240 CPUXtensaState *env = cpu_env(cs);
Max Filippov59419602019-03-18 17:10:38 -07001241 xtensa_isa isa = env->config->isa;
Max Filippov2af3da92011-09-06 03:55:33 +04001242 int i, j;
Max Filippov23288262011-09-06 03:55:25 +04001243
Markus Armbruster90c84c52019-04-17 21:18:02 +02001244 qemu_fprintf(f, "PC=%08x\n\n", env->pc);
Max Filippov2af3da92011-09-06 03:55:33 +04001245
Max Filippov59419602019-03-18 17:10:38 -07001246 for (i = j = 0; i < xtensa_isa_num_sysregs(isa); ++i) {
1247 const uint32_t *reg =
1248 xtensa_sysreg_is_user(isa, i) ? env->uregs : env->sregs;
1249 int regno = xtensa_sysreg_number(isa, i);
1250
1251 if (regno >= 0) {
Markus Armbruster90c84c52019-04-17 21:18:02 +02001252 qemu_fprintf(f, "%12s=%08x%c",
Max Filippov59419602019-03-18 17:10:38 -07001253 xtensa_sysreg_name(isa, i),
1254 reg[regno],
Markus Armbruster90c84c52019-04-17 21:18:02 +02001255 (j++ % 4) == 3 ? '\n' : ' ');
Max Filippov2af3da92011-09-06 03:55:33 +04001256 }
1257 }
1258
Markus Armbruster90c84c52019-04-17 21:18:02 +02001259 qemu_fprintf(f, (j % 4) == 0 ? "\n" : "\n\n");
Max Filippov23288262011-09-06 03:55:25 +04001260
1261 for (i = 0; i < 16; ++i) {
Markus Armbruster90c84c52019-04-17 21:18:02 +02001262 qemu_fprintf(f, " A%02d=%08x%c",
1263 i, env->regs[i], (i % 4) == 3 ? '\n' : ' ');
Max Filippov23288262011-09-06 03:55:25 +04001264 }
Max Filippov553e44f2011-09-06 03:55:43 +04001265
Max Filippovb55b1af2018-02-28 11:48:04 -08001266 xtensa_sync_phys_from_window(env);
Markus Armbruster90c84c52019-04-17 21:18:02 +02001267 qemu_fprintf(f, "\n");
Max Filippov553e44f2011-09-06 03:55:43 +04001268
1269 for (i = 0; i < env->config->nareg; ++i) {
Markus Armbruster90c84c52019-04-17 21:18:02 +02001270 qemu_fprintf(f, "AR%02d=%08x ", i, env->phys_regs[i]);
Max Filippovb9317a22018-02-04 13:22:46 -08001271 if (i % 4 == 3) {
1272 bool ws = (env->sregs[WINDOW_START] & (1 << (i / 4))) != 0;
1273 bool cw = env->sregs[WINDOW_BASE] == i / 4;
1274
Markus Armbruster90c84c52019-04-17 21:18:02 +02001275 qemu_fprintf(f, "%c%c\n", ws ? '<' : ' ', cw ? '=' : ' ');
Max Filippovb9317a22018-02-04 13:22:46 -08001276 }
Max Filippov553e44f2011-09-06 03:55:43 +04001277 }
Max Filippovdd519cb2012-09-19 04:23:54 +04001278
Richard Hendersonf29c0b12018-05-10 20:46:23 -07001279 if ((flags & CPU_DUMP_FPU) &&
1280 xtensa_option_enabled(env->config, XTENSA_OPTION_FP_COPROCESSOR)) {
Markus Armbruster90c84c52019-04-17 21:18:02 +02001281 qemu_fprintf(f, "\n");
Max Filippovdd519cb2012-09-19 04:23:54 +04001282
1283 for (i = 0; i < 16; ++i) {
Max Filippovcfa9f052020-06-30 19:27:02 -07001284 qemu_fprintf(f, "F%02d=%08x (%-+15.8e)%c", i,
Markus Armbruster90c84c52019-04-17 21:18:02 +02001285 float32_val(env->fregs[i].f32[FP_F32_LOW]),
1286 *(float *)(env->fregs[i].f32 + FP_F32_LOW),
1287 (i % 2) == 1 ? '\n' : ' ');
Max Filippovdd519cb2012-09-19 04:23:54 +04001288 }
1289 }
Max Filippovcfa9f052020-06-30 19:27:02 -07001290
1291 if ((flags & CPU_DUMP_FPU) &&
1292 xtensa_option_enabled(env->config, XTENSA_OPTION_DFP_COPROCESSOR) &&
1293 !xtensa_option_enabled(env->config, XTENSA_OPTION_DFPU_SINGLE_ONLY)) {
1294 qemu_fprintf(f, "\n");
1295
1296 for (i = 0; i < 16; ++i) {
1297 qemu_fprintf(f, "F%02d=%016"PRIx64" (%-+24.16le)%c", i,
1298 float64_val(env->fregs[i].f64),
1299 *(double *)(&env->fregs[i].f64),
1300 (i % 2) == 1 ? '\n' : ' ');
1301 }
1302 }
Max Filippov23288262011-09-06 03:55:25 +04001303}
1304
Max Filippovb0b24bd2019-02-11 18:53:19 -08001305static void translate_abs(DisasContext *dc, const OpcodeArg arg[],
Max Filippov168c12b2017-11-03 18:29:27 -07001306 const uint32_t par[])
1307{
Richard Hendersone1c47862019-04-17 14:01:23 -10001308 tcg_gen_abs_i32(arg[0].out, arg[1].in);
Max Filippov168c12b2017-11-03 18:29:27 -07001309}
1310
Max Filippovb0b24bd2019-02-11 18:53:19 -08001311static void translate_add(DisasContext *dc, const OpcodeArg arg[],
Max Filippov168c12b2017-11-03 18:29:27 -07001312 const uint32_t par[])
1313{
Max Filippovb0b24bd2019-02-11 18:53:19 -08001314 tcg_gen_add_i32(arg[0].out, arg[1].in, arg[2].in);
Max Filippov168c12b2017-11-03 18:29:27 -07001315}
1316
Max Filippovb0b24bd2019-02-11 18:53:19 -08001317static void translate_addi(DisasContext *dc, const OpcodeArg arg[],
Max Filippov168c12b2017-11-03 18:29:27 -07001318 const uint32_t par[])
1319{
Max Filippovb0b24bd2019-02-11 18:53:19 -08001320 tcg_gen_addi_i32(arg[0].out, arg[1].in, arg[2].imm);
Max Filippov168c12b2017-11-03 18:29:27 -07001321}
1322
Max Filippovb0b24bd2019-02-11 18:53:19 -08001323static void translate_addx(DisasContext *dc, const OpcodeArg arg[],
Max Filippov168c12b2017-11-03 18:29:27 -07001324 const uint32_t par[])
1325{
Max Filippov6416d162018-08-29 10:37:29 -07001326 TCGv_i32 tmp = tcg_temp_new_i32();
Max Filippovb0b24bd2019-02-11 18:53:19 -08001327 tcg_gen_shli_i32(tmp, arg[1].in, par[0]);
1328 tcg_gen_add_i32(arg[0].out, tmp, arg[2].in);
Max Filippov168c12b2017-11-03 18:29:27 -07001329}
1330
Max Filippovb0b24bd2019-02-11 18:53:19 -08001331static void translate_all(DisasContext *dc, const OpcodeArg arg[],
Max Filippov168c12b2017-11-03 18:29:27 -07001332 const uint32_t par[])
1333{
1334 uint32_t shift = par[1];
Richard Hendersonb6611d82023-02-26 13:21:36 -10001335 TCGv_i32 mask = tcg_constant_i32(((1 << shift) - 1) << arg[1].imm);
Max Filippov168c12b2017-11-03 18:29:27 -07001336 TCGv_i32 tmp = tcg_temp_new_i32();
1337
Max Filippov575e9622019-02-14 13:27:50 -08001338 tcg_gen_and_i32(tmp, arg[1].in, mask);
Max Filippov168c12b2017-11-03 18:29:27 -07001339 if (par[0]) {
Max Filippovb0b24bd2019-02-11 18:53:19 -08001340 tcg_gen_addi_i32(tmp, tmp, 1 << arg[1].imm);
Max Filippov168c12b2017-11-03 18:29:27 -07001341 } else {
1342 tcg_gen_add_i32(tmp, tmp, mask);
1343 }
Max Filippovb0b24bd2019-02-11 18:53:19 -08001344 tcg_gen_shri_i32(tmp, tmp, arg[1].imm + shift);
Max Filippov575e9622019-02-14 13:27:50 -08001345 tcg_gen_deposit_i32(arg[0].out, arg[0].out,
Max Filippovb0b24bd2019-02-11 18:53:19 -08001346 tmp, arg[0].imm, 1);
Max Filippov168c12b2017-11-03 18:29:27 -07001347}
1348
Max Filippovb0b24bd2019-02-11 18:53:19 -08001349static void translate_and(DisasContext *dc, const OpcodeArg arg[],
Max Filippov168c12b2017-11-03 18:29:27 -07001350 const uint32_t par[])
1351{
Max Filippovb0b24bd2019-02-11 18:53:19 -08001352 tcg_gen_and_i32(arg[0].out, arg[1].in, arg[2].in);
Max Filippov168c12b2017-11-03 18:29:27 -07001353}
1354
Max Filippovb0b24bd2019-02-11 18:53:19 -08001355static void translate_ball(DisasContext *dc, const OpcodeArg arg[],
Max Filippov168c12b2017-11-03 18:29:27 -07001356 const uint32_t par[])
1357{
Max Filippov6416d162018-08-29 10:37:29 -07001358 TCGv_i32 tmp = tcg_temp_new_i32();
Max Filippovb0b24bd2019-02-11 18:53:19 -08001359 tcg_gen_and_i32(tmp, arg[0].in, arg[1].in);
1360 gen_brcond(dc, par[0], tmp, arg[1].in, arg[2].imm);
Max Filippov168c12b2017-11-03 18:29:27 -07001361}
1362
Max Filippovb0b24bd2019-02-11 18:53:19 -08001363static void translate_bany(DisasContext *dc, const OpcodeArg arg[],
Max Filippov168c12b2017-11-03 18:29:27 -07001364 const uint32_t par[])
1365{
Max Filippov6416d162018-08-29 10:37:29 -07001366 TCGv_i32 tmp = tcg_temp_new_i32();
Max Filippovb0b24bd2019-02-11 18:53:19 -08001367 tcg_gen_and_i32(tmp, arg[0].in, arg[1].in);
1368 gen_brcondi(dc, par[0], tmp, 0, arg[2].imm);
Max Filippov168c12b2017-11-03 18:29:27 -07001369}
1370
Max Filippovb0b24bd2019-02-11 18:53:19 -08001371static void translate_b(DisasContext *dc, const OpcodeArg arg[],
Max Filippov168c12b2017-11-03 18:29:27 -07001372 const uint32_t par[])
1373{
Max Filippovb0b24bd2019-02-11 18:53:19 -08001374 gen_brcond(dc, par[0], arg[0].in, arg[1].in, arg[2].imm);
Max Filippov168c12b2017-11-03 18:29:27 -07001375}
1376
Max Filippovb0b24bd2019-02-11 18:53:19 -08001377static void translate_bb(DisasContext *dc, const OpcodeArg arg[],
Max Filippov168c12b2017-11-03 18:29:27 -07001378 const uint32_t par[])
1379{
Max Filippov6416d162018-08-29 10:37:29 -07001380 TCGv_i32 tmp = tcg_temp_new_i32();
Richard Henderson37d73282023-02-26 12:56:56 -10001381
Max Filippovb0b24bd2019-02-11 18:53:19 -08001382 tcg_gen_andi_i32(tmp, arg[1].in, 0x1f);
Richard Henderson37d73282023-02-26 12:56:56 -10001383 if (TARGET_BIG_ENDIAN) {
1384 tcg_gen_shr_i32(tmp, tcg_constant_i32(0x80000000u), tmp);
1385 } else {
1386 tcg_gen_shl_i32(tmp, tcg_constant_i32(0x00000001u), tmp);
1387 }
1388 tcg_gen_and_i32(tmp, arg[0].in, tmp);
Max Filippovb0b24bd2019-02-11 18:53:19 -08001389 gen_brcondi(dc, par[0], tmp, 0, arg[2].imm);
Max Filippov168c12b2017-11-03 18:29:27 -07001390}
1391
Max Filippovb0b24bd2019-02-11 18:53:19 -08001392static void translate_bbi(DisasContext *dc, const OpcodeArg arg[],
Max Filippov168c12b2017-11-03 18:29:27 -07001393 const uint32_t par[])
1394{
Max Filippov6416d162018-08-29 10:37:29 -07001395 TCGv_i32 tmp = tcg_temp_new_i32();
Marc-André Lureauee3eb3a2022-03-23 19:57:18 +04001396#if TARGET_BIG_ENDIAN
Max Filippovb0b24bd2019-02-11 18:53:19 -08001397 tcg_gen_andi_i32(tmp, arg[0].in, 0x80000000u >> arg[1].imm);
Max Filippov168c12b2017-11-03 18:29:27 -07001398#else
Max Filippovb0b24bd2019-02-11 18:53:19 -08001399 tcg_gen_andi_i32(tmp, arg[0].in, 0x00000001u << arg[1].imm);
Max Filippov168c12b2017-11-03 18:29:27 -07001400#endif
Max Filippovb0b24bd2019-02-11 18:53:19 -08001401 gen_brcondi(dc, par[0], tmp, 0, arg[2].imm);
Max Filippov168c12b2017-11-03 18:29:27 -07001402}
1403
Max Filippovb0b24bd2019-02-11 18:53:19 -08001404static void translate_bi(DisasContext *dc, const OpcodeArg arg[],
Max Filippov168c12b2017-11-03 18:29:27 -07001405 const uint32_t par[])
1406{
Max Filippovb0b24bd2019-02-11 18:53:19 -08001407 gen_brcondi(dc, par[0], arg[0].in, arg[1].imm, arg[2].imm);
Max Filippov168c12b2017-11-03 18:29:27 -07001408}
1409
Max Filippovb0b24bd2019-02-11 18:53:19 -08001410static void translate_bz(DisasContext *dc, const OpcodeArg arg[],
Max Filippov168c12b2017-11-03 18:29:27 -07001411 const uint32_t par[])
1412{
Max Filippovb0b24bd2019-02-11 18:53:19 -08001413 gen_brcondi(dc, par[0], arg[0].in, 0, arg[1].imm);
Max Filippov168c12b2017-11-03 18:29:27 -07001414}
1415
1416enum {
1417 BOOLEAN_AND,
1418 BOOLEAN_ANDC,
1419 BOOLEAN_OR,
1420 BOOLEAN_ORC,
1421 BOOLEAN_XOR,
1422};
1423
Max Filippovb0b24bd2019-02-11 18:53:19 -08001424static void translate_boolean(DisasContext *dc, const OpcodeArg arg[],
Max Filippov168c12b2017-11-03 18:29:27 -07001425 const uint32_t par[])
1426{
1427 static void (* const op[])(TCGv_i32, TCGv_i32, TCGv_i32) = {
1428 [BOOLEAN_AND] = tcg_gen_and_i32,
1429 [BOOLEAN_ANDC] = tcg_gen_andc_i32,
1430 [BOOLEAN_OR] = tcg_gen_or_i32,
1431 [BOOLEAN_ORC] = tcg_gen_orc_i32,
1432 [BOOLEAN_XOR] = tcg_gen_xor_i32,
1433 };
1434
1435 TCGv_i32 tmp1 = tcg_temp_new_i32();
1436 TCGv_i32 tmp2 = tcg_temp_new_i32();
1437
Max Filippov575e9622019-02-14 13:27:50 -08001438 tcg_gen_shri_i32(tmp1, arg[1].in, arg[1].imm);
1439 tcg_gen_shri_i32(tmp2, arg[2].in, arg[2].imm);
Max Filippov168c12b2017-11-03 18:29:27 -07001440 op[par[0]](tmp1, tmp1, tmp2);
Max Filippov575e9622019-02-14 13:27:50 -08001441 tcg_gen_deposit_i32(arg[0].out, arg[0].out, tmp1, arg[0].imm, 1);
Max Filippov168c12b2017-11-03 18:29:27 -07001442}
1443
Max Filippovb0b24bd2019-02-11 18:53:19 -08001444static void translate_bp(DisasContext *dc, const OpcodeArg arg[],
Max Filippov168c12b2017-11-03 18:29:27 -07001445 const uint32_t par[])
1446{
1447 TCGv_i32 tmp = tcg_temp_new_i32();
1448
Max Filippov575e9622019-02-14 13:27:50 -08001449 tcg_gen_andi_i32(tmp, arg[0].in, 1 << arg[0].imm);
Max Filippovb0b24bd2019-02-11 18:53:19 -08001450 gen_brcondi(dc, par[0], tmp, 0, arg[1].imm);
Max Filippov168c12b2017-11-03 18:29:27 -07001451}
1452
Max Filippovb0b24bd2019-02-11 18:53:19 -08001453static void translate_call0(DisasContext *dc, const OpcodeArg arg[],
Max Filippov168c12b2017-11-03 18:29:27 -07001454 const uint32_t par[])
1455{
Richard Henderson3cc18ee2018-05-12 10:57:22 -07001456 tcg_gen_movi_i32(cpu_R[0], dc->base.pc_next);
Max Filippovb0b24bd2019-02-11 18:53:19 -08001457 gen_jumpi(dc, arg[0].imm, 0);
Max Filippov168c12b2017-11-03 18:29:27 -07001458}
1459
Max Filippovb0b24bd2019-02-11 18:53:19 -08001460static void translate_callw(DisasContext *dc, const OpcodeArg arg[],
Max Filippov168c12b2017-11-03 18:29:27 -07001461 const uint32_t par[])
1462{
Richard Hendersonb6611d82023-02-26 13:21:36 -10001463 TCGv_i32 tmp = tcg_constant_i32(arg[0].imm);
Max Filippovb0b24bd2019-02-11 18:53:19 -08001464 gen_callw_slot(dc, par[0], tmp, adjust_jump_slot(dc, arg[0].imm, 0));
Max Filippov168c12b2017-11-03 18:29:27 -07001465}
1466
Max Filippovb0b24bd2019-02-11 18:53:19 -08001467static void translate_callx0(DisasContext *dc, const OpcodeArg arg[],
Max Filippov168c12b2017-11-03 18:29:27 -07001468 const uint32_t par[])
1469{
Max Filippov6416d162018-08-29 10:37:29 -07001470 TCGv_i32 tmp = tcg_temp_new_i32();
Max Filippovb0b24bd2019-02-11 18:53:19 -08001471 tcg_gen_mov_i32(tmp, arg[0].in);
Max Filippov6416d162018-08-29 10:37:29 -07001472 tcg_gen_movi_i32(cpu_R[0], dc->base.pc_next);
1473 gen_jump(dc, tmp);
Max Filippov168c12b2017-11-03 18:29:27 -07001474}
1475
Max Filippovb0b24bd2019-02-11 18:53:19 -08001476static void translate_callxw(DisasContext *dc, const OpcodeArg arg[],
Max Filippov168c12b2017-11-03 18:29:27 -07001477 const uint32_t par[])
1478{
Max Filippov6416d162018-08-29 10:37:29 -07001479 TCGv_i32 tmp = tcg_temp_new_i32();
Max Filippov168c12b2017-11-03 18:29:27 -07001480
Max Filippovb0b24bd2019-02-11 18:53:19 -08001481 tcg_gen_mov_i32(tmp, arg[0].in);
Max Filippov9791e7e2019-02-11 02:00:06 -08001482 gen_callw_slot(dc, par[0], tmp, -1);
Max Filippov168c12b2017-11-03 18:29:27 -07001483}
1484
Max Filippovb0b24bd2019-02-11 18:53:19 -08001485static void translate_clamps(DisasContext *dc, const OpcodeArg arg[],
Max Filippov168c12b2017-11-03 18:29:27 -07001486 const uint32_t par[])
1487{
Richard Hendersonbc026472023-02-26 12:58:20 -10001488 TCGv_i32 tmp1 = tcg_constant_i32(-1u << arg[2].imm);
1489 TCGv_i32 tmp2 = tcg_constant_i32((1 << arg[2].imm) - 1);
Max Filippov168c12b2017-11-03 18:29:27 -07001490
Richard Hendersonbc026472023-02-26 12:58:20 -10001491 tcg_gen_smax_i32(arg[0].out, tmp1, arg[1].in);
1492 tcg_gen_smin_i32(arg[0].out, arg[0].out, tmp2);
Max Filippov168c12b2017-11-03 18:29:27 -07001493}
1494
Max Filippovb0b24bd2019-02-11 18:53:19 -08001495static void translate_clrb_expstate(DisasContext *dc, const OpcodeArg arg[],
Max Filippove9872742017-02-17 16:21:36 -08001496 const uint32_t par[])
1497{
1498 /* TODO: GPIO32 may be a part of coprocessor */
Max Filippovb0b24bd2019-02-11 18:53:19 -08001499 tcg_gen_andi_i32(cpu_UR[EXPSTATE], cpu_UR[EXPSTATE], ~(1u << arg[0].imm));
Max Filippove9872742017-02-17 16:21:36 -08001500}
1501
Max Filippovb345e142019-04-18 16:37:00 -07001502static void translate_clrex(DisasContext *dc, const OpcodeArg arg[],
1503 const uint32_t par[])
1504{
1505 tcg_gen_movi_i32(cpu_exclusive_addr, -1);
1506}
1507
Max Filippovb0b24bd2019-02-11 18:53:19 -08001508static void translate_const16(DisasContext *dc, const OpcodeArg arg[],
Max Filippovc5ac9362017-11-02 15:05:56 -07001509 const uint32_t par[])
1510{
Richard Hendersonb6611d82023-02-26 13:21:36 -10001511 TCGv_i32 c = tcg_constant_i32(arg[1].imm);
Max Filippovc5ac9362017-11-02 15:05:56 -07001512
Max Filippovb0b24bd2019-02-11 18:53:19 -08001513 tcg_gen_deposit_i32(arg[0].out, c, arg[0].in, 16, 16);
Max Filippovc5ac9362017-11-02 15:05:56 -07001514}
1515
Max Filippovb0b24bd2019-02-11 18:53:19 -08001516static void translate_dcache(DisasContext *dc, const OpcodeArg arg[],
Max Filippov168c12b2017-11-03 18:29:27 -07001517 const uint32_t par[])
1518{
Max Filippov6416d162018-08-29 10:37:29 -07001519 TCGv_i32 addr = tcg_temp_new_i32();
1520 TCGv_i32 res = tcg_temp_new_i32();
Max Filippov168c12b2017-11-03 18:29:27 -07001521
Max Filippovb0b24bd2019-02-11 18:53:19 -08001522 tcg_gen_addi_i32(addr, arg[0].in, arg[1].imm);
Richard Hendersonf0aca2a2023-05-02 14:57:40 +01001523 tcg_gen_qemu_ld_i32(res, addr, dc->cring, MO_UB);
Max Filippov168c12b2017-11-03 18:29:27 -07001524}
1525
Max Filippovb0b24bd2019-02-11 18:53:19 -08001526static void translate_depbits(DisasContext *dc, const OpcodeArg arg[],
Max Filippov168c12b2017-11-03 18:29:27 -07001527 const uint32_t par[])
1528{
Max Filippovb0b24bd2019-02-11 18:53:19 -08001529 tcg_gen_deposit_i32(arg[1].out, arg[1].in, arg[0].in,
1530 arg[2].imm, arg[3].imm);
Max Filippov168c12b2017-11-03 18:29:27 -07001531}
1532
Max Filippov75eed0e2019-04-14 14:02:17 -07001533static void translate_diwbuip(DisasContext *dc, const OpcodeArg arg[],
1534 const uint32_t par[])
1535{
1536 tcg_gen_addi_i32(arg[0].out, arg[0].in, dc->config->dcache_line_bytes);
1537}
1538
Max Filippov91dc2b22020-05-04 14:08:40 -07001539static uint32_t test_exceptions_entry(DisasContext *dc, const OpcodeArg arg[],
1540 const uint32_t par[])
Max Filippov09460972018-08-27 21:43:43 -07001541{
Max Filippovb0b24bd2019-02-11 18:53:19 -08001542 if (arg[0].imm > 3 || !dc->cwoe) {
Max Filippov09460972018-08-27 21:43:43 -07001543 qemu_log_mask(LOG_GUEST_ERROR,
1544 "Illegal entry instruction(pc = %08x)\n", dc->pc);
Max Filippov91dc2b22020-05-04 14:08:40 -07001545 return XTENSA_OP_ILL;
Max Filippov09460972018-08-27 21:43:43 -07001546 } else {
Max Filippov91dc2b22020-05-04 14:08:40 -07001547 return 0;
Max Filippov09460972018-08-27 21:43:43 -07001548 }
1549}
1550
Max Filippovb0b24bd2019-02-11 18:53:19 -08001551static uint32_t test_overflow_entry(DisasContext *dc, const OpcodeArg arg[],
Max Filippov6416d162018-08-29 10:37:29 -07001552 const uint32_t par[])
1553{
1554 return 1 << (dc->callinc * 4);
1555}
1556
Max Filippovb0b24bd2019-02-11 18:53:19 -08001557static void translate_entry(DisasContext *dc, const OpcodeArg arg[],
Max Filippov168c12b2017-11-03 18:29:27 -07001558 const uint32_t par[])
1559{
Max Filippov6ade0ce2022-04-21 13:46:20 -07001560 TCGv_i32 pc = tcg_constant_i32(dc->pc);
1561 TCGv_i32 s = tcg_constant_i32(arg[0].imm);
1562 TCGv_i32 imm = tcg_constant_i32(arg[1].imm);
Richard Hendersonad75a512023-09-13 16:37:36 -07001563 gen_helper_entry(tcg_env, pc, s, imm);
Max Filippov168c12b2017-11-03 18:29:27 -07001564}
1565
Max Filippovb0b24bd2019-02-11 18:53:19 -08001566static void translate_extui(DisasContext *dc, const OpcodeArg arg[],
Max Filippov168c12b2017-11-03 18:29:27 -07001567 const uint32_t par[])
1568{
Max Filippovb0b24bd2019-02-11 18:53:19 -08001569 int maskimm = (1 << arg[3].imm) - 1;
Max Filippov168c12b2017-11-03 18:29:27 -07001570
Max Filippov6416d162018-08-29 10:37:29 -07001571 TCGv_i32 tmp = tcg_temp_new_i32();
Max Filippovb0b24bd2019-02-11 18:53:19 -08001572 tcg_gen_shri_i32(tmp, arg[1].in, arg[2].imm);
1573 tcg_gen_andi_i32(arg[0].out, tmp, maskimm);
Max Filippov168c12b2017-11-03 18:29:27 -07001574}
1575
Max Filippovb345e142019-04-18 16:37:00 -07001576static void translate_getex(DisasContext *dc, const OpcodeArg arg[],
1577 const uint32_t par[])
1578{
1579 TCGv_i32 tmp = tcg_temp_new_i32();
1580
1581 tcg_gen_extract_i32(tmp, cpu_SR[ATOMCTL], 8, 1);
1582 tcg_gen_deposit_i32(cpu_SR[ATOMCTL], cpu_SR[ATOMCTL], arg[0].in, 8, 1);
1583 tcg_gen_mov_i32(arg[0].out, tmp);
Max Filippovb345e142019-04-18 16:37:00 -07001584}
1585
Max Filippovb0b24bd2019-02-11 18:53:19 -08001586static void translate_icache(DisasContext *dc, const OpcodeArg arg[],
Max Filippov168c12b2017-11-03 18:29:27 -07001587 const uint32_t par[])
1588{
Max Filippovba7651f2017-01-25 10:54:11 -08001589#ifndef CONFIG_USER_ONLY
Max Filippov6416d162018-08-29 10:37:29 -07001590 TCGv_i32 addr = tcg_temp_new_i32();
Max Filippov168c12b2017-11-03 18:29:27 -07001591
Max Filippov6416d162018-08-29 10:37:29 -07001592 tcg_gen_movi_i32(cpu_pc, dc->pc);
Max Filippovb0b24bd2019-02-11 18:53:19 -08001593 tcg_gen_addi_i32(addr, arg[0].in, arg[1].imm);
Richard Hendersonad75a512023-09-13 16:37:36 -07001594 gen_helper_itlb_hit_test(tcg_env, addr);
Max Filippovba7651f2017-01-25 10:54:11 -08001595#endif
Max Filippov168c12b2017-11-03 18:29:27 -07001596}
1597
Max Filippovb0b24bd2019-02-11 18:53:19 -08001598static void translate_itlb(DisasContext *dc, const OpcodeArg arg[],
Max Filippov168c12b2017-11-03 18:29:27 -07001599 const uint32_t par[])
1600{
Max Filippovba7651f2017-01-25 10:54:11 -08001601#ifndef CONFIG_USER_ONLY
Max Filippov4ee412d2022-04-21 13:38:58 -07001602 TCGv_i32 dtlb = tcg_constant_i32(par[0]);
Max Filippov168c12b2017-11-03 18:29:27 -07001603
Richard Hendersonad75a512023-09-13 16:37:36 -07001604 gen_helper_itlb(tcg_env, arg[0].in, dtlb);
Max Filippovba7651f2017-01-25 10:54:11 -08001605#endif
Max Filippov168c12b2017-11-03 18:29:27 -07001606}
1607
Max Filippovb0b24bd2019-02-11 18:53:19 -08001608static void translate_j(DisasContext *dc, const OpcodeArg arg[],
Max Filippov168c12b2017-11-03 18:29:27 -07001609 const uint32_t par[])
1610{
Max Filippovb0b24bd2019-02-11 18:53:19 -08001611 gen_jumpi(dc, arg[0].imm, 0);
Max Filippov168c12b2017-11-03 18:29:27 -07001612}
1613
Max Filippovb0b24bd2019-02-11 18:53:19 -08001614static void translate_jx(DisasContext *dc, const OpcodeArg arg[],
Max Filippov168c12b2017-11-03 18:29:27 -07001615 const uint32_t par[])
1616{
Max Filippovb0b24bd2019-02-11 18:53:19 -08001617 gen_jump(dc, arg[0].in);
Max Filippov168c12b2017-11-03 18:29:27 -07001618}
1619
Max Filippovb0b24bd2019-02-11 18:53:19 -08001620static void translate_l32e(DisasContext *dc, const OpcodeArg arg[],
Max Filippov168c12b2017-11-03 18:29:27 -07001621 const uint32_t par[])
1622{
Max Filippov6416d162018-08-29 10:37:29 -07001623 TCGv_i32 addr = tcg_temp_new_i32();
Max Filippov583e6a52021-05-17 12:31:08 -07001624 MemOp mop;
Max Filippov168c12b2017-11-03 18:29:27 -07001625
Max Filippovb0b24bd2019-02-11 18:53:19 -08001626 tcg_gen_addi_i32(addr, arg[1].in, arg[2].imm);
Max Filippov583e6a52021-05-17 12:31:08 -07001627 mop = gen_load_store_alignment(dc, MO_TEUL, addr);
1628 tcg_gen_qemu_ld_tl(arg[0].out, addr, dc->ring, mop);
Max Filippov168c12b2017-11-03 18:29:27 -07001629}
1630
Max Filippovb345e142019-04-18 16:37:00 -07001631#ifdef CONFIG_USER_ONLY
1632static void gen_check_exclusive(DisasContext *dc, TCGv_i32 addr, bool is_write)
1633{
1634}
1635#else
1636static void gen_check_exclusive(DisasContext *dc, TCGv_i32 addr, bool is_write)
1637{
1638 if (!option_enabled(dc, XTENSA_OPTION_MPU)) {
Max Filippov6ade0ce2022-04-21 13:46:20 -07001639 TCGv_i32 pc = tcg_constant_i32(dc->pc);
Max Filippovb345e142019-04-18 16:37:00 -07001640
Richard Hendersonad75a512023-09-13 16:37:36 -07001641 gen_helper_check_exclusive(tcg_env, pc, addr,
Max Filippov6ade0ce2022-04-21 13:46:20 -07001642 tcg_constant_i32(is_write));
Max Filippovb345e142019-04-18 16:37:00 -07001643 }
1644}
1645#endif
1646
1647static void translate_l32ex(DisasContext *dc, const OpcodeArg arg[],
1648 const uint32_t par[])
1649{
1650 TCGv_i32 addr = tcg_temp_new_i32();
Max Filippov583e6a52021-05-17 12:31:08 -07001651 MemOp mop;
Max Filippovb345e142019-04-18 16:37:00 -07001652
1653 tcg_gen_mov_i32(addr, arg[1].in);
Max Filippov583e6a52021-05-17 12:31:08 -07001654 mop = gen_load_store_alignment(dc, MO_TEUL | MO_ALIGN, addr);
Max Filippovb345e142019-04-18 16:37:00 -07001655 gen_check_exclusive(dc, addr, false);
Max Filippov583e6a52021-05-17 12:31:08 -07001656 tcg_gen_qemu_ld_i32(arg[0].out, addr, dc->cring, mop);
Max Filippovb345e142019-04-18 16:37:00 -07001657 tcg_gen_mov_i32(cpu_exclusive_addr, addr);
1658 tcg_gen_mov_i32(cpu_exclusive_val, arg[0].out);
Max Filippovb345e142019-04-18 16:37:00 -07001659}
1660
Max Filippovb0b24bd2019-02-11 18:53:19 -08001661static void translate_ldst(DisasContext *dc, const OpcodeArg arg[],
Max Filippov168c12b2017-11-03 18:29:27 -07001662 const uint32_t par[])
1663{
Max Filippov6416d162018-08-29 10:37:29 -07001664 TCGv_i32 addr = tcg_temp_new_i32();
Max Filippov583e6a52021-05-17 12:31:08 -07001665 MemOp mop;
Max Filippov168c12b2017-11-03 18:29:27 -07001666
Max Filippovb0b24bd2019-02-11 18:53:19 -08001667 tcg_gen_addi_i32(addr, arg[1].in, arg[2].imm);
Max Filippov583e6a52021-05-17 12:31:08 -07001668 mop = gen_load_store_alignment(dc, par[0], addr);
1669
Max Filippov6416d162018-08-29 10:37:29 -07001670 if (par[2]) {
1671 if (par[1]) {
1672 tcg_gen_mb(TCG_BAR_STRL | TCG_MO_ALL);
1673 }
Max Filippov583e6a52021-05-17 12:31:08 -07001674 tcg_gen_qemu_st_tl(arg[0].in, addr, dc->cring, mop);
Max Filippov6416d162018-08-29 10:37:29 -07001675 } else {
Max Filippov583e6a52021-05-17 12:31:08 -07001676 tcg_gen_qemu_ld_tl(arg[0].out, addr, dc->cring, mop);
Max Filippov6416d162018-08-29 10:37:29 -07001677 if (par[1]) {
1678 tcg_gen_mb(TCG_BAR_LDAQ | TCG_MO_ALL);
1679 }
1680 }
Max Filippov168c12b2017-11-03 18:29:27 -07001681}
1682
Max Filippov59491e92022-05-01 22:57:49 -07001683static void translate_lct(DisasContext *dc, const OpcodeArg arg[],
1684 const uint32_t par[])
1685{
1686 tcg_gen_movi_i32(arg[0].out, 0);
1687}
1688
Max Filippovb0b24bd2019-02-11 18:53:19 -08001689static void translate_l32r(DisasContext *dc, const OpcodeArg arg[],
Max Filippov168c12b2017-11-03 18:29:27 -07001690 const uint32_t par[])
1691{
Max Filippov6416d162018-08-29 10:37:29 -07001692 TCGv_i32 tmp;
Max Filippov168c12b2017-11-03 18:29:27 -07001693
Max Filippov6416d162018-08-29 10:37:29 -07001694 if (dc->base.tb->flags & XTENSA_TBFLAG_LITBASE) {
Richard Henderson9ae64762023-02-26 13:19:01 -10001695 tmp = tcg_temp_new();
1696 tcg_gen_addi_i32(tmp, cpu_SR[LITBASE], arg[1].raw_imm - 1);
Max Filippov6416d162018-08-29 10:37:29 -07001697 } else {
Richard Henderson9ae64762023-02-26 13:19:01 -10001698 tmp = tcg_constant_i32(arg[1].imm);
Max Filippov168c12b2017-11-03 18:29:27 -07001699 }
Richard Hendersonf0aca2a2023-05-02 14:57:40 +01001700 tcg_gen_qemu_ld_i32(arg[0].out, tmp, dc->cring, MO_TEUL);
Max Filippov168c12b2017-11-03 18:29:27 -07001701}
1702
Max Filippovb0b24bd2019-02-11 18:53:19 -08001703static void translate_loop(DisasContext *dc, const OpcodeArg arg[],
Max Filippov168c12b2017-11-03 18:29:27 -07001704 const uint32_t par[])
1705{
Max Filippovb0b24bd2019-02-11 18:53:19 -08001706 uint32_t lend = arg[1].imm;
Max Filippov168c12b2017-11-03 18:29:27 -07001707
Max Filippovb0b24bd2019-02-11 18:53:19 -08001708 tcg_gen_subi_i32(cpu_SR[LCOUNT], arg[0].in, 1);
Max Filippov6416d162018-08-29 10:37:29 -07001709 tcg_gen_movi_i32(cpu_SR[LBEG], dc->base.pc_next);
Max Filippov5d630ce2018-10-03 15:59:11 -07001710 tcg_gen_movi_i32(cpu_SR[LEND], lend);
Max Filippov168c12b2017-11-03 18:29:27 -07001711
Max Filippov6416d162018-08-29 10:37:29 -07001712 if (par[0] != TCG_COND_NEVER) {
1713 TCGLabel *label = gen_new_label();
Max Filippovb0b24bd2019-02-11 18:53:19 -08001714 tcg_gen_brcondi_i32(par[0], arg[0].in, 0, label);
Max Filippov6416d162018-08-29 10:37:29 -07001715 gen_jumpi(dc, lend, 1);
1716 gen_set_label(label);
Max Filippov168c12b2017-11-03 18:29:27 -07001717 }
Max Filippov6416d162018-08-29 10:37:29 -07001718
1719 gen_jumpi(dc, dc->base.pc_next, 0);
Max Filippov168c12b2017-11-03 18:29:27 -07001720}
1721
1722enum {
1723 MAC16_UMUL,
1724 MAC16_MUL,
1725 MAC16_MULA,
1726 MAC16_MULS,
1727 MAC16_NONE,
1728};
1729
1730enum {
1731 MAC16_LL,
1732 MAC16_HL,
1733 MAC16_LH,
1734 MAC16_HH,
1735
1736 MAC16_HX = 0x1,
1737 MAC16_XH = 0x2,
1738};
1739
Max Filippovb0b24bd2019-02-11 18:53:19 -08001740static void translate_mac16(DisasContext *dc, const OpcodeArg arg[],
Max Filippov168c12b2017-11-03 18:29:27 -07001741 const uint32_t par[])
1742{
1743 int op = par[0];
Max Filippov7aa78342019-02-11 19:16:14 -08001744 unsigned half = par[1];
1745 uint32_t ld_offset = par[2];
Max Filippov168c12b2017-11-03 18:29:27 -07001746 unsigned off = ld_offset ? 2 : 0;
Max Filippov6416d162018-08-29 10:37:29 -07001747 TCGv_i32 vaddr = tcg_temp_new_i32();
1748 TCGv_i32 mem32 = tcg_temp_new_i32();
Max Filippov168c12b2017-11-03 18:29:27 -07001749
1750 if (ld_offset) {
Max Filippov583e6a52021-05-17 12:31:08 -07001751 MemOp mop;
1752
Max Filippovb0b24bd2019-02-11 18:53:19 -08001753 tcg_gen_addi_i32(vaddr, arg[1].in, ld_offset);
Max Filippov583e6a52021-05-17 12:31:08 -07001754 mop = gen_load_store_alignment(dc, MO_TEUL, vaddr);
1755 tcg_gen_qemu_ld_tl(mem32, vaddr, dc->cring, mop);
Max Filippov168c12b2017-11-03 18:29:27 -07001756 }
Max Filippov6416d162018-08-29 10:37:29 -07001757 if (op != MAC16_NONE) {
Max Filippov7aa78342019-02-11 19:16:14 -08001758 TCGv_i32 m1 = gen_mac16_m(arg[off].in,
Max Filippov6416d162018-08-29 10:37:29 -07001759 half & MAC16_HX, op == MAC16_UMUL);
Max Filippov7aa78342019-02-11 19:16:14 -08001760 TCGv_i32 m2 = gen_mac16_m(arg[off + 1].in,
Max Filippov6416d162018-08-29 10:37:29 -07001761 half & MAC16_XH, op == MAC16_UMUL);
Max Filippov168c12b2017-11-03 18:29:27 -07001762
Max Filippov6416d162018-08-29 10:37:29 -07001763 if (op == MAC16_MUL || op == MAC16_UMUL) {
1764 tcg_gen_mul_i32(cpu_SR[ACCLO], m1, m2);
1765 if (op == MAC16_UMUL) {
1766 tcg_gen_movi_i32(cpu_SR[ACCHI], 0);
Max Filippov168c12b2017-11-03 18:29:27 -07001767 } else {
Max Filippov6416d162018-08-29 10:37:29 -07001768 tcg_gen_sari_i32(cpu_SR[ACCHI], cpu_SR[ACCLO], 31);
Max Filippov168c12b2017-11-03 18:29:27 -07001769 }
Max Filippov6416d162018-08-29 10:37:29 -07001770 } else {
1771 TCGv_i32 lo = tcg_temp_new_i32();
1772 TCGv_i32 hi = tcg_temp_new_i32();
1773
1774 tcg_gen_mul_i32(lo, m1, m2);
1775 tcg_gen_sari_i32(hi, lo, 31);
1776 if (op == MAC16_MULA) {
1777 tcg_gen_add2_i32(cpu_SR[ACCLO], cpu_SR[ACCHI],
1778 cpu_SR[ACCLO], cpu_SR[ACCHI],
1779 lo, hi);
1780 } else {
1781 tcg_gen_sub2_i32(cpu_SR[ACCLO], cpu_SR[ACCHI],
1782 cpu_SR[ACCLO], cpu_SR[ACCHI],
1783 lo, hi);
1784 }
1785 tcg_gen_ext8s_i32(cpu_SR[ACCHI], cpu_SR[ACCHI]);
Max Filippov168c12b2017-11-03 18:29:27 -07001786 }
Max Filippov168c12b2017-11-03 18:29:27 -07001787 }
Max Filippov6416d162018-08-29 10:37:29 -07001788 if (ld_offset) {
Max Filippovb0b24bd2019-02-11 18:53:19 -08001789 tcg_gen_mov_i32(arg[1].out, vaddr);
1790 tcg_gen_mov_i32(cpu_SR[MR + arg[0].imm], mem32);
Max Filippov6416d162018-08-29 10:37:29 -07001791 }
Max Filippov168c12b2017-11-03 18:29:27 -07001792}
1793
Max Filippovb0b24bd2019-02-11 18:53:19 -08001794static void translate_memw(DisasContext *dc, const OpcodeArg arg[],
Max Filippov9fb40342017-03-06 17:17:43 -08001795 const uint32_t par[])
1796{
1797 tcg_gen_mb(TCG_BAR_SC | TCG_MO_ALL);
1798}
1799
Max Filippovb0b24bd2019-02-11 18:53:19 -08001800static void translate_smin(DisasContext *dc, const OpcodeArg arg[],
Richard Henderson426afc32018-05-10 18:10:57 +01001801 const uint32_t par[])
Max Filippov168c12b2017-11-03 18:29:27 -07001802{
Max Filippovb0b24bd2019-02-11 18:53:19 -08001803 tcg_gen_smin_i32(arg[0].out, arg[1].in, arg[2].in);
Richard Henderson426afc32018-05-10 18:10:57 +01001804}
1805
Max Filippovb0b24bd2019-02-11 18:53:19 -08001806static void translate_umin(DisasContext *dc, const OpcodeArg arg[],
Richard Henderson426afc32018-05-10 18:10:57 +01001807 const uint32_t par[])
1808{
Max Filippovb0b24bd2019-02-11 18:53:19 -08001809 tcg_gen_umin_i32(arg[0].out, arg[1].in, arg[2].in);
Richard Henderson426afc32018-05-10 18:10:57 +01001810}
1811
Max Filippovb0b24bd2019-02-11 18:53:19 -08001812static void translate_smax(DisasContext *dc, const OpcodeArg arg[],
Richard Henderson426afc32018-05-10 18:10:57 +01001813 const uint32_t par[])
1814{
Max Filippovb0b24bd2019-02-11 18:53:19 -08001815 tcg_gen_smax_i32(arg[0].out, arg[1].in, arg[2].in);
Richard Henderson426afc32018-05-10 18:10:57 +01001816}
1817
Max Filippovb0b24bd2019-02-11 18:53:19 -08001818static void translate_umax(DisasContext *dc, const OpcodeArg arg[],
Richard Henderson426afc32018-05-10 18:10:57 +01001819 const uint32_t par[])
1820{
Max Filippovb0b24bd2019-02-11 18:53:19 -08001821 tcg_gen_umax_i32(arg[0].out, arg[1].in, arg[2].in);
Max Filippov168c12b2017-11-03 18:29:27 -07001822}
1823
Max Filippovb0b24bd2019-02-11 18:53:19 -08001824static void translate_mov(DisasContext *dc, const OpcodeArg arg[],
Max Filippov168c12b2017-11-03 18:29:27 -07001825 const uint32_t par[])
1826{
Max Filippovb0b24bd2019-02-11 18:53:19 -08001827 tcg_gen_mov_i32(arg[0].out, arg[1].in);
Max Filippov168c12b2017-11-03 18:29:27 -07001828}
1829
Max Filippovb0b24bd2019-02-11 18:53:19 -08001830static void translate_movcond(DisasContext *dc, const OpcodeArg arg[],
Max Filippov168c12b2017-11-03 18:29:27 -07001831 const uint32_t par[])
1832{
Max Filippov2b570a12022-04-21 13:27:27 -07001833 TCGv_i32 zero = tcg_constant_i32(0);
Max Filippov168c12b2017-11-03 18:29:27 -07001834
Max Filippovb0b24bd2019-02-11 18:53:19 -08001835 tcg_gen_movcond_i32(par[0], arg[0].out,
1836 arg[2].in, zero, arg[1].in, arg[0].in);
Max Filippov168c12b2017-11-03 18:29:27 -07001837}
1838
Max Filippovb0b24bd2019-02-11 18:53:19 -08001839static void translate_movi(DisasContext *dc, const OpcodeArg arg[],
Max Filippov168c12b2017-11-03 18:29:27 -07001840 const uint32_t par[])
1841{
Max Filippovb0b24bd2019-02-11 18:53:19 -08001842 tcg_gen_movi_i32(arg[0].out, arg[1].imm);
Max Filippov168c12b2017-11-03 18:29:27 -07001843}
1844
Max Filippovb0b24bd2019-02-11 18:53:19 -08001845static void translate_movp(DisasContext *dc, const OpcodeArg arg[],
Max Filippov168c12b2017-11-03 18:29:27 -07001846 const uint32_t par[])
1847{
Max Filippov2b570a12022-04-21 13:27:27 -07001848 TCGv_i32 zero = tcg_constant_i32(0);
Max Filippov6416d162018-08-29 10:37:29 -07001849 TCGv_i32 tmp = tcg_temp_new_i32();
Max Filippov168c12b2017-11-03 18:29:27 -07001850
Max Filippov575e9622019-02-14 13:27:50 -08001851 tcg_gen_andi_i32(tmp, arg[2].in, 1 << arg[2].imm);
Max Filippov6416d162018-08-29 10:37:29 -07001852 tcg_gen_movcond_i32(par[0],
Max Filippovb0b24bd2019-02-11 18:53:19 -08001853 arg[0].out, tmp, zero,
1854 arg[1].in, arg[0].in);
Max Filippov168c12b2017-11-03 18:29:27 -07001855}
1856
Max Filippovb0b24bd2019-02-11 18:53:19 -08001857static void translate_movsp(DisasContext *dc, const OpcodeArg arg[],
Max Filippov168c12b2017-11-03 18:29:27 -07001858 const uint32_t par[])
1859{
Max Filippovb0b24bd2019-02-11 18:53:19 -08001860 tcg_gen_mov_i32(arg[0].out, arg[1].in);
Max Filippov168c12b2017-11-03 18:29:27 -07001861}
1862
Max Filippovb0b24bd2019-02-11 18:53:19 -08001863static void translate_mul16(DisasContext *dc, const OpcodeArg arg[],
Max Filippov168c12b2017-11-03 18:29:27 -07001864 const uint32_t par[])
1865{
Max Filippov6416d162018-08-29 10:37:29 -07001866 TCGv_i32 v1 = tcg_temp_new_i32();
1867 TCGv_i32 v2 = tcg_temp_new_i32();
Max Filippov168c12b2017-11-03 18:29:27 -07001868
Max Filippov6416d162018-08-29 10:37:29 -07001869 if (par[0]) {
Max Filippovb0b24bd2019-02-11 18:53:19 -08001870 tcg_gen_ext16s_i32(v1, arg[1].in);
1871 tcg_gen_ext16s_i32(v2, arg[2].in);
Max Filippov6416d162018-08-29 10:37:29 -07001872 } else {
Max Filippovb0b24bd2019-02-11 18:53:19 -08001873 tcg_gen_ext16u_i32(v1, arg[1].in);
1874 tcg_gen_ext16u_i32(v2, arg[2].in);
Max Filippov168c12b2017-11-03 18:29:27 -07001875 }
Max Filippovb0b24bd2019-02-11 18:53:19 -08001876 tcg_gen_mul_i32(arg[0].out, v1, v2);
Max Filippov168c12b2017-11-03 18:29:27 -07001877}
1878
Max Filippovb0b24bd2019-02-11 18:53:19 -08001879static void translate_mull(DisasContext *dc, const OpcodeArg arg[],
Max Filippov168c12b2017-11-03 18:29:27 -07001880 const uint32_t par[])
1881{
Max Filippovb0b24bd2019-02-11 18:53:19 -08001882 tcg_gen_mul_i32(arg[0].out, arg[1].in, arg[2].in);
Max Filippov168c12b2017-11-03 18:29:27 -07001883}
1884
Max Filippovb0b24bd2019-02-11 18:53:19 -08001885static void translate_mulh(DisasContext *dc, const OpcodeArg arg[],
Max Filippov168c12b2017-11-03 18:29:27 -07001886 const uint32_t par[])
1887{
Max Filippov6416d162018-08-29 10:37:29 -07001888 TCGv_i32 lo = tcg_temp_new();
Max Filippov168c12b2017-11-03 18:29:27 -07001889
Max Filippov6416d162018-08-29 10:37:29 -07001890 if (par[0]) {
Max Filippovb0b24bd2019-02-11 18:53:19 -08001891 tcg_gen_muls2_i32(lo, arg[0].out, arg[1].in, arg[2].in);
Max Filippov6416d162018-08-29 10:37:29 -07001892 } else {
Max Filippovb0b24bd2019-02-11 18:53:19 -08001893 tcg_gen_mulu2_i32(lo, arg[0].out, arg[1].in, arg[2].in);
Max Filippov168c12b2017-11-03 18:29:27 -07001894 }
1895}
1896
Max Filippovb0b24bd2019-02-11 18:53:19 -08001897static void translate_neg(DisasContext *dc, const OpcodeArg arg[],
Max Filippov168c12b2017-11-03 18:29:27 -07001898 const uint32_t par[])
1899{
Max Filippovb0b24bd2019-02-11 18:53:19 -08001900 tcg_gen_neg_i32(arg[0].out, arg[1].in);
Max Filippov168c12b2017-11-03 18:29:27 -07001901}
1902
Max Filippovb0b24bd2019-02-11 18:53:19 -08001903static void translate_nop(DisasContext *dc, const OpcodeArg arg[],
Max Filippov168c12b2017-11-03 18:29:27 -07001904 const uint32_t par[])
1905{
1906}
1907
Max Filippovb0b24bd2019-02-11 18:53:19 -08001908static void translate_nsa(DisasContext *dc, const OpcodeArg arg[],
Max Filippov168c12b2017-11-03 18:29:27 -07001909 const uint32_t par[])
1910{
Max Filippovb0b24bd2019-02-11 18:53:19 -08001911 tcg_gen_clrsb_i32(arg[0].out, arg[1].in);
Max Filippov168c12b2017-11-03 18:29:27 -07001912}
1913
Max Filippovb0b24bd2019-02-11 18:53:19 -08001914static void translate_nsau(DisasContext *dc, const OpcodeArg arg[],
Max Filippov168c12b2017-11-03 18:29:27 -07001915 const uint32_t par[])
1916{
Max Filippovb0b24bd2019-02-11 18:53:19 -08001917 tcg_gen_clzi_i32(arg[0].out, arg[1].in, 32);
Max Filippov168c12b2017-11-03 18:29:27 -07001918}
1919
Max Filippovb0b24bd2019-02-11 18:53:19 -08001920static void translate_or(DisasContext *dc, const OpcodeArg arg[],
Max Filippov168c12b2017-11-03 18:29:27 -07001921 const uint32_t par[])
1922{
Max Filippovb0b24bd2019-02-11 18:53:19 -08001923 tcg_gen_or_i32(arg[0].out, arg[1].in, arg[2].in);
Max Filippov168c12b2017-11-03 18:29:27 -07001924}
1925
Max Filippovb0b24bd2019-02-11 18:53:19 -08001926static void translate_ptlb(DisasContext *dc, const OpcodeArg arg[],
Max Filippov168c12b2017-11-03 18:29:27 -07001927 const uint32_t par[])
1928{
Max Filippovba7651f2017-01-25 10:54:11 -08001929#ifndef CONFIG_USER_ONLY
Max Filippov4ee412d2022-04-21 13:38:58 -07001930 TCGv_i32 dtlb = tcg_constant_i32(par[0]);
Max Filippov168c12b2017-11-03 18:29:27 -07001931
Max Filippov6416d162018-08-29 10:37:29 -07001932 tcg_gen_movi_i32(cpu_pc, dc->pc);
Richard Hendersonad75a512023-09-13 16:37:36 -07001933 gen_helper_ptlb(arg[0].out, tcg_env, arg[1].in, dtlb);
Max Filippovba7651f2017-01-25 10:54:11 -08001934#endif
Max Filippov168c12b2017-11-03 18:29:27 -07001935}
1936
Max Filippov4d04ea32019-03-13 12:40:38 -07001937static void translate_pptlb(DisasContext *dc, const OpcodeArg arg[],
1938 const uint32_t par[])
1939{
1940#ifndef CONFIG_USER_ONLY
1941 tcg_gen_movi_i32(cpu_pc, dc->pc);
Richard Hendersonad75a512023-09-13 16:37:36 -07001942 gen_helper_pptlb(arg[0].out, tcg_env, arg[1].in);
Max Filippov4d04ea32019-03-13 12:40:38 -07001943#endif
1944}
1945
Max Filippovb0b24bd2019-02-11 18:53:19 -08001946static void translate_quos(DisasContext *dc, const OpcodeArg arg[],
Max Filippov168c12b2017-11-03 18:29:27 -07001947 const uint32_t par[])
1948{
Max Filippov6416d162018-08-29 10:37:29 -07001949 TCGLabel *label1 = gen_new_label();
1950 TCGLabel *label2 = gen_new_label();
Max Filippov168c12b2017-11-03 18:29:27 -07001951
Max Filippovb0b24bd2019-02-11 18:53:19 -08001952 tcg_gen_brcondi_i32(TCG_COND_NE, arg[1].in, 0x80000000,
Max Filippov6416d162018-08-29 10:37:29 -07001953 label1);
Max Filippovb0b24bd2019-02-11 18:53:19 -08001954 tcg_gen_brcondi_i32(TCG_COND_NE, arg[2].in, 0xffffffff,
Max Filippov6416d162018-08-29 10:37:29 -07001955 label1);
Max Filippovb0b24bd2019-02-11 18:53:19 -08001956 tcg_gen_movi_i32(arg[0].out,
Max Filippov6416d162018-08-29 10:37:29 -07001957 par[0] ? 0x80000000 : 0);
1958 tcg_gen_br(label2);
1959 gen_set_label(label1);
1960 if (par[0]) {
Max Filippovb0b24bd2019-02-11 18:53:19 -08001961 tcg_gen_div_i32(arg[0].out,
1962 arg[1].in, arg[2].in);
Max Filippov6416d162018-08-29 10:37:29 -07001963 } else {
Max Filippovb0b24bd2019-02-11 18:53:19 -08001964 tcg_gen_rem_i32(arg[0].out,
1965 arg[1].in, arg[2].in);
Max Filippov168c12b2017-11-03 18:29:27 -07001966 }
Max Filippov6416d162018-08-29 10:37:29 -07001967 gen_set_label(label2);
Max Filippov168c12b2017-11-03 18:29:27 -07001968}
1969
Max Filippovb0b24bd2019-02-11 18:53:19 -08001970static void translate_quou(DisasContext *dc, const OpcodeArg arg[],
Max Filippov168c12b2017-11-03 18:29:27 -07001971 const uint32_t par[])
1972{
Max Filippovb0b24bd2019-02-11 18:53:19 -08001973 tcg_gen_divu_i32(arg[0].out,
1974 arg[1].in, arg[2].in);
Max Filippov168c12b2017-11-03 18:29:27 -07001975}
1976
Max Filippovb0b24bd2019-02-11 18:53:19 -08001977static void translate_read_impwire(DisasContext *dc, const OpcodeArg arg[],
Max Filippove9872742017-02-17 16:21:36 -08001978 const uint32_t par[])
1979{
Max Filippov6416d162018-08-29 10:37:29 -07001980 /* TODO: GPIO32 may be a part of coprocessor */
Max Filippovb0b24bd2019-02-11 18:53:19 -08001981 tcg_gen_movi_i32(arg[0].out, 0);
Max Filippove9872742017-02-17 16:21:36 -08001982}
1983
Max Filippovb0b24bd2019-02-11 18:53:19 -08001984static void translate_remu(DisasContext *dc, const OpcodeArg arg[],
Max Filippov4a038952018-08-31 21:26:54 -07001985 const uint32_t par[])
1986{
Max Filippovb0b24bd2019-02-11 18:53:19 -08001987 tcg_gen_remu_i32(arg[0].out,
1988 arg[1].in, arg[2].in);
Max Filippov4a038952018-08-31 21:26:54 -07001989}
1990
Max Filippovb0b24bd2019-02-11 18:53:19 -08001991static void translate_rer(DisasContext *dc, const OpcodeArg arg[],
Max Filippov168c12b2017-11-03 18:29:27 -07001992 const uint32_t par[])
1993{
Richard Hendersonad75a512023-09-13 16:37:36 -07001994 gen_helper_rer(arg[0].out, tcg_env, arg[1].in);
Max Filippov168c12b2017-11-03 18:29:27 -07001995}
1996
Max Filippovb0b24bd2019-02-11 18:53:19 -08001997static void translate_ret(DisasContext *dc, const OpcodeArg arg[],
Max Filippov168c12b2017-11-03 18:29:27 -07001998 const uint32_t par[])
1999{
2000 gen_jump(dc, cpu_R[0]);
2001}
2002
Max Filippov91dc2b22020-05-04 14:08:40 -07002003static uint32_t test_exceptions_retw(DisasContext *dc, const OpcodeArg arg[],
2004 const uint32_t par[])
Max Filippov09460972018-08-27 21:43:43 -07002005{
2006 if (!dc->cwoe) {
2007 qemu_log_mask(LOG_GUEST_ERROR,
2008 "Illegal retw instruction(pc = %08x)\n", dc->pc);
Max Filippov91dc2b22020-05-04 14:08:40 -07002009 return XTENSA_OP_ILL;
Max Filippov09460972018-08-27 21:43:43 -07002010 } else {
Max Filippov6ade0ce2022-04-21 13:46:20 -07002011 TCGv_i32 pc = tcg_constant_i32(dc->pc);
Max Filippov09460972018-08-27 21:43:43 -07002012
Richard Hendersonad75a512023-09-13 16:37:36 -07002013 gen_helper_test_ill_retw(tcg_env, pc);
Max Filippov91dc2b22020-05-04 14:08:40 -07002014 return 0;
Max Filippov09460972018-08-27 21:43:43 -07002015 }
2016}
2017
Max Filippovb0b24bd2019-02-11 18:53:19 -08002018static void translate_retw(DisasContext *dc, const OpcodeArg arg[],
Max Filippov168c12b2017-11-03 18:29:27 -07002019 const uint32_t par[])
2020{
Richard Henderson864743a2023-02-26 13:21:14 -10002021 TCGv_i32 tmp = tcg_temp_new();
2022 tcg_gen_shl_i32(tmp, tcg_constant_i32(1), cpu_SR[WINDOW_BASE]);
Max Filippovc9490092019-02-11 12:22:29 -08002023 tcg_gen_andc_i32(cpu_SR[WINDOW_START],
2024 cpu_SR[WINDOW_START], tmp);
2025 tcg_gen_movi_i32(tmp, dc->pc);
2026 tcg_gen_deposit_i32(tmp, tmp, cpu_R[0], 0, 30);
Richard Hendersonad75a512023-09-13 16:37:36 -07002027 gen_helper_retw(tcg_env, cpu_R[0]);
Max Filippov168c12b2017-11-03 18:29:27 -07002028 gen_jump(dc, tmp);
Max Filippov168c12b2017-11-03 18:29:27 -07002029}
2030
Max Filippovb0b24bd2019-02-11 18:53:19 -08002031static void translate_rfde(DisasContext *dc, const OpcodeArg arg[],
Max Filippov168c12b2017-11-03 18:29:27 -07002032 const uint32_t par[])
2033{
Max Filippov21a2dad2018-08-27 22:17:50 -07002034 gen_jump(dc, cpu_SR[dc->config->ndepc ? DEPC : EPC1]);
Max Filippov168c12b2017-11-03 18:29:27 -07002035}
2036
Max Filippovb0b24bd2019-02-11 18:53:19 -08002037static void translate_rfe(DisasContext *dc, const OpcodeArg arg[],
Max Filippov168c12b2017-11-03 18:29:27 -07002038 const uint32_t par[])
2039{
Max Filippov21a2dad2018-08-27 22:17:50 -07002040 tcg_gen_andi_i32(cpu_SR[PS], cpu_SR[PS], ~PS_EXCM);
Max Filippov21a2dad2018-08-27 22:17:50 -07002041 gen_jump(dc, cpu_SR[EPC1]);
Max Filippov168c12b2017-11-03 18:29:27 -07002042}
2043
Max Filippovb0b24bd2019-02-11 18:53:19 -08002044static void translate_rfi(DisasContext *dc, const OpcodeArg arg[],
Max Filippov168c12b2017-11-03 18:29:27 -07002045 const uint32_t par[])
2046{
Max Filippovb0b24bd2019-02-11 18:53:19 -08002047 tcg_gen_mov_i32(cpu_SR[PS], cpu_SR[EPS2 + arg[0].imm - 2]);
2048 gen_jump(dc, cpu_SR[EPC1 + arg[0].imm - 1]);
Max Filippov168c12b2017-11-03 18:29:27 -07002049}
2050
Max Filippovb0b24bd2019-02-11 18:53:19 -08002051static void translate_rfw(DisasContext *dc, const OpcodeArg arg[],
Max Filippov168c12b2017-11-03 18:29:27 -07002052 const uint32_t par[])
2053{
Richard Henderson864743a2023-02-26 13:21:14 -10002054 TCGv_i32 tmp = tcg_temp_new();
Max Filippov168c12b2017-11-03 18:29:27 -07002055
Max Filippov21a2dad2018-08-27 22:17:50 -07002056 tcg_gen_andi_i32(cpu_SR[PS], cpu_SR[PS], ~PS_EXCM);
Richard Henderson864743a2023-02-26 13:21:14 -10002057 tcg_gen_shl_i32(tmp, tcg_constant_i32(1), cpu_SR[WINDOW_BASE]);
Max Filippov168c12b2017-11-03 18:29:27 -07002058
Max Filippov21a2dad2018-08-27 22:17:50 -07002059 if (par[0]) {
2060 tcg_gen_andc_i32(cpu_SR[WINDOW_START],
2061 cpu_SR[WINDOW_START], tmp);
2062 } else {
2063 tcg_gen_or_i32(cpu_SR[WINDOW_START],
2064 cpu_SR[WINDOW_START], tmp);
Max Filippov168c12b2017-11-03 18:29:27 -07002065 }
Max Filippov21a2dad2018-08-27 22:17:50 -07002066
Richard Hendersonad75a512023-09-13 16:37:36 -07002067 gen_helper_restore_owb(tcg_env);
Max Filippovd74624e2018-09-02 02:07:30 -07002068 gen_jump(dc, cpu_SR[EPC1]);
Max Filippov168c12b2017-11-03 18:29:27 -07002069}
2070
Max Filippovb0b24bd2019-02-11 18:53:19 -08002071static void translate_rotw(DisasContext *dc, const OpcodeArg arg[],
Max Filippov168c12b2017-11-03 18:29:27 -07002072 const uint32_t par[])
2073{
Max Filippovb0b24bd2019-02-11 18:53:19 -08002074 tcg_gen_addi_i32(cpu_windowbase_next, cpu_SR[WINDOW_BASE], arg[0].imm);
Max Filippov168c12b2017-11-03 18:29:27 -07002075}
2076
Max Filippovb0b24bd2019-02-11 18:53:19 -08002077static void translate_rsil(DisasContext *dc, const OpcodeArg arg[],
Max Filippov168c12b2017-11-03 18:29:27 -07002078 const uint32_t par[])
2079{
Max Filippovb0b24bd2019-02-11 18:53:19 -08002080 tcg_gen_mov_i32(arg[0].out, cpu_SR[PS]);
Max Filippov6416d162018-08-29 10:37:29 -07002081 tcg_gen_andi_i32(cpu_SR[PS], cpu_SR[PS], ~PS_INTLEVEL);
Max Filippovb0b24bd2019-02-11 18:53:19 -08002082 tcg_gen_ori_i32(cpu_SR[PS], cpu_SR[PS], arg[1].imm);
Max Filippov168c12b2017-11-03 18:29:27 -07002083}
2084
Max Filippovb0b24bd2019-02-11 18:53:19 -08002085static void translate_rsr(DisasContext *dc, const OpcodeArg arg[],
Max Filippov168c12b2017-11-03 18:29:27 -07002086 const uint32_t par[])
2087{
Max Filippov59afd432020-04-28 15:59:08 -07002088 if (sr_name[par[0]]) {
2089 tcg_gen_mov_i32(arg[0].out, cpu_SR[par[0]]);
2090 } else {
2091 tcg_gen_movi_i32(arg[0].out, 0);
2092 }
Max Filippov59419602019-03-18 17:10:38 -07002093}
2094
2095static void translate_rsr_ccount(DisasContext *dc, const OpcodeArg arg[],
2096 const uint32_t par[])
2097{
2098#ifndef CONFIG_USER_ONLY
Richard Hendersondfd1b812023-05-22 23:08:01 -07002099 translator_io_start(&dc->base);
Richard Hendersonad75a512023-09-13 16:37:36 -07002100 gen_helper_update_ccount(tcg_env);
Max Filippov59419602019-03-18 17:10:38 -07002101 tcg_gen_mov_i32(arg[0].out, cpu_SR[par[0]]);
Max Filippov59419602019-03-18 17:10:38 -07002102#endif
2103}
2104
2105static void translate_rsr_ptevaddr(DisasContext *dc, const OpcodeArg arg[],
2106 const uint32_t par[])
2107{
2108#ifndef CONFIG_USER_ONLY
2109 TCGv_i32 tmp = tcg_temp_new_i32();
2110
2111 tcg_gen_shri_i32(tmp, cpu_SR[EXCVADDR], 10);
2112 tcg_gen_or_i32(tmp, tmp, cpu_SR[PTEVADDR]);
2113 tcg_gen_andi_i32(arg[0].out, tmp, 0xfffffffc);
Max Filippov59419602019-03-18 17:10:38 -07002114#endif
Max Filippov168c12b2017-11-03 18:29:27 -07002115}
2116
Max Filippovb0b24bd2019-02-11 18:53:19 -08002117static void translate_rtlb(DisasContext *dc, const OpcodeArg arg[],
Max Filippov168c12b2017-11-03 18:29:27 -07002118 const uint32_t par[])
2119{
Max Filippov21a2dad2018-08-27 22:17:50 -07002120#ifndef CONFIG_USER_ONLY
Max Filippov168c12b2017-11-03 18:29:27 -07002121 static void (* const helper[])(TCGv_i32 r, TCGv_env env, TCGv_i32 a1,
2122 TCGv_i32 a2) = {
2123 gen_helper_rtlb0,
2124 gen_helper_rtlb1,
2125 };
Max Filippov4ee412d2022-04-21 13:38:58 -07002126 TCGv_i32 dtlb = tcg_constant_i32(par[0]);
Max Filippov168c12b2017-11-03 18:29:27 -07002127
Richard Hendersonad75a512023-09-13 16:37:36 -07002128 helper[par[1]](arg[0].out, tcg_env, arg[1].in, dtlb);
Max Filippov21a2dad2018-08-27 22:17:50 -07002129#endif
Max Filippov168c12b2017-11-03 18:29:27 -07002130}
2131
Max Filippov4d04ea32019-03-13 12:40:38 -07002132static void translate_rptlb0(DisasContext *dc, const OpcodeArg arg[],
2133 const uint32_t par[])
2134{
2135#ifndef CONFIG_USER_ONLY
Richard Hendersonad75a512023-09-13 16:37:36 -07002136 gen_helper_rptlb0(arg[0].out, tcg_env, arg[1].in);
Max Filippov4d04ea32019-03-13 12:40:38 -07002137#endif
2138}
2139
2140static void translate_rptlb1(DisasContext *dc, const OpcodeArg arg[],
2141 const uint32_t par[])
2142{
2143#ifndef CONFIG_USER_ONLY
Richard Hendersonad75a512023-09-13 16:37:36 -07002144 gen_helper_rptlb1(arg[0].out, tcg_env, arg[1].in);
Max Filippov4d04ea32019-03-13 12:40:38 -07002145#endif
2146}
2147
Max Filippovb0b24bd2019-02-11 18:53:19 -08002148static void translate_rur(DisasContext *dc, const OpcodeArg arg[],
Max Filippov168c12b2017-11-03 18:29:27 -07002149 const uint32_t par[])
2150{
Max Filippov59419602019-03-18 17:10:38 -07002151 tcg_gen_mov_i32(arg[0].out, cpu_UR[par[0]]);
Max Filippov168c12b2017-11-03 18:29:27 -07002152}
2153
Max Filippovb0b24bd2019-02-11 18:53:19 -08002154static void translate_setb_expstate(DisasContext *dc, const OpcodeArg arg[],
Max Filippove9872742017-02-17 16:21:36 -08002155 const uint32_t par[])
2156{
2157 /* TODO: GPIO32 may be a part of coprocessor */
Max Filippovb0b24bd2019-02-11 18:53:19 -08002158 tcg_gen_ori_i32(cpu_UR[EXPSTATE], cpu_UR[EXPSTATE], 1u << arg[0].imm);
Max Filippove9872742017-02-17 16:21:36 -08002159}
2160
Max Filippov9fb40342017-03-06 17:17:43 -08002161#ifdef CONFIG_USER_ONLY
2162static void gen_check_atomctl(DisasContext *dc, TCGv_i32 addr)
2163{
2164}
2165#else
2166static void gen_check_atomctl(DisasContext *dc, TCGv_i32 addr)
2167{
Max Filippov6ade0ce2022-04-21 13:46:20 -07002168 TCGv_i32 pc = tcg_constant_i32(dc->pc);
Max Filippov9fb40342017-03-06 17:17:43 -08002169
Richard Hendersonad75a512023-09-13 16:37:36 -07002170 gen_helper_check_atomctl(tcg_env, pc, addr);
Max Filippov9fb40342017-03-06 17:17:43 -08002171}
2172#endif
2173
Max Filippovb0b24bd2019-02-11 18:53:19 -08002174static void translate_s32c1i(DisasContext *dc, const OpcodeArg arg[],
Max Filippov168c12b2017-11-03 18:29:27 -07002175 const uint32_t par[])
2176{
Richard Henderson177bbc82023-01-29 14:45:57 -10002177 TCGv_i32 tmp = tcg_temp_new_i32();
2178 TCGv_i32 addr = tcg_temp_new_i32();
Max Filippov583e6a52021-05-17 12:31:08 -07002179 MemOp mop;
Max Filippov168c12b2017-11-03 18:29:27 -07002180
Max Filippovb0b24bd2019-02-11 18:53:19 -08002181 tcg_gen_mov_i32(tmp, arg[0].in);
2182 tcg_gen_addi_i32(addr, arg[1].in, arg[2].imm);
Max Filippov583e6a52021-05-17 12:31:08 -07002183 mop = gen_load_store_alignment(dc, MO_TEUL | MO_ALIGN, addr);
Max Filippov6416d162018-08-29 10:37:29 -07002184 gen_check_atomctl(dc, addr);
Max Filippovb0b24bd2019-02-11 18:53:19 -08002185 tcg_gen_atomic_cmpxchg_i32(arg[0].out, addr, cpu_SR[SCOMPARE1],
Max Filippov583e6a52021-05-17 12:31:08 -07002186 tmp, dc->cring, mop);
Max Filippov168c12b2017-11-03 18:29:27 -07002187}
2188
Max Filippovb0b24bd2019-02-11 18:53:19 -08002189static void translate_s32e(DisasContext *dc, const OpcodeArg arg[],
Max Filippov168c12b2017-11-03 18:29:27 -07002190 const uint32_t par[])
2191{
Max Filippov6416d162018-08-29 10:37:29 -07002192 TCGv_i32 addr = tcg_temp_new_i32();
Max Filippov583e6a52021-05-17 12:31:08 -07002193 MemOp mop;
Max Filippov168c12b2017-11-03 18:29:27 -07002194
Max Filippovb0b24bd2019-02-11 18:53:19 -08002195 tcg_gen_addi_i32(addr, arg[1].in, arg[2].imm);
Max Filippov583e6a52021-05-17 12:31:08 -07002196 mop = gen_load_store_alignment(dc, MO_TEUL, addr);
2197 tcg_gen_qemu_st_tl(arg[0].in, addr, dc->ring, mop);
Max Filippov168c12b2017-11-03 18:29:27 -07002198}
2199
Max Filippovb345e142019-04-18 16:37:00 -07002200static void translate_s32ex(DisasContext *dc, const OpcodeArg arg[],
2201 const uint32_t par[])
2202{
2203 TCGv_i32 prev = tcg_temp_new_i32();
Richard Henderson177bbc82023-01-29 14:45:57 -10002204 TCGv_i32 addr = tcg_temp_new_i32();
2205 TCGv_i32 res = tcg_temp_new_i32();
Max Filippovb345e142019-04-18 16:37:00 -07002206 TCGLabel *label = gen_new_label();
Max Filippov583e6a52021-05-17 12:31:08 -07002207 MemOp mop;
Max Filippovb345e142019-04-18 16:37:00 -07002208
2209 tcg_gen_movi_i32(res, 0);
2210 tcg_gen_mov_i32(addr, arg[1].in);
Max Filippov583e6a52021-05-17 12:31:08 -07002211 mop = gen_load_store_alignment(dc, MO_TEUL | MO_ALIGN, addr);
Max Filippovb345e142019-04-18 16:37:00 -07002212 tcg_gen_brcond_i32(TCG_COND_NE, addr, cpu_exclusive_addr, label);
2213 gen_check_exclusive(dc, addr, true);
2214 tcg_gen_atomic_cmpxchg_i32(prev, cpu_exclusive_addr, cpu_exclusive_val,
Max Filippov583e6a52021-05-17 12:31:08 -07002215 arg[0].in, dc->cring, mop);
Max Filippovb345e142019-04-18 16:37:00 -07002216 tcg_gen_setcond_i32(TCG_COND_EQ, res, prev, cpu_exclusive_val);
2217 tcg_gen_movcond_i32(TCG_COND_EQ, cpu_exclusive_val,
2218 prev, cpu_exclusive_val, prev, cpu_exclusive_val);
2219 tcg_gen_movi_i32(cpu_exclusive_addr, -1);
2220 gen_set_label(label);
2221 tcg_gen_extract_i32(arg[0].out, cpu_SR[ATOMCTL], 8, 1);
2222 tcg_gen_deposit_i32(cpu_SR[ATOMCTL], cpu_SR[ATOMCTL], res, 8, 1);
Max Filippovb345e142019-04-18 16:37:00 -07002223}
2224
Max Filippovb0b24bd2019-02-11 18:53:19 -08002225static void translate_salt(DisasContext *dc, const OpcodeArg arg[],
Max Filippovd1e9b002017-02-17 16:39:30 -08002226 const uint32_t par[])
2227{
Max Filippov6416d162018-08-29 10:37:29 -07002228 tcg_gen_setcond_i32(par[0],
Max Filippovb0b24bd2019-02-11 18:53:19 -08002229 arg[0].out,
2230 arg[1].in, arg[2].in);
Max Filippovd1e9b002017-02-17 16:39:30 -08002231}
2232
Max Filippovb0b24bd2019-02-11 18:53:19 -08002233static void translate_sext(DisasContext *dc, const OpcodeArg arg[],
Max Filippov168c12b2017-11-03 18:29:27 -07002234 const uint32_t par[])
2235{
Richard Hendersone40df352023-10-19 11:25:32 -07002236 tcg_gen_sextract_i32(arg[0].out, arg[1].in, 0, arg[2].imm + 1);
Max Filippov168c12b2017-11-03 18:29:27 -07002237}
2238
Max Filippov91dc2b22020-05-04 14:08:40 -07002239static uint32_t test_exceptions_simcall(DisasContext *dc,
2240 const OpcodeArg arg[],
2241 const uint32_t par[])
Max Filippov09460972018-08-27 21:43:43 -07002242{
Peter Maydell870ab982022-08-22 15:12:29 +01002243 bool is_semi = semihosting_enabled(dc->cring != 0);
Max Filippov09460972018-08-27 21:43:43 -07002244#ifdef CONFIG_USER_ONLY
2245 bool ill = true;
2246#else
Max Filippov62ed68e2020-05-04 05:15:14 -07002247 /* Between RE.2 and RE.3 simcall opcode's become nop for the hardware. */
Peter Maydell870ab982022-08-22 15:12:29 +01002248 bool ill = dc->config->hw_version <= 250002 && !is_semi;
Max Filippov09460972018-08-27 21:43:43 -07002249#endif
Peter Maydell870ab982022-08-22 15:12:29 +01002250 if (ill || !is_semi) {
Max Filippov09460972018-08-27 21:43:43 -07002251 qemu_log_mask(LOG_GUEST_ERROR, "SIMCALL but semihosting is disabled\n");
2252 }
Max Filippov91dc2b22020-05-04 14:08:40 -07002253 return ill ? XTENSA_OP_ILL : 0;
Max Filippov09460972018-08-27 21:43:43 -07002254}
2255
Max Filippovb0b24bd2019-02-11 18:53:19 -08002256static void translate_simcall(DisasContext *dc, const OpcodeArg arg[],
Max Filippov168c12b2017-11-03 18:29:27 -07002257 const uint32_t par[])
2258{
Max Filippovba7651f2017-01-25 10:54:11 -08002259#ifndef CONFIG_USER_ONLY
Peter Maydell870ab982022-08-22 15:12:29 +01002260 if (semihosting_enabled(dc->cring != 0)) {
Richard Hendersonad75a512023-09-13 16:37:36 -07002261 gen_helper_simcall(tcg_env);
Max Filippov62ed68e2020-05-04 05:15:14 -07002262 }
Max Filippov09460972018-08-27 21:43:43 -07002263#endif
Max Filippov168c12b2017-11-03 18:29:27 -07002264}
2265
2266/*
2267 * Note: 64 bit ops are used here solely because SAR values
2268 * have range 0..63
2269 */
2270#define gen_shift_reg(cmd, reg) do { \
2271 TCGv_i64 tmp = tcg_temp_new_i64(); \
2272 tcg_gen_extu_i32_i64(tmp, reg); \
2273 tcg_gen_##cmd##_i64(v, v, tmp); \
Max Filippovb0b24bd2019-02-11 18:53:19 -08002274 tcg_gen_extrl_i64_i32(arg[0].out, v); \
Max Filippov168c12b2017-11-03 18:29:27 -07002275 } while (0)
2276
2277#define gen_shift(cmd) gen_shift_reg(cmd, cpu_SR[SAR])
2278
Max Filippovb0b24bd2019-02-11 18:53:19 -08002279static void translate_sll(DisasContext *dc, const OpcodeArg arg[],
Max Filippov168c12b2017-11-03 18:29:27 -07002280 const uint32_t par[])
2281{
Max Filippov6416d162018-08-29 10:37:29 -07002282 if (dc->sar_m32_5bit) {
Max Filippovb0b24bd2019-02-11 18:53:19 -08002283 tcg_gen_shl_i32(arg[0].out, arg[1].in, dc->sar_m32);
Max Filippov6416d162018-08-29 10:37:29 -07002284 } else {
2285 TCGv_i64 v = tcg_temp_new_i64();
Richard Henderson885f21f2023-02-26 13:19:46 -10002286 TCGv_i32 s = tcg_temp_new();
2287 tcg_gen_subfi_i32(s, 32, cpu_SR[SAR]);
Max Filippov6416d162018-08-29 10:37:29 -07002288 tcg_gen_andi_i32(s, s, 0x3f);
Max Filippovb0b24bd2019-02-11 18:53:19 -08002289 tcg_gen_extu_i32_i64(v, arg[1].in);
Max Filippov6416d162018-08-29 10:37:29 -07002290 gen_shift_reg(shl, s);
Max Filippov168c12b2017-11-03 18:29:27 -07002291 }
2292}
2293
Max Filippovb0b24bd2019-02-11 18:53:19 -08002294static void translate_slli(DisasContext *dc, const OpcodeArg arg[],
Max Filippov168c12b2017-11-03 18:29:27 -07002295 const uint32_t par[])
2296{
Max Filippovb0b24bd2019-02-11 18:53:19 -08002297 if (arg[2].imm == 32) {
Max Filippov6416d162018-08-29 10:37:29 -07002298 qemu_log_mask(LOG_GUEST_ERROR, "slli a%d, a%d, 32 is undefined\n",
Max Filippovb0b24bd2019-02-11 18:53:19 -08002299 arg[0].imm, arg[1].imm);
Max Filippov168c12b2017-11-03 18:29:27 -07002300 }
Max Filippovb0b24bd2019-02-11 18:53:19 -08002301 tcg_gen_shli_i32(arg[0].out, arg[1].in, arg[2].imm & 0x1f);
Max Filippov168c12b2017-11-03 18:29:27 -07002302}
2303
Max Filippovb0b24bd2019-02-11 18:53:19 -08002304static void translate_sra(DisasContext *dc, const OpcodeArg arg[],
Max Filippov168c12b2017-11-03 18:29:27 -07002305 const uint32_t par[])
2306{
Max Filippov6416d162018-08-29 10:37:29 -07002307 if (dc->sar_m32_5bit) {
Max Filippovb0b24bd2019-02-11 18:53:19 -08002308 tcg_gen_sar_i32(arg[0].out, arg[1].in, cpu_SR[SAR]);
Max Filippov6416d162018-08-29 10:37:29 -07002309 } else {
2310 TCGv_i64 v = tcg_temp_new_i64();
Max Filippovb0b24bd2019-02-11 18:53:19 -08002311 tcg_gen_ext_i32_i64(v, arg[1].in);
Max Filippov6416d162018-08-29 10:37:29 -07002312 gen_shift(sar);
Max Filippov168c12b2017-11-03 18:29:27 -07002313 }
2314}
2315
Max Filippovb0b24bd2019-02-11 18:53:19 -08002316static void translate_srai(DisasContext *dc, const OpcodeArg arg[],
Max Filippov168c12b2017-11-03 18:29:27 -07002317 const uint32_t par[])
2318{
Max Filippovb0b24bd2019-02-11 18:53:19 -08002319 tcg_gen_sari_i32(arg[0].out, arg[1].in, arg[2].imm);
Max Filippov168c12b2017-11-03 18:29:27 -07002320}
2321
Max Filippovb0b24bd2019-02-11 18:53:19 -08002322static void translate_src(DisasContext *dc, const OpcodeArg arg[],
Max Filippov168c12b2017-11-03 18:29:27 -07002323 const uint32_t par[])
2324{
Max Filippov6416d162018-08-29 10:37:29 -07002325 TCGv_i64 v = tcg_temp_new_i64();
Max Filippovb0b24bd2019-02-11 18:53:19 -08002326 tcg_gen_concat_i32_i64(v, arg[2].in, arg[1].in);
Max Filippov6416d162018-08-29 10:37:29 -07002327 gen_shift(shr);
Max Filippov168c12b2017-11-03 18:29:27 -07002328}
2329
Max Filippovb0b24bd2019-02-11 18:53:19 -08002330static void translate_srl(DisasContext *dc, const OpcodeArg arg[],
Max Filippov168c12b2017-11-03 18:29:27 -07002331 const uint32_t par[])
2332{
Max Filippov6416d162018-08-29 10:37:29 -07002333 if (dc->sar_m32_5bit) {
Max Filippovb0b24bd2019-02-11 18:53:19 -08002334 tcg_gen_shr_i32(arg[0].out, arg[1].in, cpu_SR[SAR]);
Max Filippov6416d162018-08-29 10:37:29 -07002335 } else {
2336 TCGv_i64 v = tcg_temp_new_i64();
Max Filippovb0b24bd2019-02-11 18:53:19 -08002337 tcg_gen_extu_i32_i64(v, arg[1].in);
Max Filippov6416d162018-08-29 10:37:29 -07002338 gen_shift(shr);
Max Filippov168c12b2017-11-03 18:29:27 -07002339 }
2340}
2341
2342#undef gen_shift
2343#undef gen_shift_reg
2344
Max Filippovb0b24bd2019-02-11 18:53:19 -08002345static void translate_srli(DisasContext *dc, const OpcodeArg arg[],
Max Filippov168c12b2017-11-03 18:29:27 -07002346 const uint32_t par[])
2347{
Max Filippovb0b24bd2019-02-11 18:53:19 -08002348 tcg_gen_shri_i32(arg[0].out, arg[1].in, arg[2].imm);
Max Filippov168c12b2017-11-03 18:29:27 -07002349}
2350
Max Filippovb0b24bd2019-02-11 18:53:19 -08002351static void translate_ssa8b(DisasContext *dc, const OpcodeArg arg[],
Max Filippov168c12b2017-11-03 18:29:27 -07002352 const uint32_t par[])
2353{
Max Filippov6416d162018-08-29 10:37:29 -07002354 TCGv_i32 tmp = tcg_temp_new_i32();
Max Filippovb0b24bd2019-02-11 18:53:19 -08002355 tcg_gen_shli_i32(tmp, arg[0].in, 3);
Max Filippov6416d162018-08-29 10:37:29 -07002356 gen_left_shift_sar(dc, tmp);
Max Filippov168c12b2017-11-03 18:29:27 -07002357}
2358
Max Filippovb0b24bd2019-02-11 18:53:19 -08002359static void translate_ssa8l(DisasContext *dc, const OpcodeArg arg[],
Max Filippov168c12b2017-11-03 18:29:27 -07002360 const uint32_t par[])
2361{
Max Filippov6416d162018-08-29 10:37:29 -07002362 TCGv_i32 tmp = tcg_temp_new_i32();
Max Filippovb0b24bd2019-02-11 18:53:19 -08002363 tcg_gen_shli_i32(tmp, arg[0].in, 3);
Max Filippov6416d162018-08-29 10:37:29 -07002364 gen_right_shift_sar(dc, tmp);
Max Filippov168c12b2017-11-03 18:29:27 -07002365}
2366
Max Filippovb0b24bd2019-02-11 18:53:19 -08002367static void translate_ssai(DisasContext *dc, const OpcodeArg arg[],
Max Filippov168c12b2017-11-03 18:29:27 -07002368 const uint32_t par[])
2369{
Max Filippov6ade0ce2022-04-21 13:46:20 -07002370 gen_right_shift_sar(dc, tcg_constant_i32(arg[0].imm));
Max Filippov168c12b2017-11-03 18:29:27 -07002371}
2372
Max Filippovb0b24bd2019-02-11 18:53:19 -08002373static void translate_ssl(DisasContext *dc, const OpcodeArg arg[],
Max Filippov168c12b2017-11-03 18:29:27 -07002374 const uint32_t par[])
2375{
Max Filippovb0b24bd2019-02-11 18:53:19 -08002376 gen_left_shift_sar(dc, arg[0].in);
Max Filippov168c12b2017-11-03 18:29:27 -07002377}
2378
Max Filippovb0b24bd2019-02-11 18:53:19 -08002379static void translate_ssr(DisasContext *dc, const OpcodeArg arg[],
Max Filippov168c12b2017-11-03 18:29:27 -07002380 const uint32_t par[])
2381{
Max Filippovb0b24bd2019-02-11 18:53:19 -08002382 gen_right_shift_sar(dc, arg[0].in);
Max Filippov168c12b2017-11-03 18:29:27 -07002383}
2384
Max Filippovb0b24bd2019-02-11 18:53:19 -08002385static void translate_sub(DisasContext *dc, const OpcodeArg arg[],
Max Filippov168c12b2017-11-03 18:29:27 -07002386 const uint32_t par[])
2387{
Max Filippovb0b24bd2019-02-11 18:53:19 -08002388 tcg_gen_sub_i32(arg[0].out, arg[1].in, arg[2].in);
Max Filippov168c12b2017-11-03 18:29:27 -07002389}
2390
Max Filippovb0b24bd2019-02-11 18:53:19 -08002391static void translate_subx(DisasContext *dc, const OpcodeArg arg[],
Max Filippov168c12b2017-11-03 18:29:27 -07002392 const uint32_t par[])
2393{
Max Filippov6416d162018-08-29 10:37:29 -07002394 TCGv_i32 tmp = tcg_temp_new_i32();
Max Filippovb0b24bd2019-02-11 18:53:19 -08002395 tcg_gen_shli_i32(tmp, arg[1].in, par[0]);
2396 tcg_gen_sub_i32(arg[0].out, tmp, arg[2].in);
Max Filippov168c12b2017-11-03 18:29:27 -07002397}
2398
Max Filippovb0b24bd2019-02-11 18:53:19 -08002399static void translate_waiti(DisasContext *dc, const OpcodeArg arg[],
Max Filippov168c12b2017-11-03 18:29:27 -07002400 const uint32_t par[])
2401{
Max Filippovba7651f2017-01-25 10:54:11 -08002402#ifndef CONFIG_USER_ONLY
Max Filippov6ade0ce2022-04-21 13:46:20 -07002403 TCGv_i32 pc = tcg_constant_i32(dc->base.pc_next);
2404
Richard Hendersondfd1b812023-05-22 23:08:01 -07002405 translator_io_start(&dc->base);
Richard Hendersonad75a512023-09-13 16:37:36 -07002406 gen_helper_waiti(tcg_env, pc, tcg_constant_i32(arg[0].imm));
Max Filippovba7651f2017-01-25 10:54:11 -08002407#endif
Max Filippov168c12b2017-11-03 18:29:27 -07002408}
2409
Max Filippovb0b24bd2019-02-11 18:53:19 -08002410static void translate_wtlb(DisasContext *dc, const OpcodeArg arg[],
Max Filippov168c12b2017-11-03 18:29:27 -07002411 const uint32_t par[])
2412{
Max Filippovba7651f2017-01-25 10:54:11 -08002413#ifndef CONFIG_USER_ONLY
Max Filippov4ee412d2022-04-21 13:38:58 -07002414 TCGv_i32 dtlb = tcg_constant_i32(par[0]);
Max Filippov168c12b2017-11-03 18:29:27 -07002415
Richard Hendersonad75a512023-09-13 16:37:36 -07002416 gen_helper_wtlb(tcg_env, arg[0].in, arg[1].in, dtlb);
Max Filippovba7651f2017-01-25 10:54:11 -08002417#endif
Max Filippov168c12b2017-11-03 18:29:27 -07002418}
2419
Max Filippov4d04ea32019-03-13 12:40:38 -07002420static void translate_wptlb(DisasContext *dc, const OpcodeArg arg[],
2421 const uint32_t par[])
2422{
2423#ifndef CONFIG_USER_ONLY
Richard Hendersonad75a512023-09-13 16:37:36 -07002424 gen_helper_wptlb(tcg_env, arg[0].in, arg[1].in);
Max Filippov4d04ea32019-03-13 12:40:38 -07002425#endif
2426}
2427
Max Filippovb0b24bd2019-02-11 18:53:19 -08002428static void translate_wer(DisasContext *dc, const OpcodeArg arg[],
Max Filippov168c12b2017-11-03 18:29:27 -07002429 const uint32_t par[])
2430{
Richard Hendersonad75a512023-09-13 16:37:36 -07002431 gen_helper_wer(tcg_env, arg[0].in, arg[1].in);
Max Filippov168c12b2017-11-03 18:29:27 -07002432}
2433
Max Filippovb0b24bd2019-02-11 18:53:19 -08002434static void translate_wrmsk_expstate(DisasContext *dc, const OpcodeArg arg[],
Max Filippove9872742017-02-17 16:21:36 -08002435 const uint32_t par[])
2436{
Max Filippov6416d162018-08-29 10:37:29 -07002437 /* TODO: GPIO32 may be a part of coprocessor */
Max Filippovb0b24bd2019-02-11 18:53:19 -08002438 tcg_gen_and_i32(cpu_UR[EXPSTATE], arg[0].in, arg[1].in);
Max Filippove9872742017-02-17 16:21:36 -08002439}
2440
Max Filippovb0b24bd2019-02-11 18:53:19 -08002441static void translate_wsr(DisasContext *dc, const OpcodeArg arg[],
Max Filippov168c12b2017-11-03 18:29:27 -07002442 const uint32_t par[])
2443{
Max Filippov59afd432020-04-28 15:59:08 -07002444 if (sr_name[par[0]]) {
2445 tcg_gen_mov_i32(cpu_SR[par[0]], arg[0].in);
2446 }
Max Filippov59419602019-03-18 17:10:38 -07002447}
2448
2449static void translate_wsr_mask(DisasContext *dc, const OpcodeArg arg[],
2450 const uint32_t par[])
2451{
Max Filippov59afd432020-04-28 15:59:08 -07002452 if (sr_name[par[0]]) {
2453 tcg_gen_andi_i32(cpu_SR[par[0]], arg[0].in, par[2]);
2454 }
Max Filippov59419602019-03-18 17:10:38 -07002455}
2456
2457static void translate_wsr_acchi(DisasContext *dc, const OpcodeArg arg[],
2458 const uint32_t par[])
2459{
2460 tcg_gen_ext8s_i32(cpu_SR[par[0]], arg[0].in);
2461}
2462
2463static void translate_wsr_ccompare(DisasContext *dc, const OpcodeArg arg[],
2464 const uint32_t par[])
2465{
2466#ifndef CONFIG_USER_ONLY
2467 uint32_t id = par[0] - CCOMPARE;
Max Filippov59419602019-03-18 17:10:38 -07002468
2469 assert(id < dc->config->nccompare);
Richard Hendersondfd1b812023-05-22 23:08:01 -07002470 translator_io_start(&dc->base);
Max Filippov59419602019-03-18 17:10:38 -07002471 tcg_gen_mov_i32(cpu_SR[par[0]], arg[0].in);
Richard Hendersonad75a512023-09-13 16:37:36 -07002472 gen_helper_update_ccompare(tcg_env, tcg_constant_i32(id));
Max Filippov59419602019-03-18 17:10:38 -07002473#endif
2474}
2475
2476static void translate_wsr_ccount(DisasContext *dc, const OpcodeArg arg[],
2477 const uint32_t par[])
2478{
2479#ifndef CONFIG_USER_ONLY
Richard Hendersondfd1b812023-05-22 23:08:01 -07002480 translator_io_start(&dc->base);
Richard Hendersonad75a512023-09-13 16:37:36 -07002481 gen_helper_wsr_ccount(tcg_env, arg[0].in);
Max Filippov59419602019-03-18 17:10:38 -07002482#endif
2483}
2484
2485static void translate_wsr_dbreaka(DisasContext *dc, const OpcodeArg arg[],
2486 const uint32_t par[])
2487{
2488#ifndef CONFIG_USER_ONLY
2489 unsigned id = par[0] - DBREAKA;
Max Filippov59419602019-03-18 17:10:38 -07002490
2491 assert(id < dc->config->ndbreak);
Richard Hendersonad75a512023-09-13 16:37:36 -07002492 gen_helper_wsr_dbreaka(tcg_env, tcg_constant_i32(id), arg[0].in);
Max Filippov59419602019-03-18 17:10:38 -07002493#endif
2494}
2495
2496static void translate_wsr_dbreakc(DisasContext *dc, const OpcodeArg arg[],
2497 const uint32_t par[])
2498{
2499#ifndef CONFIG_USER_ONLY
2500 unsigned id = par[0] - DBREAKC;
Max Filippov59419602019-03-18 17:10:38 -07002501
2502 assert(id < dc->config->ndbreak);
Richard Hendersonad75a512023-09-13 16:37:36 -07002503 gen_helper_wsr_dbreakc(tcg_env, tcg_constant_i32(id), arg[0].in);
Max Filippov59419602019-03-18 17:10:38 -07002504#endif
2505}
2506
2507static void translate_wsr_ibreaka(DisasContext *dc, const OpcodeArg arg[],
2508 const uint32_t par[])
2509{
2510#ifndef CONFIG_USER_ONLY
2511 unsigned id = par[0] - IBREAKA;
Max Filippov59419602019-03-18 17:10:38 -07002512
2513 assert(id < dc->config->nibreak);
Richard Hendersonad75a512023-09-13 16:37:36 -07002514 gen_helper_wsr_ibreaka(tcg_env, tcg_constant_i32(id), arg[0].in);
Max Filippov59419602019-03-18 17:10:38 -07002515#endif
2516}
2517
2518static void translate_wsr_ibreakenable(DisasContext *dc, const OpcodeArg arg[],
2519 const uint32_t par[])
2520{
2521#ifndef CONFIG_USER_ONLY
Richard Hendersonad75a512023-09-13 16:37:36 -07002522 gen_helper_wsr_ibreakenable(tcg_env, arg[0].in);
Max Filippov59419602019-03-18 17:10:38 -07002523#endif
2524}
2525
2526static void translate_wsr_icount(DisasContext *dc, const OpcodeArg arg[],
2527 const uint32_t par[])
2528{
2529#ifndef CONFIG_USER_ONLY
2530 if (dc->icount) {
2531 tcg_gen_mov_i32(dc->next_icount, arg[0].in);
2532 } else {
2533 tcg_gen_mov_i32(cpu_SR[par[0]], arg[0].in);
2534 }
2535#endif
2536}
2537
2538static void translate_wsr_intclear(DisasContext *dc, const OpcodeArg arg[],
2539 const uint32_t par[])
2540{
2541#ifndef CONFIG_USER_ONLY
Richard Hendersonad75a512023-09-13 16:37:36 -07002542 gen_helper_intclear(tcg_env, arg[0].in);
Max Filippov59419602019-03-18 17:10:38 -07002543#endif
2544}
2545
2546static void translate_wsr_intset(DisasContext *dc, const OpcodeArg arg[],
2547 const uint32_t par[])
2548{
2549#ifndef CONFIG_USER_ONLY
Richard Hendersonad75a512023-09-13 16:37:36 -07002550 gen_helper_intset(tcg_env, arg[0].in);
Max Filippov59419602019-03-18 17:10:38 -07002551#endif
2552}
2553
2554static void translate_wsr_memctl(DisasContext *dc, const OpcodeArg arg[],
2555 const uint32_t par[])
2556{
2557#ifndef CONFIG_USER_ONLY
Richard Hendersonad75a512023-09-13 16:37:36 -07002558 gen_helper_wsr_memctl(tcg_env, arg[0].in);
Max Filippov59419602019-03-18 17:10:38 -07002559#endif
2560}
2561
Max Filippov4d04ea32019-03-13 12:40:38 -07002562static void translate_wsr_mpuenb(DisasContext *dc, const OpcodeArg arg[],
2563 const uint32_t par[])
2564{
2565#ifndef CONFIG_USER_ONLY
Richard Hendersonad75a512023-09-13 16:37:36 -07002566 gen_helper_wsr_mpuenb(tcg_env, arg[0].in);
Max Filippov4d04ea32019-03-13 12:40:38 -07002567#endif
2568}
2569
Max Filippov59419602019-03-18 17:10:38 -07002570static void translate_wsr_ps(DisasContext *dc, const OpcodeArg arg[],
2571 const uint32_t par[])
2572{
2573#ifndef CONFIG_USER_ONLY
2574 uint32_t mask = PS_WOE | PS_CALLINC | PS_OWB |
2575 PS_UM | PS_EXCM | PS_INTLEVEL;
2576
Max Filippov6c438052019-11-04 00:01:27 -08002577 if (option_enabled(dc, XTENSA_OPTION_MMU) ||
2578 option_enabled(dc, XTENSA_OPTION_MPU)) {
Max Filippov59419602019-03-18 17:10:38 -07002579 mask |= PS_RING;
2580 }
2581 tcg_gen_andi_i32(cpu_SR[par[0]], arg[0].in, mask);
2582#endif
2583}
2584
2585static void translate_wsr_rasid(DisasContext *dc, const OpcodeArg arg[],
2586 const uint32_t par[])
2587{
2588#ifndef CONFIG_USER_ONLY
Richard Hendersonad75a512023-09-13 16:37:36 -07002589 gen_helper_wsr_rasid(tcg_env, arg[0].in);
Max Filippov59419602019-03-18 17:10:38 -07002590#endif
2591}
2592
2593static void translate_wsr_sar(DisasContext *dc, const OpcodeArg arg[],
2594 const uint32_t par[])
2595{
2596 tcg_gen_andi_i32(cpu_SR[par[0]], arg[0].in, 0x3f);
2597 if (dc->sar_m32_5bit) {
2598 tcg_gen_discard_i32(dc->sar_m32);
2599 }
2600 dc->sar_5bit = false;
2601 dc->sar_m32_5bit = false;
2602}
2603
2604static void translate_wsr_windowbase(DisasContext *dc, const OpcodeArg arg[],
2605 const uint32_t par[])
2606{
2607#ifndef CONFIG_USER_ONLY
2608 tcg_gen_mov_i32(cpu_windowbase_next, arg[0].in);
2609#endif
2610}
2611
2612static void translate_wsr_windowstart(DisasContext *dc, const OpcodeArg arg[],
2613 const uint32_t par[])
2614{
2615#ifndef CONFIG_USER_ONLY
2616 tcg_gen_andi_i32(cpu_SR[par[0]], arg[0].in,
2617 (1 << dc->config->nareg / 4) - 1);
2618#endif
Max Filippov168c12b2017-11-03 18:29:27 -07002619}
2620
Max Filippovb0b24bd2019-02-11 18:53:19 -08002621static void translate_wur(DisasContext *dc, const OpcodeArg arg[],
Max Filippov168c12b2017-11-03 18:29:27 -07002622 const uint32_t par[])
2623{
Max Filippov59419602019-03-18 17:10:38 -07002624 tcg_gen_mov_i32(cpu_UR[par[0]], arg[0].in);
2625}
2626
Max Filippovb0b24bd2019-02-11 18:53:19 -08002627static void translate_xor(DisasContext *dc, const OpcodeArg arg[],
Max Filippov168c12b2017-11-03 18:29:27 -07002628 const uint32_t par[])
2629{
Max Filippovb0b24bd2019-02-11 18:53:19 -08002630 tcg_gen_xor_i32(arg[0].out, arg[1].in, arg[2].in);
Max Filippov168c12b2017-11-03 18:29:27 -07002631}
2632
Max Filippovb0b24bd2019-02-11 18:53:19 -08002633static void translate_xsr(DisasContext *dc, const OpcodeArg arg[],
Max Filippov168c12b2017-11-03 18:29:27 -07002634 const uint32_t par[])
2635{
Max Filippov59afd432020-04-28 15:59:08 -07002636 if (sr_name[par[0]]) {
2637 TCGv_i32 tmp = tcg_temp_new_i32();
Max Filippov168c12b2017-11-03 18:29:27 -07002638
Max Filippov59afd432020-04-28 15:59:08 -07002639 tcg_gen_mov_i32(tmp, arg[0].in);
2640 tcg_gen_mov_i32(arg[0].out, cpu_SR[par[0]]);
2641 tcg_gen_mov_i32(cpu_SR[par[0]], tmp);
Max Filippov59afd432020-04-28 15:59:08 -07002642 } else {
2643 tcg_gen_movi_i32(arg[0].out, 0);
2644 }
Max Filippov168c12b2017-11-03 18:29:27 -07002645}
2646
Max Filippov59419602019-03-18 17:10:38 -07002647static void translate_xsr_mask(DisasContext *dc, const OpcodeArg arg[],
2648 const uint32_t par[])
2649{
Max Filippov59afd432020-04-28 15:59:08 -07002650 if (sr_name[par[0]]) {
2651 TCGv_i32 tmp = tcg_temp_new_i32();
Max Filippov59419602019-03-18 17:10:38 -07002652
Max Filippov59afd432020-04-28 15:59:08 -07002653 tcg_gen_mov_i32(tmp, arg[0].in);
2654 tcg_gen_mov_i32(arg[0].out, cpu_SR[par[0]]);
2655 tcg_gen_andi_i32(cpu_SR[par[0]], tmp, par[2]);
Max Filippov59afd432020-04-28 15:59:08 -07002656 } else {
2657 tcg_gen_movi_i32(arg[0].out, 0);
2658 }
Max Filippov59419602019-03-18 17:10:38 -07002659}
2660
2661static void translate_xsr_ccount(DisasContext *dc, const OpcodeArg arg[],
2662 const uint32_t par[])
2663{
2664#ifndef CONFIG_USER_ONLY
2665 TCGv_i32 tmp = tcg_temp_new_i32();
2666
Richard Hendersondfd1b812023-05-22 23:08:01 -07002667 translator_io_start(&dc->base);
Richard Hendersonad75a512023-09-13 16:37:36 -07002668 gen_helper_update_ccount(tcg_env);
Max Filippov59419602019-03-18 17:10:38 -07002669 tcg_gen_mov_i32(tmp, cpu_SR[par[0]]);
Richard Hendersonad75a512023-09-13 16:37:36 -07002670 gen_helper_wsr_ccount(tcg_env, arg[0].in);
Max Filippov59419602019-03-18 17:10:38 -07002671 tcg_gen_mov_i32(arg[0].out, tmp);
Max Filippov59419602019-03-18 17:10:38 -07002672
Max Filippov59419602019-03-18 17:10:38 -07002673#endif
2674}
2675
2676#define gen_translate_xsr(name) \
2677 static void translate_xsr_##name(DisasContext *dc, const OpcodeArg arg[], \
2678 const uint32_t par[]) \
2679{ \
2680 TCGv_i32 tmp = tcg_temp_new_i32(); \
2681 \
Max Filippov59afd432020-04-28 15:59:08 -07002682 if (sr_name[par[0]]) { \
2683 tcg_gen_mov_i32(tmp, cpu_SR[par[0]]); \
2684 } else { \
2685 tcg_gen_movi_i32(tmp, 0); \
2686 } \
Max Filippov59419602019-03-18 17:10:38 -07002687 translate_wsr_##name(dc, arg, par); \
2688 tcg_gen_mov_i32(arg[0].out, tmp); \
Max Filippov59419602019-03-18 17:10:38 -07002689}
2690
2691gen_translate_xsr(acchi)
2692gen_translate_xsr(ccompare)
2693gen_translate_xsr(dbreaka)
2694gen_translate_xsr(dbreakc)
2695gen_translate_xsr(ibreaka)
2696gen_translate_xsr(ibreakenable)
2697gen_translate_xsr(icount)
2698gen_translate_xsr(memctl)
Max Filippov4d04ea32019-03-13 12:40:38 -07002699gen_translate_xsr(mpuenb)
Max Filippov59419602019-03-18 17:10:38 -07002700gen_translate_xsr(ps)
2701gen_translate_xsr(rasid)
2702gen_translate_xsr(sar)
2703gen_translate_xsr(windowbase)
2704gen_translate_xsr(windowstart)
2705
2706#undef gen_translate_xsr
2707
Max Filippov168c12b2017-11-03 18:29:27 -07002708static const XtensaOpcodeOps core_ops[] = {
2709 {
2710 .name = "abs",
2711 .translate = translate_abs,
2712 }, {
Max Filippovd863fcf2019-02-09 23:39:10 -08002713 .name = (const char * const[]) {
2714 "add", "add.n", NULL,
2715 },
Max Filippov168c12b2017-11-03 18:29:27 -07002716 .translate = translate_add,
Max Filippovd863fcf2019-02-09 23:39:10 -08002717 .op_flags = XTENSA_OP_NAME_ARRAY,
Max Filippov168c12b2017-11-03 18:29:27 -07002718 }, {
Max Filippovd863fcf2019-02-09 23:39:10 -08002719 .name = (const char * const[]) {
2720 "addi", "addi.n", NULL,
2721 },
Max Filippov168c12b2017-11-03 18:29:27 -07002722 .translate = translate_addi,
Max Filippovd863fcf2019-02-09 23:39:10 -08002723 .op_flags = XTENSA_OP_NAME_ARRAY,
Max Filippov168c12b2017-11-03 18:29:27 -07002724 }, {
2725 .name = "addmi",
2726 .translate = translate_addi,
2727 }, {
2728 .name = "addx2",
2729 .translate = translate_addx,
2730 .par = (const uint32_t[]){1},
2731 }, {
2732 .name = "addx4",
2733 .translate = translate_addx,
2734 .par = (const uint32_t[]){2},
2735 }, {
2736 .name = "addx8",
2737 .translate = translate_addx,
2738 .par = (const uint32_t[]){3},
2739 }, {
2740 .name = "all4",
2741 .translate = translate_all,
2742 .par = (const uint32_t[]){true, 4},
2743 }, {
2744 .name = "all8",
2745 .translate = translate_all,
2746 .par = (const uint32_t[]){true, 8},
2747 }, {
2748 .name = "and",
2749 .translate = translate_and,
2750 }, {
2751 .name = "andb",
2752 .translate = translate_boolean,
2753 .par = (const uint32_t[]){BOOLEAN_AND},
2754 }, {
2755 .name = "andbc",
2756 .translate = translate_boolean,
2757 .par = (const uint32_t[]){BOOLEAN_ANDC},
2758 }, {
2759 .name = "any4",
2760 .translate = translate_all,
2761 .par = (const uint32_t[]){false, 4},
2762 }, {
2763 .name = "any8",
2764 .translate = translate_all,
2765 .par = (const uint32_t[]){false, 8},
2766 }, {
Max Filippovfa6bc732018-10-02 18:50:13 -07002767 .name = (const char * const[]) {
2768 "ball", "ball.w15", "ball.w18", NULL,
2769 },
Max Filippov168c12b2017-11-03 18:29:27 -07002770 .translate = translate_ball,
2771 .par = (const uint32_t[]){TCG_COND_EQ},
Max Filippovfa6bc732018-10-02 18:50:13 -07002772 .op_flags = XTENSA_OP_NAME_ARRAY,
Max Filippov168c12b2017-11-03 18:29:27 -07002773 }, {
Max Filippovd863fcf2019-02-09 23:39:10 -08002774 .name = (const char * const[]) {
Max Filippovfa6bc732018-10-02 18:50:13 -07002775 "bany", "bany.w15", "bany.w18", NULL,
2776 },
2777 .translate = translate_bany,
2778 .par = (const uint32_t[]){TCG_COND_NE},
2779 .op_flags = XTENSA_OP_NAME_ARRAY,
2780 }, {
2781 .name = (const char * const[]) {
2782 "bbc", "bbc.w15", "bbc.w18", NULL,
2783 },
2784 .translate = translate_bb,
2785 .par = (const uint32_t[]){TCG_COND_EQ},
2786 .op_flags = XTENSA_OP_NAME_ARRAY,
2787 }, {
2788 .name = (const char * const[]) {
2789 "bbci", "bbci.w15", "bbci.w18", NULL,
2790 },
2791 .translate = translate_bbi,
2792 .par = (const uint32_t[]){TCG_COND_EQ},
2793 .op_flags = XTENSA_OP_NAME_ARRAY,
2794 }, {
2795 .name = (const char * const[]) {
2796 "bbs", "bbs.w15", "bbs.w18", NULL,
2797 },
2798 .translate = translate_bb,
2799 .par = (const uint32_t[]){TCG_COND_NE},
2800 .op_flags = XTENSA_OP_NAME_ARRAY,
2801 }, {
2802 .name = (const char * const[]) {
2803 "bbsi", "bbsi.w15", "bbsi.w18", NULL,
2804 },
2805 .translate = translate_bbi,
2806 .par = (const uint32_t[]){TCG_COND_NE},
2807 .op_flags = XTENSA_OP_NAME_ARRAY,
2808 }, {
2809 .name = (const char * const[]) {
2810 "beq", "beq.w15", "beq.w18", NULL,
2811 },
2812 .translate = translate_b,
2813 .par = (const uint32_t[]){TCG_COND_EQ},
2814 .op_flags = XTENSA_OP_NAME_ARRAY,
2815 }, {
2816 .name = (const char * const[]) {
2817 "beqi", "beqi.w15", "beqi.w18", NULL,
2818 },
2819 .translate = translate_bi,
2820 .par = (const uint32_t[]){TCG_COND_EQ},
2821 .op_flags = XTENSA_OP_NAME_ARRAY,
2822 }, {
2823 .name = (const char * const[]) {
2824 "beqz", "beqz.n", "beqz.w15", "beqz.w18", NULL,
Max Filippovd863fcf2019-02-09 23:39:10 -08002825 },
Max Filippov168c12b2017-11-03 18:29:27 -07002826 .translate = translate_bz,
2827 .par = (const uint32_t[]){TCG_COND_EQ},
Max Filippovd863fcf2019-02-09 23:39:10 -08002828 .op_flags = XTENSA_OP_NAME_ARRAY,
Max Filippov168c12b2017-11-03 18:29:27 -07002829 }, {
2830 .name = "bf",
2831 .translate = translate_bp,
2832 .par = (const uint32_t[]){TCG_COND_EQ},
2833 }, {
Max Filippovfa6bc732018-10-02 18:50:13 -07002834 .name = (const char * const[]) {
2835 "bge", "bge.w15", "bge.w18", NULL,
2836 },
Max Filippov168c12b2017-11-03 18:29:27 -07002837 .translate = translate_b,
2838 .par = (const uint32_t[]){TCG_COND_GE},
Max Filippovfa6bc732018-10-02 18:50:13 -07002839 .op_flags = XTENSA_OP_NAME_ARRAY,
Max Filippov168c12b2017-11-03 18:29:27 -07002840 }, {
Max Filippovd863fcf2019-02-09 23:39:10 -08002841 .name = (const char * const[]) {
Max Filippovfa6bc732018-10-02 18:50:13 -07002842 "bgei", "bgei.w15", "bgei.w18", NULL,
2843 },
2844 .translate = translate_bi,
2845 .par = (const uint32_t[]){TCG_COND_GE},
2846 .op_flags = XTENSA_OP_NAME_ARRAY,
2847 }, {
2848 .name = (const char * const[]) {
2849 "bgeu", "bgeu.w15", "bgeu.w18", NULL,
2850 },
2851 .translate = translate_b,
2852 .par = (const uint32_t[]){TCG_COND_GEU},
2853 .op_flags = XTENSA_OP_NAME_ARRAY,
2854 }, {
2855 .name = (const char * const[]) {
2856 "bgeui", "bgeui.w15", "bgeui.w18", NULL,
2857 },
2858 .translate = translate_bi,
2859 .par = (const uint32_t[]){TCG_COND_GEU},
2860 .op_flags = XTENSA_OP_NAME_ARRAY,
2861 }, {
2862 .name = (const char * const[]) {
2863 "bgez", "bgez.w15", "bgez.w18", NULL,
2864 },
2865 .translate = translate_bz,
2866 .par = (const uint32_t[]){TCG_COND_GE},
2867 .op_flags = XTENSA_OP_NAME_ARRAY,
2868 }, {
2869 .name = (const char * const[]) {
2870 "blt", "blt.w15", "blt.w18", NULL,
2871 },
2872 .translate = translate_b,
2873 .par = (const uint32_t[]){TCG_COND_LT},
2874 .op_flags = XTENSA_OP_NAME_ARRAY,
2875 }, {
2876 .name = (const char * const[]) {
2877 "blti", "blti.w15", "blti.w18", NULL,
2878 },
2879 .translate = translate_bi,
2880 .par = (const uint32_t[]){TCG_COND_LT},
2881 .op_flags = XTENSA_OP_NAME_ARRAY,
2882 }, {
2883 .name = (const char * const[]) {
2884 "bltu", "bltu.w15", "bltu.w18", NULL,
2885 },
2886 .translate = translate_b,
2887 .par = (const uint32_t[]){TCG_COND_LTU},
2888 .op_flags = XTENSA_OP_NAME_ARRAY,
2889 }, {
2890 .name = (const char * const[]) {
2891 "bltui", "bltui.w15", "bltui.w18", NULL,
2892 },
2893 .translate = translate_bi,
2894 .par = (const uint32_t[]){TCG_COND_LTU},
2895 .op_flags = XTENSA_OP_NAME_ARRAY,
2896 }, {
2897 .name = (const char * const[]) {
2898 "bltz", "bltz.w15", "bltz.w18", NULL,
2899 },
2900 .translate = translate_bz,
2901 .par = (const uint32_t[]){TCG_COND_LT},
2902 .op_flags = XTENSA_OP_NAME_ARRAY,
2903 }, {
2904 .name = (const char * const[]) {
2905 "bnall", "bnall.w15", "bnall.w18", NULL,
2906 },
2907 .translate = translate_ball,
2908 .par = (const uint32_t[]){TCG_COND_NE},
2909 .op_flags = XTENSA_OP_NAME_ARRAY,
2910 }, {
2911 .name = (const char * const[]) {
2912 "bne", "bne.w15", "bne.w18", NULL,
2913 },
2914 .translate = translate_b,
2915 .par = (const uint32_t[]){TCG_COND_NE},
2916 .op_flags = XTENSA_OP_NAME_ARRAY,
2917 }, {
2918 .name = (const char * const[]) {
2919 "bnei", "bnei.w15", "bnei.w18", NULL,
2920 },
2921 .translate = translate_bi,
2922 .par = (const uint32_t[]){TCG_COND_NE},
2923 .op_flags = XTENSA_OP_NAME_ARRAY,
2924 }, {
2925 .name = (const char * const[]) {
2926 "bnez", "bnez.n", "bnez.w15", "bnez.w18", NULL,
Max Filippovd863fcf2019-02-09 23:39:10 -08002927 },
Max Filippov168c12b2017-11-03 18:29:27 -07002928 .translate = translate_bz,
2929 .par = (const uint32_t[]){TCG_COND_NE},
Max Filippovd863fcf2019-02-09 23:39:10 -08002930 .op_flags = XTENSA_OP_NAME_ARRAY,
Max Filippov168c12b2017-11-03 18:29:27 -07002931 }, {
Max Filippovfa6bc732018-10-02 18:50:13 -07002932 .name = (const char * const[]) {
2933 "bnone", "bnone.w15", "bnone.w18", NULL,
2934 },
Max Filippov168c12b2017-11-03 18:29:27 -07002935 .translate = translate_bany,
2936 .par = (const uint32_t[]){TCG_COND_EQ},
Max Filippovfa6bc732018-10-02 18:50:13 -07002937 .op_flags = XTENSA_OP_NAME_ARRAY,
Max Filippov168c12b2017-11-03 18:29:27 -07002938 }, {
2939 .name = "break",
Max Filippov15477812018-08-28 14:52:27 -07002940 .translate = translate_nop,
Max Filippov168c12b2017-11-03 18:29:27 -07002941 .par = (const uint32_t[]){DEBUGCAUSE_BI},
Max Filippov15477812018-08-28 14:52:27 -07002942 .op_flags = XTENSA_OP_DEBUG_BREAK,
Max Filippov168c12b2017-11-03 18:29:27 -07002943 }, {
2944 .name = "break.n",
Max Filippov15477812018-08-28 14:52:27 -07002945 .translate = translate_nop,
Max Filippov168c12b2017-11-03 18:29:27 -07002946 .par = (const uint32_t[]){DEBUGCAUSE_BN},
Max Filippov15477812018-08-28 14:52:27 -07002947 .op_flags = XTENSA_OP_DEBUG_BREAK,
Max Filippov168c12b2017-11-03 18:29:27 -07002948 }, {
2949 .name = "bt",
2950 .translate = translate_bp,
2951 .par = (const uint32_t[]){TCG_COND_NE},
2952 }, {
2953 .name = "call0",
2954 .translate = translate_call0,
2955 }, {
2956 .name = "call12",
2957 .translate = translate_callw,
2958 .par = (const uint32_t[]){3},
2959 }, {
2960 .name = "call4",
2961 .translate = translate_callw,
2962 .par = (const uint32_t[]){1},
2963 }, {
2964 .name = "call8",
2965 .translate = translate_callw,
2966 .par = (const uint32_t[]){2},
2967 }, {
2968 .name = "callx0",
2969 .translate = translate_callx0,
2970 }, {
2971 .name = "callx12",
2972 .translate = translate_callxw,
2973 .par = (const uint32_t[]){3},
2974 }, {
2975 .name = "callx4",
2976 .translate = translate_callxw,
2977 .par = (const uint32_t[]){1},
2978 }, {
2979 .name = "callx8",
2980 .translate = translate_callxw,
2981 .par = (const uint32_t[]){2},
2982 }, {
2983 .name = "clamps",
2984 .translate = translate_clamps,
2985 }, {
Max Filippove9872742017-02-17 16:21:36 -08002986 .name = "clrb_expstate",
2987 .translate = translate_clrb_expstate,
2988 }, {
Max Filippovb345e142019-04-18 16:37:00 -07002989 .name = "clrex",
2990 .translate = translate_clrex,
2991 }, {
Max Filippovc5ac9362017-11-02 15:05:56 -07002992 .name = "const16",
2993 .translate = translate_const16,
2994 }, {
Max Filippov168c12b2017-11-03 18:29:27 -07002995 .name = "depbits",
2996 .translate = translate_depbits,
2997 }, {
2998 .name = "dhi",
2999 .translate = translate_dcache,
Max Filippov21a2dad2018-08-27 22:17:50 -07003000 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07003001 }, {
Max Filippovc8844002019-04-15 17:45:02 -07003002 .name = "dhi.b",
3003 .translate = translate_nop,
3004 }, {
Max Filippov168c12b2017-11-03 18:29:27 -07003005 .name = "dhu",
3006 .translate = translate_dcache,
Max Filippov21a2dad2018-08-27 22:17:50 -07003007 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07003008 }, {
3009 .name = "dhwb",
3010 .translate = translate_dcache,
Max Filippov168c12b2017-11-03 18:29:27 -07003011 }, {
Max Filippovc8844002019-04-15 17:45:02 -07003012 .name = "dhwb.b",
3013 .translate = translate_nop,
3014 }, {
Max Filippov168c12b2017-11-03 18:29:27 -07003015 .name = "dhwbi",
3016 .translate = translate_dcache,
Max Filippov168c12b2017-11-03 18:29:27 -07003017 }, {
Max Filippovc8844002019-04-15 17:45:02 -07003018 .name = "dhwbi.b",
3019 .translate = translate_nop,
3020 }, {
Max Filippov168c12b2017-11-03 18:29:27 -07003021 .name = "dii",
Max Filippov6416d162018-08-29 10:37:29 -07003022 .translate = translate_nop,
Max Filippov21a2dad2018-08-27 22:17:50 -07003023 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07003024 }, {
3025 .name = "diu",
Max Filippov6416d162018-08-29 10:37:29 -07003026 .translate = translate_nop,
Max Filippov21a2dad2018-08-27 22:17:50 -07003027 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07003028 }, {
3029 .name = "diwb",
Max Filippov6416d162018-08-29 10:37:29 -07003030 .translate = translate_nop,
Max Filippov21a2dad2018-08-27 22:17:50 -07003031 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07003032 }, {
3033 .name = "diwbi",
Max Filippov6416d162018-08-29 10:37:29 -07003034 .translate = translate_nop,
Max Filippov21a2dad2018-08-27 22:17:50 -07003035 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07003036 }, {
Max Filippov75eed0e2019-04-14 14:02:17 -07003037 .name = "diwbui.p",
3038 .translate = translate_diwbuip,
3039 .op_flags = XTENSA_OP_PRIVILEGED,
3040 }, {
Max Filippov168c12b2017-11-03 18:29:27 -07003041 .name = "dpfl",
3042 .translate = translate_dcache,
Max Filippov21a2dad2018-08-27 22:17:50 -07003043 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07003044 }, {
Max Filippovc8844002019-04-15 17:45:02 -07003045 .name = "dpfm.b",
3046 .translate = translate_nop,
3047 }, {
3048 .name = "dpfm.bf",
3049 .translate = translate_nop,
3050 }, {
Max Filippov168c12b2017-11-03 18:29:27 -07003051 .name = "dpfr",
Max Filippov6416d162018-08-29 10:37:29 -07003052 .translate = translate_nop,
Max Filippov168c12b2017-11-03 18:29:27 -07003053 }, {
Max Filippovc8844002019-04-15 17:45:02 -07003054 .name = "dpfr.b",
3055 .translate = translate_nop,
3056 }, {
3057 .name = "dpfr.bf",
3058 .translate = translate_nop,
3059 }, {
Max Filippov168c12b2017-11-03 18:29:27 -07003060 .name = "dpfro",
Max Filippov6416d162018-08-29 10:37:29 -07003061 .translate = translate_nop,
Max Filippov168c12b2017-11-03 18:29:27 -07003062 }, {
3063 .name = "dpfw",
Max Filippov6416d162018-08-29 10:37:29 -07003064 .translate = translate_nop,
Max Filippov168c12b2017-11-03 18:29:27 -07003065 }, {
Max Filippovc8844002019-04-15 17:45:02 -07003066 .name = "dpfw.b",
3067 .translate = translate_nop,
3068 }, {
3069 .name = "dpfw.bf",
3070 .translate = translate_nop,
3071 }, {
Max Filippov168c12b2017-11-03 18:29:27 -07003072 .name = "dpfwo",
Max Filippov6416d162018-08-29 10:37:29 -07003073 .translate = translate_nop,
Max Filippov168c12b2017-11-03 18:29:27 -07003074 }, {
3075 .name = "dsync",
3076 .translate = translate_nop,
3077 }, {
3078 .name = "entry",
3079 .translate = translate_entry,
Max Filippov91dc2b22020-05-04 14:08:40 -07003080 .test_exceptions = test_exceptions_entry,
Max Filippov6416d162018-08-29 10:37:29 -07003081 .test_overflow = test_overflow_entry,
Max Filippov8df3fd32019-01-30 14:56:29 -08003082 .op_flags = XTENSA_OP_EXIT_TB_M1 |
3083 XTENSA_OP_SYNC_REGISTER_WINDOW,
Max Filippov168c12b2017-11-03 18:29:27 -07003084 }, {
3085 .name = "esync",
3086 .translate = translate_nop,
3087 }, {
3088 .name = "excw",
3089 .translate = translate_nop,
3090 }, {
3091 .name = "extui",
3092 .translate = translate_extui,
3093 }, {
3094 .name = "extw",
Max Filippov9fb40342017-03-06 17:17:43 -08003095 .translate = translate_memw,
Max Filippov168c12b2017-11-03 18:29:27 -07003096 }, {
Max Filippovb345e142019-04-18 16:37:00 -07003097 .name = "getex",
3098 .translate = translate_getex,
3099 }, {
Max Filippov13f6a7c2017-01-29 03:50:25 -08003100 .name = "hwwdtlba",
Max Filippov09460972018-08-27 21:43:43 -07003101 .op_flags = XTENSA_OP_ILL,
Max Filippov13f6a7c2017-01-29 03:50:25 -08003102 }, {
3103 .name = "hwwitlba",
Max Filippov09460972018-08-27 21:43:43 -07003104 .op_flags = XTENSA_OP_ILL,
Max Filippov13f6a7c2017-01-29 03:50:25 -08003105 }, {
Max Filippov168c12b2017-11-03 18:29:27 -07003106 .name = "idtlb",
3107 .translate = translate_itlb,
3108 .par = (const uint32_t[]){true},
Max Filippov226444a2018-09-01 00:47:55 -07003109 .op_flags = XTENSA_OP_PRIVILEGED | XTENSA_OP_EXIT_TB_M1,
Max Filippov168c12b2017-11-03 18:29:27 -07003110 }, {
3111 .name = "ihi",
3112 .translate = translate_icache,
Max Filippov168c12b2017-11-03 18:29:27 -07003113 }, {
3114 .name = "ihu",
3115 .translate = translate_icache,
Max Filippov21a2dad2018-08-27 22:17:50 -07003116 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07003117 }, {
3118 .name = "iii",
Max Filippov6416d162018-08-29 10:37:29 -07003119 .translate = translate_nop,
Max Filippov21a2dad2018-08-27 22:17:50 -07003120 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07003121 }, {
3122 .name = "iitlb",
3123 .translate = translate_itlb,
3124 .par = (const uint32_t[]){false},
Max Filippov226444a2018-09-01 00:47:55 -07003125 .op_flags = XTENSA_OP_PRIVILEGED | XTENSA_OP_EXIT_TB_M1,
Max Filippov168c12b2017-11-03 18:29:27 -07003126 }, {
3127 .name = "iiu",
Max Filippov6416d162018-08-29 10:37:29 -07003128 .translate = translate_nop,
Max Filippov21a2dad2018-08-27 22:17:50 -07003129 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07003130 }, {
Max Filippovd863fcf2019-02-09 23:39:10 -08003131 .name = (const char * const[]) {
3132 "ill", "ill.n", NULL,
3133 },
3134 .op_flags = XTENSA_OP_ILL | XTENSA_OP_NAME_ARRAY,
Max Filippov168c12b2017-11-03 18:29:27 -07003135 }, {
3136 .name = "ipf",
Max Filippov6416d162018-08-29 10:37:29 -07003137 .translate = translate_nop,
Max Filippov168c12b2017-11-03 18:29:27 -07003138 }, {
3139 .name = "ipfl",
3140 .translate = translate_icache,
Max Filippov21a2dad2018-08-27 22:17:50 -07003141 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07003142 }, {
3143 .name = "isync",
3144 .translate = translate_nop,
3145 }, {
3146 .name = "j",
3147 .translate = translate_j,
3148 }, {
3149 .name = "jx",
3150 .translate = translate_jx,
3151 }, {
3152 .name = "l16si",
3153 .translate = translate_ldst,
3154 .par = (const uint32_t[]){MO_TESW, false, false},
Max Filippov068e5382019-02-13 17:36:30 -08003155 .op_flags = XTENSA_OP_LOAD,
Max Filippov168c12b2017-11-03 18:29:27 -07003156 }, {
3157 .name = "l16ui",
3158 .translate = translate_ldst,
3159 .par = (const uint32_t[]){MO_TEUW, false, false},
Max Filippov068e5382019-02-13 17:36:30 -08003160 .op_flags = XTENSA_OP_LOAD,
Max Filippov168c12b2017-11-03 18:29:27 -07003161 }, {
3162 .name = "l32ai",
3163 .translate = translate_ldst,
Max Filippov583e6a52021-05-17 12:31:08 -07003164 .par = (const uint32_t[]){MO_TEUL | MO_ALIGN, true, false},
Max Filippov068e5382019-02-13 17:36:30 -08003165 .op_flags = XTENSA_OP_LOAD,
Max Filippov168c12b2017-11-03 18:29:27 -07003166 }, {
3167 .name = "l32e",
3168 .translate = translate_l32e,
Max Filippov068e5382019-02-13 17:36:30 -08003169 .op_flags = XTENSA_OP_PRIVILEGED | XTENSA_OP_LOAD,
Max Filippov168c12b2017-11-03 18:29:27 -07003170 }, {
Max Filippovb345e142019-04-18 16:37:00 -07003171 .name = "l32ex",
3172 .translate = translate_l32ex,
3173 .op_flags = XTENSA_OP_LOAD,
3174 }, {
Max Filippovd863fcf2019-02-09 23:39:10 -08003175 .name = (const char * const[]) {
3176 "l32i", "l32i.n", NULL,
3177 },
Max Filippov168c12b2017-11-03 18:29:27 -07003178 .translate = translate_ldst,
3179 .par = (const uint32_t[]){MO_TEUL, false, false},
Max Filippov068e5382019-02-13 17:36:30 -08003180 .op_flags = XTENSA_OP_NAME_ARRAY | XTENSA_OP_LOAD,
Max Filippov168c12b2017-11-03 18:29:27 -07003181 }, {
3182 .name = "l32r",
3183 .translate = translate_l32r,
Max Filippov068e5382019-02-13 17:36:30 -08003184 .op_flags = XTENSA_OP_LOAD,
Max Filippov168c12b2017-11-03 18:29:27 -07003185 }, {
3186 .name = "l8ui",
3187 .translate = translate_ldst,
3188 .par = (const uint32_t[]){MO_UB, false, false},
Max Filippov068e5382019-02-13 17:36:30 -08003189 .op_flags = XTENSA_OP_LOAD,
Max Filippov168c12b2017-11-03 18:29:27 -07003190 }, {
Max Filippov59491e92022-05-01 22:57:49 -07003191 .name = "ldct",
3192 .translate = translate_lct,
3193 .op_flags = XTENSA_OP_PRIVILEGED,
3194 }, {
3195 .name = "ldcw",
3196 .translate = translate_nop,
3197 .op_flags = XTENSA_OP_PRIVILEGED,
3198 }, {
Max Filippov168c12b2017-11-03 18:29:27 -07003199 .name = "lddec",
3200 .translate = translate_mac16,
Max Filippov7aa78342019-02-11 19:16:14 -08003201 .par = (const uint32_t[]){MAC16_NONE, 0, -4},
Max Filippov068e5382019-02-13 17:36:30 -08003202 .op_flags = XTENSA_OP_LOAD,
Max Filippov168c12b2017-11-03 18:29:27 -07003203 }, {
3204 .name = "ldinc",
3205 .translate = translate_mac16,
Max Filippov7aa78342019-02-11 19:16:14 -08003206 .par = (const uint32_t[]){MAC16_NONE, 0, 4},
Max Filippov068e5382019-02-13 17:36:30 -08003207 .op_flags = XTENSA_OP_LOAD,
Max Filippov168c12b2017-11-03 18:29:27 -07003208 }, {
Max Filippov13f6a7c2017-01-29 03:50:25 -08003209 .name = "ldpte",
Max Filippov09460972018-08-27 21:43:43 -07003210 .op_flags = XTENSA_OP_ILL,
Max Filippov13f6a7c2017-01-29 03:50:25 -08003211 }, {
Max Filippov59491e92022-05-01 22:57:49 -07003212 .name = "lict",
3213 .translate = translate_lct,
3214 .op_flags = XTENSA_OP_PRIVILEGED,
3215 }, {
3216 .name = "licw",
3217 .translate = translate_nop,
3218 .op_flags = XTENSA_OP_PRIVILEGED,
3219 }, {
Max Filippovfa6bc732018-10-02 18:50:13 -07003220 .name = (const char * const[]) {
3221 "loop", "loop.w15", NULL,
3222 },
Max Filippov168c12b2017-11-03 18:29:27 -07003223 .translate = translate_loop,
3224 .par = (const uint32_t[]){TCG_COND_NEVER},
Max Filippovfa6bc732018-10-02 18:50:13 -07003225 .op_flags = XTENSA_OP_NAME_ARRAY,
Max Filippov168c12b2017-11-03 18:29:27 -07003226 }, {
Max Filippovfa6bc732018-10-02 18:50:13 -07003227 .name = (const char * const[]) {
3228 "loopgtz", "loopgtz.w15", NULL,
3229 },
Max Filippov168c12b2017-11-03 18:29:27 -07003230 .translate = translate_loop,
3231 .par = (const uint32_t[]){TCG_COND_GT},
Max Filippovfa6bc732018-10-02 18:50:13 -07003232 .op_flags = XTENSA_OP_NAME_ARRAY,
Max Filippov168c12b2017-11-03 18:29:27 -07003233 }, {
Max Filippovfa6bc732018-10-02 18:50:13 -07003234 .name = (const char * const[]) {
3235 "loopnez", "loopnez.w15", NULL,
3236 },
Max Filippov168c12b2017-11-03 18:29:27 -07003237 .translate = translate_loop,
3238 .par = (const uint32_t[]){TCG_COND_NE},
Max Filippovfa6bc732018-10-02 18:50:13 -07003239 .op_flags = XTENSA_OP_NAME_ARRAY,
Max Filippov168c12b2017-11-03 18:29:27 -07003240 }, {
3241 .name = "max",
Richard Henderson426afc32018-05-10 18:10:57 +01003242 .translate = translate_smax,
Max Filippov168c12b2017-11-03 18:29:27 -07003243 }, {
3244 .name = "maxu",
Richard Henderson426afc32018-05-10 18:10:57 +01003245 .translate = translate_umax,
Max Filippov168c12b2017-11-03 18:29:27 -07003246 }, {
3247 .name = "memw",
Max Filippov9fb40342017-03-06 17:17:43 -08003248 .translate = translate_memw,
Max Filippov168c12b2017-11-03 18:29:27 -07003249 }, {
3250 .name = "min",
Richard Henderson426afc32018-05-10 18:10:57 +01003251 .translate = translate_smin,
Max Filippov168c12b2017-11-03 18:29:27 -07003252 }, {
3253 .name = "minu",
Richard Henderson426afc32018-05-10 18:10:57 +01003254 .translate = translate_umin,
Max Filippov168c12b2017-11-03 18:29:27 -07003255 }, {
Max Filippovd863fcf2019-02-09 23:39:10 -08003256 .name = (const char * const[]) {
3257 "mov", "mov.n", NULL,
3258 },
Max Filippov168c12b2017-11-03 18:29:27 -07003259 .translate = translate_mov,
Max Filippovd863fcf2019-02-09 23:39:10 -08003260 .op_flags = XTENSA_OP_NAME_ARRAY,
Max Filippov168c12b2017-11-03 18:29:27 -07003261 }, {
3262 .name = "moveqz",
3263 .translate = translate_movcond,
3264 .par = (const uint32_t[]){TCG_COND_EQ},
3265 }, {
3266 .name = "movf",
3267 .translate = translate_movp,
3268 .par = (const uint32_t[]){TCG_COND_EQ},
3269 }, {
3270 .name = "movgez",
3271 .translate = translate_movcond,
3272 .par = (const uint32_t[]){TCG_COND_GE},
3273 }, {
3274 .name = "movi",
3275 .translate = translate_movi,
3276 }, {
3277 .name = "movi.n",
3278 .translate = translate_movi,
3279 }, {
3280 .name = "movltz",
3281 .translate = translate_movcond,
3282 .par = (const uint32_t[]){TCG_COND_LT},
3283 }, {
3284 .name = "movnez",
3285 .translate = translate_movcond,
3286 .par = (const uint32_t[]){TCG_COND_NE},
3287 }, {
3288 .name = "movsp",
3289 .translate = translate_movsp,
Max Filippov90d64942018-08-30 18:21:22 -07003290 .op_flags = XTENSA_OP_ALLOCA,
Max Filippov168c12b2017-11-03 18:29:27 -07003291 }, {
3292 .name = "movt",
3293 .translate = translate_movp,
3294 .par = (const uint32_t[]){TCG_COND_NE},
3295 }, {
3296 .name = "mul.aa.hh",
3297 .translate = translate_mac16,
Max Filippov7aa78342019-02-11 19:16:14 -08003298 .par = (const uint32_t[]){MAC16_MUL, MAC16_HH, 0},
Max Filippov168c12b2017-11-03 18:29:27 -07003299 }, {
3300 .name = "mul.aa.hl",
3301 .translate = translate_mac16,
Max Filippov7aa78342019-02-11 19:16:14 -08003302 .par = (const uint32_t[]){MAC16_MUL, MAC16_HL, 0},
Max Filippov168c12b2017-11-03 18:29:27 -07003303 }, {
3304 .name = "mul.aa.lh",
3305 .translate = translate_mac16,
Max Filippov7aa78342019-02-11 19:16:14 -08003306 .par = (const uint32_t[]){MAC16_MUL, MAC16_LH, 0},
Max Filippov168c12b2017-11-03 18:29:27 -07003307 }, {
3308 .name = "mul.aa.ll",
3309 .translate = translate_mac16,
Max Filippov7aa78342019-02-11 19:16:14 -08003310 .par = (const uint32_t[]){MAC16_MUL, MAC16_LL, 0},
Max Filippov168c12b2017-11-03 18:29:27 -07003311 }, {
3312 .name = "mul.ad.hh",
3313 .translate = translate_mac16,
Max Filippov7aa78342019-02-11 19:16:14 -08003314 .par = (const uint32_t[]){MAC16_MUL, MAC16_HH, 0},
Max Filippov168c12b2017-11-03 18:29:27 -07003315 }, {
3316 .name = "mul.ad.hl",
3317 .translate = translate_mac16,
Max Filippov7aa78342019-02-11 19:16:14 -08003318 .par = (const uint32_t[]){MAC16_MUL, MAC16_HL, 0},
Max Filippov168c12b2017-11-03 18:29:27 -07003319 }, {
3320 .name = "mul.ad.lh",
3321 .translate = translate_mac16,
Max Filippov7aa78342019-02-11 19:16:14 -08003322 .par = (const uint32_t[]){MAC16_MUL, MAC16_LH, 0},
Max Filippov168c12b2017-11-03 18:29:27 -07003323 }, {
3324 .name = "mul.ad.ll",
3325 .translate = translate_mac16,
Max Filippov7aa78342019-02-11 19:16:14 -08003326 .par = (const uint32_t[]){MAC16_MUL, MAC16_LL, 0},
Max Filippov168c12b2017-11-03 18:29:27 -07003327 }, {
3328 .name = "mul.da.hh",
3329 .translate = translate_mac16,
Max Filippov7aa78342019-02-11 19:16:14 -08003330 .par = (const uint32_t[]){MAC16_MUL, MAC16_HH, 0},
Max Filippov168c12b2017-11-03 18:29:27 -07003331 }, {
3332 .name = "mul.da.hl",
3333 .translate = translate_mac16,
Max Filippov7aa78342019-02-11 19:16:14 -08003334 .par = (const uint32_t[]){MAC16_MUL, MAC16_HL, 0},
Max Filippov168c12b2017-11-03 18:29:27 -07003335 }, {
3336 .name = "mul.da.lh",
3337 .translate = translate_mac16,
Max Filippov7aa78342019-02-11 19:16:14 -08003338 .par = (const uint32_t[]){MAC16_MUL, MAC16_LH, 0},
Max Filippov168c12b2017-11-03 18:29:27 -07003339 }, {
3340 .name = "mul.da.ll",
3341 .translate = translate_mac16,
Max Filippov7aa78342019-02-11 19:16:14 -08003342 .par = (const uint32_t[]){MAC16_MUL, MAC16_LL, 0},
Max Filippov168c12b2017-11-03 18:29:27 -07003343 }, {
3344 .name = "mul.dd.hh",
3345 .translate = translate_mac16,
Max Filippov7aa78342019-02-11 19:16:14 -08003346 .par = (const uint32_t[]){MAC16_MUL, MAC16_HH, 0},
Max Filippov168c12b2017-11-03 18:29:27 -07003347 }, {
3348 .name = "mul.dd.hl",
3349 .translate = translate_mac16,
Max Filippov7aa78342019-02-11 19:16:14 -08003350 .par = (const uint32_t[]){MAC16_MUL, MAC16_HL, 0},
Max Filippov168c12b2017-11-03 18:29:27 -07003351 }, {
3352 .name = "mul.dd.lh",
3353 .translate = translate_mac16,
Max Filippov7aa78342019-02-11 19:16:14 -08003354 .par = (const uint32_t[]){MAC16_MUL, MAC16_LH, 0},
Max Filippov168c12b2017-11-03 18:29:27 -07003355 }, {
3356 .name = "mul.dd.ll",
3357 .translate = translate_mac16,
Max Filippov7aa78342019-02-11 19:16:14 -08003358 .par = (const uint32_t[]){MAC16_MUL, MAC16_LL, 0},
Max Filippov168c12b2017-11-03 18:29:27 -07003359 }, {
3360 .name = "mul16s",
3361 .translate = translate_mul16,
3362 .par = (const uint32_t[]){true},
3363 }, {
3364 .name = "mul16u",
3365 .translate = translate_mul16,
3366 .par = (const uint32_t[]){false},
3367 }, {
3368 .name = "mula.aa.hh",
3369 .translate = translate_mac16,
Max Filippov7aa78342019-02-11 19:16:14 -08003370 .par = (const uint32_t[]){MAC16_MULA, MAC16_HH, 0},
Max Filippov168c12b2017-11-03 18:29:27 -07003371 }, {
3372 .name = "mula.aa.hl",
3373 .translate = translate_mac16,
Max Filippov7aa78342019-02-11 19:16:14 -08003374 .par = (const uint32_t[]){MAC16_MULA, MAC16_HL, 0},
Max Filippov168c12b2017-11-03 18:29:27 -07003375 }, {
3376 .name = "mula.aa.lh",
3377 .translate = translate_mac16,
Max Filippov7aa78342019-02-11 19:16:14 -08003378 .par = (const uint32_t[]){MAC16_MULA, MAC16_LH, 0},
Max Filippov168c12b2017-11-03 18:29:27 -07003379 }, {
3380 .name = "mula.aa.ll",
3381 .translate = translate_mac16,
Max Filippov7aa78342019-02-11 19:16:14 -08003382 .par = (const uint32_t[]){MAC16_MULA, MAC16_LL, 0},
Max Filippov168c12b2017-11-03 18:29:27 -07003383 }, {
3384 .name = "mula.ad.hh",
3385 .translate = translate_mac16,
Max Filippov7aa78342019-02-11 19:16:14 -08003386 .par = (const uint32_t[]){MAC16_MULA, MAC16_HH, 0},
Max Filippov168c12b2017-11-03 18:29:27 -07003387 }, {
3388 .name = "mula.ad.hl",
3389 .translate = translate_mac16,
Max Filippov7aa78342019-02-11 19:16:14 -08003390 .par = (const uint32_t[]){MAC16_MULA, MAC16_HL, 0},
Max Filippov168c12b2017-11-03 18:29:27 -07003391 }, {
3392 .name = "mula.ad.lh",
3393 .translate = translate_mac16,
Max Filippov7aa78342019-02-11 19:16:14 -08003394 .par = (const uint32_t[]){MAC16_MULA, MAC16_LH, 0},
Max Filippov168c12b2017-11-03 18:29:27 -07003395 }, {
3396 .name = "mula.ad.ll",
3397 .translate = translate_mac16,
Max Filippov7aa78342019-02-11 19:16:14 -08003398 .par = (const uint32_t[]){MAC16_MULA, MAC16_LL, 0},
Max Filippov168c12b2017-11-03 18:29:27 -07003399 }, {
3400 .name = "mula.da.hh",
3401 .translate = translate_mac16,
Max Filippov7aa78342019-02-11 19:16:14 -08003402 .par = (const uint32_t[]){MAC16_MULA, MAC16_HH, 0},
Max Filippov168c12b2017-11-03 18:29:27 -07003403 }, {
3404 .name = "mula.da.hh.lddec",
3405 .translate = translate_mac16,
Max Filippov7aa78342019-02-11 19:16:14 -08003406 .par = (const uint32_t[]){MAC16_MULA, MAC16_HH, -4},
Max Filippov168c12b2017-11-03 18:29:27 -07003407 }, {
3408 .name = "mula.da.hh.ldinc",
3409 .translate = translate_mac16,
Max Filippov7aa78342019-02-11 19:16:14 -08003410 .par = (const uint32_t[]){MAC16_MULA, MAC16_HH, 4},
Max Filippov168c12b2017-11-03 18:29:27 -07003411 }, {
3412 .name = "mula.da.hl",
3413 .translate = translate_mac16,
Max Filippov7aa78342019-02-11 19:16:14 -08003414 .par = (const uint32_t[]){MAC16_MULA, MAC16_HL, 0},
Max Filippov168c12b2017-11-03 18:29:27 -07003415 }, {
3416 .name = "mula.da.hl.lddec",
3417 .translate = translate_mac16,
Max Filippov7aa78342019-02-11 19:16:14 -08003418 .par = (const uint32_t[]){MAC16_MULA, MAC16_HL, -4},
Max Filippov168c12b2017-11-03 18:29:27 -07003419 }, {
3420 .name = "mula.da.hl.ldinc",
3421 .translate = translate_mac16,
Max Filippov7aa78342019-02-11 19:16:14 -08003422 .par = (const uint32_t[]){MAC16_MULA, MAC16_HL, 4},
Max Filippov168c12b2017-11-03 18:29:27 -07003423 }, {
3424 .name = "mula.da.lh",
3425 .translate = translate_mac16,
Max Filippov7aa78342019-02-11 19:16:14 -08003426 .par = (const uint32_t[]){MAC16_MULA, MAC16_LH, 0},
Max Filippov168c12b2017-11-03 18:29:27 -07003427 }, {
3428 .name = "mula.da.lh.lddec",
3429 .translate = translate_mac16,
Max Filippov7aa78342019-02-11 19:16:14 -08003430 .par = (const uint32_t[]){MAC16_MULA, MAC16_LH, -4},
Max Filippov168c12b2017-11-03 18:29:27 -07003431 }, {
3432 .name = "mula.da.lh.ldinc",
3433 .translate = translate_mac16,
Max Filippov7aa78342019-02-11 19:16:14 -08003434 .par = (const uint32_t[]){MAC16_MULA, MAC16_LH, 4},
Max Filippov168c12b2017-11-03 18:29:27 -07003435 }, {
3436 .name = "mula.da.ll",
3437 .translate = translate_mac16,
Max Filippov7aa78342019-02-11 19:16:14 -08003438 .par = (const uint32_t[]){MAC16_MULA, MAC16_LL, 0},
Max Filippov168c12b2017-11-03 18:29:27 -07003439 }, {
3440 .name = "mula.da.ll.lddec",
3441 .translate = translate_mac16,
Max Filippov7aa78342019-02-11 19:16:14 -08003442 .par = (const uint32_t[]){MAC16_MULA, MAC16_LL, -4},
Max Filippov168c12b2017-11-03 18:29:27 -07003443 }, {
3444 .name = "mula.da.ll.ldinc",
3445 .translate = translate_mac16,
Max Filippov7aa78342019-02-11 19:16:14 -08003446 .par = (const uint32_t[]){MAC16_MULA, MAC16_LL, 4},
Max Filippov168c12b2017-11-03 18:29:27 -07003447 }, {
3448 .name = "mula.dd.hh",
3449 .translate = translate_mac16,
Max Filippov7aa78342019-02-11 19:16:14 -08003450 .par = (const uint32_t[]){MAC16_MULA, MAC16_HH, 0},
Max Filippov168c12b2017-11-03 18:29:27 -07003451 }, {
3452 .name = "mula.dd.hh.lddec",
3453 .translate = translate_mac16,
Max Filippov7aa78342019-02-11 19:16:14 -08003454 .par = (const uint32_t[]){MAC16_MULA, MAC16_HH, -4},
Max Filippov168c12b2017-11-03 18:29:27 -07003455 }, {
3456 .name = "mula.dd.hh.ldinc",
3457 .translate = translate_mac16,
Max Filippov7aa78342019-02-11 19:16:14 -08003458 .par = (const uint32_t[]){MAC16_MULA, MAC16_HH, 4},
Max Filippov168c12b2017-11-03 18:29:27 -07003459 }, {
3460 .name = "mula.dd.hl",
3461 .translate = translate_mac16,
Max Filippov7aa78342019-02-11 19:16:14 -08003462 .par = (const uint32_t[]){MAC16_MULA, MAC16_HL, 0},
Max Filippov168c12b2017-11-03 18:29:27 -07003463 }, {
3464 .name = "mula.dd.hl.lddec",
3465 .translate = translate_mac16,
Max Filippov7aa78342019-02-11 19:16:14 -08003466 .par = (const uint32_t[]){MAC16_MULA, MAC16_HL, -4},
Max Filippov168c12b2017-11-03 18:29:27 -07003467 }, {
3468 .name = "mula.dd.hl.ldinc",
3469 .translate = translate_mac16,
Max Filippov7aa78342019-02-11 19:16:14 -08003470 .par = (const uint32_t[]){MAC16_MULA, MAC16_HL, 4},
Max Filippov168c12b2017-11-03 18:29:27 -07003471 }, {
3472 .name = "mula.dd.lh",
3473 .translate = translate_mac16,
Max Filippov7aa78342019-02-11 19:16:14 -08003474 .par = (const uint32_t[]){MAC16_MULA, MAC16_LH, 0},
Max Filippov168c12b2017-11-03 18:29:27 -07003475 }, {
3476 .name = "mula.dd.lh.lddec",
3477 .translate = translate_mac16,
Max Filippov7aa78342019-02-11 19:16:14 -08003478 .par = (const uint32_t[]){MAC16_MULA, MAC16_LH, -4},
Max Filippov168c12b2017-11-03 18:29:27 -07003479 }, {
3480 .name = "mula.dd.lh.ldinc",
3481 .translate = translate_mac16,
Max Filippov7aa78342019-02-11 19:16:14 -08003482 .par = (const uint32_t[]){MAC16_MULA, MAC16_LH, 4},
Max Filippov168c12b2017-11-03 18:29:27 -07003483 }, {
3484 .name = "mula.dd.ll",
3485 .translate = translate_mac16,
Max Filippov7aa78342019-02-11 19:16:14 -08003486 .par = (const uint32_t[]){MAC16_MULA, MAC16_LL, 0},
Max Filippov168c12b2017-11-03 18:29:27 -07003487 }, {
3488 .name = "mula.dd.ll.lddec",
3489 .translate = translate_mac16,
Max Filippov7aa78342019-02-11 19:16:14 -08003490 .par = (const uint32_t[]){MAC16_MULA, MAC16_LL, -4},
Max Filippov168c12b2017-11-03 18:29:27 -07003491 }, {
3492 .name = "mula.dd.ll.ldinc",
3493 .translate = translate_mac16,
Max Filippov7aa78342019-02-11 19:16:14 -08003494 .par = (const uint32_t[]){MAC16_MULA, MAC16_LL, 4},
Max Filippov168c12b2017-11-03 18:29:27 -07003495 }, {
3496 .name = "mull",
3497 .translate = translate_mull,
3498 }, {
3499 .name = "muls.aa.hh",
3500 .translate = translate_mac16,
Max Filippov7aa78342019-02-11 19:16:14 -08003501 .par = (const uint32_t[]){MAC16_MULS, MAC16_HH, 0},
Max Filippov168c12b2017-11-03 18:29:27 -07003502 }, {
3503 .name = "muls.aa.hl",
3504 .translate = translate_mac16,
Max Filippov7aa78342019-02-11 19:16:14 -08003505 .par = (const uint32_t[]){MAC16_MULS, MAC16_HL, 0},
Max Filippov168c12b2017-11-03 18:29:27 -07003506 }, {
3507 .name = "muls.aa.lh",
3508 .translate = translate_mac16,
Max Filippov7aa78342019-02-11 19:16:14 -08003509 .par = (const uint32_t[]){MAC16_MULS, MAC16_LH, 0},
Max Filippov168c12b2017-11-03 18:29:27 -07003510 }, {
3511 .name = "muls.aa.ll",
3512 .translate = translate_mac16,
Max Filippov7aa78342019-02-11 19:16:14 -08003513 .par = (const uint32_t[]){MAC16_MULS, MAC16_LL, 0},
Max Filippov168c12b2017-11-03 18:29:27 -07003514 }, {
3515 .name = "muls.ad.hh",
3516 .translate = translate_mac16,
Max Filippov7aa78342019-02-11 19:16:14 -08003517 .par = (const uint32_t[]){MAC16_MULS, MAC16_HH, 0},
Max Filippov168c12b2017-11-03 18:29:27 -07003518 }, {
3519 .name = "muls.ad.hl",
3520 .translate = translate_mac16,
Max Filippov7aa78342019-02-11 19:16:14 -08003521 .par = (const uint32_t[]){MAC16_MULS, MAC16_HL, 0},
Max Filippov168c12b2017-11-03 18:29:27 -07003522 }, {
3523 .name = "muls.ad.lh",
3524 .translate = translate_mac16,
Max Filippov7aa78342019-02-11 19:16:14 -08003525 .par = (const uint32_t[]){MAC16_MULS, MAC16_LH, 0},
Max Filippov168c12b2017-11-03 18:29:27 -07003526 }, {
3527 .name = "muls.ad.ll",
3528 .translate = translate_mac16,
Max Filippov7aa78342019-02-11 19:16:14 -08003529 .par = (const uint32_t[]){MAC16_MULS, MAC16_LL, 0},
Max Filippov168c12b2017-11-03 18:29:27 -07003530 }, {
3531 .name = "muls.da.hh",
3532 .translate = translate_mac16,
Max Filippov7aa78342019-02-11 19:16:14 -08003533 .par = (const uint32_t[]){MAC16_MULS, MAC16_HH, 0},
Max Filippov168c12b2017-11-03 18:29:27 -07003534 }, {
3535 .name = "muls.da.hl",
3536 .translate = translate_mac16,
Max Filippov7aa78342019-02-11 19:16:14 -08003537 .par = (const uint32_t[]){MAC16_MULS, MAC16_HL, 0},
Max Filippov168c12b2017-11-03 18:29:27 -07003538 }, {
3539 .name = "muls.da.lh",
3540 .translate = translate_mac16,
Max Filippov7aa78342019-02-11 19:16:14 -08003541 .par = (const uint32_t[]){MAC16_MULS, MAC16_LH, 0},
Max Filippov168c12b2017-11-03 18:29:27 -07003542 }, {
3543 .name = "muls.da.ll",
3544 .translate = translate_mac16,
Max Filippov7aa78342019-02-11 19:16:14 -08003545 .par = (const uint32_t[]){MAC16_MULS, MAC16_LL, 0},
Max Filippov168c12b2017-11-03 18:29:27 -07003546 }, {
3547 .name = "muls.dd.hh",
3548 .translate = translate_mac16,
Max Filippov7aa78342019-02-11 19:16:14 -08003549 .par = (const uint32_t[]){MAC16_MULS, MAC16_HH, 0},
Max Filippov168c12b2017-11-03 18:29:27 -07003550 }, {
3551 .name = "muls.dd.hl",
3552 .translate = translate_mac16,
Max Filippov7aa78342019-02-11 19:16:14 -08003553 .par = (const uint32_t[]){MAC16_MULS, MAC16_HL, 0},
Max Filippov168c12b2017-11-03 18:29:27 -07003554 }, {
3555 .name = "muls.dd.lh",
3556 .translate = translate_mac16,
Max Filippov7aa78342019-02-11 19:16:14 -08003557 .par = (const uint32_t[]){MAC16_MULS, MAC16_LH, 0},
Max Filippov168c12b2017-11-03 18:29:27 -07003558 }, {
3559 .name = "muls.dd.ll",
3560 .translate = translate_mac16,
Max Filippov7aa78342019-02-11 19:16:14 -08003561 .par = (const uint32_t[]){MAC16_MULS, MAC16_LL, 0},
Max Filippov168c12b2017-11-03 18:29:27 -07003562 }, {
3563 .name = "mulsh",
3564 .translate = translate_mulh,
3565 .par = (const uint32_t[]){true},
3566 }, {
3567 .name = "muluh",
3568 .translate = translate_mulh,
3569 .par = (const uint32_t[]){false},
3570 }, {
3571 .name = "neg",
3572 .translate = translate_neg,
3573 }, {
Max Filippovd863fcf2019-02-09 23:39:10 -08003574 .name = (const char * const[]) {
3575 "nop", "nop.n", NULL,
3576 },
Max Filippov168c12b2017-11-03 18:29:27 -07003577 .translate = translate_nop,
Max Filippovd863fcf2019-02-09 23:39:10 -08003578 .op_flags = XTENSA_OP_NAME_ARRAY,
Max Filippov168c12b2017-11-03 18:29:27 -07003579 }, {
3580 .name = "nsa",
3581 .translate = translate_nsa,
3582 }, {
3583 .name = "nsau",
3584 .translate = translate_nsau,
3585 }, {
3586 .name = "or",
3587 .translate = translate_or,
3588 }, {
3589 .name = "orb",
3590 .translate = translate_boolean,
3591 .par = (const uint32_t[]){BOOLEAN_OR},
3592 }, {
3593 .name = "orbc",
3594 .translate = translate_boolean,
3595 .par = (const uint32_t[]){BOOLEAN_ORC},
3596 }, {
3597 .name = "pdtlb",
3598 .translate = translate_ptlb,
3599 .par = (const uint32_t[]){true},
Max Filippov21a2dad2018-08-27 22:17:50 -07003600 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07003601 }, {
Max Filippovc8844002019-04-15 17:45:02 -07003602 .name = "pfend.a",
3603 .translate = translate_nop,
3604 }, {
3605 .name = "pfend.o",
3606 .translate = translate_nop,
3607 }, {
3608 .name = "pfnxt.f",
3609 .translate = translate_nop,
3610 }, {
3611 .name = "pfwait.a",
3612 .translate = translate_nop,
3613 }, {
Max Filippov1a033622020-02-26 12:43:52 -08003614 .name = "pfwait.r",
Max Filippovc8844002019-04-15 17:45:02 -07003615 .translate = translate_nop,
3616 }, {
Max Filippov168c12b2017-11-03 18:29:27 -07003617 .name = "pitlb",
3618 .translate = translate_ptlb,
3619 .par = (const uint32_t[]){false},
Max Filippov21a2dad2018-08-27 22:17:50 -07003620 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07003621 }, {
Max Filippov4d04ea32019-03-13 12:40:38 -07003622 .name = "pptlb",
3623 .translate = translate_pptlb,
3624 .op_flags = XTENSA_OP_PRIVILEGED,
3625 }, {
Max Filippov168c12b2017-11-03 18:29:27 -07003626 .name = "quos",
3627 .translate = translate_quos,
3628 .par = (const uint32_t[]){true},
Max Filippov4a038952018-08-31 21:26:54 -07003629 .op_flags = XTENSA_OP_DIVIDE_BY_ZERO,
Max Filippov168c12b2017-11-03 18:29:27 -07003630 }, {
3631 .name = "quou",
3632 .translate = translate_quou,
Max Filippov4a038952018-08-31 21:26:54 -07003633 .op_flags = XTENSA_OP_DIVIDE_BY_ZERO,
Max Filippov168c12b2017-11-03 18:29:27 -07003634 }, {
3635 .name = "rdtlb0",
3636 .translate = translate_rtlb,
3637 .par = (const uint32_t[]){true, 0},
Max Filippov21a2dad2018-08-27 22:17:50 -07003638 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07003639 }, {
3640 .name = "rdtlb1",
3641 .translate = translate_rtlb,
3642 .par = (const uint32_t[]){true, 1},
Max Filippov21a2dad2018-08-27 22:17:50 -07003643 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07003644 }, {
Max Filippove9872742017-02-17 16:21:36 -08003645 .name = "read_impwire",
3646 .translate = translate_read_impwire,
3647 }, {
Max Filippov168c12b2017-11-03 18:29:27 -07003648 .name = "rems",
3649 .translate = translate_quos,
3650 .par = (const uint32_t[]){false},
Max Filippov4a038952018-08-31 21:26:54 -07003651 .op_flags = XTENSA_OP_DIVIDE_BY_ZERO,
Max Filippov168c12b2017-11-03 18:29:27 -07003652 }, {
3653 .name = "remu",
Max Filippov4a038952018-08-31 21:26:54 -07003654 .translate = translate_remu,
3655 .op_flags = XTENSA_OP_DIVIDE_BY_ZERO,
Max Filippov168c12b2017-11-03 18:29:27 -07003656 }, {
3657 .name = "rer",
3658 .translate = translate_rer,
Max Filippov21a2dad2018-08-27 22:17:50 -07003659 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07003660 }, {
Max Filippovd863fcf2019-02-09 23:39:10 -08003661 .name = (const char * const[]) {
3662 "ret", "ret.n", NULL,
3663 },
Max Filippov168c12b2017-11-03 18:29:27 -07003664 .translate = translate_ret,
Max Filippovd863fcf2019-02-09 23:39:10 -08003665 .op_flags = XTENSA_OP_NAME_ARRAY,
Max Filippov168c12b2017-11-03 18:29:27 -07003666 }, {
Max Filippovd863fcf2019-02-09 23:39:10 -08003667 .name = (const char * const[]) {
3668 "retw", "retw.n", NULL,
3669 },
Max Filippov168c12b2017-11-03 18:29:27 -07003670 .translate = translate_retw,
Max Filippov91dc2b22020-05-04 14:08:40 -07003671 .test_exceptions = test_exceptions_retw,
Max Filippovd863fcf2019-02-09 23:39:10 -08003672 .op_flags = XTENSA_OP_UNDERFLOW | XTENSA_OP_NAME_ARRAY,
Max Filippov168c12b2017-11-03 18:29:27 -07003673 }, {
Max Filippov13f6a7c2017-01-29 03:50:25 -08003674 .name = "rfdd",
Max Filippov09460972018-08-27 21:43:43 -07003675 .op_flags = XTENSA_OP_ILL,
Max Filippov13f6a7c2017-01-29 03:50:25 -08003676 }, {
Max Filippov168c12b2017-11-03 18:29:27 -07003677 .name = "rfde",
3678 .translate = translate_rfde,
Max Filippov21a2dad2018-08-27 22:17:50 -07003679 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07003680 }, {
Max Filippov13f6a7c2017-01-29 03:50:25 -08003681 .name = "rfdo",
Max Filippov09460972018-08-27 21:43:43 -07003682 .op_flags = XTENSA_OP_ILL,
Max Filippov13f6a7c2017-01-29 03:50:25 -08003683 }, {
Max Filippov168c12b2017-11-03 18:29:27 -07003684 .name = "rfe",
3685 .translate = translate_rfe,
Max Filippovd74624e2018-09-02 02:07:30 -07003686 .op_flags = XTENSA_OP_PRIVILEGED | XTENSA_OP_CHECK_INTERRUPTS,
Max Filippov168c12b2017-11-03 18:29:27 -07003687 }, {
3688 .name = "rfi",
3689 .translate = translate_rfi,
Max Filippovd74624e2018-09-02 02:07:30 -07003690 .op_flags = XTENSA_OP_PRIVILEGED | XTENSA_OP_CHECK_INTERRUPTS,
Max Filippov168c12b2017-11-03 18:29:27 -07003691 }, {
3692 .name = "rfwo",
3693 .translate = translate_rfw,
3694 .par = (const uint32_t[]){true},
Max Filippovd74624e2018-09-02 02:07:30 -07003695 .op_flags = XTENSA_OP_PRIVILEGED | XTENSA_OP_CHECK_INTERRUPTS,
Max Filippov168c12b2017-11-03 18:29:27 -07003696 }, {
3697 .name = "rfwu",
3698 .translate = translate_rfw,
3699 .par = (const uint32_t[]){false},
Max Filippovd74624e2018-09-02 02:07:30 -07003700 .op_flags = XTENSA_OP_PRIVILEGED | XTENSA_OP_CHECK_INTERRUPTS,
Max Filippov168c12b2017-11-03 18:29:27 -07003701 }, {
3702 .name = "ritlb0",
3703 .translate = translate_rtlb,
3704 .par = (const uint32_t[]){false, 0},
Max Filippov21a2dad2018-08-27 22:17:50 -07003705 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07003706 }, {
3707 .name = "ritlb1",
3708 .translate = translate_rtlb,
3709 .par = (const uint32_t[]){false, 1},
Max Filippov21a2dad2018-08-27 22:17:50 -07003710 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07003711 }, {
Max Filippov4d04ea32019-03-13 12:40:38 -07003712 .name = "rptlb0",
3713 .translate = translate_rptlb0,
3714 .op_flags = XTENSA_OP_PRIVILEGED,
3715 }, {
3716 .name = "rptlb1",
3717 .translate = translate_rptlb1,
3718 .op_flags = XTENSA_OP_PRIVILEGED,
3719 }, {
Max Filippov168c12b2017-11-03 18:29:27 -07003720 .name = "rotw",
3721 .translate = translate_rotw,
Max Filippov8df3fd32019-01-30 14:56:29 -08003722 .op_flags = XTENSA_OP_PRIVILEGED |
3723 XTENSA_OP_EXIT_TB_M1 |
3724 XTENSA_OP_SYNC_REGISTER_WINDOW,
Max Filippov168c12b2017-11-03 18:29:27 -07003725 }, {
3726 .name = "rsil",
3727 .translate = translate_rsil,
Max Filippovd74624e2018-09-02 02:07:30 -07003728 .op_flags =
3729 XTENSA_OP_PRIVILEGED |
3730 XTENSA_OP_EXIT_TB_0 |
3731 XTENSA_OP_CHECK_INTERRUPTS,
Max Filippov168c12b2017-11-03 18:29:27 -07003732 }, {
3733 .name = "rsr.176",
3734 .translate = translate_rsr,
3735 .par = (const uint32_t[]){176},
Max Filippov21a2dad2018-08-27 22:17:50 -07003736 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07003737 }, {
3738 .name = "rsr.208",
3739 .translate = translate_rsr,
3740 .par = (const uint32_t[]){208},
Max Filippov21a2dad2018-08-27 22:17:50 -07003741 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07003742 }, {
3743 .name = "rsr.acchi",
3744 .translate = translate_rsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07003745 .test_exceptions = test_exceptions_sr,
Max Filippov59419602019-03-18 17:10:38 -07003746 .par = (const uint32_t[]){
3747 ACCHI,
3748 XTENSA_OPTION_MAC16,
3749 },
Max Filippov168c12b2017-11-03 18:29:27 -07003750 }, {
3751 .name = "rsr.acclo",
3752 .translate = translate_rsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07003753 .test_exceptions = test_exceptions_sr,
Max Filippov59419602019-03-18 17:10:38 -07003754 .par = (const uint32_t[]){
3755 ACCLO,
3756 XTENSA_OPTION_MAC16,
3757 },
Max Filippov168c12b2017-11-03 18:29:27 -07003758 }, {
3759 .name = "rsr.atomctl",
3760 .translate = translate_rsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07003761 .test_exceptions = test_exceptions_sr,
Max Filippov59419602019-03-18 17:10:38 -07003762 .par = (const uint32_t[]){
3763 ATOMCTL,
3764 XTENSA_OPTION_ATOMCTL,
3765 },
Max Filippov21a2dad2018-08-27 22:17:50 -07003766 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07003767 }, {
3768 .name = "rsr.br",
3769 .translate = translate_rsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07003770 .test_exceptions = test_exceptions_sr,
Max Filippov59419602019-03-18 17:10:38 -07003771 .par = (const uint32_t[]){
3772 BR,
3773 XTENSA_OPTION_BOOLEAN,
3774 },
Max Filippov168c12b2017-11-03 18:29:27 -07003775 }, {
Max Filippov4d04ea32019-03-13 12:40:38 -07003776 .name = "rsr.cacheadrdis",
3777 .translate = translate_rsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07003778 .test_exceptions = test_exceptions_sr,
Max Filippov4d04ea32019-03-13 12:40:38 -07003779 .par = (const uint32_t[]){
3780 CACHEADRDIS,
3781 XTENSA_OPTION_MPU,
3782 },
3783 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07003784 }, {
3785 .name = "rsr.cacheattr",
3786 .translate = translate_rsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07003787 .test_exceptions = test_exceptions_sr,
Max Filippov59419602019-03-18 17:10:38 -07003788 .par = (const uint32_t[]){
3789 CACHEATTR,
3790 XTENSA_OPTION_CACHEATTR,
3791 },
Max Filippov21a2dad2018-08-27 22:17:50 -07003792 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07003793 }, {
3794 .name = "rsr.ccompare0",
3795 .translate = translate_rsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07003796 .test_exceptions = test_exceptions_ccompare,
Max Filippov59419602019-03-18 17:10:38 -07003797 .par = (const uint32_t[]){
3798 CCOMPARE,
3799 XTENSA_OPTION_TIMER_INTERRUPT,
3800 },
Max Filippov21a2dad2018-08-27 22:17:50 -07003801 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07003802 }, {
3803 .name = "rsr.ccompare1",
3804 .translate = translate_rsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07003805 .test_exceptions = test_exceptions_ccompare,
Max Filippov59419602019-03-18 17:10:38 -07003806 .par = (const uint32_t[]){
3807 CCOMPARE + 1,
3808 XTENSA_OPTION_TIMER_INTERRUPT,
3809 },
Max Filippov21a2dad2018-08-27 22:17:50 -07003810 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07003811 }, {
3812 .name = "rsr.ccompare2",
3813 .translate = translate_rsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07003814 .test_exceptions = test_exceptions_ccompare,
Max Filippov59419602019-03-18 17:10:38 -07003815 .par = (const uint32_t[]){
3816 CCOMPARE + 2,
3817 XTENSA_OPTION_TIMER_INTERRUPT,
3818 },
Max Filippov21a2dad2018-08-27 22:17:50 -07003819 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07003820 }, {
3821 .name = "rsr.ccount",
Max Filippov59419602019-03-18 17:10:38 -07003822 .translate = translate_rsr_ccount,
Max Filippov91dc2b22020-05-04 14:08:40 -07003823 .test_exceptions = test_exceptions_sr,
Max Filippov59419602019-03-18 17:10:38 -07003824 .par = (const uint32_t[]){
3825 CCOUNT,
3826 XTENSA_OPTION_TIMER_INTERRUPT,
3827 },
Max Filippovbf525102018-09-01 00:47:55 -07003828 .op_flags = XTENSA_OP_PRIVILEGED | XTENSA_OP_EXIT_TB_0,
Max Filippov168c12b2017-11-03 18:29:27 -07003829 }, {
3830 .name = "rsr.configid0",
3831 .translate = translate_rsr,
3832 .par = (const uint32_t[]){CONFIGID0},
Max Filippov21a2dad2018-08-27 22:17:50 -07003833 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07003834 }, {
3835 .name = "rsr.configid1",
3836 .translate = translate_rsr,
3837 .par = (const uint32_t[]){CONFIGID1},
Max Filippov21a2dad2018-08-27 22:17:50 -07003838 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07003839 }, {
3840 .name = "rsr.cpenable",
3841 .translate = translate_rsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07003842 .test_exceptions = test_exceptions_sr,
Max Filippov59419602019-03-18 17:10:38 -07003843 .par = (const uint32_t[]){
3844 CPENABLE,
3845 XTENSA_OPTION_COPROCESSOR,
3846 },
Max Filippov21a2dad2018-08-27 22:17:50 -07003847 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07003848 }, {
3849 .name = "rsr.dbreaka0",
3850 .translate = translate_rsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07003851 .test_exceptions = test_exceptions_dbreak,
Max Filippov59419602019-03-18 17:10:38 -07003852 .par = (const uint32_t[]){
3853 DBREAKA,
3854 XTENSA_OPTION_DEBUG,
3855 },
Max Filippov21a2dad2018-08-27 22:17:50 -07003856 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07003857 }, {
3858 .name = "rsr.dbreaka1",
3859 .translate = translate_rsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07003860 .test_exceptions = test_exceptions_dbreak,
Max Filippov59419602019-03-18 17:10:38 -07003861 .par = (const uint32_t[]){
3862 DBREAKA + 1,
3863 XTENSA_OPTION_DEBUG,
3864 },
Max Filippov21a2dad2018-08-27 22:17:50 -07003865 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07003866 }, {
3867 .name = "rsr.dbreakc0",
3868 .translate = translate_rsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07003869 .test_exceptions = test_exceptions_dbreak,
Max Filippov59419602019-03-18 17:10:38 -07003870 .par = (const uint32_t[]){
3871 DBREAKC,
3872 XTENSA_OPTION_DEBUG,
3873 },
Max Filippov21a2dad2018-08-27 22:17:50 -07003874 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07003875 }, {
3876 .name = "rsr.dbreakc1",
3877 .translate = translate_rsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07003878 .test_exceptions = test_exceptions_dbreak,
Max Filippov59419602019-03-18 17:10:38 -07003879 .par = (const uint32_t[]){
3880 DBREAKC + 1,
3881 XTENSA_OPTION_DEBUG,
3882 },
Max Filippov21a2dad2018-08-27 22:17:50 -07003883 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07003884 }, {
Max Filippov13f6a7c2017-01-29 03:50:25 -08003885 .name = "rsr.ddr",
3886 .translate = translate_rsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07003887 .test_exceptions = test_exceptions_sr,
Max Filippov59419602019-03-18 17:10:38 -07003888 .par = (const uint32_t[]){
3889 DDR,
3890 XTENSA_OPTION_DEBUG,
3891 },
Max Filippov21a2dad2018-08-27 22:17:50 -07003892 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov13f6a7c2017-01-29 03:50:25 -08003893 }, {
Max Filippov168c12b2017-11-03 18:29:27 -07003894 .name = "rsr.debugcause",
3895 .translate = translate_rsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07003896 .test_exceptions = test_exceptions_sr,
Max Filippov59419602019-03-18 17:10:38 -07003897 .par = (const uint32_t[]){
3898 DEBUGCAUSE,
3899 XTENSA_OPTION_DEBUG,
3900 },
Max Filippov21a2dad2018-08-27 22:17:50 -07003901 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07003902 }, {
3903 .name = "rsr.depc",
3904 .translate = translate_rsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07003905 .test_exceptions = test_exceptions_sr,
Max Filippov59419602019-03-18 17:10:38 -07003906 .par = (const uint32_t[]){
3907 DEPC,
3908 XTENSA_OPTION_EXCEPTION,
3909 },
Max Filippov21a2dad2018-08-27 22:17:50 -07003910 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07003911 }, {
3912 .name = "rsr.dtlbcfg",
3913 .translate = translate_rsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07003914 .test_exceptions = test_exceptions_sr,
Max Filippov59419602019-03-18 17:10:38 -07003915 .par = (const uint32_t[]){
3916 DTLBCFG,
3917 XTENSA_OPTION_MMU,
3918 },
Max Filippov21a2dad2018-08-27 22:17:50 -07003919 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07003920 }, {
3921 .name = "rsr.epc1",
3922 .translate = translate_rsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07003923 .test_exceptions = test_exceptions_sr,
Max Filippov59419602019-03-18 17:10:38 -07003924 .par = (const uint32_t[]){
3925 EPC1,
3926 XTENSA_OPTION_EXCEPTION,
3927 },
Max Filippov21a2dad2018-08-27 22:17:50 -07003928 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07003929 }, {
3930 .name = "rsr.epc2",
3931 .translate = translate_rsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07003932 .test_exceptions = test_exceptions_hpi,
Max Filippov59419602019-03-18 17:10:38 -07003933 .par = (const uint32_t[]){
3934 EPC1 + 1,
3935 XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
3936 },
Max Filippov21a2dad2018-08-27 22:17:50 -07003937 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07003938 }, {
3939 .name = "rsr.epc3",
3940 .translate = translate_rsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07003941 .test_exceptions = test_exceptions_hpi,
Max Filippov59419602019-03-18 17:10:38 -07003942 .par = (const uint32_t[]){
3943 EPC1 + 2,
3944 XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
3945 },
Max Filippov21a2dad2018-08-27 22:17:50 -07003946 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07003947 }, {
3948 .name = "rsr.epc4",
3949 .translate = translate_rsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07003950 .test_exceptions = test_exceptions_hpi,
Max Filippov59419602019-03-18 17:10:38 -07003951 .par = (const uint32_t[]){
3952 EPC1 + 3,
3953 XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
3954 },
Max Filippov21a2dad2018-08-27 22:17:50 -07003955 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07003956 }, {
3957 .name = "rsr.epc5",
3958 .translate = translate_rsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07003959 .test_exceptions = test_exceptions_hpi,
Max Filippov59419602019-03-18 17:10:38 -07003960 .par = (const uint32_t[]){
3961 EPC1 + 4,
3962 XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
3963 },
Max Filippov21a2dad2018-08-27 22:17:50 -07003964 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07003965 }, {
3966 .name = "rsr.epc6",
3967 .translate = translate_rsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07003968 .test_exceptions = test_exceptions_hpi,
Max Filippov59419602019-03-18 17:10:38 -07003969 .par = (const uint32_t[]){
3970 EPC1 + 5,
3971 XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
3972 },
Max Filippov21a2dad2018-08-27 22:17:50 -07003973 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07003974 }, {
3975 .name = "rsr.epc7",
3976 .translate = translate_rsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07003977 .test_exceptions = test_exceptions_hpi,
Max Filippov59419602019-03-18 17:10:38 -07003978 .par = (const uint32_t[]){
3979 EPC1 + 6,
3980 XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
3981 },
Max Filippov21a2dad2018-08-27 22:17:50 -07003982 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07003983 }, {
3984 .name = "rsr.eps2",
3985 .translate = translate_rsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07003986 .test_exceptions = test_exceptions_hpi,
Max Filippov59419602019-03-18 17:10:38 -07003987 .par = (const uint32_t[]){
3988 EPS2,
3989 XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
3990 },
Max Filippov21a2dad2018-08-27 22:17:50 -07003991 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07003992 }, {
3993 .name = "rsr.eps3",
3994 .translate = translate_rsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07003995 .test_exceptions = test_exceptions_hpi,
Max Filippov59419602019-03-18 17:10:38 -07003996 .par = (const uint32_t[]){
3997 EPS2 + 1,
3998 XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
3999 },
Max Filippov21a2dad2018-08-27 22:17:50 -07004000 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07004001 }, {
4002 .name = "rsr.eps4",
4003 .translate = translate_rsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07004004 .test_exceptions = test_exceptions_hpi,
Max Filippov59419602019-03-18 17:10:38 -07004005 .par = (const uint32_t[]){
4006 EPS2 + 2,
4007 XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
4008 },
Max Filippov21a2dad2018-08-27 22:17:50 -07004009 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07004010 }, {
4011 .name = "rsr.eps5",
4012 .translate = translate_rsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07004013 .test_exceptions = test_exceptions_hpi,
Max Filippov59419602019-03-18 17:10:38 -07004014 .par = (const uint32_t[]){
4015 EPS2 + 3,
4016 XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
4017 },
Max Filippov21a2dad2018-08-27 22:17:50 -07004018 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07004019 }, {
4020 .name = "rsr.eps6",
4021 .translate = translate_rsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07004022 .test_exceptions = test_exceptions_hpi,
Max Filippov59419602019-03-18 17:10:38 -07004023 .par = (const uint32_t[]){
4024 EPS2 + 4,
4025 XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
4026 },
Max Filippov21a2dad2018-08-27 22:17:50 -07004027 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07004028 }, {
4029 .name = "rsr.eps7",
4030 .translate = translate_rsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07004031 .test_exceptions = test_exceptions_hpi,
Max Filippov59419602019-03-18 17:10:38 -07004032 .par = (const uint32_t[]){
4033 EPS2 + 5,
4034 XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
4035 },
Max Filippov21a2dad2018-08-27 22:17:50 -07004036 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07004037 }, {
Max Filippov4d04ea32019-03-13 12:40:38 -07004038 .name = "rsr.eraccess",
4039 .translate = translate_rsr,
4040 .par = (const uint32_t[]){ERACCESS},
Max Filippov168c12b2017-11-03 18:29:27 -07004041 .op_flags = XTENSA_OP_PRIVILEGED,
4042 }, {
4043 .name = "rsr.exccause",
4044 .translate = translate_rsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07004045 .test_exceptions = test_exceptions_sr,
Max Filippov59419602019-03-18 17:10:38 -07004046 .par = (const uint32_t[]){
4047 EXCCAUSE,
4048 XTENSA_OPTION_EXCEPTION,
4049 },
Max Filippov21a2dad2018-08-27 22:17:50 -07004050 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07004051 }, {
4052 .name = "rsr.excsave1",
4053 .translate = translate_rsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07004054 .test_exceptions = test_exceptions_sr,
Max Filippov59419602019-03-18 17:10:38 -07004055 .par = (const uint32_t[]){
4056 EXCSAVE1,
4057 XTENSA_OPTION_EXCEPTION,
4058 },
Max Filippov21a2dad2018-08-27 22:17:50 -07004059 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07004060 }, {
4061 .name = "rsr.excsave2",
4062 .translate = translate_rsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07004063 .test_exceptions = test_exceptions_hpi,
Max Filippov59419602019-03-18 17:10:38 -07004064 .par = (const uint32_t[]){
4065 EXCSAVE1 + 1,
4066 XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
4067 },
Max Filippov21a2dad2018-08-27 22:17:50 -07004068 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07004069 }, {
4070 .name = "rsr.excsave3",
4071 .translate = translate_rsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07004072 .test_exceptions = test_exceptions_hpi,
Max Filippov59419602019-03-18 17:10:38 -07004073 .par = (const uint32_t[]){
4074 EXCSAVE1 + 2,
4075 XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
4076 },
Max Filippov21a2dad2018-08-27 22:17:50 -07004077 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07004078 }, {
4079 .name = "rsr.excsave4",
4080 .translate = translate_rsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07004081 .test_exceptions = test_exceptions_hpi,
Max Filippov59419602019-03-18 17:10:38 -07004082 .par = (const uint32_t[]){
4083 EXCSAVE1 + 3,
4084 XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
4085 },
Max Filippov21a2dad2018-08-27 22:17:50 -07004086 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07004087 }, {
4088 .name = "rsr.excsave5",
4089 .translate = translate_rsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07004090 .test_exceptions = test_exceptions_hpi,
Max Filippov59419602019-03-18 17:10:38 -07004091 .par = (const uint32_t[]){
4092 EXCSAVE1 + 4,
4093 XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
4094 },
Max Filippov21a2dad2018-08-27 22:17:50 -07004095 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07004096 }, {
4097 .name = "rsr.excsave6",
4098 .translate = translate_rsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07004099 .test_exceptions = test_exceptions_hpi,
Max Filippov59419602019-03-18 17:10:38 -07004100 .par = (const uint32_t[]){
4101 EXCSAVE1 + 5,
4102 XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
4103 },
Max Filippov21a2dad2018-08-27 22:17:50 -07004104 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07004105 }, {
4106 .name = "rsr.excsave7",
4107 .translate = translate_rsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07004108 .test_exceptions = test_exceptions_hpi,
Max Filippov59419602019-03-18 17:10:38 -07004109 .par = (const uint32_t[]){
4110 EXCSAVE1 + 6,
4111 XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
4112 },
Max Filippov21a2dad2018-08-27 22:17:50 -07004113 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07004114 }, {
4115 .name = "rsr.excvaddr",
4116 .translate = translate_rsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07004117 .test_exceptions = test_exceptions_sr,
Max Filippov59419602019-03-18 17:10:38 -07004118 .par = (const uint32_t[]){
4119 EXCVADDR,
4120 XTENSA_OPTION_EXCEPTION,
4121 },
Max Filippov21a2dad2018-08-27 22:17:50 -07004122 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07004123 }, {
4124 .name = "rsr.ibreaka0",
4125 .translate = translate_rsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07004126 .test_exceptions = test_exceptions_ibreak,
Max Filippov59419602019-03-18 17:10:38 -07004127 .par = (const uint32_t[]){
4128 IBREAKA,
4129 XTENSA_OPTION_DEBUG,
4130 },
Max Filippov21a2dad2018-08-27 22:17:50 -07004131 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07004132 }, {
4133 .name = "rsr.ibreaka1",
4134 .translate = translate_rsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07004135 .test_exceptions = test_exceptions_ibreak,
Max Filippov59419602019-03-18 17:10:38 -07004136 .par = (const uint32_t[]){
4137 IBREAKA + 1,
4138 XTENSA_OPTION_DEBUG,
4139 },
Max Filippov21a2dad2018-08-27 22:17:50 -07004140 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07004141 }, {
4142 .name = "rsr.ibreakenable",
4143 .translate = translate_rsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07004144 .test_exceptions = test_exceptions_sr,
Max Filippov59419602019-03-18 17:10:38 -07004145 .par = (const uint32_t[]){
4146 IBREAKENABLE,
4147 XTENSA_OPTION_DEBUG,
4148 },
Max Filippov21a2dad2018-08-27 22:17:50 -07004149 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07004150 }, {
4151 .name = "rsr.icount",
4152 .translate = translate_rsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07004153 .test_exceptions = test_exceptions_sr,
Max Filippov59419602019-03-18 17:10:38 -07004154 .par = (const uint32_t[]){
4155 ICOUNT,
4156 XTENSA_OPTION_DEBUG,
4157 },
Max Filippov21a2dad2018-08-27 22:17:50 -07004158 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07004159 }, {
4160 .name = "rsr.icountlevel",
4161 .translate = translate_rsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07004162 .test_exceptions = test_exceptions_sr,
Max Filippov59419602019-03-18 17:10:38 -07004163 .par = (const uint32_t[]){
4164 ICOUNTLEVEL,
4165 XTENSA_OPTION_DEBUG,
4166 },
Max Filippov21a2dad2018-08-27 22:17:50 -07004167 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07004168 }, {
4169 .name = "rsr.intclear",
4170 .translate = translate_rsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07004171 .test_exceptions = test_exceptions_sr,
Max Filippov59419602019-03-18 17:10:38 -07004172 .par = (const uint32_t[]){
4173 INTCLEAR,
4174 XTENSA_OPTION_INTERRUPT,
4175 },
Max Filippov21a2dad2018-08-27 22:17:50 -07004176 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07004177 }, {
4178 .name = "rsr.intenable",
4179 .translate = translate_rsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07004180 .test_exceptions = test_exceptions_sr,
Max Filippov59419602019-03-18 17:10:38 -07004181 .par = (const uint32_t[]){
4182 INTENABLE,
4183 XTENSA_OPTION_INTERRUPT,
4184 },
Max Filippov21a2dad2018-08-27 22:17:50 -07004185 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07004186 }, {
4187 .name = "rsr.interrupt",
Max Filippov59419602019-03-18 17:10:38 -07004188 .translate = translate_rsr_ccount,
Max Filippov91dc2b22020-05-04 14:08:40 -07004189 .test_exceptions = test_exceptions_sr,
Max Filippov59419602019-03-18 17:10:38 -07004190 .par = (const uint32_t[]){
4191 INTSET,
4192 XTENSA_OPTION_INTERRUPT,
4193 },
Max Filippovbf525102018-09-01 00:47:55 -07004194 .op_flags = XTENSA_OP_PRIVILEGED | XTENSA_OP_EXIT_TB_0,
Max Filippov168c12b2017-11-03 18:29:27 -07004195 }, {
4196 .name = "rsr.intset",
Max Filippov59419602019-03-18 17:10:38 -07004197 .translate = translate_rsr_ccount,
Max Filippov91dc2b22020-05-04 14:08:40 -07004198 .test_exceptions = test_exceptions_sr,
Max Filippov59419602019-03-18 17:10:38 -07004199 .par = (const uint32_t[]){
4200 INTSET,
4201 XTENSA_OPTION_INTERRUPT,
4202 },
Max Filippovbf525102018-09-01 00:47:55 -07004203 .op_flags = XTENSA_OP_PRIVILEGED | XTENSA_OP_EXIT_TB_0,
Max Filippov168c12b2017-11-03 18:29:27 -07004204 }, {
4205 .name = "rsr.itlbcfg",
4206 .translate = translate_rsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07004207 .test_exceptions = test_exceptions_sr,
Max Filippov59419602019-03-18 17:10:38 -07004208 .par = (const uint32_t[]){
4209 ITLBCFG,
4210 XTENSA_OPTION_MMU,
4211 },
Max Filippov21a2dad2018-08-27 22:17:50 -07004212 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07004213 }, {
4214 .name = "rsr.lbeg",
4215 .translate = translate_rsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07004216 .test_exceptions = test_exceptions_sr,
Max Filippov59419602019-03-18 17:10:38 -07004217 .par = (const uint32_t[]){
4218 LBEG,
4219 XTENSA_OPTION_LOOP,
4220 },
Max Filippov168c12b2017-11-03 18:29:27 -07004221 }, {
4222 .name = "rsr.lcount",
4223 .translate = translate_rsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07004224 .test_exceptions = test_exceptions_sr,
Max Filippov59419602019-03-18 17:10:38 -07004225 .par = (const uint32_t[]){
4226 LCOUNT,
4227 XTENSA_OPTION_LOOP,
4228 },
Max Filippov168c12b2017-11-03 18:29:27 -07004229 }, {
4230 .name = "rsr.lend",
4231 .translate = translate_rsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07004232 .test_exceptions = test_exceptions_sr,
Max Filippov59419602019-03-18 17:10:38 -07004233 .par = (const uint32_t[]){
4234 LEND,
4235 XTENSA_OPTION_LOOP,
4236 },
Max Filippov168c12b2017-11-03 18:29:27 -07004237 }, {
4238 .name = "rsr.litbase",
4239 .translate = translate_rsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07004240 .test_exceptions = test_exceptions_sr,
Max Filippov59419602019-03-18 17:10:38 -07004241 .par = (const uint32_t[]){
4242 LITBASE,
4243 XTENSA_OPTION_EXTENDED_L32R,
4244 },
Max Filippov168c12b2017-11-03 18:29:27 -07004245 }, {
4246 .name = "rsr.m0",
4247 .translate = translate_rsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07004248 .test_exceptions = test_exceptions_sr,
Max Filippov59419602019-03-18 17:10:38 -07004249 .par = (const uint32_t[]){
4250 MR,
4251 XTENSA_OPTION_MAC16,
4252 },
Max Filippov168c12b2017-11-03 18:29:27 -07004253 }, {
4254 .name = "rsr.m1",
4255 .translate = translate_rsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07004256 .test_exceptions = test_exceptions_sr,
Max Filippov59419602019-03-18 17:10:38 -07004257 .par = (const uint32_t[]){
4258 MR + 1,
4259 XTENSA_OPTION_MAC16,
4260 },
Max Filippov168c12b2017-11-03 18:29:27 -07004261 }, {
4262 .name = "rsr.m2",
4263 .translate = translate_rsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07004264 .test_exceptions = test_exceptions_sr,
Max Filippov59419602019-03-18 17:10:38 -07004265 .par = (const uint32_t[]){
4266 MR + 2,
4267 XTENSA_OPTION_MAC16,
4268 },
Max Filippov168c12b2017-11-03 18:29:27 -07004269 }, {
4270 .name = "rsr.m3",
4271 .translate = translate_rsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07004272 .test_exceptions = test_exceptions_sr,
Max Filippov59419602019-03-18 17:10:38 -07004273 .par = (const uint32_t[]){
4274 MR + 3,
4275 XTENSA_OPTION_MAC16,
4276 },
Max Filippov168c12b2017-11-03 18:29:27 -07004277 }, {
4278 .name = "rsr.memctl",
4279 .translate = translate_rsr,
4280 .par = (const uint32_t[]){MEMCTL},
Max Filippov21a2dad2018-08-27 22:17:50 -07004281 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07004282 }, {
Max Filippov631a77a2019-03-13 12:41:13 -07004283 .name = "rsr.mecr",
4284 .translate = translate_rsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07004285 .test_exceptions = test_exceptions_sr,
Max Filippov631a77a2019-03-13 12:41:13 -07004286 .par = (const uint32_t[]){
4287 MECR,
4288 XTENSA_OPTION_MEMORY_ECC_PARITY,
4289 },
4290 .op_flags = XTENSA_OP_PRIVILEGED,
4291 }, {
4292 .name = "rsr.mepc",
4293 .translate = translate_rsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07004294 .test_exceptions = test_exceptions_sr,
Max Filippov631a77a2019-03-13 12:41:13 -07004295 .par = (const uint32_t[]){
4296 MEPC,
4297 XTENSA_OPTION_MEMORY_ECC_PARITY,
4298 },
4299 .op_flags = XTENSA_OP_PRIVILEGED,
4300 }, {
4301 .name = "rsr.meps",
4302 .translate = translate_rsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07004303 .test_exceptions = test_exceptions_sr,
Max Filippov631a77a2019-03-13 12:41:13 -07004304 .par = (const uint32_t[]){
4305 MEPS,
4306 XTENSA_OPTION_MEMORY_ECC_PARITY,
4307 },
4308 .op_flags = XTENSA_OP_PRIVILEGED,
4309 }, {
4310 .name = "rsr.mesave",
4311 .translate = translate_rsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07004312 .test_exceptions = test_exceptions_sr,
Max Filippov631a77a2019-03-13 12:41:13 -07004313 .par = (const uint32_t[]){
4314 MESAVE,
4315 XTENSA_OPTION_MEMORY_ECC_PARITY,
4316 },
4317 .op_flags = XTENSA_OP_PRIVILEGED,
4318 }, {
4319 .name = "rsr.mesr",
4320 .translate = translate_rsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07004321 .test_exceptions = test_exceptions_sr,
Max Filippov631a77a2019-03-13 12:41:13 -07004322 .par = (const uint32_t[]){
4323 MESR,
4324 XTENSA_OPTION_MEMORY_ECC_PARITY,
4325 },
4326 .op_flags = XTENSA_OP_PRIVILEGED,
4327 }, {
4328 .name = "rsr.mevaddr",
4329 .translate = translate_rsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07004330 .test_exceptions = test_exceptions_sr,
Max Filippov631a77a2019-03-13 12:41:13 -07004331 .par = (const uint32_t[]){
4332 MESR,
4333 XTENSA_OPTION_MEMORY_ECC_PARITY,
4334 },
4335 .op_flags = XTENSA_OP_PRIVILEGED,
4336 }, {
Max Filippov168c12b2017-11-03 18:29:27 -07004337 .name = "rsr.misc0",
4338 .translate = translate_rsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07004339 .test_exceptions = test_exceptions_sr,
Max Filippov59419602019-03-18 17:10:38 -07004340 .par = (const uint32_t[]){
4341 MISC,
4342 XTENSA_OPTION_MISC_SR,
4343 },
Max Filippov21a2dad2018-08-27 22:17:50 -07004344 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07004345 }, {
4346 .name = "rsr.misc1",
4347 .translate = translate_rsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07004348 .test_exceptions = test_exceptions_sr,
Max Filippov59419602019-03-18 17:10:38 -07004349 .par = (const uint32_t[]){
4350 MISC + 1,
4351 XTENSA_OPTION_MISC_SR,
4352 },
Max Filippov21a2dad2018-08-27 22:17:50 -07004353 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07004354 }, {
4355 .name = "rsr.misc2",
4356 .translate = translate_rsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07004357 .test_exceptions = test_exceptions_sr,
Max Filippov59419602019-03-18 17:10:38 -07004358 .par = (const uint32_t[]){
4359 MISC + 2,
4360 XTENSA_OPTION_MISC_SR,
4361 },
Max Filippov21a2dad2018-08-27 22:17:50 -07004362 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07004363 }, {
4364 .name = "rsr.misc3",
4365 .translate = translate_rsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07004366 .test_exceptions = test_exceptions_sr,
Max Filippov59419602019-03-18 17:10:38 -07004367 .par = (const uint32_t[]){
4368 MISC + 3,
4369 XTENSA_OPTION_MISC_SR,
4370 },
Max Filippov21a2dad2018-08-27 22:17:50 -07004371 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07004372 }, {
Max Filippov4d04ea32019-03-13 12:40:38 -07004373 .name = "rsr.mpucfg",
4374 .translate = translate_rsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07004375 .test_exceptions = test_exceptions_sr,
Max Filippov4d04ea32019-03-13 12:40:38 -07004376 .par = (const uint32_t[]){
4377 MPUCFG,
4378 XTENSA_OPTION_MPU,
4379 },
4380 .op_flags = XTENSA_OP_PRIVILEGED,
4381 }, {
4382 .name = "rsr.mpuenb",
4383 .translate = translate_rsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07004384 .test_exceptions = test_exceptions_sr,
Max Filippov4d04ea32019-03-13 12:40:38 -07004385 .par = (const uint32_t[]){
4386 MPUENB,
4387 XTENSA_OPTION_MPU,
4388 },
Max Filippov168c12b2017-11-03 18:29:27 -07004389 .op_flags = XTENSA_OP_PRIVILEGED,
4390 }, {
Max Filippoveb3f4292019-02-18 03:11:40 -08004391 .name = "rsr.prefctl",
4392 .translate = translate_rsr,
Max Filippoveb3f4292019-02-18 03:11:40 -08004393 .par = (const uint32_t[]){PREFCTL},
4394 }, {
Max Filippov168c12b2017-11-03 18:29:27 -07004395 .name = "rsr.prid",
4396 .translate = translate_rsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07004397 .test_exceptions = test_exceptions_sr,
Max Filippov59419602019-03-18 17:10:38 -07004398 .par = (const uint32_t[]){
4399 PRID,
4400 XTENSA_OPTION_PROCESSOR_ID,
4401 },
Max Filippov21a2dad2018-08-27 22:17:50 -07004402 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07004403 }, {
4404 .name = "rsr.ps",
4405 .translate = translate_rsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07004406 .test_exceptions = test_exceptions_sr,
Max Filippov59419602019-03-18 17:10:38 -07004407 .par = (const uint32_t[]){
4408 PS,
4409 XTENSA_OPTION_EXCEPTION,
4410 },
Max Filippov21a2dad2018-08-27 22:17:50 -07004411 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07004412 }, {
4413 .name = "rsr.ptevaddr",
Max Filippov59419602019-03-18 17:10:38 -07004414 .translate = translate_rsr_ptevaddr,
Max Filippov91dc2b22020-05-04 14:08:40 -07004415 .test_exceptions = test_exceptions_sr,
Max Filippov59419602019-03-18 17:10:38 -07004416 .par = (const uint32_t[]){
4417 PTEVADDR,
4418 XTENSA_OPTION_MMU,
4419 },
Max Filippov21a2dad2018-08-27 22:17:50 -07004420 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07004421 }, {
4422 .name = "rsr.rasid",
4423 .translate = translate_rsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07004424 .test_exceptions = test_exceptions_sr,
Max Filippov59419602019-03-18 17:10:38 -07004425 .par = (const uint32_t[]){
4426 RASID,
4427 XTENSA_OPTION_MMU,
4428 },
Max Filippov21a2dad2018-08-27 22:17:50 -07004429 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07004430 }, {
4431 .name = "rsr.sar",
4432 .translate = translate_rsr,
4433 .par = (const uint32_t[]){SAR},
4434 }, {
4435 .name = "rsr.scompare1",
4436 .translate = translate_rsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07004437 .test_exceptions = test_exceptions_sr,
Max Filippov59419602019-03-18 17:10:38 -07004438 .par = (const uint32_t[]){
4439 SCOMPARE1,
4440 XTENSA_OPTION_CONDITIONAL_STORE,
4441 },
Max Filippov168c12b2017-11-03 18:29:27 -07004442 }, {
4443 .name = "rsr.vecbase",
4444 .translate = translate_rsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07004445 .test_exceptions = test_exceptions_sr,
Max Filippov59419602019-03-18 17:10:38 -07004446 .par = (const uint32_t[]){
4447 VECBASE,
4448 XTENSA_OPTION_RELOCATABLE_VECTOR,
4449 },
Max Filippov21a2dad2018-08-27 22:17:50 -07004450 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07004451 }, {
4452 .name = "rsr.windowbase",
4453 .translate = translate_rsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07004454 .test_exceptions = test_exceptions_sr,
Max Filippov59419602019-03-18 17:10:38 -07004455 .par = (const uint32_t[]){
4456 WINDOW_BASE,
4457 XTENSA_OPTION_WINDOWED_REGISTER,
4458 },
Max Filippov21a2dad2018-08-27 22:17:50 -07004459 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07004460 }, {
4461 .name = "rsr.windowstart",
4462 .translate = translate_rsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07004463 .test_exceptions = test_exceptions_sr,
Max Filippov59419602019-03-18 17:10:38 -07004464 .par = (const uint32_t[]){
4465 WINDOW_START,
4466 XTENSA_OPTION_WINDOWED_REGISTER,
4467 },
Max Filippov21a2dad2018-08-27 22:17:50 -07004468 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07004469 }, {
4470 .name = "rsync",
4471 .translate = translate_nop,
4472 }, {
Max Filippove9872742017-02-17 16:21:36 -08004473 .name = "rur.expstate",
4474 .translate = translate_rur,
4475 .par = (const uint32_t[]){EXPSTATE},
4476 }, {
Max Filippov168c12b2017-11-03 18:29:27 -07004477 .name = "rur.threadptr",
4478 .translate = translate_rur,
4479 .par = (const uint32_t[]){THREADPTR},
4480 }, {
4481 .name = "s16i",
4482 .translate = translate_ldst,
4483 .par = (const uint32_t[]){MO_TEUW, false, true},
Max Filippov068e5382019-02-13 17:36:30 -08004484 .op_flags = XTENSA_OP_STORE,
Max Filippov168c12b2017-11-03 18:29:27 -07004485 }, {
4486 .name = "s32c1i",
4487 .translate = translate_s32c1i,
Max Filippov068e5382019-02-13 17:36:30 -08004488 .op_flags = XTENSA_OP_LOAD | XTENSA_OP_STORE,
Max Filippov168c12b2017-11-03 18:29:27 -07004489 }, {
4490 .name = "s32e",
4491 .translate = translate_s32e,
Max Filippov068e5382019-02-13 17:36:30 -08004492 .op_flags = XTENSA_OP_PRIVILEGED | XTENSA_OP_STORE,
Max Filippov168c12b2017-11-03 18:29:27 -07004493 }, {
Max Filippovb345e142019-04-18 16:37:00 -07004494 .name = "s32ex",
4495 .translate = translate_s32ex,
4496 .op_flags = XTENSA_OP_LOAD | XTENSA_OP_STORE,
4497 }, {
Max Filippovd863fcf2019-02-09 23:39:10 -08004498 .name = (const char * const[]) {
4499 "s32i", "s32i.n", "s32nb", NULL,
4500 },
Max Filippov168c12b2017-11-03 18:29:27 -07004501 .translate = translate_ldst,
4502 .par = (const uint32_t[]){MO_TEUL, false, true},
Max Filippov068e5382019-02-13 17:36:30 -08004503 .op_flags = XTENSA_OP_NAME_ARRAY | XTENSA_OP_STORE,
Max Filippov168c12b2017-11-03 18:29:27 -07004504 }, {
4505 .name = "s32ri",
4506 .translate = translate_ldst,
Max Filippov583e6a52021-05-17 12:31:08 -07004507 .par = (const uint32_t[]){MO_TEUL | MO_ALIGN, true, true},
Max Filippov068e5382019-02-13 17:36:30 -08004508 .op_flags = XTENSA_OP_STORE,
Max Filippov168c12b2017-11-03 18:29:27 -07004509 }, {
4510 .name = "s8i",
4511 .translate = translate_ldst,
4512 .par = (const uint32_t[]){MO_UB, false, true},
Max Filippov068e5382019-02-13 17:36:30 -08004513 .op_flags = XTENSA_OP_STORE,
Max Filippov168c12b2017-11-03 18:29:27 -07004514 }, {
Max Filippovd1e9b002017-02-17 16:39:30 -08004515 .name = "salt",
4516 .translate = translate_salt,
4517 .par = (const uint32_t[]){TCG_COND_LT},
4518 }, {
4519 .name = "saltu",
4520 .translate = translate_salt,
4521 .par = (const uint32_t[]){TCG_COND_LTU},
4522 }, {
Max Filippov59491e92022-05-01 22:57:49 -07004523 .name = "sdct",
4524 .translate = translate_nop,
4525 .op_flags = XTENSA_OP_PRIVILEGED,
4526 }, {
4527 .name = "sdcw",
4528 .translate = translate_nop,
4529 .op_flags = XTENSA_OP_PRIVILEGED,
4530 }, {
Max Filippove9872742017-02-17 16:21:36 -08004531 .name = "setb_expstate",
4532 .translate = translate_setb_expstate,
4533 }, {
Max Filippov168c12b2017-11-03 18:29:27 -07004534 .name = "sext",
4535 .translate = translate_sext,
4536 }, {
Max Filippov59491e92022-05-01 22:57:49 -07004537 .name = "sict",
4538 .translate = translate_nop,
4539 .op_flags = XTENSA_OP_PRIVILEGED,
4540 }, {
4541 .name = "sicw",
4542 .translate = translate_nop,
4543 .op_flags = XTENSA_OP_PRIVILEGED,
4544 }, {
Max Filippov168c12b2017-11-03 18:29:27 -07004545 .name = "simcall",
4546 .translate = translate_simcall,
Max Filippov91dc2b22020-05-04 14:08:40 -07004547 .test_exceptions = test_exceptions_simcall,
Max Filippov21a2dad2018-08-27 22:17:50 -07004548 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07004549 }, {
4550 .name = "sll",
4551 .translate = translate_sll,
4552 }, {
4553 .name = "slli",
4554 .translate = translate_slli,
4555 }, {
4556 .name = "sra",
4557 .translate = translate_sra,
4558 }, {
4559 .name = "srai",
4560 .translate = translate_srai,
4561 }, {
4562 .name = "src",
4563 .translate = translate_src,
4564 }, {
4565 .name = "srl",
4566 .translate = translate_srl,
4567 }, {
4568 .name = "srli",
4569 .translate = translate_srli,
4570 }, {
4571 .name = "ssa8b",
4572 .translate = translate_ssa8b,
4573 }, {
4574 .name = "ssa8l",
4575 .translate = translate_ssa8l,
4576 }, {
4577 .name = "ssai",
4578 .translate = translate_ssai,
4579 }, {
4580 .name = "ssl",
4581 .translate = translate_ssl,
4582 }, {
4583 .name = "ssr",
4584 .translate = translate_ssr,
4585 }, {
4586 .name = "sub",
4587 .translate = translate_sub,
4588 }, {
4589 .name = "subx2",
4590 .translate = translate_subx,
4591 .par = (const uint32_t[]){1},
4592 }, {
4593 .name = "subx4",
4594 .translate = translate_subx,
4595 .par = (const uint32_t[]){2},
4596 }, {
4597 .name = "subx8",
4598 .translate = translate_subx,
4599 .par = (const uint32_t[]){3},
4600 }, {
4601 .name = "syscall",
Max Filippov4c6ec5f2018-08-27 22:18:48 -07004602 .op_flags = XTENSA_OP_SYSCALL,
Max Filippov168c12b2017-11-03 18:29:27 -07004603 }, {
4604 .name = "umul.aa.hh",
4605 .translate = translate_mac16,
Max Filippov7aa78342019-02-11 19:16:14 -08004606 .par = (const uint32_t[]){MAC16_UMUL, MAC16_HH, 0},
Max Filippov168c12b2017-11-03 18:29:27 -07004607 }, {
4608 .name = "umul.aa.hl",
4609 .translate = translate_mac16,
Max Filippov7aa78342019-02-11 19:16:14 -08004610 .par = (const uint32_t[]){MAC16_UMUL, MAC16_HL, 0},
Max Filippov168c12b2017-11-03 18:29:27 -07004611 }, {
4612 .name = "umul.aa.lh",
4613 .translate = translate_mac16,
Max Filippov7aa78342019-02-11 19:16:14 -08004614 .par = (const uint32_t[]){MAC16_UMUL, MAC16_LH, 0},
Max Filippov168c12b2017-11-03 18:29:27 -07004615 }, {
4616 .name = "umul.aa.ll",
4617 .translate = translate_mac16,
Max Filippov7aa78342019-02-11 19:16:14 -08004618 .par = (const uint32_t[]){MAC16_UMUL, MAC16_LL, 0},
Max Filippov168c12b2017-11-03 18:29:27 -07004619 }, {
4620 .name = "waiti",
4621 .translate = translate_waiti,
Max Filippovbf525102018-09-01 00:47:55 -07004622 .op_flags = XTENSA_OP_PRIVILEGED | XTENSA_OP_EXIT_TB_0,
Max Filippov168c12b2017-11-03 18:29:27 -07004623 }, {
4624 .name = "wdtlb",
4625 .translate = translate_wtlb,
4626 .par = (const uint32_t[]){true},
Max Filippov226444a2018-09-01 00:47:55 -07004627 .op_flags = XTENSA_OP_PRIVILEGED | XTENSA_OP_EXIT_TB_M1,
Max Filippov168c12b2017-11-03 18:29:27 -07004628 }, {
4629 .name = "wer",
4630 .translate = translate_wer,
Max Filippov21a2dad2018-08-27 22:17:50 -07004631 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07004632 }, {
4633 .name = "witlb",
4634 .translate = translate_wtlb,
4635 .par = (const uint32_t[]){false},
Max Filippov226444a2018-09-01 00:47:55 -07004636 .op_flags = XTENSA_OP_PRIVILEGED | XTENSA_OP_EXIT_TB_M1,
Max Filippov168c12b2017-11-03 18:29:27 -07004637 }, {
Max Filippov4d04ea32019-03-13 12:40:38 -07004638 .name = "wptlb",
4639 .translate = translate_wptlb,
4640 .op_flags = XTENSA_OP_PRIVILEGED | XTENSA_OP_EXIT_TB_M1,
4641 }, {
Max Filippove9872742017-02-17 16:21:36 -08004642 .name = "wrmsk_expstate",
4643 .translate = translate_wrmsk_expstate,
4644 }, {
Max Filippov168c12b2017-11-03 18:29:27 -07004645 .name = "wsr.176",
Max Filippov59419602019-03-18 17:10:38 -07004646 .op_flags = XTENSA_OP_ILL,
Max Filippov168c12b2017-11-03 18:29:27 -07004647 }, {
4648 .name = "wsr.208",
Max Filippov59419602019-03-18 17:10:38 -07004649 .op_flags = XTENSA_OP_ILL,
Max Filippov168c12b2017-11-03 18:29:27 -07004650 }, {
4651 .name = "wsr.acchi",
Max Filippov59419602019-03-18 17:10:38 -07004652 .translate = translate_wsr_acchi,
Max Filippov91dc2b22020-05-04 14:08:40 -07004653 .test_exceptions = test_exceptions_sr,
Max Filippov59419602019-03-18 17:10:38 -07004654 .par = (const uint32_t[]){
4655 ACCHI,
4656 XTENSA_OPTION_MAC16,
4657 },
Max Filippov168c12b2017-11-03 18:29:27 -07004658 }, {
4659 .name = "wsr.acclo",
4660 .translate = translate_wsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07004661 .test_exceptions = test_exceptions_sr,
Max Filippov59419602019-03-18 17:10:38 -07004662 .par = (const uint32_t[]){
4663 ACCLO,
4664 XTENSA_OPTION_MAC16,
4665 },
Max Filippov168c12b2017-11-03 18:29:27 -07004666 }, {
4667 .name = "wsr.atomctl",
Max Filippov59419602019-03-18 17:10:38 -07004668 .translate = translate_wsr_mask,
Max Filippov91dc2b22020-05-04 14:08:40 -07004669 .test_exceptions = test_exceptions_sr,
Max Filippov59419602019-03-18 17:10:38 -07004670 .par = (const uint32_t[]){
4671 ATOMCTL,
4672 XTENSA_OPTION_ATOMCTL,
4673 0x3f,
4674 },
Max Filippov21a2dad2018-08-27 22:17:50 -07004675 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07004676 }, {
4677 .name = "wsr.br",
Max Filippov59419602019-03-18 17:10:38 -07004678 .translate = translate_wsr_mask,
Max Filippov91dc2b22020-05-04 14:08:40 -07004679 .test_exceptions = test_exceptions_sr,
Max Filippov59419602019-03-18 17:10:38 -07004680 .par = (const uint32_t[]){
4681 BR,
4682 XTENSA_OPTION_BOOLEAN,
4683 0xffff,
4684 },
Max Filippov168c12b2017-11-03 18:29:27 -07004685 }, {
Max Filippov4d04ea32019-03-13 12:40:38 -07004686 .name = "wsr.cacheadrdis",
4687 .translate = translate_wsr_mask,
Max Filippov91dc2b22020-05-04 14:08:40 -07004688 .test_exceptions = test_exceptions_sr,
Max Filippov4d04ea32019-03-13 12:40:38 -07004689 .par = (const uint32_t[]){
4690 CACHEADRDIS,
4691 XTENSA_OPTION_MPU,
4692 0xff,
4693 },
4694 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07004695 }, {
4696 .name = "wsr.cacheattr",
4697 .translate = translate_wsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07004698 .test_exceptions = test_exceptions_sr,
Max Filippov59419602019-03-18 17:10:38 -07004699 .par = (const uint32_t[]){
4700 CACHEATTR,
4701 XTENSA_OPTION_CACHEATTR,
4702 },
Max Filippov21a2dad2018-08-27 22:17:50 -07004703 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07004704 }, {
4705 .name = "wsr.ccompare0",
Max Filippov59419602019-03-18 17:10:38 -07004706 .translate = translate_wsr_ccompare,
Max Filippov91dc2b22020-05-04 14:08:40 -07004707 .test_exceptions = test_exceptions_ccompare,
Max Filippov59419602019-03-18 17:10:38 -07004708 .par = (const uint32_t[]){
4709 CCOMPARE,
4710 XTENSA_OPTION_TIMER_INTERRUPT,
4711 },
Max Filippovbf525102018-09-01 00:47:55 -07004712 .op_flags = XTENSA_OP_PRIVILEGED | XTENSA_OP_EXIT_TB_0,
Max Filippov168c12b2017-11-03 18:29:27 -07004713 }, {
4714 .name = "wsr.ccompare1",
Max Filippov59419602019-03-18 17:10:38 -07004715 .translate = translate_wsr_ccompare,
Max Filippov91dc2b22020-05-04 14:08:40 -07004716 .test_exceptions = test_exceptions_ccompare,
Max Filippov59419602019-03-18 17:10:38 -07004717 .par = (const uint32_t[]){
4718 CCOMPARE + 1,
4719 XTENSA_OPTION_TIMER_INTERRUPT,
4720 },
Max Filippovbf525102018-09-01 00:47:55 -07004721 .op_flags = XTENSA_OP_PRIVILEGED | XTENSA_OP_EXIT_TB_0,
Max Filippov168c12b2017-11-03 18:29:27 -07004722 }, {
4723 .name = "wsr.ccompare2",
Max Filippov59419602019-03-18 17:10:38 -07004724 .translate = translate_wsr_ccompare,
Max Filippov91dc2b22020-05-04 14:08:40 -07004725 .test_exceptions = test_exceptions_ccompare,
Max Filippov59419602019-03-18 17:10:38 -07004726 .par = (const uint32_t[]){
4727 CCOMPARE + 2,
4728 XTENSA_OPTION_TIMER_INTERRUPT,
4729 },
Max Filippovbf525102018-09-01 00:47:55 -07004730 .op_flags = XTENSA_OP_PRIVILEGED | XTENSA_OP_EXIT_TB_0,
Max Filippov168c12b2017-11-03 18:29:27 -07004731 }, {
4732 .name = "wsr.ccount",
Max Filippov59419602019-03-18 17:10:38 -07004733 .translate = translate_wsr_ccount,
Max Filippov91dc2b22020-05-04 14:08:40 -07004734 .test_exceptions = test_exceptions_sr,
Max Filippov59419602019-03-18 17:10:38 -07004735 .par = (const uint32_t[]){
4736 CCOUNT,
4737 XTENSA_OPTION_TIMER_INTERRUPT,
4738 },
Max Filippovbf525102018-09-01 00:47:55 -07004739 .op_flags = XTENSA_OP_PRIVILEGED | XTENSA_OP_EXIT_TB_0,
Max Filippov168c12b2017-11-03 18:29:27 -07004740 }, {
4741 .name = "wsr.configid0",
Max Filippov59419602019-03-18 17:10:38 -07004742 .op_flags = XTENSA_OP_ILL,
Max Filippov168c12b2017-11-03 18:29:27 -07004743 }, {
4744 .name = "wsr.configid1",
Max Filippov59419602019-03-18 17:10:38 -07004745 .op_flags = XTENSA_OP_ILL,
Max Filippov168c12b2017-11-03 18:29:27 -07004746 }, {
4747 .name = "wsr.cpenable",
Max Filippov59419602019-03-18 17:10:38 -07004748 .translate = translate_wsr_mask,
Max Filippov91dc2b22020-05-04 14:08:40 -07004749 .test_exceptions = test_exceptions_sr,
Max Filippov59419602019-03-18 17:10:38 -07004750 .par = (const uint32_t[]){
4751 CPENABLE,
4752 XTENSA_OPTION_COPROCESSOR,
4753 0xff,
4754 },
Max Filippov226444a2018-09-01 00:47:55 -07004755 .op_flags = XTENSA_OP_PRIVILEGED | XTENSA_OP_EXIT_TB_M1,
Max Filippov168c12b2017-11-03 18:29:27 -07004756 }, {
4757 .name = "wsr.dbreaka0",
Max Filippov59419602019-03-18 17:10:38 -07004758 .translate = translate_wsr_dbreaka,
Max Filippov91dc2b22020-05-04 14:08:40 -07004759 .test_exceptions = test_exceptions_dbreak,
Max Filippov59419602019-03-18 17:10:38 -07004760 .par = (const uint32_t[]){
4761 DBREAKA,
4762 XTENSA_OPTION_DEBUG,
4763 },
Max Filippov21a2dad2018-08-27 22:17:50 -07004764 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07004765 }, {
4766 .name = "wsr.dbreaka1",
Max Filippov59419602019-03-18 17:10:38 -07004767 .translate = translate_wsr_dbreaka,
Max Filippov91dc2b22020-05-04 14:08:40 -07004768 .test_exceptions = test_exceptions_dbreak,
Max Filippov59419602019-03-18 17:10:38 -07004769 .par = (const uint32_t[]){
4770 DBREAKA + 1,
4771 XTENSA_OPTION_DEBUG,
4772 },
Max Filippov21a2dad2018-08-27 22:17:50 -07004773 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07004774 }, {
4775 .name = "wsr.dbreakc0",
Max Filippov59419602019-03-18 17:10:38 -07004776 .translate = translate_wsr_dbreakc,
Max Filippov91dc2b22020-05-04 14:08:40 -07004777 .test_exceptions = test_exceptions_dbreak,
Max Filippov59419602019-03-18 17:10:38 -07004778 .par = (const uint32_t[]){
4779 DBREAKC,
4780 XTENSA_OPTION_DEBUG,
4781 },
Max Filippov21a2dad2018-08-27 22:17:50 -07004782 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07004783 }, {
4784 .name = "wsr.dbreakc1",
Max Filippov59419602019-03-18 17:10:38 -07004785 .translate = translate_wsr_dbreakc,
Max Filippov91dc2b22020-05-04 14:08:40 -07004786 .test_exceptions = test_exceptions_dbreak,
Max Filippov59419602019-03-18 17:10:38 -07004787 .par = (const uint32_t[]){
4788 DBREAKC + 1,
4789 XTENSA_OPTION_DEBUG,
4790 },
Max Filippov21a2dad2018-08-27 22:17:50 -07004791 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07004792 }, {
Max Filippov13f6a7c2017-01-29 03:50:25 -08004793 .name = "wsr.ddr",
4794 .translate = translate_wsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07004795 .test_exceptions = test_exceptions_sr,
Max Filippov59419602019-03-18 17:10:38 -07004796 .par = (const uint32_t[]){
4797 DDR,
4798 XTENSA_OPTION_DEBUG,
4799 },
Max Filippov21a2dad2018-08-27 22:17:50 -07004800 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov13f6a7c2017-01-29 03:50:25 -08004801 }, {
Max Filippov168c12b2017-11-03 18:29:27 -07004802 .name = "wsr.debugcause",
Max Filippov59419602019-03-18 17:10:38 -07004803 .op_flags = XTENSA_OP_ILL,
Max Filippov168c12b2017-11-03 18:29:27 -07004804 }, {
4805 .name = "wsr.depc",
4806 .translate = translate_wsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07004807 .test_exceptions = test_exceptions_sr,
Max Filippov59419602019-03-18 17:10:38 -07004808 .par = (const uint32_t[]){
4809 DEPC,
4810 XTENSA_OPTION_EXCEPTION,
4811 },
Max Filippov21a2dad2018-08-27 22:17:50 -07004812 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07004813 }, {
4814 .name = "wsr.dtlbcfg",
Max Filippov59419602019-03-18 17:10:38 -07004815 .translate = translate_wsr_mask,
Max Filippov91dc2b22020-05-04 14:08:40 -07004816 .test_exceptions = test_exceptions_sr,
Max Filippov59419602019-03-18 17:10:38 -07004817 .par = (const uint32_t[]){
4818 DTLBCFG,
4819 XTENSA_OPTION_MMU,
4820 0x01130000,
4821 },
Max Filippov21a2dad2018-08-27 22:17:50 -07004822 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07004823 }, {
4824 .name = "wsr.epc1",
4825 .translate = translate_wsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07004826 .test_exceptions = test_exceptions_sr,
Max Filippov59419602019-03-18 17:10:38 -07004827 .par = (const uint32_t[]){
4828 EPC1,
4829 XTENSA_OPTION_EXCEPTION,
4830 },
Max Filippov21a2dad2018-08-27 22:17:50 -07004831 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07004832 }, {
4833 .name = "wsr.epc2",
4834 .translate = translate_wsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07004835 .test_exceptions = test_exceptions_hpi,
Max Filippov59419602019-03-18 17:10:38 -07004836 .par = (const uint32_t[]){
4837 EPC1 + 1,
4838 XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
4839 },
Max Filippov21a2dad2018-08-27 22:17:50 -07004840 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07004841 }, {
4842 .name = "wsr.epc3",
4843 .translate = translate_wsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07004844 .test_exceptions = test_exceptions_hpi,
Max Filippov59419602019-03-18 17:10:38 -07004845 .par = (const uint32_t[]){
4846 EPC1 + 2,
4847 XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
4848 },
Max Filippov21a2dad2018-08-27 22:17:50 -07004849 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07004850 }, {
4851 .name = "wsr.epc4",
4852 .translate = translate_wsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07004853 .test_exceptions = test_exceptions_hpi,
Max Filippov59419602019-03-18 17:10:38 -07004854 .par = (const uint32_t[]){
4855 EPC1 + 3,
4856 XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
4857 },
Max Filippov21a2dad2018-08-27 22:17:50 -07004858 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07004859 }, {
4860 .name = "wsr.epc5",
4861 .translate = translate_wsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07004862 .test_exceptions = test_exceptions_hpi,
Max Filippov59419602019-03-18 17:10:38 -07004863 .par = (const uint32_t[]){
4864 EPC1 + 4,
4865 XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
4866 },
Max Filippov21a2dad2018-08-27 22:17:50 -07004867 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07004868 }, {
4869 .name = "wsr.epc6",
4870 .translate = translate_wsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07004871 .test_exceptions = test_exceptions_hpi,
Max Filippov59419602019-03-18 17:10:38 -07004872 .par = (const uint32_t[]){
4873 EPC1 + 5,
4874 XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
4875 },
Max Filippov21a2dad2018-08-27 22:17:50 -07004876 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07004877 }, {
4878 .name = "wsr.epc7",
4879 .translate = translate_wsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07004880 .test_exceptions = test_exceptions_hpi,
Max Filippov59419602019-03-18 17:10:38 -07004881 .par = (const uint32_t[]){
4882 EPC1 + 6,
4883 XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
4884 },
Max Filippov21a2dad2018-08-27 22:17:50 -07004885 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07004886 }, {
4887 .name = "wsr.eps2",
4888 .translate = translate_wsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07004889 .test_exceptions = test_exceptions_hpi,
Max Filippov59419602019-03-18 17:10:38 -07004890 .par = (const uint32_t[]){
4891 EPS2,
4892 XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
4893 },
Max Filippov21a2dad2018-08-27 22:17:50 -07004894 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07004895 }, {
4896 .name = "wsr.eps3",
4897 .translate = translate_wsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07004898 .test_exceptions = test_exceptions_hpi,
Max Filippov59419602019-03-18 17:10:38 -07004899 .par = (const uint32_t[]){
4900 EPS2 + 1,
4901 XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
4902 },
Max Filippov21a2dad2018-08-27 22:17:50 -07004903 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07004904 }, {
4905 .name = "wsr.eps4",
4906 .translate = translate_wsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07004907 .test_exceptions = test_exceptions_hpi,
Max Filippov59419602019-03-18 17:10:38 -07004908 .par = (const uint32_t[]){
4909 EPS2 + 2,
4910 XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
4911 },
Max Filippov21a2dad2018-08-27 22:17:50 -07004912 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07004913 }, {
4914 .name = "wsr.eps5",
4915 .translate = translate_wsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07004916 .test_exceptions = test_exceptions_hpi,
Max Filippov59419602019-03-18 17:10:38 -07004917 .par = (const uint32_t[]){
4918 EPS2 + 3,
4919 XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
4920 },
Max Filippov21a2dad2018-08-27 22:17:50 -07004921 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07004922 }, {
4923 .name = "wsr.eps6",
4924 .translate = translate_wsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07004925 .test_exceptions = test_exceptions_hpi,
Max Filippov59419602019-03-18 17:10:38 -07004926 .par = (const uint32_t[]){
4927 EPS2 + 4,
4928 XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
4929 },
Max Filippov21a2dad2018-08-27 22:17:50 -07004930 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07004931 }, {
4932 .name = "wsr.eps7",
4933 .translate = translate_wsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07004934 .test_exceptions = test_exceptions_hpi,
Max Filippov59419602019-03-18 17:10:38 -07004935 .par = (const uint32_t[]){
4936 EPS2 + 5,
4937 XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
4938 },
Max Filippov21a2dad2018-08-27 22:17:50 -07004939 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07004940 }, {
Max Filippov4d04ea32019-03-13 12:40:38 -07004941 .name = "wsr.eraccess",
4942 .translate = translate_wsr_mask,
4943 .par = (const uint32_t[]){
4944 ERACCESS,
4945 0,
4946 0xffff,
4947 },
Max Filippov168c12b2017-11-03 18:29:27 -07004948 .op_flags = XTENSA_OP_PRIVILEGED,
4949 }, {
4950 .name = "wsr.exccause",
4951 .translate = translate_wsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07004952 .test_exceptions = test_exceptions_sr,
Max Filippov59419602019-03-18 17:10:38 -07004953 .par = (const uint32_t[]){
4954 EXCCAUSE,
4955 XTENSA_OPTION_EXCEPTION,
4956 },
Max Filippov21a2dad2018-08-27 22:17:50 -07004957 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07004958 }, {
4959 .name = "wsr.excsave1",
4960 .translate = translate_wsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07004961 .test_exceptions = test_exceptions_sr,
Max Filippov59419602019-03-18 17:10:38 -07004962 .par = (const uint32_t[]){
4963 EXCSAVE1,
4964 XTENSA_OPTION_EXCEPTION,
4965 },
Max Filippov21a2dad2018-08-27 22:17:50 -07004966 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07004967 }, {
4968 .name = "wsr.excsave2",
4969 .translate = translate_wsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07004970 .test_exceptions = test_exceptions_hpi,
Max Filippov59419602019-03-18 17:10:38 -07004971 .par = (const uint32_t[]){
4972 EXCSAVE1 + 1,
4973 XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
4974 },
Max Filippov21a2dad2018-08-27 22:17:50 -07004975 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07004976 }, {
4977 .name = "wsr.excsave3",
4978 .translate = translate_wsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07004979 .test_exceptions = test_exceptions_hpi,
Max Filippov59419602019-03-18 17:10:38 -07004980 .par = (const uint32_t[]){
4981 EXCSAVE1 + 2,
4982 XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
4983 },
Max Filippov21a2dad2018-08-27 22:17:50 -07004984 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07004985 }, {
4986 .name = "wsr.excsave4",
4987 .translate = translate_wsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07004988 .test_exceptions = test_exceptions_hpi,
Max Filippov59419602019-03-18 17:10:38 -07004989 .par = (const uint32_t[]){
4990 EXCSAVE1 + 3,
4991 XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
4992 },
Max Filippov21a2dad2018-08-27 22:17:50 -07004993 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07004994 }, {
4995 .name = "wsr.excsave5",
4996 .translate = translate_wsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07004997 .test_exceptions = test_exceptions_hpi,
Max Filippov59419602019-03-18 17:10:38 -07004998 .par = (const uint32_t[]){
4999 EXCSAVE1 + 4,
5000 XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
5001 },
Max Filippov21a2dad2018-08-27 22:17:50 -07005002 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07005003 }, {
5004 .name = "wsr.excsave6",
5005 .translate = translate_wsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07005006 .test_exceptions = test_exceptions_hpi,
Max Filippov59419602019-03-18 17:10:38 -07005007 .par = (const uint32_t[]){
5008 EXCSAVE1 + 5,
5009 XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
5010 },
Max Filippov21a2dad2018-08-27 22:17:50 -07005011 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07005012 }, {
5013 .name = "wsr.excsave7",
5014 .translate = translate_wsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07005015 .test_exceptions = test_exceptions_hpi,
Max Filippov59419602019-03-18 17:10:38 -07005016 .par = (const uint32_t[]){
5017 EXCSAVE1 + 6,
5018 XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
5019 },
Max Filippov21a2dad2018-08-27 22:17:50 -07005020 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07005021 }, {
5022 .name = "wsr.excvaddr",
5023 .translate = translate_wsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07005024 .test_exceptions = test_exceptions_sr,
Max Filippov59419602019-03-18 17:10:38 -07005025 .par = (const uint32_t[]){
5026 EXCVADDR,
5027 XTENSA_OPTION_EXCEPTION,
5028 },
Max Filippov21a2dad2018-08-27 22:17:50 -07005029 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07005030 }, {
5031 .name = "wsr.ibreaka0",
Max Filippov59419602019-03-18 17:10:38 -07005032 .translate = translate_wsr_ibreaka,
Max Filippov91dc2b22020-05-04 14:08:40 -07005033 .test_exceptions = test_exceptions_ibreak,
Max Filippov59419602019-03-18 17:10:38 -07005034 .par = (const uint32_t[]){
5035 IBREAKA,
5036 XTENSA_OPTION_DEBUG,
5037 },
Max Filippovbf525102018-09-01 00:47:55 -07005038 .op_flags = XTENSA_OP_PRIVILEGED | XTENSA_OP_EXIT_TB_0,
Max Filippov168c12b2017-11-03 18:29:27 -07005039 }, {
5040 .name = "wsr.ibreaka1",
Max Filippov59419602019-03-18 17:10:38 -07005041 .translate = translate_wsr_ibreaka,
Max Filippov91dc2b22020-05-04 14:08:40 -07005042 .test_exceptions = test_exceptions_ibreak,
Max Filippov59419602019-03-18 17:10:38 -07005043 .par = (const uint32_t[]){
5044 IBREAKA + 1,
5045 XTENSA_OPTION_DEBUG,
5046 },
Max Filippovbf525102018-09-01 00:47:55 -07005047 .op_flags = XTENSA_OP_PRIVILEGED | XTENSA_OP_EXIT_TB_0,
Max Filippov168c12b2017-11-03 18:29:27 -07005048 }, {
5049 .name = "wsr.ibreakenable",
Max Filippov59419602019-03-18 17:10:38 -07005050 .translate = translate_wsr_ibreakenable,
Max Filippov91dc2b22020-05-04 14:08:40 -07005051 .test_exceptions = test_exceptions_sr,
Max Filippov59419602019-03-18 17:10:38 -07005052 .par = (const uint32_t[]){
5053 IBREAKENABLE,
5054 XTENSA_OPTION_DEBUG,
5055 },
Max Filippovbf525102018-09-01 00:47:55 -07005056 .op_flags = XTENSA_OP_PRIVILEGED | XTENSA_OP_EXIT_TB_0,
Max Filippov168c12b2017-11-03 18:29:27 -07005057 }, {
5058 .name = "wsr.icount",
Max Filippov59419602019-03-18 17:10:38 -07005059 .translate = translate_wsr_icount,
Max Filippov91dc2b22020-05-04 14:08:40 -07005060 .test_exceptions = test_exceptions_sr,
Max Filippov59419602019-03-18 17:10:38 -07005061 .par = (const uint32_t[]){
5062 ICOUNT,
5063 XTENSA_OPTION_DEBUG,
5064 },
Max Filippov21a2dad2018-08-27 22:17:50 -07005065 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07005066 }, {
5067 .name = "wsr.icountlevel",
Max Filippov59419602019-03-18 17:10:38 -07005068 .translate = translate_wsr_mask,
Max Filippov91dc2b22020-05-04 14:08:40 -07005069 .test_exceptions = test_exceptions_sr,
Max Filippov59419602019-03-18 17:10:38 -07005070 .par = (const uint32_t[]){
5071 ICOUNTLEVEL,
5072 XTENSA_OPTION_DEBUG,
5073 0xf,
5074 },
Max Filippov226444a2018-09-01 00:47:55 -07005075 .op_flags = XTENSA_OP_PRIVILEGED | XTENSA_OP_EXIT_TB_M1,
Max Filippov168c12b2017-11-03 18:29:27 -07005076 }, {
5077 .name = "wsr.intclear",
Max Filippov59419602019-03-18 17:10:38 -07005078 .translate = translate_wsr_intclear,
Max Filippov91dc2b22020-05-04 14:08:40 -07005079 .test_exceptions = test_exceptions_sr,
Max Filippov59419602019-03-18 17:10:38 -07005080 .par = (const uint32_t[]){
5081 INTCLEAR,
5082 XTENSA_OPTION_INTERRUPT,
5083 },
Max Filippovd74624e2018-09-02 02:07:30 -07005084 .op_flags =
5085 XTENSA_OP_PRIVILEGED |
5086 XTENSA_OP_EXIT_TB_0 |
5087 XTENSA_OP_CHECK_INTERRUPTS,
Max Filippov168c12b2017-11-03 18:29:27 -07005088 }, {
5089 .name = "wsr.intenable",
5090 .translate = translate_wsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07005091 .test_exceptions = test_exceptions_sr,
Max Filippov59419602019-03-18 17:10:38 -07005092 .par = (const uint32_t[]){
5093 INTENABLE,
5094 XTENSA_OPTION_INTERRUPT,
5095 },
Max Filippovd74624e2018-09-02 02:07:30 -07005096 .op_flags =
5097 XTENSA_OP_PRIVILEGED |
5098 XTENSA_OP_EXIT_TB_0 |
5099 XTENSA_OP_CHECK_INTERRUPTS,
Max Filippov168c12b2017-11-03 18:29:27 -07005100 }, {
5101 .name = "wsr.interrupt",
5102 .translate = translate_wsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07005103 .test_exceptions = test_exceptions_sr,
Max Filippov59419602019-03-18 17:10:38 -07005104 .par = (const uint32_t[]){
5105 INTSET,
5106 XTENSA_OPTION_INTERRUPT,
5107 },
Max Filippovd74624e2018-09-02 02:07:30 -07005108 .op_flags =
5109 XTENSA_OP_PRIVILEGED |
5110 XTENSA_OP_EXIT_TB_0 |
5111 XTENSA_OP_CHECK_INTERRUPTS,
Max Filippov168c12b2017-11-03 18:29:27 -07005112 }, {
5113 .name = "wsr.intset",
Max Filippov59419602019-03-18 17:10:38 -07005114 .translate = translate_wsr_intset,
Max Filippov91dc2b22020-05-04 14:08:40 -07005115 .test_exceptions = test_exceptions_sr,
Max Filippov59419602019-03-18 17:10:38 -07005116 .par = (const uint32_t[]){
5117 INTSET,
5118 XTENSA_OPTION_INTERRUPT,
5119 },
Max Filippovd74624e2018-09-02 02:07:30 -07005120 .op_flags =
5121 XTENSA_OP_PRIVILEGED |
5122 XTENSA_OP_EXIT_TB_0 |
5123 XTENSA_OP_CHECK_INTERRUPTS,
Max Filippov168c12b2017-11-03 18:29:27 -07005124 }, {
5125 .name = "wsr.itlbcfg",
Max Filippov59419602019-03-18 17:10:38 -07005126 .translate = translate_wsr_mask,
Max Filippov91dc2b22020-05-04 14:08:40 -07005127 .test_exceptions = test_exceptions_sr,
Max Filippov59419602019-03-18 17:10:38 -07005128 .par = (const uint32_t[]){
5129 ITLBCFG,
5130 XTENSA_OPTION_MMU,
5131 0x01130000,
5132 },
Max Filippov21a2dad2018-08-27 22:17:50 -07005133 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07005134 }, {
5135 .name = "wsr.lbeg",
5136 .translate = translate_wsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07005137 .test_exceptions = test_exceptions_sr,
Max Filippov59419602019-03-18 17:10:38 -07005138 .par = (const uint32_t[]){
5139 LBEG,
5140 XTENSA_OPTION_LOOP,
5141 },
Max Filippov5d630ce2018-10-03 15:59:11 -07005142 .op_flags = XTENSA_OP_EXIT_TB_M1,
Max Filippov168c12b2017-11-03 18:29:27 -07005143 }, {
5144 .name = "wsr.lcount",
5145 .translate = translate_wsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07005146 .test_exceptions = test_exceptions_sr,
Max Filippov59419602019-03-18 17:10:38 -07005147 .par = (const uint32_t[]){
5148 LCOUNT,
5149 XTENSA_OPTION_LOOP,
5150 },
Max Filippov168c12b2017-11-03 18:29:27 -07005151 }, {
5152 .name = "wsr.lend",
5153 .translate = translate_wsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07005154 .test_exceptions = test_exceptions_sr,
Max Filippov59419602019-03-18 17:10:38 -07005155 .par = (const uint32_t[]){
5156 LEND,
5157 XTENSA_OPTION_LOOP,
5158 },
Max Filippov5d630ce2018-10-03 15:59:11 -07005159 .op_flags = XTENSA_OP_EXIT_TB_M1,
Max Filippov168c12b2017-11-03 18:29:27 -07005160 }, {
5161 .name = "wsr.litbase",
Max Filippov59419602019-03-18 17:10:38 -07005162 .translate = translate_wsr_mask,
Max Filippov91dc2b22020-05-04 14:08:40 -07005163 .test_exceptions = test_exceptions_sr,
Max Filippov59419602019-03-18 17:10:38 -07005164 .par = (const uint32_t[]){
5165 LITBASE,
5166 XTENSA_OPTION_EXTENDED_L32R,
5167 0xfffff001,
5168 },
Max Filippov226444a2018-09-01 00:47:55 -07005169 .op_flags = XTENSA_OP_EXIT_TB_M1,
Max Filippov168c12b2017-11-03 18:29:27 -07005170 }, {
5171 .name = "wsr.m0",
5172 .translate = translate_wsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07005173 .test_exceptions = test_exceptions_sr,
Max Filippov59419602019-03-18 17:10:38 -07005174 .par = (const uint32_t[]){
5175 MR,
5176 XTENSA_OPTION_MAC16,
5177 },
Max Filippov168c12b2017-11-03 18:29:27 -07005178 }, {
5179 .name = "wsr.m1",
5180 .translate = translate_wsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07005181 .test_exceptions = test_exceptions_sr,
Max Filippov59419602019-03-18 17:10:38 -07005182 .par = (const uint32_t[]){
5183 MR + 1,
5184 XTENSA_OPTION_MAC16,
5185 },
Max Filippov168c12b2017-11-03 18:29:27 -07005186 }, {
5187 .name = "wsr.m2",
5188 .translate = translate_wsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07005189 .test_exceptions = test_exceptions_sr,
Max Filippov59419602019-03-18 17:10:38 -07005190 .par = (const uint32_t[]){
5191 MR + 2,
5192 XTENSA_OPTION_MAC16,
5193 },
Max Filippov168c12b2017-11-03 18:29:27 -07005194 }, {
5195 .name = "wsr.m3",
5196 .translate = translate_wsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07005197 .test_exceptions = test_exceptions_sr,
Max Filippov59419602019-03-18 17:10:38 -07005198 .par = (const uint32_t[]){
5199 MR + 3,
5200 XTENSA_OPTION_MAC16,
5201 },
Max Filippov168c12b2017-11-03 18:29:27 -07005202 }, {
5203 .name = "wsr.memctl",
Max Filippov59419602019-03-18 17:10:38 -07005204 .translate = translate_wsr_memctl,
Max Filippov168c12b2017-11-03 18:29:27 -07005205 .par = (const uint32_t[]){MEMCTL},
Max Filippov21a2dad2018-08-27 22:17:50 -07005206 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07005207 }, {
Max Filippov631a77a2019-03-13 12:41:13 -07005208 .name = "wsr.mecr",
5209 .translate = translate_wsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07005210 .test_exceptions = test_exceptions_sr,
Max Filippov631a77a2019-03-13 12:41:13 -07005211 .par = (const uint32_t[]){
5212 MECR,
5213 XTENSA_OPTION_MEMORY_ECC_PARITY,
5214 },
5215 .op_flags = XTENSA_OP_PRIVILEGED,
5216 }, {
5217 .name = "wsr.mepc",
5218 .translate = translate_wsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07005219 .test_exceptions = test_exceptions_sr,
Max Filippov631a77a2019-03-13 12:41:13 -07005220 .par = (const uint32_t[]){
5221 MEPC,
5222 XTENSA_OPTION_MEMORY_ECC_PARITY,
5223 },
5224 .op_flags = XTENSA_OP_PRIVILEGED,
5225 }, {
5226 .name = "wsr.meps",
5227 .translate = translate_wsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07005228 .test_exceptions = test_exceptions_sr,
Max Filippov631a77a2019-03-13 12:41:13 -07005229 .par = (const uint32_t[]){
5230 MEPS,
5231 XTENSA_OPTION_MEMORY_ECC_PARITY,
5232 },
5233 .op_flags = XTENSA_OP_PRIVILEGED,
5234 }, {
5235 .name = "wsr.mesave",
5236 .translate = translate_wsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07005237 .test_exceptions = test_exceptions_sr,
Max Filippov631a77a2019-03-13 12:41:13 -07005238 .par = (const uint32_t[]){
5239 MESAVE,
5240 XTENSA_OPTION_MEMORY_ECC_PARITY,
5241 },
5242 .op_flags = XTENSA_OP_PRIVILEGED,
5243 }, {
5244 .name = "wsr.mesr",
5245 .translate = translate_wsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07005246 .test_exceptions = test_exceptions_sr,
Max Filippov631a77a2019-03-13 12:41:13 -07005247 .par = (const uint32_t[]){
5248 MESR,
5249 XTENSA_OPTION_MEMORY_ECC_PARITY,
5250 },
5251 .op_flags = XTENSA_OP_PRIVILEGED,
5252 }, {
5253 .name = "wsr.mevaddr",
5254 .translate = translate_wsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07005255 .test_exceptions = test_exceptions_sr,
Max Filippov631a77a2019-03-13 12:41:13 -07005256 .par = (const uint32_t[]){
5257 MESR,
5258 XTENSA_OPTION_MEMORY_ECC_PARITY,
5259 },
5260 .op_flags = XTENSA_OP_PRIVILEGED,
5261 }, {
Max Filippov168c12b2017-11-03 18:29:27 -07005262 .name = "wsr.misc0",
5263 .translate = translate_wsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07005264 .test_exceptions = test_exceptions_sr,
Max Filippov59419602019-03-18 17:10:38 -07005265 .par = (const uint32_t[]){
5266 MISC,
5267 XTENSA_OPTION_MISC_SR,
5268 },
Max Filippov21a2dad2018-08-27 22:17:50 -07005269 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07005270 }, {
5271 .name = "wsr.misc1",
5272 .translate = translate_wsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07005273 .test_exceptions = test_exceptions_sr,
Max Filippov59419602019-03-18 17:10:38 -07005274 .par = (const uint32_t[]){
5275 MISC + 1,
5276 XTENSA_OPTION_MISC_SR,
5277 },
Max Filippov21a2dad2018-08-27 22:17:50 -07005278 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07005279 }, {
5280 .name = "wsr.misc2",
5281 .translate = translate_wsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07005282 .test_exceptions = test_exceptions_sr,
Max Filippov59419602019-03-18 17:10:38 -07005283 .par = (const uint32_t[]){
5284 MISC + 2,
5285 XTENSA_OPTION_MISC_SR,
5286 },
Max Filippov21a2dad2018-08-27 22:17:50 -07005287 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07005288 }, {
5289 .name = "wsr.misc3",
5290 .translate = translate_wsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07005291 .test_exceptions = test_exceptions_sr,
Max Filippov59419602019-03-18 17:10:38 -07005292 .par = (const uint32_t[]){
5293 MISC + 3,
5294 XTENSA_OPTION_MISC_SR,
5295 },
Max Filippov21a2dad2018-08-27 22:17:50 -07005296 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07005297 }, {
Max Filippov13f6a7c2017-01-29 03:50:25 -08005298 .name = "wsr.mmid",
5299 .translate = translate_wsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07005300 .test_exceptions = test_exceptions_sr,
Max Filippov59419602019-03-18 17:10:38 -07005301 .par = (const uint32_t[]){
5302 MMID,
5303 XTENSA_OPTION_TRACE_PORT,
5304 },
Max Filippov21a2dad2018-08-27 22:17:50 -07005305 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov13f6a7c2017-01-29 03:50:25 -08005306 }, {
Max Filippov4d04ea32019-03-13 12:40:38 -07005307 .name = "wsr.mpuenb",
5308 .translate = translate_wsr_mpuenb,
Max Filippov91dc2b22020-05-04 14:08:40 -07005309 .test_exceptions = test_exceptions_sr,
Max Filippov4d04ea32019-03-13 12:40:38 -07005310 .par = (const uint32_t[]){
5311 MPUENB,
5312 XTENSA_OPTION_MPU,
5313 },
5314 .op_flags = XTENSA_OP_PRIVILEGED | XTENSA_OP_EXIT_TB_M1,
5315 }, {
Max Filippoveb3f4292019-02-18 03:11:40 -08005316 .name = "wsr.prefctl",
5317 .translate = translate_wsr,
Max Filippoveb3f4292019-02-18 03:11:40 -08005318 .par = (const uint32_t[]){PREFCTL},
5319 }, {
Max Filippov168c12b2017-11-03 18:29:27 -07005320 .name = "wsr.prid",
Max Filippov59419602019-03-18 17:10:38 -07005321 .op_flags = XTENSA_OP_ILL,
Max Filippov168c12b2017-11-03 18:29:27 -07005322 }, {
5323 .name = "wsr.ps",
Max Filippov59419602019-03-18 17:10:38 -07005324 .translate = translate_wsr_ps,
Max Filippov91dc2b22020-05-04 14:08:40 -07005325 .test_exceptions = test_exceptions_sr,
Max Filippov59419602019-03-18 17:10:38 -07005326 .par = (const uint32_t[]){
5327 PS,
5328 XTENSA_OPTION_EXCEPTION,
5329 },
Max Filippovd74624e2018-09-02 02:07:30 -07005330 .op_flags =
5331 XTENSA_OP_PRIVILEGED |
5332 XTENSA_OP_EXIT_TB_M1 |
5333 XTENSA_OP_CHECK_INTERRUPTS,
Max Filippov168c12b2017-11-03 18:29:27 -07005334 }, {
5335 .name = "wsr.ptevaddr",
Max Filippov59419602019-03-18 17:10:38 -07005336 .translate = translate_wsr_mask,
Max Filippov91dc2b22020-05-04 14:08:40 -07005337 .test_exceptions = test_exceptions_sr,
Max Filippov59419602019-03-18 17:10:38 -07005338 .par = (const uint32_t[]){
5339 PTEVADDR,
5340 XTENSA_OPTION_MMU,
5341 0xffc00000,
5342 },
Max Filippov21a2dad2018-08-27 22:17:50 -07005343 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07005344 }, {
5345 .name = "wsr.rasid",
Max Filippov59419602019-03-18 17:10:38 -07005346 .translate = translate_wsr_rasid,
Max Filippov91dc2b22020-05-04 14:08:40 -07005347 .test_exceptions = test_exceptions_sr,
Max Filippov59419602019-03-18 17:10:38 -07005348 .par = (const uint32_t[]){
5349 RASID,
5350 XTENSA_OPTION_MMU,
5351 },
Max Filippov226444a2018-09-01 00:47:55 -07005352 .op_flags = XTENSA_OP_PRIVILEGED | XTENSA_OP_EXIT_TB_M1,
Max Filippov168c12b2017-11-03 18:29:27 -07005353 }, {
5354 .name = "wsr.sar",
Max Filippov59419602019-03-18 17:10:38 -07005355 .translate = translate_wsr_sar,
Max Filippov168c12b2017-11-03 18:29:27 -07005356 .par = (const uint32_t[]){SAR},
5357 }, {
5358 .name = "wsr.scompare1",
5359 .translate = translate_wsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07005360 .test_exceptions = test_exceptions_sr,
Max Filippov59419602019-03-18 17:10:38 -07005361 .par = (const uint32_t[]){
5362 SCOMPARE1,
5363 XTENSA_OPTION_CONDITIONAL_STORE,
5364 },
Max Filippov168c12b2017-11-03 18:29:27 -07005365 }, {
5366 .name = "wsr.vecbase",
5367 .translate = translate_wsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07005368 .test_exceptions = test_exceptions_sr,
Max Filippov59419602019-03-18 17:10:38 -07005369 .par = (const uint32_t[]){
5370 VECBASE,
5371 XTENSA_OPTION_RELOCATABLE_VECTOR,
5372 },
Max Filippov21a2dad2018-08-27 22:17:50 -07005373 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07005374 }, {
5375 .name = "wsr.windowbase",
Max Filippov59419602019-03-18 17:10:38 -07005376 .translate = translate_wsr_windowbase,
Max Filippov91dc2b22020-05-04 14:08:40 -07005377 .test_exceptions = test_exceptions_sr,
Max Filippov59419602019-03-18 17:10:38 -07005378 .par = (const uint32_t[]){
5379 WINDOW_BASE,
5380 XTENSA_OPTION_WINDOWED_REGISTER,
5381 },
Max Filippov8df3fd32019-01-30 14:56:29 -08005382 .op_flags = XTENSA_OP_PRIVILEGED |
5383 XTENSA_OP_EXIT_TB_M1 |
5384 XTENSA_OP_SYNC_REGISTER_WINDOW,
Max Filippov168c12b2017-11-03 18:29:27 -07005385 }, {
5386 .name = "wsr.windowstart",
Max Filippov59419602019-03-18 17:10:38 -07005387 .translate = translate_wsr_windowstart,
Max Filippov91dc2b22020-05-04 14:08:40 -07005388 .test_exceptions = test_exceptions_sr,
Max Filippov59419602019-03-18 17:10:38 -07005389 .par = (const uint32_t[]){
5390 WINDOW_START,
5391 XTENSA_OPTION_WINDOWED_REGISTER,
5392 },
Max Filippov226444a2018-09-01 00:47:55 -07005393 .op_flags = XTENSA_OP_PRIVILEGED | XTENSA_OP_EXIT_TB_M1,
Max Filippov168c12b2017-11-03 18:29:27 -07005394 }, {
Max Filippove9872742017-02-17 16:21:36 -08005395 .name = "wur.expstate",
5396 .translate = translate_wur,
5397 .par = (const uint32_t[]){EXPSTATE},
5398 }, {
Max Filippov168c12b2017-11-03 18:29:27 -07005399 .name = "wur.threadptr",
5400 .translate = translate_wur,
5401 .par = (const uint32_t[]){THREADPTR},
5402 }, {
5403 .name = "xor",
5404 .translate = translate_xor,
5405 }, {
5406 .name = "xorb",
5407 .translate = translate_boolean,
5408 .par = (const uint32_t[]){BOOLEAN_XOR},
5409 }, {
5410 .name = "xsr.176",
Max Filippov59419602019-03-18 17:10:38 -07005411 .op_flags = XTENSA_OP_ILL,
Max Filippov168c12b2017-11-03 18:29:27 -07005412 }, {
5413 .name = "xsr.208",
Max Filippov59419602019-03-18 17:10:38 -07005414 .op_flags = XTENSA_OP_ILL,
Max Filippov168c12b2017-11-03 18:29:27 -07005415 }, {
5416 .name = "xsr.acchi",
Max Filippov59419602019-03-18 17:10:38 -07005417 .translate = translate_xsr_acchi,
Max Filippov91dc2b22020-05-04 14:08:40 -07005418 .test_exceptions = test_exceptions_sr,
Max Filippov59419602019-03-18 17:10:38 -07005419 .par = (const uint32_t[]){
5420 ACCHI,
5421 XTENSA_OPTION_MAC16,
5422 },
Max Filippov168c12b2017-11-03 18:29:27 -07005423 }, {
5424 .name = "xsr.acclo",
5425 .translate = translate_xsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07005426 .test_exceptions = test_exceptions_sr,
Max Filippov59419602019-03-18 17:10:38 -07005427 .par = (const uint32_t[]){
5428 ACCLO,
5429 XTENSA_OPTION_MAC16,
5430 },
Max Filippov168c12b2017-11-03 18:29:27 -07005431 }, {
5432 .name = "xsr.atomctl",
Max Filippov59419602019-03-18 17:10:38 -07005433 .translate = translate_xsr_mask,
Max Filippov91dc2b22020-05-04 14:08:40 -07005434 .test_exceptions = test_exceptions_sr,
Max Filippov59419602019-03-18 17:10:38 -07005435 .par = (const uint32_t[]){
5436 ATOMCTL,
5437 XTENSA_OPTION_ATOMCTL,
5438 0x3f,
5439 },
Max Filippov21a2dad2018-08-27 22:17:50 -07005440 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07005441 }, {
5442 .name = "xsr.br",
Max Filippov59419602019-03-18 17:10:38 -07005443 .translate = translate_xsr_mask,
Max Filippov91dc2b22020-05-04 14:08:40 -07005444 .test_exceptions = test_exceptions_sr,
Max Filippov59419602019-03-18 17:10:38 -07005445 .par = (const uint32_t[]){
5446 BR,
5447 XTENSA_OPTION_BOOLEAN,
5448 0xffff,
5449 },
Max Filippov168c12b2017-11-03 18:29:27 -07005450 }, {
Max Filippov4d04ea32019-03-13 12:40:38 -07005451 .name = "xsr.cacheadrdis",
5452 .translate = translate_xsr_mask,
Max Filippov91dc2b22020-05-04 14:08:40 -07005453 .test_exceptions = test_exceptions_sr,
Max Filippov4d04ea32019-03-13 12:40:38 -07005454 .par = (const uint32_t[]){
5455 CACHEADRDIS,
5456 XTENSA_OPTION_MPU,
5457 0xff,
5458 },
5459 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07005460 }, {
5461 .name = "xsr.cacheattr",
5462 .translate = translate_xsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07005463 .test_exceptions = test_exceptions_sr,
Max Filippov59419602019-03-18 17:10:38 -07005464 .par = (const uint32_t[]){
5465 CACHEATTR,
5466 XTENSA_OPTION_CACHEATTR,
5467 },
Max Filippov21a2dad2018-08-27 22:17:50 -07005468 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07005469 }, {
5470 .name = "xsr.ccompare0",
Max Filippov59419602019-03-18 17:10:38 -07005471 .translate = translate_xsr_ccompare,
Max Filippov91dc2b22020-05-04 14:08:40 -07005472 .test_exceptions = test_exceptions_ccompare,
Max Filippov59419602019-03-18 17:10:38 -07005473 .par = (const uint32_t[]){
5474 CCOMPARE,
5475 XTENSA_OPTION_TIMER_INTERRUPT,
5476 },
Max Filippovbf525102018-09-01 00:47:55 -07005477 .op_flags = XTENSA_OP_PRIVILEGED | XTENSA_OP_EXIT_TB_0,
Max Filippov168c12b2017-11-03 18:29:27 -07005478 }, {
5479 .name = "xsr.ccompare1",
Max Filippov59419602019-03-18 17:10:38 -07005480 .translate = translate_xsr_ccompare,
Max Filippov91dc2b22020-05-04 14:08:40 -07005481 .test_exceptions = test_exceptions_ccompare,
Max Filippov59419602019-03-18 17:10:38 -07005482 .par = (const uint32_t[]){
5483 CCOMPARE + 1,
5484 XTENSA_OPTION_TIMER_INTERRUPT,
5485 },
Max Filippovbf525102018-09-01 00:47:55 -07005486 .op_flags = XTENSA_OP_PRIVILEGED | XTENSA_OP_EXIT_TB_0,
Max Filippov168c12b2017-11-03 18:29:27 -07005487 }, {
5488 .name = "xsr.ccompare2",
Max Filippov59419602019-03-18 17:10:38 -07005489 .translate = translate_xsr_ccompare,
Max Filippov91dc2b22020-05-04 14:08:40 -07005490 .test_exceptions = test_exceptions_ccompare,
Max Filippov59419602019-03-18 17:10:38 -07005491 .par = (const uint32_t[]){
5492 CCOMPARE + 2,
5493 XTENSA_OPTION_TIMER_INTERRUPT,
5494 },
Max Filippovbf525102018-09-01 00:47:55 -07005495 .op_flags = XTENSA_OP_PRIVILEGED | XTENSA_OP_EXIT_TB_0,
Max Filippov168c12b2017-11-03 18:29:27 -07005496 }, {
5497 .name = "xsr.ccount",
Max Filippov59419602019-03-18 17:10:38 -07005498 .translate = translate_xsr_ccount,
Max Filippov91dc2b22020-05-04 14:08:40 -07005499 .test_exceptions = test_exceptions_sr,
Max Filippov59419602019-03-18 17:10:38 -07005500 .par = (const uint32_t[]){
5501 CCOUNT,
5502 XTENSA_OPTION_TIMER_INTERRUPT,
5503 },
Max Filippovbf525102018-09-01 00:47:55 -07005504 .op_flags = XTENSA_OP_PRIVILEGED | XTENSA_OP_EXIT_TB_0,
Max Filippov168c12b2017-11-03 18:29:27 -07005505 }, {
5506 .name = "xsr.configid0",
Max Filippov59419602019-03-18 17:10:38 -07005507 .op_flags = XTENSA_OP_ILL,
Max Filippov168c12b2017-11-03 18:29:27 -07005508 }, {
5509 .name = "xsr.configid1",
Max Filippov59419602019-03-18 17:10:38 -07005510 .op_flags = XTENSA_OP_ILL,
Max Filippov168c12b2017-11-03 18:29:27 -07005511 }, {
5512 .name = "xsr.cpenable",
Max Filippov59419602019-03-18 17:10:38 -07005513 .translate = translate_xsr_mask,
Max Filippov91dc2b22020-05-04 14:08:40 -07005514 .test_exceptions = test_exceptions_sr,
Max Filippov59419602019-03-18 17:10:38 -07005515 .par = (const uint32_t[]){
5516 CPENABLE,
5517 XTENSA_OPTION_COPROCESSOR,
5518 0xff,
5519 },
Max Filippov226444a2018-09-01 00:47:55 -07005520 .op_flags = XTENSA_OP_PRIVILEGED | XTENSA_OP_EXIT_TB_M1,
Max Filippov168c12b2017-11-03 18:29:27 -07005521 }, {
5522 .name = "xsr.dbreaka0",
Max Filippov59419602019-03-18 17:10:38 -07005523 .translate = translate_xsr_dbreaka,
Max Filippov91dc2b22020-05-04 14:08:40 -07005524 .test_exceptions = test_exceptions_dbreak,
Max Filippov59419602019-03-18 17:10:38 -07005525 .par = (const uint32_t[]){
5526 DBREAKA,
5527 XTENSA_OPTION_DEBUG,
5528 },
Max Filippov21a2dad2018-08-27 22:17:50 -07005529 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07005530 }, {
5531 .name = "xsr.dbreaka1",
Max Filippov59419602019-03-18 17:10:38 -07005532 .translate = translate_xsr_dbreaka,
Max Filippov91dc2b22020-05-04 14:08:40 -07005533 .test_exceptions = test_exceptions_dbreak,
Max Filippov59419602019-03-18 17:10:38 -07005534 .par = (const uint32_t[]){
5535 DBREAKA + 1,
5536 XTENSA_OPTION_DEBUG,
5537 },
Max Filippov21a2dad2018-08-27 22:17:50 -07005538 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07005539 }, {
5540 .name = "xsr.dbreakc0",
Max Filippov59419602019-03-18 17:10:38 -07005541 .translate = translate_xsr_dbreakc,
Max Filippov91dc2b22020-05-04 14:08:40 -07005542 .test_exceptions = test_exceptions_dbreak,
Max Filippov59419602019-03-18 17:10:38 -07005543 .par = (const uint32_t[]){
5544 DBREAKC,
5545 XTENSA_OPTION_DEBUG,
5546 },
Max Filippov21a2dad2018-08-27 22:17:50 -07005547 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07005548 }, {
5549 .name = "xsr.dbreakc1",
Max Filippov59419602019-03-18 17:10:38 -07005550 .translate = translate_xsr_dbreakc,
Max Filippov91dc2b22020-05-04 14:08:40 -07005551 .test_exceptions = test_exceptions_dbreak,
Max Filippov59419602019-03-18 17:10:38 -07005552 .par = (const uint32_t[]){
5553 DBREAKC + 1,
5554 XTENSA_OPTION_DEBUG,
5555 },
Max Filippov21a2dad2018-08-27 22:17:50 -07005556 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07005557 }, {
Max Filippov13f6a7c2017-01-29 03:50:25 -08005558 .name = "xsr.ddr",
5559 .translate = translate_xsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07005560 .test_exceptions = test_exceptions_sr,
Max Filippov59419602019-03-18 17:10:38 -07005561 .par = (const uint32_t[]){
5562 DDR,
5563 XTENSA_OPTION_DEBUG,
5564 },
Max Filippov21a2dad2018-08-27 22:17:50 -07005565 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov13f6a7c2017-01-29 03:50:25 -08005566 }, {
Max Filippov168c12b2017-11-03 18:29:27 -07005567 .name = "xsr.debugcause",
Max Filippov59419602019-03-18 17:10:38 -07005568 .op_flags = XTENSA_OP_ILL,
Max Filippov168c12b2017-11-03 18:29:27 -07005569 }, {
5570 .name = "xsr.depc",
5571 .translate = translate_xsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07005572 .test_exceptions = test_exceptions_sr,
Max Filippov59419602019-03-18 17:10:38 -07005573 .par = (const uint32_t[]){
5574 DEPC,
5575 XTENSA_OPTION_EXCEPTION,
5576 },
Max Filippov21a2dad2018-08-27 22:17:50 -07005577 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07005578 }, {
5579 .name = "xsr.dtlbcfg",
Max Filippov59419602019-03-18 17:10:38 -07005580 .translate = translate_xsr_mask,
Max Filippov91dc2b22020-05-04 14:08:40 -07005581 .test_exceptions = test_exceptions_sr,
Max Filippov59419602019-03-18 17:10:38 -07005582 .par = (const uint32_t[]){
5583 DTLBCFG,
5584 XTENSA_OPTION_MMU,
5585 0x01130000,
5586 },
Max Filippov21a2dad2018-08-27 22:17:50 -07005587 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07005588 }, {
5589 .name = "xsr.epc1",
5590 .translate = translate_xsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07005591 .test_exceptions = test_exceptions_sr,
Max Filippov59419602019-03-18 17:10:38 -07005592 .par = (const uint32_t[]){
5593 EPC1,
5594 XTENSA_OPTION_EXCEPTION,
5595 },
Max Filippov21a2dad2018-08-27 22:17:50 -07005596 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07005597 }, {
5598 .name = "xsr.epc2",
5599 .translate = translate_xsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07005600 .test_exceptions = test_exceptions_hpi,
Max Filippov59419602019-03-18 17:10:38 -07005601 .par = (const uint32_t[]){
5602 EPC1 + 1,
5603 XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
5604 },
Max Filippov21a2dad2018-08-27 22:17:50 -07005605 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07005606 }, {
5607 .name = "xsr.epc3",
5608 .translate = translate_xsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07005609 .test_exceptions = test_exceptions_hpi,
Max Filippov59419602019-03-18 17:10:38 -07005610 .par = (const uint32_t[]){
5611 EPC1 + 2,
5612 XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
5613 },
Max Filippov21a2dad2018-08-27 22:17:50 -07005614 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07005615 }, {
5616 .name = "xsr.epc4",
5617 .translate = translate_xsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07005618 .test_exceptions = test_exceptions_hpi,
Max Filippov59419602019-03-18 17:10:38 -07005619 .par = (const uint32_t[]){
5620 EPC1 + 3,
5621 XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
5622 },
Max Filippov21a2dad2018-08-27 22:17:50 -07005623 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07005624 }, {
5625 .name = "xsr.epc5",
5626 .translate = translate_xsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07005627 .test_exceptions = test_exceptions_hpi,
Max Filippov59419602019-03-18 17:10:38 -07005628 .par = (const uint32_t[]){
5629 EPC1 + 4,
5630 XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
5631 },
Max Filippov21a2dad2018-08-27 22:17:50 -07005632 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07005633 }, {
5634 .name = "xsr.epc6",
5635 .translate = translate_xsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07005636 .test_exceptions = test_exceptions_hpi,
Max Filippov59419602019-03-18 17:10:38 -07005637 .par = (const uint32_t[]){
5638 EPC1 + 5,
5639 XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
5640 },
Max Filippov21a2dad2018-08-27 22:17:50 -07005641 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07005642 }, {
5643 .name = "xsr.epc7",
5644 .translate = translate_xsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07005645 .test_exceptions = test_exceptions_hpi,
Max Filippov59419602019-03-18 17:10:38 -07005646 .par = (const uint32_t[]){
5647 EPC1 + 6,
5648 XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
5649 },
Max Filippov21a2dad2018-08-27 22:17:50 -07005650 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07005651 }, {
5652 .name = "xsr.eps2",
5653 .translate = translate_xsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07005654 .test_exceptions = test_exceptions_hpi,
Max Filippov59419602019-03-18 17:10:38 -07005655 .par = (const uint32_t[]){
5656 EPS2,
5657 XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
5658 },
Max Filippov21a2dad2018-08-27 22:17:50 -07005659 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07005660 }, {
5661 .name = "xsr.eps3",
5662 .translate = translate_xsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07005663 .test_exceptions = test_exceptions_hpi,
Max Filippov59419602019-03-18 17:10:38 -07005664 .par = (const uint32_t[]){
5665 EPS2 + 1,
5666 XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
5667 },
Max Filippov21a2dad2018-08-27 22:17:50 -07005668 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07005669 }, {
5670 .name = "xsr.eps4",
5671 .translate = translate_xsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07005672 .test_exceptions = test_exceptions_hpi,
Max Filippov59419602019-03-18 17:10:38 -07005673 .par = (const uint32_t[]){
5674 EPS2 + 2,
5675 XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
5676 },
Max Filippov21a2dad2018-08-27 22:17:50 -07005677 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07005678 }, {
5679 .name = "xsr.eps5",
5680 .translate = translate_xsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07005681 .test_exceptions = test_exceptions_hpi,
Max Filippov59419602019-03-18 17:10:38 -07005682 .par = (const uint32_t[]){
5683 EPS2 + 3,
5684 XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
5685 },
Max Filippov21a2dad2018-08-27 22:17:50 -07005686 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07005687 }, {
5688 .name = "xsr.eps6",
5689 .translate = translate_xsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07005690 .test_exceptions = test_exceptions_hpi,
Max Filippov59419602019-03-18 17:10:38 -07005691 .par = (const uint32_t[]){
5692 EPS2 + 4,
5693 XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
5694 },
Max Filippov21a2dad2018-08-27 22:17:50 -07005695 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07005696 }, {
5697 .name = "xsr.eps7",
5698 .translate = translate_xsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07005699 .test_exceptions = test_exceptions_hpi,
Max Filippov59419602019-03-18 17:10:38 -07005700 .par = (const uint32_t[]){
5701 EPS2 + 5,
5702 XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
5703 },
Max Filippov21a2dad2018-08-27 22:17:50 -07005704 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07005705 }, {
Max Filippov4d04ea32019-03-13 12:40:38 -07005706 .name = "xsr.eraccess",
5707 .translate = translate_xsr_mask,
5708 .par = (const uint32_t[]){
5709 ERACCESS,
5710 0,
5711 0xffff,
5712 },
Max Filippov168c12b2017-11-03 18:29:27 -07005713 .op_flags = XTENSA_OP_PRIVILEGED,
5714 }, {
5715 .name = "xsr.exccause",
5716 .translate = translate_xsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07005717 .test_exceptions = test_exceptions_sr,
Max Filippov59419602019-03-18 17:10:38 -07005718 .par = (const uint32_t[]){
5719 EXCCAUSE,
5720 XTENSA_OPTION_EXCEPTION,
5721 },
Max Filippov21a2dad2018-08-27 22:17:50 -07005722 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07005723 }, {
5724 .name = "xsr.excsave1",
5725 .translate = translate_xsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07005726 .test_exceptions = test_exceptions_sr,
Max Filippov59419602019-03-18 17:10:38 -07005727 .par = (const uint32_t[]){
5728 EXCSAVE1,
5729 XTENSA_OPTION_EXCEPTION,
5730 },
Max Filippov21a2dad2018-08-27 22:17:50 -07005731 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07005732 }, {
5733 .name = "xsr.excsave2",
5734 .translate = translate_xsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07005735 .test_exceptions = test_exceptions_hpi,
Max Filippov59419602019-03-18 17:10:38 -07005736 .par = (const uint32_t[]){
5737 EXCSAVE1 + 1,
5738 XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
5739 },
Max Filippov21a2dad2018-08-27 22:17:50 -07005740 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07005741 }, {
5742 .name = "xsr.excsave3",
5743 .translate = translate_xsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07005744 .test_exceptions = test_exceptions_hpi,
Max Filippov59419602019-03-18 17:10:38 -07005745 .par = (const uint32_t[]){
5746 EXCSAVE1 + 2,
5747 XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
5748 },
Max Filippov21a2dad2018-08-27 22:17:50 -07005749 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07005750 }, {
5751 .name = "xsr.excsave4",
5752 .translate = translate_xsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07005753 .test_exceptions = test_exceptions_hpi,
Max Filippov59419602019-03-18 17:10:38 -07005754 .par = (const uint32_t[]){
5755 EXCSAVE1 + 3,
5756 XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
5757 },
Max Filippov21a2dad2018-08-27 22:17:50 -07005758 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07005759 }, {
5760 .name = "xsr.excsave5",
5761 .translate = translate_xsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07005762 .test_exceptions = test_exceptions_hpi,
Max Filippov59419602019-03-18 17:10:38 -07005763 .par = (const uint32_t[]){
5764 EXCSAVE1 + 4,
5765 XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
5766 },
Max Filippov21a2dad2018-08-27 22:17:50 -07005767 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07005768 }, {
5769 .name = "xsr.excsave6",
5770 .translate = translate_xsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07005771 .test_exceptions = test_exceptions_hpi,
Max Filippov59419602019-03-18 17:10:38 -07005772 .par = (const uint32_t[]){
5773 EXCSAVE1 + 5,
5774 XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
5775 },
Max Filippov21a2dad2018-08-27 22:17:50 -07005776 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07005777 }, {
5778 .name = "xsr.excsave7",
5779 .translate = translate_xsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07005780 .test_exceptions = test_exceptions_hpi,
Max Filippov59419602019-03-18 17:10:38 -07005781 .par = (const uint32_t[]){
5782 EXCSAVE1 + 6,
5783 XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
5784 },
Max Filippov21a2dad2018-08-27 22:17:50 -07005785 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07005786 }, {
5787 .name = "xsr.excvaddr",
5788 .translate = translate_xsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07005789 .test_exceptions = test_exceptions_sr,
Max Filippov59419602019-03-18 17:10:38 -07005790 .par = (const uint32_t[]){
5791 EXCVADDR,
5792 XTENSA_OPTION_EXCEPTION,
5793 },
Max Filippov21a2dad2018-08-27 22:17:50 -07005794 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07005795 }, {
5796 .name = "xsr.ibreaka0",
Max Filippov59419602019-03-18 17:10:38 -07005797 .translate = translate_xsr_ibreaka,
Max Filippov91dc2b22020-05-04 14:08:40 -07005798 .test_exceptions = test_exceptions_ibreak,
Max Filippov59419602019-03-18 17:10:38 -07005799 .par = (const uint32_t[]){
5800 IBREAKA,
5801 XTENSA_OPTION_DEBUG,
5802 },
Max Filippovbf525102018-09-01 00:47:55 -07005803 .op_flags = XTENSA_OP_PRIVILEGED | XTENSA_OP_EXIT_TB_0,
Max Filippov168c12b2017-11-03 18:29:27 -07005804 }, {
5805 .name = "xsr.ibreaka1",
Max Filippov59419602019-03-18 17:10:38 -07005806 .translate = translate_xsr_ibreaka,
Max Filippov91dc2b22020-05-04 14:08:40 -07005807 .test_exceptions = test_exceptions_ibreak,
Max Filippov59419602019-03-18 17:10:38 -07005808 .par = (const uint32_t[]){
5809 IBREAKA + 1,
5810 XTENSA_OPTION_DEBUG,
5811 },
Max Filippovbf525102018-09-01 00:47:55 -07005812 .op_flags = XTENSA_OP_PRIVILEGED | XTENSA_OP_EXIT_TB_0,
Max Filippov168c12b2017-11-03 18:29:27 -07005813 }, {
5814 .name = "xsr.ibreakenable",
Max Filippov59419602019-03-18 17:10:38 -07005815 .translate = translate_xsr_ibreakenable,
Max Filippov91dc2b22020-05-04 14:08:40 -07005816 .test_exceptions = test_exceptions_sr,
Max Filippov59419602019-03-18 17:10:38 -07005817 .par = (const uint32_t[]){
5818 IBREAKENABLE,
5819 XTENSA_OPTION_DEBUG,
5820 },
Max Filippovbf525102018-09-01 00:47:55 -07005821 .op_flags = XTENSA_OP_PRIVILEGED | XTENSA_OP_EXIT_TB_0,
Max Filippov168c12b2017-11-03 18:29:27 -07005822 }, {
5823 .name = "xsr.icount",
Max Filippov59419602019-03-18 17:10:38 -07005824 .translate = translate_xsr_icount,
Max Filippov91dc2b22020-05-04 14:08:40 -07005825 .test_exceptions = test_exceptions_sr,
Max Filippov59419602019-03-18 17:10:38 -07005826 .par = (const uint32_t[]){
5827 ICOUNT,
5828 XTENSA_OPTION_DEBUG,
5829 },
Max Filippov21a2dad2018-08-27 22:17:50 -07005830 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07005831 }, {
5832 .name = "xsr.icountlevel",
Max Filippov59419602019-03-18 17:10:38 -07005833 .translate = translate_xsr_mask,
Max Filippov91dc2b22020-05-04 14:08:40 -07005834 .test_exceptions = test_exceptions_sr,
Max Filippov59419602019-03-18 17:10:38 -07005835 .par = (const uint32_t[]){
5836 ICOUNTLEVEL,
5837 XTENSA_OPTION_DEBUG,
5838 0xf,
5839 },
Max Filippov226444a2018-09-01 00:47:55 -07005840 .op_flags = XTENSA_OP_PRIVILEGED | XTENSA_OP_EXIT_TB_M1,
Max Filippov168c12b2017-11-03 18:29:27 -07005841 }, {
5842 .name = "xsr.intclear",
Max Filippov59419602019-03-18 17:10:38 -07005843 .op_flags = XTENSA_OP_ILL,
Max Filippov168c12b2017-11-03 18:29:27 -07005844 }, {
5845 .name = "xsr.intenable",
5846 .translate = translate_xsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07005847 .test_exceptions = test_exceptions_sr,
Max Filippov59419602019-03-18 17:10:38 -07005848 .par = (const uint32_t[]){
5849 INTENABLE,
5850 XTENSA_OPTION_INTERRUPT,
5851 },
Max Filippovd74624e2018-09-02 02:07:30 -07005852 .op_flags =
5853 XTENSA_OP_PRIVILEGED |
5854 XTENSA_OP_EXIT_TB_0 |
5855 XTENSA_OP_CHECK_INTERRUPTS,
Max Filippov168c12b2017-11-03 18:29:27 -07005856 }, {
5857 .name = "xsr.interrupt",
Max Filippov59419602019-03-18 17:10:38 -07005858 .op_flags = XTENSA_OP_ILL,
Max Filippov168c12b2017-11-03 18:29:27 -07005859 }, {
5860 .name = "xsr.intset",
Max Filippov59419602019-03-18 17:10:38 -07005861 .op_flags = XTENSA_OP_ILL,
Max Filippov168c12b2017-11-03 18:29:27 -07005862 }, {
5863 .name = "xsr.itlbcfg",
Max Filippov59419602019-03-18 17:10:38 -07005864 .translate = translate_xsr_mask,
Max Filippov91dc2b22020-05-04 14:08:40 -07005865 .test_exceptions = test_exceptions_sr,
Max Filippov59419602019-03-18 17:10:38 -07005866 .par = (const uint32_t[]){
5867 ITLBCFG,
5868 XTENSA_OPTION_MMU,
5869 0x01130000,
5870 },
Max Filippov21a2dad2018-08-27 22:17:50 -07005871 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07005872 }, {
5873 .name = "xsr.lbeg",
5874 .translate = translate_xsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07005875 .test_exceptions = test_exceptions_sr,
Max Filippov59419602019-03-18 17:10:38 -07005876 .par = (const uint32_t[]){
5877 LBEG,
5878 XTENSA_OPTION_LOOP,
5879 },
Max Filippov5d630ce2018-10-03 15:59:11 -07005880 .op_flags = XTENSA_OP_EXIT_TB_M1,
Max Filippov168c12b2017-11-03 18:29:27 -07005881 }, {
5882 .name = "xsr.lcount",
5883 .translate = translate_xsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07005884 .test_exceptions = test_exceptions_sr,
Max Filippov59419602019-03-18 17:10:38 -07005885 .par = (const uint32_t[]){
5886 LCOUNT,
5887 XTENSA_OPTION_LOOP,
5888 },
Max Filippov168c12b2017-11-03 18:29:27 -07005889 }, {
5890 .name = "xsr.lend",
5891 .translate = translate_xsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07005892 .test_exceptions = test_exceptions_sr,
Max Filippov59419602019-03-18 17:10:38 -07005893 .par = (const uint32_t[]){
5894 LEND,
5895 XTENSA_OPTION_LOOP,
5896 },
Max Filippov5d630ce2018-10-03 15:59:11 -07005897 .op_flags = XTENSA_OP_EXIT_TB_M1,
Max Filippov168c12b2017-11-03 18:29:27 -07005898 }, {
5899 .name = "xsr.litbase",
Max Filippov59419602019-03-18 17:10:38 -07005900 .translate = translate_xsr_mask,
Max Filippov91dc2b22020-05-04 14:08:40 -07005901 .test_exceptions = test_exceptions_sr,
Max Filippov59419602019-03-18 17:10:38 -07005902 .par = (const uint32_t[]){
5903 LITBASE,
5904 XTENSA_OPTION_EXTENDED_L32R,
5905 0xfffff001,
5906 },
Max Filippov226444a2018-09-01 00:47:55 -07005907 .op_flags = XTENSA_OP_EXIT_TB_M1,
Max Filippov168c12b2017-11-03 18:29:27 -07005908 }, {
5909 .name = "xsr.m0",
5910 .translate = translate_xsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07005911 .test_exceptions = test_exceptions_sr,
Max Filippov59419602019-03-18 17:10:38 -07005912 .par = (const uint32_t[]){
5913 MR,
5914 XTENSA_OPTION_MAC16,
5915 },
Max Filippov168c12b2017-11-03 18:29:27 -07005916 }, {
5917 .name = "xsr.m1",
5918 .translate = translate_xsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07005919 .test_exceptions = test_exceptions_sr,
Max Filippov59419602019-03-18 17:10:38 -07005920 .par = (const uint32_t[]){
5921 MR + 1,
5922 XTENSA_OPTION_MAC16,
5923 },
Max Filippov168c12b2017-11-03 18:29:27 -07005924 }, {
5925 .name = "xsr.m2",
5926 .translate = translate_xsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07005927 .test_exceptions = test_exceptions_sr,
Max Filippov59419602019-03-18 17:10:38 -07005928 .par = (const uint32_t[]){
5929 MR + 2,
5930 XTENSA_OPTION_MAC16,
5931 },
Max Filippov168c12b2017-11-03 18:29:27 -07005932 }, {
5933 .name = "xsr.m3",
5934 .translate = translate_xsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07005935 .test_exceptions = test_exceptions_sr,
Max Filippov59419602019-03-18 17:10:38 -07005936 .par = (const uint32_t[]){
5937 MR + 3,
5938 XTENSA_OPTION_MAC16,
5939 },
Max Filippov168c12b2017-11-03 18:29:27 -07005940 }, {
5941 .name = "xsr.memctl",
Max Filippov59419602019-03-18 17:10:38 -07005942 .translate = translate_xsr_memctl,
Max Filippov168c12b2017-11-03 18:29:27 -07005943 .par = (const uint32_t[]){MEMCTL},
Max Filippov21a2dad2018-08-27 22:17:50 -07005944 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07005945 }, {
Max Filippov631a77a2019-03-13 12:41:13 -07005946 .name = "xsr.mecr",
5947 .translate = translate_xsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07005948 .test_exceptions = test_exceptions_sr,
Max Filippov631a77a2019-03-13 12:41:13 -07005949 .par = (const uint32_t[]){
5950 MECR,
5951 XTENSA_OPTION_MEMORY_ECC_PARITY,
5952 },
5953 .op_flags = XTENSA_OP_PRIVILEGED,
5954 }, {
5955 .name = "xsr.mepc",
5956 .translate = translate_xsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07005957 .test_exceptions = test_exceptions_sr,
Max Filippov631a77a2019-03-13 12:41:13 -07005958 .par = (const uint32_t[]){
5959 MEPC,
5960 XTENSA_OPTION_MEMORY_ECC_PARITY,
5961 },
5962 .op_flags = XTENSA_OP_PRIVILEGED,
5963 }, {
5964 .name = "xsr.meps",
5965 .translate = translate_xsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07005966 .test_exceptions = test_exceptions_sr,
Max Filippov631a77a2019-03-13 12:41:13 -07005967 .par = (const uint32_t[]){
5968 MEPS,
5969 XTENSA_OPTION_MEMORY_ECC_PARITY,
5970 },
5971 .op_flags = XTENSA_OP_PRIVILEGED,
5972 }, {
5973 .name = "xsr.mesave",
5974 .translate = translate_xsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07005975 .test_exceptions = test_exceptions_sr,
Max Filippov631a77a2019-03-13 12:41:13 -07005976 .par = (const uint32_t[]){
5977 MESAVE,
5978 XTENSA_OPTION_MEMORY_ECC_PARITY,
5979 },
5980 .op_flags = XTENSA_OP_PRIVILEGED,
5981 }, {
5982 .name = "xsr.mesr",
5983 .translate = translate_xsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07005984 .test_exceptions = test_exceptions_sr,
Max Filippov631a77a2019-03-13 12:41:13 -07005985 .par = (const uint32_t[]){
5986 MESR,
5987 XTENSA_OPTION_MEMORY_ECC_PARITY,
5988 },
5989 .op_flags = XTENSA_OP_PRIVILEGED,
5990 }, {
5991 .name = "xsr.mevaddr",
5992 .translate = translate_xsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07005993 .test_exceptions = test_exceptions_sr,
Max Filippov631a77a2019-03-13 12:41:13 -07005994 .par = (const uint32_t[]){
5995 MESR,
5996 XTENSA_OPTION_MEMORY_ECC_PARITY,
5997 },
5998 .op_flags = XTENSA_OP_PRIVILEGED,
5999 }, {
Max Filippov168c12b2017-11-03 18:29:27 -07006000 .name = "xsr.misc0",
6001 .translate = translate_xsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07006002 .test_exceptions = test_exceptions_sr,
Max Filippov59419602019-03-18 17:10:38 -07006003 .par = (const uint32_t[]){
6004 MISC,
6005 XTENSA_OPTION_MISC_SR,
6006 },
Max Filippov21a2dad2018-08-27 22:17:50 -07006007 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07006008 }, {
6009 .name = "xsr.misc1",
6010 .translate = translate_xsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07006011 .test_exceptions = test_exceptions_sr,
Max Filippov59419602019-03-18 17:10:38 -07006012 .par = (const uint32_t[]){
6013 MISC + 1,
6014 XTENSA_OPTION_MISC_SR,
6015 },
Max Filippov21a2dad2018-08-27 22:17:50 -07006016 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07006017 }, {
6018 .name = "xsr.misc2",
6019 .translate = translate_xsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07006020 .test_exceptions = test_exceptions_sr,
Max Filippov59419602019-03-18 17:10:38 -07006021 .par = (const uint32_t[]){
6022 MISC + 2,
6023 XTENSA_OPTION_MISC_SR,
6024 },
Max Filippov21a2dad2018-08-27 22:17:50 -07006025 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07006026 }, {
6027 .name = "xsr.misc3",
6028 .translate = translate_xsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07006029 .test_exceptions = test_exceptions_sr,
Max Filippov59419602019-03-18 17:10:38 -07006030 .par = (const uint32_t[]){
6031 MISC + 3,
6032 XTENSA_OPTION_MISC_SR,
6033 },
Max Filippov21a2dad2018-08-27 22:17:50 -07006034 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07006035 }, {
Max Filippov4d04ea32019-03-13 12:40:38 -07006036 .name = "xsr.mpuenb",
6037 .translate = translate_xsr_mpuenb,
Max Filippov91dc2b22020-05-04 14:08:40 -07006038 .test_exceptions = test_exceptions_sr,
Max Filippov4d04ea32019-03-13 12:40:38 -07006039 .par = (const uint32_t[]){
6040 MPUENB,
6041 XTENSA_OPTION_MPU,
6042 },
6043 .op_flags = XTENSA_OP_PRIVILEGED | XTENSA_OP_EXIT_TB_M1,
6044 }, {
Max Filippoveb3f4292019-02-18 03:11:40 -08006045 .name = "xsr.prefctl",
6046 .translate = translate_xsr,
Max Filippoveb3f4292019-02-18 03:11:40 -08006047 .par = (const uint32_t[]){PREFCTL},
6048 }, {
Max Filippov168c12b2017-11-03 18:29:27 -07006049 .name = "xsr.prid",
Max Filippov59419602019-03-18 17:10:38 -07006050 .op_flags = XTENSA_OP_ILL,
Max Filippov168c12b2017-11-03 18:29:27 -07006051 }, {
6052 .name = "xsr.ps",
Max Filippov59419602019-03-18 17:10:38 -07006053 .translate = translate_xsr_ps,
Max Filippov91dc2b22020-05-04 14:08:40 -07006054 .test_exceptions = test_exceptions_sr,
Max Filippov59419602019-03-18 17:10:38 -07006055 .par = (const uint32_t[]){
6056 PS,
6057 XTENSA_OPTION_EXCEPTION,
6058 },
Max Filippovd74624e2018-09-02 02:07:30 -07006059 .op_flags =
6060 XTENSA_OP_PRIVILEGED |
6061 XTENSA_OP_EXIT_TB_M1 |
6062 XTENSA_OP_CHECK_INTERRUPTS,
Max Filippov168c12b2017-11-03 18:29:27 -07006063 }, {
6064 .name = "xsr.ptevaddr",
Max Filippov59419602019-03-18 17:10:38 -07006065 .translate = translate_xsr_mask,
Max Filippov91dc2b22020-05-04 14:08:40 -07006066 .test_exceptions = test_exceptions_sr,
Max Filippov59419602019-03-18 17:10:38 -07006067 .par = (const uint32_t[]){
6068 PTEVADDR,
6069 XTENSA_OPTION_MMU,
6070 0xffc00000,
6071 },
Max Filippov21a2dad2018-08-27 22:17:50 -07006072 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07006073 }, {
6074 .name = "xsr.rasid",
Max Filippov59419602019-03-18 17:10:38 -07006075 .translate = translate_xsr_rasid,
Max Filippov91dc2b22020-05-04 14:08:40 -07006076 .test_exceptions = test_exceptions_sr,
Max Filippov59419602019-03-18 17:10:38 -07006077 .par = (const uint32_t[]){
6078 RASID,
6079 XTENSA_OPTION_MMU,
6080 },
Max Filippov226444a2018-09-01 00:47:55 -07006081 .op_flags = XTENSA_OP_PRIVILEGED | XTENSA_OP_EXIT_TB_M1,
Max Filippov168c12b2017-11-03 18:29:27 -07006082 }, {
6083 .name = "xsr.sar",
Max Filippov59419602019-03-18 17:10:38 -07006084 .translate = translate_xsr_sar,
Max Filippov168c12b2017-11-03 18:29:27 -07006085 .par = (const uint32_t[]){SAR},
6086 }, {
6087 .name = "xsr.scompare1",
6088 .translate = translate_xsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07006089 .test_exceptions = test_exceptions_sr,
Max Filippov59419602019-03-18 17:10:38 -07006090 .par = (const uint32_t[]){
6091 SCOMPARE1,
6092 XTENSA_OPTION_CONDITIONAL_STORE,
6093 },
Max Filippov168c12b2017-11-03 18:29:27 -07006094 }, {
6095 .name = "xsr.vecbase",
6096 .translate = translate_xsr,
Max Filippov91dc2b22020-05-04 14:08:40 -07006097 .test_exceptions = test_exceptions_sr,
Max Filippov59419602019-03-18 17:10:38 -07006098 .par = (const uint32_t[]){
6099 VECBASE,
6100 XTENSA_OPTION_RELOCATABLE_VECTOR,
6101 },
Max Filippov21a2dad2018-08-27 22:17:50 -07006102 .op_flags = XTENSA_OP_PRIVILEGED,
Max Filippov168c12b2017-11-03 18:29:27 -07006103 }, {
6104 .name = "xsr.windowbase",
Max Filippov59419602019-03-18 17:10:38 -07006105 .translate = translate_xsr_windowbase,
Max Filippov91dc2b22020-05-04 14:08:40 -07006106 .test_exceptions = test_exceptions_sr,
Max Filippov59419602019-03-18 17:10:38 -07006107 .par = (const uint32_t[]){
6108 WINDOW_BASE,
6109 XTENSA_OPTION_WINDOWED_REGISTER,
6110 },
Max Filippov8df3fd32019-01-30 14:56:29 -08006111 .op_flags = XTENSA_OP_PRIVILEGED |
6112 XTENSA_OP_EXIT_TB_M1 |
6113 XTENSA_OP_SYNC_REGISTER_WINDOW,
Max Filippov168c12b2017-11-03 18:29:27 -07006114 }, {
6115 .name = "xsr.windowstart",
Max Filippov59419602019-03-18 17:10:38 -07006116 .translate = translate_xsr_windowstart,
Max Filippov91dc2b22020-05-04 14:08:40 -07006117 .test_exceptions = test_exceptions_sr,
Max Filippov59419602019-03-18 17:10:38 -07006118 .par = (const uint32_t[]){
6119 WINDOW_START,
6120 XTENSA_OPTION_WINDOWED_REGISTER,
6121 },
Max Filippov226444a2018-09-01 00:47:55 -07006122 .op_flags = XTENSA_OP_PRIVILEGED | XTENSA_OP_EXIT_TB_M1,
Max Filippov168c12b2017-11-03 18:29:27 -07006123 },
6124};
6125
6126const XtensaOpcodeTranslators xtensa_core_opcodes = {
6127 .num_opcodes = ARRAY_SIZE(core_ops),
6128 .opcode = core_ops,
6129};
Max Filippovc04e1692017-11-03 19:37:13 -07006130
6131
Max Filippovcfa9f052020-06-30 19:27:02 -07006132static inline void get_f32_o1_i3(const OpcodeArg *arg, OpcodeArg *arg32,
6133 int o0, int i0, int i1, int i2)
6134{
6135 if ((i0 >= 0 && arg[i0].num_bits == 64) ||
6136 (o0 >= 0 && arg[o0].num_bits == 64)) {
6137 if (o0 >= 0) {
6138 arg32[o0].out = tcg_temp_new_i32();
6139 }
6140 if (i0 >= 0) {
6141 arg32[i0].in = tcg_temp_new_i32();
6142 tcg_gen_extrl_i64_i32(arg32[i0].in, arg[i0].in);
6143 }
6144 if (i1 >= 0) {
6145 arg32[i1].in = tcg_temp_new_i32();
6146 tcg_gen_extrl_i64_i32(arg32[i1].in, arg[i1].in);
6147 }
6148 if (i2 >= 0) {
6149 arg32[i2].in = tcg_temp_new_i32();
6150 tcg_gen_extrl_i64_i32(arg32[i2].in, arg[i2].in);
6151 }
6152 } else {
6153 if (o0 >= 0) {
6154 arg32[o0].out = arg[o0].out;
6155 }
6156 if (i0 >= 0) {
6157 arg32[i0].in = arg[i0].in;
6158 }
6159 if (i1 >= 0) {
6160 arg32[i1].in = arg[i1].in;
6161 }
6162 if (i2 >= 0) {
6163 arg32[i2].in = arg[i2].in;
6164 }
6165 }
6166}
6167
6168static inline void put_f32_o1_i3(const OpcodeArg *arg, const OpcodeArg *arg32,
6169 int o0, int i0, int i1, int i2)
6170{
6171 if ((i0 >= 0 && arg[i0].num_bits == 64) ||
6172 (o0 >= 0 && arg[o0].num_bits == 64)) {
6173 if (o0 >= 0) {
6174 tcg_gen_extu_i32_i64(arg[o0].out, arg32[o0].out);
Max Filippovcfa9f052020-06-30 19:27:02 -07006175 }
6176 }
6177}
6178
6179static inline void get_f32_o1_i2(const OpcodeArg *arg, OpcodeArg *arg32,
6180 int o0, int i0, int i1)
6181{
6182 get_f32_o1_i3(arg, arg32, o0, i0, i1, -1);
6183}
6184
6185static inline void put_f32_o1_i2(const OpcodeArg *arg, const OpcodeArg *arg32,
6186 int o0, int i0, int i1)
6187{
6188 put_f32_o1_i3(arg, arg32, o0, i0, i1, -1);
6189}
6190
6191static inline void get_f32_o1_i1(const OpcodeArg *arg, OpcodeArg *arg32,
6192 int o0, int i0)
6193{
6194 get_f32_o1_i2(arg, arg32, o0, i0, -1);
6195}
6196
6197static inline void put_f32_o1_i1(const OpcodeArg *arg, const OpcodeArg *arg32,
6198 int o0, int i0)
6199{
6200 put_f32_o1_i2(arg, arg32, o0, i0, -1);
6201}
6202
6203static inline void get_f32_o1(const OpcodeArg *arg, OpcodeArg *arg32,
6204 int o0)
6205{
6206 get_f32_o1_i1(arg, arg32, o0, -1);
6207}
6208
6209static inline void put_f32_o1(const OpcodeArg *arg, const OpcodeArg *arg32,
6210 int o0)
6211{
6212 put_f32_o1_i1(arg, arg32, o0, -1);
6213}
6214
6215static inline void get_f32_i2(const OpcodeArg *arg, OpcodeArg *arg32,
6216 int i0, int i1)
6217{
6218 get_f32_o1_i2(arg, arg32, -1, i0, i1);
6219}
6220
6221static inline void put_f32_i2(const OpcodeArg *arg, const OpcodeArg *arg32,
6222 int i0, int i1)
6223{
6224 put_f32_o1_i2(arg, arg32, -1, i0, i1);
6225}
6226
6227static inline void get_f32_i1(const OpcodeArg *arg, OpcodeArg *arg32,
6228 int i0)
6229{
6230 get_f32_i2(arg, arg32, i0, -1);
6231}
6232
6233static inline void put_f32_i1(const OpcodeArg *arg, const OpcodeArg *arg32,
6234 int i0)
6235{
6236 put_f32_i2(arg, arg32, i0, -1);
6237}
6238
6239
6240static void translate_abs_d(DisasContext *dc, const OpcodeArg arg[],
6241 const uint32_t par[])
6242{
6243 gen_helper_abs_d(arg[0].out, arg[1].in);
6244}
6245
Max Filippovb0b24bd2019-02-11 18:53:19 -08006246static void translate_abs_s(DisasContext *dc, const OpcodeArg arg[],
Max Filippovc04e1692017-11-03 19:37:13 -07006247 const uint32_t par[])
6248{
Max Filippovcfa9f052020-06-30 19:27:02 -07006249 OpcodeArg arg32[2];
6250
6251 get_f32_o1_i1(arg, arg32, 0, 1);
6252 gen_helper_abs_s(arg32[0].out, arg32[1].in);
6253 put_f32_o1_i1(arg, arg32, 0, 1);
Max Filippovc04e1692017-11-03 19:37:13 -07006254}
6255
Max Filippov5680f202015-07-13 04:30:41 +03006256static void translate_fpu2k_add_s(DisasContext *dc, const OpcodeArg arg[],
6257 const uint32_t par[])
Max Filippovc04e1692017-11-03 19:37:13 -07006258{
Richard Hendersonad75a512023-09-13 16:37:36 -07006259 gen_helper_fpu2k_add_s(arg[0].out, tcg_env,
Max Filippov5680f202015-07-13 04:30:41 +03006260 arg[1].in, arg[2].in);
Max Filippovc04e1692017-11-03 19:37:13 -07006261}
6262
6263enum {
6264 COMPARE_UN,
6265 COMPARE_OEQ,
6266 COMPARE_UEQ,
6267 COMPARE_OLT,
6268 COMPARE_ULT,
6269 COMPARE_OLE,
6270 COMPARE_ULE,
6271};
6272
Max Filippovcfa9f052020-06-30 19:27:02 -07006273static void translate_compare_d(DisasContext *dc, const OpcodeArg arg[],
Max Filippovc04e1692017-11-03 19:37:13 -07006274 const uint32_t par[])
6275{
Max Filippov5dbb4c92020-06-30 07:50:14 -07006276 static void (* const helper[])(TCGv_i32 res, TCGv_env env,
Max Filippovcfa9f052020-06-30 19:27:02 -07006277 TCGv_i64 s, TCGv_i64 t) = {
6278 [COMPARE_UN] = gen_helper_un_d,
6279 [COMPARE_OEQ] = gen_helper_oeq_d,
6280 [COMPARE_UEQ] = gen_helper_ueq_d,
6281 [COMPARE_OLT] = gen_helper_olt_d,
6282 [COMPARE_ULT] = gen_helper_ult_d,
6283 [COMPARE_OLE] = gen_helper_ole_d,
6284 [COMPARE_ULE] = gen_helper_ule_d,
Max Filippovc04e1692017-11-03 19:37:13 -07006285 };
Max Filippov2b570a12022-04-21 13:27:27 -07006286 TCGv_i32 zero = tcg_constant_i32(0);
Max Filippov5dbb4c92020-06-30 07:50:14 -07006287 TCGv_i32 res = tcg_temp_new_i32();
6288 TCGv_i32 set_br = tcg_temp_new_i32();
6289 TCGv_i32 clr_br = tcg_temp_new_i32();
Max Filippovc04e1692017-11-03 19:37:13 -07006290
Max Filippov5dbb4c92020-06-30 07:50:14 -07006291 tcg_gen_ori_i32(set_br, arg[0].in, 1 << arg[0].imm);
6292 tcg_gen_andi_i32(clr_br, arg[0].in, ~(1 << arg[0].imm));
6293
Richard Hendersonad75a512023-09-13 16:37:36 -07006294 helper[par[0]](res, tcg_env, arg[1].in, arg[2].in);
Max Filippov5dbb4c92020-06-30 07:50:14 -07006295 tcg_gen_movcond_i32(TCG_COND_NE,
6296 arg[0].out, res, zero,
6297 set_br, clr_br);
Max Filippovc04e1692017-11-03 19:37:13 -07006298}
6299
Max Filippovcfa9f052020-06-30 19:27:02 -07006300static void translate_compare_s(DisasContext *dc, const OpcodeArg arg[],
6301 const uint32_t par[])
6302{
6303 static void (* const helper[])(TCGv_i32 res, TCGv_env env,
6304 TCGv_i32 s, TCGv_i32 t) = {
6305 [COMPARE_UN] = gen_helper_un_s,
6306 [COMPARE_OEQ] = gen_helper_oeq_s,
6307 [COMPARE_UEQ] = gen_helper_ueq_s,
6308 [COMPARE_OLT] = gen_helper_olt_s,
6309 [COMPARE_ULT] = gen_helper_ult_s,
6310 [COMPARE_OLE] = gen_helper_ole_s,
6311 [COMPARE_ULE] = gen_helper_ule_s,
6312 };
6313 OpcodeArg arg32[3];
Max Filippov2b570a12022-04-21 13:27:27 -07006314 TCGv_i32 zero = tcg_constant_i32(0);
Max Filippovcfa9f052020-06-30 19:27:02 -07006315 TCGv_i32 res = tcg_temp_new_i32();
6316 TCGv_i32 set_br = tcg_temp_new_i32();
6317 TCGv_i32 clr_br = tcg_temp_new_i32();
6318
6319 tcg_gen_ori_i32(set_br, arg[0].in, 1 << arg[0].imm);
6320 tcg_gen_andi_i32(clr_br, arg[0].in, ~(1 << arg[0].imm));
6321
6322 get_f32_i2(arg, arg32, 1, 2);
Richard Hendersonad75a512023-09-13 16:37:36 -07006323 helper[par[0]](res, tcg_env, arg32[1].in, arg32[2].in);
Max Filippovcfa9f052020-06-30 19:27:02 -07006324 tcg_gen_movcond_i32(TCG_COND_NE,
6325 arg[0].out, res, zero,
6326 set_br, clr_br);
6327 put_f32_i2(arg, arg32, 1, 2);
Max Filippovcfa9f052020-06-30 19:27:02 -07006328}
6329
6330static void translate_const_d(DisasContext *dc, const OpcodeArg arg[],
6331 const uint32_t par[])
6332{
6333 static const uint64_t v[] = {
6334 UINT64_C(0x0000000000000000),
6335 UINT64_C(0x3ff0000000000000),
6336 UINT64_C(0x4000000000000000),
6337 UINT64_C(0x3fe0000000000000),
6338 };
6339
6340 tcg_gen_movi_i64(arg[0].out, v[arg[1].imm % ARRAY_SIZE(v)]);
6341 if (arg[1].imm >= ARRAY_SIZE(v)) {
6342 qemu_log_mask(LOG_GUEST_ERROR,
6343 "const.d f%d, #%d, immediate value is reserved\n",
6344 arg[0].imm, arg[1].imm);
6345 }
6346}
6347
6348static void translate_const_s(DisasContext *dc, const OpcodeArg arg[],
6349 const uint32_t par[])
6350{
6351 static const uint32_t v[] = {
6352 0x00000000,
6353 0x3f800000,
6354 0x40000000,
6355 0x3f000000,
6356 };
6357
6358 if (arg[0].num_bits == 32) {
6359 tcg_gen_movi_i32(arg[0].out, v[arg[1].imm % ARRAY_SIZE(v)]);
6360 } else {
6361 tcg_gen_movi_i64(arg[0].out, v[arg[1].imm % ARRAY_SIZE(v)]);
6362 }
6363 if (arg[1].imm >= ARRAY_SIZE(v)) {
6364 qemu_log_mask(LOG_GUEST_ERROR,
6365 "const.s f%d, #%d, immediate value is reserved\n",
6366 arg[0].imm, arg[1].imm);
6367 }
6368}
6369
6370static void translate_float_d(DisasContext *dc, const OpcodeArg arg[],
Max Filippovc04e1692017-11-03 19:37:13 -07006371 const uint32_t par[])
6372{
Max Filippov867e3542022-04-21 13:38:58 -07006373 TCGv_i32 scale = tcg_constant_i32(-arg[2].imm);
Max Filippovc04e1692017-11-03 19:37:13 -07006374
Max Filippov582fef02018-08-31 13:57:08 -07006375 if (par[0]) {
Richard Hendersonad75a512023-09-13 16:37:36 -07006376 gen_helper_uitof_d(arg[0].out, tcg_env, arg[1].in, scale);
Max Filippov582fef02018-08-31 13:57:08 -07006377 } else {
Richard Hendersonad75a512023-09-13 16:37:36 -07006378 gen_helper_itof_d(arg[0].out, tcg_env, arg[1].in, scale);
Max Filippovc04e1692017-11-03 19:37:13 -07006379 }
6380}
6381
Max Filippovcfa9f052020-06-30 19:27:02 -07006382static void translate_float_s(DisasContext *dc, const OpcodeArg arg[],
6383 const uint32_t par[])
6384{
Max Filippov867e3542022-04-21 13:38:58 -07006385 TCGv_i32 scale = tcg_constant_i32(-arg[2].imm);
Max Filippovcfa9f052020-06-30 19:27:02 -07006386 OpcodeArg arg32[1];
6387
6388 get_f32_o1(arg, arg32, 0);
6389 if (par[0]) {
Richard Hendersonad75a512023-09-13 16:37:36 -07006390 gen_helper_uitof_s(arg32[0].out, tcg_env, arg[1].in, scale);
Max Filippovcfa9f052020-06-30 19:27:02 -07006391 } else {
Richard Hendersonad75a512023-09-13 16:37:36 -07006392 gen_helper_itof_s(arg32[0].out, tcg_env, arg[1].in, scale);
Max Filippovcfa9f052020-06-30 19:27:02 -07006393 }
6394 put_f32_o1(arg, arg32, 0);
Max Filippovcfa9f052020-06-30 19:27:02 -07006395}
6396
6397static void translate_ftoi_d(DisasContext *dc, const OpcodeArg arg[],
6398 const uint32_t par[])
6399{
Max Filippov867e3542022-04-21 13:38:58 -07006400 TCGv_i32 rounding_mode = tcg_constant_i32(par[0]);
6401 TCGv_i32 scale = tcg_constant_i32(arg[2].imm);
Max Filippovcfa9f052020-06-30 19:27:02 -07006402
6403 if (par[1]) {
Richard Hendersonad75a512023-09-13 16:37:36 -07006404 gen_helper_ftoui_d(arg[0].out, tcg_env, arg[1].in,
Max Filippovcfa9f052020-06-30 19:27:02 -07006405 rounding_mode, scale);
6406 } else {
Richard Hendersonad75a512023-09-13 16:37:36 -07006407 gen_helper_ftoi_d(arg[0].out, tcg_env, arg[1].in,
Max Filippovcfa9f052020-06-30 19:27:02 -07006408 rounding_mode, scale);
6409 }
Max Filippovcfa9f052020-06-30 19:27:02 -07006410}
6411
Max Filippovb0b24bd2019-02-11 18:53:19 -08006412static void translate_ftoi_s(DisasContext *dc, const OpcodeArg arg[],
Max Filippovc04e1692017-11-03 19:37:13 -07006413 const uint32_t par[])
6414{
Max Filippov867e3542022-04-21 13:38:58 -07006415 TCGv_i32 rounding_mode = tcg_constant_i32(par[0]);
6416 TCGv_i32 scale = tcg_constant_i32(arg[2].imm);
Max Filippovcfa9f052020-06-30 19:27:02 -07006417 OpcodeArg arg32[2];
Max Filippovc04e1692017-11-03 19:37:13 -07006418
Max Filippovcfa9f052020-06-30 19:27:02 -07006419 get_f32_i1(arg, arg32, 1);
Max Filippov582fef02018-08-31 13:57:08 -07006420 if (par[1]) {
Richard Hendersonad75a512023-09-13 16:37:36 -07006421 gen_helper_ftoui_s(arg[0].out, tcg_env, arg32[1].in,
Max Filippov5680f202015-07-13 04:30:41 +03006422 rounding_mode, scale);
Max Filippov582fef02018-08-31 13:57:08 -07006423 } else {
Richard Hendersonad75a512023-09-13 16:37:36 -07006424 gen_helper_ftoi_s(arg[0].out, tcg_env, arg32[1].in,
Max Filippov5680f202015-07-13 04:30:41 +03006425 rounding_mode, scale);
Max Filippovc04e1692017-11-03 19:37:13 -07006426 }
Max Filippovcfa9f052020-06-30 19:27:02 -07006427 put_f32_i1(arg, arg32, 1);
Max Filippovc04e1692017-11-03 19:37:13 -07006428}
6429
Max Filippovb0b24bd2019-02-11 18:53:19 -08006430static void translate_ldsti(DisasContext *dc, const OpcodeArg arg[],
Max Filippovc04e1692017-11-03 19:37:13 -07006431 const uint32_t par[])
6432{
Max Filippov582fef02018-08-31 13:57:08 -07006433 TCGv_i32 addr = tcg_temp_new_i32();
Max Filippov583e6a52021-05-17 12:31:08 -07006434 MemOp mop;
Max Filippovc04e1692017-11-03 19:37:13 -07006435
Max Filippovb0b24bd2019-02-11 18:53:19 -08006436 tcg_gen_addi_i32(addr, arg[1].in, arg[2].imm);
Max Filippov583e6a52021-05-17 12:31:08 -07006437 mop = gen_load_store_alignment(dc, MO_TEUL, addr);
Max Filippov582fef02018-08-31 13:57:08 -07006438 if (par[0]) {
Max Filippov583e6a52021-05-17 12:31:08 -07006439 tcg_gen_qemu_st_tl(arg[0].in, addr, dc->cring, mop);
Max Filippov582fef02018-08-31 13:57:08 -07006440 } else {
Max Filippov583e6a52021-05-17 12:31:08 -07006441 tcg_gen_qemu_ld_tl(arg[0].out, addr, dc->cring, mop);
Max Filippovc04e1692017-11-03 19:37:13 -07006442 }
Max Filippov582fef02018-08-31 13:57:08 -07006443 if (par[1]) {
Max Filippovb0b24bd2019-02-11 18:53:19 -08006444 tcg_gen_mov_i32(arg[1].out, addr);
Max Filippov582fef02018-08-31 13:57:08 -07006445 }
Max Filippovc04e1692017-11-03 19:37:13 -07006446}
6447
Max Filippovb0b24bd2019-02-11 18:53:19 -08006448static void translate_ldstx(DisasContext *dc, const OpcodeArg arg[],
Max Filippovc04e1692017-11-03 19:37:13 -07006449 const uint32_t par[])
6450{
Max Filippov582fef02018-08-31 13:57:08 -07006451 TCGv_i32 addr = tcg_temp_new_i32();
Max Filippov583e6a52021-05-17 12:31:08 -07006452 MemOp mop;
Max Filippovc04e1692017-11-03 19:37:13 -07006453
Max Filippovb0b24bd2019-02-11 18:53:19 -08006454 tcg_gen_add_i32(addr, arg[1].in, arg[2].in);
Max Filippov583e6a52021-05-17 12:31:08 -07006455 mop = gen_load_store_alignment(dc, MO_TEUL, addr);
Max Filippov582fef02018-08-31 13:57:08 -07006456 if (par[0]) {
Max Filippov583e6a52021-05-17 12:31:08 -07006457 tcg_gen_qemu_st_tl(arg[0].in, addr, dc->cring, mop);
Max Filippov582fef02018-08-31 13:57:08 -07006458 } else {
Max Filippov583e6a52021-05-17 12:31:08 -07006459 tcg_gen_qemu_ld_tl(arg[0].out, addr, dc->cring, mop);
Max Filippovc04e1692017-11-03 19:37:13 -07006460 }
Max Filippov582fef02018-08-31 13:57:08 -07006461 if (par[1]) {
Max Filippovb0b24bd2019-02-11 18:53:19 -08006462 tcg_gen_mov_i32(arg[1].out, addr);
Max Filippov582fef02018-08-31 13:57:08 -07006463 }
Max Filippovc04e1692017-11-03 19:37:13 -07006464}
6465
Max Filippov5680f202015-07-13 04:30:41 +03006466static void translate_fpu2k_madd_s(DisasContext *dc, const OpcodeArg arg[],
6467 const uint32_t par[])
Max Filippovc04e1692017-11-03 19:37:13 -07006468{
Richard Hendersonad75a512023-09-13 16:37:36 -07006469 gen_helper_fpu2k_madd_s(arg[0].out, tcg_env,
Max Filippov5680f202015-07-13 04:30:41 +03006470 arg[0].in, arg[1].in, arg[2].in);
Max Filippovc04e1692017-11-03 19:37:13 -07006471}
6472
Max Filippovcfa9f052020-06-30 19:27:02 -07006473static void translate_mov_d(DisasContext *dc, const OpcodeArg arg[],
6474 const uint32_t par[])
6475{
6476 tcg_gen_mov_i64(arg[0].out, arg[1].in);
6477}
6478
Max Filippovb0b24bd2019-02-11 18:53:19 -08006479static void translate_mov_s(DisasContext *dc, const OpcodeArg arg[],
Max Filippovc04e1692017-11-03 19:37:13 -07006480 const uint32_t par[])
6481{
Max Filippovcfa9f052020-06-30 19:27:02 -07006482 if (arg[0].num_bits == 32) {
6483 tcg_gen_mov_i32(arg[0].out, arg[1].in);
6484 } else {
6485 tcg_gen_mov_i64(arg[0].out, arg[1].in);
6486 }
6487}
6488
6489static void translate_movcond_d(DisasContext *dc, const OpcodeArg arg[],
6490 const uint32_t par[])
6491{
Max Filippov2b570a12022-04-21 13:27:27 -07006492 TCGv_i64 zero = tcg_constant_i64(0);
Max Filippovcfa9f052020-06-30 19:27:02 -07006493 TCGv_i64 arg2 = tcg_temp_new_i64();
6494
6495 tcg_gen_ext_i32_i64(arg2, arg[2].in);
6496 tcg_gen_movcond_i64(par[0], arg[0].out,
6497 arg2, zero,
6498 arg[1].in, arg[0].in);
Max Filippovc04e1692017-11-03 19:37:13 -07006499}
6500
Max Filippovb0b24bd2019-02-11 18:53:19 -08006501static void translate_movcond_s(DisasContext *dc, const OpcodeArg arg[],
Max Filippovc04e1692017-11-03 19:37:13 -07006502 const uint32_t par[])
6503{
Max Filippovcfa9f052020-06-30 19:27:02 -07006504 if (arg[0].num_bits == 32) {
Max Filippov2b570a12022-04-21 13:27:27 -07006505 TCGv_i32 zero = tcg_constant_i32(0);
Max Filippovc04e1692017-11-03 19:37:13 -07006506
Max Filippovcfa9f052020-06-30 19:27:02 -07006507 tcg_gen_movcond_i32(par[0], arg[0].out,
6508 arg[2].in, zero,
6509 arg[1].in, arg[0].in);
Max Filippovcfa9f052020-06-30 19:27:02 -07006510 } else {
6511 translate_movcond_d(dc, arg, par);
6512 }
6513}
6514
6515static void translate_movp_d(DisasContext *dc, const OpcodeArg arg[],
6516 const uint32_t par[])
6517{
Max Filippov2b570a12022-04-21 13:27:27 -07006518 TCGv_i64 zero = tcg_constant_i64(0);
Max Filippovcfa9f052020-06-30 19:27:02 -07006519 TCGv_i32 tmp1 = tcg_temp_new_i32();
6520 TCGv_i64 tmp2 = tcg_temp_new_i64();
6521
6522 tcg_gen_andi_i32(tmp1, arg[2].in, 1 << arg[2].imm);
6523 tcg_gen_extu_i32_i64(tmp2, tmp1);
6524 tcg_gen_movcond_i64(par[0],
6525 arg[0].out, tmp2, zero,
Max Filippovb0b24bd2019-02-11 18:53:19 -08006526 arg[1].in, arg[0].in);
Max Filippovc04e1692017-11-03 19:37:13 -07006527}
6528
Max Filippovb0b24bd2019-02-11 18:53:19 -08006529static void translate_movp_s(DisasContext *dc, const OpcodeArg arg[],
Max Filippovc04e1692017-11-03 19:37:13 -07006530 const uint32_t par[])
6531{
Max Filippovcfa9f052020-06-30 19:27:02 -07006532 if (arg[0].num_bits == 32) {
Max Filippov2b570a12022-04-21 13:27:27 -07006533 TCGv_i32 zero = tcg_constant_i32(0);
Max Filippovcfa9f052020-06-30 19:27:02 -07006534 TCGv_i32 tmp = tcg_temp_new_i32();
Max Filippovc04e1692017-11-03 19:37:13 -07006535
Max Filippovcfa9f052020-06-30 19:27:02 -07006536 tcg_gen_andi_i32(tmp, arg[2].in, 1 << arg[2].imm);
6537 tcg_gen_movcond_i32(par[0],
6538 arg[0].out, tmp, zero,
6539 arg[1].in, arg[0].in);
Max Filippovcfa9f052020-06-30 19:27:02 -07006540 } else {
6541 translate_movp_d(dc, arg, par);
6542 }
Max Filippovc04e1692017-11-03 19:37:13 -07006543}
6544
Max Filippov5680f202015-07-13 04:30:41 +03006545static void translate_fpu2k_mul_s(DisasContext *dc, const OpcodeArg arg[],
6546 const uint32_t par[])
Max Filippovc04e1692017-11-03 19:37:13 -07006547{
Richard Hendersonad75a512023-09-13 16:37:36 -07006548 gen_helper_fpu2k_mul_s(arg[0].out, tcg_env,
Max Filippov5680f202015-07-13 04:30:41 +03006549 arg[1].in, arg[2].in);
Max Filippovc04e1692017-11-03 19:37:13 -07006550}
6551
Max Filippov5680f202015-07-13 04:30:41 +03006552static void translate_fpu2k_msub_s(DisasContext *dc, const OpcodeArg arg[],
6553 const uint32_t par[])
Max Filippovc04e1692017-11-03 19:37:13 -07006554{
Richard Hendersonad75a512023-09-13 16:37:36 -07006555 gen_helper_fpu2k_msub_s(arg[0].out, tcg_env,
Max Filippov5680f202015-07-13 04:30:41 +03006556 arg[0].in, arg[1].in, arg[2].in);
Max Filippovc04e1692017-11-03 19:37:13 -07006557}
6558
Max Filippovcfa9f052020-06-30 19:27:02 -07006559static void translate_neg_d(DisasContext *dc, const OpcodeArg arg[],
6560 const uint32_t par[])
6561{
6562 gen_helper_neg_d(arg[0].out, arg[1].in);
6563}
6564
Max Filippovb0b24bd2019-02-11 18:53:19 -08006565static void translate_neg_s(DisasContext *dc, const OpcodeArg arg[],
Max Filippovc04e1692017-11-03 19:37:13 -07006566 const uint32_t par[])
6567{
Max Filippovcfa9f052020-06-30 19:27:02 -07006568 OpcodeArg arg32[2];
6569
6570 get_f32_o1_i1(arg, arg32, 0, 1);
6571 gen_helper_neg_s(arg32[0].out, arg32[1].in);
6572 put_f32_o1_i1(arg, arg32, 0, 1);
6573}
6574
6575static void translate_rfr_d(DisasContext *dc, const OpcodeArg arg[],
6576 const uint32_t par[])
6577{
6578 tcg_gen_extrh_i64_i32(arg[0].out, arg[1].in);
Max Filippovc04e1692017-11-03 19:37:13 -07006579}
6580
Max Filippovb0b24bd2019-02-11 18:53:19 -08006581static void translate_rfr_s(DisasContext *dc, const OpcodeArg arg[],
Max Filippovc04e1692017-11-03 19:37:13 -07006582 const uint32_t par[])
6583{
Max Filippovcfa9f052020-06-30 19:27:02 -07006584 if (arg[1].num_bits == 32) {
6585 tcg_gen_mov_i32(arg[0].out, arg[1].in);
6586 } else {
6587 tcg_gen_extrl_i64_i32(arg[0].out, arg[1].in);
6588 }
Max Filippovc04e1692017-11-03 19:37:13 -07006589}
6590
Max Filippov5680f202015-07-13 04:30:41 +03006591static void translate_fpu2k_sub_s(DisasContext *dc, const OpcodeArg arg[],
6592 const uint32_t par[])
Max Filippovc04e1692017-11-03 19:37:13 -07006593{
Richard Hendersonad75a512023-09-13 16:37:36 -07006594 gen_helper_fpu2k_sub_s(arg[0].out, tcg_env,
Max Filippov5680f202015-07-13 04:30:41 +03006595 arg[1].in, arg[2].in);
Max Filippovc04e1692017-11-03 19:37:13 -07006596}
6597
Max Filippovcfa9f052020-06-30 19:27:02 -07006598static void translate_wfr_d(DisasContext *dc, const OpcodeArg arg[],
6599 const uint32_t par[])
6600{
6601 tcg_gen_concat_i32_i64(arg[0].out, arg[2].in, arg[1].in);
6602}
6603
Max Filippovb0b24bd2019-02-11 18:53:19 -08006604static void translate_wfr_s(DisasContext *dc, const OpcodeArg arg[],
Max Filippovc04e1692017-11-03 19:37:13 -07006605 const uint32_t par[])
6606{
Max Filippovcfa9f052020-06-30 19:27:02 -07006607 if (arg[0].num_bits == 32) {
6608 tcg_gen_mov_i32(arg[0].out, arg[1].in);
6609 } else {
6610 tcg_gen_ext_i32_i64(arg[0].out, arg[1].in);
6611 }
Max Filippovc04e1692017-11-03 19:37:13 -07006612}
6613
Max Filippovff35a7d2015-07-13 04:30:41 +03006614static void translate_wur_fpu2k_fcr(DisasContext *dc, const OpcodeArg arg[],
6615 const uint32_t par[])
6616{
Richard Hendersonad75a512023-09-13 16:37:36 -07006617 gen_helper_wur_fpu2k_fcr(tcg_env, arg[0].in);
Max Filippovff35a7d2015-07-13 04:30:41 +03006618}
6619
6620static void translate_wur_fpu2k_fsr(DisasContext *dc, const OpcodeArg arg[],
6621 const uint32_t par[])
6622{
6623 tcg_gen_andi_i32(cpu_UR[par[0]], arg[0].in, 0xffffff80);
6624}
6625
Max Filippovc04e1692017-11-03 19:37:13 -07006626static const XtensaOpcodeOps fpu2000_ops[] = {
6627 {
6628 .name = "abs.s",
6629 .translate = translate_abs_s,
Max Filippov582fef02018-08-31 13:57:08 -07006630 .coprocessor = 0x1,
Max Filippovc04e1692017-11-03 19:37:13 -07006631 }, {
6632 .name = "add.s",
Max Filippov5680f202015-07-13 04:30:41 +03006633 .translate = translate_fpu2k_add_s,
Max Filippov582fef02018-08-31 13:57:08 -07006634 .coprocessor = 0x1,
Max Filippovc04e1692017-11-03 19:37:13 -07006635 }, {
6636 .name = "ceil.s",
6637 .translate = translate_ftoi_s,
6638 .par = (const uint32_t[]){float_round_up, false},
Max Filippov582fef02018-08-31 13:57:08 -07006639 .coprocessor = 0x1,
Max Filippovc04e1692017-11-03 19:37:13 -07006640 }, {
6641 .name = "float.s",
6642 .translate = translate_float_s,
6643 .par = (const uint32_t[]){false},
Max Filippov582fef02018-08-31 13:57:08 -07006644 .coprocessor = 0x1,
Max Filippovc04e1692017-11-03 19:37:13 -07006645 }, {
6646 .name = "floor.s",
6647 .translate = translate_ftoi_s,
6648 .par = (const uint32_t[]){float_round_down, false},
Max Filippov582fef02018-08-31 13:57:08 -07006649 .coprocessor = 0x1,
Max Filippovc04e1692017-11-03 19:37:13 -07006650 }, {
6651 .name = "lsi",
6652 .translate = translate_ldsti,
6653 .par = (const uint32_t[]){false, false},
Max Filippov068e5382019-02-13 17:36:30 -08006654 .op_flags = XTENSA_OP_LOAD,
Max Filippov582fef02018-08-31 13:57:08 -07006655 .coprocessor = 0x1,
Max Filippovc04e1692017-11-03 19:37:13 -07006656 }, {
6657 .name = "lsiu",
6658 .translate = translate_ldsti,
6659 .par = (const uint32_t[]){false, true},
Max Filippov068e5382019-02-13 17:36:30 -08006660 .op_flags = XTENSA_OP_LOAD,
Max Filippov582fef02018-08-31 13:57:08 -07006661 .coprocessor = 0x1,
Max Filippovc04e1692017-11-03 19:37:13 -07006662 }, {
6663 .name = "lsx",
6664 .translate = translate_ldstx,
6665 .par = (const uint32_t[]){false, false},
Max Filippov068e5382019-02-13 17:36:30 -08006666 .op_flags = XTENSA_OP_LOAD,
Max Filippov582fef02018-08-31 13:57:08 -07006667 .coprocessor = 0x1,
Max Filippovc04e1692017-11-03 19:37:13 -07006668 }, {
6669 .name = "lsxu",
6670 .translate = translate_ldstx,
6671 .par = (const uint32_t[]){false, true},
Max Filippov068e5382019-02-13 17:36:30 -08006672 .op_flags = XTENSA_OP_LOAD,
Max Filippov582fef02018-08-31 13:57:08 -07006673 .coprocessor = 0x1,
Max Filippovc04e1692017-11-03 19:37:13 -07006674 }, {
6675 .name = "madd.s",
Max Filippov5680f202015-07-13 04:30:41 +03006676 .translate = translate_fpu2k_madd_s,
Max Filippov582fef02018-08-31 13:57:08 -07006677 .coprocessor = 0x1,
Max Filippovc04e1692017-11-03 19:37:13 -07006678 }, {
6679 .name = "mov.s",
6680 .translate = translate_mov_s,
Max Filippov582fef02018-08-31 13:57:08 -07006681 .coprocessor = 0x1,
Max Filippovc04e1692017-11-03 19:37:13 -07006682 }, {
6683 .name = "moveqz.s",
6684 .translate = translate_movcond_s,
6685 .par = (const uint32_t[]){TCG_COND_EQ},
Max Filippov582fef02018-08-31 13:57:08 -07006686 .coprocessor = 0x1,
Max Filippovc04e1692017-11-03 19:37:13 -07006687 }, {
6688 .name = "movf.s",
6689 .translate = translate_movp_s,
6690 .par = (const uint32_t[]){TCG_COND_EQ},
Max Filippov582fef02018-08-31 13:57:08 -07006691 .coprocessor = 0x1,
Max Filippovc04e1692017-11-03 19:37:13 -07006692 }, {
6693 .name = "movgez.s",
6694 .translate = translate_movcond_s,
6695 .par = (const uint32_t[]){TCG_COND_GE},
Max Filippov582fef02018-08-31 13:57:08 -07006696 .coprocessor = 0x1,
Max Filippovc04e1692017-11-03 19:37:13 -07006697 }, {
6698 .name = "movltz.s",
6699 .translate = translate_movcond_s,
6700 .par = (const uint32_t[]){TCG_COND_LT},
Max Filippov582fef02018-08-31 13:57:08 -07006701 .coprocessor = 0x1,
Max Filippovc04e1692017-11-03 19:37:13 -07006702 }, {
6703 .name = "movnez.s",
6704 .translate = translate_movcond_s,
6705 .par = (const uint32_t[]){TCG_COND_NE},
Max Filippov582fef02018-08-31 13:57:08 -07006706 .coprocessor = 0x1,
Max Filippovc04e1692017-11-03 19:37:13 -07006707 }, {
6708 .name = "movt.s",
6709 .translate = translate_movp_s,
6710 .par = (const uint32_t[]){TCG_COND_NE},
Max Filippov582fef02018-08-31 13:57:08 -07006711 .coprocessor = 0x1,
Max Filippovc04e1692017-11-03 19:37:13 -07006712 }, {
6713 .name = "msub.s",
Max Filippov5680f202015-07-13 04:30:41 +03006714 .translate = translate_fpu2k_msub_s,
Max Filippov582fef02018-08-31 13:57:08 -07006715 .coprocessor = 0x1,
Max Filippovc04e1692017-11-03 19:37:13 -07006716 }, {
6717 .name = "mul.s",
Max Filippov5680f202015-07-13 04:30:41 +03006718 .translate = translate_fpu2k_mul_s,
Max Filippov582fef02018-08-31 13:57:08 -07006719 .coprocessor = 0x1,
Max Filippovc04e1692017-11-03 19:37:13 -07006720 }, {
6721 .name = "neg.s",
6722 .translate = translate_neg_s,
Max Filippov582fef02018-08-31 13:57:08 -07006723 .coprocessor = 0x1,
Max Filippovc04e1692017-11-03 19:37:13 -07006724 }, {
6725 .name = "oeq.s",
6726 .translate = translate_compare_s,
6727 .par = (const uint32_t[]){COMPARE_OEQ},
Max Filippov582fef02018-08-31 13:57:08 -07006728 .coprocessor = 0x1,
Max Filippovc04e1692017-11-03 19:37:13 -07006729 }, {
6730 .name = "ole.s",
6731 .translate = translate_compare_s,
6732 .par = (const uint32_t[]){COMPARE_OLE},
Max Filippov582fef02018-08-31 13:57:08 -07006733 .coprocessor = 0x1,
Max Filippovc04e1692017-11-03 19:37:13 -07006734 }, {
6735 .name = "olt.s",
6736 .translate = translate_compare_s,
6737 .par = (const uint32_t[]){COMPARE_OLT},
Max Filippov582fef02018-08-31 13:57:08 -07006738 .coprocessor = 0x1,
Max Filippovc04e1692017-11-03 19:37:13 -07006739 }, {
Max Filippove8e05fd2018-08-31 00:40:28 -07006740 .name = "rfr",
Max Filippovc04e1692017-11-03 19:37:13 -07006741 .translate = translate_rfr_s,
Max Filippov582fef02018-08-31 13:57:08 -07006742 .coprocessor = 0x1,
Max Filippovc04e1692017-11-03 19:37:13 -07006743 }, {
6744 .name = "round.s",
6745 .translate = translate_ftoi_s,
6746 .par = (const uint32_t[]){float_round_nearest_even, false},
Max Filippov582fef02018-08-31 13:57:08 -07006747 .coprocessor = 0x1,
Max Filippovc04e1692017-11-03 19:37:13 -07006748 }, {
Max Filippovff35a7d2015-07-13 04:30:41 +03006749 .name = "rur.fcr",
6750 .translate = translate_rur,
6751 .par = (const uint32_t[]){FCR},
6752 .coprocessor = 0x1,
6753 }, {
6754 .name = "rur.fsr",
6755 .translate = translate_rur,
6756 .par = (const uint32_t[]){FSR},
6757 .coprocessor = 0x1,
6758 }, {
Max Filippovc04e1692017-11-03 19:37:13 -07006759 .name = "ssi",
6760 .translate = translate_ldsti,
6761 .par = (const uint32_t[]){true, false},
Max Filippov068e5382019-02-13 17:36:30 -08006762 .op_flags = XTENSA_OP_STORE,
Max Filippov582fef02018-08-31 13:57:08 -07006763 .coprocessor = 0x1,
Max Filippovc04e1692017-11-03 19:37:13 -07006764 }, {
6765 .name = "ssiu",
6766 .translate = translate_ldsti,
6767 .par = (const uint32_t[]){true, true},
Max Filippov068e5382019-02-13 17:36:30 -08006768 .op_flags = XTENSA_OP_STORE,
Max Filippov582fef02018-08-31 13:57:08 -07006769 .coprocessor = 0x1,
Max Filippovc04e1692017-11-03 19:37:13 -07006770 }, {
6771 .name = "ssx",
6772 .translate = translate_ldstx,
6773 .par = (const uint32_t[]){true, false},
Max Filippov068e5382019-02-13 17:36:30 -08006774 .op_flags = XTENSA_OP_STORE,
Max Filippov582fef02018-08-31 13:57:08 -07006775 .coprocessor = 0x1,
Max Filippovc04e1692017-11-03 19:37:13 -07006776 }, {
6777 .name = "ssxu",
6778 .translate = translate_ldstx,
6779 .par = (const uint32_t[]){true, true},
Max Filippov068e5382019-02-13 17:36:30 -08006780 .op_flags = XTENSA_OP_STORE,
Max Filippov582fef02018-08-31 13:57:08 -07006781 .coprocessor = 0x1,
Max Filippovc04e1692017-11-03 19:37:13 -07006782 }, {
6783 .name = "sub.s",
Max Filippov5680f202015-07-13 04:30:41 +03006784 .translate = translate_fpu2k_sub_s,
Max Filippov582fef02018-08-31 13:57:08 -07006785 .coprocessor = 0x1,
Max Filippovc04e1692017-11-03 19:37:13 -07006786 }, {
6787 .name = "trunc.s",
6788 .translate = translate_ftoi_s,
6789 .par = (const uint32_t[]){float_round_to_zero, false},
Max Filippov582fef02018-08-31 13:57:08 -07006790 .coprocessor = 0x1,
Max Filippovc04e1692017-11-03 19:37:13 -07006791 }, {
6792 .name = "ueq.s",
6793 .translate = translate_compare_s,
6794 .par = (const uint32_t[]){COMPARE_UEQ},
Max Filippov582fef02018-08-31 13:57:08 -07006795 .coprocessor = 0x1,
Max Filippovc04e1692017-11-03 19:37:13 -07006796 }, {
6797 .name = "ufloat.s",
6798 .translate = translate_float_s,
6799 .par = (const uint32_t[]){true},
Max Filippov582fef02018-08-31 13:57:08 -07006800 .coprocessor = 0x1,
Max Filippovc04e1692017-11-03 19:37:13 -07006801 }, {
6802 .name = "ule.s",
6803 .translate = translate_compare_s,
6804 .par = (const uint32_t[]){COMPARE_ULE},
Max Filippov582fef02018-08-31 13:57:08 -07006805 .coprocessor = 0x1,
Max Filippovc04e1692017-11-03 19:37:13 -07006806 }, {
6807 .name = "ult.s",
6808 .translate = translate_compare_s,
6809 .par = (const uint32_t[]){COMPARE_ULT},
Max Filippov582fef02018-08-31 13:57:08 -07006810 .coprocessor = 0x1,
Max Filippovc04e1692017-11-03 19:37:13 -07006811 }, {
6812 .name = "un.s",
6813 .translate = translate_compare_s,
6814 .par = (const uint32_t[]){COMPARE_UN},
Max Filippov582fef02018-08-31 13:57:08 -07006815 .coprocessor = 0x1,
Max Filippovc04e1692017-11-03 19:37:13 -07006816 }, {
6817 .name = "utrunc.s",
6818 .translate = translate_ftoi_s,
6819 .par = (const uint32_t[]){float_round_to_zero, true},
Max Filippov582fef02018-08-31 13:57:08 -07006820 .coprocessor = 0x1,
Max Filippovc04e1692017-11-03 19:37:13 -07006821 }, {
Max Filippove8e05fd2018-08-31 00:40:28 -07006822 .name = "wfr",
Max Filippovc04e1692017-11-03 19:37:13 -07006823 .translate = translate_wfr_s,
Max Filippov582fef02018-08-31 13:57:08 -07006824 .coprocessor = 0x1,
Max Filippovff35a7d2015-07-13 04:30:41 +03006825 }, {
6826 .name = "wur.fcr",
6827 .translate = translate_wur_fpu2k_fcr,
6828 .par = (const uint32_t[]){FCR},
6829 .coprocessor = 0x1,
6830 }, {
6831 .name = "wur.fsr",
6832 .translate = translate_wur_fpu2k_fsr,
6833 .par = (const uint32_t[]){FSR},
6834 .coprocessor = 0x1,
Max Filippovc04e1692017-11-03 19:37:13 -07006835 },
6836};
6837
6838const XtensaOpcodeTranslators xtensa_fpu2000_opcodes = {
6839 .num_opcodes = ARRAY_SIZE(fpu2000_ops),
6840 .opcode = fpu2000_ops,
6841};
Max Filippovcfa9f052020-06-30 19:27:02 -07006842
6843static void translate_add_d(DisasContext *dc, const OpcodeArg arg[],
6844 const uint32_t par[])
6845{
Richard Hendersonad75a512023-09-13 16:37:36 -07006846 gen_helper_add_d(arg[0].out, tcg_env, arg[1].in, arg[2].in);
Max Filippovcfa9f052020-06-30 19:27:02 -07006847}
6848
6849static void translate_add_s(DisasContext *dc, const OpcodeArg arg[],
6850 const uint32_t par[])
6851{
6852 if (option_enabled(dc, XTENSA_OPTION_DFPU_SINGLE_ONLY)) {
Richard Hendersonad75a512023-09-13 16:37:36 -07006853 gen_helper_fpu2k_add_s(arg[0].out, tcg_env,
Max Filippovcfa9f052020-06-30 19:27:02 -07006854 arg[1].in, arg[2].in);
6855 } else {
6856 OpcodeArg arg32[3];
6857
6858 get_f32_o1_i2(arg, arg32, 0, 1, 2);
Richard Hendersonad75a512023-09-13 16:37:36 -07006859 gen_helper_add_s(arg32[0].out, tcg_env, arg32[1].in, arg32[2].in);
Max Filippovcfa9f052020-06-30 19:27:02 -07006860 put_f32_o1_i2(arg, arg32, 0, 1, 2);
6861 }
6862}
6863
6864static void translate_cvtd_s(DisasContext *dc, const OpcodeArg arg[],
6865 const uint32_t par[])
6866{
6867 TCGv_i32 v = tcg_temp_new_i32();
6868
6869 tcg_gen_extrl_i64_i32(v, arg[1].in);
Richard Hendersonad75a512023-09-13 16:37:36 -07006870 gen_helper_cvtd_s(arg[0].out, tcg_env, v);
Max Filippovcfa9f052020-06-30 19:27:02 -07006871}
6872
6873static void translate_cvts_d(DisasContext *dc, const OpcodeArg arg[],
6874 const uint32_t par[])
6875{
6876 TCGv_i32 v = tcg_temp_new_i32();
6877
Richard Hendersonad75a512023-09-13 16:37:36 -07006878 gen_helper_cvts_d(v, tcg_env, arg[1].in);
Max Filippovcfa9f052020-06-30 19:27:02 -07006879 tcg_gen_extu_i32_i64(arg[0].out, v);
Max Filippovcfa9f052020-06-30 19:27:02 -07006880}
6881
6882static void translate_ldsti_d(DisasContext *dc, const OpcodeArg arg[],
6883 const uint32_t par[])
6884{
6885 TCGv_i32 addr;
Max Filippov583e6a52021-05-17 12:31:08 -07006886 MemOp mop;
Max Filippovcfa9f052020-06-30 19:27:02 -07006887
6888 if (par[1]) {
6889 addr = tcg_temp_new_i32();
6890 tcg_gen_addi_i32(addr, arg[1].in, arg[2].imm);
6891 } else {
6892 addr = arg[1].in;
6893 }
Frédéric Pétrotfc313c62022-01-06 22:00:51 +01006894 mop = gen_load_store_alignment(dc, MO_TEUQ, addr);
Max Filippovcfa9f052020-06-30 19:27:02 -07006895 if (par[0]) {
Max Filippov583e6a52021-05-17 12:31:08 -07006896 tcg_gen_qemu_st_i64(arg[0].in, addr, dc->cring, mop);
Max Filippovcfa9f052020-06-30 19:27:02 -07006897 } else {
Max Filippov583e6a52021-05-17 12:31:08 -07006898 tcg_gen_qemu_ld_i64(arg[0].out, addr, dc->cring, mop);
Max Filippovcfa9f052020-06-30 19:27:02 -07006899 }
6900 if (par[2]) {
6901 if (par[1]) {
6902 tcg_gen_mov_i32(arg[1].out, addr);
6903 } else {
6904 tcg_gen_addi_i32(arg[1].out, arg[1].in, arg[2].imm);
6905 }
6906 }
Max Filippovcfa9f052020-06-30 19:27:02 -07006907}
6908
6909static void translate_ldsti_s(DisasContext *dc, const OpcodeArg arg[],
6910 const uint32_t par[])
6911{
6912 TCGv_i32 addr;
6913 OpcodeArg arg32[1];
Max Filippov583e6a52021-05-17 12:31:08 -07006914 MemOp mop;
Max Filippovcfa9f052020-06-30 19:27:02 -07006915
6916 if (par[1]) {
6917 addr = tcg_temp_new_i32();
6918 tcg_gen_addi_i32(addr, arg[1].in, arg[2].imm);
6919 } else {
6920 addr = arg[1].in;
6921 }
Max Filippov583e6a52021-05-17 12:31:08 -07006922 mop = gen_load_store_alignment(dc, MO_TEUL, addr);
Max Filippovcfa9f052020-06-30 19:27:02 -07006923 if (par[0]) {
6924 get_f32_i1(arg, arg32, 0);
Max Filippov583e6a52021-05-17 12:31:08 -07006925 tcg_gen_qemu_st_tl(arg32[0].in, addr, dc->cring, mop);
Max Filippovcfa9f052020-06-30 19:27:02 -07006926 put_f32_i1(arg, arg32, 0);
6927 } else {
6928 get_f32_o1(arg, arg32, 0);
Max Filippov583e6a52021-05-17 12:31:08 -07006929 tcg_gen_qemu_ld_tl(arg32[0].out, addr, dc->cring, mop);
Max Filippovcfa9f052020-06-30 19:27:02 -07006930 put_f32_o1(arg, arg32, 0);
6931 }
6932 if (par[2]) {
6933 if (par[1]) {
6934 tcg_gen_mov_i32(arg[1].out, addr);
6935 } else {
6936 tcg_gen_addi_i32(arg[1].out, arg[1].in, arg[2].imm);
6937 }
6938 }
Max Filippovcfa9f052020-06-30 19:27:02 -07006939}
6940
6941static void translate_ldstx_d(DisasContext *dc, const OpcodeArg arg[],
6942 const uint32_t par[])
6943{
6944 TCGv_i32 addr;
Max Filippov583e6a52021-05-17 12:31:08 -07006945 MemOp mop;
Max Filippovcfa9f052020-06-30 19:27:02 -07006946
6947 if (par[1]) {
6948 addr = tcg_temp_new_i32();
6949 tcg_gen_add_i32(addr, arg[1].in, arg[2].in);
6950 } else {
6951 addr = arg[1].in;
6952 }
Frédéric Pétrotfc313c62022-01-06 22:00:51 +01006953 mop = gen_load_store_alignment(dc, MO_TEUQ, addr);
Max Filippovcfa9f052020-06-30 19:27:02 -07006954 if (par[0]) {
Max Filippov583e6a52021-05-17 12:31:08 -07006955 tcg_gen_qemu_st_i64(arg[0].in, addr, dc->cring, mop);
Max Filippovcfa9f052020-06-30 19:27:02 -07006956 } else {
Max Filippov583e6a52021-05-17 12:31:08 -07006957 tcg_gen_qemu_ld_i64(arg[0].out, addr, dc->cring, mop);
Max Filippovcfa9f052020-06-30 19:27:02 -07006958 }
6959 if (par[2]) {
6960 if (par[1]) {
6961 tcg_gen_mov_i32(arg[1].out, addr);
6962 } else {
6963 tcg_gen_add_i32(arg[1].out, arg[1].in, arg[2].in);
6964 }
6965 }
Max Filippovcfa9f052020-06-30 19:27:02 -07006966}
6967
6968static void translate_ldstx_s(DisasContext *dc, const OpcodeArg arg[],
6969 const uint32_t par[])
6970{
6971 TCGv_i32 addr;
6972 OpcodeArg arg32[1];
Max Filippov583e6a52021-05-17 12:31:08 -07006973 MemOp mop;
Max Filippovcfa9f052020-06-30 19:27:02 -07006974
6975 if (par[1]) {
6976 addr = tcg_temp_new_i32();
6977 tcg_gen_add_i32(addr, arg[1].in, arg[2].in);
6978 } else {
6979 addr = arg[1].in;
6980 }
Max Filippov583e6a52021-05-17 12:31:08 -07006981 mop = gen_load_store_alignment(dc, MO_TEUL, addr);
Max Filippovcfa9f052020-06-30 19:27:02 -07006982 if (par[0]) {
6983 get_f32_i1(arg, arg32, 0);
Max Filippov583e6a52021-05-17 12:31:08 -07006984 tcg_gen_qemu_st_tl(arg32[0].in, addr, dc->cring, mop);
Max Filippovcfa9f052020-06-30 19:27:02 -07006985 put_f32_i1(arg, arg32, 0);
6986 } else {
6987 get_f32_o1(arg, arg32, 0);
Max Filippov583e6a52021-05-17 12:31:08 -07006988 tcg_gen_qemu_ld_tl(arg32[0].out, addr, dc->cring, mop);
Max Filippovcfa9f052020-06-30 19:27:02 -07006989 put_f32_o1(arg, arg32, 0);
6990 }
6991 if (par[2]) {
6992 if (par[1]) {
6993 tcg_gen_mov_i32(arg[1].out, addr);
6994 } else {
6995 tcg_gen_add_i32(arg[1].out, arg[1].in, arg[2].in);
6996 }
6997 }
Max Filippovcfa9f052020-06-30 19:27:02 -07006998}
6999
7000static void translate_madd_d(DisasContext *dc, const OpcodeArg arg[],
7001 const uint32_t par[])
7002{
Richard Hendersonad75a512023-09-13 16:37:36 -07007003 gen_helper_madd_d(arg[0].out, tcg_env,
Max Filippovcfa9f052020-06-30 19:27:02 -07007004 arg[0].in, arg[1].in, arg[2].in);
7005}
7006
7007static void translate_madd_s(DisasContext *dc, const OpcodeArg arg[],
7008 const uint32_t par[])
7009{
7010 if (option_enabled(dc, XTENSA_OPTION_DFPU_SINGLE_ONLY)) {
Richard Hendersonad75a512023-09-13 16:37:36 -07007011 gen_helper_fpu2k_madd_s(arg[0].out, tcg_env,
Max Filippovcfa9f052020-06-30 19:27:02 -07007012 arg[0].in, arg[1].in, arg[2].in);
7013 } else {
7014 OpcodeArg arg32[3];
7015
7016 get_f32_o1_i3(arg, arg32, 0, 0, 1, 2);
Richard Hendersonad75a512023-09-13 16:37:36 -07007017 gen_helper_madd_s(arg32[0].out, tcg_env,
Max Filippovcfa9f052020-06-30 19:27:02 -07007018 arg32[0].in, arg32[1].in, arg32[2].in);
7019 put_f32_o1_i3(arg, arg32, 0, 0, 1, 2);
7020 }
7021}
7022
7023static void translate_mul_d(DisasContext *dc, const OpcodeArg arg[],
7024 const uint32_t par[])
7025{
Richard Hendersonad75a512023-09-13 16:37:36 -07007026 gen_helper_mul_d(arg[0].out, tcg_env, arg[1].in, arg[2].in);
Max Filippovcfa9f052020-06-30 19:27:02 -07007027}
7028
7029static void translate_mul_s(DisasContext *dc, const OpcodeArg arg[],
7030 const uint32_t par[])
7031{
7032 if (option_enabled(dc, XTENSA_OPTION_DFPU_SINGLE_ONLY)) {
Richard Hendersonad75a512023-09-13 16:37:36 -07007033 gen_helper_fpu2k_mul_s(arg[0].out, tcg_env,
Max Filippovcfa9f052020-06-30 19:27:02 -07007034 arg[1].in, arg[2].in);
7035 } else {
7036 OpcodeArg arg32[3];
7037
7038 get_f32_o1_i2(arg, arg32, 0, 1, 2);
Richard Hendersonad75a512023-09-13 16:37:36 -07007039 gen_helper_mul_s(arg32[0].out, tcg_env, arg32[1].in, arg32[2].in);
Max Filippovcfa9f052020-06-30 19:27:02 -07007040 put_f32_o1_i2(arg, arg32, 0, 1, 2);
7041 }
7042}
7043
7044static void translate_msub_d(DisasContext *dc, const OpcodeArg arg[],
7045 const uint32_t par[])
7046{
Richard Hendersonad75a512023-09-13 16:37:36 -07007047 gen_helper_msub_d(arg[0].out, tcg_env,
Max Filippovcfa9f052020-06-30 19:27:02 -07007048 arg[0].in, arg[1].in, arg[2].in);
7049}
7050
7051static void translate_msub_s(DisasContext *dc, const OpcodeArg arg[],
7052 const uint32_t par[])
7053{
7054 if (option_enabled(dc, XTENSA_OPTION_DFPU_SINGLE_ONLY)) {
Richard Hendersonad75a512023-09-13 16:37:36 -07007055 gen_helper_fpu2k_msub_s(arg[0].out, tcg_env,
Max Filippovcfa9f052020-06-30 19:27:02 -07007056 arg[0].in, arg[1].in, arg[2].in);
7057 } else {
7058 OpcodeArg arg32[3];
7059
7060 get_f32_o1_i3(arg, arg32, 0, 0, 1, 2);
Richard Hendersonad75a512023-09-13 16:37:36 -07007061 gen_helper_msub_s(arg32[0].out, tcg_env,
Max Filippovcfa9f052020-06-30 19:27:02 -07007062 arg32[0].in, arg32[1].in, arg32[2].in);
7063 put_f32_o1_i3(arg, arg32, 0, 0, 1, 2);
7064 }
7065}
7066
7067static void translate_sub_d(DisasContext *dc, const OpcodeArg arg[],
7068 const uint32_t par[])
7069{
Richard Hendersonad75a512023-09-13 16:37:36 -07007070 gen_helper_sub_d(arg[0].out, tcg_env, arg[1].in, arg[2].in);
Max Filippovcfa9f052020-06-30 19:27:02 -07007071}
7072
7073static void translate_sub_s(DisasContext *dc, const OpcodeArg arg[],
7074 const uint32_t par[])
7075{
7076 if (option_enabled(dc, XTENSA_OPTION_DFPU_SINGLE_ONLY)) {
Richard Hendersonad75a512023-09-13 16:37:36 -07007077 gen_helper_fpu2k_sub_s(arg[0].out, tcg_env,
Max Filippovcfa9f052020-06-30 19:27:02 -07007078 arg[1].in, arg[2].in);
7079 } else {
7080 OpcodeArg arg32[3];
7081
7082 get_f32_o1_i2(arg, arg32, 0, 1, 2);
Richard Hendersonad75a512023-09-13 16:37:36 -07007083 gen_helper_sub_s(arg32[0].out, tcg_env, arg32[1].in, arg32[2].in);
Max Filippovcfa9f052020-06-30 19:27:02 -07007084 put_f32_o1_i2(arg, arg32, 0, 1, 2);
7085 }
7086}
7087
Max Filippovf8c61372020-03-14 11:13:53 -07007088static void translate_mkdadj_d(DisasContext *dc, const OpcodeArg arg[],
7089 const uint32_t par[])
7090{
Richard Hendersonad75a512023-09-13 16:37:36 -07007091 gen_helper_mkdadj_d(arg[0].out, tcg_env, arg[0].in, arg[1].in);
Max Filippovf8c61372020-03-14 11:13:53 -07007092}
7093
7094static void translate_mkdadj_s(DisasContext *dc, const OpcodeArg arg[],
7095 const uint32_t par[])
7096{
7097 OpcodeArg arg32[2];
7098
7099 get_f32_o1_i2(arg, arg32, 0, 0, 1);
Richard Hendersonad75a512023-09-13 16:37:36 -07007100 gen_helper_mkdadj_s(arg32[0].out, tcg_env, arg32[0].in, arg32[1].in);
Max Filippovf8c61372020-03-14 11:13:53 -07007101 put_f32_o1_i2(arg, arg32, 0, 0, 1);
7102}
7103
7104static void translate_mksadj_d(DisasContext *dc, const OpcodeArg arg[],
7105 const uint32_t par[])
7106{
Richard Hendersonad75a512023-09-13 16:37:36 -07007107 gen_helper_mksadj_d(arg[0].out, tcg_env, arg[1].in);
Max Filippovf8c61372020-03-14 11:13:53 -07007108}
7109
7110static void translate_mksadj_s(DisasContext *dc, const OpcodeArg arg[],
7111 const uint32_t par[])
7112{
7113 OpcodeArg arg32[2];
7114
7115 get_f32_o1_i1(arg, arg32, 0, 1);
Richard Hendersonad75a512023-09-13 16:37:36 -07007116 gen_helper_mksadj_s(arg32[0].out, tcg_env, arg32[1].in);
Max Filippovf8c61372020-03-14 11:13:53 -07007117 put_f32_o1_i1(arg, arg32, 0, 1);
7118}
7119
Max Filippovcfa9f052020-06-30 19:27:02 -07007120static void translate_wur_fpu_fcr(DisasContext *dc, const OpcodeArg arg[],
7121 const uint32_t par[])
7122{
Richard Hendersonad75a512023-09-13 16:37:36 -07007123 gen_helper_wur_fpu_fcr(tcg_env, arg[0].in);
Max Filippovcfa9f052020-06-30 19:27:02 -07007124}
7125
7126static void translate_rur_fpu_fsr(DisasContext *dc, const OpcodeArg arg[],
7127 const uint32_t par[])
7128{
Richard Hendersonad75a512023-09-13 16:37:36 -07007129 gen_helper_rur_fpu_fsr(arg[0].out, tcg_env);
Max Filippovcfa9f052020-06-30 19:27:02 -07007130}
7131
7132static void translate_wur_fpu_fsr(DisasContext *dc, const OpcodeArg arg[],
7133 const uint32_t par[])
7134{
Richard Hendersonad75a512023-09-13 16:37:36 -07007135 gen_helper_wur_fpu_fsr(tcg_env, arg[0].in);
Max Filippovcfa9f052020-06-30 19:27:02 -07007136}
7137
7138static const XtensaOpcodeOps fpu_ops[] = {
7139 {
7140 .name = "abs.d",
7141 .translate = translate_abs_d,
7142 .coprocessor = 0x1,
7143 }, {
7144 .name = "abs.s",
7145 .translate = translate_abs_s,
7146 .coprocessor = 0x1,
7147 }, {
7148 .name = "add.d",
7149 .translate = translate_add_d,
7150 .coprocessor = 0x1,
7151 }, {
7152 .name = "add.s",
7153 .translate = translate_add_s,
7154 .coprocessor = 0x1,
7155 }, {
Max Filippovf8c61372020-03-14 11:13:53 -07007156 .name = "addexp.d",
7157 .translate = translate_nop,
7158 .coprocessor = 0x1,
7159 }, {
7160 .name = "addexp.s",
7161 .translate = translate_nop,
7162 .coprocessor = 0x1,
7163 }, {
7164 .name = "addexpm.d",
7165 .translate = translate_mov_s,
7166 .coprocessor = 0x1,
7167 }, {
7168 .name = "addexpm.s",
7169 .translate = translate_mov_s,
7170 .coprocessor = 0x1,
7171 }, {
Max Filippovcfa9f052020-06-30 19:27:02 -07007172 .name = "ceil.d",
7173 .translate = translate_ftoi_d,
7174 .par = (const uint32_t[]){float_round_up, false},
7175 .coprocessor = 0x1,
7176 }, {
7177 .name = "ceil.s",
7178 .translate = translate_ftoi_s,
7179 .par = (const uint32_t[]){float_round_up, false},
7180 .coprocessor = 0x1,
7181 }, {
7182 .name = "const.d",
7183 .translate = translate_const_d,
7184 .coprocessor = 0x1,
7185 }, {
7186 .name = "const.s",
7187 .translate = translate_const_s,
7188 .coprocessor = 0x1,
7189 }, {
7190 .name = "cvtd.s",
7191 .translate = translate_cvtd_s,
7192 .coprocessor = 0x1,
7193 }, {
7194 .name = "cvts.d",
7195 .translate = translate_cvts_d,
7196 .coprocessor = 0x1,
7197 }, {
Max Filippovf8c61372020-03-14 11:13:53 -07007198 .name = "div0.d",
7199 .translate = translate_nop,
7200 .coprocessor = 0x1,
7201 }, {
7202 .name = "div0.s",
7203 .translate = translate_nop,
7204 .coprocessor = 0x1,
7205 }, {
7206 .name = "divn.d",
7207 .translate = translate_nop,
7208 .coprocessor = 0x1,
7209 }, {
7210 .name = "divn.s",
7211 .translate = translate_nop,
7212 .coprocessor = 0x1,
7213 }, {
Max Filippovcfa9f052020-06-30 19:27:02 -07007214 .name = "float.d",
7215 .translate = translate_float_d,
7216 .par = (const uint32_t[]){false},
7217 .coprocessor = 0x1,
7218 }, {
7219 .name = "float.s",
7220 .translate = translate_float_s,
7221 .par = (const uint32_t[]){false},
7222 .coprocessor = 0x1,
7223 }, {
7224 .name = "floor.d",
7225 .translate = translate_ftoi_d,
7226 .par = (const uint32_t[]){float_round_down, false},
7227 .coprocessor = 0x1,
7228 }, {
7229 .name = "floor.s",
7230 .translate = translate_ftoi_s,
7231 .par = (const uint32_t[]){float_round_down, false},
7232 .coprocessor = 0x1,
7233 }, {
7234 .name = "ldi",
7235 .translate = translate_ldsti_d,
7236 .par = (const uint32_t[]){false, true, false},
7237 .op_flags = XTENSA_OP_LOAD,
7238 .coprocessor = 0x1,
7239 }, {
7240 .name = "ldip",
7241 .translate = translate_ldsti_d,
7242 .par = (const uint32_t[]){false, false, true},
7243 .op_flags = XTENSA_OP_LOAD,
7244 .coprocessor = 0x1,
7245 }, {
7246 .name = "ldiu",
7247 .translate = translate_ldsti_d,
7248 .par = (const uint32_t[]){false, true, true},
7249 .op_flags = XTENSA_OP_LOAD,
7250 .coprocessor = 0x1,
7251 }, {
7252 .name = "ldx",
7253 .translate = translate_ldstx_d,
7254 .par = (const uint32_t[]){false, true, false},
7255 .op_flags = XTENSA_OP_LOAD,
7256 .coprocessor = 0x1,
7257 }, {
7258 .name = "ldxp",
7259 .translate = translate_ldstx_d,
7260 .par = (const uint32_t[]){false, false, true},
7261 .op_flags = XTENSA_OP_LOAD,
7262 .coprocessor = 0x1,
7263 }, {
7264 .name = "ldxu",
7265 .translate = translate_ldstx_d,
7266 .par = (const uint32_t[]){false, true, true},
7267 .op_flags = XTENSA_OP_LOAD,
7268 .coprocessor = 0x1,
7269 }, {
7270 .name = "lsi",
7271 .translate = translate_ldsti_s,
7272 .par = (const uint32_t[]){false, true, false},
7273 .op_flags = XTENSA_OP_LOAD,
7274 .coprocessor = 0x1,
7275 }, {
7276 .name = "lsip",
7277 .translate = translate_ldsti_s,
7278 .par = (const uint32_t[]){false, false, true},
7279 .op_flags = XTENSA_OP_LOAD,
7280 .coprocessor = 0x1,
7281 }, {
7282 .name = "lsiu",
7283 .translate = translate_ldsti_s,
7284 .par = (const uint32_t[]){false, true, true},
7285 .op_flags = XTENSA_OP_LOAD,
7286 .coprocessor = 0x1,
7287 }, {
7288 .name = "lsx",
7289 .translate = translate_ldstx_s,
7290 .par = (const uint32_t[]){false, true, false},
7291 .op_flags = XTENSA_OP_LOAD,
7292 .coprocessor = 0x1,
7293 }, {
7294 .name = "lsxp",
7295 .translate = translate_ldstx_s,
7296 .par = (const uint32_t[]){false, false, true},
7297 .op_flags = XTENSA_OP_LOAD,
7298 .coprocessor = 0x1,
7299 }, {
7300 .name = "lsxu",
7301 .translate = translate_ldstx_s,
7302 .par = (const uint32_t[]){false, true, true},
7303 .op_flags = XTENSA_OP_LOAD,
7304 .coprocessor = 0x1,
7305 }, {
7306 .name = "madd.d",
7307 .translate = translate_madd_d,
7308 .coprocessor = 0x1,
7309 }, {
7310 .name = "madd.s",
7311 .translate = translate_madd_s,
7312 .coprocessor = 0x1,
7313 }, {
Max Filippovf8c61372020-03-14 11:13:53 -07007314 .name = "maddn.d",
7315 .translate = translate_nop,
7316 .coprocessor = 0x1,
7317 }, {
7318 .name = "maddn.s",
7319 .translate = translate_nop,
7320 .coprocessor = 0x1,
7321 }, {
7322 .name = "mkdadj.d",
7323 .translate = translate_mkdadj_d,
7324 .coprocessor = 0x1,
7325 }, {
7326 .name = "mkdadj.s",
7327 .translate = translate_mkdadj_s,
7328 .coprocessor = 0x1,
7329 }, {
7330 .name = "mksadj.d",
7331 .translate = translate_mksadj_d,
7332 .coprocessor = 0x1,
7333 }, {
7334 .name = "mksadj.s",
7335 .translate = translate_mksadj_s,
7336 .coprocessor = 0x1,
7337 }, {
Max Filippovcfa9f052020-06-30 19:27:02 -07007338 .name = "mov.d",
7339 .translate = translate_mov_d,
7340 .coprocessor = 0x1,
7341 }, {
7342 .name = "mov.s",
7343 .translate = translate_mov_s,
7344 .coprocessor = 0x1,
7345 }, {
7346 .name = "moveqz.d",
7347 .translate = translate_movcond_d,
7348 .par = (const uint32_t[]){TCG_COND_EQ},
7349 .coprocessor = 0x1,
7350 }, {
7351 .name = "moveqz.s",
7352 .translate = translate_movcond_s,
7353 .par = (const uint32_t[]){TCG_COND_EQ},
7354 .coprocessor = 0x1,
7355 }, {
7356 .name = "movf.d",
7357 .translate = translate_movp_d,
7358 .par = (const uint32_t[]){TCG_COND_EQ},
7359 .coprocessor = 0x1,
7360 }, {
7361 .name = "movf.s",
7362 .translate = translate_movp_s,
7363 .par = (const uint32_t[]){TCG_COND_EQ},
7364 .coprocessor = 0x1,
7365 }, {
7366 .name = "movgez.d",
7367 .translate = translate_movcond_d,
7368 .par = (const uint32_t[]){TCG_COND_GE},
7369 .coprocessor = 0x1,
7370 }, {
7371 .name = "movgez.s",
7372 .translate = translate_movcond_s,
7373 .par = (const uint32_t[]){TCG_COND_GE},
7374 .coprocessor = 0x1,
7375 }, {
7376 .name = "movltz.d",
7377 .translate = translate_movcond_d,
7378 .par = (const uint32_t[]){TCG_COND_LT},
7379 .coprocessor = 0x1,
7380 }, {
7381 .name = "movltz.s",
7382 .translate = translate_movcond_s,
7383 .par = (const uint32_t[]){TCG_COND_LT},
7384 .coprocessor = 0x1,
7385 }, {
7386 .name = "movnez.d",
7387 .translate = translate_movcond_d,
7388 .par = (const uint32_t[]){TCG_COND_NE},
7389 .coprocessor = 0x1,
7390 }, {
7391 .name = "movnez.s",
7392 .translate = translate_movcond_s,
7393 .par = (const uint32_t[]){TCG_COND_NE},
7394 .coprocessor = 0x1,
7395 }, {
7396 .name = "movt.d",
7397 .translate = translate_movp_d,
7398 .par = (const uint32_t[]){TCG_COND_NE},
7399 .coprocessor = 0x1,
7400 }, {
7401 .name = "movt.s",
7402 .translate = translate_movp_s,
7403 .par = (const uint32_t[]){TCG_COND_NE},
7404 .coprocessor = 0x1,
7405 }, {
7406 .name = "msub.d",
7407 .translate = translate_msub_d,
7408 .coprocessor = 0x1,
7409 }, {
7410 .name = "msub.s",
7411 .translate = translate_msub_s,
7412 .coprocessor = 0x1,
7413 }, {
7414 .name = "mul.d",
7415 .translate = translate_mul_d,
7416 .coprocessor = 0x1,
7417 }, {
7418 .name = "mul.s",
7419 .translate = translate_mul_s,
7420 .coprocessor = 0x1,
7421 }, {
7422 .name = "neg.d",
7423 .translate = translate_neg_d,
7424 .coprocessor = 0x1,
7425 }, {
7426 .name = "neg.s",
7427 .translate = translate_neg_s,
7428 .coprocessor = 0x1,
7429 }, {
Max Filippovf8c61372020-03-14 11:13:53 -07007430 .name = "nexp01.d",
7431 .translate = translate_nop,
7432 .coprocessor = 0x1,
7433 }, {
7434 .name = "nexp01.s",
7435 .translate = translate_nop,
7436 .coprocessor = 0x1,
7437 }, {
Max Filippovcfa9f052020-06-30 19:27:02 -07007438 .name = "oeq.d",
7439 .translate = translate_compare_d,
7440 .par = (const uint32_t[]){COMPARE_OEQ},
7441 .coprocessor = 0x1,
7442 }, {
7443 .name = "oeq.s",
7444 .translate = translate_compare_s,
7445 .par = (const uint32_t[]){COMPARE_OEQ},
7446 .coprocessor = 0x1,
7447 }, {
7448 .name = "ole.d",
7449 .translate = translate_compare_d,
7450 .par = (const uint32_t[]){COMPARE_OLE},
7451 .coprocessor = 0x1,
7452 }, {
7453 .name = "ole.s",
7454 .translate = translate_compare_s,
7455 .par = (const uint32_t[]){COMPARE_OLE},
7456 .coprocessor = 0x1,
7457 }, {
7458 .name = "olt.d",
7459 .translate = translate_compare_d,
7460 .par = (const uint32_t[]){COMPARE_OLT},
7461 .coprocessor = 0x1,
7462 }, {
7463 .name = "olt.s",
7464 .translate = translate_compare_s,
7465 .par = (const uint32_t[]){COMPARE_OLT},
7466 .coprocessor = 0x1,
7467 }, {
7468 .name = "rfr",
7469 .translate = translate_rfr_s,
7470 .coprocessor = 0x1,
7471 }, {
7472 .name = "rfrd",
7473 .translate = translate_rfr_d,
7474 .coprocessor = 0x1,
7475 }, {
7476 .name = "round.d",
7477 .translate = translate_ftoi_d,
7478 .par = (const uint32_t[]){float_round_nearest_even, false},
7479 .coprocessor = 0x1,
7480 }, {
7481 .name = "round.s",
7482 .translate = translate_ftoi_s,
7483 .par = (const uint32_t[]){float_round_nearest_even, false},
7484 .coprocessor = 0x1,
7485 }, {
7486 .name = "rur.fcr",
7487 .translate = translate_rur,
7488 .par = (const uint32_t[]){FCR},
7489 .coprocessor = 0x1,
7490 }, {
7491 .name = "rur.fsr",
7492 .translate = translate_rur_fpu_fsr,
7493 .coprocessor = 0x1,
7494 }, {
7495 .name = "sdi",
7496 .translate = translate_ldsti_d,
7497 .par = (const uint32_t[]){true, true, false},
7498 .op_flags = XTENSA_OP_STORE,
7499 .coprocessor = 0x1,
7500 }, {
7501 .name = "sdip",
7502 .translate = translate_ldsti_d,
7503 .par = (const uint32_t[]){true, false, true},
7504 .op_flags = XTENSA_OP_STORE,
7505 .coprocessor = 0x1,
7506 }, {
7507 .name = "sdiu",
7508 .translate = translate_ldsti_d,
7509 .par = (const uint32_t[]){true, true, true},
7510 .op_flags = XTENSA_OP_STORE,
7511 .coprocessor = 0x1,
7512 }, {
7513 .name = "sdx",
7514 .translate = translate_ldstx_d,
7515 .par = (const uint32_t[]){true, true, false},
7516 .op_flags = XTENSA_OP_STORE,
7517 .coprocessor = 0x1,
7518 }, {
7519 .name = "sdxp",
7520 .translate = translate_ldstx_d,
7521 .par = (const uint32_t[]){true, false, true},
7522 .op_flags = XTENSA_OP_STORE,
7523 .coprocessor = 0x1,
7524 }, {
7525 .name = "sdxu",
7526 .translate = translate_ldstx_d,
7527 .par = (const uint32_t[]){true, true, true},
7528 .op_flags = XTENSA_OP_STORE,
7529 .coprocessor = 0x1,
7530 }, {
Max Filippovf8c61372020-03-14 11:13:53 -07007531 .name = "sqrt0.d",
7532 .translate = translate_nop,
7533 .coprocessor = 0x1,
7534 }, {
7535 .name = "sqrt0.s",
7536 .translate = translate_nop,
7537 .coprocessor = 0x1,
7538 }, {
Max Filippovcfa9f052020-06-30 19:27:02 -07007539 .name = "ssi",
7540 .translate = translate_ldsti_s,
7541 .par = (const uint32_t[]){true, true, false},
7542 .op_flags = XTENSA_OP_STORE,
7543 .coprocessor = 0x1,
7544 }, {
7545 .name = "ssip",
7546 .translate = translate_ldsti_s,
7547 .par = (const uint32_t[]){true, false, true},
7548 .op_flags = XTENSA_OP_STORE,
7549 .coprocessor = 0x1,
7550 }, {
7551 .name = "ssiu",
7552 .translate = translate_ldsti_s,
7553 .par = (const uint32_t[]){true, true, true},
7554 .op_flags = XTENSA_OP_STORE,
7555 .coprocessor = 0x1,
7556 }, {
7557 .name = "ssx",
7558 .translate = translate_ldstx_s,
7559 .par = (const uint32_t[]){true, true, false},
7560 .op_flags = XTENSA_OP_STORE,
7561 .coprocessor = 0x1,
7562 }, {
7563 .name = "ssxp",
7564 .translate = translate_ldstx_s,
7565 .par = (const uint32_t[]){true, false, true},
7566 .op_flags = XTENSA_OP_STORE,
7567 .coprocessor = 0x1,
7568 }, {
7569 .name = "ssxu",
7570 .translate = translate_ldstx_s,
7571 .par = (const uint32_t[]){true, true, true},
7572 .op_flags = XTENSA_OP_STORE,
7573 .coprocessor = 0x1,
7574 }, {
7575 .name = "sub.d",
7576 .translate = translate_sub_d,
7577 .coprocessor = 0x1,
7578 }, {
7579 .name = "sub.s",
7580 .translate = translate_sub_s,
7581 .coprocessor = 0x1,
7582 }, {
7583 .name = "trunc.d",
7584 .translate = translate_ftoi_d,
7585 .par = (const uint32_t[]){float_round_to_zero, false},
7586 .coprocessor = 0x1,
7587 }, {
7588 .name = "trunc.s",
7589 .translate = translate_ftoi_s,
7590 .par = (const uint32_t[]){float_round_to_zero, false},
7591 .coprocessor = 0x1,
7592 }, {
7593 .name = "ueq.d",
7594 .translate = translate_compare_d,
7595 .par = (const uint32_t[]){COMPARE_UEQ},
7596 .coprocessor = 0x1,
7597 }, {
7598 .name = "ueq.s",
7599 .translate = translate_compare_s,
7600 .par = (const uint32_t[]){COMPARE_UEQ},
7601 .coprocessor = 0x1,
7602 }, {
7603 .name = "ufloat.d",
7604 .translate = translate_float_d,
7605 .par = (const uint32_t[]){true},
7606 .coprocessor = 0x1,
7607 }, {
7608 .name = "ufloat.s",
7609 .translate = translate_float_s,
7610 .par = (const uint32_t[]){true},
7611 .coprocessor = 0x1,
7612 }, {
7613 .name = "ule.d",
7614 .translate = translate_compare_d,
7615 .par = (const uint32_t[]){COMPARE_ULE},
7616 .coprocessor = 0x1,
7617 }, {
7618 .name = "ule.s",
7619 .translate = translate_compare_s,
7620 .par = (const uint32_t[]){COMPARE_ULE},
7621 .coprocessor = 0x1,
7622 }, {
7623 .name = "ult.d",
7624 .translate = translate_compare_d,
7625 .par = (const uint32_t[]){COMPARE_ULT},
7626 .coprocessor = 0x1,
7627 }, {
7628 .name = "ult.s",
7629 .translate = translate_compare_s,
7630 .par = (const uint32_t[]){COMPARE_ULT},
7631 .coprocessor = 0x1,
7632 }, {
7633 .name = "un.d",
7634 .translate = translate_compare_d,
7635 .par = (const uint32_t[]){COMPARE_UN},
7636 .coprocessor = 0x1,
7637 }, {
7638 .name = "un.s",
7639 .translate = translate_compare_s,
7640 .par = (const uint32_t[]){COMPARE_UN},
7641 .coprocessor = 0x1,
7642 }, {
7643 .name = "utrunc.d",
7644 .translate = translate_ftoi_d,
7645 .par = (const uint32_t[]){float_round_to_zero, true},
7646 .coprocessor = 0x1,
7647 }, {
7648 .name = "utrunc.s",
7649 .translate = translate_ftoi_s,
7650 .par = (const uint32_t[]){float_round_to_zero, true},
7651 .coprocessor = 0x1,
7652 }, {
7653 .name = "wfr",
7654 .translate = translate_wfr_s,
7655 .coprocessor = 0x1,
7656 }, {
7657 .name = "wfrd",
7658 .translate = translate_wfr_d,
7659 .coprocessor = 0x1,
7660 }, {
7661 .name = "wur.fcr",
7662 .translate = translate_wur_fpu_fcr,
7663 .par = (const uint32_t[]){FCR},
7664 .coprocessor = 0x1,
7665 }, {
7666 .name = "wur.fsr",
7667 .translate = translate_wur_fpu_fsr,
7668 .coprocessor = 0x1,
7669 },
7670};
7671
7672const XtensaOpcodeTranslators xtensa_fpu_opcodes = {
7673 .num_opcodes = ARRAY_SIZE(fpu_ops),
7674 .opcode = fpu_ops,
7675};