xref: /openbmc/qemu/target/xtensa/translate.c (revision 37d7328e4a159f1c1f3fc16d4a47e0ac22b509b2)
1fcf5ef2aSThomas Huth /*
2fcf5ef2aSThomas Huth  * Xtensa ISA:
3fcf5ef2aSThomas Huth  * http://www.tensilica.com/products/literature-docs/documentation/xtensa-isa-databook.htm
4fcf5ef2aSThomas Huth  *
5fcf5ef2aSThomas Huth  * Copyright (c) 2011, Max Filippov, Open Source and Linux Lab.
6fcf5ef2aSThomas Huth  * All rights reserved.
7fcf5ef2aSThomas Huth  *
8fcf5ef2aSThomas Huth  * Redistribution and use in source and binary forms, with or without
9fcf5ef2aSThomas Huth  * modification, are permitted provided that the following conditions are met:
10fcf5ef2aSThomas Huth  *     * Redistributions of source code must retain the above copyright
11fcf5ef2aSThomas Huth  *       notice, this list of conditions and the following disclaimer.
12fcf5ef2aSThomas Huth  *     * Redistributions in binary form must reproduce the above copyright
13fcf5ef2aSThomas Huth  *       notice, this list of conditions and the following disclaimer in the
14fcf5ef2aSThomas Huth  *       documentation and/or other materials provided with the distribution.
15fcf5ef2aSThomas Huth  *     * Neither the name of the Open Source and Linux Lab nor the
16fcf5ef2aSThomas Huth  *       names of its contributors may be used to endorse or promote products
17fcf5ef2aSThomas Huth  *       derived from this software without specific prior written permission.
18fcf5ef2aSThomas Huth  *
19fcf5ef2aSThomas Huth  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20fcf5ef2aSThomas Huth  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21fcf5ef2aSThomas Huth  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22fcf5ef2aSThomas Huth  * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
23fcf5ef2aSThomas Huth  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
24fcf5ef2aSThomas Huth  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
25fcf5ef2aSThomas Huth  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
26fcf5ef2aSThomas Huth  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27fcf5ef2aSThomas Huth  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
28fcf5ef2aSThomas Huth  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29fcf5ef2aSThomas Huth  */
30fcf5ef2aSThomas Huth 
31fcf5ef2aSThomas Huth #include "qemu/osdep.h"
32fcf5ef2aSThomas Huth 
33fcf5ef2aSThomas Huth #include "cpu.h"
34fcf5ef2aSThomas Huth #include "exec/exec-all.h"
35fcf5ef2aSThomas Huth #include "disas/disas.h"
36dcb32f1dSPhilippe Mathieu-Daudé #include "tcg/tcg-op.h"
37fcf5ef2aSThomas Huth #include "qemu/log.h"
3890c84c56SMarkus Armbruster #include "qemu/qemu-print.h"
39fcf5ef2aSThomas Huth #include "exec/cpu_ldst.h"
406b5fe137SPhilippe Mathieu-Daudé #include "semihosting/semihost.h"
4177fc6f5eSLluís Vilanova #include "exec/translator.h"
42fcf5ef2aSThomas Huth 
43fcf5ef2aSThomas Huth #include "exec/helper-proto.h"
44fcf5ef2aSThomas Huth #include "exec/helper-gen.h"
45fcf5ef2aSThomas Huth 
46fcf5ef2aSThomas Huth #include "exec/log.h"
47fcf5ef2aSThomas Huth 
48fcf5ef2aSThomas Huth 
49a3380cf6SPeter Maydell struct DisasContext {
503cc18eecSRichard Henderson     DisasContextBase base;
51fcf5ef2aSThomas Huth     const XtensaConfig *config;
52fcf5ef2aSThomas Huth     uint32_t pc;
53fcf5ef2aSThomas Huth     int cring;
54fcf5ef2aSThomas Huth     int ring;
555d630cefSMax Filippov     uint32_t lbeg_off;
56fcf5ef2aSThomas Huth     uint32_t lend;
57fcf5ef2aSThomas Huth 
58fcf5ef2aSThomas Huth     bool sar_5bit;
59fcf5ef2aSThomas Huth     bool sar_m32_5bit;
60fcf5ef2aSThomas Huth     TCGv_i32 sar_m32;
61fcf5ef2aSThomas Huth 
62fcf5ef2aSThomas Huth     unsigned window;
636416d16fSMax Filippov     unsigned callinc;
6409460970SMax Filippov     bool cwoe;
65fcf5ef2aSThomas Huth 
66fcf5ef2aSThomas Huth     bool debug;
67fcf5ef2aSThomas Huth     bool icount;
68fcf5ef2aSThomas Huth     TCGv_i32 next_icount;
69fcf5ef2aSThomas Huth 
70fcf5ef2aSThomas Huth     unsigned cpenable;
71168c12b0SMax Filippov 
7245b71a79SMax Filippov     uint32_t op_flags;
73fde557adSMax Filippov     xtensa_insnbuf_word insnbuf[MAX_INSNBUF_LENGTH];
74fde557adSMax Filippov     xtensa_insnbuf_word slotbuf[MAX_INSNBUF_LENGTH];
75a3380cf6SPeter Maydell };
76fcf5ef2aSThomas Huth 
77fcf5ef2aSThomas Huth static TCGv_i32 cpu_pc;
78fcf5ef2aSThomas Huth static TCGv_i32 cpu_R[16];
79fcf5ef2aSThomas Huth static TCGv_i32 cpu_FR[16];
80cfa9f051SMax Filippov static TCGv_i64 cpu_FRD[16];
817aa78341SMax Filippov static TCGv_i32 cpu_MR[4];
82575e962aSMax Filippov static TCGv_i32 cpu_BR[16];
83575e962aSMax Filippov static TCGv_i32 cpu_BR4[4];
84575e962aSMax Filippov static TCGv_i32 cpu_BR8[2];
85fcf5ef2aSThomas Huth static TCGv_i32 cpu_SR[256];
86fcf5ef2aSThomas Huth static TCGv_i32 cpu_UR[256];
878df3fd35SMax Filippov static TCGv_i32 cpu_windowbase_next;
88b345e140SMax Filippov static TCGv_i32 cpu_exclusive_addr;
89b345e140SMax Filippov static TCGv_i32 cpu_exclusive_val;
90fcf5ef2aSThomas Huth 
91b0b24bdcSMax Filippov static GHashTable *xtensa_regfile_table;
92b0b24bdcSMax Filippov 
93fcf5ef2aSThomas Huth #include "exec/gen-icount.h"
94fcf5ef2aSThomas Huth 
9559419607SMax Filippov static char *sr_name[256];
9659419607SMax Filippov static char *ur_name[256];
97fcf5ef2aSThomas Huth 
9859419607SMax Filippov void xtensa_collect_sr_names(const XtensaConfig *config)
9959419607SMax Filippov {
10059419607SMax Filippov     xtensa_isa isa = config->isa;
10159419607SMax Filippov     int n = xtensa_isa_num_sysregs(isa);
10259419607SMax Filippov     int i;
10359419607SMax Filippov 
10459419607SMax Filippov     for (i = 0; i < n; ++i) {
10559419607SMax Filippov         int sr = xtensa_sysreg_number(isa, i);
10659419607SMax Filippov 
10759419607SMax Filippov         if (sr >= 0 && sr < 256) {
10859419607SMax Filippov             const char *name = xtensa_sysreg_name(isa, i);
10959419607SMax Filippov             char **pname =
11059419607SMax Filippov                 (xtensa_sysreg_is_user(isa, i) ? ur_name : sr_name) + sr;
11159419607SMax Filippov 
11259419607SMax Filippov             if (*pname) {
11359419607SMax Filippov                 if (strstr(*pname, name) == NULL) {
11459419607SMax Filippov                     char *new_name =
11559419607SMax Filippov                         malloc(strlen(*pname) + strlen(name) + 2);
11659419607SMax Filippov 
11759419607SMax Filippov                     strcpy(new_name, *pname);
11859419607SMax Filippov                     strcat(new_name, "/");
11959419607SMax Filippov                     strcat(new_name, name);
12059419607SMax Filippov                     free(*pname);
12159419607SMax Filippov                     *pname = new_name;
122fcf5ef2aSThomas Huth                 }
12359419607SMax Filippov             } else {
12459419607SMax Filippov                 *pname = strdup(name);
125fcf5ef2aSThomas Huth             }
12659419607SMax Filippov         }
12759419607SMax Filippov     }
12859419607SMax Filippov }
129fcf5ef2aSThomas Huth 
130fcf5ef2aSThomas Huth void xtensa_translate_init(void)
131fcf5ef2aSThomas Huth {
132fcf5ef2aSThomas Huth     static const char * const regnames[] = {
133fcf5ef2aSThomas Huth         "ar0", "ar1", "ar2", "ar3",
134fcf5ef2aSThomas Huth         "ar4", "ar5", "ar6", "ar7",
135fcf5ef2aSThomas Huth         "ar8", "ar9", "ar10", "ar11",
136fcf5ef2aSThomas Huth         "ar12", "ar13", "ar14", "ar15",
137fcf5ef2aSThomas Huth     };
138fcf5ef2aSThomas Huth     static const char * const fregnames[] = {
139fcf5ef2aSThomas Huth         "f0", "f1", "f2", "f3",
140fcf5ef2aSThomas Huth         "f4", "f5", "f6", "f7",
141fcf5ef2aSThomas Huth         "f8", "f9", "f10", "f11",
142fcf5ef2aSThomas Huth         "f12", "f13", "f14", "f15",
143fcf5ef2aSThomas Huth     };
1447aa78341SMax Filippov     static const char * const mregnames[] = {
1457aa78341SMax Filippov         "m0", "m1", "m2", "m3",
1467aa78341SMax Filippov     };
147575e962aSMax Filippov     static const char * const bregnames[] = {
148575e962aSMax Filippov         "b0", "b1", "b2", "b3",
149575e962aSMax Filippov         "b4", "b5", "b6", "b7",
150575e962aSMax Filippov         "b8", "b9", "b10", "b11",
151575e962aSMax Filippov         "b12", "b13", "b14", "b15",
152575e962aSMax Filippov     };
153fcf5ef2aSThomas Huth     int i;
154fcf5ef2aSThomas Huth 
155fcf5ef2aSThomas Huth     cpu_pc = tcg_global_mem_new_i32(cpu_env,
156fcf5ef2aSThomas Huth             offsetof(CPUXtensaState, pc), "pc");
157fcf5ef2aSThomas Huth 
158fcf5ef2aSThomas Huth     for (i = 0; i < 16; i++) {
159fcf5ef2aSThomas Huth         cpu_R[i] = tcg_global_mem_new_i32(cpu_env,
160fcf5ef2aSThomas Huth                                           offsetof(CPUXtensaState, regs[i]),
161fcf5ef2aSThomas Huth                                           regnames[i]);
162fcf5ef2aSThomas Huth     }
163fcf5ef2aSThomas Huth 
164fcf5ef2aSThomas Huth     for (i = 0; i < 16; i++) {
165fcf5ef2aSThomas Huth         cpu_FR[i] = tcg_global_mem_new_i32(cpu_env,
1667aa78341SMax Filippov                                            offsetof(CPUXtensaState,
1677aa78341SMax Filippov                                                     fregs[i].f32[FP_F32_LOW]),
168fcf5ef2aSThomas Huth                                            fregnames[i]);
169fcf5ef2aSThomas Huth     }
170fcf5ef2aSThomas Huth 
171cfa9f051SMax Filippov     for (i = 0; i < 16; i++) {
172cfa9f051SMax Filippov         cpu_FRD[i] = tcg_global_mem_new_i64(cpu_env,
173cfa9f051SMax Filippov                                             offsetof(CPUXtensaState,
174cfa9f051SMax Filippov                                                      fregs[i].f64),
175cfa9f051SMax Filippov                                             fregnames[i]);
176cfa9f051SMax Filippov     }
177cfa9f051SMax Filippov 
1787aa78341SMax Filippov     for (i = 0; i < 4; i++) {
1797aa78341SMax Filippov         cpu_MR[i] = tcg_global_mem_new_i32(cpu_env,
1807aa78341SMax Filippov                                            offsetof(CPUXtensaState,
1817aa78341SMax Filippov                                                     sregs[MR + i]),
1827aa78341SMax Filippov                                            mregnames[i]);
1837aa78341SMax Filippov     }
1847aa78341SMax Filippov 
185575e962aSMax Filippov     for (i = 0; i < 16; i++) {
186575e962aSMax Filippov         cpu_BR[i] = tcg_global_mem_new_i32(cpu_env,
187575e962aSMax Filippov                                            offsetof(CPUXtensaState,
188575e962aSMax Filippov                                                     sregs[BR]),
189575e962aSMax Filippov                                            bregnames[i]);
190575e962aSMax Filippov         if (i % 4 == 0) {
191575e962aSMax Filippov             cpu_BR4[i / 4] = tcg_global_mem_new_i32(cpu_env,
192575e962aSMax Filippov                                                     offsetof(CPUXtensaState,
193575e962aSMax Filippov                                                              sregs[BR]),
194575e962aSMax Filippov                                                     bregnames[i]);
195575e962aSMax Filippov         }
196575e962aSMax Filippov         if (i % 8 == 0) {
197575e962aSMax Filippov             cpu_BR8[i / 8] = tcg_global_mem_new_i32(cpu_env,
198575e962aSMax Filippov                                                     offsetof(CPUXtensaState,
199575e962aSMax Filippov                                                              sregs[BR]),
200575e962aSMax Filippov                                                     bregnames[i]);
201575e962aSMax Filippov         }
202575e962aSMax Filippov     }
203575e962aSMax Filippov 
204fcf5ef2aSThomas Huth     for (i = 0; i < 256; ++i) {
20559419607SMax Filippov         if (sr_name[i]) {
206fcf5ef2aSThomas Huth             cpu_SR[i] = tcg_global_mem_new_i32(cpu_env,
20759419607SMax Filippov                                                offsetof(CPUXtensaState,
20859419607SMax Filippov                                                         sregs[i]),
20959419607SMax Filippov                                                sr_name[i]);
210fcf5ef2aSThomas Huth         }
211fcf5ef2aSThomas Huth     }
212fcf5ef2aSThomas Huth 
213fcf5ef2aSThomas Huth     for (i = 0; i < 256; ++i) {
21459419607SMax Filippov         if (ur_name[i]) {
215fcf5ef2aSThomas Huth             cpu_UR[i] = tcg_global_mem_new_i32(cpu_env,
21659419607SMax Filippov                                                offsetof(CPUXtensaState,
21759419607SMax Filippov                                                         uregs[i]),
21859419607SMax Filippov                                                ur_name[i]);
219fcf5ef2aSThomas Huth         }
220fcf5ef2aSThomas Huth     }
2218df3fd35SMax Filippov 
2228df3fd35SMax Filippov     cpu_windowbase_next =
2238df3fd35SMax Filippov         tcg_global_mem_new_i32(cpu_env,
2248df3fd35SMax Filippov                                offsetof(CPUXtensaState, windowbase_next),
2258df3fd35SMax Filippov                                "windowbase_next");
226b345e140SMax Filippov     cpu_exclusive_addr =
227b345e140SMax Filippov         tcg_global_mem_new_i32(cpu_env,
228b345e140SMax Filippov                                offsetof(CPUXtensaState, exclusive_addr),
229b345e140SMax Filippov                                "exclusive_addr");
230b345e140SMax Filippov     cpu_exclusive_val =
231b345e140SMax Filippov         tcg_global_mem_new_i32(cpu_env,
232b345e140SMax Filippov                                offsetof(CPUXtensaState, exclusive_val),
233b345e140SMax Filippov                                "exclusive_val");
234fcf5ef2aSThomas Huth }
235fcf5ef2aSThomas Huth 
236ee659da2SMax Filippov void **xtensa_get_regfile_by_name(const char *name, int entries, int bits)
237b0b24bdcSMax Filippov {
238ee659da2SMax Filippov     char *geometry_name;
239ee659da2SMax Filippov     void **res;
240ee659da2SMax Filippov 
241b0b24bdcSMax Filippov     if (xtensa_regfile_table == NULL) {
242b0b24bdcSMax Filippov         xtensa_regfile_table = g_hash_table_new(g_str_hash, g_str_equal);
243ee659da2SMax Filippov         /*
244ee659da2SMax Filippov          * AR is special. Xtensa translator uses it as a current register
245ee659da2SMax Filippov          * window, but configuration overlays represent it as a complete
246ee659da2SMax Filippov          * physical register file.
247ee659da2SMax Filippov          */
248b0b24bdcSMax Filippov         g_hash_table_insert(xtensa_regfile_table,
249ee659da2SMax Filippov                             (void *)"AR 16x32", (void *)cpu_R);
250b0b24bdcSMax Filippov         g_hash_table_insert(xtensa_regfile_table,
251ee659da2SMax Filippov                             (void *)"AR 32x32", (void *)cpu_R);
2527aa78341SMax Filippov         g_hash_table_insert(xtensa_regfile_table,
253ee659da2SMax Filippov                             (void *)"AR 64x32", (void *)cpu_R);
254ee659da2SMax Filippov 
255575e962aSMax Filippov         g_hash_table_insert(xtensa_regfile_table,
256ee659da2SMax Filippov                             (void *)"MR 4x32", (void *)cpu_MR);
257ee659da2SMax Filippov 
258575e962aSMax Filippov         g_hash_table_insert(xtensa_regfile_table,
259ee659da2SMax Filippov                             (void *)"FR 16x32", (void *)cpu_FR);
260cfa9f051SMax Filippov         g_hash_table_insert(xtensa_regfile_table,
261cfa9f051SMax Filippov                             (void *)"FR 16x64", (void *)cpu_FRD);
262ee659da2SMax Filippov 
263575e962aSMax Filippov         g_hash_table_insert(xtensa_regfile_table,
264ee659da2SMax Filippov                             (void *)"BR 16x1", (void *)cpu_BR);
265ee659da2SMax Filippov         g_hash_table_insert(xtensa_regfile_table,
266ee659da2SMax Filippov                             (void *)"BR4 4x4", (void *)cpu_BR4);
267ee659da2SMax Filippov         g_hash_table_insert(xtensa_regfile_table,
268ee659da2SMax Filippov                             (void *)"BR8 2x8", (void *)cpu_BR8);
269b0b24bdcSMax Filippov     }
270ee659da2SMax Filippov 
271ee659da2SMax Filippov     geometry_name = g_strdup_printf("%s %dx%d", name, entries, bits);
272ee659da2SMax Filippov     res = (void **)g_hash_table_lookup(xtensa_regfile_table, geometry_name);
273ee659da2SMax Filippov     g_free(geometry_name);
274ee659da2SMax Filippov     return res;
275b0b24bdcSMax Filippov }
276b0b24bdcSMax Filippov 
277fcf5ef2aSThomas Huth static inline bool option_enabled(DisasContext *dc, int opt)
278fcf5ef2aSThomas Huth {
279fcf5ef2aSThomas Huth     return xtensa_option_enabled(dc->config, opt);
280fcf5ef2aSThomas Huth }
281fcf5ef2aSThomas Huth 
282fcf5ef2aSThomas Huth static void init_sar_tracker(DisasContext *dc)
283fcf5ef2aSThomas Huth {
284fcf5ef2aSThomas Huth     dc->sar_5bit = false;
285fcf5ef2aSThomas Huth     dc->sar_m32_5bit = false;
286a49f3a2eSRichard Henderson     dc->sar_m32 = NULL;
287fcf5ef2aSThomas Huth }
288fcf5ef2aSThomas Huth 
289fcf5ef2aSThomas Huth static void gen_right_shift_sar(DisasContext *dc, TCGv_i32 sa)
290fcf5ef2aSThomas Huth {
291fcf5ef2aSThomas Huth     tcg_gen_andi_i32(cpu_SR[SAR], sa, 0x1f);
292fcf5ef2aSThomas Huth     if (dc->sar_m32_5bit) {
293fcf5ef2aSThomas Huth         tcg_gen_discard_i32(dc->sar_m32);
294fcf5ef2aSThomas Huth     }
295fcf5ef2aSThomas Huth     dc->sar_5bit = true;
296fcf5ef2aSThomas Huth     dc->sar_m32_5bit = false;
297fcf5ef2aSThomas Huth }
298fcf5ef2aSThomas Huth 
299fcf5ef2aSThomas Huth static void gen_left_shift_sar(DisasContext *dc, TCGv_i32 sa)
300fcf5ef2aSThomas Huth {
301a49f3a2eSRichard Henderson     if (!dc->sar_m32) {
302177bbc81SRichard Henderson         dc->sar_m32 = tcg_temp_new_i32();
303fcf5ef2aSThomas Huth     }
304fcf5ef2aSThomas Huth     tcg_gen_andi_i32(dc->sar_m32, sa, 0x1f);
3052b570a17SMax Filippov     tcg_gen_sub_i32(cpu_SR[SAR], tcg_constant_i32(32), dc->sar_m32);
306fcf5ef2aSThomas Huth     dc->sar_5bit = false;
307fcf5ef2aSThomas Huth     dc->sar_m32_5bit = true;
308fcf5ef2aSThomas Huth }
309fcf5ef2aSThomas Huth 
310fcf5ef2aSThomas Huth static void gen_exception(DisasContext *dc, int excp)
311fcf5ef2aSThomas Huth {
312f99fbd12SMax Filippov     gen_helper_exception(cpu_env, tcg_constant_i32(excp));
313fcf5ef2aSThomas Huth }
314fcf5ef2aSThomas Huth 
315fcf5ef2aSThomas Huth static void gen_exception_cause(DisasContext *dc, uint32_t cause)
316fcf5ef2aSThomas Huth {
317f99fbd12SMax Filippov     TCGv_i32 pc = tcg_constant_i32(dc->pc);
318f99fbd12SMax Filippov     gen_helper_exception_cause(cpu_env, pc, tcg_constant_i32(cause));
319fcf5ef2aSThomas Huth     if (cause == ILLEGAL_INSTRUCTION_CAUSE ||
320fcf5ef2aSThomas Huth             cause == SYSCALL_CAUSE) {
3213cc18eecSRichard Henderson         dc->base.is_jmp = DISAS_NORETURN;
322fcf5ef2aSThomas Huth     }
323fcf5ef2aSThomas Huth }
324fcf5ef2aSThomas Huth 
325fcf5ef2aSThomas Huth static void gen_debug_exception(DisasContext *dc, uint32_t cause)
326fcf5ef2aSThomas Huth {
327f99fbd12SMax Filippov     TCGv_i32 pc = tcg_constant_i32(dc->pc);
328f99fbd12SMax Filippov     gen_helper_debug_exception(cpu_env, pc, tcg_constant_i32(cause));
329fcf5ef2aSThomas Huth     if (cause & (DEBUGCAUSE_IB | DEBUGCAUSE_BI | DEBUGCAUSE_BN)) {
3303cc18eecSRichard Henderson         dc->base.is_jmp = DISAS_NORETURN;
331fcf5ef2aSThomas Huth     }
332fcf5ef2aSThomas Huth }
333fcf5ef2aSThomas Huth 
334fcf5ef2aSThomas Huth static bool gen_check_privilege(DisasContext *dc)
335fcf5ef2aSThomas Huth {
336ba7651fbSMax Filippov #ifndef CONFIG_USER_ONLY
337ba7651fbSMax Filippov     if (!dc->cring) {
338ba7651fbSMax Filippov         return true;
339ba7651fbSMax Filippov     }
340ba7651fbSMax Filippov #endif
341fcf5ef2aSThomas Huth     gen_exception_cause(dc, PRIVILEGED_CAUSE);
3423cc18eecSRichard Henderson     dc->base.is_jmp = DISAS_NORETURN;
343fcf5ef2aSThomas Huth     return false;
344fcf5ef2aSThomas Huth }
345fcf5ef2aSThomas Huth 
346582fef0fSMax Filippov static bool gen_check_cpenable(DisasContext *dc, uint32_t cp_mask)
347fcf5ef2aSThomas Huth {
348582fef0fSMax Filippov     cp_mask &= ~dc->cpenable;
349582fef0fSMax Filippov 
350582fef0fSMax Filippov     if (option_enabled(dc, XTENSA_OPTION_COPROCESSOR) && cp_mask) {
351582fef0fSMax Filippov         gen_exception_cause(dc, COPROCESSOR0_DISABLED + ctz32(cp_mask));
3523cc18eecSRichard Henderson         dc->base.is_jmp = DISAS_NORETURN;
353fcf5ef2aSThomas Huth         return false;
354fcf5ef2aSThomas Huth     }
355fcf5ef2aSThomas Huth     return true;
356fcf5ef2aSThomas Huth }
357fcf5ef2aSThomas Huth 
35845b71a79SMax Filippov static int gen_postprocess(DisasContext *dc, int slot);
35945b71a79SMax Filippov 
360fcf5ef2aSThomas Huth static void gen_jump_slot(DisasContext *dc, TCGv dest, int slot)
361fcf5ef2aSThomas Huth {
362fcf5ef2aSThomas Huth     tcg_gen_mov_i32(cpu_pc, dest);
363fcf5ef2aSThomas Huth     if (dc->icount) {
364fcf5ef2aSThomas Huth         tcg_gen_mov_i32(cpu_SR[ICOUNT], dc->next_icount);
365fcf5ef2aSThomas Huth     }
36645b71a79SMax Filippov     if (dc->op_flags & XTENSA_OP_POSTPROCESS) {
36745b71a79SMax Filippov         slot = gen_postprocess(dc, slot);
36845b71a79SMax Filippov     }
369fcf5ef2aSThomas Huth     if (slot >= 0) {
370fcf5ef2aSThomas Huth         tcg_gen_goto_tb(slot);
3713cc18eecSRichard Henderson         tcg_gen_exit_tb(dc->base.tb, slot);
372fcf5ef2aSThomas Huth     } else {
37307ea28b4SRichard Henderson         tcg_gen_exit_tb(NULL, 0);
374fcf5ef2aSThomas Huth     }
3753cc18eecSRichard Henderson     dc->base.is_jmp = DISAS_NORETURN;
376fcf5ef2aSThomas Huth }
377fcf5ef2aSThomas Huth 
378fcf5ef2aSThomas Huth static void gen_jump(DisasContext *dc, TCGv dest)
379fcf5ef2aSThomas Huth {
380fcf5ef2aSThomas Huth     gen_jump_slot(dc, dest, -1);
381fcf5ef2aSThomas Huth }
382fcf5ef2aSThomas Huth 
3839791e7e9SMax Filippov static int adjust_jump_slot(DisasContext *dc, uint32_t dest, int slot)
3849791e7e9SMax Filippov {
38570c6eb46SRichard Henderson     return translator_use_goto_tb(&dc->base, dest) ? slot : -1;
3869791e7e9SMax Filippov }
3879791e7e9SMax Filippov 
388fcf5ef2aSThomas Huth static void gen_jumpi(DisasContext *dc, uint32_t dest, int slot)
389fcf5ef2aSThomas Huth {
3906ade0ce9SMax Filippov     gen_jump_slot(dc, tcg_constant_i32(dest),
3916ade0ce9SMax Filippov                   adjust_jump_slot(dc, dest, slot));
392fcf5ef2aSThomas Huth }
393fcf5ef2aSThomas Huth 
394fcf5ef2aSThomas Huth static void gen_callw_slot(DisasContext *dc, int callinc, TCGv_i32 dest,
395fcf5ef2aSThomas Huth         int slot)
396fcf5ef2aSThomas Huth {
397fcf5ef2aSThomas Huth     tcg_gen_deposit_i32(cpu_SR[PS], cpu_SR[PS],
3986ade0ce9SMax Filippov             tcg_constant_i32(callinc), PS_CALLINC_SHIFT, PS_CALLINC_LEN);
399fcf5ef2aSThomas Huth     tcg_gen_movi_i32(cpu_R[callinc << 2],
4003cc18eecSRichard Henderson             (callinc << 30) | (dc->base.pc_next & 0x3fffffff));
401fcf5ef2aSThomas Huth     gen_jump_slot(dc, dest, slot);
402fcf5ef2aSThomas Huth }
403fcf5ef2aSThomas Huth 
404fcf5ef2aSThomas Huth static bool gen_check_loop_end(DisasContext *dc, int slot)
405fcf5ef2aSThomas Huth {
4065d630cefSMax Filippov     if (dc->base.pc_next == dc->lend) {
407fcf5ef2aSThomas Huth         TCGLabel *label = gen_new_label();
408fcf5ef2aSThomas Huth 
409fcf5ef2aSThomas Huth         tcg_gen_brcondi_i32(TCG_COND_EQ, cpu_SR[LCOUNT], 0, label);
410fcf5ef2aSThomas Huth         tcg_gen_subi_i32(cpu_SR[LCOUNT], cpu_SR[LCOUNT], 1);
4115d630cefSMax Filippov         if (dc->lbeg_off) {
4125d630cefSMax Filippov             gen_jumpi(dc, dc->base.pc_next - dc->lbeg_off, slot);
4135d630cefSMax Filippov         } else {
4145d630cefSMax Filippov             gen_jump(dc, cpu_SR[LBEG]);
4155d630cefSMax Filippov         }
416fcf5ef2aSThomas Huth         gen_set_label(label);
4173cc18eecSRichard Henderson         gen_jumpi(dc, dc->base.pc_next, -1);
418fcf5ef2aSThomas Huth         return true;
419fcf5ef2aSThomas Huth     }
420fcf5ef2aSThomas Huth     return false;
421fcf5ef2aSThomas Huth }
422fcf5ef2aSThomas Huth 
423fcf5ef2aSThomas Huth static void gen_jumpi_check_loop_end(DisasContext *dc, int slot)
424fcf5ef2aSThomas Huth {
425fcf5ef2aSThomas Huth     if (!gen_check_loop_end(dc, slot)) {
4263cc18eecSRichard Henderson         gen_jumpi(dc, dc->base.pc_next, slot);
427fcf5ef2aSThomas Huth     }
428fcf5ef2aSThomas Huth }
429fcf5ef2aSThomas Huth 
430fcf5ef2aSThomas Huth static void gen_brcond(DisasContext *dc, TCGCond cond,
43133071f68SMax Filippov                        TCGv_i32 t0, TCGv_i32 t1, uint32_t addr)
432fcf5ef2aSThomas Huth {
433fcf5ef2aSThomas Huth     TCGLabel *label = gen_new_label();
434fcf5ef2aSThomas Huth 
435fcf5ef2aSThomas Huth     tcg_gen_brcond_i32(cond, t0, t1, label);
436fcf5ef2aSThomas Huth     gen_jumpi_check_loop_end(dc, 0);
437fcf5ef2aSThomas Huth     gen_set_label(label);
43833071f68SMax Filippov     gen_jumpi(dc, addr, 1);
439fcf5ef2aSThomas Huth }
440fcf5ef2aSThomas Huth 
441fcf5ef2aSThomas Huth static void gen_brcondi(DisasContext *dc, TCGCond cond,
44233071f68SMax Filippov                         TCGv_i32 t0, uint32_t t1, uint32_t addr)
443fcf5ef2aSThomas Huth {
4446ade0ce9SMax Filippov     gen_brcond(dc, cond, t0, tcg_constant_i32(t1), addr);
445fcf5ef2aSThomas Huth }
446fcf5ef2aSThomas Huth 
44791dc2b2dSMax Filippov static uint32_t test_exceptions_sr(DisasContext *dc, const OpcodeArg arg[],
44859419607SMax Filippov                                    const uint32_t par[])
449fcf5ef2aSThomas Huth {
45091dc2b2dSMax Filippov     return xtensa_option_enabled(dc->config, par[1]) ? 0 : XTENSA_OP_ILL;
451fcf5ef2aSThomas Huth }
452fcf5ef2aSThomas Huth 
45391dc2b2dSMax Filippov static uint32_t test_exceptions_ccompare(DisasContext *dc,
45491dc2b2dSMax Filippov                                          const OpcodeArg arg[],
45559419607SMax Filippov                                          const uint32_t par[])
456fcf5ef2aSThomas Huth {
45759419607SMax Filippov     unsigned n = par[0] - CCOMPARE;
45859419607SMax Filippov 
45991dc2b2dSMax Filippov     if (n >= dc->config->nccompare) {
46091dc2b2dSMax Filippov         return XTENSA_OP_ILL;
46191dc2b2dSMax Filippov     }
46291dc2b2dSMax Filippov     return test_exceptions_sr(dc, arg, par);
463fcf5ef2aSThomas Huth }
464fcf5ef2aSThomas Huth 
46591dc2b2dSMax Filippov static uint32_t test_exceptions_dbreak(DisasContext *dc, const OpcodeArg arg[],
46659419607SMax Filippov                                        const uint32_t par[])
467fcf5ef2aSThomas Huth {
46859419607SMax Filippov     unsigned n = MAX_NDBREAK;
469fcf5ef2aSThomas Huth 
47059419607SMax Filippov     if (par[0] >= DBREAKA && par[0] < DBREAKA + MAX_NDBREAK) {
47159419607SMax Filippov         n = par[0] - DBREAKA;
47259419607SMax Filippov     }
47359419607SMax Filippov     if (par[0] >= DBREAKC && par[0] < DBREAKC + MAX_NDBREAK) {
47459419607SMax Filippov         n = par[0] - DBREAKC;
47559419607SMax Filippov     }
47691dc2b2dSMax Filippov     if (n >= dc->config->ndbreak) {
47791dc2b2dSMax Filippov         return XTENSA_OP_ILL;
47891dc2b2dSMax Filippov     }
47991dc2b2dSMax Filippov     return test_exceptions_sr(dc, arg, par);
48059419607SMax Filippov }
48159419607SMax Filippov 
48291dc2b2dSMax Filippov static uint32_t test_exceptions_ibreak(DisasContext *dc, const OpcodeArg arg[],
48359419607SMax Filippov                                        const uint32_t par[])
484fcf5ef2aSThomas Huth {
48559419607SMax Filippov     unsigned n = par[0] - IBREAKA;
486fcf5ef2aSThomas Huth 
48791dc2b2dSMax Filippov     if (n >= dc->config->nibreak) {
48891dc2b2dSMax Filippov         return XTENSA_OP_ILL;
48991dc2b2dSMax Filippov     }
49091dc2b2dSMax Filippov     return test_exceptions_sr(dc, arg, par);
491fcf5ef2aSThomas Huth }
492fcf5ef2aSThomas Huth 
49391dc2b2dSMax Filippov static uint32_t test_exceptions_hpi(DisasContext *dc, const OpcodeArg arg[],
49459419607SMax Filippov                                     const uint32_t par[])
495fcf5ef2aSThomas Huth {
49659419607SMax Filippov     unsigned n = MAX_NLEVEL + 1;
497fcf5ef2aSThomas Huth 
49859419607SMax Filippov     if (par[0] >= EXCSAVE1 && par[0] < EXCSAVE1 + MAX_NLEVEL) {
49959419607SMax Filippov         n = par[0] - EXCSAVE1 + 1;
500fcf5ef2aSThomas Huth     }
50159419607SMax Filippov     if (par[0] >= EPC1 && par[0] < EPC1 + MAX_NLEVEL) {
50259419607SMax Filippov         n = par[0] - EPC1 + 1;
503fcf5ef2aSThomas Huth     }
50459419607SMax Filippov     if (par[0] >= EPS2 && par[0] < EPS2 + MAX_NLEVEL - 1) {
50559419607SMax Filippov         n = par[0] - EPS2 + 2;
506fcf5ef2aSThomas Huth     }
50791dc2b2dSMax Filippov     if (n > dc->config->nlevel) {
50891dc2b2dSMax Filippov         return XTENSA_OP_ILL;
50991dc2b2dSMax Filippov     }
51091dc2b2dSMax Filippov     return test_exceptions_sr(dc, arg, par);
511fcf5ef2aSThomas Huth }
512fcf5ef2aSThomas Huth 
513583e6a5fSMax Filippov static MemOp gen_load_store_alignment(DisasContext *dc, MemOp mop,
514583e6a5fSMax Filippov                                       TCGv_i32 addr)
515fcf5ef2aSThomas Huth {
516583e6a5fSMax Filippov     if ((mop & MO_SIZE) == MO_8) {
517583e6a5fSMax Filippov         return mop;
518fcf5ef2aSThomas Huth     }
519583e6a5fSMax Filippov     if ((mop & MO_AMASK) == MO_UNALN &&
520583e6a5fSMax Filippov         !option_enabled(dc, XTENSA_OPTION_HW_ALIGNMENT)) {
521583e6a5fSMax Filippov         mop |= MO_ALIGN;
522583e6a5fSMax Filippov     }
523583e6a5fSMax Filippov     if (!option_enabled(dc, XTENSA_OPTION_UNALIGNED_EXCEPTION)) {
524583e6a5fSMax Filippov         tcg_gen_andi_i32(addr, addr, ~0 << get_alignment_bits(mop));
525583e6a5fSMax Filippov     }
526583e6a5fSMax Filippov     return mop;
527fcf5ef2aSThomas Huth }
528fcf5ef2aSThomas Huth 
5296416d16fSMax Filippov static bool gen_window_check(DisasContext *dc, uint32_t mask)
530fcf5ef2aSThomas Huth {
5316416d16fSMax Filippov     unsigned r = 31 - clz32(mask);
5326416d16fSMax Filippov 
5336416d16fSMax Filippov     if (r / 4 > dc->window) {
5340269a6cfSMax Filippov         TCGv_i32 pc = tcg_constant_i32(dc->pc);
5350269a6cfSMax Filippov         TCGv_i32 w = tcg_constant_i32(r / 4);
536fcf5ef2aSThomas Huth 
537fcf5ef2aSThomas Huth         gen_helper_window_check(cpu_env, pc, w);
5383cc18eecSRichard Henderson         dc->base.is_jmp = DISAS_NORETURN;
539fcf5ef2aSThomas Huth         return false;
540fcf5ef2aSThomas Huth     }
541fcf5ef2aSThomas Huth     return true;
542fcf5ef2aSThomas Huth }
543fcf5ef2aSThomas Huth 
544fcf5ef2aSThomas Huth static TCGv_i32 gen_mac16_m(TCGv_i32 v, bool hi, bool is_unsigned)
545fcf5ef2aSThomas Huth {
546fcf5ef2aSThomas Huth     TCGv_i32 m = tcg_temp_new_i32();
547fcf5ef2aSThomas Huth 
548fcf5ef2aSThomas Huth     if (hi) {
549fcf5ef2aSThomas Huth         (is_unsigned ? tcg_gen_shri_i32 : tcg_gen_sari_i32)(m, v, 16);
550fcf5ef2aSThomas Huth     } else {
551fcf5ef2aSThomas Huth         (is_unsigned ? tcg_gen_ext16u_i32 : tcg_gen_ext16s_i32)(m, v);
552fcf5ef2aSThomas Huth     }
553fcf5ef2aSThomas Huth     return m;
554fcf5ef2aSThomas Huth }
555fcf5ef2aSThomas Huth 
556b0b24bdcSMax Filippov static void gen_zero_check(DisasContext *dc, const OpcodeArg arg[])
5574a038955SMax Filippov {
5584a038955SMax Filippov     TCGLabel *label = gen_new_label();
5594a038955SMax Filippov 
560b0b24bdcSMax Filippov     tcg_gen_brcondi_i32(TCG_COND_NE, arg[2].in, 0, label);
5614a038955SMax Filippov     gen_exception_cause(dc, INTEGER_DIVIDE_BY_ZERO_CAUSE);
5624a038955SMax Filippov     gen_set_label(label);
5634a038955SMax Filippov }
5644a038955SMax Filippov 
56533071f68SMax Filippov static inline unsigned xtensa_op0_insn_len(DisasContext *dc, uint8_t op0)
566fcf5ef2aSThomas Huth {
56733071f68SMax Filippov     return xtensa_isa_length_from_chars(dc->config->isa, &op0);
568fcf5ef2aSThomas Huth }
569fcf5ef2aSThomas Huth 
57045b71a79SMax Filippov static int gen_postprocess(DisasContext *dc, int slot)
57145b71a79SMax Filippov {
57245b71a79SMax Filippov     uint32_t op_flags = dc->op_flags;
57345b71a79SMax Filippov 
57459419607SMax Filippov #ifndef CONFIG_USER_ONLY
57545b71a79SMax Filippov     if (op_flags & XTENSA_OP_CHECK_INTERRUPTS) {
57659419607SMax Filippov         if (tb_cflags(dc->base.tb) & CF_USE_ICOUNT) {
57759419607SMax Filippov             gen_io_start();
57845b71a79SMax Filippov         }
57959419607SMax Filippov         gen_helper_check_interrupts(cpu_env);
58059419607SMax Filippov     }
58159419607SMax Filippov #endif
5828df3fd35SMax Filippov     if (op_flags & XTENSA_OP_SYNC_REGISTER_WINDOW) {
5838df3fd35SMax Filippov         gen_helper_sync_windowbase(cpu_env);
5848df3fd35SMax Filippov     }
58545b71a79SMax Filippov     if (op_flags & XTENSA_OP_EXIT_TB_M1) {
58645b71a79SMax Filippov         slot = -1;
58745b71a79SMax Filippov     }
58845b71a79SMax Filippov     return slot;
58945b71a79SMax Filippov }
59045b71a79SMax Filippov 
59189bec9e9SMax Filippov struct opcode_arg_copy {
59289bec9e9SMax Filippov     uint32_t resource;
59389bec9e9SMax Filippov     void *temp;
59489bec9e9SMax Filippov     OpcodeArg *arg;
59589bec9e9SMax Filippov };
59689bec9e9SMax Filippov 
59720e9fd0fSMax Filippov struct opcode_arg_info {
59820e9fd0fSMax Filippov     uint32_t resource;
59920e9fd0fSMax Filippov     int index;
60020e9fd0fSMax Filippov };
60120e9fd0fSMax Filippov 
60220e9fd0fSMax Filippov struct slot_prop {
60320e9fd0fSMax Filippov     XtensaOpcodeOps *ops;
604b0b24bdcSMax Filippov     OpcodeArg arg[MAX_OPCODE_ARGS];
60520e9fd0fSMax Filippov     struct opcode_arg_info in[MAX_OPCODE_ARGS];
60620e9fd0fSMax Filippov     struct opcode_arg_info out[MAX_OPCODE_ARGS];
60720e9fd0fSMax Filippov     unsigned n_in;
60820e9fd0fSMax Filippov     unsigned n_out;
60920e9fd0fSMax Filippov     uint32_t op_flags;
61020e9fd0fSMax Filippov };
61120e9fd0fSMax Filippov 
61220e9fd0fSMax Filippov enum resource_type {
61320e9fd0fSMax Filippov     RES_REGFILE,
61420e9fd0fSMax Filippov     RES_STATE,
61520e9fd0fSMax Filippov     RES_MAX,
61620e9fd0fSMax Filippov };
61720e9fd0fSMax Filippov 
61820e9fd0fSMax Filippov static uint32_t encode_resource(enum resource_type r, unsigned g, unsigned n)
61920e9fd0fSMax Filippov {
62020e9fd0fSMax Filippov     assert(r < RES_MAX && g < 256 && n < 65536);
62120e9fd0fSMax Filippov     return (r << 24) | (g << 16) | n;
62220e9fd0fSMax Filippov }
62320e9fd0fSMax Filippov 
62489bec9e9SMax Filippov static enum resource_type get_resource_type(uint32_t resource)
62589bec9e9SMax Filippov {
62689bec9e9SMax Filippov     return resource >> 24;
62789bec9e9SMax Filippov }
62889bec9e9SMax Filippov 
62920e9fd0fSMax Filippov /*
63020e9fd0fSMax Filippov  * a depends on b if b must be executed before a,
63120e9fd0fSMax Filippov  * because a's side effects will destroy b's inputs.
63220e9fd0fSMax Filippov  */
63320e9fd0fSMax Filippov static bool op_depends_on(const struct slot_prop *a,
63420e9fd0fSMax Filippov                           const struct slot_prop *b)
63520e9fd0fSMax Filippov {
63620e9fd0fSMax Filippov     unsigned i = 0;
63720e9fd0fSMax Filippov     unsigned j = 0;
63820e9fd0fSMax Filippov 
63920e9fd0fSMax Filippov     if (a->op_flags & XTENSA_OP_CONTROL_FLOW) {
64020e9fd0fSMax Filippov         return true;
64120e9fd0fSMax Filippov     }
642068e538aSMax Filippov     if ((a->op_flags & XTENSA_OP_LOAD_STORE) <
643068e538aSMax Filippov         (b->op_flags & XTENSA_OP_LOAD_STORE)) {
644068e538aSMax Filippov         return true;
645068e538aSMax Filippov     }
64620e9fd0fSMax Filippov     while (i < a->n_out && j < b->n_in) {
64720e9fd0fSMax Filippov         if (a->out[i].resource < b->in[j].resource) {
64820e9fd0fSMax Filippov             ++i;
64920e9fd0fSMax Filippov         } else if (a->out[i].resource > b->in[j].resource) {
65020e9fd0fSMax Filippov             ++j;
65120e9fd0fSMax Filippov         } else {
65220e9fd0fSMax Filippov             return true;
65320e9fd0fSMax Filippov         }
65420e9fd0fSMax Filippov     }
65520e9fd0fSMax Filippov     return false;
65620e9fd0fSMax Filippov }
65720e9fd0fSMax Filippov 
65820e9fd0fSMax Filippov /*
65989bec9e9SMax Filippov  * Try to break a dependency on b, append temporary register copy records
66089bec9e9SMax Filippov  * to the end of copy and update n_copy in case of success.
66189bec9e9SMax Filippov  * This is not always possible: e.g. control flow must always be the last,
66289bec9e9SMax Filippov  * load/store must be first and state dependencies are not supported yet.
66389bec9e9SMax Filippov  */
66489bec9e9SMax Filippov static bool break_dependency(struct slot_prop *a,
66589bec9e9SMax Filippov                              struct slot_prop *b,
66689bec9e9SMax Filippov                              struct opcode_arg_copy *copy,
66789bec9e9SMax Filippov                              unsigned *n_copy)
66889bec9e9SMax Filippov {
66989bec9e9SMax Filippov     unsigned i = 0;
67089bec9e9SMax Filippov     unsigned j = 0;
67189bec9e9SMax Filippov     unsigned n = *n_copy;
67289bec9e9SMax Filippov     bool rv = false;
67389bec9e9SMax Filippov 
67489bec9e9SMax Filippov     if (a->op_flags & XTENSA_OP_CONTROL_FLOW) {
67589bec9e9SMax Filippov         return false;
67689bec9e9SMax Filippov     }
677068e538aSMax Filippov     if ((a->op_flags & XTENSA_OP_LOAD_STORE) <
678068e538aSMax Filippov         (b->op_flags & XTENSA_OP_LOAD_STORE)) {
679068e538aSMax Filippov         return false;
680068e538aSMax Filippov     }
68189bec9e9SMax Filippov     while (i < a->n_out && j < b->n_in) {
68289bec9e9SMax Filippov         if (a->out[i].resource < b->in[j].resource) {
68389bec9e9SMax Filippov             ++i;
68489bec9e9SMax Filippov         } else if (a->out[i].resource > b->in[j].resource) {
68589bec9e9SMax Filippov             ++j;
68689bec9e9SMax Filippov         } else {
68789bec9e9SMax Filippov             int index = b->in[j].index;
68889bec9e9SMax Filippov 
68989bec9e9SMax Filippov             if (get_resource_type(a->out[i].resource) != RES_REGFILE ||
69089bec9e9SMax Filippov                 index < 0) {
69189bec9e9SMax Filippov                 return false;
69289bec9e9SMax Filippov             }
69389bec9e9SMax Filippov             copy[n].resource = b->in[j].resource;
69489bec9e9SMax Filippov             copy[n].arg = b->arg + index;
69589bec9e9SMax Filippov             ++n;
69689bec9e9SMax Filippov             ++j;
69789bec9e9SMax Filippov             rv = true;
69889bec9e9SMax Filippov         }
69989bec9e9SMax Filippov     }
70089bec9e9SMax Filippov     *n_copy = n;
70189bec9e9SMax Filippov     return rv;
70289bec9e9SMax Filippov }
70389bec9e9SMax Filippov 
70489bec9e9SMax Filippov /*
70520e9fd0fSMax Filippov  * Calculate evaluation order for slot opcodes.
70620e9fd0fSMax Filippov  * Build opcode order graph and output its nodes in topological sort order.
70720e9fd0fSMax Filippov  * An edge a -> b in the graph means that opcode a must be followed by
70820e9fd0fSMax Filippov  * opcode b.
70920e9fd0fSMax Filippov  */
71020e9fd0fSMax Filippov static bool tsort(struct slot_prop *slot,
71120e9fd0fSMax Filippov                   struct slot_prop *sorted[],
71289bec9e9SMax Filippov                   unsigned n,
71389bec9e9SMax Filippov                   struct opcode_arg_copy *copy,
71489bec9e9SMax Filippov                   unsigned *n_copy)
71520e9fd0fSMax Filippov {
71620e9fd0fSMax Filippov     struct tsnode {
71720e9fd0fSMax Filippov         unsigned n_in_edge;
71820e9fd0fSMax Filippov         unsigned n_out_edge;
71920e9fd0fSMax Filippov         unsigned out_edge[MAX_INSN_SLOTS];
72020e9fd0fSMax Filippov     } node[MAX_INSN_SLOTS];
72120e9fd0fSMax Filippov 
72220e9fd0fSMax Filippov     unsigned in[MAX_INSN_SLOTS];
72320e9fd0fSMax Filippov     unsigned i, j;
72420e9fd0fSMax Filippov     unsigned n_in = 0;
72520e9fd0fSMax Filippov     unsigned n_out = 0;
72620e9fd0fSMax Filippov     unsigned n_edge = 0;
72789bec9e9SMax Filippov     unsigned in_idx = 0;
72889bec9e9SMax Filippov     unsigned node_idx = 0;
72920e9fd0fSMax Filippov 
73020e9fd0fSMax Filippov     for (i = 0; i < n; ++i) {
73120e9fd0fSMax Filippov         node[i].n_in_edge = 0;
73220e9fd0fSMax Filippov         node[i].n_out_edge = 0;
73320e9fd0fSMax Filippov     }
73420e9fd0fSMax Filippov 
73520e9fd0fSMax Filippov     for (i = 0; i < n; ++i) {
73620e9fd0fSMax Filippov         unsigned n_out_edge = 0;
73720e9fd0fSMax Filippov 
73820e9fd0fSMax Filippov         for (j = 0; j < n; ++j) {
73920e9fd0fSMax Filippov             if (i != j && op_depends_on(slot + j, slot + i)) {
74020e9fd0fSMax Filippov                 node[i].out_edge[n_out_edge] = j;
74120e9fd0fSMax Filippov                 ++node[j].n_in_edge;
74220e9fd0fSMax Filippov                 ++n_out_edge;
74320e9fd0fSMax Filippov                 ++n_edge;
74420e9fd0fSMax Filippov             }
74520e9fd0fSMax Filippov         }
74620e9fd0fSMax Filippov         node[i].n_out_edge = n_out_edge;
74720e9fd0fSMax Filippov     }
74820e9fd0fSMax Filippov 
74920e9fd0fSMax Filippov     for (i = 0; i < n; ++i) {
75020e9fd0fSMax Filippov         if (!node[i].n_in_edge) {
75120e9fd0fSMax Filippov             in[n_in] = i;
75220e9fd0fSMax Filippov             ++n_in;
75320e9fd0fSMax Filippov         }
75420e9fd0fSMax Filippov     }
75520e9fd0fSMax Filippov 
75689bec9e9SMax Filippov again:
75789bec9e9SMax Filippov     for (; in_idx < n_in; ++in_idx) {
75820e9fd0fSMax Filippov         i = in[in_idx];
75920e9fd0fSMax Filippov         sorted[n_out] = slot + i;
76020e9fd0fSMax Filippov         ++n_out;
76120e9fd0fSMax Filippov         for (j = 0; j < node[i].n_out_edge; ++j) {
76220e9fd0fSMax Filippov             --n_edge;
76320e9fd0fSMax Filippov             if (--node[node[i].out_edge[j]].n_in_edge == 0) {
76420e9fd0fSMax Filippov                 in[n_in] = node[i].out_edge[j];
76520e9fd0fSMax Filippov                 ++n_in;
76620e9fd0fSMax Filippov             }
76720e9fd0fSMax Filippov         }
76820e9fd0fSMax Filippov     }
76989bec9e9SMax Filippov     if (n_edge) {
77089bec9e9SMax Filippov         for (; node_idx < n; ++node_idx) {
77189bec9e9SMax Filippov             struct tsnode *cnode = node + node_idx;
77289bec9e9SMax Filippov 
77389bec9e9SMax Filippov             if (cnode->n_in_edge) {
77489bec9e9SMax Filippov                 for (j = 0; j < cnode->n_out_edge; ++j) {
77589bec9e9SMax Filippov                     unsigned k = cnode->out_edge[j];
77689bec9e9SMax Filippov 
77789bec9e9SMax Filippov                     if (break_dependency(slot + k, slot + node_idx,
77889bec9e9SMax Filippov                                          copy, n_copy) &&
77989bec9e9SMax Filippov                         --node[k].n_in_edge == 0) {
78089bec9e9SMax Filippov                         in[n_in] = k;
78189bec9e9SMax Filippov                         ++n_in;
78289bec9e9SMax Filippov                         --n_edge;
78389bec9e9SMax Filippov                         cnode->out_edge[j] =
78489bec9e9SMax Filippov                             cnode->out_edge[cnode->n_out_edge - 1];
78589bec9e9SMax Filippov                         --cnode->n_out_edge;
78689bec9e9SMax Filippov                         goto again;
78789bec9e9SMax Filippov                     }
78889bec9e9SMax Filippov                 }
78989bec9e9SMax Filippov             }
79089bec9e9SMax Filippov         }
79189bec9e9SMax Filippov     }
79220e9fd0fSMax Filippov     return n_edge == 0;
79320e9fd0fSMax Filippov }
79420e9fd0fSMax Filippov 
79520e9fd0fSMax Filippov static void opcode_add_resource(struct slot_prop *op,
79620e9fd0fSMax Filippov                                 uint32_t resource, char direction,
79720e9fd0fSMax Filippov                                 int index)
79820e9fd0fSMax Filippov {
79920e9fd0fSMax Filippov     switch (direction) {
80020e9fd0fSMax Filippov     case 'm':
80120e9fd0fSMax Filippov     case 'i':
80220e9fd0fSMax Filippov         assert(op->n_in < ARRAY_SIZE(op->in));
80320e9fd0fSMax Filippov         op->in[op->n_in].resource = resource;
80420e9fd0fSMax Filippov         op->in[op->n_in].index = index;
80520e9fd0fSMax Filippov         ++op->n_in;
80620e9fd0fSMax Filippov         /* fall through */
80720e9fd0fSMax Filippov     case 'o':
80820e9fd0fSMax Filippov         if (direction == 'm' || direction == 'o') {
80920e9fd0fSMax Filippov             assert(op->n_out < ARRAY_SIZE(op->out));
81020e9fd0fSMax Filippov             op->out[op->n_out].resource = resource;
81120e9fd0fSMax Filippov             op->out[op->n_out].index = index;
81220e9fd0fSMax Filippov             ++op->n_out;
81320e9fd0fSMax Filippov         }
81420e9fd0fSMax Filippov         break;
81520e9fd0fSMax Filippov     default:
81620e9fd0fSMax Filippov         g_assert_not_reached();
81720e9fd0fSMax Filippov     }
81820e9fd0fSMax Filippov }
81920e9fd0fSMax Filippov 
82020e9fd0fSMax Filippov static int resource_compare(const void *a, const void *b)
82120e9fd0fSMax Filippov {
82220e9fd0fSMax Filippov     const struct opcode_arg_info *pa = a;
82320e9fd0fSMax Filippov     const struct opcode_arg_info *pb = b;
82420e9fd0fSMax Filippov 
82520e9fd0fSMax Filippov     return pa->resource < pb->resource ?
82620e9fd0fSMax Filippov         -1 : (pa->resource > pb->resource ? 1 : 0);
82720e9fd0fSMax Filippov }
82820e9fd0fSMax Filippov 
82989bec9e9SMax Filippov static int arg_copy_compare(const void *a, const void *b)
83089bec9e9SMax Filippov {
83189bec9e9SMax Filippov     const struct opcode_arg_copy *pa = a;
83289bec9e9SMax Filippov     const struct opcode_arg_copy *pb = b;
83389bec9e9SMax Filippov 
83489bec9e9SMax Filippov     return pa->resource < pb->resource ?
83589bec9e9SMax Filippov         -1 : (pa->resource > pb->resource ? 1 : 0);
83689bec9e9SMax Filippov }
83789bec9e9SMax Filippov 
838fcf5ef2aSThomas Huth static void disas_xtensa_insn(CPUXtensaState *env, DisasContext *dc)
839fcf5ef2aSThomas Huth {
84033071f68SMax Filippov     xtensa_isa isa = dc->config->isa;
8414e116893SIlya Leoshkevich     unsigned char b[MAX_INSN_LENGTH] = {translator_ldub(env, &dc->base,
8424e116893SIlya Leoshkevich                                                         dc->pc)};
84333071f68SMax Filippov     unsigned len = xtensa_op0_insn_len(dc, b[0]);
84433071f68SMax Filippov     xtensa_format fmt;
845847a6473SMax Filippov     int slot, slots;
84633071f68SMax Filippov     unsigned i;
84709460970SMax Filippov     uint32_t op_flags = 0;
84820e9fd0fSMax Filippov     struct slot_prop slot_prop[MAX_INSN_SLOTS];
84920e9fd0fSMax Filippov     struct slot_prop *ordered[MAX_INSN_SLOTS];
85089bec9e9SMax Filippov     struct opcode_arg_copy arg_copy[MAX_INSN_SLOTS * MAX_OPCODE_ARGS];
85189bec9e9SMax Filippov     unsigned n_arg_copy = 0;
85215477819SMax Filippov     uint32_t debug_cause = 0;
8536416d16fSMax Filippov     uint32_t windowed_register = 0;
854582fef0fSMax Filippov     uint32_t coprocessor = 0;
855fcf5ef2aSThomas Huth 
85633071f68SMax Filippov     if (len == XTENSA_UNDEFINED) {
85733071f68SMax Filippov         qemu_log_mask(LOG_GUEST_ERROR,
85833071f68SMax Filippov                       "unknown instruction length (pc = %08x)\n",
85933071f68SMax Filippov                       dc->pc);
86033071f68SMax Filippov         gen_exception_cause(dc, ILLEGAL_INSTRUCTION_CAUSE);
861f689befdSIlya Leoshkevich         dc->base.pc_next = dc->pc + 1;
86233071f68SMax Filippov         return;
863fcf5ef2aSThomas Huth     }
86433071f68SMax Filippov 
8653cc18eecSRichard Henderson     dc->base.pc_next = dc->pc + len;
86633071f68SMax Filippov     for (i = 1; i < len; ++i) {
8674e116893SIlya Leoshkevich         b[i] = translator_ldub(env, &dc->base, dc->pc + i);
868fcf5ef2aSThomas Huth     }
86933071f68SMax Filippov     xtensa_insnbuf_from_chars(isa, dc->insnbuf, b, len);
87033071f68SMax Filippov     fmt = xtensa_format_decode(isa, dc->insnbuf);
87133071f68SMax Filippov     if (fmt == XTENSA_UNDEFINED) {
87233071f68SMax Filippov         qemu_log_mask(LOG_GUEST_ERROR,
87333071f68SMax Filippov                       "unrecognized instruction format (pc = %08x)\n",
87433071f68SMax Filippov                       dc->pc);
875fcf5ef2aSThomas Huth         gen_exception_cause(dc, ILLEGAL_INSTRUCTION_CAUSE);
87633071f68SMax Filippov         return;
877fcf5ef2aSThomas Huth     }
87833071f68SMax Filippov     slots = xtensa_format_num_slots(isa, fmt);
87933071f68SMax Filippov     for (slot = 0; slot < slots; ++slot) {
88033071f68SMax Filippov         xtensa_opcode opc;
881847a6473SMax Filippov         int opnd, vopnd, opnds;
882b0b24bdcSMax Filippov         OpcodeArg *arg = slot_prop[slot].arg;
88333071f68SMax Filippov         XtensaOpcodeOps *ops;
884fcf5ef2aSThomas Huth 
88533071f68SMax Filippov         xtensa_format_get_slot(isa, fmt, slot, dc->insnbuf, dc->slotbuf);
88633071f68SMax Filippov         opc = xtensa_opcode_decode(isa, fmt, slot, dc->slotbuf);
88733071f68SMax Filippov         if (opc == XTENSA_UNDEFINED) {
88833071f68SMax Filippov             qemu_log_mask(LOG_GUEST_ERROR,
88933071f68SMax Filippov                           "unrecognized opcode in slot %d (pc = %08x)\n",
89033071f68SMax Filippov                           slot, dc->pc);
891fcf5ef2aSThomas Huth             gen_exception_cause(dc, ILLEGAL_INSTRUCTION_CAUSE);
89233071f68SMax Filippov             return;
893fcf5ef2aSThomas Huth         }
89433071f68SMax Filippov         opnds = xtensa_opcode_num_operands(isa, opc);
895fcf5ef2aSThomas Huth 
89633071f68SMax Filippov         for (opnd = vopnd = 0; opnd < opnds; ++opnd) {
897b0b24bdcSMax Filippov             void **register_file = NULL;
898ed07f685SMax Filippov             xtensa_regfile rf;
899b0b24bdcSMax Filippov 
900b0b24bdcSMax Filippov             if (xtensa_operand_is_register(isa, opc, opnd)) {
901ed07f685SMax Filippov                 rf = xtensa_operand_regfile(isa, opc, opnd);
902b0b24bdcSMax Filippov                 register_file = dc->config->regfile[rf];
903b0b24bdcSMax Filippov 
904b0b24bdcSMax Filippov                 if (rf == dc->config->a_regfile) {
905fe7869d6SMax Filippov                     uint32_t v;
906fe7869d6SMax Filippov 
907fe7869d6SMax Filippov                     xtensa_operand_get_field(isa, opc, opnd, fmt, slot,
908fe7869d6SMax Filippov                                              dc->slotbuf, &v);
909fe7869d6SMax Filippov                     xtensa_operand_decode(isa, opc, opnd, &v);
910fe7869d6SMax Filippov                     windowed_register |= 1u << v;
911fe7869d6SMax Filippov                 }
912b0b24bdcSMax Filippov             }
91333071f68SMax Filippov             if (xtensa_operand_is_visible(isa, opc, opnd)) {
91433071f68SMax Filippov                 uint32_t v;
915fcf5ef2aSThomas Huth 
91633071f68SMax Filippov                 xtensa_operand_get_field(isa, opc, opnd, fmt, slot,
91733071f68SMax Filippov                                          dc->slotbuf, &v);
91833071f68SMax Filippov                 xtensa_operand_decode(isa, opc, opnd, &v);
919b0b24bdcSMax Filippov                 arg[vopnd].raw_imm = v;
92033071f68SMax Filippov                 if (xtensa_operand_is_PCrelative(isa, opc, opnd)) {
92133071f68SMax Filippov                     xtensa_operand_undo_reloc(isa, opc, opnd, &v, dc->pc);
922fcf5ef2aSThomas Huth                 }
923b0b24bdcSMax Filippov                 arg[vopnd].imm = v;
924b0b24bdcSMax Filippov                 if (register_file) {
925b0b24bdcSMax Filippov                     arg[vopnd].in = register_file[v];
926b0b24bdcSMax Filippov                     arg[vopnd].out = register_file[v];
927ed07f685SMax Filippov                     arg[vopnd].num_bits = xtensa_regfile_num_bits(isa, rf);
928ed07f685SMax Filippov                 } else {
929ed07f685SMax Filippov                     arg[vopnd].num_bits = 32;
930b0b24bdcSMax Filippov                 }
93133071f68SMax Filippov                 ++vopnd;
932fcf5ef2aSThomas Huth             }
933fcf5ef2aSThomas Huth         }
93433071f68SMax Filippov         ops = dc->config->opcode_ops[opc];
93509460970SMax Filippov         slot_prop[slot].ops = ops;
93609460970SMax Filippov 
93733071f68SMax Filippov         if (ops) {
93809460970SMax Filippov             op_flags |= ops->op_flags;
93991dc2b2dSMax Filippov             if (ops->test_exceptions) {
94091dc2b2dSMax Filippov                 op_flags |= ops->test_exceptions(dc, arg, ops->par);
94191dc2b2dSMax Filippov             }
942fcf5ef2aSThomas Huth         } else {
94309460970SMax Filippov             qemu_log_mask(LOG_UNIMP,
94433071f68SMax Filippov                           "unimplemented opcode '%s' in slot %d (pc = %08x)\n",
94533071f68SMax Filippov                           xtensa_opcode_name(isa, opc), slot, dc->pc);
94609460970SMax Filippov             op_flags |= XTENSA_OP_ILL;
94709460970SMax Filippov         }
94891dc2b2dSMax Filippov         if (op_flags & XTENSA_OP_ILL) {
949fcf5ef2aSThomas Huth             gen_exception_cause(dc, ILLEGAL_INSTRUCTION_CAUSE);
95033071f68SMax Filippov             return;
951fcf5ef2aSThomas Huth         }
95291dc2b2dSMax Filippov         if (op_flags & XTENSA_OP_DEBUG_BREAK) {
95315477819SMax Filippov             debug_cause |= ops->par[0];
95415477819SMax Filippov         }
9556416d16fSMax Filippov         if (ops->test_overflow) {
9566416d16fSMax Filippov             windowed_register |= ops->test_overflow(dc, arg, ops->par);
9576416d16fSMax Filippov         }
958582fef0fSMax Filippov         coprocessor |= ops->coprocessor;
95920e9fd0fSMax Filippov 
96020e9fd0fSMax Filippov         if (slots > 1) {
96120e9fd0fSMax Filippov             slot_prop[slot].n_in = 0;
96220e9fd0fSMax Filippov             slot_prop[slot].n_out = 0;
963068e538aSMax Filippov             slot_prop[slot].op_flags = ops->op_flags & XTENSA_OP_LOAD_STORE;
96420e9fd0fSMax Filippov 
96520e9fd0fSMax Filippov             opnds = xtensa_opcode_num_operands(isa, opc);
96620e9fd0fSMax Filippov 
96720e9fd0fSMax Filippov             for (opnd = vopnd = 0; opnd < opnds; ++opnd) {
96820e9fd0fSMax Filippov                 bool visible = xtensa_operand_is_visible(isa, opc, opnd);
96920e9fd0fSMax Filippov 
97020e9fd0fSMax Filippov                 if (xtensa_operand_is_register(isa, opc, opnd)) {
97120e9fd0fSMax Filippov                     xtensa_regfile rf = xtensa_operand_regfile(isa, opc, opnd);
97220e9fd0fSMax Filippov                     uint32_t v = 0;
97320e9fd0fSMax Filippov 
97420e9fd0fSMax Filippov                     xtensa_operand_get_field(isa, opc, opnd, fmt, slot,
97520e9fd0fSMax Filippov                                              dc->slotbuf, &v);
97620e9fd0fSMax Filippov                     xtensa_operand_decode(isa, opc, opnd, &v);
97720e9fd0fSMax Filippov                     opcode_add_resource(slot_prop + slot,
97820e9fd0fSMax Filippov                                         encode_resource(RES_REGFILE, rf, v),
97920e9fd0fSMax Filippov                                         xtensa_operand_inout(isa, opc, opnd),
98020e9fd0fSMax Filippov                                         visible ? vopnd : -1);
98120e9fd0fSMax Filippov                 }
98220e9fd0fSMax Filippov                 if (visible) {
98320e9fd0fSMax Filippov                     ++vopnd;
98420e9fd0fSMax Filippov                 }
98520e9fd0fSMax Filippov             }
98620e9fd0fSMax Filippov 
98720e9fd0fSMax Filippov             opnds = xtensa_opcode_num_stateOperands(isa, opc);
98820e9fd0fSMax Filippov 
98920e9fd0fSMax Filippov             for (opnd = 0; opnd < opnds; ++opnd) {
99020e9fd0fSMax Filippov                 xtensa_state state = xtensa_stateOperand_state(isa, opc, opnd);
99120e9fd0fSMax Filippov 
99220e9fd0fSMax Filippov                 opcode_add_resource(slot_prop + slot,
99320e9fd0fSMax Filippov                                     encode_resource(RES_STATE, 0, state),
99420e9fd0fSMax Filippov                                     xtensa_stateOperand_inout(isa, opc, opnd),
99520e9fd0fSMax Filippov                                     -1);
99620e9fd0fSMax Filippov             }
99720e9fd0fSMax Filippov             if (xtensa_opcode_is_branch(isa, opc) ||
99820e9fd0fSMax Filippov                 xtensa_opcode_is_jump(isa, opc) ||
99920e9fd0fSMax Filippov                 xtensa_opcode_is_loop(isa, opc) ||
100020e9fd0fSMax Filippov                 xtensa_opcode_is_call(isa, opc)) {
100120e9fd0fSMax Filippov                 slot_prop[slot].op_flags |= XTENSA_OP_CONTROL_FLOW;
100220e9fd0fSMax Filippov             }
100320e9fd0fSMax Filippov 
100420e9fd0fSMax Filippov             qsort(slot_prop[slot].in, slot_prop[slot].n_in,
100520e9fd0fSMax Filippov                   sizeof(slot_prop[slot].in[0]), resource_compare);
100620e9fd0fSMax Filippov             qsort(slot_prop[slot].out, slot_prop[slot].n_out,
100720e9fd0fSMax Filippov                   sizeof(slot_prop[slot].out[0]), resource_compare);
100820e9fd0fSMax Filippov         }
100920e9fd0fSMax Filippov     }
101020e9fd0fSMax Filippov 
101120e9fd0fSMax Filippov     if (slots > 1) {
101289bec9e9SMax Filippov         if (!tsort(slot_prop, ordered, slots, arg_copy, &n_arg_copy)) {
101320e9fd0fSMax Filippov             qemu_log_mask(LOG_UNIMP,
101420e9fd0fSMax Filippov                           "Circular resource dependencies (pc = %08x)\n",
101520e9fd0fSMax Filippov                           dc->pc);
101620e9fd0fSMax Filippov             gen_exception_cause(dc, ILLEGAL_INSTRUCTION_CAUSE);
101720e9fd0fSMax Filippov             return;
101820e9fd0fSMax Filippov         }
101920e9fd0fSMax Filippov     } else {
102020e9fd0fSMax Filippov         ordered[0] = slot_prop + 0;
1021fcf5ef2aSThomas Huth     }
102209460970SMax Filippov 
102321a2dad5SMax Filippov     if ((op_flags & XTENSA_OP_PRIVILEGED) &&
102421a2dad5SMax Filippov         !gen_check_privilege(dc)) {
102521a2dad5SMax Filippov         return;
102621a2dad5SMax Filippov     }
102721a2dad5SMax Filippov 
10284c6ec5f3SMax Filippov     if (op_flags & XTENSA_OP_SYSCALL) {
10294c6ec5f3SMax Filippov         gen_exception_cause(dc, SYSCALL_CAUSE);
10304c6ec5f3SMax Filippov         return;
10314c6ec5f3SMax Filippov     }
10324c6ec5f3SMax Filippov 
103315477819SMax Filippov     if ((op_flags & XTENSA_OP_DEBUG_BREAK) && dc->debug) {
103415477819SMax Filippov         gen_debug_exception(dc, debug_cause);
103515477819SMax Filippov         return;
103615477819SMax Filippov     }
103715477819SMax Filippov 
10386416d16fSMax Filippov     if (windowed_register && !gen_window_check(dc, windowed_register)) {
10396416d16fSMax Filippov         return;
10406416d16fSMax Filippov     }
10416416d16fSMax Filippov 
1042f473019aSMax Filippov     if (op_flags & XTENSA_OP_UNDERFLOW) {
10436ade0ce9SMax Filippov         TCGv_i32 pc = tcg_constant_i32(dc->pc);
1044f473019aSMax Filippov 
10456ade0ce9SMax Filippov         gen_helper_test_underflow_retw(cpu_env, pc);
1046f473019aSMax Filippov     }
1047f473019aSMax Filippov 
104890d6494dSMax Filippov     if (op_flags & XTENSA_OP_ALLOCA) {
10496ade0ce9SMax Filippov         TCGv_i32 pc = tcg_constant_i32(dc->pc);
105090d6494dSMax Filippov 
10516ade0ce9SMax Filippov         gen_helper_movsp(cpu_env, pc);
105290d6494dSMax Filippov     }
105390d6494dSMax Filippov 
1054582fef0fSMax Filippov     if (coprocessor && !gen_check_cpenable(dc, coprocessor)) {
1055582fef0fSMax Filippov         return;
1056582fef0fSMax Filippov     }
1057582fef0fSMax Filippov 
105889bec9e9SMax Filippov     if (n_arg_copy) {
105989bec9e9SMax Filippov         uint32_t resource;
106089bec9e9SMax Filippov         void *temp;
106189bec9e9SMax Filippov         unsigned j;
106289bec9e9SMax Filippov 
106389bec9e9SMax Filippov         qsort(arg_copy, n_arg_copy, sizeof(*arg_copy), arg_copy_compare);
106489bec9e9SMax Filippov         for (i = j = 0; i < n_arg_copy; ++i) {
106589bec9e9SMax Filippov             if (i == 0 || arg_copy[i].resource != resource) {
106689bec9e9SMax Filippov                 resource = arg_copy[i].resource;
1067ed07f685SMax Filippov                 if (arg_copy[i].arg->num_bits <= 32) {
1068177bbc81SRichard Henderson                     temp = tcg_temp_new_i32();
106989bec9e9SMax Filippov                     tcg_gen_mov_i32(temp, arg_copy[i].arg->in);
1070ed07f685SMax Filippov                 } else if (arg_copy[i].arg->num_bits <= 64) {
1071177bbc81SRichard Henderson                     temp = tcg_temp_new_i64();
1072ed07f685SMax Filippov                     tcg_gen_mov_i64(temp, arg_copy[i].arg->in);
1073ed07f685SMax Filippov                 } else {
1074ed07f685SMax Filippov                     g_assert_not_reached();
1075ed07f685SMax Filippov                 }
107689bec9e9SMax Filippov                 arg_copy[i].temp = temp;
107789bec9e9SMax Filippov 
107889bec9e9SMax Filippov                 if (i != j) {
107989bec9e9SMax Filippov                     arg_copy[j] = arg_copy[i];
108089bec9e9SMax Filippov                 }
108189bec9e9SMax Filippov                 ++j;
108289bec9e9SMax Filippov             }
108389bec9e9SMax Filippov             arg_copy[i].arg->in = temp;
108489bec9e9SMax Filippov         }
108589bec9e9SMax Filippov         n_arg_copy = j;
108689bec9e9SMax Filippov     }
108789bec9e9SMax Filippov 
10884a038955SMax Filippov     if (op_flags & XTENSA_OP_DIVIDE_BY_ZERO) {
10894a038955SMax Filippov         for (slot = 0; slot < slots; ++slot) {
10904a038955SMax Filippov             if (slot_prop[slot].ops->op_flags & XTENSA_OP_DIVIDE_BY_ZERO) {
10914a038955SMax Filippov                 gen_zero_check(dc, slot_prop[slot].arg);
10924a038955SMax Filippov             }
10934a038955SMax Filippov         }
10944a038955SMax Filippov     }
10954a038955SMax Filippov 
109645b71a79SMax Filippov     dc->op_flags = op_flags;
109745b71a79SMax Filippov 
109809460970SMax Filippov     for (slot = 0; slot < slots; ++slot) {
109920e9fd0fSMax Filippov         struct slot_prop *pslot = ordered[slot];
110020e9fd0fSMax Filippov         XtensaOpcodeOps *ops = pslot->ops;
110109460970SMax Filippov 
110220e9fd0fSMax Filippov         ops->translate(dc, pslot->arg, ops->par);
110309460970SMax Filippov     }
1104226444a8SMax Filippov 
1105226444a8SMax Filippov     if (dc->base.is_jmp == DISAS_NEXT) {
110645b71a79SMax Filippov         gen_postprocess(dc, 0);
110745b71a79SMax Filippov         dc->op_flags = 0;
1108226444a8SMax Filippov         if (op_flags & XTENSA_OP_EXIT_TB_M1) {
1109226444a8SMax Filippov             /* Change in mmu index, memory mapping or tb->flags; exit tb */
1110226444a8SMax Filippov             gen_jumpi_check_loop_end(dc, -1);
1111bf525107SMax Filippov         } else if (op_flags & XTENSA_OP_EXIT_TB_0) {
1112bf525107SMax Filippov             gen_jumpi_check_loop_end(dc, 0);
111345b71a79SMax Filippov         } else {
1114fcf5ef2aSThomas Huth             gen_check_loop_end(dc, 0);
1115fcf5ef2aSThomas Huth         }
111645b71a79SMax Filippov     }
11173cc18eecSRichard Henderson     dc->pc = dc->base.pc_next;
1118fcf5ef2aSThomas Huth }
1119fcf5ef2aSThomas Huth 
1120fcf5ef2aSThomas Huth static inline unsigned xtensa_insn_len(CPUXtensaState *env, DisasContext *dc)
1121fcf5ef2aSThomas Huth {
1122fcf5ef2aSThomas Huth     uint8_t b0 = cpu_ldub_code(env, dc->pc);
112333071f68SMax Filippov     return xtensa_op0_insn_len(dc, b0);
1124fcf5ef2aSThomas Huth }
1125fcf5ef2aSThomas Huth 
1126fcf5ef2aSThomas Huth static void gen_ibreak_check(CPUXtensaState *env, DisasContext *dc)
1127fcf5ef2aSThomas Huth {
1128fcf5ef2aSThomas Huth     unsigned i;
1129fcf5ef2aSThomas Huth 
1130fcf5ef2aSThomas Huth     for (i = 0; i < dc->config->nibreak; ++i) {
1131fcf5ef2aSThomas Huth         if ((env->sregs[IBREAKENABLE] & (1 << i)) &&
1132fcf5ef2aSThomas Huth                 env->sregs[IBREAKA + i] == dc->pc) {
1133fcf5ef2aSThomas Huth             gen_debug_exception(dc, DEBUGCAUSE_IB);
1134fcf5ef2aSThomas Huth             break;
1135fcf5ef2aSThomas Huth         }
1136fcf5ef2aSThomas Huth     }
1137fcf5ef2aSThomas Huth }
1138fcf5ef2aSThomas Huth 
11399c509ff9SRichard Henderson static void xtensa_tr_init_disas_context(DisasContextBase *dcbase,
11409c509ff9SRichard Henderson                                          CPUState *cpu)
1141fcf5ef2aSThomas Huth {
11429c509ff9SRichard Henderson     DisasContext *dc = container_of(dcbase, DisasContext, base);
11439c509ff9SRichard Henderson     CPUXtensaState *env = cpu->env_ptr;
11449c509ff9SRichard Henderson     uint32_t tb_flags = dc->base.tb->flags;
1145fcf5ef2aSThomas Huth 
11461d38a701SRichard Henderson     dc->config = env->config;
11479c509ff9SRichard Henderson     dc->pc = dc->base.pc_first;
11489c509ff9SRichard Henderson     dc->ring = tb_flags & XTENSA_TBFLAG_RING_MASK;
11499c509ff9SRichard Henderson     dc->cring = (tb_flags & XTENSA_TBFLAG_EXCM) ? 0 : dc->ring;
11505d630cefSMax Filippov     dc->lbeg_off = (dc->base.tb->cs_base & XTENSA_CSBASE_LBEG_OFF_MASK) >>
11515d630cefSMax Filippov         XTENSA_CSBASE_LBEG_OFF_SHIFT;
11525d630cefSMax Filippov     dc->lend = (dc->base.tb->cs_base & XTENSA_CSBASE_LEND_MASK) +
11535d630cefSMax Filippov         (dc->base.pc_first & TARGET_PAGE_MASK);
11549c509ff9SRichard Henderson     dc->debug = tb_flags & XTENSA_TBFLAG_DEBUG;
11559c509ff9SRichard Henderson     dc->icount = tb_flags & XTENSA_TBFLAG_ICOUNT;
11569c509ff9SRichard Henderson     dc->cpenable = (tb_flags & XTENSA_TBFLAG_CPENABLE_MASK) >>
1157fcf5ef2aSThomas Huth         XTENSA_TBFLAG_CPENABLE_SHIFT;
11589c509ff9SRichard Henderson     dc->window = ((tb_flags & XTENSA_TBFLAG_WINDOW_MASK) >>
1159fcf5ef2aSThomas Huth                  XTENSA_TBFLAG_WINDOW_SHIFT);
116009460970SMax Filippov     dc->cwoe = tb_flags & XTENSA_TBFLAG_CWOE;
11616416d16fSMax Filippov     dc->callinc = ((tb_flags & XTENSA_TBFLAG_CALLINC_MASK) >>
11626416d16fSMax Filippov                    XTENSA_TBFLAG_CALLINC_SHIFT);
11631d38a701SRichard Henderson     init_sar_tracker(dc);
11649c509ff9SRichard Henderson }
11659c509ff9SRichard Henderson 
11669c509ff9SRichard Henderson static void xtensa_tr_tb_start(DisasContextBase *dcbase, CPUState *cpu)
11679c509ff9SRichard Henderson {
11689c509ff9SRichard Henderson     DisasContext *dc = container_of(dcbase, DisasContext, base);
11699c509ff9SRichard Henderson 
11701d38a701SRichard Henderson     if (dc->icount) {
1171177bbc81SRichard Henderson         dc->next_icount = tcg_temp_new_i32();
1172fcf5ef2aSThomas Huth     }
1173fcf5ef2aSThomas Huth }
1174fcf5ef2aSThomas Huth 
11759c509ff9SRichard Henderson static void xtensa_tr_insn_start(DisasContextBase *dcbase, CPUState *cpu)
11769c509ff9SRichard Henderson {
11779c509ff9SRichard Henderson     tcg_gen_insn_start(dcbase->pc_next);
11789c509ff9SRichard Henderson }
1179fcf5ef2aSThomas Huth 
11809c509ff9SRichard Henderson static void xtensa_tr_translate_insn(DisasContextBase *dcbase, CPUState *cpu)
11819c509ff9SRichard Henderson {
11829c509ff9SRichard Henderson     DisasContext *dc = container_of(dcbase, DisasContext, base);
11839c509ff9SRichard Henderson     CPUXtensaState *env = cpu->env_ptr;
11849c509ff9SRichard Henderson     target_ulong page_start;
11859c509ff9SRichard Henderson 
11869c509ff9SRichard Henderson     /* These two conditions only apply to the first insn in the TB,
11879c509ff9SRichard Henderson        but this is the first TranslateOps hook that allows exiting.  */
11889c509ff9SRichard Henderson     if ((tb_cflags(dc->base.tb) & CF_USE_ICOUNT)
11899c509ff9SRichard Henderson         && (dc->base.tb->flags & XTENSA_TBFLAG_YIELD)) {
11909c509ff9SRichard Henderson         gen_exception(dc, EXCP_YIELD);
1191f689befdSIlya Leoshkevich         dc->base.pc_next = dc->pc + 1;
11929c509ff9SRichard Henderson         dc->base.is_jmp = DISAS_NORETURN;
11939c509ff9SRichard Henderson         return;
11949c509ff9SRichard Henderson     }
1195fcf5ef2aSThomas Huth 
11961d38a701SRichard Henderson     if (dc->icount) {
1197fcf5ef2aSThomas Huth         TCGLabel *label = gen_new_label();
1198fcf5ef2aSThomas Huth 
11991d38a701SRichard Henderson         tcg_gen_addi_i32(dc->next_icount, cpu_SR[ICOUNT], 1);
12001d38a701SRichard Henderson         tcg_gen_brcondi_i32(TCG_COND_NE, dc->next_icount, 0, label);
12011d38a701SRichard Henderson         tcg_gen_mov_i32(dc->next_icount, cpu_SR[ICOUNT]);
12021d38a701SRichard Henderson         if (dc->debug) {
12031d38a701SRichard Henderson             gen_debug_exception(dc, DEBUGCAUSE_IC);
1204fcf5ef2aSThomas Huth         }
1205fcf5ef2aSThomas Huth         gen_set_label(label);
1206fcf5ef2aSThomas Huth     }
1207fcf5ef2aSThomas Huth 
12081d38a701SRichard Henderson     if (dc->debug) {
12091d38a701SRichard Henderson         gen_ibreak_check(env, dc);
1210fcf5ef2aSThomas Huth     }
1211fcf5ef2aSThomas Huth 
12121d38a701SRichard Henderson     disas_xtensa_insn(env, dc);
12139c509ff9SRichard Henderson 
12141d38a701SRichard Henderson     if (dc->icount) {
12151d38a701SRichard Henderson         tcg_gen_mov_i32(cpu_SR[ICOUNT], dc->next_icount);
1216fcf5ef2aSThomas Huth     }
12179c509ff9SRichard Henderson 
12189c509ff9SRichard Henderson     /* End the TB if the next insn will cross into the next page.  */
12199c509ff9SRichard Henderson     page_start = dc->base.pc_first & TARGET_PAGE_MASK;
12209c509ff9SRichard Henderson     if (dc->base.is_jmp == DISAS_NEXT &&
12219c509ff9SRichard Henderson         (dc->pc - page_start >= TARGET_PAGE_SIZE ||
12229c509ff9SRichard Henderson          dc->pc - page_start + xtensa_insn_len(env, dc) > TARGET_PAGE_SIZE)) {
12239c509ff9SRichard Henderson         dc->base.is_jmp = DISAS_TOO_MANY;
1224fcf5ef2aSThomas Huth     }
12259c509ff9SRichard Henderson }
12269c509ff9SRichard Henderson 
12279c509ff9SRichard Henderson static void xtensa_tr_tb_stop(DisasContextBase *dcbase, CPUState *cpu)
12289c509ff9SRichard Henderson {
12299c509ff9SRichard Henderson     DisasContext *dc = container_of(dcbase, DisasContext, base);
12309c509ff9SRichard Henderson 
12319c509ff9SRichard Henderson     switch (dc->base.is_jmp) {
12329c509ff9SRichard Henderson     case DISAS_NORETURN:
12339c509ff9SRichard Henderson         break;
12349c509ff9SRichard Henderson     case DISAS_TOO_MANY:
12351d38a701SRichard Henderson         gen_jumpi(dc, dc->pc, 0);
12369c509ff9SRichard Henderson         break;
12379c509ff9SRichard Henderson     default:
12389c509ff9SRichard Henderson         g_assert_not_reached();
1239fcf5ef2aSThomas Huth     }
12409c509ff9SRichard Henderson }
12419c509ff9SRichard Henderson 
12428eb806a7SRichard Henderson static void xtensa_tr_disas_log(const DisasContextBase *dcbase,
12438eb806a7SRichard Henderson                                 CPUState *cpu, FILE *logfile)
12449c509ff9SRichard Henderson {
12458eb806a7SRichard Henderson     fprintf(logfile, "IN: %s\n", lookup_symbol(dcbase->pc_first));
12468eb806a7SRichard Henderson     target_disas(logfile, cpu, dcbase->pc_first, dcbase->tb->size);
12479c509ff9SRichard Henderson }
12489c509ff9SRichard Henderson 
12499c509ff9SRichard Henderson static const TranslatorOps xtensa_translator_ops = {
12509c509ff9SRichard Henderson     .init_disas_context = xtensa_tr_init_disas_context,
12519c509ff9SRichard Henderson     .tb_start           = xtensa_tr_tb_start,
12529c509ff9SRichard Henderson     .insn_start         = xtensa_tr_insn_start,
12539c509ff9SRichard Henderson     .translate_insn     = xtensa_tr_translate_insn,
12549c509ff9SRichard Henderson     .tb_stop            = xtensa_tr_tb_stop,
12559c509ff9SRichard Henderson     .disas_log          = xtensa_tr_disas_log,
12569c509ff9SRichard Henderson };
12579c509ff9SRichard Henderson 
1258597f9b2dSRichard Henderson void gen_intermediate_code(CPUState *cpu, TranslationBlock *tb, int *max_insns,
1259306c8721SRichard Henderson                            target_ulong pc, void *host_pc)
12609c509ff9SRichard Henderson {
12619c509ff9SRichard Henderson     DisasContext dc = {};
1262306c8721SRichard Henderson     translator_loop(cpu, tb, max_insns, pc, host_pc,
1263306c8721SRichard Henderson                     &xtensa_translator_ops, &dc.base);
1264fcf5ef2aSThomas Huth }
1265fcf5ef2aSThomas Huth 
126690c84c56SMarkus Armbruster void xtensa_cpu_dump_state(CPUState *cs, FILE *f, int flags)
1267fcf5ef2aSThomas Huth {
1268fcf5ef2aSThomas Huth     XtensaCPU *cpu = XTENSA_CPU(cs);
1269fcf5ef2aSThomas Huth     CPUXtensaState *env = &cpu->env;
127059419607SMax Filippov     xtensa_isa isa = env->config->isa;
1271fcf5ef2aSThomas Huth     int i, j;
1272fcf5ef2aSThomas Huth 
127390c84c56SMarkus Armbruster     qemu_fprintf(f, "PC=%08x\n\n", env->pc);
1274fcf5ef2aSThomas Huth 
127559419607SMax Filippov     for (i = j = 0; i < xtensa_isa_num_sysregs(isa); ++i) {
127659419607SMax Filippov         const uint32_t *reg =
127759419607SMax Filippov             xtensa_sysreg_is_user(isa, i) ? env->uregs : env->sregs;
127859419607SMax Filippov         int regno = xtensa_sysreg_number(isa, i);
127959419607SMax Filippov 
128059419607SMax Filippov         if (regno >= 0) {
128190c84c56SMarkus Armbruster             qemu_fprintf(f, "%12s=%08x%c",
128259419607SMax Filippov                          xtensa_sysreg_name(isa, i),
128359419607SMax Filippov                          reg[regno],
1284fcf5ef2aSThomas Huth                          (j++ % 4) == 3 ? '\n' : ' ');
1285fcf5ef2aSThomas Huth         }
1286fcf5ef2aSThomas Huth     }
1287fcf5ef2aSThomas Huth 
128890c84c56SMarkus Armbruster     qemu_fprintf(f, (j % 4) == 0 ? "\n" : "\n\n");
1289fcf5ef2aSThomas Huth 
1290fcf5ef2aSThomas Huth     for (i = 0; i < 16; ++i) {
129190c84c56SMarkus Armbruster         qemu_fprintf(f, " A%02d=%08x%c",
129290c84c56SMarkus Armbruster                      i, env->regs[i], (i % 4) == 3 ? '\n' : ' ');
1293fcf5ef2aSThomas Huth     }
1294fcf5ef2aSThomas Huth 
1295b55b1afdSMax Filippov     xtensa_sync_phys_from_window(env);
129690c84c56SMarkus Armbruster     qemu_fprintf(f, "\n");
1297fcf5ef2aSThomas Huth 
1298fcf5ef2aSThomas Huth     for (i = 0; i < env->config->nareg; ++i) {
129990c84c56SMarkus Armbruster         qemu_fprintf(f, "AR%02d=%08x ", i, env->phys_regs[i]);
1300b9317a2aSMax Filippov         if (i % 4 == 3) {
1301b9317a2aSMax Filippov             bool ws = (env->sregs[WINDOW_START] & (1 << (i / 4))) != 0;
1302b9317a2aSMax Filippov             bool cw = env->sregs[WINDOW_BASE] == i / 4;
1303b9317a2aSMax Filippov 
130490c84c56SMarkus Armbruster             qemu_fprintf(f, "%c%c\n", ws ? '<' : ' ', cw ? '=' : ' ');
1305b9317a2aSMax Filippov         }
1306fcf5ef2aSThomas Huth     }
1307fcf5ef2aSThomas Huth 
1308f29c0b17SRichard Henderson     if ((flags & CPU_DUMP_FPU) &&
1309f29c0b17SRichard Henderson         xtensa_option_enabled(env->config, XTENSA_OPTION_FP_COPROCESSOR)) {
131090c84c56SMarkus Armbruster         qemu_fprintf(f, "\n");
1311fcf5ef2aSThomas Huth 
1312fcf5ef2aSThomas Huth         for (i = 0; i < 16; ++i) {
1313cfa9f051SMax Filippov             qemu_fprintf(f, "F%02d=%08x (%-+15.8e)%c", i,
1314fcf5ef2aSThomas Huth                          float32_val(env->fregs[i].f32[FP_F32_LOW]),
1315fcf5ef2aSThomas Huth                          *(float *)(env->fregs[i].f32 + FP_F32_LOW),
1316fcf5ef2aSThomas Huth                          (i % 2) == 1 ? '\n' : ' ');
1317fcf5ef2aSThomas Huth         }
1318fcf5ef2aSThomas Huth     }
1319cfa9f051SMax Filippov 
1320cfa9f051SMax Filippov     if ((flags & CPU_DUMP_FPU) &&
1321cfa9f051SMax Filippov         xtensa_option_enabled(env->config, XTENSA_OPTION_DFP_COPROCESSOR) &&
1322cfa9f051SMax Filippov         !xtensa_option_enabled(env->config, XTENSA_OPTION_DFPU_SINGLE_ONLY)) {
1323cfa9f051SMax Filippov         qemu_fprintf(f, "\n");
1324cfa9f051SMax Filippov 
1325cfa9f051SMax Filippov         for (i = 0; i < 16; ++i) {
1326cfa9f051SMax Filippov             qemu_fprintf(f, "F%02d=%016"PRIx64" (%-+24.16le)%c", i,
1327cfa9f051SMax Filippov                          float64_val(env->fregs[i].f64),
1328cfa9f051SMax Filippov                          *(double *)(&env->fregs[i].f64),
1329cfa9f051SMax Filippov                          (i % 2) == 1 ? '\n' : ' ');
1330cfa9f051SMax Filippov         }
1331cfa9f051SMax Filippov     }
1332fcf5ef2aSThomas Huth }
1333fcf5ef2aSThomas Huth 
1334b0b24bdcSMax Filippov static void translate_abs(DisasContext *dc, const OpcodeArg arg[],
1335168c12b0SMax Filippov                           const uint32_t par[])
1336168c12b0SMax Filippov {
1337e1c47865SRichard Henderson     tcg_gen_abs_i32(arg[0].out, arg[1].in);
1338168c12b0SMax Filippov }
1339168c12b0SMax Filippov 
1340b0b24bdcSMax Filippov static void translate_add(DisasContext *dc, const OpcodeArg arg[],
1341168c12b0SMax Filippov                           const uint32_t par[])
1342168c12b0SMax Filippov {
1343b0b24bdcSMax Filippov     tcg_gen_add_i32(arg[0].out, arg[1].in, arg[2].in);
1344168c12b0SMax Filippov }
1345168c12b0SMax Filippov 
1346b0b24bdcSMax Filippov static void translate_addi(DisasContext *dc, const OpcodeArg arg[],
1347168c12b0SMax Filippov                            const uint32_t par[])
1348168c12b0SMax Filippov {
1349b0b24bdcSMax Filippov     tcg_gen_addi_i32(arg[0].out, arg[1].in, arg[2].imm);
1350168c12b0SMax Filippov }
1351168c12b0SMax Filippov 
1352b0b24bdcSMax Filippov static void translate_addx(DisasContext *dc, const OpcodeArg arg[],
1353168c12b0SMax Filippov                            const uint32_t par[])
1354168c12b0SMax Filippov {
1355168c12b0SMax Filippov     TCGv_i32 tmp = tcg_temp_new_i32();
1356b0b24bdcSMax Filippov     tcg_gen_shli_i32(tmp, arg[1].in, par[0]);
1357b0b24bdcSMax Filippov     tcg_gen_add_i32(arg[0].out, tmp, arg[2].in);
1358168c12b0SMax Filippov }
1359168c12b0SMax Filippov 
1360b0b24bdcSMax Filippov static void translate_all(DisasContext *dc, const OpcodeArg arg[],
1361168c12b0SMax Filippov                           const uint32_t par[])
1362168c12b0SMax Filippov {
1363168c12b0SMax Filippov     uint32_t shift = par[1];
1364b0b24bdcSMax Filippov     TCGv_i32 mask = tcg_const_i32(((1 << shift) - 1) << arg[1].imm);
1365168c12b0SMax Filippov     TCGv_i32 tmp = tcg_temp_new_i32();
1366168c12b0SMax Filippov 
1367575e962aSMax Filippov     tcg_gen_and_i32(tmp, arg[1].in, mask);
1368168c12b0SMax Filippov     if (par[0]) {
1369b0b24bdcSMax Filippov         tcg_gen_addi_i32(tmp, tmp, 1 << arg[1].imm);
1370168c12b0SMax Filippov     } else {
1371168c12b0SMax Filippov         tcg_gen_add_i32(tmp, tmp, mask);
1372168c12b0SMax Filippov     }
1373b0b24bdcSMax Filippov     tcg_gen_shri_i32(tmp, tmp, arg[1].imm + shift);
1374575e962aSMax Filippov     tcg_gen_deposit_i32(arg[0].out, arg[0].out,
1375b0b24bdcSMax Filippov                         tmp, arg[0].imm, 1);
1376168c12b0SMax Filippov }
1377168c12b0SMax Filippov 
1378b0b24bdcSMax Filippov static void translate_and(DisasContext *dc, const OpcodeArg arg[],
1379168c12b0SMax Filippov                           const uint32_t par[])
1380168c12b0SMax Filippov {
1381b0b24bdcSMax Filippov     tcg_gen_and_i32(arg[0].out, arg[1].in, arg[2].in);
1382168c12b0SMax Filippov }
1383168c12b0SMax Filippov 
1384b0b24bdcSMax Filippov static void translate_ball(DisasContext *dc, const OpcodeArg arg[],
1385168c12b0SMax Filippov                            const uint32_t par[])
1386168c12b0SMax Filippov {
1387168c12b0SMax Filippov     TCGv_i32 tmp = tcg_temp_new_i32();
1388b0b24bdcSMax Filippov     tcg_gen_and_i32(tmp, arg[0].in, arg[1].in);
1389b0b24bdcSMax Filippov     gen_brcond(dc, par[0], tmp, arg[1].in, arg[2].imm);
1390168c12b0SMax Filippov }
1391168c12b0SMax Filippov 
1392b0b24bdcSMax Filippov static void translate_bany(DisasContext *dc, const OpcodeArg arg[],
1393168c12b0SMax Filippov                            const uint32_t par[])
1394168c12b0SMax Filippov {
1395168c12b0SMax Filippov     TCGv_i32 tmp = tcg_temp_new_i32();
1396b0b24bdcSMax Filippov     tcg_gen_and_i32(tmp, arg[0].in, arg[1].in);
1397b0b24bdcSMax Filippov     gen_brcondi(dc, par[0], tmp, 0, arg[2].imm);
1398168c12b0SMax Filippov }
1399168c12b0SMax Filippov 
1400b0b24bdcSMax Filippov static void translate_b(DisasContext *dc, const OpcodeArg arg[],
1401168c12b0SMax Filippov                         const uint32_t par[])
1402168c12b0SMax Filippov {
1403b0b24bdcSMax Filippov     gen_brcond(dc, par[0], arg[0].in, arg[1].in, arg[2].imm);
1404168c12b0SMax Filippov }
1405168c12b0SMax Filippov 
1406b0b24bdcSMax Filippov static void translate_bb(DisasContext *dc, const OpcodeArg arg[],
1407168c12b0SMax Filippov                          const uint32_t par[])
1408168c12b0SMax Filippov {
1409168c12b0SMax Filippov     TCGv_i32 tmp = tcg_temp_new_i32();
1410*37d7328eSRichard Henderson 
1411b0b24bdcSMax Filippov     tcg_gen_andi_i32(tmp, arg[1].in, 0x1f);
1412*37d7328eSRichard Henderson     if (TARGET_BIG_ENDIAN) {
1413*37d7328eSRichard Henderson         tcg_gen_shr_i32(tmp, tcg_constant_i32(0x80000000u), tmp);
1414*37d7328eSRichard Henderson     } else {
1415*37d7328eSRichard Henderson         tcg_gen_shl_i32(tmp, tcg_constant_i32(0x00000001u), tmp);
1416*37d7328eSRichard Henderson     }
1417*37d7328eSRichard Henderson     tcg_gen_and_i32(tmp, arg[0].in, tmp);
1418b0b24bdcSMax Filippov     gen_brcondi(dc, par[0], tmp, 0, arg[2].imm);
1419168c12b0SMax Filippov }
1420168c12b0SMax Filippov 
1421b0b24bdcSMax Filippov static void translate_bbi(DisasContext *dc, const OpcodeArg arg[],
1422168c12b0SMax Filippov                           const uint32_t par[])
1423168c12b0SMax Filippov {
1424168c12b0SMax Filippov     TCGv_i32 tmp = tcg_temp_new_i32();
1425ee3eb3a7SMarc-André Lureau #if TARGET_BIG_ENDIAN
1426b0b24bdcSMax Filippov     tcg_gen_andi_i32(tmp, arg[0].in, 0x80000000u >> arg[1].imm);
1427168c12b0SMax Filippov #else
1428b0b24bdcSMax Filippov     tcg_gen_andi_i32(tmp, arg[0].in, 0x00000001u << arg[1].imm);
1429168c12b0SMax Filippov #endif
1430b0b24bdcSMax Filippov     gen_brcondi(dc, par[0], tmp, 0, arg[2].imm);
1431168c12b0SMax Filippov }
1432168c12b0SMax Filippov 
1433b0b24bdcSMax Filippov static void translate_bi(DisasContext *dc, const OpcodeArg arg[],
1434168c12b0SMax Filippov                          const uint32_t par[])
1435168c12b0SMax Filippov {
1436b0b24bdcSMax Filippov     gen_brcondi(dc, par[0], arg[0].in, arg[1].imm, arg[2].imm);
1437168c12b0SMax Filippov }
1438168c12b0SMax Filippov 
1439b0b24bdcSMax Filippov static void translate_bz(DisasContext *dc, const OpcodeArg arg[],
1440168c12b0SMax Filippov                          const uint32_t par[])
1441168c12b0SMax Filippov {
1442b0b24bdcSMax Filippov     gen_brcondi(dc, par[0], arg[0].in, 0, arg[1].imm);
1443168c12b0SMax Filippov }
1444168c12b0SMax Filippov 
1445168c12b0SMax Filippov enum {
1446168c12b0SMax Filippov     BOOLEAN_AND,
1447168c12b0SMax Filippov     BOOLEAN_ANDC,
1448168c12b0SMax Filippov     BOOLEAN_OR,
1449168c12b0SMax Filippov     BOOLEAN_ORC,
1450168c12b0SMax Filippov     BOOLEAN_XOR,
1451168c12b0SMax Filippov };
1452168c12b0SMax Filippov 
1453b0b24bdcSMax Filippov static void translate_boolean(DisasContext *dc, const OpcodeArg arg[],
1454168c12b0SMax Filippov                               const uint32_t par[])
1455168c12b0SMax Filippov {
1456168c12b0SMax Filippov     static void (* const op[])(TCGv_i32, TCGv_i32, TCGv_i32) = {
1457168c12b0SMax Filippov         [BOOLEAN_AND] = tcg_gen_and_i32,
1458168c12b0SMax Filippov         [BOOLEAN_ANDC] = tcg_gen_andc_i32,
1459168c12b0SMax Filippov         [BOOLEAN_OR] = tcg_gen_or_i32,
1460168c12b0SMax Filippov         [BOOLEAN_ORC] = tcg_gen_orc_i32,
1461168c12b0SMax Filippov         [BOOLEAN_XOR] = tcg_gen_xor_i32,
1462168c12b0SMax Filippov     };
1463168c12b0SMax Filippov 
1464168c12b0SMax Filippov     TCGv_i32 tmp1 = tcg_temp_new_i32();
1465168c12b0SMax Filippov     TCGv_i32 tmp2 = tcg_temp_new_i32();
1466168c12b0SMax Filippov 
1467575e962aSMax Filippov     tcg_gen_shri_i32(tmp1, arg[1].in, arg[1].imm);
1468575e962aSMax Filippov     tcg_gen_shri_i32(tmp2, arg[2].in, arg[2].imm);
1469168c12b0SMax Filippov     op[par[0]](tmp1, tmp1, tmp2);
1470575e962aSMax Filippov     tcg_gen_deposit_i32(arg[0].out, arg[0].out, tmp1, arg[0].imm, 1);
1471168c12b0SMax Filippov }
1472168c12b0SMax Filippov 
1473b0b24bdcSMax Filippov static void translate_bp(DisasContext *dc, const OpcodeArg arg[],
1474168c12b0SMax Filippov                          const uint32_t par[])
1475168c12b0SMax Filippov {
1476168c12b0SMax Filippov     TCGv_i32 tmp = tcg_temp_new_i32();
1477168c12b0SMax Filippov 
1478575e962aSMax Filippov     tcg_gen_andi_i32(tmp, arg[0].in, 1 << arg[0].imm);
1479b0b24bdcSMax Filippov     gen_brcondi(dc, par[0], tmp, 0, arg[1].imm);
1480168c12b0SMax Filippov }
1481168c12b0SMax Filippov 
1482b0b24bdcSMax Filippov static void translate_call0(DisasContext *dc, const OpcodeArg arg[],
1483168c12b0SMax Filippov                             const uint32_t par[])
1484168c12b0SMax Filippov {
14853cc18eecSRichard Henderson     tcg_gen_movi_i32(cpu_R[0], dc->base.pc_next);
1486b0b24bdcSMax Filippov     gen_jumpi(dc, arg[0].imm, 0);
1487168c12b0SMax Filippov }
1488168c12b0SMax Filippov 
1489b0b24bdcSMax Filippov static void translate_callw(DisasContext *dc, const OpcodeArg arg[],
1490168c12b0SMax Filippov                             const uint32_t par[])
1491168c12b0SMax Filippov {
1492b0b24bdcSMax Filippov     TCGv_i32 tmp = tcg_const_i32(arg[0].imm);
1493b0b24bdcSMax Filippov     gen_callw_slot(dc, par[0], tmp, adjust_jump_slot(dc, arg[0].imm, 0));
1494168c12b0SMax Filippov }
1495168c12b0SMax Filippov 
1496b0b24bdcSMax Filippov static void translate_callx0(DisasContext *dc, const OpcodeArg arg[],
1497168c12b0SMax Filippov                              const uint32_t par[])
1498168c12b0SMax Filippov {
1499168c12b0SMax Filippov     TCGv_i32 tmp = tcg_temp_new_i32();
1500b0b24bdcSMax Filippov     tcg_gen_mov_i32(tmp, arg[0].in);
15013cc18eecSRichard Henderson     tcg_gen_movi_i32(cpu_R[0], dc->base.pc_next);
1502168c12b0SMax Filippov     gen_jump(dc, tmp);
1503168c12b0SMax Filippov }
1504168c12b0SMax Filippov 
1505b0b24bdcSMax Filippov static void translate_callxw(DisasContext *dc, const OpcodeArg arg[],
1506168c12b0SMax Filippov                              const uint32_t par[])
1507168c12b0SMax Filippov {
1508168c12b0SMax Filippov     TCGv_i32 tmp = tcg_temp_new_i32();
1509168c12b0SMax Filippov 
1510b0b24bdcSMax Filippov     tcg_gen_mov_i32(tmp, arg[0].in);
15119791e7e9SMax Filippov     gen_callw_slot(dc, par[0], tmp, -1);
1512168c12b0SMax Filippov }
1513168c12b0SMax Filippov 
1514b0b24bdcSMax Filippov static void translate_clamps(DisasContext *dc, const OpcodeArg arg[],
1515168c12b0SMax Filippov                              const uint32_t par[])
1516168c12b0SMax Filippov {
1517b0b24bdcSMax Filippov     TCGv_i32 tmp1 = tcg_const_i32(-1u << arg[2].imm);
1518b0b24bdcSMax Filippov     TCGv_i32 tmp2 = tcg_const_i32((1 << arg[2].imm) - 1);
1519168c12b0SMax Filippov 
1520b0b24bdcSMax Filippov     tcg_gen_smax_i32(tmp1, tmp1, arg[1].in);
1521b0b24bdcSMax Filippov     tcg_gen_smin_i32(arg[0].out, tmp1, tmp2);
1522168c12b0SMax Filippov }
1523168c12b0SMax Filippov 
1524b0b24bdcSMax Filippov static void translate_clrb_expstate(DisasContext *dc, const OpcodeArg arg[],
1525e9872741SMax Filippov                                     const uint32_t par[])
1526e9872741SMax Filippov {
1527e9872741SMax Filippov     /* TODO: GPIO32 may be a part of coprocessor */
1528b0b24bdcSMax Filippov     tcg_gen_andi_i32(cpu_UR[EXPSTATE], cpu_UR[EXPSTATE], ~(1u << arg[0].imm));
1529e9872741SMax Filippov }
1530e9872741SMax Filippov 
1531b345e140SMax Filippov static void translate_clrex(DisasContext *dc, const OpcodeArg arg[],
1532b345e140SMax Filippov                             const uint32_t par[])
1533b345e140SMax Filippov {
1534b345e140SMax Filippov     tcg_gen_movi_i32(cpu_exclusive_addr, -1);
1535b345e140SMax Filippov }
1536b345e140SMax Filippov 
1537b0b24bdcSMax Filippov static void translate_const16(DisasContext *dc, const OpcodeArg arg[],
1538c5ac936eSMax Filippov                              const uint32_t par[])
1539c5ac936eSMax Filippov {
1540b0b24bdcSMax Filippov     TCGv_i32 c = tcg_const_i32(arg[1].imm);
1541c5ac936eSMax Filippov 
1542b0b24bdcSMax Filippov     tcg_gen_deposit_i32(arg[0].out, c, arg[0].in, 16, 16);
1543c5ac936eSMax Filippov }
1544c5ac936eSMax Filippov 
1545b0b24bdcSMax Filippov static void translate_dcache(DisasContext *dc, const OpcodeArg arg[],
1546168c12b0SMax Filippov                              const uint32_t par[])
1547168c12b0SMax Filippov {
1548168c12b0SMax Filippov     TCGv_i32 addr = tcg_temp_new_i32();
1549168c12b0SMax Filippov     TCGv_i32 res = tcg_temp_new_i32();
1550168c12b0SMax Filippov 
1551b0b24bdcSMax Filippov     tcg_gen_addi_i32(addr, arg[0].in, arg[1].imm);
1552168c12b0SMax Filippov     tcg_gen_qemu_ld8u(res, addr, dc->cring);
1553168c12b0SMax Filippov }
1554168c12b0SMax Filippov 
1555b0b24bdcSMax Filippov static void translate_depbits(DisasContext *dc, const OpcodeArg arg[],
1556168c12b0SMax Filippov                               const uint32_t par[])
1557168c12b0SMax Filippov {
1558b0b24bdcSMax Filippov     tcg_gen_deposit_i32(arg[1].out, arg[1].in, arg[0].in,
1559b0b24bdcSMax Filippov                         arg[2].imm, arg[3].imm);
1560168c12b0SMax Filippov }
1561168c12b0SMax Filippov 
156275eed0e5SMax Filippov static void translate_diwbuip(DisasContext *dc, const OpcodeArg arg[],
156375eed0e5SMax Filippov                               const uint32_t par[])
156475eed0e5SMax Filippov {
156575eed0e5SMax Filippov     tcg_gen_addi_i32(arg[0].out, arg[0].in, dc->config->dcache_line_bytes);
156675eed0e5SMax Filippov }
156775eed0e5SMax Filippov 
156891dc2b2dSMax Filippov static uint32_t test_exceptions_entry(DisasContext *dc, const OpcodeArg arg[],
156909460970SMax Filippov                                       const uint32_t par[])
157009460970SMax Filippov {
1571b0b24bdcSMax Filippov     if (arg[0].imm > 3 || !dc->cwoe) {
157209460970SMax Filippov         qemu_log_mask(LOG_GUEST_ERROR,
157309460970SMax Filippov                       "Illegal entry instruction(pc = %08x)\n", dc->pc);
157491dc2b2dSMax Filippov         return XTENSA_OP_ILL;
157509460970SMax Filippov     } else {
157691dc2b2dSMax Filippov         return 0;
157709460970SMax Filippov     }
157809460970SMax Filippov }
157909460970SMax Filippov 
1580b0b24bdcSMax Filippov static uint32_t test_overflow_entry(DisasContext *dc, const OpcodeArg arg[],
15816416d16fSMax Filippov                                     const uint32_t par[])
15826416d16fSMax Filippov {
15836416d16fSMax Filippov     return 1 << (dc->callinc * 4);
15846416d16fSMax Filippov }
15856416d16fSMax Filippov 
1586b0b24bdcSMax Filippov static void translate_entry(DisasContext *dc, const OpcodeArg arg[],
1587168c12b0SMax Filippov                             const uint32_t par[])
1588168c12b0SMax Filippov {
15896ade0ce9SMax Filippov     TCGv_i32 pc = tcg_constant_i32(dc->pc);
15906ade0ce9SMax Filippov     TCGv_i32 s = tcg_constant_i32(arg[0].imm);
15916ade0ce9SMax Filippov     TCGv_i32 imm = tcg_constant_i32(arg[1].imm);
1592168c12b0SMax Filippov     gen_helper_entry(cpu_env, pc, s, imm);
1593168c12b0SMax Filippov }
1594168c12b0SMax Filippov 
1595b0b24bdcSMax Filippov static void translate_extui(DisasContext *dc, const OpcodeArg arg[],
1596168c12b0SMax Filippov                             const uint32_t par[])
1597168c12b0SMax Filippov {
1598b0b24bdcSMax Filippov     int maskimm = (1 << arg[3].imm) - 1;
1599168c12b0SMax Filippov 
1600168c12b0SMax Filippov     TCGv_i32 tmp = tcg_temp_new_i32();
1601b0b24bdcSMax Filippov     tcg_gen_shri_i32(tmp, arg[1].in, arg[2].imm);
1602b0b24bdcSMax Filippov     tcg_gen_andi_i32(arg[0].out, tmp, maskimm);
1603168c12b0SMax Filippov }
1604168c12b0SMax Filippov 
1605b345e140SMax Filippov static void translate_getex(DisasContext *dc, const OpcodeArg arg[],
1606b345e140SMax Filippov                             const uint32_t par[])
1607b345e140SMax Filippov {
1608b345e140SMax Filippov     TCGv_i32 tmp = tcg_temp_new_i32();
1609b345e140SMax Filippov 
1610b345e140SMax Filippov     tcg_gen_extract_i32(tmp, cpu_SR[ATOMCTL], 8, 1);
1611b345e140SMax Filippov     tcg_gen_deposit_i32(cpu_SR[ATOMCTL], cpu_SR[ATOMCTL], arg[0].in, 8, 1);
1612b345e140SMax Filippov     tcg_gen_mov_i32(arg[0].out, tmp);
1613b345e140SMax Filippov }
1614b345e140SMax Filippov 
1615b0b24bdcSMax Filippov static void translate_icache(DisasContext *dc, const OpcodeArg arg[],
1616168c12b0SMax Filippov                              const uint32_t par[])
1617168c12b0SMax Filippov {
1618ba7651fbSMax Filippov #ifndef CONFIG_USER_ONLY
1619168c12b0SMax Filippov     TCGv_i32 addr = tcg_temp_new_i32();
1620168c12b0SMax Filippov 
1621168c12b0SMax Filippov     tcg_gen_movi_i32(cpu_pc, dc->pc);
1622b0b24bdcSMax Filippov     tcg_gen_addi_i32(addr, arg[0].in, arg[1].imm);
1623168c12b0SMax Filippov     gen_helper_itlb_hit_test(cpu_env, addr);
1624ba7651fbSMax Filippov #endif
1625168c12b0SMax Filippov }
1626168c12b0SMax Filippov 
1627b0b24bdcSMax Filippov static void translate_itlb(DisasContext *dc, const OpcodeArg arg[],
1628168c12b0SMax Filippov                            const uint32_t par[])
1629168c12b0SMax Filippov {
1630ba7651fbSMax Filippov #ifndef CONFIG_USER_ONLY
16314ee412dfSMax Filippov     TCGv_i32 dtlb = tcg_constant_i32(par[0]);
1632168c12b0SMax Filippov 
1633b0b24bdcSMax Filippov     gen_helper_itlb(cpu_env, arg[0].in, dtlb);
1634ba7651fbSMax Filippov #endif
1635168c12b0SMax Filippov }
1636168c12b0SMax Filippov 
1637b0b24bdcSMax Filippov static void translate_j(DisasContext *dc, const OpcodeArg arg[],
1638168c12b0SMax Filippov                         const uint32_t par[])
1639168c12b0SMax Filippov {
1640b0b24bdcSMax Filippov     gen_jumpi(dc, arg[0].imm, 0);
1641168c12b0SMax Filippov }
1642168c12b0SMax Filippov 
1643b0b24bdcSMax Filippov static void translate_jx(DisasContext *dc, const OpcodeArg arg[],
1644168c12b0SMax Filippov                          const uint32_t par[])
1645168c12b0SMax Filippov {
1646b0b24bdcSMax Filippov     gen_jump(dc, arg[0].in);
1647168c12b0SMax Filippov }
1648168c12b0SMax Filippov 
1649b0b24bdcSMax Filippov static void translate_l32e(DisasContext *dc, const OpcodeArg arg[],
1650168c12b0SMax Filippov                            const uint32_t par[])
1651168c12b0SMax Filippov {
1652168c12b0SMax Filippov     TCGv_i32 addr = tcg_temp_new_i32();
1653583e6a5fSMax Filippov     MemOp mop;
1654168c12b0SMax Filippov 
1655b0b24bdcSMax Filippov     tcg_gen_addi_i32(addr, arg[1].in, arg[2].imm);
1656583e6a5fSMax Filippov     mop = gen_load_store_alignment(dc, MO_TEUL, addr);
1657583e6a5fSMax Filippov     tcg_gen_qemu_ld_tl(arg[0].out, addr, dc->ring, mop);
1658168c12b0SMax Filippov }
1659168c12b0SMax Filippov 
1660b345e140SMax Filippov #ifdef CONFIG_USER_ONLY
1661b345e140SMax Filippov static void gen_check_exclusive(DisasContext *dc, TCGv_i32 addr, bool is_write)
1662b345e140SMax Filippov {
1663b345e140SMax Filippov }
1664b345e140SMax Filippov #else
1665b345e140SMax Filippov static void gen_check_exclusive(DisasContext *dc, TCGv_i32 addr, bool is_write)
1666b345e140SMax Filippov {
1667b345e140SMax Filippov     if (!option_enabled(dc, XTENSA_OPTION_MPU)) {
16686ade0ce9SMax Filippov         TCGv_i32 pc = tcg_constant_i32(dc->pc);
1669b345e140SMax Filippov 
16706ade0ce9SMax Filippov         gen_helper_check_exclusive(cpu_env, pc, addr,
16716ade0ce9SMax Filippov                                    tcg_constant_i32(is_write));
1672b345e140SMax Filippov     }
1673b345e140SMax Filippov }
1674b345e140SMax Filippov #endif
1675b345e140SMax Filippov 
1676b345e140SMax Filippov static void translate_l32ex(DisasContext *dc, const OpcodeArg arg[],
1677b345e140SMax Filippov                             const uint32_t par[])
1678b345e140SMax Filippov {
1679b345e140SMax Filippov     TCGv_i32 addr = tcg_temp_new_i32();
1680583e6a5fSMax Filippov     MemOp mop;
1681b345e140SMax Filippov 
1682b345e140SMax Filippov     tcg_gen_mov_i32(addr, arg[1].in);
1683583e6a5fSMax Filippov     mop = gen_load_store_alignment(dc, MO_TEUL | MO_ALIGN, addr);
1684b345e140SMax Filippov     gen_check_exclusive(dc, addr, false);
1685583e6a5fSMax Filippov     tcg_gen_qemu_ld_i32(arg[0].out, addr, dc->cring, mop);
1686b345e140SMax Filippov     tcg_gen_mov_i32(cpu_exclusive_addr, addr);
1687b345e140SMax Filippov     tcg_gen_mov_i32(cpu_exclusive_val, arg[0].out);
1688b345e140SMax Filippov }
1689b345e140SMax Filippov 
1690b0b24bdcSMax Filippov static void translate_ldst(DisasContext *dc, const OpcodeArg arg[],
1691168c12b0SMax Filippov                            const uint32_t par[])
1692168c12b0SMax Filippov {
1693168c12b0SMax Filippov     TCGv_i32 addr = tcg_temp_new_i32();
1694583e6a5fSMax Filippov     MemOp mop;
1695168c12b0SMax Filippov 
1696b0b24bdcSMax Filippov     tcg_gen_addi_i32(addr, arg[1].in, arg[2].imm);
1697583e6a5fSMax Filippov     mop = gen_load_store_alignment(dc, par[0], addr);
1698583e6a5fSMax Filippov 
1699168c12b0SMax Filippov     if (par[2]) {
17009fb40342SMax Filippov         if (par[1]) {
17019fb40342SMax Filippov             tcg_gen_mb(TCG_BAR_STRL | TCG_MO_ALL);
17029fb40342SMax Filippov         }
1703583e6a5fSMax Filippov         tcg_gen_qemu_st_tl(arg[0].in, addr, dc->cring, mop);
1704168c12b0SMax Filippov     } else {
1705583e6a5fSMax Filippov         tcg_gen_qemu_ld_tl(arg[0].out, addr, dc->cring, mop);
17069fb40342SMax Filippov         if (par[1]) {
17079fb40342SMax Filippov             tcg_gen_mb(TCG_BAR_LDAQ | TCG_MO_ALL);
17089fb40342SMax Filippov         }
1709168c12b0SMax Filippov     }
1710168c12b0SMax Filippov }
1711168c12b0SMax Filippov 
171259491e97SMax Filippov static void translate_lct(DisasContext *dc, const OpcodeArg arg[],
171359491e97SMax Filippov                           const uint32_t par[])
171459491e97SMax Filippov {
171559491e97SMax Filippov     tcg_gen_movi_i32(arg[0].out, 0);
171659491e97SMax Filippov }
171759491e97SMax Filippov 
1718b0b24bdcSMax Filippov static void translate_l32r(DisasContext *dc, const OpcodeArg arg[],
1719168c12b0SMax Filippov                            const uint32_t par[])
1720168c12b0SMax Filippov {
17215b9b2763SMax Filippov     TCGv_i32 tmp;
1722168c12b0SMax Filippov 
17233cc18eecSRichard Henderson     if (dc->base.tb->flags & XTENSA_TBFLAG_LITBASE) {
1724b0b24bdcSMax Filippov         tmp = tcg_const_i32(arg[1].raw_imm - 1);
17255b9b2763SMax Filippov         tcg_gen_add_i32(tmp, cpu_SR[LITBASE], tmp);
17265b9b2763SMax Filippov     } else {
1727b0b24bdcSMax Filippov         tmp = tcg_const_i32(arg[1].imm);
1728168c12b0SMax Filippov     }
1729b0b24bdcSMax Filippov     tcg_gen_qemu_ld32u(arg[0].out, tmp, dc->cring);
1730168c12b0SMax Filippov }
1731168c12b0SMax Filippov 
1732b0b24bdcSMax Filippov static void translate_loop(DisasContext *dc, const OpcodeArg arg[],
1733168c12b0SMax Filippov                            const uint32_t par[])
1734168c12b0SMax Filippov {
1735b0b24bdcSMax Filippov     uint32_t lend = arg[1].imm;
1736168c12b0SMax Filippov 
1737b0b24bdcSMax Filippov     tcg_gen_subi_i32(cpu_SR[LCOUNT], arg[0].in, 1);
17383cc18eecSRichard Henderson     tcg_gen_movi_i32(cpu_SR[LBEG], dc->base.pc_next);
17395d630cefSMax Filippov     tcg_gen_movi_i32(cpu_SR[LEND], lend);
1740168c12b0SMax Filippov 
1741168c12b0SMax Filippov     if (par[0] != TCG_COND_NEVER) {
1742168c12b0SMax Filippov         TCGLabel *label = gen_new_label();
1743b0b24bdcSMax Filippov         tcg_gen_brcondi_i32(par[0], arg[0].in, 0, label);
1744168c12b0SMax Filippov         gen_jumpi(dc, lend, 1);
1745168c12b0SMax Filippov         gen_set_label(label);
1746168c12b0SMax Filippov     }
1747168c12b0SMax Filippov 
17483cc18eecSRichard Henderson     gen_jumpi(dc, dc->base.pc_next, 0);
1749168c12b0SMax Filippov }
1750168c12b0SMax Filippov 
1751168c12b0SMax Filippov enum {
1752168c12b0SMax Filippov     MAC16_UMUL,
1753168c12b0SMax Filippov     MAC16_MUL,
1754168c12b0SMax Filippov     MAC16_MULA,
1755168c12b0SMax Filippov     MAC16_MULS,
1756168c12b0SMax Filippov     MAC16_NONE,
1757168c12b0SMax Filippov };
1758168c12b0SMax Filippov 
1759168c12b0SMax Filippov enum {
1760168c12b0SMax Filippov     MAC16_LL,
1761168c12b0SMax Filippov     MAC16_HL,
1762168c12b0SMax Filippov     MAC16_LH,
1763168c12b0SMax Filippov     MAC16_HH,
1764168c12b0SMax Filippov 
1765168c12b0SMax Filippov     MAC16_HX = 0x1,
1766168c12b0SMax Filippov     MAC16_XH = 0x2,
1767168c12b0SMax Filippov };
1768168c12b0SMax Filippov 
1769b0b24bdcSMax Filippov static void translate_mac16(DisasContext *dc, const OpcodeArg arg[],
1770168c12b0SMax Filippov                             const uint32_t par[])
1771168c12b0SMax Filippov {
1772168c12b0SMax Filippov     int op = par[0];
17737aa78341SMax Filippov     unsigned half = par[1];
17747aa78341SMax Filippov     uint32_t ld_offset = par[2];
1775168c12b0SMax Filippov     unsigned off = ld_offset ? 2 : 0;
1776168c12b0SMax Filippov     TCGv_i32 vaddr = tcg_temp_new_i32();
1777168c12b0SMax Filippov     TCGv_i32 mem32 = tcg_temp_new_i32();
1778168c12b0SMax Filippov 
1779168c12b0SMax Filippov     if (ld_offset) {
1780583e6a5fSMax Filippov         MemOp mop;
1781583e6a5fSMax Filippov 
1782b0b24bdcSMax Filippov         tcg_gen_addi_i32(vaddr, arg[1].in, ld_offset);
1783583e6a5fSMax Filippov         mop = gen_load_store_alignment(dc, MO_TEUL, vaddr);
1784583e6a5fSMax Filippov         tcg_gen_qemu_ld_tl(mem32, vaddr, dc->cring, mop);
1785168c12b0SMax Filippov     }
1786168c12b0SMax Filippov     if (op != MAC16_NONE) {
17877aa78341SMax Filippov         TCGv_i32 m1 = gen_mac16_m(arg[off].in,
1788168c12b0SMax Filippov                                   half & MAC16_HX, op == MAC16_UMUL);
17897aa78341SMax Filippov         TCGv_i32 m2 = gen_mac16_m(arg[off + 1].in,
1790168c12b0SMax Filippov                                   half & MAC16_XH, op == MAC16_UMUL);
1791168c12b0SMax Filippov 
1792168c12b0SMax Filippov         if (op == MAC16_MUL || op == MAC16_UMUL) {
1793168c12b0SMax Filippov             tcg_gen_mul_i32(cpu_SR[ACCLO], m1, m2);
1794168c12b0SMax Filippov             if (op == MAC16_UMUL) {
1795168c12b0SMax Filippov                 tcg_gen_movi_i32(cpu_SR[ACCHI], 0);
1796168c12b0SMax Filippov             } else {
1797168c12b0SMax Filippov                 tcg_gen_sari_i32(cpu_SR[ACCHI], cpu_SR[ACCLO], 31);
1798168c12b0SMax Filippov             }
1799168c12b0SMax Filippov         } else {
1800168c12b0SMax Filippov             TCGv_i32 lo = tcg_temp_new_i32();
1801168c12b0SMax Filippov             TCGv_i32 hi = tcg_temp_new_i32();
1802168c12b0SMax Filippov 
1803168c12b0SMax Filippov             tcg_gen_mul_i32(lo, m1, m2);
1804168c12b0SMax Filippov             tcg_gen_sari_i32(hi, lo, 31);
1805168c12b0SMax Filippov             if (op == MAC16_MULA) {
1806168c12b0SMax Filippov                 tcg_gen_add2_i32(cpu_SR[ACCLO], cpu_SR[ACCHI],
1807168c12b0SMax Filippov                                  cpu_SR[ACCLO], cpu_SR[ACCHI],
1808168c12b0SMax Filippov                                  lo, hi);
1809168c12b0SMax Filippov             } else {
1810168c12b0SMax Filippov                 tcg_gen_sub2_i32(cpu_SR[ACCLO], cpu_SR[ACCHI],
1811168c12b0SMax Filippov                                  cpu_SR[ACCLO], cpu_SR[ACCHI],
1812168c12b0SMax Filippov                                  lo, hi);
1813168c12b0SMax Filippov             }
1814168c12b0SMax Filippov             tcg_gen_ext8s_i32(cpu_SR[ACCHI], cpu_SR[ACCHI]);
1815168c12b0SMax Filippov         }
1816168c12b0SMax Filippov     }
1817168c12b0SMax Filippov     if (ld_offset) {
1818b0b24bdcSMax Filippov         tcg_gen_mov_i32(arg[1].out, vaddr);
1819b0b24bdcSMax Filippov         tcg_gen_mov_i32(cpu_SR[MR + arg[0].imm], mem32);
1820168c12b0SMax Filippov     }
1821168c12b0SMax Filippov }
1822168c12b0SMax Filippov 
1823b0b24bdcSMax Filippov static void translate_memw(DisasContext *dc, const OpcodeArg arg[],
18249fb40342SMax Filippov                            const uint32_t par[])
18259fb40342SMax Filippov {
18269fb40342SMax Filippov     tcg_gen_mb(TCG_BAR_SC | TCG_MO_ALL);
18279fb40342SMax Filippov }
18289fb40342SMax Filippov 
1829b0b24bdcSMax Filippov static void translate_smin(DisasContext *dc, const OpcodeArg arg[],
1830168c12b0SMax Filippov                            const uint32_t par[])
1831168c12b0SMax Filippov {
1832b0b24bdcSMax Filippov     tcg_gen_smin_i32(arg[0].out, arg[1].in, arg[2].in);
1833426afc3bSRichard Henderson }
1834426afc3bSRichard Henderson 
1835b0b24bdcSMax Filippov static void translate_umin(DisasContext *dc, const OpcodeArg arg[],
1836426afc3bSRichard Henderson                            const uint32_t par[])
1837426afc3bSRichard Henderson {
1838b0b24bdcSMax Filippov     tcg_gen_umin_i32(arg[0].out, arg[1].in, arg[2].in);
1839426afc3bSRichard Henderson }
1840426afc3bSRichard Henderson 
1841b0b24bdcSMax Filippov static void translate_smax(DisasContext *dc, const OpcodeArg arg[],
1842426afc3bSRichard Henderson                            const uint32_t par[])
1843426afc3bSRichard Henderson {
1844b0b24bdcSMax Filippov     tcg_gen_smax_i32(arg[0].out, arg[1].in, arg[2].in);
1845426afc3bSRichard Henderson }
1846426afc3bSRichard Henderson 
1847b0b24bdcSMax Filippov static void translate_umax(DisasContext *dc, const OpcodeArg arg[],
1848426afc3bSRichard Henderson                            const uint32_t par[])
1849426afc3bSRichard Henderson {
1850b0b24bdcSMax Filippov     tcg_gen_umax_i32(arg[0].out, arg[1].in, arg[2].in);
1851168c12b0SMax Filippov }
1852168c12b0SMax Filippov 
1853b0b24bdcSMax Filippov static void translate_mov(DisasContext *dc, const OpcodeArg arg[],
1854168c12b0SMax Filippov                           const uint32_t par[])
1855168c12b0SMax Filippov {
1856b0b24bdcSMax Filippov     tcg_gen_mov_i32(arg[0].out, arg[1].in);
1857168c12b0SMax Filippov }
1858168c12b0SMax Filippov 
1859b0b24bdcSMax Filippov static void translate_movcond(DisasContext *dc, const OpcodeArg arg[],
1860168c12b0SMax Filippov                               const uint32_t par[])
1861168c12b0SMax Filippov {
18622b570a17SMax Filippov     TCGv_i32 zero = tcg_constant_i32(0);
1863168c12b0SMax Filippov 
1864b0b24bdcSMax Filippov     tcg_gen_movcond_i32(par[0], arg[0].out,
1865b0b24bdcSMax Filippov                         arg[2].in, zero, arg[1].in, arg[0].in);
1866168c12b0SMax Filippov }
1867168c12b0SMax Filippov 
1868b0b24bdcSMax Filippov static void translate_movi(DisasContext *dc, const OpcodeArg arg[],
1869168c12b0SMax Filippov                            const uint32_t par[])
1870168c12b0SMax Filippov {
1871b0b24bdcSMax Filippov     tcg_gen_movi_i32(arg[0].out, arg[1].imm);
1872168c12b0SMax Filippov }
1873168c12b0SMax Filippov 
1874b0b24bdcSMax Filippov static void translate_movp(DisasContext *dc, const OpcodeArg arg[],
1875168c12b0SMax Filippov                            const uint32_t par[])
1876168c12b0SMax Filippov {
18772b570a17SMax Filippov     TCGv_i32 zero = tcg_constant_i32(0);
1878168c12b0SMax Filippov     TCGv_i32 tmp = tcg_temp_new_i32();
1879168c12b0SMax Filippov 
1880575e962aSMax Filippov     tcg_gen_andi_i32(tmp, arg[2].in, 1 << arg[2].imm);
1881168c12b0SMax Filippov     tcg_gen_movcond_i32(par[0],
1882b0b24bdcSMax Filippov                         arg[0].out, tmp, zero,
1883b0b24bdcSMax Filippov                         arg[1].in, arg[0].in);
1884168c12b0SMax Filippov }
1885168c12b0SMax Filippov 
1886b0b24bdcSMax Filippov static void translate_movsp(DisasContext *dc, const OpcodeArg arg[],
1887168c12b0SMax Filippov                             const uint32_t par[])
1888168c12b0SMax Filippov {
1889b0b24bdcSMax Filippov     tcg_gen_mov_i32(arg[0].out, arg[1].in);
1890168c12b0SMax Filippov }
1891168c12b0SMax Filippov 
1892b0b24bdcSMax Filippov static void translate_mul16(DisasContext *dc, const OpcodeArg arg[],
1893168c12b0SMax Filippov                             const uint32_t par[])
1894168c12b0SMax Filippov {
1895168c12b0SMax Filippov     TCGv_i32 v1 = tcg_temp_new_i32();
1896168c12b0SMax Filippov     TCGv_i32 v2 = tcg_temp_new_i32();
1897168c12b0SMax Filippov 
1898168c12b0SMax Filippov     if (par[0]) {
1899b0b24bdcSMax Filippov         tcg_gen_ext16s_i32(v1, arg[1].in);
1900b0b24bdcSMax Filippov         tcg_gen_ext16s_i32(v2, arg[2].in);
1901168c12b0SMax Filippov     } else {
1902b0b24bdcSMax Filippov         tcg_gen_ext16u_i32(v1, arg[1].in);
1903b0b24bdcSMax Filippov         tcg_gen_ext16u_i32(v2, arg[2].in);
1904168c12b0SMax Filippov     }
1905b0b24bdcSMax Filippov     tcg_gen_mul_i32(arg[0].out, v1, v2);
1906168c12b0SMax Filippov }
1907168c12b0SMax Filippov 
1908b0b24bdcSMax Filippov static void translate_mull(DisasContext *dc, const OpcodeArg arg[],
1909168c12b0SMax Filippov                            const uint32_t par[])
1910168c12b0SMax Filippov {
1911b0b24bdcSMax Filippov     tcg_gen_mul_i32(arg[0].out, arg[1].in, arg[2].in);
1912168c12b0SMax Filippov }
1913168c12b0SMax Filippov 
1914b0b24bdcSMax Filippov static void translate_mulh(DisasContext *dc, const OpcodeArg arg[],
1915168c12b0SMax Filippov                            const uint32_t par[])
1916168c12b0SMax Filippov {
1917168c12b0SMax Filippov     TCGv_i32 lo = tcg_temp_new();
1918168c12b0SMax Filippov 
1919168c12b0SMax Filippov     if (par[0]) {
1920b0b24bdcSMax Filippov         tcg_gen_muls2_i32(lo, arg[0].out, arg[1].in, arg[2].in);
1921168c12b0SMax Filippov     } else {
1922b0b24bdcSMax Filippov         tcg_gen_mulu2_i32(lo, arg[0].out, arg[1].in, arg[2].in);
1923168c12b0SMax Filippov     }
1924168c12b0SMax Filippov }
1925168c12b0SMax Filippov 
1926b0b24bdcSMax Filippov static void translate_neg(DisasContext *dc, const OpcodeArg arg[],
1927168c12b0SMax Filippov                           const uint32_t par[])
1928168c12b0SMax Filippov {
1929b0b24bdcSMax Filippov     tcg_gen_neg_i32(arg[0].out, arg[1].in);
1930168c12b0SMax Filippov }
1931168c12b0SMax Filippov 
1932b0b24bdcSMax Filippov static void translate_nop(DisasContext *dc, const OpcodeArg arg[],
1933168c12b0SMax Filippov                           const uint32_t par[])
1934168c12b0SMax Filippov {
1935168c12b0SMax Filippov }
1936168c12b0SMax Filippov 
1937b0b24bdcSMax Filippov static void translate_nsa(DisasContext *dc, const OpcodeArg arg[],
1938168c12b0SMax Filippov                           const uint32_t par[])
1939168c12b0SMax Filippov {
1940b0b24bdcSMax Filippov     tcg_gen_clrsb_i32(arg[0].out, arg[1].in);
1941168c12b0SMax Filippov }
1942168c12b0SMax Filippov 
1943b0b24bdcSMax Filippov static void translate_nsau(DisasContext *dc, const OpcodeArg arg[],
1944168c12b0SMax Filippov                            const uint32_t par[])
1945168c12b0SMax Filippov {
1946b0b24bdcSMax Filippov     tcg_gen_clzi_i32(arg[0].out, arg[1].in, 32);
1947168c12b0SMax Filippov }
1948168c12b0SMax Filippov 
1949b0b24bdcSMax Filippov static void translate_or(DisasContext *dc, const OpcodeArg arg[],
1950168c12b0SMax Filippov                          const uint32_t par[])
1951168c12b0SMax Filippov {
1952b0b24bdcSMax Filippov     tcg_gen_or_i32(arg[0].out, arg[1].in, arg[2].in);
1953168c12b0SMax Filippov }
1954168c12b0SMax Filippov 
1955b0b24bdcSMax Filippov static void translate_ptlb(DisasContext *dc, const OpcodeArg arg[],
1956168c12b0SMax Filippov                            const uint32_t par[])
1957168c12b0SMax Filippov {
1958ba7651fbSMax Filippov #ifndef CONFIG_USER_ONLY
19594ee412dfSMax Filippov     TCGv_i32 dtlb = tcg_constant_i32(par[0]);
1960168c12b0SMax Filippov 
1961168c12b0SMax Filippov     tcg_gen_movi_i32(cpu_pc, dc->pc);
1962b0b24bdcSMax Filippov     gen_helper_ptlb(arg[0].out, cpu_env, arg[1].in, dtlb);
1963ba7651fbSMax Filippov #endif
1964168c12b0SMax Filippov }
1965168c12b0SMax Filippov 
19664d04ea35SMax Filippov static void translate_pptlb(DisasContext *dc, const OpcodeArg arg[],
19674d04ea35SMax Filippov                             const uint32_t par[])
19684d04ea35SMax Filippov {
19694d04ea35SMax Filippov #ifndef CONFIG_USER_ONLY
19704d04ea35SMax Filippov     tcg_gen_movi_i32(cpu_pc, dc->pc);
19714d04ea35SMax Filippov     gen_helper_pptlb(arg[0].out, cpu_env, arg[1].in);
19724d04ea35SMax Filippov #endif
19734d04ea35SMax Filippov }
19744d04ea35SMax Filippov 
1975b0b24bdcSMax Filippov static void translate_quos(DisasContext *dc, const OpcodeArg arg[],
1976168c12b0SMax Filippov                            const uint32_t par[])
1977168c12b0SMax Filippov {
1978168c12b0SMax Filippov     TCGLabel *label1 = gen_new_label();
1979168c12b0SMax Filippov     TCGLabel *label2 = gen_new_label();
1980168c12b0SMax Filippov 
1981b0b24bdcSMax Filippov     tcg_gen_brcondi_i32(TCG_COND_NE, arg[1].in, 0x80000000,
1982168c12b0SMax Filippov                         label1);
1983b0b24bdcSMax Filippov     tcg_gen_brcondi_i32(TCG_COND_NE, arg[2].in, 0xffffffff,
1984168c12b0SMax Filippov                         label1);
1985b0b24bdcSMax Filippov     tcg_gen_movi_i32(arg[0].out,
1986168c12b0SMax Filippov                      par[0] ? 0x80000000 : 0);
1987168c12b0SMax Filippov     tcg_gen_br(label2);
1988168c12b0SMax Filippov     gen_set_label(label1);
1989168c12b0SMax Filippov     if (par[0]) {
1990b0b24bdcSMax Filippov         tcg_gen_div_i32(arg[0].out,
1991b0b24bdcSMax Filippov                         arg[1].in, arg[2].in);
1992168c12b0SMax Filippov     } else {
1993b0b24bdcSMax Filippov         tcg_gen_rem_i32(arg[0].out,
1994b0b24bdcSMax Filippov                         arg[1].in, arg[2].in);
1995168c12b0SMax Filippov     }
1996168c12b0SMax Filippov     gen_set_label(label2);
1997168c12b0SMax Filippov }
1998168c12b0SMax Filippov 
1999b0b24bdcSMax Filippov static void translate_quou(DisasContext *dc, const OpcodeArg arg[],
2000168c12b0SMax Filippov                            const uint32_t par[])
2001168c12b0SMax Filippov {
2002b0b24bdcSMax Filippov     tcg_gen_divu_i32(arg[0].out,
2003b0b24bdcSMax Filippov                      arg[1].in, arg[2].in);
2004168c12b0SMax Filippov }
2005168c12b0SMax Filippov 
2006b0b24bdcSMax Filippov static void translate_read_impwire(DisasContext *dc, const OpcodeArg arg[],
2007e9872741SMax Filippov                                    const uint32_t par[])
2008e9872741SMax Filippov {
2009e9872741SMax Filippov     /* TODO: GPIO32 may be a part of coprocessor */
2010b0b24bdcSMax Filippov     tcg_gen_movi_i32(arg[0].out, 0);
2011e9872741SMax Filippov }
2012e9872741SMax Filippov 
2013b0b24bdcSMax Filippov static void translate_remu(DisasContext *dc, const OpcodeArg arg[],
20144a038955SMax Filippov                            const uint32_t par[])
20154a038955SMax Filippov {
2016b0b24bdcSMax Filippov     tcg_gen_remu_i32(arg[0].out,
2017b0b24bdcSMax Filippov                      arg[1].in, arg[2].in);
20184a038955SMax Filippov }
20194a038955SMax Filippov 
2020b0b24bdcSMax Filippov static void translate_rer(DisasContext *dc, const OpcodeArg arg[],
2021168c12b0SMax Filippov                           const uint32_t par[])
2022168c12b0SMax Filippov {
2023b0b24bdcSMax Filippov     gen_helper_rer(arg[0].out, cpu_env, arg[1].in);
2024168c12b0SMax Filippov }
2025168c12b0SMax Filippov 
2026b0b24bdcSMax Filippov static void translate_ret(DisasContext *dc, const OpcodeArg arg[],
2027168c12b0SMax Filippov                           const uint32_t par[])
2028168c12b0SMax Filippov {
2029168c12b0SMax Filippov     gen_jump(dc, cpu_R[0]);
2030168c12b0SMax Filippov }
2031168c12b0SMax Filippov 
203291dc2b2dSMax Filippov static uint32_t test_exceptions_retw(DisasContext *dc, const OpcodeArg arg[],
203309460970SMax Filippov                                      const uint32_t par[])
203409460970SMax Filippov {
203509460970SMax Filippov     if (!dc->cwoe) {
203609460970SMax Filippov         qemu_log_mask(LOG_GUEST_ERROR,
203709460970SMax Filippov                       "Illegal retw instruction(pc = %08x)\n", dc->pc);
203891dc2b2dSMax Filippov         return XTENSA_OP_ILL;
203909460970SMax Filippov     } else {
20406ade0ce9SMax Filippov         TCGv_i32 pc = tcg_constant_i32(dc->pc);
204109460970SMax Filippov 
20426ade0ce9SMax Filippov         gen_helper_test_ill_retw(cpu_env, pc);
204391dc2b2dSMax Filippov         return 0;
204409460970SMax Filippov     }
204509460970SMax Filippov }
204609460970SMax Filippov 
2047b0b24bdcSMax Filippov static void translate_retw(DisasContext *dc, const OpcodeArg arg[],
2048168c12b0SMax Filippov                            const uint32_t par[])
2049168c12b0SMax Filippov {
2050c949009bSMax Filippov     TCGv_i32 tmp = tcg_const_i32(1);
2051c949009bSMax Filippov     tcg_gen_shl_i32(tmp, tmp, cpu_SR[WINDOW_BASE]);
2052c949009bSMax Filippov     tcg_gen_andc_i32(cpu_SR[WINDOW_START],
2053c949009bSMax Filippov                      cpu_SR[WINDOW_START], tmp);
2054c949009bSMax Filippov     tcg_gen_movi_i32(tmp, dc->pc);
2055c949009bSMax Filippov     tcg_gen_deposit_i32(tmp, tmp, cpu_R[0], 0, 30);
2056c949009bSMax Filippov     gen_helper_retw(cpu_env, cpu_R[0]);
2057168c12b0SMax Filippov     gen_jump(dc, tmp);
2058168c12b0SMax Filippov }
2059168c12b0SMax Filippov 
2060b0b24bdcSMax Filippov static void translate_rfde(DisasContext *dc, const OpcodeArg arg[],
2061168c12b0SMax Filippov                            const uint32_t par[])
2062168c12b0SMax Filippov {
2063168c12b0SMax Filippov     gen_jump(dc, cpu_SR[dc->config->ndepc ? DEPC : EPC1]);
2064168c12b0SMax Filippov }
2065168c12b0SMax Filippov 
2066b0b24bdcSMax Filippov static void translate_rfe(DisasContext *dc, const OpcodeArg arg[],
2067168c12b0SMax Filippov                           const uint32_t par[])
2068168c12b0SMax Filippov {
2069168c12b0SMax Filippov     tcg_gen_andi_i32(cpu_SR[PS], cpu_SR[PS], ~PS_EXCM);
2070168c12b0SMax Filippov     gen_jump(dc, cpu_SR[EPC1]);
2071168c12b0SMax Filippov }
2072168c12b0SMax Filippov 
2073b0b24bdcSMax Filippov static void translate_rfi(DisasContext *dc, const OpcodeArg arg[],
2074168c12b0SMax Filippov                           const uint32_t par[])
2075168c12b0SMax Filippov {
2076b0b24bdcSMax Filippov     tcg_gen_mov_i32(cpu_SR[PS], cpu_SR[EPS2 + arg[0].imm - 2]);
2077b0b24bdcSMax Filippov     gen_jump(dc, cpu_SR[EPC1 + arg[0].imm - 1]);
2078168c12b0SMax Filippov }
2079168c12b0SMax Filippov 
2080b0b24bdcSMax Filippov static void translate_rfw(DisasContext *dc, const OpcodeArg arg[],
2081168c12b0SMax Filippov                           const uint32_t par[])
2082168c12b0SMax Filippov {
2083168c12b0SMax Filippov     TCGv_i32 tmp = tcg_const_i32(1);
2084168c12b0SMax Filippov 
2085168c12b0SMax Filippov     tcg_gen_andi_i32(cpu_SR[PS], cpu_SR[PS], ~PS_EXCM);
2086168c12b0SMax Filippov     tcg_gen_shl_i32(tmp, tmp, cpu_SR[WINDOW_BASE]);
2087168c12b0SMax Filippov 
2088168c12b0SMax Filippov     if (par[0]) {
2089168c12b0SMax Filippov         tcg_gen_andc_i32(cpu_SR[WINDOW_START],
2090168c12b0SMax Filippov                          cpu_SR[WINDOW_START], tmp);
2091168c12b0SMax Filippov     } else {
2092168c12b0SMax Filippov         tcg_gen_or_i32(cpu_SR[WINDOW_START],
2093168c12b0SMax Filippov                        cpu_SR[WINDOW_START], tmp);
2094168c12b0SMax Filippov     }
2095168c12b0SMax Filippov 
2096d74624e5SMax Filippov     gen_helper_restore_owb(cpu_env);
2097d74624e5SMax Filippov     gen_jump(dc, cpu_SR[EPC1]);
2098168c12b0SMax Filippov }
2099168c12b0SMax Filippov 
2100b0b24bdcSMax Filippov static void translate_rotw(DisasContext *dc, const OpcodeArg arg[],
2101168c12b0SMax Filippov                            const uint32_t par[])
2102168c12b0SMax Filippov {
2103b0b24bdcSMax Filippov     tcg_gen_addi_i32(cpu_windowbase_next, cpu_SR[WINDOW_BASE], arg[0].imm);
2104168c12b0SMax Filippov }
2105168c12b0SMax Filippov 
2106b0b24bdcSMax Filippov static void translate_rsil(DisasContext *dc, const OpcodeArg arg[],
2107168c12b0SMax Filippov                            const uint32_t par[])
2108168c12b0SMax Filippov {
2109b0b24bdcSMax Filippov     tcg_gen_mov_i32(arg[0].out, cpu_SR[PS]);
2110168c12b0SMax Filippov     tcg_gen_andi_i32(cpu_SR[PS], cpu_SR[PS], ~PS_INTLEVEL);
2111b0b24bdcSMax Filippov     tcg_gen_ori_i32(cpu_SR[PS], cpu_SR[PS], arg[1].imm);
2112168c12b0SMax Filippov }
2113168c12b0SMax Filippov 
2114b0b24bdcSMax Filippov static void translate_rsr(DisasContext *dc, const OpcodeArg arg[],
2115168c12b0SMax Filippov                           const uint32_t par[])
2116168c12b0SMax Filippov {
211759afd43dSMax Filippov     if (sr_name[par[0]]) {
211859419607SMax Filippov         tcg_gen_mov_i32(arg[0].out, cpu_SR[par[0]]);
211959afd43dSMax Filippov     } else {
212059afd43dSMax Filippov         tcg_gen_movi_i32(arg[0].out, 0);
212159afd43dSMax Filippov     }
212259419607SMax Filippov }
212359419607SMax Filippov 
212459419607SMax Filippov static void translate_rsr_ccount(DisasContext *dc, const OpcodeArg arg[],
212559419607SMax Filippov                                  const uint32_t par[])
212659419607SMax Filippov {
212759419607SMax Filippov #ifndef CONFIG_USER_ONLY
212859419607SMax Filippov     if (tb_cflags(dc->base.tb) & CF_USE_ICOUNT) {
212959419607SMax Filippov         gen_io_start();
213059419607SMax Filippov     }
213159419607SMax Filippov     gen_helper_update_ccount(cpu_env);
213259419607SMax Filippov     tcg_gen_mov_i32(arg[0].out, cpu_SR[par[0]]);
213359419607SMax Filippov #endif
213459419607SMax Filippov }
213559419607SMax Filippov 
213659419607SMax Filippov static void translate_rsr_ptevaddr(DisasContext *dc, const OpcodeArg arg[],
213759419607SMax Filippov                                    const uint32_t par[])
213859419607SMax Filippov {
213959419607SMax Filippov #ifndef CONFIG_USER_ONLY
214059419607SMax Filippov     TCGv_i32 tmp = tcg_temp_new_i32();
214159419607SMax Filippov 
214259419607SMax Filippov     tcg_gen_shri_i32(tmp, cpu_SR[EXCVADDR], 10);
214359419607SMax Filippov     tcg_gen_or_i32(tmp, tmp, cpu_SR[PTEVADDR]);
214459419607SMax Filippov     tcg_gen_andi_i32(arg[0].out, tmp, 0xfffffffc);
214559419607SMax Filippov #endif
2146168c12b0SMax Filippov }
2147168c12b0SMax Filippov 
2148b0b24bdcSMax Filippov static void translate_rtlb(DisasContext *dc, const OpcodeArg arg[],
2149168c12b0SMax Filippov                            const uint32_t par[])
2150168c12b0SMax Filippov {
215121a2dad5SMax Filippov #ifndef CONFIG_USER_ONLY
2152168c12b0SMax Filippov     static void (* const helper[])(TCGv_i32 r, TCGv_env env, TCGv_i32 a1,
2153168c12b0SMax Filippov                                    TCGv_i32 a2) = {
2154168c12b0SMax Filippov         gen_helper_rtlb0,
2155168c12b0SMax Filippov         gen_helper_rtlb1,
2156168c12b0SMax Filippov     };
21574ee412dfSMax Filippov     TCGv_i32 dtlb = tcg_constant_i32(par[0]);
2158168c12b0SMax Filippov 
2159b0b24bdcSMax Filippov     helper[par[1]](arg[0].out, cpu_env, arg[1].in, dtlb);
216021a2dad5SMax Filippov #endif
2161168c12b0SMax Filippov }
2162168c12b0SMax Filippov 
21634d04ea35SMax Filippov static void translate_rptlb0(DisasContext *dc, const OpcodeArg arg[],
21644d04ea35SMax Filippov                              const uint32_t par[])
21654d04ea35SMax Filippov {
21664d04ea35SMax Filippov #ifndef CONFIG_USER_ONLY
21674d04ea35SMax Filippov     gen_helper_rptlb0(arg[0].out, cpu_env, arg[1].in);
21684d04ea35SMax Filippov #endif
21694d04ea35SMax Filippov }
21704d04ea35SMax Filippov 
21714d04ea35SMax Filippov static void translate_rptlb1(DisasContext *dc, const OpcodeArg arg[],
21724d04ea35SMax Filippov                              const uint32_t par[])
21734d04ea35SMax Filippov {
21744d04ea35SMax Filippov #ifndef CONFIG_USER_ONLY
21754d04ea35SMax Filippov     gen_helper_rptlb1(arg[0].out, cpu_env, arg[1].in);
21764d04ea35SMax Filippov #endif
21774d04ea35SMax Filippov }
21784d04ea35SMax Filippov 
2179b0b24bdcSMax Filippov static void translate_rur(DisasContext *dc, const OpcodeArg arg[],
2180168c12b0SMax Filippov                           const uint32_t par[])
2181168c12b0SMax Filippov {
2182b0b24bdcSMax Filippov     tcg_gen_mov_i32(arg[0].out, cpu_UR[par[0]]);
2183168c12b0SMax Filippov }
2184168c12b0SMax Filippov 
2185b0b24bdcSMax Filippov static void translate_setb_expstate(DisasContext *dc, const OpcodeArg arg[],
2186e9872741SMax Filippov                                     const uint32_t par[])
2187e9872741SMax Filippov {
2188e9872741SMax Filippov     /* TODO: GPIO32 may be a part of coprocessor */
2189b0b24bdcSMax Filippov     tcg_gen_ori_i32(cpu_UR[EXPSTATE], cpu_UR[EXPSTATE], 1u << arg[0].imm);
2190e9872741SMax Filippov }
2191e9872741SMax Filippov 
21929fb40342SMax Filippov #ifdef CONFIG_USER_ONLY
21939fb40342SMax Filippov static void gen_check_atomctl(DisasContext *dc, TCGv_i32 addr)
21949fb40342SMax Filippov {
21959fb40342SMax Filippov }
21969fb40342SMax Filippov #else
21979fb40342SMax Filippov static void gen_check_atomctl(DisasContext *dc, TCGv_i32 addr)
21989fb40342SMax Filippov {
21996ade0ce9SMax Filippov     TCGv_i32 pc = tcg_constant_i32(dc->pc);
22009fb40342SMax Filippov 
22016ade0ce9SMax Filippov     gen_helper_check_atomctl(cpu_env, pc, addr);
22029fb40342SMax Filippov }
22039fb40342SMax Filippov #endif
22049fb40342SMax Filippov 
2205b0b24bdcSMax Filippov static void translate_s32c1i(DisasContext *dc, const OpcodeArg arg[],
2206168c12b0SMax Filippov                              const uint32_t par[])
2207168c12b0SMax Filippov {
2208177bbc81SRichard Henderson     TCGv_i32 tmp = tcg_temp_new_i32();
2209177bbc81SRichard Henderson     TCGv_i32 addr = tcg_temp_new_i32();
2210583e6a5fSMax Filippov     MemOp mop;
2211168c12b0SMax Filippov 
2212b0b24bdcSMax Filippov     tcg_gen_mov_i32(tmp, arg[0].in);
2213b0b24bdcSMax Filippov     tcg_gen_addi_i32(addr, arg[1].in, arg[2].imm);
2214583e6a5fSMax Filippov     mop = gen_load_store_alignment(dc, MO_TEUL | MO_ALIGN, addr);
22159fb40342SMax Filippov     gen_check_atomctl(dc, addr);
2216b0b24bdcSMax Filippov     tcg_gen_atomic_cmpxchg_i32(arg[0].out, addr, cpu_SR[SCOMPARE1],
2217583e6a5fSMax Filippov                                tmp, dc->cring, mop);
2218168c12b0SMax Filippov }
2219168c12b0SMax Filippov 
2220b0b24bdcSMax Filippov static void translate_s32e(DisasContext *dc, const OpcodeArg arg[],
2221168c12b0SMax Filippov                            const uint32_t par[])
2222168c12b0SMax Filippov {
2223168c12b0SMax Filippov     TCGv_i32 addr = tcg_temp_new_i32();
2224583e6a5fSMax Filippov     MemOp mop;
2225168c12b0SMax Filippov 
2226b0b24bdcSMax Filippov     tcg_gen_addi_i32(addr, arg[1].in, arg[2].imm);
2227583e6a5fSMax Filippov     mop = gen_load_store_alignment(dc, MO_TEUL, addr);
2228583e6a5fSMax Filippov     tcg_gen_qemu_st_tl(arg[0].in, addr, dc->ring, mop);
2229168c12b0SMax Filippov }
2230168c12b0SMax Filippov 
2231b345e140SMax Filippov static void translate_s32ex(DisasContext *dc, const OpcodeArg arg[],
2232b345e140SMax Filippov                             const uint32_t par[])
2233b345e140SMax Filippov {
2234b345e140SMax Filippov     TCGv_i32 prev = tcg_temp_new_i32();
2235177bbc81SRichard Henderson     TCGv_i32 addr = tcg_temp_new_i32();
2236177bbc81SRichard Henderson     TCGv_i32 res = tcg_temp_new_i32();
2237b345e140SMax Filippov     TCGLabel *label = gen_new_label();
2238583e6a5fSMax Filippov     MemOp mop;
2239b345e140SMax Filippov 
2240b345e140SMax Filippov     tcg_gen_movi_i32(res, 0);
2241b345e140SMax Filippov     tcg_gen_mov_i32(addr, arg[1].in);
2242583e6a5fSMax Filippov     mop = gen_load_store_alignment(dc, MO_TEUL | MO_ALIGN, addr);
2243b345e140SMax Filippov     tcg_gen_brcond_i32(TCG_COND_NE, addr, cpu_exclusive_addr, label);
2244b345e140SMax Filippov     gen_check_exclusive(dc, addr, true);
2245b345e140SMax Filippov     tcg_gen_atomic_cmpxchg_i32(prev, cpu_exclusive_addr, cpu_exclusive_val,
2246583e6a5fSMax Filippov                                arg[0].in, dc->cring, mop);
2247b345e140SMax Filippov     tcg_gen_setcond_i32(TCG_COND_EQ, res, prev, cpu_exclusive_val);
2248b345e140SMax Filippov     tcg_gen_movcond_i32(TCG_COND_EQ, cpu_exclusive_val,
2249b345e140SMax Filippov                         prev, cpu_exclusive_val, prev, cpu_exclusive_val);
2250b345e140SMax Filippov     tcg_gen_movi_i32(cpu_exclusive_addr, -1);
2251b345e140SMax Filippov     gen_set_label(label);
2252b345e140SMax Filippov     tcg_gen_extract_i32(arg[0].out, cpu_SR[ATOMCTL], 8, 1);
2253b345e140SMax Filippov     tcg_gen_deposit_i32(cpu_SR[ATOMCTL], cpu_SR[ATOMCTL], res, 8, 1);
2254b345e140SMax Filippov }
2255b345e140SMax Filippov 
2256b0b24bdcSMax Filippov static void translate_salt(DisasContext *dc, const OpcodeArg arg[],
2257d1e9b006SMax Filippov                            const uint32_t par[])
2258d1e9b006SMax Filippov {
2259d1e9b006SMax Filippov     tcg_gen_setcond_i32(par[0],
2260b0b24bdcSMax Filippov                         arg[0].out,
2261b0b24bdcSMax Filippov                         arg[1].in, arg[2].in);
2262d1e9b006SMax Filippov }
2263d1e9b006SMax Filippov 
2264b0b24bdcSMax Filippov static void translate_sext(DisasContext *dc, const OpcodeArg arg[],
2265168c12b0SMax Filippov                            const uint32_t par[])
2266168c12b0SMax Filippov {
2267b0b24bdcSMax Filippov     int shift = 31 - arg[2].imm;
2268168c12b0SMax Filippov 
2269168c12b0SMax Filippov     if (shift == 24) {
2270b0b24bdcSMax Filippov         tcg_gen_ext8s_i32(arg[0].out, arg[1].in);
2271168c12b0SMax Filippov     } else if (shift == 16) {
2272b0b24bdcSMax Filippov         tcg_gen_ext16s_i32(arg[0].out, arg[1].in);
2273168c12b0SMax Filippov     } else {
2274168c12b0SMax Filippov         TCGv_i32 tmp = tcg_temp_new_i32();
2275b0b24bdcSMax Filippov         tcg_gen_shli_i32(tmp, arg[1].in, shift);
2276b0b24bdcSMax Filippov         tcg_gen_sari_i32(arg[0].out, tmp, shift);
2277168c12b0SMax Filippov     }
2278168c12b0SMax Filippov }
2279168c12b0SMax Filippov 
228091dc2b2dSMax Filippov static uint32_t test_exceptions_simcall(DisasContext *dc,
228191dc2b2dSMax Filippov                                         const OpcodeArg arg[],
228209460970SMax Filippov                                         const uint32_t par[])
228309460970SMax Filippov {
2284870ab98bSPeter Maydell     bool is_semi = semihosting_enabled(dc->cring != 0);
228509460970SMax Filippov #ifdef CONFIG_USER_ONLY
228609460970SMax Filippov     bool ill = true;
228709460970SMax Filippov #else
228862ed68e3SMax Filippov     /* Between RE.2 and RE.3 simcall opcode's become nop for the hardware. */
2289870ab98bSPeter Maydell     bool ill = dc->config->hw_version <= 250002 && !is_semi;
229009460970SMax Filippov #endif
2291870ab98bSPeter Maydell     if (ill || !is_semi) {
229209460970SMax Filippov         qemu_log_mask(LOG_GUEST_ERROR, "SIMCALL but semihosting is disabled\n");
229309460970SMax Filippov     }
229491dc2b2dSMax Filippov     return ill ? XTENSA_OP_ILL : 0;
229509460970SMax Filippov }
229609460970SMax Filippov 
2297b0b24bdcSMax Filippov static void translate_simcall(DisasContext *dc, const OpcodeArg arg[],
2298168c12b0SMax Filippov                               const uint32_t par[])
2299168c12b0SMax Filippov {
2300ba7651fbSMax Filippov #ifndef CONFIG_USER_ONLY
2301870ab98bSPeter Maydell     if (semihosting_enabled(dc->cring != 0)) {
2302168c12b0SMax Filippov         gen_helper_simcall(cpu_env);
230362ed68e3SMax Filippov     }
2304ba7651fbSMax Filippov #endif
2305168c12b0SMax Filippov }
2306168c12b0SMax Filippov 
2307168c12b0SMax Filippov /*
2308168c12b0SMax Filippov  * Note: 64 bit ops are used here solely because SAR values
2309168c12b0SMax Filippov  * have range 0..63
2310168c12b0SMax Filippov  */
2311168c12b0SMax Filippov #define gen_shift_reg(cmd, reg) do { \
2312168c12b0SMax Filippov                     TCGv_i64 tmp = tcg_temp_new_i64(); \
2313168c12b0SMax Filippov                     tcg_gen_extu_i32_i64(tmp, reg); \
2314168c12b0SMax Filippov                     tcg_gen_##cmd##_i64(v, v, tmp); \
2315b0b24bdcSMax Filippov                     tcg_gen_extrl_i64_i32(arg[0].out, v); \
2316168c12b0SMax Filippov                 } while (0)
2317168c12b0SMax Filippov 
2318168c12b0SMax Filippov #define gen_shift(cmd) gen_shift_reg(cmd, cpu_SR[SAR])
2319168c12b0SMax Filippov 
2320b0b24bdcSMax Filippov static void translate_sll(DisasContext *dc, const OpcodeArg arg[],
2321168c12b0SMax Filippov                           const uint32_t par[])
2322168c12b0SMax Filippov {
2323168c12b0SMax Filippov     if (dc->sar_m32_5bit) {
2324b0b24bdcSMax Filippov         tcg_gen_shl_i32(arg[0].out, arg[1].in, dc->sar_m32);
2325168c12b0SMax Filippov     } else {
2326168c12b0SMax Filippov         TCGv_i64 v = tcg_temp_new_i64();
2327168c12b0SMax Filippov         TCGv_i32 s = tcg_const_i32(32);
2328168c12b0SMax Filippov         tcg_gen_sub_i32(s, s, cpu_SR[SAR]);
2329168c12b0SMax Filippov         tcg_gen_andi_i32(s, s, 0x3f);
2330b0b24bdcSMax Filippov         tcg_gen_extu_i32_i64(v, arg[1].in);
2331168c12b0SMax Filippov         gen_shift_reg(shl, s);
2332168c12b0SMax Filippov     }
2333168c12b0SMax Filippov }
2334168c12b0SMax Filippov 
2335b0b24bdcSMax Filippov static void translate_slli(DisasContext *dc, const OpcodeArg arg[],
2336168c12b0SMax Filippov                            const uint32_t par[])
2337168c12b0SMax Filippov {
2338b0b24bdcSMax Filippov     if (arg[2].imm == 32) {
23398e96f594SPhilippe Mathieu-Daudé         qemu_log_mask(LOG_GUEST_ERROR, "slli a%d, a%d, 32 is undefined\n",
2340b0b24bdcSMax Filippov                       arg[0].imm, arg[1].imm);
2341168c12b0SMax Filippov     }
2342b0b24bdcSMax Filippov     tcg_gen_shli_i32(arg[0].out, arg[1].in, arg[2].imm & 0x1f);
2343168c12b0SMax Filippov }
2344168c12b0SMax Filippov 
2345b0b24bdcSMax Filippov static void translate_sra(DisasContext *dc, const OpcodeArg arg[],
2346168c12b0SMax Filippov                           const uint32_t par[])
2347168c12b0SMax Filippov {
2348168c12b0SMax Filippov     if (dc->sar_m32_5bit) {
2349b0b24bdcSMax Filippov         tcg_gen_sar_i32(arg[0].out, arg[1].in, cpu_SR[SAR]);
2350168c12b0SMax Filippov     } else {
2351168c12b0SMax Filippov         TCGv_i64 v = tcg_temp_new_i64();
2352b0b24bdcSMax Filippov         tcg_gen_ext_i32_i64(v, arg[1].in);
2353168c12b0SMax Filippov         gen_shift(sar);
2354168c12b0SMax Filippov     }
2355168c12b0SMax Filippov }
2356168c12b0SMax Filippov 
2357b0b24bdcSMax Filippov static void translate_srai(DisasContext *dc, const OpcodeArg arg[],
2358168c12b0SMax Filippov                            const uint32_t par[])
2359168c12b0SMax Filippov {
2360b0b24bdcSMax Filippov     tcg_gen_sari_i32(arg[0].out, arg[1].in, arg[2].imm);
2361168c12b0SMax Filippov }
2362168c12b0SMax Filippov 
2363b0b24bdcSMax Filippov static void translate_src(DisasContext *dc, const OpcodeArg arg[],
2364168c12b0SMax Filippov                           const uint32_t par[])
2365168c12b0SMax Filippov {
2366168c12b0SMax Filippov     TCGv_i64 v = tcg_temp_new_i64();
2367b0b24bdcSMax Filippov     tcg_gen_concat_i32_i64(v, arg[2].in, arg[1].in);
2368168c12b0SMax Filippov     gen_shift(shr);
2369168c12b0SMax Filippov }
2370168c12b0SMax Filippov 
2371b0b24bdcSMax Filippov static void translate_srl(DisasContext *dc, const OpcodeArg arg[],
2372168c12b0SMax Filippov                           const uint32_t par[])
2373168c12b0SMax Filippov {
2374168c12b0SMax Filippov     if (dc->sar_m32_5bit) {
2375b0b24bdcSMax Filippov         tcg_gen_shr_i32(arg[0].out, arg[1].in, cpu_SR[SAR]);
2376168c12b0SMax Filippov     } else {
2377168c12b0SMax Filippov         TCGv_i64 v = tcg_temp_new_i64();
2378b0b24bdcSMax Filippov         tcg_gen_extu_i32_i64(v, arg[1].in);
2379168c12b0SMax Filippov         gen_shift(shr);
2380168c12b0SMax Filippov     }
2381168c12b0SMax Filippov }
2382168c12b0SMax Filippov 
2383168c12b0SMax Filippov #undef gen_shift
2384168c12b0SMax Filippov #undef gen_shift_reg
2385168c12b0SMax Filippov 
2386b0b24bdcSMax Filippov static void translate_srli(DisasContext *dc, const OpcodeArg arg[],
2387168c12b0SMax Filippov                            const uint32_t par[])
2388168c12b0SMax Filippov {
2389b0b24bdcSMax Filippov     tcg_gen_shri_i32(arg[0].out, arg[1].in, arg[2].imm);
2390168c12b0SMax Filippov }
2391168c12b0SMax Filippov 
2392b0b24bdcSMax Filippov static void translate_ssa8b(DisasContext *dc, const OpcodeArg arg[],
2393168c12b0SMax Filippov                             const uint32_t par[])
2394168c12b0SMax Filippov {
2395168c12b0SMax Filippov     TCGv_i32 tmp = tcg_temp_new_i32();
2396b0b24bdcSMax Filippov     tcg_gen_shli_i32(tmp, arg[0].in, 3);
2397168c12b0SMax Filippov     gen_left_shift_sar(dc, tmp);
2398168c12b0SMax Filippov }
2399168c12b0SMax Filippov 
2400b0b24bdcSMax Filippov static void translate_ssa8l(DisasContext *dc, const OpcodeArg arg[],
2401168c12b0SMax Filippov                             const uint32_t par[])
2402168c12b0SMax Filippov {
2403168c12b0SMax Filippov     TCGv_i32 tmp = tcg_temp_new_i32();
2404b0b24bdcSMax Filippov     tcg_gen_shli_i32(tmp, arg[0].in, 3);
2405168c12b0SMax Filippov     gen_right_shift_sar(dc, tmp);
2406168c12b0SMax Filippov }
2407168c12b0SMax Filippov 
2408b0b24bdcSMax Filippov static void translate_ssai(DisasContext *dc, const OpcodeArg arg[],
2409168c12b0SMax Filippov                            const uint32_t par[])
2410168c12b0SMax Filippov {
24116ade0ce9SMax Filippov     gen_right_shift_sar(dc, tcg_constant_i32(arg[0].imm));
2412168c12b0SMax Filippov }
2413168c12b0SMax Filippov 
2414b0b24bdcSMax Filippov static void translate_ssl(DisasContext *dc, const OpcodeArg arg[],
2415168c12b0SMax Filippov                           const uint32_t par[])
2416168c12b0SMax Filippov {
2417b0b24bdcSMax Filippov     gen_left_shift_sar(dc, arg[0].in);
2418168c12b0SMax Filippov }
2419168c12b0SMax Filippov 
2420b0b24bdcSMax Filippov static void translate_ssr(DisasContext *dc, const OpcodeArg arg[],
2421168c12b0SMax Filippov                           const uint32_t par[])
2422168c12b0SMax Filippov {
2423b0b24bdcSMax Filippov     gen_right_shift_sar(dc, arg[0].in);
2424168c12b0SMax Filippov }
2425168c12b0SMax Filippov 
2426b0b24bdcSMax Filippov static void translate_sub(DisasContext *dc, const OpcodeArg arg[],
2427168c12b0SMax Filippov                           const uint32_t par[])
2428168c12b0SMax Filippov {
2429b0b24bdcSMax Filippov     tcg_gen_sub_i32(arg[0].out, arg[1].in, arg[2].in);
2430168c12b0SMax Filippov }
2431168c12b0SMax Filippov 
2432b0b24bdcSMax Filippov static void translate_subx(DisasContext *dc, const OpcodeArg arg[],
2433168c12b0SMax Filippov                            const uint32_t par[])
2434168c12b0SMax Filippov {
2435168c12b0SMax Filippov     TCGv_i32 tmp = tcg_temp_new_i32();
2436b0b24bdcSMax Filippov     tcg_gen_shli_i32(tmp, arg[1].in, par[0]);
2437b0b24bdcSMax Filippov     tcg_gen_sub_i32(arg[0].out, tmp, arg[2].in);
2438168c12b0SMax Filippov }
2439168c12b0SMax Filippov 
2440b0b24bdcSMax Filippov static void translate_waiti(DisasContext *dc, const OpcodeArg arg[],
2441168c12b0SMax Filippov                             const uint32_t par[])
2442168c12b0SMax Filippov {
2443ba7651fbSMax Filippov #ifndef CONFIG_USER_ONLY
24446ade0ce9SMax Filippov     TCGv_i32 pc = tcg_constant_i32(dc->base.pc_next);
24456ade0ce9SMax Filippov 
24466ade0ce9SMax Filippov     if (tb_cflags(dc->base.tb) & CF_USE_ICOUNT) {
24476ade0ce9SMax Filippov         gen_io_start();
24486ade0ce9SMax Filippov     }
24496ade0ce9SMax Filippov     gen_helper_waiti(cpu_env, pc, tcg_constant_i32(arg[0].imm));
2450ba7651fbSMax Filippov #endif
2451168c12b0SMax Filippov }
2452168c12b0SMax Filippov 
2453b0b24bdcSMax Filippov static void translate_wtlb(DisasContext *dc, const OpcodeArg arg[],
2454168c12b0SMax Filippov                            const uint32_t par[])
2455168c12b0SMax Filippov {
2456ba7651fbSMax Filippov #ifndef CONFIG_USER_ONLY
24574ee412dfSMax Filippov     TCGv_i32 dtlb = tcg_constant_i32(par[0]);
2458168c12b0SMax Filippov 
2459b0b24bdcSMax Filippov     gen_helper_wtlb(cpu_env, arg[0].in, arg[1].in, dtlb);
2460ba7651fbSMax Filippov #endif
2461168c12b0SMax Filippov }
2462168c12b0SMax Filippov 
24634d04ea35SMax Filippov static void translate_wptlb(DisasContext *dc, const OpcodeArg arg[],
24644d04ea35SMax Filippov                             const uint32_t par[])
24654d04ea35SMax Filippov {
24664d04ea35SMax Filippov #ifndef CONFIG_USER_ONLY
24674d04ea35SMax Filippov     gen_helper_wptlb(cpu_env, arg[0].in, arg[1].in);
24684d04ea35SMax Filippov #endif
24694d04ea35SMax Filippov }
24704d04ea35SMax Filippov 
2471b0b24bdcSMax Filippov static void translate_wer(DisasContext *dc, const OpcodeArg arg[],
2472168c12b0SMax Filippov                           const uint32_t par[])
2473168c12b0SMax Filippov {
2474b0b24bdcSMax Filippov     gen_helper_wer(cpu_env, arg[0].in, arg[1].in);
2475168c12b0SMax Filippov }
2476168c12b0SMax Filippov 
2477b0b24bdcSMax Filippov static void translate_wrmsk_expstate(DisasContext *dc, const OpcodeArg arg[],
2478e9872741SMax Filippov                                      const uint32_t par[])
2479e9872741SMax Filippov {
2480e9872741SMax Filippov     /* TODO: GPIO32 may be a part of coprocessor */
2481b0b24bdcSMax Filippov     tcg_gen_and_i32(cpu_UR[EXPSTATE], arg[0].in, arg[1].in);
2482e9872741SMax Filippov }
2483e9872741SMax Filippov 
2484b0b24bdcSMax Filippov static void translate_wsr(DisasContext *dc, const OpcodeArg arg[],
2485168c12b0SMax Filippov                           const uint32_t par[])
2486168c12b0SMax Filippov {
248759afd43dSMax Filippov     if (sr_name[par[0]]) {
248859419607SMax Filippov         tcg_gen_mov_i32(cpu_SR[par[0]], arg[0].in);
248959419607SMax Filippov     }
249059afd43dSMax Filippov }
249159419607SMax Filippov 
249259419607SMax Filippov static void translate_wsr_mask(DisasContext *dc, const OpcodeArg arg[],
249359419607SMax Filippov                                const uint32_t par[])
249459419607SMax Filippov {
249559afd43dSMax Filippov     if (sr_name[par[0]]) {
249659419607SMax Filippov         tcg_gen_andi_i32(cpu_SR[par[0]], arg[0].in, par[2]);
249759419607SMax Filippov     }
249859afd43dSMax Filippov }
249959419607SMax Filippov 
250059419607SMax Filippov static void translate_wsr_acchi(DisasContext *dc, const OpcodeArg arg[],
250159419607SMax Filippov                                 const uint32_t par[])
250259419607SMax Filippov {
250359419607SMax Filippov     tcg_gen_ext8s_i32(cpu_SR[par[0]], arg[0].in);
250459419607SMax Filippov }
250559419607SMax Filippov 
250659419607SMax Filippov static void translate_wsr_ccompare(DisasContext *dc, const OpcodeArg arg[],
250759419607SMax Filippov                                    const uint32_t par[])
250859419607SMax Filippov {
250959419607SMax Filippov #ifndef CONFIG_USER_ONLY
251059419607SMax Filippov     uint32_t id = par[0] - CCOMPARE;
251159419607SMax Filippov 
251259419607SMax Filippov     assert(id < dc->config->nccompare);
251359419607SMax Filippov     if (tb_cflags(dc->base.tb) & CF_USE_ICOUNT) {
251459419607SMax Filippov         gen_io_start();
251559419607SMax Filippov     }
251659419607SMax Filippov     tcg_gen_mov_i32(cpu_SR[par[0]], arg[0].in);
2517dad266a1SMax Filippov     gen_helper_update_ccompare(cpu_env, tcg_constant_i32(id));
251859419607SMax Filippov #endif
251959419607SMax Filippov }
252059419607SMax Filippov 
252159419607SMax Filippov static void translate_wsr_ccount(DisasContext *dc, const OpcodeArg arg[],
252259419607SMax Filippov                                  const uint32_t par[])
252359419607SMax Filippov {
252459419607SMax Filippov #ifndef CONFIG_USER_ONLY
252559419607SMax Filippov     if (tb_cflags(dc->base.tb) & CF_USE_ICOUNT) {
252659419607SMax Filippov         gen_io_start();
252759419607SMax Filippov     }
252859419607SMax Filippov     gen_helper_wsr_ccount(cpu_env, arg[0].in);
252959419607SMax Filippov #endif
253059419607SMax Filippov }
253159419607SMax Filippov 
253259419607SMax Filippov static void translate_wsr_dbreaka(DisasContext *dc, const OpcodeArg arg[],
253359419607SMax Filippov                                   const uint32_t par[])
253459419607SMax Filippov {
253559419607SMax Filippov #ifndef CONFIG_USER_ONLY
253659419607SMax Filippov     unsigned id = par[0] - DBREAKA;
253759419607SMax Filippov 
253859419607SMax Filippov     assert(id < dc->config->ndbreak);
2539dad266a1SMax Filippov     gen_helper_wsr_dbreaka(cpu_env, tcg_constant_i32(id), arg[0].in);
254059419607SMax Filippov #endif
254159419607SMax Filippov }
254259419607SMax Filippov 
254359419607SMax Filippov static void translate_wsr_dbreakc(DisasContext *dc, const OpcodeArg arg[],
254459419607SMax Filippov                                   const uint32_t par[])
254559419607SMax Filippov {
254659419607SMax Filippov #ifndef CONFIG_USER_ONLY
254759419607SMax Filippov     unsigned id = par[0] - DBREAKC;
254859419607SMax Filippov 
254959419607SMax Filippov     assert(id < dc->config->ndbreak);
2550dad266a1SMax Filippov     gen_helper_wsr_dbreakc(cpu_env, tcg_constant_i32(id), arg[0].in);
255159419607SMax Filippov #endif
255259419607SMax Filippov }
255359419607SMax Filippov 
255459419607SMax Filippov static void translate_wsr_ibreaka(DisasContext *dc, const OpcodeArg arg[],
255559419607SMax Filippov                                   const uint32_t par[])
255659419607SMax Filippov {
255759419607SMax Filippov #ifndef CONFIG_USER_ONLY
255859419607SMax Filippov     unsigned id = par[0] - IBREAKA;
255959419607SMax Filippov 
256059419607SMax Filippov     assert(id < dc->config->nibreak);
2561dad266a1SMax Filippov     gen_helper_wsr_ibreaka(cpu_env, tcg_constant_i32(id), arg[0].in);
256259419607SMax Filippov #endif
256359419607SMax Filippov }
256459419607SMax Filippov 
256559419607SMax Filippov static void translate_wsr_ibreakenable(DisasContext *dc, const OpcodeArg arg[],
256659419607SMax Filippov                                        const uint32_t par[])
256759419607SMax Filippov {
256859419607SMax Filippov #ifndef CONFIG_USER_ONLY
256959419607SMax Filippov     gen_helper_wsr_ibreakenable(cpu_env, arg[0].in);
257059419607SMax Filippov #endif
257159419607SMax Filippov }
257259419607SMax Filippov 
257359419607SMax Filippov static void translate_wsr_icount(DisasContext *dc, const OpcodeArg arg[],
257459419607SMax Filippov                                  const uint32_t par[])
257559419607SMax Filippov {
257659419607SMax Filippov #ifndef CONFIG_USER_ONLY
257759419607SMax Filippov     if (dc->icount) {
257859419607SMax Filippov         tcg_gen_mov_i32(dc->next_icount, arg[0].in);
257959419607SMax Filippov     } else {
258059419607SMax Filippov         tcg_gen_mov_i32(cpu_SR[par[0]], arg[0].in);
258159419607SMax Filippov     }
258259419607SMax Filippov #endif
258359419607SMax Filippov }
258459419607SMax Filippov 
258559419607SMax Filippov static void translate_wsr_intclear(DisasContext *dc, const OpcodeArg arg[],
258659419607SMax Filippov                                    const uint32_t par[])
258759419607SMax Filippov {
258859419607SMax Filippov #ifndef CONFIG_USER_ONLY
258959419607SMax Filippov     gen_helper_intclear(cpu_env, arg[0].in);
259059419607SMax Filippov #endif
259159419607SMax Filippov }
259259419607SMax Filippov 
259359419607SMax Filippov static void translate_wsr_intset(DisasContext *dc, const OpcodeArg arg[],
259459419607SMax Filippov                                  const uint32_t par[])
259559419607SMax Filippov {
259659419607SMax Filippov #ifndef CONFIG_USER_ONLY
259759419607SMax Filippov     gen_helper_intset(cpu_env, arg[0].in);
259859419607SMax Filippov #endif
259959419607SMax Filippov }
260059419607SMax Filippov 
260159419607SMax Filippov static void translate_wsr_memctl(DisasContext *dc, const OpcodeArg arg[],
260259419607SMax Filippov                                  const uint32_t par[])
260359419607SMax Filippov {
260459419607SMax Filippov #ifndef CONFIG_USER_ONLY
260559419607SMax Filippov     gen_helper_wsr_memctl(cpu_env, arg[0].in);
260659419607SMax Filippov #endif
260759419607SMax Filippov }
260859419607SMax Filippov 
26094d04ea35SMax Filippov static void translate_wsr_mpuenb(DisasContext *dc, const OpcodeArg arg[],
26104d04ea35SMax Filippov                                  const uint32_t par[])
26114d04ea35SMax Filippov {
26124d04ea35SMax Filippov #ifndef CONFIG_USER_ONLY
26134d04ea35SMax Filippov     gen_helper_wsr_mpuenb(cpu_env, arg[0].in);
26144d04ea35SMax Filippov #endif
26154d04ea35SMax Filippov }
26164d04ea35SMax Filippov 
261759419607SMax Filippov static void translate_wsr_ps(DisasContext *dc, const OpcodeArg arg[],
261859419607SMax Filippov                              const uint32_t par[])
261959419607SMax Filippov {
262059419607SMax Filippov #ifndef CONFIG_USER_ONLY
262159419607SMax Filippov     uint32_t mask = PS_WOE | PS_CALLINC | PS_OWB |
262259419607SMax Filippov         PS_UM | PS_EXCM | PS_INTLEVEL;
262359419607SMax Filippov 
26246c438056SMax Filippov     if (option_enabled(dc, XTENSA_OPTION_MMU) ||
26256c438056SMax Filippov         option_enabled(dc, XTENSA_OPTION_MPU)) {
262659419607SMax Filippov         mask |= PS_RING;
262759419607SMax Filippov     }
262859419607SMax Filippov     tcg_gen_andi_i32(cpu_SR[par[0]], arg[0].in, mask);
262959419607SMax Filippov #endif
263059419607SMax Filippov }
263159419607SMax Filippov 
263259419607SMax Filippov static void translate_wsr_rasid(DisasContext *dc, const OpcodeArg arg[],
263359419607SMax Filippov                                 const uint32_t par[])
263459419607SMax Filippov {
263559419607SMax Filippov #ifndef CONFIG_USER_ONLY
263659419607SMax Filippov     gen_helper_wsr_rasid(cpu_env, arg[0].in);
263759419607SMax Filippov #endif
263859419607SMax Filippov }
263959419607SMax Filippov 
264059419607SMax Filippov static void translate_wsr_sar(DisasContext *dc, const OpcodeArg arg[],
264159419607SMax Filippov                               const uint32_t par[])
264259419607SMax Filippov {
264359419607SMax Filippov     tcg_gen_andi_i32(cpu_SR[par[0]], arg[0].in, 0x3f);
264459419607SMax Filippov     if (dc->sar_m32_5bit) {
264559419607SMax Filippov         tcg_gen_discard_i32(dc->sar_m32);
264659419607SMax Filippov     }
264759419607SMax Filippov     dc->sar_5bit = false;
264859419607SMax Filippov     dc->sar_m32_5bit = false;
264959419607SMax Filippov }
265059419607SMax Filippov 
265159419607SMax Filippov static void translate_wsr_windowbase(DisasContext *dc, const OpcodeArg arg[],
265259419607SMax Filippov                                      const uint32_t par[])
265359419607SMax Filippov {
265459419607SMax Filippov #ifndef CONFIG_USER_ONLY
265559419607SMax Filippov     tcg_gen_mov_i32(cpu_windowbase_next, arg[0].in);
265659419607SMax Filippov #endif
265759419607SMax Filippov }
265859419607SMax Filippov 
265959419607SMax Filippov static void translate_wsr_windowstart(DisasContext *dc, const OpcodeArg arg[],
266059419607SMax Filippov                                       const uint32_t par[])
266159419607SMax Filippov {
266259419607SMax Filippov #ifndef CONFIG_USER_ONLY
266359419607SMax Filippov     tcg_gen_andi_i32(cpu_SR[par[0]], arg[0].in,
266459419607SMax Filippov                      (1 << dc->config->nareg / 4) - 1);
266559419607SMax Filippov #endif
2666168c12b0SMax Filippov }
2667168c12b0SMax Filippov 
2668b0b24bdcSMax Filippov static void translate_wur(DisasContext *dc, const OpcodeArg arg[],
2669168c12b0SMax Filippov                           const uint32_t par[])
2670168c12b0SMax Filippov {
267159419607SMax Filippov     tcg_gen_mov_i32(cpu_UR[par[0]], arg[0].in);
2672168c12b0SMax Filippov }
267359419607SMax Filippov 
2674b0b24bdcSMax Filippov static void translate_xor(DisasContext *dc, const OpcodeArg arg[],
2675168c12b0SMax Filippov                           const uint32_t par[])
2676168c12b0SMax Filippov {
2677b0b24bdcSMax Filippov     tcg_gen_xor_i32(arg[0].out, arg[1].in, arg[2].in);
2678168c12b0SMax Filippov }
2679168c12b0SMax Filippov 
2680b0b24bdcSMax Filippov static void translate_xsr(DisasContext *dc, const OpcodeArg arg[],
2681168c12b0SMax Filippov                           const uint32_t par[])
2682168c12b0SMax Filippov {
268359afd43dSMax Filippov     if (sr_name[par[0]]) {
2684168c12b0SMax Filippov         TCGv_i32 tmp = tcg_temp_new_i32();
2685168c12b0SMax Filippov 
2686b0b24bdcSMax Filippov         tcg_gen_mov_i32(tmp, arg[0].in);
268759419607SMax Filippov         tcg_gen_mov_i32(arg[0].out, cpu_SR[par[0]]);
268859419607SMax Filippov         tcg_gen_mov_i32(cpu_SR[par[0]], tmp);
268959afd43dSMax Filippov     } else {
269059afd43dSMax Filippov         tcg_gen_movi_i32(arg[0].out, 0);
269159afd43dSMax Filippov     }
2692168c12b0SMax Filippov }
2693168c12b0SMax Filippov 
269459419607SMax Filippov static void translate_xsr_mask(DisasContext *dc, const OpcodeArg arg[],
269559419607SMax Filippov                                const uint32_t par[])
269659419607SMax Filippov {
269759afd43dSMax Filippov     if (sr_name[par[0]]) {
269859419607SMax Filippov         TCGv_i32 tmp = tcg_temp_new_i32();
269959419607SMax Filippov 
270059419607SMax Filippov         tcg_gen_mov_i32(tmp, arg[0].in);
270159419607SMax Filippov         tcg_gen_mov_i32(arg[0].out, cpu_SR[par[0]]);
270259419607SMax Filippov         tcg_gen_andi_i32(cpu_SR[par[0]], tmp, par[2]);
270359afd43dSMax Filippov     } else {
270459afd43dSMax Filippov         tcg_gen_movi_i32(arg[0].out, 0);
270559afd43dSMax Filippov     }
270659419607SMax Filippov }
270759419607SMax Filippov 
270859419607SMax Filippov static void translate_xsr_ccount(DisasContext *dc, const OpcodeArg arg[],
270959419607SMax Filippov                                  const uint32_t par[])
271059419607SMax Filippov {
271159419607SMax Filippov #ifndef CONFIG_USER_ONLY
271259419607SMax Filippov     TCGv_i32 tmp = tcg_temp_new_i32();
271359419607SMax Filippov 
271459419607SMax Filippov     if (tb_cflags(dc->base.tb) & CF_USE_ICOUNT) {
271559419607SMax Filippov         gen_io_start();
271659419607SMax Filippov     }
271759419607SMax Filippov 
271859419607SMax Filippov     gen_helper_update_ccount(cpu_env);
271959419607SMax Filippov     tcg_gen_mov_i32(tmp, cpu_SR[par[0]]);
272059419607SMax Filippov     gen_helper_wsr_ccount(cpu_env, arg[0].in);
272159419607SMax Filippov     tcg_gen_mov_i32(arg[0].out, tmp);
272259419607SMax Filippov 
272359419607SMax Filippov #endif
272459419607SMax Filippov }
272559419607SMax Filippov 
272659419607SMax Filippov #define gen_translate_xsr(name) \
272759419607SMax Filippov     static void translate_xsr_##name(DisasContext *dc, const OpcodeArg arg[], \
272859419607SMax Filippov                                      const uint32_t par[]) \
272959419607SMax Filippov { \
273059419607SMax Filippov     TCGv_i32 tmp = tcg_temp_new_i32(); \
273159419607SMax Filippov  \
273259afd43dSMax Filippov     if (sr_name[par[0]]) { \
273359419607SMax Filippov         tcg_gen_mov_i32(tmp, cpu_SR[par[0]]); \
273459afd43dSMax Filippov     } else { \
273559afd43dSMax Filippov         tcg_gen_movi_i32(tmp, 0); \
273659afd43dSMax Filippov     } \
273759419607SMax Filippov     translate_wsr_##name(dc, arg, par); \
273859419607SMax Filippov     tcg_gen_mov_i32(arg[0].out, tmp); \
273959419607SMax Filippov }
274059419607SMax Filippov 
274159419607SMax Filippov gen_translate_xsr(acchi)
274259419607SMax Filippov gen_translate_xsr(ccompare)
274359419607SMax Filippov gen_translate_xsr(dbreaka)
274459419607SMax Filippov gen_translate_xsr(dbreakc)
274559419607SMax Filippov gen_translate_xsr(ibreaka)
274659419607SMax Filippov gen_translate_xsr(ibreakenable)
274759419607SMax Filippov gen_translate_xsr(icount)
274859419607SMax Filippov gen_translate_xsr(memctl)
27494d04ea35SMax Filippov gen_translate_xsr(mpuenb)
275059419607SMax Filippov gen_translate_xsr(ps)
275159419607SMax Filippov gen_translate_xsr(rasid)
275259419607SMax Filippov gen_translate_xsr(sar)
275359419607SMax Filippov gen_translate_xsr(windowbase)
275459419607SMax Filippov gen_translate_xsr(windowstart)
275559419607SMax Filippov 
275659419607SMax Filippov #undef gen_translate_xsr
275759419607SMax Filippov 
2758168c12b0SMax Filippov static const XtensaOpcodeOps core_ops[] = {
2759168c12b0SMax Filippov     {
2760168c12b0SMax Filippov         .name = "abs",
2761168c12b0SMax Filippov         .translate = translate_abs,
2762168c12b0SMax Filippov     }, {
2763d863fcf7SMax Filippov         .name = (const char * const[]) {
2764d863fcf7SMax Filippov             "add", "add.n", NULL,
2765d863fcf7SMax Filippov         },
2766168c12b0SMax Filippov         .translate = translate_add,
2767d863fcf7SMax Filippov         .op_flags = XTENSA_OP_NAME_ARRAY,
2768168c12b0SMax Filippov     }, {
2769d863fcf7SMax Filippov         .name = (const char * const[]) {
2770d863fcf7SMax Filippov             "addi", "addi.n", NULL,
2771d863fcf7SMax Filippov         },
2772168c12b0SMax Filippov         .translate = translate_addi,
2773d863fcf7SMax Filippov         .op_flags = XTENSA_OP_NAME_ARRAY,
2774168c12b0SMax Filippov     }, {
2775168c12b0SMax Filippov         .name = "addmi",
2776168c12b0SMax Filippov         .translate = translate_addi,
2777168c12b0SMax Filippov     }, {
2778168c12b0SMax Filippov         .name = "addx2",
2779168c12b0SMax Filippov         .translate = translate_addx,
2780168c12b0SMax Filippov         .par = (const uint32_t[]){1},
2781168c12b0SMax Filippov     }, {
2782168c12b0SMax Filippov         .name = "addx4",
2783168c12b0SMax Filippov         .translate = translate_addx,
2784168c12b0SMax Filippov         .par = (const uint32_t[]){2},
2785168c12b0SMax Filippov     }, {
2786168c12b0SMax Filippov         .name = "addx8",
2787168c12b0SMax Filippov         .translate = translate_addx,
2788168c12b0SMax Filippov         .par = (const uint32_t[]){3},
2789168c12b0SMax Filippov     }, {
2790168c12b0SMax Filippov         .name = "all4",
2791168c12b0SMax Filippov         .translate = translate_all,
2792168c12b0SMax Filippov         .par = (const uint32_t[]){true, 4},
2793168c12b0SMax Filippov     }, {
2794168c12b0SMax Filippov         .name = "all8",
2795168c12b0SMax Filippov         .translate = translate_all,
2796168c12b0SMax Filippov         .par = (const uint32_t[]){true, 8},
2797168c12b0SMax Filippov     }, {
2798168c12b0SMax Filippov         .name = "and",
2799168c12b0SMax Filippov         .translate = translate_and,
2800168c12b0SMax Filippov     }, {
2801168c12b0SMax Filippov         .name = "andb",
2802168c12b0SMax Filippov         .translate = translate_boolean,
2803168c12b0SMax Filippov         .par = (const uint32_t[]){BOOLEAN_AND},
2804168c12b0SMax Filippov     }, {
2805168c12b0SMax Filippov         .name = "andbc",
2806168c12b0SMax Filippov         .translate = translate_boolean,
2807168c12b0SMax Filippov         .par = (const uint32_t[]){BOOLEAN_ANDC},
2808168c12b0SMax Filippov     }, {
2809168c12b0SMax Filippov         .name = "any4",
2810168c12b0SMax Filippov         .translate = translate_all,
2811168c12b0SMax Filippov         .par = (const uint32_t[]){false, 4},
2812168c12b0SMax Filippov     }, {
2813168c12b0SMax Filippov         .name = "any8",
2814168c12b0SMax Filippov         .translate = translate_all,
2815168c12b0SMax Filippov         .par = (const uint32_t[]){false, 8},
2816168c12b0SMax Filippov     }, {
2817fa6bc73cSMax Filippov         .name = (const char * const[]) {
2818fa6bc73cSMax Filippov             "ball", "ball.w15", "ball.w18", NULL,
2819fa6bc73cSMax Filippov         },
2820168c12b0SMax Filippov         .translate = translate_ball,
2821168c12b0SMax Filippov         .par = (const uint32_t[]){TCG_COND_EQ},
2822fa6bc73cSMax Filippov         .op_flags = XTENSA_OP_NAME_ARRAY,
2823168c12b0SMax Filippov     }, {
2824d863fcf7SMax Filippov         .name = (const char * const[]) {
2825fa6bc73cSMax Filippov             "bany", "bany.w15", "bany.w18", NULL,
2826fa6bc73cSMax Filippov         },
2827fa6bc73cSMax Filippov         .translate = translate_bany,
2828fa6bc73cSMax Filippov         .par = (const uint32_t[]){TCG_COND_NE},
2829fa6bc73cSMax Filippov         .op_flags = XTENSA_OP_NAME_ARRAY,
2830fa6bc73cSMax Filippov     }, {
2831fa6bc73cSMax Filippov         .name = (const char * const[]) {
2832fa6bc73cSMax Filippov             "bbc", "bbc.w15", "bbc.w18", NULL,
2833fa6bc73cSMax Filippov         },
2834fa6bc73cSMax Filippov         .translate = translate_bb,
2835fa6bc73cSMax Filippov         .par = (const uint32_t[]){TCG_COND_EQ},
2836fa6bc73cSMax Filippov         .op_flags = XTENSA_OP_NAME_ARRAY,
2837fa6bc73cSMax Filippov     }, {
2838fa6bc73cSMax Filippov         .name = (const char * const[]) {
2839fa6bc73cSMax Filippov             "bbci", "bbci.w15", "bbci.w18", NULL,
2840fa6bc73cSMax Filippov         },
2841fa6bc73cSMax Filippov         .translate = translate_bbi,
2842fa6bc73cSMax Filippov         .par = (const uint32_t[]){TCG_COND_EQ},
2843fa6bc73cSMax Filippov         .op_flags = XTENSA_OP_NAME_ARRAY,
2844fa6bc73cSMax Filippov     }, {
2845fa6bc73cSMax Filippov         .name = (const char * const[]) {
2846fa6bc73cSMax Filippov             "bbs", "bbs.w15", "bbs.w18", NULL,
2847fa6bc73cSMax Filippov         },
2848fa6bc73cSMax Filippov         .translate = translate_bb,
2849fa6bc73cSMax Filippov         .par = (const uint32_t[]){TCG_COND_NE},
2850fa6bc73cSMax Filippov         .op_flags = XTENSA_OP_NAME_ARRAY,
2851fa6bc73cSMax Filippov     }, {
2852fa6bc73cSMax Filippov         .name = (const char * const[]) {
2853fa6bc73cSMax Filippov             "bbsi", "bbsi.w15", "bbsi.w18", NULL,
2854fa6bc73cSMax Filippov         },
2855fa6bc73cSMax Filippov         .translate = translate_bbi,
2856fa6bc73cSMax Filippov         .par = (const uint32_t[]){TCG_COND_NE},
2857fa6bc73cSMax Filippov         .op_flags = XTENSA_OP_NAME_ARRAY,
2858fa6bc73cSMax Filippov     }, {
2859fa6bc73cSMax Filippov         .name = (const char * const[]) {
2860fa6bc73cSMax Filippov             "beq", "beq.w15", "beq.w18", NULL,
2861fa6bc73cSMax Filippov         },
2862fa6bc73cSMax Filippov         .translate = translate_b,
2863fa6bc73cSMax Filippov         .par = (const uint32_t[]){TCG_COND_EQ},
2864fa6bc73cSMax Filippov         .op_flags = XTENSA_OP_NAME_ARRAY,
2865fa6bc73cSMax Filippov     }, {
2866fa6bc73cSMax Filippov         .name = (const char * const[]) {
2867fa6bc73cSMax Filippov             "beqi", "beqi.w15", "beqi.w18", NULL,
2868fa6bc73cSMax Filippov         },
2869fa6bc73cSMax Filippov         .translate = translate_bi,
2870fa6bc73cSMax Filippov         .par = (const uint32_t[]){TCG_COND_EQ},
2871fa6bc73cSMax Filippov         .op_flags = XTENSA_OP_NAME_ARRAY,
2872fa6bc73cSMax Filippov     }, {
2873fa6bc73cSMax Filippov         .name = (const char * const[]) {
2874fa6bc73cSMax Filippov             "beqz", "beqz.n", "beqz.w15", "beqz.w18", NULL,
2875d863fcf7SMax Filippov         },
2876168c12b0SMax Filippov         .translate = translate_bz,
2877168c12b0SMax Filippov         .par = (const uint32_t[]){TCG_COND_EQ},
2878d863fcf7SMax Filippov         .op_flags = XTENSA_OP_NAME_ARRAY,
2879168c12b0SMax Filippov     }, {
2880168c12b0SMax Filippov         .name = "bf",
2881168c12b0SMax Filippov         .translate = translate_bp,
2882168c12b0SMax Filippov         .par = (const uint32_t[]){TCG_COND_EQ},
2883168c12b0SMax Filippov     }, {
2884fa6bc73cSMax Filippov         .name = (const char * const[]) {
2885fa6bc73cSMax Filippov             "bge", "bge.w15", "bge.w18", NULL,
2886fa6bc73cSMax Filippov         },
2887168c12b0SMax Filippov         .translate = translate_b,
2888168c12b0SMax Filippov         .par = (const uint32_t[]){TCG_COND_GE},
2889fa6bc73cSMax Filippov         .op_flags = XTENSA_OP_NAME_ARRAY,
2890168c12b0SMax Filippov     }, {
2891d863fcf7SMax Filippov         .name = (const char * const[]) {
2892fa6bc73cSMax Filippov             "bgei", "bgei.w15", "bgei.w18", NULL,
2893fa6bc73cSMax Filippov         },
2894fa6bc73cSMax Filippov         .translate = translate_bi,
2895fa6bc73cSMax Filippov         .par = (const uint32_t[]){TCG_COND_GE},
2896fa6bc73cSMax Filippov         .op_flags = XTENSA_OP_NAME_ARRAY,
2897fa6bc73cSMax Filippov     }, {
2898fa6bc73cSMax Filippov         .name = (const char * const[]) {
2899fa6bc73cSMax Filippov             "bgeu", "bgeu.w15", "bgeu.w18", NULL,
2900fa6bc73cSMax Filippov         },
2901fa6bc73cSMax Filippov         .translate = translate_b,
2902fa6bc73cSMax Filippov         .par = (const uint32_t[]){TCG_COND_GEU},
2903fa6bc73cSMax Filippov         .op_flags = XTENSA_OP_NAME_ARRAY,
2904fa6bc73cSMax Filippov     }, {
2905fa6bc73cSMax Filippov         .name = (const char * const[]) {
2906fa6bc73cSMax Filippov             "bgeui", "bgeui.w15", "bgeui.w18", NULL,
2907fa6bc73cSMax Filippov         },
2908fa6bc73cSMax Filippov         .translate = translate_bi,
2909fa6bc73cSMax Filippov         .par = (const uint32_t[]){TCG_COND_GEU},
2910fa6bc73cSMax Filippov         .op_flags = XTENSA_OP_NAME_ARRAY,
2911fa6bc73cSMax Filippov     }, {
2912fa6bc73cSMax Filippov         .name = (const char * const[]) {
2913fa6bc73cSMax Filippov             "bgez", "bgez.w15", "bgez.w18", NULL,
2914fa6bc73cSMax Filippov         },
2915fa6bc73cSMax Filippov         .translate = translate_bz,
2916fa6bc73cSMax Filippov         .par = (const uint32_t[]){TCG_COND_GE},
2917fa6bc73cSMax Filippov         .op_flags = XTENSA_OP_NAME_ARRAY,
2918fa6bc73cSMax Filippov     }, {
2919fa6bc73cSMax Filippov         .name = (const char * const[]) {
2920fa6bc73cSMax Filippov             "blt", "blt.w15", "blt.w18", NULL,
2921fa6bc73cSMax Filippov         },
2922fa6bc73cSMax Filippov         .translate = translate_b,
2923fa6bc73cSMax Filippov         .par = (const uint32_t[]){TCG_COND_LT},
2924fa6bc73cSMax Filippov         .op_flags = XTENSA_OP_NAME_ARRAY,
2925fa6bc73cSMax Filippov     }, {
2926fa6bc73cSMax Filippov         .name = (const char * const[]) {
2927fa6bc73cSMax Filippov             "blti", "blti.w15", "blti.w18", NULL,
2928fa6bc73cSMax Filippov         },
2929fa6bc73cSMax Filippov         .translate = translate_bi,
2930fa6bc73cSMax Filippov         .par = (const uint32_t[]){TCG_COND_LT},
2931fa6bc73cSMax Filippov         .op_flags = XTENSA_OP_NAME_ARRAY,
2932fa6bc73cSMax Filippov     }, {
2933fa6bc73cSMax Filippov         .name = (const char * const[]) {
2934fa6bc73cSMax Filippov             "bltu", "bltu.w15", "bltu.w18", NULL,
2935fa6bc73cSMax Filippov         },
2936fa6bc73cSMax Filippov         .translate = translate_b,
2937fa6bc73cSMax Filippov         .par = (const uint32_t[]){TCG_COND_LTU},
2938fa6bc73cSMax Filippov         .op_flags = XTENSA_OP_NAME_ARRAY,
2939fa6bc73cSMax Filippov     }, {
2940fa6bc73cSMax Filippov         .name = (const char * const[]) {
2941fa6bc73cSMax Filippov             "bltui", "bltui.w15", "bltui.w18", NULL,
2942fa6bc73cSMax Filippov         },
2943fa6bc73cSMax Filippov         .translate = translate_bi,
2944fa6bc73cSMax Filippov         .par = (const uint32_t[]){TCG_COND_LTU},
2945fa6bc73cSMax Filippov         .op_flags = XTENSA_OP_NAME_ARRAY,
2946fa6bc73cSMax Filippov     }, {
2947fa6bc73cSMax Filippov         .name = (const char * const[]) {
2948fa6bc73cSMax Filippov             "bltz", "bltz.w15", "bltz.w18", NULL,
2949fa6bc73cSMax Filippov         },
2950fa6bc73cSMax Filippov         .translate = translate_bz,
2951fa6bc73cSMax Filippov         .par = (const uint32_t[]){TCG_COND_LT},
2952fa6bc73cSMax Filippov         .op_flags = XTENSA_OP_NAME_ARRAY,
2953fa6bc73cSMax Filippov     }, {
2954fa6bc73cSMax Filippov         .name = (const char * const[]) {
2955fa6bc73cSMax Filippov             "bnall", "bnall.w15", "bnall.w18", NULL,
2956fa6bc73cSMax Filippov         },
2957fa6bc73cSMax Filippov         .translate = translate_ball,
2958fa6bc73cSMax Filippov         .par = (const uint32_t[]){TCG_COND_NE},
2959fa6bc73cSMax Filippov         .op_flags = XTENSA_OP_NAME_ARRAY,
2960fa6bc73cSMax Filippov     }, {
2961fa6bc73cSMax Filippov         .name = (const char * const[]) {
2962fa6bc73cSMax Filippov             "bne", "bne.w15", "bne.w18", NULL,
2963fa6bc73cSMax Filippov         },
2964fa6bc73cSMax Filippov         .translate = translate_b,
2965fa6bc73cSMax Filippov         .par = (const uint32_t[]){TCG_COND_NE},
2966fa6bc73cSMax Filippov         .op_flags = XTENSA_OP_NAME_ARRAY,
2967fa6bc73cSMax Filippov     }, {
2968fa6bc73cSMax Filippov         .name = (const char * const[]) {
2969fa6bc73cSMax Filippov             "bnei", "bnei.w15", "bnei.w18", NULL,
2970fa6bc73cSMax Filippov         },
2971fa6bc73cSMax Filippov         .translate = translate_bi,
2972fa6bc73cSMax Filippov         .par = (const uint32_t[]){TCG_COND_NE},
2973fa6bc73cSMax Filippov         .op_flags = XTENSA_OP_NAME_ARRAY,
2974fa6bc73cSMax Filippov     }, {
2975fa6bc73cSMax Filippov         .name = (const char * const[]) {
2976fa6bc73cSMax Filippov             "bnez", "bnez.n", "bnez.w15", "bnez.w18", NULL,
2977d863fcf7SMax Filippov         },
2978168c12b0SMax Filippov         .translate = translate_bz,
2979168c12b0SMax Filippov         .par = (const uint32_t[]){TCG_COND_NE},
2980d863fcf7SMax Filippov         .op_flags = XTENSA_OP_NAME_ARRAY,
2981168c12b0SMax Filippov     }, {
2982fa6bc73cSMax Filippov         .name = (const char * const[]) {
2983fa6bc73cSMax Filippov             "bnone", "bnone.w15", "bnone.w18", NULL,
2984fa6bc73cSMax Filippov         },
2985168c12b0SMax Filippov         .translate = translate_bany,
2986168c12b0SMax Filippov         .par = (const uint32_t[]){TCG_COND_EQ},
2987fa6bc73cSMax Filippov         .op_flags = XTENSA_OP_NAME_ARRAY,
2988168c12b0SMax Filippov     }, {
2989168c12b0SMax Filippov         .name = "break",
299015477819SMax Filippov         .translate = translate_nop,
2991168c12b0SMax Filippov         .par = (const uint32_t[]){DEBUGCAUSE_BI},
299215477819SMax Filippov         .op_flags = XTENSA_OP_DEBUG_BREAK,
2993168c12b0SMax Filippov     }, {
2994168c12b0SMax Filippov         .name = "break.n",
299515477819SMax Filippov         .translate = translate_nop,
2996168c12b0SMax Filippov         .par = (const uint32_t[]){DEBUGCAUSE_BN},
299715477819SMax Filippov         .op_flags = XTENSA_OP_DEBUG_BREAK,
2998168c12b0SMax Filippov     }, {
2999168c12b0SMax Filippov         .name = "bt",
3000168c12b0SMax Filippov         .translate = translate_bp,
3001168c12b0SMax Filippov         .par = (const uint32_t[]){TCG_COND_NE},
3002168c12b0SMax Filippov     }, {
3003168c12b0SMax Filippov         .name = "call0",
3004168c12b0SMax Filippov         .translate = translate_call0,
3005168c12b0SMax Filippov     }, {
3006168c12b0SMax Filippov         .name = "call12",
3007168c12b0SMax Filippov         .translate = translate_callw,
3008168c12b0SMax Filippov         .par = (const uint32_t[]){3},
3009168c12b0SMax Filippov     }, {
3010168c12b0SMax Filippov         .name = "call4",
3011168c12b0SMax Filippov         .translate = translate_callw,
3012168c12b0SMax Filippov         .par = (const uint32_t[]){1},
3013168c12b0SMax Filippov     }, {
3014168c12b0SMax Filippov         .name = "call8",
3015168c12b0SMax Filippov         .translate = translate_callw,
3016168c12b0SMax Filippov         .par = (const uint32_t[]){2},
3017168c12b0SMax Filippov     }, {
3018168c12b0SMax Filippov         .name = "callx0",
3019168c12b0SMax Filippov         .translate = translate_callx0,
3020168c12b0SMax Filippov     }, {
3021168c12b0SMax Filippov         .name = "callx12",
3022168c12b0SMax Filippov         .translate = translate_callxw,
3023168c12b0SMax Filippov         .par = (const uint32_t[]){3},
3024168c12b0SMax Filippov     }, {
3025168c12b0SMax Filippov         .name = "callx4",
3026168c12b0SMax Filippov         .translate = translate_callxw,
3027168c12b0SMax Filippov         .par = (const uint32_t[]){1},
3028168c12b0SMax Filippov     }, {
3029168c12b0SMax Filippov         .name = "callx8",
3030168c12b0SMax Filippov         .translate = translate_callxw,
3031168c12b0SMax Filippov         .par = (const uint32_t[]){2},
3032168c12b0SMax Filippov     }, {
3033168c12b0SMax Filippov         .name = "clamps",
3034168c12b0SMax Filippov         .translate = translate_clamps,
3035168c12b0SMax Filippov     }, {
3036e9872741SMax Filippov         .name = "clrb_expstate",
3037e9872741SMax Filippov         .translate = translate_clrb_expstate,
3038e9872741SMax Filippov     }, {
3039b345e140SMax Filippov         .name = "clrex",
3040b345e140SMax Filippov         .translate = translate_clrex,
3041b345e140SMax Filippov     }, {
3042c5ac936eSMax Filippov         .name = "const16",
3043c5ac936eSMax Filippov         .translate = translate_const16,
3044c5ac936eSMax Filippov     }, {
3045168c12b0SMax Filippov         .name = "depbits",
3046168c12b0SMax Filippov         .translate = translate_depbits,
3047168c12b0SMax Filippov     }, {
3048168c12b0SMax Filippov         .name = "dhi",
3049168c12b0SMax Filippov         .translate = translate_dcache,
305021a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
3051168c12b0SMax Filippov     }, {
3052c884400fSMax Filippov         .name = "dhi.b",
3053c884400fSMax Filippov         .translate = translate_nop,
3054c884400fSMax Filippov     }, {
3055168c12b0SMax Filippov         .name = "dhu",
3056168c12b0SMax Filippov         .translate = translate_dcache,
305721a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
3058168c12b0SMax Filippov     }, {
3059168c12b0SMax Filippov         .name = "dhwb",
3060168c12b0SMax Filippov         .translate = translate_dcache,
3061168c12b0SMax Filippov     }, {
3062c884400fSMax Filippov         .name = "dhwb.b",
3063c884400fSMax Filippov         .translate = translate_nop,
3064c884400fSMax Filippov     }, {
3065168c12b0SMax Filippov         .name = "dhwbi",
3066168c12b0SMax Filippov         .translate = translate_dcache,
3067168c12b0SMax Filippov     }, {
3068c884400fSMax Filippov         .name = "dhwbi.b",
3069c884400fSMax Filippov         .translate = translate_nop,
3070c884400fSMax Filippov     }, {
3071168c12b0SMax Filippov         .name = "dii",
30726416d16fSMax Filippov         .translate = translate_nop,
307321a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
3074168c12b0SMax Filippov     }, {
3075168c12b0SMax Filippov         .name = "diu",
30766416d16fSMax Filippov         .translate = translate_nop,
307721a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
3078168c12b0SMax Filippov     }, {
3079168c12b0SMax Filippov         .name = "diwb",
30806416d16fSMax Filippov         .translate = translate_nop,
308121a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
3082168c12b0SMax Filippov     }, {
3083168c12b0SMax Filippov         .name = "diwbi",
30846416d16fSMax Filippov         .translate = translate_nop,
308521a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
3086168c12b0SMax Filippov     }, {
308775eed0e5SMax Filippov         .name = "diwbui.p",
308875eed0e5SMax Filippov         .translate = translate_diwbuip,
308975eed0e5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
309075eed0e5SMax Filippov     }, {
3091168c12b0SMax Filippov         .name = "dpfl",
3092168c12b0SMax Filippov         .translate = translate_dcache,
309321a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
3094168c12b0SMax Filippov     }, {
3095c884400fSMax Filippov         .name = "dpfm.b",
3096c884400fSMax Filippov         .translate = translate_nop,
3097c884400fSMax Filippov     }, {
3098c884400fSMax Filippov         .name = "dpfm.bf",
3099c884400fSMax Filippov         .translate = translate_nop,
3100c884400fSMax Filippov     }, {
3101168c12b0SMax Filippov         .name = "dpfr",
31026416d16fSMax Filippov         .translate = translate_nop,
3103168c12b0SMax Filippov     }, {
3104c884400fSMax Filippov         .name = "dpfr.b",
3105c884400fSMax Filippov         .translate = translate_nop,
3106c884400fSMax Filippov     }, {
3107c884400fSMax Filippov         .name = "dpfr.bf",
3108c884400fSMax Filippov         .translate = translate_nop,
3109c884400fSMax Filippov     }, {
3110168c12b0SMax Filippov         .name = "dpfro",
31116416d16fSMax Filippov         .translate = translate_nop,
3112168c12b0SMax Filippov     }, {
3113168c12b0SMax Filippov         .name = "dpfw",
31146416d16fSMax Filippov         .translate = translate_nop,
3115168c12b0SMax Filippov     }, {
3116c884400fSMax Filippov         .name = "dpfw.b",
3117c884400fSMax Filippov         .translate = translate_nop,
3118c884400fSMax Filippov     }, {
3119c884400fSMax Filippov         .name = "dpfw.bf",
3120c884400fSMax Filippov         .translate = translate_nop,
3121c884400fSMax Filippov     }, {
3122168c12b0SMax Filippov         .name = "dpfwo",
31236416d16fSMax Filippov         .translate = translate_nop,
3124168c12b0SMax Filippov     }, {
3125168c12b0SMax Filippov         .name = "dsync",
3126168c12b0SMax Filippov         .translate = translate_nop,
3127168c12b0SMax Filippov     }, {
3128168c12b0SMax Filippov         .name = "entry",
3129168c12b0SMax Filippov         .translate = translate_entry,
313091dc2b2dSMax Filippov         .test_exceptions = test_exceptions_entry,
31316416d16fSMax Filippov         .test_overflow = test_overflow_entry,
31328df3fd35SMax Filippov         .op_flags = XTENSA_OP_EXIT_TB_M1 |
31338df3fd35SMax Filippov             XTENSA_OP_SYNC_REGISTER_WINDOW,
3134168c12b0SMax Filippov     }, {
3135168c12b0SMax Filippov         .name = "esync",
3136168c12b0SMax Filippov         .translate = translate_nop,
3137168c12b0SMax Filippov     }, {
3138168c12b0SMax Filippov         .name = "excw",
3139168c12b0SMax Filippov         .translate = translate_nop,
3140168c12b0SMax Filippov     }, {
3141168c12b0SMax Filippov         .name = "extui",
3142168c12b0SMax Filippov         .translate = translate_extui,
3143168c12b0SMax Filippov     }, {
3144168c12b0SMax Filippov         .name = "extw",
31459fb40342SMax Filippov         .translate = translate_memw,
3146168c12b0SMax Filippov     }, {
3147b345e140SMax Filippov         .name = "getex",
3148b345e140SMax Filippov         .translate = translate_getex,
3149b345e140SMax Filippov     }, {
315013f6a7cdSMax Filippov         .name = "hwwdtlba",
315109460970SMax Filippov         .op_flags = XTENSA_OP_ILL,
315213f6a7cdSMax Filippov     }, {
315313f6a7cdSMax Filippov         .name = "hwwitlba",
315409460970SMax Filippov         .op_flags = XTENSA_OP_ILL,
315513f6a7cdSMax Filippov     }, {
3156168c12b0SMax Filippov         .name = "idtlb",
3157168c12b0SMax Filippov         .translate = translate_itlb,
3158168c12b0SMax Filippov         .par = (const uint32_t[]){true},
3159226444a8SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED | XTENSA_OP_EXIT_TB_M1,
3160168c12b0SMax Filippov     }, {
3161168c12b0SMax Filippov         .name = "ihi",
3162168c12b0SMax Filippov         .translate = translate_icache,
3163168c12b0SMax Filippov     }, {
3164168c12b0SMax Filippov         .name = "ihu",
3165168c12b0SMax Filippov         .translate = translate_icache,
316621a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
3167168c12b0SMax Filippov     }, {
3168168c12b0SMax Filippov         .name = "iii",
31696416d16fSMax Filippov         .translate = translate_nop,
317021a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
3171168c12b0SMax Filippov     }, {
3172168c12b0SMax Filippov         .name = "iitlb",
3173168c12b0SMax Filippov         .translate = translate_itlb,
3174168c12b0SMax Filippov         .par = (const uint32_t[]){false},
3175226444a8SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED | XTENSA_OP_EXIT_TB_M1,
3176168c12b0SMax Filippov     }, {
3177168c12b0SMax Filippov         .name = "iiu",
31786416d16fSMax Filippov         .translate = translate_nop,
317921a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
3180168c12b0SMax Filippov     }, {
3181d863fcf7SMax Filippov         .name = (const char * const[]) {
3182d863fcf7SMax Filippov             "ill", "ill.n", NULL,
3183d863fcf7SMax Filippov         },
3184d863fcf7SMax Filippov         .op_flags = XTENSA_OP_ILL | XTENSA_OP_NAME_ARRAY,
3185168c12b0SMax Filippov     }, {
3186168c12b0SMax Filippov         .name = "ipf",
31876416d16fSMax Filippov         .translate = translate_nop,
3188168c12b0SMax Filippov     }, {
3189168c12b0SMax Filippov         .name = "ipfl",
3190168c12b0SMax Filippov         .translate = translate_icache,
319121a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
3192168c12b0SMax Filippov     }, {
3193168c12b0SMax Filippov         .name = "isync",
3194168c12b0SMax Filippov         .translate = translate_nop,
3195168c12b0SMax Filippov     }, {
3196168c12b0SMax Filippov         .name = "j",
3197168c12b0SMax Filippov         .translate = translate_j,
3198168c12b0SMax Filippov     }, {
3199168c12b0SMax Filippov         .name = "jx",
3200168c12b0SMax Filippov         .translate = translate_jx,
3201168c12b0SMax Filippov     }, {
3202168c12b0SMax Filippov         .name = "l16si",
3203168c12b0SMax Filippov         .translate = translate_ldst,
3204168c12b0SMax Filippov         .par = (const uint32_t[]){MO_TESW, false, false},
3205068e538aSMax Filippov         .op_flags = XTENSA_OP_LOAD,
3206168c12b0SMax Filippov     }, {
3207168c12b0SMax Filippov         .name = "l16ui",
3208168c12b0SMax Filippov         .translate = translate_ldst,
3209168c12b0SMax Filippov         .par = (const uint32_t[]){MO_TEUW, false, false},
3210068e538aSMax Filippov         .op_flags = XTENSA_OP_LOAD,
3211168c12b0SMax Filippov     }, {
3212168c12b0SMax Filippov         .name = "l32ai",
3213168c12b0SMax Filippov         .translate = translate_ldst,
3214583e6a5fSMax Filippov         .par = (const uint32_t[]){MO_TEUL | MO_ALIGN, true, false},
3215068e538aSMax Filippov         .op_flags = XTENSA_OP_LOAD,
3216168c12b0SMax Filippov     }, {
3217168c12b0SMax Filippov         .name = "l32e",
3218168c12b0SMax Filippov         .translate = translate_l32e,
3219068e538aSMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED | XTENSA_OP_LOAD,
3220168c12b0SMax Filippov     }, {
3221b345e140SMax Filippov         .name = "l32ex",
3222b345e140SMax Filippov         .translate = translate_l32ex,
3223b345e140SMax Filippov         .op_flags = XTENSA_OP_LOAD,
3224b345e140SMax Filippov     }, {
3225d863fcf7SMax Filippov         .name = (const char * const[]) {
3226d863fcf7SMax Filippov             "l32i", "l32i.n", NULL,
3227d863fcf7SMax Filippov         },
3228168c12b0SMax Filippov         .translate = translate_ldst,
3229168c12b0SMax Filippov         .par = (const uint32_t[]){MO_TEUL, false, false},
3230068e538aSMax Filippov         .op_flags = XTENSA_OP_NAME_ARRAY | XTENSA_OP_LOAD,
3231168c12b0SMax Filippov     }, {
3232168c12b0SMax Filippov         .name = "l32r",
3233168c12b0SMax Filippov         .translate = translate_l32r,
3234068e538aSMax Filippov         .op_flags = XTENSA_OP_LOAD,
3235168c12b0SMax Filippov     }, {
3236168c12b0SMax Filippov         .name = "l8ui",
3237168c12b0SMax Filippov         .translate = translate_ldst,
3238168c12b0SMax Filippov         .par = (const uint32_t[]){MO_UB, false, false},
3239068e538aSMax Filippov         .op_flags = XTENSA_OP_LOAD,
3240168c12b0SMax Filippov     }, {
324159491e97SMax Filippov         .name = "ldct",
324259491e97SMax Filippov         .translate = translate_lct,
324359491e97SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
324459491e97SMax Filippov     }, {
324559491e97SMax Filippov         .name = "ldcw",
324659491e97SMax Filippov         .translate = translate_nop,
324759491e97SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
324859491e97SMax Filippov     }, {
3249168c12b0SMax Filippov         .name = "lddec",
3250168c12b0SMax Filippov         .translate = translate_mac16,
32517aa78341SMax Filippov         .par = (const uint32_t[]){MAC16_NONE, 0, -4},
3252068e538aSMax Filippov         .op_flags = XTENSA_OP_LOAD,
3253168c12b0SMax Filippov     }, {
3254168c12b0SMax Filippov         .name = "ldinc",
3255168c12b0SMax Filippov         .translate = translate_mac16,
32567aa78341SMax Filippov         .par = (const uint32_t[]){MAC16_NONE, 0, 4},
3257068e538aSMax Filippov         .op_flags = XTENSA_OP_LOAD,
3258168c12b0SMax Filippov     }, {
325913f6a7cdSMax Filippov         .name = "ldpte",
326009460970SMax Filippov         .op_flags = XTENSA_OP_ILL,
326113f6a7cdSMax Filippov     }, {
326259491e97SMax Filippov         .name = "lict",
326359491e97SMax Filippov         .translate = translate_lct,
326459491e97SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
326559491e97SMax Filippov     }, {
326659491e97SMax Filippov         .name = "licw",
326759491e97SMax Filippov         .translate = translate_nop,
326859491e97SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
326959491e97SMax Filippov     }, {
3270fa6bc73cSMax Filippov         .name = (const char * const[]) {
3271fa6bc73cSMax Filippov             "loop", "loop.w15", NULL,
3272fa6bc73cSMax Filippov         },
3273168c12b0SMax Filippov         .translate = translate_loop,
3274168c12b0SMax Filippov         .par = (const uint32_t[]){TCG_COND_NEVER},
3275fa6bc73cSMax Filippov         .op_flags = XTENSA_OP_NAME_ARRAY,
3276168c12b0SMax Filippov     }, {
3277fa6bc73cSMax Filippov         .name = (const char * const[]) {
3278fa6bc73cSMax Filippov             "loopgtz", "loopgtz.w15", NULL,
3279fa6bc73cSMax Filippov         },
3280168c12b0SMax Filippov         .translate = translate_loop,
3281168c12b0SMax Filippov         .par = (const uint32_t[]){TCG_COND_GT},
3282fa6bc73cSMax Filippov         .op_flags = XTENSA_OP_NAME_ARRAY,
3283168c12b0SMax Filippov     }, {
3284fa6bc73cSMax Filippov         .name = (const char * const[]) {
3285fa6bc73cSMax Filippov             "loopnez", "loopnez.w15", NULL,
3286fa6bc73cSMax Filippov         },
3287168c12b0SMax Filippov         .translate = translate_loop,
3288168c12b0SMax Filippov         .par = (const uint32_t[]){TCG_COND_NE},
3289fa6bc73cSMax Filippov         .op_flags = XTENSA_OP_NAME_ARRAY,
3290168c12b0SMax Filippov     }, {
3291168c12b0SMax Filippov         .name = "max",
3292426afc3bSRichard Henderson         .translate = translate_smax,
3293168c12b0SMax Filippov     }, {
3294168c12b0SMax Filippov         .name = "maxu",
3295426afc3bSRichard Henderson         .translate = translate_umax,
3296168c12b0SMax Filippov     }, {
3297168c12b0SMax Filippov         .name = "memw",
32989fb40342SMax Filippov         .translate = translate_memw,
3299168c12b0SMax Filippov     }, {
3300168c12b0SMax Filippov         .name = "min",
3301426afc3bSRichard Henderson         .translate = translate_smin,
3302168c12b0SMax Filippov     }, {
3303168c12b0SMax Filippov         .name = "minu",
3304426afc3bSRichard Henderson         .translate = translate_umin,
3305168c12b0SMax Filippov     }, {
3306d863fcf7SMax Filippov         .name = (const char * const[]) {
3307d863fcf7SMax Filippov             "mov", "mov.n", NULL,
3308d863fcf7SMax Filippov         },
3309168c12b0SMax Filippov         .translate = translate_mov,
3310d863fcf7SMax Filippov         .op_flags = XTENSA_OP_NAME_ARRAY,
3311168c12b0SMax Filippov     }, {
3312168c12b0SMax Filippov         .name = "moveqz",
3313168c12b0SMax Filippov         .translate = translate_movcond,
3314168c12b0SMax Filippov         .par = (const uint32_t[]){TCG_COND_EQ},
3315168c12b0SMax Filippov     }, {
3316168c12b0SMax Filippov         .name = "movf",
3317168c12b0SMax Filippov         .translate = translate_movp,
3318168c12b0SMax Filippov         .par = (const uint32_t[]){TCG_COND_EQ},
3319168c12b0SMax Filippov     }, {
3320168c12b0SMax Filippov         .name = "movgez",
3321168c12b0SMax Filippov         .translate = translate_movcond,
3322168c12b0SMax Filippov         .par = (const uint32_t[]){TCG_COND_GE},
3323168c12b0SMax Filippov     }, {
3324168c12b0SMax Filippov         .name = "movi",
3325168c12b0SMax Filippov         .translate = translate_movi,
3326168c12b0SMax Filippov     }, {
3327168c12b0SMax Filippov         .name = "movi.n",
3328168c12b0SMax Filippov         .translate = translate_movi,
3329168c12b0SMax Filippov     }, {
3330168c12b0SMax Filippov         .name = "movltz",
3331168c12b0SMax Filippov         .translate = translate_movcond,
3332168c12b0SMax Filippov         .par = (const uint32_t[]){TCG_COND_LT},
3333168c12b0SMax Filippov     }, {
3334168c12b0SMax Filippov         .name = "movnez",
3335168c12b0SMax Filippov         .translate = translate_movcond,
3336168c12b0SMax Filippov         .par = (const uint32_t[]){TCG_COND_NE},
3337168c12b0SMax Filippov     }, {
3338168c12b0SMax Filippov         .name = "movsp",
3339168c12b0SMax Filippov         .translate = translate_movsp,
334090d6494dSMax Filippov         .op_flags = XTENSA_OP_ALLOCA,
3341168c12b0SMax Filippov     }, {
3342168c12b0SMax Filippov         .name = "movt",
3343168c12b0SMax Filippov         .translate = translate_movp,
3344168c12b0SMax Filippov         .par = (const uint32_t[]){TCG_COND_NE},
3345168c12b0SMax Filippov     }, {
3346168c12b0SMax Filippov         .name = "mul.aa.hh",
3347168c12b0SMax Filippov         .translate = translate_mac16,
33487aa78341SMax Filippov         .par = (const uint32_t[]){MAC16_MUL, MAC16_HH, 0},
3349168c12b0SMax Filippov     }, {
3350168c12b0SMax Filippov         .name = "mul.aa.hl",
3351168c12b0SMax Filippov         .translate = translate_mac16,
33527aa78341SMax Filippov         .par = (const uint32_t[]){MAC16_MUL, MAC16_HL, 0},
3353168c12b0SMax Filippov     }, {
3354168c12b0SMax Filippov         .name = "mul.aa.lh",
3355168c12b0SMax Filippov         .translate = translate_mac16,
33567aa78341SMax Filippov         .par = (const uint32_t[]){MAC16_MUL, MAC16_LH, 0},
3357168c12b0SMax Filippov     }, {
3358168c12b0SMax Filippov         .name = "mul.aa.ll",
3359168c12b0SMax Filippov         .translate = translate_mac16,
33607aa78341SMax Filippov         .par = (const uint32_t[]){MAC16_MUL, MAC16_LL, 0},
3361168c12b0SMax Filippov     }, {
3362168c12b0SMax Filippov         .name = "mul.ad.hh",
3363168c12b0SMax Filippov         .translate = translate_mac16,
33647aa78341SMax Filippov         .par = (const uint32_t[]){MAC16_MUL, MAC16_HH, 0},
3365168c12b0SMax Filippov     }, {
3366168c12b0SMax Filippov         .name = "mul.ad.hl",
3367168c12b0SMax Filippov         .translate = translate_mac16,
33687aa78341SMax Filippov         .par = (const uint32_t[]){MAC16_MUL, MAC16_HL, 0},
3369168c12b0SMax Filippov     }, {
3370168c12b0SMax Filippov         .name = "mul.ad.lh",
3371168c12b0SMax Filippov         .translate = translate_mac16,
33727aa78341SMax Filippov         .par = (const uint32_t[]){MAC16_MUL, MAC16_LH, 0},
3373168c12b0SMax Filippov     }, {
3374168c12b0SMax Filippov         .name = "mul.ad.ll",
3375168c12b0SMax Filippov         .translate = translate_mac16,
33767aa78341SMax Filippov         .par = (const uint32_t[]){MAC16_MUL, MAC16_LL, 0},
3377168c12b0SMax Filippov     }, {
3378168c12b0SMax Filippov         .name = "mul.da.hh",
3379168c12b0SMax Filippov         .translate = translate_mac16,
33807aa78341SMax Filippov         .par = (const uint32_t[]){MAC16_MUL, MAC16_HH, 0},
3381168c12b0SMax Filippov     }, {
3382168c12b0SMax Filippov         .name = "mul.da.hl",
3383168c12b0SMax Filippov         .translate = translate_mac16,
33847aa78341SMax Filippov         .par = (const uint32_t[]){MAC16_MUL, MAC16_HL, 0},
3385168c12b0SMax Filippov     }, {
3386168c12b0SMax Filippov         .name = "mul.da.lh",
3387168c12b0SMax Filippov         .translate = translate_mac16,
33887aa78341SMax Filippov         .par = (const uint32_t[]){MAC16_MUL, MAC16_LH, 0},
3389168c12b0SMax Filippov     }, {
3390168c12b0SMax Filippov         .name = "mul.da.ll",
3391168c12b0SMax Filippov         .translate = translate_mac16,
33927aa78341SMax Filippov         .par = (const uint32_t[]){MAC16_MUL, MAC16_LL, 0},
3393168c12b0SMax Filippov     }, {
3394168c12b0SMax Filippov         .name = "mul.dd.hh",
3395168c12b0SMax Filippov         .translate = translate_mac16,
33967aa78341SMax Filippov         .par = (const uint32_t[]){MAC16_MUL, MAC16_HH, 0},
3397168c12b0SMax Filippov     }, {
3398168c12b0SMax Filippov         .name = "mul.dd.hl",
3399168c12b0SMax Filippov         .translate = translate_mac16,
34007aa78341SMax Filippov         .par = (const uint32_t[]){MAC16_MUL, MAC16_HL, 0},
3401168c12b0SMax Filippov     }, {
3402168c12b0SMax Filippov         .name = "mul.dd.lh",
3403168c12b0SMax Filippov         .translate = translate_mac16,
34047aa78341SMax Filippov         .par = (const uint32_t[]){MAC16_MUL, MAC16_LH, 0},
3405168c12b0SMax Filippov     }, {
3406168c12b0SMax Filippov         .name = "mul.dd.ll",
3407168c12b0SMax Filippov         .translate = translate_mac16,
34087aa78341SMax Filippov         .par = (const uint32_t[]){MAC16_MUL, MAC16_LL, 0},
3409168c12b0SMax Filippov     }, {
3410168c12b0SMax Filippov         .name = "mul16s",
3411168c12b0SMax Filippov         .translate = translate_mul16,
3412168c12b0SMax Filippov         .par = (const uint32_t[]){true},
3413168c12b0SMax Filippov     }, {
3414168c12b0SMax Filippov         .name = "mul16u",
3415168c12b0SMax Filippov         .translate = translate_mul16,
3416168c12b0SMax Filippov         .par = (const uint32_t[]){false},
3417168c12b0SMax Filippov     }, {
3418168c12b0SMax Filippov         .name = "mula.aa.hh",
3419168c12b0SMax Filippov         .translate = translate_mac16,
34207aa78341SMax Filippov         .par = (const uint32_t[]){MAC16_MULA, MAC16_HH, 0},
3421168c12b0SMax Filippov     }, {
3422168c12b0SMax Filippov         .name = "mula.aa.hl",
3423168c12b0SMax Filippov         .translate = translate_mac16,
34247aa78341SMax Filippov         .par = (const uint32_t[]){MAC16_MULA, MAC16_HL, 0},
3425168c12b0SMax Filippov     }, {
3426168c12b0SMax Filippov         .name = "mula.aa.lh",
3427168c12b0SMax Filippov         .translate = translate_mac16,
34287aa78341SMax Filippov         .par = (const uint32_t[]){MAC16_MULA, MAC16_LH, 0},
3429168c12b0SMax Filippov     }, {
3430168c12b0SMax Filippov         .name = "mula.aa.ll",
3431168c12b0SMax Filippov         .translate = translate_mac16,
34327aa78341SMax Filippov         .par = (const uint32_t[]){MAC16_MULA, MAC16_LL, 0},
3433168c12b0SMax Filippov     }, {
3434168c12b0SMax Filippov         .name = "mula.ad.hh",
3435168c12b0SMax Filippov         .translate = translate_mac16,
34367aa78341SMax Filippov         .par = (const uint32_t[]){MAC16_MULA, MAC16_HH, 0},
3437168c12b0SMax Filippov     }, {
3438168c12b0SMax Filippov         .name = "mula.ad.hl",
3439168c12b0SMax Filippov         .translate = translate_mac16,
34407aa78341SMax Filippov         .par = (const uint32_t[]){MAC16_MULA, MAC16_HL, 0},
3441168c12b0SMax Filippov     }, {
3442168c12b0SMax Filippov         .name = "mula.ad.lh",
3443168c12b0SMax Filippov         .translate = translate_mac16,
34447aa78341SMax Filippov         .par = (const uint32_t[]){MAC16_MULA, MAC16_LH, 0},
3445168c12b0SMax Filippov     }, {
3446168c12b0SMax Filippov         .name = "mula.ad.ll",
3447168c12b0SMax Filippov         .translate = translate_mac16,
34487aa78341SMax Filippov         .par = (const uint32_t[]){MAC16_MULA, MAC16_LL, 0},
3449168c12b0SMax Filippov     }, {
3450168c12b0SMax Filippov         .name = "mula.da.hh",
3451168c12b0SMax Filippov         .translate = translate_mac16,
34527aa78341SMax Filippov         .par = (const uint32_t[]){MAC16_MULA, MAC16_HH, 0},
3453168c12b0SMax Filippov     }, {
3454168c12b0SMax Filippov         .name = "mula.da.hh.lddec",
3455168c12b0SMax Filippov         .translate = translate_mac16,
34567aa78341SMax Filippov         .par = (const uint32_t[]){MAC16_MULA, MAC16_HH, -4},
3457168c12b0SMax Filippov     }, {
3458168c12b0SMax Filippov         .name = "mula.da.hh.ldinc",
3459168c12b0SMax Filippov         .translate = translate_mac16,
34607aa78341SMax Filippov         .par = (const uint32_t[]){MAC16_MULA, MAC16_HH, 4},
3461168c12b0SMax Filippov     }, {
3462168c12b0SMax Filippov         .name = "mula.da.hl",
3463168c12b0SMax Filippov         .translate = translate_mac16,
34647aa78341SMax Filippov         .par = (const uint32_t[]){MAC16_MULA, MAC16_HL, 0},
3465168c12b0SMax Filippov     }, {
3466168c12b0SMax Filippov         .name = "mula.da.hl.lddec",
3467168c12b0SMax Filippov         .translate = translate_mac16,
34687aa78341SMax Filippov         .par = (const uint32_t[]){MAC16_MULA, MAC16_HL, -4},
3469168c12b0SMax Filippov     }, {
3470168c12b0SMax Filippov         .name = "mula.da.hl.ldinc",
3471168c12b0SMax Filippov         .translate = translate_mac16,
34727aa78341SMax Filippov         .par = (const uint32_t[]){MAC16_MULA, MAC16_HL, 4},
3473168c12b0SMax Filippov     }, {
3474168c12b0SMax Filippov         .name = "mula.da.lh",
3475168c12b0SMax Filippov         .translate = translate_mac16,
34767aa78341SMax Filippov         .par = (const uint32_t[]){MAC16_MULA, MAC16_LH, 0},
3477168c12b0SMax Filippov     }, {
3478168c12b0SMax Filippov         .name = "mula.da.lh.lddec",
3479168c12b0SMax Filippov         .translate = translate_mac16,
34807aa78341SMax Filippov         .par = (const uint32_t[]){MAC16_MULA, MAC16_LH, -4},
3481168c12b0SMax Filippov     }, {
3482168c12b0SMax Filippov         .name = "mula.da.lh.ldinc",
3483168c12b0SMax Filippov         .translate = translate_mac16,
34847aa78341SMax Filippov         .par = (const uint32_t[]){MAC16_MULA, MAC16_LH, 4},
3485168c12b0SMax Filippov     }, {
3486168c12b0SMax Filippov         .name = "mula.da.ll",
3487168c12b0SMax Filippov         .translate = translate_mac16,
34887aa78341SMax Filippov         .par = (const uint32_t[]){MAC16_MULA, MAC16_LL, 0},
3489168c12b0SMax Filippov     }, {
3490168c12b0SMax Filippov         .name = "mula.da.ll.lddec",
3491168c12b0SMax Filippov         .translate = translate_mac16,
34927aa78341SMax Filippov         .par = (const uint32_t[]){MAC16_MULA, MAC16_LL, -4},
3493168c12b0SMax Filippov     }, {
3494168c12b0SMax Filippov         .name = "mula.da.ll.ldinc",
3495168c12b0SMax Filippov         .translate = translate_mac16,
34967aa78341SMax Filippov         .par = (const uint32_t[]){MAC16_MULA, MAC16_LL, 4},
3497168c12b0SMax Filippov     }, {
3498168c12b0SMax Filippov         .name = "mula.dd.hh",
3499168c12b0SMax Filippov         .translate = translate_mac16,
35007aa78341SMax Filippov         .par = (const uint32_t[]){MAC16_MULA, MAC16_HH, 0},
3501168c12b0SMax Filippov     }, {
3502168c12b0SMax Filippov         .name = "mula.dd.hh.lddec",
3503168c12b0SMax Filippov         .translate = translate_mac16,
35047aa78341SMax Filippov         .par = (const uint32_t[]){MAC16_MULA, MAC16_HH, -4},
3505168c12b0SMax Filippov     }, {
3506168c12b0SMax Filippov         .name = "mula.dd.hh.ldinc",
3507168c12b0SMax Filippov         .translate = translate_mac16,
35087aa78341SMax Filippov         .par = (const uint32_t[]){MAC16_MULA, MAC16_HH, 4},
3509168c12b0SMax Filippov     }, {
3510168c12b0SMax Filippov         .name = "mula.dd.hl",
3511168c12b0SMax Filippov         .translate = translate_mac16,
35127aa78341SMax Filippov         .par = (const uint32_t[]){MAC16_MULA, MAC16_HL, 0},
3513168c12b0SMax Filippov     }, {
3514168c12b0SMax Filippov         .name = "mula.dd.hl.lddec",
3515168c12b0SMax Filippov         .translate = translate_mac16,
35167aa78341SMax Filippov         .par = (const uint32_t[]){MAC16_MULA, MAC16_HL, -4},
3517168c12b0SMax Filippov     }, {
3518168c12b0SMax Filippov         .name = "mula.dd.hl.ldinc",
3519168c12b0SMax Filippov         .translate = translate_mac16,
35207aa78341SMax Filippov         .par = (const uint32_t[]){MAC16_MULA, MAC16_HL, 4},
3521168c12b0SMax Filippov     }, {
3522168c12b0SMax Filippov         .name = "mula.dd.lh",
3523168c12b0SMax Filippov         .translate = translate_mac16,
35247aa78341SMax Filippov         .par = (const uint32_t[]){MAC16_MULA, MAC16_LH, 0},
3525168c12b0SMax Filippov     }, {
3526168c12b0SMax Filippov         .name = "mula.dd.lh.lddec",
3527168c12b0SMax Filippov         .translate = translate_mac16,
35287aa78341SMax Filippov         .par = (const uint32_t[]){MAC16_MULA, MAC16_LH, -4},
3529168c12b0SMax Filippov     }, {
3530168c12b0SMax Filippov         .name = "mula.dd.lh.ldinc",
3531168c12b0SMax Filippov         .translate = translate_mac16,
35327aa78341SMax Filippov         .par = (const uint32_t[]){MAC16_MULA, MAC16_LH, 4},
3533168c12b0SMax Filippov     }, {
3534168c12b0SMax Filippov         .name = "mula.dd.ll",
3535168c12b0SMax Filippov         .translate = translate_mac16,
35367aa78341SMax Filippov         .par = (const uint32_t[]){MAC16_MULA, MAC16_LL, 0},
3537168c12b0SMax Filippov     }, {
3538168c12b0SMax Filippov         .name = "mula.dd.ll.lddec",
3539168c12b0SMax Filippov         .translate = translate_mac16,
35407aa78341SMax Filippov         .par = (const uint32_t[]){MAC16_MULA, MAC16_LL, -4},
3541168c12b0SMax Filippov     }, {
3542168c12b0SMax Filippov         .name = "mula.dd.ll.ldinc",
3543168c12b0SMax Filippov         .translate = translate_mac16,
35447aa78341SMax Filippov         .par = (const uint32_t[]){MAC16_MULA, MAC16_LL, 4},
3545168c12b0SMax Filippov     }, {
3546168c12b0SMax Filippov         .name = "mull",
3547168c12b0SMax Filippov         .translate = translate_mull,
3548168c12b0SMax Filippov     }, {
3549168c12b0SMax Filippov         .name = "muls.aa.hh",
3550168c12b0SMax Filippov         .translate = translate_mac16,
35517aa78341SMax Filippov         .par = (const uint32_t[]){MAC16_MULS, MAC16_HH, 0},
3552168c12b0SMax Filippov     }, {
3553168c12b0SMax Filippov         .name = "muls.aa.hl",
3554168c12b0SMax Filippov         .translate = translate_mac16,
35557aa78341SMax Filippov         .par = (const uint32_t[]){MAC16_MULS, MAC16_HL, 0},
3556168c12b0SMax Filippov     }, {
3557168c12b0SMax Filippov         .name = "muls.aa.lh",
3558168c12b0SMax Filippov         .translate = translate_mac16,
35597aa78341SMax Filippov         .par = (const uint32_t[]){MAC16_MULS, MAC16_LH, 0},
3560168c12b0SMax Filippov     }, {
3561168c12b0SMax Filippov         .name = "muls.aa.ll",
3562168c12b0SMax Filippov         .translate = translate_mac16,
35637aa78341SMax Filippov         .par = (const uint32_t[]){MAC16_MULS, MAC16_LL, 0},
3564168c12b0SMax Filippov     }, {
3565168c12b0SMax Filippov         .name = "muls.ad.hh",
3566168c12b0SMax Filippov         .translate = translate_mac16,
35677aa78341SMax Filippov         .par = (const uint32_t[]){MAC16_MULS, MAC16_HH, 0},
3568168c12b0SMax Filippov     }, {
3569168c12b0SMax Filippov         .name = "muls.ad.hl",
3570168c12b0SMax Filippov         .translate = translate_mac16,
35717aa78341SMax Filippov         .par = (const uint32_t[]){MAC16_MULS, MAC16_HL, 0},
3572168c12b0SMax Filippov     }, {
3573168c12b0SMax Filippov         .name = "muls.ad.lh",
3574168c12b0SMax Filippov         .translate = translate_mac16,
35757aa78341SMax Filippov         .par = (const uint32_t[]){MAC16_MULS, MAC16_LH, 0},
3576168c12b0SMax Filippov     }, {
3577168c12b0SMax Filippov         .name = "muls.ad.ll",
3578168c12b0SMax Filippov         .translate = translate_mac16,
35797aa78341SMax Filippov         .par = (const uint32_t[]){MAC16_MULS, MAC16_LL, 0},
3580168c12b0SMax Filippov     }, {
3581168c12b0SMax Filippov         .name = "muls.da.hh",
3582168c12b0SMax Filippov         .translate = translate_mac16,
35837aa78341SMax Filippov         .par = (const uint32_t[]){MAC16_MULS, MAC16_HH, 0},
3584168c12b0SMax Filippov     }, {
3585168c12b0SMax Filippov         .name = "muls.da.hl",
3586168c12b0SMax Filippov         .translate = translate_mac16,
35877aa78341SMax Filippov         .par = (const uint32_t[]){MAC16_MULS, MAC16_HL, 0},
3588168c12b0SMax Filippov     }, {
3589168c12b0SMax Filippov         .name = "muls.da.lh",
3590168c12b0SMax Filippov         .translate = translate_mac16,
35917aa78341SMax Filippov         .par = (const uint32_t[]){MAC16_MULS, MAC16_LH, 0},
3592168c12b0SMax Filippov     }, {
3593168c12b0SMax Filippov         .name = "muls.da.ll",
3594168c12b0SMax Filippov         .translate = translate_mac16,
35957aa78341SMax Filippov         .par = (const uint32_t[]){MAC16_MULS, MAC16_LL, 0},
3596168c12b0SMax Filippov     }, {
3597168c12b0SMax Filippov         .name = "muls.dd.hh",
3598168c12b0SMax Filippov         .translate = translate_mac16,
35997aa78341SMax Filippov         .par = (const uint32_t[]){MAC16_MULS, MAC16_HH, 0},
3600168c12b0SMax Filippov     }, {
3601168c12b0SMax Filippov         .name = "muls.dd.hl",
3602168c12b0SMax Filippov         .translate = translate_mac16,
36037aa78341SMax Filippov         .par = (const uint32_t[]){MAC16_MULS, MAC16_HL, 0},
3604168c12b0SMax Filippov     }, {
3605168c12b0SMax Filippov         .name = "muls.dd.lh",
3606168c12b0SMax Filippov         .translate = translate_mac16,
36077aa78341SMax Filippov         .par = (const uint32_t[]){MAC16_MULS, MAC16_LH, 0},
3608168c12b0SMax Filippov     }, {
3609168c12b0SMax Filippov         .name = "muls.dd.ll",
3610168c12b0SMax Filippov         .translate = translate_mac16,
36117aa78341SMax Filippov         .par = (const uint32_t[]){MAC16_MULS, MAC16_LL, 0},
3612168c12b0SMax Filippov     }, {
3613168c12b0SMax Filippov         .name = "mulsh",
3614168c12b0SMax Filippov         .translate = translate_mulh,
3615168c12b0SMax Filippov         .par = (const uint32_t[]){true},
3616168c12b0SMax Filippov     }, {
3617168c12b0SMax Filippov         .name = "muluh",
3618168c12b0SMax Filippov         .translate = translate_mulh,
3619168c12b0SMax Filippov         .par = (const uint32_t[]){false},
3620168c12b0SMax Filippov     }, {
3621168c12b0SMax Filippov         .name = "neg",
3622168c12b0SMax Filippov         .translate = translate_neg,
3623168c12b0SMax Filippov     }, {
3624d863fcf7SMax Filippov         .name = (const char * const[]) {
3625d863fcf7SMax Filippov             "nop", "nop.n", NULL,
3626d863fcf7SMax Filippov         },
3627168c12b0SMax Filippov         .translate = translate_nop,
3628d863fcf7SMax Filippov         .op_flags = XTENSA_OP_NAME_ARRAY,
3629168c12b0SMax Filippov     }, {
3630168c12b0SMax Filippov         .name = "nsa",
3631168c12b0SMax Filippov         .translate = translate_nsa,
3632168c12b0SMax Filippov     }, {
3633168c12b0SMax Filippov         .name = "nsau",
3634168c12b0SMax Filippov         .translate = translate_nsau,
3635168c12b0SMax Filippov     }, {
3636168c12b0SMax Filippov         .name = "or",
3637168c12b0SMax Filippov         .translate = translate_or,
3638168c12b0SMax Filippov     }, {
3639168c12b0SMax Filippov         .name = "orb",
3640168c12b0SMax Filippov         .translate = translate_boolean,
3641168c12b0SMax Filippov         .par = (const uint32_t[]){BOOLEAN_OR},
3642168c12b0SMax Filippov     }, {
3643168c12b0SMax Filippov         .name = "orbc",
3644168c12b0SMax Filippov         .translate = translate_boolean,
3645168c12b0SMax Filippov         .par = (const uint32_t[]){BOOLEAN_ORC},
3646168c12b0SMax Filippov     }, {
3647168c12b0SMax Filippov         .name = "pdtlb",
3648168c12b0SMax Filippov         .translate = translate_ptlb,
3649168c12b0SMax Filippov         .par = (const uint32_t[]){true},
365021a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
3651168c12b0SMax Filippov     }, {
3652c884400fSMax Filippov         .name = "pfend.a",
3653c884400fSMax Filippov         .translate = translate_nop,
3654c884400fSMax Filippov     }, {
3655c884400fSMax Filippov         .name = "pfend.o",
3656c884400fSMax Filippov         .translate = translate_nop,
3657c884400fSMax Filippov     }, {
3658c884400fSMax Filippov         .name = "pfnxt.f",
3659c884400fSMax Filippov         .translate = translate_nop,
3660c884400fSMax Filippov     }, {
3661c884400fSMax Filippov         .name = "pfwait.a",
3662c884400fSMax Filippov         .translate = translate_nop,
3663c884400fSMax Filippov     }, {
36641a03362bSMax Filippov         .name = "pfwait.r",
3665c884400fSMax Filippov         .translate = translate_nop,
3666c884400fSMax Filippov     }, {
3667168c12b0SMax Filippov         .name = "pitlb",
3668168c12b0SMax Filippov         .translate = translate_ptlb,
3669168c12b0SMax Filippov         .par = (const uint32_t[]){false},
367021a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
3671168c12b0SMax Filippov     }, {
36724d04ea35SMax Filippov         .name = "pptlb",
36734d04ea35SMax Filippov         .translate = translate_pptlb,
36744d04ea35SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
36754d04ea35SMax Filippov     }, {
3676168c12b0SMax Filippov         .name = "quos",
3677168c12b0SMax Filippov         .translate = translate_quos,
3678168c12b0SMax Filippov         .par = (const uint32_t[]){true},
36794a038955SMax Filippov         .op_flags = XTENSA_OP_DIVIDE_BY_ZERO,
3680168c12b0SMax Filippov     }, {
3681168c12b0SMax Filippov         .name = "quou",
3682168c12b0SMax Filippov         .translate = translate_quou,
36834a038955SMax Filippov         .op_flags = XTENSA_OP_DIVIDE_BY_ZERO,
3684168c12b0SMax Filippov     }, {
3685168c12b0SMax Filippov         .name = "rdtlb0",
3686168c12b0SMax Filippov         .translate = translate_rtlb,
3687168c12b0SMax Filippov         .par = (const uint32_t[]){true, 0},
368821a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
3689168c12b0SMax Filippov     }, {
3690168c12b0SMax Filippov         .name = "rdtlb1",
3691168c12b0SMax Filippov         .translate = translate_rtlb,
3692168c12b0SMax Filippov         .par = (const uint32_t[]){true, 1},
369321a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
3694168c12b0SMax Filippov     }, {
3695e9872741SMax Filippov         .name = "read_impwire",
3696e9872741SMax Filippov         .translate = translate_read_impwire,
3697e9872741SMax Filippov     }, {
3698168c12b0SMax Filippov         .name = "rems",
3699168c12b0SMax Filippov         .translate = translate_quos,
3700168c12b0SMax Filippov         .par = (const uint32_t[]){false},
37014a038955SMax Filippov         .op_flags = XTENSA_OP_DIVIDE_BY_ZERO,
3702168c12b0SMax Filippov     }, {
3703168c12b0SMax Filippov         .name = "remu",
37044a038955SMax Filippov         .translate = translate_remu,
37054a038955SMax Filippov         .op_flags = XTENSA_OP_DIVIDE_BY_ZERO,
3706168c12b0SMax Filippov     }, {
3707168c12b0SMax Filippov         .name = "rer",
3708168c12b0SMax Filippov         .translate = translate_rer,
370921a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
3710168c12b0SMax Filippov     }, {
3711d863fcf7SMax Filippov         .name = (const char * const[]) {
3712d863fcf7SMax Filippov             "ret", "ret.n", NULL,
3713d863fcf7SMax Filippov         },
3714168c12b0SMax Filippov         .translate = translate_ret,
3715d863fcf7SMax Filippov         .op_flags = XTENSA_OP_NAME_ARRAY,
3716168c12b0SMax Filippov     }, {
3717d863fcf7SMax Filippov         .name = (const char * const[]) {
3718d863fcf7SMax Filippov             "retw", "retw.n", NULL,
3719d863fcf7SMax Filippov         },
3720168c12b0SMax Filippov         .translate = translate_retw,
372191dc2b2dSMax Filippov         .test_exceptions = test_exceptions_retw,
3722d863fcf7SMax Filippov         .op_flags = XTENSA_OP_UNDERFLOW | XTENSA_OP_NAME_ARRAY,
3723168c12b0SMax Filippov     }, {
372413f6a7cdSMax Filippov         .name = "rfdd",
372509460970SMax Filippov         .op_flags = XTENSA_OP_ILL,
372613f6a7cdSMax Filippov     }, {
3727168c12b0SMax Filippov         .name = "rfde",
3728168c12b0SMax Filippov         .translate = translate_rfde,
372921a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
3730168c12b0SMax Filippov     }, {
373113f6a7cdSMax Filippov         .name = "rfdo",
373209460970SMax Filippov         .op_flags = XTENSA_OP_ILL,
373313f6a7cdSMax Filippov     }, {
3734168c12b0SMax Filippov         .name = "rfe",
3735168c12b0SMax Filippov         .translate = translate_rfe,
3736d74624e5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED | XTENSA_OP_CHECK_INTERRUPTS,
3737168c12b0SMax Filippov     }, {
3738168c12b0SMax Filippov         .name = "rfi",
3739168c12b0SMax Filippov         .translate = translate_rfi,
3740d74624e5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED | XTENSA_OP_CHECK_INTERRUPTS,
3741168c12b0SMax Filippov     }, {
3742168c12b0SMax Filippov         .name = "rfwo",
3743168c12b0SMax Filippov         .translate = translate_rfw,
3744168c12b0SMax Filippov         .par = (const uint32_t[]){true},
3745d74624e5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED | XTENSA_OP_CHECK_INTERRUPTS,
3746168c12b0SMax Filippov     }, {
3747168c12b0SMax Filippov         .name = "rfwu",
3748168c12b0SMax Filippov         .translate = translate_rfw,
3749168c12b0SMax Filippov         .par = (const uint32_t[]){false},
3750d74624e5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED | XTENSA_OP_CHECK_INTERRUPTS,
3751168c12b0SMax Filippov     }, {
3752168c12b0SMax Filippov         .name = "ritlb0",
3753168c12b0SMax Filippov         .translate = translate_rtlb,
3754168c12b0SMax Filippov         .par = (const uint32_t[]){false, 0},
375521a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
3756168c12b0SMax Filippov     }, {
3757168c12b0SMax Filippov         .name = "ritlb1",
3758168c12b0SMax Filippov         .translate = translate_rtlb,
3759168c12b0SMax Filippov         .par = (const uint32_t[]){false, 1},
376021a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
3761168c12b0SMax Filippov     }, {
37624d04ea35SMax Filippov         .name = "rptlb0",
37634d04ea35SMax Filippov         .translate = translate_rptlb0,
37644d04ea35SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
37654d04ea35SMax Filippov     }, {
37664d04ea35SMax Filippov         .name = "rptlb1",
37674d04ea35SMax Filippov         .translate = translate_rptlb1,
37684d04ea35SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
37694d04ea35SMax Filippov     }, {
3770168c12b0SMax Filippov         .name = "rotw",
3771168c12b0SMax Filippov         .translate = translate_rotw,
37728df3fd35SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED |
37738df3fd35SMax Filippov             XTENSA_OP_EXIT_TB_M1 |
37748df3fd35SMax Filippov             XTENSA_OP_SYNC_REGISTER_WINDOW,
3775168c12b0SMax Filippov     }, {
3776168c12b0SMax Filippov         .name = "rsil",
3777168c12b0SMax Filippov         .translate = translate_rsil,
3778d74624e5SMax Filippov         .op_flags =
3779d74624e5SMax Filippov             XTENSA_OP_PRIVILEGED |
3780d74624e5SMax Filippov             XTENSA_OP_EXIT_TB_0 |
3781d74624e5SMax Filippov             XTENSA_OP_CHECK_INTERRUPTS,
3782168c12b0SMax Filippov     }, {
3783168c12b0SMax Filippov         .name = "rsr.176",
3784168c12b0SMax Filippov         .translate = translate_rsr,
3785168c12b0SMax Filippov         .par = (const uint32_t[]){176},
378621a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
3787168c12b0SMax Filippov     }, {
3788168c12b0SMax Filippov         .name = "rsr.208",
3789168c12b0SMax Filippov         .translate = translate_rsr,
3790168c12b0SMax Filippov         .par = (const uint32_t[]){208},
379121a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
3792168c12b0SMax Filippov     }, {
3793168c12b0SMax Filippov         .name = "rsr.acchi",
3794168c12b0SMax Filippov         .translate = translate_rsr,
379591dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
379659419607SMax Filippov         .par = (const uint32_t[]){
379759419607SMax Filippov             ACCHI,
379859419607SMax Filippov             XTENSA_OPTION_MAC16,
379959419607SMax Filippov         },
3800168c12b0SMax Filippov     }, {
3801168c12b0SMax Filippov         .name = "rsr.acclo",
3802168c12b0SMax Filippov         .translate = translate_rsr,
380391dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
380459419607SMax Filippov         .par = (const uint32_t[]){
380559419607SMax Filippov             ACCLO,
380659419607SMax Filippov             XTENSA_OPTION_MAC16,
380759419607SMax Filippov         },
3808168c12b0SMax Filippov     }, {
3809168c12b0SMax Filippov         .name = "rsr.atomctl",
3810168c12b0SMax Filippov         .translate = translate_rsr,
381191dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
381259419607SMax Filippov         .par = (const uint32_t[]){
381359419607SMax Filippov             ATOMCTL,
381459419607SMax Filippov             XTENSA_OPTION_ATOMCTL,
381559419607SMax Filippov         },
381621a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
3817168c12b0SMax Filippov     }, {
3818168c12b0SMax Filippov         .name = "rsr.br",
3819168c12b0SMax Filippov         .translate = translate_rsr,
382091dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
382159419607SMax Filippov         .par = (const uint32_t[]){
382259419607SMax Filippov             BR,
382359419607SMax Filippov             XTENSA_OPTION_BOOLEAN,
382459419607SMax Filippov         },
3825168c12b0SMax Filippov     }, {
38264d04ea35SMax Filippov         .name = "rsr.cacheadrdis",
38274d04ea35SMax Filippov         .translate = translate_rsr,
382891dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
38294d04ea35SMax Filippov         .par = (const uint32_t[]){
38304d04ea35SMax Filippov             CACHEADRDIS,
38314d04ea35SMax Filippov             XTENSA_OPTION_MPU,
38324d04ea35SMax Filippov         },
38334d04ea35SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
3834168c12b0SMax Filippov     }, {
3835168c12b0SMax Filippov         .name = "rsr.cacheattr",
3836168c12b0SMax Filippov         .translate = translate_rsr,
383791dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
383859419607SMax Filippov         .par = (const uint32_t[]){
383959419607SMax Filippov             CACHEATTR,
384059419607SMax Filippov             XTENSA_OPTION_CACHEATTR,
384159419607SMax Filippov         },
384221a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
3843168c12b0SMax Filippov     }, {
3844168c12b0SMax Filippov         .name = "rsr.ccompare0",
3845168c12b0SMax Filippov         .translate = translate_rsr,
384691dc2b2dSMax Filippov         .test_exceptions = test_exceptions_ccompare,
384759419607SMax Filippov         .par = (const uint32_t[]){
384859419607SMax Filippov             CCOMPARE,
384959419607SMax Filippov             XTENSA_OPTION_TIMER_INTERRUPT,
385059419607SMax Filippov         },
385121a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
3852168c12b0SMax Filippov     }, {
3853168c12b0SMax Filippov         .name = "rsr.ccompare1",
3854168c12b0SMax Filippov         .translate = translate_rsr,
385591dc2b2dSMax Filippov         .test_exceptions = test_exceptions_ccompare,
385659419607SMax Filippov         .par = (const uint32_t[]){
385759419607SMax Filippov             CCOMPARE + 1,
385859419607SMax Filippov             XTENSA_OPTION_TIMER_INTERRUPT,
385959419607SMax Filippov         },
386021a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
3861168c12b0SMax Filippov     }, {
3862168c12b0SMax Filippov         .name = "rsr.ccompare2",
3863168c12b0SMax Filippov         .translate = translate_rsr,
386491dc2b2dSMax Filippov         .test_exceptions = test_exceptions_ccompare,
386559419607SMax Filippov         .par = (const uint32_t[]){
386659419607SMax Filippov             CCOMPARE + 2,
386759419607SMax Filippov             XTENSA_OPTION_TIMER_INTERRUPT,
386859419607SMax Filippov         },
386921a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
3870168c12b0SMax Filippov     }, {
3871168c12b0SMax Filippov         .name = "rsr.ccount",
387259419607SMax Filippov         .translate = translate_rsr_ccount,
387391dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
387459419607SMax Filippov         .par = (const uint32_t[]){
387559419607SMax Filippov             CCOUNT,
387659419607SMax Filippov             XTENSA_OPTION_TIMER_INTERRUPT,
387759419607SMax Filippov         },
3878bf525107SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED | XTENSA_OP_EXIT_TB_0,
3879168c12b0SMax Filippov     }, {
3880168c12b0SMax Filippov         .name = "rsr.configid0",
3881168c12b0SMax Filippov         .translate = translate_rsr,
3882168c12b0SMax Filippov         .par = (const uint32_t[]){CONFIGID0},
388321a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
3884168c12b0SMax Filippov     }, {
3885168c12b0SMax Filippov         .name = "rsr.configid1",
3886168c12b0SMax Filippov         .translate = translate_rsr,
3887168c12b0SMax Filippov         .par = (const uint32_t[]){CONFIGID1},
388821a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
3889168c12b0SMax Filippov     }, {
3890168c12b0SMax Filippov         .name = "rsr.cpenable",
3891168c12b0SMax Filippov         .translate = translate_rsr,
389291dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
389359419607SMax Filippov         .par = (const uint32_t[]){
389459419607SMax Filippov             CPENABLE,
389559419607SMax Filippov             XTENSA_OPTION_COPROCESSOR,
389659419607SMax Filippov         },
389721a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
3898168c12b0SMax Filippov     }, {
3899168c12b0SMax Filippov         .name = "rsr.dbreaka0",
3900168c12b0SMax Filippov         .translate = translate_rsr,
390191dc2b2dSMax Filippov         .test_exceptions = test_exceptions_dbreak,
390259419607SMax Filippov         .par = (const uint32_t[]){
390359419607SMax Filippov             DBREAKA,
390459419607SMax Filippov             XTENSA_OPTION_DEBUG,
390559419607SMax Filippov         },
390621a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
3907168c12b0SMax Filippov     }, {
3908168c12b0SMax Filippov         .name = "rsr.dbreaka1",
3909168c12b0SMax Filippov         .translate = translate_rsr,
391091dc2b2dSMax Filippov         .test_exceptions = test_exceptions_dbreak,
391159419607SMax Filippov         .par = (const uint32_t[]){
391259419607SMax Filippov             DBREAKA + 1,
391359419607SMax Filippov             XTENSA_OPTION_DEBUG,
391459419607SMax Filippov         },
391521a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
3916168c12b0SMax Filippov     }, {
3917168c12b0SMax Filippov         .name = "rsr.dbreakc0",
3918168c12b0SMax Filippov         .translate = translate_rsr,
391991dc2b2dSMax Filippov         .test_exceptions = test_exceptions_dbreak,
392059419607SMax Filippov         .par = (const uint32_t[]){
392159419607SMax Filippov             DBREAKC,
392259419607SMax Filippov             XTENSA_OPTION_DEBUG,
392359419607SMax Filippov         },
392421a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
3925168c12b0SMax Filippov     }, {
3926168c12b0SMax Filippov         .name = "rsr.dbreakc1",
3927168c12b0SMax Filippov         .translate = translate_rsr,
392891dc2b2dSMax Filippov         .test_exceptions = test_exceptions_dbreak,
392959419607SMax Filippov         .par = (const uint32_t[]){
393059419607SMax Filippov             DBREAKC + 1,
393159419607SMax Filippov             XTENSA_OPTION_DEBUG,
393259419607SMax Filippov         },
393321a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
3934168c12b0SMax Filippov     }, {
393513f6a7cdSMax Filippov         .name = "rsr.ddr",
393613f6a7cdSMax Filippov         .translate = translate_rsr,
393791dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
393859419607SMax Filippov         .par = (const uint32_t[]){
393959419607SMax Filippov             DDR,
394059419607SMax Filippov             XTENSA_OPTION_DEBUG,
394159419607SMax Filippov         },
394221a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
394313f6a7cdSMax Filippov     }, {
3944168c12b0SMax Filippov         .name = "rsr.debugcause",
3945168c12b0SMax Filippov         .translate = translate_rsr,
394691dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
394759419607SMax Filippov         .par = (const uint32_t[]){
394859419607SMax Filippov             DEBUGCAUSE,
394959419607SMax Filippov             XTENSA_OPTION_DEBUG,
395059419607SMax Filippov         },
395121a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
3952168c12b0SMax Filippov     }, {
3953168c12b0SMax Filippov         .name = "rsr.depc",
3954168c12b0SMax Filippov         .translate = translate_rsr,
395591dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
395659419607SMax Filippov         .par = (const uint32_t[]){
395759419607SMax Filippov             DEPC,
395859419607SMax Filippov             XTENSA_OPTION_EXCEPTION,
395959419607SMax Filippov         },
396021a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
3961168c12b0SMax Filippov     }, {
3962168c12b0SMax Filippov         .name = "rsr.dtlbcfg",
3963168c12b0SMax Filippov         .translate = translate_rsr,
396491dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
396559419607SMax Filippov         .par = (const uint32_t[]){
396659419607SMax Filippov             DTLBCFG,
396759419607SMax Filippov             XTENSA_OPTION_MMU,
396859419607SMax Filippov         },
396921a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
3970168c12b0SMax Filippov     }, {
3971168c12b0SMax Filippov         .name = "rsr.epc1",
3972168c12b0SMax Filippov         .translate = translate_rsr,
397391dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
397459419607SMax Filippov         .par = (const uint32_t[]){
397559419607SMax Filippov             EPC1,
397659419607SMax Filippov             XTENSA_OPTION_EXCEPTION,
397759419607SMax Filippov         },
397821a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
3979168c12b0SMax Filippov     }, {
3980168c12b0SMax Filippov         .name = "rsr.epc2",
3981168c12b0SMax Filippov         .translate = translate_rsr,
398291dc2b2dSMax Filippov         .test_exceptions = test_exceptions_hpi,
398359419607SMax Filippov         .par = (const uint32_t[]){
398459419607SMax Filippov             EPC1 + 1,
398559419607SMax Filippov             XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
398659419607SMax Filippov         },
398721a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
3988168c12b0SMax Filippov     }, {
3989168c12b0SMax Filippov         .name = "rsr.epc3",
3990168c12b0SMax Filippov         .translate = translate_rsr,
399191dc2b2dSMax Filippov         .test_exceptions = test_exceptions_hpi,
399259419607SMax Filippov         .par = (const uint32_t[]){
399359419607SMax Filippov             EPC1 + 2,
399459419607SMax Filippov             XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
399559419607SMax Filippov         },
399621a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
3997168c12b0SMax Filippov     }, {
3998168c12b0SMax Filippov         .name = "rsr.epc4",
3999168c12b0SMax Filippov         .translate = translate_rsr,
400091dc2b2dSMax Filippov         .test_exceptions = test_exceptions_hpi,
400159419607SMax Filippov         .par = (const uint32_t[]){
400259419607SMax Filippov             EPC1 + 3,
400359419607SMax Filippov             XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
400459419607SMax Filippov         },
400521a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
4006168c12b0SMax Filippov     }, {
4007168c12b0SMax Filippov         .name = "rsr.epc5",
4008168c12b0SMax Filippov         .translate = translate_rsr,
400991dc2b2dSMax Filippov         .test_exceptions = test_exceptions_hpi,
401059419607SMax Filippov         .par = (const uint32_t[]){
401159419607SMax Filippov             EPC1 + 4,
401259419607SMax Filippov             XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
401359419607SMax Filippov         },
401421a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
4015168c12b0SMax Filippov     }, {
4016168c12b0SMax Filippov         .name = "rsr.epc6",
4017168c12b0SMax Filippov         .translate = translate_rsr,
401891dc2b2dSMax Filippov         .test_exceptions = test_exceptions_hpi,
401959419607SMax Filippov         .par = (const uint32_t[]){
402059419607SMax Filippov             EPC1 + 5,
402159419607SMax Filippov             XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
402259419607SMax Filippov         },
402321a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
4024168c12b0SMax Filippov     }, {
4025168c12b0SMax Filippov         .name = "rsr.epc7",
4026168c12b0SMax Filippov         .translate = translate_rsr,
402791dc2b2dSMax Filippov         .test_exceptions = test_exceptions_hpi,
402859419607SMax Filippov         .par = (const uint32_t[]){
402959419607SMax Filippov             EPC1 + 6,
403059419607SMax Filippov             XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
403159419607SMax Filippov         },
403221a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
4033168c12b0SMax Filippov     }, {
4034168c12b0SMax Filippov         .name = "rsr.eps2",
4035168c12b0SMax Filippov         .translate = translate_rsr,
403691dc2b2dSMax Filippov         .test_exceptions = test_exceptions_hpi,
403759419607SMax Filippov         .par = (const uint32_t[]){
403859419607SMax Filippov             EPS2,
403959419607SMax Filippov             XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
404059419607SMax Filippov         },
404121a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
4042168c12b0SMax Filippov     }, {
4043168c12b0SMax Filippov         .name = "rsr.eps3",
4044168c12b0SMax Filippov         .translate = translate_rsr,
404591dc2b2dSMax Filippov         .test_exceptions = test_exceptions_hpi,
404659419607SMax Filippov         .par = (const uint32_t[]){
404759419607SMax Filippov             EPS2 + 1,
404859419607SMax Filippov             XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
404959419607SMax Filippov         },
405021a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
4051168c12b0SMax Filippov     }, {
4052168c12b0SMax Filippov         .name = "rsr.eps4",
4053168c12b0SMax Filippov         .translate = translate_rsr,
405491dc2b2dSMax Filippov         .test_exceptions = test_exceptions_hpi,
405559419607SMax Filippov         .par = (const uint32_t[]){
405659419607SMax Filippov             EPS2 + 2,
405759419607SMax Filippov             XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
405859419607SMax Filippov         },
405921a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
4060168c12b0SMax Filippov     }, {
4061168c12b0SMax Filippov         .name = "rsr.eps5",
4062168c12b0SMax Filippov         .translate = translate_rsr,
406391dc2b2dSMax Filippov         .test_exceptions = test_exceptions_hpi,
406459419607SMax Filippov         .par = (const uint32_t[]){
406559419607SMax Filippov             EPS2 + 3,
406659419607SMax Filippov             XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
406759419607SMax Filippov         },
406821a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
4069168c12b0SMax Filippov     }, {
4070168c12b0SMax Filippov         .name = "rsr.eps6",
4071168c12b0SMax Filippov         .translate = translate_rsr,
407291dc2b2dSMax Filippov         .test_exceptions = test_exceptions_hpi,
407359419607SMax Filippov         .par = (const uint32_t[]){
407459419607SMax Filippov             EPS2 + 4,
407559419607SMax Filippov             XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
407659419607SMax Filippov         },
407721a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
4078168c12b0SMax Filippov     }, {
4079168c12b0SMax Filippov         .name = "rsr.eps7",
4080168c12b0SMax Filippov         .translate = translate_rsr,
408191dc2b2dSMax Filippov         .test_exceptions = test_exceptions_hpi,
408259419607SMax Filippov         .par = (const uint32_t[]){
408359419607SMax Filippov             EPS2 + 5,
408459419607SMax Filippov             XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
408559419607SMax Filippov         },
408621a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
4087168c12b0SMax Filippov     }, {
40884d04ea35SMax Filippov         .name = "rsr.eraccess",
40894d04ea35SMax Filippov         .translate = translate_rsr,
40904d04ea35SMax Filippov         .par = (const uint32_t[]){ERACCESS},
4091168c12b0SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
4092168c12b0SMax Filippov     }, {
4093168c12b0SMax Filippov         .name = "rsr.exccause",
4094168c12b0SMax Filippov         .translate = translate_rsr,
409591dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
409659419607SMax Filippov         .par = (const uint32_t[]){
409759419607SMax Filippov             EXCCAUSE,
409859419607SMax Filippov             XTENSA_OPTION_EXCEPTION,
409959419607SMax Filippov         },
410021a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
4101168c12b0SMax Filippov     }, {
4102168c12b0SMax Filippov         .name = "rsr.excsave1",
4103168c12b0SMax Filippov         .translate = translate_rsr,
410491dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
410559419607SMax Filippov         .par = (const uint32_t[]){
410659419607SMax Filippov             EXCSAVE1,
410759419607SMax Filippov             XTENSA_OPTION_EXCEPTION,
410859419607SMax Filippov         },
410921a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
4110168c12b0SMax Filippov     }, {
4111168c12b0SMax Filippov         .name = "rsr.excsave2",
4112168c12b0SMax Filippov         .translate = translate_rsr,
411391dc2b2dSMax Filippov         .test_exceptions = test_exceptions_hpi,
411459419607SMax Filippov         .par = (const uint32_t[]){
411559419607SMax Filippov             EXCSAVE1 + 1,
411659419607SMax Filippov             XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
411759419607SMax Filippov         },
411821a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
4119168c12b0SMax Filippov     }, {
4120168c12b0SMax Filippov         .name = "rsr.excsave3",
4121168c12b0SMax Filippov         .translate = translate_rsr,
412291dc2b2dSMax Filippov         .test_exceptions = test_exceptions_hpi,
412359419607SMax Filippov         .par = (const uint32_t[]){
412459419607SMax Filippov             EXCSAVE1 + 2,
412559419607SMax Filippov             XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
412659419607SMax Filippov         },
412721a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
4128168c12b0SMax Filippov     }, {
4129168c12b0SMax Filippov         .name = "rsr.excsave4",
4130168c12b0SMax Filippov         .translate = translate_rsr,
413191dc2b2dSMax Filippov         .test_exceptions = test_exceptions_hpi,
413259419607SMax Filippov         .par = (const uint32_t[]){
413359419607SMax Filippov             EXCSAVE1 + 3,
413459419607SMax Filippov             XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
413559419607SMax Filippov         },
413621a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
4137168c12b0SMax Filippov     }, {
4138168c12b0SMax Filippov         .name = "rsr.excsave5",
4139168c12b0SMax Filippov         .translate = translate_rsr,
414091dc2b2dSMax Filippov         .test_exceptions = test_exceptions_hpi,
414159419607SMax Filippov         .par = (const uint32_t[]){
414259419607SMax Filippov             EXCSAVE1 + 4,
414359419607SMax Filippov             XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
414459419607SMax Filippov         },
414521a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
4146168c12b0SMax Filippov     }, {
4147168c12b0SMax Filippov         .name = "rsr.excsave6",
4148168c12b0SMax Filippov         .translate = translate_rsr,
414991dc2b2dSMax Filippov         .test_exceptions = test_exceptions_hpi,
415059419607SMax Filippov         .par = (const uint32_t[]){
415159419607SMax Filippov             EXCSAVE1 + 5,
415259419607SMax Filippov             XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
415359419607SMax Filippov         },
415421a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
4155168c12b0SMax Filippov     }, {
4156168c12b0SMax Filippov         .name = "rsr.excsave7",
4157168c12b0SMax Filippov         .translate = translate_rsr,
415891dc2b2dSMax Filippov         .test_exceptions = test_exceptions_hpi,
415959419607SMax Filippov         .par = (const uint32_t[]){
416059419607SMax Filippov             EXCSAVE1 + 6,
416159419607SMax Filippov             XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
416259419607SMax Filippov         },
416321a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
4164168c12b0SMax Filippov     }, {
4165168c12b0SMax Filippov         .name = "rsr.excvaddr",
4166168c12b0SMax Filippov         .translate = translate_rsr,
416791dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
416859419607SMax Filippov         .par = (const uint32_t[]){
416959419607SMax Filippov             EXCVADDR,
417059419607SMax Filippov             XTENSA_OPTION_EXCEPTION,
417159419607SMax Filippov         },
417221a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
4173168c12b0SMax Filippov     }, {
4174168c12b0SMax Filippov         .name = "rsr.ibreaka0",
4175168c12b0SMax Filippov         .translate = translate_rsr,
417691dc2b2dSMax Filippov         .test_exceptions = test_exceptions_ibreak,
417759419607SMax Filippov         .par = (const uint32_t[]){
417859419607SMax Filippov             IBREAKA,
417959419607SMax Filippov             XTENSA_OPTION_DEBUG,
418059419607SMax Filippov         },
418121a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
4182168c12b0SMax Filippov     }, {
4183168c12b0SMax Filippov         .name = "rsr.ibreaka1",
4184168c12b0SMax Filippov         .translate = translate_rsr,
418591dc2b2dSMax Filippov         .test_exceptions = test_exceptions_ibreak,
418659419607SMax Filippov         .par = (const uint32_t[]){
418759419607SMax Filippov             IBREAKA + 1,
418859419607SMax Filippov             XTENSA_OPTION_DEBUG,
418959419607SMax Filippov         },
419021a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
4191168c12b0SMax Filippov     }, {
4192168c12b0SMax Filippov         .name = "rsr.ibreakenable",
4193168c12b0SMax Filippov         .translate = translate_rsr,
419491dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
419559419607SMax Filippov         .par = (const uint32_t[]){
419659419607SMax Filippov             IBREAKENABLE,
419759419607SMax Filippov             XTENSA_OPTION_DEBUG,
419859419607SMax Filippov         },
419921a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
4200168c12b0SMax Filippov     }, {
4201168c12b0SMax Filippov         .name = "rsr.icount",
4202168c12b0SMax Filippov         .translate = translate_rsr,
420391dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
420459419607SMax Filippov         .par = (const uint32_t[]){
420559419607SMax Filippov             ICOUNT,
420659419607SMax Filippov             XTENSA_OPTION_DEBUG,
420759419607SMax Filippov         },
420821a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
4209168c12b0SMax Filippov     }, {
4210168c12b0SMax Filippov         .name = "rsr.icountlevel",
4211168c12b0SMax Filippov         .translate = translate_rsr,
421291dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
421359419607SMax Filippov         .par = (const uint32_t[]){
421459419607SMax Filippov             ICOUNTLEVEL,
421559419607SMax Filippov             XTENSA_OPTION_DEBUG,
421659419607SMax Filippov         },
421721a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
4218168c12b0SMax Filippov     }, {
4219168c12b0SMax Filippov         .name = "rsr.intclear",
4220168c12b0SMax Filippov         .translate = translate_rsr,
422191dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
422259419607SMax Filippov         .par = (const uint32_t[]){
422359419607SMax Filippov             INTCLEAR,
422459419607SMax Filippov             XTENSA_OPTION_INTERRUPT,
422559419607SMax Filippov         },
422621a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
4227168c12b0SMax Filippov     }, {
4228168c12b0SMax Filippov         .name = "rsr.intenable",
4229168c12b0SMax Filippov         .translate = translate_rsr,
423091dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
423159419607SMax Filippov         .par = (const uint32_t[]){
423259419607SMax Filippov             INTENABLE,
423359419607SMax Filippov             XTENSA_OPTION_INTERRUPT,
423459419607SMax Filippov         },
423521a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
4236168c12b0SMax Filippov     }, {
4237168c12b0SMax Filippov         .name = "rsr.interrupt",
423859419607SMax Filippov         .translate = translate_rsr_ccount,
423991dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
424059419607SMax Filippov         .par = (const uint32_t[]){
424159419607SMax Filippov             INTSET,
424259419607SMax Filippov             XTENSA_OPTION_INTERRUPT,
424359419607SMax Filippov         },
4244bf525107SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED | XTENSA_OP_EXIT_TB_0,
4245168c12b0SMax Filippov     }, {
4246168c12b0SMax Filippov         .name = "rsr.intset",
424759419607SMax Filippov         .translate = translate_rsr_ccount,
424891dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
424959419607SMax Filippov         .par = (const uint32_t[]){
425059419607SMax Filippov             INTSET,
425159419607SMax Filippov             XTENSA_OPTION_INTERRUPT,
425259419607SMax Filippov         },
4253bf525107SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED | XTENSA_OP_EXIT_TB_0,
4254168c12b0SMax Filippov     }, {
4255168c12b0SMax Filippov         .name = "rsr.itlbcfg",
4256168c12b0SMax Filippov         .translate = translate_rsr,
425791dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
425859419607SMax Filippov         .par = (const uint32_t[]){
425959419607SMax Filippov             ITLBCFG,
426059419607SMax Filippov             XTENSA_OPTION_MMU,
426159419607SMax Filippov         },
426221a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
4263168c12b0SMax Filippov     }, {
4264168c12b0SMax Filippov         .name = "rsr.lbeg",
4265168c12b0SMax Filippov         .translate = translate_rsr,
426691dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
426759419607SMax Filippov         .par = (const uint32_t[]){
426859419607SMax Filippov             LBEG,
426959419607SMax Filippov             XTENSA_OPTION_LOOP,
427059419607SMax Filippov         },
4271168c12b0SMax Filippov     }, {
4272168c12b0SMax Filippov         .name = "rsr.lcount",
4273168c12b0SMax Filippov         .translate = translate_rsr,
427491dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
427559419607SMax Filippov         .par = (const uint32_t[]){
427659419607SMax Filippov             LCOUNT,
427759419607SMax Filippov             XTENSA_OPTION_LOOP,
427859419607SMax Filippov         },
4279168c12b0SMax Filippov     }, {
4280168c12b0SMax Filippov         .name = "rsr.lend",
4281168c12b0SMax Filippov         .translate = translate_rsr,
428291dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
428359419607SMax Filippov         .par = (const uint32_t[]){
428459419607SMax Filippov             LEND,
428559419607SMax Filippov             XTENSA_OPTION_LOOP,
428659419607SMax Filippov         },
4287168c12b0SMax Filippov     }, {
4288168c12b0SMax Filippov         .name = "rsr.litbase",
4289168c12b0SMax Filippov         .translate = translate_rsr,
429091dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
429159419607SMax Filippov         .par = (const uint32_t[]){
429259419607SMax Filippov             LITBASE,
429359419607SMax Filippov             XTENSA_OPTION_EXTENDED_L32R,
429459419607SMax Filippov         },
4295168c12b0SMax Filippov     }, {
4296168c12b0SMax Filippov         .name = "rsr.m0",
4297168c12b0SMax Filippov         .translate = translate_rsr,
429891dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
429959419607SMax Filippov         .par = (const uint32_t[]){
430059419607SMax Filippov             MR,
430159419607SMax Filippov             XTENSA_OPTION_MAC16,
430259419607SMax Filippov         },
4303168c12b0SMax Filippov     }, {
4304168c12b0SMax Filippov         .name = "rsr.m1",
4305168c12b0SMax Filippov         .translate = translate_rsr,
430691dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
430759419607SMax Filippov         .par = (const uint32_t[]){
430859419607SMax Filippov             MR + 1,
430959419607SMax Filippov             XTENSA_OPTION_MAC16,
431059419607SMax Filippov         },
4311168c12b0SMax Filippov     }, {
4312168c12b0SMax Filippov         .name = "rsr.m2",
4313168c12b0SMax Filippov         .translate = translate_rsr,
431491dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
431559419607SMax Filippov         .par = (const uint32_t[]){
431659419607SMax Filippov             MR + 2,
431759419607SMax Filippov             XTENSA_OPTION_MAC16,
431859419607SMax Filippov         },
4319168c12b0SMax Filippov     }, {
4320168c12b0SMax Filippov         .name = "rsr.m3",
4321168c12b0SMax Filippov         .translate = translate_rsr,
432291dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
432359419607SMax Filippov         .par = (const uint32_t[]){
432459419607SMax Filippov             MR + 3,
432559419607SMax Filippov             XTENSA_OPTION_MAC16,
432659419607SMax Filippov         },
4327168c12b0SMax Filippov     }, {
4328168c12b0SMax Filippov         .name = "rsr.memctl",
4329168c12b0SMax Filippov         .translate = translate_rsr,
4330168c12b0SMax Filippov         .par = (const uint32_t[]){MEMCTL},
433121a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
4332168c12b0SMax Filippov     }, {
4333631a77a0SMax Filippov         .name = "rsr.mecr",
4334631a77a0SMax Filippov         .translate = translate_rsr,
433591dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
4336631a77a0SMax Filippov         .par = (const uint32_t[]){
4337631a77a0SMax Filippov             MECR,
4338631a77a0SMax Filippov             XTENSA_OPTION_MEMORY_ECC_PARITY,
4339631a77a0SMax Filippov         },
4340631a77a0SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
4341631a77a0SMax Filippov     }, {
4342631a77a0SMax Filippov         .name = "rsr.mepc",
4343631a77a0SMax Filippov         .translate = translate_rsr,
434491dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
4345631a77a0SMax Filippov         .par = (const uint32_t[]){
4346631a77a0SMax Filippov             MEPC,
4347631a77a0SMax Filippov             XTENSA_OPTION_MEMORY_ECC_PARITY,
4348631a77a0SMax Filippov         },
4349631a77a0SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
4350631a77a0SMax Filippov     }, {
4351631a77a0SMax Filippov         .name = "rsr.meps",
4352631a77a0SMax Filippov         .translate = translate_rsr,
435391dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
4354631a77a0SMax Filippov         .par = (const uint32_t[]){
4355631a77a0SMax Filippov             MEPS,
4356631a77a0SMax Filippov             XTENSA_OPTION_MEMORY_ECC_PARITY,
4357631a77a0SMax Filippov         },
4358631a77a0SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
4359631a77a0SMax Filippov     }, {
4360631a77a0SMax Filippov         .name = "rsr.mesave",
4361631a77a0SMax Filippov         .translate = translate_rsr,
436291dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
4363631a77a0SMax Filippov         .par = (const uint32_t[]){
4364631a77a0SMax Filippov             MESAVE,
4365631a77a0SMax Filippov             XTENSA_OPTION_MEMORY_ECC_PARITY,
4366631a77a0SMax Filippov         },
4367631a77a0SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
4368631a77a0SMax Filippov     }, {
4369631a77a0SMax Filippov         .name = "rsr.mesr",
4370631a77a0SMax Filippov         .translate = translate_rsr,
437191dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
4372631a77a0SMax Filippov         .par = (const uint32_t[]){
4373631a77a0SMax Filippov             MESR,
4374631a77a0SMax Filippov             XTENSA_OPTION_MEMORY_ECC_PARITY,
4375631a77a0SMax Filippov         },
4376631a77a0SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
4377631a77a0SMax Filippov     }, {
4378631a77a0SMax Filippov         .name = "rsr.mevaddr",
4379631a77a0SMax Filippov         .translate = translate_rsr,
438091dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
4381631a77a0SMax Filippov         .par = (const uint32_t[]){
4382631a77a0SMax Filippov             MESR,
4383631a77a0SMax Filippov             XTENSA_OPTION_MEMORY_ECC_PARITY,
4384631a77a0SMax Filippov         },
4385631a77a0SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
4386631a77a0SMax Filippov     }, {
4387168c12b0SMax Filippov         .name = "rsr.misc0",
4388168c12b0SMax Filippov         .translate = translate_rsr,
438991dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
439059419607SMax Filippov         .par = (const uint32_t[]){
439159419607SMax Filippov             MISC,
439259419607SMax Filippov             XTENSA_OPTION_MISC_SR,
439359419607SMax Filippov         },
439421a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
4395168c12b0SMax Filippov     }, {
4396168c12b0SMax Filippov         .name = "rsr.misc1",
4397168c12b0SMax Filippov         .translate = translate_rsr,
439891dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
439959419607SMax Filippov         .par = (const uint32_t[]){
440059419607SMax Filippov             MISC + 1,
440159419607SMax Filippov             XTENSA_OPTION_MISC_SR,
440259419607SMax Filippov         },
440321a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
4404168c12b0SMax Filippov     }, {
4405168c12b0SMax Filippov         .name = "rsr.misc2",
4406168c12b0SMax Filippov         .translate = translate_rsr,
440791dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
440859419607SMax Filippov         .par = (const uint32_t[]){
440959419607SMax Filippov             MISC + 2,
441059419607SMax Filippov             XTENSA_OPTION_MISC_SR,
441159419607SMax Filippov         },
441221a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
4413168c12b0SMax Filippov     }, {
4414168c12b0SMax Filippov         .name = "rsr.misc3",
4415168c12b0SMax Filippov         .translate = translate_rsr,
441691dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
441759419607SMax Filippov         .par = (const uint32_t[]){
441859419607SMax Filippov             MISC + 3,
441959419607SMax Filippov             XTENSA_OPTION_MISC_SR,
442059419607SMax Filippov         },
442121a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
4422168c12b0SMax Filippov     }, {
44234d04ea35SMax Filippov         .name = "rsr.mpucfg",
44244d04ea35SMax Filippov         .translate = translate_rsr,
442591dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
44264d04ea35SMax Filippov         .par = (const uint32_t[]){
44274d04ea35SMax Filippov             MPUCFG,
44284d04ea35SMax Filippov             XTENSA_OPTION_MPU,
44294d04ea35SMax Filippov         },
44304d04ea35SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
44314d04ea35SMax Filippov     }, {
44324d04ea35SMax Filippov         .name = "rsr.mpuenb",
44334d04ea35SMax Filippov         .translate = translate_rsr,
443491dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
44354d04ea35SMax Filippov         .par = (const uint32_t[]){
44364d04ea35SMax Filippov             MPUENB,
44374d04ea35SMax Filippov             XTENSA_OPTION_MPU,
44384d04ea35SMax Filippov         },
4439168c12b0SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
4440168c12b0SMax Filippov     }, {
4441eb3f4298SMax Filippov         .name = "rsr.prefctl",
4442eb3f4298SMax Filippov         .translate = translate_rsr,
4443eb3f4298SMax Filippov         .par = (const uint32_t[]){PREFCTL},
4444eb3f4298SMax Filippov     }, {
4445168c12b0SMax Filippov         .name = "rsr.prid",
4446168c12b0SMax Filippov         .translate = translate_rsr,
444791dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
444859419607SMax Filippov         .par = (const uint32_t[]){
444959419607SMax Filippov             PRID,
445059419607SMax Filippov             XTENSA_OPTION_PROCESSOR_ID,
445159419607SMax Filippov         },
445221a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
4453168c12b0SMax Filippov     }, {
4454168c12b0SMax Filippov         .name = "rsr.ps",
4455168c12b0SMax Filippov         .translate = translate_rsr,
445691dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
445759419607SMax Filippov         .par = (const uint32_t[]){
445859419607SMax Filippov             PS,
445959419607SMax Filippov             XTENSA_OPTION_EXCEPTION,
446059419607SMax Filippov         },
446121a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
4462168c12b0SMax Filippov     }, {
4463168c12b0SMax Filippov         .name = "rsr.ptevaddr",
446459419607SMax Filippov         .translate = translate_rsr_ptevaddr,
446591dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
446659419607SMax Filippov         .par = (const uint32_t[]){
446759419607SMax Filippov             PTEVADDR,
446859419607SMax Filippov             XTENSA_OPTION_MMU,
446959419607SMax Filippov         },
447021a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
4471168c12b0SMax Filippov     }, {
4472168c12b0SMax Filippov         .name = "rsr.rasid",
4473168c12b0SMax Filippov         .translate = translate_rsr,
447491dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
447559419607SMax Filippov         .par = (const uint32_t[]){
447659419607SMax Filippov             RASID,
447759419607SMax Filippov             XTENSA_OPTION_MMU,
447859419607SMax Filippov         },
447921a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
4480168c12b0SMax Filippov     }, {
4481168c12b0SMax Filippov         .name = "rsr.sar",
4482168c12b0SMax Filippov         .translate = translate_rsr,
4483168c12b0SMax Filippov         .par = (const uint32_t[]){SAR},
4484168c12b0SMax Filippov     }, {
4485168c12b0SMax Filippov         .name = "rsr.scompare1",
4486168c12b0SMax Filippov         .translate = translate_rsr,
448791dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
448859419607SMax Filippov         .par = (const uint32_t[]){
448959419607SMax Filippov             SCOMPARE1,
449059419607SMax Filippov             XTENSA_OPTION_CONDITIONAL_STORE,
449159419607SMax Filippov         },
4492168c12b0SMax Filippov     }, {
4493168c12b0SMax Filippov         .name = "rsr.vecbase",
4494168c12b0SMax Filippov         .translate = translate_rsr,
449591dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
449659419607SMax Filippov         .par = (const uint32_t[]){
449759419607SMax Filippov             VECBASE,
449859419607SMax Filippov             XTENSA_OPTION_RELOCATABLE_VECTOR,
449959419607SMax Filippov         },
450021a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
4501168c12b0SMax Filippov     }, {
4502168c12b0SMax Filippov         .name = "rsr.windowbase",
4503168c12b0SMax Filippov         .translate = translate_rsr,
450491dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
450559419607SMax Filippov         .par = (const uint32_t[]){
450659419607SMax Filippov             WINDOW_BASE,
450759419607SMax Filippov             XTENSA_OPTION_WINDOWED_REGISTER,
450859419607SMax Filippov         },
450921a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
4510168c12b0SMax Filippov     }, {
4511168c12b0SMax Filippov         .name = "rsr.windowstart",
4512168c12b0SMax Filippov         .translate = translate_rsr,
451391dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
451459419607SMax Filippov         .par = (const uint32_t[]){
451559419607SMax Filippov             WINDOW_START,
451659419607SMax Filippov             XTENSA_OPTION_WINDOWED_REGISTER,
451759419607SMax Filippov         },
451821a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
4519168c12b0SMax Filippov     }, {
4520168c12b0SMax Filippov         .name = "rsync",
4521168c12b0SMax Filippov         .translate = translate_nop,
4522168c12b0SMax Filippov     }, {
4523e9872741SMax Filippov         .name = "rur.expstate",
4524e9872741SMax Filippov         .translate = translate_rur,
4525e9872741SMax Filippov         .par = (const uint32_t[]){EXPSTATE},
4526e9872741SMax Filippov     }, {
4527168c12b0SMax Filippov         .name = "rur.threadptr",
4528168c12b0SMax Filippov         .translate = translate_rur,
4529168c12b0SMax Filippov         .par = (const uint32_t[]){THREADPTR},
4530168c12b0SMax Filippov     }, {
4531168c12b0SMax Filippov         .name = "s16i",
4532168c12b0SMax Filippov         .translate = translate_ldst,
4533168c12b0SMax Filippov         .par = (const uint32_t[]){MO_TEUW, false, true},
4534068e538aSMax Filippov         .op_flags = XTENSA_OP_STORE,
4535168c12b0SMax Filippov     }, {
4536168c12b0SMax Filippov         .name = "s32c1i",
4537168c12b0SMax Filippov         .translate = translate_s32c1i,
4538068e538aSMax Filippov         .op_flags = XTENSA_OP_LOAD | XTENSA_OP_STORE,
4539168c12b0SMax Filippov     }, {
4540168c12b0SMax Filippov         .name = "s32e",
4541168c12b0SMax Filippov         .translate = translate_s32e,
4542068e538aSMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED | XTENSA_OP_STORE,
4543168c12b0SMax Filippov     }, {
4544b345e140SMax Filippov         .name = "s32ex",
4545b345e140SMax Filippov         .translate = translate_s32ex,
4546b345e140SMax Filippov         .op_flags = XTENSA_OP_LOAD | XTENSA_OP_STORE,
4547b345e140SMax Filippov     }, {
4548d863fcf7SMax Filippov         .name = (const char * const[]) {
4549d863fcf7SMax Filippov             "s32i", "s32i.n", "s32nb", NULL,
4550d863fcf7SMax Filippov         },
4551168c12b0SMax Filippov         .translate = translate_ldst,
4552168c12b0SMax Filippov         .par = (const uint32_t[]){MO_TEUL, false, true},
4553068e538aSMax Filippov         .op_flags = XTENSA_OP_NAME_ARRAY | XTENSA_OP_STORE,
4554168c12b0SMax Filippov     }, {
4555168c12b0SMax Filippov         .name = "s32ri",
4556168c12b0SMax Filippov         .translate = translate_ldst,
4557583e6a5fSMax Filippov         .par = (const uint32_t[]){MO_TEUL | MO_ALIGN, true, true},
4558068e538aSMax Filippov         .op_flags = XTENSA_OP_STORE,
4559168c12b0SMax Filippov     }, {
4560168c12b0SMax Filippov         .name = "s8i",
4561168c12b0SMax Filippov         .translate = translate_ldst,
4562168c12b0SMax Filippov         .par = (const uint32_t[]){MO_UB, false, true},
4563068e538aSMax Filippov         .op_flags = XTENSA_OP_STORE,
4564168c12b0SMax Filippov     }, {
4565d1e9b006SMax Filippov         .name = "salt",
4566d1e9b006SMax Filippov         .translate = translate_salt,
4567d1e9b006SMax Filippov         .par = (const uint32_t[]){TCG_COND_LT},
4568d1e9b006SMax Filippov     }, {
4569d1e9b006SMax Filippov         .name = "saltu",
4570d1e9b006SMax Filippov         .translate = translate_salt,
4571d1e9b006SMax Filippov         .par = (const uint32_t[]){TCG_COND_LTU},
4572d1e9b006SMax Filippov     }, {
457359491e97SMax Filippov         .name = "sdct",
457459491e97SMax Filippov         .translate = translate_nop,
457559491e97SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
457659491e97SMax Filippov     }, {
457759491e97SMax Filippov         .name = "sdcw",
457859491e97SMax Filippov         .translate = translate_nop,
457959491e97SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
458059491e97SMax Filippov     }, {
4581e9872741SMax Filippov         .name = "setb_expstate",
4582e9872741SMax Filippov         .translate = translate_setb_expstate,
4583e9872741SMax Filippov     }, {
4584168c12b0SMax Filippov         .name = "sext",
4585168c12b0SMax Filippov         .translate = translate_sext,
4586168c12b0SMax Filippov     }, {
458759491e97SMax Filippov         .name = "sict",
458859491e97SMax Filippov         .translate = translate_nop,
458959491e97SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
459059491e97SMax Filippov     }, {
459159491e97SMax Filippov         .name = "sicw",
459259491e97SMax Filippov         .translate = translate_nop,
459359491e97SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
459459491e97SMax Filippov     }, {
4595168c12b0SMax Filippov         .name = "simcall",
4596168c12b0SMax Filippov         .translate = translate_simcall,
459791dc2b2dSMax Filippov         .test_exceptions = test_exceptions_simcall,
459821a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
4599168c12b0SMax Filippov     }, {
4600168c12b0SMax Filippov         .name = "sll",
4601168c12b0SMax Filippov         .translate = translate_sll,
4602168c12b0SMax Filippov     }, {
4603168c12b0SMax Filippov         .name = "slli",
4604168c12b0SMax Filippov         .translate = translate_slli,
4605168c12b0SMax Filippov     }, {
4606168c12b0SMax Filippov         .name = "sra",
4607168c12b0SMax Filippov         .translate = translate_sra,
4608168c12b0SMax Filippov     }, {
4609168c12b0SMax Filippov         .name = "srai",
4610168c12b0SMax Filippov         .translate = translate_srai,
4611168c12b0SMax Filippov     }, {
4612168c12b0SMax Filippov         .name = "src",
4613168c12b0SMax Filippov         .translate = translate_src,
4614168c12b0SMax Filippov     }, {
4615168c12b0SMax Filippov         .name = "srl",
4616168c12b0SMax Filippov         .translate = translate_srl,
4617168c12b0SMax Filippov     }, {
4618168c12b0SMax Filippov         .name = "srli",
4619168c12b0SMax Filippov         .translate = translate_srli,
4620168c12b0SMax Filippov     }, {
4621168c12b0SMax Filippov         .name = "ssa8b",
4622168c12b0SMax Filippov         .translate = translate_ssa8b,
4623168c12b0SMax Filippov     }, {
4624168c12b0SMax Filippov         .name = "ssa8l",
4625168c12b0SMax Filippov         .translate = translate_ssa8l,
4626168c12b0SMax Filippov     }, {
4627168c12b0SMax Filippov         .name = "ssai",
4628168c12b0SMax Filippov         .translate = translate_ssai,
4629168c12b0SMax Filippov     }, {
4630168c12b0SMax Filippov         .name = "ssl",
4631168c12b0SMax Filippov         .translate = translate_ssl,
4632168c12b0SMax Filippov     }, {
4633168c12b0SMax Filippov         .name = "ssr",
4634168c12b0SMax Filippov         .translate = translate_ssr,
4635168c12b0SMax Filippov     }, {
4636168c12b0SMax Filippov         .name = "sub",
4637168c12b0SMax Filippov         .translate = translate_sub,
4638168c12b0SMax Filippov     }, {
4639168c12b0SMax Filippov         .name = "subx2",
4640168c12b0SMax Filippov         .translate = translate_subx,
4641168c12b0SMax Filippov         .par = (const uint32_t[]){1},
4642168c12b0SMax Filippov     }, {
4643168c12b0SMax Filippov         .name = "subx4",
4644168c12b0SMax Filippov         .translate = translate_subx,
4645168c12b0SMax Filippov         .par = (const uint32_t[]){2},
4646168c12b0SMax Filippov     }, {
4647168c12b0SMax Filippov         .name = "subx8",
4648168c12b0SMax Filippov         .translate = translate_subx,
4649168c12b0SMax Filippov         .par = (const uint32_t[]){3},
4650168c12b0SMax Filippov     }, {
4651168c12b0SMax Filippov         .name = "syscall",
46524c6ec5f3SMax Filippov         .op_flags = XTENSA_OP_SYSCALL,
4653168c12b0SMax Filippov     }, {
4654168c12b0SMax Filippov         .name = "umul.aa.hh",
4655168c12b0SMax Filippov         .translate = translate_mac16,
46567aa78341SMax Filippov         .par = (const uint32_t[]){MAC16_UMUL, MAC16_HH, 0},
4657168c12b0SMax Filippov     }, {
4658168c12b0SMax Filippov         .name = "umul.aa.hl",
4659168c12b0SMax Filippov         .translate = translate_mac16,
46607aa78341SMax Filippov         .par = (const uint32_t[]){MAC16_UMUL, MAC16_HL, 0},
4661168c12b0SMax Filippov     }, {
4662168c12b0SMax Filippov         .name = "umul.aa.lh",
4663168c12b0SMax Filippov         .translate = translate_mac16,
46647aa78341SMax Filippov         .par = (const uint32_t[]){MAC16_UMUL, MAC16_LH, 0},
4665168c12b0SMax Filippov     }, {
4666168c12b0SMax Filippov         .name = "umul.aa.ll",
4667168c12b0SMax Filippov         .translate = translate_mac16,
46687aa78341SMax Filippov         .par = (const uint32_t[]){MAC16_UMUL, MAC16_LL, 0},
4669168c12b0SMax Filippov     }, {
4670168c12b0SMax Filippov         .name = "waiti",
4671168c12b0SMax Filippov         .translate = translate_waiti,
4672bf525107SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED | XTENSA_OP_EXIT_TB_0,
4673168c12b0SMax Filippov     }, {
4674168c12b0SMax Filippov         .name = "wdtlb",
4675168c12b0SMax Filippov         .translate = translate_wtlb,
4676168c12b0SMax Filippov         .par = (const uint32_t[]){true},
4677226444a8SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED | XTENSA_OP_EXIT_TB_M1,
4678168c12b0SMax Filippov     }, {
4679168c12b0SMax Filippov         .name = "wer",
4680168c12b0SMax Filippov         .translate = translate_wer,
468121a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
4682168c12b0SMax Filippov     }, {
4683168c12b0SMax Filippov         .name = "witlb",
4684168c12b0SMax Filippov         .translate = translate_wtlb,
4685168c12b0SMax Filippov         .par = (const uint32_t[]){false},
4686226444a8SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED | XTENSA_OP_EXIT_TB_M1,
4687168c12b0SMax Filippov     }, {
46884d04ea35SMax Filippov         .name = "wptlb",
46894d04ea35SMax Filippov         .translate = translate_wptlb,
46904d04ea35SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED | XTENSA_OP_EXIT_TB_M1,
46914d04ea35SMax Filippov     }, {
4692e9872741SMax Filippov         .name = "wrmsk_expstate",
4693e9872741SMax Filippov         .translate = translate_wrmsk_expstate,
4694e9872741SMax Filippov     }, {
4695168c12b0SMax Filippov         .name = "wsr.176",
469659419607SMax Filippov         .op_flags = XTENSA_OP_ILL,
4697168c12b0SMax Filippov     }, {
4698168c12b0SMax Filippov         .name = "wsr.208",
469959419607SMax Filippov         .op_flags = XTENSA_OP_ILL,
4700168c12b0SMax Filippov     }, {
4701168c12b0SMax Filippov         .name = "wsr.acchi",
470259419607SMax Filippov         .translate = translate_wsr_acchi,
470391dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
470459419607SMax Filippov         .par = (const uint32_t[]){
470559419607SMax Filippov             ACCHI,
470659419607SMax Filippov             XTENSA_OPTION_MAC16,
470759419607SMax Filippov         },
4708168c12b0SMax Filippov     }, {
4709168c12b0SMax Filippov         .name = "wsr.acclo",
4710168c12b0SMax Filippov         .translate = translate_wsr,
471191dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
471259419607SMax Filippov         .par = (const uint32_t[]){
471359419607SMax Filippov             ACCLO,
471459419607SMax Filippov             XTENSA_OPTION_MAC16,
471559419607SMax Filippov         },
4716168c12b0SMax Filippov     }, {
4717168c12b0SMax Filippov         .name = "wsr.atomctl",
471859419607SMax Filippov         .translate = translate_wsr_mask,
471991dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
472059419607SMax Filippov         .par = (const uint32_t[]){
472159419607SMax Filippov             ATOMCTL,
472259419607SMax Filippov             XTENSA_OPTION_ATOMCTL,
472359419607SMax Filippov             0x3f,
472459419607SMax Filippov         },
472521a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
4726168c12b0SMax Filippov     }, {
4727168c12b0SMax Filippov         .name = "wsr.br",
472859419607SMax Filippov         .translate = translate_wsr_mask,
472991dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
473059419607SMax Filippov         .par = (const uint32_t[]){
473159419607SMax Filippov             BR,
473259419607SMax Filippov             XTENSA_OPTION_BOOLEAN,
473359419607SMax Filippov             0xffff,
473459419607SMax Filippov         },
4735168c12b0SMax Filippov     }, {
47364d04ea35SMax Filippov         .name = "wsr.cacheadrdis",
47374d04ea35SMax Filippov         .translate = translate_wsr_mask,
473891dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
47394d04ea35SMax Filippov         .par = (const uint32_t[]){
47404d04ea35SMax Filippov             CACHEADRDIS,
47414d04ea35SMax Filippov             XTENSA_OPTION_MPU,
47424d04ea35SMax Filippov             0xff,
47434d04ea35SMax Filippov         },
47444d04ea35SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
4745168c12b0SMax Filippov     }, {
4746168c12b0SMax Filippov         .name = "wsr.cacheattr",
4747168c12b0SMax Filippov         .translate = translate_wsr,
474891dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
474959419607SMax Filippov         .par = (const uint32_t[]){
475059419607SMax Filippov             CACHEATTR,
475159419607SMax Filippov             XTENSA_OPTION_CACHEATTR,
475259419607SMax Filippov         },
475321a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
4754168c12b0SMax Filippov     }, {
4755168c12b0SMax Filippov         .name = "wsr.ccompare0",
475659419607SMax Filippov         .translate = translate_wsr_ccompare,
475791dc2b2dSMax Filippov         .test_exceptions = test_exceptions_ccompare,
475859419607SMax Filippov         .par = (const uint32_t[]){
475959419607SMax Filippov             CCOMPARE,
476059419607SMax Filippov             XTENSA_OPTION_TIMER_INTERRUPT,
476159419607SMax Filippov         },
4762bf525107SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED | XTENSA_OP_EXIT_TB_0,
4763168c12b0SMax Filippov     }, {
4764168c12b0SMax Filippov         .name = "wsr.ccompare1",
476559419607SMax Filippov         .translate = translate_wsr_ccompare,
476691dc2b2dSMax Filippov         .test_exceptions = test_exceptions_ccompare,
476759419607SMax Filippov         .par = (const uint32_t[]){
476859419607SMax Filippov             CCOMPARE + 1,
476959419607SMax Filippov             XTENSA_OPTION_TIMER_INTERRUPT,
477059419607SMax Filippov         },
4771bf525107SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED | XTENSA_OP_EXIT_TB_0,
4772168c12b0SMax Filippov     }, {
4773168c12b0SMax Filippov         .name = "wsr.ccompare2",
477459419607SMax Filippov         .translate = translate_wsr_ccompare,
477591dc2b2dSMax Filippov         .test_exceptions = test_exceptions_ccompare,
477659419607SMax Filippov         .par = (const uint32_t[]){
477759419607SMax Filippov             CCOMPARE + 2,
477859419607SMax Filippov             XTENSA_OPTION_TIMER_INTERRUPT,
477959419607SMax Filippov         },
4780bf525107SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED | XTENSA_OP_EXIT_TB_0,
4781168c12b0SMax Filippov     }, {
4782168c12b0SMax Filippov         .name = "wsr.ccount",
478359419607SMax Filippov         .translate = translate_wsr_ccount,
478491dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
478559419607SMax Filippov         .par = (const uint32_t[]){
478659419607SMax Filippov             CCOUNT,
478759419607SMax Filippov             XTENSA_OPTION_TIMER_INTERRUPT,
478859419607SMax Filippov         },
4789bf525107SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED | XTENSA_OP_EXIT_TB_0,
4790168c12b0SMax Filippov     }, {
4791168c12b0SMax Filippov         .name = "wsr.configid0",
479259419607SMax Filippov         .op_flags = XTENSA_OP_ILL,
4793168c12b0SMax Filippov     }, {
4794168c12b0SMax Filippov         .name = "wsr.configid1",
479559419607SMax Filippov         .op_flags = XTENSA_OP_ILL,
4796168c12b0SMax Filippov     }, {
4797168c12b0SMax Filippov         .name = "wsr.cpenable",
479859419607SMax Filippov         .translate = translate_wsr_mask,
479991dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
480059419607SMax Filippov         .par = (const uint32_t[]){
480159419607SMax Filippov             CPENABLE,
480259419607SMax Filippov             XTENSA_OPTION_COPROCESSOR,
480359419607SMax Filippov             0xff,
480459419607SMax Filippov         },
4805226444a8SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED | XTENSA_OP_EXIT_TB_M1,
4806168c12b0SMax Filippov     }, {
4807168c12b0SMax Filippov         .name = "wsr.dbreaka0",
480859419607SMax Filippov         .translate = translate_wsr_dbreaka,
480991dc2b2dSMax Filippov         .test_exceptions = test_exceptions_dbreak,
481059419607SMax Filippov         .par = (const uint32_t[]){
481159419607SMax Filippov             DBREAKA,
481259419607SMax Filippov             XTENSA_OPTION_DEBUG,
481359419607SMax Filippov         },
481421a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
4815168c12b0SMax Filippov     }, {
4816168c12b0SMax Filippov         .name = "wsr.dbreaka1",
481759419607SMax Filippov         .translate = translate_wsr_dbreaka,
481891dc2b2dSMax Filippov         .test_exceptions = test_exceptions_dbreak,
481959419607SMax Filippov         .par = (const uint32_t[]){
482059419607SMax Filippov             DBREAKA + 1,
482159419607SMax Filippov             XTENSA_OPTION_DEBUG,
482259419607SMax Filippov         },
482321a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
4824168c12b0SMax Filippov     }, {
4825168c12b0SMax Filippov         .name = "wsr.dbreakc0",
482659419607SMax Filippov         .translate = translate_wsr_dbreakc,
482791dc2b2dSMax Filippov         .test_exceptions = test_exceptions_dbreak,
482859419607SMax Filippov         .par = (const uint32_t[]){
482959419607SMax Filippov             DBREAKC,
483059419607SMax Filippov             XTENSA_OPTION_DEBUG,
483159419607SMax Filippov         },
483221a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
4833168c12b0SMax Filippov     }, {
4834168c12b0SMax Filippov         .name = "wsr.dbreakc1",
483559419607SMax Filippov         .translate = translate_wsr_dbreakc,
483691dc2b2dSMax Filippov         .test_exceptions = test_exceptions_dbreak,
483759419607SMax Filippov         .par = (const uint32_t[]){
483859419607SMax Filippov             DBREAKC + 1,
483959419607SMax Filippov             XTENSA_OPTION_DEBUG,
484059419607SMax Filippov         },
484121a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
4842168c12b0SMax Filippov     }, {
484313f6a7cdSMax Filippov         .name = "wsr.ddr",
484413f6a7cdSMax Filippov         .translate = translate_wsr,
484591dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
484659419607SMax Filippov         .par = (const uint32_t[]){
484759419607SMax Filippov             DDR,
484859419607SMax Filippov             XTENSA_OPTION_DEBUG,
484959419607SMax Filippov         },
485021a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
485113f6a7cdSMax Filippov     }, {
4852168c12b0SMax Filippov         .name = "wsr.debugcause",
485359419607SMax Filippov         .op_flags = XTENSA_OP_ILL,
4854168c12b0SMax Filippov     }, {
4855168c12b0SMax Filippov         .name = "wsr.depc",
4856168c12b0SMax Filippov         .translate = translate_wsr,
485791dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
485859419607SMax Filippov         .par = (const uint32_t[]){
485959419607SMax Filippov             DEPC,
486059419607SMax Filippov             XTENSA_OPTION_EXCEPTION,
486159419607SMax Filippov         },
486221a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
4863168c12b0SMax Filippov     }, {
4864168c12b0SMax Filippov         .name = "wsr.dtlbcfg",
486559419607SMax Filippov         .translate = translate_wsr_mask,
486691dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
486759419607SMax Filippov         .par = (const uint32_t[]){
486859419607SMax Filippov             DTLBCFG,
486959419607SMax Filippov             XTENSA_OPTION_MMU,
487059419607SMax Filippov             0x01130000,
487159419607SMax Filippov         },
487221a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
4873168c12b0SMax Filippov     }, {
4874168c12b0SMax Filippov         .name = "wsr.epc1",
4875168c12b0SMax Filippov         .translate = translate_wsr,
487691dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
487759419607SMax Filippov         .par = (const uint32_t[]){
487859419607SMax Filippov             EPC1,
487959419607SMax Filippov             XTENSA_OPTION_EXCEPTION,
488059419607SMax Filippov         },
488121a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
4882168c12b0SMax Filippov     }, {
4883168c12b0SMax Filippov         .name = "wsr.epc2",
4884168c12b0SMax Filippov         .translate = translate_wsr,
488591dc2b2dSMax Filippov         .test_exceptions = test_exceptions_hpi,
488659419607SMax Filippov         .par = (const uint32_t[]){
488759419607SMax Filippov             EPC1 + 1,
488859419607SMax Filippov             XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
488959419607SMax Filippov         },
489021a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
4891168c12b0SMax Filippov     }, {
4892168c12b0SMax Filippov         .name = "wsr.epc3",
4893168c12b0SMax Filippov         .translate = translate_wsr,
489491dc2b2dSMax Filippov         .test_exceptions = test_exceptions_hpi,
489559419607SMax Filippov         .par = (const uint32_t[]){
489659419607SMax Filippov             EPC1 + 2,
489759419607SMax Filippov             XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
489859419607SMax Filippov         },
489921a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
4900168c12b0SMax Filippov     }, {
4901168c12b0SMax Filippov         .name = "wsr.epc4",
4902168c12b0SMax Filippov         .translate = translate_wsr,
490391dc2b2dSMax Filippov         .test_exceptions = test_exceptions_hpi,
490459419607SMax Filippov         .par = (const uint32_t[]){
490559419607SMax Filippov             EPC1 + 3,
490659419607SMax Filippov             XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
490759419607SMax Filippov         },
490821a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
4909168c12b0SMax Filippov     }, {
4910168c12b0SMax Filippov         .name = "wsr.epc5",
4911168c12b0SMax Filippov         .translate = translate_wsr,
491291dc2b2dSMax Filippov         .test_exceptions = test_exceptions_hpi,
491359419607SMax Filippov         .par = (const uint32_t[]){
491459419607SMax Filippov             EPC1 + 4,
491559419607SMax Filippov             XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
491659419607SMax Filippov         },
491721a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
4918168c12b0SMax Filippov     }, {
4919168c12b0SMax Filippov         .name = "wsr.epc6",
4920168c12b0SMax Filippov         .translate = translate_wsr,
492191dc2b2dSMax Filippov         .test_exceptions = test_exceptions_hpi,
492259419607SMax Filippov         .par = (const uint32_t[]){
492359419607SMax Filippov             EPC1 + 5,
492459419607SMax Filippov             XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
492559419607SMax Filippov         },
492621a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
4927168c12b0SMax Filippov     }, {
4928168c12b0SMax Filippov         .name = "wsr.epc7",
4929168c12b0SMax Filippov         .translate = translate_wsr,
493091dc2b2dSMax Filippov         .test_exceptions = test_exceptions_hpi,
493159419607SMax Filippov         .par = (const uint32_t[]){
493259419607SMax Filippov             EPC1 + 6,
493359419607SMax Filippov             XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
493459419607SMax Filippov         },
493521a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
4936168c12b0SMax Filippov     }, {
4937168c12b0SMax Filippov         .name = "wsr.eps2",
4938168c12b0SMax Filippov         .translate = translate_wsr,
493991dc2b2dSMax Filippov         .test_exceptions = test_exceptions_hpi,
494059419607SMax Filippov         .par = (const uint32_t[]){
494159419607SMax Filippov             EPS2,
494259419607SMax Filippov             XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
494359419607SMax Filippov         },
494421a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
4945168c12b0SMax Filippov     }, {
4946168c12b0SMax Filippov         .name = "wsr.eps3",
4947168c12b0SMax Filippov         .translate = translate_wsr,
494891dc2b2dSMax Filippov         .test_exceptions = test_exceptions_hpi,
494959419607SMax Filippov         .par = (const uint32_t[]){
495059419607SMax Filippov             EPS2 + 1,
495159419607SMax Filippov             XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
495259419607SMax Filippov         },
495321a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
4954168c12b0SMax Filippov     }, {
4955168c12b0SMax Filippov         .name = "wsr.eps4",
4956168c12b0SMax Filippov         .translate = translate_wsr,
495791dc2b2dSMax Filippov         .test_exceptions = test_exceptions_hpi,
495859419607SMax Filippov         .par = (const uint32_t[]){
495959419607SMax Filippov             EPS2 + 2,
496059419607SMax Filippov             XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
496159419607SMax Filippov         },
496221a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
4963168c12b0SMax Filippov     }, {
4964168c12b0SMax Filippov         .name = "wsr.eps5",
4965168c12b0SMax Filippov         .translate = translate_wsr,
496691dc2b2dSMax Filippov         .test_exceptions = test_exceptions_hpi,
496759419607SMax Filippov         .par = (const uint32_t[]){
496859419607SMax Filippov             EPS2 + 3,
496959419607SMax Filippov             XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
497059419607SMax Filippov         },
497121a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
4972168c12b0SMax Filippov     }, {
4973168c12b0SMax Filippov         .name = "wsr.eps6",
4974168c12b0SMax Filippov         .translate = translate_wsr,
497591dc2b2dSMax Filippov         .test_exceptions = test_exceptions_hpi,
497659419607SMax Filippov         .par = (const uint32_t[]){
497759419607SMax Filippov             EPS2 + 4,
497859419607SMax Filippov             XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
497959419607SMax Filippov         },
498021a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
4981168c12b0SMax Filippov     }, {
4982168c12b0SMax Filippov         .name = "wsr.eps7",
4983168c12b0SMax Filippov         .translate = translate_wsr,
498491dc2b2dSMax Filippov         .test_exceptions = test_exceptions_hpi,
498559419607SMax Filippov         .par = (const uint32_t[]){
498659419607SMax Filippov             EPS2 + 5,
498759419607SMax Filippov             XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
498859419607SMax Filippov         },
498921a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
4990168c12b0SMax Filippov     }, {
49914d04ea35SMax Filippov         .name = "wsr.eraccess",
49924d04ea35SMax Filippov         .translate = translate_wsr_mask,
49934d04ea35SMax Filippov         .par = (const uint32_t[]){
49944d04ea35SMax Filippov             ERACCESS,
49954d04ea35SMax Filippov             0,
49964d04ea35SMax Filippov             0xffff,
49974d04ea35SMax Filippov         },
4998168c12b0SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
4999168c12b0SMax Filippov     }, {
5000168c12b0SMax Filippov         .name = "wsr.exccause",
5001168c12b0SMax Filippov         .translate = translate_wsr,
500291dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
500359419607SMax Filippov         .par = (const uint32_t[]){
500459419607SMax Filippov             EXCCAUSE,
500559419607SMax Filippov             XTENSA_OPTION_EXCEPTION,
500659419607SMax Filippov         },
500721a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
5008168c12b0SMax Filippov     }, {
5009168c12b0SMax Filippov         .name = "wsr.excsave1",
5010168c12b0SMax Filippov         .translate = translate_wsr,
501191dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
501259419607SMax Filippov         .par = (const uint32_t[]){
501359419607SMax Filippov             EXCSAVE1,
501459419607SMax Filippov             XTENSA_OPTION_EXCEPTION,
501559419607SMax Filippov         },
501621a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
5017168c12b0SMax Filippov     }, {
5018168c12b0SMax Filippov         .name = "wsr.excsave2",
5019168c12b0SMax Filippov         .translate = translate_wsr,
502091dc2b2dSMax Filippov         .test_exceptions = test_exceptions_hpi,
502159419607SMax Filippov         .par = (const uint32_t[]){
502259419607SMax Filippov             EXCSAVE1 + 1,
502359419607SMax Filippov             XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
502459419607SMax Filippov         },
502521a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
5026168c12b0SMax Filippov     }, {
5027168c12b0SMax Filippov         .name = "wsr.excsave3",
5028168c12b0SMax Filippov         .translate = translate_wsr,
502991dc2b2dSMax Filippov         .test_exceptions = test_exceptions_hpi,
503059419607SMax Filippov         .par = (const uint32_t[]){
503159419607SMax Filippov             EXCSAVE1 + 2,
503259419607SMax Filippov             XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
503359419607SMax Filippov         },
503421a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
5035168c12b0SMax Filippov     }, {
5036168c12b0SMax Filippov         .name = "wsr.excsave4",
5037168c12b0SMax Filippov         .translate = translate_wsr,
503891dc2b2dSMax Filippov         .test_exceptions = test_exceptions_hpi,
503959419607SMax Filippov         .par = (const uint32_t[]){
504059419607SMax Filippov             EXCSAVE1 + 3,
504159419607SMax Filippov             XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
504259419607SMax Filippov         },
504321a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
5044168c12b0SMax Filippov     }, {
5045168c12b0SMax Filippov         .name = "wsr.excsave5",
5046168c12b0SMax Filippov         .translate = translate_wsr,
504791dc2b2dSMax Filippov         .test_exceptions = test_exceptions_hpi,
504859419607SMax Filippov         .par = (const uint32_t[]){
504959419607SMax Filippov             EXCSAVE1 + 4,
505059419607SMax Filippov             XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
505159419607SMax Filippov         },
505221a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
5053168c12b0SMax Filippov     }, {
5054168c12b0SMax Filippov         .name = "wsr.excsave6",
5055168c12b0SMax Filippov         .translate = translate_wsr,
505691dc2b2dSMax Filippov         .test_exceptions = test_exceptions_hpi,
505759419607SMax Filippov         .par = (const uint32_t[]){
505859419607SMax Filippov             EXCSAVE1 + 5,
505959419607SMax Filippov             XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
506059419607SMax Filippov         },
506121a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
5062168c12b0SMax Filippov     }, {
5063168c12b0SMax Filippov         .name = "wsr.excsave7",
5064168c12b0SMax Filippov         .translate = translate_wsr,
506591dc2b2dSMax Filippov         .test_exceptions = test_exceptions_hpi,
506659419607SMax Filippov         .par = (const uint32_t[]){
506759419607SMax Filippov             EXCSAVE1 + 6,
506859419607SMax Filippov             XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
506959419607SMax Filippov         },
507021a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
5071168c12b0SMax Filippov     }, {
5072168c12b0SMax Filippov         .name = "wsr.excvaddr",
5073168c12b0SMax Filippov         .translate = translate_wsr,
507491dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
507559419607SMax Filippov         .par = (const uint32_t[]){
507659419607SMax Filippov             EXCVADDR,
507759419607SMax Filippov             XTENSA_OPTION_EXCEPTION,
507859419607SMax Filippov         },
507921a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
5080168c12b0SMax Filippov     }, {
5081168c12b0SMax Filippov         .name = "wsr.ibreaka0",
508259419607SMax Filippov         .translate = translate_wsr_ibreaka,
508391dc2b2dSMax Filippov         .test_exceptions = test_exceptions_ibreak,
508459419607SMax Filippov         .par = (const uint32_t[]){
508559419607SMax Filippov             IBREAKA,
508659419607SMax Filippov             XTENSA_OPTION_DEBUG,
508759419607SMax Filippov         },
5088bf525107SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED | XTENSA_OP_EXIT_TB_0,
5089168c12b0SMax Filippov     }, {
5090168c12b0SMax Filippov         .name = "wsr.ibreaka1",
509159419607SMax Filippov         .translate = translate_wsr_ibreaka,
509291dc2b2dSMax Filippov         .test_exceptions = test_exceptions_ibreak,
509359419607SMax Filippov         .par = (const uint32_t[]){
509459419607SMax Filippov             IBREAKA + 1,
509559419607SMax Filippov             XTENSA_OPTION_DEBUG,
509659419607SMax Filippov         },
5097bf525107SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED | XTENSA_OP_EXIT_TB_0,
5098168c12b0SMax Filippov     }, {
5099168c12b0SMax Filippov         .name = "wsr.ibreakenable",
510059419607SMax Filippov         .translate = translate_wsr_ibreakenable,
510191dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
510259419607SMax Filippov         .par = (const uint32_t[]){
510359419607SMax Filippov             IBREAKENABLE,
510459419607SMax Filippov             XTENSA_OPTION_DEBUG,
510559419607SMax Filippov         },
5106bf525107SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED | XTENSA_OP_EXIT_TB_0,
5107168c12b0SMax Filippov     }, {
5108168c12b0SMax Filippov         .name = "wsr.icount",
510959419607SMax Filippov         .translate = translate_wsr_icount,
511091dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
511159419607SMax Filippov         .par = (const uint32_t[]){
511259419607SMax Filippov             ICOUNT,
511359419607SMax Filippov             XTENSA_OPTION_DEBUG,
511459419607SMax Filippov         },
511521a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
5116168c12b0SMax Filippov     }, {
5117168c12b0SMax Filippov         .name = "wsr.icountlevel",
511859419607SMax Filippov         .translate = translate_wsr_mask,
511991dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
512059419607SMax Filippov         .par = (const uint32_t[]){
512159419607SMax Filippov             ICOUNTLEVEL,
512259419607SMax Filippov             XTENSA_OPTION_DEBUG,
512359419607SMax Filippov             0xf,
512459419607SMax Filippov         },
5125226444a8SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED | XTENSA_OP_EXIT_TB_M1,
5126168c12b0SMax Filippov     }, {
5127168c12b0SMax Filippov         .name = "wsr.intclear",
512859419607SMax Filippov         .translate = translate_wsr_intclear,
512991dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
513059419607SMax Filippov         .par = (const uint32_t[]){
513159419607SMax Filippov             INTCLEAR,
513259419607SMax Filippov             XTENSA_OPTION_INTERRUPT,
513359419607SMax Filippov         },
5134d74624e5SMax Filippov         .op_flags =
5135d74624e5SMax Filippov             XTENSA_OP_PRIVILEGED |
5136d74624e5SMax Filippov             XTENSA_OP_EXIT_TB_0 |
5137d74624e5SMax Filippov             XTENSA_OP_CHECK_INTERRUPTS,
5138168c12b0SMax Filippov     }, {
5139168c12b0SMax Filippov         .name = "wsr.intenable",
5140168c12b0SMax Filippov         .translate = translate_wsr,
514191dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
514259419607SMax Filippov         .par = (const uint32_t[]){
514359419607SMax Filippov             INTENABLE,
514459419607SMax Filippov             XTENSA_OPTION_INTERRUPT,
514559419607SMax Filippov         },
5146d74624e5SMax Filippov         .op_flags =
5147d74624e5SMax Filippov             XTENSA_OP_PRIVILEGED |
5148d74624e5SMax Filippov             XTENSA_OP_EXIT_TB_0 |
5149d74624e5SMax Filippov             XTENSA_OP_CHECK_INTERRUPTS,
5150168c12b0SMax Filippov     }, {
5151168c12b0SMax Filippov         .name = "wsr.interrupt",
5152168c12b0SMax Filippov         .translate = translate_wsr,
515391dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
515459419607SMax Filippov         .par = (const uint32_t[]){
515559419607SMax Filippov             INTSET,
515659419607SMax Filippov             XTENSA_OPTION_INTERRUPT,
515759419607SMax Filippov         },
5158d74624e5SMax Filippov         .op_flags =
5159d74624e5SMax Filippov             XTENSA_OP_PRIVILEGED |
5160d74624e5SMax Filippov             XTENSA_OP_EXIT_TB_0 |
5161d74624e5SMax Filippov             XTENSA_OP_CHECK_INTERRUPTS,
5162168c12b0SMax Filippov     }, {
5163168c12b0SMax Filippov         .name = "wsr.intset",
516459419607SMax Filippov         .translate = translate_wsr_intset,
516591dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
516659419607SMax Filippov         .par = (const uint32_t[]){
516759419607SMax Filippov             INTSET,
516859419607SMax Filippov             XTENSA_OPTION_INTERRUPT,
516959419607SMax Filippov         },
5170d74624e5SMax Filippov         .op_flags =
5171d74624e5SMax Filippov             XTENSA_OP_PRIVILEGED |
5172d74624e5SMax Filippov             XTENSA_OP_EXIT_TB_0 |
5173d74624e5SMax Filippov             XTENSA_OP_CHECK_INTERRUPTS,
5174168c12b0SMax Filippov     }, {
5175168c12b0SMax Filippov         .name = "wsr.itlbcfg",
517659419607SMax Filippov         .translate = translate_wsr_mask,
517791dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
517859419607SMax Filippov         .par = (const uint32_t[]){
517959419607SMax Filippov             ITLBCFG,
518059419607SMax Filippov             XTENSA_OPTION_MMU,
518159419607SMax Filippov             0x01130000,
518259419607SMax Filippov         },
518321a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
5184168c12b0SMax Filippov     }, {
5185168c12b0SMax Filippov         .name = "wsr.lbeg",
5186168c12b0SMax Filippov         .translate = translate_wsr,
518791dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
518859419607SMax Filippov         .par = (const uint32_t[]){
518959419607SMax Filippov             LBEG,
519059419607SMax Filippov             XTENSA_OPTION_LOOP,
519159419607SMax Filippov         },
51925d630cefSMax Filippov         .op_flags = XTENSA_OP_EXIT_TB_M1,
5193168c12b0SMax Filippov     }, {
5194168c12b0SMax Filippov         .name = "wsr.lcount",
5195168c12b0SMax Filippov         .translate = translate_wsr,
519691dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
519759419607SMax Filippov         .par = (const uint32_t[]){
519859419607SMax Filippov             LCOUNT,
519959419607SMax Filippov             XTENSA_OPTION_LOOP,
520059419607SMax Filippov         },
5201168c12b0SMax Filippov     }, {
5202168c12b0SMax Filippov         .name = "wsr.lend",
5203168c12b0SMax Filippov         .translate = translate_wsr,
520491dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
520559419607SMax Filippov         .par = (const uint32_t[]){
520659419607SMax Filippov             LEND,
520759419607SMax Filippov             XTENSA_OPTION_LOOP,
520859419607SMax Filippov         },
52095d630cefSMax Filippov         .op_flags = XTENSA_OP_EXIT_TB_M1,
5210168c12b0SMax Filippov     }, {
5211168c12b0SMax Filippov         .name = "wsr.litbase",
521259419607SMax Filippov         .translate = translate_wsr_mask,
521391dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
521459419607SMax Filippov         .par = (const uint32_t[]){
521559419607SMax Filippov             LITBASE,
521659419607SMax Filippov             XTENSA_OPTION_EXTENDED_L32R,
521759419607SMax Filippov             0xfffff001,
521859419607SMax Filippov         },
5219226444a8SMax Filippov         .op_flags = XTENSA_OP_EXIT_TB_M1,
5220168c12b0SMax Filippov     }, {
5221168c12b0SMax Filippov         .name = "wsr.m0",
5222168c12b0SMax Filippov         .translate = translate_wsr,
522391dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
522459419607SMax Filippov         .par = (const uint32_t[]){
522559419607SMax Filippov             MR,
522659419607SMax Filippov             XTENSA_OPTION_MAC16,
522759419607SMax Filippov         },
5228168c12b0SMax Filippov     }, {
5229168c12b0SMax Filippov         .name = "wsr.m1",
5230168c12b0SMax Filippov         .translate = translate_wsr,
523191dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
523259419607SMax Filippov         .par = (const uint32_t[]){
523359419607SMax Filippov             MR + 1,
523459419607SMax Filippov             XTENSA_OPTION_MAC16,
523559419607SMax Filippov         },
5236168c12b0SMax Filippov     }, {
5237168c12b0SMax Filippov         .name = "wsr.m2",
5238168c12b0SMax Filippov         .translate = translate_wsr,
523991dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
524059419607SMax Filippov         .par = (const uint32_t[]){
524159419607SMax Filippov             MR + 2,
524259419607SMax Filippov             XTENSA_OPTION_MAC16,
524359419607SMax Filippov         },
5244168c12b0SMax Filippov     }, {
5245168c12b0SMax Filippov         .name = "wsr.m3",
5246168c12b0SMax Filippov         .translate = translate_wsr,
524791dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
524859419607SMax Filippov         .par = (const uint32_t[]){
524959419607SMax Filippov             MR + 3,
525059419607SMax Filippov             XTENSA_OPTION_MAC16,
525159419607SMax Filippov         },
5252168c12b0SMax Filippov     }, {
5253168c12b0SMax Filippov         .name = "wsr.memctl",
525459419607SMax Filippov         .translate = translate_wsr_memctl,
5255168c12b0SMax Filippov         .par = (const uint32_t[]){MEMCTL},
525621a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
5257168c12b0SMax Filippov     }, {
5258631a77a0SMax Filippov         .name = "wsr.mecr",
5259631a77a0SMax Filippov         .translate = translate_wsr,
526091dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
5261631a77a0SMax Filippov         .par = (const uint32_t[]){
5262631a77a0SMax Filippov             MECR,
5263631a77a0SMax Filippov             XTENSA_OPTION_MEMORY_ECC_PARITY,
5264631a77a0SMax Filippov         },
5265631a77a0SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
5266631a77a0SMax Filippov     }, {
5267631a77a0SMax Filippov         .name = "wsr.mepc",
5268631a77a0SMax Filippov         .translate = translate_wsr,
526991dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
5270631a77a0SMax Filippov         .par = (const uint32_t[]){
5271631a77a0SMax Filippov             MEPC,
5272631a77a0SMax Filippov             XTENSA_OPTION_MEMORY_ECC_PARITY,
5273631a77a0SMax Filippov         },
5274631a77a0SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
5275631a77a0SMax Filippov     }, {
5276631a77a0SMax Filippov         .name = "wsr.meps",
5277631a77a0SMax Filippov         .translate = translate_wsr,
527891dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
5279631a77a0SMax Filippov         .par = (const uint32_t[]){
5280631a77a0SMax Filippov             MEPS,
5281631a77a0SMax Filippov             XTENSA_OPTION_MEMORY_ECC_PARITY,
5282631a77a0SMax Filippov         },
5283631a77a0SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
5284631a77a0SMax Filippov     }, {
5285631a77a0SMax Filippov         .name = "wsr.mesave",
5286631a77a0SMax Filippov         .translate = translate_wsr,
528791dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
5288631a77a0SMax Filippov         .par = (const uint32_t[]){
5289631a77a0SMax Filippov             MESAVE,
5290631a77a0SMax Filippov             XTENSA_OPTION_MEMORY_ECC_PARITY,
5291631a77a0SMax Filippov         },
5292631a77a0SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
5293631a77a0SMax Filippov     }, {
5294631a77a0SMax Filippov         .name = "wsr.mesr",
5295631a77a0SMax Filippov         .translate = translate_wsr,
529691dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
5297631a77a0SMax Filippov         .par = (const uint32_t[]){
5298631a77a0SMax Filippov             MESR,
5299631a77a0SMax Filippov             XTENSA_OPTION_MEMORY_ECC_PARITY,
5300631a77a0SMax Filippov         },
5301631a77a0SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
5302631a77a0SMax Filippov     }, {
5303631a77a0SMax Filippov         .name = "wsr.mevaddr",
5304631a77a0SMax Filippov         .translate = translate_wsr,
530591dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
5306631a77a0SMax Filippov         .par = (const uint32_t[]){
5307631a77a0SMax Filippov             MESR,
5308631a77a0SMax Filippov             XTENSA_OPTION_MEMORY_ECC_PARITY,
5309631a77a0SMax Filippov         },
5310631a77a0SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
5311631a77a0SMax Filippov     }, {
5312168c12b0SMax Filippov         .name = "wsr.misc0",
5313168c12b0SMax Filippov         .translate = translate_wsr,
531491dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
531559419607SMax Filippov         .par = (const uint32_t[]){
531659419607SMax Filippov             MISC,
531759419607SMax Filippov             XTENSA_OPTION_MISC_SR,
531859419607SMax Filippov         },
531921a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
5320168c12b0SMax Filippov     }, {
5321168c12b0SMax Filippov         .name = "wsr.misc1",
5322168c12b0SMax Filippov         .translate = translate_wsr,
532391dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
532459419607SMax Filippov         .par = (const uint32_t[]){
532559419607SMax Filippov             MISC + 1,
532659419607SMax Filippov             XTENSA_OPTION_MISC_SR,
532759419607SMax Filippov         },
532821a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
5329168c12b0SMax Filippov     }, {
5330168c12b0SMax Filippov         .name = "wsr.misc2",
5331168c12b0SMax Filippov         .translate = translate_wsr,
533291dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
533359419607SMax Filippov         .par = (const uint32_t[]){
533459419607SMax Filippov             MISC + 2,
533559419607SMax Filippov             XTENSA_OPTION_MISC_SR,
533659419607SMax Filippov         },
533721a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
5338168c12b0SMax Filippov     }, {
5339168c12b0SMax Filippov         .name = "wsr.misc3",
5340168c12b0SMax Filippov         .translate = translate_wsr,
534191dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
534259419607SMax Filippov         .par = (const uint32_t[]){
534359419607SMax Filippov             MISC + 3,
534459419607SMax Filippov             XTENSA_OPTION_MISC_SR,
534559419607SMax Filippov         },
534621a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
5347168c12b0SMax Filippov     }, {
534813f6a7cdSMax Filippov         .name = "wsr.mmid",
534913f6a7cdSMax Filippov         .translate = translate_wsr,
535091dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
535159419607SMax Filippov         .par = (const uint32_t[]){
535259419607SMax Filippov             MMID,
535359419607SMax Filippov             XTENSA_OPTION_TRACE_PORT,
535459419607SMax Filippov         },
535521a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
535613f6a7cdSMax Filippov     }, {
53574d04ea35SMax Filippov         .name = "wsr.mpuenb",
53584d04ea35SMax Filippov         .translate = translate_wsr_mpuenb,
535991dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
53604d04ea35SMax Filippov         .par = (const uint32_t[]){
53614d04ea35SMax Filippov             MPUENB,
53624d04ea35SMax Filippov             XTENSA_OPTION_MPU,
53634d04ea35SMax Filippov         },
53644d04ea35SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED | XTENSA_OP_EXIT_TB_M1,
53654d04ea35SMax Filippov     }, {
5366eb3f4298SMax Filippov         .name = "wsr.prefctl",
5367eb3f4298SMax Filippov         .translate = translate_wsr,
5368eb3f4298SMax Filippov         .par = (const uint32_t[]){PREFCTL},
5369eb3f4298SMax Filippov     }, {
5370168c12b0SMax Filippov         .name = "wsr.prid",
537159419607SMax Filippov         .op_flags = XTENSA_OP_ILL,
5372168c12b0SMax Filippov     }, {
5373168c12b0SMax Filippov         .name = "wsr.ps",
537459419607SMax Filippov         .translate = translate_wsr_ps,
537591dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
537659419607SMax Filippov         .par = (const uint32_t[]){
537759419607SMax Filippov             PS,
537859419607SMax Filippov             XTENSA_OPTION_EXCEPTION,
537959419607SMax Filippov         },
5380d74624e5SMax Filippov         .op_flags =
5381d74624e5SMax Filippov             XTENSA_OP_PRIVILEGED |
5382d74624e5SMax Filippov             XTENSA_OP_EXIT_TB_M1 |
5383d74624e5SMax Filippov             XTENSA_OP_CHECK_INTERRUPTS,
5384168c12b0SMax Filippov     }, {
5385168c12b0SMax Filippov         .name = "wsr.ptevaddr",
538659419607SMax Filippov         .translate = translate_wsr_mask,
538791dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
538859419607SMax Filippov         .par = (const uint32_t[]){
538959419607SMax Filippov             PTEVADDR,
539059419607SMax Filippov             XTENSA_OPTION_MMU,
539159419607SMax Filippov             0xffc00000,
539259419607SMax Filippov         },
539321a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
5394168c12b0SMax Filippov     }, {
5395168c12b0SMax Filippov         .name = "wsr.rasid",
539659419607SMax Filippov         .translate = translate_wsr_rasid,
539791dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
539859419607SMax Filippov         .par = (const uint32_t[]){
539959419607SMax Filippov             RASID,
540059419607SMax Filippov             XTENSA_OPTION_MMU,
540159419607SMax Filippov         },
5402226444a8SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED | XTENSA_OP_EXIT_TB_M1,
5403168c12b0SMax Filippov     }, {
5404168c12b0SMax Filippov         .name = "wsr.sar",
540559419607SMax Filippov         .translate = translate_wsr_sar,
5406168c12b0SMax Filippov         .par = (const uint32_t[]){SAR},
5407168c12b0SMax Filippov     }, {
5408168c12b0SMax Filippov         .name = "wsr.scompare1",
5409168c12b0SMax Filippov         .translate = translate_wsr,
541091dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
541159419607SMax Filippov         .par = (const uint32_t[]){
541259419607SMax Filippov             SCOMPARE1,
541359419607SMax Filippov             XTENSA_OPTION_CONDITIONAL_STORE,
541459419607SMax Filippov         },
5415168c12b0SMax Filippov     }, {
5416168c12b0SMax Filippov         .name = "wsr.vecbase",
5417168c12b0SMax Filippov         .translate = translate_wsr,
541891dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
541959419607SMax Filippov         .par = (const uint32_t[]){
542059419607SMax Filippov             VECBASE,
542159419607SMax Filippov             XTENSA_OPTION_RELOCATABLE_VECTOR,
542259419607SMax Filippov         },
542321a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
5424168c12b0SMax Filippov     }, {
5425168c12b0SMax Filippov         .name = "wsr.windowbase",
542659419607SMax Filippov         .translate = translate_wsr_windowbase,
542791dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
542859419607SMax Filippov         .par = (const uint32_t[]){
542959419607SMax Filippov             WINDOW_BASE,
543059419607SMax Filippov             XTENSA_OPTION_WINDOWED_REGISTER,
543159419607SMax Filippov         },
54328df3fd35SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED |
54338df3fd35SMax Filippov             XTENSA_OP_EXIT_TB_M1 |
54348df3fd35SMax Filippov             XTENSA_OP_SYNC_REGISTER_WINDOW,
5435168c12b0SMax Filippov     }, {
5436168c12b0SMax Filippov         .name = "wsr.windowstart",
543759419607SMax Filippov         .translate = translate_wsr_windowstart,
543891dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
543959419607SMax Filippov         .par = (const uint32_t[]){
544059419607SMax Filippov             WINDOW_START,
544159419607SMax Filippov             XTENSA_OPTION_WINDOWED_REGISTER,
544259419607SMax Filippov         },
5443226444a8SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED | XTENSA_OP_EXIT_TB_M1,
5444168c12b0SMax Filippov     }, {
5445e9872741SMax Filippov         .name = "wur.expstate",
5446e9872741SMax Filippov         .translate = translate_wur,
5447e9872741SMax Filippov         .par = (const uint32_t[]){EXPSTATE},
5448e9872741SMax Filippov     }, {
5449168c12b0SMax Filippov         .name = "wur.threadptr",
5450168c12b0SMax Filippov         .translate = translate_wur,
5451168c12b0SMax Filippov         .par = (const uint32_t[]){THREADPTR},
5452168c12b0SMax Filippov     }, {
5453168c12b0SMax Filippov         .name = "xor",
5454168c12b0SMax Filippov         .translate = translate_xor,
5455168c12b0SMax Filippov     }, {
5456168c12b0SMax Filippov         .name = "xorb",
5457168c12b0SMax Filippov         .translate = translate_boolean,
5458168c12b0SMax Filippov         .par = (const uint32_t[]){BOOLEAN_XOR},
5459168c12b0SMax Filippov     }, {
5460168c12b0SMax Filippov         .name = "xsr.176",
546159419607SMax Filippov         .op_flags = XTENSA_OP_ILL,
5462168c12b0SMax Filippov     }, {
5463168c12b0SMax Filippov         .name = "xsr.208",
546459419607SMax Filippov         .op_flags = XTENSA_OP_ILL,
5465168c12b0SMax Filippov     }, {
5466168c12b0SMax Filippov         .name = "xsr.acchi",
546759419607SMax Filippov         .translate = translate_xsr_acchi,
546891dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
546959419607SMax Filippov         .par = (const uint32_t[]){
547059419607SMax Filippov             ACCHI,
547159419607SMax Filippov             XTENSA_OPTION_MAC16,
547259419607SMax Filippov         },
5473168c12b0SMax Filippov     }, {
5474168c12b0SMax Filippov         .name = "xsr.acclo",
5475168c12b0SMax Filippov         .translate = translate_xsr,
547691dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
547759419607SMax Filippov         .par = (const uint32_t[]){
547859419607SMax Filippov             ACCLO,
547959419607SMax Filippov             XTENSA_OPTION_MAC16,
548059419607SMax Filippov         },
5481168c12b0SMax Filippov     }, {
5482168c12b0SMax Filippov         .name = "xsr.atomctl",
548359419607SMax Filippov         .translate = translate_xsr_mask,
548491dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
548559419607SMax Filippov         .par = (const uint32_t[]){
548659419607SMax Filippov             ATOMCTL,
548759419607SMax Filippov             XTENSA_OPTION_ATOMCTL,
548859419607SMax Filippov             0x3f,
548959419607SMax Filippov         },
549021a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
5491168c12b0SMax Filippov     }, {
5492168c12b0SMax Filippov         .name = "xsr.br",
549359419607SMax Filippov         .translate = translate_xsr_mask,
549491dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
549559419607SMax Filippov         .par = (const uint32_t[]){
549659419607SMax Filippov             BR,
549759419607SMax Filippov             XTENSA_OPTION_BOOLEAN,
549859419607SMax Filippov             0xffff,
549959419607SMax Filippov         },
5500168c12b0SMax Filippov     }, {
55014d04ea35SMax Filippov         .name = "xsr.cacheadrdis",
55024d04ea35SMax Filippov         .translate = translate_xsr_mask,
550391dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
55044d04ea35SMax Filippov         .par = (const uint32_t[]){
55054d04ea35SMax Filippov             CACHEADRDIS,
55064d04ea35SMax Filippov             XTENSA_OPTION_MPU,
55074d04ea35SMax Filippov             0xff,
55084d04ea35SMax Filippov         },
55094d04ea35SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
5510168c12b0SMax Filippov     }, {
5511168c12b0SMax Filippov         .name = "xsr.cacheattr",
5512168c12b0SMax Filippov         .translate = translate_xsr,
551391dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
551459419607SMax Filippov         .par = (const uint32_t[]){
551559419607SMax Filippov             CACHEATTR,
551659419607SMax Filippov             XTENSA_OPTION_CACHEATTR,
551759419607SMax Filippov         },
551821a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
5519168c12b0SMax Filippov     }, {
5520168c12b0SMax Filippov         .name = "xsr.ccompare0",
552159419607SMax Filippov         .translate = translate_xsr_ccompare,
552291dc2b2dSMax Filippov         .test_exceptions = test_exceptions_ccompare,
552359419607SMax Filippov         .par = (const uint32_t[]){
552459419607SMax Filippov             CCOMPARE,
552559419607SMax Filippov             XTENSA_OPTION_TIMER_INTERRUPT,
552659419607SMax Filippov         },
5527bf525107SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED | XTENSA_OP_EXIT_TB_0,
5528168c12b0SMax Filippov     }, {
5529168c12b0SMax Filippov         .name = "xsr.ccompare1",
553059419607SMax Filippov         .translate = translate_xsr_ccompare,
553191dc2b2dSMax Filippov         .test_exceptions = test_exceptions_ccompare,
553259419607SMax Filippov         .par = (const uint32_t[]){
553359419607SMax Filippov             CCOMPARE + 1,
553459419607SMax Filippov             XTENSA_OPTION_TIMER_INTERRUPT,
553559419607SMax Filippov         },
5536bf525107SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED | XTENSA_OP_EXIT_TB_0,
5537168c12b0SMax Filippov     }, {
5538168c12b0SMax Filippov         .name = "xsr.ccompare2",
553959419607SMax Filippov         .translate = translate_xsr_ccompare,
554091dc2b2dSMax Filippov         .test_exceptions = test_exceptions_ccompare,
554159419607SMax Filippov         .par = (const uint32_t[]){
554259419607SMax Filippov             CCOMPARE + 2,
554359419607SMax Filippov             XTENSA_OPTION_TIMER_INTERRUPT,
554459419607SMax Filippov         },
5545bf525107SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED | XTENSA_OP_EXIT_TB_0,
5546168c12b0SMax Filippov     }, {
5547168c12b0SMax Filippov         .name = "xsr.ccount",
554859419607SMax Filippov         .translate = translate_xsr_ccount,
554991dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
555059419607SMax Filippov         .par = (const uint32_t[]){
555159419607SMax Filippov             CCOUNT,
555259419607SMax Filippov             XTENSA_OPTION_TIMER_INTERRUPT,
555359419607SMax Filippov         },
5554bf525107SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED | XTENSA_OP_EXIT_TB_0,
5555168c12b0SMax Filippov     }, {
5556168c12b0SMax Filippov         .name = "xsr.configid0",
555759419607SMax Filippov         .op_flags = XTENSA_OP_ILL,
5558168c12b0SMax Filippov     }, {
5559168c12b0SMax Filippov         .name = "xsr.configid1",
556059419607SMax Filippov         .op_flags = XTENSA_OP_ILL,
5561168c12b0SMax Filippov     }, {
5562168c12b0SMax Filippov         .name = "xsr.cpenable",
556359419607SMax Filippov         .translate = translate_xsr_mask,
556491dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
556559419607SMax Filippov         .par = (const uint32_t[]){
556659419607SMax Filippov             CPENABLE,
556759419607SMax Filippov             XTENSA_OPTION_COPROCESSOR,
556859419607SMax Filippov             0xff,
556959419607SMax Filippov         },
5570226444a8SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED | XTENSA_OP_EXIT_TB_M1,
5571168c12b0SMax Filippov     }, {
5572168c12b0SMax Filippov         .name = "xsr.dbreaka0",
557359419607SMax Filippov         .translate = translate_xsr_dbreaka,
557491dc2b2dSMax Filippov         .test_exceptions = test_exceptions_dbreak,
557559419607SMax Filippov         .par = (const uint32_t[]){
557659419607SMax Filippov             DBREAKA,
557759419607SMax Filippov             XTENSA_OPTION_DEBUG,
557859419607SMax Filippov         },
557921a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
5580168c12b0SMax Filippov     }, {
5581168c12b0SMax Filippov         .name = "xsr.dbreaka1",
558259419607SMax Filippov         .translate = translate_xsr_dbreaka,
558391dc2b2dSMax Filippov         .test_exceptions = test_exceptions_dbreak,
558459419607SMax Filippov         .par = (const uint32_t[]){
558559419607SMax Filippov             DBREAKA + 1,
558659419607SMax Filippov             XTENSA_OPTION_DEBUG,
558759419607SMax Filippov         },
558821a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
5589168c12b0SMax Filippov     }, {
5590168c12b0SMax Filippov         .name = "xsr.dbreakc0",
559159419607SMax Filippov         .translate = translate_xsr_dbreakc,
559291dc2b2dSMax Filippov         .test_exceptions = test_exceptions_dbreak,
559359419607SMax Filippov         .par = (const uint32_t[]){
559459419607SMax Filippov             DBREAKC,
559559419607SMax Filippov             XTENSA_OPTION_DEBUG,
559659419607SMax Filippov         },
559721a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
5598168c12b0SMax Filippov     }, {
5599168c12b0SMax Filippov         .name = "xsr.dbreakc1",
560059419607SMax Filippov         .translate = translate_xsr_dbreakc,
560191dc2b2dSMax Filippov         .test_exceptions = test_exceptions_dbreak,
560259419607SMax Filippov         .par = (const uint32_t[]){
560359419607SMax Filippov             DBREAKC + 1,
560459419607SMax Filippov             XTENSA_OPTION_DEBUG,
560559419607SMax Filippov         },
560621a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
5607168c12b0SMax Filippov     }, {
560813f6a7cdSMax Filippov         .name = "xsr.ddr",
560913f6a7cdSMax Filippov         .translate = translate_xsr,
561091dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
561159419607SMax Filippov         .par = (const uint32_t[]){
561259419607SMax Filippov             DDR,
561359419607SMax Filippov             XTENSA_OPTION_DEBUG,
561459419607SMax Filippov         },
561521a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
561613f6a7cdSMax Filippov     }, {
5617168c12b0SMax Filippov         .name = "xsr.debugcause",
561859419607SMax Filippov         .op_flags = XTENSA_OP_ILL,
5619168c12b0SMax Filippov     }, {
5620168c12b0SMax Filippov         .name = "xsr.depc",
5621168c12b0SMax Filippov         .translate = translate_xsr,
562291dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
562359419607SMax Filippov         .par = (const uint32_t[]){
562459419607SMax Filippov             DEPC,
562559419607SMax Filippov             XTENSA_OPTION_EXCEPTION,
562659419607SMax Filippov         },
562721a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
5628168c12b0SMax Filippov     }, {
5629168c12b0SMax Filippov         .name = "xsr.dtlbcfg",
563059419607SMax Filippov         .translate = translate_xsr_mask,
563191dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
563259419607SMax Filippov         .par = (const uint32_t[]){
563359419607SMax Filippov             DTLBCFG,
563459419607SMax Filippov             XTENSA_OPTION_MMU,
563559419607SMax Filippov             0x01130000,
563659419607SMax Filippov         },
563721a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
5638168c12b0SMax Filippov     }, {
5639168c12b0SMax Filippov         .name = "xsr.epc1",
5640168c12b0SMax Filippov         .translate = translate_xsr,
564191dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
564259419607SMax Filippov         .par = (const uint32_t[]){
564359419607SMax Filippov             EPC1,
564459419607SMax Filippov             XTENSA_OPTION_EXCEPTION,
564559419607SMax Filippov         },
564621a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
5647168c12b0SMax Filippov     }, {
5648168c12b0SMax Filippov         .name = "xsr.epc2",
5649168c12b0SMax Filippov         .translate = translate_xsr,
565091dc2b2dSMax Filippov         .test_exceptions = test_exceptions_hpi,
565159419607SMax Filippov         .par = (const uint32_t[]){
565259419607SMax Filippov             EPC1 + 1,
565359419607SMax Filippov             XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
565459419607SMax Filippov         },
565521a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
5656168c12b0SMax Filippov     }, {
5657168c12b0SMax Filippov         .name = "xsr.epc3",
5658168c12b0SMax Filippov         .translate = translate_xsr,
565991dc2b2dSMax Filippov         .test_exceptions = test_exceptions_hpi,
566059419607SMax Filippov         .par = (const uint32_t[]){
566159419607SMax Filippov             EPC1 + 2,
566259419607SMax Filippov             XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
566359419607SMax Filippov         },
566421a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
5665168c12b0SMax Filippov     }, {
5666168c12b0SMax Filippov         .name = "xsr.epc4",
5667168c12b0SMax Filippov         .translate = translate_xsr,
566891dc2b2dSMax Filippov         .test_exceptions = test_exceptions_hpi,
566959419607SMax Filippov         .par = (const uint32_t[]){
567059419607SMax Filippov             EPC1 + 3,
567159419607SMax Filippov             XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
567259419607SMax Filippov         },
567321a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
5674168c12b0SMax Filippov     }, {
5675168c12b0SMax Filippov         .name = "xsr.epc5",
5676168c12b0SMax Filippov         .translate = translate_xsr,
567791dc2b2dSMax Filippov         .test_exceptions = test_exceptions_hpi,
567859419607SMax Filippov         .par = (const uint32_t[]){
567959419607SMax Filippov             EPC1 + 4,
568059419607SMax Filippov             XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
568159419607SMax Filippov         },
568221a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
5683168c12b0SMax Filippov     }, {
5684168c12b0SMax Filippov         .name = "xsr.epc6",
5685168c12b0SMax Filippov         .translate = translate_xsr,
568691dc2b2dSMax Filippov         .test_exceptions = test_exceptions_hpi,
568759419607SMax Filippov         .par = (const uint32_t[]){
568859419607SMax Filippov             EPC1 + 5,
568959419607SMax Filippov             XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
569059419607SMax Filippov         },
569121a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
5692168c12b0SMax Filippov     }, {
5693168c12b0SMax Filippov         .name = "xsr.epc7",
5694168c12b0SMax Filippov         .translate = translate_xsr,
569591dc2b2dSMax Filippov         .test_exceptions = test_exceptions_hpi,
569659419607SMax Filippov         .par = (const uint32_t[]){
569759419607SMax Filippov             EPC1 + 6,
569859419607SMax Filippov             XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
569959419607SMax Filippov         },
570021a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
5701168c12b0SMax Filippov     }, {
5702168c12b0SMax Filippov         .name = "xsr.eps2",
5703168c12b0SMax Filippov         .translate = translate_xsr,
570491dc2b2dSMax Filippov         .test_exceptions = test_exceptions_hpi,
570559419607SMax Filippov         .par = (const uint32_t[]){
570659419607SMax Filippov             EPS2,
570759419607SMax Filippov             XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
570859419607SMax Filippov         },
570921a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
5710168c12b0SMax Filippov     }, {
5711168c12b0SMax Filippov         .name = "xsr.eps3",
5712168c12b0SMax Filippov         .translate = translate_xsr,
571391dc2b2dSMax Filippov         .test_exceptions = test_exceptions_hpi,
571459419607SMax Filippov         .par = (const uint32_t[]){
571559419607SMax Filippov             EPS2 + 1,
571659419607SMax Filippov             XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
571759419607SMax Filippov         },
571821a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
5719168c12b0SMax Filippov     }, {
5720168c12b0SMax Filippov         .name = "xsr.eps4",
5721168c12b0SMax Filippov         .translate = translate_xsr,
572291dc2b2dSMax Filippov         .test_exceptions = test_exceptions_hpi,
572359419607SMax Filippov         .par = (const uint32_t[]){
572459419607SMax Filippov             EPS2 + 2,
572559419607SMax Filippov             XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
572659419607SMax Filippov         },
572721a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
5728168c12b0SMax Filippov     }, {
5729168c12b0SMax Filippov         .name = "xsr.eps5",
5730168c12b0SMax Filippov         .translate = translate_xsr,
573191dc2b2dSMax Filippov         .test_exceptions = test_exceptions_hpi,
573259419607SMax Filippov         .par = (const uint32_t[]){
573359419607SMax Filippov             EPS2 + 3,
573459419607SMax Filippov             XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
573559419607SMax Filippov         },
573621a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
5737168c12b0SMax Filippov     }, {
5738168c12b0SMax Filippov         .name = "xsr.eps6",
5739168c12b0SMax Filippov         .translate = translate_xsr,
574091dc2b2dSMax Filippov         .test_exceptions = test_exceptions_hpi,
574159419607SMax Filippov         .par = (const uint32_t[]){
574259419607SMax Filippov             EPS2 + 4,
574359419607SMax Filippov             XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
574459419607SMax Filippov         },
574521a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
5746168c12b0SMax Filippov     }, {
5747168c12b0SMax Filippov         .name = "xsr.eps7",
5748168c12b0SMax Filippov         .translate = translate_xsr,
574991dc2b2dSMax Filippov         .test_exceptions = test_exceptions_hpi,
575059419607SMax Filippov         .par = (const uint32_t[]){
575159419607SMax Filippov             EPS2 + 5,
575259419607SMax Filippov             XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
575359419607SMax Filippov         },
575421a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
5755168c12b0SMax Filippov     }, {
57564d04ea35SMax Filippov         .name = "xsr.eraccess",
57574d04ea35SMax Filippov         .translate = translate_xsr_mask,
57584d04ea35SMax Filippov         .par = (const uint32_t[]){
57594d04ea35SMax Filippov             ERACCESS,
57604d04ea35SMax Filippov             0,
57614d04ea35SMax Filippov             0xffff,
57624d04ea35SMax Filippov         },
5763168c12b0SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
5764168c12b0SMax Filippov     }, {
5765168c12b0SMax Filippov         .name = "xsr.exccause",
5766168c12b0SMax Filippov         .translate = translate_xsr,
576791dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
576859419607SMax Filippov         .par = (const uint32_t[]){
576959419607SMax Filippov             EXCCAUSE,
577059419607SMax Filippov             XTENSA_OPTION_EXCEPTION,
577159419607SMax Filippov         },
577221a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
5773168c12b0SMax Filippov     }, {
5774168c12b0SMax Filippov         .name = "xsr.excsave1",
5775168c12b0SMax Filippov         .translate = translate_xsr,
577691dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
577759419607SMax Filippov         .par = (const uint32_t[]){
577859419607SMax Filippov             EXCSAVE1,
577959419607SMax Filippov             XTENSA_OPTION_EXCEPTION,
578059419607SMax Filippov         },
578121a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
5782168c12b0SMax Filippov     }, {
5783168c12b0SMax Filippov         .name = "xsr.excsave2",
5784168c12b0SMax Filippov         .translate = translate_xsr,
578591dc2b2dSMax Filippov         .test_exceptions = test_exceptions_hpi,
578659419607SMax Filippov         .par = (const uint32_t[]){
578759419607SMax Filippov             EXCSAVE1 + 1,
578859419607SMax Filippov             XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
578959419607SMax Filippov         },
579021a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
5791168c12b0SMax Filippov     }, {
5792168c12b0SMax Filippov         .name = "xsr.excsave3",
5793168c12b0SMax Filippov         .translate = translate_xsr,
579491dc2b2dSMax Filippov         .test_exceptions = test_exceptions_hpi,
579559419607SMax Filippov         .par = (const uint32_t[]){
579659419607SMax Filippov             EXCSAVE1 + 2,
579759419607SMax Filippov             XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
579859419607SMax Filippov         },
579921a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
5800168c12b0SMax Filippov     }, {
5801168c12b0SMax Filippov         .name = "xsr.excsave4",
5802168c12b0SMax Filippov         .translate = translate_xsr,
580391dc2b2dSMax Filippov         .test_exceptions = test_exceptions_hpi,
580459419607SMax Filippov         .par = (const uint32_t[]){
580559419607SMax Filippov             EXCSAVE1 + 3,
580659419607SMax Filippov             XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
580759419607SMax Filippov         },
580821a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
5809168c12b0SMax Filippov     }, {
5810168c12b0SMax Filippov         .name = "xsr.excsave5",
5811168c12b0SMax Filippov         .translate = translate_xsr,
581291dc2b2dSMax Filippov         .test_exceptions = test_exceptions_hpi,
581359419607SMax Filippov         .par = (const uint32_t[]){
581459419607SMax Filippov             EXCSAVE1 + 4,
581559419607SMax Filippov             XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
581659419607SMax Filippov         },
581721a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
5818168c12b0SMax Filippov     }, {
5819168c12b0SMax Filippov         .name = "xsr.excsave6",
5820168c12b0SMax Filippov         .translate = translate_xsr,
582191dc2b2dSMax Filippov         .test_exceptions = test_exceptions_hpi,
582259419607SMax Filippov         .par = (const uint32_t[]){
582359419607SMax Filippov             EXCSAVE1 + 5,
582459419607SMax Filippov             XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
582559419607SMax Filippov         },
582621a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
5827168c12b0SMax Filippov     }, {
5828168c12b0SMax Filippov         .name = "xsr.excsave7",
5829168c12b0SMax Filippov         .translate = translate_xsr,
583091dc2b2dSMax Filippov         .test_exceptions = test_exceptions_hpi,
583159419607SMax Filippov         .par = (const uint32_t[]){
583259419607SMax Filippov             EXCSAVE1 + 6,
583359419607SMax Filippov             XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
583459419607SMax Filippov         },
583521a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
5836168c12b0SMax Filippov     }, {
5837168c12b0SMax Filippov         .name = "xsr.excvaddr",
5838168c12b0SMax Filippov         .translate = translate_xsr,
583991dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
584059419607SMax Filippov         .par = (const uint32_t[]){
584159419607SMax Filippov             EXCVADDR,
584259419607SMax Filippov             XTENSA_OPTION_EXCEPTION,
584359419607SMax Filippov         },
584421a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
5845168c12b0SMax Filippov     }, {
5846168c12b0SMax Filippov         .name = "xsr.ibreaka0",
584759419607SMax Filippov         .translate = translate_xsr_ibreaka,
584891dc2b2dSMax Filippov         .test_exceptions = test_exceptions_ibreak,
584959419607SMax Filippov         .par = (const uint32_t[]){
585059419607SMax Filippov             IBREAKA,
585159419607SMax Filippov             XTENSA_OPTION_DEBUG,
585259419607SMax Filippov         },
5853bf525107SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED | XTENSA_OP_EXIT_TB_0,
5854168c12b0SMax Filippov     }, {
5855168c12b0SMax Filippov         .name = "xsr.ibreaka1",
585659419607SMax Filippov         .translate = translate_xsr_ibreaka,
585791dc2b2dSMax Filippov         .test_exceptions = test_exceptions_ibreak,
585859419607SMax Filippov         .par = (const uint32_t[]){
585959419607SMax Filippov             IBREAKA + 1,
586059419607SMax Filippov             XTENSA_OPTION_DEBUG,
586159419607SMax Filippov         },
5862bf525107SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED | XTENSA_OP_EXIT_TB_0,
5863168c12b0SMax Filippov     }, {
5864168c12b0SMax Filippov         .name = "xsr.ibreakenable",
586559419607SMax Filippov         .translate = translate_xsr_ibreakenable,
586691dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
586759419607SMax Filippov         .par = (const uint32_t[]){
586859419607SMax Filippov             IBREAKENABLE,
586959419607SMax Filippov             XTENSA_OPTION_DEBUG,
587059419607SMax Filippov         },
5871bf525107SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED | XTENSA_OP_EXIT_TB_0,
5872168c12b0SMax Filippov     }, {
5873168c12b0SMax Filippov         .name = "xsr.icount",
587459419607SMax Filippov         .translate = translate_xsr_icount,
587591dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
587659419607SMax Filippov         .par = (const uint32_t[]){
587759419607SMax Filippov             ICOUNT,
587859419607SMax Filippov             XTENSA_OPTION_DEBUG,
587959419607SMax Filippov         },
588021a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
5881168c12b0SMax Filippov     }, {
5882168c12b0SMax Filippov         .name = "xsr.icountlevel",
588359419607SMax Filippov         .translate = translate_xsr_mask,
588491dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
588559419607SMax Filippov         .par = (const uint32_t[]){
588659419607SMax Filippov             ICOUNTLEVEL,
588759419607SMax Filippov             XTENSA_OPTION_DEBUG,
588859419607SMax Filippov             0xf,
588959419607SMax Filippov         },
5890226444a8SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED | XTENSA_OP_EXIT_TB_M1,
5891168c12b0SMax Filippov     }, {
5892168c12b0SMax Filippov         .name = "xsr.intclear",
589359419607SMax Filippov         .op_flags = XTENSA_OP_ILL,
5894168c12b0SMax Filippov     }, {
5895168c12b0SMax Filippov         .name = "xsr.intenable",
5896168c12b0SMax Filippov         .translate = translate_xsr,
589791dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
589859419607SMax Filippov         .par = (const uint32_t[]){
589959419607SMax Filippov             INTENABLE,
590059419607SMax Filippov             XTENSA_OPTION_INTERRUPT,
590159419607SMax Filippov         },
5902d74624e5SMax Filippov         .op_flags =
5903d74624e5SMax Filippov             XTENSA_OP_PRIVILEGED |
5904d74624e5SMax Filippov             XTENSA_OP_EXIT_TB_0 |
5905d74624e5SMax Filippov             XTENSA_OP_CHECK_INTERRUPTS,
5906168c12b0SMax Filippov     }, {
5907168c12b0SMax Filippov         .name = "xsr.interrupt",
590859419607SMax Filippov         .op_flags = XTENSA_OP_ILL,
5909168c12b0SMax Filippov     }, {
5910168c12b0SMax Filippov         .name = "xsr.intset",
591159419607SMax Filippov         .op_flags = XTENSA_OP_ILL,
5912168c12b0SMax Filippov     }, {
5913168c12b0SMax Filippov         .name = "xsr.itlbcfg",
591459419607SMax Filippov         .translate = translate_xsr_mask,
591591dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
591659419607SMax Filippov         .par = (const uint32_t[]){
591759419607SMax Filippov             ITLBCFG,
591859419607SMax Filippov             XTENSA_OPTION_MMU,
591959419607SMax Filippov             0x01130000,
592059419607SMax Filippov         },
592121a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
5922168c12b0SMax Filippov     }, {
5923168c12b0SMax Filippov         .name = "xsr.lbeg",
5924168c12b0SMax Filippov         .translate = translate_xsr,
592591dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
592659419607SMax Filippov         .par = (const uint32_t[]){
592759419607SMax Filippov             LBEG,
592859419607SMax Filippov             XTENSA_OPTION_LOOP,
592959419607SMax Filippov         },
59305d630cefSMax Filippov         .op_flags = XTENSA_OP_EXIT_TB_M1,
5931168c12b0SMax Filippov     }, {
5932168c12b0SMax Filippov         .name = "xsr.lcount",
5933168c12b0SMax Filippov         .translate = translate_xsr,
593491dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
593559419607SMax Filippov         .par = (const uint32_t[]){
593659419607SMax Filippov             LCOUNT,
593759419607SMax Filippov             XTENSA_OPTION_LOOP,
593859419607SMax Filippov         },
5939168c12b0SMax Filippov     }, {
5940168c12b0SMax Filippov         .name = "xsr.lend",
5941168c12b0SMax Filippov         .translate = translate_xsr,
594291dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
594359419607SMax Filippov         .par = (const uint32_t[]){
594459419607SMax Filippov             LEND,
594559419607SMax Filippov             XTENSA_OPTION_LOOP,
594659419607SMax Filippov         },
59475d630cefSMax Filippov         .op_flags = XTENSA_OP_EXIT_TB_M1,
5948168c12b0SMax Filippov     }, {
5949168c12b0SMax Filippov         .name = "xsr.litbase",
595059419607SMax Filippov         .translate = translate_xsr_mask,
595191dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
595259419607SMax Filippov         .par = (const uint32_t[]){
595359419607SMax Filippov             LITBASE,
595459419607SMax Filippov             XTENSA_OPTION_EXTENDED_L32R,
595559419607SMax Filippov             0xfffff001,
595659419607SMax Filippov         },
5957226444a8SMax Filippov         .op_flags = XTENSA_OP_EXIT_TB_M1,
5958168c12b0SMax Filippov     }, {
5959168c12b0SMax Filippov         .name = "xsr.m0",
5960168c12b0SMax Filippov         .translate = translate_xsr,
596191dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
596259419607SMax Filippov         .par = (const uint32_t[]){
596359419607SMax Filippov             MR,
596459419607SMax Filippov             XTENSA_OPTION_MAC16,
596559419607SMax Filippov         },
5966168c12b0SMax Filippov     }, {
5967168c12b0SMax Filippov         .name = "xsr.m1",
5968168c12b0SMax Filippov         .translate = translate_xsr,
596991dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
597059419607SMax Filippov         .par = (const uint32_t[]){
597159419607SMax Filippov             MR + 1,
597259419607SMax Filippov             XTENSA_OPTION_MAC16,
597359419607SMax Filippov         },
5974168c12b0SMax Filippov     }, {
5975168c12b0SMax Filippov         .name = "xsr.m2",
5976168c12b0SMax Filippov         .translate = translate_xsr,
597791dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
597859419607SMax Filippov         .par = (const uint32_t[]){
597959419607SMax Filippov             MR + 2,
598059419607SMax Filippov             XTENSA_OPTION_MAC16,
598159419607SMax Filippov         },
5982168c12b0SMax Filippov     }, {
5983168c12b0SMax Filippov         .name = "xsr.m3",
5984168c12b0SMax Filippov         .translate = translate_xsr,
598591dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
598659419607SMax Filippov         .par = (const uint32_t[]){
598759419607SMax Filippov             MR + 3,
598859419607SMax Filippov             XTENSA_OPTION_MAC16,
598959419607SMax Filippov         },
5990168c12b0SMax Filippov     }, {
5991168c12b0SMax Filippov         .name = "xsr.memctl",
599259419607SMax Filippov         .translate = translate_xsr_memctl,
5993168c12b0SMax Filippov         .par = (const uint32_t[]){MEMCTL},
599421a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
5995168c12b0SMax Filippov     }, {
5996631a77a0SMax Filippov         .name = "xsr.mecr",
5997631a77a0SMax Filippov         .translate = translate_xsr,
599891dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
5999631a77a0SMax Filippov         .par = (const uint32_t[]){
6000631a77a0SMax Filippov             MECR,
6001631a77a0SMax Filippov             XTENSA_OPTION_MEMORY_ECC_PARITY,
6002631a77a0SMax Filippov         },
6003631a77a0SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
6004631a77a0SMax Filippov     }, {
6005631a77a0SMax Filippov         .name = "xsr.mepc",
6006631a77a0SMax Filippov         .translate = translate_xsr,
600791dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
6008631a77a0SMax Filippov         .par = (const uint32_t[]){
6009631a77a0SMax Filippov             MEPC,
6010631a77a0SMax Filippov             XTENSA_OPTION_MEMORY_ECC_PARITY,
6011631a77a0SMax Filippov         },
6012631a77a0SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
6013631a77a0SMax Filippov     }, {
6014631a77a0SMax Filippov         .name = "xsr.meps",
6015631a77a0SMax Filippov         .translate = translate_xsr,
601691dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
6017631a77a0SMax Filippov         .par = (const uint32_t[]){
6018631a77a0SMax Filippov             MEPS,
6019631a77a0SMax Filippov             XTENSA_OPTION_MEMORY_ECC_PARITY,
6020631a77a0SMax Filippov         },
6021631a77a0SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
6022631a77a0SMax Filippov     }, {
6023631a77a0SMax Filippov         .name = "xsr.mesave",
6024631a77a0SMax Filippov         .translate = translate_xsr,
602591dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
6026631a77a0SMax Filippov         .par = (const uint32_t[]){
6027631a77a0SMax Filippov             MESAVE,
6028631a77a0SMax Filippov             XTENSA_OPTION_MEMORY_ECC_PARITY,
6029631a77a0SMax Filippov         },
6030631a77a0SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
6031631a77a0SMax Filippov     }, {
6032631a77a0SMax Filippov         .name = "xsr.mesr",
6033631a77a0SMax Filippov         .translate = translate_xsr,
603491dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
6035631a77a0SMax Filippov         .par = (const uint32_t[]){
6036631a77a0SMax Filippov             MESR,
6037631a77a0SMax Filippov             XTENSA_OPTION_MEMORY_ECC_PARITY,
6038631a77a0SMax Filippov         },
6039631a77a0SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
6040631a77a0SMax Filippov     }, {
6041631a77a0SMax Filippov         .name = "xsr.mevaddr",
6042631a77a0SMax Filippov         .translate = translate_xsr,
604391dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
6044631a77a0SMax Filippov         .par = (const uint32_t[]){
6045631a77a0SMax Filippov             MESR,
6046631a77a0SMax Filippov             XTENSA_OPTION_MEMORY_ECC_PARITY,
6047631a77a0SMax Filippov         },
6048631a77a0SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
6049631a77a0SMax Filippov     }, {
6050168c12b0SMax Filippov         .name = "xsr.misc0",
6051168c12b0SMax Filippov         .translate = translate_xsr,
605291dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
605359419607SMax Filippov         .par = (const uint32_t[]){
605459419607SMax Filippov             MISC,
605559419607SMax Filippov             XTENSA_OPTION_MISC_SR,
605659419607SMax Filippov         },
605721a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
6058168c12b0SMax Filippov     }, {
6059168c12b0SMax Filippov         .name = "xsr.misc1",
6060168c12b0SMax Filippov         .translate = translate_xsr,
606191dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
606259419607SMax Filippov         .par = (const uint32_t[]){
606359419607SMax Filippov             MISC + 1,
606459419607SMax Filippov             XTENSA_OPTION_MISC_SR,
606559419607SMax Filippov         },
606621a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
6067168c12b0SMax Filippov     }, {
6068168c12b0SMax Filippov         .name = "xsr.misc2",
6069168c12b0SMax Filippov         .translate = translate_xsr,
607091dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
607159419607SMax Filippov         .par = (const uint32_t[]){
607259419607SMax Filippov             MISC + 2,
607359419607SMax Filippov             XTENSA_OPTION_MISC_SR,
607459419607SMax Filippov         },
607521a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
6076168c12b0SMax Filippov     }, {
6077168c12b0SMax Filippov         .name = "xsr.misc3",
6078168c12b0SMax Filippov         .translate = translate_xsr,
607991dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
608059419607SMax Filippov         .par = (const uint32_t[]){
608159419607SMax Filippov             MISC + 3,
608259419607SMax Filippov             XTENSA_OPTION_MISC_SR,
608359419607SMax Filippov         },
608421a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
6085168c12b0SMax Filippov     }, {
60864d04ea35SMax Filippov         .name = "xsr.mpuenb",
60874d04ea35SMax Filippov         .translate = translate_xsr_mpuenb,
608891dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
60894d04ea35SMax Filippov         .par = (const uint32_t[]){
60904d04ea35SMax Filippov             MPUENB,
60914d04ea35SMax Filippov             XTENSA_OPTION_MPU,
60924d04ea35SMax Filippov         },
60934d04ea35SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED | XTENSA_OP_EXIT_TB_M1,
60944d04ea35SMax Filippov     }, {
6095eb3f4298SMax Filippov         .name = "xsr.prefctl",
6096eb3f4298SMax Filippov         .translate = translate_xsr,
6097eb3f4298SMax Filippov         .par = (const uint32_t[]){PREFCTL},
6098eb3f4298SMax Filippov     }, {
6099168c12b0SMax Filippov         .name = "xsr.prid",
610059419607SMax Filippov         .op_flags = XTENSA_OP_ILL,
6101168c12b0SMax Filippov     }, {
6102168c12b0SMax Filippov         .name = "xsr.ps",
610359419607SMax Filippov         .translate = translate_xsr_ps,
610491dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
610559419607SMax Filippov         .par = (const uint32_t[]){
610659419607SMax Filippov             PS,
610759419607SMax Filippov             XTENSA_OPTION_EXCEPTION,
610859419607SMax Filippov         },
6109d74624e5SMax Filippov         .op_flags =
6110d74624e5SMax Filippov             XTENSA_OP_PRIVILEGED |
6111d74624e5SMax Filippov             XTENSA_OP_EXIT_TB_M1 |
6112d74624e5SMax Filippov             XTENSA_OP_CHECK_INTERRUPTS,
6113168c12b0SMax Filippov     }, {
6114168c12b0SMax Filippov         .name = "xsr.ptevaddr",
611559419607SMax Filippov         .translate = translate_xsr_mask,
611691dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
611759419607SMax Filippov         .par = (const uint32_t[]){
611859419607SMax Filippov             PTEVADDR,
611959419607SMax Filippov             XTENSA_OPTION_MMU,
612059419607SMax Filippov             0xffc00000,
612159419607SMax Filippov         },
612221a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
6123168c12b0SMax Filippov     }, {
6124168c12b0SMax Filippov         .name = "xsr.rasid",
612559419607SMax Filippov         .translate = translate_xsr_rasid,
612691dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
612759419607SMax Filippov         .par = (const uint32_t[]){
612859419607SMax Filippov             RASID,
612959419607SMax Filippov             XTENSA_OPTION_MMU,
613059419607SMax Filippov         },
6131226444a8SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED | XTENSA_OP_EXIT_TB_M1,
6132168c12b0SMax Filippov     }, {
6133168c12b0SMax Filippov         .name = "xsr.sar",
613459419607SMax Filippov         .translate = translate_xsr_sar,
6135168c12b0SMax Filippov         .par = (const uint32_t[]){SAR},
6136168c12b0SMax Filippov     }, {
6137168c12b0SMax Filippov         .name = "xsr.scompare1",
6138168c12b0SMax Filippov         .translate = translate_xsr,
613991dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
614059419607SMax Filippov         .par = (const uint32_t[]){
614159419607SMax Filippov             SCOMPARE1,
614259419607SMax Filippov             XTENSA_OPTION_CONDITIONAL_STORE,
614359419607SMax Filippov         },
6144168c12b0SMax Filippov     }, {
6145168c12b0SMax Filippov         .name = "xsr.vecbase",
6146168c12b0SMax Filippov         .translate = translate_xsr,
614791dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
614859419607SMax Filippov         .par = (const uint32_t[]){
614959419607SMax Filippov             VECBASE,
615059419607SMax Filippov             XTENSA_OPTION_RELOCATABLE_VECTOR,
615159419607SMax Filippov         },
615221a2dad5SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED,
6153168c12b0SMax Filippov     }, {
6154168c12b0SMax Filippov         .name = "xsr.windowbase",
615559419607SMax Filippov         .translate = translate_xsr_windowbase,
615691dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
615759419607SMax Filippov         .par = (const uint32_t[]){
615859419607SMax Filippov             WINDOW_BASE,
615959419607SMax Filippov             XTENSA_OPTION_WINDOWED_REGISTER,
616059419607SMax Filippov         },
61618df3fd35SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED |
61628df3fd35SMax Filippov             XTENSA_OP_EXIT_TB_M1 |
61638df3fd35SMax Filippov             XTENSA_OP_SYNC_REGISTER_WINDOW,
6164168c12b0SMax Filippov     }, {
6165168c12b0SMax Filippov         .name = "xsr.windowstart",
616659419607SMax Filippov         .translate = translate_xsr_windowstart,
616791dc2b2dSMax Filippov         .test_exceptions = test_exceptions_sr,
616859419607SMax Filippov         .par = (const uint32_t[]){
616959419607SMax Filippov             WINDOW_START,
617059419607SMax Filippov             XTENSA_OPTION_WINDOWED_REGISTER,
617159419607SMax Filippov         },
6172226444a8SMax Filippov         .op_flags = XTENSA_OP_PRIVILEGED | XTENSA_OP_EXIT_TB_M1,
6173168c12b0SMax Filippov     },
6174168c12b0SMax Filippov };
6175168c12b0SMax Filippov 
6176168c12b0SMax Filippov const XtensaOpcodeTranslators xtensa_core_opcodes = {
6177168c12b0SMax Filippov     .num_opcodes = ARRAY_SIZE(core_ops),
6178168c12b0SMax Filippov     .opcode = core_ops,
6179168c12b0SMax Filippov };
6180c04e1692SMax Filippov 
6181c04e1692SMax Filippov 
6182cfa9f051SMax Filippov static inline void get_f32_o1_i3(const OpcodeArg *arg, OpcodeArg *arg32,
6183cfa9f051SMax Filippov                                  int o0, int i0, int i1, int i2)
6184cfa9f051SMax Filippov {
6185cfa9f051SMax Filippov     if ((i0 >= 0 && arg[i0].num_bits == 64) ||
6186cfa9f051SMax Filippov         (o0 >= 0 && arg[o0].num_bits == 64)) {
6187cfa9f051SMax Filippov         if (o0 >= 0) {
6188cfa9f051SMax Filippov             arg32[o0].out = tcg_temp_new_i32();
6189cfa9f051SMax Filippov         }
6190cfa9f051SMax Filippov         if (i0 >= 0) {
6191cfa9f051SMax Filippov             arg32[i0].in = tcg_temp_new_i32();
6192cfa9f051SMax Filippov             tcg_gen_extrl_i64_i32(arg32[i0].in, arg[i0].in);
6193cfa9f051SMax Filippov         }
6194cfa9f051SMax Filippov         if (i1 >= 0) {
6195cfa9f051SMax Filippov             arg32[i1].in = tcg_temp_new_i32();
6196cfa9f051SMax Filippov             tcg_gen_extrl_i64_i32(arg32[i1].in, arg[i1].in);
6197cfa9f051SMax Filippov         }
6198cfa9f051SMax Filippov         if (i2 >= 0) {
6199cfa9f051SMax Filippov             arg32[i2].in = tcg_temp_new_i32();
6200cfa9f051SMax Filippov             tcg_gen_extrl_i64_i32(arg32[i2].in, arg[i2].in);
6201cfa9f051SMax Filippov         }
6202cfa9f051SMax Filippov     } else {
6203cfa9f051SMax Filippov         if (o0 >= 0) {
6204cfa9f051SMax Filippov             arg32[o0].out = arg[o0].out;
6205cfa9f051SMax Filippov         }
6206cfa9f051SMax Filippov         if (i0 >= 0) {
6207cfa9f051SMax Filippov             arg32[i0].in = arg[i0].in;
6208cfa9f051SMax Filippov         }
6209cfa9f051SMax Filippov         if (i1 >= 0) {
6210cfa9f051SMax Filippov             arg32[i1].in = arg[i1].in;
6211cfa9f051SMax Filippov         }
6212cfa9f051SMax Filippov         if (i2 >= 0) {
6213cfa9f051SMax Filippov             arg32[i2].in = arg[i2].in;
6214cfa9f051SMax Filippov         }
6215cfa9f051SMax Filippov     }
6216cfa9f051SMax Filippov }
6217cfa9f051SMax Filippov 
6218cfa9f051SMax Filippov static inline void put_f32_o1_i3(const OpcodeArg *arg, const OpcodeArg *arg32,
6219cfa9f051SMax Filippov                                  int o0, int i0, int i1, int i2)
6220cfa9f051SMax Filippov {
6221cfa9f051SMax Filippov     if ((i0 >= 0 && arg[i0].num_bits == 64) ||
6222cfa9f051SMax Filippov         (o0 >= 0 && arg[o0].num_bits == 64)) {
6223cfa9f051SMax Filippov         if (o0 >= 0) {
6224cfa9f051SMax Filippov             tcg_gen_extu_i32_i64(arg[o0].out, arg32[o0].out);
6225cfa9f051SMax Filippov         }
6226cfa9f051SMax Filippov     }
6227cfa9f051SMax Filippov }
6228cfa9f051SMax Filippov 
6229cfa9f051SMax Filippov static inline void get_f32_o1_i2(const OpcodeArg *arg, OpcodeArg *arg32,
6230cfa9f051SMax Filippov                                  int o0, int i0, int i1)
6231cfa9f051SMax Filippov {
6232cfa9f051SMax Filippov     get_f32_o1_i3(arg, arg32, o0, i0, i1, -1);
6233cfa9f051SMax Filippov }
6234cfa9f051SMax Filippov 
6235cfa9f051SMax Filippov static inline void put_f32_o1_i2(const OpcodeArg *arg, const OpcodeArg *arg32,
6236cfa9f051SMax Filippov                                  int o0, int i0, int i1)
6237cfa9f051SMax Filippov {
6238cfa9f051SMax Filippov     put_f32_o1_i3(arg, arg32, o0, i0, i1, -1);
6239cfa9f051SMax Filippov }
6240cfa9f051SMax Filippov 
6241cfa9f051SMax Filippov static inline void get_f32_o1_i1(const OpcodeArg *arg, OpcodeArg *arg32,
6242cfa9f051SMax Filippov                                  int o0, int i0)
6243cfa9f051SMax Filippov {
6244cfa9f051SMax Filippov     get_f32_o1_i2(arg, arg32, o0, i0, -1);
6245cfa9f051SMax Filippov }
6246cfa9f051SMax Filippov 
6247cfa9f051SMax Filippov static inline void put_f32_o1_i1(const OpcodeArg *arg, const OpcodeArg *arg32,
6248cfa9f051SMax Filippov                                  int o0, int i0)
6249cfa9f051SMax Filippov {
6250cfa9f051SMax Filippov     put_f32_o1_i2(arg, arg32, o0, i0, -1);
6251cfa9f051SMax Filippov }
6252cfa9f051SMax Filippov 
6253cfa9f051SMax Filippov static inline void get_f32_o1(const OpcodeArg *arg, OpcodeArg *arg32,
6254cfa9f051SMax Filippov                               int o0)
6255cfa9f051SMax Filippov {
6256cfa9f051SMax Filippov     get_f32_o1_i1(arg, arg32, o0, -1);
6257cfa9f051SMax Filippov }
6258cfa9f051SMax Filippov 
6259cfa9f051SMax Filippov static inline void put_f32_o1(const OpcodeArg *arg, const OpcodeArg *arg32,
6260cfa9f051SMax Filippov                               int o0)
6261cfa9f051SMax Filippov {
6262cfa9f051SMax Filippov     put_f32_o1_i1(arg, arg32, o0, -1);
6263cfa9f051SMax Filippov }
6264cfa9f051SMax Filippov 
6265cfa9f051SMax Filippov static inline void get_f32_i2(const OpcodeArg *arg, OpcodeArg *arg32,
6266cfa9f051SMax Filippov                               int i0, int i1)
6267cfa9f051SMax Filippov {
6268cfa9f051SMax Filippov     get_f32_o1_i2(arg, arg32, -1, i0, i1);
6269cfa9f051SMax Filippov }
6270cfa9f051SMax Filippov 
6271cfa9f051SMax Filippov static inline void put_f32_i2(const OpcodeArg *arg, const OpcodeArg *arg32,
6272cfa9f051SMax Filippov                               int i0, int i1)
6273cfa9f051SMax Filippov {
6274cfa9f051SMax Filippov     put_f32_o1_i2(arg, arg32, -1, i0, i1);
6275cfa9f051SMax Filippov }
6276cfa9f051SMax Filippov 
6277cfa9f051SMax Filippov static inline void get_f32_i1(const OpcodeArg *arg, OpcodeArg *arg32,
6278cfa9f051SMax Filippov                               int i0)
6279cfa9f051SMax Filippov {
6280cfa9f051SMax Filippov     get_f32_i2(arg, arg32, i0, -1);
6281cfa9f051SMax Filippov }
6282cfa9f051SMax Filippov 
6283cfa9f051SMax Filippov static inline void put_f32_i1(const OpcodeArg *arg, const OpcodeArg *arg32,
6284cfa9f051SMax Filippov                               int i0)
6285cfa9f051SMax Filippov {
6286cfa9f051SMax Filippov     put_f32_i2(arg, arg32, i0, -1);
6287cfa9f051SMax Filippov }
6288cfa9f051SMax Filippov 
6289cfa9f051SMax Filippov 
6290cfa9f051SMax Filippov static void translate_abs_d(DisasContext *dc, const OpcodeArg arg[],
6291cfa9f051SMax Filippov                             const uint32_t par[])
6292cfa9f051SMax Filippov {
6293cfa9f051SMax Filippov     gen_helper_abs_d(arg[0].out, arg[1].in);
6294cfa9f051SMax Filippov }
6295cfa9f051SMax Filippov 
6296b0b24bdcSMax Filippov static void translate_abs_s(DisasContext *dc, const OpcodeArg arg[],
6297c04e1692SMax Filippov                             const uint32_t par[])
6298c04e1692SMax Filippov {
6299cfa9f051SMax Filippov     OpcodeArg arg32[2];
6300cfa9f051SMax Filippov 
6301cfa9f051SMax Filippov     get_f32_o1_i1(arg, arg32, 0, 1);
6302cfa9f051SMax Filippov     gen_helper_abs_s(arg32[0].out, arg32[1].in);
6303cfa9f051SMax Filippov     put_f32_o1_i1(arg, arg32, 0, 1);
6304c04e1692SMax Filippov }
6305c04e1692SMax Filippov 
63065680f207SMax Filippov static void translate_fpu2k_add_s(DisasContext *dc, const OpcodeArg arg[],
6307c04e1692SMax Filippov                                   const uint32_t par[])
6308c04e1692SMax Filippov {
63095680f207SMax Filippov     gen_helper_fpu2k_add_s(arg[0].out, cpu_env,
6310b0b24bdcSMax Filippov                            arg[1].in, arg[2].in);
6311c04e1692SMax Filippov }
6312c04e1692SMax Filippov 
6313c04e1692SMax Filippov enum {
6314c04e1692SMax Filippov     COMPARE_UN,
6315c04e1692SMax Filippov     COMPARE_OEQ,
6316c04e1692SMax Filippov     COMPARE_UEQ,
6317c04e1692SMax Filippov     COMPARE_OLT,
6318c04e1692SMax Filippov     COMPARE_ULT,
6319c04e1692SMax Filippov     COMPARE_OLE,
6320c04e1692SMax Filippov     COMPARE_ULE,
6321c04e1692SMax Filippov };
6322c04e1692SMax Filippov 
6323cfa9f051SMax Filippov static void translate_compare_d(DisasContext *dc, const OpcodeArg arg[],
6324c04e1692SMax Filippov                                 const uint32_t par[])
6325c04e1692SMax Filippov {
63265dbb4c96SMax Filippov     static void (* const helper[])(TCGv_i32 res, TCGv_env env,
6327cfa9f051SMax Filippov                                    TCGv_i64 s, TCGv_i64 t) = {
6328cfa9f051SMax Filippov         [COMPARE_UN] = gen_helper_un_d,
6329cfa9f051SMax Filippov         [COMPARE_OEQ] = gen_helper_oeq_d,
6330cfa9f051SMax Filippov         [COMPARE_UEQ] = gen_helper_ueq_d,
6331cfa9f051SMax Filippov         [COMPARE_OLT] = gen_helper_olt_d,
6332cfa9f051SMax Filippov         [COMPARE_ULT] = gen_helper_ult_d,
6333cfa9f051SMax Filippov         [COMPARE_OLE] = gen_helper_ole_d,
6334cfa9f051SMax Filippov         [COMPARE_ULE] = gen_helper_ule_d,
6335c04e1692SMax Filippov     };
63362b570a17SMax Filippov     TCGv_i32 zero = tcg_constant_i32(0);
63375dbb4c96SMax Filippov     TCGv_i32 res = tcg_temp_new_i32();
63385dbb4c96SMax Filippov     TCGv_i32 set_br = tcg_temp_new_i32();
63395dbb4c96SMax Filippov     TCGv_i32 clr_br = tcg_temp_new_i32();
6340c04e1692SMax Filippov 
63415dbb4c96SMax Filippov     tcg_gen_ori_i32(set_br, arg[0].in, 1 << arg[0].imm);
63425dbb4c96SMax Filippov     tcg_gen_andi_i32(clr_br, arg[0].in, ~(1 << arg[0].imm));
63435dbb4c96SMax Filippov 
63445dbb4c96SMax Filippov     helper[par[0]](res, cpu_env, arg[1].in, arg[2].in);
63455dbb4c96SMax Filippov     tcg_gen_movcond_i32(TCG_COND_NE,
63465dbb4c96SMax Filippov                         arg[0].out, res, zero,
63475dbb4c96SMax Filippov                         set_br, clr_br);
6348c04e1692SMax Filippov }
6349c04e1692SMax Filippov 
6350cfa9f051SMax Filippov static void translate_compare_s(DisasContext *dc, const OpcodeArg arg[],
6351cfa9f051SMax Filippov                                 const uint32_t par[])
6352cfa9f051SMax Filippov {
6353cfa9f051SMax Filippov     static void (* const helper[])(TCGv_i32 res, TCGv_env env,
6354cfa9f051SMax Filippov                                    TCGv_i32 s, TCGv_i32 t) = {
6355cfa9f051SMax Filippov         [COMPARE_UN] = gen_helper_un_s,
6356cfa9f051SMax Filippov         [COMPARE_OEQ] = gen_helper_oeq_s,
6357cfa9f051SMax Filippov         [COMPARE_UEQ] = gen_helper_ueq_s,
6358cfa9f051SMax Filippov         [COMPARE_OLT] = gen_helper_olt_s,
6359cfa9f051SMax Filippov         [COMPARE_ULT] = gen_helper_ult_s,
6360cfa9f051SMax Filippov         [COMPARE_OLE] = gen_helper_ole_s,
6361cfa9f051SMax Filippov         [COMPARE_ULE] = gen_helper_ule_s,
6362cfa9f051SMax Filippov     };
6363cfa9f051SMax Filippov     OpcodeArg arg32[3];
63642b570a17SMax Filippov     TCGv_i32 zero = tcg_constant_i32(0);
6365cfa9f051SMax Filippov     TCGv_i32 res = tcg_temp_new_i32();
6366cfa9f051SMax Filippov     TCGv_i32 set_br = tcg_temp_new_i32();
6367cfa9f051SMax Filippov     TCGv_i32 clr_br = tcg_temp_new_i32();
6368cfa9f051SMax Filippov 
6369cfa9f051SMax Filippov     tcg_gen_ori_i32(set_br, arg[0].in, 1 << arg[0].imm);
6370cfa9f051SMax Filippov     tcg_gen_andi_i32(clr_br, arg[0].in, ~(1 << arg[0].imm));
6371cfa9f051SMax Filippov 
6372cfa9f051SMax Filippov     get_f32_i2(arg, arg32, 1, 2);
6373cfa9f051SMax Filippov     helper[par[0]](res, cpu_env, arg32[1].in, arg32[2].in);
6374cfa9f051SMax Filippov     tcg_gen_movcond_i32(TCG_COND_NE,
6375cfa9f051SMax Filippov                         arg[0].out, res, zero,
6376cfa9f051SMax Filippov                         set_br, clr_br);
6377cfa9f051SMax Filippov     put_f32_i2(arg, arg32, 1, 2);
6378cfa9f051SMax Filippov }
6379cfa9f051SMax Filippov 
6380cfa9f051SMax Filippov static void translate_const_d(DisasContext *dc, const OpcodeArg arg[],
6381cfa9f051SMax Filippov                               const uint32_t par[])
6382cfa9f051SMax Filippov {
6383cfa9f051SMax Filippov     static const uint64_t v[] = {
6384cfa9f051SMax Filippov         UINT64_C(0x0000000000000000),
6385cfa9f051SMax Filippov         UINT64_C(0x3ff0000000000000),
6386cfa9f051SMax Filippov         UINT64_C(0x4000000000000000),
6387cfa9f051SMax Filippov         UINT64_C(0x3fe0000000000000),
6388cfa9f051SMax Filippov     };
6389cfa9f051SMax Filippov 
6390cfa9f051SMax Filippov     tcg_gen_movi_i64(arg[0].out, v[arg[1].imm % ARRAY_SIZE(v)]);
6391cfa9f051SMax Filippov     if (arg[1].imm >= ARRAY_SIZE(v)) {
6392cfa9f051SMax Filippov         qemu_log_mask(LOG_GUEST_ERROR,
6393cfa9f051SMax Filippov                       "const.d f%d, #%d, immediate value is reserved\n",
6394cfa9f051SMax Filippov                       arg[0].imm, arg[1].imm);
6395cfa9f051SMax Filippov     }
6396cfa9f051SMax Filippov }
6397cfa9f051SMax Filippov 
6398cfa9f051SMax Filippov static void translate_const_s(DisasContext *dc, const OpcodeArg arg[],
6399cfa9f051SMax Filippov                               const uint32_t par[])
6400cfa9f051SMax Filippov {
6401cfa9f051SMax Filippov     static const uint32_t v[] = {
6402cfa9f051SMax Filippov         0x00000000,
6403cfa9f051SMax Filippov         0x3f800000,
6404cfa9f051SMax Filippov         0x40000000,
6405cfa9f051SMax Filippov         0x3f000000,
6406cfa9f051SMax Filippov     };
6407cfa9f051SMax Filippov 
6408cfa9f051SMax Filippov     if (arg[0].num_bits == 32) {
6409cfa9f051SMax Filippov         tcg_gen_movi_i32(arg[0].out, v[arg[1].imm % ARRAY_SIZE(v)]);
6410cfa9f051SMax Filippov     } else {
6411cfa9f051SMax Filippov         tcg_gen_movi_i64(arg[0].out, v[arg[1].imm % ARRAY_SIZE(v)]);
6412cfa9f051SMax Filippov     }
6413cfa9f051SMax Filippov     if (arg[1].imm >= ARRAY_SIZE(v)) {
6414cfa9f051SMax Filippov         qemu_log_mask(LOG_GUEST_ERROR,
6415cfa9f051SMax Filippov                       "const.s f%d, #%d, immediate value is reserved\n",
6416cfa9f051SMax Filippov                       arg[0].imm, arg[1].imm);
6417cfa9f051SMax Filippov     }
6418cfa9f051SMax Filippov }
6419cfa9f051SMax Filippov 
6420cfa9f051SMax Filippov static void translate_float_d(DisasContext *dc, const OpcodeArg arg[],
6421c04e1692SMax Filippov                               const uint32_t par[])
6422c04e1692SMax Filippov {
6423867e354cSMax Filippov     TCGv_i32 scale = tcg_constant_i32(-arg[2].imm);
6424c04e1692SMax Filippov 
6425c04e1692SMax Filippov     if (par[0]) {
6426cfa9f051SMax Filippov         gen_helper_uitof_d(arg[0].out, cpu_env, arg[1].in, scale);
6427c04e1692SMax Filippov     } else {
6428cfa9f051SMax Filippov         gen_helper_itof_d(arg[0].out, cpu_env, arg[1].in, scale);
6429c04e1692SMax Filippov     }
6430c04e1692SMax Filippov }
6431c04e1692SMax Filippov 
6432cfa9f051SMax Filippov static void translate_float_s(DisasContext *dc, const OpcodeArg arg[],
6433cfa9f051SMax Filippov                               const uint32_t par[])
6434cfa9f051SMax Filippov {
6435867e354cSMax Filippov     TCGv_i32 scale = tcg_constant_i32(-arg[2].imm);
6436cfa9f051SMax Filippov     OpcodeArg arg32[1];
6437cfa9f051SMax Filippov 
6438cfa9f051SMax Filippov     get_f32_o1(arg, arg32, 0);
6439cfa9f051SMax Filippov     if (par[0]) {
6440cfa9f051SMax Filippov         gen_helper_uitof_s(arg32[0].out, cpu_env, arg[1].in, scale);
6441cfa9f051SMax Filippov     } else {
6442cfa9f051SMax Filippov         gen_helper_itof_s(arg32[0].out, cpu_env, arg[1].in, scale);
6443cfa9f051SMax Filippov     }
6444cfa9f051SMax Filippov     put_f32_o1(arg, arg32, 0);
6445cfa9f051SMax Filippov }
6446cfa9f051SMax Filippov 
6447cfa9f051SMax Filippov static void translate_ftoi_d(DisasContext *dc, const OpcodeArg arg[],
6448cfa9f051SMax Filippov                              const uint32_t par[])
6449cfa9f051SMax Filippov {
6450867e354cSMax Filippov     TCGv_i32 rounding_mode = tcg_constant_i32(par[0]);
6451867e354cSMax Filippov     TCGv_i32 scale = tcg_constant_i32(arg[2].imm);
6452cfa9f051SMax Filippov 
6453cfa9f051SMax Filippov     if (par[1]) {
6454cfa9f051SMax Filippov         gen_helper_ftoui_d(arg[0].out, cpu_env, arg[1].in,
6455cfa9f051SMax Filippov                            rounding_mode, scale);
6456cfa9f051SMax Filippov     } else {
6457cfa9f051SMax Filippov         gen_helper_ftoi_d(arg[0].out, cpu_env, arg[1].in,
6458cfa9f051SMax Filippov                           rounding_mode, scale);
6459cfa9f051SMax Filippov     }
6460cfa9f051SMax Filippov }
6461cfa9f051SMax Filippov 
6462b0b24bdcSMax Filippov static void translate_ftoi_s(DisasContext *dc, const OpcodeArg arg[],
6463c04e1692SMax Filippov                              const uint32_t par[])
6464c04e1692SMax Filippov {
6465867e354cSMax Filippov     TCGv_i32 rounding_mode = tcg_constant_i32(par[0]);
6466867e354cSMax Filippov     TCGv_i32 scale = tcg_constant_i32(arg[2].imm);
6467cfa9f051SMax Filippov     OpcodeArg arg32[2];
6468c04e1692SMax Filippov 
6469cfa9f051SMax Filippov     get_f32_i1(arg, arg32, 1);
6470c04e1692SMax Filippov     if (par[1]) {
6471cfa9f051SMax Filippov         gen_helper_ftoui_s(arg[0].out, cpu_env, arg32[1].in,
6472c04e1692SMax Filippov                            rounding_mode, scale);
6473c04e1692SMax Filippov     } else {
6474cfa9f051SMax Filippov         gen_helper_ftoi_s(arg[0].out, cpu_env, arg32[1].in,
6475c04e1692SMax Filippov                           rounding_mode, scale);
6476c04e1692SMax Filippov     }
6477cfa9f051SMax Filippov     put_f32_i1(arg, arg32, 1);
6478c04e1692SMax Filippov }
6479c04e1692SMax Filippov 
6480b0b24bdcSMax Filippov static void translate_ldsti(DisasContext *dc, const OpcodeArg arg[],
6481c04e1692SMax Filippov                             const uint32_t par[])
6482c04e1692SMax Filippov {
6483c04e1692SMax Filippov     TCGv_i32 addr = tcg_temp_new_i32();
6484583e6a5fSMax Filippov     MemOp mop;
6485c04e1692SMax Filippov 
6486b0b24bdcSMax Filippov     tcg_gen_addi_i32(addr, arg[1].in, arg[2].imm);
6487583e6a5fSMax Filippov     mop = gen_load_store_alignment(dc, MO_TEUL, addr);
6488c04e1692SMax Filippov     if (par[0]) {
6489583e6a5fSMax Filippov         tcg_gen_qemu_st_tl(arg[0].in, addr, dc->cring, mop);
6490c04e1692SMax Filippov     } else {
6491583e6a5fSMax Filippov         tcg_gen_qemu_ld_tl(arg[0].out, addr, dc->cring, mop);
6492c04e1692SMax Filippov     }
6493c04e1692SMax Filippov     if (par[1]) {
6494b0b24bdcSMax Filippov         tcg_gen_mov_i32(arg[1].out, addr);
6495c04e1692SMax Filippov     }
6496c04e1692SMax Filippov }
6497c04e1692SMax Filippov 
6498b0b24bdcSMax Filippov static void translate_ldstx(DisasContext *dc, const OpcodeArg arg[],
6499c04e1692SMax Filippov                             const uint32_t par[])
6500c04e1692SMax Filippov {
6501c04e1692SMax Filippov     TCGv_i32 addr = tcg_temp_new_i32();
6502583e6a5fSMax Filippov     MemOp mop;
6503c04e1692SMax Filippov 
6504b0b24bdcSMax Filippov     tcg_gen_add_i32(addr, arg[1].in, arg[2].in);
6505583e6a5fSMax Filippov     mop = gen_load_store_alignment(dc, MO_TEUL, addr);
6506c04e1692SMax Filippov     if (par[0]) {
6507583e6a5fSMax Filippov         tcg_gen_qemu_st_tl(arg[0].in, addr, dc->cring, mop);
6508c04e1692SMax Filippov     } else {
6509583e6a5fSMax Filippov         tcg_gen_qemu_ld_tl(arg[0].out, addr, dc->cring, mop);
6510c04e1692SMax Filippov     }
6511c04e1692SMax Filippov     if (par[1]) {
6512b0b24bdcSMax Filippov         tcg_gen_mov_i32(arg[1].out, addr);
6513c04e1692SMax Filippov     }
6514c04e1692SMax Filippov }
6515c04e1692SMax Filippov 
65165680f207SMax Filippov static void translate_fpu2k_madd_s(DisasContext *dc, const OpcodeArg arg[],
6517c04e1692SMax Filippov                                    const uint32_t par[])
6518c04e1692SMax Filippov {
65195680f207SMax Filippov     gen_helper_fpu2k_madd_s(arg[0].out, cpu_env,
6520b0b24bdcSMax Filippov                             arg[0].in, arg[1].in, arg[2].in);
6521c04e1692SMax Filippov }
6522c04e1692SMax Filippov 
6523cfa9f051SMax Filippov static void translate_mov_d(DisasContext *dc, const OpcodeArg arg[],
6524cfa9f051SMax Filippov                                 const uint32_t par[])
6525cfa9f051SMax Filippov {
6526cfa9f051SMax Filippov     tcg_gen_mov_i64(arg[0].out, arg[1].in);
6527cfa9f051SMax Filippov }
6528cfa9f051SMax Filippov 
6529b0b24bdcSMax Filippov static void translate_mov_s(DisasContext *dc, const OpcodeArg arg[],
6530c04e1692SMax Filippov                             const uint32_t par[])
6531c04e1692SMax Filippov {
6532cfa9f051SMax Filippov     if (arg[0].num_bits == 32) {
6533b0b24bdcSMax Filippov         tcg_gen_mov_i32(arg[0].out, arg[1].in);
6534cfa9f051SMax Filippov     } else {
6535cfa9f051SMax Filippov         tcg_gen_mov_i64(arg[0].out, arg[1].in);
6536cfa9f051SMax Filippov     }
6537cfa9f051SMax Filippov }
6538cfa9f051SMax Filippov 
6539cfa9f051SMax Filippov static void translate_movcond_d(DisasContext *dc, const OpcodeArg arg[],
6540cfa9f051SMax Filippov                                 const uint32_t par[])
6541cfa9f051SMax Filippov {
65422b570a17SMax Filippov     TCGv_i64 zero = tcg_constant_i64(0);
6543cfa9f051SMax Filippov     TCGv_i64 arg2 = tcg_temp_new_i64();
6544cfa9f051SMax Filippov 
6545cfa9f051SMax Filippov     tcg_gen_ext_i32_i64(arg2, arg[2].in);
6546cfa9f051SMax Filippov     tcg_gen_movcond_i64(par[0], arg[0].out,
6547cfa9f051SMax Filippov                         arg2, zero,
6548cfa9f051SMax Filippov                         arg[1].in, arg[0].in);
6549c04e1692SMax Filippov }
6550c04e1692SMax Filippov 
6551b0b24bdcSMax Filippov static void translate_movcond_s(DisasContext *dc, const OpcodeArg arg[],
6552c04e1692SMax Filippov                                 const uint32_t par[])
6553c04e1692SMax Filippov {
6554cfa9f051SMax Filippov     if (arg[0].num_bits == 32) {
65552b570a17SMax Filippov         TCGv_i32 zero = tcg_constant_i32(0);
6556c04e1692SMax Filippov 
6557b0b24bdcSMax Filippov         tcg_gen_movcond_i32(par[0], arg[0].out,
6558b0b24bdcSMax Filippov                             arg[2].in, zero,
6559b0b24bdcSMax Filippov                             arg[1].in, arg[0].in);
6560cfa9f051SMax Filippov     } else {
6561cfa9f051SMax Filippov         translate_movcond_d(dc, arg, par);
6562cfa9f051SMax Filippov     }
6563cfa9f051SMax Filippov }
6564cfa9f051SMax Filippov 
6565cfa9f051SMax Filippov static void translate_movp_d(DisasContext *dc, const OpcodeArg arg[],
6566cfa9f051SMax Filippov                              const uint32_t par[])
6567cfa9f051SMax Filippov {
65682b570a17SMax Filippov     TCGv_i64 zero = tcg_constant_i64(0);
6569cfa9f051SMax Filippov     TCGv_i32 tmp1 = tcg_temp_new_i32();
6570cfa9f051SMax Filippov     TCGv_i64 tmp2 = tcg_temp_new_i64();
6571cfa9f051SMax Filippov 
6572cfa9f051SMax Filippov     tcg_gen_andi_i32(tmp1, arg[2].in, 1 << arg[2].imm);
6573cfa9f051SMax Filippov     tcg_gen_extu_i32_i64(tmp2, tmp1);
6574cfa9f051SMax Filippov     tcg_gen_movcond_i64(par[0],
6575cfa9f051SMax Filippov                         arg[0].out, tmp2, zero,
6576cfa9f051SMax Filippov                         arg[1].in, arg[0].in);
6577c04e1692SMax Filippov }
6578c04e1692SMax Filippov 
6579b0b24bdcSMax Filippov static void translate_movp_s(DisasContext *dc, const OpcodeArg arg[],
6580c04e1692SMax Filippov                              const uint32_t par[])
6581c04e1692SMax Filippov {
6582cfa9f051SMax Filippov     if (arg[0].num_bits == 32) {
65832b570a17SMax Filippov         TCGv_i32 zero = tcg_constant_i32(0);
6584c04e1692SMax Filippov         TCGv_i32 tmp = tcg_temp_new_i32();
6585c04e1692SMax Filippov 
6586575e962aSMax Filippov         tcg_gen_andi_i32(tmp, arg[2].in, 1 << arg[2].imm);
6587c04e1692SMax Filippov         tcg_gen_movcond_i32(par[0],
6588b0b24bdcSMax Filippov                             arg[0].out, tmp, zero,
6589b0b24bdcSMax Filippov                             arg[1].in, arg[0].in);
6590cfa9f051SMax Filippov     } else {
6591cfa9f051SMax Filippov         translate_movp_d(dc, arg, par);
6592cfa9f051SMax Filippov     }
6593c04e1692SMax Filippov }
6594c04e1692SMax Filippov 
65955680f207SMax Filippov static void translate_fpu2k_mul_s(DisasContext *dc, const OpcodeArg arg[],
6596c04e1692SMax Filippov                                   const uint32_t par[])
6597c04e1692SMax Filippov {
65985680f207SMax Filippov     gen_helper_fpu2k_mul_s(arg[0].out, cpu_env,
6599b0b24bdcSMax Filippov                            arg[1].in, arg[2].in);
6600c04e1692SMax Filippov }
6601c04e1692SMax Filippov 
66025680f207SMax Filippov static void translate_fpu2k_msub_s(DisasContext *dc, const OpcodeArg arg[],
6603c04e1692SMax Filippov                                    const uint32_t par[])
6604c04e1692SMax Filippov {
66055680f207SMax Filippov     gen_helper_fpu2k_msub_s(arg[0].out, cpu_env,
6606b0b24bdcSMax Filippov                             arg[0].in, arg[1].in, arg[2].in);
6607c04e1692SMax Filippov }
6608c04e1692SMax Filippov 
6609cfa9f051SMax Filippov static void translate_neg_d(DisasContext *dc, const OpcodeArg arg[],
6610cfa9f051SMax Filippov                             const uint32_t par[])
6611cfa9f051SMax Filippov {
6612cfa9f051SMax Filippov     gen_helper_neg_d(arg[0].out, arg[1].in);
6613cfa9f051SMax Filippov }
6614cfa9f051SMax Filippov 
6615b0b24bdcSMax Filippov static void translate_neg_s(DisasContext *dc, const OpcodeArg arg[],
6616c04e1692SMax Filippov                             const uint32_t par[])
6617c04e1692SMax Filippov {
6618cfa9f051SMax Filippov     OpcodeArg arg32[2];
6619cfa9f051SMax Filippov 
6620cfa9f051SMax Filippov     get_f32_o1_i1(arg, arg32, 0, 1);
6621cfa9f051SMax Filippov     gen_helper_neg_s(arg32[0].out, arg32[1].in);
6622cfa9f051SMax Filippov     put_f32_o1_i1(arg, arg32, 0, 1);
6623cfa9f051SMax Filippov }
6624cfa9f051SMax Filippov 
6625cfa9f051SMax Filippov static void translate_rfr_d(DisasContext *dc, const OpcodeArg arg[],
6626cfa9f051SMax Filippov                             const uint32_t par[])
6627cfa9f051SMax Filippov {
6628cfa9f051SMax Filippov     tcg_gen_extrh_i64_i32(arg[0].out, arg[1].in);
6629c04e1692SMax Filippov }
6630c04e1692SMax Filippov 
6631b0b24bdcSMax Filippov static void translate_rfr_s(DisasContext *dc, const OpcodeArg arg[],
6632c04e1692SMax Filippov                             const uint32_t par[])
6633c04e1692SMax Filippov {
6634cfa9f051SMax Filippov     if (arg[1].num_bits == 32) {
6635b0b24bdcSMax Filippov         tcg_gen_mov_i32(arg[0].out, arg[1].in);
6636cfa9f051SMax Filippov     } else {
6637cfa9f051SMax Filippov         tcg_gen_extrl_i64_i32(arg[0].out, arg[1].in);
6638cfa9f051SMax Filippov     }
6639c04e1692SMax Filippov }
6640c04e1692SMax Filippov 
66415680f207SMax Filippov static void translate_fpu2k_sub_s(DisasContext *dc, const OpcodeArg arg[],
6642c04e1692SMax Filippov                                   const uint32_t par[])
6643c04e1692SMax Filippov {
66445680f207SMax Filippov     gen_helper_fpu2k_sub_s(arg[0].out, cpu_env,
6645b0b24bdcSMax Filippov                            arg[1].in, arg[2].in);
6646c04e1692SMax Filippov }
6647c04e1692SMax Filippov 
6648cfa9f051SMax Filippov static void translate_wfr_d(DisasContext *dc, const OpcodeArg arg[],
6649cfa9f051SMax Filippov                             const uint32_t par[])
6650cfa9f051SMax Filippov {
6651cfa9f051SMax Filippov     tcg_gen_concat_i32_i64(arg[0].out, arg[2].in, arg[1].in);
6652cfa9f051SMax Filippov }
6653cfa9f051SMax Filippov 
6654b0b24bdcSMax Filippov static void translate_wfr_s(DisasContext *dc, const OpcodeArg arg[],
6655c04e1692SMax Filippov                             const uint32_t par[])
6656c04e1692SMax Filippov {
6657cfa9f051SMax Filippov     if (arg[0].num_bits == 32) {
6658b0b24bdcSMax Filippov         tcg_gen_mov_i32(arg[0].out, arg[1].in);
6659cfa9f051SMax Filippov     } else {
6660cfa9f051SMax Filippov         tcg_gen_ext_i32_i64(arg[0].out, arg[1].in);
6661cfa9f051SMax Filippov     }
6662c04e1692SMax Filippov }
6663c04e1692SMax Filippov 
6664ff35a7d1SMax Filippov static void translate_wur_fpu2k_fcr(DisasContext *dc, const OpcodeArg arg[],
6665ff35a7d1SMax Filippov                                     const uint32_t par[])
6666ff35a7d1SMax Filippov {
6667ff35a7d1SMax Filippov     gen_helper_wur_fpu2k_fcr(cpu_env, arg[0].in);
6668ff35a7d1SMax Filippov }
6669ff35a7d1SMax Filippov 
6670ff35a7d1SMax Filippov static void translate_wur_fpu2k_fsr(DisasContext *dc, const OpcodeArg arg[],
6671ff35a7d1SMax Filippov                                     const uint32_t par[])
6672ff35a7d1SMax Filippov {
6673ff35a7d1SMax Filippov     tcg_gen_andi_i32(cpu_UR[par[0]], arg[0].in, 0xffffff80);
6674ff35a7d1SMax Filippov }
6675ff35a7d1SMax Filippov 
6676c04e1692SMax Filippov static const XtensaOpcodeOps fpu2000_ops[] = {
6677c04e1692SMax Filippov     {
6678c04e1692SMax Filippov         .name = "abs.s",
6679c04e1692SMax Filippov         .translate = translate_abs_s,
6680582fef0fSMax Filippov         .coprocessor = 0x1,
6681c04e1692SMax Filippov     }, {
6682c04e1692SMax Filippov         .name = "add.s",
66835680f207SMax Filippov         .translate = translate_fpu2k_add_s,
6684582fef0fSMax Filippov         .coprocessor = 0x1,
6685c04e1692SMax Filippov     }, {
6686c04e1692SMax Filippov         .name = "ceil.s",
6687c04e1692SMax Filippov         .translate = translate_ftoi_s,
6688c04e1692SMax Filippov         .par = (const uint32_t[]){float_round_up, false},
6689582fef0fSMax Filippov         .coprocessor = 0x1,
6690c04e1692SMax Filippov     }, {
6691c04e1692SMax Filippov         .name = "float.s",
6692c04e1692SMax Filippov         .translate = translate_float_s,
6693c04e1692SMax Filippov         .par = (const uint32_t[]){false},
6694582fef0fSMax Filippov         .coprocessor = 0x1,
6695c04e1692SMax Filippov     }, {
6696c04e1692SMax Filippov         .name = "floor.s",
6697c04e1692SMax Filippov         .translate = translate_ftoi_s,
6698c04e1692SMax Filippov         .par = (const uint32_t[]){float_round_down, false},
6699582fef0fSMax Filippov         .coprocessor = 0x1,
6700c04e1692SMax Filippov     }, {
6701c04e1692SMax Filippov         .name = "lsi",
6702c04e1692SMax Filippov         .translate = translate_ldsti,
6703c04e1692SMax Filippov         .par = (const uint32_t[]){false, false},
6704068e538aSMax Filippov         .op_flags = XTENSA_OP_LOAD,
6705582fef0fSMax Filippov         .coprocessor = 0x1,
6706c04e1692SMax Filippov     }, {
6707c04e1692SMax Filippov         .name = "lsiu",
6708c04e1692SMax Filippov         .translate = translate_ldsti,
6709c04e1692SMax Filippov         .par = (const uint32_t[]){false, true},
6710068e538aSMax Filippov         .op_flags = XTENSA_OP_LOAD,
6711582fef0fSMax Filippov         .coprocessor = 0x1,
6712c04e1692SMax Filippov     }, {
6713c04e1692SMax Filippov         .name = "lsx",
6714c04e1692SMax Filippov         .translate = translate_ldstx,
6715c04e1692SMax Filippov         .par = (const uint32_t[]){false, false},
6716068e538aSMax Filippov         .op_flags = XTENSA_OP_LOAD,
6717582fef0fSMax Filippov         .coprocessor = 0x1,
6718c04e1692SMax Filippov     }, {
6719c04e1692SMax Filippov         .name = "lsxu",
6720c04e1692SMax Filippov         .translate = translate_ldstx,
6721c04e1692SMax Filippov         .par = (const uint32_t[]){false, true},
6722068e538aSMax Filippov         .op_flags = XTENSA_OP_LOAD,
6723582fef0fSMax Filippov         .coprocessor = 0x1,
6724c04e1692SMax Filippov     }, {
6725c04e1692SMax Filippov         .name = "madd.s",
67265680f207SMax Filippov         .translate = translate_fpu2k_madd_s,
6727582fef0fSMax Filippov         .coprocessor = 0x1,
6728c04e1692SMax Filippov     }, {
6729c04e1692SMax Filippov         .name = "mov.s",
6730c04e1692SMax Filippov         .translate = translate_mov_s,
6731582fef0fSMax Filippov         .coprocessor = 0x1,
6732c04e1692SMax Filippov     }, {
6733c04e1692SMax Filippov         .name = "moveqz.s",
6734c04e1692SMax Filippov         .translate = translate_movcond_s,
6735c04e1692SMax Filippov         .par = (const uint32_t[]){TCG_COND_EQ},
6736582fef0fSMax Filippov         .coprocessor = 0x1,
6737c04e1692SMax Filippov     }, {
6738c04e1692SMax Filippov         .name = "movf.s",
6739c04e1692SMax Filippov         .translate = translate_movp_s,
6740c04e1692SMax Filippov         .par = (const uint32_t[]){TCG_COND_EQ},
6741582fef0fSMax Filippov         .coprocessor = 0x1,
6742c04e1692SMax Filippov     }, {
6743c04e1692SMax Filippov         .name = "movgez.s",
6744c04e1692SMax Filippov         .translate = translate_movcond_s,
6745c04e1692SMax Filippov         .par = (const uint32_t[]){TCG_COND_GE},
6746582fef0fSMax Filippov         .coprocessor = 0x1,
6747c04e1692SMax Filippov     }, {
6748c04e1692SMax Filippov         .name = "movltz.s",
6749c04e1692SMax Filippov         .translate = translate_movcond_s,
6750c04e1692SMax Filippov         .par = (const uint32_t[]){TCG_COND_LT},
6751582fef0fSMax Filippov         .coprocessor = 0x1,
6752c04e1692SMax Filippov     }, {
6753c04e1692SMax Filippov         .name = "movnez.s",
6754c04e1692SMax Filippov         .translate = translate_movcond_s,
6755c04e1692SMax Filippov         .par = (const uint32_t[]){TCG_COND_NE},
6756582fef0fSMax Filippov         .coprocessor = 0x1,
6757c04e1692SMax Filippov     }, {
6758c04e1692SMax Filippov         .name = "movt.s",
6759c04e1692SMax Filippov         .translate = translate_movp_s,
6760c04e1692SMax Filippov         .par = (const uint32_t[]){TCG_COND_NE},
6761582fef0fSMax Filippov         .coprocessor = 0x1,
6762c04e1692SMax Filippov     }, {
6763c04e1692SMax Filippov         .name = "msub.s",
67645680f207SMax Filippov         .translate = translate_fpu2k_msub_s,
6765582fef0fSMax Filippov         .coprocessor = 0x1,
6766c04e1692SMax Filippov     }, {
6767c04e1692SMax Filippov         .name = "mul.s",
67685680f207SMax Filippov         .translate = translate_fpu2k_mul_s,
6769582fef0fSMax Filippov         .coprocessor = 0x1,
6770c04e1692SMax Filippov     }, {
6771c04e1692SMax Filippov         .name = "neg.s",
6772c04e1692SMax Filippov         .translate = translate_neg_s,
6773582fef0fSMax Filippov         .coprocessor = 0x1,
6774c04e1692SMax Filippov     }, {
6775c04e1692SMax Filippov         .name = "oeq.s",
6776c04e1692SMax Filippov         .translate = translate_compare_s,
6777c04e1692SMax Filippov         .par = (const uint32_t[]){COMPARE_OEQ},
6778582fef0fSMax Filippov         .coprocessor = 0x1,
6779c04e1692SMax Filippov     }, {
6780c04e1692SMax Filippov         .name = "ole.s",
6781c04e1692SMax Filippov         .translate = translate_compare_s,
6782c04e1692SMax Filippov         .par = (const uint32_t[]){COMPARE_OLE},
6783582fef0fSMax Filippov         .coprocessor = 0x1,
6784c04e1692SMax Filippov     }, {
6785c04e1692SMax Filippov         .name = "olt.s",
6786c04e1692SMax Filippov         .translate = translate_compare_s,
6787c04e1692SMax Filippov         .par = (const uint32_t[]){COMPARE_OLT},
6788582fef0fSMax Filippov         .coprocessor = 0x1,
6789c04e1692SMax Filippov     }, {
6790e8e05fd4SMax Filippov         .name = "rfr",
6791c04e1692SMax Filippov         .translate = translate_rfr_s,
6792582fef0fSMax Filippov         .coprocessor = 0x1,
6793c04e1692SMax Filippov     }, {
6794c04e1692SMax Filippov         .name = "round.s",
6795c04e1692SMax Filippov         .translate = translate_ftoi_s,
6796c04e1692SMax Filippov         .par = (const uint32_t[]){float_round_nearest_even, false},
6797582fef0fSMax Filippov         .coprocessor = 0x1,
6798c04e1692SMax Filippov     }, {
6799ff35a7d1SMax Filippov         .name = "rur.fcr",
6800ff35a7d1SMax Filippov         .translate = translate_rur,
6801ff35a7d1SMax Filippov         .par = (const uint32_t[]){FCR},
6802ff35a7d1SMax Filippov         .coprocessor = 0x1,
6803ff35a7d1SMax Filippov     }, {
6804ff35a7d1SMax Filippov         .name = "rur.fsr",
6805ff35a7d1SMax Filippov         .translate = translate_rur,
6806ff35a7d1SMax Filippov         .par = (const uint32_t[]){FSR},
6807ff35a7d1SMax Filippov         .coprocessor = 0x1,
6808ff35a7d1SMax Filippov     }, {
6809c04e1692SMax Filippov         .name = "ssi",
6810c04e1692SMax Filippov         .translate = translate_ldsti,
6811c04e1692SMax Filippov         .par = (const uint32_t[]){true, false},
6812068e538aSMax Filippov         .op_flags = XTENSA_OP_STORE,
6813582fef0fSMax Filippov         .coprocessor = 0x1,
6814c04e1692SMax Filippov     }, {
6815c04e1692SMax Filippov         .name = "ssiu",
6816c04e1692SMax Filippov         .translate = translate_ldsti,
6817c04e1692SMax Filippov         .par = (const uint32_t[]){true, true},
6818068e538aSMax Filippov         .op_flags = XTENSA_OP_STORE,
6819582fef0fSMax Filippov         .coprocessor = 0x1,
6820c04e1692SMax Filippov     }, {
6821c04e1692SMax Filippov         .name = "ssx",
6822c04e1692SMax Filippov         .translate = translate_ldstx,
6823c04e1692SMax Filippov         .par = (const uint32_t[]){true, false},
6824068e538aSMax Filippov         .op_flags = XTENSA_OP_STORE,
6825582fef0fSMax Filippov         .coprocessor = 0x1,
6826c04e1692SMax Filippov     }, {
6827c04e1692SMax Filippov         .name = "ssxu",
6828c04e1692SMax Filippov         .translate = translate_ldstx,
6829c04e1692SMax Filippov         .par = (const uint32_t[]){true, true},
6830068e538aSMax Filippov         .op_flags = XTENSA_OP_STORE,
6831582fef0fSMax Filippov         .coprocessor = 0x1,
6832c04e1692SMax Filippov     }, {
6833c04e1692SMax Filippov         .name = "sub.s",
68345680f207SMax Filippov         .translate = translate_fpu2k_sub_s,
6835582fef0fSMax Filippov         .coprocessor = 0x1,
6836c04e1692SMax Filippov     }, {
6837c04e1692SMax Filippov         .name = "trunc.s",
6838c04e1692SMax Filippov         .translate = translate_ftoi_s,
6839c04e1692SMax Filippov         .par = (const uint32_t[]){float_round_to_zero, false},
6840582fef0fSMax Filippov         .coprocessor = 0x1,
6841c04e1692SMax Filippov     }, {
6842c04e1692SMax Filippov         .name = "ueq.s",
6843c04e1692SMax Filippov         .translate = translate_compare_s,
6844c04e1692SMax Filippov         .par = (const uint32_t[]){COMPARE_UEQ},
6845582fef0fSMax Filippov         .coprocessor = 0x1,
6846c04e1692SMax Filippov     }, {
6847c04e1692SMax Filippov         .name = "ufloat.s",
6848c04e1692SMax Filippov         .translate = translate_float_s,
6849c04e1692SMax Filippov         .par = (const uint32_t[]){true},
6850582fef0fSMax Filippov         .coprocessor = 0x1,
6851c04e1692SMax Filippov     }, {
6852c04e1692SMax Filippov         .name = "ule.s",
6853c04e1692SMax Filippov         .translate = translate_compare_s,
6854c04e1692SMax Filippov         .par = (const uint32_t[]){COMPARE_ULE},
6855582fef0fSMax Filippov         .coprocessor = 0x1,
6856c04e1692SMax Filippov     }, {
6857c04e1692SMax Filippov         .name = "ult.s",
6858c04e1692SMax Filippov         .translate = translate_compare_s,
6859c04e1692SMax Filippov         .par = (const uint32_t[]){COMPARE_ULT},
6860582fef0fSMax Filippov         .coprocessor = 0x1,
6861c04e1692SMax Filippov     }, {
6862c04e1692SMax Filippov         .name = "un.s",
6863c04e1692SMax Filippov         .translate = translate_compare_s,
6864c04e1692SMax Filippov         .par = (const uint32_t[]){COMPARE_UN},
6865582fef0fSMax Filippov         .coprocessor = 0x1,
6866c04e1692SMax Filippov     }, {
6867c04e1692SMax Filippov         .name = "utrunc.s",
6868c04e1692SMax Filippov         .translate = translate_ftoi_s,
6869c04e1692SMax Filippov         .par = (const uint32_t[]){float_round_to_zero, true},
6870582fef0fSMax Filippov         .coprocessor = 0x1,
6871c04e1692SMax Filippov     }, {
6872e8e05fd4SMax Filippov         .name = "wfr",
6873c04e1692SMax Filippov         .translate = translate_wfr_s,
6874582fef0fSMax Filippov         .coprocessor = 0x1,
6875ff35a7d1SMax Filippov     }, {
6876ff35a7d1SMax Filippov         .name = "wur.fcr",
6877ff35a7d1SMax Filippov         .translate = translate_wur_fpu2k_fcr,
6878ff35a7d1SMax Filippov         .par = (const uint32_t[]){FCR},
6879ff35a7d1SMax Filippov         .coprocessor = 0x1,
6880ff35a7d1SMax Filippov     }, {
6881ff35a7d1SMax Filippov         .name = "wur.fsr",
6882ff35a7d1SMax Filippov         .translate = translate_wur_fpu2k_fsr,
6883ff35a7d1SMax Filippov         .par = (const uint32_t[]){FSR},
6884ff35a7d1SMax Filippov         .coprocessor = 0x1,
6885c04e1692SMax Filippov     },
6886c04e1692SMax Filippov };
6887c04e1692SMax Filippov 
6888c04e1692SMax Filippov const XtensaOpcodeTranslators xtensa_fpu2000_opcodes = {
6889c04e1692SMax Filippov     .num_opcodes = ARRAY_SIZE(fpu2000_ops),
6890c04e1692SMax Filippov     .opcode = fpu2000_ops,
6891c04e1692SMax Filippov };
6892cfa9f051SMax Filippov 
6893cfa9f051SMax Filippov static void translate_add_d(DisasContext *dc, const OpcodeArg arg[],
6894cfa9f051SMax Filippov                             const uint32_t par[])
6895cfa9f051SMax Filippov {
6896cfa9f051SMax Filippov     gen_helper_add_d(arg[0].out, cpu_env, arg[1].in, arg[2].in);
6897cfa9f051SMax Filippov }
6898cfa9f051SMax Filippov 
6899cfa9f051SMax Filippov static void translate_add_s(DisasContext *dc, const OpcodeArg arg[],
6900cfa9f051SMax Filippov                                 const uint32_t par[])
6901cfa9f051SMax Filippov {
6902cfa9f051SMax Filippov     if (option_enabled(dc, XTENSA_OPTION_DFPU_SINGLE_ONLY)) {
6903cfa9f051SMax Filippov         gen_helper_fpu2k_add_s(arg[0].out, cpu_env,
6904cfa9f051SMax Filippov                                arg[1].in, arg[2].in);
6905cfa9f051SMax Filippov     } else {
6906cfa9f051SMax Filippov         OpcodeArg arg32[3];
6907cfa9f051SMax Filippov 
6908cfa9f051SMax Filippov         get_f32_o1_i2(arg, arg32, 0, 1, 2);
6909cfa9f051SMax Filippov         gen_helper_add_s(arg32[0].out, cpu_env, arg32[1].in, arg32[2].in);
6910cfa9f051SMax Filippov         put_f32_o1_i2(arg, arg32, 0, 1, 2);
6911cfa9f051SMax Filippov     }
6912cfa9f051SMax Filippov }
6913cfa9f051SMax Filippov 
6914cfa9f051SMax Filippov static void translate_cvtd_s(DisasContext *dc, const OpcodeArg arg[],
6915cfa9f051SMax Filippov                              const uint32_t par[])
6916cfa9f051SMax Filippov {
6917cfa9f051SMax Filippov     TCGv_i32 v = tcg_temp_new_i32();
6918cfa9f051SMax Filippov 
6919cfa9f051SMax Filippov     tcg_gen_extrl_i64_i32(v, arg[1].in);
6920cfa9f051SMax Filippov     gen_helper_cvtd_s(arg[0].out, cpu_env, v);
6921cfa9f051SMax Filippov }
6922cfa9f051SMax Filippov 
6923cfa9f051SMax Filippov static void translate_cvts_d(DisasContext *dc, const OpcodeArg arg[],
6924cfa9f051SMax Filippov                              const uint32_t par[])
6925cfa9f051SMax Filippov {
6926cfa9f051SMax Filippov     TCGv_i32 v = tcg_temp_new_i32();
6927cfa9f051SMax Filippov 
6928cfa9f051SMax Filippov     gen_helper_cvts_d(v, cpu_env, arg[1].in);
6929cfa9f051SMax Filippov     tcg_gen_extu_i32_i64(arg[0].out, v);
6930cfa9f051SMax Filippov }
6931cfa9f051SMax Filippov 
6932cfa9f051SMax Filippov static void translate_ldsti_d(DisasContext *dc, const OpcodeArg arg[],
6933cfa9f051SMax Filippov                               const uint32_t par[])
6934cfa9f051SMax Filippov {
6935cfa9f051SMax Filippov     TCGv_i32 addr;
6936583e6a5fSMax Filippov     MemOp mop;
6937cfa9f051SMax Filippov 
6938cfa9f051SMax Filippov     if (par[1]) {
6939cfa9f051SMax Filippov         addr = tcg_temp_new_i32();
6940cfa9f051SMax Filippov         tcg_gen_addi_i32(addr, arg[1].in, arg[2].imm);
6941cfa9f051SMax Filippov     } else {
6942cfa9f051SMax Filippov         addr = arg[1].in;
6943cfa9f051SMax Filippov     }
6944fc313c64SFrédéric Pétrot     mop = gen_load_store_alignment(dc, MO_TEUQ, addr);
6945cfa9f051SMax Filippov     if (par[0]) {
6946583e6a5fSMax Filippov         tcg_gen_qemu_st_i64(arg[0].in, addr, dc->cring, mop);
6947cfa9f051SMax Filippov     } else {
6948583e6a5fSMax Filippov         tcg_gen_qemu_ld_i64(arg[0].out, addr, dc->cring, mop);
6949cfa9f051SMax Filippov     }
6950cfa9f051SMax Filippov     if (par[2]) {
6951cfa9f051SMax Filippov         if (par[1]) {
6952cfa9f051SMax Filippov             tcg_gen_mov_i32(arg[1].out, addr);
6953cfa9f051SMax Filippov         } else {
6954cfa9f051SMax Filippov             tcg_gen_addi_i32(arg[1].out, arg[1].in, arg[2].imm);
6955cfa9f051SMax Filippov         }
6956cfa9f051SMax Filippov     }
6957cfa9f051SMax Filippov }
6958cfa9f051SMax Filippov 
6959cfa9f051SMax Filippov static void translate_ldsti_s(DisasContext *dc, const OpcodeArg arg[],
6960cfa9f051SMax Filippov                               const uint32_t par[])
6961cfa9f051SMax Filippov {
6962cfa9f051SMax Filippov     TCGv_i32 addr;
6963cfa9f051SMax Filippov     OpcodeArg arg32[1];
6964583e6a5fSMax Filippov     MemOp mop;
6965cfa9f051SMax Filippov 
6966cfa9f051SMax Filippov     if (par[1]) {
6967cfa9f051SMax Filippov         addr = tcg_temp_new_i32();
6968cfa9f051SMax Filippov         tcg_gen_addi_i32(addr, arg[1].in, arg[2].imm);
6969cfa9f051SMax Filippov     } else {
6970cfa9f051SMax Filippov         addr = arg[1].in;
6971cfa9f051SMax Filippov     }
6972583e6a5fSMax Filippov     mop = gen_load_store_alignment(dc, MO_TEUL, addr);
6973cfa9f051SMax Filippov     if (par[0]) {
6974cfa9f051SMax Filippov         get_f32_i1(arg, arg32, 0);
6975583e6a5fSMax Filippov         tcg_gen_qemu_st_tl(arg32[0].in, addr, dc->cring, mop);
6976cfa9f051SMax Filippov         put_f32_i1(arg, arg32, 0);
6977cfa9f051SMax Filippov     } else {
6978cfa9f051SMax Filippov         get_f32_o1(arg, arg32, 0);
6979583e6a5fSMax Filippov         tcg_gen_qemu_ld_tl(arg32[0].out, addr, dc->cring, mop);
6980cfa9f051SMax Filippov         put_f32_o1(arg, arg32, 0);
6981cfa9f051SMax Filippov     }
6982cfa9f051SMax Filippov     if (par[2]) {
6983cfa9f051SMax Filippov         if (par[1]) {
6984cfa9f051SMax Filippov             tcg_gen_mov_i32(arg[1].out, addr);
6985cfa9f051SMax Filippov         } else {
6986cfa9f051SMax Filippov             tcg_gen_addi_i32(arg[1].out, arg[1].in, arg[2].imm);
6987cfa9f051SMax Filippov         }
6988cfa9f051SMax Filippov     }
6989cfa9f051SMax Filippov }
6990cfa9f051SMax Filippov 
6991cfa9f051SMax Filippov static void translate_ldstx_d(DisasContext *dc, const OpcodeArg arg[],
6992cfa9f051SMax Filippov                               const uint32_t par[])
6993cfa9f051SMax Filippov {
6994cfa9f051SMax Filippov     TCGv_i32 addr;
6995583e6a5fSMax Filippov     MemOp mop;
6996cfa9f051SMax Filippov 
6997cfa9f051SMax Filippov     if (par[1]) {
6998cfa9f051SMax Filippov         addr = tcg_temp_new_i32();
6999cfa9f051SMax Filippov         tcg_gen_add_i32(addr, arg[1].in, arg[2].in);
7000cfa9f051SMax Filippov     } else {
7001cfa9f051SMax Filippov         addr = arg[1].in;
7002cfa9f051SMax Filippov     }
7003fc313c64SFrédéric Pétrot     mop = gen_load_store_alignment(dc, MO_TEUQ, addr);
7004cfa9f051SMax Filippov     if (par[0]) {
7005583e6a5fSMax Filippov         tcg_gen_qemu_st_i64(arg[0].in, addr, dc->cring, mop);
7006cfa9f051SMax Filippov     } else {
7007583e6a5fSMax Filippov         tcg_gen_qemu_ld_i64(arg[0].out, addr, dc->cring, mop);
7008cfa9f051SMax Filippov     }
7009cfa9f051SMax Filippov     if (par[2]) {
7010cfa9f051SMax Filippov         if (par[1]) {
7011cfa9f051SMax Filippov             tcg_gen_mov_i32(arg[1].out, addr);
7012cfa9f051SMax Filippov         } else {
7013cfa9f051SMax Filippov             tcg_gen_add_i32(arg[1].out, arg[1].in, arg[2].in);
7014cfa9f051SMax Filippov         }
7015cfa9f051SMax Filippov     }
7016cfa9f051SMax Filippov }
7017cfa9f051SMax Filippov 
7018cfa9f051SMax Filippov static void translate_ldstx_s(DisasContext *dc, const OpcodeArg arg[],
7019cfa9f051SMax Filippov                               const uint32_t par[])
7020cfa9f051SMax Filippov {
7021cfa9f051SMax Filippov     TCGv_i32 addr;
7022cfa9f051SMax Filippov     OpcodeArg arg32[1];
7023583e6a5fSMax Filippov     MemOp mop;
7024cfa9f051SMax Filippov 
7025cfa9f051SMax Filippov     if (par[1]) {
7026cfa9f051SMax Filippov         addr = tcg_temp_new_i32();
7027cfa9f051SMax Filippov         tcg_gen_add_i32(addr, arg[1].in, arg[2].in);
7028cfa9f051SMax Filippov     } else {
7029cfa9f051SMax Filippov         addr = arg[1].in;
7030cfa9f051SMax Filippov     }
7031583e6a5fSMax Filippov     mop = gen_load_store_alignment(dc, MO_TEUL, addr);
7032cfa9f051SMax Filippov     if (par[0]) {
7033cfa9f051SMax Filippov         get_f32_i1(arg, arg32, 0);
7034583e6a5fSMax Filippov         tcg_gen_qemu_st_tl(arg32[0].in, addr, dc->cring, mop);
7035cfa9f051SMax Filippov         put_f32_i1(arg, arg32, 0);
7036cfa9f051SMax Filippov     } else {
7037cfa9f051SMax Filippov         get_f32_o1(arg, arg32, 0);
7038583e6a5fSMax Filippov         tcg_gen_qemu_ld_tl(arg32[0].out, addr, dc->cring, mop);
7039cfa9f051SMax Filippov         put_f32_o1(arg, arg32, 0);
7040cfa9f051SMax Filippov     }
7041cfa9f051SMax Filippov     if (par[2]) {
7042cfa9f051SMax Filippov         if (par[1]) {
7043cfa9f051SMax Filippov             tcg_gen_mov_i32(arg[1].out, addr);
7044cfa9f051SMax Filippov         } else {
7045cfa9f051SMax Filippov             tcg_gen_add_i32(arg[1].out, arg[1].in, arg[2].in);
7046cfa9f051SMax Filippov         }
7047cfa9f051SMax Filippov     }
7048cfa9f051SMax Filippov }
7049cfa9f051SMax Filippov 
7050cfa9f051SMax Filippov static void translate_madd_d(DisasContext *dc, const OpcodeArg arg[],
7051cfa9f051SMax Filippov                              const uint32_t par[])
7052cfa9f051SMax Filippov {
7053cfa9f051SMax Filippov     gen_helper_madd_d(arg[0].out, cpu_env,
7054cfa9f051SMax Filippov                       arg[0].in, arg[1].in, arg[2].in);
7055cfa9f051SMax Filippov }
7056cfa9f051SMax Filippov 
7057cfa9f051SMax Filippov static void translate_madd_s(DisasContext *dc, const OpcodeArg arg[],
7058cfa9f051SMax Filippov                              const uint32_t par[])
7059cfa9f051SMax Filippov {
7060cfa9f051SMax Filippov     if (option_enabled(dc, XTENSA_OPTION_DFPU_SINGLE_ONLY)) {
7061cfa9f051SMax Filippov         gen_helper_fpu2k_madd_s(arg[0].out, cpu_env,
7062cfa9f051SMax Filippov                                 arg[0].in, arg[1].in, arg[2].in);
7063cfa9f051SMax Filippov     } else {
7064cfa9f051SMax Filippov         OpcodeArg arg32[3];
7065cfa9f051SMax Filippov 
7066cfa9f051SMax Filippov         get_f32_o1_i3(arg, arg32, 0, 0, 1, 2);
7067cfa9f051SMax Filippov         gen_helper_madd_s(arg32[0].out, cpu_env,
7068cfa9f051SMax Filippov                           arg32[0].in, arg32[1].in, arg32[2].in);
7069cfa9f051SMax Filippov         put_f32_o1_i3(arg, arg32, 0, 0, 1, 2);
7070cfa9f051SMax Filippov     }
7071cfa9f051SMax Filippov }
7072cfa9f051SMax Filippov 
7073cfa9f051SMax Filippov static void translate_mul_d(DisasContext *dc, const OpcodeArg arg[],
7074cfa9f051SMax Filippov                             const uint32_t par[])
7075cfa9f051SMax Filippov {
7076cfa9f051SMax Filippov     gen_helper_mul_d(arg[0].out, cpu_env, arg[1].in, arg[2].in);
7077cfa9f051SMax Filippov }
7078cfa9f051SMax Filippov 
7079cfa9f051SMax Filippov static void translate_mul_s(DisasContext *dc, const OpcodeArg arg[],
7080cfa9f051SMax Filippov                             const uint32_t par[])
7081cfa9f051SMax Filippov {
7082cfa9f051SMax Filippov     if (option_enabled(dc, XTENSA_OPTION_DFPU_SINGLE_ONLY)) {
7083cfa9f051SMax Filippov         gen_helper_fpu2k_mul_s(arg[0].out, cpu_env,
7084cfa9f051SMax Filippov                                arg[1].in, arg[2].in);
7085cfa9f051SMax Filippov     } else {
7086cfa9f051SMax Filippov         OpcodeArg arg32[3];
7087cfa9f051SMax Filippov 
7088cfa9f051SMax Filippov         get_f32_o1_i2(arg, arg32, 0, 1, 2);
7089cfa9f051SMax Filippov         gen_helper_mul_s(arg32[0].out, cpu_env, arg32[1].in, arg32[2].in);
7090cfa9f051SMax Filippov         put_f32_o1_i2(arg, arg32, 0, 1, 2);
7091cfa9f051SMax Filippov     }
7092cfa9f051SMax Filippov }
7093cfa9f051SMax Filippov 
7094cfa9f051SMax Filippov static void translate_msub_d(DisasContext *dc, const OpcodeArg arg[],
7095cfa9f051SMax Filippov                              const uint32_t par[])
7096cfa9f051SMax Filippov {
7097cfa9f051SMax Filippov     gen_helper_msub_d(arg[0].out, cpu_env,
7098cfa9f051SMax Filippov                       arg[0].in, arg[1].in, arg[2].in);
7099cfa9f051SMax Filippov }
7100cfa9f051SMax Filippov 
7101cfa9f051SMax Filippov static void translate_msub_s(DisasContext *dc, const OpcodeArg arg[],
7102cfa9f051SMax Filippov                              const uint32_t par[])
7103cfa9f051SMax Filippov {
7104cfa9f051SMax Filippov     if (option_enabled(dc, XTENSA_OPTION_DFPU_SINGLE_ONLY)) {
7105cfa9f051SMax Filippov         gen_helper_fpu2k_msub_s(arg[0].out, cpu_env,
7106cfa9f051SMax Filippov                                 arg[0].in, arg[1].in, arg[2].in);
7107cfa9f051SMax Filippov     } else {
7108cfa9f051SMax Filippov         OpcodeArg arg32[3];
7109cfa9f051SMax Filippov 
7110cfa9f051SMax Filippov         get_f32_o1_i3(arg, arg32, 0, 0, 1, 2);
7111cfa9f051SMax Filippov         gen_helper_msub_s(arg32[0].out, cpu_env,
7112cfa9f051SMax Filippov                           arg32[0].in, arg32[1].in, arg32[2].in);
7113cfa9f051SMax Filippov         put_f32_o1_i3(arg, arg32, 0, 0, 1, 2);
7114cfa9f051SMax Filippov     }
7115cfa9f051SMax Filippov }
7116cfa9f051SMax Filippov 
7117cfa9f051SMax Filippov static void translate_sub_d(DisasContext *dc, const OpcodeArg arg[],
7118cfa9f051SMax Filippov                             const uint32_t par[])
7119cfa9f051SMax Filippov {
7120cfa9f051SMax Filippov     gen_helper_sub_d(arg[0].out, cpu_env, arg[1].in, arg[2].in);
7121cfa9f051SMax Filippov }
7122cfa9f051SMax Filippov 
7123cfa9f051SMax Filippov static void translate_sub_s(DisasContext *dc, const OpcodeArg arg[],
7124cfa9f051SMax Filippov                             const uint32_t par[])
7125cfa9f051SMax Filippov {
7126cfa9f051SMax Filippov     if (option_enabled(dc, XTENSA_OPTION_DFPU_SINGLE_ONLY)) {
7127cfa9f051SMax Filippov         gen_helper_fpu2k_sub_s(arg[0].out, cpu_env,
7128cfa9f051SMax Filippov                                arg[1].in, arg[2].in);
7129cfa9f051SMax Filippov     } else {
7130cfa9f051SMax Filippov         OpcodeArg arg32[3];
7131cfa9f051SMax Filippov 
7132cfa9f051SMax Filippov         get_f32_o1_i2(arg, arg32, 0, 1, 2);
7133cfa9f051SMax Filippov         gen_helper_sub_s(arg32[0].out, cpu_env, arg32[1].in, arg32[2].in);
7134cfa9f051SMax Filippov         put_f32_o1_i2(arg, arg32, 0, 1, 2);
7135cfa9f051SMax Filippov     }
7136cfa9f051SMax Filippov }
7137cfa9f051SMax Filippov 
7138f8c61370SMax Filippov static void translate_mkdadj_d(DisasContext *dc, const OpcodeArg arg[],
7139f8c61370SMax Filippov                                const uint32_t par[])
7140f8c61370SMax Filippov {
7141f8c61370SMax Filippov     gen_helper_mkdadj_d(arg[0].out, cpu_env, arg[0].in, arg[1].in);
7142f8c61370SMax Filippov }
7143f8c61370SMax Filippov 
7144f8c61370SMax Filippov static void translate_mkdadj_s(DisasContext *dc, const OpcodeArg arg[],
7145f8c61370SMax Filippov                                const uint32_t par[])
7146f8c61370SMax Filippov {
7147f8c61370SMax Filippov     OpcodeArg arg32[2];
7148f8c61370SMax Filippov 
7149f8c61370SMax Filippov     get_f32_o1_i2(arg, arg32, 0, 0, 1);
7150f8c61370SMax Filippov     gen_helper_mkdadj_s(arg32[0].out, cpu_env, arg32[0].in, arg32[1].in);
7151f8c61370SMax Filippov     put_f32_o1_i2(arg, arg32, 0, 0, 1);
7152f8c61370SMax Filippov }
7153f8c61370SMax Filippov 
7154f8c61370SMax Filippov static void translate_mksadj_d(DisasContext *dc, const OpcodeArg arg[],
7155f8c61370SMax Filippov                                const uint32_t par[])
7156f8c61370SMax Filippov {
7157f8c61370SMax Filippov     gen_helper_mksadj_d(arg[0].out, cpu_env, arg[1].in);
7158f8c61370SMax Filippov }
7159f8c61370SMax Filippov 
7160f8c61370SMax Filippov static void translate_mksadj_s(DisasContext *dc, const OpcodeArg arg[],
7161f8c61370SMax Filippov                                const uint32_t par[])
7162f8c61370SMax Filippov {
7163f8c61370SMax Filippov     OpcodeArg arg32[2];
7164f8c61370SMax Filippov 
7165f8c61370SMax Filippov     get_f32_o1_i1(arg, arg32, 0, 1);
7166f8c61370SMax Filippov     gen_helper_mksadj_s(arg32[0].out, cpu_env, arg32[1].in);
7167f8c61370SMax Filippov     put_f32_o1_i1(arg, arg32, 0, 1);
7168f8c61370SMax Filippov }
7169f8c61370SMax Filippov 
7170cfa9f051SMax Filippov static void translate_wur_fpu_fcr(DisasContext *dc, const OpcodeArg arg[],
7171cfa9f051SMax Filippov                                   const uint32_t par[])
7172cfa9f051SMax Filippov {
7173cfa9f051SMax Filippov     gen_helper_wur_fpu_fcr(cpu_env, arg[0].in);
7174cfa9f051SMax Filippov }
7175cfa9f051SMax Filippov 
7176cfa9f051SMax Filippov static void translate_rur_fpu_fsr(DisasContext *dc, const OpcodeArg arg[],
7177cfa9f051SMax Filippov                                   const uint32_t par[])
7178cfa9f051SMax Filippov {
7179cfa9f051SMax Filippov     gen_helper_rur_fpu_fsr(arg[0].out, cpu_env);
7180cfa9f051SMax Filippov }
7181cfa9f051SMax Filippov 
7182cfa9f051SMax Filippov static void translate_wur_fpu_fsr(DisasContext *dc, const OpcodeArg arg[],
7183cfa9f051SMax Filippov                                   const uint32_t par[])
7184cfa9f051SMax Filippov {
7185cfa9f051SMax Filippov     gen_helper_wur_fpu_fsr(cpu_env, arg[0].in);
7186cfa9f051SMax Filippov }
7187cfa9f051SMax Filippov 
7188cfa9f051SMax Filippov static const XtensaOpcodeOps fpu_ops[] = {
7189cfa9f051SMax Filippov     {
7190cfa9f051SMax Filippov         .name = "abs.d",
7191cfa9f051SMax Filippov         .translate = translate_abs_d,
7192cfa9f051SMax Filippov         .coprocessor = 0x1,
7193cfa9f051SMax Filippov     }, {
7194cfa9f051SMax Filippov         .name = "abs.s",
7195cfa9f051SMax Filippov         .translate = translate_abs_s,
7196cfa9f051SMax Filippov         .coprocessor = 0x1,
7197cfa9f051SMax Filippov     }, {
7198cfa9f051SMax Filippov         .name = "add.d",
7199cfa9f051SMax Filippov         .translate = translate_add_d,
7200cfa9f051SMax Filippov         .coprocessor = 0x1,
7201cfa9f051SMax Filippov     }, {
7202cfa9f051SMax Filippov         .name = "add.s",
7203cfa9f051SMax Filippov         .translate = translate_add_s,
7204cfa9f051SMax Filippov         .coprocessor = 0x1,
7205cfa9f051SMax Filippov     }, {
7206f8c61370SMax Filippov         .name = "addexp.d",
7207f8c61370SMax Filippov         .translate = translate_nop,
7208f8c61370SMax Filippov         .coprocessor = 0x1,
7209f8c61370SMax Filippov     }, {
7210f8c61370SMax Filippov         .name = "addexp.s",
7211f8c61370SMax Filippov         .translate = translate_nop,
7212f8c61370SMax Filippov         .coprocessor = 0x1,
7213f8c61370SMax Filippov     }, {
7214f8c61370SMax Filippov         .name = "addexpm.d",
7215f8c61370SMax Filippov         .translate = translate_mov_s,
7216f8c61370SMax Filippov         .coprocessor = 0x1,
7217f8c61370SMax Filippov     }, {
7218f8c61370SMax Filippov         .name = "addexpm.s",
7219f8c61370SMax Filippov         .translate = translate_mov_s,
7220f8c61370SMax Filippov         .coprocessor = 0x1,
7221f8c61370SMax Filippov     }, {
7222cfa9f051SMax Filippov         .name = "ceil.d",
7223cfa9f051SMax Filippov         .translate = translate_ftoi_d,
7224cfa9f051SMax Filippov         .par = (const uint32_t[]){float_round_up, false},
7225cfa9f051SMax Filippov         .coprocessor = 0x1,
7226cfa9f051SMax Filippov     }, {
7227cfa9f051SMax Filippov         .name = "ceil.s",
7228cfa9f051SMax Filippov         .translate = translate_ftoi_s,
7229cfa9f051SMax Filippov         .par = (const uint32_t[]){float_round_up, false},
7230cfa9f051SMax Filippov         .coprocessor = 0x1,
7231cfa9f051SMax Filippov     }, {
7232cfa9f051SMax Filippov         .name = "const.d",
7233cfa9f051SMax Filippov         .translate = translate_const_d,
7234cfa9f051SMax Filippov         .coprocessor = 0x1,
7235cfa9f051SMax Filippov     }, {
7236cfa9f051SMax Filippov         .name = "const.s",
7237cfa9f051SMax Filippov         .translate = translate_const_s,
7238cfa9f051SMax Filippov         .coprocessor = 0x1,
7239cfa9f051SMax Filippov     }, {
7240cfa9f051SMax Filippov         .name = "cvtd.s",
7241cfa9f051SMax Filippov         .translate = translate_cvtd_s,
7242cfa9f051SMax Filippov         .coprocessor = 0x1,
7243cfa9f051SMax Filippov     }, {
7244cfa9f051SMax Filippov         .name = "cvts.d",
7245cfa9f051SMax Filippov         .translate = translate_cvts_d,
7246cfa9f051SMax Filippov         .coprocessor = 0x1,
7247cfa9f051SMax Filippov     }, {
7248f8c61370SMax Filippov         .name = "div0.d",
7249f8c61370SMax Filippov         .translate = translate_nop,
7250f8c61370SMax Filippov         .coprocessor = 0x1,
7251f8c61370SMax Filippov     }, {
7252f8c61370SMax Filippov         .name = "div0.s",
7253f8c61370SMax Filippov         .translate = translate_nop,
7254f8c61370SMax Filippov         .coprocessor = 0x1,
7255f8c61370SMax Filippov     }, {
7256f8c61370SMax Filippov         .name = "divn.d",
7257f8c61370SMax Filippov         .translate = translate_nop,
7258f8c61370SMax Filippov         .coprocessor = 0x1,
7259f8c61370SMax Filippov     }, {
7260f8c61370SMax Filippov         .name = "divn.s",
7261f8c61370SMax Filippov         .translate = translate_nop,
7262f8c61370SMax Filippov         .coprocessor = 0x1,
7263f8c61370SMax Filippov     }, {
7264cfa9f051SMax Filippov         .name = "float.d",
7265cfa9f051SMax Filippov         .translate = translate_float_d,
7266cfa9f051SMax Filippov         .par = (const uint32_t[]){false},
7267cfa9f051SMax Filippov         .coprocessor = 0x1,
7268cfa9f051SMax Filippov     }, {
7269cfa9f051SMax Filippov         .name = "float.s",
7270cfa9f051SMax Filippov         .translate = translate_float_s,
7271cfa9f051SMax Filippov         .par = (const uint32_t[]){false},
7272cfa9f051SMax Filippov         .coprocessor = 0x1,
7273cfa9f051SMax Filippov     }, {
7274cfa9f051SMax Filippov         .name = "floor.d",
7275cfa9f051SMax Filippov         .translate = translate_ftoi_d,
7276cfa9f051SMax Filippov         .par = (const uint32_t[]){float_round_down, false},
7277cfa9f051SMax Filippov         .coprocessor = 0x1,
7278cfa9f051SMax Filippov     }, {
7279cfa9f051SMax Filippov         .name = "floor.s",
7280cfa9f051SMax Filippov         .translate = translate_ftoi_s,
7281cfa9f051SMax Filippov         .par = (const uint32_t[]){float_round_down, false},
7282cfa9f051SMax Filippov         .coprocessor = 0x1,
7283cfa9f051SMax Filippov     }, {
7284cfa9f051SMax Filippov         .name = "ldi",
7285cfa9f051SMax Filippov         .translate = translate_ldsti_d,
7286cfa9f051SMax Filippov         .par = (const uint32_t[]){false, true, false},
7287cfa9f051SMax Filippov         .op_flags = XTENSA_OP_LOAD,
7288cfa9f051SMax Filippov         .coprocessor = 0x1,
7289cfa9f051SMax Filippov     }, {
7290cfa9f051SMax Filippov         .name = "ldip",
7291cfa9f051SMax Filippov         .translate = translate_ldsti_d,
7292cfa9f051SMax Filippov         .par = (const uint32_t[]){false, false, true},
7293cfa9f051SMax Filippov         .op_flags = XTENSA_OP_LOAD,
7294cfa9f051SMax Filippov         .coprocessor = 0x1,
7295cfa9f051SMax Filippov     }, {
7296cfa9f051SMax Filippov         .name = "ldiu",
7297cfa9f051SMax Filippov         .translate = translate_ldsti_d,
7298cfa9f051SMax Filippov         .par = (const uint32_t[]){false, true, true},
7299cfa9f051SMax Filippov         .op_flags = XTENSA_OP_LOAD,
7300cfa9f051SMax Filippov         .coprocessor = 0x1,
7301cfa9f051SMax Filippov     }, {
7302cfa9f051SMax Filippov         .name = "ldx",
7303cfa9f051SMax Filippov         .translate = translate_ldstx_d,
7304cfa9f051SMax Filippov         .par = (const uint32_t[]){false, true, false},
7305cfa9f051SMax Filippov         .op_flags = XTENSA_OP_LOAD,
7306cfa9f051SMax Filippov         .coprocessor = 0x1,
7307cfa9f051SMax Filippov     }, {
7308cfa9f051SMax Filippov         .name = "ldxp",
7309cfa9f051SMax Filippov         .translate = translate_ldstx_d,
7310cfa9f051SMax Filippov         .par = (const uint32_t[]){false, false, true},
7311cfa9f051SMax Filippov         .op_flags = XTENSA_OP_LOAD,
7312cfa9f051SMax Filippov         .coprocessor = 0x1,
7313cfa9f051SMax Filippov     }, {
7314cfa9f051SMax Filippov         .name = "ldxu",
7315cfa9f051SMax Filippov         .translate = translate_ldstx_d,
7316cfa9f051SMax Filippov         .par = (const uint32_t[]){false, true, true},
7317cfa9f051SMax Filippov         .op_flags = XTENSA_OP_LOAD,
7318cfa9f051SMax Filippov         .coprocessor = 0x1,
7319cfa9f051SMax Filippov     }, {
7320cfa9f051SMax Filippov         .name = "lsi",
7321cfa9f051SMax Filippov         .translate = translate_ldsti_s,
7322cfa9f051SMax Filippov         .par = (const uint32_t[]){false, true, false},
7323cfa9f051SMax Filippov         .op_flags = XTENSA_OP_LOAD,
7324cfa9f051SMax Filippov         .coprocessor = 0x1,
7325cfa9f051SMax Filippov     }, {
7326cfa9f051SMax Filippov         .name = "lsip",
7327cfa9f051SMax Filippov         .translate = translate_ldsti_s,
7328cfa9f051SMax Filippov         .par = (const uint32_t[]){false, false, true},
7329cfa9f051SMax Filippov         .op_flags = XTENSA_OP_LOAD,
7330cfa9f051SMax Filippov         .coprocessor = 0x1,
7331cfa9f051SMax Filippov     }, {
7332cfa9f051SMax Filippov         .name = "lsiu",
7333cfa9f051SMax Filippov         .translate = translate_ldsti_s,
7334cfa9f051SMax Filippov         .par = (const uint32_t[]){false, true, true},
7335cfa9f051SMax Filippov         .op_flags = XTENSA_OP_LOAD,
7336cfa9f051SMax Filippov         .coprocessor = 0x1,
7337cfa9f051SMax Filippov     }, {
7338cfa9f051SMax Filippov         .name = "lsx",
7339cfa9f051SMax Filippov         .translate = translate_ldstx_s,
7340cfa9f051SMax Filippov         .par = (const uint32_t[]){false, true, false},
7341cfa9f051SMax Filippov         .op_flags = XTENSA_OP_LOAD,
7342cfa9f051SMax Filippov         .coprocessor = 0x1,
7343cfa9f051SMax Filippov     }, {
7344cfa9f051SMax Filippov         .name = "lsxp",
7345cfa9f051SMax Filippov         .translate = translate_ldstx_s,
7346cfa9f051SMax Filippov         .par = (const uint32_t[]){false, false, true},
7347cfa9f051SMax Filippov         .op_flags = XTENSA_OP_LOAD,
7348cfa9f051SMax Filippov         .coprocessor = 0x1,
7349cfa9f051SMax Filippov     }, {
7350cfa9f051SMax Filippov         .name = "lsxu",
7351cfa9f051SMax Filippov         .translate = translate_ldstx_s,
7352cfa9f051SMax Filippov         .par = (const uint32_t[]){false, true, true},
7353cfa9f051SMax Filippov         .op_flags = XTENSA_OP_LOAD,
7354cfa9f051SMax Filippov         .coprocessor = 0x1,
7355cfa9f051SMax Filippov     }, {
7356cfa9f051SMax Filippov         .name = "madd.d",
7357cfa9f051SMax Filippov         .translate = translate_madd_d,
7358cfa9f051SMax Filippov         .coprocessor = 0x1,
7359cfa9f051SMax Filippov     }, {
7360cfa9f051SMax Filippov         .name = "madd.s",
7361cfa9f051SMax Filippov         .translate = translate_madd_s,
7362cfa9f051SMax Filippov         .coprocessor = 0x1,
7363cfa9f051SMax Filippov     }, {
7364f8c61370SMax Filippov         .name = "maddn.d",
7365f8c61370SMax Filippov         .translate = translate_nop,
7366f8c61370SMax Filippov         .coprocessor = 0x1,
7367f8c61370SMax Filippov     }, {
7368f8c61370SMax Filippov         .name = "maddn.s",
7369f8c61370SMax Filippov         .translate = translate_nop,
7370f8c61370SMax Filippov         .coprocessor = 0x1,
7371f8c61370SMax Filippov     }, {
7372f8c61370SMax Filippov         .name = "mkdadj.d",
7373f8c61370SMax Filippov         .translate = translate_mkdadj_d,
7374f8c61370SMax Filippov         .coprocessor = 0x1,
7375f8c61370SMax Filippov     }, {
7376f8c61370SMax Filippov         .name = "mkdadj.s",
7377f8c61370SMax Filippov         .translate = translate_mkdadj_s,
7378f8c61370SMax Filippov         .coprocessor = 0x1,
7379f8c61370SMax Filippov     }, {
7380f8c61370SMax Filippov         .name = "mksadj.d",
7381f8c61370SMax Filippov         .translate = translate_mksadj_d,
7382f8c61370SMax Filippov         .coprocessor = 0x1,
7383f8c61370SMax Filippov     }, {
7384f8c61370SMax Filippov         .name = "mksadj.s",
7385f8c61370SMax Filippov         .translate = translate_mksadj_s,
7386f8c61370SMax Filippov         .coprocessor = 0x1,
7387f8c61370SMax Filippov     }, {
7388cfa9f051SMax Filippov         .name = "mov.d",
7389cfa9f051SMax Filippov         .translate = translate_mov_d,
7390cfa9f051SMax Filippov         .coprocessor = 0x1,
7391cfa9f051SMax Filippov     }, {
7392cfa9f051SMax Filippov         .name = "mov.s",
7393cfa9f051SMax Filippov         .translate = translate_mov_s,
7394cfa9f051SMax Filippov         .coprocessor = 0x1,
7395cfa9f051SMax Filippov     }, {
7396cfa9f051SMax Filippov         .name = "moveqz.d",
7397cfa9f051SMax Filippov         .translate = translate_movcond_d,
7398cfa9f051SMax Filippov         .par = (const uint32_t[]){TCG_COND_EQ},
7399cfa9f051SMax Filippov         .coprocessor = 0x1,
7400cfa9f051SMax Filippov     }, {
7401cfa9f051SMax Filippov         .name = "moveqz.s",
7402cfa9f051SMax Filippov         .translate = translate_movcond_s,
7403cfa9f051SMax Filippov         .par = (const uint32_t[]){TCG_COND_EQ},
7404cfa9f051SMax Filippov         .coprocessor = 0x1,
7405cfa9f051SMax Filippov     }, {
7406cfa9f051SMax Filippov         .name = "movf.d",
7407cfa9f051SMax Filippov         .translate = translate_movp_d,
7408cfa9f051SMax Filippov         .par = (const uint32_t[]){TCG_COND_EQ},
7409cfa9f051SMax Filippov         .coprocessor = 0x1,
7410cfa9f051SMax Filippov     }, {
7411cfa9f051SMax Filippov         .name = "movf.s",
7412cfa9f051SMax Filippov         .translate = translate_movp_s,
7413cfa9f051SMax Filippov         .par = (const uint32_t[]){TCG_COND_EQ},
7414cfa9f051SMax Filippov         .coprocessor = 0x1,
7415cfa9f051SMax Filippov     }, {
7416cfa9f051SMax Filippov         .name = "movgez.d",
7417cfa9f051SMax Filippov         .translate = translate_movcond_d,
7418cfa9f051SMax Filippov         .par = (const uint32_t[]){TCG_COND_GE},
7419cfa9f051SMax Filippov         .coprocessor = 0x1,
7420cfa9f051SMax Filippov     }, {
7421cfa9f051SMax Filippov         .name = "movgez.s",
7422cfa9f051SMax Filippov         .translate = translate_movcond_s,
7423cfa9f051SMax Filippov         .par = (const uint32_t[]){TCG_COND_GE},
7424cfa9f051SMax Filippov         .coprocessor = 0x1,
7425cfa9f051SMax Filippov     }, {
7426cfa9f051SMax Filippov         .name = "movltz.d",
7427cfa9f051SMax Filippov         .translate = translate_movcond_d,
7428cfa9f051SMax Filippov         .par = (const uint32_t[]){TCG_COND_LT},
7429cfa9f051SMax Filippov         .coprocessor = 0x1,
7430cfa9f051SMax Filippov     }, {
7431cfa9f051SMax Filippov         .name = "movltz.s",
7432cfa9f051SMax Filippov         .translate = translate_movcond_s,
7433cfa9f051SMax Filippov         .par = (const uint32_t[]){TCG_COND_LT},
7434cfa9f051SMax Filippov         .coprocessor = 0x1,
7435cfa9f051SMax Filippov     }, {
7436cfa9f051SMax Filippov         .name = "movnez.d",
7437cfa9f051SMax Filippov         .translate = translate_movcond_d,
7438cfa9f051SMax Filippov         .par = (const uint32_t[]){TCG_COND_NE},
7439cfa9f051SMax Filippov         .coprocessor = 0x1,
7440cfa9f051SMax Filippov     }, {
7441cfa9f051SMax Filippov         .name = "movnez.s",
7442cfa9f051SMax Filippov         .translate = translate_movcond_s,
7443cfa9f051SMax Filippov         .par = (const uint32_t[]){TCG_COND_NE},
7444cfa9f051SMax Filippov         .coprocessor = 0x1,
7445cfa9f051SMax Filippov     }, {
7446cfa9f051SMax Filippov         .name = "movt.d",
7447cfa9f051SMax Filippov         .translate = translate_movp_d,
7448cfa9f051SMax Filippov         .par = (const uint32_t[]){TCG_COND_NE},
7449cfa9f051SMax Filippov         .coprocessor = 0x1,
7450cfa9f051SMax Filippov     }, {
7451cfa9f051SMax Filippov         .name = "movt.s",
7452cfa9f051SMax Filippov         .translate = translate_movp_s,
7453cfa9f051SMax Filippov         .par = (const uint32_t[]){TCG_COND_NE},
7454cfa9f051SMax Filippov         .coprocessor = 0x1,
7455cfa9f051SMax Filippov     }, {
7456cfa9f051SMax Filippov         .name = "msub.d",
7457cfa9f051SMax Filippov         .translate = translate_msub_d,
7458cfa9f051SMax Filippov         .coprocessor = 0x1,
7459cfa9f051SMax Filippov     }, {
7460cfa9f051SMax Filippov         .name = "msub.s",
7461cfa9f051SMax Filippov         .translate = translate_msub_s,
7462cfa9f051SMax Filippov         .coprocessor = 0x1,
7463cfa9f051SMax Filippov     }, {
7464cfa9f051SMax Filippov         .name = "mul.d",
7465cfa9f051SMax Filippov         .translate = translate_mul_d,
7466cfa9f051SMax Filippov         .coprocessor = 0x1,
7467cfa9f051SMax Filippov     }, {
7468cfa9f051SMax Filippov         .name = "mul.s",
7469cfa9f051SMax Filippov         .translate = translate_mul_s,
7470cfa9f051SMax Filippov         .coprocessor = 0x1,
7471cfa9f051SMax Filippov     }, {
7472cfa9f051SMax Filippov         .name = "neg.d",
7473cfa9f051SMax Filippov         .translate = translate_neg_d,
7474cfa9f051SMax Filippov         .coprocessor = 0x1,
7475cfa9f051SMax Filippov     }, {
7476cfa9f051SMax Filippov         .name = "neg.s",
7477cfa9f051SMax Filippov         .translate = translate_neg_s,
7478cfa9f051SMax Filippov         .coprocessor = 0x1,
7479cfa9f051SMax Filippov     }, {
7480f8c61370SMax Filippov         .name = "nexp01.d",
7481f8c61370SMax Filippov         .translate = translate_nop,
7482f8c61370SMax Filippov         .coprocessor = 0x1,
7483f8c61370SMax Filippov     }, {
7484f8c61370SMax Filippov         .name = "nexp01.s",
7485f8c61370SMax Filippov         .translate = translate_nop,
7486f8c61370SMax Filippov         .coprocessor = 0x1,
7487f8c61370SMax Filippov     }, {
7488cfa9f051SMax Filippov         .name = "oeq.d",
7489cfa9f051SMax Filippov         .translate = translate_compare_d,
7490cfa9f051SMax Filippov         .par = (const uint32_t[]){COMPARE_OEQ},
7491cfa9f051SMax Filippov         .coprocessor = 0x1,
7492cfa9f051SMax Filippov     }, {
7493cfa9f051SMax Filippov         .name = "oeq.s",
7494cfa9f051SMax Filippov         .translate = translate_compare_s,
7495cfa9f051SMax Filippov         .par = (const uint32_t[]){COMPARE_OEQ},
7496cfa9f051SMax Filippov         .coprocessor = 0x1,
7497cfa9f051SMax Filippov     }, {
7498cfa9f051SMax Filippov         .name = "ole.d",
7499cfa9f051SMax Filippov         .translate = translate_compare_d,
7500cfa9f051SMax Filippov         .par = (const uint32_t[]){COMPARE_OLE},
7501cfa9f051SMax Filippov         .coprocessor = 0x1,
7502cfa9f051SMax Filippov     }, {
7503cfa9f051SMax Filippov         .name = "ole.s",
7504cfa9f051SMax Filippov         .translate = translate_compare_s,
7505cfa9f051SMax Filippov         .par = (const uint32_t[]){COMPARE_OLE},
7506cfa9f051SMax Filippov         .coprocessor = 0x1,
7507cfa9f051SMax Filippov     }, {
7508cfa9f051SMax Filippov         .name = "olt.d",
7509cfa9f051SMax Filippov         .translate = translate_compare_d,
7510cfa9f051SMax Filippov         .par = (const uint32_t[]){COMPARE_OLT},
7511cfa9f051SMax Filippov         .coprocessor = 0x1,
7512cfa9f051SMax Filippov     }, {
7513cfa9f051SMax Filippov         .name = "olt.s",
7514cfa9f051SMax Filippov         .translate = translate_compare_s,
7515cfa9f051SMax Filippov         .par = (const uint32_t[]){COMPARE_OLT},
7516cfa9f051SMax Filippov         .coprocessor = 0x1,
7517cfa9f051SMax Filippov     }, {
7518cfa9f051SMax Filippov         .name = "rfr",
7519cfa9f051SMax Filippov         .translate = translate_rfr_s,
7520cfa9f051SMax Filippov         .coprocessor = 0x1,
7521cfa9f051SMax Filippov     }, {
7522cfa9f051SMax Filippov         .name = "rfrd",
7523cfa9f051SMax Filippov         .translate = translate_rfr_d,
7524cfa9f051SMax Filippov         .coprocessor = 0x1,
7525cfa9f051SMax Filippov     }, {
7526cfa9f051SMax Filippov         .name = "round.d",
7527cfa9f051SMax Filippov         .translate = translate_ftoi_d,
7528cfa9f051SMax Filippov         .par = (const uint32_t[]){float_round_nearest_even, false},
7529cfa9f051SMax Filippov         .coprocessor = 0x1,
7530cfa9f051SMax Filippov     }, {
7531cfa9f051SMax Filippov         .name = "round.s",
7532cfa9f051SMax Filippov         .translate = translate_ftoi_s,
7533cfa9f051SMax Filippov         .par = (const uint32_t[]){float_round_nearest_even, false},
7534cfa9f051SMax Filippov         .coprocessor = 0x1,
7535cfa9f051SMax Filippov     }, {
7536cfa9f051SMax Filippov         .name = "rur.fcr",
7537cfa9f051SMax Filippov         .translate = translate_rur,
7538cfa9f051SMax Filippov         .par = (const uint32_t[]){FCR},
7539cfa9f051SMax Filippov         .coprocessor = 0x1,
7540cfa9f051SMax Filippov     }, {
7541cfa9f051SMax Filippov         .name = "rur.fsr",
7542cfa9f051SMax Filippov         .translate = translate_rur_fpu_fsr,
7543cfa9f051SMax Filippov         .coprocessor = 0x1,
7544cfa9f051SMax Filippov     }, {
7545cfa9f051SMax Filippov         .name = "sdi",
7546cfa9f051SMax Filippov         .translate = translate_ldsti_d,
7547cfa9f051SMax Filippov         .par = (const uint32_t[]){true, true, false},
7548cfa9f051SMax Filippov         .op_flags = XTENSA_OP_STORE,
7549cfa9f051SMax Filippov         .coprocessor = 0x1,
7550cfa9f051SMax Filippov     }, {
7551cfa9f051SMax Filippov         .name = "sdip",
7552cfa9f051SMax Filippov         .translate = translate_ldsti_d,
7553cfa9f051SMax Filippov         .par = (const uint32_t[]){true, false, true},
7554cfa9f051SMax Filippov         .op_flags = XTENSA_OP_STORE,
7555cfa9f051SMax Filippov         .coprocessor = 0x1,
7556cfa9f051SMax Filippov     }, {
7557cfa9f051SMax Filippov         .name = "sdiu",
7558cfa9f051SMax Filippov         .translate = translate_ldsti_d,
7559cfa9f051SMax Filippov         .par = (const uint32_t[]){true, true, true},
7560cfa9f051SMax Filippov         .op_flags = XTENSA_OP_STORE,
7561cfa9f051SMax Filippov         .coprocessor = 0x1,
7562cfa9f051SMax Filippov     }, {
7563cfa9f051SMax Filippov         .name = "sdx",
7564cfa9f051SMax Filippov         .translate = translate_ldstx_d,
7565cfa9f051SMax Filippov         .par = (const uint32_t[]){true, true, false},
7566cfa9f051SMax Filippov         .op_flags = XTENSA_OP_STORE,
7567cfa9f051SMax Filippov         .coprocessor = 0x1,
7568cfa9f051SMax Filippov     }, {
7569cfa9f051SMax Filippov         .name = "sdxp",
7570cfa9f051SMax Filippov         .translate = translate_ldstx_d,
7571cfa9f051SMax Filippov         .par = (const uint32_t[]){true, false, true},
7572cfa9f051SMax Filippov         .op_flags = XTENSA_OP_STORE,
7573cfa9f051SMax Filippov         .coprocessor = 0x1,
7574cfa9f051SMax Filippov     }, {
7575cfa9f051SMax Filippov         .name = "sdxu",
7576cfa9f051SMax Filippov         .translate = translate_ldstx_d,
7577cfa9f051SMax Filippov         .par = (const uint32_t[]){true, true, true},
7578cfa9f051SMax Filippov         .op_flags = XTENSA_OP_STORE,
7579cfa9f051SMax Filippov         .coprocessor = 0x1,
7580cfa9f051SMax Filippov     }, {
7581f8c61370SMax Filippov         .name = "sqrt0.d",
7582f8c61370SMax Filippov         .translate = translate_nop,
7583f8c61370SMax Filippov         .coprocessor = 0x1,
7584f8c61370SMax Filippov     }, {
7585f8c61370SMax Filippov         .name = "sqrt0.s",
7586f8c61370SMax Filippov         .translate = translate_nop,
7587f8c61370SMax Filippov         .coprocessor = 0x1,
7588f8c61370SMax Filippov     }, {
7589cfa9f051SMax Filippov         .name = "ssi",
7590cfa9f051SMax Filippov         .translate = translate_ldsti_s,
7591cfa9f051SMax Filippov         .par = (const uint32_t[]){true, true, false},
7592cfa9f051SMax Filippov         .op_flags = XTENSA_OP_STORE,
7593cfa9f051SMax Filippov         .coprocessor = 0x1,
7594cfa9f051SMax Filippov     }, {
7595cfa9f051SMax Filippov         .name = "ssip",
7596cfa9f051SMax Filippov         .translate = translate_ldsti_s,
7597cfa9f051SMax Filippov         .par = (const uint32_t[]){true, false, true},
7598cfa9f051SMax Filippov         .op_flags = XTENSA_OP_STORE,
7599cfa9f051SMax Filippov         .coprocessor = 0x1,
7600cfa9f051SMax Filippov     }, {
7601cfa9f051SMax Filippov         .name = "ssiu",
7602cfa9f051SMax Filippov         .translate = translate_ldsti_s,
7603cfa9f051SMax Filippov         .par = (const uint32_t[]){true, true, true},
7604cfa9f051SMax Filippov         .op_flags = XTENSA_OP_STORE,
7605cfa9f051SMax Filippov         .coprocessor = 0x1,
7606cfa9f051SMax Filippov     }, {
7607cfa9f051SMax Filippov         .name = "ssx",
7608cfa9f051SMax Filippov         .translate = translate_ldstx_s,
7609cfa9f051SMax Filippov         .par = (const uint32_t[]){true, true, false},
7610cfa9f051SMax Filippov         .op_flags = XTENSA_OP_STORE,
7611cfa9f051SMax Filippov         .coprocessor = 0x1,
7612cfa9f051SMax Filippov     }, {
7613cfa9f051SMax Filippov         .name = "ssxp",
7614cfa9f051SMax Filippov         .translate = translate_ldstx_s,
7615cfa9f051SMax Filippov         .par = (const uint32_t[]){true, false, true},
7616cfa9f051SMax Filippov         .op_flags = XTENSA_OP_STORE,
7617cfa9f051SMax Filippov         .coprocessor = 0x1,
7618cfa9f051SMax Filippov     }, {
7619cfa9f051SMax Filippov         .name = "ssxu",
7620cfa9f051SMax Filippov         .translate = translate_ldstx_s,
7621cfa9f051SMax Filippov         .par = (const uint32_t[]){true, true, true},
7622cfa9f051SMax Filippov         .op_flags = XTENSA_OP_STORE,
7623cfa9f051SMax Filippov         .coprocessor = 0x1,
7624cfa9f051SMax Filippov     }, {
7625cfa9f051SMax Filippov         .name = "sub.d",
7626cfa9f051SMax Filippov         .translate = translate_sub_d,
7627cfa9f051SMax Filippov         .coprocessor = 0x1,
7628cfa9f051SMax Filippov     }, {
7629cfa9f051SMax Filippov         .name = "sub.s",
7630cfa9f051SMax Filippov         .translate = translate_sub_s,
7631cfa9f051SMax Filippov         .coprocessor = 0x1,
7632cfa9f051SMax Filippov     }, {
7633cfa9f051SMax Filippov         .name = "trunc.d",
7634cfa9f051SMax Filippov         .translate = translate_ftoi_d,
7635cfa9f051SMax Filippov         .par = (const uint32_t[]){float_round_to_zero, false},
7636cfa9f051SMax Filippov         .coprocessor = 0x1,
7637cfa9f051SMax Filippov     }, {
7638cfa9f051SMax Filippov         .name = "trunc.s",
7639cfa9f051SMax Filippov         .translate = translate_ftoi_s,
7640cfa9f051SMax Filippov         .par = (const uint32_t[]){float_round_to_zero, false},
7641cfa9f051SMax Filippov         .coprocessor = 0x1,
7642cfa9f051SMax Filippov     }, {
7643cfa9f051SMax Filippov         .name = "ueq.d",
7644cfa9f051SMax Filippov         .translate = translate_compare_d,
7645cfa9f051SMax Filippov         .par = (const uint32_t[]){COMPARE_UEQ},
7646cfa9f051SMax Filippov         .coprocessor = 0x1,
7647cfa9f051SMax Filippov     }, {
7648cfa9f051SMax Filippov         .name = "ueq.s",
7649cfa9f051SMax Filippov         .translate = translate_compare_s,
7650cfa9f051SMax Filippov         .par = (const uint32_t[]){COMPARE_UEQ},
7651cfa9f051SMax Filippov         .coprocessor = 0x1,
7652cfa9f051SMax Filippov     }, {
7653cfa9f051SMax Filippov         .name = "ufloat.d",
7654cfa9f051SMax Filippov         .translate = translate_float_d,
7655cfa9f051SMax Filippov         .par = (const uint32_t[]){true},
7656cfa9f051SMax Filippov         .coprocessor = 0x1,
7657cfa9f051SMax Filippov     }, {
7658cfa9f051SMax Filippov         .name = "ufloat.s",
7659cfa9f051SMax Filippov         .translate = translate_float_s,
7660cfa9f051SMax Filippov         .par = (const uint32_t[]){true},
7661cfa9f051SMax Filippov         .coprocessor = 0x1,
7662cfa9f051SMax Filippov     }, {
7663cfa9f051SMax Filippov         .name = "ule.d",
7664cfa9f051SMax Filippov         .translate = translate_compare_d,
7665cfa9f051SMax Filippov         .par = (const uint32_t[]){COMPARE_ULE},
7666cfa9f051SMax Filippov         .coprocessor = 0x1,
7667cfa9f051SMax Filippov     }, {
7668cfa9f051SMax Filippov         .name = "ule.s",
7669cfa9f051SMax Filippov         .translate = translate_compare_s,
7670cfa9f051SMax Filippov         .par = (const uint32_t[]){COMPARE_ULE},
7671cfa9f051SMax Filippov         .coprocessor = 0x1,
7672cfa9f051SMax Filippov     }, {
7673cfa9f051SMax Filippov         .name = "ult.d",
7674cfa9f051SMax Filippov         .translate = translate_compare_d,
7675cfa9f051SMax Filippov         .par = (const uint32_t[]){COMPARE_ULT},
7676cfa9f051SMax Filippov         .coprocessor = 0x1,
7677cfa9f051SMax Filippov     }, {
7678cfa9f051SMax Filippov         .name = "ult.s",
7679cfa9f051SMax Filippov         .translate = translate_compare_s,
7680cfa9f051SMax Filippov         .par = (const uint32_t[]){COMPARE_ULT},
7681cfa9f051SMax Filippov         .coprocessor = 0x1,
7682cfa9f051SMax Filippov     }, {
7683cfa9f051SMax Filippov         .name = "un.d",
7684cfa9f051SMax Filippov         .translate = translate_compare_d,
7685cfa9f051SMax Filippov         .par = (const uint32_t[]){COMPARE_UN},
7686cfa9f051SMax Filippov         .coprocessor = 0x1,
7687cfa9f051SMax Filippov     }, {
7688cfa9f051SMax Filippov         .name = "un.s",
7689cfa9f051SMax Filippov         .translate = translate_compare_s,
7690cfa9f051SMax Filippov         .par = (const uint32_t[]){COMPARE_UN},
7691cfa9f051SMax Filippov         .coprocessor = 0x1,
7692cfa9f051SMax Filippov     }, {
7693cfa9f051SMax Filippov         .name = "utrunc.d",
7694cfa9f051SMax Filippov         .translate = translate_ftoi_d,
7695cfa9f051SMax Filippov         .par = (const uint32_t[]){float_round_to_zero, true},
7696cfa9f051SMax Filippov         .coprocessor = 0x1,
7697cfa9f051SMax Filippov     }, {
7698cfa9f051SMax Filippov         .name = "utrunc.s",
7699cfa9f051SMax Filippov         .translate = translate_ftoi_s,
7700cfa9f051SMax Filippov         .par = (const uint32_t[]){float_round_to_zero, true},
7701cfa9f051SMax Filippov         .coprocessor = 0x1,
7702cfa9f051SMax Filippov     }, {
7703cfa9f051SMax Filippov         .name = "wfr",
7704cfa9f051SMax Filippov         .translate = translate_wfr_s,
7705cfa9f051SMax Filippov         .coprocessor = 0x1,
7706cfa9f051SMax Filippov     }, {
7707cfa9f051SMax Filippov         .name = "wfrd",
7708cfa9f051SMax Filippov         .translate = translate_wfr_d,
7709cfa9f051SMax Filippov         .coprocessor = 0x1,
7710cfa9f051SMax Filippov     }, {
7711cfa9f051SMax Filippov         .name = "wur.fcr",
7712cfa9f051SMax Filippov         .translate = translate_wur_fpu_fcr,
7713cfa9f051SMax Filippov         .par = (const uint32_t[]){FCR},
7714cfa9f051SMax Filippov         .coprocessor = 0x1,
7715cfa9f051SMax Filippov     }, {
7716cfa9f051SMax Filippov         .name = "wur.fsr",
7717cfa9f051SMax Filippov         .translate = translate_wur_fpu_fsr,
7718cfa9f051SMax Filippov         .coprocessor = 0x1,
7719cfa9f051SMax Filippov     },
7720cfa9f051SMax Filippov };
7721cfa9f051SMax Filippov 
7722cfa9f051SMax Filippov const XtensaOpcodeTranslators xtensa_fpu_opcodes = {
7723cfa9f051SMax Filippov     .num_opcodes = ARRAY_SIZE(fpu_ops),
7724cfa9f051SMax Filippov     .opcode = fpu_ops,
7725cfa9f051SMax Filippov };
7726