📄 arm9es-opcodes.cpp
字号:
}OPC opSMULTT(){/* if((_OP_RM==15)| (_OP_RS==15)| (_OP_RD==15)| (_OP_RN==15)) opUNP();*/ u32 r=(_RM>>16), d=(_RS>>16); r=(r&0x8000)?(0xFFFF0000|r):r; d=(d&0x8000)?(0xFFFF0000|d):d; _RN = r*d; return 1;}OPC opSMLABB(){/* if((_OP_RM==15)| (_OP_RS==15)| (_OP_RD==15)| (_OP_RN==15)) opUNP();*/ u32 r=(_RM&65535), d=(_RS&65535), sat; r=(r&0x8000)?(0xFFFF0000|r):r; d=(d&0x8000)?(0xFFFF0000|d):d; reg.tmp1 = r*d; reg.tmp2 = _RD; _RN = reg.tmp1+reg.tmp2; flagDPqSMLA; if(sat) _RN=(_RN&0x80000000)?0x7FFFFFFF:0x80000000; return 1; }OPC opSMLABT(){/* if((_OP_RM==15)| (_OP_RS==15)| (_OP_RD==15)| (_OP_RN==15)) opUNP();*/ u32 r=(_RM&65535), d=(_RS>>16), sat; r=(r&0x8000)?(0xFFFF0000|r):r; d=(d&0x8000)?(0xFFFF0000|d):d; reg.tmp1 = r*d; reg.tmp2 = _RD; _RN = reg.tmp1+reg.tmp2; flagDPqSMLA; if(sat) _RN=(_RN&0x80000000)?0x7FFFFFFF:0x80000000; return 1;}OPC opSMLATB(){/* if((_OP_RM==15)| (_OP_RS==15)| (_OP_RD==15)| (_OP_RN==15)) opUNP();*/ u32 r=(_RM>>16), d=(_RS&65535), sat; r=(r&0x8000)?(0xFFFF0000|r):r; d=(d&0x8000)?(0xFFFF0000|d):d; reg.tmp1 = r*d; reg.tmp2 = _RD; _RN = reg.tmp1+reg.tmp2; flagDPqSMLA; if(sat) _RN=(_RN&0x80000000)?0x7FFFFFFF:0x80000000; return 1;}OPC opSMLATT(){/* if((_OP_RM==15)| (_OP_RS==15)| (_OP_RD==15)| (_OP_RN==15)) opUNP();*/ u32 r=(_RM>>16), d=(_RS>>16), sat; r=(r&0x8000)?(0xFFFF0000|r):r; d=(d&0x8000)?(0xFFFF0000|d):d; reg.tmp1 = r*d; reg.tmp2 = _RD; _RN = reg.tmp1+reg.tmp2; flagDPqSMLA; if(sat) _RN=(_RN&0x80000000)?0x7FFFFFFF:0x80000000; return 1;}OPC opSMLALBB(){/* if((_OP_RM==15)| (_OP_RS==15)| (_OP_RD==15)| (_OP_RN==15)) opUNP();*/ u32 r=(_RM&65535), d=(_RS&65535), carry; r=(r&0x8000)?(0xFFFF0000|r):r; d=(d&0x8000)?(0xFFFF0000|d):d; reg.tmp1 = r*d; reg.tmp2 = _RD; _RD = reg.tmp1+reg.tmp2; flagDPcSMLAL; if(carry) _RN++; return 1;}OPC opSMLALBT(){/* if((_OP_RM==15)| (_OP_RS==15)| (_OP_RD==15)| (_OP_RN==15)) opUNP();*/ u32 r=(_RM&65535), d=(_RS>>16), carry; r=(r&0x8000)?(0xFFFF0000|r):r; d=(d&0x8000)?(0xFFFF0000|d):d; reg.tmp1 = r*d; reg.tmp2 = _RD; _RD = reg.tmp1+reg.tmp2; flagDPcSMLAL; if(carry) _RN++; return 1;}OPC opSMLALTB(){/* if((_OP_RM==15)| (_OP_RS==15)| (_OP_RD==15)| (_OP_RN==15)) opUNP();*/ u32 r=(_RM>>16), d=(_RS&65535), carry; r=(r&0x8000)?(0xFFFF0000|r):r; d=(d&0x8000)?(0xFFFF0000|d):d; reg.tmp1 = r*d; reg.tmp2 = _RD; _RD = reg.tmp1+reg.tmp2; flagDPcSMLAL; if(carry) _RN++; return 1;}OPC opSMLALTT(){/* if((_OP_RM==15)| (_OP_RS==15)| (_OP_RD==15)| (_OP_RN==15)) opUNP();*/ u32 r=(_RM>>16), d=(_RS>>16), carry; r=(r&0x8000)?(0xFFFF0000|r):r; d=(d&0x8000)?(0xFFFF0000|d):d; reg.tmp1 = r*d; reg.tmp2 = _RD; _RD = reg.tmp1+reg.tmp2; flagDPcSMLAL; if(carry) _RN++; return 1;}OPC opSMULWB(){/* if((_OP_RM==15)| (_OP_RS==15)| (_OP_RD==15)| (_OP_RN==15)) opUNP();*/ u32 pl=0, ph=0, dshft=0, r=_RM, d=(_RS&65535), neg=0; d=(d&0x8000)?(0xFFFF0000|d):d; if(r&0x80000000) { neg++; r=(~r)+1; } if(d&0x80000000) { neg++; d=(~d)+1; } for(int i=0; i<32; ++i) { if(r&1) { pl+=d; ph+=dshft; } r>>=1; dshft<<=1; dshft+=(d&0x80000000)?1:0; d<<=1; } if(neg==1) { pl=(~pl)+1; ph=(~ph)+1; } _RN=(ph<<16) | (pl>>16); return 1;}OPC opSMULWT(){/* if((_OP_RM==15)| (_OP_RS==15)| (_OP_RD==15)| (_OP_RN==15)) opUNP();*/ u32 pl=0, ph=0, dshft=0, r=_RM, d=(_RS>>16), neg=0; d=(d&0x8000)?(0xFFFF0000|d):d; if(r&0x80000000) { neg++; r=(~r)+1; } if(d&0x80000000) { neg++; d=(~d)+1; } for(int i=0; i<32; ++i) { if(r&1) { pl+=d; ph+=dshft; } r>>=1; dshft<<=1; dshft+=(d&0x80000000)?1:0; d<<=1; } if(neg==1) { pl=(~pl)+1; ph=(~ph)+1; } _RN=(ph<<16) | (pl>>16); return 1;}OPC opSMLAWB(){/* if((_OP_RM==15)| (_OP_RS==15)| (_OP_RD==15)| (_OP_RN==15)) opUNP();*/ u32 pl=0, ph=0, dshft=0, r=_RM, d=(_RS&65535), neg=0, sat; d=(d&0x8000)?(0xFFFF0000|d):d; if(r&0x80000000) { neg++; r=(~r)+1; } if(d&0x80000000) { neg++; d=(~d)+1; } for(int i=0; i<32; ++i) { if(r&1) { pl+=d; ph+=dshft; } r>>=1; dshft<<=1; dshft+=(d&0x80000000)?1:0; d<<=1; } if(neg==1) { pl=(~pl)+1; ph=(~ph)+1; } reg.tmp1=(ph<<16) | (pl>>16); reg.tmp2=_RD; _RN=reg.tmp1+reg.tmp2; flagDPqADD; if(sat) _RN=(_RN&0x80000000)?0x7FFFFFFF:0x80000000; return 1;}OPC opSMLAWT(){/* if((_OP_RM==15)| (_OP_RS==15)| (_OP_RD==15)| (_OP_RN==15)) opUNP();*/ u32 pl=0, ph=0, dshft=0, r=_RM, d=(_RS>>16), neg=0, sat; d=(d&0x8000)?(0xFFFF0000|d):d; if(r&0x80000000) { neg++; r=(~r)+1; } if(d&0x80000000) { neg++; d=(~d)+1; } for(int i=0; i<32; ++i) { if(r&1) { pl+=d; ph+=dshft; } r>>=1; dshft<<=1; dshft+=(d&0x80000000)?1:0; d<<=1; } if(neg==1) { pl=(~pl)+1; ph=(~ph)+1; } reg.tmp1=(ph<<16) | (pl>>16); reg.tmp2=_RD; _RN=reg.tmp1+reg.tmp2; flagDPqADD; if(sat) _RN=(_RN&0x80000000)?0x7FFFFFFF:0x80000000; return 1;}//---Miscellaneous new opcodes---------------------------------------------// NOTE: BKPT can't really do anything in software, so it just returns.OPC opCLZ(){ int pos=0; for(int i=31;i>=0;i--,pos++) if(_RM&(1<<i)) break; _RD=pos; return 1;}OPC opBKPT(){ return 1;}/*** EOF: arm9es-opcodes.cpp *********************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -