OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [tags/] [or1ksim/] [or1ksim-0.4.0rc2/] [cpu/] [or32/] [op.c] - Diff between revs 19 and 128

Only display areas with differences | Details | Blame | View Log

Rev 19 Rev 128
/* op.c -- Micro operations for the recompiler
/* op.c -- Micro operations for the recompiler
   Copyright (C) 2005 György `nog' Jeney, nog@sdf.lonestar.org
   Copyright (C) 2005 György `nog' Jeney, nog@sdf.lonestar.org
 
 
This file is part of OpenRISC 1000 Architectural Simulator.
This file is part of OpenRISC 1000 Architectural Simulator.
 
 
This program is free software; you can redistribute it and/or modify
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
(at your option) any later version.
 
 
This program is distributed in the hope that it will be useful,
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.
GNU General Public License for more details.
 
 
You should have received a copy of the GNU General Public License
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
 
 
 
 
#include <stdio.h>
#include <stdio.h>
#include <stdint.h>
#include <stdint.h>
#include <stdlib.h>
#include <stdlib.h>
 
 
#include "config.h"
#include "config.h"
 
 
#ifdef HAVE_INTTYPES_H
#ifdef HAVE_INTTYPES_H
#include <inttypes.h>
#include <inttypes.h>
#endif
#endif
 
 
#include "port.h"
#include "port.h"
#include "arch.h"
#include "arch.h"
#include "spr-defs.h"
#include "spr-defs.h"
#include "opcode/or32.h"
#include "opcode/or32.h"
#include "sim-config.h"
#include "sim-config.h"
#include "except.h"
#include "except.h"
#include "abstract.h"
#include "abstract.h"
#include "execute.h"
#include "execute.h"
#include "sprs.h"
#include "sprs.h"
#include "sched.h"
#include "sched.h"
#include "immu.h"
#include "immu.h"
 
 
#include "op-support.h"
#include "op-support.h"
 
 
#include "i386-regs.h"
#include "i386-regs.h"
 
 
#include "dyn-rec.h"
#include "dyn-rec.h"
 
 
register struct cpu_state *env asm(CPU_STATE_REG);
register struct cpu_state *env asm(CPU_STATE_REG);
 
 
#include "op-i386.h"
#include "op-i386.h"
 
 
/*
/*
 * WARNING: Before going of and wildly editing everything in this file remember
 * WARNING: Before going of and wildly editing everything in this file remember
 * the following about its contents:
 * the following about its contents:
 * 1) The `functions' don't EVER return.  In otherwords haveing return state-
 * 1) The `functions' don't EVER return.  In otherwords haveing return state-
 *    ments _anywere_ in this file is likely not to work.  This is because
 *    ments _anywere_ in this file is likely not to work.  This is because
 *    dyngen just strips away the ret from the end of the function and just uses
 *    dyngen just strips away the ret from the end of the function and just uses
 *    the function `body'.  If a ret statement is executed _anyware_ inside the
 *    the function `body'.  If a ret statement is executed _anyware_ inside the
 *    dynamicly generated code, then it is undefined were we shall jump to.
 *    dynamicly generated code, then it is undefined were we shall jump to.
 * 2) Because of 1), try not to have overly complicated functions.  In too
 * 2) Because of 1), try not to have overly complicated functions.  In too
 *    complicated functions, gcc may decide to generate premature `exits'.  This
 *    complicated functions, gcc may decide to generate premature `exits'.  This
 *    is what passing the -fno-reorder-blocks command line switch to gcc helps
 *    is what passing the -fno-reorder-blocks command line switch to gcc helps
 *    with.  This is ofcourse not desired and is rather flaky as we don't (and
 *    with.  This is ofcourse not desired and is rather flaky as we don't (and
 *    can't) control the kind of code that gcc generates: It may work for one
 *    can't) control the kind of code that gcc generates: It may work for one
 *    and break for another.  The less branches there are the less likely it is
 *    and break for another.  The less branches there are the less likely it is
 *    that a premature return shall occur.
 *    that a premature return shall occur.
 * 3) If gcc decides that it is going to be a basterd then it will optimise a
 * 3) If gcc decides that it is going to be a basterd then it will optimise a
 *    very simple condition (if/switch) with a premature exit.  But gcc can't
 *    very simple condition (if/switch) with a premature exit.  But gcc can't
 *    fuck ME over!  Just stick a FORCE_RET; at the END of the offending
 *    fuck ME over!  Just stick a FORCE_RET; at the END of the offending
 *    function.
 *    function.
 * 4) All operations must start with `op_'.  dyngen ignores all other functions.
 * 4) All operations must start with `op_'.  dyngen ignores all other functions.
 * 5) Local variables are depriciated: They hinder performance.
 * 5) Local variables are depriciated: They hinder performance.
 * 6) Function calls are expensive as the stack has to be shifted (twice).
 * 6) Function calls are expensive as the stack has to be shifted (twice).
 */
 */
 
 
/*#define __or_dynop __attribute__((noreturn))*/
/*#define __or_dynop __attribute__((noreturn))*/
#define __or_dynop
#define __or_dynop
 
 
/* Temporaries to hold the (simulated) registers in */
/* Temporaries to hold the (simulated) registers in */
register uint32_t t0 asm(T0_REG);
register uint32_t t0 asm(T0_REG);
register uint32_t t1 asm(T1_REG);
register uint32_t t1 asm(T1_REG);
register uint32_t t2 asm(T2_REG);
register uint32_t t2 asm(T2_REG);
 
 
#define OP_PARAM1 ((uorreg_t)(&__op_param1))
#define OP_PARAM1 ((uorreg_t)(&__op_param1))
#define OP_PARAM2 ((uorreg_t)(&__op_param2))
#define OP_PARAM2 ((uorreg_t)(&__op_param2))
#define OP_PARAM3 ((uorreg_t)(&__op_param3))
#define OP_PARAM3 ((uorreg_t)(&__op_param3))
 
 
extern uorreg_t __op_param1;
extern uorreg_t __op_param1;
extern uorreg_t __op_param2;
extern uorreg_t __op_param2;
extern uorreg_t __op_param3;
extern uorreg_t __op_param3;
 
 
 
 
static inline void save_t_bound(oraddr_t pc)
static inline void save_t_bound(oraddr_t pc)
{
{
  int reg;
  int reg;
 
 
  pc = (pc & immu_state->page_offset_mask) / 4;
  pc = (pc & immu_state->page_offset_mask) / 4;
  reg = env->curr_page->ts_bound[pc];
  reg = env->curr_page->ts_bound[pc];
 
 
  if(reg & 0x1f)
  if(reg & 0x1f)
    env->reg[reg & 0x1f] = t0;
    env->reg[reg & 0x1f] = t0;
 
 
  if((reg >> 5) & 0x1f)
  if((reg >> 5) & 0x1f)
    env->reg[(reg >> 5) & 0x1f] = t1;
    env->reg[(reg >> 5) & 0x1f] = t1;
 
 
  if((reg >> 10) & 0x1f)
  if((reg >> 10) & 0x1f)
    env->reg[(reg >> 10) & 0x1f] = t2;
    env->reg[(reg >> 10) & 0x1f] = t2;
}
}
 
 
void do_sched_wrap(void)
void do_sched_wrap(void)
{
{
  env->pc += 4;
  env->pc += 4;
  //runtime.cpu.instructions++;
  //runtime.cpu.instructions++;
  runtime.sim.cycles -= env->cycles_dec;
  runtime.sim.cycles -= env->cycles_dec;
  scheduler.job_queue->time += env->cycles_dec;
  scheduler.job_queue->time += env->cycles_dec;
  if(scheduler.job_queue->time <= 0) {
  if(scheduler.job_queue->time <= 0) {
    save_t_bound(env->pc - 4);
    save_t_bound(env->pc - 4);
    do_scheduler();
    do_scheduler();
  }
  }
}
}
 
 
/* do_scheduler wrapper for instructions that are in the delay slot */
/* do_scheduler wrapper for instructions that are in the delay slot */
void do_sched_wrap_delay(void)
void do_sched_wrap_delay(void)
{
{
  /* FIXME: Can't this be eliminated? */
  /* FIXME: Can't this be eliminated? */
  env->pc += 4;
  env->pc += 4;
  //runtime.cpu.instructions++;
  //runtime.cpu.instructions++;
  runtime.sim.cycles -= env->cycles_dec;
  runtime.sim.cycles -= env->cycles_dec;
  scheduler.job_queue->time += env->cycles_dec;
  scheduler.job_queue->time += env->cycles_dec;
  if(scheduler.job_queue->time <= 0)
  if(scheduler.job_queue->time <= 0)
    do_scheduler();
    do_scheduler();
}
}
 
 
void enter_dyn_code(oraddr_t addr, struct dyn_page *dp)
void enter_dyn_code(oraddr_t addr, struct dyn_page *dp)
{
{
  uint16_t reg = 0;
  uint16_t reg = 0;
  uint32_t t0_reg = t0, t1_reg = t1, t2_reg = t2;
  uint32_t t0_reg = t0, t1_reg = t1, t2_reg = t2;
  struct cpu_state *cpu_reg = env;
  struct cpu_state *cpu_reg = env;
 
 
  addr &= immu_state->page_offset_mask;
  addr &= immu_state->page_offset_mask;
  addr >>= 2;
  addr >>= 2;
 
 
  if(addr)
  if(addr)
    reg = dp->ts_bound[addr - 1];
    reg = dp->ts_bound[addr - 1];
 
 
  t0 = cpu_state.reg[reg & 0x1f];
  t0 = cpu_state.reg[reg & 0x1f];
  t1 = cpu_state.reg[(reg >> 5) & 0x1f];
  t1 = cpu_state.reg[(reg >> 5) & 0x1f];
 
 
  /* Don't we all love gcc?  For some heavenly reason gcc 3.2 _knows_ that if I
  /* Don't we all love gcc?  For some heavenly reason gcc 3.2 _knows_ that if I
   * don't put a condition around the assignment of t2, _all_ the assignments to
   * don't put a condition around the assignment of t2, _all_ the assignments to
   * t{0,1,2} are useless and not needed.  I'm pleasently happy that gcc is so
   * t{0,1,2} are useless and not needed.  I'm pleasently happy that gcc is so
   * bright, but on the other hand, t{0,1,2} are globals (!) how can you assume
   * bright, but on the other hand, t{0,1,2} are globals (!) how can you assume
   * that the value of a global won't be used in a function further up or
   * that the value of a global won't be used in a function further up or
   * further down the stack?? */
   * further down the stack?? */
  if(addr)
  if(addr)
    t2 = cpu_state.reg[(reg >> 10) & 0x1f];
    t2 = cpu_state.reg[(reg >> 10) & 0x1f];
 
 
  env = &cpu_state;
  env = &cpu_state;
 
 
  ((gen_code_ent *)dp->locs)[addr]();
  ((gen_code_ent *)dp->locs)[addr]();
  t0 = t0_reg;
  t0 = t0_reg;
  t1 = t1_reg;
  t1 = t1_reg;
  t2 = t2_reg;
  t2 = t2_reg;
  env = (struct cpu_state *)cpu_reg;
  env = (struct cpu_state *)cpu_reg;
}
}
 
 
__or_dynop void op_set_pc_pc_delay(void)
__or_dynop void op_set_pc_pc_delay(void)
{
{
  env->sprs[SPR_PPC] = env->pc;
  env->sprs[SPR_PPC] = env->pc;
  /* pc_delay is pulled back 4 since imediatly after this is run, the scheduler
  /* pc_delay is pulled back 4 since imediatly after this is run, the scheduler
   * runs which also increments it by 4 */
   * runs which also increments it by 4 */
  env->pc = env->pc_delay - 4;
  env->pc = env->pc_delay - 4;
}
}
 
 
__or_dynop void op_set_pc_delay_imm(void)
__or_dynop void op_set_pc_delay_imm(void)
{
{
  env->pc_delay = env->pc + (orreg_t)OP_PARAM1;
  env->pc_delay = env->pc + (orreg_t)OP_PARAM1;
  env->delay_insn = 1;
  env->delay_insn = 1;
}
}
 
 
__or_dynop void op_set_pc_delay_pc(void)
__or_dynop void op_set_pc_delay_pc(void)
{
{
  env->pc_delay = env->pc;
  env->pc_delay = env->pc;
  env->delay_insn = 1;
  env->delay_insn = 1;
}
}
 
 
__or_dynop void op_clear_pc_delay(void)
__or_dynop void op_clear_pc_delay(void)
{
{
  env->pc_delay = 0;
  env->pc_delay = 0;
  env->delay_insn = 1;
  env->delay_insn = 1;
}
}
 
 
__or_dynop void op_do_jump_delay(void)
__or_dynop void op_do_jump_delay(void)
{
{
  env->pc = env->pc_delay;
  env->pc = env->pc_delay;
}
}
 
 
__or_dynop void op_clear_delay_insn(void)
__or_dynop void op_clear_delay_insn(void)
{
{
  env->delay_insn = 0;
  env->delay_insn = 0;
}
}
 
 
__or_dynop void op_set_delay_insn(void)
__or_dynop void op_set_delay_insn(void)
{
{
  env->delay_insn = 1;
  env->delay_insn = 1;
}
}
 
 
__or_dynop void op_check_delay_slot(void)
__or_dynop void op_check_delay_slot(void)
{
{
  if(!env->delay_insn)
  if(!env->delay_insn)
    OP_JUMP(OP_PARAM1);
    OP_JUMP(OP_PARAM1);
}
}
 
 
__or_dynop void op_jmp_imm(void)
__or_dynop void op_jmp_imm(void)
{
{
  OP_JUMP(OP_PARAM1);
  OP_JUMP(OP_PARAM1);
}
}
 
 
__or_dynop void op_set_flag(void)
__or_dynop void op_set_flag(void)
{
{
  env->sprs[SPR_SR] |= SPR_SR_F;
  env->sprs[SPR_SR] |= SPR_SR_F;
}
}
 
 
__or_dynop void op_clear_flag(void)
__or_dynop void op_clear_flag(void)
{
{
  env->sprs[SPR_SR] &= ~SPR_SR_F;
  env->sprs[SPR_SR] &= ~SPR_SR_F;
}
}
 
 
/* Used for the l.bf instruction.  Therefore if the flag is not set, jump over
/* Used for the l.bf instruction.  Therefore if the flag is not set, jump over
 * all the jumping stuff */
 * all the jumping stuff */
__or_dynop void op_check_flag(void)
__or_dynop void op_check_flag(void)
{
{
  if(!(env->sprs[SPR_SR] & SPR_SR_F)) {
  if(!(env->sprs[SPR_SR] & SPR_SR_F)) {
    SPEEDY_CALL(do_sched_wrap);
    SPEEDY_CALL(do_sched_wrap);
    OP_JUMP(OP_PARAM1);
    OP_JUMP(OP_PARAM1);
  }
  }
}
}
 
 
/* Used for l.bf if the delay slot instruction is on another page */
/* Used for l.bf if the delay slot instruction is on another page */
__or_dynop void op_check_flag_delay(void)
__or_dynop void op_check_flag_delay(void)
{
{
  if(env->sprs[SPR_SR] & SPR_SR_F) {
  if(env->sprs[SPR_SR] & SPR_SR_F) {
    env->delay_insn = 1;
    env->delay_insn = 1;
    env->pc_delay = env->pc + (orreg_t)OP_PARAM1;
    env->pc_delay = env->pc + (orreg_t)OP_PARAM1;
  }
  }
}
}
 
 
/* Used for the l.bnf instruction.  Therefore if the flag is set, jump over all
/* Used for the l.bnf instruction.  Therefore if the flag is set, jump over all
 * the jumping stuff */
 * the jumping stuff */
__or_dynop void op_check_not_flag(void)
__or_dynop void op_check_not_flag(void)
{
{
  if(env->sprs[SPR_SR] & SPR_SR_F) {
  if(env->sprs[SPR_SR] & SPR_SR_F) {
    SPEEDY_CALL(do_sched_wrap);
    SPEEDY_CALL(do_sched_wrap);
    OP_JUMP(OP_PARAM1);
    OP_JUMP(OP_PARAM1);
  }
  }
}
}
 
 
/* Used for l.bnf if the delay slot instruction is on another page */
/* Used for l.bnf if the delay slot instruction is on another page */
__or_dynop void op_check_not_flag_delay(void)
__or_dynop void op_check_not_flag_delay(void)
{
{
  if(!(env->sprs[SPR_SR] & SPR_SR_F)) {
  if(!(env->sprs[SPR_SR] & SPR_SR_F)) {
    env->delay_insn = 1;
    env->delay_insn = 1;
    env->pc_delay = env->pc + (orreg_t)OP_PARAM1;
    env->pc_delay = env->pc + (orreg_t)OP_PARAM1;
  }
  }
}
}
 
 
__or_dynop void op_add_pc(void)
__or_dynop void op_add_pc(void)
{
{
  env->pc += OP_PARAM1;
  env->pc += OP_PARAM1;
}
}
 
 
__or_dynop void op_nop_exit(void)
__or_dynop void op_nop_exit(void)
{
{
  op_support_nop_exit();
  op_support_nop_exit();
  FORCE_RET;
  FORCE_RET;
}
}
 
 
__or_dynop void op_nop_reset(void)
__or_dynop void op_nop_reset(void)
{
{
  op_support_nop_reset();
  op_support_nop_reset();
  FORCE_RET;
  FORCE_RET;
}
}
 
 
__or_dynop void op_nop_printf(void)
__or_dynop void op_nop_printf(void)
{
{
  op_support_nop_printf();
  op_support_nop_printf();
  FORCE_RET;
  FORCE_RET;
}
}
 
 
__or_dynop void op_nop_report(void)
__or_dynop void op_nop_report(void)
{
{
  op_support_nop_report();
  op_support_nop_report();
  FORCE_RET;
  FORCE_RET;
}
}
 
 
__or_dynop void op_nop_report_imm(void)
__or_dynop void op_nop_report_imm(void)
{
{
  op_support_nop_report_imm(OP_PARAM1);
  op_support_nop_report_imm(OP_PARAM1);
}
}
 
 
/* FIXME: Create another 2 sched functions that to the actual analysis call
/* FIXME: Create another 2 sched functions that to the actual analysis call
 * instead of bloating the recompiled code with this */
 * instead of bloating the recompiled code with this */
__or_dynop void op_analysis(void)
__or_dynop void op_analysis(void)
{
{
  SPEEDY_CALL(op_support_analysis);
  SPEEDY_CALL(op_support_analysis);
}
}
 
 
__or_dynop void op_move_gpr1_pc_delay(void)
__or_dynop void op_move_gpr1_pc_delay(void)
{
{
  env->pc_delay = env->reg[1];
  env->pc_delay = env->reg[1];
  env->delay_insn = 1;
  env->delay_insn = 1;
}
}
 
 
__or_dynop void op_move_gpr2_pc_delay(void)
__or_dynop void op_move_gpr2_pc_delay(void)
{
{
  env->pc_delay = env->reg[2];
  env->pc_delay = env->reg[2];
  env->delay_insn = 1;
  env->delay_insn = 1;
}
}
 
 
__or_dynop void op_move_gpr3_pc_delay(void)
__or_dynop void op_move_gpr3_pc_delay(void)
{
{
  env->pc_delay = env->reg[3];
  env->pc_delay = env->reg[3];
  env->delay_insn = 1;
  env->delay_insn = 1;
}
}
 
 
__or_dynop void op_move_gpr4_pc_delay(void)
__or_dynop void op_move_gpr4_pc_delay(void)
{
{
  env->pc_delay = env->reg[4];
  env->pc_delay = env->reg[4];
  env->delay_insn = 1;
  env->delay_insn = 1;
}
}
 
 
__or_dynop void op_move_gpr5_pc_delay(void)
__or_dynop void op_move_gpr5_pc_delay(void)
{
{
  env->pc_delay = env->reg[5];
  env->pc_delay = env->reg[5];
  env->delay_insn = 1;
  env->delay_insn = 1;
}
}
 
 
__or_dynop void op_move_gpr6_pc_delay(void)
__or_dynop void op_move_gpr6_pc_delay(void)
{
{
  env->pc_delay = env->reg[6];
  env->pc_delay = env->reg[6];
  env->delay_insn = 1;
  env->delay_insn = 1;
}
}
 
 
__or_dynop void op_move_gpr7_pc_delay(void)
__or_dynop void op_move_gpr7_pc_delay(void)
{
{
  env->pc_delay = env->reg[7];
  env->pc_delay = env->reg[7];
  env->delay_insn = 1;
  env->delay_insn = 1;
}
}
 
 
__or_dynop void op_move_gpr8_pc_delay(void)
__or_dynop void op_move_gpr8_pc_delay(void)
{
{
  env->pc_delay = env->reg[8];
  env->pc_delay = env->reg[8];
  env->delay_insn = 1;
  env->delay_insn = 1;
}
}
 
 
__or_dynop void op_move_gpr9_pc_delay(void)
__or_dynop void op_move_gpr9_pc_delay(void)
{
{
  env->pc_delay = env->reg[9];
  env->pc_delay = env->reg[9];
  env->delay_insn = 1;
  env->delay_insn = 1;
}
}
 
 
__or_dynop void op_move_gpr10_pc_delay(void)
__or_dynop void op_move_gpr10_pc_delay(void)
{
{
  env->pc_delay = env->reg[10];
  env->pc_delay = env->reg[10];
  env->delay_insn = 1;
  env->delay_insn = 1;
}
}
 
 
__or_dynop void op_move_gpr11_pc_delay(void)
__or_dynop void op_move_gpr11_pc_delay(void)
{
{
  env->pc_delay = env->reg[11];
  env->pc_delay = env->reg[11];
  env->delay_insn = 1;
  env->delay_insn = 1;
}
}
 
 
__or_dynop void op_move_gpr12_pc_delay(void)
__or_dynop void op_move_gpr12_pc_delay(void)
{
{
  env->pc_delay = env->reg[12];
  env->pc_delay = env->reg[12];
  env->delay_insn = 1;
  env->delay_insn = 1;
}
}
 
 
__or_dynop void op_move_gpr13_pc_delay(void)
__or_dynop void op_move_gpr13_pc_delay(void)
{
{
  env->pc_delay = env->reg[13];
  env->pc_delay = env->reg[13];
  env->delay_insn = 1;
  env->delay_insn = 1;
}
}
 
 
__or_dynop void op_move_gpr14_pc_delay(void)
__or_dynop void op_move_gpr14_pc_delay(void)
{
{
  env->pc_delay = env->reg[14];
  env->pc_delay = env->reg[14];
  env->delay_insn = 1;
  env->delay_insn = 1;
}
}
 
 
__or_dynop void op_move_gpr15_pc_delay(void)
__or_dynop void op_move_gpr15_pc_delay(void)
{
{
  env->pc_delay = env->reg[15];
  env->pc_delay = env->reg[15];
  env->delay_insn = 1;
  env->delay_insn = 1;
}
}
 
 
__or_dynop void op_move_gpr16_pc_delay(void)
__or_dynop void op_move_gpr16_pc_delay(void)
{
{
  env->pc_delay = env->reg[16];
  env->pc_delay = env->reg[16];
  env->delay_insn = 1;
  env->delay_insn = 1;
}
}
 
 
__or_dynop void op_move_gpr17_pc_delay(void)
__or_dynop void op_move_gpr17_pc_delay(void)
{
{
  env->pc_delay = env->reg[17];
  env->pc_delay = env->reg[17];
  env->delay_insn = 1;
  env->delay_insn = 1;
}
}
 
 
__or_dynop void op_move_gpr18_pc_delay(void)
__or_dynop void op_move_gpr18_pc_delay(void)
{
{
  env->pc_delay = env->reg[18];
  env->pc_delay = env->reg[18];
  env->delay_insn = 1;
  env->delay_insn = 1;
}
}
 
 
__or_dynop void op_move_gpr19_pc_delay(void)
__or_dynop void op_move_gpr19_pc_delay(void)
{
{
  env->pc_delay = env->reg[19];
  env->pc_delay = env->reg[19];
  env->delay_insn = 1;
  env->delay_insn = 1;
}
}
 
 
__or_dynop void op_move_gpr20_pc_delay(void)
__or_dynop void op_move_gpr20_pc_delay(void)
{
{
  env->pc_delay = env->reg[20];
  env->pc_delay = env->reg[20];
  env->delay_insn = 1;
  env->delay_insn = 1;
}
}
 
 
__or_dynop void op_move_gpr21_pc_delay(void)
__or_dynop void op_move_gpr21_pc_delay(void)
{
{
  env->pc_delay = env->reg[21];
  env->pc_delay = env->reg[21];
  env->delay_insn = 1;
  env->delay_insn = 1;
}
}
 
 
__or_dynop void op_move_gpr22_pc_delay(void)
__or_dynop void op_move_gpr22_pc_delay(void)
{
{
  env->pc_delay = env->reg[22];
  env->pc_delay = env->reg[22];
  env->delay_insn = 1;
  env->delay_insn = 1;
}
}
 
 
__or_dynop void op_move_gpr23_pc_delay(void)
__or_dynop void op_move_gpr23_pc_delay(void)
{
{
  env->pc_delay = env->reg[23];
  env->pc_delay = env->reg[23];
  env->delay_insn = 1;
  env->delay_insn = 1;
}
}
 
 
__or_dynop void op_move_gpr24_pc_delay(void)
__or_dynop void op_move_gpr24_pc_delay(void)
{
{
  env->pc_delay = env->reg[24];
  env->pc_delay = env->reg[24];
  env->delay_insn = 1;
  env->delay_insn = 1;
}
}
 
 
__or_dynop void op_move_gpr25_pc_delay(void)
__or_dynop void op_move_gpr25_pc_delay(void)
{
{
  env->pc_delay = env->reg[25];
  env->pc_delay = env->reg[25];
  env->delay_insn = 1;
  env->delay_insn = 1;
}
}
 
 
__or_dynop void op_move_gpr26_pc_delay(void)
__or_dynop void op_move_gpr26_pc_delay(void)
{
{
  env->pc_delay = env->reg[26];
  env->pc_delay = env->reg[26];
  env->delay_insn = 1;
  env->delay_insn = 1;
}
}
 
 
__or_dynop void op_move_gpr27_pc_delay(void)
__or_dynop void op_move_gpr27_pc_delay(void)
{
{
  env->pc_delay = env->reg[27];
  env->pc_delay = env->reg[27];
  env->delay_insn = 1;
  env->delay_insn = 1;
}
}
 
 
__or_dynop void op_move_gpr28_pc_delay(void)
__or_dynop void op_move_gpr28_pc_delay(void)
{
{
  env->pc_delay = env->reg[28];
  env->pc_delay = env->reg[28];
  env->delay_insn = 1;
  env->delay_insn = 1;
}
}
 
 
__or_dynop void op_move_gpr29_pc_delay(void)
__or_dynop void op_move_gpr29_pc_delay(void)
{
{
  env->pc_delay = env->reg[29];
  env->pc_delay = env->reg[29];
  env->delay_insn = 1;
  env->delay_insn = 1;
}
}
 
 
__or_dynop void op_move_gpr30_pc_delay(void)
__or_dynop void op_move_gpr30_pc_delay(void)
{
{
  env->pc_delay = env->reg[30];
  env->pc_delay = env->reg[30];
  env->delay_insn = 1;
  env->delay_insn = 1;
}
}
 
 
__or_dynop void op_move_gpr31_pc_delay(void)
__or_dynop void op_move_gpr31_pc_delay(void)
{
{
  env->pc_delay = env->reg[31];
  env->pc_delay = env->reg[31];
  env->delay_insn = 1;
  env->delay_insn = 1;
}
}
 
 
#define OP_FILE "op-1t-op.h"
#define OP_FILE "op-1t-op.h"
#include "op-1t.h"
#include "op-1t.h"
#undef OP_FILE
#undef OP_FILE
 
 
#define OP_FILE "op-2t-op.h"
#define OP_FILE "op-2t-op.h"
#include "op-2t.h"
#include "op-2t.h"
#undef OP_FILE
#undef OP_FILE
 
 
#define OP_FILE "op-3t-op.h"
#define OP_FILE "op-3t-op.h"
#include "op-3t.h"
#include "op-3t.h"
#undef OP_FILE
#undef OP_FILE
 
 
#define OP_FILE "op-arith-op.h"
#define OP_FILE "op-arith-op.h"
#define OP_EXTRA
#define OP_EXTRA
 
 
#define OP /
#define OP /
#define OP_CAST(x) (orreg_t)(x)
#define OP_CAST(x) (orreg_t)(x)
#define OP_NAME div
#define OP_NAME div
#include "op-3t.h"
#include "op-3t.h"
#undef OP_NAME
#undef OP_NAME
#undef OP_CAST
#undef OP_CAST
#undef OP
#undef OP
 
 
#define OP /
#define OP /
#define OP_CAST(x) (x)
#define OP_CAST(x) (x)
#define OP_NAME divu
#define OP_NAME divu
#include "op-3t.h"
#include "op-3t.h"
#undef OP_NAME
#undef OP_NAME
#undef OP_CAST
#undef OP_CAST
#undef OP
#undef OP
 
 
#define OP *
#define OP *
#define OP_CAST(x) (x)
#define OP_CAST(x) (x)
#define OP_NAME mulu
#define OP_NAME mulu
#include "op-3t.h"
#include "op-3t.h"
#undef OP_NAME
#undef OP_NAME
#undef OP_CAST
#undef OP_CAST
#undef OP
#undef OP
 
 
#define OP -
#define OP -
#define OP_CAST(x) (orreg_t)(x)
#define OP_CAST(x) (orreg_t)(x)
#define OP_NAME sub
#define OP_NAME sub
#include "op-3t.h"
#include "op-3t.h"
#undef OP_NAME
#undef OP_NAME
#undef OP_CAST
#undef OP_CAST
#undef OP
#undef OP
 
 
#undef OP_EXTRA
#undef OP_EXTRA
 
 
#define OP_EXTRA + ((env->sprs[SPR_SR] & SPR_SR_CY) >> 10)
#define OP_EXTRA + ((env->sprs[SPR_SR] & SPR_SR_CY) >> 10)
#define OP +
#define OP +
#define OP_CAST(x) (orreg_t)(x)
#define OP_CAST(x) (orreg_t)(x)
#define OP_NAME addc
#define OP_NAME addc
#include "op-3t.h"
#include "op-3t.h"
#include "op-2t.h"
#include "op-2t.h"
#undef OP_NAME
#undef OP_NAME
#undef OP_CAST
#undef OP_CAST
#undef OP
#undef OP
 
 
#undef OP_EXTRA
#undef OP_EXTRA
#define OP_EXTRA
#define OP_EXTRA
 
 
#define OP +
#define OP +
#define OP_CAST(x) (orreg_t)(x)
#define OP_CAST(x) (orreg_t)(x)
#define OP_NAME add
#define OP_NAME add
#include "op-3t.h"
#include "op-3t.h"
#include "op-2t.h"
#include "op-2t.h"
#undef OP_NAME
#undef OP_NAME
#undef OP_CAST
#undef OP_CAST
#undef OP
#undef OP
 
 
#define OP &
#define OP &
#define OP_CAST(x) (x)
#define OP_CAST(x) (x)
#define OP_NAME and
#define OP_NAME and
#include "op-3t.h"
#include "op-3t.h"
#include "op-2t.h"
#include "op-2t.h"
#undef OP_NAME
#undef OP_NAME
#undef OP_CAST
#undef OP_CAST
#undef OP
#undef OP
 
 
#define OP *
#define OP *
#define OP_CAST(x) (orreg_t)(x)
#define OP_CAST(x) (orreg_t)(x)
#define OP_NAME mul
#define OP_NAME mul
#include "op-3t.h"
#include "op-3t.h"
#include "op-2t.h"
#include "op-2t.h"
#undef OP_NAME
#undef OP_NAME
#undef OP_CAST
#undef OP_CAST
#undef OP
#undef OP
 
 
#define OP |
#define OP |
#define OP_CAST(x) (x)
#define OP_CAST(x) (x)
#define OP_NAME or
#define OP_NAME or
#include "op-3t.h"
#include "op-3t.h"
#include "op-2t.h"
#include "op-2t.h"
#undef OP_NAME
#undef OP_NAME
#undef OP_CAST
#undef OP_CAST
#undef OP
#undef OP
 
 
#define OP <<
#define OP <<
#define OP_CAST(x) (x)
#define OP_CAST(x) (x)
#define OP_NAME sll
#define OP_NAME sll
#include "op-3t.h"
#include "op-3t.h"
#include "op-2t.h"
#include "op-2t.h"
#undef OP_NAME
#undef OP_NAME
#undef OP_CAST
#undef OP_CAST
#undef OP
#undef OP
 
 
#define OP >>
#define OP >>
#define OP_CAST(x) (orreg_t)(x)
#define OP_CAST(x) (orreg_t)(x)
#define OP_NAME sra
#define OP_NAME sra
#include "op-3t.h"
#include "op-3t.h"
#include "op-2t.h"
#include "op-2t.h"
#undef OP_NAME
#undef OP_NAME
#undef OP_CAST
#undef OP_CAST
#undef OP
#undef OP
 
 
#define OP >>
#define OP >>
#define OP_CAST(x) (x)
#define OP_CAST(x) (x)
#define OP_NAME srl
#define OP_NAME srl
#include "op-3t.h"
#include "op-3t.h"
#include "op-2t.h"
#include "op-2t.h"
#undef OP_NAME
#undef OP_NAME
#undef OP_CAST
#undef OP_CAST
#undef OP
#undef OP
 
 
#define OP ^
#define OP ^
#define OP_CAST(x) (x)
#define OP_CAST(x) (x)
#define OP_NAME xor
#define OP_NAME xor
#include "op-3t.h"
#include "op-3t.h"
#include "op-2t.h"
#include "op-2t.h"
#undef OP_NAME
#undef OP_NAME
#undef OP_CAST
#undef OP_CAST
#undef OP
#undef OP
 
 
#undef OP_EXTRA
#undef OP_EXTRA
#undef OP_FILE
#undef OP_FILE
 
 
#define OP_FILE "op-extend-op.h"
#define OP_FILE "op-extend-op.h"
 
 
#define EXT_NAME extbs
#define EXT_NAME extbs
#define EXT_TYPE int8_t
#define EXT_TYPE int8_t
#define EXT_CAST (orreg_t)
#define EXT_CAST (orreg_t)
#include "op-2t.h"
#include "op-2t.h"
#undef EXT_CAST
#undef EXT_CAST
#undef EXT_TYPE
#undef EXT_TYPE
#undef EXT_NAME
#undef EXT_NAME
 
 
#define EXT_NAME extbz
#define EXT_NAME extbz
#define EXT_TYPE uint8_t
#define EXT_TYPE uint8_t
#define EXT_CAST (uorreg_t)
#define EXT_CAST (uorreg_t)
#include "op-2t.h"
#include "op-2t.h"
#undef EXT_CAST
#undef EXT_CAST
#undef EXT_TYPE
#undef EXT_TYPE
#undef EXT_NAME
#undef EXT_NAME
 
 
#define EXT_NAME exths
#define EXT_NAME exths
#define EXT_TYPE int16_t
#define EXT_TYPE int16_t
#define EXT_CAST (orreg_t)
#define EXT_CAST (orreg_t)
#include "op-2t.h"
#include "op-2t.h"
#undef EXT_CAST
#undef EXT_CAST
#undef EXT_TYPE
#undef EXT_TYPE
#undef EXT_NAME
#undef EXT_NAME
 
 
#define EXT_NAME exthz
#define EXT_NAME exthz
#define EXT_TYPE uint16_t
#define EXT_TYPE uint16_t
#define EXT_CAST (uorreg_t)
#define EXT_CAST (uorreg_t)
#include "op-2t.h"
#include "op-2t.h"
#undef EXT_CAST
#undef EXT_CAST
#undef EXT_TYPE
#undef EXT_TYPE
#undef EXT_NAME
#undef EXT_NAME
 
 
#undef OP_FILE
#undef OP_FILE
 
 
#define OP_FILE "op-comp-op.h"
#define OP_FILE "op-comp-op.h"
 
 
#define COMP ==
#define COMP ==
#define COMP_NAME sfeq
#define COMP_NAME sfeq
#define COMP_CAST(x) (x)
#define COMP_CAST(x) (x)
#include "op-2t.h"
#include "op-2t.h"
#include "op-1t.h"
#include "op-1t.h"
#undef COMP_CAST
#undef COMP_CAST
#undef COMP_NAME
#undef COMP_NAME
#undef COMP
#undef COMP
 
 
#define COMP !=
#define COMP !=
#define COMP_NAME sfne
#define COMP_NAME sfne
#define COMP_CAST(x) (x)
#define COMP_CAST(x) (x)
#include "op-2t.h"
#include "op-2t.h"
#include "op-1t.h"
#include "op-1t.h"
#undef COMP_CAST
#undef COMP_CAST
#undef COMP_NAME
#undef COMP_NAME
#undef COMP
#undef COMP
 
 
#define COMP >
#define COMP >
#define COMP_NAME sfgtu
#define COMP_NAME sfgtu
#define COMP_CAST(x) (x)
#define COMP_CAST(x) (x)
#include "op-2t.h"
#include "op-2t.h"
#include "op-1t.h"
#include "op-1t.h"
#undef COMP_CAST
#undef COMP_CAST
#undef COMP_NAME
#undef COMP_NAME
#undef COMP
#undef COMP
 
 
#define COMP >=
#define COMP >=
#define COMP_NAME sfgeu
#define COMP_NAME sfgeu
#define COMP_CAST(x) (x)
#define COMP_CAST(x) (x)
#include "op-2t.h"
#include "op-2t.h"
#include "op-1t.h"
#include "op-1t.h"
#undef COMP_CAST
#undef COMP_CAST
#undef COMP_NAME
#undef COMP_NAME
#undef COMP
#undef COMP
 
 
#define COMP <
#define COMP <
#define COMP_NAME sfltu
#define COMP_NAME sfltu
#define COMP_CAST(x) (x)
#define COMP_CAST(x) (x)
#include "op-2t.h"
#include "op-2t.h"
#include "op-1t.h"
#include "op-1t.h"
#undef COMP_CAST
#undef COMP_CAST
#undef COMP_NAME
#undef COMP_NAME
#undef COMP
#undef COMP
 
 
#define COMP <=
#define COMP <=
#define COMP_NAME sfleu
#define COMP_NAME sfleu
#define COMP_CAST(x) (x)
#define COMP_CAST(x) (x)
#include "op-2t.h"
#include "op-2t.h"
#include "op-1t.h"
#include "op-1t.h"
#undef COMP_CAST
#undef COMP_CAST
#undef COMP_NAME
#undef COMP_NAME
#undef COMP
#undef COMP
 
 
#define COMP >
#define COMP >
#define COMP_NAME sfgts
#define COMP_NAME sfgts
#define COMP_CAST(x) (orreg_t)(x)
#define COMP_CAST(x) (orreg_t)(x)
#include "op-2t.h"
#include "op-2t.h"
#include "op-1t.h"
#include "op-1t.h"
#undef COMP_CAST
#undef COMP_CAST
#undef COMP_NAME
#undef COMP_NAME
#undef COMP
#undef COMP
 
 
#define COMP >=
#define COMP >=
#define COMP_NAME sfges
#define COMP_NAME sfges
#define COMP_CAST(x) (orreg_t)(x)
#define COMP_CAST(x) (orreg_t)(x)
#include "op-2t.h"
#include "op-2t.h"
#include "op-1t.h"
#include "op-1t.h"
#undef COMP_CAST
#undef COMP_CAST
#undef COMP_NAME
#undef COMP_NAME
#undef COMP
#undef COMP
 
 
#define COMP <
#define COMP <
#define COMP_NAME sflts
#define COMP_NAME sflts
#define COMP_CAST(x) (orreg_t)(x)
#define COMP_CAST(x) (orreg_t)(x)
#include "op-2t.h"
#include "op-2t.h"
#include "op-1t.h"
#include "op-1t.h"
#undef COMP_CAST
#undef COMP_CAST
#undef COMP_NAME
#undef COMP_NAME
#undef COMP
#undef COMP
 
 
#define COMP <=
#define COMP <=
#define COMP_NAME sfles
#define COMP_NAME sfles
#define COMP_CAST(x) (orreg_t)(x)
#define COMP_CAST(x) (orreg_t)(x)
#include "op-2t.h"
#include "op-2t.h"
#include "op-1t.h"
#include "op-1t.h"
#undef COMP_CAST
#undef COMP_CAST
#undef COMP_NAME
#undef COMP_NAME
#undef COMP
#undef COMP
 
 
#undef OP_FILE
#undef OP_FILE
 
 
#define OP_FILE "op-t-reg-mov-op.h"
#define OP_FILE "op-t-reg-mov-op.h"
#include "op-1t.h"
#include "op-1t.h"
#undef OP_FILE
#undef OP_FILE
 
 
#define OP_FILE "op-mftspr-op.h"
#define OP_FILE "op-mftspr-op.h"
#include "op-1t.h"
#include "op-1t.h"
#include "op-2t.h"
#include "op-2t.h"
#undef OP_FILE
#undef OP_FILE
#include "op-mftspr-op.h"
#include "op-mftspr-op.h"
 
 
#define OP_FILE "op-mac-op.h"
#define OP_FILE "op-mac-op.h"
 
 
#define OP +=
#define OP +=
#define OP_NAME mac
#define OP_NAME mac
#include "op-2t.h"
#include "op-2t.h"
#undef OP_NAME
#undef OP_NAME
#undef OP
#undef OP
 
 
#define OP -=
#define OP -=
#define OP_NAME msb
#define OP_NAME msb
#include "op-2t.h"
#include "op-2t.h"
#undef OP_NAME
#undef OP_NAME
#undef OP
#undef OP
 
 
#undef OP_FILE
#undef OP_FILE
 
 
#define OP_FILE "op-lwhb-op.h"
#define OP_FILE "op-lwhb-op.h"
 
 
#define LS_OP_NAME lbz
#define LS_OP_NAME lbz
#define LS_OP_CAST
#define LS_OP_CAST
#define LS_OP_FUNC eval_mem8
#define LS_OP_FUNC eval_mem8
#include "op-2t.h"
#include "op-2t.h"
#include "op-1t.h"
#include "op-1t.h"
#undef LS_OP_FUNC
#undef LS_OP_FUNC
#undef LS_OP_CAST
#undef LS_OP_CAST
#undef LS_OP_NAME
#undef LS_OP_NAME
 
 
#define LS_OP_NAME lbs
#define LS_OP_NAME lbs
#define LS_OP_CAST (int8_t)
#define LS_OP_CAST (int8_t)
#define LS_OP_FUNC eval_mem8
#define LS_OP_FUNC eval_mem8
#include "op-2t.h"
#include "op-2t.h"
#include "op-1t.h"
#include "op-1t.h"
#undef LS_OP_FUNC
#undef LS_OP_FUNC
#undef LS_OP_CAST
#undef LS_OP_CAST
#undef LS_OP_NAME
#undef LS_OP_NAME
 
 
#define LS_OP_NAME lhz
#define LS_OP_NAME lhz
#define LS_OP_CAST
#define LS_OP_CAST
#define LS_OP_FUNC eval_mem16
#define LS_OP_FUNC eval_mem16
#include "op-2t.h"
#include "op-2t.h"
#include "op-1t.h"
#include "op-1t.h"
#undef LS_OP_FUNC
#undef LS_OP_FUNC
#undef LS_OP_CAST
#undef LS_OP_CAST
#undef LS_OP_NAME
#undef LS_OP_NAME
 
 
#define LS_OP_NAME lhs
#define LS_OP_NAME lhs
#define LS_OP_CAST (int16_t)
#define LS_OP_CAST (int16_t)
#define LS_OP_FUNC eval_mem16
#define LS_OP_FUNC eval_mem16
#include "op-2t.h"
#include "op-2t.h"
#include "op-1t.h"
#include "op-1t.h"
#undef LS_OP_FUNC
#undef LS_OP_FUNC
#undef LS_OP_CAST
#undef LS_OP_CAST
#undef LS_OP_NAME
#undef LS_OP_NAME
 
 
#define LS_OP_NAME lwz
#define LS_OP_NAME lwz
#define LS_OP_CAST
#define LS_OP_CAST
#define LS_OP_FUNC eval_mem32
#define LS_OP_FUNC eval_mem32
#include "op-2t.h"
#include "op-2t.h"
#include "op-1t.h"
#include "op-1t.h"
#undef LS_OP_FUNC
#undef LS_OP_FUNC
#undef LS_OP_CAST
#undef LS_OP_CAST
#undef LS_OP_NAME
#undef LS_OP_NAME
 
 
#define LS_OP_NAME lws
#define LS_OP_NAME lws
#define LS_OP_CAST (int32_t)
#define LS_OP_CAST (int32_t)
#define LS_OP_FUNC eval_mem32
#define LS_OP_FUNC eval_mem32
#include "op-2t.h"
#include "op-2t.h"
#include "op-1t.h"
#include "op-1t.h"
#undef LS_OP_FUNC
#undef LS_OP_FUNC
#undef LS_OP_CAST
#undef LS_OP_CAST
#undef LS_OP_NAME
#undef LS_OP_NAME
 
 
#undef OP_FILE
#undef OP_FILE
 
 
#define OP_FILE "op-swhb-op.h"
#define OP_FILE "op-swhb-op.h"
 
 
#define S_OP_NAME sb
#define S_OP_NAME sb
#define S_FUNC set_mem8
#define S_FUNC set_mem8
#include "op-swhb-op.h"
#include "op-swhb-op.h"
#include "op-2t.h"
#include "op-2t.h"
#include "op-1t.h"
#include "op-1t.h"
#undef S_FUNC
#undef S_FUNC
#undef S_OP_NAME
#undef S_OP_NAME
 
 
#define S_OP_NAME sh
#define S_OP_NAME sh
#define S_FUNC set_mem16
#define S_FUNC set_mem16
#include "op-swhb-op.h"
#include "op-swhb-op.h"
#include "op-2t.h"
#include "op-2t.h"
#include "op-1t.h"
#include "op-1t.h"
#undef S_FUNC
#undef S_FUNC
#undef S_OP_NAME
#undef S_OP_NAME
 
 
#define S_OP_NAME sw
#define S_OP_NAME sw
#define S_FUNC set_mem32
#define S_FUNC set_mem32
#include "op-swhb-op.h"
#include "op-swhb-op.h"
#include "op-2t.h"
#include "op-2t.h"
#include "op-1t.h"
#include "op-1t.h"
#undef S_FUNC
#undef S_FUNC
#undef S_OP_NAME
#undef S_OP_NAME
 
 
__or_dynop void op_join_mem_cycles(void)
__or_dynop void op_join_mem_cycles(void)
{
{
  runtime.sim.cycles += runtime.sim.mem_cycles;
  runtime.sim.cycles += runtime.sim.mem_cycles;
  scheduler.job_queue->time -= runtime.sim.mem_cycles;
  scheduler.job_queue->time -= runtime.sim.mem_cycles;
  runtime.sim.mem_cycles = 0;
  runtime.sim.mem_cycles = 0;
}
}
 
 
__or_dynop void op_store_link_addr_gpr(void)
__or_dynop void op_store_link_addr_gpr(void)
{
{
  env->reg[LINK_REGNO] = env->pc + 8;
  env->reg[LINK_REGNO] = env->pc + 8;
}
}
 
 
__or_dynop void op_prep_rfe(void)
__or_dynop void op_prep_rfe(void)
{
{
  env->sprs[SPR_SR] = env->sprs[SPR_ESR_BASE] | SPR_SR_FO;
  env->sprs[SPR_SR] = env->sprs[SPR_ESR_BASE] | SPR_SR_FO;
  env->sprs[SPR_PPC] = env->pc;
  env->sprs[SPR_PPC] = env->pc;
  env->pc = env->sprs[SPR_EPCR_BASE] - 4;
  env->pc = env->sprs[SPR_EPCR_BASE] - 4;
}
}
 
 
static inline void prep_except(oraddr_t epcr_base)
static inline void prep_except(oraddr_t epcr_base)
{
{
  env->sprs[SPR_EPCR_BASE] = epcr_base;
  env->sprs[SPR_EPCR_BASE] = epcr_base;
 
 
  env->sprs[SPR_ESR_BASE] = env->sprs[SPR_SR];
  env->sprs[SPR_ESR_BASE] = env->sprs[SPR_SR];
 
 
  /* Address translation is always disabled when starting exception. */
  /* Address translation is always disabled when starting exception. */
  env->sprs[SPR_SR] &= ~SPR_SR_DME;
  env->sprs[SPR_SR] &= ~SPR_SR_DME;
  env->sprs[SPR_SR] &= ~SPR_SR_IME;
  env->sprs[SPR_SR] &= ~SPR_SR_IME;
 
 
  env->sprs[SPR_SR] &= ~SPR_SR_OVE;   /* Disable overflow flag exception. */
  env->sprs[SPR_SR] &= ~SPR_SR_OVE;   /* Disable overflow flag exception. */
 
 
  env->sprs[SPR_SR] |= SPR_SR_SM;     /* SUPV mode */
  env->sprs[SPR_SR] |= SPR_SR_SM;     /* SUPV mode */
  env->sprs[SPR_SR] &= ~(SPR_SR_IEE | SPR_SR_TEE);    /* Disable interrupts. */
  env->sprs[SPR_SR] &= ~(SPR_SR_IEE | SPR_SR_TEE);    /* Disable interrupts. */
}
}
 
 
/* Before the code in op_{sys,trap}{,_delay} gets run, the scheduler runs.
/* Before the code in op_{sys,trap}{,_delay} gets run, the scheduler runs.
 * Therefore the pc will point to the instruction after the l.sys or l.trap
 * Therefore the pc will point to the instruction after the l.sys or l.trap
 * instruction */
 * instruction */
__or_dynop void op_prep_sys_delay(void)
__or_dynop void op_prep_sys_delay(void)
{
{
  env->delay_insn = 0;
  env->delay_insn = 0;
  prep_except(env->pc - 4);
  prep_except(env->pc - 4);
  env->pc = EXCEPT_SYSCALL - 4;
  env->pc = EXCEPT_SYSCALL - 4;
}
}
 
 
__or_dynop void op_prep_sys(void)
__or_dynop void op_prep_sys(void)
{
{
  prep_except(env->pc + 4);
  prep_except(env->pc + 4);
  env->pc = EXCEPT_SYSCALL - 4;
  env->pc = EXCEPT_SYSCALL - 4;
}
}
 
 
__or_dynop void op_prep_trap_delay(void)
__or_dynop void op_prep_trap_delay(void)
{
{
  env->delay_insn = 0;
  env->delay_insn = 0;
  prep_except(env->pc - 4);
  prep_except(env->pc - 4);
  env->pc = EXCEPT_TRAP - 4;
  env->pc = EXCEPT_TRAP - 4;
}
}
 
 
__or_dynop void op_prep_trap(void)
__or_dynop void op_prep_trap(void)
{
{
  prep_except(env->pc);
  prep_except(env->pc);
  env->pc = EXCEPT_TRAP - 4;
  env->pc = EXCEPT_TRAP - 4;
}
}
 
 
/* FIXME: This `instruction' should be split up like the l.trap and l.sys
/* FIXME: This `instruction' should be split up like the l.trap and l.sys
 * instructions are done */
 * instructions are done */
__or_dynop void op_illegal_delay(void)
__or_dynop void op_illegal_delay(void)
{
{
  env->delay_insn = 0;
  env->delay_insn = 0;
  env->sprs[SPR_EEAR_BASE] = env->pc - 4;
  env->sprs[SPR_EEAR_BASE] = env->pc - 4;
  env->pc = EXCEPT_ILLEGAL - 4;
  env->pc = EXCEPT_ILLEGAL - 4;
}
}
 
 
__or_dynop void op_illegal(void)
__or_dynop void op_illegal(void)
{
{
  env->sprs[SPR_EEAR_BASE] = env->pc;
  env->sprs[SPR_EEAR_BASE] = env->pc;
  env->pc = EXCEPT_ILLEGAL;
  env->pc = EXCEPT_ILLEGAL;
}
}
 
 
__or_dynop void op_do_sched(void)
__or_dynop void op_do_sched(void)
{
{
  SPEEDY_CALL(do_sched_wrap);
  SPEEDY_CALL(do_sched_wrap);
}
}
 
 
__or_dynop void op_do_sched_delay(void)
__or_dynop void op_do_sched_delay(void)
{
{
  SPEEDY_CALL(do_sched_wrap_delay);
  SPEEDY_CALL(do_sched_wrap_delay);
}
}
 
 
__or_dynop void op_macc(void)
__or_dynop void op_macc(void)
{
{
  env->sprs[SPR_MACLO] = 0;
  env->sprs[SPR_MACLO] = 0;
  env->sprs[SPR_MACHI] = 0;
  env->sprs[SPR_MACHI] = 0;
}
}
 
 
__or_dynop void op_store_insn_ea(void)
__or_dynop void op_store_insn_ea(void)
{
{
  env->insn_ea = OP_PARAM1;
  env->insn_ea = OP_PARAM1;
}
}
 
 
 
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.