📄 simops.c
字号:
voidOP_6001 (){ uint16 tmp; uint16 addr = GPR (OP[1]); trace_input ("ld", OP_REG_OUTPUT, OP_POSTINC, 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 */voidOP_6000 (){ uint16 tmp; uint16 addr = GPR (OP[1]); trace_input ("ld", OP_REG_OUTPUT, OP_MEMREF, 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_32010000 (){ uint16 tmp; uint16 addr = OP[1]; trace_input ("ld", OP_REG_OUTPUT, OP_MEMREF3, 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);}/* ld2w */voidOP_31000000 (){ int32 tmp; uint16 addr = OP[1] + GPR (OP[2]); trace_input ("ld2w", 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 = RLW (addr); SET_GPR32 (OP[0], tmp); trace_output_32 (tmp);}/* ld2w */voidOP_6601 (){ uint16 addr = GPR (OP[1]); int32 tmp; trace_input ("ld2w", 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 = RLW (addr); SET_GPR32 (OP[0], tmp); if (OP[0] != OP[1] && ((OP[0] + 1) != OP[1])) INC_ADDR (OP[1], -4); trace_output_32 (tmp);}/* ld2w */voidOP_6201 (){ int32 tmp; uint16 addr = GPR (OP[1]); trace_input ("ld2w", OP_REG_OUTPUT, OP_POSTINC, OP_VOID); if ((addr & 1)) { State.exception = SIG_D10V_BUS; State.pc_changed = 1; /* Don't increment the PC. */ trace_output_void (); return; } tmp = RLW (addr); SET_GPR32 (OP[0], tmp); if (OP[0] != OP[1] && ((OP[0] + 1) != OP[1])) INC_ADDR (OP[1], 4); trace_output_32 (tmp);}/* ld2w */voidOP_6200 (){ uint16 addr = GPR (OP[1]); int32 tmp; trace_input ("ld2w", OP_REG_OUTPUT, OP_MEMREF, OP_VOID); if ((addr & 1)) { State.exception = SIG_D10V_BUS; State.pc_changed = 1; /* Don't increment the PC. */ trace_output_void (); return; } tmp = RLW (addr); SET_GPR32 (OP[0], tmp); trace_output_32 (tmp);}/* ld2w */voidOP_33010000 (){ int32 tmp; uint16 addr = OP[1]; trace_input ("ld2w", OP_REG_OUTPUT, OP_MEMREF3, OP_VOID); if ((addr & 1)) { State.exception = SIG_D10V_BUS; State.pc_changed = 1; /* Don't increment the PC. */ trace_output_void (); return; } tmp = RLW (addr); SET_GPR32 (OP[0], tmp); trace_output_32 (tmp);}/* ldb */voidOP_38000000 (){ int16 tmp; trace_input ("ldb", OP_REG_OUTPUT, OP_MEMREF2, OP_VOID); tmp = SEXT8 (RB (OP[1] + GPR (OP[2]))); SET_GPR (OP[0], tmp); trace_output_16 (tmp);}/* ldb */voidOP_7000 (){ int16 tmp; trace_input ("ldb", OP_REG_OUTPUT, OP_MEMREF, OP_VOID); tmp = SEXT8 (RB (GPR (OP[1]))); SET_GPR (OP[0], tmp); trace_output_16 (tmp);}/* ldi.s */voidOP_4001 (){ int16 tmp; trace_input ("ldi.s", OP_REG_OUTPUT, OP_CONSTANT4, OP_VOID); tmp = SEXT4 (OP[1]); SET_GPR (OP[0], tmp); trace_output_16 (tmp);}/* ldi.l */voidOP_20000000 (){ int16 tmp; trace_input ("ldi.l", OP_REG_OUTPUT, OP_CONSTANT16, OP_VOID); tmp = OP[1]; SET_GPR (OP[0], tmp); trace_output_16 (tmp);}/* ldub */voidOP_39000000 (){ int16 tmp; trace_input ("ldub", OP_REG_OUTPUT, OP_MEMREF2, OP_VOID); tmp = RB (OP[1] + GPR (OP[2])); SET_GPR (OP[0], tmp); trace_output_16 (tmp);}/* ldub */voidOP_7200 (){ int16 tmp; trace_input ("ldub", OP_REG_OUTPUT, OP_MEMREF, OP_VOID); tmp = RB (GPR (OP[1])); SET_GPR (OP[0], tmp); trace_output_16 (tmp);}/* mac */voidOP_2A00 (){ int64 tmp; trace_input ("mac", OP_ACCUM, OP_REG, OP_REG); tmp = SEXT40 ((int16)(GPR (OP[1])) * (int16)(GPR (OP[2]))); if (PSW_FX) tmp = SEXT40( (tmp << 1) & MASK40); if (PSW_ST && tmp > SEXT40(MAX32)) tmp = (MAX32); 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);}/* macsu */voidOP_1A00 (){ int64 tmp; trace_input ("macsu", OP_ACCUM, OP_REG, OP_REG); tmp = SEXT40 ((int16) GPR (OP[1]) * GPR (OP[2])); if (PSW_FX) tmp = SEXT40 ((tmp << 1) & MASK40); tmp = ((SEXT40 (ACC (OP[0])) + tmp) & MASK40); SET_ACC (OP[0], tmp); trace_output_40 (tmp);}/* macu */voidOP_3A00 (){ uint64 tmp; uint32 src1; uint32 src2; trace_input ("macu", OP_ACCUM, OP_REG, OP_REG); src1 = (uint16) GPR (OP[1]); src2 = (uint16) GPR (OP[2]); tmp = src1 * src2; if (PSW_FX) tmp = (tmp << 1); tmp = ((ACC (OP[0]) + tmp) & MASK40); SET_ACC (OP[0], tmp); trace_output_40 (tmp);}/* max */voidOP_2600 (){ int16 tmp; trace_input ("max", OP_REG, OP_REG, OP_VOID); SET_PSW_F1 (PSW_F0); if ((int16) GPR (OP[1]) > (int16)GPR (OP[0])) { tmp = GPR (OP[1]); SET_PSW_F0 (1); } else { tmp = GPR (OP[0]); SET_PSW_F0 (0); } SET_GPR (OP[0], tmp); trace_output_16 (tmp);}/* max */voidOP_3600 (){ int64 tmp; trace_input ("max", OP_ACCUM, OP_DREG, OP_VOID); SET_PSW_F1 (PSW_F0); tmp = SEXT16 (GPR (OP[1])) << 16 | GPR (OP[1] + 1); if (tmp > SEXT40 (ACC (OP[0]))) { tmp = (tmp & MASK40); SET_PSW_F0 (1); } else { tmp = ACC (OP[0]); SET_PSW_F0 (0); } SET_ACC (OP[0], tmp); trace_output_40 (tmp);}/* max */voidOP_3602 (){ int64 tmp; trace_input ("max", OP_ACCUM, OP_ACCUM, OP_VOID); SET_PSW_F1 (PSW_F0); if (SEXT40 (ACC (OP[1])) > SEXT40 (ACC (OP[0]))) { tmp = ACC (OP[1]); SET_PSW_F0 (1); } else { tmp = ACC (OP[0]); SET_PSW_F0 (0); } SET_ACC (OP[0], tmp); trace_output_40 (tmp);}/* min */voidOP_2601 (){ int16 tmp; trace_input ("min", OP_REG, OP_REG, OP_VOID); SET_PSW_F1 (PSW_F0); if ((int16)GPR (OP[1]) < (int16)GPR (OP[0])) { tmp = GPR (OP[1]); SET_PSW_F0 (1); } else { tmp = GPR (OP[0]); SET_PSW_F0 (0); } SET_GPR (OP[0], tmp); trace_output_16 (tmp);}/* min */voidOP_3601 (){ int64 tmp; trace_input ("min", OP_ACCUM, OP_DREG, OP_VOID); SET_PSW_F1 (PSW_F0); tmp = SEXT16 (GPR (OP[1])) << 16 | GPR (OP[1] + 1); if (tmp < SEXT40(ACC (OP[0]))) { tmp = (tmp & MASK40); SET_PSW_F0 (1); } else { tmp = ACC (OP[0]); SET_PSW_F0 (0); } SET_ACC (OP[0], tmp); trace_output_40 (tmp);}/* min */voidOP_3603 (){ int64 tmp; trace_input ("min", OP_ACCUM, OP_ACCUM, OP_VOID); SET_PSW_F1 (PSW_F0); if (SEXT40(ACC (OP[1])) < SEXT40(ACC (OP[0]))) { tmp = ACC (OP[1]); SET_PSW_F0 (1); } else { tmp = ACC (OP[0]); SET_PSW_F0 (0); } SET_ACC (OP[0], tmp); trace_output_40 (tmp);}/* msb */voidOP_2800 (){ int64 tmp; trace_input ("msb", OP_ACCUM, OP_REG, OP_REG); tmp = SEXT40 ((int16)(GPR (OP[1])) * (int16)(GPR (OP[2]))); if (PSW_FX) tmp = SEXT40 ((tmp << 1) & MASK40); if (PSW_ST && tmp > SEXT40(MAX32)) tmp = (MAX32); tmp = SEXT40(ACC (OP[0])) - tmp; 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);}/* msbsu */voidOP_1800 (){ int64 tmp; trace_input ("msbsu", OP_ACCUM, OP_REG, OP_REG); tmp = SEXT40 ((int16)GPR (OP[1]) * GPR (OP[2])); if (PSW_FX) tmp = SEXT40( (tmp << 1) & MASK40); tmp = ((SEXT40 (ACC (OP[0])) - tmp) & MASK40); SET_ACC (OP[0], tmp); trace_output_40 (tmp);}/* msbu */voidOP_3800 (){ uint64 tmp; uint32 src1; uint32 src2; trace_input ("msbu", OP_ACCUM, OP_REG, OP_REG); src1 = (uint16) GPR (OP[1]); src2 = (uint16) GPR (OP[2]); tmp = src1 * src2; if (PSW_FX) tmp = (tmp << 1); tmp = ((ACC (OP[0]) - tmp) & MASK40); SET_ACC (OP[0], tmp); trace_output_40 (tmp);}/* mul */voidOP_2E00 (){ int16 tmp; trace_input ("mul", OP_REG, OP_REG, OP_VOID); tmp = GPR (OP[0]) * GPR (OP[1]); SET_GPR (OP[0], tmp); trace_output_16 (tmp);}/* mulx */voidOP_2C00 (){ int64 tmp; trace_input ("mulx", OP_ACCUM_OUTPUT, OP_REG, OP_REG); tmp = SEXT40 ((int16)(GPR (OP[1])) * (int16)(GPR (OP[2]))); if (PSW_FX) tmp = SEXT40 ((tmp << 1) & MASK40); if (PSW_ST && tmp > SEXT40(MAX32)) tmp = (MAX32); else tmp = (tmp & MASK40); SET_ACC (OP[0], tmp); trace_output_40 (tmp);}/* mulxsu */voidOP_1C00 (){ int64 tmp; trace_input ("mulxsu", OP_ACCUM_OUTPUT, OP_REG, OP_REG); tmp = SEXT40 ((int16)(GPR (OP[1])) * GPR (OP[2])); if (PSW_FX) tmp <<= 1; tmp = (tmp & MASK40); SET_ACC (OP[0], tmp); trace_output_40 (tmp);}/* mulxu */voidOP_3C00 (){ uint64 tmp; uint32 src1; uint32 src2; trace_input ("mulxu", OP_ACCUM_OUTPUT, OP_REG, OP_REG); src1 = (uint16) GPR (OP[1]); src2 = (uint16) GPR (OP[2]); tmp = src1 * src2; if (PSW_FX) tmp <<= 1; tmp = (tmp & MASK40); SET_ACC (OP[0], tmp); trace_output_40 (tmp);}/* mv */voidOP_4000 (){ int16 tmp; trace_input ("mv", OP_REG_OUTPUT, OP_REG, OP_VOID); tmp = GPR (OP[1]); SET_GPR (OP[0], tmp); trace_output_16 (tmp);}/* mv2w */voidOP_5000 (){ int32 tmp; trace_input ("mv2w", OP_DREG_OUTPUT, OP_DREG, OP_VOID); tmp = GPR32 (OP[1]); SET_GPR32 (OP[0], tmp); trace_output_32 (tmp);}/* mv2wfac */voidOP_3E00 (){ int32 tmp; trace_input ("mv2wfac", OP_DREG_OUTPUT, OP_ACCUM, OP_VOID); tmp = ACC (OP[1]); SET_GPR32 (OP[0], tmp); trace_output_32 (tmp);}/* mv2wtac */voidOP_3E01 (){ int64 tmp; trace_input ("mv2wtac", OP_DREG, OP_ACCUM_OUTPUT, OP_VOID); tmp = ((SEXT16 (GPR (OP[0])) << 16 | GPR (OP[0] + 1)) & MASK40); SET_ACC (OP[1], tmp); trace_output_40 (tmp);}/* mvac */voidOP_3E03 (){ int64 tmp; trace_input ("mvac", OP_ACCUM_OUTPUT, OP_ACCUM, OP_VOID); tmp = ACC (OP[1]); SET_ACC (OP[0], tmp); trace_output_40 (tmp);}/* mvb */voidOP_5400 (){ int16 tmp; trace_input ("mvb", OP_REG_OUTPUT, OP_REG, OP_VOID); tmp = SEXT8 (GPR (OP[1]) & 0xff); SET_GPR (OP[0], tmp); trace_output_16 (tmp);}/* mvf0f */voidOP_4400 (){ int16 tmp; trace_input ("mvf0f", OP_REG_OUTPUT, OP_REG, OP_VOID); if (PSW_F0 == 0) { tmp = GPR (OP[1]); SET_GPR (OP[0], tmp); } else tmp = GPR (OP[0]); trace_output_16 (tmp);}/* mvf0t */voidOP_4401 (){ int16 tmp; trace_input ("mvf0t", OP_REG_OUTPUT, OP_REG, OP_VOID); if (PSW_F0) { tmp = GPR (OP[1]); SET_GPR (OP[0], tmp); } else tmp = GPR (OP[0]); trace_output_16 (tmp);}/* mvfacg */voidOP_1E04 (){ int16 tmp; trace_input ("mvfacg", OP_REG_OUTPUT, OP_ACCUM, OP_VOID); tmp = ((ACC (OP[1]) >> 32) & 0xff); SET_GPR (OP[0], tmp); trace_output_16 (tmp);}/* mvfachi */voidOP_1E00 (){ int16 tmp; trace_input ("mvfachi", OP_REG_OUTPUT, OP_ACCUM, OP_VOID); tmp = (ACC (OP[1]) >> 16); SET_GPR (OP[0], tmp); trace_output_16 (tmp);}/* mvfaclo */voidOP_1E02 (){ int16 tmp;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -