1a5a4af3bSchristos /* CPU family header for m32rbf. 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 #ifndef CPU_M32RBF_H 25a5a4af3bSchristos #define CPU_M32RBF_H 26a5a4af3bSchristos 27a5a4af3bSchristos /* Maximum number of instructions that are fetched at a time. 28a5a4af3bSchristos This is for LIW type instructions sets (e.g. m32r). */ 29a5a4af3bSchristos #define MAX_LIW_INSNS 2 30a5a4af3bSchristos 31a5a4af3bSchristos /* Maximum number of instructions that can be executed in parallel. */ 32a5a4af3bSchristos #define MAX_PARALLEL_INSNS 1 33a5a4af3bSchristos 34a5a4af3bSchristos /* The size of an "int" needed to hold an instruction word. 35a5a4af3bSchristos This is usually 32 bits, but some architectures needs 64 bits. */ 36a5a4af3bSchristos typedef CGEN_INSN_INT CGEN_INSN_WORD; 37a5a4af3bSchristos 38a5a4af3bSchristos #include "cgen-engine.h" 39a5a4af3bSchristos 40a5a4af3bSchristos /* CPU state information. */ 41a5a4af3bSchristos typedef struct { 42a5a4af3bSchristos /* Hardware elements. */ 43a5a4af3bSchristos struct { 44a5a4af3bSchristos /* program counter */ 45a5a4af3bSchristos USI h_pc; 46a5a4af3bSchristos #define GET_H_PC() CPU (h_pc) 47a5a4af3bSchristos #define SET_H_PC(x) (CPU (h_pc) = (x)) 48a5a4af3bSchristos /* general registers */ 49a5a4af3bSchristos SI h_gr[16]; 50a5a4af3bSchristos #define GET_H_GR(a1) CPU (h_gr)[a1] 51a5a4af3bSchristos #define SET_H_GR(a1, x) (CPU (h_gr)[a1] = (x)) 52a5a4af3bSchristos /* control registers */ 53a5a4af3bSchristos USI h_cr[16]; 54a5a4af3bSchristos #define GET_H_CR(index) m32rbf_h_cr_get_handler (current_cpu, index) 55a5a4af3bSchristos #define SET_H_CR(index, x) \ 56a5a4af3bSchristos do { \ 57a5a4af3bSchristos m32rbf_h_cr_set_handler (current_cpu, (index), (x));\ 58a5a4af3bSchristos ;} while (0) 59a5a4af3bSchristos /* accumulator */ 60a5a4af3bSchristos DI h_accum; 61a5a4af3bSchristos #define GET_H_ACCUM() m32rbf_h_accum_get_handler (current_cpu) 62a5a4af3bSchristos #define SET_H_ACCUM(x) \ 63a5a4af3bSchristos do { \ 64a5a4af3bSchristos m32rbf_h_accum_set_handler (current_cpu, (x));\ 65a5a4af3bSchristos ;} while (0) 66a5a4af3bSchristos /* condition bit */ 67a5a4af3bSchristos BI h_cond; 68a5a4af3bSchristos #define GET_H_COND() CPU (h_cond) 69a5a4af3bSchristos #define SET_H_COND(x) (CPU (h_cond) = (x)) 70a5a4af3bSchristos /* psw part of psw */ 71a5a4af3bSchristos UQI h_psw; 72a5a4af3bSchristos #define GET_H_PSW() m32rbf_h_psw_get_handler (current_cpu) 73a5a4af3bSchristos #define SET_H_PSW(x) \ 74a5a4af3bSchristos do { \ 75a5a4af3bSchristos m32rbf_h_psw_set_handler (current_cpu, (x));\ 76a5a4af3bSchristos ;} while (0) 77a5a4af3bSchristos /* backup psw */ 78a5a4af3bSchristos UQI h_bpsw; 79a5a4af3bSchristos #define GET_H_BPSW() CPU (h_bpsw) 80a5a4af3bSchristos #define SET_H_BPSW(x) (CPU (h_bpsw) = (x)) 81a5a4af3bSchristos /* backup bpsw */ 82a5a4af3bSchristos UQI h_bbpsw; 83a5a4af3bSchristos #define GET_H_BBPSW() CPU (h_bbpsw) 84a5a4af3bSchristos #define SET_H_BBPSW(x) (CPU (h_bbpsw) = (x)) 85a5a4af3bSchristos /* lock */ 86a5a4af3bSchristos BI h_lock; 87a5a4af3bSchristos #define GET_H_LOCK() CPU (h_lock) 88a5a4af3bSchristos #define SET_H_LOCK(x) (CPU (h_lock) = (x)) 89a5a4af3bSchristos } hardware; 90a5a4af3bSchristos #define CPU_CGEN_HW(cpu) (& (cpu)->cpu_data.hardware) 91a5a4af3bSchristos } M32RBF_CPU_DATA; 92a5a4af3bSchristos 93a5a4af3bSchristos /* Cover fns for register access. */ 94a5a4af3bSchristos USI m32rbf_h_pc_get (SIM_CPU *); 95a5a4af3bSchristos void m32rbf_h_pc_set (SIM_CPU *, USI); 96a5a4af3bSchristos SI m32rbf_h_gr_get (SIM_CPU *, UINT); 97a5a4af3bSchristos void m32rbf_h_gr_set (SIM_CPU *, UINT, SI); 98a5a4af3bSchristos USI m32rbf_h_cr_get (SIM_CPU *, UINT); 99a5a4af3bSchristos void m32rbf_h_cr_set (SIM_CPU *, UINT, USI); 100a5a4af3bSchristos DI m32rbf_h_accum_get (SIM_CPU *); 101a5a4af3bSchristos void m32rbf_h_accum_set (SIM_CPU *, DI); 102a5a4af3bSchristos BI m32rbf_h_cond_get (SIM_CPU *); 103a5a4af3bSchristos void m32rbf_h_cond_set (SIM_CPU *, BI); 104a5a4af3bSchristos UQI m32rbf_h_psw_get (SIM_CPU *); 105a5a4af3bSchristos void m32rbf_h_psw_set (SIM_CPU *, UQI); 106a5a4af3bSchristos UQI m32rbf_h_bpsw_get (SIM_CPU *); 107a5a4af3bSchristos void m32rbf_h_bpsw_set (SIM_CPU *, UQI); 108a5a4af3bSchristos UQI m32rbf_h_bbpsw_get (SIM_CPU *); 109a5a4af3bSchristos void m32rbf_h_bbpsw_set (SIM_CPU *, UQI); 110a5a4af3bSchristos BI m32rbf_h_lock_get (SIM_CPU *); 111a5a4af3bSchristos void m32rbf_h_lock_set (SIM_CPU *, BI); 112a5a4af3bSchristos 113a5a4af3bSchristos /* These must be hand-written. */ 114a5a4af3bSchristos extern CPUREG_FETCH_FN m32rbf_fetch_register; 115a5a4af3bSchristos extern CPUREG_STORE_FN m32rbf_store_register; 116a5a4af3bSchristos 117a5a4af3bSchristos typedef struct { 118a5a4af3bSchristos UINT h_gr; 119a5a4af3bSchristos } MODEL_M32R_D_DATA; 120a5a4af3bSchristos 121a5a4af3bSchristos typedef struct { 122a5a4af3bSchristos int empty; 123a5a4af3bSchristos } MODEL_TEST_DATA; 124a5a4af3bSchristos 125a5a4af3bSchristos /* Instruction argument buffer. */ 126a5a4af3bSchristos 127a5a4af3bSchristos union sem_fields { 128a5a4af3bSchristos struct { /* no operands */ 129a5a4af3bSchristos int empty; 130a5a4af3bSchristos } sfmt_empty; 131a5a4af3bSchristos struct { /* */ 132a5a4af3bSchristos UINT f_uimm8; 133a5a4af3bSchristos } sfmt_clrpsw; 134a5a4af3bSchristos struct { /* */ 135a5a4af3bSchristos UINT f_uimm4; 136a5a4af3bSchristos } sfmt_trap; 137a5a4af3bSchristos struct { /* */ 138a5a4af3bSchristos IADDR i_disp24; 139a5a4af3bSchristos unsigned char out_h_gr_SI_14; 140a5a4af3bSchristos } sfmt_bl24; 141a5a4af3bSchristos struct { /* */ 142a5a4af3bSchristos IADDR i_disp8; 143a5a4af3bSchristos unsigned char out_h_gr_SI_14; 144a5a4af3bSchristos } sfmt_bl8; 145a5a4af3bSchristos struct { /* */ 146a5a4af3bSchristos SI* i_dr; 147a5a4af3bSchristos UINT f_hi16; 148a5a4af3bSchristos UINT f_r1; 149a5a4af3bSchristos unsigned char out_dr; 150a5a4af3bSchristos } sfmt_seth; 151a5a4af3bSchristos struct { /* */ 152a5a4af3bSchristos ADDR i_uimm24; 153a5a4af3bSchristos SI* i_dr; 154a5a4af3bSchristos UINT f_r1; 155a5a4af3bSchristos unsigned char out_dr; 156a5a4af3bSchristos } sfmt_ld24; 157a5a4af3bSchristos struct { /* */ 158a5a4af3bSchristos SI* i_sr; 159a5a4af3bSchristos UINT f_r2; 160a5a4af3bSchristos unsigned char in_sr; 161a5a4af3bSchristos unsigned char out_h_gr_SI_14; 162a5a4af3bSchristos } sfmt_jl; 163a5a4af3bSchristos struct { /* */ 164a5a4af3bSchristos SI* i_sr; 165a5a4af3bSchristos INT f_simm16; 166a5a4af3bSchristos UINT f_r2; 167a5a4af3bSchristos UINT f_uimm3; 168a5a4af3bSchristos unsigned char in_sr; 169a5a4af3bSchristos } sfmt_bset; 170a5a4af3bSchristos struct { /* */ 171a5a4af3bSchristos SI* i_dr; 172a5a4af3bSchristos UINT f_r1; 173a5a4af3bSchristos UINT f_uimm5; 174a5a4af3bSchristos unsigned char in_dr; 175a5a4af3bSchristos unsigned char out_dr; 176a5a4af3bSchristos } sfmt_slli; 177a5a4af3bSchristos struct { /* */ 178a5a4af3bSchristos SI* i_dr; 179a5a4af3bSchristos INT f_simm8; 180a5a4af3bSchristos UINT f_r1; 181a5a4af3bSchristos unsigned char in_dr; 182a5a4af3bSchristos unsigned char out_dr; 183a5a4af3bSchristos } sfmt_addi; 184a5a4af3bSchristos struct { /* */ 185a5a4af3bSchristos SI* i_src1; 186a5a4af3bSchristos SI* i_src2; 187a5a4af3bSchristos UINT f_r1; 188a5a4af3bSchristos UINT f_r2; 189a5a4af3bSchristos unsigned char in_src1; 190a5a4af3bSchristos unsigned char in_src2; 191a5a4af3bSchristos unsigned char out_src2; 192a5a4af3bSchristos } sfmt_st_plus; 193a5a4af3bSchristos struct { /* */ 194a5a4af3bSchristos SI* i_src1; 195a5a4af3bSchristos SI* i_src2; 196a5a4af3bSchristos INT f_simm16; 197a5a4af3bSchristos UINT f_r1; 198a5a4af3bSchristos UINT f_r2; 199a5a4af3bSchristos unsigned char in_src1; 200a5a4af3bSchristos unsigned char in_src2; 201a5a4af3bSchristos } sfmt_st_d; 202a5a4af3bSchristos struct { /* */ 203a5a4af3bSchristos SI* i_dr; 204a5a4af3bSchristos SI* i_sr; 205a5a4af3bSchristos UINT f_r1; 206a5a4af3bSchristos UINT f_r2; 207a5a4af3bSchristos unsigned char in_sr; 208a5a4af3bSchristos unsigned char out_dr; 209a5a4af3bSchristos unsigned char out_sr; 210a5a4af3bSchristos } sfmt_ld_plus; 211a5a4af3bSchristos struct { /* */ 212a5a4af3bSchristos IADDR i_disp16; 213a5a4af3bSchristos SI* i_src1; 214a5a4af3bSchristos SI* i_src2; 215a5a4af3bSchristos UINT f_r1; 216a5a4af3bSchristos UINT f_r2; 217a5a4af3bSchristos unsigned char in_src1; 218a5a4af3bSchristos unsigned char in_src2; 219a5a4af3bSchristos } sfmt_beq; 220a5a4af3bSchristos struct { /* */ 221a5a4af3bSchristos SI* i_dr; 222a5a4af3bSchristos SI* i_sr; 223a5a4af3bSchristos UINT f_r1; 224a5a4af3bSchristos UINT f_r2; 225a5a4af3bSchristos UINT f_uimm16; 226a5a4af3bSchristos unsigned char in_sr; 227a5a4af3bSchristos unsigned char out_dr; 228a5a4af3bSchristos } sfmt_and3; 229a5a4af3bSchristos struct { /* */ 230a5a4af3bSchristos SI* i_dr; 231a5a4af3bSchristos SI* i_sr; 232a5a4af3bSchristos INT f_simm16; 233a5a4af3bSchristos UINT f_r1; 234a5a4af3bSchristos UINT f_r2; 235a5a4af3bSchristos unsigned char in_sr; 236a5a4af3bSchristos unsigned char out_dr; 237a5a4af3bSchristos } sfmt_add3; 238a5a4af3bSchristos struct { /* */ 239a5a4af3bSchristos SI* i_dr; 240a5a4af3bSchristos SI* i_sr; 241a5a4af3bSchristos UINT f_r1; 242a5a4af3bSchristos UINT f_r2; 243a5a4af3bSchristos unsigned char in_dr; 244a5a4af3bSchristos unsigned char in_sr; 245a5a4af3bSchristos unsigned char out_dr; 246a5a4af3bSchristos } sfmt_add; 247a5a4af3bSchristos #if WITH_SCACHE_PBB 248a5a4af3bSchristos /* Writeback handler. */ 249a5a4af3bSchristos struct { 250a5a4af3bSchristos /* Pointer to argbuf entry for insn whose results need writing back. */ 251a5a4af3bSchristos const struct argbuf *abuf; 252a5a4af3bSchristos } write; 253a5a4af3bSchristos /* x-before handler */ 254a5a4af3bSchristos struct { 255a5a4af3bSchristos /*const SCACHE *insns[MAX_PARALLEL_INSNS];*/ 256a5a4af3bSchristos int first_p; 257a5a4af3bSchristos } before; 258a5a4af3bSchristos /* x-after handler */ 259a5a4af3bSchristos struct { 260a5a4af3bSchristos int empty; 261a5a4af3bSchristos } after; 262a5a4af3bSchristos /* This entry is used to terminate each pbb. */ 263a5a4af3bSchristos struct { 264a5a4af3bSchristos /* Number of insns in pbb. */ 265a5a4af3bSchristos int insn_count; 266a5a4af3bSchristos /* Next pbb to execute. */ 267a5a4af3bSchristos SCACHE *next; 268a5a4af3bSchristos SCACHE *branch_target; 269a5a4af3bSchristos } chain; 270a5a4af3bSchristos #endif 271a5a4af3bSchristos }; 272a5a4af3bSchristos 273a5a4af3bSchristos /* The ARGBUF struct. */ 274a5a4af3bSchristos struct argbuf { 275a5a4af3bSchristos /* These are the baseclass definitions. */ 276a5a4af3bSchristos IADDR addr; 277a5a4af3bSchristos const IDESC *idesc; 278a5a4af3bSchristos char trace_p; 279a5a4af3bSchristos char profile_p; 280a5a4af3bSchristos /* ??? Temporary hack for skip insns. */ 281a5a4af3bSchristos char skip_count; 282a5a4af3bSchristos char unused; 283a5a4af3bSchristos /* cpu specific data follows */ 284a5a4af3bSchristos union sem semantic; 285a5a4af3bSchristos int written; 286a5a4af3bSchristos union sem_fields fields; 287a5a4af3bSchristos }; 288a5a4af3bSchristos 289a5a4af3bSchristos /* A cached insn. 290a5a4af3bSchristos 291a5a4af3bSchristos ??? SCACHE used to contain more than just argbuf. We could delete the 292a5a4af3bSchristos type entirely and always just use ARGBUF, but for future concerns and as 293a5a4af3bSchristos a level of abstraction it is left in. */ 294a5a4af3bSchristos 295a5a4af3bSchristos struct scache { 296a5a4af3bSchristos struct argbuf argbuf; 297a5a4af3bSchristos }; 298a5a4af3bSchristos 299a5a4af3bSchristos /* Macros to simplify extraction, reading and semantic code. 300a5a4af3bSchristos These define and assign the local vars that contain the insn's fields. */ 301a5a4af3bSchristos 302a5a4af3bSchristos #define EXTRACT_IFMT_EMPTY_VARS \ 303a5a4af3bSchristos unsigned int length; 304a5a4af3bSchristos #define EXTRACT_IFMT_EMPTY_CODE \ 305a5a4af3bSchristos length = 0; \ 306a5a4af3bSchristos 307a5a4af3bSchristos #define EXTRACT_IFMT_ADD_VARS \ 308a5a4af3bSchristos UINT f_op1; \ 309a5a4af3bSchristos UINT f_r1; \ 310a5a4af3bSchristos UINT f_op2; \ 311a5a4af3bSchristos UINT f_r2; \ 312a5a4af3bSchristos unsigned int length; 313a5a4af3bSchristos #define EXTRACT_IFMT_ADD_CODE \ 314a5a4af3bSchristos length = 2; \ 315a5a4af3bSchristos f_op1 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \ 316a5a4af3bSchristos f_r1 = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \ 317a5a4af3bSchristos f_op2 = EXTRACT_MSB0_UINT (insn, 16, 8, 4); \ 318a5a4af3bSchristos f_r2 = EXTRACT_MSB0_UINT (insn, 16, 12, 4); \ 319a5a4af3bSchristos 320a5a4af3bSchristos #define EXTRACT_IFMT_ADD3_VARS \ 321a5a4af3bSchristos UINT f_op1; \ 322a5a4af3bSchristos UINT f_r1; \ 323a5a4af3bSchristos UINT f_op2; \ 324a5a4af3bSchristos UINT f_r2; \ 325a5a4af3bSchristos INT f_simm16; \ 326a5a4af3bSchristos unsigned int length; 327a5a4af3bSchristos #define EXTRACT_IFMT_ADD3_CODE \ 328a5a4af3bSchristos length = 4; \ 329a5a4af3bSchristos f_op1 = EXTRACT_MSB0_UINT (insn, 32, 0, 4); \ 330a5a4af3bSchristos f_r1 = EXTRACT_MSB0_UINT (insn, 32, 4, 4); \ 331a5a4af3bSchristos f_op2 = EXTRACT_MSB0_UINT (insn, 32, 8, 4); \ 332a5a4af3bSchristos f_r2 = EXTRACT_MSB0_UINT (insn, 32, 12, 4); \ 333a5a4af3bSchristos f_simm16 = EXTRACT_MSB0_SINT (insn, 32, 16, 16); \ 334a5a4af3bSchristos 335a5a4af3bSchristos #define EXTRACT_IFMT_AND3_VARS \ 336a5a4af3bSchristos UINT f_op1; \ 337a5a4af3bSchristos UINT f_r1; \ 338a5a4af3bSchristos UINT f_op2; \ 339a5a4af3bSchristos UINT f_r2; \ 340a5a4af3bSchristos UINT f_uimm16; \ 341a5a4af3bSchristos unsigned int length; 342a5a4af3bSchristos #define EXTRACT_IFMT_AND3_CODE \ 343a5a4af3bSchristos length = 4; \ 344a5a4af3bSchristos f_op1 = EXTRACT_MSB0_UINT (insn, 32, 0, 4); \ 345a5a4af3bSchristos f_r1 = EXTRACT_MSB0_UINT (insn, 32, 4, 4); \ 346a5a4af3bSchristos f_op2 = EXTRACT_MSB0_UINT (insn, 32, 8, 4); \ 347a5a4af3bSchristos f_r2 = EXTRACT_MSB0_UINT (insn, 32, 12, 4); \ 348a5a4af3bSchristos f_uimm16 = EXTRACT_MSB0_UINT (insn, 32, 16, 16); \ 349a5a4af3bSchristos 350a5a4af3bSchristos #define EXTRACT_IFMT_OR3_VARS \ 351a5a4af3bSchristos UINT f_op1; \ 352a5a4af3bSchristos UINT f_r1; \ 353a5a4af3bSchristos UINT f_op2; \ 354a5a4af3bSchristos UINT f_r2; \ 355a5a4af3bSchristos UINT f_uimm16; \ 356a5a4af3bSchristos unsigned int length; 357a5a4af3bSchristos #define EXTRACT_IFMT_OR3_CODE \ 358a5a4af3bSchristos length = 4; \ 359a5a4af3bSchristos f_op1 = EXTRACT_MSB0_UINT (insn, 32, 0, 4); \ 360a5a4af3bSchristos f_r1 = EXTRACT_MSB0_UINT (insn, 32, 4, 4); \ 361a5a4af3bSchristos f_op2 = EXTRACT_MSB0_UINT (insn, 32, 8, 4); \ 362a5a4af3bSchristos f_r2 = EXTRACT_MSB0_UINT (insn, 32, 12, 4); \ 363a5a4af3bSchristos f_uimm16 = EXTRACT_MSB0_UINT (insn, 32, 16, 16); \ 364a5a4af3bSchristos 365a5a4af3bSchristos #define EXTRACT_IFMT_ADDI_VARS \ 366a5a4af3bSchristos UINT f_op1; \ 367a5a4af3bSchristos UINT f_r1; \ 368a5a4af3bSchristos INT f_simm8; \ 369a5a4af3bSchristos unsigned int length; 370a5a4af3bSchristos #define EXTRACT_IFMT_ADDI_CODE \ 371a5a4af3bSchristos length = 2; \ 372a5a4af3bSchristos f_op1 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \ 373a5a4af3bSchristos f_r1 = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \ 374a5a4af3bSchristos f_simm8 = EXTRACT_MSB0_SINT (insn, 16, 8, 8); \ 375a5a4af3bSchristos 376a5a4af3bSchristos #define EXTRACT_IFMT_ADDV3_VARS \ 377a5a4af3bSchristos UINT f_op1; \ 378a5a4af3bSchristos UINT f_r1; \ 379a5a4af3bSchristos UINT f_op2; \ 380a5a4af3bSchristos UINT f_r2; \ 381a5a4af3bSchristos INT f_simm16; \ 382a5a4af3bSchristos unsigned int length; 383a5a4af3bSchristos #define EXTRACT_IFMT_ADDV3_CODE \ 384a5a4af3bSchristos length = 4; \ 385a5a4af3bSchristos f_op1 = EXTRACT_MSB0_UINT (insn, 32, 0, 4); \ 386a5a4af3bSchristos f_r1 = EXTRACT_MSB0_UINT (insn, 32, 4, 4); \ 387a5a4af3bSchristos f_op2 = EXTRACT_MSB0_UINT (insn, 32, 8, 4); \ 388a5a4af3bSchristos f_r2 = EXTRACT_MSB0_UINT (insn, 32, 12, 4); \ 389a5a4af3bSchristos f_simm16 = EXTRACT_MSB0_SINT (insn, 32, 16, 16); \ 390a5a4af3bSchristos 391a5a4af3bSchristos #define EXTRACT_IFMT_BC8_VARS \ 392a5a4af3bSchristos UINT f_op1; \ 393a5a4af3bSchristos UINT f_r1; \ 394a5a4af3bSchristos SI f_disp8; \ 395a5a4af3bSchristos unsigned int length; 396a5a4af3bSchristos #define EXTRACT_IFMT_BC8_CODE \ 397a5a4af3bSchristos length = 2; \ 398a5a4af3bSchristos f_op1 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \ 399a5a4af3bSchristos f_r1 = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \ 400a5a4af3bSchristos f_disp8 = ((((EXTRACT_MSB0_SINT (insn, 16, 8, 8)) << (2))) + (((pc) & (-4)))); \ 401a5a4af3bSchristos 402a5a4af3bSchristos #define EXTRACT_IFMT_BC24_VARS \ 403a5a4af3bSchristos UINT f_op1; \ 404a5a4af3bSchristos UINT f_r1; \ 405a5a4af3bSchristos SI f_disp24; \ 406a5a4af3bSchristos unsigned int length; 407a5a4af3bSchristos #define EXTRACT_IFMT_BC24_CODE \ 408a5a4af3bSchristos length = 4; \ 409a5a4af3bSchristos f_op1 = EXTRACT_MSB0_UINT (insn, 32, 0, 4); \ 410a5a4af3bSchristos f_r1 = EXTRACT_MSB0_UINT (insn, 32, 4, 4); \ 411a5a4af3bSchristos f_disp24 = ((((EXTRACT_MSB0_SINT (insn, 32, 8, 24)) << (2))) + (pc)); \ 412a5a4af3bSchristos 413a5a4af3bSchristos #define EXTRACT_IFMT_BEQ_VARS \ 414a5a4af3bSchristos UINT f_op1; \ 415a5a4af3bSchristos UINT f_r1; \ 416a5a4af3bSchristos UINT f_op2; \ 417a5a4af3bSchristos UINT f_r2; \ 418a5a4af3bSchristos SI f_disp16; \ 419a5a4af3bSchristos unsigned int length; 420a5a4af3bSchristos #define EXTRACT_IFMT_BEQ_CODE \ 421a5a4af3bSchristos length = 4; \ 422a5a4af3bSchristos f_op1 = EXTRACT_MSB0_UINT (insn, 32, 0, 4); \ 423a5a4af3bSchristos f_r1 = EXTRACT_MSB0_UINT (insn, 32, 4, 4); \ 424a5a4af3bSchristos f_op2 = EXTRACT_MSB0_UINT (insn, 32, 8, 4); \ 425a5a4af3bSchristos f_r2 = EXTRACT_MSB0_UINT (insn, 32, 12, 4); \ 426a5a4af3bSchristos f_disp16 = ((((EXTRACT_MSB0_SINT (insn, 32, 16, 16)) << (2))) + (pc)); \ 427a5a4af3bSchristos 428a5a4af3bSchristos #define EXTRACT_IFMT_BEQZ_VARS \ 429a5a4af3bSchristos UINT f_op1; \ 430a5a4af3bSchristos UINT f_r1; \ 431a5a4af3bSchristos UINT f_op2; \ 432a5a4af3bSchristos UINT f_r2; \ 433a5a4af3bSchristos SI f_disp16; \ 434a5a4af3bSchristos unsigned int length; 435a5a4af3bSchristos #define EXTRACT_IFMT_BEQZ_CODE \ 436a5a4af3bSchristos length = 4; \ 437a5a4af3bSchristos f_op1 = EXTRACT_MSB0_UINT (insn, 32, 0, 4); \ 438a5a4af3bSchristos f_r1 = EXTRACT_MSB0_UINT (insn, 32, 4, 4); \ 439a5a4af3bSchristos f_op2 = EXTRACT_MSB0_UINT (insn, 32, 8, 4); \ 440a5a4af3bSchristos f_r2 = EXTRACT_MSB0_UINT (insn, 32, 12, 4); \ 441a5a4af3bSchristos f_disp16 = ((((EXTRACT_MSB0_SINT (insn, 32, 16, 16)) << (2))) + (pc)); \ 442a5a4af3bSchristos 443a5a4af3bSchristos #define EXTRACT_IFMT_CMP_VARS \ 444a5a4af3bSchristos UINT f_op1; \ 445a5a4af3bSchristos UINT f_r1; \ 446a5a4af3bSchristos UINT f_op2; \ 447a5a4af3bSchristos UINT f_r2; \ 448a5a4af3bSchristos unsigned int length; 449a5a4af3bSchristos #define EXTRACT_IFMT_CMP_CODE \ 450a5a4af3bSchristos length = 2; \ 451a5a4af3bSchristos f_op1 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \ 452a5a4af3bSchristos f_r1 = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \ 453a5a4af3bSchristos f_op2 = EXTRACT_MSB0_UINT (insn, 16, 8, 4); \ 454a5a4af3bSchristos f_r2 = EXTRACT_MSB0_UINT (insn, 16, 12, 4); \ 455a5a4af3bSchristos 456a5a4af3bSchristos #define EXTRACT_IFMT_CMPI_VARS \ 457a5a4af3bSchristos UINT f_op1; \ 458a5a4af3bSchristos UINT f_r1; \ 459a5a4af3bSchristos UINT f_op2; \ 460a5a4af3bSchristos UINT f_r2; \ 461a5a4af3bSchristos INT f_simm16; \ 462a5a4af3bSchristos unsigned int length; 463a5a4af3bSchristos #define EXTRACT_IFMT_CMPI_CODE \ 464a5a4af3bSchristos length = 4; \ 465a5a4af3bSchristos f_op1 = EXTRACT_MSB0_UINT (insn, 32, 0, 4); \ 466a5a4af3bSchristos f_r1 = EXTRACT_MSB0_UINT (insn, 32, 4, 4); \ 467a5a4af3bSchristos f_op2 = EXTRACT_MSB0_UINT (insn, 32, 8, 4); \ 468a5a4af3bSchristos f_r2 = EXTRACT_MSB0_UINT (insn, 32, 12, 4); \ 469a5a4af3bSchristos f_simm16 = EXTRACT_MSB0_SINT (insn, 32, 16, 16); \ 470a5a4af3bSchristos 471a5a4af3bSchristos #define EXTRACT_IFMT_DIV_VARS \ 472a5a4af3bSchristos UINT f_op1; \ 473a5a4af3bSchristos UINT f_r1; \ 474a5a4af3bSchristos UINT f_op2; \ 475a5a4af3bSchristos UINT f_r2; \ 476a5a4af3bSchristos INT f_simm16; \ 477a5a4af3bSchristos unsigned int length; 478a5a4af3bSchristos #define EXTRACT_IFMT_DIV_CODE \ 479a5a4af3bSchristos length = 4; \ 480a5a4af3bSchristos f_op1 = EXTRACT_MSB0_UINT (insn, 32, 0, 4); \ 481a5a4af3bSchristos f_r1 = EXTRACT_MSB0_UINT (insn, 32, 4, 4); \ 482a5a4af3bSchristos f_op2 = EXTRACT_MSB0_UINT (insn, 32, 8, 4); \ 483a5a4af3bSchristos f_r2 = EXTRACT_MSB0_UINT (insn, 32, 12, 4); \ 484a5a4af3bSchristos f_simm16 = EXTRACT_MSB0_SINT (insn, 32, 16, 16); \ 485a5a4af3bSchristos 486a5a4af3bSchristos #define EXTRACT_IFMT_JL_VARS \ 487a5a4af3bSchristos UINT f_op1; \ 488a5a4af3bSchristos UINT f_r1; \ 489a5a4af3bSchristos UINT f_op2; \ 490a5a4af3bSchristos UINT f_r2; \ 491a5a4af3bSchristos unsigned int length; 492a5a4af3bSchristos #define EXTRACT_IFMT_JL_CODE \ 493a5a4af3bSchristos length = 2; \ 494a5a4af3bSchristos f_op1 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \ 495a5a4af3bSchristos f_r1 = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \ 496a5a4af3bSchristos f_op2 = EXTRACT_MSB0_UINT (insn, 16, 8, 4); \ 497a5a4af3bSchristos f_r2 = EXTRACT_MSB0_UINT (insn, 16, 12, 4); \ 498a5a4af3bSchristos 499a5a4af3bSchristos #define EXTRACT_IFMT_LD24_VARS \ 500a5a4af3bSchristos UINT f_op1; \ 501a5a4af3bSchristos UINT f_r1; \ 502a5a4af3bSchristos UINT f_uimm24; \ 503a5a4af3bSchristos unsigned int length; 504a5a4af3bSchristos #define EXTRACT_IFMT_LD24_CODE \ 505a5a4af3bSchristos length = 4; \ 506a5a4af3bSchristos f_op1 = EXTRACT_MSB0_UINT (insn, 32, 0, 4); \ 507a5a4af3bSchristos f_r1 = EXTRACT_MSB0_UINT (insn, 32, 4, 4); \ 508a5a4af3bSchristos f_uimm24 = EXTRACT_MSB0_UINT (insn, 32, 8, 24); \ 509a5a4af3bSchristos 510a5a4af3bSchristos #define EXTRACT_IFMT_LDI16_VARS \ 511a5a4af3bSchristos UINT f_op1; \ 512a5a4af3bSchristos UINT f_r1; \ 513a5a4af3bSchristos UINT f_op2; \ 514a5a4af3bSchristos UINT f_r2; \ 515a5a4af3bSchristos INT f_simm16; \ 516a5a4af3bSchristos unsigned int length; 517a5a4af3bSchristos #define EXTRACT_IFMT_LDI16_CODE \ 518a5a4af3bSchristos length = 4; \ 519a5a4af3bSchristos f_op1 = EXTRACT_MSB0_UINT (insn, 32, 0, 4); \ 520a5a4af3bSchristos f_r1 = EXTRACT_MSB0_UINT (insn, 32, 4, 4); \ 521a5a4af3bSchristos f_op2 = EXTRACT_MSB0_UINT (insn, 32, 8, 4); \ 522a5a4af3bSchristos f_r2 = EXTRACT_MSB0_UINT (insn, 32, 12, 4); \ 523a5a4af3bSchristos f_simm16 = EXTRACT_MSB0_SINT (insn, 32, 16, 16); \ 524a5a4af3bSchristos 525a5a4af3bSchristos #define EXTRACT_IFMT_MVFACHI_VARS \ 526a5a4af3bSchristos UINT f_op1; \ 527a5a4af3bSchristos UINT f_r1; \ 528a5a4af3bSchristos UINT f_op2; \ 529a5a4af3bSchristos UINT f_r2; \ 530a5a4af3bSchristos unsigned int length; 531a5a4af3bSchristos #define EXTRACT_IFMT_MVFACHI_CODE \ 532a5a4af3bSchristos length = 2; \ 533a5a4af3bSchristos f_op1 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \ 534a5a4af3bSchristos f_r1 = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \ 535a5a4af3bSchristos f_op2 = EXTRACT_MSB0_UINT (insn, 16, 8, 4); \ 536a5a4af3bSchristos f_r2 = EXTRACT_MSB0_UINT (insn, 16, 12, 4); \ 537a5a4af3bSchristos 538a5a4af3bSchristos #define EXTRACT_IFMT_MVFC_VARS \ 539a5a4af3bSchristos UINT f_op1; \ 540a5a4af3bSchristos UINT f_r1; \ 541a5a4af3bSchristos UINT f_op2; \ 542a5a4af3bSchristos UINT f_r2; \ 543a5a4af3bSchristos unsigned int length; 544a5a4af3bSchristos #define EXTRACT_IFMT_MVFC_CODE \ 545a5a4af3bSchristos length = 2; \ 546a5a4af3bSchristos f_op1 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \ 547a5a4af3bSchristos f_r1 = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \ 548a5a4af3bSchristos f_op2 = EXTRACT_MSB0_UINT (insn, 16, 8, 4); \ 549a5a4af3bSchristos f_r2 = EXTRACT_MSB0_UINT (insn, 16, 12, 4); \ 550a5a4af3bSchristos 551a5a4af3bSchristos #define EXTRACT_IFMT_MVTACHI_VARS \ 552a5a4af3bSchristos UINT f_op1; \ 553a5a4af3bSchristos UINT f_r1; \ 554a5a4af3bSchristos UINT f_op2; \ 555a5a4af3bSchristos UINT f_r2; \ 556a5a4af3bSchristos unsigned int length; 557a5a4af3bSchristos #define EXTRACT_IFMT_MVTACHI_CODE \ 558a5a4af3bSchristos length = 2; \ 559a5a4af3bSchristos f_op1 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \ 560a5a4af3bSchristos f_r1 = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \ 561a5a4af3bSchristos f_op2 = EXTRACT_MSB0_UINT (insn, 16, 8, 4); \ 562a5a4af3bSchristos f_r2 = EXTRACT_MSB0_UINT (insn, 16, 12, 4); \ 563a5a4af3bSchristos 564a5a4af3bSchristos #define EXTRACT_IFMT_MVTC_VARS \ 565a5a4af3bSchristos UINT f_op1; \ 566a5a4af3bSchristos UINT f_r1; \ 567a5a4af3bSchristos UINT f_op2; \ 568a5a4af3bSchristos UINT f_r2; \ 569a5a4af3bSchristos unsigned int length; 570a5a4af3bSchristos #define EXTRACT_IFMT_MVTC_CODE \ 571a5a4af3bSchristos length = 2; \ 572a5a4af3bSchristos f_op1 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \ 573a5a4af3bSchristos f_r1 = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \ 574a5a4af3bSchristos f_op2 = EXTRACT_MSB0_UINT (insn, 16, 8, 4); \ 575a5a4af3bSchristos f_r2 = EXTRACT_MSB0_UINT (insn, 16, 12, 4); \ 576a5a4af3bSchristos 577a5a4af3bSchristos #define EXTRACT_IFMT_NOP_VARS \ 578a5a4af3bSchristos UINT f_op1; \ 579a5a4af3bSchristos UINT f_r1; \ 580a5a4af3bSchristos UINT f_op2; \ 581a5a4af3bSchristos UINT f_r2; \ 582a5a4af3bSchristos unsigned int length; 583a5a4af3bSchristos #define EXTRACT_IFMT_NOP_CODE \ 584a5a4af3bSchristos length = 2; \ 585a5a4af3bSchristos f_op1 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \ 586a5a4af3bSchristos f_r1 = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \ 587a5a4af3bSchristos f_op2 = EXTRACT_MSB0_UINT (insn, 16, 8, 4); \ 588a5a4af3bSchristos f_r2 = EXTRACT_MSB0_UINT (insn, 16, 12, 4); \ 589a5a4af3bSchristos 590a5a4af3bSchristos #define EXTRACT_IFMT_SETH_VARS \ 591a5a4af3bSchristos UINT f_op1; \ 592a5a4af3bSchristos UINT f_r1; \ 593a5a4af3bSchristos UINT f_op2; \ 594a5a4af3bSchristos UINT f_r2; \ 595a5a4af3bSchristos UINT f_hi16; \ 596a5a4af3bSchristos unsigned int length; 597a5a4af3bSchristos #define EXTRACT_IFMT_SETH_CODE \ 598a5a4af3bSchristos length = 4; \ 599a5a4af3bSchristos f_op1 = EXTRACT_MSB0_UINT (insn, 32, 0, 4); \ 600a5a4af3bSchristos f_r1 = EXTRACT_MSB0_UINT (insn, 32, 4, 4); \ 601a5a4af3bSchristos f_op2 = EXTRACT_MSB0_UINT (insn, 32, 8, 4); \ 602a5a4af3bSchristos f_r2 = EXTRACT_MSB0_UINT (insn, 32, 12, 4); \ 603a5a4af3bSchristos f_hi16 = EXTRACT_MSB0_UINT (insn, 32, 16, 16); \ 604a5a4af3bSchristos 605a5a4af3bSchristos #define EXTRACT_IFMT_SLLI_VARS \ 606a5a4af3bSchristos UINT f_op1; \ 607a5a4af3bSchristos UINT f_r1; \ 608a5a4af3bSchristos UINT f_shift_op2; \ 609a5a4af3bSchristos UINT f_uimm5; \ 610a5a4af3bSchristos unsigned int length; 611a5a4af3bSchristos #define EXTRACT_IFMT_SLLI_CODE \ 612a5a4af3bSchristos length = 2; \ 613a5a4af3bSchristos f_op1 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \ 614a5a4af3bSchristos f_r1 = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \ 615a5a4af3bSchristos f_shift_op2 = EXTRACT_MSB0_UINT (insn, 16, 8, 3); \ 616a5a4af3bSchristos f_uimm5 = EXTRACT_MSB0_UINT (insn, 16, 11, 5); \ 617a5a4af3bSchristos 618a5a4af3bSchristos #define EXTRACT_IFMT_ST_D_VARS \ 619a5a4af3bSchristos UINT f_op1; \ 620a5a4af3bSchristos UINT f_r1; \ 621a5a4af3bSchristos UINT f_op2; \ 622a5a4af3bSchristos UINT f_r2; \ 623a5a4af3bSchristos INT f_simm16; \ 624a5a4af3bSchristos unsigned int length; 625a5a4af3bSchristos #define EXTRACT_IFMT_ST_D_CODE \ 626a5a4af3bSchristos length = 4; \ 627a5a4af3bSchristos f_op1 = EXTRACT_MSB0_UINT (insn, 32, 0, 4); \ 628a5a4af3bSchristos f_r1 = EXTRACT_MSB0_UINT (insn, 32, 4, 4); \ 629a5a4af3bSchristos f_op2 = EXTRACT_MSB0_UINT (insn, 32, 8, 4); \ 630a5a4af3bSchristos f_r2 = EXTRACT_MSB0_UINT (insn, 32, 12, 4); \ 631a5a4af3bSchristos f_simm16 = EXTRACT_MSB0_SINT (insn, 32, 16, 16); \ 632a5a4af3bSchristos 633a5a4af3bSchristos #define EXTRACT_IFMT_TRAP_VARS \ 634a5a4af3bSchristos UINT f_op1; \ 635a5a4af3bSchristos UINT f_r1; \ 636a5a4af3bSchristos UINT f_op2; \ 637a5a4af3bSchristos UINT f_uimm4; \ 638a5a4af3bSchristos unsigned int length; 639a5a4af3bSchristos #define EXTRACT_IFMT_TRAP_CODE \ 640a5a4af3bSchristos length = 2; \ 641a5a4af3bSchristos f_op1 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \ 642a5a4af3bSchristos f_r1 = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \ 643a5a4af3bSchristos f_op2 = EXTRACT_MSB0_UINT (insn, 16, 8, 4); \ 644a5a4af3bSchristos f_uimm4 = EXTRACT_MSB0_UINT (insn, 16, 12, 4); \ 645a5a4af3bSchristos 646a5a4af3bSchristos #define EXTRACT_IFMT_CLRPSW_VARS \ 647a5a4af3bSchristos UINT f_op1; \ 648a5a4af3bSchristos UINT f_r1; \ 649a5a4af3bSchristos UINT f_uimm8; \ 650a5a4af3bSchristos unsigned int length; 651a5a4af3bSchristos #define EXTRACT_IFMT_CLRPSW_CODE \ 652a5a4af3bSchristos length = 2; \ 653a5a4af3bSchristos f_op1 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \ 654a5a4af3bSchristos f_r1 = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \ 655a5a4af3bSchristos f_uimm8 = EXTRACT_MSB0_UINT (insn, 16, 8, 8); \ 656a5a4af3bSchristos 657a5a4af3bSchristos #define EXTRACT_IFMT_BSET_VARS \ 658a5a4af3bSchristos UINT f_op1; \ 659a5a4af3bSchristos UINT f_bit4; \ 660a5a4af3bSchristos UINT f_uimm3; \ 661a5a4af3bSchristos UINT f_op2; \ 662a5a4af3bSchristos UINT f_r2; \ 663a5a4af3bSchristos INT f_simm16; \ 664a5a4af3bSchristos unsigned int length; 665a5a4af3bSchristos #define EXTRACT_IFMT_BSET_CODE \ 666a5a4af3bSchristos length = 4; \ 667a5a4af3bSchristos f_op1 = EXTRACT_MSB0_UINT (insn, 32, 0, 4); \ 668a5a4af3bSchristos f_bit4 = EXTRACT_MSB0_UINT (insn, 32, 4, 1); \ 669a5a4af3bSchristos f_uimm3 = EXTRACT_MSB0_UINT (insn, 32, 5, 3); \ 670a5a4af3bSchristos f_op2 = EXTRACT_MSB0_UINT (insn, 32, 8, 4); \ 671a5a4af3bSchristos f_r2 = EXTRACT_MSB0_UINT (insn, 32, 12, 4); \ 672a5a4af3bSchristos f_simm16 = EXTRACT_MSB0_SINT (insn, 32, 16, 16); \ 673a5a4af3bSchristos 674a5a4af3bSchristos #define EXTRACT_IFMT_BTST_VARS \ 675a5a4af3bSchristos UINT f_op1; \ 676a5a4af3bSchristos UINT f_bit4; \ 677a5a4af3bSchristos UINT f_uimm3; \ 678a5a4af3bSchristos UINT f_op2; \ 679a5a4af3bSchristos UINT f_r2; \ 680a5a4af3bSchristos unsigned int length; 681a5a4af3bSchristos #define EXTRACT_IFMT_BTST_CODE \ 682a5a4af3bSchristos length = 2; \ 683a5a4af3bSchristos f_op1 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \ 684a5a4af3bSchristos f_bit4 = EXTRACT_MSB0_UINT (insn, 16, 4, 1); \ 685a5a4af3bSchristos f_uimm3 = EXTRACT_MSB0_UINT (insn, 16, 5, 3); \ 686a5a4af3bSchristos f_op2 = EXTRACT_MSB0_UINT (insn, 16, 8, 4); \ 687a5a4af3bSchristos f_r2 = EXTRACT_MSB0_UINT (insn, 16, 12, 4); \ 688a5a4af3bSchristos 689a5a4af3bSchristos /* Collection of various things for the trace handler to use. */ 690a5a4af3bSchristos 691a5a4af3bSchristos typedef struct trace_record { 692a5a4af3bSchristos IADDR pc; 693a5a4af3bSchristos /* FIXME:wip */ 694a5a4af3bSchristos } TRACE_RECORD; 695a5a4af3bSchristos 696a5a4af3bSchristos #endif /* CPU_M32RBF_H */ 697