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"
35dcb32f1dSPhilippe Mathieu-Daudé #include "tcg/tcg-op.h"
36fcf5ef2aSThomas Huth #include "qemu/log.h"
3790c84c56SMarkus Armbruster #include "qemu/qemu-print.h"
386b5fe137SPhilippe Mathieu-Daudé #include "semihosting/semihost.h"
3977fc6f5eSLluís Vilanova #include "exec/translator.h"
40fcf5ef2aSThomas Huth
41fcf5ef2aSThomas Huth #include "exec/helper-proto.h"
42fcf5ef2aSThomas Huth #include "exec/helper-gen.h"
43fcf5ef2aSThomas Huth
44fcf5ef2aSThomas Huth #include "exec/log.h"
45fcf5ef2aSThomas Huth
46d53106c9SRichard Henderson #define HELPER_H "helper.h"
47d53106c9SRichard Henderson #include "exec/helper-info.c.inc"
48d53106c9SRichard Henderson #undef HELPER_H
49d53106c9SRichard Henderson
50fcf5ef2aSThomas Huth
51a3380cf6SPeter Maydell struct DisasContext {
523cc18eecSRichard Henderson DisasContextBase base;
53fcf5ef2aSThomas Huth const XtensaConfig *config;
54fcf5ef2aSThomas Huth uint32_t pc;
55fcf5ef2aSThomas Huth int cring;
56fcf5ef2aSThomas Huth int ring;
575d630cefSMax Filippov uint32_t lbeg_off;
58fcf5ef2aSThomas Huth uint32_t lend;
59fcf5ef2aSThomas Huth
60fcf5ef2aSThomas Huth bool sar_5bit;
61fcf5ef2aSThomas Huth bool sar_m32_5bit;
62fcf5ef2aSThomas Huth TCGv_i32 sar_m32;
63fcf5ef2aSThomas Huth
64fcf5ef2aSThomas Huth unsigned window;
656416d16fSMax Filippov unsigned callinc;
6609460970SMax Filippov bool cwoe;
67fcf5ef2aSThomas Huth
68fcf5ef2aSThomas Huth bool debug;
69fcf5ef2aSThomas Huth bool icount;
70fcf5ef2aSThomas Huth TCGv_i32 next_icount;
71fcf5ef2aSThomas Huth
72fcf5ef2aSThomas Huth unsigned cpenable;
73168c12b0SMax Filippov
7445b71a79SMax Filippov uint32_t op_flags;
75fde557adSMax Filippov xtensa_insnbuf_word insnbuf[MAX_INSNBUF_LENGTH];
76fde557adSMax Filippov xtensa_insnbuf_word slotbuf[MAX_INSNBUF_LENGTH];
77a3380cf6SPeter Maydell };
78fcf5ef2aSThomas Huth
79fcf5ef2aSThomas Huth static TCGv_i32 cpu_pc;
80fcf5ef2aSThomas Huth static TCGv_i32 cpu_R[16];
81fcf5ef2aSThomas Huth static TCGv_i32 cpu_FR[16];
82cfa9f051SMax Filippov static TCGv_i64 cpu_FRD[16];
837aa78341SMax Filippov static TCGv_i32 cpu_MR[4];
84575e962aSMax Filippov static TCGv_i32 cpu_BR[16];
85575e962aSMax Filippov static TCGv_i32 cpu_BR4[4];
86575e962aSMax Filippov static TCGv_i32 cpu_BR8[2];
87fcf5ef2aSThomas Huth static TCGv_i32 cpu_SR[256];
88fcf5ef2aSThomas Huth static TCGv_i32 cpu_UR[256];
898df3fd35SMax Filippov static TCGv_i32 cpu_windowbase_next;
90b345e140SMax Filippov static TCGv_i32 cpu_exclusive_addr;
91b345e140SMax Filippov static TCGv_i32 cpu_exclusive_val;
92fcf5ef2aSThomas Huth
93b0b24bdcSMax Filippov static GHashTable *xtensa_regfile_table;
94b0b24bdcSMax Filippov
9559419607SMax Filippov static char *sr_name[256];
9659419607SMax Filippov static char *ur_name[256];
97fcf5ef2aSThomas Huth
xtensa_collect_sr_names(const XtensaConfig * config)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
xtensa_translate_init(void)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
155ad75a51eSRichard Henderson cpu_pc = tcg_global_mem_new_i32(tcg_env,
156fcf5ef2aSThomas Huth offsetof(CPUXtensaState, pc), "pc");
157fcf5ef2aSThomas Huth
158fcf5ef2aSThomas Huth for (i = 0; i < 16; i++) {
159ad75a51eSRichard Henderson cpu_R[i] = tcg_global_mem_new_i32(tcg_env,
160fcf5ef2aSThomas Huth offsetof(CPUXtensaState, regs[i]),
161fcf5ef2aSThomas Huth regnames[i]);
162fcf5ef2aSThomas Huth }
163fcf5ef2aSThomas Huth
164fcf5ef2aSThomas Huth for (i = 0; i < 16; i++) {
165ad75a51eSRichard Henderson cpu_FR[i] = tcg_global_mem_new_i32(tcg_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++) {
172ad75a51eSRichard Henderson cpu_FRD[i] = tcg_global_mem_new_i64(tcg_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++) {
179ad75a51eSRichard Henderson cpu_MR[i] = tcg_global_mem_new_i32(tcg_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++) {
186ad75a51eSRichard Henderson cpu_BR[i] = tcg_global_mem_new_i32(tcg_env,
187575e962aSMax Filippov offsetof(CPUXtensaState,
188575e962aSMax Filippov sregs[BR]),
189575e962aSMax Filippov bregnames[i]);
190575e962aSMax Filippov if (i % 4 == 0) {
191ad75a51eSRichard Henderson cpu_BR4[i / 4] = tcg_global_mem_new_i32(tcg_env,
192575e962aSMax Filippov offsetof(CPUXtensaState,
193575e962aSMax Filippov sregs[BR]),
194575e962aSMax Filippov bregnames[i]);
195575e962aSMax Filippov }
196575e962aSMax Filippov if (i % 8 == 0) {
197ad75a51eSRichard Henderson cpu_BR8[i / 8] = tcg_global_mem_new_i32(tcg_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]) {
206ad75a51eSRichard Henderson cpu_SR[i] = tcg_global_mem_new_i32(tcg_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]) {
215ad75a51eSRichard Henderson cpu_UR[i] = tcg_global_mem_new_i32(tcg_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 =
223ad75a51eSRichard Henderson tcg_global_mem_new_i32(tcg_env,
2248df3fd35SMax Filippov offsetof(CPUXtensaState, windowbase_next),
2258df3fd35SMax Filippov "windowbase_next");
226b345e140SMax Filippov cpu_exclusive_addr =
227ad75a51eSRichard Henderson tcg_global_mem_new_i32(tcg_env,
228b345e140SMax Filippov offsetof(CPUXtensaState, exclusive_addr),
229b345e140SMax Filippov "exclusive_addr");
230b345e140SMax Filippov cpu_exclusive_val =
231ad75a51eSRichard Henderson tcg_global_mem_new_i32(tcg_env,
232b345e140SMax Filippov offsetof(CPUXtensaState, exclusive_val),
233b345e140SMax Filippov "exclusive_val");
234fcf5ef2aSThomas Huth }
235fcf5ef2aSThomas Huth
xtensa_get_regfile_by_name(const char * name,int entries,int bits)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
option_enabled(DisasContext * dc,int opt)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
init_sar_tracker(DisasContext * dc)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
gen_right_shift_sar(DisasContext * dc,TCGv_i32 sa)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
gen_left_shift_sar(DisasContext * dc,TCGv_i32 sa)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
gen_exception(DisasContext * dc,int excp)310fcf5ef2aSThomas Huth static void gen_exception(DisasContext *dc, int excp)
311fcf5ef2aSThomas Huth {
312ad75a51eSRichard Henderson gen_helper_exception(tcg_env, tcg_constant_i32(excp));
313fcf5ef2aSThomas Huth }
314fcf5ef2aSThomas Huth
gen_exception_cause(DisasContext * dc,uint32_t cause)315fcf5ef2aSThomas Huth static void gen_exception_cause(DisasContext *dc, uint32_t cause)
316fcf5ef2aSThomas Huth {
317f99fbd12SMax Filippov TCGv_i32 pc = tcg_constant_i32(dc->pc);
318ad75a51eSRichard Henderson gen_helper_exception_cause(tcg_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
gen_debug_exception(DisasContext * dc,uint32_t cause)325fcf5ef2aSThomas Huth static void gen_debug_exception(DisasContext *dc, uint32_t cause)
326fcf5ef2aSThomas Huth {
327f99fbd12SMax Filippov TCGv_i32 pc = tcg_constant_i32(dc->pc);
328ad75a51eSRichard Henderson gen_helper_debug_exception(tcg_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
gen_check_privilege(DisasContext * dc)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
gen_check_cpenable(DisasContext * dc,uint32_t cp_mask)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
gen_jump_slot(DisasContext * dc,TCGv dest,int slot)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
gen_jump(DisasContext * dc,TCGv dest)378fcf5ef2aSThomas Huth static void gen_jump(DisasContext *dc, TCGv dest)
379fcf5ef2aSThomas Huth {
380fcf5ef2aSThomas Huth gen_jump_slot(dc, dest, -1);
381fcf5ef2aSThomas Huth }
382fcf5ef2aSThomas Huth
adjust_jump_slot(DisasContext * dc,uint32_t dest,int slot)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
gen_jumpi(DisasContext * dc,uint32_t dest,int slot)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
gen_callw_slot(DisasContext * dc,int callinc,TCGv_i32 dest,int slot)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
gen_check_loop_end(DisasContext * dc,int slot)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
gen_jumpi_check_loop_end(DisasContext * dc,int slot)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
gen_brcond(DisasContext * dc,TCGCond cond,TCGv_i32 t0,TCGv_i32 t1,uint32_t addr)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
gen_brcondi(DisasContext * dc,TCGCond cond,TCGv_i32 t0,uint32_t t1,uint32_t addr)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
test_exceptions_sr(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])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
test_exceptions_ccompare(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])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
test_exceptions_dbreak(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])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
test_exceptions_ibreak(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])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
test_exceptions_hpi(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])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
gen_load_store_alignment(DisasContext * dc,MemOp mop,TCGv_i32 addr)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)) {
524*c5809eeeSRichard Henderson tcg_gen_andi_i32(addr, addr, ~0 << memop_alignment_bits(mop));
525583e6a5fSMax Filippov }
526583e6a5fSMax Filippov return mop;
527fcf5ef2aSThomas Huth }
528fcf5ef2aSThomas Huth
gen_window_check(DisasContext * dc,uint32_t mask)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
537ad75a51eSRichard Henderson gen_helper_window_check(tcg_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
gen_mac16_m(TCGv_i32 v,bool hi,bool is_unsigned)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
gen_zero_check(DisasContext * dc,const OpcodeArg arg[])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
xtensa_op0_insn_len(DisasContext * dc,uint8_t op0)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
gen_postprocess(DisasContext * dc,int slot)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) {
576dfd1b812SRichard Henderson translator_io_start(&dc->base);
577ad75a51eSRichard Henderson gen_helper_check_interrupts(tcg_env);
57859419607SMax Filippov }
57959419607SMax Filippov #endif
5808df3fd35SMax Filippov if (op_flags & XTENSA_OP_SYNC_REGISTER_WINDOW) {
581ad75a51eSRichard Henderson gen_helper_sync_windowbase(tcg_env);
5828df3fd35SMax Filippov }
58345b71a79SMax Filippov if (op_flags & XTENSA_OP_EXIT_TB_M1) {
58445b71a79SMax Filippov slot = -1;
58545b71a79SMax Filippov }
58645b71a79SMax Filippov return slot;
58745b71a79SMax Filippov }
58845b71a79SMax Filippov
58989bec9e9SMax Filippov struct opcode_arg_copy {
59089bec9e9SMax Filippov uint32_t resource;
59189bec9e9SMax Filippov void *temp;
59289bec9e9SMax Filippov OpcodeArg *arg;
59389bec9e9SMax Filippov };
59489bec9e9SMax Filippov
59520e9fd0fSMax Filippov struct opcode_arg_info {
59620e9fd0fSMax Filippov uint32_t resource;
59720e9fd0fSMax Filippov int index;
59820e9fd0fSMax Filippov };
59920e9fd0fSMax Filippov
60020e9fd0fSMax Filippov struct slot_prop {
60120e9fd0fSMax Filippov XtensaOpcodeOps *ops;
602b0b24bdcSMax Filippov OpcodeArg arg[MAX_OPCODE_ARGS];
60320e9fd0fSMax Filippov struct opcode_arg_info in[MAX_OPCODE_ARGS];
60420e9fd0fSMax Filippov struct opcode_arg_info out[MAX_OPCODE_ARGS];
60520e9fd0fSMax Filippov unsigned n_in;
60620e9fd0fSMax Filippov unsigned n_out;
60720e9fd0fSMax Filippov uint32_t op_flags;
60820e9fd0fSMax Filippov };
60920e9fd0fSMax Filippov
61020e9fd0fSMax Filippov enum resource_type {
61120e9fd0fSMax Filippov RES_REGFILE,
61220e9fd0fSMax Filippov RES_STATE,
61320e9fd0fSMax Filippov RES_MAX,
61420e9fd0fSMax Filippov };
61520e9fd0fSMax Filippov
encode_resource(enum resource_type r,unsigned g,unsigned n)61620e9fd0fSMax Filippov static uint32_t encode_resource(enum resource_type r, unsigned g, unsigned n)
61720e9fd0fSMax Filippov {
61820e9fd0fSMax Filippov assert(r < RES_MAX && g < 256 && n < 65536);
61920e9fd0fSMax Filippov return (r << 24) | (g << 16) | n;
62020e9fd0fSMax Filippov }
62120e9fd0fSMax Filippov
get_resource_type(uint32_t resource)62289bec9e9SMax Filippov static enum resource_type get_resource_type(uint32_t resource)
62389bec9e9SMax Filippov {
62489bec9e9SMax Filippov return resource >> 24;
62589bec9e9SMax Filippov }
62689bec9e9SMax Filippov
62720e9fd0fSMax Filippov /*
62820e9fd0fSMax Filippov * a depends on b if b must be executed before a,
62920e9fd0fSMax Filippov * because a's side effects will destroy b's inputs.
63020e9fd0fSMax Filippov */
op_depends_on(const struct slot_prop * a,const struct slot_prop * b)63120e9fd0fSMax Filippov static bool op_depends_on(const struct slot_prop *a,
63220e9fd0fSMax Filippov const struct slot_prop *b)
63320e9fd0fSMax Filippov {
63420e9fd0fSMax Filippov unsigned i = 0;
63520e9fd0fSMax Filippov unsigned j = 0;
63620e9fd0fSMax Filippov
63720e9fd0fSMax Filippov if (a->op_flags & XTENSA_OP_CONTROL_FLOW) {
63820e9fd0fSMax Filippov return true;
63920e9fd0fSMax Filippov }
640068e538aSMax Filippov if ((a->op_flags & XTENSA_OP_LOAD_STORE) <
641068e538aSMax Filippov (b->op_flags & XTENSA_OP_LOAD_STORE)) {
642068e538aSMax Filippov return true;
643068e538aSMax Filippov }
64420e9fd0fSMax Filippov while (i < a->n_out && j < b->n_in) {
64520e9fd0fSMax Filippov if (a->out[i].resource < b->in[j].resource) {
64620e9fd0fSMax Filippov ++i;
64720e9fd0fSMax Filippov } else if (a->out[i].resource > b->in[j].resource) {
64820e9fd0fSMax Filippov ++j;
64920e9fd0fSMax Filippov } else {
65020e9fd0fSMax Filippov return true;
65120e9fd0fSMax Filippov }
65220e9fd0fSMax Filippov }
65320e9fd0fSMax Filippov return false;
65420e9fd0fSMax Filippov }
65520e9fd0fSMax Filippov
65620e9fd0fSMax Filippov /*
65789bec9e9SMax Filippov * Try to break a dependency on b, append temporary register copy records
65889bec9e9SMax Filippov * to the end of copy and update n_copy in case of success.
65989bec9e9SMax Filippov * This is not always possible: e.g. control flow must always be the last,
66089bec9e9SMax Filippov * load/store must be first and state dependencies are not supported yet.
66189bec9e9SMax Filippov */
break_dependency(struct slot_prop * a,struct slot_prop * b,struct opcode_arg_copy * copy,unsigned * n_copy)66289bec9e9SMax Filippov static bool break_dependency(struct slot_prop *a,
66389bec9e9SMax Filippov struct slot_prop *b,
66489bec9e9SMax Filippov struct opcode_arg_copy *copy,
66589bec9e9SMax Filippov unsigned *n_copy)
66689bec9e9SMax Filippov {
66789bec9e9SMax Filippov unsigned i = 0;
66889bec9e9SMax Filippov unsigned j = 0;
66989bec9e9SMax Filippov unsigned n = *n_copy;
67089bec9e9SMax Filippov bool rv = false;
67189bec9e9SMax Filippov
67289bec9e9SMax Filippov if (a->op_flags & XTENSA_OP_CONTROL_FLOW) {
67389bec9e9SMax Filippov return false;
67489bec9e9SMax Filippov }
675068e538aSMax Filippov if ((a->op_flags & XTENSA_OP_LOAD_STORE) <
676068e538aSMax Filippov (b->op_flags & XTENSA_OP_LOAD_STORE)) {
677068e538aSMax Filippov return false;
678068e538aSMax Filippov }
67989bec9e9SMax Filippov while (i < a->n_out && j < b->n_in) {
68089bec9e9SMax Filippov if (a->out[i].resource < b->in[j].resource) {
68189bec9e9SMax Filippov ++i;
68289bec9e9SMax Filippov } else if (a->out[i].resource > b->in[j].resource) {
68389bec9e9SMax Filippov ++j;
68489bec9e9SMax Filippov } else {
68589bec9e9SMax Filippov int index = b->in[j].index;
68689bec9e9SMax Filippov
68789bec9e9SMax Filippov if (get_resource_type(a->out[i].resource) != RES_REGFILE ||
68889bec9e9SMax Filippov index < 0) {
68989bec9e9SMax Filippov return false;
69089bec9e9SMax Filippov }
69189bec9e9SMax Filippov copy[n].resource = b->in[j].resource;
69289bec9e9SMax Filippov copy[n].arg = b->arg + index;
69389bec9e9SMax Filippov ++n;
69489bec9e9SMax Filippov ++j;
69589bec9e9SMax Filippov rv = true;
69689bec9e9SMax Filippov }
69789bec9e9SMax Filippov }
69889bec9e9SMax Filippov *n_copy = n;
69989bec9e9SMax Filippov return rv;
70089bec9e9SMax Filippov }
70189bec9e9SMax Filippov
70289bec9e9SMax Filippov /*
70320e9fd0fSMax Filippov * Calculate evaluation order for slot opcodes.
70420e9fd0fSMax Filippov * Build opcode order graph and output its nodes in topological sort order.
70520e9fd0fSMax Filippov * An edge a -> b in the graph means that opcode a must be followed by
70620e9fd0fSMax Filippov * opcode b.
70720e9fd0fSMax Filippov */
tsort(struct slot_prop * slot,struct slot_prop * sorted[],unsigned n,struct opcode_arg_copy * copy,unsigned * n_copy)70820e9fd0fSMax Filippov static bool tsort(struct slot_prop *slot,
70920e9fd0fSMax Filippov struct slot_prop *sorted[],
71089bec9e9SMax Filippov unsigned n,
71189bec9e9SMax Filippov struct opcode_arg_copy *copy,
71289bec9e9SMax Filippov unsigned *n_copy)
71320e9fd0fSMax Filippov {
71420e9fd0fSMax Filippov struct tsnode {
71520e9fd0fSMax Filippov unsigned n_in_edge;
71620e9fd0fSMax Filippov unsigned n_out_edge;
71720e9fd0fSMax Filippov unsigned out_edge[MAX_INSN_SLOTS];
71820e9fd0fSMax Filippov } node[MAX_INSN_SLOTS];
71920e9fd0fSMax Filippov
72020e9fd0fSMax Filippov unsigned in[MAX_INSN_SLOTS];
72120e9fd0fSMax Filippov unsigned i, j;
72220e9fd0fSMax Filippov unsigned n_in = 0;
72320e9fd0fSMax Filippov unsigned n_out = 0;
72420e9fd0fSMax Filippov unsigned n_edge = 0;
72589bec9e9SMax Filippov unsigned in_idx = 0;
72689bec9e9SMax Filippov unsigned node_idx = 0;
72720e9fd0fSMax Filippov
72820e9fd0fSMax Filippov for (i = 0; i < n; ++i) {
72920e9fd0fSMax Filippov node[i].n_in_edge = 0;
73020e9fd0fSMax Filippov node[i].n_out_edge = 0;
73120e9fd0fSMax Filippov }
73220e9fd0fSMax Filippov
73320e9fd0fSMax Filippov for (i = 0; i < n; ++i) {
73420e9fd0fSMax Filippov unsigned n_out_edge = 0;
73520e9fd0fSMax Filippov
73620e9fd0fSMax Filippov for (j = 0; j < n; ++j) {
73720e9fd0fSMax Filippov if (i != j && op_depends_on(slot + j, slot + i)) {
73820e9fd0fSMax Filippov node[i].out_edge[n_out_edge] = j;
73920e9fd0fSMax Filippov ++node[j].n_in_edge;
74020e9fd0fSMax Filippov ++n_out_edge;
74120e9fd0fSMax Filippov ++n_edge;
74220e9fd0fSMax Filippov }
74320e9fd0fSMax Filippov }
74420e9fd0fSMax Filippov node[i].n_out_edge = n_out_edge;
74520e9fd0fSMax Filippov }
74620e9fd0fSMax Filippov
74720e9fd0fSMax Filippov for (i = 0; i < n; ++i) {
74820e9fd0fSMax Filippov if (!node[i].n_in_edge) {
74920e9fd0fSMax Filippov in[n_in] = i;
75020e9fd0fSMax Filippov ++n_in;
75120e9fd0fSMax Filippov }
75220e9fd0fSMax Filippov }
75320e9fd0fSMax Filippov
75489bec9e9SMax Filippov again:
75589bec9e9SMax Filippov for (; in_idx < n_in; ++in_idx) {
75620e9fd0fSMax Filippov i = in[in_idx];
75720e9fd0fSMax Filippov sorted[n_out] = slot + i;
75820e9fd0fSMax Filippov ++n_out;
75920e9fd0fSMax Filippov for (j = 0; j < node[i].n_out_edge; ++j) {
76020e9fd0fSMax Filippov --n_edge;
76120e9fd0fSMax Filippov if (--node[node[i].out_edge[j]].n_in_edge == 0) {
76220e9fd0fSMax Filippov in[n_in] = node[i].out_edge[j];
76320e9fd0fSMax Filippov ++n_in;
76420e9fd0fSMax Filippov }
76520e9fd0fSMax Filippov }
76620e9fd0fSMax Filippov }
76789bec9e9SMax Filippov if (n_edge) {
76889bec9e9SMax Filippov for (; node_idx < n; ++node_idx) {
76989bec9e9SMax Filippov struct tsnode *cnode = node + node_idx;
77089bec9e9SMax Filippov
77189bec9e9SMax Filippov if (cnode->n_in_edge) {
77289bec9e9SMax Filippov for (j = 0; j < cnode->n_out_edge; ++j) {
77389bec9e9SMax Filippov unsigned k = cnode->out_edge[j];
77489bec9e9SMax Filippov
77589bec9e9SMax Filippov if (break_dependency(slot + k, slot + node_idx,
77689bec9e9SMax Filippov copy, n_copy) &&
77789bec9e9SMax Filippov --node[k].n_in_edge == 0) {
77889bec9e9SMax Filippov in[n_in] = k;
77989bec9e9SMax Filippov ++n_in;
78089bec9e9SMax Filippov --n_edge;
78189bec9e9SMax Filippov cnode->out_edge[j] =
78289bec9e9SMax Filippov cnode->out_edge[cnode->n_out_edge - 1];
78389bec9e9SMax Filippov --cnode->n_out_edge;
78489bec9e9SMax Filippov goto again;
78589bec9e9SMax Filippov }
78689bec9e9SMax Filippov }
78789bec9e9SMax Filippov }
78889bec9e9SMax Filippov }
78989bec9e9SMax Filippov }
79020e9fd0fSMax Filippov return n_edge == 0;
79120e9fd0fSMax Filippov }
79220e9fd0fSMax Filippov
opcode_add_resource(struct slot_prop * op,uint32_t resource,char direction,int index)79320e9fd0fSMax Filippov static void opcode_add_resource(struct slot_prop *op,
79420e9fd0fSMax Filippov uint32_t resource, char direction,
79520e9fd0fSMax Filippov int index)
79620e9fd0fSMax Filippov {
79720e9fd0fSMax Filippov switch (direction) {
79820e9fd0fSMax Filippov case 'm':
79920e9fd0fSMax Filippov case 'i':
80020e9fd0fSMax Filippov assert(op->n_in < ARRAY_SIZE(op->in));
80120e9fd0fSMax Filippov op->in[op->n_in].resource = resource;
80220e9fd0fSMax Filippov op->in[op->n_in].index = index;
80320e9fd0fSMax Filippov ++op->n_in;
80420e9fd0fSMax Filippov /* fall through */
80520e9fd0fSMax Filippov case 'o':
80620e9fd0fSMax Filippov if (direction == 'm' || direction == 'o') {
80720e9fd0fSMax Filippov assert(op->n_out < ARRAY_SIZE(op->out));
80820e9fd0fSMax Filippov op->out[op->n_out].resource = resource;
80920e9fd0fSMax Filippov op->out[op->n_out].index = index;
81020e9fd0fSMax Filippov ++op->n_out;
81120e9fd0fSMax Filippov }
81220e9fd0fSMax Filippov break;
81320e9fd0fSMax Filippov default:
81420e9fd0fSMax Filippov g_assert_not_reached();
81520e9fd0fSMax Filippov }
81620e9fd0fSMax Filippov }
81720e9fd0fSMax Filippov
resource_compare(const void * a,const void * b)81820e9fd0fSMax Filippov static int resource_compare(const void *a, const void *b)
81920e9fd0fSMax Filippov {
82020e9fd0fSMax Filippov const struct opcode_arg_info *pa = a;
82120e9fd0fSMax Filippov const struct opcode_arg_info *pb = b;
82220e9fd0fSMax Filippov
82320e9fd0fSMax Filippov return pa->resource < pb->resource ?
82420e9fd0fSMax Filippov -1 : (pa->resource > pb->resource ? 1 : 0);
82520e9fd0fSMax Filippov }
82620e9fd0fSMax Filippov
arg_copy_compare(const void * a,const void * b)82789bec9e9SMax Filippov static int arg_copy_compare(const void *a, const void *b)
82889bec9e9SMax Filippov {
82989bec9e9SMax Filippov const struct opcode_arg_copy *pa = a;
83089bec9e9SMax Filippov const struct opcode_arg_copy *pb = b;
83189bec9e9SMax Filippov
83289bec9e9SMax Filippov return pa->resource < pb->resource ?
83389bec9e9SMax Filippov -1 : (pa->resource > pb->resource ? 1 : 0);
83489bec9e9SMax Filippov }
83589bec9e9SMax Filippov
disas_xtensa_insn(CPUXtensaState * env,DisasContext * dc)836fcf5ef2aSThomas Huth static void disas_xtensa_insn(CPUXtensaState *env, DisasContext *dc)
837fcf5ef2aSThomas Huth {
83833071f68SMax Filippov xtensa_isa isa = dc->config->isa;
8394e116893SIlya Leoshkevich unsigned char b[MAX_INSN_LENGTH] = {translator_ldub(env, &dc->base,
8404e116893SIlya Leoshkevich dc->pc)};
84133071f68SMax Filippov unsigned len = xtensa_op0_insn_len(dc, b[0]);
84233071f68SMax Filippov xtensa_format fmt;
843847a6473SMax Filippov int slot, slots;
84433071f68SMax Filippov unsigned i;
84509460970SMax Filippov uint32_t op_flags = 0;
84620e9fd0fSMax Filippov struct slot_prop slot_prop[MAX_INSN_SLOTS];
84720e9fd0fSMax Filippov struct slot_prop *ordered[MAX_INSN_SLOTS];
84889bec9e9SMax Filippov struct opcode_arg_copy arg_copy[MAX_INSN_SLOTS * MAX_OPCODE_ARGS];
84989bec9e9SMax Filippov unsigned n_arg_copy = 0;
85015477819SMax Filippov uint32_t debug_cause = 0;
8516416d16fSMax Filippov uint32_t windowed_register = 0;
852582fef0fSMax Filippov uint32_t coprocessor = 0;
853fcf5ef2aSThomas Huth
85433071f68SMax Filippov if (len == XTENSA_UNDEFINED) {
85533071f68SMax Filippov qemu_log_mask(LOG_GUEST_ERROR,
85633071f68SMax Filippov "unknown instruction length (pc = %08x)\n",
85733071f68SMax Filippov dc->pc);
85833071f68SMax Filippov gen_exception_cause(dc, ILLEGAL_INSTRUCTION_CAUSE);
859f689befdSIlya Leoshkevich dc->base.pc_next = dc->pc + 1;
86033071f68SMax Filippov return;
861fcf5ef2aSThomas Huth }
86233071f68SMax Filippov
8633cc18eecSRichard Henderson dc->base.pc_next = dc->pc + len;
86433071f68SMax Filippov for (i = 1; i < len; ++i) {
8654e116893SIlya Leoshkevich b[i] = translator_ldub(env, &dc->base, dc->pc + i);
866fcf5ef2aSThomas Huth }
86733071f68SMax Filippov xtensa_insnbuf_from_chars(isa, dc->insnbuf, b, len);
86833071f68SMax Filippov fmt = xtensa_format_decode(isa, dc->insnbuf);
86933071f68SMax Filippov if (fmt == XTENSA_UNDEFINED) {
87033071f68SMax Filippov qemu_log_mask(LOG_GUEST_ERROR,
87133071f68SMax Filippov "unrecognized instruction format (pc = %08x)\n",
87233071f68SMax Filippov dc->pc);
873fcf5ef2aSThomas Huth gen_exception_cause(dc, ILLEGAL_INSTRUCTION_CAUSE);
87433071f68SMax Filippov return;
875fcf5ef2aSThomas Huth }
87633071f68SMax Filippov slots = xtensa_format_num_slots(isa, fmt);
87733071f68SMax Filippov for (slot = 0; slot < slots; ++slot) {
87833071f68SMax Filippov xtensa_opcode opc;
879847a6473SMax Filippov int opnd, vopnd, opnds;
880b0b24bdcSMax Filippov OpcodeArg *arg = slot_prop[slot].arg;
88133071f68SMax Filippov XtensaOpcodeOps *ops;
882fcf5ef2aSThomas Huth
88333071f68SMax Filippov xtensa_format_get_slot(isa, fmt, slot, dc->insnbuf, dc->slotbuf);
88433071f68SMax Filippov opc = xtensa_opcode_decode(isa, fmt, slot, dc->slotbuf);
88533071f68SMax Filippov if (opc == XTENSA_UNDEFINED) {
88633071f68SMax Filippov qemu_log_mask(LOG_GUEST_ERROR,
88733071f68SMax Filippov "unrecognized opcode in slot %d (pc = %08x)\n",
88833071f68SMax Filippov slot, dc->pc);
889fcf5ef2aSThomas Huth gen_exception_cause(dc, ILLEGAL_INSTRUCTION_CAUSE);
89033071f68SMax Filippov return;
891fcf5ef2aSThomas Huth }
89233071f68SMax Filippov opnds = xtensa_opcode_num_operands(isa, opc);
893fcf5ef2aSThomas Huth
89433071f68SMax Filippov for (opnd = vopnd = 0; opnd < opnds; ++opnd) {
895b0b24bdcSMax Filippov void **register_file = NULL;
896ed07f685SMax Filippov xtensa_regfile rf;
897b0b24bdcSMax Filippov
898b0b24bdcSMax Filippov if (xtensa_operand_is_register(isa, opc, opnd)) {
899ed07f685SMax Filippov rf = xtensa_operand_regfile(isa, opc, opnd);
900b0b24bdcSMax Filippov register_file = dc->config->regfile[rf];
901b0b24bdcSMax Filippov
902b0b24bdcSMax Filippov if (rf == dc->config->a_regfile) {
903fe7869d6SMax Filippov uint32_t v;
904fe7869d6SMax Filippov
905fe7869d6SMax Filippov xtensa_operand_get_field(isa, opc, opnd, fmt, slot,
906fe7869d6SMax Filippov dc->slotbuf, &v);
907fe7869d6SMax Filippov xtensa_operand_decode(isa, opc, opnd, &v);
908fe7869d6SMax Filippov windowed_register |= 1u << v;
909fe7869d6SMax Filippov }
910b0b24bdcSMax Filippov }
91133071f68SMax Filippov if (xtensa_operand_is_visible(isa, opc, opnd)) {
91233071f68SMax Filippov uint32_t v;
913fcf5ef2aSThomas Huth
91433071f68SMax Filippov xtensa_operand_get_field(isa, opc, opnd, fmt, slot,
91533071f68SMax Filippov dc->slotbuf, &v);
91633071f68SMax Filippov xtensa_operand_decode(isa, opc, opnd, &v);
917b0b24bdcSMax Filippov arg[vopnd].raw_imm = v;
91833071f68SMax Filippov if (xtensa_operand_is_PCrelative(isa, opc, opnd)) {
91933071f68SMax Filippov xtensa_operand_undo_reloc(isa, opc, opnd, &v, dc->pc);
920fcf5ef2aSThomas Huth }
921b0b24bdcSMax Filippov arg[vopnd].imm = v;
922b0b24bdcSMax Filippov if (register_file) {
923b0b24bdcSMax Filippov arg[vopnd].in = register_file[v];
924b0b24bdcSMax Filippov arg[vopnd].out = register_file[v];
925ed07f685SMax Filippov arg[vopnd].num_bits = xtensa_regfile_num_bits(isa, rf);
926ed07f685SMax Filippov } else {
927ed07f685SMax Filippov arg[vopnd].num_bits = 32;
928b0b24bdcSMax Filippov }
92933071f68SMax Filippov ++vopnd;
930fcf5ef2aSThomas Huth }
931fcf5ef2aSThomas Huth }
93233071f68SMax Filippov ops = dc->config->opcode_ops[opc];
93309460970SMax Filippov slot_prop[slot].ops = ops;
93409460970SMax Filippov
93533071f68SMax Filippov if (ops) {
93609460970SMax Filippov op_flags |= ops->op_flags;
93791dc2b2dSMax Filippov if (ops->test_exceptions) {
93891dc2b2dSMax Filippov op_flags |= ops->test_exceptions(dc, arg, ops->par);
93991dc2b2dSMax Filippov }
940fcf5ef2aSThomas Huth } else {
94109460970SMax Filippov qemu_log_mask(LOG_UNIMP,
94233071f68SMax Filippov "unimplemented opcode '%s' in slot %d (pc = %08x)\n",
94333071f68SMax Filippov xtensa_opcode_name(isa, opc), slot, dc->pc);
94409460970SMax Filippov op_flags |= XTENSA_OP_ILL;
94509460970SMax Filippov }
94691dc2b2dSMax Filippov if (op_flags & XTENSA_OP_ILL) {
947fcf5ef2aSThomas Huth gen_exception_cause(dc, ILLEGAL_INSTRUCTION_CAUSE);
94833071f68SMax Filippov return;
949fcf5ef2aSThomas Huth }
95091dc2b2dSMax Filippov if (op_flags & XTENSA_OP_DEBUG_BREAK) {
95115477819SMax Filippov debug_cause |= ops->par[0];
95215477819SMax Filippov }
9536416d16fSMax Filippov if (ops->test_overflow) {
9546416d16fSMax Filippov windowed_register |= ops->test_overflow(dc, arg, ops->par);
9556416d16fSMax Filippov }
956582fef0fSMax Filippov coprocessor |= ops->coprocessor;
95720e9fd0fSMax Filippov
95820e9fd0fSMax Filippov if (slots > 1) {
95920e9fd0fSMax Filippov slot_prop[slot].n_in = 0;
96020e9fd0fSMax Filippov slot_prop[slot].n_out = 0;
961068e538aSMax Filippov slot_prop[slot].op_flags = ops->op_flags & XTENSA_OP_LOAD_STORE;
96220e9fd0fSMax Filippov
96320e9fd0fSMax Filippov opnds = xtensa_opcode_num_operands(isa, opc);
96420e9fd0fSMax Filippov
96520e9fd0fSMax Filippov for (opnd = vopnd = 0; opnd < opnds; ++opnd) {
96620e9fd0fSMax Filippov bool visible = xtensa_operand_is_visible(isa, opc, opnd);
96720e9fd0fSMax Filippov
96820e9fd0fSMax Filippov if (xtensa_operand_is_register(isa, opc, opnd)) {
96920e9fd0fSMax Filippov xtensa_regfile rf = xtensa_operand_regfile(isa, opc, opnd);
97020e9fd0fSMax Filippov uint32_t v = 0;
97120e9fd0fSMax Filippov
97220e9fd0fSMax Filippov xtensa_operand_get_field(isa, opc, opnd, fmt, slot,
97320e9fd0fSMax Filippov dc->slotbuf, &v);
97420e9fd0fSMax Filippov xtensa_operand_decode(isa, opc, opnd, &v);
97520e9fd0fSMax Filippov opcode_add_resource(slot_prop + slot,
97620e9fd0fSMax Filippov encode_resource(RES_REGFILE, rf, v),
97720e9fd0fSMax Filippov xtensa_operand_inout(isa, opc, opnd),
97820e9fd0fSMax Filippov visible ? vopnd : -1);
97920e9fd0fSMax Filippov }
98020e9fd0fSMax Filippov if (visible) {
98120e9fd0fSMax Filippov ++vopnd;
98220e9fd0fSMax Filippov }
98320e9fd0fSMax Filippov }
98420e9fd0fSMax Filippov
98520e9fd0fSMax Filippov opnds = xtensa_opcode_num_stateOperands(isa, opc);
98620e9fd0fSMax Filippov
98720e9fd0fSMax Filippov for (opnd = 0; opnd < opnds; ++opnd) {
98820e9fd0fSMax Filippov xtensa_state state = xtensa_stateOperand_state(isa, opc, opnd);
98920e9fd0fSMax Filippov
99020e9fd0fSMax Filippov opcode_add_resource(slot_prop + slot,
99120e9fd0fSMax Filippov encode_resource(RES_STATE, 0, state),
99220e9fd0fSMax Filippov xtensa_stateOperand_inout(isa, opc, opnd),
99320e9fd0fSMax Filippov -1);
99420e9fd0fSMax Filippov }
99520e9fd0fSMax Filippov if (xtensa_opcode_is_branch(isa, opc) ||
99620e9fd0fSMax Filippov xtensa_opcode_is_jump(isa, opc) ||
99720e9fd0fSMax Filippov xtensa_opcode_is_loop(isa, opc) ||
99820e9fd0fSMax Filippov xtensa_opcode_is_call(isa, opc)) {
99920e9fd0fSMax Filippov slot_prop[slot].op_flags |= XTENSA_OP_CONTROL_FLOW;
100020e9fd0fSMax Filippov }
100120e9fd0fSMax Filippov
100220e9fd0fSMax Filippov qsort(slot_prop[slot].in, slot_prop[slot].n_in,
100320e9fd0fSMax Filippov sizeof(slot_prop[slot].in[0]), resource_compare);
100420e9fd0fSMax Filippov qsort(slot_prop[slot].out, slot_prop[slot].n_out,
100520e9fd0fSMax Filippov sizeof(slot_prop[slot].out[0]), resource_compare);
100620e9fd0fSMax Filippov }
100720e9fd0fSMax Filippov }
100820e9fd0fSMax Filippov
100920e9fd0fSMax Filippov if (slots > 1) {
101089bec9e9SMax Filippov if (!tsort(slot_prop, ordered, slots, arg_copy, &n_arg_copy)) {
101120e9fd0fSMax Filippov qemu_log_mask(LOG_UNIMP,
101220e9fd0fSMax Filippov "Circular resource dependencies (pc = %08x)\n",
101320e9fd0fSMax Filippov dc->pc);
101420e9fd0fSMax Filippov gen_exception_cause(dc, ILLEGAL_INSTRUCTION_CAUSE);
101520e9fd0fSMax Filippov return;
101620e9fd0fSMax Filippov }
101720e9fd0fSMax Filippov } else {
101820e9fd0fSMax Filippov ordered[0] = slot_prop + 0;
1019fcf5ef2aSThomas Huth }
102009460970SMax Filippov
102121a2dad5SMax Filippov if ((op_flags & XTENSA_OP_PRIVILEGED) &&
102221a2dad5SMax Filippov !gen_check_privilege(dc)) {
102321a2dad5SMax Filippov return;
102421a2dad5SMax Filippov }
102521a2dad5SMax Filippov
10264c6ec5f3SMax Filippov if (op_flags & XTENSA_OP_SYSCALL) {
10274c6ec5f3SMax Filippov gen_exception_cause(dc, SYSCALL_CAUSE);
10284c6ec5f3SMax Filippov return;
10294c6ec5f3SMax Filippov }
10304c6ec5f3SMax Filippov
103115477819SMax Filippov if ((op_flags & XTENSA_OP_DEBUG_BREAK) && dc->debug) {
103215477819SMax Filippov gen_debug_exception(dc, debug_cause);
103315477819SMax Filippov return;
103415477819SMax Filippov }
103515477819SMax Filippov
10366416d16fSMax Filippov if (windowed_register && !gen_window_check(dc, windowed_register)) {
10376416d16fSMax Filippov return;
10386416d16fSMax Filippov }
10396416d16fSMax Filippov
1040f473019aSMax Filippov if (op_flags & XTENSA_OP_UNDERFLOW) {
10416ade0ce9SMax Filippov TCGv_i32 pc = tcg_constant_i32(dc->pc);
1042f473019aSMax Filippov
1043ad75a51eSRichard Henderson gen_helper_test_underflow_retw(tcg_env, pc);
1044f473019aSMax Filippov }
1045f473019aSMax Filippov
104690d6494dSMax Filippov if (op_flags & XTENSA_OP_ALLOCA) {
10476ade0ce9SMax Filippov TCGv_i32 pc = tcg_constant_i32(dc->pc);
104890d6494dSMax Filippov
1049ad75a51eSRichard Henderson gen_helper_movsp(tcg_env, pc);
105090d6494dSMax Filippov }
105190d6494dSMax Filippov
1052582fef0fSMax Filippov if (coprocessor && !gen_check_cpenable(dc, coprocessor)) {
1053582fef0fSMax Filippov return;
1054582fef0fSMax Filippov }
1055582fef0fSMax Filippov
105689bec9e9SMax Filippov if (n_arg_copy) {
105789bec9e9SMax Filippov uint32_t resource;
105889bec9e9SMax Filippov void *temp;
105989bec9e9SMax Filippov unsigned j;
106089bec9e9SMax Filippov
106189bec9e9SMax Filippov qsort(arg_copy, n_arg_copy, sizeof(*arg_copy), arg_copy_compare);
106289bec9e9SMax Filippov for (i = j = 0; i < n_arg_copy; ++i) {
106389bec9e9SMax Filippov if (i == 0 || arg_copy[i].resource != resource) {
106489bec9e9SMax Filippov resource = arg_copy[i].resource;
1065ed07f685SMax Filippov if (arg_copy[i].arg->num_bits <= 32) {
1066177bbc81SRichard Henderson temp = tcg_temp_new_i32();
106789bec9e9SMax Filippov tcg_gen_mov_i32(temp, arg_copy[i].arg->in);
1068ed07f685SMax Filippov } else if (arg_copy[i].arg->num_bits <= 64) {
1069177bbc81SRichard Henderson temp = tcg_temp_new_i64();
1070ed07f685SMax Filippov tcg_gen_mov_i64(temp, arg_copy[i].arg->in);
1071ed07f685SMax Filippov } else {
1072ed07f685SMax Filippov g_assert_not_reached();
1073ed07f685SMax Filippov }
107489bec9e9SMax Filippov arg_copy[i].temp = temp;
107589bec9e9SMax Filippov
107689bec9e9SMax Filippov if (i != j) {
107789bec9e9SMax Filippov arg_copy[j] = arg_copy[i];
107889bec9e9SMax Filippov }
107989bec9e9SMax Filippov ++j;
108089bec9e9SMax Filippov }
108189bec9e9SMax Filippov arg_copy[i].arg->in = temp;
108289bec9e9SMax Filippov }
108389bec9e9SMax Filippov n_arg_copy = j;
108489bec9e9SMax Filippov }
108589bec9e9SMax Filippov
10864a038955SMax Filippov if (op_flags & XTENSA_OP_DIVIDE_BY_ZERO) {
10874a038955SMax Filippov for (slot = 0; slot < slots; ++slot) {
10884a038955SMax Filippov if (slot_prop[slot].ops->op_flags & XTENSA_OP_DIVIDE_BY_ZERO) {
10894a038955SMax Filippov gen_zero_check(dc, slot_prop[slot].arg);
10904a038955SMax Filippov }
10914a038955SMax Filippov }
10924a038955SMax Filippov }
10934a038955SMax Filippov
109445b71a79SMax Filippov dc->op_flags = op_flags;
109545b71a79SMax Filippov
109609460970SMax Filippov for (slot = 0; slot < slots; ++slot) {
109720e9fd0fSMax Filippov struct slot_prop *pslot = ordered[slot];
109820e9fd0fSMax Filippov XtensaOpcodeOps *ops = pslot->ops;
109909460970SMax Filippov
110020e9fd0fSMax Filippov ops->translate(dc, pslot->arg, ops->par);
110109460970SMax Filippov }
1102226444a8SMax Filippov
1103226444a8SMax Filippov if (dc->base.is_jmp == DISAS_NEXT) {
110445b71a79SMax Filippov gen_postprocess(dc, 0);
110545b71a79SMax Filippov dc->op_flags = 0;
1106226444a8SMax Filippov if (op_flags & XTENSA_OP_EXIT_TB_M1) {
1107226444a8SMax Filippov /* Change in mmu index, memory mapping or tb->flags; exit tb */
1108226444a8SMax Filippov gen_jumpi_check_loop_end(dc, -1);
1109bf525107SMax Filippov } else if (op_flags & XTENSA_OP_EXIT_TB_0) {
1110bf525107SMax Filippov gen_jumpi_check_loop_end(dc, 0);
111145b71a79SMax Filippov } else {
1112fcf5ef2aSThomas Huth gen_check_loop_end(dc, 0);
1113fcf5ef2aSThomas Huth }
111445b71a79SMax Filippov }
11153cc18eecSRichard Henderson dc->pc = dc->base.pc_next;
1116fcf5ef2aSThomas Huth }
1117fcf5ef2aSThomas Huth
xtensa_insn_len(CPUXtensaState * env,DisasContext * dc)1118fcf5ef2aSThomas Huth static inline unsigned xtensa_insn_len(CPUXtensaState *env, DisasContext *dc)
1119fcf5ef2aSThomas Huth {
1120a41cd1e6SRichard Henderson uint8_t b0 = translator_ldub(env, &dc->base, dc->pc);
112133071f68SMax Filippov return xtensa_op0_insn_len(dc, b0);
1122fcf5ef2aSThomas Huth }
1123fcf5ef2aSThomas Huth
xtensa_tr_init_disas_context(DisasContextBase * dcbase,CPUState * cpu)11249c509ff9SRichard Henderson static void xtensa_tr_init_disas_context(DisasContextBase *dcbase,
11259c509ff9SRichard Henderson CPUState *cpu)
1126fcf5ef2aSThomas Huth {
11279c509ff9SRichard Henderson DisasContext *dc = container_of(dcbase, DisasContext, base);
11289c509ff9SRichard Henderson uint32_t tb_flags = dc->base.tb->flags;
1129fcf5ef2aSThomas Huth
113052049266SPhilippe Mathieu-Daudé dc->config = cpu_env(cpu)->config;
11319c509ff9SRichard Henderson dc->pc = dc->base.pc_first;
11329c509ff9SRichard Henderson dc->ring = tb_flags & XTENSA_TBFLAG_RING_MASK;
11339c509ff9SRichard Henderson dc->cring = (tb_flags & XTENSA_TBFLAG_EXCM) ? 0 : dc->ring;
11345d630cefSMax Filippov dc->lbeg_off = (dc->base.tb->cs_base & XTENSA_CSBASE_LBEG_OFF_MASK) >>
11355d630cefSMax Filippov XTENSA_CSBASE_LBEG_OFF_SHIFT;
11365d630cefSMax Filippov dc->lend = (dc->base.tb->cs_base & XTENSA_CSBASE_LEND_MASK) +
11375d630cefSMax Filippov (dc->base.pc_first & TARGET_PAGE_MASK);
11389c509ff9SRichard Henderson dc->debug = tb_flags & XTENSA_TBFLAG_DEBUG;
11399c509ff9SRichard Henderson dc->icount = tb_flags & XTENSA_TBFLAG_ICOUNT;
11409c509ff9SRichard Henderson dc->cpenable = (tb_flags & XTENSA_TBFLAG_CPENABLE_MASK) >>
1141fcf5ef2aSThomas Huth XTENSA_TBFLAG_CPENABLE_SHIFT;
11429c509ff9SRichard Henderson dc->window = ((tb_flags & XTENSA_TBFLAG_WINDOW_MASK) >>
1143fcf5ef2aSThomas Huth XTENSA_TBFLAG_WINDOW_SHIFT);
114409460970SMax Filippov dc->cwoe = tb_flags & XTENSA_TBFLAG_CWOE;
11456416d16fSMax Filippov dc->callinc = ((tb_flags & XTENSA_TBFLAG_CALLINC_MASK) >>
11466416d16fSMax Filippov XTENSA_TBFLAG_CALLINC_SHIFT);
11471d38a701SRichard Henderson init_sar_tracker(dc);
11489c509ff9SRichard Henderson }
11499c509ff9SRichard Henderson
xtensa_tr_tb_start(DisasContextBase * dcbase,CPUState * cpu)11509c509ff9SRichard Henderson static void xtensa_tr_tb_start(DisasContextBase *dcbase, CPUState *cpu)
11519c509ff9SRichard Henderson {
11529c509ff9SRichard Henderson DisasContext *dc = container_of(dcbase, DisasContext, base);
11539c509ff9SRichard Henderson
11541d38a701SRichard Henderson if (dc->icount) {
1155177bbc81SRichard Henderson dc->next_icount = tcg_temp_new_i32();
1156fcf5ef2aSThomas Huth }
1157fcf5ef2aSThomas Huth }
1158fcf5ef2aSThomas Huth
xtensa_tr_insn_start(DisasContextBase * dcbase,CPUState * cpu)11599c509ff9SRichard Henderson static void xtensa_tr_insn_start(DisasContextBase *dcbase, CPUState *cpu)
11609c509ff9SRichard Henderson {
11619c509ff9SRichard Henderson tcg_gen_insn_start(dcbase->pc_next);
11629c509ff9SRichard Henderson }
1163fcf5ef2aSThomas Huth
xtensa_tr_translate_insn(DisasContextBase * dcbase,CPUState * cpu)11649c509ff9SRichard Henderson static void xtensa_tr_translate_insn(DisasContextBase *dcbase, CPUState *cpu)
11659c509ff9SRichard Henderson {
11669c509ff9SRichard Henderson DisasContext *dc = container_of(dcbase, DisasContext, base);
1167b77af26eSRichard Henderson CPUXtensaState *env = cpu_env(cpu);
11689c509ff9SRichard Henderson target_ulong page_start;
11699c509ff9SRichard Henderson
11709c509ff9SRichard Henderson /* These two conditions only apply to the first insn in the TB,
11719c509ff9SRichard Henderson but this is the first TranslateOps hook that allows exiting. */
11729c509ff9SRichard Henderson if ((tb_cflags(dc->base.tb) & CF_USE_ICOUNT)
11739c509ff9SRichard Henderson && (dc->base.tb->flags & XTENSA_TBFLAG_YIELD)) {
11749c509ff9SRichard Henderson gen_exception(dc, EXCP_YIELD);
1175f689befdSIlya Leoshkevich dc->base.pc_next = dc->pc + 1;
11769c509ff9SRichard Henderson dc->base.is_jmp = DISAS_NORETURN;
11779c509ff9SRichard Henderson return;
11789c509ff9SRichard Henderson }
1179fcf5ef2aSThomas Huth
11801d38a701SRichard Henderson if (dc->icount) {
1181fcf5ef2aSThomas Huth TCGLabel *label = gen_new_label();
1182fcf5ef2aSThomas Huth
11831d38a701SRichard Henderson tcg_gen_addi_i32(dc->next_icount, cpu_SR[ICOUNT], 1);
11841d38a701SRichard Henderson tcg_gen_brcondi_i32(TCG_COND_NE, dc->next_icount, 0, label);
11851d38a701SRichard Henderson tcg_gen_mov_i32(dc->next_icount, cpu_SR[ICOUNT]);
11861d38a701SRichard Henderson if (dc->debug) {
11871d38a701SRichard Henderson gen_debug_exception(dc, DEBUGCAUSE_IC);
1188fcf5ef2aSThomas Huth }
1189fcf5ef2aSThomas Huth gen_set_label(label);
1190fcf5ef2aSThomas Huth }
1191fcf5ef2aSThomas Huth
11921d38a701SRichard Henderson disas_xtensa_insn(env, dc);
11939c509ff9SRichard Henderson
11941d38a701SRichard Henderson if (dc->icount) {
11951d38a701SRichard Henderson tcg_gen_mov_i32(cpu_SR[ICOUNT], dc->next_icount);
1196fcf5ef2aSThomas Huth }
11979c509ff9SRichard Henderson
11989c509ff9SRichard Henderson /* End the TB if the next insn will cross into the next page. */
11999c509ff9SRichard Henderson page_start = dc->base.pc_first & TARGET_PAGE_MASK;
12009c509ff9SRichard Henderson if (dc->base.is_jmp == DISAS_NEXT &&
12019c509ff9SRichard Henderson (dc->pc - page_start >= TARGET_PAGE_SIZE ||
12029c509ff9SRichard Henderson dc->pc - page_start + xtensa_insn_len(env, dc) > TARGET_PAGE_SIZE)) {
12039c509ff9SRichard Henderson dc->base.is_jmp = DISAS_TOO_MANY;
1204fcf5ef2aSThomas Huth }
12059c509ff9SRichard Henderson }
12069c509ff9SRichard Henderson
xtensa_tr_tb_stop(DisasContextBase * dcbase,CPUState * cpu)12079c509ff9SRichard Henderson static void xtensa_tr_tb_stop(DisasContextBase *dcbase, CPUState *cpu)
12089c509ff9SRichard Henderson {
12099c509ff9SRichard Henderson DisasContext *dc = container_of(dcbase, DisasContext, base);
12109c509ff9SRichard Henderson
12119c509ff9SRichard Henderson switch (dc->base.is_jmp) {
12129c509ff9SRichard Henderson case DISAS_NORETURN:
12139c509ff9SRichard Henderson break;
12149c509ff9SRichard Henderson case DISAS_TOO_MANY:
12151d38a701SRichard Henderson gen_jumpi(dc, dc->pc, 0);
12169c509ff9SRichard Henderson break;
12179c509ff9SRichard Henderson default:
12189c509ff9SRichard Henderson g_assert_not_reached();
1219fcf5ef2aSThomas Huth }
12209c509ff9SRichard Henderson }
12219c509ff9SRichard Henderson
12229c509ff9SRichard Henderson static const TranslatorOps xtensa_translator_ops = {
12239c509ff9SRichard Henderson .init_disas_context = xtensa_tr_init_disas_context,
12249c509ff9SRichard Henderson .tb_start = xtensa_tr_tb_start,
12259c509ff9SRichard Henderson .insn_start = xtensa_tr_insn_start,
12269c509ff9SRichard Henderson .translate_insn = xtensa_tr_translate_insn,
12279c509ff9SRichard Henderson .tb_stop = xtensa_tr_tb_stop,
12289c509ff9SRichard Henderson };
12299c509ff9SRichard Henderson
gen_intermediate_code(CPUState * cpu,TranslationBlock * tb,int * max_insns,vaddr pc,void * host_pc)1230597f9b2dSRichard Henderson void gen_intermediate_code(CPUState *cpu, TranslationBlock *tb, int *max_insns,
123132f0c394SAnton Johansson vaddr pc, void *host_pc)
12329c509ff9SRichard Henderson {
12339c509ff9SRichard Henderson DisasContext dc = {};
1234306c8721SRichard Henderson translator_loop(cpu, tb, max_insns, pc, host_pc,
1235306c8721SRichard Henderson &xtensa_translator_ops, &dc.base);
1236fcf5ef2aSThomas Huth }
1237fcf5ef2aSThomas Huth
xtensa_cpu_dump_state(CPUState * cs,FILE * f,int flags)123890c84c56SMarkus Armbruster void xtensa_cpu_dump_state(CPUState *cs, FILE *f, int flags)
1239fcf5ef2aSThomas Huth {
124052049266SPhilippe Mathieu-Daudé CPUXtensaState *env = cpu_env(cs);
124159419607SMax Filippov xtensa_isa isa = env->config->isa;
1242fcf5ef2aSThomas Huth int i, j;
1243fcf5ef2aSThomas Huth
124490c84c56SMarkus Armbruster qemu_fprintf(f, "PC=%08x\n\n", env->pc);
1245fcf5ef2aSThomas Huth
124659419607SMax Filippov for (i = j = 0; i < xtensa_isa_num_sysregs(isa); ++i) {
124759419607SMax Filippov const uint32_t *reg =
124859419607SMax Filippov xtensa_sysreg_is_user(isa, i) ? env->uregs : env->sregs;
124959419607SMax Filippov int regno = xtensa_sysreg_number(isa, i);
125059419607SMax Filippov
125159419607SMax Filippov if (regno >= 0) {
125290c84c56SMarkus Armbruster qemu_fprintf(f, "%12s=%08x%c",
125359419607SMax Filippov xtensa_sysreg_name(isa, i),
125459419607SMax Filippov reg[regno],
1255fcf5ef2aSThomas Huth (j++ % 4) == 3 ? '\n' : ' ');
1256fcf5ef2aSThomas Huth }
1257fcf5ef2aSThomas Huth }
1258fcf5ef2aSThomas Huth
125990c84c56SMarkus Armbruster qemu_fprintf(f, (j % 4) == 0 ? "\n" : "\n\n");
1260fcf5ef2aSThomas Huth
1261fcf5ef2aSThomas Huth for (i = 0; i < 16; ++i) {
126290c84c56SMarkus Armbruster qemu_fprintf(f, " A%02d=%08x%c",
126390c84c56SMarkus Armbruster i, env->regs[i], (i % 4) == 3 ? '\n' : ' ');
1264fcf5ef2aSThomas Huth }
1265fcf5ef2aSThomas Huth
1266b55b1afdSMax Filippov xtensa_sync_phys_from_window(env);
126790c84c56SMarkus Armbruster qemu_fprintf(f, "\n");
1268fcf5ef2aSThomas Huth
1269fcf5ef2aSThomas Huth for (i = 0; i < env->config->nareg; ++i) {
127090c84c56SMarkus Armbruster qemu_fprintf(f, "AR%02d=%08x ", i, env->phys_regs[i]);
1271b9317a2aSMax Filippov if (i % 4 == 3) {
1272b9317a2aSMax Filippov bool ws = (env->sregs[WINDOW_START] & (1 << (i / 4))) != 0;
1273b9317a2aSMax Filippov bool cw = env->sregs[WINDOW_BASE] == i / 4;
1274b9317a2aSMax Filippov
127590c84c56SMarkus Armbruster qemu_fprintf(f, "%c%c\n", ws ? '<' : ' ', cw ? '=' : ' ');
1276b9317a2aSMax Filippov }
1277fcf5ef2aSThomas Huth }
1278fcf5ef2aSThomas Huth
1279f29c0b17SRichard Henderson if ((flags & CPU_DUMP_FPU) &&
1280f29c0b17SRichard Henderson xtensa_option_enabled(env->config, XTENSA_OPTION_FP_COPROCESSOR)) {
128190c84c56SMarkus Armbruster qemu_fprintf(f, "\n");
1282fcf5ef2aSThomas Huth
1283fcf5ef2aSThomas Huth for (i = 0; i < 16; ++i) {
1284cfa9f051SMax Filippov qemu_fprintf(f, "F%02d=%08x (%-+15.8e)%c", i,
1285fcf5ef2aSThomas Huth float32_val(env->fregs[i].f32[FP_F32_LOW]),
1286fcf5ef2aSThomas Huth *(float *)(env->fregs[i].f32 + FP_F32_LOW),
1287fcf5ef2aSThomas Huth (i % 2) == 1 ? '\n' : ' ');
1288fcf5ef2aSThomas Huth }
1289fcf5ef2aSThomas Huth }
1290cfa9f051SMax Filippov
1291cfa9f051SMax Filippov if ((flags & CPU_DUMP_FPU) &&
1292cfa9f051SMax Filippov xtensa_option_enabled(env->config, XTENSA_OPTION_DFP_COPROCESSOR) &&
1293cfa9f051SMax Filippov !xtensa_option_enabled(env->config, XTENSA_OPTION_DFPU_SINGLE_ONLY)) {
1294cfa9f051SMax Filippov qemu_fprintf(f, "\n");
1295cfa9f051SMax Filippov
1296cfa9f051SMax Filippov for (i = 0; i < 16; ++i) {
1297cfa9f051SMax Filippov qemu_fprintf(f, "F%02d=%016"PRIx64" (%-+24.16le)%c", i,
1298cfa9f051SMax Filippov float64_val(env->fregs[i].f64),
1299cfa9f051SMax Filippov *(double *)(&env->fregs[i].f64),
1300cfa9f051SMax Filippov (i % 2) == 1 ? '\n' : ' ');
1301cfa9f051SMax Filippov }
1302cfa9f051SMax Filippov }
1303fcf5ef2aSThomas Huth }
1304fcf5ef2aSThomas Huth
translate_abs(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])1305b0b24bdcSMax Filippov static void translate_abs(DisasContext *dc, const OpcodeArg arg[],
1306168c12b0SMax Filippov const uint32_t par[])
1307168c12b0SMax Filippov {
1308e1c47865SRichard Henderson tcg_gen_abs_i32(arg[0].out, arg[1].in);
1309168c12b0SMax Filippov }
1310168c12b0SMax Filippov
translate_add(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])1311b0b24bdcSMax Filippov static void translate_add(DisasContext *dc, const OpcodeArg arg[],
1312168c12b0SMax Filippov const uint32_t par[])
1313168c12b0SMax Filippov {
1314b0b24bdcSMax Filippov tcg_gen_add_i32(arg[0].out, arg[1].in, arg[2].in);
1315168c12b0SMax Filippov }
1316168c12b0SMax Filippov
translate_addi(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])1317b0b24bdcSMax Filippov static void translate_addi(DisasContext *dc, const OpcodeArg arg[],
1318168c12b0SMax Filippov const uint32_t par[])
1319168c12b0SMax Filippov {
1320b0b24bdcSMax Filippov tcg_gen_addi_i32(arg[0].out, arg[1].in, arg[2].imm);
1321168c12b0SMax Filippov }
1322168c12b0SMax Filippov
translate_addx(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])1323b0b24bdcSMax Filippov static void translate_addx(DisasContext *dc, const OpcodeArg arg[],
1324168c12b0SMax Filippov const uint32_t par[])
1325168c12b0SMax Filippov {
1326168c12b0SMax Filippov TCGv_i32 tmp = tcg_temp_new_i32();
1327b0b24bdcSMax Filippov tcg_gen_shli_i32(tmp, arg[1].in, par[0]);
1328b0b24bdcSMax Filippov tcg_gen_add_i32(arg[0].out, tmp, arg[2].in);
1329168c12b0SMax Filippov }
1330168c12b0SMax Filippov
translate_all(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])1331b0b24bdcSMax Filippov static void translate_all(DisasContext *dc, const OpcodeArg arg[],
1332168c12b0SMax Filippov const uint32_t par[])
1333168c12b0SMax Filippov {
1334168c12b0SMax Filippov uint32_t shift = par[1];
1335b6611d8dSRichard Henderson TCGv_i32 mask = tcg_constant_i32(((1 << shift) - 1) << arg[1].imm);
1336168c12b0SMax Filippov TCGv_i32 tmp = tcg_temp_new_i32();
1337168c12b0SMax Filippov
1338575e962aSMax Filippov tcg_gen_and_i32(tmp, arg[1].in, mask);
1339168c12b0SMax Filippov if (par[0]) {
1340b0b24bdcSMax Filippov tcg_gen_addi_i32(tmp, tmp, 1 << arg[1].imm);
1341168c12b0SMax Filippov } else {
1342168c12b0SMax Filippov tcg_gen_add_i32(tmp, tmp, mask);
1343168c12b0SMax Filippov }
1344b0b24bdcSMax Filippov tcg_gen_shri_i32(tmp, tmp, arg[1].imm + shift);
1345575e962aSMax Filippov tcg_gen_deposit_i32(arg[0].out, arg[0].out,
1346b0b24bdcSMax Filippov tmp, arg[0].imm, 1);
1347168c12b0SMax Filippov }
1348168c12b0SMax Filippov
translate_and(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])1349b0b24bdcSMax Filippov static void translate_and(DisasContext *dc, const OpcodeArg arg[],
1350168c12b0SMax Filippov const uint32_t par[])
1351168c12b0SMax Filippov {
1352b0b24bdcSMax Filippov tcg_gen_and_i32(arg[0].out, arg[1].in, arg[2].in);
1353168c12b0SMax Filippov }
1354168c12b0SMax Filippov
translate_ball(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])1355b0b24bdcSMax Filippov static void translate_ball(DisasContext *dc, const OpcodeArg arg[],
1356168c12b0SMax Filippov const uint32_t par[])
1357168c12b0SMax Filippov {
1358168c12b0SMax Filippov TCGv_i32 tmp = tcg_temp_new_i32();
1359b0b24bdcSMax Filippov tcg_gen_and_i32(tmp, arg[0].in, arg[1].in);
1360b0b24bdcSMax Filippov gen_brcond(dc, par[0], tmp, arg[1].in, arg[2].imm);
1361168c12b0SMax Filippov }
1362168c12b0SMax Filippov
translate_bany(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])1363b0b24bdcSMax Filippov static void translate_bany(DisasContext *dc, const OpcodeArg arg[],
1364168c12b0SMax Filippov const uint32_t par[])
1365168c12b0SMax Filippov {
1366168c12b0SMax Filippov TCGv_i32 tmp = tcg_temp_new_i32();
1367b0b24bdcSMax Filippov tcg_gen_and_i32(tmp, arg[0].in, arg[1].in);
1368b0b24bdcSMax Filippov gen_brcondi(dc, par[0], tmp, 0, arg[2].imm);
1369168c12b0SMax Filippov }
1370168c12b0SMax Filippov
translate_b(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])1371b0b24bdcSMax Filippov static void translate_b(DisasContext *dc, const OpcodeArg arg[],
1372168c12b0SMax Filippov const uint32_t par[])
1373168c12b0SMax Filippov {
1374b0b24bdcSMax Filippov gen_brcond(dc, par[0], arg[0].in, arg[1].in, arg[2].imm);
1375168c12b0SMax Filippov }
1376168c12b0SMax Filippov
translate_bb(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])1377b0b24bdcSMax Filippov static void translate_bb(DisasContext *dc, const OpcodeArg arg[],
1378168c12b0SMax Filippov const uint32_t par[])
1379168c12b0SMax Filippov {
1380168c12b0SMax Filippov TCGv_i32 tmp = tcg_temp_new_i32();
138137d7328eSRichard Henderson
1382b0b24bdcSMax Filippov tcg_gen_andi_i32(tmp, arg[1].in, 0x1f);
138337d7328eSRichard Henderson if (TARGET_BIG_ENDIAN) {
138437d7328eSRichard Henderson tcg_gen_shr_i32(tmp, tcg_constant_i32(0x80000000u), tmp);
138537d7328eSRichard Henderson } else {
138637d7328eSRichard Henderson tcg_gen_shl_i32(tmp, tcg_constant_i32(0x00000001u), tmp);
138737d7328eSRichard Henderson }
138837d7328eSRichard Henderson tcg_gen_and_i32(tmp, arg[0].in, tmp);
1389b0b24bdcSMax Filippov gen_brcondi(dc, par[0], tmp, 0, arg[2].imm);
1390168c12b0SMax Filippov }
1391168c12b0SMax Filippov
translate_bbi(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])1392b0b24bdcSMax Filippov static void translate_bbi(DisasContext *dc, const OpcodeArg arg[],
1393168c12b0SMax Filippov const uint32_t par[])
1394168c12b0SMax Filippov {
1395168c12b0SMax Filippov TCGv_i32 tmp = tcg_temp_new_i32();
1396ee3eb3a7SMarc-André Lureau #if TARGET_BIG_ENDIAN
1397b0b24bdcSMax Filippov tcg_gen_andi_i32(tmp, arg[0].in, 0x80000000u >> arg[1].imm);
1398168c12b0SMax Filippov #else
1399b0b24bdcSMax Filippov tcg_gen_andi_i32(tmp, arg[0].in, 0x00000001u << arg[1].imm);
1400168c12b0SMax Filippov #endif
1401b0b24bdcSMax Filippov gen_brcondi(dc, par[0], tmp, 0, arg[2].imm);
1402168c12b0SMax Filippov }
1403168c12b0SMax Filippov
translate_bi(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])1404b0b24bdcSMax Filippov static void translate_bi(DisasContext *dc, const OpcodeArg arg[],
1405168c12b0SMax Filippov const uint32_t par[])
1406168c12b0SMax Filippov {
1407b0b24bdcSMax Filippov gen_brcondi(dc, par[0], arg[0].in, arg[1].imm, arg[2].imm);
1408168c12b0SMax Filippov }
1409168c12b0SMax Filippov
translate_bz(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])1410b0b24bdcSMax Filippov static void translate_bz(DisasContext *dc, const OpcodeArg arg[],
1411168c12b0SMax Filippov const uint32_t par[])
1412168c12b0SMax Filippov {
1413b0b24bdcSMax Filippov gen_brcondi(dc, par[0], arg[0].in, 0, arg[1].imm);
1414168c12b0SMax Filippov }
1415168c12b0SMax Filippov
1416168c12b0SMax Filippov enum {
1417168c12b0SMax Filippov BOOLEAN_AND,
1418168c12b0SMax Filippov BOOLEAN_ANDC,
1419168c12b0SMax Filippov BOOLEAN_OR,
1420168c12b0SMax Filippov BOOLEAN_ORC,
1421168c12b0SMax Filippov BOOLEAN_XOR,
1422168c12b0SMax Filippov };
1423168c12b0SMax Filippov
translate_boolean(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])1424b0b24bdcSMax Filippov static void translate_boolean(DisasContext *dc, const OpcodeArg arg[],
1425168c12b0SMax Filippov const uint32_t par[])
1426168c12b0SMax Filippov {
1427168c12b0SMax Filippov static void (* const op[])(TCGv_i32, TCGv_i32, TCGv_i32) = {
1428168c12b0SMax Filippov [BOOLEAN_AND] = tcg_gen_and_i32,
1429168c12b0SMax Filippov [BOOLEAN_ANDC] = tcg_gen_andc_i32,
1430168c12b0SMax Filippov [BOOLEAN_OR] = tcg_gen_or_i32,
1431168c12b0SMax Filippov [BOOLEAN_ORC] = tcg_gen_orc_i32,
1432168c12b0SMax Filippov [BOOLEAN_XOR] = tcg_gen_xor_i32,
1433168c12b0SMax Filippov };
1434168c12b0SMax Filippov
1435168c12b0SMax Filippov TCGv_i32 tmp1 = tcg_temp_new_i32();
1436168c12b0SMax Filippov TCGv_i32 tmp2 = tcg_temp_new_i32();
1437168c12b0SMax Filippov
1438575e962aSMax Filippov tcg_gen_shri_i32(tmp1, arg[1].in, arg[1].imm);
1439575e962aSMax Filippov tcg_gen_shri_i32(tmp2, arg[2].in, arg[2].imm);
1440168c12b0SMax Filippov op[par[0]](tmp1, tmp1, tmp2);
1441575e962aSMax Filippov tcg_gen_deposit_i32(arg[0].out, arg[0].out, tmp1, arg[0].imm, 1);
1442168c12b0SMax Filippov }
1443168c12b0SMax Filippov
translate_bp(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])1444b0b24bdcSMax Filippov static void translate_bp(DisasContext *dc, const OpcodeArg arg[],
1445168c12b0SMax Filippov const uint32_t par[])
1446168c12b0SMax Filippov {
1447168c12b0SMax Filippov TCGv_i32 tmp = tcg_temp_new_i32();
1448168c12b0SMax Filippov
1449575e962aSMax Filippov tcg_gen_andi_i32(tmp, arg[0].in, 1 << arg[0].imm);
1450b0b24bdcSMax Filippov gen_brcondi(dc, par[0], tmp, 0, arg[1].imm);
1451168c12b0SMax Filippov }
1452168c12b0SMax Filippov
translate_call0(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])1453b0b24bdcSMax Filippov static void translate_call0(DisasContext *dc, const OpcodeArg arg[],
1454168c12b0SMax Filippov const uint32_t par[])
1455168c12b0SMax Filippov {
14563cc18eecSRichard Henderson tcg_gen_movi_i32(cpu_R[0], dc->base.pc_next);
1457b0b24bdcSMax Filippov gen_jumpi(dc, arg[0].imm, 0);
1458168c12b0SMax Filippov }
1459168c12b0SMax Filippov
translate_callw(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])1460b0b24bdcSMax Filippov static void translate_callw(DisasContext *dc, const OpcodeArg arg[],
1461168c12b0SMax Filippov const uint32_t par[])
1462168c12b0SMax Filippov {
1463b6611d8dSRichard Henderson TCGv_i32 tmp = tcg_constant_i32(arg[0].imm);
1464b0b24bdcSMax Filippov gen_callw_slot(dc, par[0], tmp, adjust_jump_slot(dc, arg[0].imm, 0));
1465168c12b0SMax Filippov }
1466168c12b0SMax Filippov
translate_callx0(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])1467b0b24bdcSMax Filippov static void translate_callx0(DisasContext *dc, const OpcodeArg arg[],
1468168c12b0SMax Filippov const uint32_t par[])
1469168c12b0SMax Filippov {
1470168c12b0SMax Filippov TCGv_i32 tmp = tcg_temp_new_i32();
1471b0b24bdcSMax Filippov tcg_gen_mov_i32(tmp, arg[0].in);
14723cc18eecSRichard Henderson tcg_gen_movi_i32(cpu_R[0], dc->base.pc_next);
1473168c12b0SMax Filippov gen_jump(dc, tmp);
1474168c12b0SMax Filippov }
1475168c12b0SMax Filippov
translate_callxw(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])1476b0b24bdcSMax Filippov static void translate_callxw(DisasContext *dc, const OpcodeArg arg[],
1477168c12b0SMax Filippov const uint32_t par[])
1478168c12b0SMax Filippov {
1479168c12b0SMax Filippov TCGv_i32 tmp = tcg_temp_new_i32();
1480168c12b0SMax Filippov
1481b0b24bdcSMax Filippov tcg_gen_mov_i32(tmp, arg[0].in);
14829791e7e9SMax Filippov gen_callw_slot(dc, par[0], tmp, -1);
1483168c12b0SMax Filippov }
1484168c12b0SMax Filippov
translate_clamps(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])1485b0b24bdcSMax Filippov static void translate_clamps(DisasContext *dc, const OpcodeArg arg[],
1486168c12b0SMax Filippov const uint32_t par[])
1487168c12b0SMax Filippov {
1488bc026475SRichard Henderson TCGv_i32 tmp1 = tcg_constant_i32(-1u << arg[2].imm);
1489bc026475SRichard Henderson TCGv_i32 tmp2 = tcg_constant_i32((1 << arg[2].imm) - 1);
1490168c12b0SMax Filippov
1491bc026475SRichard Henderson tcg_gen_smax_i32(arg[0].out, tmp1, arg[1].in);
1492bc026475SRichard Henderson tcg_gen_smin_i32(arg[0].out, arg[0].out, tmp2);
1493168c12b0SMax Filippov }
1494168c12b0SMax Filippov
translate_clrb_expstate(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])1495b0b24bdcSMax Filippov static void translate_clrb_expstate(DisasContext *dc, const OpcodeArg arg[],
1496e9872741SMax Filippov const uint32_t par[])
1497e9872741SMax Filippov {
1498e9872741SMax Filippov /* TODO: GPIO32 may be a part of coprocessor */
1499b0b24bdcSMax Filippov tcg_gen_andi_i32(cpu_UR[EXPSTATE], cpu_UR[EXPSTATE], ~(1u << arg[0].imm));
1500e9872741SMax Filippov }
1501e9872741SMax Filippov
translate_clrex(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])1502b345e140SMax Filippov static void translate_clrex(DisasContext *dc, const OpcodeArg arg[],
1503b345e140SMax Filippov const uint32_t par[])
1504b345e140SMax Filippov {
1505b345e140SMax Filippov tcg_gen_movi_i32(cpu_exclusive_addr, -1);
1506b345e140SMax Filippov }
1507b345e140SMax Filippov
translate_const16(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])1508b0b24bdcSMax Filippov static void translate_const16(DisasContext *dc, const OpcodeArg arg[],
1509c5ac936eSMax Filippov const uint32_t par[])
1510c5ac936eSMax Filippov {
1511b6611d8dSRichard Henderson TCGv_i32 c = tcg_constant_i32(arg[1].imm);
1512c5ac936eSMax Filippov
1513b0b24bdcSMax Filippov tcg_gen_deposit_i32(arg[0].out, c, arg[0].in, 16, 16);
1514c5ac936eSMax Filippov }
1515c5ac936eSMax Filippov
translate_dcache(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])1516b0b24bdcSMax Filippov static void translate_dcache(DisasContext *dc, const OpcodeArg arg[],
1517168c12b0SMax Filippov const uint32_t par[])
1518168c12b0SMax Filippov {
1519168c12b0SMax Filippov TCGv_i32 addr = tcg_temp_new_i32();
1520168c12b0SMax Filippov TCGv_i32 res = tcg_temp_new_i32();
1521168c12b0SMax Filippov
1522b0b24bdcSMax Filippov tcg_gen_addi_i32(addr, arg[0].in, arg[1].imm);
1523f0aca2a9SRichard Henderson tcg_gen_qemu_ld_i32(res, addr, dc->cring, MO_UB);
1524168c12b0SMax Filippov }
1525168c12b0SMax Filippov
translate_depbits(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])1526b0b24bdcSMax Filippov static void translate_depbits(DisasContext *dc, const OpcodeArg arg[],
1527168c12b0SMax Filippov const uint32_t par[])
1528168c12b0SMax Filippov {
1529b0b24bdcSMax Filippov tcg_gen_deposit_i32(arg[1].out, arg[1].in, arg[0].in,
1530b0b24bdcSMax Filippov arg[2].imm, arg[3].imm);
1531168c12b0SMax Filippov }
1532168c12b0SMax Filippov
translate_diwbuip(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])153375eed0e5SMax Filippov static void translate_diwbuip(DisasContext *dc, const OpcodeArg arg[],
153475eed0e5SMax Filippov const uint32_t par[])
153575eed0e5SMax Filippov {
153675eed0e5SMax Filippov tcg_gen_addi_i32(arg[0].out, arg[0].in, dc->config->dcache_line_bytes);
153775eed0e5SMax Filippov }
153875eed0e5SMax Filippov
test_exceptions_entry(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])153991dc2b2dSMax Filippov static uint32_t test_exceptions_entry(DisasContext *dc, const OpcodeArg arg[],
154009460970SMax Filippov const uint32_t par[])
154109460970SMax Filippov {
1542b0b24bdcSMax Filippov if (arg[0].imm > 3 || !dc->cwoe) {
154309460970SMax Filippov qemu_log_mask(LOG_GUEST_ERROR,
154409460970SMax Filippov "Illegal entry instruction(pc = %08x)\n", dc->pc);
154591dc2b2dSMax Filippov return XTENSA_OP_ILL;
154609460970SMax Filippov } else {
154791dc2b2dSMax Filippov return 0;
154809460970SMax Filippov }
154909460970SMax Filippov }
155009460970SMax Filippov
test_overflow_entry(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])1551b0b24bdcSMax Filippov static uint32_t test_overflow_entry(DisasContext *dc, const OpcodeArg arg[],
15526416d16fSMax Filippov const uint32_t par[])
15536416d16fSMax Filippov {
15546416d16fSMax Filippov return 1 << (dc->callinc * 4);
15556416d16fSMax Filippov }
15566416d16fSMax Filippov
translate_entry(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])1557b0b24bdcSMax Filippov static void translate_entry(DisasContext *dc, const OpcodeArg arg[],
1558168c12b0SMax Filippov const uint32_t par[])
1559168c12b0SMax Filippov {
15606ade0ce9SMax Filippov TCGv_i32 pc = tcg_constant_i32(dc->pc);
15616ade0ce9SMax Filippov TCGv_i32 s = tcg_constant_i32(arg[0].imm);
15626ade0ce9SMax Filippov TCGv_i32 imm = tcg_constant_i32(arg[1].imm);
1563ad75a51eSRichard Henderson gen_helper_entry(tcg_env, pc, s, imm);
1564168c12b0SMax Filippov }
1565168c12b0SMax Filippov
translate_extui(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])1566b0b24bdcSMax Filippov static void translate_extui(DisasContext *dc, const OpcodeArg arg[],
1567168c12b0SMax Filippov const uint32_t par[])
1568168c12b0SMax Filippov {
1569b0b24bdcSMax Filippov int maskimm = (1 << arg[3].imm) - 1;
1570168c12b0SMax Filippov
1571168c12b0SMax Filippov TCGv_i32 tmp = tcg_temp_new_i32();
1572b0b24bdcSMax Filippov tcg_gen_shri_i32(tmp, arg[1].in, arg[2].imm);
1573b0b24bdcSMax Filippov tcg_gen_andi_i32(arg[0].out, tmp, maskimm);
1574168c12b0SMax Filippov }
1575168c12b0SMax Filippov
translate_getex(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])1576b345e140SMax Filippov static void translate_getex(DisasContext *dc, const OpcodeArg arg[],
1577b345e140SMax Filippov const uint32_t par[])
1578b345e140SMax Filippov {
1579b345e140SMax Filippov TCGv_i32 tmp = tcg_temp_new_i32();
1580b345e140SMax Filippov
1581b345e140SMax Filippov tcg_gen_extract_i32(tmp, cpu_SR[ATOMCTL], 8, 1);
1582b345e140SMax Filippov tcg_gen_deposit_i32(cpu_SR[ATOMCTL], cpu_SR[ATOMCTL], arg[0].in, 8, 1);
1583b345e140SMax Filippov tcg_gen_mov_i32(arg[0].out, tmp);
1584b345e140SMax Filippov }
1585b345e140SMax Filippov
translate_icache(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])1586b0b24bdcSMax Filippov static void translate_icache(DisasContext *dc, const OpcodeArg arg[],
1587168c12b0SMax Filippov const uint32_t par[])
1588168c12b0SMax Filippov {
1589ba7651fbSMax Filippov #ifndef CONFIG_USER_ONLY
1590168c12b0SMax Filippov TCGv_i32 addr = tcg_temp_new_i32();
1591168c12b0SMax Filippov
1592168c12b0SMax Filippov tcg_gen_movi_i32(cpu_pc, dc->pc);
1593b0b24bdcSMax Filippov tcg_gen_addi_i32(addr, arg[0].in, arg[1].imm);
1594ad75a51eSRichard Henderson gen_helper_itlb_hit_test(tcg_env, addr);
1595ba7651fbSMax Filippov #endif
1596168c12b0SMax Filippov }
1597168c12b0SMax Filippov
translate_itlb(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])1598b0b24bdcSMax Filippov static void translate_itlb(DisasContext *dc, const OpcodeArg arg[],
1599168c12b0SMax Filippov const uint32_t par[])
1600168c12b0SMax Filippov {
1601ba7651fbSMax Filippov #ifndef CONFIG_USER_ONLY
16024ee412dfSMax Filippov TCGv_i32 dtlb = tcg_constant_i32(par[0]);
1603168c12b0SMax Filippov
1604ad75a51eSRichard Henderson gen_helper_itlb(tcg_env, arg[0].in, dtlb);
1605ba7651fbSMax Filippov #endif
1606168c12b0SMax Filippov }
1607168c12b0SMax Filippov
translate_j(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])1608b0b24bdcSMax Filippov static void translate_j(DisasContext *dc, const OpcodeArg arg[],
1609168c12b0SMax Filippov const uint32_t par[])
1610168c12b0SMax Filippov {
1611b0b24bdcSMax Filippov gen_jumpi(dc, arg[0].imm, 0);
1612168c12b0SMax Filippov }
1613168c12b0SMax Filippov
translate_jx(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])1614b0b24bdcSMax Filippov static void translate_jx(DisasContext *dc, const OpcodeArg arg[],
1615168c12b0SMax Filippov const uint32_t par[])
1616168c12b0SMax Filippov {
1617b0b24bdcSMax Filippov gen_jump(dc, arg[0].in);
1618168c12b0SMax Filippov }
1619168c12b0SMax Filippov
translate_l32e(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])1620b0b24bdcSMax Filippov static void translate_l32e(DisasContext *dc, const OpcodeArg arg[],
1621168c12b0SMax Filippov const uint32_t par[])
1622168c12b0SMax Filippov {
1623168c12b0SMax Filippov TCGv_i32 addr = tcg_temp_new_i32();
1624583e6a5fSMax Filippov MemOp mop;
1625168c12b0SMax Filippov
1626b0b24bdcSMax Filippov tcg_gen_addi_i32(addr, arg[1].in, arg[2].imm);
1627583e6a5fSMax Filippov mop = gen_load_store_alignment(dc, MO_TEUL, addr);
1628583e6a5fSMax Filippov tcg_gen_qemu_ld_tl(arg[0].out, addr, dc->ring, mop);
1629168c12b0SMax Filippov }
1630168c12b0SMax Filippov
1631b345e140SMax Filippov #ifdef CONFIG_USER_ONLY
gen_check_exclusive(DisasContext * dc,TCGv_i32 addr,bool is_write)1632b345e140SMax Filippov static void gen_check_exclusive(DisasContext *dc, TCGv_i32 addr, bool is_write)
1633b345e140SMax Filippov {
1634b345e140SMax Filippov }
1635b345e140SMax Filippov #else
gen_check_exclusive(DisasContext * dc,TCGv_i32 addr,bool is_write)1636b345e140SMax Filippov static void gen_check_exclusive(DisasContext *dc, TCGv_i32 addr, bool is_write)
1637b345e140SMax Filippov {
1638b345e140SMax Filippov if (!option_enabled(dc, XTENSA_OPTION_MPU)) {
16396ade0ce9SMax Filippov TCGv_i32 pc = tcg_constant_i32(dc->pc);
1640b345e140SMax Filippov
1641ad75a51eSRichard Henderson gen_helper_check_exclusive(tcg_env, pc, addr,
16426ade0ce9SMax Filippov tcg_constant_i32(is_write));
1643b345e140SMax Filippov }
1644b345e140SMax Filippov }
1645b345e140SMax Filippov #endif
1646b345e140SMax Filippov
translate_l32ex(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])1647b345e140SMax Filippov static void translate_l32ex(DisasContext *dc, const OpcodeArg arg[],
1648b345e140SMax Filippov const uint32_t par[])
1649b345e140SMax Filippov {
1650b345e140SMax Filippov TCGv_i32 addr = tcg_temp_new_i32();
1651583e6a5fSMax Filippov MemOp mop;
1652b345e140SMax Filippov
1653b345e140SMax Filippov tcg_gen_mov_i32(addr, arg[1].in);
1654583e6a5fSMax Filippov mop = gen_load_store_alignment(dc, MO_TEUL | MO_ALIGN, addr);
1655b345e140SMax Filippov gen_check_exclusive(dc, addr, false);
1656583e6a5fSMax Filippov tcg_gen_qemu_ld_i32(arg[0].out, addr, dc->cring, mop);
1657b345e140SMax Filippov tcg_gen_mov_i32(cpu_exclusive_addr, addr);
1658b345e140SMax Filippov tcg_gen_mov_i32(cpu_exclusive_val, arg[0].out);
1659b345e140SMax Filippov }
1660b345e140SMax Filippov
translate_ldst(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])1661b0b24bdcSMax Filippov static void translate_ldst(DisasContext *dc, const OpcodeArg arg[],
1662168c12b0SMax Filippov const uint32_t par[])
1663168c12b0SMax Filippov {
1664168c12b0SMax Filippov TCGv_i32 addr = tcg_temp_new_i32();
1665583e6a5fSMax Filippov MemOp mop;
1666168c12b0SMax Filippov
1667b0b24bdcSMax Filippov tcg_gen_addi_i32(addr, arg[1].in, arg[2].imm);
1668583e6a5fSMax Filippov mop = gen_load_store_alignment(dc, par[0], addr);
1669583e6a5fSMax Filippov
1670168c12b0SMax Filippov if (par[2]) {
16719fb40342SMax Filippov if (par[1]) {
16729fb40342SMax Filippov tcg_gen_mb(TCG_BAR_STRL | TCG_MO_ALL);
16739fb40342SMax Filippov }
1674583e6a5fSMax Filippov tcg_gen_qemu_st_tl(arg[0].in, addr, dc->cring, mop);
1675168c12b0SMax Filippov } else {
1676583e6a5fSMax Filippov tcg_gen_qemu_ld_tl(arg[0].out, addr, dc->cring, mop);
16779fb40342SMax Filippov if (par[1]) {
16789fb40342SMax Filippov tcg_gen_mb(TCG_BAR_LDAQ | TCG_MO_ALL);
16799fb40342SMax Filippov }
1680168c12b0SMax Filippov }
1681168c12b0SMax Filippov }
1682168c12b0SMax Filippov
translate_lct(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])168359491e97SMax Filippov static void translate_lct(DisasContext *dc, const OpcodeArg arg[],
168459491e97SMax Filippov const uint32_t par[])
168559491e97SMax Filippov {
168659491e97SMax Filippov tcg_gen_movi_i32(arg[0].out, 0);
168759491e97SMax Filippov }
168859491e97SMax Filippov
translate_l32r(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])1689b0b24bdcSMax Filippov static void translate_l32r(DisasContext *dc, const OpcodeArg arg[],
1690168c12b0SMax Filippov const uint32_t par[])
1691168c12b0SMax Filippov {
16925b9b2763SMax Filippov TCGv_i32 tmp;
1693168c12b0SMax Filippov
16943cc18eecSRichard Henderson if (dc->base.tb->flags & XTENSA_TBFLAG_LITBASE) {
16959ae64766SRichard Henderson tmp = tcg_temp_new();
16969ae64766SRichard Henderson tcg_gen_addi_i32(tmp, cpu_SR[LITBASE], arg[1].raw_imm - 1);
16975b9b2763SMax Filippov } else {
16989ae64766SRichard Henderson tmp = tcg_constant_i32(arg[1].imm);
1699168c12b0SMax Filippov }
1700f0aca2a9SRichard Henderson tcg_gen_qemu_ld_i32(arg[0].out, tmp, dc->cring, MO_TEUL);
1701168c12b0SMax Filippov }
1702168c12b0SMax Filippov
translate_loop(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])1703b0b24bdcSMax Filippov static void translate_loop(DisasContext *dc, const OpcodeArg arg[],
1704168c12b0SMax Filippov const uint32_t par[])
1705168c12b0SMax Filippov {
1706b0b24bdcSMax Filippov uint32_t lend = arg[1].imm;
1707168c12b0SMax Filippov
1708b0b24bdcSMax Filippov tcg_gen_subi_i32(cpu_SR[LCOUNT], arg[0].in, 1);
17093cc18eecSRichard Henderson tcg_gen_movi_i32(cpu_SR[LBEG], dc->base.pc_next);
17105d630cefSMax Filippov tcg_gen_movi_i32(cpu_SR[LEND], lend);
1711168c12b0SMax Filippov
1712168c12b0SMax Filippov if (par[0] != TCG_COND_NEVER) {
1713168c12b0SMax Filippov TCGLabel *label = gen_new_label();
1714b0b24bdcSMax Filippov tcg_gen_brcondi_i32(par[0], arg[0].in, 0, label);
1715168c12b0SMax Filippov gen_jumpi(dc, lend, 1);
1716168c12b0SMax Filippov gen_set_label(label);
1717168c12b0SMax Filippov }
1718168c12b0SMax Filippov
17193cc18eecSRichard Henderson gen_jumpi(dc, dc->base.pc_next, 0);
1720168c12b0SMax Filippov }
1721168c12b0SMax Filippov
1722168c12b0SMax Filippov enum {
1723168c12b0SMax Filippov MAC16_UMUL,
1724168c12b0SMax Filippov MAC16_MUL,
1725168c12b0SMax Filippov MAC16_MULA,
1726168c12b0SMax Filippov MAC16_MULS,
1727168c12b0SMax Filippov MAC16_NONE,
1728168c12b0SMax Filippov };
1729168c12b0SMax Filippov
1730168c12b0SMax Filippov enum {
1731168c12b0SMax Filippov MAC16_LL,
1732168c12b0SMax Filippov MAC16_HL,
1733168c12b0SMax Filippov MAC16_LH,
1734168c12b0SMax Filippov MAC16_HH,
1735168c12b0SMax Filippov
1736168c12b0SMax Filippov MAC16_HX = 0x1,
1737168c12b0SMax Filippov MAC16_XH = 0x2,
1738168c12b0SMax Filippov };
1739168c12b0SMax Filippov
translate_mac16(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])1740b0b24bdcSMax Filippov static void translate_mac16(DisasContext *dc, const OpcodeArg arg[],
1741168c12b0SMax Filippov const uint32_t par[])
1742168c12b0SMax Filippov {
1743168c12b0SMax Filippov int op = par[0];
17447aa78341SMax Filippov unsigned half = par[1];
17457aa78341SMax Filippov uint32_t ld_offset = par[2];
1746168c12b0SMax Filippov unsigned off = ld_offset ? 2 : 0;
1747168c12b0SMax Filippov TCGv_i32 vaddr = tcg_temp_new_i32();
1748168c12b0SMax Filippov TCGv_i32 mem32 = tcg_temp_new_i32();
1749168c12b0SMax Filippov
1750168c12b0SMax Filippov if (ld_offset) {
1751583e6a5fSMax Filippov MemOp mop;
1752583e6a5fSMax Filippov
1753b0b24bdcSMax Filippov tcg_gen_addi_i32(vaddr, arg[1].in, ld_offset);
1754583e6a5fSMax Filippov mop = gen_load_store_alignment(dc, MO_TEUL, vaddr);
1755583e6a5fSMax Filippov tcg_gen_qemu_ld_tl(mem32, vaddr, dc->cring, mop);
1756168c12b0SMax Filippov }
1757168c12b0SMax Filippov if (op != MAC16_NONE) {
17587aa78341SMax Filippov TCGv_i32 m1 = gen_mac16_m(arg[off].in,
1759168c12b0SMax Filippov half & MAC16_HX, op == MAC16_UMUL);
17607aa78341SMax Filippov TCGv_i32 m2 = gen_mac16_m(arg[off + 1].in,
1761168c12b0SMax Filippov half & MAC16_XH, op == MAC16_UMUL);
1762168c12b0SMax Filippov
1763168c12b0SMax Filippov if (op == MAC16_MUL || op == MAC16_UMUL) {
1764168c12b0SMax Filippov tcg_gen_mul_i32(cpu_SR[ACCLO], m1, m2);
1765168c12b0SMax Filippov if (op == MAC16_UMUL) {
1766168c12b0SMax Filippov tcg_gen_movi_i32(cpu_SR[ACCHI], 0);
1767168c12b0SMax Filippov } else {
1768168c12b0SMax Filippov tcg_gen_sari_i32(cpu_SR[ACCHI], cpu_SR[ACCLO], 31);
1769168c12b0SMax Filippov }
1770168c12b0SMax Filippov } else {
1771168c12b0SMax Filippov TCGv_i32 lo = tcg_temp_new_i32();
1772168c12b0SMax Filippov TCGv_i32 hi = tcg_temp_new_i32();
1773168c12b0SMax Filippov
1774168c12b0SMax Filippov tcg_gen_mul_i32(lo, m1, m2);
1775168c12b0SMax Filippov tcg_gen_sari_i32(hi, lo, 31);
1776168c12b0SMax Filippov if (op == MAC16_MULA) {
1777168c12b0SMax Filippov tcg_gen_add2_i32(cpu_SR[ACCLO], cpu_SR[ACCHI],
1778168c12b0SMax Filippov cpu_SR[ACCLO], cpu_SR[ACCHI],
1779168c12b0SMax Filippov lo, hi);
1780168c12b0SMax Filippov } else {
1781168c12b0SMax Filippov tcg_gen_sub2_i32(cpu_SR[ACCLO], cpu_SR[ACCHI],
1782168c12b0SMax Filippov cpu_SR[ACCLO], cpu_SR[ACCHI],
1783168c12b0SMax Filippov lo, hi);
1784168c12b0SMax Filippov }
1785168c12b0SMax Filippov tcg_gen_ext8s_i32(cpu_SR[ACCHI], cpu_SR[ACCHI]);
1786168c12b0SMax Filippov }
1787168c12b0SMax Filippov }
1788168c12b0SMax Filippov if (ld_offset) {
1789b0b24bdcSMax Filippov tcg_gen_mov_i32(arg[1].out, vaddr);
1790b0b24bdcSMax Filippov tcg_gen_mov_i32(cpu_SR[MR + arg[0].imm], mem32);
1791168c12b0SMax Filippov }
1792168c12b0SMax Filippov }
1793168c12b0SMax Filippov
translate_memw(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])1794b0b24bdcSMax Filippov static void translate_memw(DisasContext *dc, const OpcodeArg arg[],
17959fb40342SMax Filippov const uint32_t par[])
17969fb40342SMax Filippov {
17979fb40342SMax Filippov tcg_gen_mb(TCG_BAR_SC | TCG_MO_ALL);
17989fb40342SMax Filippov }
17999fb40342SMax Filippov
translate_smin(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])1800b0b24bdcSMax Filippov static void translate_smin(DisasContext *dc, const OpcodeArg arg[],
1801168c12b0SMax Filippov const uint32_t par[])
1802168c12b0SMax Filippov {
1803b0b24bdcSMax Filippov tcg_gen_smin_i32(arg[0].out, arg[1].in, arg[2].in);
1804426afc3bSRichard Henderson }
1805426afc3bSRichard Henderson
translate_umin(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])1806b0b24bdcSMax Filippov static void translate_umin(DisasContext *dc, const OpcodeArg arg[],
1807426afc3bSRichard Henderson const uint32_t par[])
1808426afc3bSRichard Henderson {
1809b0b24bdcSMax Filippov tcg_gen_umin_i32(arg[0].out, arg[1].in, arg[2].in);
1810426afc3bSRichard Henderson }
1811426afc3bSRichard Henderson
translate_smax(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])1812b0b24bdcSMax Filippov static void translate_smax(DisasContext *dc, const OpcodeArg arg[],
1813426afc3bSRichard Henderson const uint32_t par[])
1814426afc3bSRichard Henderson {
1815b0b24bdcSMax Filippov tcg_gen_smax_i32(arg[0].out, arg[1].in, arg[2].in);
1816426afc3bSRichard Henderson }
1817426afc3bSRichard Henderson
translate_umax(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])1818b0b24bdcSMax Filippov static void translate_umax(DisasContext *dc, const OpcodeArg arg[],
1819426afc3bSRichard Henderson const uint32_t par[])
1820426afc3bSRichard Henderson {
1821b0b24bdcSMax Filippov tcg_gen_umax_i32(arg[0].out, arg[1].in, arg[2].in);
1822168c12b0SMax Filippov }
1823168c12b0SMax Filippov
translate_mov(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])1824b0b24bdcSMax Filippov static void translate_mov(DisasContext *dc, const OpcodeArg arg[],
1825168c12b0SMax Filippov const uint32_t par[])
1826168c12b0SMax Filippov {
1827b0b24bdcSMax Filippov tcg_gen_mov_i32(arg[0].out, arg[1].in);
1828168c12b0SMax Filippov }
1829168c12b0SMax Filippov
translate_movcond(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])1830b0b24bdcSMax Filippov static void translate_movcond(DisasContext *dc, const OpcodeArg arg[],
1831168c12b0SMax Filippov const uint32_t par[])
1832168c12b0SMax Filippov {
18332b570a17SMax Filippov TCGv_i32 zero = tcg_constant_i32(0);
1834168c12b0SMax Filippov
1835b0b24bdcSMax Filippov tcg_gen_movcond_i32(par[0], arg[0].out,
1836b0b24bdcSMax Filippov arg[2].in, zero, arg[1].in, arg[0].in);
1837168c12b0SMax Filippov }
1838168c12b0SMax Filippov
translate_movi(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])1839b0b24bdcSMax Filippov static void translate_movi(DisasContext *dc, const OpcodeArg arg[],
1840168c12b0SMax Filippov const uint32_t par[])
1841168c12b0SMax Filippov {
1842b0b24bdcSMax Filippov tcg_gen_movi_i32(arg[0].out, arg[1].imm);
1843168c12b0SMax Filippov }
1844168c12b0SMax Filippov
translate_movp(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])1845b0b24bdcSMax Filippov static void translate_movp(DisasContext *dc, const OpcodeArg arg[],
1846168c12b0SMax Filippov const uint32_t par[])
1847168c12b0SMax Filippov {
18482b570a17SMax Filippov TCGv_i32 zero = tcg_constant_i32(0);
1849168c12b0SMax Filippov TCGv_i32 tmp = tcg_temp_new_i32();
1850168c12b0SMax Filippov
1851575e962aSMax Filippov tcg_gen_andi_i32(tmp, arg[2].in, 1 << arg[2].imm);
1852168c12b0SMax Filippov tcg_gen_movcond_i32(par[0],
1853b0b24bdcSMax Filippov arg[0].out, tmp, zero,
1854b0b24bdcSMax Filippov arg[1].in, arg[0].in);
1855168c12b0SMax Filippov }
1856168c12b0SMax Filippov
translate_movsp(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])1857b0b24bdcSMax Filippov static void translate_movsp(DisasContext *dc, const OpcodeArg arg[],
1858168c12b0SMax Filippov const uint32_t par[])
1859168c12b0SMax Filippov {
1860b0b24bdcSMax Filippov tcg_gen_mov_i32(arg[0].out, arg[1].in);
1861168c12b0SMax Filippov }
1862168c12b0SMax Filippov
translate_mul16(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])1863b0b24bdcSMax Filippov static void translate_mul16(DisasContext *dc, const OpcodeArg arg[],
1864168c12b0SMax Filippov const uint32_t par[])
1865168c12b0SMax Filippov {
1866168c12b0SMax Filippov TCGv_i32 v1 = tcg_temp_new_i32();
1867168c12b0SMax Filippov TCGv_i32 v2 = tcg_temp_new_i32();
1868168c12b0SMax Filippov
1869168c12b0SMax Filippov if (par[0]) {
1870b0b24bdcSMax Filippov tcg_gen_ext16s_i32(v1, arg[1].in);
1871b0b24bdcSMax Filippov tcg_gen_ext16s_i32(v2, arg[2].in);
1872168c12b0SMax Filippov } else {
1873b0b24bdcSMax Filippov tcg_gen_ext16u_i32(v1, arg[1].in);
1874b0b24bdcSMax Filippov tcg_gen_ext16u_i32(v2, arg[2].in);
1875168c12b0SMax Filippov }
1876b0b24bdcSMax Filippov tcg_gen_mul_i32(arg[0].out, v1, v2);
1877168c12b0SMax Filippov }
1878168c12b0SMax Filippov
translate_mull(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])1879b0b24bdcSMax Filippov static void translate_mull(DisasContext *dc, const OpcodeArg arg[],
1880168c12b0SMax Filippov const uint32_t par[])
1881168c12b0SMax Filippov {
1882b0b24bdcSMax Filippov tcg_gen_mul_i32(arg[0].out, arg[1].in, arg[2].in);
1883168c12b0SMax Filippov }
1884168c12b0SMax Filippov
translate_mulh(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])1885b0b24bdcSMax Filippov static void translate_mulh(DisasContext *dc, const OpcodeArg arg[],
1886168c12b0SMax Filippov const uint32_t par[])
1887168c12b0SMax Filippov {
1888168c12b0SMax Filippov TCGv_i32 lo = tcg_temp_new();
1889168c12b0SMax Filippov
1890168c12b0SMax Filippov if (par[0]) {
1891b0b24bdcSMax Filippov tcg_gen_muls2_i32(lo, arg[0].out, arg[1].in, arg[2].in);
1892168c12b0SMax Filippov } else {
1893b0b24bdcSMax Filippov tcg_gen_mulu2_i32(lo, arg[0].out, arg[1].in, arg[2].in);
1894168c12b0SMax Filippov }
1895168c12b0SMax Filippov }
1896168c12b0SMax Filippov
translate_neg(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])1897b0b24bdcSMax Filippov static void translate_neg(DisasContext *dc, const OpcodeArg arg[],
1898168c12b0SMax Filippov const uint32_t par[])
1899168c12b0SMax Filippov {
1900b0b24bdcSMax Filippov tcg_gen_neg_i32(arg[0].out, arg[1].in);
1901168c12b0SMax Filippov }
1902168c12b0SMax Filippov
translate_nop(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])1903b0b24bdcSMax Filippov static void translate_nop(DisasContext *dc, const OpcodeArg arg[],
1904168c12b0SMax Filippov const uint32_t par[])
1905168c12b0SMax Filippov {
1906168c12b0SMax Filippov }
1907168c12b0SMax Filippov
translate_nsa(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])1908b0b24bdcSMax Filippov static void translate_nsa(DisasContext *dc, const OpcodeArg arg[],
1909168c12b0SMax Filippov const uint32_t par[])
1910168c12b0SMax Filippov {
1911b0b24bdcSMax Filippov tcg_gen_clrsb_i32(arg[0].out, arg[1].in);
1912168c12b0SMax Filippov }
1913168c12b0SMax Filippov
translate_nsau(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])1914b0b24bdcSMax Filippov static void translate_nsau(DisasContext *dc, const OpcodeArg arg[],
1915168c12b0SMax Filippov const uint32_t par[])
1916168c12b0SMax Filippov {
1917b0b24bdcSMax Filippov tcg_gen_clzi_i32(arg[0].out, arg[1].in, 32);
1918168c12b0SMax Filippov }
1919168c12b0SMax Filippov
translate_or(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])1920b0b24bdcSMax Filippov static void translate_or(DisasContext *dc, const OpcodeArg arg[],
1921168c12b0SMax Filippov const uint32_t par[])
1922168c12b0SMax Filippov {
1923b0b24bdcSMax Filippov tcg_gen_or_i32(arg[0].out, arg[1].in, arg[2].in);
1924168c12b0SMax Filippov }
1925168c12b0SMax Filippov
translate_ptlb(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])1926b0b24bdcSMax Filippov static void translate_ptlb(DisasContext *dc, const OpcodeArg arg[],
1927168c12b0SMax Filippov const uint32_t par[])
1928168c12b0SMax Filippov {
1929ba7651fbSMax Filippov #ifndef CONFIG_USER_ONLY
19304ee412dfSMax Filippov TCGv_i32 dtlb = tcg_constant_i32(par[0]);
1931168c12b0SMax Filippov
1932168c12b0SMax Filippov tcg_gen_movi_i32(cpu_pc, dc->pc);
1933ad75a51eSRichard Henderson gen_helper_ptlb(arg[0].out, tcg_env, arg[1].in, dtlb);
1934ba7651fbSMax Filippov #endif
1935168c12b0SMax Filippov }
1936168c12b0SMax Filippov
translate_pptlb(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])19374d04ea35SMax Filippov static void translate_pptlb(DisasContext *dc, const OpcodeArg arg[],
19384d04ea35SMax Filippov const uint32_t par[])
19394d04ea35SMax Filippov {
19404d04ea35SMax Filippov #ifndef CONFIG_USER_ONLY
19414d04ea35SMax Filippov tcg_gen_movi_i32(cpu_pc, dc->pc);
1942ad75a51eSRichard Henderson gen_helper_pptlb(arg[0].out, tcg_env, arg[1].in);
19434d04ea35SMax Filippov #endif
19444d04ea35SMax Filippov }
19454d04ea35SMax Filippov
translate_quos(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])1946b0b24bdcSMax Filippov static void translate_quos(DisasContext *dc, const OpcodeArg arg[],
1947168c12b0SMax Filippov const uint32_t par[])
1948168c12b0SMax Filippov {
1949168c12b0SMax Filippov TCGLabel *label1 = gen_new_label();
1950168c12b0SMax Filippov TCGLabel *label2 = gen_new_label();
1951168c12b0SMax Filippov
1952b0b24bdcSMax Filippov tcg_gen_brcondi_i32(TCG_COND_NE, arg[1].in, 0x80000000,
1953168c12b0SMax Filippov label1);
1954b0b24bdcSMax Filippov tcg_gen_brcondi_i32(TCG_COND_NE, arg[2].in, 0xffffffff,
1955168c12b0SMax Filippov label1);
1956b0b24bdcSMax Filippov tcg_gen_movi_i32(arg[0].out,
1957168c12b0SMax Filippov par[0] ? 0x80000000 : 0);
1958168c12b0SMax Filippov tcg_gen_br(label2);
1959168c12b0SMax Filippov gen_set_label(label1);
1960168c12b0SMax Filippov if (par[0]) {
1961b0b24bdcSMax Filippov tcg_gen_div_i32(arg[0].out,
1962b0b24bdcSMax Filippov arg[1].in, arg[2].in);
1963168c12b0SMax Filippov } else {
1964b0b24bdcSMax Filippov tcg_gen_rem_i32(arg[0].out,
1965b0b24bdcSMax Filippov arg[1].in, arg[2].in);
1966168c12b0SMax Filippov }
1967168c12b0SMax Filippov gen_set_label(label2);
1968168c12b0SMax Filippov }
1969168c12b0SMax Filippov
translate_quou(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])1970b0b24bdcSMax Filippov static void translate_quou(DisasContext *dc, const OpcodeArg arg[],
1971168c12b0SMax Filippov const uint32_t par[])
1972168c12b0SMax Filippov {
1973b0b24bdcSMax Filippov tcg_gen_divu_i32(arg[0].out,
1974b0b24bdcSMax Filippov arg[1].in, arg[2].in);
1975168c12b0SMax Filippov }
1976168c12b0SMax Filippov
translate_read_impwire(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])1977b0b24bdcSMax Filippov static void translate_read_impwire(DisasContext *dc, const OpcodeArg arg[],
1978e9872741SMax Filippov const uint32_t par[])
1979e9872741SMax Filippov {
1980e9872741SMax Filippov /* TODO: GPIO32 may be a part of coprocessor */
1981b0b24bdcSMax Filippov tcg_gen_movi_i32(arg[0].out, 0);
1982e9872741SMax Filippov }
1983e9872741SMax Filippov
translate_remu(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])1984b0b24bdcSMax Filippov static void translate_remu(DisasContext *dc, const OpcodeArg arg[],
19854a038955SMax Filippov const uint32_t par[])
19864a038955SMax Filippov {
1987b0b24bdcSMax Filippov tcg_gen_remu_i32(arg[0].out,
1988b0b24bdcSMax Filippov arg[1].in, arg[2].in);
19894a038955SMax Filippov }
19904a038955SMax Filippov
translate_rer(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])1991b0b24bdcSMax Filippov static void translate_rer(DisasContext *dc, const OpcodeArg arg[],
1992168c12b0SMax Filippov const uint32_t par[])
1993168c12b0SMax Filippov {
1994ad75a51eSRichard Henderson gen_helper_rer(arg[0].out, tcg_env, arg[1].in);
1995168c12b0SMax Filippov }
1996168c12b0SMax Filippov
translate_ret(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])1997b0b24bdcSMax Filippov static void translate_ret(DisasContext *dc, const OpcodeArg arg[],
1998168c12b0SMax Filippov const uint32_t par[])
1999168c12b0SMax Filippov {
2000168c12b0SMax Filippov gen_jump(dc, cpu_R[0]);
2001168c12b0SMax Filippov }
2002168c12b0SMax Filippov
test_exceptions_retw(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])200391dc2b2dSMax Filippov static uint32_t test_exceptions_retw(DisasContext *dc, const OpcodeArg arg[],
200409460970SMax Filippov const uint32_t par[])
200509460970SMax Filippov {
200609460970SMax Filippov if (!dc->cwoe) {
200709460970SMax Filippov qemu_log_mask(LOG_GUEST_ERROR,
200809460970SMax Filippov "Illegal retw instruction(pc = %08x)\n", dc->pc);
200991dc2b2dSMax Filippov return XTENSA_OP_ILL;
201009460970SMax Filippov } else {
20116ade0ce9SMax Filippov TCGv_i32 pc = tcg_constant_i32(dc->pc);
201209460970SMax Filippov
2013ad75a51eSRichard Henderson gen_helper_test_ill_retw(tcg_env, pc);
201491dc2b2dSMax Filippov return 0;
201509460970SMax Filippov }
201609460970SMax Filippov }
201709460970SMax Filippov
translate_retw(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])2018b0b24bdcSMax Filippov static void translate_retw(DisasContext *dc, const OpcodeArg arg[],
2019168c12b0SMax Filippov const uint32_t par[])
2020168c12b0SMax Filippov {
2021864743a6SRichard Henderson TCGv_i32 tmp = tcg_temp_new();
2022864743a6SRichard Henderson tcg_gen_shl_i32(tmp, tcg_constant_i32(1), cpu_SR[WINDOW_BASE]);
2023c949009bSMax Filippov tcg_gen_andc_i32(cpu_SR[WINDOW_START],
2024c949009bSMax Filippov cpu_SR[WINDOW_START], tmp);
2025c949009bSMax Filippov tcg_gen_movi_i32(tmp, dc->pc);
2026c949009bSMax Filippov tcg_gen_deposit_i32(tmp, tmp, cpu_R[0], 0, 30);
2027ad75a51eSRichard Henderson gen_helper_retw(tcg_env, cpu_R[0]);
2028168c12b0SMax Filippov gen_jump(dc, tmp);
2029168c12b0SMax Filippov }
2030168c12b0SMax Filippov
translate_rfde(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])2031b0b24bdcSMax Filippov static void translate_rfde(DisasContext *dc, const OpcodeArg arg[],
2032168c12b0SMax Filippov const uint32_t par[])
2033168c12b0SMax Filippov {
2034168c12b0SMax Filippov gen_jump(dc, cpu_SR[dc->config->ndepc ? DEPC : EPC1]);
2035168c12b0SMax Filippov }
2036168c12b0SMax Filippov
translate_rfe(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])2037b0b24bdcSMax Filippov static void translate_rfe(DisasContext *dc, const OpcodeArg arg[],
2038168c12b0SMax Filippov const uint32_t par[])
2039168c12b0SMax Filippov {
2040168c12b0SMax Filippov tcg_gen_andi_i32(cpu_SR[PS], cpu_SR[PS], ~PS_EXCM);
2041168c12b0SMax Filippov gen_jump(dc, cpu_SR[EPC1]);
2042168c12b0SMax Filippov }
2043168c12b0SMax Filippov
translate_rfi(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])2044b0b24bdcSMax Filippov static void translate_rfi(DisasContext *dc, const OpcodeArg arg[],
2045168c12b0SMax Filippov const uint32_t par[])
2046168c12b0SMax Filippov {
2047b0b24bdcSMax Filippov tcg_gen_mov_i32(cpu_SR[PS], cpu_SR[EPS2 + arg[0].imm - 2]);
2048b0b24bdcSMax Filippov gen_jump(dc, cpu_SR[EPC1 + arg[0].imm - 1]);
2049168c12b0SMax Filippov }
2050168c12b0SMax Filippov
translate_rfw(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])2051b0b24bdcSMax Filippov static void translate_rfw(DisasContext *dc, const OpcodeArg arg[],
2052168c12b0SMax Filippov const uint32_t par[])
2053168c12b0SMax Filippov {
2054864743a6SRichard Henderson TCGv_i32 tmp = tcg_temp_new();
2055168c12b0SMax Filippov
2056168c12b0SMax Filippov tcg_gen_andi_i32(cpu_SR[PS], cpu_SR[PS], ~PS_EXCM);
2057864743a6SRichard Henderson tcg_gen_shl_i32(tmp, tcg_constant_i32(1), cpu_SR[WINDOW_BASE]);
2058168c12b0SMax Filippov
2059168c12b0SMax Filippov if (par[0]) {
2060168c12b0SMax Filippov tcg_gen_andc_i32(cpu_SR[WINDOW_START],
2061168c12b0SMax Filippov cpu_SR[WINDOW_START], tmp);
2062168c12b0SMax Filippov } else {
2063168c12b0SMax Filippov tcg_gen_or_i32(cpu_SR[WINDOW_START],
2064168c12b0SMax Filippov cpu_SR[WINDOW_START], tmp);
2065168c12b0SMax Filippov }
2066168c12b0SMax Filippov
2067ad75a51eSRichard Henderson gen_helper_restore_owb(tcg_env);
2068d74624e5SMax Filippov gen_jump(dc, cpu_SR[EPC1]);
2069168c12b0SMax Filippov }
2070168c12b0SMax Filippov
translate_rotw(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])2071b0b24bdcSMax Filippov static void translate_rotw(DisasContext *dc, const OpcodeArg arg[],
2072168c12b0SMax Filippov const uint32_t par[])
2073168c12b0SMax Filippov {
2074b0b24bdcSMax Filippov tcg_gen_addi_i32(cpu_windowbase_next, cpu_SR[WINDOW_BASE], arg[0].imm);
2075168c12b0SMax Filippov }
2076168c12b0SMax Filippov
translate_rsil(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])2077b0b24bdcSMax Filippov static void translate_rsil(DisasContext *dc, const OpcodeArg arg[],
2078168c12b0SMax Filippov const uint32_t par[])
2079168c12b0SMax Filippov {
2080b0b24bdcSMax Filippov tcg_gen_mov_i32(arg[0].out, cpu_SR[PS]);
2081168c12b0SMax Filippov tcg_gen_andi_i32(cpu_SR[PS], cpu_SR[PS], ~PS_INTLEVEL);
2082b0b24bdcSMax Filippov tcg_gen_ori_i32(cpu_SR[PS], cpu_SR[PS], arg[1].imm);
2083168c12b0SMax Filippov }
2084168c12b0SMax Filippov
translate_rsr(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])2085b0b24bdcSMax Filippov static void translate_rsr(DisasContext *dc, const OpcodeArg arg[],
2086168c12b0SMax Filippov const uint32_t par[])
2087168c12b0SMax Filippov {
208859afd43dSMax Filippov if (sr_name[par[0]]) {
208959419607SMax Filippov tcg_gen_mov_i32(arg[0].out, cpu_SR[par[0]]);
209059afd43dSMax Filippov } else {
209159afd43dSMax Filippov tcg_gen_movi_i32(arg[0].out, 0);
209259afd43dSMax Filippov }
209359419607SMax Filippov }
209459419607SMax Filippov
translate_rsr_ccount(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])209559419607SMax Filippov static void translate_rsr_ccount(DisasContext *dc, const OpcodeArg arg[],
209659419607SMax Filippov const uint32_t par[])
209759419607SMax Filippov {
209859419607SMax Filippov #ifndef CONFIG_USER_ONLY
2099dfd1b812SRichard Henderson translator_io_start(&dc->base);
2100ad75a51eSRichard Henderson gen_helper_update_ccount(tcg_env);
210159419607SMax Filippov tcg_gen_mov_i32(arg[0].out, cpu_SR[par[0]]);
210259419607SMax Filippov #endif
210359419607SMax Filippov }
210459419607SMax Filippov
translate_rsr_ptevaddr(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])210559419607SMax Filippov static void translate_rsr_ptevaddr(DisasContext *dc, const OpcodeArg arg[],
210659419607SMax Filippov const uint32_t par[])
210759419607SMax Filippov {
210859419607SMax Filippov #ifndef CONFIG_USER_ONLY
210959419607SMax Filippov TCGv_i32 tmp = tcg_temp_new_i32();
211059419607SMax Filippov
211159419607SMax Filippov tcg_gen_shri_i32(tmp, cpu_SR[EXCVADDR], 10);
211259419607SMax Filippov tcg_gen_or_i32(tmp, tmp, cpu_SR[PTEVADDR]);
211359419607SMax Filippov tcg_gen_andi_i32(arg[0].out, tmp, 0xfffffffc);
211459419607SMax Filippov #endif
2115168c12b0SMax Filippov }
2116168c12b0SMax Filippov
translate_rtlb(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])2117b0b24bdcSMax Filippov static void translate_rtlb(DisasContext *dc, const OpcodeArg arg[],
2118168c12b0SMax Filippov const uint32_t par[])
2119168c12b0SMax Filippov {
212021a2dad5SMax Filippov #ifndef CONFIG_USER_ONLY
2121168c12b0SMax Filippov static void (* const helper[])(TCGv_i32 r, TCGv_env env, TCGv_i32 a1,
2122168c12b0SMax Filippov TCGv_i32 a2) = {
2123168c12b0SMax Filippov gen_helper_rtlb0,
2124168c12b0SMax Filippov gen_helper_rtlb1,
2125168c12b0SMax Filippov };
21264ee412dfSMax Filippov TCGv_i32 dtlb = tcg_constant_i32(par[0]);
2127168c12b0SMax Filippov
2128ad75a51eSRichard Henderson helper[par[1]](arg[0].out, tcg_env, arg[1].in, dtlb);
212921a2dad5SMax Filippov #endif
2130168c12b0SMax Filippov }
2131168c12b0SMax Filippov
translate_rptlb0(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])21324d04ea35SMax Filippov static void translate_rptlb0(DisasContext *dc, const OpcodeArg arg[],
21334d04ea35SMax Filippov const uint32_t par[])
21344d04ea35SMax Filippov {
21354d04ea35SMax Filippov #ifndef CONFIG_USER_ONLY
2136ad75a51eSRichard Henderson gen_helper_rptlb0(arg[0].out, tcg_env, arg[1].in);
21374d04ea35SMax Filippov #endif
21384d04ea35SMax Filippov }
21394d04ea35SMax Filippov
translate_rptlb1(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])21404d04ea35SMax Filippov static void translate_rptlb1(DisasContext *dc, const OpcodeArg arg[],
21414d04ea35SMax Filippov const uint32_t par[])
21424d04ea35SMax Filippov {
21434d04ea35SMax Filippov #ifndef CONFIG_USER_ONLY
2144ad75a51eSRichard Henderson gen_helper_rptlb1(arg[0].out, tcg_env, arg[1].in);
21454d04ea35SMax Filippov #endif
21464d04ea35SMax Filippov }
21474d04ea35SMax Filippov
translate_rur(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])2148b0b24bdcSMax Filippov static void translate_rur(DisasContext *dc, const OpcodeArg arg[],
2149168c12b0SMax Filippov const uint32_t par[])
2150168c12b0SMax Filippov {
2151b0b24bdcSMax Filippov tcg_gen_mov_i32(arg[0].out, cpu_UR[par[0]]);
2152168c12b0SMax Filippov }
2153168c12b0SMax Filippov
translate_setb_expstate(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])2154b0b24bdcSMax Filippov static void translate_setb_expstate(DisasContext *dc, const OpcodeArg arg[],
2155e9872741SMax Filippov const uint32_t par[])
2156e9872741SMax Filippov {
2157e9872741SMax Filippov /* TODO: GPIO32 may be a part of coprocessor */
2158b0b24bdcSMax Filippov tcg_gen_ori_i32(cpu_UR[EXPSTATE], cpu_UR[EXPSTATE], 1u << arg[0].imm);
2159e9872741SMax Filippov }
2160e9872741SMax Filippov
21619fb40342SMax Filippov #ifdef CONFIG_USER_ONLY
gen_check_atomctl(DisasContext * dc,TCGv_i32 addr)21629fb40342SMax Filippov static void gen_check_atomctl(DisasContext *dc, TCGv_i32 addr)
21639fb40342SMax Filippov {
21649fb40342SMax Filippov }
21659fb40342SMax Filippov #else
gen_check_atomctl(DisasContext * dc,TCGv_i32 addr)21669fb40342SMax Filippov static void gen_check_atomctl(DisasContext *dc, TCGv_i32 addr)
21679fb40342SMax Filippov {
21686ade0ce9SMax Filippov TCGv_i32 pc = tcg_constant_i32(dc->pc);
21699fb40342SMax Filippov
2170ad75a51eSRichard Henderson gen_helper_check_atomctl(tcg_env, pc, addr);
21719fb40342SMax Filippov }
21729fb40342SMax Filippov #endif
21739fb40342SMax Filippov
translate_s32c1i(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])2174b0b24bdcSMax Filippov static void translate_s32c1i(DisasContext *dc, const OpcodeArg arg[],
2175168c12b0SMax Filippov const uint32_t par[])
2176168c12b0SMax Filippov {
2177177bbc81SRichard Henderson TCGv_i32 tmp = tcg_temp_new_i32();
2178177bbc81SRichard Henderson TCGv_i32 addr = tcg_temp_new_i32();
2179583e6a5fSMax Filippov MemOp mop;
2180168c12b0SMax Filippov
2181b0b24bdcSMax Filippov tcg_gen_mov_i32(tmp, arg[0].in);
2182b0b24bdcSMax Filippov tcg_gen_addi_i32(addr, arg[1].in, arg[2].imm);
2183583e6a5fSMax Filippov mop = gen_load_store_alignment(dc, MO_TEUL | MO_ALIGN, addr);
21849fb40342SMax Filippov gen_check_atomctl(dc, addr);
2185b0b24bdcSMax Filippov tcg_gen_atomic_cmpxchg_i32(arg[0].out, addr, cpu_SR[SCOMPARE1],
2186583e6a5fSMax Filippov tmp, dc->cring, mop);
2187168c12b0SMax Filippov }
2188168c12b0SMax Filippov
translate_s32e(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])2189b0b24bdcSMax Filippov static void translate_s32e(DisasContext *dc, const OpcodeArg arg[],
2190168c12b0SMax Filippov const uint32_t par[])
2191168c12b0SMax Filippov {
2192168c12b0SMax Filippov TCGv_i32 addr = tcg_temp_new_i32();
2193583e6a5fSMax Filippov MemOp mop;
2194168c12b0SMax Filippov
2195b0b24bdcSMax Filippov tcg_gen_addi_i32(addr, arg[1].in, arg[2].imm);
2196583e6a5fSMax Filippov mop = gen_load_store_alignment(dc, MO_TEUL, addr);
2197583e6a5fSMax Filippov tcg_gen_qemu_st_tl(arg[0].in, addr, dc->ring, mop);
2198168c12b0SMax Filippov }
2199168c12b0SMax Filippov
translate_s32ex(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])2200b345e140SMax Filippov static void translate_s32ex(DisasContext *dc, const OpcodeArg arg[],
2201b345e140SMax Filippov const uint32_t par[])
2202b345e140SMax Filippov {
2203b345e140SMax Filippov TCGv_i32 prev = tcg_temp_new_i32();
2204177bbc81SRichard Henderson TCGv_i32 addr = tcg_temp_new_i32();
2205177bbc81SRichard Henderson TCGv_i32 res = tcg_temp_new_i32();
2206b345e140SMax Filippov TCGLabel *label = gen_new_label();
2207583e6a5fSMax Filippov MemOp mop;
2208b345e140SMax Filippov
2209b345e140SMax Filippov tcg_gen_movi_i32(res, 0);
2210b345e140SMax Filippov tcg_gen_mov_i32(addr, arg[1].in);
2211583e6a5fSMax Filippov mop = gen_load_store_alignment(dc, MO_TEUL | MO_ALIGN, addr);
2212b345e140SMax Filippov tcg_gen_brcond_i32(TCG_COND_NE, addr, cpu_exclusive_addr, label);
2213b345e140SMax Filippov gen_check_exclusive(dc, addr, true);
2214b345e140SMax Filippov tcg_gen_atomic_cmpxchg_i32(prev, cpu_exclusive_addr, cpu_exclusive_val,
2215583e6a5fSMax Filippov arg[0].in, dc->cring, mop);
2216b345e140SMax Filippov tcg_gen_setcond_i32(TCG_COND_EQ, res, prev, cpu_exclusive_val);
2217b345e140SMax Filippov tcg_gen_movcond_i32(TCG_COND_EQ, cpu_exclusive_val,
2218b345e140SMax Filippov prev, cpu_exclusive_val, prev, cpu_exclusive_val);
2219b345e140SMax Filippov tcg_gen_movi_i32(cpu_exclusive_addr, -1);
2220b345e140SMax Filippov gen_set_label(label);
2221b345e140SMax Filippov tcg_gen_extract_i32(arg[0].out, cpu_SR[ATOMCTL], 8, 1);
2222b345e140SMax Filippov tcg_gen_deposit_i32(cpu_SR[ATOMCTL], cpu_SR[ATOMCTL], res, 8, 1);
2223b345e140SMax Filippov }
2224b345e140SMax Filippov
translate_salt(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])2225b0b24bdcSMax Filippov static void translate_salt(DisasContext *dc, const OpcodeArg arg[],
2226d1e9b006SMax Filippov const uint32_t par[])
2227d1e9b006SMax Filippov {
2228d1e9b006SMax Filippov tcg_gen_setcond_i32(par[0],
2229b0b24bdcSMax Filippov arg[0].out,
2230b0b24bdcSMax Filippov arg[1].in, arg[2].in);
2231d1e9b006SMax Filippov }
2232d1e9b006SMax Filippov
translate_sext(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])2233b0b24bdcSMax Filippov static void translate_sext(DisasContext *dc, const OpcodeArg arg[],
2234168c12b0SMax Filippov const uint32_t par[])
2235168c12b0SMax Filippov {
2236e40df352SRichard Henderson tcg_gen_sextract_i32(arg[0].out, arg[1].in, 0, arg[2].imm + 1);
2237168c12b0SMax Filippov }
2238168c12b0SMax Filippov
test_exceptions_simcall(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])223991dc2b2dSMax Filippov static uint32_t test_exceptions_simcall(DisasContext *dc,
224091dc2b2dSMax Filippov const OpcodeArg arg[],
224109460970SMax Filippov const uint32_t par[])
224209460970SMax Filippov {
2243870ab98bSPeter Maydell bool is_semi = semihosting_enabled(dc->cring != 0);
224409460970SMax Filippov #ifdef CONFIG_USER_ONLY
224509460970SMax Filippov bool ill = true;
224609460970SMax Filippov #else
224762ed68e3SMax Filippov /* Between RE.2 and RE.3 simcall opcode's become nop for the hardware. */
2248870ab98bSPeter Maydell bool ill = dc->config->hw_version <= 250002 && !is_semi;
224909460970SMax Filippov #endif
2250870ab98bSPeter Maydell if (ill || !is_semi) {
225109460970SMax Filippov qemu_log_mask(LOG_GUEST_ERROR, "SIMCALL but semihosting is disabled\n");
225209460970SMax Filippov }
225391dc2b2dSMax Filippov return ill ? XTENSA_OP_ILL : 0;
225409460970SMax Filippov }
225509460970SMax Filippov
translate_simcall(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])2256b0b24bdcSMax Filippov static void translate_simcall(DisasContext *dc, const OpcodeArg arg[],
2257168c12b0SMax Filippov const uint32_t par[])
2258168c12b0SMax Filippov {
2259ba7651fbSMax Filippov #ifndef CONFIG_USER_ONLY
2260870ab98bSPeter Maydell if (semihosting_enabled(dc->cring != 0)) {
2261ad75a51eSRichard Henderson gen_helper_simcall(tcg_env);
226262ed68e3SMax Filippov }
2263ba7651fbSMax Filippov #endif
2264168c12b0SMax Filippov }
2265168c12b0SMax Filippov
2266168c12b0SMax Filippov /*
2267168c12b0SMax Filippov * Note: 64 bit ops are used here solely because SAR values
2268168c12b0SMax Filippov * have range 0..63
2269168c12b0SMax Filippov */
2270168c12b0SMax Filippov #define gen_shift_reg(cmd, reg) do { \
2271168c12b0SMax Filippov TCGv_i64 tmp = tcg_temp_new_i64(); \
2272168c12b0SMax Filippov tcg_gen_extu_i32_i64(tmp, reg); \
2273168c12b0SMax Filippov tcg_gen_##cmd##_i64(v, v, tmp); \
2274b0b24bdcSMax Filippov tcg_gen_extrl_i64_i32(arg[0].out, v); \
2275168c12b0SMax Filippov } while (0)
2276168c12b0SMax Filippov
2277168c12b0SMax Filippov #define gen_shift(cmd) gen_shift_reg(cmd, cpu_SR[SAR])
2278168c12b0SMax Filippov
translate_sll(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])2279b0b24bdcSMax Filippov static void translate_sll(DisasContext *dc, const OpcodeArg arg[],
2280168c12b0SMax Filippov const uint32_t par[])
2281168c12b0SMax Filippov {
2282168c12b0SMax Filippov if (dc->sar_m32_5bit) {
2283b0b24bdcSMax Filippov tcg_gen_shl_i32(arg[0].out, arg[1].in, dc->sar_m32);
2284168c12b0SMax Filippov } else {
2285168c12b0SMax Filippov TCGv_i64 v = tcg_temp_new_i64();
2286885f21feSRichard Henderson TCGv_i32 s = tcg_temp_new();
2287885f21feSRichard Henderson tcg_gen_subfi_i32(s, 32, cpu_SR[SAR]);
2288168c12b0SMax Filippov tcg_gen_andi_i32(s, s, 0x3f);
2289b0b24bdcSMax Filippov tcg_gen_extu_i32_i64(v, arg[1].in);
2290168c12b0SMax Filippov gen_shift_reg(shl, s);
2291168c12b0SMax Filippov }
2292168c12b0SMax Filippov }
2293168c12b0SMax Filippov
translate_slli(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])2294b0b24bdcSMax Filippov static void translate_slli(DisasContext *dc, const OpcodeArg arg[],
2295168c12b0SMax Filippov const uint32_t par[])
2296168c12b0SMax Filippov {
2297b0b24bdcSMax Filippov if (arg[2].imm == 32) {
22988e96f594SPhilippe Mathieu-Daudé qemu_log_mask(LOG_GUEST_ERROR, "slli a%d, a%d, 32 is undefined\n",
2299b0b24bdcSMax Filippov arg[0].imm, arg[1].imm);
2300168c12b0SMax Filippov }
2301b0b24bdcSMax Filippov tcg_gen_shli_i32(arg[0].out, arg[1].in, arg[2].imm & 0x1f);
2302168c12b0SMax Filippov }
2303168c12b0SMax Filippov
translate_sra(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])2304b0b24bdcSMax Filippov static void translate_sra(DisasContext *dc, const OpcodeArg arg[],
2305168c12b0SMax Filippov const uint32_t par[])
2306168c12b0SMax Filippov {
2307168c12b0SMax Filippov if (dc->sar_m32_5bit) {
2308b0b24bdcSMax Filippov tcg_gen_sar_i32(arg[0].out, arg[1].in, cpu_SR[SAR]);
2309168c12b0SMax Filippov } else {
2310168c12b0SMax Filippov TCGv_i64 v = tcg_temp_new_i64();
2311b0b24bdcSMax Filippov tcg_gen_ext_i32_i64(v, arg[1].in);
2312168c12b0SMax Filippov gen_shift(sar);
2313168c12b0SMax Filippov }
2314168c12b0SMax Filippov }
2315168c12b0SMax Filippov
translate_srai(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])2316b0b24bdcSMax Filippov static void translate_srai(DisasContext *dc, const OpcodeArg arg[],
2317168c12b0SMax Filippov const uint32_t par[])
2318168c12b0SMax Filippov {
2319b0b24bdcSMax Filippov tcg_gen_sari_i32(arg[0].out, arg[1].in, arg[2].imm);
2320168c12b0SMax Filippov }
2321168c12b0SMax Filippov
translate_src(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])2322b0b24bdcSMax Filippov static void translate_src(DisasContext *dc, const OpcodeArg arg[],
2323168c12b0SMax Filippov const uint32_t par[])
2324168c12b0SMax Filippov {
2325168c12b0SMax Filippov TCGv_i64 v = tcg_temp_new_i64();
2326b0b24bdcSMax Filippov tcg_gen_concat_i32_i64(v, arg[2].in, arg[1].in);
2327168c12b0SMax Filippov gen_shift(shr);
2328168c12b0SMax Filippov }
2329168c12b0SMax Filippov
translate_srl(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])2330b0b24bdcSMax Filippov static void translate_srl(DisasContext *dc, const OpcodeArg arg[],
2331168c12b0SMax Filippov const uint32_t par[])
2332168c12b0SMax Filippov {
2333168c12b0SMax Filippov if (dc->sar_m32_5bit) {
2334b0b24bdcSMax Filippov tcg_gen_shr_i32(arg[0].out, arg[1].in, cpu_SR[SAR]);
2335168c12b0SMax Filippov } else {
2336168c12b0SMax Filippov TCGv_i64 v = tcg_temp_new_i64();
2337b0b24bdcSMax Filippov tcg_gen_extu_i32_i64(v, arg[1].in);
2338168c12b0SMax Filippov gen_shift(shr);
2339168c12b0SMax Filippov }
2340168c12b0SMax Filippov }
2341168c12b0SMax Filippov
2342168c12b0SMax Filippov #undef gen_shift
2343168c12b0SMax Filippov #undef gen_shift_reg
2344168c12b0SMax Filippov
translate_srli(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])2345b0b24bdcSMax Filippov static void translate_srli(DisasContext *dc, const OpcodeArg arg[],
2346168c12b0SMax Filippov const uint32_t par[])
2347168c12b0SMax Filippov {
2348b0b24bdcSMax Filippov tcg_gen_shri_i32(arg[0].out, arg[1].in, arg[2].imm);
2349168c12b0SMax Filippov }
2350168c12b0SMax Filippov
translate_ssa8b(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])2351b0b24bdcSMax Filippov static void translate_ssa8b(DisasContext *dc, const OpcodeArg arg[],
2352168c12b0SMax Filippov const uint32_t par[])
2353168c12b0SMax Filippov {
2354168c12b0SMax Filippov TCGv_i32 tmp = tcg_temp_new_i32();
2355b0b24bdcSMax Filippov tcg_gen_shli_i32(tmp, arg[0].in, 3);
2356168c12b0SMax Filippov gen_left_shift_sar(dc, tmp);
2357168c12b0SMax Filippov }
2358168c12b0SMax Filippov
translate_ssa8l(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])2359b0b24bdcSMax Filippov static void translate_ssa8l(DisasContext *dc, const OpcodeArg arg[],
2360168c12b0SMax Filippov const uint32_t par[])
2361168c12b0SMax Filippov {
2362168c12b0SMax Filippov TCGv_i32 tmp = tcg_temp_new_i32();
2363b0b24bdcSMax Filippov tcg_gen_shli_i32(tmp, arg[0].in, 3);
2364168c12b0SMax Filippov gen_right_shift_sar(dc, tmp);
2365168c12b0SMax Filippov }
2366168c12b0SMax Filippov
translate_ssai(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])2367b0b24bdcSMax Filippov static void translate_ssai(DisasContext *dc, const OpcodeArg arg[],
2368168c12b0SMax Filippov const uint32_t par[])
2369168c12b0SMax Filippov {
23706ade0ce9SMax Filippov gen_right_shift_sar(dc, tcg_constant_i32(arg[0].imm));
2371168c12b0SMax Filippov }
2372168c12b0SMax Filippov
translate_ssl(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])2373b0b24bdcSMax Filippov static void translate_ssl(DisasContext *dc, const OpcodeArg arg[],
2374168c12b0SMax Filippov const uint32_t par[])
2375168c12b0SMax Filippov {
2376b0b24bdcSMax Filippov gen_left_shift_sar(dc, arg[0].in);
2377168c12b0SMax Filippov }
2378168c12b0SMax Filippov
translate_ssr(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])2379b0b24bdcSMax Filippov static void translate_ssr(DisasContext *dc, const OpcodeArg arg[],
2380168c12b0SMax Filippov const uint32_t par[])
2381168c12b0SMax Filippov {
2382b0b24bdcSMax Filippov gen_right_shift_sar(dc, arg[0].in);
2383168c12b0SMax Filippov }
2384168c12b0SMax Filippov
translate_sub(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])2385b0b24bdcSMax Filippov static void translate_sub(DisasContext *dc, const OpcodeArg arg[],
2386168c12b0SMax Filippov const uint32_t par[])
2387168c12b0SMax Filippov {
2388b0b24bdcSMax Filippov tcg_gen_sub_i32(arg[0].out, arg[1].in, arg[2].in);
2389168c12b0SMax Filippov }
2390168c12b0SMax Filippov
translate_subx(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])2391b0b24bdcSMax Filippov static void translate_subx(DisasContext *dc, const OpcodeArg arg[],
2392168c12b0SMax Filippov const uint32_t par[])
2393168c12b0SMax Filippov {
2394168c12b0SMax Filippov TCGv_i32 tmp = tcg_temp_new_i32();
2395b0b24bdcSMax Filippov tcg_gen_shli_i32(tmp, arg[1].in, par[0]);
2396b0b24bdcSMax Filippov tcg_gen_sub_i32(arg[0].out, tmp, arg[2].in);
2397168c12b0SMax Filippov }
2398168c12b0SMax Filippov
translate_waiti(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])2399b0b24bdcSMax Filippov static void translate_waiti(DisasContext *dc, const OpcodeArg arg[],
2400168c12b0SMax Filippov const uint32_t par[])
2401168c12b0SMax Filippov {
2402ba7651fbSMax Filippov #ifndef CONFIG_USER_ONLY
24036ade0ce9SMax Filippov TCGv_i32 pc = tcg_constant_i32(dc->base.pc_next);
24046ade0ce9SMax Filippov
2405dfd1b812SRichard Henderson translator_io_start(&dc->base);
2406ad75a51eSRichard Henderson gen_helper_waiti(tcg_env, pc, tcg_constant_i32(arg[0].imm));
2407ba7651fbSMax Filippov #endif
2408168c12b0SMax Filippov }
2409168c12b0SMax Filippov
translate_wtlb(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])2410b0b24bdcSMax Filippov static void translate_wtlb(DisasContext *dc, const OpcodeArg arg[],
2411168c12b0SMax Filippov const uint32_t par[])
2412168c12b0SMax Filippov {
2413ba7651fbSMax Filippov #ifndef CONFIG_USER_ONLY
24144ee412dfSMax Filippov TCGv_i32 dtlb = tcg_constant_i32(par[0]);
2415168c12b0SMax Filippov
2416ad75a51eSRichard Henderson gen_helper_wtlb(tcg_env, arg[0].in, arg[1].in, dtlb);
2417ba7651fbSMax Filippov #endif
2418168c12b0SMax Filippov }
2419168c12b0SMax Filippov
translate_wptlb(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])24204d04ea35SMax Filippov static void translate_wptlb(DisasContext *dc, const OpcodeArg arg[],
24214d04ea35SMax Filippov const uint32_t par[])
24224d04ea35SMax Filippov {
24234d04ea35SMax Filippov #ifndef CONFIG_USER_ONLY
2424ad75a51eSRichard Henderson gen_helper_wptlb(tcg_env, arg[0].in, arg[1].in);
24254d04ea35SMax Filippov #endif
24264d04ea35SMax Filippov }
24274d04ea35SMax Filippov
translate_wer(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])2428b0b24bdcSMax Filippov static void translate_wer(DisasContext *dc, const OpcodeArg arg[],
2429168c12b0SMax Filippov const uint32_t par[])
2430168c12b0SMax Filippov {
2431ad75a51eSRichard Henderson gen_helper_wer(tcg_env, arg[0].in, arg[1].in);
2432168c12b0SMax Filippov }
2433168c12b0SMax Filippov
translate_wrmsk_expstate(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])2434b0b24bdcSMax Filippov static void translate_wrmsk_expstate(DisasContext *dc, const OpcodeArg arg[],
2435e9872741SMax Filippov const uint32_t par[])
2436e9872741SMax Filippov {
2437e9872741SMax Filippov /* TODO: GPIO32 may be a part of coprocessor */
2438b0b24bdcSMax Filippov tcg_gen_and_i32(cpu_UR[EXPSTATE], arg[0].in, arg[1].in);
2439e9872741SMax Filippov }
2440e9872741SMax Filippov
translate_wsr(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])2441b0b24bdcSMax Filippov static void translate_wsr(DisasContext *dc, const OpcodeArg arg[],
2442168c12b0SMax Filippov const uint32_t par[])
2443168c12b0SMax Filippov {
244459afd43dSMax Filippov if (sr_name[par[0]]) {
244559419607SMax Filippov tcg_gen_mov_i32(cpu_SR[par[0]], arg[0].in);
244659419607SMax Filippov }
244759afd43dSMax Filippov }
244859419607SMax Filippov
translate_wsr_mask(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])244959419607SMax Filippov static void translate_wsr_mask(DisasContext *dc, const OpcodeArg arg[],
245059419607SMax Filippov const uint32_t par[])
245159419607SMax Filippov {
245259afd43dSMax Filippov if (sr_name[par[0]]) {
245359419607SMax Filippov tcg_gen_andi_i32(cpu_SR[par[0]], arg[0].in, par[2]);
245459419607SMax Filippov }
245559afd43dSMax Filippov }
245659419607SMax Filippov
translate_wsr_acchi(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])245759419607SMax Filippov static void translate_wsr_acchi(DisasContext *dc, const OpcodeArg arg[],
245859419607SMax Filippov const uint32_t par[])
245959419607SMax Filippov {
246059419607SMax Filippov tcg_gen_ext8s_i32(cpu_SR[par[0]], arg[0].in);
246159419607SMax Filippov }
246259419607SMax Filippov
translate_wsr_ccompare(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])246359419607SMax Filippov static void translate_wsr_ccompare(DisasContext *dc, const OpcodeArg arg[],
246459419607SMax Filippov const uint32_t par[])
246559419607SMax Filippov {
246659419607SMax Filippov #ifndef CONFIG_USER_ONLY
246759419607SMax Filippov uint32_t id = par[0] - CCOMPARE;
246859419607SMax Filippov
246959419607SMax Filippov assert(id < dc->config->nccompare);
2470dfd1b812SRichard Henderson translator_io_start(&dc->base);
247159419607SMax Filippov tcg_gen_mov_i32(cpu_SR[par[0]], arg[0].in);
2472ad75a51eSRichard Henderson gen_helper_update_ccompare(tcg_env, tcg_constant_i32(id));
247359419607SMax Filippov #endif
247459419607SMax Filippov }
247559419607SMax Filippov
translate_wsr_ccount(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])247659419607SMax Filippov static void translate_wsr_ccount(DisasContext *dc, const OpcodeArg arg[],
247759419607SMax Filippov const uint32_t par[])
247859419607SMax Filippov {
247959419607SMax Filippov #ifndef CONFIG_USER_ONLY
2480dfd1b812SRichard Henderson translator_io_start(&dc->base);
2481ad75a51eSRichard Henderson gen_helper_wsr_ccount(tcg_env, arg[0].in);
248259419607SMax Filippov #endif
248359419607SMax Filippov }
248459419607SMax Filippov
translate_wsr_dbreaka(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])248559419607SMax Filippov static void translate_wsr_dbreaka(DisasContext *dc, const OpcodeArg arg[],
248659419607SMax Filippov const uint32_t par[])
248759419607SMax Filippov {
248859419607SMax Filippov #ifndef CONFIG_USER_ONLY
248959419607SMax Filippov unsigned id = par[0] - DBREAKA;
249059419607SMax Filippov
249159419607SMax Filippov assert(id < dc->config->ndbreak);
2492ad75a51eSRichard Henderson gen_helper_wsr_dbreaka(tcg_env, tcg_constant_i32(id), arg[0].in);
249359419607SMax Filippov #endif
249459419607SMax Filippov }
249559419607SMax Filippov
translate_wsr_dbreakc(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])249659419607SMax Filippov static void translate_wsr_dbreakc(DisasContext *dc, const OpcodeArg arg[],
249759419607SMax Filippov const uint32_t par[])
249859419607SMax Filippov {
249959419607SMax Filippov #ifndef CONFIG_USER_ONLY
250059419607SMax Filippov unsigned id = par[0] - DBREAKC;
250159419607SMax Filippov
250259419607SMax Filippov assert(id < dc->config->ndbreak);
2503ad75a51eSRichard Henderson gen_helper_wsr_dbreakc(tcg_env, tcg_constant_i32(id), arg[0].in);
250459419607SMax Filippov #endif
250559419607SMax Filippov }
250659419607SMax Filippov
translate_wsr_ibreaka(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])250759419607SMax Filippov static void translate_wsr_ibreaka(DisasContext *dc, const OpcodeArg arg[],
250859419607SMax Filippov const uint32_t par[])
250959419607SMax Filippov {
251059419607SMax Filippov #ifndef CONFIG_USER_ONLY
251159419607SMax Filippov unsigned id = par[0] - IBREAKA;
251259419607SMax Filippov
251359419607SMax Filippov assert(id < dc->config->nibreak);
2514ad75a51eSRichard Henderson gen_helper_wsr_ibreaka(tcg_env, tcg_constant_i32(id), arg[0].in);
251559419607SMax Filippov #endif
251659419607SMax Filippov }
251759419607SMax Filippov
translate_wsr_ibreakenable(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])251859419607SMax Filippov static void translate_wsr_ibreakenable(DisasContext *dc, const OpcodeArg arg[],
251959419607SMax Filippov const uint32_t par[])
252059419607SMax Filippov {
252159419607SMax Filippov #ifndef CONFIG_USER_ONLY
2522ad75a51eSRichard Henderson gen_helper_wsr_ibreakenable(tcg_env, arg[0].in);
252359419607SMax Filippov #endif
252459419607SMax Filippov }
252559419607SMax Filippov
translate_wsr_icount(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])252659419607SMax Filippov static void translate_wsr_icount(DisasContext *dc, const OpcodeArg arg[],
252759419607SMax Filippov const uint32_t par[])
252859419607SMax Filippov {
252959419607SMax Filippov #ifndef CONFIG_USER_ONLY
253059419607SMax Filippov if (dc->icount) {
253159419607SMax Filippov tcg_gen_mov_i32(dc->next_icount, arg[0].in);
253259419607SMax Filippov } else {
253359419607SMax Filippov tcg_gen_mov_i32(cpu_SR[par[0]], arg[0].in);
253459419607SMax Filippov }
253559419607SMax Filippov #endif
253659419607SMax Filippov }
253759419607SMax Filippov
translate_wsr_intclear(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])253859419607SMax Filippov static void translate_wsr_intclear(DisasContext *dc, const OpcodeArg arg[],
253959419607SMax Filippov const uint32_t par[])
254059419607SMax Filippov {
254159419607SMax Filippov #ifndef CONFIG_USER_ONLY
2542ad75a51eSRichard Henderson gen_helper_intclear(tcg_env, arg[0].in);
254359419607SMax Filippov #endif
254459419607SMax Filippov }
254559419607SMax Filippov
translate_wsr_intset(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])254659419607SMax Filippov static void translate_wsr_intset(DisasContext *dc, const OpcodeArg arg[],
254759419607SMax Filippov const uint32_t par[])
254859419607SMax Filippov {
254959419607SMax Filippov #ifndef CONFIG_USER_ONLY
2550ad75a51eSRichard Henderson gen_helper_intset(tcg_env, arg[0].in);
255159419607SMax Filippov #endif
255259419607SMax Filippov }
255359419607SMax Filippov
translate_wsr_memctl(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])255459419607SMax Filippov static void translate_wsr_memctl(DisasContext *dc, const OpcodeArg arg[],
255559419607SMax Filippov const uint32_t par[])
255659419607SMax Filippov {
255759419607SMax Filippov #ifndef CONFIG_USER_ONLY
2558ad75a51eSRichard Henderson gen_helper_wsr_memctl(tcg_env, arg[0].in);
255959419607SMax Filippov #endif
256059419607SMax Filippov }
256159419607SMax Filippov
translate_wsr_mpuenb(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])25624d04ea35SMax Filippov static void translate_wsr_mpuenb(DisasContext *dc, const OpcodeArg arg[],
25634d04ea35SMax Filippov const uint32_t par[])
25644d04ea35SMax Filippov {
25654d04ea35SMax Filippov #ifndef CONFIG_USER_ONLY
2566ad75a51eSRichard Henderson gen_helper_wsr_mpuenb(tcg_env, arg[0].in);
25674d04ea35SMax Filippov #endif
25684d04ea35SMax Filippov }
25694d04ea35SMax Filippov
translate_wsr_ps(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])257059419607SMax Filippov static void translate_wsr_ps(DisasContext *dc, const OpcodeArg arg[],
257159419607SMax Filippov const uint32_t par[])
257259419607SMax Filippov {
257359419607SMax Filippov #ifndef CONFIG_USER_ONLY
257459419607SMax Filippov uint32_t mask = PS_WOE | PS_CALLINC | PS_OWB |
257559419607SMax Filippov PS_UM | PS_EXCM | PS_INTLEVEL;
257659419607SMax Filippov
25776c438056SMax Filippov if (option_enabled(dc, XTENSA_OPTION_MMU) ||
25786c438056SMax Filippov option_enabled(dc, XTENSA_OPTION_MPU)) {
257959419607SMax Filippov mask |= PS_RING;
258059419607SMax Filippov }
258159419607SMax Filippov tcg_gen_andi_i32(cpu_SR[par[0]], arg[0].in, mask);
258259419607SMax Filippov #endif
258359419607SMax Filippov }
258459419607SMax Filippov
translate_wsr_rasid(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])258559419607SMax Filippov static void translate_wsr_rasid(DisasContext *dc, const OpcodeArg arg[],
258659419607SMax Filippov const uint32_t par[])
258759419607SMax Filippov {
258859419607SMax Filippov #ifndef CONFIG_USER_ONLY
2589ad75a51eSRichard Henderson gen_helper_wsr_rasid(tcg_env, arg[0].in);
259059419607SMax Filippov #endif
259159419607SMax Filippov }
259259419607SMax Filippov
translate_wsr_sar(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])259359419607SMax Filippov static void translate_wsr_sar(DisasContext *dc, const OpcodeArg arg[],
259459419607SMax Filippov const uint32_t par[])
259559419607SMax Filippov {
259659419607SMax Filippov tcg_gen_andi_i32(cpu_SR[par[0]], arg[0].in, 0x3f);
259759419607SMax Filippov if (dc->sar_m32_5bit) {
259859419607SMax Filippov tcg_gen_discard_i32(dc->sar_m32);
259959419607SMax Filippov }
260059419607SMax Filippov dc->sar_5bit = false;
260159419607SMax Filippov dc->sar_m32_5bit = false;
260259419607SMax Filippov }
260359419607SMax Filippov
translate_wsr_windowbase(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])260459419607SMax Filippov static void translate_wsr_windowbase(DisasContext *dc, const OpcodeArg arg[],
260559419607SMax Filippov const uint32_t par[])
260659419607SMax Filippov {
260759419607SMax Filippov #ifndef CONFIG_USER_ONLY
260859419607SMax Filippov tcg_gen_mov_i32(cpu_windowbase_next, arg[0].in);
260959419607SMax Filippov #endif
261059419607SMax Filippov }
261159419607SMax Filippov
translate_wsr_windowstart(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])261259419607SMax Filippov static void translate_wsr_windowstart(DisasContext *dc, const OpcodeArg arg[],
261359419607SMax Filippov const uint32_t par[])
261459419607SMax Filippov {
261559419607SMax Filippov #ifndef CONFIG_USER_ONLY
261659419607SMax Filippov tcg_gen_andi_i32(cpu_SR[par[0]], arg[0].in,
261759419607SMax Filippov (1 << dc->config->nareg / 4) - 1);
261859419607SMax Filippov #endif
2619168c12b0SMax Filippov }
2620168c12b0SMax Filippov
translate_wur(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])2621b0b24bdcSMax Filippov static void translate_wur(DisasContext *dc, const OpcodeArg arg[],
2622168c12b0SMax Filippov const uint32_t par[])
2623168c12b0SMax Filippov {
262459419607SMax Filippov tcg_gen_mov_i32(cpu_UR[par[0]], arg[0].in);
2625168c12b0SMax Filippov }
262659419607SMax Filippov
translate_xor(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])2627b0b24bdcSMax Filippov static void translate_xor(DisasContext *dc, const OpcodeArg arg[],
2628168c12b0SMax Filippov const uint32_t par[])
2629168c12b0SMax Filippov {
2630b0b24bdcSMax Filippov tcg_gen_xor_i32(arg[0].out, arg[1].in, arg[2].in);
2631168c12b0SMax Filippov }
2632168c12b0SMax Filippov
translate_xsr(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])2633b0b24bdcSMax Filippov static void translate_xsr(DisasContext *dc, const OpcodeArg arg[],
2634168c12b0SMax Filippov const uint32_t par[])
2635168c12b0SMax Filippov {
263659afd43dSMax Filippov if (sr_name[par[0]]) {
2637168c12b0SMax Filippov TCGv_i32 tmp = tcg_temp_new_i32();
2638168c12b0SMax Filippov
2639b0b24bdcSMax Filippov tcg_gen_mov_i32(tmp, arg[0].in);
264059419607SMax Filippov tcg_gen_mov_i32(arg[0].out, cpu_SR[par[0]]);
264159419607SMax Filippov tcg_gen_mov_i32(cpu_SR[par[0]], tmp);
264259afd43dSMax Filippov } else {
264359afd43dSMax Filippov tcg_gen_movi_i32(arg[0].out, 0);
264459afd43dSMax Filippov }
2645168c12b0SMax Filippov }
2646168c12b0SMax Filippov
translate_xsr_mask(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])264759419607SMax Filippov static void translate_xsr_mask(DisasContext *dc, const OpcodeArg arg[],
264859419607SMax Filippov const uint32_t par[])
264959419607SMax Filippov {
265059afd43dSMax Filippov if (sr_name[par[0]]) {
265159419607SMax Filippov TCGv_i32 tmp = tcg_temp_new_i32();
265259419607SMax Filippov
265359419607SMax Filippov tcg_gen_mov_i32(tmp, arg[0].in);
265459419607SMax Filippov tcg_gen_mov_i32(arg[0].out, cpu_SR[par[0]]);
265559419607SMax Filippov tcg_gen_andi_i32(cpu_SR[par[0]], tmp, par[2]);
265659afd43dSMax Filippov } else {
265759afd43dSMax Filippov tcg_gen_movi_i32(arg[0].out, 0);
265859afd43dSMax Filippov }
265959419607SMax Filippov }
266059419607SMax Filippov
translate_xsr_ccount(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])266159419607SMax Filippov static void translate_xsr_ccount(DisasContext *dc, const OpcodeArg arg[],
266259419607SMax Filippov const uint32_t par[])
266359419607SMax Filippov {
266459419607SMax Filippov #ifndef CONFIG_USER_ONLY
266559419607SMax Filippov TCGv_i32 tmp = tcg_temp_new_i32();
266659419607SMax Filippov
2667dfd1b812SRichard Henderson translator_io_start(&dc->base);
2668ad75a51eSRichard Henderson gen_helper_update_ccount(tcg_env);
266959419607SMax Filippov tcg_gen_mov_i32(tmp, cpu_SR[par[0]]);
2670ad75a51eSRichard Henderson gen_helper_wsr_ccount(tcg_env, arg[0].in);
267159419607SMax Filippov tcg_gen_mov_i32(arg[0].out, tmp);
267259419607SMax Filippov
267359419607SMax Filippov #endif
267459419607SMax Filippov }
267559419607SMax Filippov
267659419607SMax Filippov #define gen_translate_xsr(name) \
267759419607SMax Filippov static void translate_xsr_##name(DisasContext *dc, const OpcodeArg arg[], \
267859419607SMax Filippov const uint32_t par[]) \
267959419607SMax Filippov { \
268059419607SMax Filippov TCGv_i32 tmp = tcg_temp_new_i32(); \
268159419607SMax Filippov \
268259afd43dSMax Filippov if (sr_name[par[0]]) { \
268359419607SMax Filippov tcg_gen_mov_i32(tmp, cpu_SR[par[0]]); \
268459afd43dSMax Filippov } else { \
268559afd43dSMax Filippov tcg_gen_movi_i32(tmp, 0); \
268659afd43dSMax Filippov } \
268759419607SMax Filippov translate_wsr_##name(dc, arg, par); \
268859419607SMax Filippov tcg_gen_mov_i32(arg[0].out, tmp); \
268959419607SMax Filippov }
269059419607SMax Filippov
269159419607SMax Filippov gen_translate_xsr(acchi)
269259419607SMax Filippov gen_translate_xsr(ccompare)
269359419607SMax Filippov gen_translate_xsr(dbreaka)
269459419607SMax Filippov gen_translate_xsr(dbreakc)
269559419607SMax Filippov gen_translate_xsr(ibreaka)
269659419607SMax Filippov gen_translate_xsr(ibreakenable)
269759419607SMax Filippov gen_translate_xsr(icount)
269859419607SMax Filippov gen_translate_xsr(memctl)
26994d04ea35SMax Filippov gen_translate_xsr(mpuenb)
270059419607SMax Filippov gen_translate_xsr(ps)
270159419607SMax Filippov gen_translate_xsr(rasid)
270259419607SMax Filippov gen_translate_xsr(sar)
270359419607SMax Filippov gen_translate_xsr(windowbase)
270459419607SMax Filippov gen_translate_xsr(windowstart)
270559419607SMax Filippov
270659419607SMax Filippov #undef gen_translate_xsr
270759419607SMax Filippov
2708168c12b0SMax Filippov static const XtensaOpcodeOps core_ops[] = {
2709168c12b0SMax Filippov {
2710168c12b0SMax Filippov .name = "abs",
2711168c12b0SMax Filippov .translate = translate_abs,
2712168c12b0SMax Filippov }, {
2713d863fcf7SMax Filippov .name = (const char * const[]) {
2714d863fcf7SMax Filippov "add", "add.n", NULL,
2715d863fcf7SMax Filippov },
2716168c12b0SMax Filippov .translate = translate_add,
2717d863fcf7SMax Filippov .op_flags = XTENSA_OP_NAME_ARRAY,
2718168c12b0SMax Filippov }, {
2719d863fcf7SMax Filippov .name = (const char * const[]) {
2720d863fcf7SMax Filippov "addi", "addi.n", NULL,
2721d863fcf7SMax Filippov },
2722168c12b0SMax Filippov .translate = translate_addi,
2723d863fcf7SMax Filippov .op_flags = XTENSA_OP_NAME_ARRAY,
2724168c12b0SMax Filippov }, {
2725168c12b0SMax Filippov .name = "addmi",
2726168c12b0SMax Filippov .translate = translate_addi,
2727168c12b0SMax Filippov }, {
2728168c12b0SMax Filippov .name = "addx2",
2729168c12b0SMax Filippov .translate = translate_addx,
2730168c12b0SMax Filippov .par = (const uint32_t[]){1},
2731168c12b0SMax Filippov }, {
2732168c12b0SMax Filippov .name = "addx4",
2733168c12b0SMax Filippov .translate = translate_addx,
2734168c12b0SMax Filippov .par = (const uint32_t[]){2},
2735168c12b0SMax Filippov }, {
2736168c12b0SMax Filippov .name = "addx8",
2737168c12b0SMax Filippov .translate = translate_addx,
2738168c12b0SMax Filippov .par = (const uint32_t[]){3},
2739168c12b0SMax Filippov }, {
2740168c12b0SMax Filippov .name = "all4",
2741168c12b0SMax Filippov .translate = translate_all,
2742168c12b0SMax Filippov .par = (const uint32_t[]){true, 4},
2743168c12b0SMax Filippov }, {
2744168c12b0SMax Filippov .name = "all8",
2745168c12b0SMax Filippov .translate = translate_all,
2746168c12b0SMax Filippov .par = (const uint32_t[]){true, 8},
2747168c12b0SMax Filippov }, {
2748168c12b0SMax Filippov .name = "and",
2749168c12b0SMax Filippov .translate = translate_and,
2750168c12b0SMax Filippov }, {
2751168c12b0SMax Filippov .name = "andb",
2752168c12b0SMax Filippov .translate = translate_boolean,
2753168c12b0SMax Filippov .par = (const uint32_t[]){BOOLEAN_AND},
2754168c12b0SMax Filippov }, {
2755168c12b0SMax Filippov .name = "andbc",
2756168c12b0SMax Filippov .translate = translate_boolean,
2757168c12b0SMax Filippov .par = (const uint32_t[]){BOOLEAN_ANDC},
2758168c12b0SMax Filippov }, {
2759168c12b0SMax Filippov .name = "any4",
2760168c12b0SMax Filippov .translate = translate_all,
2761168c12b0SMax Filippov .par = (const uint32_t[]){false, 4},
2762168c12b0SMax Filippov }, {
2763168c12b0SMax Filippov .name = "any8",
2764168c12b0SMax Filippov .translate = translate_all,
2765168c12b0SMax Filippov .par = (const uint32_t[]){false, 8},
2766168c12b0SMax Filippov }, {
2767fa6bc73cSMax Filippov .name = (const char * const[]) {
2768fa6bc73cSMax Filippov "ball", "ball.w15", "ball.w18", NULL,
2769fa6bc73cSMax Filippov },
2770168c12b0SMax Filippov .translate = translate_ball,
2771168c12b0SMax Filippov .par = (const uint32_t[]){TCG_COND_EQ},
2772fa6bc73cSMax Filippov .op_flags = XTENSA_OP_NAME_ARRAY,
2773168c12b0SMax Filippov }, {
2774d863fcf7SMax Filippov .name = (const char * const[]) {
2775fa6bc73cSMax Filippov "bany", "bany.w15", "bany.w18", NULL,
2776fa6bc73cSMax Filippov },
2777fa6bc73cSMax Filippov .translate = translate_bany,
2778fa6bc73cSMax Filippov .par = (const uint32_t[]){TCG_COND_NE},
2779fa6bc73cSMax Filippov .op_flags = XTENSA_OP_NAME_ARRAY,
2780fa6bc73cSMax Filippov }, {
2781fa6bc73cSMax Filippov .name = (const char * const[]) {
2782fa6bc73cSMax Filippov "bbc", "bbc.w15", "bbc.w18", NULL,
2783fa6bc73cSMax Filippov },
2784fa6bc73cSMax Filippov .translate = translate_bb,
2785fa6bc73cSMax Filippov .par = (const uint32_t[]){TCG_COND_EQ},
2786fa6bc73cSMax Filippov .op_flags = XTENSA_OP_NAME_ARRAY,
2787fa6bc73cSMax Filippov }, {
2788fa6bc73cSMax Filippov .name = (const char * const[]) {
2789fa6bc73cSMax Filippov "bbci", "bbci.w15", "bbci.w18", NULL,
2790fa6bc73cSMax Filippov },
2791fa6bc73cSMax Filippov .translate = translate_bbi,
2792fa6bc73cSMax Filippov .par = (const uint32_t[]){TCG_COND_EQ},
2793fa6bc73cSMax Filippov .op_flags = XTENSA_OP_NAME_ARRAY,
2794fa6bc73cSMax Filippov }, {
2795fa6bc73cSMax Filippov .name = (const char * const[]) {
2796fa6bc73cSMax Filippov "bbs", "bbs.w15", "bbs.w18", NULL,
2797fa6bc73cSMax Filippov },
2798fa6bc73cSMax Filippov .translate = translate_bb,
2799fa6bc73cSMax Filippov .par = (const uint32_t[]){TCG_COND_NE},
2800fa6bc73cSMax Filippov .op_flags = XTENSA_OP_NAME_ARRAY,
2801fa6bc73cSMax Filippov }, {
2802fa6bc73cSMax Filippov .name = (const char * const[]) {
2803fa6bc73cSMax Filippov "bbsi", "bbsi.w15", "bbsi.w18", NULL,
2804fa6bc73cSMax Filippov },
2805fa6bc73cSMax Filippov .translate = translate_bbi,
2806fa6bc73cSMax Filippov .par = (const uint32_t[]){TCG_COND_NE},
2807fa6bc73cSMax Filippov .op_flags = XTENSA_OP_NAME_ARRAY,
2808fa6bc73cSMax Filippov }, {
2809fa6bc73cSMax Filippov .name = (const char * const[]) {
2810fa6bc73cSMax Filippov "beq", "beq.w15", "beq.w18", NULL,
2811fa6bc73cSMax Filippov },
2812fa6bc73cSMax Filippov .translate = translate_b,
2813fa6bc73cSMax Filippov .par = (const uint32_t[]){TCG_COND_EQ},
2814fa6bc73cSMax Filippov .op_flags = XTENSA_OP_NAME_ARRAY,
2815fa6bc73cSMax Filippov }, {
2816fa6bc73cSMax Filippov .name = (const char * const[]) {
2817fa6bc73cSMax Filippov "beqi", "beqi.w15", "beqi.w18", NULL,
2818fa6bc73cSMax Filippov },
2819fa6bc73cSMax Filippov .translate = translate_bi,
2820fa6bc73cSMax Filippov .par = (const uint32_t[]){TCG_COND_EQ},
2821fa6bc73cSMax Filippov .op_flags = XTENSA_OP_NAME_ARRAY,
2822fa6bc73cSMax Filippov }, {
2823fa6bc73cSMax Filippov .name = (const char * const[]) {
2824fa6bc73cSMax Filippov "beqz", "beqz.n", "beqz.w15", "beqz.w18", NULL,
2825d863fcf7SMax Filippov },
2826168c12b0SMax Filippov .translate = translate_bz,
2827168c12b0SMax Filippov .par = (const uint32_t[]){TCG_COND_EQ},
2828d863fcf7SMax Filippov .op_flags = XTENSA_OP_NAME_ARRAY,
2829168c12b0SMax Filippov }, {
2830168c12b0SMax Filippov .name = "bf",
2831168c12b0SMax Filippov .translate = translate_bp,
2832168c12b0SMax Filippov .par = (const uint32_t[]){TCG_COND_EQ},
2833168c12b0SMax Filippov }, {
2834fa6bc73cSMax Filippov .name = (const char * const[]) {
2835fa6bc73cSMax Filippov "bge", "bge.w15", "bge.w18", NULL,
2836fa6bc73cSMax Filippov },
2837168c12b0SMax Filippov .translate = translate_b,
2838168c12b0SMax Filippov .par = (const uint32_t[]){TCG_COND_GE},
2839fa6bc73cSMax Filippov .op_flags = XTENSA_OP_NAME_ARRAY,
2840168c12b0SMax Filippov }, {
2841d863fcf7SMax Filippov .name = (const char * const[]) {
2842fa6bc73cSMax Filippov "bgei", "bgei.w15", "bgei.w18", NULL,
2843fa6bc73cSMax Filippov },
2844fa6bc73cSMax Filippov .translate = translate_bi,
2845fa6bc73cSMax Filippov .par = (const uint32_t[]){TCG_COND_GE},
2846fa6bc73cSMax Filippov .op_flags = XTENSA_OP_NAME_ARRAY,
2847fa6bc73cSMax Filippov }, {
2848fa6bc73cSMax Filippov .name = (const char * const[]) {
2849fa6bc73cSMax Filippov "bgeu", "bgeu.w15", "bgeu.w18", NULL,
2850fa6bc73cSMax Filippov },
2851fa6bc73cSMax Filippov .translate = translate_b,
2852fa6bc73cSMax Filippov .par = (const uint32_t[]){TCG_COND_GEU},
2853fa6bc73cSMax Filippov .op_flags = XTENSA_OP_NAME_ARRAY,
2854fa6bc73cSMax Filippov }, {
2855fa6bc73cSMax Filippov .name = (const char * const[]) {
2856fa6bc73cSMax Filippov "bgeui", "bgeui.w15", "bgeui.w18", NULL,
2857fa6bc73cSMax Filippov },
2858fa6bc73cSMax Filippov .translate = translate_bi,
2859fa6bc73cSMax Filippov .par = (const uint32_t[]){TCG_COND_GEU},
2860fa6bc73cSMax Filippov .op_flags = XTENSA_OP_NAME_ARRAY,
2861fa6bc73cSMax Filippov }, {
2862fa6bc73cSMax Filippov .name = (const char * const[]) {
2863fa6bc73cSMax Filippov "bgez", "bgez.w15", "bgez.w18", NULL,
2864fa6bc73cSMax Filippov },
2865fa6bc73cSMax Filippov .translate = translate_bz,
2866fa6bc73cSMax Filippov .par = (const uint32_t[]){TCG_COND_GE},
2867fa6bc73cSMax Filippov .op_flags = XTENSA_OP_NAME_ARRAY,
2868fa6bc73cSMax Filippov }, {
2869fa6bc73cSMax Filippov .name = (const char * const[]) {
2870fa6bc73cSMax Filippov "blt", "blt.w15", "blt.w18", NULL,
2871fa6bc73cSMax Filippov },
2872fa6bc73cSMax Filippov .translate = translate_b,
2873fa6bc73cSMax Filippov .par = (const uint32_t[]){TCG_COND_LT},
2874fa6bc73cSMax Filippov .op_flags = XTENSA_OP_NAME_ARRAY,
2875fa6bc73cSMax Filippov }, {
2876fa6bc73cSMax Filippov .name = (const char * const[]) {
2877fa6bc73cSMax Filippov "blti", "blti.w15", "blti.w18", NULL,
2878fa6bc73cSMax Filippov },
2879fa6bc73cSMax Filippov .translate = translate_bi,
2880fa6bc73cSMax Filippov .par = (const uint32_t[]){TCG_COND_LT},
2881fa6bc73cSMax Filippov .op_flags = XTENSA_OP_NAME_ARRAY,
2882fa6bc73cSMax Filippov }, {
2883fa6bc73cSMax Filippov .name = (const char * const[]) {
2884fa6bc73cSMax Filippov "bltu", "bltu.w15", "bltu.w18", NULL,
2885fa6bc73cSMax Filippov },
2886fa6bc73cSMax Filippov .translate = translate_b,
2887fa6bc73cSMax Filippov .par = (const uint32_t[]){TCG_COND_LTU},
2888fa6bc73cSMax Filippov .op_flags = XTENSA_OP_NAME_ARRAY,
2889fa6bc73cSMax Filippov }, {
2890fa6bc73cSMax Filippov .name = (const char * const[]) {
2891fa6bc73cSMax Filippov "bltui", "bltui.w15", "bltui.w18", NULL,
2892fa6bc73cSMax Filippov },
2893fa6bc73cSMax Filippov .translate = translate_bi,
2894fa6bc73cSMax Filippov .par = (const uint32_t[]){TCG_COND_LTU},
2895fa6bc73cSMax Filippov .op_flags = XTENSA_OP_NAME_ARRAY,
2896fa6bc73cSMax Filippov }, {
2897fa6bc73cSMax Filippov .name = (const char * const[]) {
2898fa6bc73cSMax Filippov "bltz", "bltz.w15", "bltz.w18", NULL,
2899fa6bc73cSMax Filippov },
2900fa6bc73cSMax Filippov .translate = translate_bz,
2901fa6bc73cSMax Filippov .par = (const uint32_t[]){TCG_COND_LT},
2902fa6bc73cSMax Filippov .op_flags = XTENSA_OP_NAME_ARRAY,
2903fa6bc73cSMax Filippov }, {
2904fa6bc73cSMax Filippov .name = (const char * const[]) {
2905fa6bc73cSMax Filippov "bnall", "bnall.w15", "bnall.w18", NULL,
2906fa6bc73cSMax Filippov },
2907fa6bc73cSMax Filippov .translate = translate_ball,
2908fa6bc73cSMax Filippov .par = (const uint32_t[]){TCG_COND_NE},
2909fa6bc73cSMax Filippov .op_flags = XTENSA_OP_NAME_ARRAY,
2910fa6bc73cSMax Filippov }, {
2911fa6bc73cSMax Filippov .name = (const char * const[]) {
2912fa6bc73cSMax Filippov "bne", "bne.w15", "bne.w18", NULL,
2913fa6bc73cSMax Filippov },
2914fa6bc73cSMax Filippov .translate = translate_b,
2915fa6bc73cSMax Filippov .par = (const uint32_t[]){TCG_COND_NE},
2916fa6bc73cSMax Filippov .op_flags = XTENSA_OP_NAME_ARRAY,
2917fa6bc73cSMax Filippov }, {
2918fa6bc73cSMax Filippov .name = (const char * const[]) {
2919fa6bc73cSMax Filippov "bnei", "bnei.w15", "bnei.w18", NULL,
2920fa6bc73cSMax Filippov },
2921fa6bc73cSMax Filippov .translate = translate_bi,
2922fa6bc73cSMax Filippov .par = (const uint32_t[]){TCG_COND_NE},
2923fa6bc73cSMax Filippov .op_flags = XTENSA_OP_NAME_ARRAY,
2924fa6bc73cSMax Filippov }, {
2925fa6bc73cSMax Filippov .name = (const char * const[]) {
2926fa6bc73cSMax Filippov "bnez", "bnez.n", "bnez.w15", "bnez.w18", NULL,
2927d863fcf7SMax Filippov },
2928168c12b0SMax Filippov .translate = translate_bz,
2929168c12b0SMax Filippov .par = (const uint32_t[]){TCG_COND_NE},
2930d863fcf7SMax Filippov .op_flags = XTENSA_OP_NAME_ARRAY,
2931168c12b0SMax Filippov }, {
2932fa6bc73cSMax Filippov .name = (const char * const[]) {
2933fa6bc73cSMax Filippov "bnone", "bnone.w15", "bnone.w18", NULL,
2934fa6bc73cSMax Filippov },
2935168c12b0SMax Filippov .translate = translate_bany,
2936168c12b0SMax Filippov .par = (const uint32_t[]){TCG_COND_EQ},
2937fa6bc73cSMax Filippov .op_flags = XTENSA_OP_NAME_ARRAY,
2938168c12b0SMax Filippov }, {
2939168c12b0SMax Filippov .name = "break",
294015477819SMax Filippov .translate = translate_nop,
2941168c12b0SMax Filippov .par = (const uint32_t[]){DEBUGCAUSE_BI},
294215477819SMax Filippov .op_flags = XTENSA_OP_DEBUG_BREAK,
2943168c12b0SMax Filippov }, {
2944168c12b0SMax Filippov .name = "break.n",
294515477819SMax Filippov .translate = translate_nop,
2946168c12b0SMax Filippov .par = (const uint32_t[]){DEBUGCAUSE_BN},
294715477819SMax Filippov .op_flags = XTENSA_OP_DEBUG_BREAK,
2948168c12b0SMax Filippov }, {
2949168c12b0SMax Filippov .name = "bt",
2950168c12b0SMax Filippov .translate = translate_bp,
2951168c12b0SMax Filippov .par = (const uint32_t[]){TCG_COND_NE},
2952168c12b0SMax Filippov }, {
2953168c12b0SMax Filippov .name = "call0",
2954168c12b0SMax Filippov .translate = translate_call0,
2955168c12b0SMax Filippov }, {
2956168c12b0SMax Filippov .name = "call12",
2957168c12b0SMax Filippov .translate = translate_callw,
2958168c12b0SMax Filippov .par = (const uint32_t[]){3},
2959168c12b0SMax Filippov }, {
2960168c12b0SMax Filippov .name = "call4",
2961168c12b0SMax Filippov .translate = translate_callw,
2962168c12b0SMax Filippov .par = (const uint32_t[]){1},
2963168c12b0SMax Filippov }, {
2964168c12b0SMax Filippov .name = "call8",
2965168c12b0SMax Filippov .translate = translate_callw,
2966168c12b0SMax Filippov .par = (const uint32_t[]){2},
2967168c12b0SMax Filippov }, {
2968168c12b0SMax Filippov .name = "callx0",
2969168c12b0SMax Filippov .translate = translate_callx0,
2970168c12b0SMax Filippov }, {
2971168c12b0SMax Filippov .name = "callx12",
2972168c12b0SMax Filippov .translate = translate_callxw,
2973168c12b0SMax Filippov .par = (const uint32_t[]){3},
2974168c12b0SMax Filippov }, {
2975168c12b0SMax Filippov .name = "callx4",
2976168c12b0SMax Filippov .translate = translate_callxw,
2977168c12b0SMax Filippov .par = (const uint32_t[]){1},
2978168c12b0SMax Filippov }, {
2979168c12b0SMax Filippov .name = "callx8",
2980168c12b0SMax Filippov .translate = translate_callxw,
2981168c12b0SMax Filippov .par = (const uint32_t[]){2},
2982168c12b0SMax Filippov }, {
2983168c12b0SMax Filippov .name = "clamps",
2984168c12b0SMax Filippov .translate = translate_clamps,
2985168c12b0SMax Filippov }, {
2986e9872741SMax Filippov .name = "clrb_expstate",
2987e9872741SMax Filippov .translate = translate_clrb_expstate,
2988e9872741SMax Filippov }, {
2989b345e140SMax Filippov .name = "clrex",
2990b345e140SMax Filippov .translate = translate_clrex,
2991b345e140SMax Filippov }, {
2992c5ac936eSMax Filippov .name = "const16",
2993c5ac936eSMax Filippov .translate = translate_const16,
2994c5ac936eSMax Filippov }, {
2995168c12b0SMax Filippov .name = "depbits",
2996168c12b0SMax Filippov .translate = translate_depbits,
2997168c12b0SMax Filippov }, {
2998168c12b0SMax Filippov .name = "dhi",
2999168c12b0SMax Filippov .translate = translate_dcache,
300021a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
3001168c12b0SMax Filippov }, {
3002c884400fSMax Filippov .name = "dhi.b",
3003c884400fSMax Filippov .translate = translate_nop,
3004c884400fSMax Filippov }, {
3005168c12b0SMax Filippov .name = "dhu",
3006168c12b0SMax Filippov .translate = translate_dcache,
300721a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
3008168c12b0SMax Filippov }, {
3009168c12b0SMax Filippov .name = "dhwb",
3010168c12b0SMax Filippov .translate = translate_dcache,
3011168c12b0SMax Filippov }, {
3012c884400fSMax Filippov .name = "dhwb.b",
3013c884400fSMax Filippov .translate = translate_nop,
3014c884400fSMax Filippov }, {
3015168c12b0SMax Filippov .name = "dhwbi",
3016168c12b0SMax Filippov .translate = translate_dcache,
3017168c12b0SMax Filippov }, {
3018c884400fSMax Filippov .name = "dhwbi.b",
3019c884400fSMax Filippov .translate = translate_nop,
3020c884400fSMax Filippov }, {
3021168c12b0SMax Filippov .name = "dii",
30226416d16fSMax Filippov .translate = translate_nop,
302321a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
3024168c12b0SMax Filippov }, {
3025168c12b0SMax Filippov .name = "diu",
30266416d16fSMax Filippov .translate = translate_nop,
302721a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
3028168c12b0SMax Filippov }, {
3029168c12b0SMax Filippov .name = "diwb",
30306416d16fSMax Filippov .translate = translate_nop,
303121a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
3032168c12b0SMax Filippov }, {
3033168c12b0SMax Filippov .name = "diwbi",
30346416d16fSMax Filippov .translate = translate_nop,
303521a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
3036168c12b0SMax Filippov }, {
303775eed0e5SMax Filippov .name = "diwbui.p",
303875eed0e5SMax Filippov .translate = translate_diwbuip,
303975eed0e5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
304075eed0e5SMax Filippov }, {
3041168c12b0SMax Filippov .name = "dpfl",
3042168c12b0SMax Filippov .translate = translate_dcache,
304321a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
3044168c12b0SMax Filippov }, {
3045c884400fSMax Filippov .name = "dpfm.b",
3046c884400fSMax Filippov .translate = translate_nop,
3047c884400fSMax Filippov }, {
3048c884400fSMax Filippov .name = "dpfm.bf",
3049c884400fSMax Filippov .translate = translate_nop,
3050c884400fSMax Filippov }, {
3051168c12b0SMax Filippov .name = "dpfr",
30526416d16fSMax Filippov .translate = translate_nop,
3053168c12b0SMax Filippov }, {
3054c884400fSMax Filippov .name = "dpfr.b",
3055c884400fSMax Filippov .translate = translate_nop,
3056c884400fSMax Filippov }, {
3057c884400fSMax Filippov .name = "dpfr.bf",
3058c884400fSMax Filippov .translate = translate_nop,
3059c884400fSMax Filippov }, {
3060168c12b0SMax Filippov .name = "dpfro",
30616416d16fSMax Filippov .translate = translate_nop,
3062168c12b0SMax Filippov }, {
3063168c12b0SMax Filippov .name = "dpfw",
30646416d16fSMax Filippov .translate = translate_nop,
3065168c12b0SMax Filippov }, {
3066c884400fSMax Filippov .name = "dpfw.b",
3067c884400fSMax Filippov .translate = translate_nop,
3068c884400fSMax Filippov }, {
3069c884400fSMax Filippov .name = "dpfw.bf",
3070c884400fSMax Filippov .translate = translate_nop,
3071c884400fSMax Filippov }, {
3072168c12b0SMax Filippov .name = "dpfwo",
30736416d16fSMax Filippov .translate = translate_nop,
3074168c12b0SMax Filippov }, {
3075168c12b0SMax Filippov .name = "dsync",
3076168c12b0SMax Filippov .translate = translate_nop,
3077168c12b0SMax Filippov }, {
3078168c12b0SMax Filippov .name = "entry",
3079168c12b0SMax Filippov .translate = translate_entry,
308091dc2b2dSMax Filippov .test_exceptions = test_exceptions_entry,
30816416d16fSMax Filippov .test_overflow = test_overflow_entry,
30828df3fd35SMax Filippov .op_flags = XTENSA_OP_EXIT_TB_M1 |
30838df3fd35SMax Filippov XTENSA_OP_SYNC_REGISTER_WINDOW,
3084168c12b0SMax Filippov }, {
3085168c12b0SMax Filippov .name = "esync",
3086168c12b0SMax Filippov .translate = translate_nop,
3087168c12b0SMax Filippov }, {
3088168c12b0SMax Filippov .name = "excw",
3089168c12b0SMax Filippov .translate = translate_nop,
3090168c12b0SMax Filippov }, {
3091168c12b0SMax Filippov .name = "extui",
3092168c12b0SMax Filippov .translate = translate_extui,
3093168c12b0SMax Filippov }, {
3094168c12b0SMax Filippov .name = "extw",
30959fb40342SMax Filippov .translate = translate_memw,
3096168c12b0SMax Filippov }, {
3097b345e140SMax Filippov .name = "getex",
3098b345e140SMax Filippov .translate = translate_getex,
3099b345e140SMax Filippov }, {
310013f6a7cdSMax Filippov .name = "hwwdtlba",
310109460970SMax Filippov .op_flags = XTENSA_OP_ILL,
310213f6a7cdSMax Filippov }, {
310313f6a7cdSMax Filippov .name = "hwwitlba",
310409460970SMax Filippov .op_flags = XTENSA_OP_ILL,
310513f6a7cdSMax Filippov }, {
3106168c12b0SMax Filippov .name = "idtlb",
3107168c12b0SMax Filippov .translate = translate_itlb,
3108168c12b0SMax Filippov .par = (const uint32_t[]){true},
3109226444a8SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED | XTENSA_OP_EXIT_TB_M1,
3110168c12b0SMax Filippov }, {
3111168c12b0SMax Filippov .name = "ihi",
3112168c12b0SMax Filippov .translate = translate_icache,
3113168c12b0SMax Filippov }, {
3114168c12b0SMax Filippov .name = "ihu",
3115168c12b0SMax Filippov .translate = translate_icache,
311621a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
3117168c12b0SMax Filippov }, {
3118168c12b0SMax Filippov .name = "iii",
31196416d16fSMax Filippov .translate = translate_nop,
312021a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
3121168c12b0SMax Filippov }, {
3122168c12b0SMax Filippov .name = "iitlb",
3123168c12b0SMax Filippov .translate = translate_itlb,
3124168c12b0SMax Filippov .par = (const uint32_t[]){false},
3125226444a8SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED | XTENSA_OP_EXIT_TB_M1,
3126168c12b0SMax Filippov }, {
3127168c12b0SMax Filippov .name = "iiu",
31286416d16fSMax Filippov .translate = translate_nop,
312921a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
3130168c12b0SMax Filippov }, {
3131d863fcf7SMax Filippov .name = (const char * const[]) {
3132d863fcf7SMax Filippov "ill", "ill.n", NULL,
3133d863fcf7SMax Filippov },
3134d863fcf7SMax Filippov .op_flags = XTENSA_OP_ILL | XTENSA_OP_NAME_ARRAY,
3135168c12b0SMax Filippov }, {
3136168c12b0SMax Filippov .name = "ipf",
31376416d16fSMax Filippov .translate = translate_nop,
3138168c12b0SMax Filippov }, {
3139168c12b0SMax Filippov .name = "ipfl",
3140168c12b0SMax Filippov .translate = translate_icache,
314121a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
3142168c12b0SMax Filippov }, {
3143168c12b0SMax Filippov .name = "isync",
3144168c12b0SMax Filippov .translate = translate_nop,
3145168c12b0SMax Filippov }, {
3146168c12b0SMax Filippov .name = "j",
3147168c12b0SMax Filippov .translate = translate_j,
3148168c12b0SMax Filippov }, {
3149168c12b0SMax Filippov .name = "jx",
3150168c12b0SMax Filippov .translate = translate_jx,
3151168c12b0SMax Filippov }, {
3152168c12b0SMax Filippov .name = "l16si",
3153168c12b0SMax Filippov .translate = translate_ldst,
3154168c12b0SMax Filippov .par = (const uint32_t[]){MO_TESW, false, false},
3155068e538aSMax Filippov .op_flags = XTENSA_OP_LOAD,
3156168c12b0SMax Filippov }, {
3157168c12b0SMax Filippov .name = "l16ui",
3158168c12b0SMax Filippov .translate = translate_ldst,
3159168c12b0SMax Filippov .par = (const uint32_t[]){MO_TEUW, false, false},
3160068e538aSMax Filippov .op_flags = XTENSA_OP_LOAD,
3161168c12b0SMax Filippov }, {
3162168c12b0SMax Filippov .name = "l32ai",
3163168c12b0SMax Filippov .translate = translate_ldst,
3164583e6a5fSMax Filippov .par = (const uint32_t[]){MO_TEUL | MO_ALIGN, true, false},
3165068e538aSMax Filippov .op_flags = XTENSA_OP_LOAD,
3166168c12b0SMax Filippov }, {
3167168c12b0SMax Filippov .name = "l32e",
3168168c12b0SMax Filippov .translate = translate_l32e,
3169068e538aSMax Filippov .op_flags = XTENSA_OP_PRIVILEGED | XTENSA_OP_LOAD,
3170168c12b0SMax Filippov }, {
3171b345e140SMax Filippov .name = "l32ex",
3172b345e140SMax Filippov .translate = translate_l32ex,
3173b345e140SMax Filippov .op_flags = XTENSA_OP_LOAD,
3174b345e140SMax Filippov }, {
3175d863fcf7SMax Filippov .name = (const char * const[]) {
3176d863fcf7SMax Filippov "l32i", "l32i.n", NULL,
3177d863fcf7SMax Filippov },
3178168c12b0SMax Filippov .translate = translate_ldst,
3179168c12b0SMax Filippov .par = (const uint32_t[]){MO_TEUL, false, false},
3180068e538aSMax Filippov .op_flags = XTENSA_OP_NAME_ARRAY | XTENSA_OP_LOAD,
3181168c12b0SMax Filippov }, {
3182168c12b0SMax Filippov .name = "l32r",
3183168c12b0SMax Filippov .translate = translate_l32r,
3184068e538aSMax Filippov .op_flags = XTENSA_OP_LOAD,
3185168c12b0SMax Filippov }, {
3186168c12b0SMax Filippov .name = "l8ui",
3187168c12b0SMax Filippov .translate = translate_ldst,
3188168c12b0SMax Filippov .par = (const uint32_t[]){MO_UB, false, false},
3189068e538aSMax Filippov .op_flags = XTENSA_OP_LOAD,
3190168c12b0SMax Filippov }, {
319159491e97SMax Filippov .name = "ldct",
319259491e97SMax Filippov .translate = translate_lct,
319359491e97SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
319459491e97SMax Filippov }, {
319559491e97SMax Filippov .name = "ldcw",
319659491e97SMax Filippov .translate = translate_nop,
319759491e97SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
319859491e97SMax Filippov }, {
3199168c12b0SMax Filippov .name = "lddec",
3200168c12b0SMax Filippov .translate = translate_mac16,
32017aa78341SMax Filippov .par = (const uint32_t[]){MAC16_NONE, 0, -4},
3202068e538aSMax Filippov .op_flags = XTENSA_OP_LOAD,
3203168c12b0SMax Filippov }, {
3204168c12b0SMax Filippov .name = "ldinc",
3205168c12b0SMax Filippov .translate = translate_mac16,
32067aa78341SMax Filippov .par = (const uint32_t[]){MAC16_NONE, 0, 4},
3207068e538aSMax Filippov .op_flags = XTENSA_OP_LOAD,
3208168c12b0SMax Filippov }, {
320913f6a7cdSMax Filippov .name = "ldpte",
321009460970SMax Filippov .op_flags = XTENSA_OP_ILL,
321113f6a7cdSMax Filippov }, {
321259491e97SMax Filippov .name = "lict",
321359491e97SMax Filippov .translate = translate_lct,
321459491e97SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
321559491e97SMax Filippov }, {
321659491e97SMax Filippov .name = "licw",
321759491e97SMax Filippov .translate = translate_nop,
321859491e97SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
321959491e97SMax Filippov }, {
3220fa6bc73cSMax Filippov .name = (const char * const[]) {
3221fa6bc73cSMax Filippov "loop", "loop.w15", NULL,
3222fa6bc73cSMax Filippov },
3223168c12b0SMax Filippov .translate = translate_loop,
3224168c12b0SMax Filippov .par = (const uint32_t[]){TCG_COND_NEVER},
3225fa6bc73cSMax Filippov .op_flags = XTENSA_OP_NAME_ARRAY,
3226168c12b0SMax Filippov }, {
3227fa6bc73cSMax Filippov .name = (const char * const[]) {
3228fa6bc73cSMax Filippov "loopgtz", "loopgtz.w15", NULL,
3229fa6bc73cSMax Filippov },
3230168c12b0SMax Filippov .translate = translate_loop,
3231168c12b0SMax Filippov .par = (const uint32_t[]){TCG_COND_GT},
3232fa6bc73cSMax Filippov .op_flags = XTENSA_OP_NAME_ARRAY,
3233168c12b0SMax Filippov }, {
3234fa6bc73cSMax Filippov .name = (const char * const[]) {
3235fa6bc73cSMax Filippov "loopnez", "loopnez.w15", NULL,
3236fa6bc73cSMax Filippov },
3237168c12b0SMax Filippov .translate = translate_loop,
3238168c12b0SMax Filippov .par = (const uint32_t[]){TCG_COND_NE},
3239fa6bc73cSMax Filippov .op_flags = XTENSA_OP_NAME_ARRAY,
3240168c12b0SMax Filippov }, {
3241168c12b0SMax Filippov .name = "max",
3242426afc3bSRichard Henderson .translate = translate_smax,
3243168c12b0SMax Filippov }, {
3244168c12b0SMax Filippov .name = "maxu",
3245426afc3bSRichard Henderson .translate = translate_umax,
3246168c12b0SMax Filippov }, {
3247168c12b0SMax Filippov .name = "memw",
32489fb40342SMax Filippov .translate = translate_memw,
3249168c12b0SMax Filippov }, {
3250168c12b0SMax Filippov .name = "min",
3251426afc3bSRichard Henderson .translate = translate_smin,
3252168c12b0SMax Filippov }, {
3253168c12b0SMax Filippov .name = "minu",
3254426afc3bSRichard Henderson .translate = translate_umin,
3255168c12b0SMax Filippov }, {
3256d863fcf7SMax Filippov .name = (const char * const[]) {
3257d863fcf7SMax Filippov "mov", "mov.n", NULL,
3258d863fcf7SMax Filippov },
3259168c12b0SMax Filippov .translate = translate_mov,
3260d863fcf7SMax Filippov .op_flags = XTENSA_OP_NAME_ARRAY,
3261168c12b0SMax Filippov }, {
3262168c12b0SMax Filippov .name = "moveqz",
3263168c12b0SMax Filippov .translate = translate_movcond,
3264168c12b0SMax Filippov .par = (const uint32_t[]){TCG_COND_EQ},
3265168c12b0SMax Filippov }, {
3266168c12b0SMax Filippov .name = "movf",
3267168c12b0SMax Filippov .translate = translate_movp,
3268168c12b0SMax Filippov .par = (const uint32_t[]){TCG_COND_EQ},
3269168c12b0SMax Filippov }, {
3270168c12b0SMax Filippov .name = "movgez",
3271168c12b0SMax Filippov .translate = translate_movcond,
3272168c12b0SMax Filippov .par = (const uint32_t[]){TCG_COND_GE},
3273168c12b0SMax Filippov }, {
3274168c12b0SMax Filippov .name = "movi",
3275168c12b0SMax Filippov .translate = translate_movi,
3276168c12b0SMax Filippov }, {
3277168c12b0SMax Filippov .name = "movi.n",
3278168c12b0SMax Filippov .translate = translate_movi,
3279168c12b0SMax Filippov }, {
3280168c12b0SMax Filippov .name = "movltz",
3281168c12b0SMax Filippov .translate = translate_movcond,
3282168c12b0SMax Filippov .par = (const uint32_t[]){TCG_COND_LT},
3283168c12b0SMax Filippov }, {
3284168c12b0SMax Filippov .name = "movnez",
3285168c12b0SMax Filippov .translate = translate_movcond,
3286168c12b0SMax Filippov .par = (const uint32_t[]){TCG_COND_NE},
3287168c12b0SMax Filippov }, {
3288168c12b0SMax Filippov .name = "movsp",
3289168c12b0SMax Filippov .translate = translate_movsp,
329090d6494dSMax Filippov .op_flags = XTENSA_OP_ALLOCA,
3291168c12b0SMax Filippov }, {
3292168c12b0SMax Filippov .name = "movt",
3293168c12b0SMax Filippov .translate = translate_movp,
3294168c12b0SMax Filippov .par = (const uint32_t[]){TCG_COND_NE},
3295168c12b0SMax Filippov }, {
3296168c12b0SMax Filippov .name = "mul.aa.hh",
3297168c12b0SMax Filippov .translate = translate_mac16,
32987aa78341SMax Filippov .par = (const uint32_t[]){MAC16_MUL, MAC16_HH, 0},
3299168c12b0SMax Filippov }, {
3300168c12b0SMax Filippov .name = "mul.aa.hl",
3301168c12b0SMax Filippov .translate = translate_mac16,
33027aa78341SMax Filippov .par = (const uint32_t[]){MAC16_MUL, MAC16_HL, 0},
3303168c12b0SMax Filippov }, {
3304168c12b0SMax Filippov .name = "mul.aa.lh",
3305168c12b0SMax Filippov .translate = translate_mac16,
33067aa78341SMax Filippov .par = (const uint32_t[]){MAC16_MUL, MAC16_LH, 0},
3307168c12b0SMax Filippov }, {
3308168c12b0SMax Filippov .name = "mul.aa.ll",
3309168c12b0SMax Filippov .translate = translate_mac16,
33107aa78341SMax Filippov .par = (const uint32_t[]){MAC16_MUL, MAC16_LL, 0},
3311168c12b0SMax Filippov }, {
3312168c12b0SMax Filippov .name = "mul.ad.hh",
3313168c12b0SMax Filippov .translate = translate_mac16,
33147aa78341SMax Filippov .par = (const uint32_t[]){MAC16_MUL, MAC16_HH, 0},
3315168c12b0SMax Filippov }, {
3316168c12b0SMax Filippov .name = "mul.ad.hl",
3317168c12b0SMax Filippov .translate = translate_mac16,
33187aa78341SMax Filippov .par = (const uint32_t[]){MAC16_MUL, MAC16_HL, 0},
3319168c12b0SMax Filippov }, {
3320168c12b0SMax Filippov .name = "mul.ad.lh",
3321168c12b0SMax Filippov .translate = translate_mac16,
33227aa78341SMax Filippov .par = (const uint32_t[]){MAC16_MUL, MAC16_LH, 0},
3323168c12b0SMax Filippov }, {
3324168c12b0SMax Filippov .name = "mul.ad.ll",
3325168c12b0SMax Filippov .translate = translate_mac16,
33267aa78341SMax Filippov .par = (const uint32_t[]){MAC16_MUL, MAC16_LL, 0},
3327168c12b0SMax Filippov }, {
3328168c12b0SMax Filippov .name = "mul.da.hh",
3329168c12b0SMax Filippov .translate = translate_mac16,
33307aa78341SMax Filippov .par = (const uint32_t[]){MAC16_MUL, MAC16_HH, 0},
3331168c12b0SMax Filippov }, {
3332168c12b0SMax Filippov .name = "mul.da.hl",
3333168c12b0SMax Filippov .translate = translate_mac16,
33347aa78341SMax Filippov .par = (const uint32_t[]){MAC16_MUL, MAC16_HL, 0},
3335168c12b0SMax Filippov }, {
3336168c12b0SMax Filippov .name = "mul.da.lh",
3337168c12b0SMax Filippov .translate = translate_mac16,
33387aa78341SMax Filippov .par = (const uint32_t[]){MAC16_MUL, MAC16_LH, 0},
3339168c12b0SMax Filippov }, {
3340168c12b0SMax Filippov .name = "mul.da.ll",
3341168c12b0SMax Filippov .translate = translate_mac16,
33427aa78341SMax Filippov .par = (const uint32_t[]){MAC16_MUL, MAC16_LL, 0},
3343168c12b0SMax Filippov }, {
3344168c12b0SMax Filippov .name = "mul.dd.hh",
3345168c12b0SMax Filippov .translate = translate_mac16,
33467aa78341SMax Filippov .par = (const uint32_t[]){MAC16_MUL, MAC16_HH, 0},
3347168c12b0SMax Filippov }, {
3348168c12b0SMax Filippov .name = "mul.dd.hl",
3349168c12b0SMax Filippov .translate = translate_mac16,
33507aa78341SMax Filippov .par = (const uint32_t[]){MAC16_MUL, MAC16_HL, 0},
3351168c12b0SMax Filippov }, {
3352168c12b0SMax Filippov .name = "mul.dd.lh",
3353168c12b0SMax Filippov .translate = translate_mac16,
33547aa78341SMax Filippov .par = (const uint32_t[]){MAC16_MUL, MAC16_LH, 0},
3355168c12b0SMax Filippov }, {
3356168c12b0SMax Filippov .name = "mul.dd.ll",
3357168c12b0SMax Filippov .translate = translate_mac16,
33587aa78341SMax Filippov .par = (const uint32_t[]){MAC16_MUL, MAC16_LL, 0},
3359168c12b0SMax Filippov }, {
3360168c12b0SMax Filippov .name = "mul16s",
3361168c12b0SMax Filippov .translate = translate_mul16,
3362168c12b0SMax Filippov .par = (const uint32_t[]){true},
3363168c12b0SMax Filippov }, {
3364168c12b0SMax Filippov .name = "mul16u",
3365168c12b0SMax Filippov .translate = translate_mul16,
3366168c12b0SMax Filippov .par = (const uint32_t[]){false},
3367168c12b0SMax Filippov }, {
3368168c12b0SMax Filippov .name = "mula.aa.hh",
3369168c12b0SMax Filippov .translate = translate_mac16,
33707aa78341SMax Filippov .par = (const uint32_t[]){MAC16_MULA, MAC16_HH, 0},
3371168c12b0SMax Filippov }, {
3372168c12b0SMax Filippov .name = "mula.aa.hl",
3373168c12b0SMax Filippov .translate = translate_mac16,
33747aa78341SMax Filippov .par = (const uint32_t[]){MAC16_MULA, MAC16_HL, 0},
3375168c12b0SMax Filippov }, {
3376168c12b0SMax Filippov .name = "mula.aa.lh",
3377168c12b0SMax Filippov .translate = translate_mac16,
33787aa78341SMax Filippov .par = (const uint32_t[]){MAC16_MULA, MAC16_LH, 0},
3379168c12b0SMax Filippov }, {
3380168c12b0SMax Filippov .name = "mula.aa.ll",
3381168c12b0SMax Filippov .translate = translate_mac16,
33827aa78341SMax Filippov .par = (const uint32_t[]){MAC16_MULA, MAC16_LL, 0},
3383168c12b0SMax Filippov }, {
3384168c12b0SMax Filippov .name = "mula.ad.hh",
3385168c12b0SMax Filippov .translate = translate_mac16,
33867aa78341SMax Filippov .par = (const uint32_t[]){MAC16_MULA, MAC16_HH, 0},
3387168c12b0SMax Filippov }, {
3388168c12b0SMax Filippov .name = "mula.ad.hl",
3389168c12b0SMax Filippov .translate = translate_mac16,
33907aa78341SMax Filippov .par = (const uint32_t[]){MAC16_MULA, MAC16_HL, 0},
3391168c12b0SMax Filippov }, {
3392168c12b0SMax Filippov .name = "mula.ad.lh",
3393168c12b0SMax Filippov .translate = translate_mac16,
33947aa78341SMax Filippov .par = (const uint32_t[]){MAC16_MULA, MAC16_LH, 0},
3395168c12b0SMax Filippov }, {
3396168c12b0SMax Filippov .name = "mula.ad.ll",
3397168c12b0SMax Filippov .translate = translate_mac16,
33987aa78341SMax Filippov .par = (const uint32_t[]){MAC16_MULA, MAC16_LL, 0},
3399168c12b0SMax Filippov }, {
3400168c12b0SMax Filippov .name = "mula.da.hh",
3401168c12b0SMax Filippov .translate = translate_mac16,
34027aa78341SMax Filippov .par = (const uint32_t[]){MAC16_MULA, MAC16_HH, 0},
3403168c12b0SMax Filippov }, {
3404168c12b0SMax Filippov .name = "mula.da.hh.lddec",
3405168c12b0SMax Filippov .translate = translate_mac16,
34067aa78341SMax Filippov .par = (const uint32_t[]){MAC16_MULA, MAC16_HH, -4},
3407168c12b0SMax Filippov }, {
3408168c12b0SMax Filippov .name = "mula.da.hh.ldinc",
3409168c12b0SMax Filippov .translate = translate_mac16,
34107aa78341SMax Filippov .par = (const uint32_t[]){MAC16_MULA, MAC16_HH, 4},
3411168c12b0SMax Filippov }, {
3412168c12b0SMax Filippov .name = "mula.da.hl",
3413168c12b0SMax Filippov .translate = translate_mac16,
34147aa78341SMax Filippov .par = (const uint32_t[]){MAC16_MULA, MAC16_HL, 0},
3415168c12b0SMax Filippov }, {
3416168c12b0SMax Filippov .name = "mula.da.hl.lddec",
3417168c12b0SMax Filippov .translate = translate_mac16,
34187aa78341SMax Filippov .par = (const uint32_t[]){MAC16_MULA, MAC16_HL, -4},
3419168c12b0SMax Filippov }, {
3420168c12b0SMax Filippov .name = "mula.da.hl.ldinc",
3421168c12b0SMax Filippov .translate = translate_mac16,
34227aa78341SMax Filippov .par = (const uint32_t[]){MAC16_MULA, MAC16_HL, 4},
3423168c12b0SMax Filippov }, {
3424168c12b0SMax Filippov .name = "mula.da.lh",
3425168c12b0SMax Filippov .translate = translate_mac16,
34267aa78341SMax Filippov .par = (const uint32_t[]){MAC16_MULA, MAC16_LH, 0},
3427168c12b0SMax Filippov }, {
3428168c12b0SMax Filippov .name = "mula.da.lh.lddec",
3429168c12b0SMax Filippov .translate = translate_mac16,
34307aa78341SMax Filippov .par = (const uint32_t[]){MAC16_MULA, MAC16_LH, -4},
3431168c12b0SMax Filippov }, {
3432168c12b0SMax Filippov .name = "mula.da.lh.ldinc",
3433168c12b0SMax Filippov .translate = translate_mac16,
34347aa78341SMax Filippov .par = (const uint32_t[]){MAC16_MULA, MAC16_LH, 4},
3435168c12b0SMax Filippov }, {
3436168c12b0SMax Filippov .name = "mula.da.ll",
3437168c12b0SMax Filippov .translate = translate_mac16,
34387aa78341SMax Filippov .par = (const uint32_t[]){MAC16_MULA, MAC16_LL, 0},
3439168c12b0SMax Filippov }, {
3440168c12b0SMax Filippov .name = "mula.da.ll.lddec",
3441168c12b0SMax Filippov .translate = translate_mac16,
34427aa78341SMax Filippov .par = (const uint32_t[]){MAC16_MULA, MAC16_LL, -4},
3443168c12b0SMax Filippov }, {
3444168c12b0SMax Filippov .name = "mula.da.ll.ldinc",
3445168c12b0SMax Filippov .translate = translate_mac16,
34467aa78341SMax Filippov .par = (const uint32_t[]){MAC16_MULA, MAC16_LL, 4},
3447168c12b0SMax Filippov }, {
3448168c12b0SMax Filippov .name = "mula.dd.hh",
3449168c12b0SMax Filippov .translate = translate_mac16,
34507aa78341SMax Filippov .par = (const uint32_t[]){MAC16_MULA, MAC16_HH, 0},
3451168c12b0SMax Filippov }, {
3452168c12b0SMax Filippov .name = "mula.dd.hh.lddec",
3453168c12b0SMax Filippov .translate = translate_mac16,
34547aa78341SMax Filippov .par = (const uint32_t[]){MAC16_MULA, MAC16_HH, -4},
3455168c12b0SMax Filippov }, {
3456168c12b0SMax Filippov .name = "mula.dd.hh.ldinc",
3457168c12b0SMax Filippov .translate = translate_mac16,
34587aa78341SMax Filippov .par = (const uint32_t[]){MAC16_MULA, MAC16_HH, 4},
3459168c12b0SMax Filippov }, {
3460168c12b0SMax Filippov .name = "mula.dd.hl",
3461168c12b0SMax Filippov .translate = translate_mac16,
34627aa78341SMax Filippov .par = (const uint32_t[]){MAC16_MULA, MAC16_HL, 0},
3463168c12b0SMax Filippov }, {
3464168c12b0SMax Filippov .name = "mula.dd.hl.lddec",
3465168c12b0SMax Filippov .translate = translate_mac16,
34667aa78341SMax Filippov .par = (const uint32_t[]){MAC16_MULA, MAC16_HL, -4},
3467168c12b0SMax Filippov }, {
3468168c12b0SMax Filippov .name = "mula.dd.hl.ldinc",
3469168c12b0SMax Filippov .translate = translate_mac16,
34707aa78341SMax Filippov .par = (const uint32_t[]){MAC16_MULA, MAC16_HL, 4},
3471168c12b0SMax Filippov }, {
3472168c12b0SMax Filippov .name = "mula.dd.lh",
3473168c12b0SMax Filippov .translate = translate_mac16,
34747aa78341SMax Filippov .par = (const uint32_t[]){MAC16_MULA, MAC16_LH, 0},
3475168c12b0SMax Filippov }, {
3476168c12b0SMax Filippov .name = "mula.dd.lh.lddec",
3477168c12b0SMax Filippov .translate = translate_mac16,
34787aa78341SMax Filippov .par = (const uint32_t[]){MAC16_MULA, MAC16_LH, -4},
3479168c12b0SMax Filippov }, {
3480168c12b0SMax Filippov .name = "mula.dd.lh.ldinc",
3481168c12b0SMax Filippov .translate = translate_mac16,
34827aa78341SMax Filippov .par = (const uint32_t[]){MAC16_MULA, MAC16_LH, 4},
3483168c12b0SMax Filippov }, {
3484168c12b0SMax Filippov .name = "mula.dd.ll",
3485168c12b0SMax Filippov .translate = translate_mac16,
34867aa78341SMax Filippov .par = (const uint32_t[]){MAC16_MULA, MAC16_LL, 0},
3487168c12b0SMax Filippov }, {
3488168c12b0SMax Filippov .name = "mula.dd.ll.lddec",
3489168c12b0SMax Filippov .translate = translate_mac16,
34907aa78341SMax Filippov .par = (const uint32_t[]){MAC16_MULA, MAC16_LL, -4},
3491168c12b0SMax Filippov }, {
3492168c12b0SMax Filippov .name = "mula.dd.ll.ldinc",
3493168c12b0SMax Filippov .translate = translate_mac16,
34947aa78341SMax Filippov .par = (const uint32_t[]){MAC16_MULA, MAC16_LL, 4},
3495168c12b0SMax Filippov }, {
3496168c12b0SMax Filippov .name = "mull",
3497168c12b0SMax Filippov .translate = translate_mull,
3498168c12b0SMax Filippov }, {
3499168c12b0SMax Filippov .name = "muls.aa.hh",
3500168c12b0SMax Filippov .translate = translate_mac16,
35017aa78341SMax Filippov .par = (const uint32_t[]){MAC16_MULS, MAC16_HH, 0},
3502168c12b0SMax Filippov }, {
3503168c12b0SMax Filippov .name = "muls.aa.hl",
3504168c12b0SMax Filippov .translate = translate_mac16,
35057aa78341SMax Filippov .par = (const uint32_t[]){MAC16_MULS, MAC16_HL, 0},
3506168c12b0SMax Filippov }, {
3507168c12b0SMax Filippov .name = "muls.aa.lh",
3508168c12b0SMax Filippov .translate = translate_mac16,
35097aa78341SMax Filippov .par = (const uint32_t[]){MAC16_MULS, MAC16_LH, 0},
3510168c12b0SMax Filippov }, {
3511168c12b0SMax Filippov .name = "muls.aa.ll",
3512168c12b0SMax Filippov .translate = translate_mac16,
35137aa78341SMax Filippov .par = (const uint32_t[]){MAC16_MULS, MAC16_LL, 0},
3514168c12b0SMax Filippov }, {
3515168c12b0SMax Filippov .name = "muls.ad.hh",
3516168c12b0SMax Filippov .translate = translate_mac16,
35177aa78341SMax Filippov .par = (const uint32_t[]){MAC16_MULS, MAC16_HH, 0},
3518168c12b0SMax Filippov }, {
3519168c12b0SMax Filippov .name = "muls.ad.hl",
3520168c12b0SMax Filippov .translate = translate_mac16,
35217aa78341SMax Filippov .par = (const uint32_t[]){MAC16_MULS, MAC16_HL, 0},
3522168c12b0SMax Filippov }, {
3523168c12b0SMax Filippov .name = "muls.ad.lh",
3524168c12b0SMax Filippov .translate = translate_mac16,
35257aa78341SMax Filippov .par = (const uint32_t[]){MAC16_MULS, MAC16_LH, 0},
3526168c12b0SMax Filippov }, {
3527168c12b0SMax Filippov .name = "muls.ad.ll",
3528168c12b0SMax Filippov .translate = translate_mac16,
35297aa78341SMax Filippov .par = (const uint32_t[]){MAC16_MULS, MAC16_LL, 0},
3530168c12b0SMax Filippov }, {
3531168c12b0SMax Filippov .name = "muls.da.hh",
3532168c12b0SMax Filippov .translate = translate_mac16,
35337aa78341SMax Filippov .par = (const uint32_t[]){MAC16_MULS, MAC16_HH, 0},
3534168c12b0SMax Filippov }, {
3535168c12b0SMax Filippov .name = "muls.da.hl",
3536168c12b0SMax Filippov .translate = translate_mac16,
35377aa78341SMax Filippov .par = (const uint32_t[]){MAC16_MULS, MAC16_HL, 0},
3538168c12b0SMax Filippov }, {
3539168c12b0SMax Filippov .name = "muls.da.lh",
3540168c12b0SMax Filippov .translate = translate_mac16,
35417aa78341SMax Filippov .par = (const uint32_t[]){MAC16_MULS, MAC16_LH, 0},
3542168c12b0SMax Filippov }, {
3543168c12b0SMax Filippov .name = "muls.da.ll",
3544168c12b0SMax Filippov .translate = translate_mac16,
35457aa78341SMax Filippov .par = (const uint32_t[]){MAC16_MULS, MAC16_LL, 0},
3546168c12b0SMax Filippov }, {
3547168c12b0SMax Filippov .name = "muls.dd.hh",
3548168c12b0SMax Filippov .translate = translate_mac16,
35497aa78341SMax Filippov .par = (const uint32_t[]){MAC16_MULS, MAC16_HH, 0},
3550168c12b0SMax Filippov }, {
3551168c12b0SMax Filippov .name = "muls.dd.hl",
3552168c12b0SMax Filippov .translate = translate_mac16,
35537aa78341SMax Filippov .par = (const uint32_t[]){MAC16_MULS, MAC16_HL, 0},
3554168c12b0SMax Filippov }, {
3555168c12b0SMax Filippov .name = "muls.dd.lh",
3556168c12b0SMax Filippov .translate = translate_mac16,
35577aa78341SMax Filippov .par = (const uint32_t[]){MAC16_MULS, MAC16_LH, 0},
3558168c12b0SMax Filippov }, {
3559168c12b0SMax Filippov .name = "muls.dd.ll",
3560168c12b0SMax Filippov .translate = translate_mac16,
35617aa78341SMax Filippov .par = (const uint32_t[]){MAC16_MULS, MAC16_LL, 0},
3562168c12b0SMax Filippov }, {
3563168c12b0SMax Filippov .name = "mulsh",
3564168c12b0SMax Filippov .translate = translate_mulh,
3565168c12b0SMax Filippov .par = (const uint32_t[]){true},
3566168c12b0SMax Filippov }, {
3567168c12b0SMax Filippov .name = "muluh",
3568168c12b0SMax Filippov .translate = translate_mulh,
3569168c12b0SMax Filippov .par = (const uint32_t[]){false},
3570168c12b0SMax Filippov }, {
3571168c12b0SMax Filippov .name = "neg",
3572168c12b0SMax Filippov .translate = translate_neg,
3573168c12b0SMax Filippov }, {
3574d863fcf7SMax Filippov .name = (const char * const[]) {
3575d863fcf7SMax Filippov "nop", "nop.n", NULL,
3576d863fcf7SMax Filippov },
3577168c12b0SMax Filippov .translate = translate_nop,
3578d863fcf7SMax Filippov .op_flags = XTENSA_OP_NAME_ARRAY,
3579168c12b0SMax Filippov }, {
3580168c12b0SMax Filippov .name = "nsa",
3581168c12b0SMax Filippov .translate = translate_nsa,
3582168c12b0SMax Filippov }, {
3583168c12b0SMax Filippov .name = "nsau",
3584168c12b0SMax Filippov .translate = translate_nsau,
3585168c12b0SMax Filippov }, {
3586168c12b0SMax Filippov .name = "or",
3587168c12b0SMax Filippov .translate = translate_or,
3588168c12b0SMax Filippov }, {
3589168c12b0SMax Filippov .name = "orb",
3590168c12b0SMax Filippov .translate = translate_boolean,
3591168c12b0SMax Filippov .par = (const uint32_t[]){BOOLEAN_OR},
3592168c12b0SMax Filippov }, {
3593168c12b0SMax Filippov .name = "orbc",
3594168c12b0SMax Filippov .translate = translate_boolean,
3595168c12b0SMax Filippov .par = (const uint32_t[]){BOOLEAN_ORC},
3596168c12b0SMax Filippov }, {
3597168c12b0SMax Filippov .name = "pdtlb",
3598168c12b0SMax Filippov .translate = translate_ptlb,
3599168c12b0SMax Filippov .par = (const uint32_t[]){true},
360021a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
3601168c12b0SMax Filippov }, {
3602c884400fSMax Filippov .name = "pfend.a",
3603c884400fSMax Filippov .translate = translate_nop,
3604c884400fSMax Filippov }, {
3605c884400fSMax Filippov .name = "pfend.o",
3606c884400fSMax Filippov .translate = translate_nop,
3607c884400fSMax Filippov }, {
3608c884400fSMax Filippov .name = "pfnxt.f",
3609c884400fSMax Filippov .translate = translate_nop,
3610c884400fSMax Filippov }, {
3611c884400fSMax Filippov .name = "pfwait.a",
3612c884400fSMax Filippov .translate = translate_nop,
3613c884400fSMax Filippov }, {
36141a03362bSMax Filippov .name = "pfwait.r",
3615c884400fSMax Filippov .translate = translate_nop,
3616c884400fSMax Filippov }, {
3617168c12b0SMax Filippov .name = "pitlb",
3618168c12b0SMax Filippov .translate = translate_ptlb,
3619168c12b0SMax Filippov .par = (const uint32_t[]){false},
362021a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
3621168c12b0SMax Filippov }, {
36224d04ea35SMax Filippov .name = "pptlb",
36234d04ea35SMax Filippov .translate = translate_pptlb,
36244d04ea35SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
36254d04ea35SMax Filippov }, {
3626168c12b0SMax Filippov .name = "quos",
3627168c12b0SMax Filippov .translate = translate_quos,
3628168c12b0SMax Filippov .par = (const uint32_t[]){true},
36294a038955SMax Filippov .op_flags = XTENSA_OP_DIVIDE_BY_ZERO,
3630168c12b0SMax Filippov }, {
3631168c12b0SMax Filippov .name = "quou",
3632168c12b0SMax Filippov .translate = translate_quou,
36334a038955SMax Filippov .op_flags = XTENSA_OP_DIVIDE_BY_ZERO,
3634168c12b0SMax Filippov }, {
3635168c12b0SMax Filippov .name = "rdtlb0",
3636168c12b0SMax Filippov .translate = translate_rtlb,
3637168c12b0SMax Filippov .par = (const uint32_t[]){true, 0},
363821a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
3639168c12b0SMax Filippov }, {
3640168c12b0SMax Filippov .name = "rdtlb1",
3641168c12b0SMax Filippov .translate = translate_rtlb,
3642168c12b0SMax Filippov .par = (const uint32_t[]){true, 1},
364321a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
3644168c12b0SMax Filippov }, {
3645e9872741SMax Filippov .name = "read_impwire",
3646e9872741SMax Filippov .translate = translate_read_impwire,
3647e9872741SMax Filippov }, {
3648168c12b0SMax Filippov .name = "rems",
3649168c12b0SMax Filippov .translate = translate_quos,
3650168c12b0SMax Filippov .par = (const uint32_t[]){false},
36514a038955SMax Filippov .op_flags = XTENSA_OP_DIVIDE_BY_ZERO,
3652168c12b0SMax Filippov }, {
3653168c12b0SMax Filippov .name = "remu",
36544a038955SMax Filippov .translate = translate_remu,
36554a038955SMax Filippov .op_flags = XTENSA_OP_DIVIDE_BY_ZERO,
3656168c12b0SMax Filippov }, {
3657168c12b0SMax Filippov .name = "rer",
3658168c12b0SMax Filippov .translate = translate_rer,
365921a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
3660168c12b0SMax Filippov }, {
3661d863fcf7SMax Filippov .name = (const char * const[]) {
3662d863fcf7SMax Filippov "ret", "ret.n", NULL,
3663d863fcf7SMax Filippov },
3664168c12b0SMax Filippov .translate = translate_ret,
3665d863fcf7SMax Filippov .op_flags = XTENSA_OP_NAME_ARRAY,
3666168c12b0SMax Filippov }, {
3667d863fcf7SMax Filippov .name = (const char * const[]) {
3668d863fcf7SMax Filippov "retw", "retw.n", NULL,
3669d863fcf7SMax Filippov },
3670168c12b0SMax Filippov .translate = translate_retw,
367191dc2b2dSMax Filippov .test_exceptions = test_exceptions_retw,
3672d863fcf7SMax Filippov .op_flags = XTENSA_OP_UNDERFLOW | XTENSA_OP_NAME_ARRAY,
3673168c12b0SMax Filippov }, {
367413f6a7cdSMax Filippov .name = "rfdd",
367509460970SMax Filippov .op_flags = XTENSA_OP_ILL,
367613f6a7cdSMax Filippov }, {
3677168c12b0SMax Filippov .name = "rfde",
3678168c12b0SMax Filippov .translate = translate_rfde,
367921a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
3680168c12b0SMax Filippov }, {
368113f6a7cdSMax Filippov .name = "rfdo",
368209460970SMax Filippov .op_flags = XTENSA_OP_ILL,
368313f6a7cdSMax Filippov }, {
3684168c12b0SMax Filippov .name = "rfe",
3685168c12b0SMax Filippov .translate = translate_rfe,
3686d74624e5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED | XTENSA_OP_CHECK_INTERRUPTS,
3687168c12b0SMax Filippov }, {
3688168c12b0SMax Filippov .name = "rfi",
3689168c12b0SMax Filippov .translate = translate_rfi,
3690d74624e5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED | XTENSA_OP_CHECK_INTERRUPTS,
3691168c12b0SMax Filippov }, {
3692168c12b0SMax Filippov .name = "rfwo",
3693168c12b0SMax Filippov .translate = translate_rfw,
3694168c12b0SMax Filippov .par = (const uint32_t[]){true},
3695d74624e5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED | XTENSA_OP_CHECK_INTERRUPTS,
3696168c12b0SMax Filippov }, {
3697168c12b0SMax Filippov .name = "rfwu",
3698168c12b0SMax Filippov .translate = translate_rfw,
3699168c12b0SMax Filippov .par = (const uint32_t[]){false},
3700d74624e5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED | XTENSA_OP_CHECK_INTERRUPTS,
3701168c12b0SMax Filippov }, {
3702168c12b0SMax Filippov .name = "ritlb0",
3703168c12b0SMax Filippov .translate = translate_rtlb,
3704168c12b0SMax Filippov .par = (const uint32_t[]){false, 0},
370521a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
3706168c12b0SMax Filippov }, {
3707168c12b0SMax Filippov .name = "ritlb1",
3708168c12b0SMax Filippov .translate = translate_rtlb,
3709168c12b0SMax Filippov .par = (const uint32_t[]){false, 1},
371021a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
3711168c12b0SMax Filippov }, {
37124d04ea35SMax Filippov .name = "rptlb0",
37134d04ea35SMax Filippov .translate = translate_rptlb0,
37144d04ea35SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
37154d04ea35SMax Filippov }, {
37164d04ea35SMax Filippov .name = "rptlb1",
37174d04ea35SMax Filippov .translate = translate_rptlb1,
37184d04ea35SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
37194d04ea35SMax Filippov }, {
3720168c12b0SMax Filippov .name = "rotw",
3721168c12b0SMax Filippov .translate = translate_rotw,
37228df3fd35SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED |
37238df3fd35SMax Filippov XTENSA_OP_EXIT_TB_M1 |
37248df3fd35SMax Filippov XTENSA_OP_SYNC_REGISTER_WINDOW,
3725168c12b0SMax Filippov }, {
3726168c12b0SMax Filippov .name = "rsil",
3727168c12b0SMax Filippov .translate = translate_rsil,
3728d74624e5SMax Filippov .op_flags =
3729d74624e5SMax Filippov XTENSA_OP_PRIVILEGED |
3730d74624e5SMax Filippov XTENSA_OP_EXIT_TB_0 |
3731d74624e5SMax Filippov XTENSA_OP_CHECK_INTERRUPTS,
3732168c12b0SMax Filippov }, {
3733168c12b0SMax Filippov .name = "rsr.176",
3734168c12b0SMax Filippov .translate = translate_rsr,
3735168c12b0SMax Filippov .par = (const uint32_t[]){176},
373621a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
3737168c12b0SMax Filippov }, {
3738168c12b0SMax Filippov .name = "rsr.208",
3739168c12b0SMax Filippov .translate = translate_rsr,
3740168c12b0SMax Filippov .par = (const uint32_t[]){208},
374121a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
3742168c12b0SMax Filippov }, {
3743168c12b0SMax Filippov .name = "rsr.acchi",
3744168c12b0SMax Filippov .translate = translate_rsr,
374591dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
374659419607SMax Filippov .par = (const uint32_t[]){
374759419607SMax Filippov ACCHI,
374859419607SMax Filippov XTENSA_OPTION_MAC16,
374959419607SMax Filippov },
3750168c12b0SMax Filippov }, {
3751168c12b0SMax Filippov .name = "rsr.acclo",
3752168c12b0SMax Filippov .translate = translate_rsr,
375391dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
375459419607SMax Filippov .par = (const uint32_t[]){
375559419607SMax Filippov ACCLO,
375659419607SMax Filippov XTENSA_OPTION_MAC16,
375759419607SMax Filippov },
3758168c12b0SMax Filippov }, {
3759168c12b0SMax Filippov .name = "rsr.atomctl",
3760168c12b0SMax Filippov .translate = translate_rsr,
376191dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
376259419607SMax Filippov .par = (const uint32_t[]){
376359419607SMax Filippov ATOMCTL,
376459419607SMax Filippov XTENSA_OPTION_ATOMCTL,
376559419607SMax Filippov },
376621a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
3767168c12b0SMax Filippov }, {
3768168c12b0SMax Filippov .name = "rsr.br",
3769168c12b0SMax Filippov .translate = translate_rsr,
377091dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
377159419607SMax Filippov .par = (const uint32_t[]){
377259419607SMax Filippov BR,
377359419607SMax Filippov XTENSA_OPTION_BOOLEAN,
377459419607SMax Filippov },
3775168c12b0SMax Filippov }, {
37764d04ea35SMax Filippov .name = "rsr.cacheadrdis",
37774d04ea35SMax Filippov .translate = translate_rsr,
377891dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
37794d04ea35SMax Filippov .par = (const uint32_t[]){
37804d04ea35SMax Filippov CACHEADRDIS,
37814d04ea35SMax Filippov XTENSA_OPTION_MPU,
37824d04ea35SMax Filippov },
37834d04ea35SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
3784168c12b0SMax Filippov }, {
3785168c12b0SMax Filippov .name = "rsr.cacheattr",
3786168c12b0SMax Filippov .translate = translate_rsr,
378791dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
378859419607SMax Filippov .par = (const uint32_t[]){
378959419607SMax Filippov CACHEATTR,
379059419607SMax Filippov XTENSA_OPTION_CACHEATTR,
379159419607SMax Filippov },
379221a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
3793168c12b0SMax Filippov }, {
3794168c12b0SMax Filippov .name = "rsr.ccompare0",
3795168c12b0SMax Filippov .translate = translate_rsr,
379691dc2b2dSMax Filippov .test_exceptions = test_exceptions_ccompare,
379759419607SMax Filippov .par = (const uint32_t[]){
379859419607SMax Filippov CCOMPARE,
379959419607SMax Filippov XTENSA_OPTION_TIMER_INTERRUPT,
380059419607SMax Filippov },
380121a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
3802168c12b0SMax Filippov }, {
3803168c12b0SMax Filippov .name = "rsr.ccompare1",
3804168c12b0SMax Filippov .translate = translate_rsr,
380591dc2b2dSMax Filippov .test_exceptions = test_exceptions_ccompare,
380659419607SMax Filippov .par = (const uint32_t[]){
380759419607SMax Filippov CCOMPARE + 1,
380859419607SMax Filippov XTENSA_OPTION_TIMER_INTERRUPT,
380959419607SMax Filippov },
381021a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
3811168c12b0SMax Filippov }, {
3812168c12b0SMax Filippov .name = "rsr.ccompare2",
3813168c12b0SMax Filippov .translate = translate_rsr,
381491dc2b2dSMax Filippov .test_exceptions = test_exceptions_ccompare,
381559419607SMax Filippov .par = (const uint32_t[]){
381659419607SMax Filippov CCOMPARE + 2,
381759419607SMax Filippov XTENSA_OPTION_TIMER_INTERRUPT,
381859419607SMax Filippov },
381921a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
3820168c12b0SMax Filippov }, {
3821168c12b0SMax Filippov .name = "rsr.ccount",
382259419607SMax Filippov .translate = translate_rsr_ccount,
382391dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
382459419607SMax Filippov .par = (const uint32_t[]){
382559419607SMax Filippov CCOUNT,
382659419607SMax Filippov XTENSA_OPTION_TIMER_INTERRUPT,
382759419607SMax Filippov },
3828bf525107SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED | XTENSA_OP_EXIT_TB_0,
3829168c12b0SMax Filippov }, {
3830168c12b0SMax Filippov .name = "rsr.configid0",
3831168c12b0SMax Filippov .translate = translate_rsr,
3832168c12b0SMax Filippov .par = (const uint32_t[]){CONFIGID0},
383321a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
3834168c12b0SMax Filippov }, {
3835168c12b0SMax Filippov .name = "rsr.configid1",
3836168c12b0SMax Filippov .translate = translate_rsr,
3837168c12b0SMax Filippov .par = (const uint32_t[]){CONFIGID1},
383821a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
3839168c12b0SMax Filippov }, {
3840168c12b0SMax Filippov .name = "rsr.cpenable",
3841168c12b0SMax Filippov .translate = translate_rsr,
384291dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
384359419607SMax Filippov .par = (const uint32_t[]){
384459419607SMax Filippov CPENABLE,
384559419607SMax Filippov XTENSA_OPTION_COPROCESSOR,
384659419607SMax Filippov },
384721a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
3848168c12b0SMax Filippov }, {
3849168c12b0SMax Filippov .name = "rsr.dbreaka0",
3850168c12b0SMax Filippov .translate = translate_rsr,
385191dc2b2dSMax Filippov .test_exceptions = test_exceptions_dbreak,
385259419607SMax Filippov .par = (const uint32_t[]){
385359419607SMax Filippov DBREAKA,
385459419607SMax Filippov XTENSA_OPTION_DEBUG,
385559419607SMax Filippov },
385621a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
3857168c12b0SMax Filippov }, {
3858168c12b0SMax Filippov .name = "rsr.dbreaka1",
3859168c12b0SMax Filippov .translate = translate_rsr,
386091dc2b2dSMax Filippov .test_exceptions = test_exceptions_dbreak,
386159419607SMax Filippov .par = (const uint32_t[]){
386259419607SMax Filippov DBREAKA + 1,
386359419607SMax Filippov XTENSA_OPTION_DEBUG,
386459419607SMax Filippov },
386521a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
3866168c12b0SMax Filippov }, {
3867168c12b0SMax Filippov .name = "rsr.dbreakc0",
3868168c12b0SMax Filippov .translate = translate_rsr,
386991dc2b2dSMax Filippov .test_exceptions = test_exceptions_dbreak,
387059419607SMax Filippov .par = (const uint32_t[]){
387159419607SMax Filippov DBREAKC,
387259419607SMax Filippov XTENSA_OPTION_DEBUG,
387359419607SMax Filippov },
387421a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
3875168c12b0SMax Filippov }, {
3876168c12b0SMax Filippov .name = "rsr.dbreakc1",
3877168c12b0SMax Filippov .translate = translate_rsr,
387891dc2b2dSMax Filippov .test_exceptions = test_exceptions_dbreak,
387959419607SMax Filippov .par = (const uint32_t[]){
388059419607SMax Filippov DBREAKC + 1,
388159419607SMax Filippov XTENSA_OPTION_DEBUG,
388259419607SMax Filippov },
388321a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
3884168c12b0SMax Filippov }, {
388513f6a7cdSMax Filippov .name = "rsr.ddr",
388613f6a7cdSMax Filippov .translate = translate_rsr,
388791dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
388859419607SMax Filippov .par = (const uint32_t[]){
388959419607SMax Filippov DDR,
389059419607SMax Filippov XTENSA_OPTION_DEBUG,
389159419607SMax Filippov },
389221a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
389313f6a7cdSMax Filippov }, {
3894168c12b0SMax Filippov .name = "rsr.debugcause",
3895168c12b0SMax Filippov .translate = translate_rsr,
389691dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
389759419607SMax Filippov .par = (const uint32_t[]){
389859419607SMax Filippov DEBUGCAUSE,
389959419607SMax Filippov XTENSA_OPTION_DEBUG,
390059419607SMax Filippov },
390121a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
3902168c12b0SMax Filippov }, {
3903168c12b0SMax Filippov .name = "rsr.depc",
3904168c12b0SMax Filippov .translate = translate_rsr,
390591dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
390659419607SMax Filippov .par = (const uint32_t[]){
390759419607SMax Filippov DEPC,
390859419607SMax Filippov XTENSA_OPTION_EXCEPTION,
390959419607SMax Filippov },
391021a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
3911168c12b0SMax Filippov }, {
3912168c12b0SMax Filippov .name = "rsr.dtlbcfg",
3913168c12b0SMax Filippov .translate = translate_rsr,
391491dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
391559419607SMax Filippov .par = (const uint32_t[]){
391659419607SMax Filippov DTLBCFG,
391759419607SMax Filippov XTENSA_OPTION_MMU,
391859419607SMax Filippov },
391921a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
3920168c12b0SMax Filippov }, {
3921168c12b0SMax Filippov .name = "rsr.epc1",
3922168c12b0SMax Filippov .translate = translate_rsr,
392391dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
392459419607SMax Filippov .par = (const uint32_t[]){
392559419607SMax Filippov EPC1,
392659419607SMax Filippov XTENSA_OPTION_EXCEPTION,
392759419607SMax Filippov },
392821a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
3929168c12b0SMax Filippov }, {
3930168c12b0SMax Filippov .name = "rsr.epc2",
3931168c12b0SMax Filippov .translate = translate_rsr,
393291dc2b2dSMax Filippov .test_exceptions = test_exceptions_hpi,
393359419607SMax Filippov .par = (const uint32_t[]){
393459419607SMax Filippov EPC1 + 1,
393559419607SMax Filippov XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
393659419607SMax Filippov },
393721a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
3938168c12b0SMax Filippov }, {
3939168c12b0SMax Filippov .name = "rsr.epc3",
3940168c12b0SMax Filippov .translate = translate_rsr,
394191dc2b2dSMax Filippov .test_exceptions = test_exceptions_hpi,
394259419607SMax Filippov .par = (const uint32_t[]){
394359419607SMax Filippov EPC1 + 2,
394459419607SMax Filippov XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
394559419607SMax Filippov },
394621a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
3947168c12b0SMax Filippov }, {
3948168c12b0SMax Filippov .name = "rsr.epc4",
3949168c12b0SMax Filippov .translate = translate_rsr,
395091dc2b2dSMax Filippov .test_exceptions = test_exceptions_hpi,
395159419607SMax Filippov .par = (const uint32_t[]){
395259419607SMax Filippov EPC1 + 3,
395359419607SMax Filippov XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
395459419607SMax Filippov },
395521a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
3956168c12b0SMax Filippov }, {
3957168c12b0SMax Filippov .name = "rsr.epc5",
3958168c12b0SMax Filippov .translate = translate_rsr,
395991dc2b2dSMax Filippov .test_exceptions = test_exceptions_hpi,
396059419607SMax Filippov .par = (const uint32_t[]){
396159419607SMax Filippov EPC1 + 4,
396259419607SMax Filippov XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
396359419607SMax Filippov },
396421a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
3965168c12b0SMax Filippov }, {
3966168c12b0SMax Filippov .name = "rsr.epc6",
3967168c12b0SMax Filippov .translate = translate_rsr,
396891dc2b2dSMax Filippov .test_exceptions = test_exceptions_hpi,
396959419607SMax Filippov .par = (const uint32_t[]){
397059419607SMax Filippov EPC1 + 5,
397159419607SMax Filippov XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
397259419607SMax Filippov },
397321a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
3974168c12b0SMax Filippov }, {
3975168c12b0SMax Filippov .name = "rsr.epc7",
3976168c12b0SMax Filippov .translate = translate_rsr,
397791dc2b2dSMax Filippov .test_exceptions = test_exceptions_hpi,
397859419607SMax Filippov .par = (const uint32_t[]){
397959419607SMax Filippov EPC1 + 6,
398059419607SMax Filippov XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
398159419607SMax Filippov },
398221a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
3983168c12b0SMax Filippov }, {
3984168c12b0SMax Filippov .name = "rsr.eps2",
3985168c12b0SMax Filippov .translate = translate_rsr,
398691dc2b2dSMax Filippov .test_exceptions = test_exceptions_hpi,
398759419607SMax Filippov .par = (const uint32_t[]){
398859419607SMax Filippov EPS2,
398959419607SMax Filippov XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
399059419607SMax Filippov },
399121a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
3992168c12b0SMax Filippov }, {
3993168c12b0SMax Filippov .name = "rsr.eps3",
3994168c12b0SMax Filippov .translate = translate_rsr,
399591dc2b2dSMax Filippov .test_exceptions = test_exceptions_hpi,
399659419607SMax Filippov .par = (const uint32_t[]){
399759419607SMax Filippov EPS2 + 1,
399859419607SMax Filippov XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
399959419607SMax Filippov },
400021a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
4001168c12b0SMax Filippov }, {
4002168c12b0SMax Filippov .name = "rsr.eps4",
4003168c12b0SMax Filippov .translate = translate_rsr,
400491dc2b2dSMax Filippov .test_exceptions = test_exceptions_hpi,
400559419607SMax Filippov .par = (const uint32_t[]){
400659419607SMax Filippov EPS2 + 2,
400759419607SMax Filippov XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
400859419607SMax Filippov },
400921a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
4010168c12b0SMax Filippov }, {
4011168c12b0SMax Filippov .name = "rsr.eps5",
4012168c12b0SMax Filippov .translate = translate_rsr,
401391dc2b2dSMax Filippov .test_exceptions = test_exceptions_hpi,
401459419607SMax Filippov .par = (const uint32_t[]){
401559419607SMax Filippov EPS2 + 3,
401659419607SMax Filippov XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
401759419607SMax Filippov },
401821a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
4019168c12b0SMax Filippov }, {
4020168c12b0SMax Filippov .name = "rsr.eps6",
4021168c12b0SMax Filippov .translate = translate_rsr,
402291dc2b2dSMax Filippov .test_exceptions = test_exceptions_hpi,
402359419607SMax Filippov .par = (const uint32_t[]){
402459419607SMax Filippov EPS2 + 4,
402559419607SMax Filippov XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
402659419607SMax Filippov },
402721a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
4028168c12b0SMax Filippov }, {
4029168c12b0SMax Filippov .name = "rsr.eps7",
4030168c12b0SMax Filippov .translate = translate_rsr,
403191dc2b2dSMax Filippov .test_exceptions = test_exceptions_hpi,
403259419607SMax Filippov .par = (const uint32_t[]){
403359419607SMax Filippov EPS2 + 5,
403459419607SMax Filippov XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
403559419607SMax Filippov },
403621a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
4037168c12b0SMax Filippov }, {
40384d04ea35SMax Filippov .name = "rsr.eraccess",
40394d04ea35SMax Filippov .translate = translate_rsr,
40404d04ea35SMax Filippov .par = (const uint32_t[]){ERACCESS},
4041168c12b0SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
4042168c12b0SMax Filippov }, {
4043168c12b0SMax Filippov .name = "rsr.exccause",
4044168c12b0SMax Filippov .translate = translate_rsr,
404591dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
404659419607SMax Filippov .par = (const uint32_t[]){
404759419607SMax Filippov EXCCAUSE,
404859419607SMax Filippov XTENSA_OPTION_EXCEPTION,
404959419607SMax Filippov },
405021a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
4051168c12b0SMax Filippov }, {
4052168c12b0SMax Filippov .name = "rsr.excsave1",
4053168c12b0SMax Filippov .translate = translate_rsr,
405491dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
405559419607SMax Filippov .par = (const uint32_t[]){
405659419607SMax Filippov EXCSAVE1,
405759419607SMax Filippov XTENSA_OPTION_EXCEPTION,
405859419607SMax Filippov },
405921a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
4060168c12b0SMax Filippov }, {
4061168c12b0SMax Filippov .name = "rsr.excsave2",
4062168c12b0SMax Filippov .translate = translate_rsr,
406391dc2b2dSMax Filippov .test_exceptions = test_exceptions_hpi,
406459419607SMax Filippov .par = (const uint32_t[]){
406559419607SMax Filippov EXCSAVE1 + 1,
406659419607SMax Filippov XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
406759419607SMax Filippov },
406821a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
4069168c12b0SMax Filippov }, {
4070168c12b0SMax Filippov .name = "rsr.excsave3",
4071168c12b0SMax Filippov .translate = translate_rsr,
407291dc2b2dSMax Filippov .test_exceptions = test_exceptions_hpi,
407359419607SMax Filippov .par = (const uint32_t[]){
407459419607SMax Filippov EXCSAVE1 + 2,
407559419607SMax Filippov XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
407659419607SMax Filippov },
407721a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
4078168c12b0SMax Filippov }, {
4079168c12b0SMax Filippov .name = "rsr.excsave4",
4080168c12b0SMax Filippov .translate = translate_rsr,
408191dc2b2dSMax Filippov .test_exceptions = test_exceptions_hpi,
408259419607SMax Filippov .par = (const uint32_t[]){
408359419607SMax Filippov EXCSAVE1 + 3,
408459419607SMax Filippov XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
408559419607SMax Filippov },
408621a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
4087168c12b0SMax Filippov }, {
4088168c12b0SMax Filippov .name = "rsr.excsave5",
4089168c12b0SMax Filippov .translate = translate_rsr,
409091dc2b2dSMax Filippov .test_exceptions = test_exceptions_hpi,
409159419607SMax Filippov .par = (const uint32_t[]){
409259419607SMax Filippov EXCSAVE1 + 4,
409359419607SMax Filippov XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
409459419607SMax Filippov },
409521a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
4096168c12b0SMax Filippov }, {
4097168c12b0SMax Filippov .name = "rsr.excsave6",
4098168c12b0SMax Filippov .translate = translate_rsr,
409991dc2b2dSMax Filippov .test_exceptions = test_exceptions_hpi,
410059419607SMax Filippov .par = (const uint32_t[]){
410159419607SMax Filippov EXCSAVE1 + 5,
410259419607SMax Filippov XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
410359419607SMax Filippov },
410421a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
4105168c12b0SMax Filippov }, {
4106168c12b0SMax Filippov .name = "rsr.excsave7",
4107168c12b0SMax Filippov .translate = translate_rsr,
410891dc2b2dSMax Filippov .test_exceptions = test_exceptions_hpi,
410959419607SMax Filippov .par = (const uint32_t[]){
411059419607SMax Filippov EXCSAVE1 + 6,
411159419607SMax Filippov XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
411259419607SMax Filippov },
411321a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
4114168c12b0SMax Filippov }, {
4115168c12b0SMax Filippov .name = "rsr.excvaddr",
4116168c12b0SMax Filippov .translate = translate_rsr,
411791dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
411859419607SMax Filippov .par = (const uint32_t[]){
411959419607SMax Filippov EXCVADDR,
412059419607SMax Filippov XTENSA_OPTION_EXCEPTION,
412159419607SMax Filippov },
412221a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
4123168c12b0SMax Filippov }, {
4124168c12b0SMax Filippov .name = "rsr.ibreaka0",
4125168c12b0SMax Filippov .translate = translate_rsr,
412691dc2b2dSMax Filippov .test_exceptions = test_exceptions_ibreak,
412759419607SMax Filippov .par = (const uint32_t[]){
412859419607SMax Filippov IBREAKA,
412959419607SMax Filippov XTENSA_OPTION_DEBUG,
413059419607SMax Filippov },
413121a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
4132168c12b0SMax Filippov }, {
4133168c12b0SMax Filippov .name = "rsr.ibreaka1",
4134168c12b0SMax Filippov .translate = translate_rsr,
413591dc2b2dSMax Filippov .test_exceptions = test_exceptions_ibreak,
413659419607SMax Filippov .par = (const uint32_t[]){
413759419607SMax Filippov IBREAKA + 1,
413859419607SMax Filippov XTENSA_OPTION_DEBUG,
413959419607SMax Filippov },
414021a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
4141168c12b0SMax Filippov }, {
4142168c12b0SMax Filippov .name = "rsr.ibreakenable",
4143168c12b0SMax Filippov .translate = translate_rsr,
414491dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
414559419607SMax Filippov .par = (const uint32_t[]){
414659419607SMax Filippov IBREAKENABLE,
414759419607SMax Filippov XTENSA_OPTION_DEBUG,
414859419607SMax Filippov },
414921a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
4150168c12b0SMax Filippov }, {
4151168c12b0SMax Filippov .name = "rsr.icount",
4152168c12b0SMax Filippov .translate = translate_rsr,
415391dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
415459419607SMax Filippov .par = (const uint32_t[]){
415559419607SMax Filippov ICOUNT,
415659419607SMax Filippov XTENSA_OPTION_DEBUG,
415759419607SMax Filippov },
415821a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
4159168c12b0SMax Filippov }, {
4160168c12b0SMax Filippov .name = "rsr.icountlevel",
4161168c12b0SMax Filippov .translate = translate_rsr,
416291dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
416359419607SMax Filippov .par = (const uint32_t[]){
416459419607SMax Filippov ICOUNTLEVEL,
416559419607SMax Filippov XTENSA_OPTION_DEBUG,
416659419607SMax Filippov },
416721a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
4168168c12b0SMax Filippov }, {
4169168c12b0SMax Filippov .name = "rsr.intclear",
4170168c12b0SMax Filippov .translate = translate_rsr,
417191dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
417259419607SMax Filippov .par = (const uint32_t[]){
417359419607SMax Filippov INTCLEAR,
417459419607SMax Filippov XTENSA_OPTION_INTERRUPT,
417559419607SMax Filippov },
417621a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
4177168c12b0SMax Filippov }, {
4178168c12b0SMax Filippov .name = "rsr.intenable",
4179168c12b0SMax Filippov .translate = translate_rsr,
418091dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
418159419607SMax Filippov .par = (const uint32_t[]){
418259419607SMax Filippov INTENABLE,
418359419607SMax Filippov XTENSA_OPTION_INTERRUPT,
418459419607SMax Filippov },
418521a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
4186168c12b0SMax Filippov }, {
4187168c12b0SMax Filippov .name = "rsr.interrupt",
418859419607SMax Filippov .translate = translate_rsr_ccount,
418991dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
419059419607SMax Filippov .par = (const uint32_t[]){
419159419607SMax Filippov INTSET,
419259419607SMax Filippov XTENSA_OPTION_INTERRUPT,
419359419607SMax Filippov },
4194bf525107SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED | XTENSA_OP_EXIT_TB_0,
4195168c12b0SMax Filippov }, {
4196168c12b0SMax Filippov .name = "rsr.intset",
419759419607SMax Filippov .translate = translate_rsr_ccount,
419891dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
419959419607SMax Filippov .par = (const uint32_t[]){
420059419607SMax Filippov INTSET,
420159419607SMax Filippov XTENSA_OPTION_INTERRUPT,
420259419607SMax Filippov },
4203bf525107SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED | XTENSA_OP_EXIT_TB_0,
4204168c12b0SMax Filippov }, {
4205168c12b0SMax Filippov .name = "rsr.itlbcfg",
4206168c12b0SMax Filippov .translate = translate_rsr,
420791dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
420859419607SMax Filippov .par = (const uint32_t[]){
420959419607SMax Filippov ITLBCFG,
421059419607SMax Filippov XTENSA_OPTION_MMU,
421159419607SMax Filippov },
421221a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
4213168c12b0SMax Filippov }, {
4214168c12b0SMax Filippov .name = "rsr.lbeg",
4215168c12b0SMax Filippov .translate = translate_rsr,
421691dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
421759419607SMax Filippov .par = (const uint32_t[]){
421859419607SMax Filippov LBEG,
421959419607SMax Filippov XTENSA_OPTION_LOOP,
422059419607SMax Filippov },
4221168c12b0SMax Filippov }, {
4222168c12b0SMax Filippov .name = "rsr.lcount",
4223168c12b0SMax Filippov .translate = translate_rsr,
422491dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
422559419607SMax Filippov .par = (const uint32_t[]){
422659419607SMax Filippov LCOUNT,
422759419607SMax Filippov XTENSA_OPTION_LOOP,
422859419607SMax Filippov },
4229168c12b0SMax Filippov }, {
4230168c12b0SMax Filippov .name = "rsr.lend",
4231168c12b0SMax Filippov .translate = translate_rsr,
423291dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
423359419607SMax Filippov .par = (const uint32_t[]){
423459419607SMax Filippov LEND,
423559419607SMax Filippov XTENSA_OPTION_LOOP,
423659419607SMax Filippov },
4237168c12b0SMax Filippov }, {
4238168c12b0SMax Filippov .name = "rsr.litbase",
4239168c12b0SMax Filippov .translate = translate_rsr,
424091dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
424159419607SMax Filippov .par = (const uint32_t[]){
424259419607SMax Filippov LITBASE,
424359419607SMax Filippov XTENSA_OPTION_EXTENDED_L32R,
424459419607SMax Filippov },
4245168c12b0SMax Filippov }, {
4246168c12b0SMax Filippov .name = "rsr.m0",
4247168c12b0SMax Filippov .translate = translate_rsr,
424891dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
424959419607SMax Filippov .par = (const uint32_t[]){
425059419607SMax Filippov MR,
425159419607SMax Filippov XTENSA_OPTION_MAC16,
425259419607SMax Filippov },
4253168c12b0SMax Filippov }, {
4254168c12b0SMax Filippov .name = "rsr.m1",
4255168c12b0SMax Filippov .translate = translate_rsr,
425691dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
425759419607SMax Filippov .par = (const uint32_t[]){
425859419607SMax Filippov MR + 1,
425959419607SMax Filippov XTENSA_OPTION_MAC16,
426059419607SMax Filippov },
4261168c12b0SMax Filippov }, {
4262168c12b0SMax Filippov .name = "rsr.m2",
4263168c12b0SMax Filippov .translate = translate_rsr,
426491dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
426559419607SMax Filippov .par = (const uint32_t[]){
426659419607SMax Filippov MR + 2,
426759419607SMax Filippov XTENSA_OPTION_MAC16,
426859419607SMax Filippov },
4269168c12b0SMax Filippov }, {
4270168c12b0SMax Filippov .name = "rsr.m3",
4271168c12b0SMax Filippov .translate = translate_rsr,
427291dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
427359419607SMax Filippov .par = (const uint32_t[]){
427459419607SMax Filippov MR + 3,
427559419607SMax Filippov XTENSA_OPTION_MAC16,
427659419607SMax Filippov },
4277168c12b0SMax Filippov }, {
4278168c12b0SMax Filippov .name = "rsr.memctl",
4279168c12b0SMax Filippov .translate = translate_rsr,
4280168c12b0SMax Filippov .par = (const uint32_t[]){MEMCTL},
428121a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
4282168c12b0SMax Filippov }, {
4283631a77a0SMax Filippov .name = "rsr.mecr",
4284631a77a0SMax Filippov .translate = translate_rsr,
428591dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
4286631a77a0SMax Filippov .par = (const uint32_t[]){
4287631a77a0SMax Filippov MECR,
4288631a77a0SMax Filippov XTENSA_OPTION_MEMORY_ECC_PARITY,
4289631a77a0SMax Filippov },
4290631a77a0SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
4291631a77a0SMax Filippov }, {
4292631a77a0SMax Filippov .name = "rsr.mepc",
4293631a77a0SMax Filippov .translate = translate_rsr,
429491dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
4295631a77a0SMax Filippov .par = (const uint32_t[]){
4296631a77a0SMax Filippov MEPC,
4297631a77a0SMax Filippov XTENSA_OPTION_MEMORY_ECC_PARITY,
4298631a77a0SMax Filippov },
4299631a77a0SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
4300631a77a0SMax Filippov }, {
4301631a77a0SMax Filippov .name = "rsr.meps",
4302631a77a0SMax Filippov .translate = translate_rsr,
430391dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
4304631a77a0SMax Filippov .par = (const uint32_t[]){
4305631a77a0SMax Filippov MEPS,
4306631a77a0SMax Filippov XTENSA_OPTION_MEMORY_ECC_PARITY,
4307631a77a0SMax Filippov },
4308631a77a0SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
4309631a77a0SMax Filippov }, {
4310631a77a0SMax Filippov .name = "rsr.mesave",
4311631a77a0SMax Filippov .translate = translate_rsr,
431291dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
4313631a77a0SMax Filippov .par = (const uint32_t[]){
4314631a77a0SMax Filippov MESAVE,
4315631a77a0SMax Filippov XTENSA_OPTION_MEMORY_ECC_PARITY,
4316631a77a0SMax Filippov },
4317631a77a0SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
4318631a77a0SMax Filippov }, {
4319631a77a0SMax Filippov .name = "rsr.mesr",
4320631a77a0SMax Filippov .translate = translate_rsr,
432191dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
4322631a77a0SMax Filippov .par = (const uint32_t[]){
4323631a77a0SMax Filippov MESR,
4324631a77a0SMax Filippov XTENSA_OPTION_MEMORY_ECC_PARITY,
4325631a77a0SMax Filippov },
4326631a77a0SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
4327631a77a0SMax Filippov }, {
4328631a77a0SMax Filippov .name = "rsr.mevaddr",
4329631a77a0SMax Filippov .translate = translate_rsr,
433091dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
4331631a77a0SMax Filippov .par = (const uint32_t[]){
4332631a77a0SMax Filippov MESR,
4333631a77a0SMax Filippov XTENSA_OPTION_MEMORY_ECC_PARITY,
4334631a77a0SMax Filippov },
4335631a77a0SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
4336631a77a0SMax Filippov }, {
4337168c12b0SMax Filippov .name = "rsr.misc0",
4338168c12b0SMax Filippov .translate = translate_rsr,
433991dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
434059419607SMax Filippov .par = (const uint32_t[]){
434159419607SMax Filippov MISC,
434259419607SMax Filippov XTENSA_OPTION_MISC_SR,
434359419607SMax Filippov },
434421a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
4345168c12b0SMax Filippov }, {
4346168c12b0SMax Filippov .name = "rsr.misc1",
4347168c12b0SMax Filippov .translate = translate_rsr,
434891dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
434959419607SMax Filippov .par = (const uint32_t[]){
435059419607SMax Filippov MISC + 1,
435159419607SMax Filippov XTENSA_OPTION_MISC_SR,
435259419607SMax Filippov },
435321a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
4354168c12b0SMax Filippov }, {
4355168c12b0SMax Filippov .name = "rsr.misc2",
4356168c12b0SMax Filippov .translate = translate_rsr,
435791dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
435859419607SMax Filippov .par = (const uint32_t[]){
435959419607SMax Filippov MISC + 2,
436059419607SMax Filippov XTENSA_OPTION_MISC_SR,
436159419607SMax Filippov },
436221a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
4363168c12b0SMax Filippov }, {
4364168c12b0SMax Filippov .name = "rsr.misc3",
4365168c12b0SMax Filippov .translate = translate_rsr,
436691dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
436759419607SMax Filippov .par = (const uint32_t[]){
436859419607SMax Filippov MISC + 3,
436959419607SMax Filippov XTENSA_OPTION_MISC_SR,
437059419607SMax Filippov },
437121a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
4372168c12b0SMax Filippov }, {
43734d04ea35SMax Filippov .name = "rsr.mpucfg",
43744d04ea35SMax Filippov .translate = translate_rsr,
437591dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
43764d04ea35SMax Filippov .par = (const uint32_t[]){
43774d04ea35SMax Filippov MPUCFG,
43784d04ea35SMax Filippov XTENSA_OPTION_MPU,
43794d04ea35SMax Filippov },
43804d04ea35SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
43814d04ea35SMax Filippov }, {
43824d04ea35SMax Filippov .name = "rsr.mpuenb",
43834d04ea35SMax Filippov .translate = translate_rsr,
438491dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
43854d04ea35SMax Filippov .par = (const uint32_t[]){
43864d04ea35SMax Filippov MPUENB,
43874d04ea35SMax Filippov XTENSA_OPTION_MPU,
43884d04ea35SMax Filippov },
4389168c12b0SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
4390168c12b0SMax Filippov }, {
4391eb3f4298SMax Filippov .name = "rsr.prefctl",
4392eb3f4298SMax Filippov .translate = translate_rsr,
4393eb3f4298SMax Filippov .par = (const uint32_t[]){PREFCTL},
4394eb3f4298SMax Filippov }, {
4395168c12b0SMax Filippov .name = "rsr.prid",
4396168c12b0SMax Filippov .translate = translate_rsr,
439791dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
439859419607SMax Filippov .par = (const uint32_t[]){
439959419607SMax Filippov PRID,
440059419607SMax Filippov XTENSA_OPTION_PROCESSOR_ID,
440159419607SMax Filippov },
440221a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
4403168c12b0SMax Filippov }, {
4404168c12b0SMax Filippov .name = "rsr.ps",
4405168c12b0SMax Filippov .translate = translate_rsr,
440691dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
440759419607SMax Filippov .par = (const uint32_t[]){
440859419607SMax Filippov PS,
440959419607SMax Filippov XTENSA_OPTION_EXCEPTION,
441059419607SMax Filippov },
441121a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
4412168c12b0SMax Filippov }, {
4413168c12b0SMax Filippov .name = "rsr.ptevaddr",
441459419607SMax Filippov .translate = translate_rsr_ptevaddr,
441591dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
441659419607SMax Filippov .par = (const uint32_t[]){
441759419607SMax Filippov PTEVADDR,
441859419607SMax Filippov XTENSA_OPTION_MMU,
441959419607SMax Filippov },
442021a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
4421168c12b0SMax Filippov }, {
4422168c12b0SMax Filippov .name = "rsr.rasid",
4423168c12b0SMax Filippov .translate = translate_rsr,
442491dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
442559419607SMax Filippov .par = (const uint32_t[]){
442659419607SMax Filippov RASID,
442759419607SMax Filippov XTENSA_OPTION_MMU,
442859419607SMax Filippov },
442921a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
4430168c12b0SMax Filippov }, {
4431168c12b0SMax Filippov .name = "rsr.sar",
4432168c12b0SMax Filippov .translate = translate_rsr,
4433168c12b0SMax Filippov .par = (const uint32_t[]){SAR},
4434168c12b0SMax Filippov }, {
4435168c12b0SMax Filippov .name = "rsr.scompare1",
4436168c12b0SMax Filippov .translate = translate_rsr,
443791dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
443859419607SMax Filippov .par = (const uint32_t[]){
443959419607SMax Filippov SCOMPARE1,
444059419607SMax Filippov XTENSA_OPTION_CONDITIONAL_STORE,
444159419607SMax Filippov },
4442168c12b0SMax Filippov }, {
4443168c12b0SMax Filippov .name = "rsr.vecbase",
4444168c12b0SMax Filippov .translate = translate_rsr,
444591dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
444659419607SMax Filippov .par = (const uint32_t[]){
444759419607SMax Filippov VECBASE,
444859419607SMax Filippov XTENSA_OPTION_RELOCATABLE_VECTOR,
444959419607SMax Filippov },
445021a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
4451168c12b0SMax Filippov }, {
4452168c12b0SMax Filippov .name = "rsr.windowbase",
4453168c12b0SMax Filippov .translate = translate_rsr,
445491dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
445559419607SMax Filippov .par = (const uint32_t[]){
445659419607SMax Filippov WINDOW_BASE,
445759419607SMax Filippov XTENSA_OPTION_WINDOWED_REGISTER,
445859419607SMax Filippov },
445921a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
4460168c12b0SMax Filippov }, {
4461168c12b0SMax Filippov .name = "rsr.windowstart",
4462168c12b0SMax Filippov .translate = translate_rsr,
446391dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
446459419607SMax Filippov .par = (const uint32_t[]){
446559419607SMax Filippov WINDOW_START,
446659419607SMax Filippov XTENSA_OPTION_WINDOWED_REGISTER,
446759419607SMax Filippov },
446821a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
4469168c12b0SMax Filippov }, {
4470168c12b0SMax Filippov .name = "rsync",
4471168c12b0SMax Filippov .translate = translate_nop,
4472168c12b0SMax Filippov }, {
4473e9872741SMax Filippov .name = "rur.expstate",
4474e9872741SMax Filippov .translate = translate_rur,
4475e9872741SMax Filippov .par = (const uint32_t[]){EXPSTATE},
4476e9872741SMax Filippov }, {
4477168c12b0SMax Filippov .name = "rur.threadptr",
4478168c12b0SMax Filippov .translate = translate_rur,
4479168c12b0SMax Filippov .par = (const uint32_t[]){THREADPTR},
4480168c12b0SMax Filippov }, {
4481168c12b0SMax Filippov .name = "s16i",
4482168c12b0SMax Filippov .translate = translate_ldst,
4483168c12b0SMax Filippov .par = (const uint32_t[]){MO_TEUW, false, true},
4484068e538aSMax Filippov .op_flags = XTENSA_OP_STORE,
4485168c12b0SMax Filippov }, {
4486168c12b0SMax Filippov .name = "s32c1i",
4487168c12b0SMax Filippov .translate = translate_s32c1i,
4488068e538aSMax Filippov .op_flags = XTENSA_OP_LOAD | XTENSA_OP_STORE,
4489168c12b0SMax Filippov }, {
4490168c12b0SMax Filippov .name = "s32e",
4491168c12b0SMax Filippov .translate = translate_s32e,
4492068e538aSMax Filippov .op_flags = XTENSA_OP_PRIVILEGED | XTENSA_OP_STORE,
4493168c12b0SMax Filippov }, {
4494b345e140SMax Filippov .name = "s32ex",
4495b345e140SMax Filippov .translate = translate_s32ex,
4496b345e140SMax Filippov .op_flags = XTENSA_OP_LOAD | XTENSA_OP_STORE,
4497b345e140SMax Filippov }, {
4498d863fcf7SMax Filippov .name = (const char * const[]) {
4499d863fcf7SMax Filippov "s32i", "s32i.n", "s32nb", NULL,
4500d863fcf7SMax Filippov },
4501168c12b0SMax Filippov .translate = translate_ldst,
4502168c12b0SMax Filippov .par = (const uint32_t[]){MO_TEUL, false, true},
4503068e538aSMax Filippov .op_flags = XTENSA_OP_NAME_ARRAY | XTENSA_OP_STORE,
4504168c12b0SMax Filippov }, {
4505168c12b0SMax Filippov .name = "s32ri",
4506168c12b0SMax Filippov .translate = translate_ldst,
4507583e6a5fSMax Filippov .par = (const uint32_t[]){MO_TEUL | MO_ALIGN, true, true},
4508068e538aSMax Filippov .op_flags = XTENSA_OP_STORE,
4509168c12b0SMax Filippov }, {
4510168c12b0SMax Filippov .name = "s8i",
4511168c12b0SMax Filippov .translate = translate_ldst,
4512168c12b0SMax Filippov .par = (const uint32_t[]){MO_UB, false, true},
4513068e538aSMax Filippov .op_flags = XTENSA_OP_STORE,
4514168c12b0SMax Filippov }, {
4515d1e9b006SMax Filippov .name = "salt",
4516d1e9b006SMax Filippov .translate = translate_salt,
4517d1e9b006SMax Filippov .par = (const uint32_t[]){TCG_COND_LT},
4518d1e9b006SMax Filippov }, {
4519d1e9b006SMax Filippov .name = "saltu",
4520d1e9b006SMax Filippov .translate = translate_salt,
4521d1e9b006SMax Filippov .par = (const uint32_t[]){TCG_COND_LTU},
4522d1e9b006SMax Filippov }, {
452359491e97SMax Filippov .name = "sdct",
452459491e97SMax Filippov .translate = translate_nop,
452559491e97SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
452659491e97SMax Filippov }, {
452759491e97SMax Filippov .name = "sdcw",
452859491e97SMax Filippov .translate = translate_nop,
452959491e97SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
453059491e97SMax Filippov }, {
4531e9872741SMax Filippov .name = "setb_expstate",
4532e9872741SMax Filippov .translate = translate_setb_expstate,
4533e9872741SMax Filippov }, {
4534168c12b0SMax Filippov .name = "sext",
4535168c12b0SMax Filippov .translate = translate_sext,
4536168c12b0SMax Filippov }, {
453759491e97SMax Filippov .name = "sict",
453859491e97SMax Filippov .translate = translate_nop,
453959491e97SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
454059491e97SMax Filippov }, {
454159491e97SMax Filippov .name = "sicw",
454259491e97SMax Filippov .translate = translate_nop,
454359491e97SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
454459491e97SMax Filippov }, {
4545168c12b0SMax Filippov .name = "simcall",
4546168c12b0SMax Filippov .translate = translate_simcall,
454791dc2b2dSMax Filippov .test_exceptions = test_exceptions_simcall,
454821a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
4549168c12b0SMax Filippov }, {
4550168c12b0SMax Filippov .name = "sll",
4551168c12b0SMax Filippov .translate = translate_sll,
4552168c12b0SMax Filippov }, {
4553168c12b0SMax Filippov .name = "slli",
4554168c12b0SMax Filippov .translate = translate_slli,
4555168c12b0SMax Filippov }, {
4556168c12b0SMax Filippov .name = "sra",
4557168c12b0SMax Filippov .translate = translate_sra,
4558168c12b0SMax Filippov }, {
4559168c12b0SMax Filippov .name = "srai",
4560168c12b0SMax Filippov .translate = translate_srai,
4561168c12b0SMax Filippov }, {
4562168c12b0SMax Filippov .name = "src",
4563168c12b0SMax Filippov .translate = translate_src,
4564168c12b0SMax Filippov }, {
4565168c12b0SMax Filippov .name = "srl",
4566168c12b0SMax Filippov .translate = translate_srl,
4567168c12b0SMax Filippov }, {
4568168c12b0SMax Filippov .name = "srli",
4569168c12b0SMax Filippov .translate = translate_srli,
4570168c12b0SMax Filippov }, {
4571168c12b0SMax Filippov .name = "ssa8b",
4572168c12b0SMax Filippov .translate = translate_ssa8b,
4573168c12b0SMax Filippov }, {
4574168c12b0SMax Filippov .name = "ssa8l",
4575168c12b0SMax Filippov .translate = translate_ssa8l,
4576168c12b0SMax Filippov }, {
4577168c12b0SMax Filippov .name = "ssai",
4578168c12b0SMax Filippov .translate = translate_ssai,
4579168c12b0SMax Filippov }, {
4580168c12b0SMax Filippov .name = "ssl",
4581168c12b0SMax Filippov .translate = translate_ssl,
4582168c12b0SMax Filippov }, {
4583168c12b0SMax Filippov .name = "ssr",
4584168c12b0SMax Filippov .translate = translate_ssr,
4585168c12b0SMax Filippov }, {
4586168c12b0SMax Filippov .name = "sub",
4587168c12b0SMax Filippov .translate = translate_sub,
4588168c12b0SMax Filippov }, {
4589168c12b0SMax Filippov .name = "subx2",
4590168c12b0SMax Filippov .translate = translate_subx,
4591168c12b0SMax Filippov .par = (const uint32_t[]){1},
4592168c12b0SMax Filippov }, {
4593168c12b0SMax Filippov .name = "subx4",
4594168c12b0SMax Filippov .translate = translate_subx,
4595168c12b0SMax Filippov .par = (const uint32_t[]){2},
4596168c12b0SMax Filippov }, {
4597168c12b0SMax Filippov .name = "subx8",
4598168c12b0SMax Filippov .translate = translate_subx,
4599168c12b0SMax Filippov .par = (const uint32_t[]){3},
4600168c12b0SMax Filippov }, {
4601168c12b0SMax Filippov .name = "syscall",
46024c6ec5f3SMax Filippov .op_flags = XTENSA_OP_SYSCALL,
4603168c12b0SMax Filippov }, {
4604168c12b0SMax Filippov .name = "umul.aa.hh",
4605168c12b0SMax Filippov .translate = translate_mac16,
46067aa78341SMax Filippov .par = (const uint32_t[]){MAC16_UMUL, MAC16_HH, 0},
4607168c12b0SMax Filippov }, {
4608168c12b0SMax Filippov .name = "umul.aa.hl",
4609168c12b0SMax Filippov .translate = translate_mac16,
46107aa78341SMax Filippov .par = (const uint32_t[]){MAC16_UMUL, MAC16_HL, 0},
4611168c12b0SMax Filippov }, {
4612168c12b0SMax Filippov .name = "umul.aa.lh",
4613168c12b0SMax Filippov .translate = translate_mac16,
46147aa78341SMax Filippov .par = (const uint32_t[]){MAC16_UMUL, MAC16_LH, 0},
4615168c12b0SMax Filippov }, {
4616168c12b0SMax Filippov .name = "umul.aa.ll",
4617168c12b0SMax Filippov .translate = translate_mac16,
46187aa78341SMax Filippov .par = (const uint32_t[]){MAC16_UMUL, MAC16_LL, 0},
4619168c12b0SMax Filippov }, {
4620168c12b0SMax Filippov .name = "waiti",
4621168c12b0SMax Filippov .translate = translate_waiti,
4622bf525107SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED | XTENSA_OP_EXIT_TB_0,
4623168c12b0SMax Filippov }, {
4624168c12b0SMax Filippov .name = "wdtlb",
4625168c12b0SMax Filippov .translate = translate_wtlb,
4626168c12b0SMax Filippov .par = (const uint32_t[]){true},
4627226444a8SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED | XTENSA_OP_EXIT_TB_M1,
4628168c12b0SMax Filippov }, {
4629168c12b0SMax Filippov .name = "wer",
4630168c12b0SMax Filippov .translate = translate_wer,
463121a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
4632168c12b0SMax Filippov }, {
4633168c12b0SMax Filippov .name = "witlb",
4634168c12b0SMax Filippov .translate = translate_wtlb,
4635168c12b0SMax Filippov .par = (const uint32_t[]){false},
4636226444a8SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED | XTENSA_OP_EXIT_TB_M1,
4637168c12b0SMax Filippov }, {
46384d04ea35SMax Filippov .name = "wptlb",
46394d04ea35SMax Filippov .translate = translate_wptlb,
46404d04ea35SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED | XTENSA_OP_EXIT_TB_M1,
46414d04ea35SMax Filippov }, {
4642e9872741SMax Filippov .name = "wrmsk_expstate",
4643e9872741SMax Filippov .translate = translate_wrmsk_expstate,
4644e9872741SMax Filippov }, {
4645168c12b0SMax Filippov .name = "wsr.176",
464659419607SMax Filippov .op_flags = XTENSA_OP_ILL,
4647168c12b0SMax Filippov }, {
4648168c12b0SMax Filippov .name = "wsr.208",
464959419607SMax Filippov .op_flags = XTENSA_OP_ILL,
4650168c12b0SMax Filippov }, {
4651168c12b0SMax Filippov .name = "wsr.acchi",
465259419607SMax Filippov .translate = translate_wsr_acchi,
465391dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
465459419607SMax Filippov .par = (const uint32_t[]){
465559419607SMax Filippov ACCHI,
465659419607SMax Filippov XTENSA_OPTION_MAC16,
465759419607SMax Filippov },
4658168c12b0SMax Filippov }, {
4659168c12b0SMax Filippov .name = "wsr.acclo",
4660168c12b0SMax Filippov .translate = translate_wsr,
466191dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
466259419607SMax Filippov .par = (const uint32_t[]){
466359419607SMax Filippov ACCLO,
466459419607SMax Filippov XTENSA_OPTION_MAC16,
466559419607SMax Filippov },
4666168c12b0SMax Filippov }, {
4667168c12b0SMax Filippov .name = "wsr.atomctl",
466859419607SMax Filippov .translate = translate_wsr_mask,
466991dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
467059419607SMax Filippov .par = (const uint32_t[]){
467159419607SMax Filippov ATOMCTL,
467259419607SMax Filippov XTENSA_OPTION_ATOMCTL,
467359419607SMax Filippov 0x3f,
467459419607SMax Filippov },
467521a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
4676168c12b0SMax Filippov }, {
4677168c12b0SMax Filippov .name = "wsr.br",
467859419607SMax Filippov .translate = translate_wsr_mask,
467991dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
468059419607SMax Filippov .par = (const uint32_t[]){
468159419607SMax Filippov BR,
468259419607SMax Filippov XTENSA_OPTION_BOOLEAN,
468359419607SMax Filippov 0xffff,
468459419607SMax Filippov },
4685168c12b0SMax Filippov }, {
46864d04ea35SMax Filippov .name = "wsr.cacheadrdis",
46874d04ea35SMax Filippov .translate = translate_wsr_mask,
468891dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
46894d04ea35SMax Filippov .par = (const uint32_t[]){
46904d04ea35SMax Filippov CACHEADRDIS,
46914d04ea35SMax Filippov XTENSA_OPTION_MPU,
46924d04ea35SMax Filippov 0xff,
46934d04ea35SMax Filippov },
46944d04ea35SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
4695168c12b0SMax Filippov }, {
4696168c12b0SMax Filippov .name = "wsr.cacheattr",
4697168c12b0SMax Filippov .translate = translate_wsr,
469891dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
469959419607SMax Filippov .par = (const uint32_t[]){
470059419607SMax Filippov CACHEATTR,
470159419607SMax Filippov XTENSA_OPTION_CACHEATTR,
470259419607SMax Filippov },
470321a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
4704168c12b0SMax Filippov }, {
4705168c12b0SMax Filippov .name = "wsr.ccompare0",
470659419607SMax Filippov .translate = translate_wsr_ccompare,
470791dc2b2dSMax Filippov .test_exceptions = test_exceptions_ccompare,
470859419607SMax Filippov .par = (const uint32_t[]){
470959419607SMax Filippov CCOMPARE,
471059419607SMax Filippov XTENSA_OPTION_TIMER_INTERRUPT,
471159419607SMax Filippov },
4712bf525107SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED | XTENSA_OP_EXIT_TB_0,
4713168c12b0SMax Filippov }, {
4714168c12b0SMax Filippov .name = "wsr.ccompare1",
471559419607SMax Filippov .translate = translate_wsr_ccompare,
471691dc2b2dSMax Filippov .test_exceptions = test_exceptions_ccompare,
471759419607SMax Filippov .par = (const uint32_t[]){
471859419607SMax Filippov CCOMPARE + 1,
471959419607SMax Filippov XTENSA_OPTION_TIMER_INTERRUPT,
472059419607SMax Filippov },
4721bf525107SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED | XTENSA_OP_EXIT_TB_0,
4722168c12b0SMax Filippov }, {
4723168c12b0SMax Filippov .name = "wsr.ccompare2",
472459419607SMax Filippov .translate = translate_wsr_ccompare,
472591dc2b2dSMax Filippov .test_exceptions = test_exceptions_ccompare,
472659419607SMax Filippov .par = (const uint32_t[]){
472759419607SMax Filippov CCOMPARE + 2,
472859419607SMax Filippov XTENSA_OPTION_TIMER_INTERRUPT,
472959419607SMax Filippov },
4730bf525107SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED | XTENSA_OP_EXIT_TB_0,
4731168c12b0SMax Filippov }, {
4732168c12b0SMax Filippov .name = "wsr.ccount",
473359419607SMax Filippov .translate = translate_wsr_ccount,
473491dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
473559419607SMax Filippov .par = (const uint32_t[]){
473659419607SMax Filippov CCOUNT,
473759419607SMax Filippov XTENSA_OPTION_TIMER_INTERRUPT,
473859419607SMax Filippov },
4739bf525107SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED | XTENSA_OP_EXIT_TB_0,
4740168c12b0SMax Filippov }, {
4741168c12b0SMax Filippov .name = "wsr.configid0",
474259419607SMax Filippov .op_flags = XTENSA_OP_ILL,
4743168c12b0SMax Filippov }, {
4744168c12b0SMax Filippov .name = "wsr.configid1",
474559419607SMax Filippov .op_flags = XTENSA_OP_ILL,
4746168c12b0SMax Filippov }, {
4747168c12b0SMax Filippov .name = "wsr.cpenable",
474859419607SMax Filippov .translate = translate_wsr_mask,
474991dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
475059419607SMax Filippov .par = (const uint32_t[]){
475159419607SMax Filippov CPENABLE,
475259419607SMax Filippov XTENSA_OPTION_COPROCESSOR,
475359419607SMax Filippov 0xff,
475459419607SMax Filippov },
4755226444a8SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED | XTENSA_OP_EXIT_TB_M1,
4756168c12b0SMax Filippov }, {
4757168c12b0SMax Filippov .name = "wsr.dbreaka0",
475859419607SMax Filippov .translate = translate_wsr_dbreaka,
475991dc2b2dSMax Filippov .test_exceptions = test_exceptions_dbreak,
476059419607SMax Filippov .par = (const uint32_t[]){
476159419607SMax Filippov DBREAKA,
476259419607SMax Filippov XTENSA_OPTION_DEBUG,
476359419607SMax Filippov },
476421a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
4765168c12b0SMax Filippov }, {
4766168c12b0SMax Filippov .name = "wsr.dbreaka1",
476759419607SMax Filippov .translate = translate_wsr_dbreaka,
476891dc2b2dSMax Filippov .test_exceptions = test_exceptions_dbreak,
476959419607SMax Filippov .par = (const uint32_t[]){
477059419607SMax Filippov DBREAKA + 1,
477159419607SMax Filippov XTENSA_OPTION_DEBUG,
477259419607SMax Filippov },
477321a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
4774168c12b0SMax Filippov }, {
4775168c12b0SMax Filippov .name = "wsr.dbreakc0",
477659419607SMax Filippov .translate = translate_wsr_dbreakc,
477791dc2b2dSMax Filippov .test_exceptions = test_exceptions_dbreak,
477859419607SMax Filippov .par = (const uint32_t[]){
477959419607SMax Filippov DBREAKC,
478059419607SMax Filippov XTENSA_OPTION_DEBUG,
478159419607SMax Filippov },
478221a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
4783168c12b0SMax Filippov }, {
4784168c12b0SMax Filippov .name = "wsr.dbreakc1",
478559419607SMax Filippov .translate = translate_wsr_dbreakc,
478691dc2b2dSMax Filippov .test_exceptions = test_exceptions_dbreak,
478759419607SMax Filippov .par = (const uint32_t[]){
478859419607SMax Filippov DBREAKC + 1,
478959419607SMax Filippov XTENSA_OPTION_DEBUG,
479059419607SMax Filippov },
479121a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
4792168c12b0SMax Filippov }, {
479313f6a7cdSMax Filippov .name = "wsr.ddr",
479413f6a7cdSMax Filippov .translate = translate_wsr,
479591dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
479659419607SMax Filippov .par = (const uint32_t[]){
479759419607SMax Filippov DDR,
479859419607SMax Filippov XTENSA_OPTION_DEBUG,
479959419607SMax Filippov },
480021a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
480113f6a7cdSMax Filippov }, {
4802168c12b0SMax Filippov .name = "wsr.debugcause",
480359419607SMax Filippov .op_flags = XTENSA_OP_ILL,
4804168c12b0SMax Filippov }, {
4805168c12b0SMax Filippov .name = "wsr.depc",
4806168c12b0SMax Filippov .translate = translate_wsr,
480791dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
480859419607SMax Filippov .par = (const uint32_t[]){
480959419607SMax Filippov DEPC,
481059419607SMax Filippov XTENSA_OPTION_EXCEPTION,
481159419607SMax Filippov },
481221a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
4813168c12b0SMax Filippov }, {
4814168c12b0SMax Filippov .name = "wsr.dtlbcfg",
481559419607SMax Filippov .translate = translate_wsr_mask,
481691dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
481759419607SMax Filippov .par = (const uint32_t[]){
481859419607SMax Filippov DTLBCFG,
481959419607SMax Filippov XTENSA_OPTION_MMU,
482059419607SMax Filippov 0x01130000,
482159419607SMax Filippov },
482221a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
4823168c12b0SMax Filippov }, {
4824168c12b0SMax Filippov .name = "wsr.epc1",
4825168c12b0SMax Filippov .translate = translate_wsr,
482691dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
482759419607SMax Filippov .par = (const uint32_t[]){
482859419607SMax Filippov EPC1,
482959419607SMax Filippov XTENSA_OPTION_EXCEPTION,
483059419607SMax Filippov },
483121a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
4832168c12b0SMax Filippov }, {
4833168c12b0SMax Filippov .name = "wsr.epc2",
4834168c12b0SMax Filippov .translate = translate_wsr,
483591dc2b2dSMax Filippov .test_exceptions = test_exceptions_hpi,
483659419607SMax Filippov .par = (const uint32_t[]){
483759419607SMax Filippov EPC1 + 1,
483859419607SMax Filippov XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
483959419607SMax Filippov },
484021a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
4841168c12b0SMax Filippov }, {
4842168c12b0SMax Filippov .name = "wsr.epc3",
4843168c12b0SMax Filippov .translate = translate_wsr,
484491dc2b2dSMax Filippov .test_exceptions = test_exceptions_hpi,
484559419607SMax Filippov .par = (const uint32_t[]){
484659419607SMax Filippov EPC1 + 2,
484759419607SMax Filippov XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
484859419607SMax Filippov },
484921a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
4850168c12b0SMax Filippov }, {
4851168c12b0SMax Filippov .name = "wsr.epc4",
4852168c12b0SMax Filippov .translate = translate_wsr,
485391dc2b2dSMax Filippov .test_exceptions = test_exceptions_hpi,
485459419607SMax Filippov .par = (const uint32_t[]){
485559419607SMax Filippov EPC1 + 3,
485659419607SMax Filippov XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
485759419607SMax Filippov },
485821a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
4859168c12b0SMax Filippov }, {
4860168c12b0SMax Filippov .name = "wsr.epc5",
4861168c12b0SMax Filippov .translate = translate_wsr,
486291dc2b2dSMax Filippov .test_exceptions = test_exceptions_hpi,
486359419607SMax Filippov .par = (const uint32_t[]){
486459419607SMax Filippov EPC1 + 4,
486559419607SMax Filippov XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
486659419607SMax Filippov },
486721a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
4868168c12b0SMax Filippov }, {
4869168c12b0SMax Filippov .name = "wsr.epc6",
4870168c12b0SMax Filippov .translate = translate_wsr,
487191dc2b2dSMax Filippov .test_exceptions = test_exceptions_hpi,
487259419607SMax Filippov .par = (const uint32_t[]){
487359419607SMax Filippov EPC1 + 5,
487459419607SMax Filippov XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
487559419607SMax Filippov },
487621a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
4877168c12b0SMax Filippov }, {
4878168c12b0SMax Filippov .name = "wsr.epc7",
4879168c12b0SMax Filippov .translate = translate_wsr,
488091dc2b2dSMax Filippov .test_exceptions = test_exceptions_hpi,
488159419607SMax Filippov .par = (const uint32_t[]){
488259419607SMax Filippov EPC1 + 6,
488359419607SMax Filippov XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
488459419607SMax Filippov },
488521a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
4886168c12b0SMax Filippov }, {
4887168c12b0SMax Filippov .name = "wsr.eps2",
4888168c12b0SMax Filippov .translate = translate_wsr,
488991dc2b2dSMax Filippov .test_exceptions = test_exceptions_hpi,
489059419607SMax Filippov .par = (const uint32_t[]){
489159419607SMax Filippov EPS2,
489259419607SMax Filippov XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
489359419607SMax Filippov },
489421a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
4895168c12b0SMax Filippov }, {
4896168c12b0SMax Filippov .name = "wsr.eps3",
4897168c12b0SMax Filippov .translate = translate_wsr,
489891dc2b2dSMax Filippov .test_exceptions = test_exceptions_hpi,
489959419607SMax Filippov .par = (const uint32_t[]){
490059419607SMax Filippov EPS2 + 1,
490159419607SMax Filippov XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
490259419607SMax Filippov },
490321a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
4904168c12b0SMax Filippov }, {
4905168c12b0SMax Filippov .name = "wsr.eps4",
4906168c12b0SMax Filippov .translate = translate_wsr,
490791dc2b2dSMax Filippov .test_exceptions = test_exceptions_hpi,
490859419607SMax Filippov .par = (const uint32_t[]){
490959419607SMax Filippov EPS2 + 2,
491059419607SMax Filippov XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
491159419607SMax Filippov },
491221a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
4913168c12b0SMax Filippov }, {
4914168c12b0SMax Filippov .name = "wsr.eps5",
4915168c12b0SMax Filippov .translate = translate_wsr,
491691dc2b2dSMax Filippov .test_exceptions = test_exceptions_hpi,
491759419607SMax Filippov .par = (const uint32_t[]){
491859419607SMax Filippov EPS2 + 3,
491959419607SMax Filippov XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
492059419607SMax Filippov },
492121a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
4922168c12b0SMax Filippov }, {
4923168c12b0SMax Filippov .name = "wsr.eps6",
4924168c12b0SMax Filippov .translate = translate_wsr,
492591dc2b2dSMax Filippov .test_exceptions = test_exceptions_hpi,
492659419607SMax Filippov .par = (const uint32_t[]){
492759419607SMax Filippov EPS2 + 4,
492859419607SMax Filippov XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
492959419607SMax Filippov },
493021a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
4931168c12b0SMax Filippov }, {
4932168c12b0SMax Filippov .name = "wsr.eps7",
4933168c12b0SMax Filippov .translate = translate_wsr,
493491dc2b2dSMax Filippov .test_exceptions = test_exceptions_hpi,
493559419607SMax Filippov .par = (const uint32_t[]){
493659419607SMax Filippov EPS2 + 5,
493759419607SMax Filippov XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
493859419607SMax Filippov },
493921a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
4940168c12b0SMax Filippov }, {
49414d04ea35SMax Filippov .name = "wsr.eraccess",
49424d04ea35SMax Filippov .translate = translate_wsr_mask,
49434d04ea35SMax Filippov .par = (const uint32_t[]){
49444d04ea35SMax Filippov ERACCESS,
49454d04ea35SMax Filippov 0,
49464d04ea35SMax Filippov 0xffff,
49474d04ea35SMax Filippov },
4948168c12b0SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
4949168c12b0SMax Filippov }, {
4950168c12b0SMax Filippov .name = "wsr.exccause",
4951168c12b0SMax Filippov .translate = translate_wsr,
495291dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
495359419607SMax Filippov .par = (const uint32_t[]){
495459419607SMax Filippov EXCCAUSE,
495559419607SMax Filippov XTENSA_OPTION_EXCEPTION,
495659419607SMax Filippov },
495721a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
4958168c12b0SMax Filippov }, {
4959168c12b0SMax Filippov .name = "wsr.excsave1",
4960168c12b0SMax Filippov .translate = translate_wsr,
496191dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
496259419607SMax Filippov .par = (const uint32_t[]){
496359419607SMax Filippov EXCSAVE1,
496459419607SMax Filippov XTENSA_OPTION_EXCEPTION,
496559419607SMax Filippov },
496621a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
4967168c12b0SMax Filippov }, {
4968168c12b0SMax Filippov .name = "wsr.excsave2",
4969168c12b0SMax Filippov .translate = translate_wsr,
497091dc2b2dSMax Filippov .test_exceptions = test_exceptions_hpi,
497159419607SMax Filippov .par = (const uint32_t[]){
497259419607SMax Filippov EXCSAVE1 + 1,
497359419607SMax Filippov XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
497459419607SMax Filippov },
497521a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
4976168c12b0SMax Filippov }, {
4977168c12b0SMax Filippov .name = "wsr.excsave3",
4978168c12b0SMax Filippov .translate = translate_wsr,
497991dc2b2dSMax Filippov .test_exceptions = test_exceptions_hpi,
498059419607SMax Filippov .par = (const uint32_t[]){
498159419607SMax Filippov EXCSAVE1 + 2,
498259419607SMax Filippov XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
498359419607SMax Filippov },
498421a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
4985168c12b0SMax Filippov }, {
4986168c12b0SMax Filippov .name = "wsr.excsave4",
4987168c12b0SMax Filippov .translate = translate_wsr,
498891dc2b2dSMax Filippov .test_exceptions = test_exceptions_hpi,
498959419607SMax Filippov .par = (const uint32_t[]){
499059419607SMax Filippov EXCSAVE1 + 3,
499159419607SMax Filippov XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
499259419607SMax Filippov },
499321a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
4994168c12b0SMax Filippov }, {
4995168c12b0SMax Filippov .name = "wsr.excsave5",
4996168c12b0SMax Filippov .translate = translate_wsr,
499791dc2b2dSMax Filippov .test_exceptions = test_exceptions_hpi,
499859419607SMax Filippov .par = (const uint32_t[]){
499959419607SMax Filippov EXCSAVE1 + 4,
500059419607SMax Filippov XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
500159419607SMax Filippov },
500221a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
5003168c12b0SMax Filippov }, {
5004168c12b0SMax Filippov .name = "wsr.excsave6",
5005168c12b0SMax Filippov .translate = translate_wsr,
500691dc2b2dSMax Filippov .test_exceptions = test_exceptions_hpi,
500759419607SMax Filippov .par = (const uint32_t[]){
500859419607SMax Filippov EXCSAVE1 + 5,
500959419607SMax Filippov XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
501059419607SMax Filippov },
501121a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
5012168c12b0SMax Filippov }, {
5013168c12b0SMax Filippov .name = "wsr.excsave7",
5014168c12b0SMax Filippov .translate = translate_wsr,
501591dc2b2dSMax Filippov .test_exceptions = test_exceptions_hpi,
501659419607SMax Filippov .par = (const uint32_t[]){
501759419607SMax Filippov EXCSAVE1 + 6,
501859419607SMax Filippov XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
501959419607SMax Filippov },
502021a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
5021168c12b0SMax Filippov }, {
5022168c12b0SMax Filippov .name = "wsr.excvaddr",
5023168c12b0SMax Filippov .translate = translate_wsr,
502491dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
502559419607SMax Filippov .par = (const uint32_t[]){
502659419607SMax Filippov EXCVADDR,
502759419607SMax Filippov XTENSA_OPTION_EXCEPTION,
502859419607SMax Filippov },
502921a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
5030168c12b0SMax Filippov }, {
5031168c12b0SMax Filippov .name = "wsr.ibreaka0",
503259419607SMax Filippov .translate = translate_wsr_ibreaka,
503391dc2b2dSMax Filippov .test_exceptions = test_exceptions_ibreak,
503459419607SMax Filippov .par = (const uint32_t[]){
503559419607SMax Filippov IBREAKA,
503659419607SMax Filippov XTENSA_OPTION_DEBUG,
503759419607SMax Filippov },
5038bf525107SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED | XTENSA_OP_EXIT_TB_0,
5039168c12b0SMax Filippov }, {
5040168c12b0SMax Filippov .name = "wsr.ibreaka1",
504159419607SMax Filippov .translate = translate_wsr_ibreaka,
504291dc2b2dSMax Filippov .test_exceptions = test_exceptions_ibreak,
504359419607SMax Filippov .par = (const uint32_t[]){
504459419607SMax Filippov IBREAKA + 1,
504559419607SMax Filippov XTENSA_OPTION_DEBUG,
504659419607SMax Filippov },
5047bf525107SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED | XTENSA_OP_EXIT_TB_0,
5048168c12b0SMax Filippov }, {
5049168c12b0SMax Filippov .name = "wsr.ibreakenable",
505059419607SMax Filippov .translate = translate_wsr_ibreakenable,
505191dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
505259419607SMax Filippov .par = (const uint32_t[]){
505359419607SMax Filippov IBREAKENABLE,
505459419607SMax Filippov XTENSA_OPTION_DEBUG,
505559419607SMax Filippov },
5056bf525107SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED | XTENSA_OP_EXIT_TB_0,
5057168c12b0SMax Filippov }, {
5058168c12b0SMax Filippov .name = "wsr.icount",
505959419607SMax Filippov .translate = translate_wsr_icount,
506091dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
506159419607SMax Filippov .par = (const uint32_t[]){
506259419607SMax Filippov ICOUNT,
506359419607SMax Filippov XTENSA_OPTION_DEBUG,
506459419607SMax Filippov },
506521a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
5066168c12b0SMax Filippov }, {
5067168c12b0SMax Filippov .name = "wsr.icountlevel",
506859419607SMax Filippov .translate = translate_wsr_mask,
506991dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
507059419607SMax Filippov .par = (const uint32_t[]){
507159419607SMax Filippov ICOUNTLEVEL,
507259419607SMax Filippov XTENSA_OPTION_DEBUG,
507359419607SMax Filippov 0xf,
507459419607SMax Filippov },
5075226444a8SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED | XTENSA_OP_EXIT_TB_M1,
5076168c12b0SMax Filippov }, {
5077168c12b0SMax Filippov .name = "wsr.intclear",
507859419607SMax Filippov .translate = translate_wsr_intclear,
507991dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
508059419607SMax Filippov .par = (const uint32_t[]){
508159419607SMax Filippov INTCLEAR,
508259419607SMax Filippov XTENSA_OPTION_INTERRUPT,
508359419607SMax Filippov },
5084d74624e5SMax Filippov .op_flags =
5085d74624e5SMax Filippov XTENSA_OP_PRIVILEGED |
5086d74624e5SMax Filippov XTENSA_OP_EXIT_TB_0 |
5087d74624e5SMax Filippov XTENSA_OP_CHECK_INTERRUPTS,
5088168c12b0SMax Filippov }, {
5089168c12b0SMax Filippov .name = "wsr.intenable",
5090168c12b0SMax Filippov .translate = translate_wsr,
509191dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
509259419607SMax Filippov .par = (const uint32_t[]){
509359419607SMax Filippov INTENABLE,
509459419607SMax Filippov XTENSA_OPTION_INTERRUPT,
509559419607SMax Filippov },
5096d74624e5SMax Filippov .op_flags =
5097d74624e5SMax Filippov XTENSA_OP_PRIVILEGED |
5098d74624e5SMax Filippov XTENSA_OP_EXIT_TB_0 |
5099d74624e5SMax Filippov XTENSA_OP_CHECK_INTERRUPTS,
5100168c12b0SMax Filippov }, {
5101168c12b0SMax Filippov .name = "wsr.interrupt",
5102168c12b0SMax Filippov .translate = translate_wsr,
510391dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
510459419607SMax Filippov .par = (const uint32_t[]){
510559419607SMax Filippov INTSET,
510659419607SMax Filippov XTENSA_OPTION_INTERRUPT,
510759419607SMax Filippov },
5108d74624e5SMax Filippov .op_flags =
5109d74624e5SMax Filippov XTENSA_OP_PRIVILEGED |
5110d74624e5SMax Filippov XTENSA_OP_EXIT_TB_0 |
5111d74624e5SMax Filippov XTENSA_OP_CHECK_INTERRUPTS,
5112168c12b0SMax Filippov }, {
5113168c12b0SMax Filippov .name = "wsr.intset",
511459419607SMax Filippov .translate = translate_wsr_intset,
511591dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
511659419607SMax Filippov .par = (const uint32_t[]){
511759419607SMax Filippov INTSET,
511859419607SMax Filippov XTENSA_OPTION_INTERRUPT,
511959419607SMax Filippov },
5120d74624e5SMax Filippov .op_flags =
5121d74624e5SMax Filippov XTENSA_OP_PRIVILEGED |
5122d74624e5SMax Filippov XTENSA_OP_EXIT_TB_0 |
5123d74624e5SMax Filippov XTENSA_OP_CHECK_INTERRUPTS,
5124168c12b0SMax Filippov }, {
5125168c12b0SMax Filippov .name = "wsr.itlbcfg",
512659419607SMax Filippov .translate = translate_wsr_mask,
512791dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
512859419607SMax Filippov .par = (const uint32_t[]){
512959419607SMax Filippov ITLBCFG,
513059419607SMax Filippov XTENSA_OPTION_MMU,
513159419607SMax Filippov 0x01130000,
513259419607SMax Filippov },
513321a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
5134168c12b0SMax Filippov }, {
5135168c12b0SMax Filippov .name = "wsr.lbeg",
5136168c12b0SMax Filippov .translate = translate_wsr,
513791dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
513859419607SMax Filippov .par = (const uint32_t[]){
513959419607SMax Filippov LBEG,
514059419607SMax Filippov XTENSA_OPTION_LOOP,
514159419607SMax Filippov },
51425d630cefSMax Filippov .op_flags = XTENSA_OP_EXIT_TB_M1,
5143168c12b0SMax Filippov }, {
5144168c12b0SMax Filippov .name = "wsr.lcount",
5145168c12b0SMax Filippov .translate = translate_wsr,
514691dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
514759419607SMax Filippov .par = (const uint32_t[]){
514859419607SMax Filippov LCOUNT,
514959419607SMax Filippov XTENSA_OPTION_LOOP,
515059419607SMax Filippov },
5151168c12b0SMax Filippov }, {
5152168c12b0SMax Filippov .name = "wsr.lend",
5153168c12b0SMax Filippov .translate = translate_wsr,
515491dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
515559419607SMax Filippov .par = (const uint32_t[]){
515659419607SMax Filippov LEND,
515759419607SMax Filippov XTENSA_OPTION_LOOP,
515859419607SMax Filippov },
51595d630cefSMax Filippov .op_flags = XTENSA_OP_EXIT_TB_M1,
5160168c12b0SMax Filippov }, {
5161168c12b0SMax Filippov .name = "wsr.litbase",
516259419607SMax Filippov .translate = translate_wsr_mask,
516391dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
516459419607SMax Filippov .par = (const uint32_t[]){
516559419607SMax Filippov LITBASE,
516659419607SMax Filippov XTENSA_OPTION_EXTENDED_L32R,
516759419607SMax Filippov 0xfffff001,
516859419607SMax Filippov },
5169226444a8SMax Filippov .op_flags = XTENSA_OP_EXIT_TB_M1,
5170168c12b0SMax Filippov }, {
5171168c12b0SMax Filippov .name = "wsr.m0",
5172168c12b0SMax Filippov .translate = translate_wsr,
517391dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
517459419607SMax Filippov .par = (const uint32_t[]){
517559419607SMax Filippov MR,
517659419607SMax Filippov XTENSA_OPTION_MAC16,
517759419607SMax Filippov },
5178168c12b0SMax Filippov }, {
5179168c12b0SMax Filippov .name = "wsr.m1",
5180168c12b0SMax Filippov .translate = translate_wsr,
518191dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
518259419607SMax Filippov .par = (const uint32_t[]){
518359419607SMax Filippov MR + 1,
518459419607SMax Filippov XTENSA_OPTION_MAC16,
518559419607SMax Filippov },
5186168c12b0SMax Filippov }, {
5187168c12b0SMax Filippov .name = "wsr.m2",
5188168c12b0SMax Filippov .translate = translate_wsr,
518991dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
519059419607SMax Filippov .par = (const uint32_t[]){
519159419607SMax Filippov MR + 2,
519259419607SMax Filippov XTENSA_OPTION_MAC16,
519359419607SMax Filippov },
5194168c12b0SMax Filippov }, {
5195168c12b0SMax Filippov .name = "wsr.m3",
5196168c12b0SMax Filippov .translate = translate_wsr,
519791dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
519859419607SMax Filippov .par = (const uint32_t[]){
519959419607SMax Filippov MR + 3,
520059419607SMax Filippov XTENSA_OPTION_MAC16,
520159419607SMax Filippov },
5202168c12b0SMax Filippov }, {
5203168c12b0SMax Filippov .name = "wsr.memctl",
520459419607SMax Filippov .translate = translate_wsr_memctl,
5205168c12b0SMax Filippov .par = (const uint32_t[]){MEMCTL},
520621a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
5207168c12b0SMax Filippov }, {
5208631a77a0SMax Filippov .name = "wsr.mecr",
5209631a77a0SMax Filippov .translate = translate_wsr,
521091dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
5211631a77a0SMax Filippov .par = (const uint32_t[]){
5212631a77a0SMax Filippov MECR,
5213631a77a0SMax Filippov XTENSA_OPTION_MEMORY_ECC_PARITY,
5214631a77a0SMax Filippov },
5215631a77a0SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
5216631a77a0SMax Filippov }, {
5217631a77a0SMax Filippov .name = "wsr.mepc",
5218631a77a0SMax Filippov .translate = translate_wsr,
521991dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
5220631a77a0SMax Filippov .par = (const uint32_t[]){
5221631a77a0SMax Filippov MEPC,
5222631a77a0SMax Filippov XTENSA_OPTION_MEMORY_ECC_PARITY,
5223631a77a0SMax Filippov },
5224631a77a0SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
5225631a77a0SMax Filippov }, {
5226631a77a0SMax Filippov .name = "wsr.meps",
5227631a77a0SMax Filippov .translate = translate_wsr,
522891dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
5229631a77a0SMax Filippov .par = (const uint32_t[]){
5230631a77a0SMax Filippov MEPS,
5231631a77a0SMax Filippov XTENSA_OPTION_MEMORY_ECC_PARITY,
5232631a77a0SMax Filippov },
5233631a77a0SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
5234631a77a0SMax Filippov }, {
5235631a77a0SMax Filippov .name = "wsr.mesave",
5236631a77a0SMax Filippov .translate = translate_wsr,
523791dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
5238631a77a0SMax Filippov .par = (const uint32_t[]){
5239631a77a0SMax Filippov MESAVE,
5240631a77a0SMax Filippov XTENSA_OPTION_MEMORY_ECC_PARITY,
5241631a77a0SMax Filippov },
5242631a77a0SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
5243631a77a0SMax Filippov }, {
5244631a77a0SMax Filippov .name = "wsr.mesr",
5245631a77a0SMax Filippov .translate = translate_wsr,
524691dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
5247631a77a0SMax Filippov .par = (const uint32_t[]){
5248631a77a0SMax Filippov MESR,
5249631a77a0SMax Filippov XTENSA_OPTION_MEMORY_ECC_PARITY,
5250631a77a0SMax Filippov },
5251631a77a0SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
5252631a77a0SMax Filippov }, {
5253631a77a0SMax Filippov .name = "wsr.mevaddr",
5254631a77a0SMax Filippov .translate = translate_wsr,
525591dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
5256631a77a0SMax Filippov .par = (const uint32_t[]){
5257631a77a0SMax Filippov MESR,
5258631a77a0SMax Filippov XTENSA_OPTION_MEMORY_ECC_PARITY,
5259631a77a0SMax Filippov },
5260631a77a0SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
5261631a77a0SMax Filippov }, {
5262168c12b0SMax Filippov .name = "wsr.misc0",
5263168c12b0SMax Filippov .translate = translate_wsr,
526491dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
526559419607SMax Filippov .par = (const uint32_t[]){
526659419607SMax Filippov MISC,
526759419607SMax Filippov XTENSA_OPTION_MISC_SR,
526859419607SMax Filippov },
526921a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
5270168c12b0SMax Filippov }, {
5271168c12b0SMax Filippov .name = "wsr.misc1",
5272168c12b0SMax Filippov .translate = translate_wsr,
527391dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
527459419607SMax Filippov .par = (const uint32_t[]){
527559419607SMax Filippov MISC + 1,
527659419607SMax Filippov XTENSA_OPTION_MISC_SR,
527759419607SMax Filippov },
527821a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
5279168c12b0SMax Filippov }, {
5280168c12b0SMax Filippov .name = "wsr.misc2",
5281168c12b0SMax Filippov .translate = translate_wsr,
528291dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
528359419607SMax Filippov .par = (const uint32_t[]){
528459419607SMax Filippov MISC + 2,
528559419607SMax Filippov XTENSA_OPTION_MISC_SR,
528659419607SMax Filippov },
528721a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
5288168c12b0SMax Filippov }, {
5289168c12b0SMax Filippov .name = "wsr.misc3",
5290168c12b0SMax Filippov .translate = translate_wsr,
529191dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
529259419607SMax Filippov .par = (const uint32_t[]){
529359419607SMax Filippov MISC + 3,
529459419607SMax Filippov XTENSA_OPTION_MISC_SR,
529559419607SMax Filippov },
529621a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
5297168c12b0SMax Filippov }, {
529813f6a7cdSMax Filippov .name = "wsr.mmid",
529913f6a7cdSMax Filippov .translate = translate_wsr,
530091dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
530159419607SMax Filippov .par = (const uint32_t[]){
530259419607SMax Filippov MMID,
530359419607SMax Filippov XTENSA_OPTION_TRACE_PORT,
530459419607SMax Filippov },
530521a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
530613f6a7cdSMax Filippov }, {
53074d04ea35SMax Filippov .name = "wsr.mpuenb",
53084d04ea35SMax Filippov .translate = translate_wsr_mpuenb,
530991dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
53104d04ea35SMax Filippov .par = (const uint32_t[]){
53114d04ea35SMax Filippov MPUENB,
53124d04ea35SMax Filippov XTENSA_OPTION_MPU,
53134d04ea35SMax Filippov },
53144d04ea35SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED | XTENSA_OP_EXIT_TB_M1,
53154d04ea35SMax Filippov }, {
5316eb3f4298SMax Filippov .name = "wsr.prefctl",
5317eb3f4298SMax Filippov .translate = translate_wsr,
5318eb3f4298SMax Filippov .par = (const uint32_t[]){PREFCTL},
5319eb3f4298SMax Filippov }, {
5320168c12b0SMax Filippov .name = "wsr.prid",
532159419607SMax Filippov .op_flags = XTENSA_OP_ILL,
5322168c12b0SMax Filippov }, {
5323168c12b0SMax Filippov .name = "wsr.ps",
532459419607SMax Filippov .translate = translate_wsr_ps,
532591dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
532659419607SMax Filippov .par = (const uint32_t[]){
532759419607SMax Filippov PS,
532859419607SMax Filippov XTENSA_OPTION_EXCEPTION,
532959419607SMax Filippov },
5330d74624e5SMax Filippov .op_flags =
5331d74624e5SMax Filippov XTENSA_OP_PRIVILEGED |
5332d74624e5SMax Filippov XTENSA_OP_EXIT_TB_M1 |
5333d74624e5SMax Filippov XTENSA_OP_CHECK_INTERRUPTS,
5334168c12b0SMax Filippov }, {
5335168c12b0SMax Filippov .name = "wsr.ptevaddr",
533659419607SMax Filippov .translate = translate_wsr_mask,
533791dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
533859419607SMax Filippov .par = (const uint32_t[]){
533959419607SMax Filippov PTEVADDR,
534059419607SMax Filippov XTENSA_OPTION_MMU,
534159419607SMax Filippov 0xffc00000,
534259419607SMax Filippov },
534321a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
5344168c12b0SMax Filippov }, {
5345168c12b0SMax Filippov .name = "wsr.rasid",
534659419607SMax Filippov .translate = translate_wsr_rasid,
534791dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
534859419607SMax Filippov .par = (const uint32_t[]){
534959419607SMax Filippov RASID,
535059419607SMax Filippov XTENSA_OPTION_MMU,
535159419607SMax Filippov },
5352226444a8SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED | XTENSA_OP_EXIT_TB_M1,
5353168c12b0SMax Filippov }, {
5354168c12b0SMax Filippov .name = "wsr.sar",
535559419607SMax Filippov .translate = translate_wsr_sar,
5356168c12b0SMax Filippov .par = (const uint32_t[]){SAR},
5357168c12b0SMax Filippov }, {
5358168c12b0SMax Filippov .name = "wsr.scompare1",
5359168c12b0SMax Filippov .translate = translate_wsr,
536091dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
536159419607SMax Filippov .par = (const uint32_t[]){
536259419607SMax Filippov SCOMPARE1,
536359419607SMax Filippov XTENSA_OPTION_CONDITIONAL_STORE,
536459419607SMax Filippov },
5365168c12b0SMax Filippov }, {
5366168c12b0SMax Filippov .name = "wsr.vecbase",
5367168c12b0SMax Filippov .translate = translate_wsr,
536891dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
536959419607SMax Filippov .par = (const uint32_t[]){
537059419607SMax Filippov VECBASE,
537159419607SMax Filippov XTENSA_OPTION_RELOCATABLE_VECTOR,
537259419607SMax Filippov },
537321a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
5374168c12b0SMax Filippov }, {
5375168c12b0SMax Filippov .name = "wsr.windowbase",
537659419607SMax Filippov .translate = translate_wsr_windowbase,
537791dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
537859419607SMax Filippov .par = (const uint32_t[]){
537959419607SMax Filippov WINDOW_BASE,
538059419607SMax Filippov XTENSA_OPTION_WINDOWED_REGISTER,
538159419607SMax Filippov },
53828df3fd35SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED |
53838df3fd35SMax Filippov XTENSA_OP_EXIT_TB_M1 |
53848df3fd35SMax Filippov XTENSA_OP_SYNC_REGISTER_WINDOW,
5385168c12b0SMax Filippov }, {
5386168c12b0SMax Filippov .name = "wsr.windowstart",
538759419607SMax Filippov .translate = translate_wsr_windowstart,
538891dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
538959419607SMax Filippov .par = (const uint32_t[]){
539059419607SMax Filippov WINDOW_START,
539159419607SMax Filippov XTENSA_OPTION_WINDOWED_REGISTER,
539259419607SMax Filippov },
5393226444a8SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED | XTENSA_OP_EXIT_TB_M1,
5394168c12b0SMax Filippov }, {
5395e9872741SMax Filippov .name = "wur.expstate",
5396e9872741SMax Filippov .translate = translate_wur,
5397e9872741SMax Filippov .par = (const uint32_t[]){EXPSTATE},
5398e9872741SMax Filippov }, {
5399168c12b0SMax Filippov .name = "wur.threadptr",
5400168c12b0SMax Filippov .translate = translate_wur,
5401168c12b0SMax Filippov .par = (const uint32_t[]){THREADPTR},
5402168c12b0SMax Filippov }, {
5403168c12b0SMax Filippov .name = "xor",
5404168c12b0SMax Filippov .translate = translate_xor,
5405168c12b0SMax Filippov }, {
5406168c12b0SMax Filippov .name = "xorb",
5407168c12b0SMax Filippov .translate = translate_boolean,
5408168c12b0SMax Filippov .par = (const uint32_t[]){BOOLEAN_XOR},
5409168c12b0SMax Filippov }, {
5410168c12b0SMax Filippov .name = "xsr.176",
541159419607SMax Filippov .op_flags = XTENSA_OP_ILL,
5412168c12b0SMax Filippov }, {
5413168c12b0SMax Filippov .name = "xsr.208",
541459419607SMax Filippov .op_flags = XTENSA_OP_ILL,
5415168c12b0SMax Filippov }, {
5416168c12b0SMax Filippov .name = "xsr.acchi",
541759419607SMax Filippov .translate = translate_xsr_acchi,
541891dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
541959419607SMax Filippov .par = (const uint32_t[]){
542059419607SMax Filippov ACCHI,
542159419607SMax Filippov XTENSA_OPTION_MAC16,
542259419607SMax Filippov },
5423168c12b0SMax Filippov }, {
5424168c12b0SMax Filippov .name = "xsr.acclo",
5425168c12b0SMax Filippov .translate = translate_xsr,
542691dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
542759419607SMax Filippov .par = (const uint32_t[]){
542859419607SMax Filippov ACCLO,
542959419607SMax Filippov XTENSA_OPTION_MAC16,
543059419607SMax Filippov },
5431168c12b0SMax Filippov }, {
5432168c12b0SMax Filippov .name = "xsr.atomctl",
543359419607SMax Filippov .translate = translate_xsr_mask,
543491dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
543559419607SMax Filippov .par = (const uint32_t[]){
543659419607SMax Filippov ATOMCTL,
543759419607SMax Filippov XTENSA_OPTION_ATOMCTL,
543859419607SMax Filippov 0x3f,
543959419607SMax Filippov },
544021a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
5441168c12b0SMax Filippov }, {
5442168c12b0SMax Filippov .name = "xsr.br",
544359419607SMax Filippov .translate = translate_xsr_mask,
544491dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
544559419607SMax Filippov .par = (const uint32_t[]){
544659419607SMax Filippov BR,
544759419607SMax Filippov XTENSA_OPTION_BOOLEAN,
544859419607SMax Filippov 0xffff,
544959419607SMax Filippov },
5450168c12b0SMax Filippov }, {
54514d04ea35SMax Filippov .name = "xsr.cacheadrdis",
54524d04ea35SMax Filippov .translate = translate_xsr_mask,
545391dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
54544d04ea35SMax Filippov .par = (const uint32_t[]){
54554d04ea35SMax Filippov CACHEADRDIS,
54564d04ea35SMax Filippov XTENSA_OPTION_MPU,
54574d04ea35SMax Filippov 0xff,
54584d04ea35SMax Filippov },
54594d04ea35SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
5460168c12b0SMax Filippov }, {
5461168c12b0SMax Filippov .name = "xsr.cacheattr",
5462168c12b0SMax Filippov .translate = translate_xsr,
546391dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
546459419607SMax Filippov .par = (const uint32_t[]){
546559419607SMax Filippov CACHEATTR,
546659419607SMax Filippov XTENSA_OPTION_CACHEATTR,
546759419607SMax Filippov },
546821a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
5469168c12b0SMax Filippov }, {
5470168c12b0SMax Filippov .name = "xsr.ccompare0",
547159419607SMax Filippov .translate = translate_xsr_ccompare,
547291dc2b2dSMax Filippov .test_exceptions = test_exceptions_ccompare,
547359419607SMax Filippov .par = (const uint32_t[]){
547459419607SMax Filippov CCOMPARE,
547559419607SMax Filippov XTENSA_OPTION_TIMER_INTERRUPT,
547659419607SMax Filippov },
5477bf525107SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED | XTENSA_OP_EXIT_TB_0,
5478168c12b0SMax Filippov }, {
5479168c12b0SMax Filippov .name = "xsr.ccompare1",
548059419607SMax Filippov .translate = translate_xsr_ccompare,
548191dc2b2dSMax Filippov .test_exceptions = test_exceptions_ccompare,
548259419607SMax Filippov .par = (const uint32_t[]){
548359419607SMax Filippov CCOMPARE + 1,
548459419607SMax Filippov XTENSA_OPTION_TIMER_INTERRUPT,
548559419607SMax Filippov },
5486bf525107SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED | XTENSA_OP_EXIT_TB_0,
5487168c12b0SMax Filippov }, {
5488168c12b0SMax Filippov .name = "xsr.ccompare2",
548959419607SMax Filippov .translate = translate_xsr_ccompare,
549091dc2b2dSMax Filippov .test_exceptions = test_exceptions_ccompare,
549159419607SMax Filippov .par = (const uint32_t[]){
549259419607SMax Filippov CCOMPARE + 2,
549359419607SMax Filippov XTENSA_OPTION_TIMER_INTERRUPT,
549459419607SMax Filippov },
5495bf525107SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED | XTENSA_OP_EXIT_TB_0,
5496168c12b0SMax Filippov }, {
5497168c12b0SMax Filippov .name = "xsr.ccount",
549859419607SMax Filippov .translate = translate_xsr_ccount,
549991dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
550059419607SMax Filippov .par = (const uint32_t[]){
550159419607SMax Filippov CCOUNT,
550259419607SMax Filippov XTENSA_OPTION_TIMER_INTERRUPT,
550359419607SMax Filippov },
5504bf525107SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED | XTENSA_OP_EXIT_TB_0,
5505168c12b0SMax Filippov }, {
5506168c12b0SMax Filippov .name = "xsr.configid0",
550759419607SMax Filippov .op_flags = XTENSA_OP_ILL,
5508168c12b0SMax Filippov }, {
5509168c12b0SMax Filippov .name = "xsr.configid1",
551059419607SMax Filippov .op_flags = XTENSA_OP_ILL,
5511168c12b0SMax Filippov }, {
5512168c12b0SMax Filippov .name = "xsr.cpenable",
551359419607SMax Filippov .translate = translate_xsr_mask,
551491dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
551559419607SMax Filippov .par = (const uint32_t[]){
551659419607SMax Filippov CPENABLE,
551759419607SMax Filippov XTENSA_OPTION_COPROCESSOR,
551859419607SMax Filippov 0xff,
551959419607SMax Filippov },
5520226444a8SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED | XTENSA_OP_EXIT_TB_M1,
5521168c12b0SMax Filippov }, {
5522168c12b0SMax Filippov .name = "xsr.dbreaka0",
552359419607SMax Filippov .translate = translate_xsr_dbreaka,
552491dc2b2dSMax Filippov .test_exceptions = test_exceptions_dbreak,
552559419607SMax Filippov .par = (const uint32_t[]){
552659419607SMax Filippov DBREAKA,
552759419607SMax Filippov XTENSA_OPTION_DEBUG,
552859419607SMax Filippov },
552921a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
5530168c12b0SMax Filippov }, {
5531168c12b0SMax Filippov .name = "xsr.dbreaka1",
553259419607SMax Filippov .translate = translate_xsr_dbreaka,
553391dc2b2dSMax Filippov .test_exceptions = test_exceptions_dbreak,
553459419607SMax Filippov .par = (const uint32_t[]){
553559419607SMax Filippov DBREAKA + 1,
553659419607SMax Filippov XTENSA_OPTION_DEBUG,
553759419607SMax Filippov },
553821a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
5539168c12b0SMax Filippov }, {
5540168c12b0SMax Filippov .name = "xsr.dbreakc0",
554159419607SMax Filippov .translate = translate_xsr_dbreakc,
554291dc2b2dSMax Filippov .test_exceptions = test_exceptions_dbreak,
554359419607SMax Filippov .par = (const uint32_t[]){
554459419607SMax Filippov DBREAKC,
554559419607SMax Filippov XTENSA_OPTION_DEBUG,
554659419607SMax Filippov },
554721a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
5548168c12b0SMax Filippov }, {
5549168c12b0SMax Filippov .name = "xsr.dbreakc1",
555059419607SMax Filippov .translate = translate_xsr_dbreakc,
555191dc2b2dSMax Filippov .test_exceptions = test_exceptions_dbreak,
555259419607SMax Filippov .par = (const uint32_t[]){
555359419607SMax Filippov DBREAKC + 1,
555459419607SMax Filippov XTENSA_OPTION_DEBUG,
555559419607SMax Filippov },
555621a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
5557168c12b0SMax Filippov }, {
555813f6a7cdSMax Filippov .name = "xsr.ddr",
555913f6a7cdSMax Filippov .translate = translate_xsr,
556091dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
556159419607SMax Filippov .par = (const uint32_t[]){
556259419607SMax Filippov DDR,
556359419607SMax Filippov XTENSA_OPTION_DEBUG,
556459419607SMax Filippov },
556521a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
556613f6a7cdSMax Filippov }, {
5567168c12b0SMax Filippov .name = "xsr.debugcause",
556859419607SMax Filippov .op_flags = XTENSA_OP_ILL,
5569168c12b0SMax Filippov }, {
5570168c12b0SMax Filippov .name = "xsr.depc",
5571168c12b0SMax Filippov .translate = translate_xsr,
557291dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
557359419607SMax Filippov .par = (const uint32_t[]){
557459419607SMax Filippov DEPC,
557559419607SMax Filippov XTENSA_OPTION_EXCEPTION,
557659419607SMax Filippov },
557721a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
5578168c12b0SMax Filippov }, {
5579168c12b0SMax Filippov .name = "xsr.dtlbcfg",
558059419607SMax Filippov .translate = translate_xsr_mask,
558191dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
558259419607SMax Filippov .par = (const uint32_t[]){
558359419607SMax Filippov DTLBCFG,
558459419607SMax Filippov XTENSA_OPTION_MMU,
558559419607SMax Filippov 0x01130000,
558659419607SMax Filippov },
558721a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
5588168c12b0SMax Filippov }, {
5589168c12b0SMax Filippov .name = "xsr.epc1",
5590168c12b0SMax Filippov .translate = translate_xsr,
559191dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
559259419607SMax Filippov .par = (const uint32_t[]){
559359419607SMax Filippov EPC1,
559459419607SMax Filippov XTENSA_OPTION_EXCEPTION,
559559419607SMax Filippov },
559621a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
5597168c12b0SMax Filippov }, {
5598168c12b0SMax Filippov .name = "xsr.epc2",
5599168c12b0SMax Filippov .translate = translate_xsr,
560091dc2b2dSMax Filippov .test_exceptions = test_exceptions_hpi,
560159419607SMax Filippov .par = (const uint32_t[]){
560259419607SMax Filippov EPC1 + 1,
560359419607SMax Filippov XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
560459419607SMax Filippov },
560521a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
5606168c12b0SMax Filippov }, {
5607168c12b0SMax Filippov .name = "xsr.epc3",
5608168c12b0SMax Filippov .translate = translate_xsr,
560991dc2b2dSMax Filippov .test_exceptions = test_exceptions_hpi,
561059419607SMax Filippov .par = (const uint32_t[]){
561159419607SMax Filippov EPC1 + 2,
561259419607SMax Filippov XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
561359419607SMax Filippov },
561421a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
5615168c12b0SMax Filippov }, {
5616168c12b0SMax Filippov .name = "xsr.epc4",
5617168c12b0SMax Filippov .translate = translate_xsr,
561891dc2b2dSMax Filippov .test_exceptions = test_exceptions_hpi,
561959419607SMax Filippov .par = (const uint32_t[]){
562059419607SMax Filippov EPC1 + 3,
562159419607SMax Filippov XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
562259419607SMax Filippov },
562321a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
5624168c12b0SMax Filippov }, {
5625168c12b0SMax Filippov .name = "xsr.epc5",
5626168c12b0SMax Filippov .translate = translate_xsr,
562791dc2b2dSMax Filippov .test_exceptions = test_exceptions_hpi,
562859419607SMax Filippov .par = (const uint32_t[]){
562959419607SMax Filippov EPC1 + 4,
563059419607SMax Filippov XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
563159419607SMax Filippov },
563221a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
5633168c12b0SMax Filippov }, {
5634168c12b0SMax Filippov .name = "xsr.epc6",
5635168c12b0SMax Filippov .translate = translate_xsr,
563691dc2b2dSMax Filippov .test_exceptions = test_exceptions_hpi,
563759419607SMax Filippov .par = (const uint32_t[]){
563859419607SMax Filippov EPC1 + 5,
563959419607SMax Filippov XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
564059419607SMax Filippov },
564121a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
5642168c12b0SMax Filippov }, {
5643168c12b0SMax Filippov .name = "xsr.epc7",
5644168c12b0SMax Filippov .translate = translate_xsr,
564591dc2b2dSMax Filippov .test_exceptions = test_exceptions_hpi,
564659419607SMax Filippov .par = (const uint32_t[]){
564759419607SMax Filippov EPC1 + 6,
564859419607SMax Filippov XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
564959419607SMax Filippov },
565021a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
5651168c12b0SMax Filippov }, {
5652168c12b0SMax Filippov .name = "xsr.eps2",
5653168c12b0SMax Filippov .translate = translate_xsr,
565491dc2b2dSMax Filippov .test_exceptions = test_exceptions_hpi,
565559419607SMax Filippov .par = (const uint32_t[]){
565659419607SMax Filippov EPS2,
565759419607SMax Filippov XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
565859419607SMax Filippov },
565921a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
5660168c12b0SMax Filippov }, {
5661168c12b0SMax Filippov .name = "xsr.eps3",
5662168c12b0SMax Filippov .translate = translate_xsr,
566391dc2b2dSMax Filippov .test_exceptions = test_exceptions_hpi,
566459419607SMax Filippov .par = (const uint32_t[]){
566559419607SMax Filippov EPS2 + 1,
566659419607SMax Filippov XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
566759419607SMax Filippov },
566821a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
5669168c12b0SMax Filippov }, {
5670168c12b0SMax Filippov .name = "xsr.eps4",
5671168c12b0SMax Filippov .translate = translate_xsr,
567291dc2b2dSMax Filippov .test_exceptions = test_exceptions_hpi,
567359419607SMax Filippov .par = (const uint32_t[]){
567459419607SMax Filippov EPS2 + 2,
567559419607SMax Filippov XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
567659419607SMax Filippov },
567721a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
5678168c12b0SMax Filippov }, {
5679168c12b0SMax Filippov .name = "xsr.eps5",
5680168c12b0SMax Filippov .translate = translate_xsr,
568191dc2b2dSMax Filippov .test_exceptions = test_exceptions_hpi,
568259419607SMax Filippov .par = (const uint32_t[]){
568359419607SMax Filippov EPS2 + 3,
568459419607SMax Filippov XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
568559419607SMax Filippov },
568621a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
5687168c12b0SMax Filippov }, {
5688168c12b0SMax Filippov .name = "xsr.eps6",
5689168c12b0SMax Filippov .translate = translate_xsr,
569091dc2b2dSMax Filippov .test_exceptions = test_exceptions_hpi,
569159419607SMax Filippov .par = (const uint32_t[]){
569259419607SMax Filippov EPS2 + 4,
569359419607SMax Filippov XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
569459419607SMax Filippov },
569521a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
5696168c12b0SMax Filippov }, {
5697168c12b0SMax Filippov .name = "xsr.eps7",
5698168c12b0SMax Filippov .translate = translate_xsr,
569991dc2b2dSMax Filippov .test_exceptions = test_exceptions_hpi,
570059419607SMax Filippov .par = (const uint32_t[]){
570159419607SMax Filippov EPS2 + 5,
570259419607SMax Filippov XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
570359419607SMax Filippov },
570421a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
5705168c12b0SMax Filippov }, {
57064d04ea35SMax Filippov .name = "xsr.eraccess",
57074d04ea35SMax Filippov .translate = translate_xsr_mask,
57084d04ea35SMax Filippov .par = (const uint32_t[]){
57094d04ea35SMax Filippov ERACCESS,
57104d04ea35SMax Filippov 0,
57114d04ea35SMax Filippov 0xffff,
57124d04ea35SMax Filippov },
5713168c12b0SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
5714168c12b0SMax Filippov }, {
5715168c12b0SMax Filippov .name = "xsr.exccause",
5716168c12b0SMax Filippov .translate = translate_xsr,
571791dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
571859419607SMax Filippov .par = (const uint32_t[]){
571959419607SMax Filippov EXCCAUSE,
572059419607SMax Filippov XTENSA_OPTION_EXCEPTION,
572159419607SMax Filippov },
572221a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
5723168c12b0SMax Filippov }, {
5724168c12b0SMax Filippov .name = "xsr.excsave1",
5725168c12b0SMax Filippov .translate = translate_xsr,
572691dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
572759419607SMax Filippov .par = (const uint32_t[]){
572859419607SMax Filippov EXCSAVE1,
572959419607SMax Filippov XTENSA_OPTION_EXCEPTION,
573059419607SMax Filippov },
573121a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
5732168c12b0SMax Filippov }, {
5733168c12b0SMax Filippov .name = "xsr.excsave2",
5734168c12b0SMax Filippov .translate = translate_xsr,
573591dc2b2dSMax Filippov .test_exceptions = test_exceptions_hpi,
573659419607SMax Filippov .par = (const uint32_t[]){
573759419607SMax Filippov EXCSAVE1 + 1,
573859419607SMax Filippov XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
573959419607SMax Filippov },
574021a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
5741168c12b0SMax Filippov }, {
5742168c12b0SMax Filippov .name = "xsr.excsave3",
5743168c12b0SMax Filippov .translate = translate_xsr,
574491dc2b2dSMax Filippov .test_exceptions = test_exceptions_hpi,
574559419607SMax Filippov .par = (const uint32_t[]){
574659419607SMax Filippov EXCSAVE1 + 2,
574759419607SMax Filippov XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
574859419607SMax Filippov },
574921a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
5750168c12b0SMax Filippov }, {
5751168c12b0SMax Filippov .name = "xsr.excsave4",
5752168c12b0SMax Filippov .translate = translate_xsr,
575391dc2b2dSMax Filippov .test_exceptions = test_exceptions_hpi,
575459419607SMax Filippov .par = (const uint32_t[]){
575559419607SMax Filippov EXCSAVE1 + 3,
575659419607SMax Filippov XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
575759419607SMax Filippov },
575821a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
5759168c12b0SMax Filippov }, {
5760168c12b0SMax Filippov .name = "xsr.excsave5",
5761168c12b0SMax Filippov .translate = translate_xsr,
576291dc2b2dSMax Filippov .test_exceptions = test_exceptions_hpi,
576359419607SMax Filippov .par = (const uint32_t[]){
576459419607SMax Filippov EXCSAVE1 + 4,
576559419607SMax Filippov XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
576659419607SMax Filippov },
576721a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
5768168c12b0SMax Filippov }, {
5769168c12b0SMax Filippov .name = "xsr.excsave6",
5770168c12b0SMax Filippov .translate = translate_xsr,
577191dc2b2dSMax Filippov .test_exceptions = test_exceptions_hpi,
577259419607SMax Filippov .par = (const uint32_t[]){
577359419607SMax Filippov EXCSAVE1 + 5,
577459419607SMax Filippov XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
577559419607SMax Filippov },
577621a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
5777168c12b0SMax Filippov }, {
5778168c12b0SMax Filippov .name = "xsr.excsave7",
5779168c12b0SMax Filippov .translate = translate_xsr,
578091dc2b2dSMax Filippov .test_exceptions = test_exceptions_hpi,
578159419607SMax Filippov .par = (const uint32_t[]){
578259419607SMax Filippov EXCSAVE1 + 6,
578359419607SMax Filippov XTENSA_OPTION_HIGH_PRIORITY_INTERRUPT,
578459419607SMax Filippov },
578521a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
5786168c12b0SMax Filippov }, {
5787168c12b0SMax Filippov .name = "xsr.excvaddr",
5788168c12b0SMax Filippov .translate = translate_xsr,
578991dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
579059419607SMax Filippov .par = (const uint32_t[]){
579159419607SMax Filippov EXCVADDR,
579259419607SMax Filippov XTENSA_OPTION_EXCEPTION,
579359419607SMax Filippov },
579421a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
5795168c12b0SMax Filippov }, {
5796168c12b0SMax Filippov .name = "xsr.ibreaka0",
579759419607SMax Filippov .translate = translate_xsr_ibreaka,
579891dc2b2dSMax Filippov .test_exceptions = test_exceptions_ibreak,
579959419607SMax Filippov .par = (const uint32_t[]){
580059419607SMax Filippov IBREAKA,
580159419607SMax Filippov XTENSA_OPTION_DEBUG,
580259419607SMax Filippov },
5803bf525107SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED | XTENSA_OP_EXIT_TB_0,
5804168c12b0SMax Filippov }, {
5805168c12b0SMax Filippov .name = "xsr.ibreaka1",
580659419607SMax Filippov .translate = translate_xsr_ibreaka,
580791dc2b2dSMax Filippov .test_exceptions = test_exceptions_ibreak,
580859419607SMax Filippov .par = (const uint32_t[]){
580959419607SMax Filippov IBREAKA + 1,
581059419607SMax Filippov XTENSA_OPTION_DEBUG,
581159419607SMax Filippov },
5812bf525107SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED | XTENSA_OP_EXIT_TB_0,
5813168c12b0SMax Filippov }, {
5814168c12b0SMax Filippov .name = "xsr.ibreakenable",
581559419607SMax Filippov .translate = translate_xsr_ibreakenable,
581691dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
581759419607SMax Filippov .par = (const uint32_t[]){
581859419607SMax Filippov IBREAKENABLE,
581959419607SMax Filippov XTENSA_OPTION_DEBUG,
582059419607SMax Filippov },
5821bf525107SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED | XTENSA_OP_EXIT_TB_0,
5822168c12b0SMax Filippov }, {
5823168c12b0SMax Filippov .name = "xsr.icount",
582459419607SMax Filippov .translate = translate_xsr_icount,
582591dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
582659419607SMax Filippov .par = (const uint32_t[]){
582759419607SMax Filippov ICOUNT,
582859419607SMax Filippov XTENSA_OPTION_DEBUG,
582959419607SMax Filippov },
583021a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
5831168c12b0SMax Filippov }, {
5832168c12b0SMax Filippov .name = "xsr.icountlevel",
583359419607SMax Filippov .translate = translate_xsr_mask,
583491dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
583559419607SMax Filippov .par = (const uint32_t[]){
583659419607SMax Filippov ICOUNTLEVEL,
583759419607SMax Filippov XTENSA_OPTION_DEBUG,
583859419607SMax Filippov 0xf,
583959419607SMax Filippov },
5840226444a8SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED | XTENSA_OP_EXIT_TB_M1,
5841168c12b0SMax Filippov }, {
5842168c12b0SMax Filippov .name = "xsr.intclear",
584359419607SMax Filippov .op_flags = XTENSA_OP_ILL,
5844168c12b0SMax Filippov }, {
5845168c12b0SMax Filippov .name = "xsr.intenable",
5846168c12b0SMax Filippov .translate = translate_xsr,
584791dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
584859419607SMax Filippov .par = (const uint32_t[]){
584959419607SMax Filippov INTENABLE,
585059419607SMax Filippov XTENSA_OPTION_INTERRUPT,
585159419607SMax Filippov },
5852d74624e5SMax Filippov .op_flags =
5853d74624e5SMax Filippov XTENSA_OP_PRIVILEGED |
5854d74624e5SMax Filippov XTENSA_OP_EXIT_TB_0 |
5855d74624e5SMax Filippov XTENSA_OP_CHECK_INTERRUPTS,
5856168c12b0SMax Filippov }, {
5857168c12b0SMax Filippov .name = "xsr.interrupt",
585859419607SMax Filippov .op_flags = XTENSA_OP_ILL,
5859168c12b0SMax Filippov }, {
5860168c12b0SMax Filippov .name = "xsr.intset",
586159419607SMax Filippov .op_flags = XTENSA_OP_ILL,
5862168c12b0SMax Filippov }, {
5863168c12b0SMax Filippov .name = "xsr.itlbcfg",
586459419607SMax Filippov .translate = translate_xsr_mask,
586591dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
586659419607SMax Filippov .par = (const uint32_t[]){
586759419607SMax Filippov ITLBCFG,
586859419607SMax Filippov XTENSA_OPTION_MMU,
586959419607SMax Filippov 0x01130000,
587059419607SMax Filippov },
587121a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
5872168c12b0SMax Filippov }, {
5873168c12b0SMax Filippov .name = "xsr.lbeg",
5874168c12b0SMax Filippov .translate = translate_xsr,
587591dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
587659419607SMax Filippov .par = (const uint32_t[]){
587759419607SMax Filippov LBEG,
587859419607SMax Filippov XTENSA_OPTION_LOOP,
587959419607SMax Filippov },
58805d630cefSMax Filippov .op_flags = XTENSA_OP_EXIT_TB_M1,
5881168c12b0SMax Filippov }, {
5882168c12b0SMax Filippov .name = "xsr.lcount",
5883168c12b0SMax Filippov .translate = translate_xsr,
588491dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
588559419607SMax Filippov .par = (const uint32_t[]){
588659419607SMax Filippov LCOUNT,
588759419607SMax Filippov XTENSA_OPTION_LOOP,
588859419607SMax Filippov },
5889168c12b0SMax Filippov }, {
5890168c12b0SMax Filippov .name = "xsr.lend",
5891168c12b0SMax Filippov .translate = translate_xsr,
589291dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
589359419607SMax Filippov .par = (const uint32_t[]){
589459419607SMax Filippov LEND,
589559419607SMax Filippov XTENSA_OPTION_LOOP,
589659419607SMax Filippov },
58975d630cefSMax Filippov .op_flags = XTENSA_OP_EXIT_TB_M1,
5898168c12b0SMax Filippov }, {
5899168c12b0SMax Filippov .name = "xsr.litbase",
590059419607SMax Filippov .translate = translate_xsr_mask,
590191dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
590259419607SMax Filippov .par = (const uint32_t[]){
590359419607SMax Filippov LITBASE,
590459419607SMax Filippov XTENSA_OPTION_EXTENDED_L32R,
590559419607SMax Filippov 0xfffff001,
590659419607SMax Filippov },
5907226444a8SMax Filippov .op_flags = XTENSA_OP_EXIT_TB_M1,
5908168c12b0SMax Filippov }, {
5909168c12b0SMax Filippov .name = "xsr.m0",
5910168c12b0SMax Filippov .translate = translate_xsr,
591191dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
591259419607SMax Filippov .par = (const uint32_t[]){
591359419607SMax Filippov MR,
591459419607SMax Filippov XTENSA_OPTION_MAC16,
591559419607SMax Filippov },
5916168c12b0SMax Filippov }, {
5917168c12b0SMax Filippov .name = "xsr.m1",
5918168c12b0SMax Filippov .translate = translate_xsr,
591991dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
592059419607SMax Filippov .par = (const uint32_t[]){
592159419607SMax Filippov MR + 1,
592259419607SMax Filippov XTENSA_OPTION_MAC16,
592359419607SMax Filippov },
5924168c12b0SMax Filippov }, {
5925168c12b0SMax Filippov .name = "xsr.m2",
5926168c12b0SMax Filippov .translate = translate_xsr,
592791dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
592859419607SMax Filippov .par = (const uint32_t[]){
592959419607SMax Filippov MR + 2,
593059419607SMax Filippov XTENSA_OPTION_MAC16,
593159419607SMax Filippov },
5932168c12b0SMax Filippov }, {
5933168c12b0SMax Filippov .name = "xsr.m3",
5934168c12b0SMax Filippov .translate = translate_xsr,
593591dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
593659419607SMax Filippov .par = (const uint32_t[]){
593759419607SMax Filippov MR + 3,
593859419607SMax Filippov XTENSA_OPTION_MAC16,
593959419607SMax Filippov },
5940168c12b0SMax Filippov }, {
5941168c12b0SMax Filippov .name = "xsr.memctl",
594259419607SMax Filippov .translate = translate_xsr_memctl,
5943168c12b0SMax Filippov .par = (const uint32_t[]){MEMCTL},
594421a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
5945168c12b0SMax Filippov }, {
5946631a77a0SMax Filippov .name = "xsr.mecr",
5947631a77a0SMax Filippov .translate = translate_xsr,
594891dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
5949631a77a0SMax Filippov .par = (const uint32_t[]){
5950631a77a0SMax Filippov MECR,
5951631a77a0SMax Filippov XTENSA_OPTION_MEMORY_ECC_PARITY,
5952631a77a0SMax Filippov },
5953631a77a0SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
5954631a77a0SMax Filippov }, {
5955631a77a0SMax Filippov .name = "xsr.mepc",
5956631a77a0SMax Filippov .translate = translate_xsr,
595791dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
5958631a77a0SMax Filippov .par = (const uint32_t[]){
5959631a77a0SMax Filippov MEPC,
5960631a77a0SMax Filippov XTENSA_OPTION_MEMORY_ECC_PARITY,
5961631a77a0SMax Filippov },
5962631a77a0SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
5963631a77a0SMax Filippov }, {
5964631a77a0SMax Filippov .name = "xsr.meps",
5965631a77a0SMax Filippov .translate = translate_xsr,
596691dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
5967631a77a0SMax Filippov .par = (const uint32_t[]){
5968631a77a0SMax Filippov MEPS,
5969631a77a0SMax Filippov XTENSA_OPTION_MEMORY_ECC_PARITY,
5970631a77a0SMax Filippov },
5971631a77a0SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
5972631a77a0SMax Filippov }, {
5973631a77a0SMax Filippov .name = "xsr.mesave",
5974631a77a0SMax Filippov .translate = translate_xsr,
597591dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
5976631a77a0SMax Filippov .par = (const uint32_t[]){
5977631a77a0SMax Filippov MESAVE,
5978631a77a0SMax Filippov XTENSA_OPTION_MEMORY_ECC_PARITY,
5979631a77a0SMax Filippov },
5980631a77a0SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
5981631a77a0SMax Filippov }, {
5982631a77a0SMax Filippov .name = "xsr.mesr",
5983631a77a0SMax Filippov .translate = translate_xsr,
598491dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
5985631a77a0SMax Filippov .par = (const uint32_t[]){
5986631a77a0SMax Filippov MESR,
5987631a77a0SMax Filippov XTENSA_OPTION_MEMORY_ECC_PARITY,
5988631a77a0SMax Filippov },
5989631a77a0SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
5990631a77a0SMax Filippov }, {
5991631a77a0SMax Filippov .name = "xsr.mevaddr",
5992631a77a0SMax Filippov .translate = translate_xsr,
599391dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
5994631a77a0SMax Filippov .par = (const uint32_t[]){
5995631a77a0SMax Filippov MESR,
5996631a77a0SMax Filippov XTENSA_OPTION_MEMORY_ECC_PARITY,
5997631a77a0SMax Filippov },
5998631a77a0SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
5999631a77a0SMax Filippov }, {
6000168c12b0SMax Filippov .name = "xsr.misc0",
6001168c12b0SMax Filippov .translate = translate_xsr,
600291dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
600359419607SMax Filippov .par = (const uint32_t[]){
600459419607SMax Filippov MISC,
600559419607SMax Filippov XTENSA_OPTION_MISC_SR,
600659419607SMax Filippov },
600721a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
6008168c12b0SMax Filippov }, {
6009168c12b0SMax Filippov .name = "xsr.misc1",
6010168c12b0SMax Filippov .translate = translate_xsr,
601191dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
601259419607SMax Filippov .par = (const uint32_t[]){
601359419607SMax Filippov MISC + 1,
601459419607SMax Filippov XTENSA_OPTION_MISC_SR,
601559419607SMax Filippov },
601621a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
6017168c12b0SMax Filippov }, {
6018168c12b0SMax Filippov .name = "xsr.misc2",
6019168c12b0SMax Filippov .translate = translate_xsr,
602091dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
602159419607SMax Filippov .par = (const uint32_t[]){
602259419607SMax Filippov MISC + 2,
602359419607SMax Filippov XTENSA_OPTION_MISC_SR,
602459419607SMax Filippov },
602521a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
6026168c12b0SMax Filippov }, {
6027168c12b0SMax Filippov .name = "xsr.misc3",
6028168c12b0SMax Filippov .translate = translate_xsr,
602991dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
603059419607SMax Filippov .par = (const uint32_t[]){
603159419607SMax Filippov MISC + 3,
603259419607SMax Filippov XTENSA_OPTION_MISC_SR,
603359419607SMax Filippov },
603421a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
6035168c12b0SMax Filippov }, {
60364d04ea35SMax Filippov .name = "xsr.mpuenb",
60374d04ea35SMax Filippov .translate = translate_xsr_mpuenb,
603891dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
60394d04ea35SMax Filippov .par = (const uint32_t[]){
60404d04ea35SMax Filippov MPUENB,
60414d04ea35SMax Filippov XTENSA_OPTION_MPU,
60424d04ea35SMax Filippov },
60434d04ea35SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED | XTENSA_OP_EXIT_TB_M1,
60444d04ea35SMax Filippov }, {
6045eb3f4298SMax Filippov .name = "xsr.prefctl",
6046eb3f4298SMax Filippov .translate = translate_xsr,
6047eb3f4298SMax Filippov .par = (const uint32_t[]){PREFCTL},
6048eb3f4298SMax Filippov }, {
6049168c12b0SMax Filippov .name = "xsr.prid",
605059419607SMax Filippov .op_flags = XTENSA_OP_ILL,
6051168c12b0SMax Filippov }, {
6052168c12b0SMax Filippov .name = "xsr.ps",
605359419607SMax Filippov .translate = translate_xsr_ps,
605491dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
605559419607SMax Filippov .par = (const uint32_t[]){
605659419607SMax Filippov PS,
605759419607SMax Filippov XTENSA_OPTION_EXCEPTION,
605859419607SMax Filippov },
6059d74624e5SMax Filippov .op_flags =
6060d74624e5SMax Filippov XTENSA_OP_PRIVILEGED |
6061d74624e5SMax Filippov XTENSA_OP_EXIT_TB_M1 |
6062d74624e5SMax Filippov XTENSA_OP_CHECK_INTERRUPTS,
6063168c12b0SMax Filippov }, {
6064168c12b0SMax Filippov .name = "xsr.ptevaddr",
606559419607SMax Filippov .translate = translate_xsr_mask,
606691dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
606759419607SMax Filippov .par = (const uint32_t[]){
606859419607SMax Filippov PTEVADDR,
606959419607SMax Filippov XTENSA_OPTION_MMU,
607059419607SMax Filippov 0xffc00000,
607159419607SMax Filippov },
607221a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
6073168c12b0SMax Filippov }, {
6074168c12b0SMax Filippov .name = "xsr.rasid",
607559419607SMax Filippov .translate = translate_xsr_rasid,
607691dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
607759419607SMax Filippov .par = (const uint32_t[]){
607859419607SMax Filippov RASID,
607959419607SMax Filippov XTENSA_OPTION_MMU,
608059419607SMax Filippov },
6081226444a8SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED | XTENSA_OP_EXIT_TB_M1,
6082168c12b0SMax Filippov }, {
6083168c12b0SMax Filippov .name = "xsr.sar",
608459419607SMax Filippov .translate = translate_xsr_sar,
6085168c12b0SMax Filippov .par = (const uint32_t[]){SAR},
6086168c12b0SMax Filippov }, {
6087168c12b0SMax Filippov .name = "xsr.scompare1",
6088168c12b0SMax Filippov .translate = translate_xsr,
608991dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
609059419607SMax Filippov .par = (const uint32_t[]){
609159419607SMax Filippov SCOMPARE1,
609259419607SMax Filippov XTENSA_OPTION_CONDITIONAL_STORE,
609359419607SMax Filippov },
6094168c12b0SMax Filippov }, {
6095168c12b0SMax Filippov .name = "xsr.vecbase",
6096168c12b0SMax Filippov .translate = translate_xsr,
609791dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
609859419607SMax Filippov .par = (const uint32_t[]){
609959419607SMax Filippov VECBASE,
610059419607SMax Filippov XTENSA_OPTION_RELOCATABLE_VECTOR,
610159419607SMax Filippov },
610221a2dad5SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED,
6103168c12b0SMax Filippov }, {
6104168c12b0SMax Filippov .name = "xsr.windowbase",
610559419607SMax Filippov .translate = translate_xsr_windowbase,
610691dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
610759419607SMax Filippov .par = (const uint32_t[]){
610859419607SMax Filippov WINDOW_BASE,
610959419607SMax Filippov XTENSA_OPTION_WINDOWED_REGISTER,
611059419607SMax Filippov },
61118df3fd35SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED |
61128df3fd35SMax Filippov XTENSA_OP_EXIT_TB_M1 |
61138df3fd35SMax Filippov XTENSA_OP_SYNC_REGISTER_WINDOW,
6114168c12b0SMax Filippov }, {
6115168c12b0SMax Filippov .name = "xsr.windowstart",
611659419607SMax Filippov .translate = translate_xsr_windowstart,
611791dc2b2dSMax Filippov .test_exceptions = test_exceptions_sr,
611859419607SMax Filippov .par = (const uint32_t[]){
611959419607SMax Filippov WINDOW_START,
612059419607SMax Filippov XTENSA_OPTION_WINDOWED_REGISTER,
612159419607SMax Filippov },
6122226444a8SMax Filippov .op_flags = XTENSA_OP_PRIVILEGED | XTENSA_OP_EXIT_TB_M1,
6123168c12b0SMax Filippov },
6124168c12b0SMax Filippov };
6125168c12b0SMax Filippov
6126168c12b0SMax Filippov const XtensaOpcodeTranslators xtensa_core_opcodes = {
6127168c12b0SMax Filippov .num_opcodes = ARRAY_SIZE(core_ops),
6128168c12b0SMax Filippov .opcode = core_ops,
6129168c12b0SMax Filippov };
6130c04e1692SMax Filippov
6131c04e1692SMax Filippov
get_f32_o1_i3(const OpcodeArg * arg,OpcodeArg * arg32,int o0,int i0,int i1,int i2)6132cfa9f051SMax Filippov static inline void get_f32_o1_i3(const OpcodeArg *arg, OpcodeArg *arg32,
6133cfa9f051SMax Filippov int o0, int i0, int i1, int i2)
6134cfa9f051SMax Filippov {
6135cfa9f051SMax Filippov if ((i0 >= 0 && arg[i0].num_bits == 64) ||
6136cfa9f051SMax Filippov (o0 >= 0 && arg[o0].num_bits == 64)) {
6137cfa9f051SMax Filippov if (o0 >= 0) {
6138cfa9f051SMax Filippov arg32[o0].out = tcg_temp_new_i32();
6139cfa9f051SMax Filippov }
6140cfa9f051SMax Filippov if (i0 >= 0) {
6141cfa9f051SMax Filippov arg32[i0].in = tcg_temp_new_i32();
6142cfa9f051SMax Filippov tcg_gen_extrl_i64_i32(arg32[i0].in, arg[i0].in);
6143cfa9f051SMax Filippov }
6144cfa9f051SMax Filippov if (i1 >= 0) {
6145cfa9f051SMax Filippov arg32[i1].in = tcg_temp_new_i32();
6146cfa9f051SMax Filippov tcg_gen_extrl_i64_i32(arg32[i1].in, arg[i1].in);
6147cfa9f051SMax Filippov }
6148cfa9f051SMax Filippov if (i2 >= 0) {
6149cfa9f051SMax Filippov arg32[i2].in = tcg_temp_new_i32();
6150cfa9f051SMax Filippov tcg_gen_extrl_i64_i32(arg32[i2].in, arg[i2].in);
6151cfa9f051SMax Filippov }
6152cfa9f051SMax Filippov } else {
6153cfa9f051SMax Filippov if (o0 >= 0) {
6154cfa9f051SMax Filippov arg32[o0].out = arg[o0].out;
6155cfa9f051SMax Filippov }
6156cfa9f051SMax Filippov if (i0 >= 0) {
6157cfa9f051SMax Filippov arg32[i0].in = arg[i0].in;
6158cfa9f051SMax Filippov }
6159cfa9f051SMax Filippov if (i1 >= 0) {
6160cfa9f051SMax Filippov arg32[i1].in = arg[i1].in;
6161cfa9f051SMax Filippov }
6162cfa9f051SMax Filippov if (i2 >= 0) {
6163cfa9f051SMax Filippov arg32[i2].in = arg[i2].in;
6164cfa9f051SMax Filippov }
6165cfa9f051SMax Filippov }
6166cfa9f051SMax Filippov }
6167cfa9f051SMax Filippov
put_f32_o1_i3(const OpcodeArg * arg,const OpcodeArg * arg32,int o0,int i0,int i1,int i2)6168cfa9f051SMax Filippov static inline void put_f32_o1_i3(const OpcodeArg *arg, const OpcodeArg *arg32,
6169cfa9f051SMax Filippov int o0, int i0, int i1, int i2)
6170cfa9f051SMax Filippov {
6171cfa9f051SMax Filippov if ((i0 >= 0 && arg[i0].num_bits == 64) ||
6172cfa9f051SMax Filippov (o0 >= 0 && arg[o0].num_bits == 64)) {
6173cfa9f051SMax Filippov if (o0 >= 0) {
6174cfa9f051SMax Filippov tcg_gen_extu_i32_i64(arg[o0].out, arg32[o0].out);
6175cfa9f051SMax Filippov }
6176cfa9f051SMax Filippov }
6177cfa9f051SMax Filippov }
6178cfa9f051SMax Filippov
get_f32_o1_i2(const OpcodeArg * arg,OpcodeArg * arg32,int o0,int i0,int i1)6179cfa9f051SMax Filippov static inline void get_f32_o1_i2(const OpcodeArg *arg, OpcodeArg *arg32,
6180cfa9f051SMax Filippov int o0, int i0, int i1)
6181cfa9f051SMax Filippov {
6182cfa9f051SMax Filippov get_f32_o1_i3(arg, arg32, o0, i0, i1, -1);
6183cfa9f051SMax Filippov }
6184cfa9f051SMax Filippov
put_f32_o1_i2(const OpcodeArg * arg,const OpcodeArg * arg32,int o0,int i0,int i1)6185cfa9f051SMax Filippov static inline void put_f32_o1_i2(const OpcodeArg *arg, const OpcodeArg *arg32,
6186cfa9f051SMax Filippov int o0, int i0, int i1)
6187cfa9f051SMax Filippov {
6188cfa9f051SMax Filippov put_f32_o1_i3(arg, arg32, o0, i0, i1, -1);
6189cfa9f051SMax Filippov }
6190cfa9f051SMax Filippov
get_f32_o1_i1(const OpcodeArg * arg,OpcodeArg * arg32,int o0,int i0)6191cfa9f051SMax Filippov static inline void get_f32_o1_i1(const OpcodeArg *arg, OpcodeArg *arg32,
6192cfa9f051SMax Filippov int o0, int i0)
6193cfa9f051SMax Filippov {
6194cfa9f051SMax Filippov get_f32_o1_i2(arg, arg32, o0, i0, -1);
6195cfa9f051SMax Filippov }
6196cfa9f051SMax Filippov
put_f32_o1_i1(const OpcodeArg * arg,const OpcodeArg * arg32,int o0,int i0)6197cfa9f051SMax Filippov static inline void put_f32_o1_i1(const OpcodeArg *arg, const OpcodeArg *arg32,
6198cfa9f051SMax Filippov int o0, int i0)
6199cfa9f051SMax Filippov {
6200cfa9f051SMax Filippov put_f32_o1_i2(arg, arg32, o0, i0, -1);
6201cfa9f051SMax Filippov }
6202cfa9f051SMax Filippov
get_f32_o1(const OpcodeArg * arg,OpcodeArg * arg32,int o0)6203cfa9f051SMax Filippov static inline void get_f32_o1(const OpcodeArg *arg, OpcodeArg *arg32,
6204cfa9f051SMax Filippov int o0)
6205cfa9f051SMax Filippov {
6206cfa9f051SMax Filippov get_f32_o1_i1(arg, arg32, o0, -1);
6207cfa9f051SMax Filippov }
6208cfa9f051SMax Filippov
put_f32_o1(const OpcodeArg * arg,const OpcodeArg * arg32,int o0)6209cfa9f051SMax Filippov static inline void put_f32_o1(const OpcodeArg *arg, const OpcodeArg *arg32,
6210cfa9f051SMax Filippov int o0)
6211cfa9f051SMax Filippov {
6212cfa9f051SMax Filippov put_f32_o1_i1(arg, arg32, o0, -1);
6213cfa9f051SMax Filippov }
6214cfa9f051SMax Filippov
get_f32_i2(const OpcodeArg * arg,OpcodeArg * arg32,int i0,int i1)6215cfa9f051SMax Filippov static inline void get_f32_i2(const OpcodeArg *arg, OpcodeArg *arg32,
6216cfa9f051SMax Filippov int i0, int i1)
6217cfa9f051SMax Filippov {
6218cfa9f051SMax Filippov get_f32_o1_i2(arg, arg32, -1, i0, i1);
6219cfa9f051SMax Filippov }
6220cfa9f051SMax Filippov
put_f32_i2(const OpcodeArg * arg,const OpcodeArg * arg32,int i0,int i1)6221cfa9f051SMax Filippov static inline void put_f32_i2(const OpcodeArg *arg, const OpcodeArg *arg32,
6222cfa9f051SMax Filippov int i0, int i1)
6223cfa9f051SMax Filippov {
6224cfa9f051SMax Filippov put_f32_o1_i2(arg, arg32, -1, i0, i1);
6225cfa9f051SMax Filippov }
6226cfa9f051SMax Filippov
get_f32_i1(const OpcodeArg * arg,OpcodeArg * arg32,int i0)6227cfa9f051SMax Filippov static inline void get_f32_i1(const OpcodeArg *arg, OpcodeArg *arg32,
6228cfa9f051SMax Filippov int i0)
6229cfa9f051SMax Filippov {
6230cfa9f051SMax Filippov get_f32_i2(arg, arg32, i0, -1);
6231cfa9f051SMax Filippov }
6232cfa9f051SMax Filippov
put_f32_i1(const OpcodeArg * arg,const OpcodeArg * arg32,int i0)6233cfa9f051SMax Filippov static inline void put_f32_i1(const OpcodeArg *arg, const OpcodeArg *arg32,
6234cfa9f051SMax Filippov int i0)
6235cfa9f051SMax Filippov {
6236cfa9f051SMax Filippov put_f32_i2(arg, arg32, i0, -1);
6237cfa9f051SMax Filippov }
6238cfa9f051SMax Filippov
6239cfa9f051SMax Filippov
translate_abs_d(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])6240cfa9f051SMax Filippov static void translate_abs_d(DisasContext *dc, const OpcodeArg arg[],
6241cfa9f051SMax Filippov const uint32_t par[])
6242cfa9f051SMax Filippov {
6243cfa9f051SMax Filippov gen_helper_abs_d(arg[0].out, arg[1].in);
6244cfa9f051SMax Filippov }
6245cfa9f051SMax Filippov
translate_abs_s(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])6246b0b24bdcSMax Filippov static void translate_abs_s(DisasContext *dc, const OpcodeArg arg[],
6247c04e1692SMax Filippov const uint32_t par[])
6248c04e1692SMax Filippov {
6249cfa9f051SMax Filippov OpcodeArg arg32[2];
6250cfa9f051SMax Filippov
6251cfa9f051SMax Filippov get_f32_o1_i1(arg, arg32, 0, 1);
6252cfa9f051SMax Filippov gen_helper_abs_s(arg32[0].out, arg32[1].in);
6253cfa9f051SMax Filippov put_f32_o1_i1(arg, arg32, 0, 1);
6254c04e1692SMax Filippov }
6255c04e1692SMax Filippov
translate_fpu2k_add_s(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])62565680f207SMax Filippov static void translate_fpu2k_add_s(DisasContext *dc, const OpcodeArg arg[],
6257c04e1692SMax Filippov const uint32_t par[])
6258c04e1692SMax Filippov {
6259ad75a51eSRichard Henderson gen_helper_fpu2k_add_s(arg[0].out, tcg_env,
6260b0b24bdcSMax Filippov arg[1].in, arg[2].in);
6261c04e1692SMax Filippov }
6262c04e1692SMax Filippov
6263c04e1692SMax Filippov enum {
6264c04e1692SMax Filippov COMPARE_UN,
6265c04e1692SMax Filippov COMPARE_OEQ,
6266c04e1692SMax Filippov COMPARE_UEQ,
6267c04e1692SMax Filippov COMPARE_OLT,
6268c04e1692SMax Filippov COMPARE_ULT,
6269c04e1692SMax Filippov COMPARE_OLE,
6270c04e1692SMax Filippov COMPARE_ULE,
6271c04e1692SMax Filippov };
6272c04e1692SMax Filippov
translate_compare_d(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])6273cfa9f051SMax Filippov static void translate_compare_d(DisasContext *dc, const OpcodeArg arg[],
6274c04e1692SMax Filippov const uint32_t par[])
6275c04e1692SMax Filippov {
62765dbb4c96SMax Filippov static void (* const helper[])(TCGv_i32 res, TCGv_env env,
6277cfa9f051SMax Filippov TCGv_i64 s, TCGv_i64 t) = {
6278cfa9f051SMax Filippov [COMPARE_UN] = gen_helper_un_d,
6279cfa9f051SMax Filippov [COMPARE_OEQ] = gen_helper_oeq_d,
6280cfa9f051SMax Filippov [COMPARE_UEQ] = gen_helper_ueq_d,
6281cfa9f051SMax Filippov [COMPARE_OLT] = gen_helper_olt_d,
6282cfa9f051SMax Filippov [COMPARE_ULT] = gen_helper_ult_d,
6283cfa9f051SMax Filippov [COMPARE_OLE] = gen_helper_ole_d,
6284cfa9f051SMax Filippov [COMPARE_ULE] = gen_helper_ule_d,
6285c04e1692SMax Filippov };
62862b570a17SMax Filippov TCGv_i32 zero = tcg_constant_i32(0);
62875dbb4c96SMax Filippov TCGv_i32 res = tcg_temp_new_i32();
62885dbb4c96SMax Filippov TCGv_i32 set_br = tcg_temp_new_i32();
62895dbb4c96SMax Filippov TCGv_i32 clr_br = tcg_temp_new_i32();
6290c04e1692SMax Filippov
62915dbb4c96SMax Filippov tcg_gen_ori_i32(set_br, arg[0].in, 1 << arg[0].imm);
62925dbb4c96SMax Filippov tcg_gen_andi_i32(clr_br, arg[0].in, ~(1 << arg[0].imm));
62935dbb4c96SMax Filippov
6294ad75a51eSRichard Henderson helper[par[0]](res, tcg_env, arg[1].in, arg[2].in);
62955dbb4c96SMax Filippov tcg_gen_movcond_i32(TCG_COND_NE,
62965dbb4c96SMax Filippov arg[0].out, res, zero,
62975dbb4c96SMax Filippov set_br, clr_br);
6298c04e1692SMax Filippov }
6299c04e1692SMax Filippov
translate_compare_s(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])6300cfa9f051SMax Filippov static void translate_compare_s(DisasContext *dc, const OpcodeArg arg[],
6301cfa9f051SMax Filippov const uint32_t par[])
6302cfa9f051SMax Filippov {
6303cfa9f051SMax Filippov static void (* const helper[])(TCGv_i32 res, TCGv_env env,
6304cfa9f051SMax Filippov TCGv_i32 s, TCGv_i32 t) = {
6305cfa9f051SMax Filippov [COMPARE_UN] = gen_helper_un_s,
6306cfa9f051SMax Filippov [COMPARE_OEQ] = gen_helper_oeq_s,
6307cfa9f051SMax Filippov [COMPARE_UEQ] = gen_helper_ueq_s,
6308cfa9f051SMax Filippov [COMPARE_OLT] = gen_helper_olt_s,
6309cfa9f051SMax Filippov [COMPARE_ULT] = gen_helper_ult_s,
6310cfa9f051SMax Filippov [COMPARE_OLE] = gen_helper_ole_s,
6311cfa9f051SMax Filippov [COMPARE_ULE] = gen_helper_ule_s,
6312cfa9f051SMax Filippov };
6313cfa9f051SMax Filippov OpcodeArg arg32[3];
63142b570a17SMax Filippov TCGv_i32 zero = tcg_constant_i32(0);
6315cfa9f051SMax Filippov TCGv_i32 res = tcg_temp_new_i32();
6316cfa9f051SMax Filippov TCGv_i32 set_br = tcg_temp_new_i32();
6317cfa9f051SMax Filippov TCGv_i32 clr_br = tcg_temp_new_i32();
6318cfa9f051SMax Filippov
6319cfa9f051SMax Filippov tcg_gen_ori_i32(set_br, arg[0].in, 1 << arg[0].imm);
6320cfa9f051SMax Filippov tcg_gen_andi_i32(clr_br, arg[0].in, ~(1 << arg[0].imm));
6321cfa9f051SMax Filippov
6322cfa9f051SMax Filippov get_f32_i2(arg, arg32, 1, 2);
6323ad75a51eSRichard Henderson helper[par[0]](res, tcg_env, arg32[1].in, arg32[2].in);
6324cfa9f051SMax Filippov tcg_gen_movcond_i32(TCG_COND_NE,
6325cfa9f051SMax Filippov arg[0].out, res, zero,
6326cfa9f051SMax Filippov set_br, clr_br);
6327cfa9f051SMax Filippov put_f32_i2(arg, arg32, 1, 2);
6328cfa9f051SMax Filippov }
6329cfa9f051SMax Filippov
translate_const_d(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])6330cfa9f051SMax Filippov static void translate_const_d(DisasContext *dc, const OpcodeArg arg[],
6331cfa9f051SMax Filippov const uint32_t par[])
6332cfa9f051SMax Filippov {
6333cfa9f051SMax Filippov static const uint64_t v[] = {
6334cfa9f051SMax Filippov UINT64_C(0x0000000000000000),
6335cfa9f051SMax Filippov UINT64_C(0x3ff0000000000000),
6336cfa9f051SMax Filippov UINT64_C(0x4000000000000000),
6337cfa9f051SMax Filippov UINT64_C(0x3fe0000000000000),
6338cfa9f051SMax Filippov };
6339cfa9f051SMax Filippov
6340cfa9f051SMax Filippov tcg_gen_movi_i64(arg[0].out, v[arg[1].imm % ARRAY_SIZE(v)]);
6341cfa9f051SMax Filippov if (arg[1].imm >= ARRAY_SIZE(v)) {
6342cfa9f051SMax Filippov qemu_log_mask(LOG_GUEST_ERROR,
6343cfa9f051SMax Filippov "const.d f%d, #%d, immediate value is reserved\n",
6344cfa9f051SMax Filippov arg[0].imm, arg[1].imm);
6345cfa9f051SMax Filippov }
6346cfa9f051SMax Filippov }
6347cfa9f051SMax Filippov
translate_const_s(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])6348cfa9f051SMax Filippov static void translate_const_s(DisasContext *dc, const OpcodeArg arg[],
6349cfa9f051SMax Filippov const uint32_t par[])
6350cfa9f051SMax Filippov {
6351cfa9f051SMax Filippov static const uint32_t v[] = {
6352cfa9f051SMax Filippov 0x00000000,
6353cfa9f051SMax Filippov 0x3f800000,
6354cfa9f051SMax Filippov 0x40000000,
6355cfa9f051SMax Filippov 0x3f000000,
6356cfa9f051SMax Filippov };
6357cfa9f051SMax Filippov
6358cfa9f051SMax Filippov if (arg[0].num_bits == 32) {
6359cfa9f051SMax Filippov tcg_gen_movi_i32(arg[0].out, v[arg[1].imm % ARRAY_SIZE(v)]);
6360cfa9f051SMax Filippov } else {
6361cfa9f051SMax Filippov tcg_gen_movi_i64(arg[0].out, v[arg[1].imm % ARRAY_SIZE(v)]);
6362cfa9f051SMax Filippov }
6363cfa9f051SMax Filippov if (arg[1].imm >= ARRAY_SIZE(v)) {
6364cfa9f051SMax Filippov qemu_log_mask(LOG_GUEST_ERROR,
6365cfa9f051SMax Filippov "const.s f%d, #%d, immediate value is reserved\n",
6366cfa9f051SMax Filippov arg[0].imm, arg[1].imm);
6367cfa9f051SMax Filippov }
6368cfa9f051SMax Filippov }
6369cfa9f051SMax Filippov
translate_float_d(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])6370cfa9f051SMax Filippov static void translate_float_d(DisasContext *dc, const OpcodeArg arg[],
6371c04e1692SMax Filippov const uint32_t par[])
6372c04e1692SMax Filippov {
6373867e354cSMax Filippov TCGv_i32 scale = tcg_constant_i32(-arg[2].imm);
6374c04e1692SMax Filippov
6375c04e1692SMax Filippov if (par[0]) {
6376ad75a51eSRichard Henderson gen_helper_uitof_d(arg[0].out, tcg_env, arg[1].in, scale);
6377c04e1692SMax Filippov } else {
6378ad75a51eSRichard Henderson gen_helper_itof_d(arg[0].out, tcg_env, arg[1].in, scale);
6379c04e1692SMax Filippov }
6380c04e1692SMax Filippov }
6381c04e1692SMax Filippov
translate_float_s(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])6382cfa9f051SMax Filippov static void translate_float_s(DisasContext *dc, const OpcodeArg arg[],
6383cfa9f051SMax Filippov const uint32_t par[])
6384cfa9f051SMax Filippov {
6385867e354cSMax Filippov TCGv_i32 scale = tcg_constant_i32(-arg[2].imm);
6386cfa9f051SMax Filippov OpcodeArg arg32[1];
6387cfa9f051SMax Filippov
6388cfa9f051SMax Filippov get_f32_o1(arg, arg32, 0);
6389cfa9f051SMax Filippov if (par[0]) {
6390ad75a51eSRichard Henderson gen_helper_uitof_s(arg32[0].out, tcg_env, arg[1].in, scale);
6391cfa9f051SMax Filippov } else {
6392ad75a51eSRichard Henderson gen_helper_itof_s(arg32[0].out, tcg_env, arg[1].in, scale);
6393cfa9f051SMax Filippov }
6394cfa9f051SMax Filippov put_f32_o1(arg, arg32, 0);
6395cfa9f051SMax Filippov }
6396cfa9f051SMax Filippov
translate_ftoi_d(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])6397cfa9f051SMax Filippov static void translate_ftoi_d(DisasContext *dc, const OpcodeArg arg[],
6398cfa9f051SMax Filippov const uint32_t par[])
6399cfa9f051SMax Filippov {
6400867e354cSMax Filippov TCGv_i32 rounding_mode = tcg_constant_i32(par[0]);
6401867e354cSMax Filippov TCGv_i32 scale = tcg_constant_i32(arg[2].imm);
6402cfa9f051SMax Filippov
6403cfa9f051SMax Filippov if (par[1]) {
6404ad75a51eSRichard Henderson gen_helper_ftoui_d(arg[0].out, tcg_env, arg[1].in,
6405cfa9f051SMax Filippov rounding_mode, scale);
6406cfa9f051SMax Filippov } else {
6407ad75a51eSRichard Henderson gen_helper_ftoi_d(arg[0].out, tcg_env, arg[1].in,
6408cfa9f051SMax Filippov rounding_mode, scale);
6409cfa9f051SMax Filippov }
6410cfa9f051SMax Filippov }
6411cfa9f051SMax Filippov
translate_ftoi_s(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])6412b0b24bdcSMax Filippov static void translate_ftoi_s(DisasContext *dc, const OpcodeArg arg[],
6413c04e1692SMax Filippov const uint32_t par[])
6414c04e1692SMax Filippov {
6415867e354cSMax Filippov TCGv_i32 rounding_mode = tcg_constant_i32(par[0]);
6416867e354cSMax Filippov TCGv_i32 scale = tcg_constant_i32(arg[2].imm);
6417cfa9f051SMax Filippov OpcodeArg arg32[2];
6418c04e1692SMax Filippov
6419cfa9f051SMax Filippov get_f32_i1(arg, arg32, 1);
6420c04e1692SMax Filippov if (par[1]) {
6421ad75a51eSRichard Henderson gen_helper_ftoui_s(arg[0].out, tcg_env, arg32[1].in,
6422c04e1692SMax Filippov rounding_mode, scale);
6423c04e1692SMax Filippov } else {
6424ad75a51eSRichard Henderson gen_helper_ftoi_s(arg[0].out, tcg_env, arg32[1].in,
6425c04e1692SMax Filippov rounding_mode, scale);
6426c04e1692SMax Filippov }
6427cfa9f051SMax Filippov put_f32_i1(arg, arg32, 1);
6428c04e1692SMax Filippov }
6429c04e1692SMax Filippov
translate_ldsti(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])6430b0b24bdcSMax Filippov static void translate_ldsti(DisasContext *dc, const OpcodeArg arg[],
6431c04e1692SMax Filippov const uint32_t par[])
6432c04e1692SMax Filippov {
6433c04e1692SMax Filippov TCGv_i32 addr = tcg_temp_new_i32();
6434583e6a5fSMax Filippov MemOp mop;
6435c04e1692SMax Filippov
6436b0b24bdcSMax Filippov tcg_gen_addi_i32(addr, arg[1].in, arg[2].imm);
6437583e6a5fSMax Filippov mop = gen_load_store_alignment(dc, MO_TEUL, addr);
6438c04e1692SMax Filippov if (par[0]) {
6439583e6a5fSMax Filippov tcg_gen_qemu_st_tl(arg[0].in, addr, dc->cring, mop);
6440c04e1692SMax Filippov } else {
6441583e6a5fSMax Filippov tcg_gen_qemu_ld_tl(arg[0].out, addr, dc->cring, mop);
6442c04e1692SMax Filippov }
6443c04e1692SMax Filippov if (par[1]) {
6444b0b24bdcSMax Filippov tcg_gen_mov_i32(arg[1].out, addr);
6445c04e1692SMax Filippov }
6446c04e1692SMax Filippov }
6447c04e1692SMax Filippov
translate_ldstx(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])6448b0b24bdcSMax Filippov static void translate_ldstx(DisasContext *dc, const OpcodeArg arg[],
6449c04e1692SMax Filippov const uint32_t par[])
6450c04e1692SMax Filippov {
6451c04e1692SMax Filippov TCGv_i32 addr = tcg_temp_new_i32();
6452583e6a5fSMax Filippov MemOp mop;
6453c04e1692SMax Filippov
6454b0b24bdcSMax Filippov tcg_gen_add_i32(addr, arg[1].in, arg[2].in);
6455583e6a5fSMax Filippov mop = gen_load_store_alignment(dc, MO_TEUL, addr);
6456c04e1692SMax Filippov if (par[0]) {
6457583e6a5fSMax Filippov tcg_gen_qemu_st_tl(arg[0].in, addr, dc->cring, mop);
6458c04e1692SMax Filippov } else {
6459583e6a5fSMax Filippov tcg_gen_qemu_ld_tl(arg[0].out, addr, dc->cring, mop);
6460c04e1692SMax Filippov }
6461c04e1692SMax Filippov if (par[1]) {
6462b0b24bdcSMax Filippov tcg_gen_mov_i32(arg[1].out, addr);
6463c04e1692SMax Filippov }
6464c04e1692SMax Filippov }
6465c04e1692SMax Filippov
translate_fpu2k_madd_s(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])64665680f207SMax Filippov static void translate_fpu2k_madd_s(DisasContext *dc, const OpcodeArg arg[],
6467c04e1692SMax Filippov const uint32_t par[])
6468c04e1692SMax Filippov {
6469ad75a51eSRichard Henderson gen_helper_fpu2k_madd_s(arg[0].out, tcg_env,
6470b0b24bdcSMax Filippov arg[0].in, arg[1].in, arg[2].in);
6471c04e1692SMax Filippov }
6472c04e1692SMax Filippov
translate_mov_d(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])6473cfa9f051SMax Filippov static void translate_mov_d(DisasContext *dc, const OpcodeArg arg[],
6474cfa9f051SMax Filippov const uint32_t par[])
6475cfa9f051SMax Filippov {
6476cfa9f051SMax Filippov tcg_gen_mov_i64(arg[0].out, arg[1].in);
6477cfa9f051SMax Filippov }
6478cfa9f051SMax Filippov
translate_mov_s(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])6479b0b24bdcSMax Filippov static void translate_mov_s(DisasContext *dc, const OpcodeArg arg[],
6480c04e1692SMax Filippov const uint32_t par[])
6481c04e1692SMax Filippov {
6482cfa9f051SMax Filippov if (arg[0].num_bits == 32) {
6483b0b24bdcSMax Filippov tcg_gen_mov_i32(arg[0].out, arg[1].in);
6484cfa9f051SMax Filippov } else {
6485cfa9f051SMax Filippov tcg_gen_mov_i64(arg[0].out, arg[1].in);
6486cfa9f051SMax Filippov }
6487cfa9f051SMax Filippov }
6488cfa9f051SMax Filippov
translate_movcond_d(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])6489cfa9f051SMax Filippov static void translate_movcond_d(DisasContext *dc, const OpcodeArg arg[],
6490cfa9f051SMax Filippov const uint32_t par[])
6491cfa9f051SMax Filippov {
64922b570a17SMax Filippov TCGv_i64 zero = tcg_constant_i64(0);
6493cfa9f051SMax Filippov TCGv_i64 arg2 = tcg_temp_new_i64();
6494cfa9f051SMax Filippov
6495cfa9f051SMax Filippov tcg_gen_ext_i32_i64(arg2, arg[2].in);
6496cfa9f051SMax Filippov tcg_gen_movcond_i64(par[0], arg[0].out,
6497cfa9f051SMax Filippov arg2, zero,
6498cfa9f051SMax Filippov arg[1].in, arg[0].in);
6499c04e1692SMax Filippov }
6500c04e1692SMax Filippov
translate_movcond_s(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])6501b0b24bdcSMax Filippov static void translate_movcond_s(DisasContext *dc, const OpcodeArg arg[],
6502c04e1692SMax Filippov const uint32_t par[])
6503c04e1692SMax Filippov {
6504cfa9f051SMax Filippov if (arg[0].num_bits == 32) {
65052b570a17SMax Filippov TCGv_i32 zero = tcg_constant_i32(0);
6506c04e1692SMax Filippov
6507b0b24bdcSMax Filippov tcg_gen_movcond_i32(par[0], arg[0].out,
6508b0b24bdcSMax Filippov arg[2].in, zero,
6509b0b24bdcSMax Filippov arg[1].in, arg[0].in);
6510cfa9f051SMax Filippov } else {
6511cfa9f051SMax Filippov translate_movcond_d(dc, arg, par);
6512cfa9f051SMax Filippov }
6513cfa9f051SMax Filippov }
6514cfa9f051SMax Filippov
translate_movp_d(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])6515cfa9f051SMax Filippov static void translate_movp_d(DisasContext *dc, const OpcodeArg arg[],
6516cfa9f051SMax Filippov const uint32_t par[])
6517cfa9f051SMax Filippov {
65182b570a17SMax Filippov TCGv_i64 zero = tcg_constant_i64(0);
6519cfa9f051SMax Filippov TCGv_i32 tmp1 = tcg_temp_new_i32();
6520cfa9f051SMax Filippov TCGv_i64 tmp2 = tcg_temp_new_i64();
6521cfa9f051SMax Filippov
6522cfa9f051SMax Filippov tcg_gen_andi_i32(tmp1, arg[2].in, 1 << arg[2].imm);
6523cfa9f051SMax Filippov tcg_gen_extu_i32_i64(tmp2, tmp1);
6524cfa9f051SMax Filippov tcg_gen_movcond_i64(par[0],
6525cfa9f051SMax Filippov arg[0].out, tmp2, zero,
6526cfa9f051SMax Filippov arg[1].in, arg[0].in);
6527c04e1692SMax Filippov }
6528c04e1692SMax Filippov
translate_movp_s(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])6529b0b24bdcSMax Filippov static void translate_movp_s(DisasContext *dc, const OpcodeArg arg[],
6530c04e1692SMax Filippov const uint32_t par[])
6531c04e1692SMax Filippov {
6532cfa9f051SMax Filippov if (arg[0].num_bits == 32) {
65332b570a17SMax Filippov TCGv_i32 zero = tcg_constant_i32(0);
6534c04e1692SMax Filippov TCGv_i32 tmp = tcg_temp_new_i32();
6535c04e1692SMax Filippov
6536575e962aSMax Filippov tcg_gen_andi_i32(tmp, arg[2].in, 1 << arg[2].imm);
6537c04e1692SMax Filippov tcg_gen_movcond_i32(par[0],
6538b0b24bdcSMax Filippov arg[0].out, tmp, zero,
6539b0b24bdcSMax Filippov arg[1].in, arg[0].in);
6540cfa9f051SMax Filippov } else {
6541cfa9f051SMax Filippov translate_movp_d(dc, arg, par);
6542cfa9f051SMax Filippov }
6543c04e1692SMax Filippov }
6544c04e1692SMax Filippov
translate_fpu2k_mul_s(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])65455680f207SMax Filippov static void translate_fpu2k_mul_s(DisasContext *dc, const OpcodeArg arg[],
6546c04e1692SMax Filippov const uint32_t par[])
6547c04e1692SMax Filippov {
6548ad75a51eSRichard Henderson gen_helper_fpu2k_mul_s(arg[0].out, tcg_env,
6549b0b24bdcSMax Filippov arg[1].in, arg[2].in);
6550c04e1692SMax Filippov }
6551c04e1692SMax Filippov
translate_fpu2k_msub_s(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])65525680f207SMax Filippov static void translate_fpu2k_msub_s(DisasContext *dc, const OpcodeArg arg[],
6553c04e1692SMax Filippov const uint32_t par[])
6554c04e1692SMax Filippov {
6555ad75a51eSRichard Henderson gen_helper_fpu2k_msub_s(arg[0].out, tcg_env,
6556b0b24bdcSMax Filippov arg[0].in, arg[1].in, arg[2].in);
6557c04e1692SMax Filippov }
6558c04e1692SMax Filippov
translate_neg_d(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])6559cfa9f051SMax Filippov static void translate_neg_d(DisasContext *dc, const OpcodeArg arg[],
6560cfa9f051SMax Filippov const uint32_t par[])
6561cfa9f051SMax Filippov {
6562cfa9f051SMax Filippov gen_helper_neg_d(arg[0].out, arg[1].in);
6563cfa9f051SMax Filippov }
6564cfa9f051SMax Filippov
translate_neg_s(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])6565b0b24bdcSMax Filippov static void translate_neg_s(DisasContext *dc, const OpcodeArg arg[],
6566c04e1692SMax Filippov const uint32_t par[])
6567c04e1692SMax Filippov {
6568cfa9f051SMax Filippov OpcodeArg arg32[2];
6569cfa9f051SMax Filippov
6570cfa9f051SMax Filippov get_f32_o1_i1(arg, arg32, 0, 1);
6571cfa9f051SMax Filippov gen_helper_neg_s(arg32[0].out, arg32[1].in);
6572cfa9f051SMax Filippov put_f32_o1_i1(arg, arg32, 0, 1);
6573cfa9f051SMax Filippov }
6574cfa9f051SMax Filippov
translate_rfr_d(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])6575cfa9f051SMax Filippov static void translate_rfr_d(DisasContext *dc, const OpcodeArg arg[],
6576cfa9f051SMax Filippov const uint32_t par[])
6577cfa9f051SMax Filippov {
6578cfa9f051SMax Filippov tcg_gen_extrh_i64_i32(arg[0].out, arg[1].in);
6579c04e1692SMax Filippov }
6580c04e1692SMax Filippov
translate_rfr_s(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])6581b0b24bdcSMax Filippov static void translate_rfr_s(DisasContext *dc, const OpcodeArg arg[],
6582c04e1692SMax Filippov const uint32_t par[])
6583c04e1692SMax Filippov {
6584cfa9f051SMax Filippov if (arg[1].num_bits == 32) {
6585b0b24bdcSMax Filippov tcg_gen_mov_i32(arg[0].out, arg[1].in);
6586cfa9f051SMax Filippov } else {
6587cfa9f051SMax Filippov tcg_gen_extrl_i64_i32(arg[0].out, arg[1].in);
6588cfa9f051SMax Filippov }
6589c04e1692SMax Filippov }
6590c04e1692SMax Filippov
translate_fpu2k_sub_s(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])65915680f207SMax Filippov static void translate_fpu2k_sub_s(DisasContext *dc, const OpcodeArg arg[],
6592c04e1692SMax Filippov const uint32_t par[])
6593c04e1692SMax Filippov {
6594ad75a51eSRichard Henderson gen_helper_fpu2k_sub_s(arg[0].out, tcg_env,
6595b0b24bdcSMax Filippov arg[1].in, arg[2].in);
6596c04e1692SMax Filippov }
6597c04e1692SMax Filippov
translate_wfr_d(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])6598cfa9f051SMax Filippov static void translate_wfr_d(DisasContext *dc, const OpcodeArg arg[],
6599cfa9f051SMax Filippov const uint32_t par[])
6600cfa9f051SMax Filippov {
6601cfa9f051SMax Filippov tcg_gen_concat_i32_i64(arg[0].out, arg[2].in, arg[1].in);
6602cfa9f051SMax Filippov }
6603cfa9f051SMax Filippov
translate_wfr_s(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])6604b0b24bdcSMax Filippov static void translate_wfr_s(DisasContext *dc, const OpcodeArg arg[],
6605c04e1692SMax Filippov const uint32_t par[])
6606c04e1692SMax Filippov {
6607cfa9f051SMax Filippov if (arg[0].num_bits == 32) {
6608b0b24bdcSMax Filippov tcg_gen_mov_i32(arg[0].out, arg[1].in);
6609cfa9f051SMax Filippov } else {
6610cfa9f051SMax Filippov tcg_gen_ext_i32_i64(arg[0].out, arg[1].in);
6611cfa9f051SMax Filippov }
6612c04e1692SMax Filippov }
6613c04e1692SMax Filippov
translate_wur_fpu2k_fcr(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])6614ff35a7d1SMax Filippov static void translate_wur_fpu2k_fcr(DisasContext *dc, const OpcodeArg arg[],
6615ff35a7d1SMax Filippov const uint32_t par[])
6616ff35a7d1SMax Filippov {
6617ad75a51eSRichard Henderson gen_helper_wur_fpu2k_fcr(tcg_env, arg[0].in);
6618ff35a7d1SMax Filippov }
6619ff35a7d1SMax Filippov
translate_wur_fpu2k_fsr(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])6620ff35a7d1SMax Filippov static void translate_wur_fpu2k_fsr(DisasContext *dc, const OpcodeArg arg[],
6621ff35a7d1SMax Filippov const uint32_t par[])
6622ff35a7d1SMax Filippov {
6623ff35a7d1SMax Filippov tcg_gen_andi_i32(cpu_UR[par[0]], arg[0].in, 0xffffff80);
6624ff35a7d1SMax Filippov }
6625ff35a7d1SMax Filippov
6626c04e1692SMax Filippov static const XtensaOpcodeOps fpu2000_ops[] = {
6627c04e1692SMax Filippov {
6628c04e1692SMax Filippov .name = "abs.s",
6629c04e1692SMax Filippov .translate = translate_abs_s,
6630582fef0fSMax Filippov .coprocessor = 0x1,
6631c04e1692SMax Filippov }, {
6632c04e1692SMax Filippov .name = "add.s",
66335680f207SMax Filippov .translate = translate_fpu2k_add_s,
6634582fef0fSMax Filippov .coprocessor = 0x1,
6635c04e1692SMax Filippov }, {
6636c04e1692SMax Filippov .name = "ceil.s",
6637c04e1692SMax Filippov .translate = translate_ftoi_s,
6638c04e1692SMax Filippov .par = (const uint32_t[]){float_round_up, false},
6639582fef0fSMax Filippov .coprocessor = 0x1,
6640c04e1692SMax Filippov }, {
6641c04e1692SMax Filippov .name = "float.s",
6642c04e1692SMax Filippov .translate = translate_float_s,
6643c04e1692SMax Filippov .par = (const uint32_t[]){false},
6644582fef0fSMax Filippov .coprocessor = 0x1,
6645c04e1692SMax Filippov }, {
6646c04e1692SMax Filippov .name = "floor.s",
6647c04e1692SMax Filippov .translate = translate_ftoi_s,
6648c04e1692SMax Filippov .par = (const uint32_t[]){float_round_down, false},
6649582fef0fSMax Filippov .coprocessor = 0x1,
6650c04e1692SMax Filippov }, {
6651c04e1692SMax Filippov .name = "lsi",
6652c04e1692SMax Filippov .translate = translate_ldsti,
6653c04e1692SMax Filippov .par = (const uint32_t[]){false, false},
6654068e538aSMax Filippov .op_flags = XTENSA_OP_LOAD,
6655582fef0fSMax Filippov .coprocessor = 0x1,
6656c04e1692SMax Filippov }, {
6657c04e1692SMax Filippov .name = "lsiu",
6658c04e1692SMax Filippov .translate = translate_ldsti,
6659c04e1692SMax Filippov .par = (const uint32_t[]){false, true},
6660068e538aSMax Filippov .op_flags = XTENSA_OP_LOAD,
6661582fef0fSMax Filippov .coprocessor = 0x1,
6662c04e1692SMax Filippov }, {
6663c04e1692SMax Filippov .name = "lsx",
6664c04e1692SMax Filippov .translate = translate_ldstx,
6665c04e1692SMax Filippov .par = (const uint32_t[]){false, false},
6666068e538aSMax Filippov .op_flags = XTENSA_OP_LOAD,
6667582fef0fSMax Filippov .coprocessor = 0x1,
6668c04e1692SMax Filippov }, {
6669c04e1692SMax Filippov .name = "lsxu",
6670c04e1692SMax Filippov .translate = translate_ldstx,
6671c04e1692SMax Filippov .par = (const uint32_t[]){false, true},
6672068e538aSMax Filippov .op_flags = XTENSA_OP_LOAD,
6673582fef0fSMax Filippov .coprocessor = 0x1,
6674c04e1692SMax Filippov }, {
6675c04e1692SMax Filippov .name = "madd.s",
66765680f207SMax Filippov .translate = translate_fpu2k_madd_s,
6677582fef0fSMax Filippov .coprocessor = 0x1,
6678c04e1692SMax Filippov }, {
6679c04e1692SMax Filippov .name = "mov.s",
6680c04e1692SMax Filippov .translate = translate_mov_s,
6681582fef0fSMax Filippov .coprocessor = 0x1,
6682c04e1692SMax Filippov }, {
6683c04e1692SMax Filippov .name = "moveqz.s",
6684c04e1692SMax Filippov .translate = translate_movcond_s,
6685c04e1692SMax Filippov .par = (const uint32_t[]){TCG_COND_EQ},
6686582fef0fSMax Filippov .coprocessor = 0x1,
6687c04e1692SMax Filippov }, {
6688c04e1692SMax Filippov .name = "movf.s",
6689c04e1692SMax Filippov .translate = translate_movp_s,
6690c04e1692SMax Filippov .par = (const uint32_t[]){TCG_COND_EQ},
6691582fef0fSMax Filippov .coprocessor = 0x1,
6692c04e1692SMax Filippov }, {
6693c04e1692SMax Filippov .name = "movgez.s",
6694c04e1692SMax Filippov .translate = translate_movcond_s,
6695c04e1692SMax Filippov .par = (const uint32_t[]){TCG_COND_GE},
6696582fef0fSMax Filippov .coprocessor = 0x1,
6697c04e1692SMax Filippov }, {
6698c04e1692SMax Filippov .name = "movltz.s",
6699c04e1692SMax Filippov .translate = translate_movcond_s,
6700c04e1692SMax Filippov .par = (const uint32_t[]){TCG_COND_LT},
6701582fef0fSMax Filippov .coprocessor = 0x1,
6702c04e1692SMax Filippov }, {
6703c04e1692SMax Filippov .name = "movnez.s",
6704c04e1692SMax Filippov .translate = translate_movcond_s,
6705c04e1692SMax Filippov .par = (const uint32_t[]){TCG_COND_NE},
6706582fef0fSMax Filippov .coprocessor = 0x1,
6707c04e1692SMax Filippov }, {
6708c04e1692SMax Filippov .name = "movt.s",
6709c04e1692SMax Filippov .translate = translate_movp_s,
6710c04e1692SMax Filippov .par = (const uint32_t[]){TCG_COND_NE},
6711582fef0fSMax Filippov .coprocessor = 0x1,
6712c04e1692SMax Filippov }, {
6713c04e1692SMax Filippov .name = "msub.s",
67145680f207SMax Filippov .translate = translate_fpu2k_msub_s,
6715582fef0fSMax Filippov .coprocessor = 0x1,
6716c04e1692SMax Filippov }, {
6717c04e1692SMax Filippov .name = "mul.s",
67185680f207SMax Filippov .translate = translate_fpu2k_mul_s,
6719582fef0fSMax Filippov .coprocessor = 0x1,
6720c04e1692SMax Filippov }, {
6721c04e1692SMax Filippov .name = "neg.s",
6722c04e1692SMax Filippov .translate = translate_neg_s,
6723582fef0fSMax Filippov .coprocessor = 0x1,
6724c04e1692SMax Filippov }, {
6725c04e1692SMax Filippov .name = "oeq.s",
6726c04e1692SMax Filippov .translate = translate_compare_s,
6727c04e1692SMax Filippov .par = (const uint32_t[]){COMPARE_OEQ},
6728582fef0fSMax Filippov .coprocessor = 0x1,
6729c04e1692SMax Filippov }, {
6730c04e1692SMax Filippov .name = "ole.s",
6731c04e1692SMax Filippov .translate = translate_compare_s,
6732c04e1692SMax Filippov .par = (const uint32_t[]){COMPARE_OLE},
6733582fef0fSMax Filippov .coprocessor = 0x1,
6734c04e1692SMax Filippov }, {
6735c04e1692SMax Filippov .name = "olt.s",
6736c04e1692SMax Filippov .translate = translate_compare_s,
6737c04e1692SMax Filippov .par = (const uint32_t[]){COMPARE_OLT},
6738582fef0fSMax Filippov .coprocessor = 0x1,
6739c04e1692SMax Filippov }, {
6740e8e05fd4SMax Filippov .name = "rfr",
6741c04e1692SMax Filippov .translate = translate_rfr_s,
6742582fef0fSMax Filippov .coprocessor = 0x1,
6743c04e1692SMax Filippov }, {
6744c04e1692SMax Filippov .name = "round.s",
6745c04e1692SMax Filippov .translate = translate_ftoi_s,
6746c04e1692SMax Filippov .par = (const uint32_t[]){float_round_nearest_even, false},
6747582fef0fSMax Filippov .coprocessor = 0x1,
6748c04e1692SMax Filippov }, {
6749ff35a7d1SMax Filippov .name = "rur.fcr",
6750ff35a7d1SMax Filippov .translate = translate_rur,
6751ff35a7d1SMax Filippov .par = (const uint32_t[]){FCR},
6752ff35a7d1SMax Filippov .coprocessor = 0x1,
6753ff35a7d1SMax Filippov }, {
6754ff35a7d1SMax Filippov .name = "rur.fsr",
6755ff35a7d1SMax Filippov .translate = translate_rur,
6756ff35a7d1SMax Filippov .par = (const uint32_t[]){FSR},
6757ff35a7d1SMax Filippov .coprocessor = 0x1,
6758ff35a7d1SMax Filippov }, {
6759c04e1692SMax Filippov .name = "ssi",
6760c04e1692SMax Filippov .translate = translate_ldsti,
6761c04e1692SMax Filippov .par = (const uint32_t[]){true, false},
6762068e538aSMax Filippov .op_flags = XTENSA_OP_STORE,
6763582fef0fSMax Filippov .coprocessor = 0x1,
6764c04e1692SMax Filippov }, {
6765c04e1692SMax Filippov .name = "ssiu",
6766c04e1692SMax Filippov .translate = translate_ldsti,
6767c04e1692SMax Filippov .par = (const uint32_t[]){true, true},
6768068e538aSMax Filippov .op_flags = XTENSA_OP_STORE,
6769582fef0fSMax Filippov .coprocessor = 0x1,
6770c04e1692SMax Filippov }, {
6771c04e1692SMax Filippov .name = "ssx",
6772c04e1692SMax Filippov .translate = translate_ldstx,
6773c04e1692SMax Filippov .par = (const uint32_t[]){true, false},
6774068e538aSMax Filippov .op_flags = XTENSA_OP_STORE,
6775582fef0fSMax Filippov .coprocessor = 0x1,
6776c04e1692SMax Filippov }, {
6777c04e1692SMax Filippov .name = "ssxu",
6778c04e1692SMax Filippov .translate = translate_ldstx,
6779c04e1692SMax Filippov .par = (const uint32_t[]){true, true},
6780068e538aSMax Filippov .op_flags = XTENSA_OP_STORE,
6781582fef0fSMax Filippov .coprocessor = 0x1,
6782c04e1692SMax Filippov }, {
6783c04e1692SMax Filippov .name = "sub.s",
67845680f207SMax Filippov .translate = translate_fpu2k_sub_s,
6785582fef0fSMax Filippov .coprocessor = 0x1,
6786c04e1692SMax Filippov }, {
6787c04e1692SMax Filippov .name = "trunc.s",
6788c04e1692SMax Filippov .translate = translate_ftoi_s,
6789c04e1692SMax Filippov .par = (const uint32_t[]){float_round_to_zero, false},
6790582fef0fSMax Filippov .coprocessor = 0x1,
6791c04e1692SMax Filippov }, {
6792c04e1692SMax Filippov .name = "ueq.s",
6793c04e1692SMax Filippov .translate = translate_compare_s,
6794c04e1692SMax Filippov .par = (const uint32_t[]){COMPARE_UEQ},
6795582fef0fSMax Filippov .coprocessor = 0x1,
6796c04e1692SMax Filippov }, {
6797c04e1692SMax Filippov .name = "ufloat.s",
6798c04e1692SMax Filippov .translate = translate_float_s,
6799c04e1692SMax Filippov .par = (const uint32_t[]){true},
6800582fef0fSMax Filippov .coprocessor = 0x1,
6801c04e1692SMax Filippov }, {
6802c04e1692SMax Filippov .name = "ule.s",
6803c04e1692SMax Filippov .translate = translate_compare_s,
6804c04e1692SMax Filippov .par = (const uint32_t[]){COMPARE_ULE},
6805582fef0fSMax Filippov .coprocessor = 0x1,
6806c04e1692SMax Filippov }, {
6807c04e1692SMax Filippov .name = "ult.s",
6808c04e1692SMax Filippov .translate = translate_compare_s,
6809c04e1692SMax Filippov .par = (const uint32_t[]){COMPARE_ULT},
6810582fef0fSMax Filippov .coprocessor = 0x1,
6811c04e1692SMax Filippov }, {
6812c04e1692SMax Filippov .name = "un.s",
6813c04e1692SMax Filippov .translate = translate_compare_s,
6814c04e1692SMax Filippov .par = (const uint32_t[]){COMPARE_UN},
6815582fef0fSMax Filippov .coprocessor = 0x1,
6816c04e1692SMax Filippov }, {
6817c04e1692SMax Filippov .name = "utrunc.s",
6818c04e1692SMax Filippov .translate = translate_ftoi_s,
6819c04e1692SMax Filippov .par = (const uint32_t[]){float_round_to_zero, true},
6820582fef0fSMax Filippov .coprocessor = 0x1,
6821c04e1692SMax Filippov }, {
6822e8e05fd4SMax Filippov .name = "wfr",
6823c04e1692SMax Filippov .translate = translate_wfr_s,
6824582fef0fSMax Filippov .coprocessor = 0x1,
6825ff35a7d1SMax Filippov }, {
6826ff35a7d1SMax Filippov .name = "wur.fcr",
6827ff35a7d1SMax Filippov .translate = translate_wur_fpu2k_fcr,
6828ff35a7d1SMax Filippov .par = (const uint32_t[]){FCR},
6829ff35a7d1SMax Filippov .coprocessor = 0x1,
6830ff35a7d1SMax Filippov }, {
6831ff35a7d1SMax Filippov .name = "wur.fsr",
6832ff35a7d1SMax Filippov .translate = translate_wur_fpu2k_fsr,
6833ff35a7d1SMax Filippov .par = (const uint32_t[]){FSR},
6834ff35a7d1SMax Filippov .coprocessor = 0x1,
6835c04e1692SMax Filippov },
6836c04e1692SMax Filippov };
6837c04e1692SMax Filippov
6838c04e1692SMax Filippov const XtensaOpcodeTranslators xtensa_fpu2000_opcodes = {
6839c04e1692SMax Filippov .num_opcodes = ARRAY_SIZE(fpu2000_ops),
6840c04e1692SMax Filippov .opcode = fpu2000_ops,
6841c04e1692SMax Filippov };
6842cfa9f051SMax Filippov
translate_add_d(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])6843cfa9f051SMax Filippov static void translate_add_d(DisasContext *dc, const OpcodeArg arg[],
6844cfa9f051SMax Filippov const uint32_t par[])
6845cfa9f051SMax Filippov {
6846ad75a51eSRichard Henderson gen_helper_add_d(arg[0].out, tcg_env, arg[1].in, arg[2].in);
6847cfa9f051SMax Filippov }
6848cfa9f051SMax Filippov
translate_add_s(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])6849cfa9f051SMax Filippov static void translate_add_s(DisasContext *dc, const OpcodeArg arg[],
6850cfa9f051SMax Filippov const uint32_t par[])
6851cfa9f051SMax Filippov {
6852cfa9f051SMax Filippov if (option_enabled(dc, XTENSA_OPTION_DFPU_SINGLE_ONLY)) {
6853ad75a51eSRichard Henderson gen_helper_fpu2k_add_s(arg[0].out, tcg_env,
6854cfa9f051SMax Filippov arg[1].in, arg[2].in);
6855cfa9f051SMax Filippov } else {
6856cfa9f051SMax Filippov OpcodeArg arg32[3];
6857cfa9f051SMax Filippov
6858cfa9f051SMax Filippov get_f32_o1_i2(arg, arg32, 0, 1, 2);
6859ad75a51eSRichard Henderson gen_helper_add_s(arg32[0].out, tcg_env, arg32[1].in, arg32[2].in);
6860cfa9f051SMax Filippov put_f32_o1_i2(arg, arg32, 0, 1, 2);
6861cfa9f051SMax Filippov }
6862cfa9f051SMax Filippov }
6863cfa9f051SMax Filippov
translate_cvtd_s(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])6864cfa9f051SMax Filippov static void translate_cvtd_s(DisasContext *dc, const OpcodeArg arg[],
6865cfa9f051SMax Filippov const uint32_t par[])
6866cfa9f051SMax Filippov {
6867cfa9f051SMax Filippov TCGv_i32 v = tcg_temp_new_i32();
6868cfa9f051SMax Filippov
6869cfa9f051SMax Filippov tcg_gen_extrl_i64_i32(v, arg[1].in);
6870ad75a51eSRichard Henderson gen_helper_cvtd_s(arg[0].out, tcg_env, v);
6871cfa9f051SMax Filippov }
6872cfa9f051SMax Filippov
translate_cvts_d(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])6873cfa9f051SMax Filippov static void translate_cvts_d(DisasContext *dc, const OpcodeArg arg[],
6874cfa9f051SMax Filippov const uint32_t par[])
6875cfa9f051SMax Filippov {
6876cfa9f051SMax Filippov TCGv_i32 v = tcg_temp_new_i32();
6877cfa9f051SMax Filippov
6878ad75a51eSRichard Henderson gen_helper_cvts_d(v, tcg_env, arg[1].in);
6879cfa9f051SMax Filippov tcg_gen_extu_i32_i64(arg[0].out, v);
6880cfa9f051SMax Filippov }
6881cfa9f051SMax Filippov
translate_ldsti_d(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])6882cfa9f051SMax Filippov static void translate_ldsti_d(DisasContext *dc, const OpcodeArg arg[],
6883cfa9f051SMax Filippov const uint32_t par[])
6884cfa9f051SMax Filippov {
6885cfa9f051SMax Filippov TCGv_i32 addr;
6886583e6a5fSMax Filippov MemOp mop;
6887cfa9f051SMax Filippov
6888cfa9f051SMax Filippov if (par[1]) {
6889cfa9f051SMax Filippov addr = tcg_temp_new_i32();
6890cfa9f051SMax Filippov tcg_gen_addi_i32(addr, arg[1].in, arg[2].imm);
6891cfa9f051SMax Filippov } else {
6892cfa9f051SMax Filippov addr = arg[1].in;
6893cfa9f051SMax Filippov }
6894fc313c64SFrédéric Pétrot mop = gen_load_store_alignment(dc, MO_TEUQ, addr);
6895cfa9f051SMax Filippov if (par[0]) {
6896583e6a5fSMax Filippov tcg_gen_qemu_st_i64(arg[0].in, addr, dc->cring, mop);
6897cfa9f051SMax Filippov } else {
6898583e6a5fSMax Filippov tcg_gen_qemu_ld_i64(arg[0].out, addr, dc->cring, mop);
6899cfa9f051SMax Filippov }
6900cfa9f051SMax Filippov if (par[2]) {
6901cfa9f051SMax Filippov if (par[1]) {
6902cfa9f051SMax Filippov tcg_gen_mov_i32(arg[1].out, addr);
6903cfa9f051SMax Filippov } else {
6904cfa9f051SMax Filippov tcg_gen_addi_i32(arg[1].out, arg[1].in, arg[2].imm);
6905cfa9f051SMax Filippov }
6906cfa9f051SMax Filippov }
6907cfa9f051SMax Filippov }
6908cfa9f051SMax Filippov
translate_ldsti_s(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])6909cfa9f051SMax Filippov static void translate_ldsti_s(DisasContext *dc, const OpcodeArg arg[],
6910cfa9f051SMax Filippov const uint32_t par[])
6911cfa9f051SMax Filippov {
6912cfa9f051SMax Filippov TCGv_i32 addr;
6913cfa9f051SMax Filippov OpcodeArg arg32[1];
6914583e6a5fSMax Filippov MemOp mop;
6915cfa9f051SMax Filippov
6916cfa9f051SMax Filippov if (par[1]) {
6917cfa9f051SMax Filippov addr = tcg_temp_new_i32();
6918cfa9f051SMax Filippov tcg_gen_addi_i32(addr, arg[1].in, arg[2].imm);
6919cfa9f051SMax Filippov } else {
6920cfa9f051SMax Filippov addr = arg[1].in;
6921cfa9f051SMax Filippov }
6922583e6a5fSMax Filippov mop = gen_load_store_alignment(dc, MO_TEUL, addr);
6923cfa9f051SMax Filippov if (par[0]) {
6924cfa9f051SMax Filippov get_f32_i1(arg, arg32, 0);
6925583e6a5fSMax Filippov tcg_gen_qemu_st_tl(arg32[0].in, addr, dc->cring, mop);
6926cfa9f051SMax Filippov put_f32_i1(arg, arg32, 0);
6927cfa9f051SMax Filippov } else {
6928cfa9f051SMax Filippov get_f32_o1(arg, arg32, 0);
6929583e6a5fSMax Filippov tcg_gen_qemu_ld_tl(arg32[0].out, addr, dc->cring, mop);
6930cfa9f051SMax Filippov put_f32_o1(arg, arg32, 0);
6931cfa9f051SMax Filippov }
6932cfa9f051SMax Filippov if (par[2]) {
6933cfa9f051SMax Filippov if (par[1]) {
6934cfa9f051SMax Filippov tcg_gen_mov_i32(arg[1].out, addr);
6935cfa9f051SMax Filippov } else {
6936cfa9f051SMax Filippov tcg_gen_addi_i32(arg[1].out, arg[1].in, arg[2].imm);
6937cfa9f051SMax Filippov }
6938cfa9f051SMax Filippov }
6939cfa9f051SMax Filippov }
6940cfa9f051SMax Filippov
translate_ldstx_d(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])6941cfa9f051SMax Filippov static void translate_ldstx_d(DisasContext *dc, const OpcodeArg arg[],
6942cfa9f051SMax Filippov const uint32_t par[])
6943cfa9f051SMax Filippov {
6944cfa9f051SMax Filippov TCGv_i32 addr;
6945583e6a5fSMax Filippov MemOp mop;
6946cfa9f051SMax Filippov
6947cfa9f051SMax Filippov if (par[1]) {
6948cfa9f051SMax Filippov addr = tcg_temp_new_i32();
6949cfa9f051SMax Filippov tcg_gen_add_i32(addr, arg[1].in, arg[2].in);
6950cfa9f051SMax Filippov } else {
6951cfa9f051SMax Filippov addr = arg[1].in;
6952cfa9f051SMax Filippov }
6953fc313c64SFrédéric Pétrot mop = gen_load_store_alignment(dc, MO_TEUQ, addr);
6954cfa9f051SMax Filippov if (par[0]) {
6955583e6a5fSMax Filippov tcg_gen_qemu_st_i64(arg[0].in, addr, dc->cring, mop);
6956cfa9f051SMax Filippov } else {
6957583e6a5fSMax Filippov tcg_gen_qemu_ld_i64(arg[0].out, addr, dc->cring, mop);
6958cfa9f051SMax Filippov }
6959cfa9f051SMax Filippov if (par[2]) {
6960cfa9f051SMax Filippov if (par[1]) {
6961cfa9f051SMax Filippov tcg_gen_mov_i32(arg[1].out, addr);
6962cfa9f051SMax Filippov } else {
6963cfa9f051SMax Filippov tcg_gen_add_i32(arg[1].out, arg[1].in, arg[2].in);
6964cfa9f051SMax Filippov }
6965cfa9f051SMax Filippov }
6966cfa9f051SMax Filippov }
6967cfa9f051SMax Filippov
translate_ldstx_s(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])6968cfa9f051SMax Filippov static void translate_ldstx_s(DisasContext *dc, const OpcodeArg arg[],
6969cfa9f051SMax Filippov const uint32_t par[])
6970cfa9f051SMax Filippov {
6971cfa9f051SMax Filippov TCGv_i32 addr;
6972cfa9f051SMax Filippov OpcodeArg arg32[1];
6973583e6a5fSMax Filippov MemOp mop;
6974cfa9f051SMax Filippov
6975cfa9f051SMax Filippov if (par[1]) {
6976cfa9f051SMax Filippov addr = tcg_temp_new_i32();
6977cfa9f051SMax Filippov tcg_gen_add_i32(addr, arg[1].in, arg[2].in);
6978cfa9f051SMax Filippov } else {
6979cfa9f051SMax Filippov addr = arg[1].in;
6980cfa9f051SMax Filippov }
6981583e6a5fSMax Filippov mop = gen_load_store_alignment(dc, MO_TEUL, addr);
6982cfa9f051SMax Filippov if (par[0]) {
6983cfa9f051SMax Filippov get_f32_i1(arg, arg32, 0);
6984583e6a5fSMax Filippov tcg_gen_qemu_st_tl(arg32[0].in, addr, dc->cring, mop);
6985cfa9f051SMax Filippov put_f32_i1(arg, arg32, 0);
6986cfa9f051SMax Filippov } else {
6987cfa9f051SMax Filippov get_f32_o1(arg, arg32, 0);
6988583e6a5fSMax Filippov tcg_gen_qemu_ld_tl(arg32[0].out, addr, dc->cring, mop);
6989cfa9f051SMax Filippov put_f32_o1(arg, arg32, 0);
6990cfa9f051SMax Filippov }
6991cfa9f051SMax Filippov if (par[2]) {
6992cfa9f051SMax Filippov if (par[1]) {
6993cfa9f051SMax Filippov tcg_gen_mov_i32(arg[1].out, addr);
6994cfa9f051SMax Filippov } else {
6995cfa9f051SMax Filippov tcg_gen_add_i32(arg[1].out, arg[1].in, arg[2].in);
6996cfa9f051SMax Filippov }
6997cfa9f051SMax Filippov }
6998cfa9f051SMax Filippov }
6999cfa9f051SMax Filippov
translate_madd_d(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])7000cfa9f051SMax Filippov static void translate_madd_d(DisasContext *dc, const OpcodeArg arg[],
7001cfa9f051SMax Filippov const uint32_t par[])
7002cfa9f051SMax Filippov {
7003ad75a51eSRichard Henderson gen_helper_madd_d(arg[0].out, tcg_env,
7004cfa9f051SMax Filippov arg[0].in, arg[1].in, arg[2].in);
7005cfa9f051SMax Filippov }
7006cfa9f051SMax Filippov
translate_madd_s(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])7007cfa9f051SMax Filippov static void translate_madd_s(DisasContext *dc, const OpcodeArg arg[],
7008cfa9f051SMax Filippov const uint32_t par[])
7009cfa9f051SMax Filippov {
7010cfa9f051SMax Filippov if (option_enabled(dc, XTENSA_OPTION_DFPU_SINGLE_ONLY)) {
7011ad75a51eSRichard Henderson gen_helper_fpu2k_madd_s(arg[0].out, tcg_env,
7012cfa9f051SMax Filippov arg[0].in, arg[1].in, arg[2].in);
7013cfa9f051SMax Filippov } else {
7014cfa9f051SMax Filippov OpcodeArg arg32[3];
7015cfa9f051SMax Filippov
7016cfa9f051SMax Filippov get_f32_o1_i3(arg, arg32, 0, 0, 1, 2);
7017ad75a51eSRichard Henderson gen_helper_madd_s(arg32[0].out, tcg_env,
7018cfa9f051SMax Filippov arg32[0].in, arg32[1].in, arg32[2].in);
7019cfa9f051SMax Filippov put_f32_o1_i3(arg, arg32, 0, 0, 1, 2);
7020cfa9f051SMax Filippov }
7021cfa9f051SMax Filippov }
7022cfa9f051SMax Filippov
translate_mul_d(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])7023cfa9f051SMax Filippov static void translate_mul_d(DisasContext *dc, const OpcodeArg arg[],
7024cfa9f051SMax Filippov const uint32_t par[])
7025cfa9f051SMax Filippov {
7026ad75a51eSRichard Henderson gen_helper_mul_d(arg[0].out, tcg_env, arg[1].in, arg[2].in);
7027cfa9f051SMax Filippov }
7028cfa9f051SMax Filippov
translate_mul_s(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])7029cfa9f051SMax Filippov static void translate_mul_s(DisasContext *dc, const OpcodeArg arg[],
7030cfa9f051SMax Filippov const uint32_t par[])
7031cfa9f051SMax Filippov {
7032cfa9f051SMax Filippov if (option_enabled(dc, XTENSA_OPTION_DFPU_SINGLE_ONLY)) {
7033ad75a51eSRichard Henderson gen_helper_fpu2k_mul_s(arg[0].out, tcg_env,
7034cfa9f051SMax Filippov arg[1].in, arg[2].in);
7035cfa9f051SMax Filippov } else {
7036cfa9f051SMax Filippov OpcodeArg arg32[3];
7037cfa9f051SMax Filippov
7038cfa9f051SMax Filippov get_f32_o1_i2(arg, arg32, 0, 1, 2);
7039ad75a51eSRichard Henderson gen_helper_mul_s(arg32[0].out, tcg_env, arg32[1].in, arg32[2].in);
7040cfa9f051SMax Filippov put_f32_o1_i2(arg, arg32, 0, 1, 2);
7041cfa9f051SMax Filippov }
7042cfa9f051SMax Filippov }
7043cfa9f051SMax Filippov
translate_msub_d(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])7044cfa9f051SMax Filippov static void translate_msub_d(DisasContext *dc, const OpcodeArg arg[],
7045cfa9f051SMax Filippov const uint32_t par[])
7046cfa9f051SMax Filippov {
7047ad75a51eSRichard Henderson gen_helper_msub_d(arg[0].out, tcg_env,
7048cfa9f051SMax Filippov arg[0].in, arg[1].in, arg[2].in);
7049cfa9f051SMax Filippov }
7050cfa9f051SMax Filippov
translate_msub_s(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])7051cfa9f051SMax Filippov static void translate_msub_s(DisasContext *dc, const OpcodeArg arg[],
7052cfa9f051SMax Filippov const uint32_t par[])
7053cfa9f051SMax Filippov {
7054cfa9f051SMax Filippov if (option_enabled(dc, XTENSA_OPTION_DFPU_SINGLE_ONLY)) {
7055ad75a51eSRichard Henderson gen_helper_fpu2k_msub_s(arg[0].out, tcg_env,
7056cfa9f051SMax Filippov arg[0].in, arg[1].in, arg[2].in);
7057cfa9f051SMax Filippov } else {
7058cfa9f051SMax Filippov OpcodeArg arg32[3];
7059cfa9f051SMax Filippov
7060cfa9f051SMax Filippov get_f32_o1_i3(arg, arg32, 0, 0, 1, 2);
7061ad75a51eSRichard Henderson gen_helper_msub_s(arg32[0].out, tcg_env,
7062cfa9f051SMax Filippov arg32[0].in, arg32[1].in, arg32[2].in);
7063cfa9f051SMax Filippov put_f32_o1_i3(arg, arg32, 0, 0, 1, 2);
7064cfa9f051SMax Filippov }
7065cfa9f051SMax Filippov }
7066cfa9f051SMax Filippov
translate_sub_d(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])7067cfa9f051SMax Filippov static void translate_sub_d(DisasContext *dc, const OpcodeArg arg[],
7068cfa9f051SMax Filippov const uint32_t par[])
7069cfa9f051SMax Filippov {
7070ad75a51eSRichard Henderson gen_helper_sub_d(arg[0].out, tcg_env, arg[1].in, arg[2].in);
7071cfa9f051SMax Filippov }
7072cfa9f051SMax Filippov
translate_sub_s(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])7073cfa9f051SMax Filippov static void translate_sub_s(DisasContext *dc, const OpcodeArg arg[],
7074cfa9f051SMax Filippov const uint32_t par[])
7075cfa9f051SMax Filippov {
7076cfa9f051SMax Filippov if (option_enabled(dc, XTENSA_OPTION_DFPU_SINGLE_ONLY)) {
7077ad75a51eSRichard Henderson gen_helper_fpu2k_sub_s(arg[0].out, tcg_env,
7078cfa9f051SMax Filippov arg[1].in, arg[2].in);
7079cfa9f051SMax Filippov } else {
7080cfa9f051SMax Filippov OpcodeArg arg32[3];
7081cfa9f051SMax Filippov
7082cfa9f051SMax Filippov get_f32_o1_i2(arg, arg32, 0, 1, 2);
7083ad75a51eSRichard Henderson gen_helper_sub_s(arg32[0].out, tcg_env, arg32[1].in, arg32[2].in);
7084cfa9f051SMax Filippov put_f32_o1_i2(arg, arg32, 0, 1, 2);
7085cfa9f051SMax Filippov }
7086cfa9f051SMax Filippov }
7087cfa9f051SMax Filippov
translate_mkdadj_d(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])7088f8c61370SMax Filippov static void translate_mkdadj_d(DisasContext *dc, const OpcodeArg arg[],
7089f8c61370SMax Filippov const uint32_t par[])
7090f8c61370SMax Filippov {
7091ad75a51eSRichard Henderson gen_helper_mkdadj_d(arg[0].out, tcg_env, arg[0].in, arg[1].in);
7092f8c61370SMax Filippov }
7093f8c61370SMax Filippov
translate_mkdadj_s(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])7094f8c61370SMax Filippov static void translate_mkdadj_s(DisasContext *dc, const OpcodeArg arg[],
7095f8c61370SMax Filippov const uint32_t par[])
7096f8c61370SMax Filippov {
7097f8c61370SMax Filippov OpcodeArg arg32[2];
7098f8c61370SMax Filippov
7099f8c61370SMax Filippov get_f32_o1_i2(arg, arg32, 0, 0, 1);
7100ad75a51eSRichard Henderson gen_helper_mkdadj_s(arg32[0].out, tcg_env, arg32[0].in, arg32[1].in);
7101f8c61370SMax Filippov put_f32_o1_i2(arg, arg32, 0, 0, 1);
7102f8c61370SMax Filippov }
7103f8c61370SMax Filippov
translate_mksadj_d(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])7104f8c61370SMax Filippov static void translate_mksadj_d(DisasContext *dc, const OpcodeArg arg[],
7105f8c61370SMax Filippov const uint32_t par[])
7106f8c61370SMax Filippov {
7107ad75a51eSRichard Henderson gen_helper_mksadj_d(arg[0].out, tcg_env, arg[1].in);
7108f8c61370SMax Filippov }
7109f8c61370SMax Filippov
translate_mksadj_s(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])7110f8c61370SMax Filippov static void translate_mksadj_s(DisasContext *dc, const OpcodeArg arg[],
7111f8c61370SMax Filippov const uint32_t par[])
7112f8c61370SMax Filippov {
7113f8c61370SMax Filippov OpcodeArg arg32[2];
7114f8c61370SMax Filippov
7115f8c61370SMax Filippov get_f32_o1_i1(arg, arg32, 0, 1);
7116ad75a51eSRichard Henderson gen_helper_mksadj_s(arg32[0].out, tcg_env, arg32[1].in);
7117f8c61370SMax Filippov put_f32_o1_i1(arg, arg32, 0, 1);
7118f8c61370SMax Filippov }
7119f8c61370SMax Filippov
translate_wur_fpu_fcr(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])7120cfa9f051SMax Filippov static void translate_wur_fpu_fcr(DisasContext *dc, const OpcodeArg arg[],
7121cfa9f051SMax Filippov const uint32_t par[])
7122cfa9f051SMax Filippov {
7123ad75a51eSRichard Henderson gen_helper_wur_fpu_fcr(tcg_env, arg[0].in);
7124cfa9f051SMax Filippov }
7125cfa9f051SMax Filippov
translate_rur_fpu_fsr(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])7126cfa9f051SMax Filippov static void translate_rur_fpu_fsr(DisasContext *dc, const OpcodeArg arg[],
7127cfa9f051SMax Filippov const uint32_t par[])
7128cfa9f051SMax Filippov {
7129ad75a51eSRichard Henderson gen_helper_rur_fpu_fsr(arg[0].out, tcg_env);
7130cfa9f051SMax Filippov }
7131cfa9f051SMax Filippov
translate_wur_fpu_fsr(DisasContext * dc,const OpcodeArg arg[],const uint32_t par[])7132cfa9f051SMax Filippov static void translate_wur_fpu_fsr(DisasContext *dc, const OpcodeArg arg[],
7133cfa9f051SMax Filippov const uint32_t par[])
7134cfa9f051SMax Filippov {
7135ad75a51eSRichard Henderson gen_helper_wur_fpu_fsr(tcg_env, arg[0].in);
7136cfa9f051SMax Filippov }
7137cfa9f051SMax Filippov
7138cfa9f051SMax Filippov static const XtensaOpcodeOps fpu_ops[] = {
7139cfa9f051SMax Filippov {
7140cfa9f051SMax Filippov .name = "abs.d",
7141cfa9f051SMax Filippov .translate = translate_abs_d,
7142cfa9f051SMax Filippov .coprocessor = 0x1,
7143cfa9f051SMax Filippov }, {
7144cfa9f051SMax Filippov .name = "abs.s",
7145cfa9f051SMax Filippov .translate = translate_abs_s,
7146cfa9f051SMax Filippov .coprocessor = 0x1,
7147cfa9f051SMax Filippov }, {
7148cfa9f051SMax Filippov .name = "add.d",
7149cfa9f051SMax Filippov .translate = translate_add_d,
7150cfa9f051SMax Filippov .coprocessor = 0x1,
7151cfa9f051SMax Filippov }, {
7152cfa9f051SMax Filippov .name = "add.s",
7153cfa9f051SMax Filippov .translate = translate_add_s,
7154cfa9f051SMax Filippov .coprocessor = 0x1,
7155cfa9f051SMax Filippov }, {
7156f8c61370SMax Filippov .name = "addexp.d",
7157f8c61370SMax Filippov .translate = translate_nop,
7158f8c61370SMax Filippov .coprocessor = 0x1,
7159f8c61370SMax Filippov }, {
7160f8c61370SMax Filippov .name = "addexp.s",
7161f8c61370SMax Filippov .translate = translate_nop,
7162f8c61370SMax Filippov .coprocessor = 0x1,
7163f8c61370SMax Filippov }, {
7164f8c61370SMax Filippov .name = "addexpm.d",
7165f8c61370SMax Filippov .translate = translate_mov_s,
7166f8c61370SMax Filippov .coprocessor = 0x1,
7167f8c61370SMax Filippov }, {
7168f8c61370SMax Filippov .name = "addexpm.s",
7169f8c61370SMax Filippov .translate = translate_mov_s,
7170f8c61370SMax Filippov .coprocessor = 0x1,
7171f8c61370SMax Filippov }, {
7172cfa9f051SMax Filippov .name = "ceil.d",
7173cfa9f051SMax Filippov .translate = translate_ftoi_d,
7174cfa9f051SMax Filippov .par = (const uint32_t[]){float_round_up, false},
7175cfa9f051SMax Filippov .coprocessor = 0x1,
7176cfa9f051SMax Filippov }, {
7177cfa9f051SMax Filippov .name = "ceil.s",
7178cfa9f051SMax Filippov .translate = translate_ftoi_s,
7179cfa9f051SMax Filippov .par = (const uint32_t[]){float_round_up, false},
7180cfa9f051SMax Filippov .coprocessor = 0x1,
7181cfa9f051SMax Filippov }, {
7182cfa9f051SMax Filippov .name = "const.d",
7183cfa9f051SMax Filippov .translate = translate_const_d,
7184cfa9f051SMax Filippov .coprocessor = 0x1,
7185cfa9f051SMax Filippov }, {
7186cfa9f051SMax Filippov .name = "const.s",
7187cfa9f051SMax Filippov .translate = translate_const_s,
7188cfa9f051SMax Filippov .coprocessor = 0x1,
7189cfa9f051SMax Filippov }, {
7190cfa9f051SMax Filippov .name = "cvtd.s",
7191cfa9f051SMax Filippov .translate = translate_cvtd_s,
7192cfa9f051SMax Filippov .coprocessor = 0x1,
7193cfa9f051SMax Filippov }, {
7194cfa9f051SMax Filippov .name = "cvts.d",
7195cfa9f051SMax Filippov .translate = translate_cvts_d,
7196cfa9f051SMax Filippov .coprocessor = 0x1,
7197cfa9f051SMax Filippov }, {
7198f8c61370SMax Filippov .name = "div0.d",
7199f8c61370SMax Filippov .translate = translate_nop,
7200f8c61370SMax Filippov .coprocessor = 0x1,
7201f8c61370SMax Filippov }, {
7202f8c61370SMax Filippov .name = "div0.s",
7203f8c61370SMax Filippov .translate = translate_nop,
7204f8c61370SMax Filippov .coprocessor = 0x1,
7205f8c61370SMax Filippov }, {
7206f8c61370SMax Filippov .name = "divn.d",
7207f8c61370SMax Filippov .translate = translate_nop,
7208f8c61370SMax Filippov .coprocessor = 0x1,
7209f8c61370SMax Filippov }, {
7210f8c61370SMax Filippov .name = "divn.s",
7211f8c61370SMax Filippov .translate = translate_nop,
7212f8c61370SMax Filippov .coprocessor = 0x1,
7213f8c61370SMax Filippov }, {
7214cfa9f051SMax Filippov .name = "float.d",
7215cfa9f051SMax Filippov .translate = translate_float_d,
7216cfa9f051SMax Filippov .par = (const uint32_t[]){false},
7217cfa9f051SMax Filippov .coprocessor = 0x1,
7218cfa9f051SMax Filippov }, {
7219cfa9f051SMax Filippov .name = "float.s",
7220cfa9f051SMax Filippov .translate = translate_float_s,
7221cfa9f051SMax Filippov .par = (const uint32_t[]){false},
7222cfa9f051SMax Filippov .coprocessor = 0x1,
7223cfa9f051SMax Filippov }, {
7224cfa9f051SMax Filippov .name = "floor.d",
7225cfa9f051SMax Filippov .translate = translate_ftoi_d,
7226cfa9f051SMax Filippov .par = (const uint32_t[]){float_round_down, false},
7227cfa9f051SMax Filippov .coprocessor = 0x1,
7228cfa9f051SMax Filippov }, {
7229cfa9f051SMax Filippov .name = "floor.s",
7230cfa9f051SMax Filippov .translate = translate_ftoi_s,
7231cfa9f051SMax Filippov .par = (const uint32_t[]){float_round_down, false},
7232cfa9f051SMax Filippov .coprocessor = 0x1,
7233cfa9f051SMax Filippov }, {
7234cfa9f051SMax Filippov .name = "ldi",
7235cfa9f051SMax Filippov .translate = translate_ldsti_d,
7236cfa9f051SMax Filippov .par = (const uint32_t[]){false, true, false},
7237cfa9f051SMax Filippov .op_flags = XTENSA_OP_LOAD,
7238cfa9f051SMax Filippov .coprocessor = 0x1,
7239cfa9f051SMax Filippov }, {
7240cfa9f051SMax Filippov .name = "ldip",
7241cfa9f051SMax Filippov .translate = translate_ldsti_d,
7242cfa9f051SMax Filippov .par = (const uint32_t[]){false, false, true},
7243cfa9f051SMax Filippov .op_flags = XTENSA_OP_LOAD,
7244cfa9f051SMax Filippov .coprocessor = 0x1,
7245cfa9f051SMax Filippov }, {
7246cfa9f051SMax Filippov .name = "ldiu",
7247cfa9f051SMax Filippov .translate = translate_ldsti_d,
7248cfa9f051SMax Filippov .par = (const uint32_t[]){false, true, true},
7249cfa9f051SMax Filippov .op_flags = XTENSA_OP_LOAD,
7250cfa9f051SMax Filippov .coprocessor = 0x1,
7251cfa9f051SMax Filippov }, {
7252cfa9f051SMax Filippov .name = "ldx",
7253cfa9f051SMax Filippov .translate = translate_ldstx_d,
7254cfa9f051SMax Filippov .par = (const uint32_t[]){false, true, false},
7255cfa9f051SMax Filippov .op_flags = XTENSA_OP_LOAD,
7256cfa9f051SMax Filippov .coprocessor = 0x1,
7257cfa9f051SMax Filippov }, {
7258cfa9f051SMax Filippov .name = "ldxp",
7259cfa9f051SMax Filippov .translate = translate_ldstx_d,
7260cfa9f051SMax Filippov .par = (const uint32_t[]){false, false, true},
7261cfa9f051SMax Filippov .op_flags = XTENSA_OP_LOAD,
7262cfa9f051SMax Filippov .coprocessor = 0x1,
7263cfa9f051SMax Filippov }, {
7264cfa9f051SMax Filippov .name = "ldxu",
7265cfa9f051SMax Filippov .translate = translate_ldstx_d,
7266cfa9f051SMax Filippov .par = (const uint32_t[]){false, true, true},
7267cfa9f051SMax Filippov .op_flags = XTENSA_OP_LOAD,
7268cfa9f051SMax Filippov .coprocessor = 0x1,
7269cfa9f051SMax Filippov }, {
7270cfa9f051SMax Filippov .name = "lsi",
7271cfa9f051SMax Filippov .translate = translate_ldsti_s,
7272cfa9f051SMax Filippov .par = (const uint32_t[]){false, true, false},
7273cfa9f051SMax Filippov .op_flags = XTENSA_OP_LOAD,
7274cfa9f051SMax Filippov .coprocessor = 0x1,
7275cfa9f051SMax Filippov }, {
7276cfa9f051SMax Filippov .name = "lsip",
7277cfa9f051SMax Filippov .translate = translate_ldsti_s,
7278cfa9f051SMax Filippov .par = (const uint32_t[]){false, false, true},
7279cfa9f051SMax Filippov .op_flags = XTENSA_OP_LOAD,
7280cfa9f051SMax Filippov .coprocessor = 0x1,
7281cfa9f051SMax Filippov }, {
7282cfa9f051SMax Filippov .name = "lsiu",
7283cfa9f051SMax Filippov .translate = translate_ldsti_s,
7284cfa9f051SMax Filippov .par = (const uint32_t[]){false, true, true},
7285cfa9f051SMax Filippov .op_flags = XTENSA_OP_LOAD,
7286cfa9f051SMax Filippov .coprocessor = 0x1,
7287cfa9f051SMax Filippov }, {
7288cfa9f051SMax Filippov .name = "lsx",
7289cfa9f051SMax Filippov .translate = translate_ldstx_s,
7290cfa9f051SMax Filippov .par = (const uint32_t[]){false, true, false},
7291cfa9f051SMax Filippov .op_flags = XTENSA_OP_LOAD,
7292cfa9f051SMax Filippov .coprocessor = 0x1,
7293cfa9f051SMax Filippov }, {
7294cfa9f051SMax Filippov .name = "lsxp",
7295cfa9f051SMax Filippov .translate = translate_ldstx_s,
7296cfa9f051SMax Filippov .par = (const uint32_t[]){false, false, true},
7297cfa9f051SMax Filippov .op_flags = XTENSA_OP_LOAD,
7298cfa9f051SMax Filippov .coprocessor = 0x1,
7299cfa9f051SMax Filippov }, {
7300cfa9f051SMax Filippov .name = "lsxu",
7301cfa9f051SMax Filippov .translate = translate_ldstx_s,
7302cfa9f051SMax Filippov .par = (const uint32_t[]){false, true, true},
7303cfa9f051SMax Filippov .op_flags = XTENSA_OP_LOAD,
7304cfa9f051SMax Filippov .coprocessor = 0x1,
7305cfa9f051SMax Filippov }, {
7306cfa9f051SMax Filippov .name = "madd.d",
7307cfa9f051SMax Filippov .translate = translate_madd_d,
7308cfa9f051SMax Filippov .coprocessor = 0x1,
7309cfa9f051SMax Filippov }, {
7310cfa9f051SMax Filippov .name = "madd.s",
7311cfa9f051SMax Filippov .translate = translate_madd_s,
7312cfa9f051SMax Filippov .coprocessor = 0x1,
7313cfa9f051SMax Filippov }, {
7314f8c61370SMax Filippov .name = "maddn.d",
7315f8c61370SMax Filippov .translate = translate_nop,
7316f8c61370SMax Filippov .coprocessor = 0x1,
7317f8c61370SMax Filippov }, {
7318f8c61370SMax Filippov .name = "maddn.s",
7319f8c61370SMax Filippov .translate = translate_nop,
7320f8c61370SMax Filippov .coprocessor = 0x1,
7321f8c61370SMax Filippov }, {
7322f8c61370SMax Filippov .name = "mkdadj.d",
7323f8c61370SMax Filippov .translate = translate_mkdadj_d,
7324f8c61370SMax Filippov .coprocessor = 0x1,
7325f8c61370SMax Filippov }, {
7326f8c61370SMax Filippov .name = "mkdadj.s",
7327f8c61370SMax Filippov .translate = translate_mkdadj_s,
7328f8c61370SMax Filippov .coprocessor = 0x1,
7329f8c61370SMax Filippov }, {
7330f8c61370SMax Filippov .name = "mksadj.d",
7331f8c61370SMax Filippov .translate = translate_mksadj_d,
7332f8c61370SMax Filippov .coprocessor = 0x1,
7333f8c61370SMax Filippov }, {
7334f8c61370SMax Filippov .name = "mksadj.s",
7335f8c61370SMax Filippov .translate = translate_mksadj_s,
7336f8c61370SMax Filippov .coprocessor = 0x1,
7337f8c61370SMax Filippov }, {
7338cfa9f051SMax Filippov .name = "mov.d",
7339cfa9f051SMax Filippov .translate = translate_mov_d,
7340cfa9f051SMax Filippov .coprocessor = 0x1,
7341cfa9f051SMax Filippov }, {
7342cfa9f051SMax Filippov .name = "mov.s",
7343cfa9f051SMax Filippov .translate = translate_mov_s,
7344cfa9f051SMax Filippov .coprocessor = 0x1,
7345cfa9f051SMax Filippov }, {
7346cfa9f051SMax Filippov .name = "moveqz.d",
7347cfa9f051SMax Filippov .translate = translate_movcond_d,
7348cfa9f051SMax Filippov .par = (const uint32_t[]){TCG_COND_EQ},
7349cfa9f051SMax Filippov .coprocessor = 0x1,
7350cfa9f051SMax Filippov }, {
7351cfa9f051SMax Filippov .name = "moveqz.s",
7352cfa9f051SMax Filippov .translate = translate_movcond_s,
7353cfa9f051SMax Filippov .par = (const uint32_t[]){TCG_COND_EQ},
7354cfa9f051SMax Filippov .coprocessor = 0x1,
7355cfa9f051SMax Filippov }, {
7356cfa9f051SMax Filippov .name = "movf.d",
7357cfa9f051SMax Filippov .translate = translate_movp_d,
7358cfa9f051SMax Filippov .par = (const uint32_t[]){TCG_COND_EQ},
7359cfa9f051SMax Filippov .coprocessor = 0x1,
7360cfa9f051SMax Filippov }, {
7361cfa9f051SMax Filippov .name = "movf.s",
7362cfa9f051SMax Filippov .translate = translate_movp_s,
7363cfa9f051SMax Filippov .par = (const uint32_t[]){TCG_COND_EQ},
7364cfa9f051SMax Filippov .coprocessor = 0x1,
7365cfa9f051SMax Filippov }, {
7366cfa9f051SMax Filippov .name = "movgez.d",
7367cfa9f051SMax Filippov .translate = translate_movcond_d,
7368cfa9f051SMax Filippov .par = (const uint32_t[]){TCG_COND_GE},
7369cfa9f051SMax Filippov .coprocessor = 0x1,
7370cfa9f051SMax Filippov }, {
7371cfa9f051SMax Filippov .name = "movgez.s",
7372cfa9f051SMax Filippov .translate = translate_movcond_s,
7373cfa9f051SMax Filippov .par = (const uint32_t[]){TCG_COND_GE},
7374cfa9f051SMax Filippov .coprocessor = 0x1,
7375cfa9f051SMax Filippov }, {
7376cfa9f051SMax Filippov .name = "movltz.d",
7377cfa9f051SMax Filippov .translate = translate_movcond_d,
7378cfa9f051SMax Filippov .par = (const uint32_t[]){TCG_COND_LT},
7379cfa9f051SMax Filippov .coprocessor = 0x1,
7380cfa9f051SMax Filippov }, {
7381cfa9f051SMax Filippov .name = "movltz.s",
7382cfa9f051SMax Filippov .translate = translate_movcond_s,
7383cfa9f051SMax Filippov .par = (const uint32_t[]){TCG_COND_LT},
7384cfa9f051SMax Filippov .coprocessor = 0x1,
7385cfa9f051SMax Filippov }, {
7386cfa9f051SMax Filippov .name = "movnez.d",
7387cfa9f051SMax Filippov .translate = translate_movcond_d,
7388cfa9f051SMax Filippov .par = (const uint32_t[]){TCG_COND_NE},
7389cfa9f051SMax Filippov .coprocessor = 0x1,
7390cfa9f051SMax Filippov }, {
7391cfa9f051SMax Filippov .name = "movnez.s",
7392cfa9f051SMax Filippov .translate = translate_movcond_s,
7393cfa9f051SMax Filippov .par = (const uint32_t[]){TCG_COND_NE},
7394cfa9f051SMax Filippov .coprocessor = 0x1,
7395cfa9f051SMax Filippov }, {
7396cfa9f051SMax Filippov .name = "movt.d",
7397cfa9f051SMax Filippov .translate = translate_movp_d,
7398cfa9f051SMax Filippov .par = (const uint32_t[]){TCG_COND_NE},
7399cfa9f051SMax Filippov .coprocessor = 0x1,
7400cfa9f051SMax Filippov }, {
7401cfa9f051SMax Filippov .name = "movt.s",
7402cfa9f051SMax Filippov .translate = translate_movp_s,
7403cfa9f051SMax Filippov .par = (const uint32_t[]){TCG_COND_NE},
7404cfa9f051SMax Filippov .coprocessor = 0x1,
7405cfa9f051SMax Filippov }, {
7406cfa9f051SMax Filippov .name = "msub.d",
7407cfa9f051SMax Filippov .translate = translate_msub_d,
7408cfa9f051SMax Filippov .coprocessor = 0x1,
7409cfa9f051SMax Filippov }, {
7410cfa9f051SMax Filippov .name = "msub.s",
7411cfa9f051SMax Filippov .translate = translate_msub_s,
7412cfa9f051SMax Filippov .coprocessor = 0x1,
7413cfa9f051SMax Filippov }, {
7414cfa9f051SMax Filippov .name = "mul.d",
7415cfa9f051SMax Filippov .translate = translate_mul_d,
7416cfa9f051SMax Filippov .coprocessor = 0x1,
7417cfa9f051SMax Filippov }, {
7418cfa9f051SMax Filippov .name = "mul.s",
7419cfa9f051SMax Filippov .translate = translate_mul_s,
7420cfa9f051SMax Filippov .coprocessor = 0x1,
7421cfa9f051SMax Filippov }, {
7422cfa9f051SMax Filippov .name = "neg.d",
7423cfa9f051SMax Filippov .translate = translate_neg_d,
7424cfa9f051SMax Filippov .coprocessor = 0x1,
7425cfa9f051SMax Filippov }, {
7426cfa9f051SMax Filippov .name = "neg.s",
7427cfa9f051SMax Filippov .translate = translate_neg_s,
7428cfa9f051SMax Filippov .coprocessor = 0x1,
7429cfa9f051SMax Filippov }, {
7430f8c61370SMax Filippov .name = "nexp01.d",
7431f8c61370SMax Filippov .translate = translate_nop,
7432f8c61370SMax Filippov .coprocessor = 0x1,
7433f8c61370SMax Filippov }, {
7434f8c61370SMax Filippov .name = "nexp01.s",
7435f8c61370SMax Filippov .translate = translate_nop,
7436f8c61370SMax Filippov .coprocessor = 0x1,
7437f8c61370SMax Filippov }, {
7438cfa9f051SMax Filippov .name = "oeq.d",
7439cfa9f051SMax Filippov .translate = translate_compare_d,
7440cfa9f051SMax Filippov .par = (const uint32_t[]){COMPARE_OEQ},
7441cfa9f051SMax Filippov .coprocessor = 0x1,
7442cfa9f051SMax Filippov }, {
7443cfa9f051SMax Filippov .name = "oeq.s",
7444cfa9f051SMax Filippov .translate = translate_compare_s,
7445cfa9f051SMax Filippov .par = (const uint32_t[]){COMPARE_OEQ},
7446cfa9f051SMax Filippov .coprocessor = 0x1,
7447cfa9f051SMax Filippov }, {
7448cfa9f051SMax Filippov .name = "ole.d",
7449cfa9f051SMax Filippov .translate = translate_compare_d,
7450cfa9f051SMax Filippov .par = (const uint32_t[]){COMPARE_OLE},
7451cfa9f051SMax Filippov .coprocessor = 0x1,
7452cfa9f051SMax Filippov }, {
7453cfa9f051SMax Filippov .name = "ole.s",
7454cfa9f051SMax Filippov .translate = translate_compare_s,
7455cfa9f051SMax Filippov .par = (const uint32_t[]){COMPARE_OLE},
7456cfa9f051SMax Filippov .coprocessor = 0x1,
7457cfa9f051SMax Filippov }, {
7458cfa9f051SMax Filippov .name = "olt.d",
7459cfa9f051SMax Filippov .translate = translate_compare_d,
7460cfa9f051SMax Filippov .par = (const uint32_t[]){COMPARE_OLT},
7461cfa9f051SMax Filippov .coprocessor = 0x1,
7462cfa9f051SMax Filippov }, {
7463cfa9f051SMax Filippov .name = "olt.s",
7464cfa9f051SMax Filippov .translate = translate_compare_s,
7465cfa9f051SMax Filippov .par = (const uint32_t[]){COMPARE_OLT},
7466cfa9f051SMax Filippov .coprocessor = 0x1,
7467cfa9f051SMax Filippov }, {
7468cfa9f051SMax Filippov .name = "rfr",
7469cfa9f051SMax Filippov .translate = translate_rfr_s,
7470cfa9f051SMax Filippov .coprocessor = 0x1,
7471cfa9f051SMax Filippov }, {
7472cfa9f051SMax Filippov .name = "rfrd",
7473cfa9f051SMax Filippov .translate = translate_rfr_d,
7474cfa9f051SMax Filippov .coprocessor = 0x1,
7475cfa9f051SMax Filippov }, {
7476cfa9f051SMax Filippov .name = "round.d",
7477cfa9f051SMax Filippov .translate = translate_ftoi_d,
7478cfa9f051SMax Filippov .par = (const uint32_t[]){float_round_nearest_even, false},
7479cfa9f051SMax Filippov .coprocessor = 0x1,
7480cfa9f051SMax Filippov }, {
7481cfa9f051SMax Filippov .name = "round.s",
7482cfa9f051SMax Filippov .translate = translate_ftoi_s,
7483cfa9f051SMax Filippov .par = (const uint32_t[]){float_round_nearest_even, false},
7484cfa9f051SMax Filippov .coprocessor = 0x1,
7485cfa9f051SMax Filippov }, {
7486cfa9f051SMax Filippov .name = "rur.fcr",
7487cfa9f051SMax Filippov .translate = translate_rur,
7488cfa9f051SMax Filippov .par = (const uint32_t[]){FCR},
7489cfa9f051SMax Filippov .coprocessor = 0x1,
7490cfa9f051SMax Filippov }, {
7491cfa9f051SMax Filippov .name = "rur.fsr",
7492cfa9f051SMax Filippov .translate = translate_rur_fpu_fsr,
7493cfa9f051SMax Filippov .coprocessor = 0x1,
7494cfa9f051SMax Filippov }, {
7495cfa9f051SMax Filippov .name = "sdi",
7496cfa9f051SMax Filippov .translate = translate_ldsti_d,
7497cfa9f051SMax Filippov .par = (const uint32_t[]){true, true, false},
7498cfa9f051SMax Filippov .op_flags = XTENSA_OP_STORE,
7499cfa9f051SMax Filippov .coprocessor = 0x1,
7500cfa9f051SMax Filippov }, {
7501cfa9f051SMax Filippov .name = "sdip",
7502cfa9f051SMax Filippov .translate = translate_ldsti_d,
7503cfa9f051SMax Filippov .par = (const uint32_t[]){true, false, true},
7504cfa9f051SMax Filippov .op_flags = XTENSA_OP_STORE,
7505cfa9f051SMax Filippov .coprocessor = 0x1,
7506cfa9f051SMax Filippov }, {
7507cfa9f051SMax Filippov .name = "sdiu",
7508cfa9f051SMax Filippov .translate = translate_ldsti_d,
7509cfa9f051SMax Filippov .par = (const uint32_t[]){true, true, true},
7510cfa9f051SMax Filippov .op_flags = XTENSA_OP_STORE,
7511cfa9f051SMax Filippov .coprocessor = 0x1,
7512cfa9f051SMax Filippov }, {
7513cfa9f051SMax Filippov .name = "sdx",
7514cfa9f051SMax Filippov .translate = translate_ldstx_d,
7515cfa9f051SMax Filippov .par = (const uint32_t[]){true, true, false},
7516cfa9f051SMax Filippov .op_flags = XTENSA_OP_STORE,
7517cfa9f051SMax Filippov .coprocessor = 0x1,
7518cfa9f051SMax Filippov }, {
7519cfa9f051SMax Filippov .name = "sdxp",
7520cfa9f051SMax Filippov .translate = translate_ldstx_d,
7521cfa9f051SMax Filippov .par = (const uint32_t[]){true, false, true},
7522cfa9f051SMax Filippov .op_flags = XTENSA_OP_STORE,
7523cfa9f051SMax Filippov .coprocessor = 0x1,
7524cfa9f051SMax Filippov }, {
7525cfa9f051SMax Filippov .name = "sdxu",
7526cfa9f051SMax Filippov .translate = translate_ldstx_d,
7527cfa9f051SMax Filippov .par = (const uint32_t[]){true, true, true},
7528cfa9f051SMax Filippov .op_flags = XTENSA_OP_STORE,
7529cfa9f051SMax Filippov .coprocessor = 0x1,
7530cfa9f051SMax Filippov }, {
7531f8c61370SMax Filippov .name = "sqrt0.d",
7532f8c61370SMax Filippov .translate = translate_nop,
7533f8c61370SMax Filippov .coprocessor = 0x1,
7534f8c61370SMax Filippov }, {
7535f8c61370SMax Filippov .name = "sqrt0.s",
7536f8c61370SMax Filippov .translate = translate_nop,
7537f8c61370SMax Filippov .coprocessor = 0x1,
7538f8c61370SMax Filippov }, {
7539cfa9f051SMax Filippov .name = "ssi",
7540cfa9f051SMax Filippov .translate = translate_ldsti_s,
7541cfa9f051SMax Filippov .par = (const uint32_t[]){true, true, false},
7542cfa9f051SMax Filippov .op_flags = XTENSA_OP_STORE,
7543cfa9f051SMax Filippov .coprocessor = 0x1,
7544cfa9f051SMax Filippov }, {
7545cfa9f051SMax Filippov .name = "ssip",
7546cfa9f051SMax Filippov .translate = translate_ldsti_s,
7547cfa9f051SMax Filippov .par = (const uint32_t[]){true, false, true},
7548cfa9f051SMax Filippov .op_flags = XTENSA_OP_STORE,
7549cfa9f051SMax Filippov .coprocessor = 0x1,
7550cfa9f051SMax Filippov }, {
7551cfa9f051SMax Filippov .name = "ssiu",
7552cfa9f051SMax Filippov .translate = translate_ldsti_s,
7553cfa9f051SMax Filippov .par = (const uint32_t[]){true, true, true},
7554cfa9f051SMax Filippov .op_flags = XTENSA_OP_STORE,
7555cfa9f051SMax Filippov .coprocessor = 0x1,
7556cfa9f051SMax Filippov }, {
7557cfa9f051SMax Filippov .name = "ssx",
7558cfa9f051SMax Filippov .translate = translate_ldstx_s,
7559cfa9f051SMax Filippov .par = (const uint32_t[]){true, true, false},
7560cfa9f051SMax Filippov .op_flags = XTENSA_OP_STORE,
7561cfa9f051SMax Filippov .coprocessor = 0x1,
7562cfa9f051SMax Filippov }, {
7563cfa9f051SMax Filippov .name = "ssxp",
7564cfa9f051SMax Filippov .translate = translate_ldstx_s,
7565cfa9f051SMax Filippov .par = (const uint32_t[]){true, false, true},
7566cfa9f051SMax Filippov .op_flags = XTENSA_OP_STORE,
7567cfa9f051SMax Filippov .coprocessor = 0x1,
7568cfa9f051SMax Filippov }, {
7569cfa9f051SMax Filippov .name = "ssxu",
7570cfa9f051SMax Filippov .translate = translate_ldstx_s,
7571cfa9f051SMax Filippov .par = (const uint32_t[]){true, true, true},
7572cfa9f051SMax Filippov .op_flags = XTENSA_OP_STORE,
7573cfa9f051SMax Filippov .coprocessor = 0x1,
7574cfa9f051SMax Filippov }, {
7575cfa9f051SMax Filippov .name = "sub.d",
7576cfa9f051SMax Filippov .translate = translate_sub_d,
7577cfa9f051SMax Filippov .coprocessor = 0x1,
7578cfa9f051SMax Filippov }, {
7579cfa9f051SMax Filippov .name = "sub.s",
7580cfa9f051SMax Filippov .translate = translate_sub_s,
7581cfa9f051SMax Filippov .coprocessor = 0x1,
7582cfa9f051SMax Filippov }, {
7583cfa9f051SMax Filippov .name = "trunc.d",
7584cfa9f051SMax Filippov .translate = translate_ftoi_d,
7585cfa9f051SMax Filippov .par = (const uint32_t[]){float_round_to_zero, false},
7586cfa9f051SMax Filippov .coprocessor = 0x1,
7587cfa9f051SMax Filippov }, {
7588cfa9f051SMax Filippov .name = "trunc.s",
7589cfa9f051SMax Filippov .translate = translate_ftoi_s,
7590cfa9f051SMax Filippov .par = (const uint32_t[]){float_round_to_zero, false},
7591cfa9f051SMax Filippov .coprocessor = 0x1,
7592cfa9f051SMax Filippov }, {
7593cfa9f051SMax Filippov .name = "ueq.d",
7594cfa9f051SMax Filippov .translate = translate_compare_d,
7595cfa9f051SMax Filippov .par = (const uint32_t[]){COMPARE_UEQ},
7596cfa9f051SMax Filippov .coprocessor = 0x1,
7597cfa9f051SMax Filippov }, {
7598cfa9f051SMax Filippov .name = "ueq.s",
7599cfa9f051SMax Filippov .translate = translate_compare_s,
7600cfa9f051SMax Filippov .par = (const uint32_t[]){COMPARE_UEQ},
7601cfa9f051SMax Filippov .coprocessor = 0x1,
7602cfa9f051SMax Filippov }, {
7603cfa9f051SMax Filippov .name = "ufloat.d",
7604cfa9f051SMax Filippov .translate = translate_float_d,
7605cfa9f051SMax Filippov .par = (const uint32_t[]){true},
7606cfa9f051SMax Filippov .coprocessor = 0x1,
7607cfa9f051SMax Filippov }, {
7608cfa9f051SMax Filippov .name = "ufloat.s",
7609cfa9f051SMax Filippov .translate = translate_float_s,
7610cfa9f051SMax Filippov .par = (const uint32_t[]){true},
7611cfa9f051SMax Filippov .coprocessor = 0x1,
7612cfa9f051SMax Filippov }, {
7613cfa9f051SMax Filippov .name = "ule.d",
7614cfa9f051SMax Filippov .translate = translate_compare_d,
7615cfa9f051SMax Filippov .par = (const uint32_t[]){COMPARE_ULE},
7616cfa9f051SMax Filippov .coprocessor = 0x1,
7617cfa9f051SMax Filippov }, {
7618cfa9f051SMax Filippov .name = "ule.s",
7619cfa9f051SMax Filippov .translate = translate_compare_s,
7620cfa9f051SMax Filippov .par = (const uint32_t[]){COMPARE_ULE},
7621cfa9f051SMax Filippov .coprocessor = 0x1,
7622cfa9f051SMax Filippov }, {
7623cfa9f051SMax Filippov .name = "ult.d",
7624cfa9f051SMax Filippov .translate = translate_compare_d,
7625cfa9f051SMax Filippov .par = (const uint32_t[]){COMPARE_ULT},
7626cfa9f051SMax Filippov .coprocessor = 0x1,
7627cfa9f051SMax Filippov }, {
7628cfa9f051SMax Filippov .name = "ult.s",
7629cfa9f051SMax Filippov .translate = translate_compare_s,
7630cfa9f051SMax Filippov .par = (const uint32_t[]){COMPARE_ULT},
7631cfa9f051SMax Filippov .coprocessor = 0x1,
7632cfa9f051SMax Filippov }, {
7633cfa9f051SMax Filippov .name = "un.d",
7634cfa9f051SMax Filippov .translate = translate_compare_d,
7635cfa9f051SMax Filippov .par = (const uint32_t[]){COMPARE_UN},
7636cfa9f051SMax Filippov .coprocessor = 0x1,
7637cfa9f051SMax Filippov }, {
7638cfa9f051SMax Filippov .name = "un.s",
7639cfa9f051SMax Filippov .translate = translate_compare_s,
7640cfa9f051SMax Filippov .par = (const uint32_t[]){COMPARE_UN},
7641cfa9f051SMax Filippov .coprocessor = 0x1,
7642cfa9f051SMax Filippov }, {
7643cfa9f051SMax Filippov .name = "utrunc.d",
7644cfa9f051SMax Filippov .translate = translate_ftoi_d,
7645cfa9f051SMax Filippov .par = (const uint32_t[]){float_round_to_zero, true},
7646cfa9f051SMax Filippov .coprocessor = 0x1,
7647cfa9f051SMax Filippov }, {
7648cfa9f051SMax Filippov .name = "utrunc.s",
7649cfa9f051SMax Filippov .translate = translate_ftoi_s,
7650cfa9f051SMax Filippov .par = (const uint32_t[]){float_round_to_zero, true},
7651cfa9f051SMax Filippov .coprocessor = 0x1,
7652cfa9f051SMax Filippov }, {
7653cfa9f051SMax Filippov .name = "wfr",
7654cfa9f051SMax Filippov .translate = translate_wfr_s,
7655cfa9f051SMax Filippov .coprocessor = 0x1,
7656cfa9f051SMax Filippov }, {
7657cfa9f051SMax Filippov .name = "wfrd",
7658cfa9f051SMax Filippov .translate = translate_wfr_d,
7659cfa9f051SMax Filippov .coprocessor = 0x1,
7660cfa9f051SMax Filippov }, {
7661cfa9f051SMax Filippov .name = "wur.fcr",
7662cfa9f051SMax Filippov .translate = translate_wur_fpu_fcr,
7663cfa9f051SMax Filippov .par = (const uint32_t[]){FCR},
7664cfa9f051SMax Filippov .coprocessor = 0x1,
7665cfa9f051SMax Filippov }, {
7666cfa9f051SMax Filippov .name = "wur.fsr",
7667cfa9f051SMax Filippov .translate = translate_wur_fpu_fsr,
7668cfa9f051SMax Filippov .coprocessor = 0x1,
7669cfa9f051SMax Filippov },
7670cfa9f051SMax Filippov };
7671cfa9f051SMax Filippov
7672cfa9f051SMax Filippov const XtensaOpcodeTranslators xtensa_fpu_opcodes = {
7673cfa9f051SMax Filippov .num_opcodes = ARRAY_SIZE(fpu_ops),
7674cfa9f051SMax Filippov .opcode = fpu_ops,
7675cfa9f051SMax Filippov };
7676