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

📄 arm9es-opcodes.cpp

📁 一个任天堂掌上游戏机NDS的源代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
}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 + -