1a5a4af3bSchristos /* Simulator instruction decoder for lm32bf. 2a5a4af3bSchristos 3a5a4af3bSchristos THIS FILE IS MACHINE GENERATED WITH CGEN. 4a5a4af3bSchristos 5*8b657b07Schristos Copyright 1996-2023 Free Software Foundation, Inc. 6a5a4af3bSchristos 7a5a4af3bSchristos This file is part of the GNU simulators. 8a5a4af3bSchristos 9a5a4af3bSchristos This file is free software; you can redistribute it and/or modify 10a5a4af3bSchristos it under the terms of the GNU General Public License as published by 11a5a4af3bSchristos the Free Software Foundation; either version 3, or (at your option) 12a5a4af3bSchristos any later version. 13a5a4af3bSchristos 14a5a4af3bSchristos It is distributed in the hope that it will be useful, but WITHOUT 15a5a4af3bSchristos ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 16a5a4af3bSchristos or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public 17a5a4af3bSchristos License for more details. 18a5a4af3bSchristos 19a5a4af3bSchristos You should have received a copy of the GNU General Public License along 20a5a4af3bSchristos with this program; if not, see <http://www.gnu.org/licenses/>. 21a5a4af3bSchristos 22a5a4af3bSchristos */ 23a5a4af3bSchristos 24a5a4af3bSchristos #define WANT_CPU lm32bf 25a5a4af3bSchristos #define WANT_CPU_LM32BF 26a5a4af3bSchristos 27a5a4af3bSchristos #include "sim-main.h" 28a5a4af3bSchristos #include "sim-assert.h" 29a5a4af3bSchristos 30a5a4af3bSchristos /* The instruction descriptor array. 31a5a4af3bSchristos This is computed at runtime. Space for it is not malloc'd to save a 32a5a4af3bSchristos teensy bit of cpu in the decoder. Moving it to malloc space is trivial 33a5a4af3bSchristos but won't be done until necessary (we don't currently support the runtime 34a5a4af3bSchristos addition of instructions nor an SMP machine with different cpus). */ 35a5a4af3bSchristos static IDESC lm32bf_insn_data[LM32BF_INSN__MAX]; 36a5a4af3bSchristos 37a5a4af3bSchristos /* Commas between elements are contained in the macros. 38a5a4af3bSchristos Some of these are conditionally compiled out. */ 39a5a4af3bSchristos 40a5a4af3bSchristos static const struct insn_sem lm32bf_insn_sem[] = 41a5a4af3bSchristos { 42a5a4af3bSchristos { VIRTUAL_INSN_X_INVALID, LM32BF_INSN_X_INVALID, LM32BF_SFMT_EMPTY }, 43a5a4af3bSchristos { VIRTUAL_INSN_X_AFTER, LM32BF_INSN_X_AFTER, LM32BF_SFMT_EMPTY }, 44a5a4af3bSchristos { VIRTUAL_INSN_X_BEFORE, LM32BF_INSN_X_BEFORE, LM32BF_SFMT_EMPTY }, 45a5a4af3bSchristos { VIRTUAL_INSN_X_CTI_CHAIN, LM32BF_INSN_X_CTI_CHAIN, LM32BF_SFMT_EMPTY }, 46a5a4af3bSchristos { VIRTUAL_INSN_X_CHAIN, LM32BF_INSN_X_CHAIN, LM32BF_SFMT_EMPTY }, 47a5a4af3bSchristos { VIRTUAL_INSN_X_BEGIN, LM32BF_INSN_X_BEGIN, LM32BF_SFMT_EMPTY }, 48a5a4af3bSchristos { LM32_INSN_ADD, LM32BF_INSN_ADD, LM32BF_SFMT_ADD }, 49a5a4af3bSchristos { LM32_INSN_ADDI, LM32BF_INSN_ADDI, LM32BF_SFMT_ADDI }, 50a5a4af3bSchristos { LM32_INSN_AND, LM32BF_INSN_AND, LM32BF_SFMT_ADD }, 51a5a4af3bSchristos { LM32_INSN_ANDI, LM32BF_INSN_ANDI, LM32BF_SFMT_ANDI }, 52a5a4af3bSchristos { LM32_INSN_ANDHII, LM32BF_INSN_ANDHII, LM32BF_SFMT_ANDHII }, 53a5a4af3bSchristos { LM32_INSN_B, LM32BF_INSN_B, LM32BF_SFMT_B }, 54a5a4af3bSchristos { LM32_INSN_BI, LM32BF_INSN_BI, LM32BF_SFMT_BI }, 55a5a4af3bSchristos { LM32_INSN_BE, LM32BF_INSN_BE, LM32BF_SFMT_BE }, 56a5a4af3bSchristos { LM32_INSN_BG, LM32BF_INSN_BG, LM32BF_SFMT_BE }, 57a5a4af3bSchristos { LM32_INSN_BGE, LM32BF_INSN_BGE, LM32BF_SFMT_BE }, 58a5a4af3bSchristos { LM32_INSN_BGEU, LM32BF_INSN_BGEU, LM32BF_SFMT_BE }, 59a5a4af3bSchristos { LM32_INSN_BGU, LM32BF_INSN_BGU, LM32BF_SFMT_BE }, 60a5a4af3bSchristos { LM32_INSN_BNE, LM32BF_INSN_BNE, LM32BF_SFMT_BE }, 61a5a4af3bSchristos { LM32_INSN_CALL, LM32BF_INSN_CALL, LM32BF_SFMT_CALL }, 62a5a4af3bSchristos { LM32_INSN_CALLI, LM32BF_INSN_CALLI, LM32BF_SFMT_CALLI }, 63a5a4af3bSchristos { LM32_INSN_CMPE, LM32BF_INSN_CMPE, LM32BF_SFMT_ADD }, 64a5a4af3bSchristos { LM32_INSN_CMPEI, LM32BF_INSN_CMPEI, LM32BF_SFMT_ADDI }, 65a5a4af3bSchristos { LM32_INSN_CMPG, LM32BF_INSN_CMPG, LM32BF_SFMT_ADD }, 66a5a4af3bSchristos { LM32_INSN_CMPGI, LM32BF_INSN_CMPGI, LM32BF_SFMT_ADDI }, 67a5a4af3bSchristos { LM32_INSN_CMPGE, LM32BF_INSN_CMPGE, LM32BF_SFMT_ADD }, 68a5a4af3bSchristos { LM32_INSN_CMPGEI, LM32BF_INSN_CMPGEI, LM32BF_SFMT_ADDI }, 69a5a4af3bSchristos { LM32_INSN_CMPGEU, LM32BF_INSN_CMPGEU, LM32BF_SFMT_ADD }, 70a5a4af3bSchristos { LM32_INSN_CMPGEUI, LM32BF_INSN_CMPGEUI, LM32BF_SFMT_ANDI }, 71a5a4af3bSchristos { LM32_INSN_CMPGU, LM32BF_INSN_CMPGU, LM32BF_SFMT_ADD }, 72a5a4af3bSchristos { LM32_INSN_CMPGUI, LM32BF_INSN_CMPGUI, LM32BF_SFMT_ANDI }, 73a5a4af3bSchristos { LM32_INSN_CMPNE, LM32BF_INSN_CMPNE, LM32BF_SFMT_ADD }, 74a5a4af3bSchristos { LM32_INSN_CMPNEI, LM32BF_INSN_CMPNEI, LM32BF_SFMT_ADDI }, 75a5a4af3bSchristos { LM32_INSN_DIVU, LM32BF_INSN_DIVU, LM32BF_SFMT_DIVU }, 76a5a4af3bSchristos { LM32_INSN_LB, LM32BF_INSN_LB, LM32BF_SFMT_LB }, 77a5a4af3bSchristos { LM32_INSN_LBU, LM32BF_INSN_LBU, LM32BF_SFMT_LB }, 78a5a4af3bSchristos { LM32_INSN_LH, LM32BF_INSN_LH, LM32BF_SFMT_LH }, 79a5a4af3bSchristos { LM32_INSN_LHU, LM32BF_INSN_LHU, LM32BF_SFMT_LH }, 80a5a4af3bSchristos { LM32_INSN_LW, LM32BF_INSN_LW, LM32BF_SFMT_LW }, 81a5a4af3bSchristos { LM32_INSN_MODU, LM32BF_INSN_MODU, LM32BF_SFMT_DIVU }, 82a5a4af3bSchristos { LM32_INSN_MUL, LM32BF_INSN_MUL, LM32BF_SFMT_ADD }, 83a5a4af3bSchristos { LM32_INSN_MULI, LM32BF_INSN_MULI, LM32BF_SFMT_ADDI }, 84a5a4af3bSchristos { LM32_INSN_NOR, LM32BF_INSN_NOR, LM32BF_SFMT_ADD }, 85a5a4af3bSchristos { LM32_INSN_NORI, LM32BF_INSN_NORI, LM32BF_SFMT_ANDI }, 86a5a4af3bSchristos { LM32_INSN_OR, LM32BF_INSN_OR, LM32BF_SFMT_ADD }, 87a5a4af3bSchristos { LM32_INSN_ORI, LM32BF_INSN_ORI, LM32BF_SFMT_ORI }, 88a5a4af3bSchristos { LM32_INSN_ORHII, LM32BF_INSN_ORHII, LM32BF_SFMT_ANDHII }, 89a5a4af3bSchristos { LM32_INSN_RCSR, LM32BF_INSN_RCSR, LM32BF_SFMT_RCSR }, 90a5a4af3bSchristos { LM32_INSN_SB, LM32BF_INSN_SB, LM32BF_SFMT_SB }, 91a5a4af3bSchristos { LM32_INSN_SEXTB, LM32BF_INSN_SEXTB, LM32BF_SFMT_SEXTB }, 92a5a4af3bSchristos { LM32_INSN_SEXTH, LM32BF_INSN_SEXTH, LM32BF_SFMT_SEXTB }, 93a5a4af3bSchristos { LM32_INSN_SH, LM32BF_INSN_SH, LM32BF_SFMT_SH }, 94a5a4af3bSchristos { LM32_INSN_SL, LM32BF_INSN_SL, LM32BF_SFMT_ADD }, 95a5a4af3bSchristos { LM32_INSN_SLI, LM32BF_INSN_SLI, LM32BF_SFMT_ADDI }, 96a5a4af3bSchristos { LM32_INSN_SR, LM32BF_INSN_SR, LM32BF_SFMT_ADD }, 97a5a4af3bSchristos { LM32_INSN_SRI, LM32BF_INSN_SRI, LM32BF_SFMT_ADDI }, 98a5a4af3bSchristos { LM32_INSN_SRU, LM32BF_INSN_SRU, LM32BF_SFMT_ADD }, 99a5a4af3bSchristos { LM32_INSN_SRUI, LM32BF_INSN_SRUI, LM32BF_SFMT_ADDI }, 100a5a4af3bSchristos { LM32_INSN_SUB, LM32BF_INSN_SUB, LM32BF_SFMT_ADD }, 101a5a4af3bSchristos { LM32_INSN_SW, LM32BF_INSN_SW, LM32BF_SFMT_SW }, 102a5a4af3bSchristos { LM32_INSN_USER, LM32BF_INSN_USER, LM32BF_SFMT_USER }, 103a5a4af3bSchristos { LM32_INSN_WCSR, LM32BF_INSN_WCSR, LM32BF_SFMT_WCSR }, 104a5a4af3bSchristos { LM32_INSN_XOR, LM32BF_INSN_XOR, LM32BF_SFMT_ADD }, 105a5a4af3bSchristos { LM32_INSN_XORI, LM32BF_INSN_XORI, LM32BF_SFMT_ANDI }, 106a5a4af3bSchristos { LM32_INSN_XNOR, LM32BF_INSN_XNOR, LM32BF_SFMT_ADD }, 107a5a4af3bSchristos { LM32_INSN_XNORI, LM32BF_INSN_XNORI, LM32BF_SFMT_ANDI }, 108a5a4af3bSchristos { LM32_INSN_BREAK, LM32BF_INSN_BREAK, LM32BF_SFMT_BREAK }, 109a5a4af3bSchristos { LM32_INSN_SCALL, LM32BF_INSN_SCALL, LM32BF_SFMT_BREAK }, 110a5a4af3bSchristos }; 111a5a4af3bSchristos 112a5a4af3bSchristos static const struct insn_sem lm32bf_insn_sem_invalid = 113a5a4af3bSchristos { 114a5a4af3bSchristos VIRTUAL_INSN_X_INVALID, LM32BF_INSN_X_INVALID, LM32BF_SFMT_EMPTY 115a5a4af3bSchristos }; 116a5a4af3bSchristos 117a5a4af3bSchristos /* Initialize an IDESC from the compile-time computable parts. */ 118a5a4af3bSchristos 119a5a4af3bSchristos static INLINE void 120a5a4af3bSchristos init_idesc (SIM_CPU *cpu, IDESC *id, const struct insn_sem *t) 121a5a4af3bSchristos { 122a5a4af3bSchristos const CGEN_INSN *insn_table = CGEN_CPU_INSN_TABLE (CPU_CPU_DESC (cpu))->init_entries; 123a5a4af3bSchristos 124a5a4af3bSchristos id->num = t->index; 125a5a4af3bSchristos id->sfmt = t->sfmt; 126a5a4af3bSchristos if ((int) t->type <= 0) 127a5a4af3bSchristos id->idata = & cgen_virtual_insn_table[- (int) t->type]; 128a5a4af3bSchristos else 129a5a4af3bSchristos id->idata = & insn_table[t->type]; 130a5a4af3bSchristos id->attrs = CGEN_INSN_ATTRS (id->idata); 131a5a4af3bSchristos /* Oh my god, a magic number. */ 132a5a4af3bSchristos id->length = CGEN_INSN_BITSIZE (id->idata) / 8; 133a5a4af3bSchristos 134a5a4af3bSchristos #if WITH_PROFILE_MODEL_P 135a5a4af3bSchristos id->timing = & MODEL_TIMING (CPU_MODEL (cpu)) [t->index]; 136a5a4af3bSchristos { 137a5a4af3bSchristos SIM_DESC sd = CPU_STATE (cpu); 138a5a4af3bSchristos SIM_ASSERT (t->index == id->timing->num); 139a5a4af3bSchristos } 140a5a4af3bSchristos #endif 141a5a4af3bSchristos 142a5a4af3bSchristos /* Semantic pointers are initialized elsewhere. */ 143a5a4af3bSchristos } 144a5a4af3bSchristos 145a5a4af3bSchristos /* Initialize the instruction descriptor table. */ 146a5a4af3bSchristos 147a5a4af3bSchristos void 148a5a4af3bSchristos lm32bf_init_idesc_table (SIM_CPU *cpu) 149a5a4af3bSchristos { 150a5a4af3bSchristos IDESC *id,*tabend; 151a5a4af3bSchristos const struct insn_sem *t,*tend; 152a5a4af3bSchristos int tabsize = LM32BF_INSN__MAX; 153a5a4af3bSchristos IDESC *table = lm32bf_insn_data; 154a5a4af3bSchristos 155a5a4af3bSchristos memset (table, 0, tabsize * sizeof (IDESC)); 156a5a4af3bSchristos 157a5a4af3bSchristos /* First set all entries to the `invalid insn'. */ 158a5a4af3bSchristos t = & lm32bf_insn_sem_invalid; 159a5a4af3bSchristos for (id = table, tabend = table + tabsize; id < tabend; ++id) 160a5a4af3bSchristos init_idesc (cpu, id, t); 161a5a4af3bSchristos 162a5a4af3bSchristos /* Now fill in the values for the chosen cpu. */ 16399e23f81Schristos for (t = lm32bf_insn_sem, tend = t + ARRAY_SIZE (lm32bf_insn_sem); 164a5a4af3bSchristos t != tend; ++t) 165a5a4af3bSchristos { 166a5a4af3bSchristos init_idesc (cpu, & table[t->index], t); 167a5a4af3bSchristos } 168a5a4af3bSchristos 169a5a4af3bSchristos /* Link the IDESC table into the cpu. */ 170a5a4af3bSchristos CPU_IDESC (cpu) = table; 171a5a4af3bSchristos } 172a5a4af3bSchristos 173a5a4af3bSchristos /* Given an instruction, return a pointer to its IDESC entry. */ 174a5a4af3bSchristos 175a5a4af3bSchristos const IDESC * 176a5a4af3bSchristos lm32bf_decode (SIM_CPU *current_cpu, IADDR pc, 177a5a4af3bSchristos CGEN_INSN_WORD base_insn, CGEN_INSN_WORD entire_insn, 178a5a4af3bSchristos ARGBUF *abuf) 179a5a4af3bSchristos { 180a5a4af3bSchristos /* Result of decoder. */ 181a5a4af3bSchristos LM32BF_INSN_TYPE itype; 182a5a4af3bSchristos 183a5a4af3bSchristos { 184a5a4af3bSchristos CGEN_INSN_WORD insn = base_insn; 185a5a4af3bSchristos 186a5a4af3bSchristos { 187a5a4af3bSchristos unsigned int val = (((insn >> 26) & (63 << 0))); 188a5a4af3bSchristos switch (val) 189a5a4af3bSchristos { 190a5a4af3bSchristos case 0 : itype = LM32BF_INSN_SRUI; goto extract_sfmt_addi; 191a5a4af3bSchristos case 1 : itype = LM32BF_INSN_NORI; goto extract_sfmt_andi; 192a5a4af3bSchristos case 2 : itype = LM32BF_INSN_MULI; goto extract_sfmt_addi; 193a5a4af3bSchristos case 3 : itype = LM32BF_INSN_SH; goto extract_sfmt_sh; 194a5a4af3bSchristos case 4 : itype = LM32BF_INSN_LB; goto extract_sfmt_lb; 195a5a4af3bSchristos case 5 : itype = LM32BF_INSN_SRI; goto extract_sfmt_addi; 196a5a4af3bSchristos case 6 : itype = LM32BF_INSN_XORI; goto extract_sfmt_andi; 197a5a4af3bSchristos case 7 : itype = LM32BF_INSN_LH; goto extract_sfmt_lh; 198a5a4af3bSchristos case 8 : itype = LM32BF_INSN_ANDI; goto extract_sfmt_andi; 199a5a4af3bSchristos case 9 : itype = LM32BF_INSN_XNORI; goto extract_sfmt_andi; 200a5a4af3bSchristos case 10 : itype = LM32BF_INSN_LW; goto extract_sfmt_lw; 201a5a4af3bSchristos case 11 : itype = LM32BF_INSN_LHU; goto extract_sfmt_lh; 202a5a4af3bSchristos case 12 : itype = LM32BF_INSN_SB; goto extract_sfmt_sb; 203a5a4af3bSchristos case 13 : itype = LM32BF_INSN_ADDI; goto extract_sfmt_addi; 204a5a4af3bSchristos case 14 : itype = LM32BF_INSN_ORI; goto extract_sfmt_ori; 205a5a4af3bSchristos case 15 : itype = LM32BF_INSN_SLI; goto extract_sfmt_addi; 206a5a4af3bSchristos case 16 : itype = LM32BF_INSN_LBU; goto extract_sfmt_lb; 207a5a4af3bSchristos case 17 : itype = LM32BF_INSN_BE; goto extract_sfmt_be; 208a5a4af3bSchristos case 18 : itype = LM32BF_INSN_BG; goto extract_sfmt_be; 209a5a4af3bSchristos case 19 : itype = LM32BF_INSN_BGE; goto extract_sfmt_be; 210a5a4af3bSchristos case 20 : itype = LM32BF_INSN_BGEU; goto extract_sfmt_be; 211a5a4af3bSchristos case 21 : itype = LM32BF_INSN_BGU; goto extract_sfmt_be; 212a5a4af3bSchristos case 22 : itype = LM32BF_INSN_SW; goto extract_sfmt_sw; 213a5a4af3bSchristos case 23 : itype = LM32BF_INSN_BNE; goto extract_sfmt_be; 214a5a4af3bSchristos case 24 : itype = LM32BF_INSN_ANDHII; goto extract_sfmt_andhii; 215a5a4af3bSchristos case 25 : itype = LM32BF_INSN_CMPEI; goto extract_sfmt_addi; 216a5a4af3bSchristos case 26 : itype = LM32BF_INSN_CMPGI; goto extract_sfmt_addi; 217a5a4af3bSchristos case 27 : itype = LM32BF_INSN_CMPGEI; goto extract_sfmt_addi; 218a5a4af3bSchristos case 28 : itype = LM32BF_INSN_CMPGEUI; goto extract_sfmt_andi; 219a5a4af3bSchristos case 29 : itype = LM32BF_INSN_CMPGUI; goto extract_sfmt_andi; 220a5a4af3bSchristos case 30 : itype = LM32BF_INSN_ORHII; goto extract_sfmt_andhii; 221a5a4af3bSchristos case 31 : itype = LM32BF_INSN_CMPNEI; goto extract_sfmt_addi; 222a5a4af3bSchristos case 32 : 223a5a4af3bSchristos if ((entire_insn & 0xfc0007ff) == 0x80000000) 224a5a4af3bSchristos { itype = LM32BF_INSN_SRU; goto extract_sfmt_add; } 225a5a4af3bSchristos itype = LM32BF_INSN_X_INVALID; goto extract_sfmt_empty; 226a5a4af3bSchristos case 33 : 227a5a4af3bSchristos if ((entire_insn & 0xfc0007ff) == 0x84000000) 228a5a4af3bSchristos { itype = LM32BF_INSN_NOR; goto extract_sfmt_add; } 229a5a4af3bSchristos itype = LM32BF_INSN_X_INVALID; goto extract_sfmt_empty; 230a5a4af3bSchristos case 34 : 231a5a4af3bSchristos if ((entire_insn & 0xfc0007ff) == 0x88000000) 232a5a4af3bSchristos { itype = LM32BF_INSN_MUL; goto extract_sfmt_add; } 233a5a4af3bSchristos itype = LM32BF_INSN_X_INVALID; goto extract_sfmt_empty; 234a5a4af3bSchristos case 35 : 235a5a4af3bSchristos if ((entire_insn & 0xfc0007ff) == 0x8c000000) 236a5a4af3bSchristos { itype = LM32BF_INSN_DIVU; goto extract_sfmt_divu; } 237a5a4af3bSchristos itype = LM32BF_INSN_X_INVALID; goto extract_sfmt_empty; 238a5a4af3bSchristos case 36 : 239a5a4af3bSchristos if ((entire_insn & 0xfc1f07ff) == 0x90000000) 240a5a4af3bSchristos { itype = LM32BF_INSN_RCSR; goto extract_sfmt_rcsr; } 241a5a4af3bSchristos itype = LM32BF_INSN_X_INVALID; goto extract_sfmt_empty; 242a5a4af3bSchristos case 37 : 243a5a4af3bSchristos if ((entire_insn & 0xfc0007ff) == 0x94000000) 244a5a4af3bSchristos { itype = LM32BF_INSN_SR; goto extract_sfmt_add; } 245a5a4af3bSchristos itype = LM32BF_INSN_X_INVALID; goto extract_sfmt_empty; 246a5a4af3bSchristos case 38 : 247a5a4af3bSchristos if ((entire_insn & 0xfc0007ff) == 0x98000000) 248a5a4af3bSchristos { itype = LM32BF_INSN_XOR; goto extract_sfmt_add; } 249a5a4af3bSchristos itype = LM32BF_INSN_X_INVALID; goto extract_sfmt_empty; 250a5a4af3bSchristos case 40 : 251a5a4af3bSchristos if ((entire_insn & 0xfc0007ff) == 0xa0000000) 252a5a4af3bSchristos { itype = LM32BF_INSN_AND; goto extract_sfmt_add; } 253a5a4af3bSchristos itype = LM32BF_INSN_X_INVALID; goto extract_sfmt_empty; 254a5a4af3bSchristos case 41 : 255a5a4af3bSchristos if ((entire_insn & 0xfc0007ff) == 0xa4000000) 256a5a4af3bSchristos { itype = LM32BF_INSN_XNOR; goto extract_sfmt_add; } 257a5a4af3bSchristos itype = LM32BF_INSN_X_INVALID; goto extract_sfmt_empty; 258a5a4af3bSchristos case 43 : 259a5a4af3bSchristos { 260a5a4af3bSchristos unsigned int val = (((insn >> 1) & (1 << 1)) | ((insn >> 0) & (1 << 0))); 261a5a4af3bSchristos switch (val) 262a5a4af3bSchristos { 263a5a4af3bSchristos case 0 : 264a5a4af3bSchristos if ((entire_insn & 0xffffffff) == 0xac000002) 265a5a4af3bSchristos { itype = LM32BF_INSN_BREAK; goto extract_sfmt_break; } 266a5a4af3bSchristos itype = LM32BF_INSN_X_INVALID; goto extract_sfmt_empty; 267a5a4af3bSchristos case 3 : 268a5a4af3bSchristos if ((entire_insn & 0xffffffff) == 0xac000007) 269a5a4af3bSchristos { itype = LM32BF_INSN_SCALL; goto extract_sfmt_break; } 270a5a4af3bSchristos itype = LM32BF_INSN_X_INVALID; goto extract_sfmt_empty; 271a5a4af3bSchristos default : itype = LM32BF_INSN_X_INVALID; goto extract_sfmt_empty; 272a5a4af3bSchristos } 273a5a4af3bSchristos } 274a5a4af3bSchristos case 44 : 275a5a4af3bSchristos if ((entire_insn & 0xfc1f07ff) == 0xb0000000) 276a5a4af3bSchristos { itype = LM32BF_INSN_SEXTB; goto extract_sfmt_sextb; } 277a5a4af3bSchristos itype = LM32BF_INSN_X_INVALID; goto extract_sfmt_empty; 278a5a4af3bSchristos case 45 : 279a5a4af3bSchristos if ((entire_insn & 0xfc0007ff) == 0xb4000000) 280a5a4af3bSchristos { itype = LM32BF_INSN_ADD; goto extract_sfmt_add; } 281a5a4af3bSchristos itype = LM32BF_INSN_X_INVALID; goto extract_sfmt_empty; 282a5a4af3bSchristos case 46 : 283a5a4af3bSchristos if ((entire_insn & 0xfc0007ff) == 0xb8000000) 284a5a4af3bSchristos { itype = LM32BF_INSN_OR; goto extract_sfmt_add; } 285a5a4af3bSchristos itype = LM32BF_INSN_X_INVALID; goto extract_sfmt_empty; 286a5a4af3bSchristos case 47 : 287a5a4af3bSchristos if ((entire_insn & 0xfc0007ff) == 0xbc000000) 288a5a4af3bSchristos { itype = LM32BF_INSN_SL; goto extract_sfmt_add; } 289a5a4af3bSchristos itype = LM32BF_INSN_X_INVALID; goto extract_sfmt_empty; 290a5a4af3bSchristos case 48 : 291a5a4af3bSchristos if ((entire_insn & 0xfc1fffff) == 0xc0000000) 292a5a4af3bSchristos { itype = LM32BF_INSN_B; goto extract_sfmt_b; } 293a5a4af3bSchristos itype = LM32BF_INSN_X_INVALID; goto extract_sfmt_empty; 294a5a4af3bSchristos case 49 : 295a5a4af3bSchristos if ((entire_insn & 0xfc0007ff) == 0xc4000000) 296a5a4af3bSchristos { itype = LM32BF_INSN_MODU; goto extract_sfmt_divu; } 297a5a4af3bSchristos itype = LM32BF_INSN_X_INVALID; goto extract_sfmt_empty; 298a5a4af3bSchristos case 50 : 299a5a4af3bSchristos if ((entire_insn & 0xfc0007ff) == 0xc8000000) 300a5a4af3bSchristos { itype = LM32BF_INSN_SUB; goto extract_sfmt_add; } 301a5a4af3bSchristos itype = LM32BF_INSN_X_INVALID; goto extract_sfmt_empty; 302a5a4af3bSchristos case 51 : itype = LM32BF_INSN_USER; goto extract_sfmt_user; 303a5a4af3bSchristos case 52 : 304a5a4af3bSchristos if ((entire_insn & 0xfc00ffff) == 0xd0000000) 305a5a4af3bSchristos { itype = LM32BF_INSN_WCSR; goto extract_sfmt_wcsr; } 306a5a4af3bSchristos itype = LM32BF_INSN_X_INVALID; goto extract_sfmt_empty; 307a5a4af3bSchristos case 54 : 308a5a4af3bSchristos if ((entire_insn & 0xfc1fffff) == 0xd8000000) 309a5a4af3bSchristos { itype = LM32BF_INSN_CALL; goto extract_sfmt_call; } 310a5a4af3bSchristos itype = LM32BF_INSN_X_INVALID; goto extract_sfmt_empty; 311a5a4af3bSchristos case 55 : 312a5a4af3bSchristos if ((entire_insn & 0xfc1f07ff) == 0xdc000000) 313a5a4af3bSchristos { itype = LM32BF_INSN_SEXTH; goto extract_sfmt_sextb; } 314a5a4af3bSchristos itype = LM32BF_INSN_X_INVALID; goto extract_sfmt_empty; 315a5a4af3bSchristos case 56 : itype = LM32BF_INSN_BI; goto extract_sfmt_bi; 316a5a4af3bSchristos case 57 : 317a5a4af3bSchristos if ((entire_insn & 0xfc0007ff) == 0xe4000000) 318a5a4af3bSchristos { itype = LM32BF_INSN_CMPE; goto extract_sfmt_add; } 319a5a4af3bSchristos itype = LM32BF_INSN_X_INVALID; goto extract_sfmt_empty; 320a5a4af3bSchristos case 58 : 321a5a4af3bSchristos if ((entire_insn & 0xfc0007ff) == 0xe8000000) 322a5a4af3bSchristos { itype = LM32BF_INSN_CMPG; goto extract_sfmt_add; } 323a5a4af3bSchristos itype = LM32BF_INSN_X_INVALID; goto extract_sfmt_empty; 324a5a4af3bSchristos case 59 : 325a5a4af3bSchristos if ((entire_insn & 0xfc0007ff) == 0xec000000) 326a5a4af3bSchristos { itype = LM32BF_INSN_CMPGE; goto extract_sfmt_add; } 327a5a4af3bSchristos itype = LM32BF_INSN_X_INVALID; goto extract_sfmt_empty; 328a5a4af3bSchristos case 60 : 329a5a4af3bSchristos if ((entire_insn & 0xfc0007ff) == 0xf0000000) 330a5a4af3bSchristos { itype = LM32BF_INSN_CMPGEU; goto extract_sfmt_add; } 331a5a4af3bSchristos itype = LM32BF_INSN_X_INVALID; goto extract_sfmt_empty; 332a5a4af3bSchristos case 61 : 333a5a4af3bSchristos if ((entire_insn & 0xfc0007ff) == 0xf4000000) 334a5a4af3bSchristos { itype = LM32BF_INSN_CMPGU; goto extract_sfmt_add; } 335a5a4af3bSchristos itype = LM32BF_INSN_X_INVALID; goto extract_sfmt_empty; 336a5a4af3bSchristos case 62 : itype = LM32BF_INSN_CALLI; goto extract_sfmt_calli; 337a5a4af3bSchristos case 63 : 338a5a4af3bSchristos if ((entire_insn & 0xfc0007ff) == 0xfc000000) 339a5a4af3bSchristos { itype = LM32BF_INSN_CMPNE; goto extract_sfmt_add; } 340a5a4af3bSchristos itype = LM32BF_INSN_X_INVALID; goto extract_sfmt_empty; 341a5a4af3bSchristos default : itype = LM32BF_INSN_X_INVALID; goto extract_sfmt_empty; 342a5a4af3bSchristos } 343a5a4af3bSchristos } 344a5a4af3bSchristos } 345a5a4af3bSchristos 346a5a4af3bSchristos /* The instruction has been decoded, now extract the fields. */ 347a5a4af3bSchristos 348a5a4af3bSchristos extract_sfmt_empty: 349a5a4af3bSchristos { 350a5a4af3bSchristos const IDESC *idesc = &lm32bf_insn_data[itype]; 351a5a4af3bSchristos #define FLD(f) abuf->fields.sfmt_empty.f 352a5a4af3bSchristos 353a5a4af3bSchristos 354a5a4af3bSchristos /* Record the fields for the semantic handler. */ 355a5a4af3bSchristos CGEN_TRACE_EXTRACT (current_cpu, abuf, (current_cpu, pc, "sfmt_empty", (char *) 0)); 356a5a4af3bSchristos 357a5a4af3bSchristos #undef FLD 358a5a4af3bSchristos return idesc; 359a5a4af3bSchristos } 360a5a4af3bSchristos 361a5a4af3bSchristos extract_sfmt_add: 362a5a4af3bSchristos { 363a5a4af3bSchristos const IDESC *idesc = &lm32bf_insn_data[itype]; 364a5a4af3bSchristos CGEN_INSN_WORD insn = entire_insn; 365a5a4af3bSchristos #define FLD(f) abuf->fields.sfmt_user.f 366a5a4af3bSchristos UINT f_r0; 367a5a4af3bSchristos UINT f_r1; 368a5a4af3bSchristos UINT f_r2; 369a5a4af3bSchristos 370a5a4af3bSchristos f_r0 = EXTRACT_LSB0_UINT (insn, 32, 25, 5); 371a5a4af3bSchristos f_r1 = EXTRACT_LSB0_UINT (insn, 32, 20, 5); 372a5a4af3bSchristos f_r2 = EXTRACT_LSB0_UINT (insn, 32, 15, 5); 373a5a4af3bSchristos 374a5a4af3bSchristos /* Record the fields for the semantic handler. */ 375a5a4af3bSchristos FLD (f_r0) = f_r0; 376a5a4af3bSchristos FLD (f_r1) = f_r1; 377a5a4af3bSchristos FLD (f_r2) = f_r2; 378a5a4af3bSchristos CGEN_TRACE_EXTRACT (current_cpu, abuf, (current_cpu, pc, "sfmt_add", "f_r0 0x%x", 'x', f_r0, "f_r1 0x%x", 'x', f_r1, "f_r2 0x%x", 'x', f_r2, (char *) 0)); 379a5a4af3bSchristos 380a5a4af3bSchristos #undef FLD 381a5a4af3bSchristos return idesc; 382a5a4af3bSchristos } 383a5a4af3bSchristos 384a5a4af3bSchristos extract_sfmt_addi: 385a5a4af3bSchristos { 386a5a4af3bSchristos const IDESC *idesc = &lm32bf_insn_data[itype]; 387a5a4af3bSchristos CGEN_INSN_WORD insn = entire_insn; 388a5a4af3bSchristos #define FLD(f) abuf->fields.sfmt_addi.f 389a5a4af3bSchristos UINT f_r0; 390a5a4af3bSchristos UINT f_r1; 391a5a4af3bSchristos INT f_imm; 392a5a4af3bSchristos 393a5a4af3bSchristos f_r0 = EXTRACT_LSB0_UINT (insn, 32, 25, 5); 394a5a4af3bSchristos f_r1 = EXTRACT_LSB0_UINT (insn, 32, 20, 5); 395a5a4af3bSchristos f_imm = EXTRACT_LSB0_SINT (insn, 32, 15, 16); 396a5a4af3bSchristos 397a5a4af3bSchristos /* Record the fields for the semantic handler. */ 398a5a4af3bSchristos FLD (f_imm) = f_imm; 399a5a4af3bSchristos FLD (f_r0) = f_r0; 400a5a4af3bSchristos FLD (f_r1) = f_r1; 401a5a4af3bSchristos CGEN_TRACE_EXTRACT (current_cpu, abuf, (current_cpu, pc, "sfmt_addi", "f_imm 0x%x", 'x', f_imm, "f_r0 0x%x", 'x', f_r0, "f_r1 0x%x", 'x', f_r1, (char *) 0)); 402a5a4af3bSchristos 403a5a4af3bSchristos #undef FLD 404a5a4af3bSchristos return idesc; 405a5a4af3bSchristos } 406a5a4af3bSchristos 407a5a4af3bSchristos extract_sfmt_andi: 408a5a4af3bSchristos { 409a5a4af3bSchristos const IDESC *idesc = &lm32bf_insn_data[itype]; 410a5a4af3bSchristos CGEN_INSN_WORD insn = entire_insn; 411a5a4af3bSchristos #define FLD(f) abuf->fields.sfmt_andi.f 412a5a4af3bSchristos UINT f_r0; 413a5a4af3bSchristos UINT f_r1; 414a5a4af3bSchristos UINT f_uimm; 415a5a4af3bSchristos 416a5a4af3bSchristos f_r0 = EXTRACT_LSB0_UINT (insn, 32, 25, 5); 417a5a4af3bSchristos f_r1 = EXTRACT_LSB0_UINT (insn, 32, 20, 5); 418a5a4af3bSchristos f_uimm = EXTRACT_LSB0_UINT (insn, 32, 15, 16); 419a5a4af3bSchristos 420a5a4af3bSchristos /* Record the fields for the semantic handler. */ 421a5a4af3bSchristos FLD (f_r0) = f_r0; 422a5a4af3bSchristos FLD (f_uimm) = f_uimm; 423a5a4af3bSchristos FLD (f_r1) = f_r1; 424a5a4af3bSchristos CGEN_TRACE_EXTRACT (current_cpu, abuf, (current_cpu, pc, "sfmt_andi", "f_r0 0x%x", 'x', f_r0, "f_uimm 0x%x", 'x', f_uimm, "f_r1 0x%x", 'x', f_r1, (char *) 0)); 425a5a4af3bSchristos 426a5a4af3bSchristos #undef FLD 427a5a4af3bSchristos return idesc; 428a5a4af3bSchristos } 429a5a4af3bSchristos 430a5a4af3bSchristos extract_sfmt_andhii: 431a5a4af3bSchristos { 432a5a4af3bSchristos const IDESC *idesc = &lm32bf_insn_data[itype]; 433a5a4af3bSchristos CGEN_INSN_WORD insn = entire_insn; 434a5a4af3bSchristos #define FLD(f) abuf->fields.sfmt_andi.f 435a5a4af3bSchristos UINT f_r0; 436a5a4af3bSchristos UINT f_r1; 437a5a4af3bSchristos UINT f_uimm; 438a5a4af3bSchristos 439a5a4af3bSchristos f_r0 = EXTRACT_LSB0_UINT (insn, 32, 25, 5); 440a5a4af3bSchristos f_r1 = EXTRACT_LSB0_UINT (insn, 32, 20, 5); 441a5a4af3bSchristos f_uimm = EXTRACT_LSB0_UINT (insn, 32, 15, 16); 442a5a4af3bSchristos 443a5a4af3bSchristos /* Record the fields for the semantic handler. */ 444a5a4af3bSchristos FLD (f_uimm) = f_uimm; 445a5a4af3bSchristos FLD (f_r0) = f_r0; 446a5a4af3bSchristos FLD (f_r1) = f_r1; 447a5a4af3bSchristos CGEN_TRACE_EXTRACT (current_cpu, abuf, (current_cpu, pc, "sfmt_andhii", "f_uimm 0x%x", 'x', f_uimm, "f_r0 0x%x", 'x', f_r0, "f_r1 0x%x", 'x', f_r1, (char *) 0)); 448a5a4af3bSchristos 449a5a4af3bSchristos #undef FLD 450a5a4af3bSchristos return idesc; 451a5a4af3bSchristos } 452a5a4af3bSchristos 453a5a4af3bSchristos extract_sfmt_b: 454a5a4af3bSchristos { 455a5a4af3bSchristos const IDESC *idesc = &lm32bf_insn_data[itype]; 456a5a4af3bSchristos CGEN_INSN_WORD insn = entire_insn; 457a5a4af3bSchristos #define FLD(f) abuf->fields.sfmt_be.f 458a5a4af3bSchristos UINT f_r0; 459a5a4af3bSchristos 460a5a4af3bSchristos f_r0 = EXTRACT_LSB0_UINT (insn, 32, 25, 5); 461a5a4af3bSchristos 462a5a4af3bSchristos /* Record the fields for the semantic handler. */ 463a5a4af3bSchristos FLD (f_r0) = f_r0; 464a5a4af3bSchristos CGEN_TRACE_EXTRACT (current_cpu, abuf, (current_cpu, pc, "sfmt_b", "f_r0 0x%x", 'x', f_r0, (char *) 0)); 465a5a4af3bSchristos 466a5a4af3bSchristos #undef FLD 467a5a4af3bSchristos return idesc; 468a5a4af3bSchristos } 469a5a4af3bSchristos 470a5a4af3bSchristos extract_sfmt_bi: 471a5a4af3bSchristos { 472a5a4af3bSchristos const IDESC *idesc = &lm32bf_insn_data[itype]; 473a5a4af3bSchristos CGEN_INSN_WORD insn = entire_insn; 474a5a4af3bSchristos #define FLD(f) abuf->fields.sfmt_bi.f 475a5a4af3bSchristos SI f_call; 476a5a4af3bSchristos 477a5a4af3bSchristos f_call = ((pc) + (((SI) (((EXTRACT_LSB0_SINT (insn, 32, 25, 26)) << (6))) >> (4)))); 478a5a4af3bSchristos 479a5a4af3bSchristos /* Record the fields for the semantic handler. */ 480a5a4af3bSchristos FLD (i_call) = f_call; 481a5a4af3bSchristos CGEN_TRACE_EXTRACT (current_cpu, abuf, (current_cpu, pc, "sfmt_bi", "call 0x%x", 'x', f_call, (char *) 0)); 482a5a4af3bSchristos 483a5a4af3bSchristos #undef FLD 484a5a4af3bSchristos return idesc; 485a5a4af3bSchristos } 486a5a4af3bSchristos 487a5a4af3bSchristos extract_sfmt_be: 488a5a4af3bSchristos { 489a5a4af3bSchristos const IDESC *idesc = &lm32bf_insn_data[itype]; 490a5a4af3bSchristos CGEN_INSN_WORD insn = entire_insn; 491a5a4af3bSchristos #define FLD(f) abuf->fields.sfmt_be.f 492a5a4af3bSchristos UINT f_r0; 493a5a4af3bSchristos UINT f_r1; 494a5a4af3bSchristos SI f_branch; 495a5a4af3bSchristos 496a5a4af3bSchristos f_r0 = EXTRACT_LSB0_UINT (insn, 32, 25, 5); 497a5a4af3bSchristos f_r1 = EXTRACT_LSB0_UINT (insn, 32, 20, 5); 498a5a4af3bSchristos f_branch = ((pc) + (((SI) (((EXTRACT_LSB0_SINT (insn, 32, 15, 16)) << (16))) >> (14)))); 499a5a4af3bSchristos 500a5a4af3bSchristos /* Record the fields for the semantic handler. */ 501a5a4af3bSchristos FLD (f_r0) = f_r0; 502a5a4af3bSchristos FLD (f_r1) = f_r1; 503a5a4af3bSchristos FLD (i_branch) = f_branch; 504a5a4af3bSchristos CGEN_TRACE_EXTRACT (current_cpu, abuf, (current_cpu, pc, "sfmt_be", "f_r0 0x%x", 'x', f_r0, "f_r1 0x%x", 'x', f_r1, "branch 0x%x", 'x', f_branch, (char *) 0)); 505a5a4af3bSchristos 506a5a4af3bSchristos #undef FLD 507a5a4af3bSchristos return idesc; 508a5a4af3bSchristos } 509a5a4af3bSchristos 510a5a4af3bSchristos extract_sfmt_call: 511a5a4af3bSchristos { 512a5a4af3bSchristos const IDESC *idesc = &lm32bf_insn_data[itype]; 513a5a4af3bSchristos CGEN_INSN_WORD insn = entire_insn; 514a5a4af3bSchristos #define FLD(f) abuf->fields.sfmt_be.f 515a5a4af3bSchristos UINT f_r0; 516a5a4af3bSchristos 517a5a4af3bSchristos f_r0 = EXTRACT_LSB0_UINT (insn, 32, 25, 5); 518a5a4af3bSchristos 519a5a4af3bSchristos /* Record the fields for the semantic handler. */ 520a5a4af3bSchristos FLD (f_r0) = f_r0; 521a5a4af3bSchristos CGEN_TRACE_EXTRACT (current_cpu, abuf, (current_cpu, pc, "sfmt_call", "f_r0 0x%x", 'x', f_r0, (char *) 0)); 522a5a4af3bSchristos 523a5a4af3bSchristos #undef FLD 524a5a4af3bSchristos return idesc; 525a5a4af3bSchristos } 526a5a4af3bSchristos 527a5a4af3bSchristos extract_sfmt_calli: 528a5a4af3bSchristos { 529a5a4af3bSchristos const IDESC *idesc = &lm32bf_insn_data[itype]; 530a5a4af3bSchristos CGEN_INSN_WORD insn = entire_insn; 531a5a4af3bSchristos #define FLD(f) abuf->fields.sfmt_bi.f 532a5a4af3bSchristos SI f_call; 533a5a4af3bSchristos 534a5a4af3bSchristos f_call = ((pc) + (((SI) (((EXTRACT_LSB0_SINT (insn, 32, 25, 26)) << (6))) >> (4)))); 535a5a4af3bSchristos 536a5a4af3bSchristos /* Record the fields for the semantic handler. */ 537a5a4af3bSchristos FLD (i_call) = f_call; 538a5a4af3bSchristos CGEN_TRACE_EXTRACT (current_cpu, abuf, (current_cpu, pc, "sfmt_calli", "call 0x%x", 'x', f_call, (char *) 0)); 539a5a4af3bSchristos 540a5a4af3bSchristos #undef FLD 541a5a4af3bSchristos return idesc; 542a5a4af3bSchristos } 543a5a4af3bSchristos 544a5a4af3bSchristos extract_sfmt_divu: 545a5a4af3bSchristos { 546a5a4af3bSchristos const IDESC *idesc = &lm32bf_insn_data[itype]; 547a5a4af3bSchristos CGEN_INSN_WORD insn = entire_insn; 548a5a4af3bSchristos #define FLD(f) abuf->fields.sfmt_user.f 549a5a4af3bSchristos UINT f_r0; 550a5a4af3bSchristos UINT f_r1; 551a5a4af3bSchristos UINT f_r2; 552a5a4af3bSchristos 553a5a4af3bSchristos f_r0 = EXTRACT_LSB0_UINT (insn, 32, 25, 5); 554a5a4af3bSchristos f_r1 = EXTRACT_LSB0_UINT (insn, 32, 20, 5); 555a5a4af3bSchristos f_r2 = EXTRACT_LSB0_UINT (insn, 32, 15, 5); 556a5a4af3bSchristos 557a5a4af3bSchristos /* Record the fields for the semantic handler. */ 558a5a4af3bSchristos FLD (f_r0) = f_r0; 559a5a4af3bSchristos FLD (f_r1) = f_r1; 560a5a4af3bSchristos FLD (f_r2) = f_r2; 561a5a4af3bSchristos CGEN_TRACE_EXTRACT (current_cpu, abuf, (current_cpu, pc, "sfmt_divu", "f_r0 0x%x", 'x', f_r0, "f_r1 0x%x", 'x', f_r1, "f_r2 0x%x", 'x', f_r2, (char *) 0)); 562a5a4af3bSchristos 563a5a4af3bSchristos #undef FLD 564a5a4af3bSchristos return idesc; 565a5a4af3bSchristos } 566a5a4af3bSchristos 567a5a4af3bSchristos extract_sfmt_lb: 568a5a4af3bSchristos { 569a5a4af3bSchristos const IDESC *idesc = &lm32bf_insn_data[itype]; 570a5a4af3bSchristos CGEN_INSN_WORD insn = entire_insn; 571a5a4af3bSchristos #define FLD(f) abuf->fields.sfmt_addi.f 572a5a4af3bSchristos UINT f_r0; 573a5a4af3bSchristos UINT f_r1; 574a5a4af3bSchristos INT f_imm; 575a5a4af3bSchristos 576a5a4af3bSchristos f_r0 = EXTRACT_LSB0_UINT (insn, 32, 25, 5); 577a5a4af3bSchristos f_r1 = EXTRACT_LSB0_UINT (insn, 32, 20, 5); 578a5a4af3bSchristos f_imm = EXTRACT_LSB0_SINT (insn, 32, 15, 16); 579a5a4af3bSchristos 580a5a4af3bSchristos /* Record the fields for the semantic handler. */ 581a5a4af3bSchristos FLD (f_imm) = f_imm; 582a5a4af3bSchristos FLD (f_r0) = f_r0; 583a5a4af3bSchristos FLD (f_r1) = f_r1; 584a5a4af3bSchristos CGEN_TRACE_EXTRACT (current_cpu, abuf, (current_cpu, pc, "sfmt_lb", "f_imm 0x%x", 'x', f_imm, "f_r0 0x%x", 'x', f_r0, "f_r1 0x%x", 'x', f_r1, (char *) 0)); 585a5a4af3bSchristos 586a5a4af3bSchristos #undef FLD 587a5a4af3bSchristos return idesc; 588a5a4af3bSchristos } 589a5a4af3bSchristos 590a5a4af3bSchristos extract_sfmt_lh: 591a5a4af3bSchristos { 592a5a4af3bSchristos const IDESC *idesc = &lm32bf_insn_data[itype]; 593a5a4af3bSchristos CGEN_INSN_WORD insn = entire_insn; 594a5a4af3bSchristos #define FLD(f) abuf->fields.sfmt_addi.f 595a5a4af3bSchristos UINT f_r0; 596a5a4af3bSchristos UINT f_r1; 597a5a4af3bSchristos INT f_imm; 598a5a4af3bSchristos 599a5a4af3bSchristos f_r0 = EXTRACT_LSB0_UINT (insn, 32, 25, 5); 600a5a4af3bSchristos f_r1 = EXTRACT_LSB0_UINT (insn, 32, 20, 5); 601a5a4af3bSchristos f_imm = EXTRACT_LSB0_SINT (insn, 32, 15, 16); 602a5a4af3bSchristos 603a5a4af3bSchristos /* Record the fields for the semantic handler. */ 604a5a4af3bSchristos FLD (f_imm) = f_imm; 605a5a4af3bSchristos FLD (f_r0) = f_r0; 606a5a4af3bSchristos FLD (f_r1) = f_r1; 607a5a4af3bSchristos CGEN_TRACE_EXTRACT (current_cpu, abuf, (current_cpu, pc, "sfmt_lh", "f_imm 0x%x", 'x', f_imm, "f_r0 0x%x", 'x', f_r0, "f_r1 0x%x", 'x', f_r1, (char *) 0)); 608a5a4af3bSchristos 609a5a4af3bSchristos #undef FLD 610a5a4af3bSchristos return idesc; 611a5a4af3bSchristos } 612a5a4af3bSchristos 613a5a4af3bSchristos extract_sfmt_lw: 614a5a4af3bSchristos { 615a5a4af3bSchristos const IDESC *idesc = &lm32bf_insn_data[itype]; 616a5a4af3bSchristos CGEN_INSN_WORD insn = entire_insn; 617a5a4af3bSchristos #define FLD(f) abuf->fields.sfmt_addi.f 618a5a4af3bSchristos UINT f_r0; 619a5a4af3bSchristos UINT f_r1; 620a5a4af3bSchristos INT f_imm; 621a5a4af3bSchristos 622a5a4af3bSchristos f_r0 = EXTRACT_LSB0_UINT (insn, 32, 25, 5); 623a5a4af3bSchristos f_r1 = EXTRACT_LSB0_UINT (insn, 32, 20, 5); 624a5a4af3bSchristos f_imm = EXTRACT_LSB0_SINT (insn, 32, 15, 16); 625a5a4af3bSchristos 626a5a4af3bSchristos /* Record the fields for the semantic handler. */ 627a5a4af3bSchristos FLD (f_imm) = f_imm; 628a5a4af3bSchristos FLD (f_r0) = f_r0; 629a5a4af3bSchristos FLD (f_r1) = f_r1; 630a5a4af3bSchristos CGEN_TRACE_EXTRACT (current_cpu, abuf, (current_cpu, pc, "sfmt_lw", "f_imm 0x%x", 'x', f_imm, "f_r0 0x%x", 'x', f_r0, "f_r1 0x%x", 'x', f_r1, (char *) 0)); 631a5a4af3bSchristos 632a5a4af3bSchristos #undef FLD 633a5a4af3bSchristos return idesc; 634a5a4af3bSchristos } 635a5a4af3bSchristos 636a5a4af3bSchristos extract_sfmt_ori: 637a5a4af3bSchristos { 638a5a4af3bSchristos const IDESC *idesc = &lm32bf_insn_data[itype]; 639a5a4af3bSchristos CGEN_INSN_WORD insn = entire_insn; 640a5a4af3bSchristos #define FLD(f) abuf->fields.sfmt_andi.f 641a5a4af3bSchristos UINT f_r0; 642a5a4af3bSchristos UINT f_r1; 643a5a4af3bSchristos UINT f_uimm; 644a5a4af3bSchristos 645a5a4af3bSchristos f_r0 = EXTRACT_LSB0_UINT (insn, 32, 25, 5); 646a5a4af3bSchristos f_r1 = EXTRACT_LSB0_UINT (insn, 32, 20, 5); 647a5a4af3bSchristos f_uimm = EXTRACT_LSB0_UINT (insn, 32, 15, 16); 648a5a4af3bSchristos 649a5a4af3bSchristos /* Record the fields for the semantic handler. */ 650a5a4af3bSchristos FLD (f_uimm) = f_uimm; 651a5a4af3bSchristos FLD (f_r0) = f_r0; 652a5a4af3bSchristos FLD (f_r1) = f_r1; 653a5a4af3bSchristos CGEN_TRACE_EXTRACT (current_cpu, abuf, (current_cpu, pc, "sfmt_ori", "f_uimm 0x%x", 'x', f_uimm, "f_r0 0x%x", 'x', f_r0, "f_r1 0x%x", 'x', f_r1, (char *) 0)); 654a5a4af3bSchristos 655a5a4af3bSchristos #undef FLD 656a5a4af3bSchristos return idesc; 657a5a4af3bSchristos } 658a5a4af3bSchristos 659a5a4af3bSchristos extract_sfmt_rcsr: 660a5a4af3bSchristos { 661a5a4af3bSchristos const IDESC *idesc = &lm32bf_insn_data[itype]; 662a5a4af3bSchristos CGEN_INSN_WORD insn = entire_insn; 663a5a4af3bSchristos #define FLD(f) abuf->fields.sfmt_rcsr.f 664a5a4af3bSchristos UINT f_csr; 665a5a4af3bSchristos UINT f_r2; 666a5a4af3bSchristos 667a5a4af3bSchristos f_csr = EXTRACT_LSB0_UINT (insn, 32, 25, 5); 668a5a4af3bSchristos f_r2 = EXTRACT_LSB0_UINT (insn, 32, 15, 5); 669a5a4af3bSchristos 670a5a4af3bSchristos /* Record the fields for the semantic handler. */ 671a5a4af3bSchristos FLD (f_csr) = f_csr; 672a5a4af3bSchristos FLD (f_r2) = f_r2; 673a5a4af3bSchristos CGEN_TRACE_EXTRACT (current_cpu, abuf, (current_cpu, pc, "sfmt_rcsr", "f_csr 0x%x", 'x', f_csr, "f_r2 0x%x", 'x', f_r2, (char *) 0)); 674a5a4af3bSchristos 675a5a4af3bSchristos #undef FLD 676a5a4af3bSchristos return idesc; 677a5a4af3bSchristos } 678a5a4af3bSchristos 679a5a4af3bSchristos extract_sfmt_sb: 680a5a4af3bSchristos { 681a5a4af3bSchristos const IDESC *idesc = &lm32bf_insn_data[itype]; 682a5a4af3bSchristos CGEN_INSN_WORD insn = entire_insn; 683a5a4af3bSchristos #define FLD(f) abuf->fields.sfmt_addi.f 684a5a4af3bSchristos UINT f_r0; 685a5a4af3bSchristos UINT f_r1; 686a5a4af3bSchristos INT f_imm; 687a5a4af3bSchristos 688a5a4af3bSchristos f_r0 = EXTRACT_LSB0_UINT (insn, 32, 25, 5); 689a5a4af3bSchristos f_r1 = EXTRACT_LSB0_UINT (insn, 32, 20, 5); 690a5a4af3bSchristos f_imm = EXTRACT_LSB0_SINT (insn, 32, 15, 16); 691a5a4af3bSchristos 692a5a4af3bSchristos /* Record the fields for the semantic handler. */ 693a5a4af3bSchristos FLD (f_imm) = f_imm; 694a5a4af3bSchristos FLD (f_r0) = f_r0; 695a5a4af3bSchristos FLD (f_r1) = f_r1; 696a5a4af3bSchristos CGEN_TRACE_EXTRACT (current_cpu, abuf, (current_cpu, pc, "sfmt_sb", "f_imm 0x%x", 'x', f_imm, "f_r0 0x%x", 'x', f_r0, "f_r1 0x%x", 'x', f_r1, (char *) 0)); 697a5a4af3bSchristos 698a5a4af3bSchristos #undef FLD 699a5a4af3bSchristos return idesc; 700a5a4af3bSchristos } 701a5a4af3bSchristos 702a5a4af3bSchristos extract_sfmt_sextb: 703a5a4af3bSchristos { 704a5a4af3bSchristos const IDESC *idesc = &lm32bf_insn_data[itype]; 705a5a4af3bSchristos CGEN_INSN_WORD insn = entire_insn; 706a5a4af3bSchristos #define FLD(f) abuf->fields.sfmt_user.f 707a5a4af3bSchristos UINT f_r0; 708a5a4af3bSchristos UINT f_r2; 709a5a4af3bSchristos 710a5a4af3bSchristos f_r0 = EXTRACT_LSB0_UINT (insn, 32, 25, 5); 711a5a4af3bSchristos f_r2 = EXTRACT_LSB0_UINT (insn, 32, 15, 5); 712a5a4af3bSchristos 713a5a4af3bSchristos /* Record the fields for the semantic handler. */ 714a5a4af3bSchristos FLD (f_r0) = f_r0; 715a5a4af3bSchristos FLD (f_r2) = f_r2; 716a5a4af3bSchristos CGEN_TRACE_EXTRACT (current_cpu, abuf, (current_cpu, pc, "sfmt_sextb", "f_r0 0x%x", 'x', f_r0, "f_r2 0x%x", 'x', f_r2, (char *) 0)); 717a5a4af3bSchristos 718a5a4af3bSchristos #undef FLD 719a5a4af3bSchristos return idesc; 720a5a4af3bSchristos } 721a5a4af3bSchristos 722a5a4af3bSchristos extract_sfmt_sh: 723a5a4af3bSchristos { 724a5a4af3bSchristos const IDESC *idesc = &lm32bf_insn_data[itype]; 725a5a4af3bSchristos CGEN_INSN_WORD insn = entire_insn; 726a5a4af3bSchristos #define FLD(f) abuf->fields.sfmt_addi.f 727a5a4af3bSchristos UINT f_r0; 728a5a4af3bSchristos UINT f_r1; 729a5a4af3bSchristos INT f_imm; 730a5a4af3bSchristos 731a5a4af3bSchristos f_r0 = EXTRACT_LSB0_UINT (insn, 32, 25, 5); 732a5a4af3bSchristos f_r1 = EXTRACT_LSB0_UINT (insn, 32, 20, 5); 733a5a4af3bSchristos f_imm = EXTRACT_LSB0_SINT (insn, 32, 15, 16); 734a5a4af3bSchristos 735a5a4af3bSchristos /* Record the fields for the semantic handler. */ 736a5a4af3bSchristos FLD (f_imm) = f_imm; 737a5a4af3bSchristos FLD (f_r0) = f_r0; 738a5a4af3bSchristos FLD (f_r1) = f_r1; 739a5a4af3bSchristos CGEN_TRACE_EXTRACT (current_cpu, abuf, (current_cpu, pc, "sfmt_sh", "f_imm 0x%x", 'x', f_imm, "f_r0 0x%x", 'x', f_r0, "f_r1 0x%x", 'x', f_r1, (char *) 0)); 740a5a4af3bSchristos 741a5a4af3bSchristos #undef FLD 742a5a4af3bSchristos return idesc; 743a5a4af3bSchristos } 744a5a4af3bSchristos 745a5a4af3bSchristos extract_sfmt_sw: 746a5a4af3bSchristos { 747a5a4af3bSchristos const IDESC *idesc = &lm32bf_insn_data[itype]; 748a5a4af3bSchristos CGEN_INSN_WORD insn = entire_insn; 749a5a4af3bSchristos #define FLD(f) abuf->fields.sfmt_addi.f 750a5a4af3bSchristos UINT f_r0; 751a5a4af3bSchristos UINT f_r1; 752a5a4af3bSchristos INT f_imm; 753a5a4af3bSchristos 754a5a4af3bSchristos f_r0 = EXTRACT_LSB0_UINT (insn, 32, 25, 5); 755a5a4af3bSchristos f_r1 = EXTRACT_LSB0_UINT (insn, 32, 20, 5); 756a5a4af3bSchristos f_imm = EXTRACT_LSB0_SINT (insn, 32, 15, 16); 757a5a4af3bSchristos 758a5a4af3bSchristos /* Record the fields for the semantic handler. */ 759a5a4af3bSchristos FLD (f_imm) = f_imm; 760a5a4af3bSchristos FLD (f_r0) = f_r0; 761a5a4af3bSchristos FLD (f_r1) = f_r1; 762a5a4af3bSchristos CGEN_TRACE_EXTRACT (current_cpu, abuf, (current_cpu, pc, "sfmt_sw", "f_imm 0x%x", 'x', f_imm, "f_r0 0x%x", 'x', f_r0, "f_r1 0x%x", 'x', f_r1, (char *) 0)); 763a5a4af3bSchristos 764a5a4af3bSchristos #undef FLD 765a5a4af3bSchristos return idesc; 766a5a4af3bSchristos } 767a5a4af3bSchristos 768a5a4af3bSchristos extract_sfmt_user: 769a5a4af3bSchristos { 770a5a4af3bSchristos const IDESC *idesc = &lm32bf_insn_data[itype]; 771a5a4af3bSchristos CGEN_INSN_WORD insn = entire_insn; 772a5a4af3bSchristos #define FLD(f) abuf->fields.sfmt_user.f 773a5a4af3bSchristos UINT f_r0; 774a5a4af3bSchristos UINT f_r1; 775a5a4af3bSchristos UINT f_r2; 776a5a4af3bSchristos UINT f_user; 777a5a4af3bSchristos 778a5a4af3bSchristos f_r0 = EXTRACT_LSB0_UINT (insn, 32, 25, 5); 779a5a4af3bSchristos f_r1 = EXTRACT_LSB0_UINT (insn, 32, 20, 5); 780a5a4af3bSchristos f_r2 = EXTRACT_LSB0_UINT (insn, 32, 15, 5); 781a5a4af3bSchristos f_user = EXTRACT_LSB0_UINT (insn, 32, 10, 11); 782a5a4af3bSchristos 783a5a4af3bSchristos /* Record the fields for the semantic handler. */ 784a5a4af3bSchristos FLD (f_r0) = f_r0; 785a5a4af3bSchristos FLD (f_r1) = f_r1; 786a5a4af3bSchristos FLD (f_user) = f_user; 787a5a4af3bSchristos FLD (f_r2) = f_r2; 788a5a4af3bSchristos CGEN_TRACE_EXTRACT (current_cpu, abuf, (current_cpu, pc, "sfmt_user", "f_r0 0x%x", 'x', f_r0, "f_r1 0x%x", 'x', f_r1, "f_user 0x%x", 'x', f_user, "f_r2 0x%x", 'x', f_r2, (char *) 0)); 789a5a4af3bSchristos 790a5a4af3bSchristos #undef FLD 791a5a4af3bSchristos return idesc; 792a5a4af3bSchristos } 793a5a4af3bSchristos 794a5a4af3bSchristos extract_sfmt_wcsr: 795a5a4af3bSchristos { 796a5a4af3bSchristos const IDESC *idesc = &lm32bf_insn_data[itype]; 797a5a4af3bSchristos CGEN_INSN_WORD insn = entire_insn; 798a5a4af3bSchristos #define FLD(f) abuf->fields.sfmt_wcsr.f 799a5a4af3bSchristos UINT f_csr; 800a5a4af3bSchristos UINT f_r1; 801a5a4af3bSchristos 802a5a4af3bSchristos f_csr = EXTRACT_LSB0_UINT (insn, 32, 25, 5); 803a5a4af3bSchristos f_r1 = EXTRACT_LSB0_UINT (insn, 32, 20, 5); 804a5a4af3bSchristos 805a5a4af3bSchristos /* Record the fields for the semantic handler. */ 806a5a4af3bSchristos FLD (f_csr) = f_csr; 807a5a4af3bSchristos FLD (f_r1) = f_r1; 808a5a4af3bSchristos CGEN_TRACE_EXTRACT (current_cpu, abuf, (current_cpu, pc, "sfmt_wcsr", "f_csr 0x%x", 'x', f_csr, "f_r1 0x%x", 'x', f_r1, (char *) 0)); 809a5a4af3bSchristos 810a5a4af3bSchristos #undef FLD 811a5a4af3bSchristos return idesc; 812a5a4af3bSchristos } 813a5a4af3bSchristos 814a5a4af3bSchristos extract_sfmt_break: 815a5a4af3bSchristos { 816a5a4af3bSchristos const IDESC *idesc = &lm32bf_insn_data[itype]; 817a5a4af3bSchristos #define FLD(f) abuf->fields.sfmt_empty.f 818a5a4af3bSchristos 819a5a4af3bSchristos 820a5a4af3bSchristos /* Record the fields for the semantic handler. */ 821a5a4af3bSchristos CGEN_TRACE_EXTRACT (current_cpu, abuf, (current_cpu, pc, "sfmt_break", (char *) 0)); 822a5a4af3bSchristos 823a5a4af3bSchristos #undef FLD 824a5a4af3bSchristos return idesc; 825a5a4af3bSchristos } 826a5a4af3bSchristos 827a5a4af3bSchristos } 828