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