Commit e37e863f5e492cf60db21233f4008aafd6c5f610
1 parent
fdabc366
correct split between helper.c and op_helper.c - cosmetics
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@1505 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
5 changed files
with
233 additions
and
242 deletions
target-mips/cpu.h
| ... | ... | @@ -240,174 +240,6 @@ enum { |
| 240 | 240 | EXCP_FLUSH = 0x109, |
| 241 | 241 | }; |
| 242 | 242 | |
| 243 | -/* MIPS opcodes */ | |
| 244 | -#define EXT_SPECIAL 0x100 | |
| 245 | -#define EXT_SPECIAL2 0x200 | |
| 246 | -#define EXT_REGIMM 0x300 | |
| 247 | -#define EXT_CP0 0x400 | |
| 248 | -#define EXT_CP1 0x500 | |
| 249 | -#define EXT_CP2 0x600 | |
| 250 | -#define EXT_CP3 0x700 | |
| 251 | - | |
| 252 | -enum { | |
| 253 | - /* indirect opcode tables */ | |
| 254 | - OPC_SPECIAL = 0x00, | |
| 255 | - OPC_BREGIMM = 0x01, | |
| 256 | - OPC_CP0 = 0x10, | |
| 257 | - OPC_CP1 = 0x11, | |
| 258 | - OPC_CP2 = 0x12, | |
| 259 | - OPC_CP3 = 0x13, | |
| 260 | - OPC_SPECIAL2 = 0x1C, | |
| 261 | - /* arithmetic with immediate */ | |
| 262 | - OPC_ADDI = 0x08, | |
| 263 | - OPC_ADDIU = 0x09, | |
| 264 | - OPC_SLTI = 0x0A, | |
| 265 | - OPC_SLTIU = 0x0B, | |
| 266 | - OPC_ANDI = 0x0C, | |
| 267 | - OPC_ORI = 0x0D, | |
| 268 | - OPC_XORI = 0x0E, | |
| 269 | - OPC_LUI = 0x0F, | |
| 270 | - /* Jump and branches */ | |
| 271 | - OPC_J = 0x02, | |
| 272 | - OPC_JAL = 0x03, | |
| 273 | - OPC_BEQ = 0x04, /* Unconditional if rs = rt = 0 (B) */ | |
| 274 | - OPC_BEQL = 0x14, | |
| 275 | - OPC_BNE = 0x05, | |
| 276 | - OPC_BNEL = 0x15, | |
| 277 | - OPC_BLEZ = 0x06, | |
| 278 | - OPC_BLEZL = 0x16, | |
| 279 | - OPC_BGTZ = 0x07, | |
| 280 | - OPC_BGTZL = 0x17, | |
| 281 | - OPC_JALX = 0x1D, /* MIPS 16 only */ | |
| 282 | - /* Load and stores */ | |
| 283 | - OPC_LB = 0x20, | |
| 284 | - OPC_LH = 0x21, | |
| 285 | - OPC_LWL = 0x22, | |
| 286 | - OPC_LW = 0x23, | |
| 287 | - OPC_LBU = 0x24, | |
| 288 | - OPC_LHU = 0x25, | |
| 289 | - OPC_LWR = 0x26, | |
| 290 | - OPC_SB = 0x28, | |
| 291 | - OPC_SH = 0x29, | |
| 292 | - OPC_SWL = 0x2A, | |
| 293 | - OPC_SW = 0x2B, | |
| 294 | - OPC_SWR = 0x2E, | |
| 295 | - OPC_LL = 0x30, | |
| 296 | - OPC_SC = 0x38, | |
| 297 | - /* Floating point load/store */ | |
| 298 | - OPC_LWC1 = 0x31, | |
| 299 | - OPC_LWC2 = 0x32, | |
| 300 | - OPC_LDC1 = 0x35, | |
| 301 | - OPC_LDC2 = 0x36, | |
| 302 | - OPC_SWC1 = 0x39, | |
| 303 | - OPC_SWC2 = 0x3A, | |
| 304 | - OPC_SDC1 = 0x3D, | |
| 305 | - OPC_SDC2 = 0x3E, | |
| 306 | - /* Cache and prefetch */ | |
| 307 | - OPC_CACHE = 0x2F, | |
| 308 | - OPC_PREF = 0x33, | |
| 309 | -}; | |
| 310 | - | |
| 311 | -/* MIPS special opcodes */ | |
| 312 | -enum { | |
| 313 | - /* Shifts */ | |
| 314 | - OPC_SLL = 0x00 | EXT_SPECIAL, | |
| 315 | - /* NOP is SLL r0, r0, 0 */ | |
| 316 | - /* SSNOP is SLL r0, r0, 1 */ | |
| 317 | - OPC_SRL = 0x02 | EXT_SPECIAL, | |
| 318 | - OPC_SRA = 0x03 | EXT_SPECIAL, | |
| 319 | - OPC_SLLV = 0x04 | EXT_SPECIAL, | |
| 320 | - OPC_SRLV = 0x06 | EXT_SPECIAL, | |
| 321 | - OPC_SRAV = 0x07 | EXT_SPECIAL, | |
| 322 | - /* Multiplication / division */ | |
| 323 | - OPC_MULT = 0x18 | EXT_SPECIAL, | |
| 324 | - OPC_MULTU = 0x19 | EXT_SPECIAL, | |
| 325 | - OPC_DIV = 0x1A | EXT_SPECIAL, | |
| 326 | - OPC_DIVU = 0x1B | EXT_SPECIAL, | |
| 327 | - /* 2 registers arithmetic / logic */ | |
| 328 | - OPC_ADD = 0x20 | EXT_SPECIAL, | |
| 329 | - OPC_ADDU = 0x21 | EXT_SPECIAL, | |
| 330 | - OPC_SUB = 0x22 | EXT_SPECIAL, | |
| 331 | - OPC_SUBU = 0x23 | EXT_SPECIAL, | |
| 332 | - OPC_AND = 0x24 | EXT_SPECIAL, | |
| 333 | - OPC_OR = 0x25 | EXT_SPECIAL, | |
| 334 | - OPC_XOR = 0x26 | EXT_SPECIAL, | |
| 335 | - OPC_NOR = 0x27 | EXT_SPECIAL, | |
| 336 | - OPC_SLT = 0x2A | EXT_SPECIAL, | |
| 337 | - OPC_SLTU = 0x2B | EXT_SPECIAL, | |
| 338 | - /* Jumps */ | |
| 339 | - OPC_JR = 0x08 | EXT_SPECIAL, | |
| 340 | - OPC_JALR = 0x09 | EXT_SPECIAL, | |
| 341 | - /* Traps */ | |
| 342 | - OPC_TGE = 0x30 | EXT_SPECIAL, | |
| 343 | - OPC_TGEU = 0x31 | EXT_SPECIAL, | |
| 344 | - OPC_TLT = 0x32 | EXT_SPECIAL, | |
| 345 | - OPC_TLTU = 0x33 | EXT_SPECIAL, | |
| 346 | - OPC_TEQ = 0x34 | EXT_SPECIAL, | |
| 347 | - OPC_TNE = 0x36 | EXT_SPECIAL, | |
| 348 | - /* HI / LO registers load & stores */ | |
| 349 | - OPC_MFHI = 0x10 | EXT_SPECIAL, | |
| 350 | - OPC_MTHI = 0x11 | EXT_SPECIAL, | |
| 351 | - OPC_MFLO = 0x12 | EXT_SPECIAL, | |
| 352 | - OPC_MTLO = 0x13 | EXT_SPECIAL, | |
| 353 | - /* Conditional moves */ | |
| 354 | - OPC_MOVZ = 0x0A | EXT_SPECIAL, | |
| 355 | - OPC_MOVN = 0x0B | EXT_SPECIAL, | |
| 356 | - | |
| 357 | - OPC_MOVCI = 0x01 | EXT_SPECIAL, | |
| 358 | - | |
| 359 | - /* Special */ | |
| 360 | - OPC_PMON = 0x05 | EXT_SPECIAL, | |
| 361 | - OPC_SYSCALL = 0x0C | EXT_SPECIAL, | |
| 362 | - OPC_BREAK = 0x0D | EXT_SPECIAL, | |
| 363 | - OPC_SYNC = 0x0F | EXT_SPECIAL, | |
| 364 | -}; | |
| 365 | - | |
| 366 | -enum { | |
| 367 | - /* Mutiply & xxx operations */ | |
| 368 | - OPC_MADD = 0x00 | EXT_SPECIAL2, | |
| 369 | - OPC_MADDU = 0x01 | EXT_SPECIAL2, | |
| 370 | - OPC_MUL = 0x02 | EXT_SPECIAL2, | |
| 371 | - OPC_MSUB = 0x04 | EXT_SPECIAL2, | |
| 372 | - OPC_MSUBU = 0x05 | EXT_SPECIAL2, | |
| 373 | - /* Misc */ | |
| 374 | - OPC_CLZ = 0x20 | EXT_SPECIAL2, | |
| 375 | - OPC_CLO = 0x21 | EXT_SPECIAL2, | |
| 376 | - /* Special */ | |
| 377 | - OPC_SDBBP = 0x3F | EXT_SPECIAL2, | |
| 378 | -}; | |
| 379 | - | |
| 380 | -/* Branch REGIMM */ | |
| 381 | -enum { | |
| 382 | - OPC_BLTZ = 0x00 | EXT_REGIMM, | |
| 383 | - OPC_BLTZL = 0x02 | EXT_REGIMM, | |
| 384 | - OPC_BGEZ = 0x01 | EXT_REGIMM, | |
| 385 | - OPC_BGEZL = 0x03 | EXT_REGIMM, | |
| 386 | - OPC_BLTZAL = 0x10 | EXT_REGIMM, | |
| 387 | - OPC_BLTZALL = 0x12 | EXT_REGIMM, | |
| 388 | - OPC_BGEZAL = 0x11 | EXT_REGIMM, | |
| 389 | - OPC_BGEZALL = 0x13 | EXT_REGIMM, | |
| 390 | - OPC_TGEI = 0x08 | EXT_REGIMM, | |
| 391 | - OPC_TGEIU = 0x09 | EXT_REGIMM, | |
| 392 | - OPC_TLTI = 0x0A | EXT_REGIMM, | |
| 393 | - OPC_TLTIU = 0x0B | EXT_REGIMM, | |
| 394 | - OPC_TEQI = 0x0C | EXT_REGIMM, | |
| 395 | - OPC_TNEI = 0x0E | EXT_REGIMM, | |
| 396 | -}; | |
| 397 | - | |
| 398 | -enum { | |
| 399 | - /* Coprocessor 0 (MMU) */ | |
| 400 | - OPC_MFC0 = 0x00 | EXT_CP0, | |
| 401 | - OPC_MTC0 = 0x04 | EXT_CP0, | |
| 402 | - OPC_TLBR = 0x01 | EXT_CP0, | |
| 403 | - OPC_TLBWI = 0x02 | EXT_CP0, | |
| 404 | - OPC_TLBWR = 0x06 | EXT_CP0, | |
| 405 | - OPC_TLBP = 0x08 | EXT_CP0, | |
| 406 | - OPC_ERET = 0x18 | EXT_CP0, | |
| 407 | - OPC_DERET = 0x1F | EXT_CP0, | |
| 408 | - OPC_WAIT = 0x20 | EXT_CP0, | |
| 409 | -}; | |
| 410 | - | |
| 411 | 243 | int cpu_mips_exec(CPUMIPSState *s); |
| 412 | 244 | CPUMIPSState *cpu_mips_init(void); |
| 413 | 245 | uint32_t cpu_mips_get_clock (void); | ... | ... |
target-mips/exec.h
| ... | ... | @@ -19,27 +19,15 @@ typedef uint32_t host_uint_t; |
| 19 | 19 | register host_uint_t T0 asm(AREG1); |
| 20 | 20 | register host_uint_t T1 asm(AREG2); |
| 21 | 21 | register host_uint_t T2 asm(AREG3); |
| 22 | -register host_int_t Ts0 asm(AREG1); | |
| 23 | -register host_int_t Ts1 asm(AREG2); | |
| 24 | -register host_int_t Ts2 asm(AREG3); | |
| 25 | - | |
| 26 | -#define PARAM(n) ((uint32_t)PARAM##n) | |
| 27 | -#define SPARAM(n) ((int32_t)PARAM##n) | |
| 28 | 22 | |
| 29 | 23 | #if defined (USE_HOST_FLOAT_REGS) |
| 30 | 24 | register double FT0 asm(FREG0); |
| 31 | 25 | register double FT1 asm(FREG1); |
| 32 | 26 | register double FT2 asm(FREG2); |
| 33 | -register float FTS0 asm(FREG0); | |
| 34 | -register float FTS1 asm(FREG1); | |
| 35 | -register float FTS2 asm(FREG2); | |
| 36 | 27 | #else |
| 37 | 28 | #define FT0 (env->ft0.d) |
| 38 | 29 | #define FT1 (env->ft1.d) |
| 39 | 30 | #define FT2 (env->ft2.d) |
| 40 | -#define FTS0 (env->ft0.f) | |
| 41 | -#define FTS1 (env->ft1.f) | |
| 42 | -#define FTS2 (env->ft2.f) | |
| 43 | 31 | #endif |
| 44 | 32 | |
| 45 | 33 | #if defined (DEBUG_OP) | ... | ... |
target-mips/helper.c
| ... | ... | @@ -17,7 +17,16 @@ |
| 17 | 17 | * License along with this library; if not, write to the Free Software |
| 18 | 18 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
| 19 | 19 | */ |
| 20 | -#include "exec.h" | |
| 20 | +#include <stdarg.h> | |
| 21 | +#include <stdlib.h> | |
| 22 | +#include <stdio.h> | |
| 23 | +#include <string.h> | |
| 24 | +#include <inttypes.h> | |
| 25 | +#include <signal.h> | |
| 26 | +#include <assert.h> | |
| 27 | + | |
| 28 | +#include "cpu.h" | |
| 29 | +#include "exec-all.h" | |
| 21 | 30 | |
| 22 | 31 | /* MIPS32 4K MMU emulation */ |
| 23 | 32 | #ifdef MIPS_USES_R4K_TLB |
| ... | ... | @@ -142,57 +151,10 @@ target_ulong cpu_get_phys_page_debug(CPUState *env, target_ulong addr) |
| 142 | 151 | return -1; |
| 143 | 152 | return phys_addr; |
| 144 | 153 | } |
| 145 | -#endif | |
| 146 | - | |
| 147 | -#if !defined(CONFIG_USER_ONLY) | |
| 148 | - | |
| 149 | -#define MMUSUFFIX _mmu | |
| 150 | -#define GETPC() (__builtin_return_address(0)) | |
| 151 | - | |
| 152 | -#define SHIFT 0 | |
| 153 | -#include "softmmu_template.h" | |
| 154 | - | |
| 155 | -#define SHIFT 1 | |
| 156 | -#include "softmmu_template.h" | |
| 157 | - | |
| 158 | -#define SHIFT 2 | |
| 159 | -#include "softmmu_template.h" | |
| 160 | - | |
| 161 | -#define SHIFT 3 | |
| 162 | -#include "softmmu_template.h" | |
| 163 | - | |
| 164 | -void tlb_fill (target_ulong addr, int is_write, int is_user, void *retaddr) | |
| 165 | -{ | |
| 166 | - TranslationBlock *tb; | |
| 167 | - CPUState *saved_env; | |
| 168 | - unsigned long pc; | |
| 169 | - int ret; | |
| 170 | - | |
| 171 | - /* XXX: hack to restore env in all cases, even if not called from | |
| 172 | - generated code */ | |
| 173 | - saved_env = env; | |
| 174 | - env = cpu_single_env; | |
| 175 | - ret = cpu_mips_handle_mmu_fault(env, addr, is_write, is_user, 1); | |
| 176 | - if (ret) { | |
| 177 | - if (retaddr) { | |
| 178 | - /* now we have a real cpu fault */ | |
| 179 | - pc = (unsigned long)retaddr; | |
| 180 | - tb = tb_find_pc(pc); | |
| 181 | - if (tb) { | |
| 182 | - /* the PC is inside the translated code. It means that we have | |
| 183 | - a virtual CPU fault */ | |
| 184 | - cpu_restore_state(tb, env, pc, NULL); | |
| 185 | - } | |
| 186 | - } | |
| 187 | - do_raise_exception_err(env->exception_index, env->error_code); | |
| 188 | - } | |
| 189 | - env = saved_env; | |
| 190 | -} | |
| 191 | 154 | |
| 192 | 155 | void cpu_mips_init_mmu (CPUState *env) |
| 193 | 156 | { |
| 194 | 157 | } |
| 195 | - | |
| 196 | 158 | #endif /* !defined(CONFIG_USER_ONLY) */ |
| 197 | 159 | |
| 198 | 160 | int cpu_mips_handle_mmu_fault (CPUState *env, target_ulong address, int rw, | ... | ... |
target-mips/op_helper.c
| ... | ... | @@ -29,7 +29,6 @@ void cpu_loop_exit(void) |
| 29 | 29 | longjmp(env->jmp_env, 1); |
| 30 | 30 | } |
| 31 | 31 | |
| 32 | -__attribute__ (( regparm(2) )) | |
| 33 | 32 | void do_raise_exception_err (uint32_t exception, int error_code) |
| 34 | 33 | { |
| 35 | 34 | #if 1 |
| ... | ... | @@ -42,7 +41,6 @@ void do_raise_exception_err (uint32_t exception, int error_code) |
| 42 | 41 | cpu_loop_exit(); |
| 43 | 42 | } |
| 44 | 43 | |
| 45 | -__attribute__ (( regparm(1) )) | |
| 46 | 44 | void do_raise_exception (uint32_t exception) |
| 47 | 45 | { |
| 48 | 46 | do_raise_exception_err(exception, 0); |
| ... | ... | @@ -117,7 +115,6 @@ void do_msubu (void) |
| 117 | 115 | #endif |
| 118 | 116 | |
| 119 | 117 | /* CP0 helpers */ |
| 120 | -__attribute__ (( regparm(2) )) | |
| 121 | 118 | void do_mfc0 (int reg, int sel) |
| 122 | 119 | { |
| 123 | 120 | const unsigned char *rn; |
| ... | ... | @@ -267,12 +264,10 @@ void do_mfc0 (int reg, int sel) |
| 267 | 264 | return; |
| 268 | 265 | } |
| 269 | 266 | |
| 270 | -__attribute__ (( regparm(2) )) | |
| 271 | 267 | void do_mtc0 (int reg, int sel) |
| 272 | 268 | { |
| 273 | 269 | const unsigned char *rn; |
| 274 | 270 | uint32_t val, old, mask; |
| 275 | - int i, raise; | |
| 276 | 271 | |
| 277 | 272 | if (sel != 0 && reg != 16 && reg != 28) { |
| 278 | 273 | val = -1; |
| ... | ... | @@ -379,11 +374,14 @@ void do_mtc0 (int reg, int sel) |
| 379 | 374 | old = env->CP0_Cause; |
| 380 | 375 | env->CP0_Cause = val; |
| 381 | 376 | #if 0 |
| 382 | - /* Check if we ever asserted a software IRQ */ | |
| 383 | - for (i = 0; i < 2; i++) { | |
| 384 | - mask = 0x100 << i; | |
| 385 | - if ((val & mask) & !(old & mask)) | |
| 386 | - mips_set_irq(i); | |
| 377 | + { | |
| 378 | + int i; | |
| 379 | + /* Check if we ever asserted a software IRQ */ | |
| 380 | + for (i = 0; i < 2; i++) { | |
| 381 | + mask = 0x100 << i; | |
| 382 | + if ((val & mask) & !(old & mask)) | |
| 383 | + mips_set_irq(i); | |
| 384 | + } | |
| 387 | 385 | } |
| 388 | 386 | #endif |
| 389 | 387 | rn = "Cause"; |
| ... | ... | @@ -486,7 +484,6 @@ void do_mtc0 (int reg, int sel) |
| 486 | 484 | |
| 487 | 485 | /* TLB management */ |
| 488 | 486 | #if defined(MIPS_USES_R4K_TLB) |
| 489 | -__attribute__ (( regparm(1) )) | |
| 490 | 487 | static void invalidate_tb (int idx) |
| 491 | 488 | { |
| 492 | 489 | tlb_t *tlb; |
| ... | ... | @@ -505,7 +502,6 @@ static void invalidate_tb (int idx) |
| 505 | 502 | } |
| 506 | 503 | } |
| 507 | 504 | |
| 508 | -__attribute__ (( regparm(1) )) | |
| 509 | 505 | static void fill_tb (int idx) |
| 510 | 506 | { |
| 511 | 507 | tlb_t *tlb; |
| ... | ... | @@ -584,7 +580,6 @@ void do_tlbr (void) |
| 584 | 580 | } |
| 585 | 581 | #endif |
| 586 | 582 | |
| 587 | -__attribute__ (( regparm(1) )) | |
| 588 | 583 | void op_dump_ldst (const unsigned char *func) |
| 589 | 584 | { |
| 590 | 585 | if (loglevel) |
| ... | ... | @@ -608,7 +603,6 @@ void debug_eret (void) |
| 608 | 603 | } |
| 609 | 604 | } |
| 610 | 605 | |
| 611 | -__attribute__ (( regparm(1) )) | |
| 612 | 606 | void do_pmon (int function) |
| 613 | 607 | { |
| 614 | 608 | function /= 2; |
| ... | ... | @@ -634,3 +628,50 @@ void do_pmon (int function) |
| 634 | 628 | break; |
| 635 | 629 | } |
| 636 | 630 | } |
| 631 | + | |
| 632 | +#if !defined(CONFIG_USER_ONLY) | |
| 633 | + | |
| 634 | +#define MMUSUFFIX _mmu | |
| 635 | +#define GETPC() (__builtin_return_address(0)) | |
| 636 | + | |
| 637 | +#define SHIFT 0 | |
| 638 | +#include "softmmu_template.h" | |
| 639 | + | |
| 640 | +#define SHIFT 1 | |
| 641 | +#include "softmmu_template.h" | |
| 642 | + | |
| 643 | +#define SHIFT 2 | |
| 644 | +#include "softmmu_template.h" | |
| 645 | + | |
| 646 | +#define SHIFT 3 | |
| 647 | +#include "softmmu_template.h" | |
| 648 | + | |
| 649 | +void tlb_fill (target_ulong addr, int is_write, int is_user, void *retaddr) | |
| 650 | +{ | |
| 651 | + TranslationBlock *tb; | |
| 652 | + CPUState *saved_env; | |
| 653 | + unsigned long pc; | |
| 654 | + int ret; | |
| 655 | + | |
| 656 | + /* XXX: hack to restore env in all cases, even if not called from | |
| 657 | + generated code */ | |
| 658 | + saved_env = env; | |
| 659 | + env = cpu_single_env; | |
| 660 | + ret = cpu_mips_handle_mmu_fault(env, addr, is_write, is_user, 1); | |
| 661 | + if (ret) { | |
| 662 | + if (retaddr) { | |
| 663 | + /* now we have a real cpu fault */ | |
| 664 | + pc = (unsigned long)retaddr; | |
| 665 | + tb = tb_find_pc(pc); | |
| 666 | + if (tb) { | |
| 667 | + /* the PC is inside the translated code. It means that we have | |
| 668 | + a virtual CPU fault */ | |
| 669 | + cpu_restore_state(tb, env, pc, NULL); | |
| 670 | + } | |
| 671 | + } | |
| 672 | + do_raise_exception_err(env->exception_index, env->error_code); | |
| 673 | + } | |
| 674 | + env = saved_env; | |
| 675 | +} | |
| 676 | + | |
| 677 | +#endif | ... | ... |
target-mips/translate.c
| ... | ... | @@ -43,6 +43,174 @@ static uint32_t *gen_opparam_ptr; |
| 43 | 43 | |
| 44 | 44 | #include "gen-op.h" |
| 45 | 45 | |
| 46 | +/* MIPS opcodes */ | |
| 47 | +#define EXT_SPECIAL 0x100 | |
| 48 | +#define EXT_SPECIAL2 0x200 | |
| 49 | +#define EXT_REGIMM 0x300 | |
| 50 | +#define EXT_CP0 0x400 | |
| 51 | +#define EXT_CP1 0x500 | |
| 52 | +#define EXT_CP2 0x600 | |
| 53 | +#define EXT_CP3 0x700 | |
| 54 | + | |
| 55 | +enum { | |
| 56 | + /* indirect opcode tables */ | |
| 57 | + OPC_SPECIAL = 0x00, | |
| 58 | + OPC_BREGIMM = 0x01, | |
| 59 | + OPC_CP0 = 0x10, | |
| 60 | + OPC_CP1 = 0x11, | |
| 61 | + OPC_CP2 = 0x12, | |
| 62 | + OPC_CP3 = 0x13, | |
| 63 | + OPC_SPECIAL2 = 0x1C, | |
| 64 | + /* arithmetic with immediate */ | |
| 65 | + OPC_ADDI = 0x08, | |
| 66 | + OPC_ADDIU = 0x09, | |
| 67 | + OPC_SLTI = 0x0A, | |
| 68 | + OPC_SLTIU = 0x0B, | |
| 69 | + OPC_ANDI = 0x0C, | |
| 70 | + OPC_ORI = 0x0D, | |
| 71 | + OPC_XORI = 0x0E, | |
| 72 | + OPC_LUI = 0x0F, | |
| 73 | + /* Jump and branches */ | |
| 74 | + OPC_J = 0x02, | |
| 75 | + OPC_JAL = 0x03, | |
| 76 | + OPC_BEQ = 0x04, /* Unconditional if rs = rt = 0 (B) */ | |
| 77 | + OPC_BEQL = 0x14, | |
| 78 | + OPC_BNE = 0x05, | |
| 79 | + OPC_BNEL = 0x15, | |
| 80 | + OPC_BLEZ = 0x06, | |
| 81 | + OPC_BLEZL = 0x16, | |
| 82 | + OPC_BGTZ = 0x07, | |
| 83 | + OPC_BGTZL = 0x17, | |
| 84 | + OPC_JALX = 0x1D, /* MIPS 16 only */ | |
| 85 | + /* Load and stores */ | |
| 86 | + OPC_LB = 0x20, | |
| 87 | + OPC_LH = 0x21, | |
| 88 | + OPC_LWL = 0x22, | |
| 89 | + OPC_LW = 0x23, | |
| 90 | + OPC_LBU = 0x24, | |
| 91 | + OPC_LHU = 0x25, | |
| 92 | + OPC_LWR = 0x26, | |
| 93 | + OPC_SB = 0x28, | |
| 94 | + OPC_SH = 0x29, | |
| 95 | + OPC_SWL = 0x2A, | |
| 96 | + OPC_SW = 0x2B, | |
| 97 | + OPC_SWR = 0x2E, | |
| 98 | + OPC_LL = 0x30, | |
| 99 | + OPC_SC = 0x38, | |
| 100 | + /* Floating point load/store */ | |
| 101 | + OPC_LWC1 = 0x31, | |
| 102 | + OPC_LWC2 = 0x32, | |
| 103 | + OPC_LDC1 = 0x35, | |
| 104 | + OPC_LDC2 = 0x36, | |
| 105 | + OPC_SWC1 = 0x39, | |
| 106 | + OPC_SWC2 = 0x3A, | |
| 107 | + OPC_SDC1 = 0x3D, | |
| 108 | + OPC_SDC2 = 0x3E, | |
| 109 | + /* Cache and prefetch */ | |
| 110 | + OPC_CACHE = 0x2F, | |
| 111 | + OPC_PREF = 0x33, | |
| 112 | +}; | |
| 113 | + | |
| 114 | +/* MIPS special opcodes */ | |
| 115 | +enum { | |
| 116 | + /* Shifts */ | |
| 117 | + OPC_SLL = 0x00 | EXT_SPECIAL, | |
| 118 | + /* NOP is SLL r0, r0, 0 */ | |
| 119 | + /* SSNOP is SLL r0, r0, 1 */ | |
| 120 | + OPC_SRL = 0x02 | EXT_SPECIAL, | |
| 121 | + OPC_SRA = 0x03 | EXT_SPECIAL, | |
| 122 | + OPC_SLLV = 0x04 | EXT_SPECIAL, | |
| 123 | + OPC_SRLV = 0x06 | EXT_SPECIAL, | |
| 124 | + OPC_SRAV = 0x07 | EXT_SPECIAL, | |
| 125 | + /* Multiplication / division */ | |
| 126 | + OPC_MULT = 0x18 | EXT_SPECIAL, | |
| 127 | + OPC_MULTU = 0x19 | EXT_SPECIAL, | |
| 128 | + OPC_DIV = 0x1A | EXT_SPECIAL, | |
| 129 | + OPC_DIVU = 0x1B | EXT_SPECIAL, | |
| 130 | + /* 2 registers arithmetic / logic */ | |
| 131 | + OPC_ADD = 0x20 | EXT_SPECIAL, | |
| 132 | + OPC_ADDU = 0x21 | EXT_SPECIAL, | |
| 133 | + OPC_SUB = 0x22 | EXT_SPECIAL, | |
| 134 | + OPC_SUBU = 0x23 | EXT_SPECIAL, | |
| 135 | + OPC_AND = 0x24 | EXT_SPECIAL, | |
| 136 | + OPC_OR = 0x25 | EXT_SPECIAL, | |
| 137 | + OPC_XOR = 0x26 | EXT_SPECIAL, | |
| 138 | + OPC_NOR = 0x27 | EXT_SPECIAL, | |
| 139 | + OPC_SLT = 0x2A | EXT_SPECIAL, | |
| 140 | + OPC_SLTU = 0x2B | EXT_SPECIAL, | |
| 141 | + /* Jumps */ | |
| 142 | + OPC_JR = 0x08 | EXT_SPECIAL, | |
| 143 | + OPC_JALR = 0x09 | EXT_SPECIAL, | |
| 144 | + /* Traps */ | |
| 145 | + OPC_TGE = 0x30 | EXT_SPECIAL, | |
| 146 | + OPC_TGEU = 0x31 | EXT_SPECIAL, | |
| 147 | + OPC_TLT = 0x32 | EXT_SPECIAL, | |
| 148 | + OPC_TLTU = 0x33 | EXT_SPECIAL, | |
| 149 | + OPC_TEQ = 0x34 | EXT_SPECIAL, | |
| 150 | + OPC_TNE = 0x36 | EXT_SPECIAL, | |
| 151 | + /* HI / LO registers load & stores */ | |
| 152 | + OPC_MFHI = 0x10 | EXT_SPECIAL, | |
| 153 | + OPC_MTHI = 0x11 | EXT_SPECIAL, | |
| 154 | + OPC_MFLO = 0x12 | EXT_SPECIAL, | |
| 155 | + OPC_MTLO = 0x13 | EXT_SPECIAL, | |
| 156 | + /* Conditional moves */ | |
| 157 | + OPC_MOVZ = 0x0A | EXT_SPECIAL, | |
| 158 | + OPC_MOVN = 0x0B | EXT_SPECIAL, | |
| 159 | + | |
| 160 | + OPC_MOVCI = 0x01 | EXT_SPECIAL, | |
| 161 | + | |
| 162 | + /* Special */ | |
| 163 | + OPC_PMON = 0x05 | EXT_SPECIAL, | |
| 164 | + OPC_SYSCALL = 0x0C | EXT_SPECIAL, | |
| 165 | + OPC_BREAK = 0x0D | EXT_SPECIAL, | |
| 166 | + OPC_SYNC = 0x0F | EXT_SPECIAL, | |
| 167 | +}; | |
| 168 | + | |
| 169 | +enum { | |
| 170 | + /* Mutiply & xxx operations */ | |
| 171 | + OPC_MADD = 0x00 | EXT_SPECIAL2, | |
| 172 | + OPC_MADDU = 0x01 | EXT_SPECIAL2, | |
| 173 | + OPC_MUL = 0x02 | EXT_SPECIAL2, | |
| 174 | + OPC_MSUB = 0x04 | EXT_SPECIAL2, | |
| 175 | + OPC_MSUBU = 0x05 | EXT_SPECIAL2, | |
| 176 | + /* Misc */ | |
| 177 | + OPC_CLZ = 0x20 | EXT_SPECIAL2, | |
| 178 | + OPC_CLO = 0x21 | EXT_SPECIAL2, | |
| 179 | + /* Special */ | |
| 180 | + OPC_SDBBP = 0x3F | EXT_SPECIAL2, | |
| 181 | +}; | |
| 182 | + | |
| 183 | +/* Branch REGIMM */ | |
| 184 | +enum { | |
| 185 | + OPC_BLTZ = 0x00 | EXT_REGIMM, | |
| 186 | + OPC_BLTZL = 0x02 | EXT_REGIMM, | |
| 187 | + OPC_BGEZ = 0x01 | EXT_REGIMM, | |
| 188 | + OPC_BGEZL = 0x03 | EXT_REGIMM, | |
| 189 | + OPC_BLTZAL = 0x10 | EXT_REGIMM, | |
| 190 | + OPC_BLTZALL = 0x12 | EXT_REGIMM, | |
| 191 | + OPC_BGEZAL = 0x11 | EXT_REGIMM, | |
| 192 | + OPC_BGEZALL = 0x13 | EXT_REGIMM, | |
| 193 | + OPC_TGEI = 0x08 | EXT_REGIMM, | |
| 194 | + OPC_TGEIU = 0x09 | EXT_REGIMM, | |
| 195 | + OPC_TLTI = 0x0A | EXT_REGIMM, | |
| 196 | + OPC_TLTIU = 0x0B | EXT_REGIMM, | |
| 197 | + OPC_TEQI = 0x0C | EXT_REGIMM, | |
| 198 | + OPC_TNEI = 0x0E | EXT_REGIMM, | |
| 199 | +}; | |
| 200 | + | |
| 201 | +enum { | |
| 202 | + /* Coprocessor 0 (MMU) */ | |
| 203 | + OPC_MFC0 = 0x00 | EXT_CP0, | |
| 204 | + OPC_MTC0 = 0x04 | EXT_CP0, | |
| 205 | + OPC_TLBR = 0x01 | EXT_CP0, | |
| 206 | + OPC_TLBWI = 0x02 | EXT_CP0, | |
| 207 | + OPC_TLBWR = 0x06 | EXT_CP0, | |
| 208 | + OPC_TLBP = 0x08 | EXT_CP0, | |
| 209 | + OPC_ERET = 0x18 | EXT_CP0, | |
| 210 | + OPC_DERET = 0x1F | EXT_CP0, | |
| 211 | + OPC_WAIT = 0x20 | EXT_CP0, | |
| 212 | +}; | |
| 213 | + | |
| 46 | 214 | const unsigned char *regnames[] = |
| 47 | 215 | { "r0", "at", "v0", "v1", "a0", "a1", "a2", "a3", |
| 48 | 216 | "t0", "t1", "t2", "t3", "t4", "t5", "t6", "t7", | ... | ... |