📄 simops.c
字号:
trace_input ("mvfaclo", OP_REG_OUTPUT, OP_ACCUM, OP_VOID); tmp = ACC (OP[1]); SET_GPR (OP[0], tmp); trace_output_16 (tmp);}/* mvfc */voidOP_5200 (){ int16 tmp; trace_input ("mvfc", OP_REG_OUTPUT, OP_CR, OP_VOID); tmp = CREG (OP[1]); SET_GPR (OP[0], tmp); trace_output_16 (tmp);}/* mvtacg */voidOP_1E41 (){ int64 tmp; trace_input ("mvtacg", OP_REG, OP_ACCUM, OP_VOID); tmp = ((ACC (OP[1]) & MASK32) | ((int64)(GPR (OP[0]) & 0xff) << 32)); SET_ACC (OP[1], tmp); trace_output_40 (tmp);}/* mvtachi */voidOP_1E01 (){ uint64 tmp; trace_input ("mvtachi", OP_REG, OP_ACCUM, OP_VOID); tmp = ACC (OP[1]) & 0xffff; tmp = ((SEXT16 (GPR (OP[0])) << 16 | tmp) & MASK40); SET_ACC (OP[1], tmp); trace_output_40 (tmp);}/* mvtaclo */voidOP_1E21 (){ int64 tmp; trace_input ("mvtaclo", OP_REG, OP_ACCUM, OP_VOID); tmp = ((SEXT16 (GPR (OP[0]))) & MASK40); SET_ACC (OP[1], tmp); trace_output_40 (tmp);}/* mvtc */voidOP_5600 (){ int16 tmp; trace_input ("mvtc", OP_REG, OP_CR_OUTPUT, OP_VOID); tmp = GPR (OP[0]); tmp = SET_CREG (OP[1], tmp); trace_output_16 (tmp);}/* mvub */voidOP_5401 (){ int16 tmp; trace_input ("mvub", OP_REG_OUTPUT, OP_REG, OP_VOID); tmp = (GPR (OP[1]) & 0xff); SET_GPR (OP[0], tmp); trace_output_16 (tmp);}/* neg */voidOP_4605 (){ int16 tmp; trace_input ("neg", OP_REG, OP_VOID, OP_VOID); tmp = - GPR (OP[0]); SET_GPR (OP[0], tmp); trace_output_16 (tmp);}/* neg */voidOP_5605 (){ int64 tmp; trace_input ("neg", OP_ACCUM, OP_VOID, OP_VOID); tmp = -SEXT40(ACC (OP[0])); 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);}/* nop */voidOP_5E00 (){ trace_input ("nop", OP_VOID, OP_VOID, OP_VOID); ins_type_counters[ (int)State.ins_type ]--; /* don't count nops as normal instructions */ switch (State.ins_type) { default: ins_type_counters[ (int)INS_UNKNOWN ]++; break; case INS_LEFT_PARALLEL: /* Don't count a parallel op that includes a NOP as a true parallel op */ ins_type_counters[ (int)INS_RIGHT_PARALLEL ]--; ins_type_counters[ (int)INS_RIGHT ]++; ins_type_counters[ (int)INS_LEFT_NOPS ]++; break; case INS_LEFT: case INS_LEFT_COND_EXE: ins_type_counters[ (int)INS_LEFT_NOPS ]++; break; case INS_RIGHT_PARALLEL: /* Don't count a parallel op that includes a NOP as a true parallel op */ ins_type_counters[ (int)INS_LEFT_PARALLEL ]--; ins_type_counters[ (int)INS_LEFT ]++; ins_type_counters[ (int)INS_RIGHT_NOPS ]++; break; case INS_RIGHT: case INS_RIGHT_COND_EXE: ins_type_counters[ (int)INS_RIGHT_NOPS ]++; break; } trace_output_void ();}/* not */voidOP_4603 (){ int16 tmp; trace_input ("not", OP_REG, OP_VOID, OP_VOID); tmp = ~GPR (OP[0]); SET_GPR (OP[0], tmp); trace_output_16 (tmp);}/* or */voidOP_800 (){ int16 tmp; trace_input ("or", OP_REG, OP_REG, OP_VOID); tmp = (GPR (OP[0]) | GPR (OP[1])); SET_GPR (OP[0], tmp); trace_output_16 (tmp);}/* or3 */voidOP_4000000 (){ int16 tmp; trace_input ("or3", OP_REG_OUTPUT, OP_REG, OP_CONSTANT16); tmp = (GPR (OP[1]) | OP[2]); SET_GPR (OP[0], tmp); trace_output_16 (tmp);}/* rac */voidOP_5201 (){ int64 tmp; int shift = SEXT3 (OP[2]); trace_input ("rac", OP_DREG_OUTPUT, OP_ACCUM, OP_CONSTANT3); if (OP[1] != 0) { (*d10v_callback->printf_filtered) (d10v_callback, "ERROR at PC 0x%x: instruction only valid for A0\n", PC<<2); State.exception = SIGILL; } SET_PSW_F1 (PSW_F0); tmp = SEXT56 ((ACC (0) << 16) | (ACC (1) & 0xffff)); if (shift >=0) tmp <<= shift; else tmp >>= -shift; tmp += 0x8000; tmp >>= 16; /* look at bits 0:43 */ if (tmp > SEXT44 (SIGNED64 (0x0007fffffff))) { tmp = 0x7fffffff; SET_PSW_F0 (1); } else if (tmp < SEXT44 (SIGNED64 (0xfff80000000))) { tmp = 0x80000000; SET_PSW_F0 (1); } else { SET_PSW_F0 (0); } SET_GPR32 (OP[0], tmp); trace_output_32 (tmp);}/* rachi */voidOP_4201 (){ signed64 tmp; int shift = SEXT3 (OP[2]); trace_input ("rachi", OP_REG_OUTPUT, OP_ACCUM, OP_CONSTANT3); SET_PSW_F1 (PSW_F0); if (shift >=0) tmp = SEXT40 (ACC (OP[1])) << shift; else tmp = SEXT40 (ACC (OP[1])) >> -shift; tmp += 0x8000; if (tmp > SEXT44 (SIGNED64 (0x0007fffffff))) { tmp = 0x7fff; SET_PSW_F0 (1); } else if (tmp < SEXT44 (SIGNED64 (0xfff80000000))) { tmp = 0x8000; SET_PSW_F0 (1); } else { tmp = (tmp >> 16); SET_PSW_F0 (0); } SET_GPR (OP[0], tmp); trace_output_16 (tmp);}/* rep */voidOP_27000000 (){ trace_input ("rep", OP_REG, OP_CONSTANT16, OP_VOID); SET_RPT_S (PC + 1); SET_RPT_E (PC + OP[1]); SET_RPT_C (GPR (OP[0])); SET_PSW_RP (1); if (GPR (OP[0]) == 0) { (*d10v_callback->printf_filtered) (d10v_callback, "ERROR: rep with count=0 is illegal.\n"); State.exception = SIGILL; } if (OP[1] < 4) { (*d10v_callback->printf_filtered) (d10v_callback, "ERROR: rep must include at least 4 instructions.\n"); State.exception = SIGILL; } trace_output_void ();}/* repi */voidOP_2F000000 (){ trace_input ("repi", OP_CONSTANT16, OP_CONSTANT16, OP_VOID); SET_RPT_S (PC + 1); SET_RPT_E (PC + OP[1]); SET_RPT_C (OP[0]); SET_PSW_RP (1); if (OP[0] == 0) { (*d10v_callback->printf_filtered) (d10v_callback, "ERROR: repi with count=0 is illegal.\n"); State.exception = SIGILL; } if (OP[1] < 4) { (*d10v_callback->printf_filtered) (d10v_callback, "ERROR: repi must include at least 4 instructions.\n"); State.exception = SIGILL; } trace_output_void ();}/* rtd */voidOP_5F60 (){ trace_input ("rtd", OP_VOID, OP_VOID, OP_VOID); SET_CREG (PSW_CR, DPSW); JMP(DPC); trace_output_void ();}/* rte */voidOP_5F40 (){ trace_input ("rte", OP_VOID, OP_VOID, OP_VOID); SET_CREG (PSW_CR, BPSW); JMP(BPC); trace_output_void ();}/* sac */void OP_5209 (){ int64 tmp; trace_input ("sac", OP_REG_OUTPUT, OP_ACCUM, OP_VOID); tmp = SEXT40(ACC (OP[1])); SET_PSW_F1 (PSW_F0); if (tmp > SEXT40(MAX32)) { tmp = (MAX32); SET_PSW_F0 (1); } else if (tmp < SEXT40(MIN32)) { tmp = 0x80000000; SET_PSW_F0 (1); } else { tmp = (tmp & MASK32); SET_PSW_F0 (0); } SET_GPR32 (OP[0], tmp); trace_output_40 (tmp);}/* sachi */voidOP_4209 (){ int64 tmp; trace_input ("sachi", OP_REG_OUTPUT, OP_ACCUM, OP_VOID); tmp = SEXT40(ACC (OP[1])); SET_PSW_F1 (PSW_F0); if (tmp > SEXT40(MAX32)) { tmp = 0x7fff; SET_PSW_F0 (1); } else if (tmp < SEXT40(MIN32)) { tmp = 0x8000; SET_PSW_F0 (1); } else { tmp >>= 16; SET_PSW_F0 (0); } SET_GPR (OP[0], tmp); trace_output_16 (OP[0]);}/* sadd */voidOP_1223 (){ int64 tmp; trace_input ("sadd", OP_ACCUM, OP_ACCUM, OP_VOID); tmp = SEXT40(ACC (OP[0])) + (SEXT40(ACC (OP[1])) >> 16); 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);}/* setf0f */voidOP_4611 (){ int16 tmp; trace_input ("setf0f", OP_REG_OUTPUT, OP_VOID, OP_VOID); tmp = ((PSW_F0 == 0) ? 1 : 0); SET_GPR (OP[0], tmp); trace_output_16 (tmp);}/* setf0t */voidOP_4613 (){ int16 tmp; trace_input ("setf0t", OP_REG_OUTPUT, OP_VOID, OP_VOID); tmp = ((PSW_F0 == 1) ? 1 : 0); SET_GPR (OP[0], tmp); trace_output_16 (tmp);}/* slae */voidOP_3220 (){ int64 tmp; int16 reg; trace_input ("slae", OP_ACCUM, OP_REG, OP_VOID); reg = SEXT16 (GPR (OP[1])); if (reg >= 17 || reg <= -17) { (*d10v_callback->printf_filtered) (d10v_callback, "ERROR: shift value %d too large.\n", reg); State.exception = SIGILL; return; } tmp = SEXT40 (ACC (OP[0])); if (PSW_ST && (tmp < SEXT40 (MIN32) || tmp > SEXT40 (MAX32))) { (*d10v_callback->printf_filtered) (d10v_callback, "ERROR: accumulator value 0x%.2x%.8lx out of range\n", ((int)(tmp >> 32) & 0xff), ((unsigned long) tmp) & 0xffffffff); State.exception = SIGILL; return; } if (reg >= 0 && reg <= 16) { tmp = SEXT56 ((SEXT56 (tmp)) << (GPR (OP[1]))); if (PSW_ST) { if (tmp > SEXT40(MAX32)) tmp = (MAX32); else if (tmp < SEXT40(MIN32)) tmp = (MIN32); else tmp = (tmp & MASK40); } else tmp = (tmp & MASK40); } else { tmp = (SEXT40 (ACC (OP[0]))) >> (-GPR (OP[1])); } SET_ACC(OP[0], tmp); trace_output_40(tmp);}/* sleep */voidOP_5FC0 (){ trace_input ("sleep", OP_VOID, OP_VOID, OP_VOID); SET_PSW_IE (1); trace_output_void ();}/* sll */voidOP_2200 (){ int16 tmp; trace_input ("sll", OP_REG, OP_REG, OP_VOID); tmp = (GPR (OP[0]) << (GPR (OP[1]) & 0xf)); SET_GPR (OP[0], tmp); trace_output_16 (tmp);}/* sll */voidOP_3200 (){ int64 tmp; trace_input ("sll", OP_ACCUM, OP_REG, OP_VOID); if ((GPR (OP[1]) & 31) <= 16) tmp = SEXT40 (ACC (OP[0])) << (GPR (OP[1]) & 31); else { (*d10v_callback->printf_filtered) (d10v_callback, "ERROR: shift value %d too large.\n", GPR (OP[1]) & 31); State.exception = SIGILL; return; } 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);}/* slli */voidOP_2201 (){ int16 tmp; trace_input ("slli", OP_REG, OP_CONSTANT16, OP_VOID); tmp = (GPR (OP[0]) << OP[1]); SET_GPR (OP[0], tmp); trace_output_16 (tmp);}/* slli */voidOP_3201 (){ int64 tmp; if (OP[1] == 0) OP[1] = 16; trace_input ("slli", OP_ACCUM, OP_CONSTANT16, OP_VOID); tmp = SEXT40(ACC (OP[0])) << OP[1]; 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);}/* slx */voidOP_460B (){ int16 tmp; trace_input ("slx", OP_REG, OP_VOID, OP_VOID); tmp = ((GPR (OP[0]) << 1) | PSW_F0); SET_GPR (OP[0], tmp); trace_output_16 (tmp);}/* sra */voidOP_2400 (){ int16 tmp; trace_input ("sra", OP_REG, OP_REG, OP_VOID); tmp = (((int16)(GPR (OP[0]))) >> (GPR (OP[1]) & 0xf)); SET_GPR (OP[0], tmp); trace_output_16 (tmp);}/* sra */voidOP_3400 (){ trace_input ("sra", OP_ACCUM, OP_REG, OP_VOID); if ((GPR (OP[1]) & 31) <= 16) { int64 tmp = ((SEXT40(ACC (OP[0])) >> (GPR (OP[1]) & 31)) & MASK40); SET_ACC (OP[0], tmp); trace_output_40 (tmp); } else { (*d10v_callback->printf_filtered) (d10v_callback, "ERROR: shift value %d too large.\n", GPR (OP[1]) & 31); State.exception = SIGILL; return; }}/* srai */voidOP_2401 (){ int16 tmp; trace_input ("srai", OP_REG, OP_CONSTANT16, OP_VOID); tmp = (((int16)(GPR (OP[0]))) >> OP[1]); SET_GPR (OP[0], tmp); trace_output_16 (tmp);}/* srai */voidOP_3401 (){ int64 tmp; if (OP[1] == 0) OP[1] = 16; trace_input ("srai", OP_ACCUM, OP_CONSTANT16, OP_VOID); tmp = ((SEXT40(ACC (OP[0])) >> OP[1]) & MASK40); SET_ACC (OP[0], tmp); trace_output_40 (tmp);}/* srl */voidOP_2000 (){ int16 tmp; trace_input ("srl", OP_REG, OP_REG, OP_VOID); tmp = (GPR (OP[0]) >> (GPR (OP[1]) & 0xf)); SET_GPR (OP[0], tmp); trace_output_16 (tmp);}/* srl */voidOP_3000 (){ trace_input ("srl", OP_ACCUM, OP_REG, OP_VOID); if ((GPR (OP[1]) & 31) <= 16) { int64 tmp = ((uint64)((ACC (OP[0]) & MASK40) >> (GPR (OP[1]) & 31))); SET_ACC (OP[0], tmp); trace_output_40 (tmp); } else { (*d10v_callback->printf_filtered) (d10v_callback, "ERROR: shift value %d too large.\n", GPR (OP[1]) & 31); State.exception = SIGILL; return; }}/* srli */voidOP_2001 (){ int16 tmp; trace_input ("srli", OP_REG, OP_CONSTANT16, OP_VOID); tmp = (GPR (OP[0]) >> OP[1]);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -