⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 simops.c

📁 这个是LINUX下的GDB调度工具的源码
💻 C
📖 第 1 页 / 共 5 页
字号:
  trace_input ("add", OP_ACCUM, OP_ACCUM, OP_VOID);  if (PSW_ST)    {      if (tmp > SEXT40(MAX32))	tmp = (MAX32);      else if (tmp < SEXT40(MIN32))	tmp = (MIN32);      else	tmp = (tmp & MASK40);    }  else    tmp = (tmp & MASK40);  SET_ACC (OP[0], tmp);  trace_output_40 (tmp);}/* add2w */voidOP_1200 (){  uint32 tmp;  uint32 a = (GPR (OP[0])) << 16 | GPR (OP[0] + 1);  uint32 b = (GPR (OP[1])) << 16 | GPR (OP[1] + 1);  trace_input ("add2w", OP_DREG, OP_DREG, OP_VOID);  tmp = a + b;  SET_PSW_C (tmp < a);  SET_GPR (OP[0] + 0, (tmp >> 16));  SET_GPR (OP[0] + 1, (tmp & 0xFFFF));  trace_output_32 (tmp);}/* add3 */voidOP_1000000 (){  uint16 a = GPR (OP[1]);  uint16 b = OP[2];  uint16 tmp = (a + b);  trace_input ("add3", OP_REG_OUTPUT, OP_REG, OP_CONSTANT16);  SET_PSW_C (tmp < a);  SET_GPR (OP[0], tmp);  trace_output_16 (tmp);}/* addac3 */voidOP_17000200 (){  int64 tmp;  tmp = SEXT40(ACC (OP[2])) + SEXT40 ((GPR (OP[1]) << 16) | GPR (OP[1] + 1));  trace_input ("addac3", OP_DREG_OUTPUT, OP_DREG, OP_ACCUM);  SET_GPR (OP[0] + 0, ((tmp >> 16) & 0xffff));  SET_GPR (OP[0] + 1, (tmp & 0xffff));  trace_output_32 (tmp);}/* addac3 */voidOP_17000202 (){  int64 tmp;  tmp = SEXT40(ACC (OP[1])) + SEXT40(ACC (OP[2]));  trace_input ("addac3", OP_DREG_OUTPUT, OP_ACCUM, OP_ACCUM);  SET_GPR (OP[0] + 0, (tmp >> 16) & 0xffff);  SET_GPR (OP[0] + 1, tmp & 0xffff);  trace_output_32 (tmp);}/* addac3s */voidOP_17001200 (){  int64 tmp;  SET_PSW_F1 (PSW_F0);  trace_input ("addac3s", OP_DREG_OUTPUT, OP_DREG, OP_ACCUM);  tmp = SEXT40 (ACC (OP[2])) + SEXT40 ((GPR (OP[1]) << 16) | GPR (OP[1] + 1));  if (tmp > SEXT40(MAX32))    {      tmp = (MAX32);      SET_PSW_F0 (1);    }        else if (tmp < SEXT40(MIN32))    {      tmp = (MIN32);      SET_PSW_F0 (1);    }        else    {      SET_PSW_F0 (0);    }        SET_GPR (OP[0] + 0, (tmp >> 16) & 0xffff);  SET_GPR (OP[0] + 1, (tmp & 0xffff));  trace_output_32 (tmp);}/* addac3s */voidOP_17001202 (){  int64 tmp;  SET_PSW_F1 (PSW_F0);  trace_input ("addac3s", OP_DREG_OUTPUT, OP_ACCUM, OP_ACCUM);  tmp = SEXT40(ACC (OP[1])) + SEXT40(ACC (OP[2]));  if (tmp > SEXT40(MAX32))    {      tmp = (MAX32);      SET_PSW_F0 (1);    }        else if (tmp < SEXT40(MIN32))    {      tmp = (MIN32);      SET_PSW_F0 (1);    }        else    {      SET_PSW_F0 (0);    }        SET_GPR (OP[0] + 0, (tmp >> 16) & 0xffff);  SET_GPR (OP[0] + 1, (tmp & 0xffff));  trace_output_32 (tmp);}/* addi */voidOP_201 (){  uint16 a = GPR (OP[0]);  uint16 b;  uint16 tmp;  if (OP[1] == 0)    OP[1] = 16;  b = OP[1];  tmp = (a + b);  trace_input ("addi", OP_REG, OP_CONSTANT16, OP_VOID);  SET_PSW_C (tmp < a);  SET_GPR (OP[0], tmp);  trace_output_16 (tmp);}/* and */voidOP_C00 (){  uint16 tmp = GPR (OP[0]) & GPR (OP[1]);  trace_input ("and", OP_REG, OP_REG, OP_VOID);  SET_GPR (OP[0], tmp);  trace_output_16 (tmp);}/* and3 */voidOP_6000000 (){  uint16 tmp = GPR (OP[1]) & OP[2];  trace_input ("and3", OP_REG_OUTPUT, OP_REG, OP_CONSTANT16);  SET_GPR (OP[0], tmp);  trace_output_16 (tmp);}/* bclri */voidOP_C01 (){  int16 tmp;  trace_input ("bclri", OP_REG, OP_CONSTANT16, OP_VOID);  tmp = (GPR (OP[0]) &~(0x8000 >> OP[1]));  SET_GPR (OP[0], tmp);  trace_output_16 (tmp);}/* bl.s */voidOP_4900 (){  trace_input ("bl.s", OP_CONSTANT8, OP_R0, OP_R1);  SET_GPR (13, PC + 1);  JMP( PC + SEXT8 (OP[0]));  trace_output_void ();}/* bl.l */voidOP_24800000 (){  trace_input ("bl.l", OP_CONSTANT16, OP_R0, OP_R1);  SET_GPR (13, (PC + 1));  JMP (PC + OP[0]);  trace_output_void ();}/* bnoti */voidOP_A01 (){  int16 tmp;  trace_input ("bnoti", OP_REG, OP_CONSTANT16, OP_VOID);  tmp = (GPR (OP[0]) ^ (0x8000 >> OP[1]));  SET_GPR (OP[0], tmp);  trace_output_16 (tmp);}/* bra.s */voidOP_4800 (){  trace_input ("bra.s", OP_CONSTANT8, OP_VOID, OP_VOID);  JMP (PC + SEXT8 (OP[0]));  trace_output_void ();}/* bra.l */voidOP_24000000 (){  trace_input ("bra.l", OP_CONSTANT16, OP_VOID, OP_VOID);  JMP (PC + OP[0]);  trace_output_void ();}/* brf0f.s */voidOP_4A00 (){  trace_input ("brf0f.s", OP_CONSTANT8, OP_VOID, OP_VOID);  if (!PSW_F0)    JMP (PC + SEXT8 (OP[0]));  trace_output_flag ();}/* brf0f.l */voidOP_25000000 (){  trace_input ("brf0f.l", OP_CONSTANT16, OP_VOID, OP_VOID);  if (!PSW_F0)    JMP (PC + OP[0]);  trace_output_flag ();}/* brf0t.s */voidOP_4B00 (){  trace_input ("brf0t.s", OP_CONSTANT8, OP_VOID, OP_VOID);  if (PSW_F0)    JMP (PC + SEXT8 (OP[0]));  trace_output_flag ();}/* brf0t.l */voidOP_25800000 (){  trace_input ("brf0t.l", OP_CONSTANT16, OP_VOID, OP_VOID);  if (PSW_F0)    JMP (PC + OP[0]);  trace_output_flag ();}/* bseti */voidOP_801 (){  int16 tmp;  trace_input ("bseti", OP_REG, OP_CONSTANT16, OP_VOID);  tmp = (GPR (OP[0]) | (0x8000 >> OP[1]));  SET_GPR (OP[0], tmp);  trace_output_16 (tmp);}/* btsti */voidOP_E01 (){  trace_input ("btsti", OP_REG, OP_CONSTANT16, OP_VOID);  SET_PSW_F1 (PSW_F0);  SET_PSW_F0 ((GPR (OP[0]) & (0x8000 >> OP[1])) ? 1 : 0);  trace_output_flag ();}/* clrac */voidOP_5601 (){  trace_input ("clrac", OP_ACCUM_OUTPUT, OP_VOID, OP_VOID);  SET_ACC (OP[0], 0);  trace_output_40 (0);}/* cmp */voidOP_600 (){  trace_input ("cmp", OP_REG, OP_REG, OP_VOID);  SET_PSW_F1 (PSW_F0);  SET_PSW_F0 (((int16)(GPR (OP[0])) < (int16)(GPR (OP[1]))) ? 1 : 0);  trace_output_flag ();}/* cmp */voidOP_1603 (){  trace_input ("cmp", OP_ACCUM, OP_ACCUM, OP_VOID);  SET_PSW_F1 (PSW_F0);  SET_PSW_F0 ((SEXT40(ACC (OP[0])) < SEXT40(ACC (OP[1]))) ? 1 : 0);  trace_output_flag ();}/* cmpeq */voidOP_400 (){  trace_input ("cmpeq", OP_REG, OP_REG, OP_VOID);  SET_PSW_F1 (PSW_F0);  SET_PSW_F0 ((GPR (OP[0]) == GPR (OP[1])) ? 1 : 0);  trace_output_flag ();}/* cmpeq */voidOP_1403 (){  trace_input ("cmpeq", OP_ACCUM, OP_ACCUM, OP_VOID);  SET_PSW_F1 (PSW_F0);  SET_PSW_F0 (((ACC (OP[0]) & MASK40) == (ACC (OP[1]) & MASK40)) ? 1 : 0);  trace_output_flag ();}/* cmpeqi.s */voidOP_401 (){  trace_input ("cmpeqi.s", OP_REG, OP_CONSTANT4, OP_VOID);  SET_PSW_F1 (PSW_F0);  SET_PSW_F0 ((GPR (OP[0]) == (reg_t) SEXT4 (OP[1])) ? 1 : 0);    trace_output_flag ();}/* cmpeqi.l */voidOP_2000000 (){  trace_input ("cmpeqi.l", OP_REG, OP_CONSTANT16, OP_VOID);  SET_PSW_F1 (PSW_F0);  SET_PSW_F0 ((GPR (OP[0]) == (reg_t)OP[1]) ? 1 : 0);    trace_output_flag ();}/* cmpi.s */voidOP_601 (){  trace_input ("cmpi.s", OP_REG, OP_CONSTANT4, OP_VOID);  SET_PSW_F1 (PSW_F0);  SET_PSW_F0 (((int16)(GPR (OP[0])) < (int16)SEXT4(OP[1])) ? 1 : 0);    trace_output_flag ();}/* cmpi.l */voidOP_3000000 (){  trace_input ("cmpi.l", OP_REG, OP_CONSTANT16, OP_VOID);  SET_PSW_F1 (PSW_F0);  SET_PSW_F0 (((int16)(GPR (OP[0])) < (int16)(OP[1])) ? 1 : 0);    trace_output_flag ();}/* cmpu */voidOP_4600 (){  trace_input ("cmpu", OP_REG, OP_REG, OP_VOID);  SET_PSW_F1 (PSW_F0);  SET_PSW_F0 ((GPR (OP[0]) < GPR (OP[1])) ? 1 : 0);    trace_output_flag ();}/* cmpui */voidOP_23000000 (){  trace_input ("cmpui", OP_REG, OP_CONSTANT16, OP_VOID);  SET_PSW_F1 (PSW_F0);  SET_PSW_F0 ((GPR (OP[0]) < (reg_t)OP[1]) ? 1 : 0);    trace_output_flag ();}/* cpfg */voidOP_4E09 (){  uint8 val;    trace_input ("cpfg", OP_FLAG_OUTPUT, OP_FLAG, OP_VOID);    if (OP[1] == 0)    val = PSW_F0;  else if (OP[1] == 1)    val = PSW_F1;  else    val = PSW_C;  if (OP[0] == 0)    SET_PSW_F0 (val);  else    SET_PSW_F1 (val);  trace_output_flag ();}/* cpfg */voidOP_4E0F (){  uint8 val;    trace_input ("cpfg", OP_FLAG_OUTPUT, OP_FLAG, OP_VOID);    if (OP[1] == 0)    val = PSW_F0;  else if (OP[1] == 1)    val = PSW_F1;  else    val = PSW_C;  if (OP[0] == 0)    SET_PSW_F0 (val);  else    SET_PSW_F1 (val);  trace_output_flag ();}/* dbt */voidOP_5F20 (){  /* d10v_callback->printf_filtered(d10v_callback, "***** DBT *****  PC=%x\n",PC); */  /* GDB uses the instruction pair ``dbt || nop'' as a break-point.     The conditional below is for either of the instruction pairs     ``dbt -> XXX'' or ``dbt <- XXX'' and treats them as as cases     where the dbt instruction should be interpreted.     The module `sim-break' provides a more effective mechanism for     detecting GDB planted breakpoints.  The code below may,     eventually, be changed to use that mechanism. */  if (State.ins_type == INS_LEFT      || State.ins_type == INS_RIGHT)    {      trace_input ("dbt", OP_VOID, OP_VOID, OP_VOID);      SET_DPC (PC + 1);      SET_DPSW (PSW);      SET_HW_PSW (PSW_DM_BIT | (PSW & (PSW_F0_BIT | PSW_F1_BIT | PSW_C_BIT)));      JMP (DBT_VECTOR_START);      trace_output_void ();    }  else    {      State.exception = SIGTRAP;    }}/* divs */voidOP_14002800 (){  uint16 foo, tmp, tmpf;  uint16 hi;  uint16 lo;  trace_input ("divs", OP_DREG, OP_REG, OP_VOID);  foo = (GPR (OP[0]) << 1) | (GPR (OP[0] + 1) >> 15);  tmp = (int16)foo - (int16)(GPR (OP[1]));  tmpf = (foo >= GPR (OP[1])) ? 1 : 0;  hi = ((tmpf == 1) ? tmp : foo);  lo = ((GPR (OP[0] + 1) << 1) | tmpf);  SET_GPR (OP[0] + 0, hi);  SET_GPR (OP[0] + 1, lo);  trace_output_32 (((uint32) hi << 16) | lo);}/* exef0f */voidOP_4E04 (){  trace_input ("exef0f", OP_VOID, OP_VOID, OP_VOID);  State.exe = (PSW_F0 == 0);  trace_output_flag ();}/* exef0t */voidOP_4E24 (){  trace_input ("exef0t", OP_VOID, OP_VOID, OP_VOID);  State.exe = (PSW_F0 != 0);  trace_output_flag ();}/* exef1f */voidOP_4E40 (){  trace_input ("exef1f", OP_VOID, OP_VOID, OP_VOID);  State.exe = (PSW_F1 == 0);  trace_output_flag ();}/* exef1t */voidOP_4E42 (){  trace_input ("exef1t", OP_VOID, OP_VOID, OP_VOID);  State.exe = (PSW_F1 != 0);  trace_output_flag ();}/* exefaf */voidOP_4E00 (){  trace_input ("exefaf", OP_VOID, OP_VOID, OP_VOID);  State.exe = (PSW_F0 == 0) & (PSW_F1 == 0);  trace_output_flag ();}/* exefat */voidOP_4E02 (){  trace_input ("exefat", OP_VOID, OP_VOID, OP_VOID);  State.exe = (PSW_F0 == 0) & (PSW_F1 != 0);  trace_output_flag ();}/* exetaf */voidOP_4E20 (){  trace_input ("exetaf", OP_VOID, OP_VOID, OP_VOID);  State.exe = (PSW_F0 != 0) & (PSW_F1 == 0);  trace_output_flag ();}/* exetat */voidOP_4E22 (){  trace_input ("exetat", OP_VOID, OP_VOID, OP_VOID);  State.exe = (PSW_F0 != 0) & (PSW_F1 != 0);  trace_output_flag ();}/* exp */voidOP_15002A00 (){  uint32 tmp, foo;  int i;  trace_input ("exp", OP_REG_OUTPUT, OP_DREG, OP_VOID);  if (((int16)GPR (OP[1])) >= 0)    tmp = (GPR (OP[1]) << 16) | GPR (OP[1] + 1);  else    tmp = ~((GPR (OP[1]) << 16) | GPR (OP[1] + 1));    foo = 0x40000000;  for (i=1;i<17;i++)    {      if (tmp & foo)	{	  SET_GPR (OP[0], (i - 1));	  trace_output_16 (i - 1);	  return;	}      foo >>= 1;    }  SET_GPR (OP[0], 16);  trace_output_16 (16);}/* exp */voidOP_15002A02 (){  int64 tmp, foo;  int i;  trace_input ("exp", OP_REG_OUTPUT, OP_ACCUM, OP_VOID);  tmp = SEXT40(ACC (OP[1]));  if (tmp < 0)    tmp = ~tmp & MASK40;    foo = 0x4000000000LL;  for (i=1;i<25;i++)    {      if (tmp & foo)	{	  SET_GPR (OP[0], i - 9);	  trace_output_16 (i - 9);	  return;	}      foo >>= 1;    }  SET_GPR (OP[0], 16);  trace_output_16 (16);}/* jl */voidOP_4D00 (){  trace_input ("jl", OP_REG, OP_R0, OP_R1);  SET_GPR (13, PC + 1);  JMP (GPR (OP[0]));  trace_output_void ();}/* jmp */voidOP_4C00 (){  trace_input ("jmp", OP_REG,	       (OP[0] == 13) ? OP_R0 : OP_VOID,	       (OP[0] == 13) ? OP_R1 : OP_VOID);  JMP (GPR (OP[0]));  trace_output_void ();}/* ld */voidOP_30000000 (){  uint16 tmp;  uint16 addr = OP[1] + GPR (OP[2]);  trace_input ("ld", OP_REG_OUTPUT, OP_MEMREF2, OP_VOID);  if ((addr & 1))    {      State.exception = SIG_D10V_BUS;      State.pc_changed = 1; /* Don't increment the PC. */      trace_output_void ();      return;    }  tmp = RW (addr);  SET_GPR (OP[0], tmp);  trace_output_16 (tmp);}/* ld */voidOP_6401 (){  uint16 tmp;  uint16 addr = GPR (OP[1]);  trace_input ("ld", OP_REG_OUTPUT, OP_POSTDEC, OP_VOID);  if ((addr & 1))    {      State.exception = SIG_D10V_BUS;      State.pc_changed = 1; /* Don't increment the PC. */      trace_output_void ();      return;    }  tmp = RW (addr);  SET_GPR (OP[0], tmp);  if (OP[0] != OP[1])    INC_ADDR (OP[1], -2);  trace_output_16 (tmp);}/* ld */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -