output_w32(0xe1900000|rd_rn_rm(rt,rs1,rs2));
}
+void emit_orrshl_imm(u_int rs,u_int imm,u_int rt)
+{
+ assert(rs<16);
+ assert(rt<16);
+ assert(imm<32);
+ assem_debug("orr %s,%s,%s,lsl #%d\n",regname[rt],regname[rt],regname[rs],imm);
+ output_w32(0xe1800000|rd_rn_rm(rt,rt,rs)|(imm<<7));
+}
+
void emit_orrshr_imm(u_int rs,u_int imm,u_int rt)
{
assert(rs<16);
int rs=get_reg(regmap,target);
int rth=get_reg(regmap,target|64);
int rt=get_reg(regmap,target);
+ // allow for PCSX dummy reads
+ //assert(rt>=0);
+ if(rs<0)
+ rs=get_reg(regmap,-1);
assert(rs>=0);
- assert(rt>=0);
int ftable=0;
if(type==LOADB_STUB||type==LOADBU_STUB)
ftable=(int)readmemb;
ftable=(int)readmemd;
#endif
assert(ftable!=0);
+ if(target==0)
+ emit_movimm(addr,rs);
emit_writeword(rs,(int)&address);
//emit_pusha();
save_regs(reglist);
}
//emit_popa();
restore_regs(reglist);
- if(type==LOADB_STUB)
- emit_movsbl((int)&readmem_dword,rt);
- if(type==LOADBU_STUB)
- emit_movzbl((int)&readmem_dword,rt);
- if(type==LOADH_STUB)
- emit_movswl((int)&readmem_dword,rt);
- if(type==LOADHU_STUB)
- emit_movzwl((int)&readmem_dword,rt);
- if(type==LOADW_STUB)
- emit_readword((int)&readmem_dword,rt);
- if(type==LOADD_STUB) {
- emit_readword((int)&readmem_dword,rt);
- if(rth>=0) emit_readword(((int)&readmem_dword)+4,rth);
+ if(rt>=0) {
+ if(type==LOADB_STUB)
+ emit_movsbl((int)&readmem_dword,rt);
+ if(type==LOADBU_STUB)
+ emit_movzbl((int)&readmem_dword,rt);
+ if(type==LOADH_STUB)
+ emit_movswl((int)&readmem_dword,rt);
+ if(type==LOADHU_STUB)
+ emit_movzwl((int)&readmem_dword,rt);
+ if(type==LOADW_STUB)
+ emit_readword((int)&readmem_dword,rt);
+ if(type==LOADD_STUB) {
+ emit_readword((int)&readmem_dword,rt);
+ if(rth>=0) emit_readword(((int)&readmem_dword)+4,rth);
+ }
}
}
emit_testimm(temp,0x8000); // do we need this?
emit_andimm(temp,0xf80,temp);
emit_andne_imm(temp,0,temp);
- emit_shr(temp,7,tl);
+ emit_shrimm(temp,7,tl);
emit_readword((int)®_cop2d[10],temp);
emit_testimm(temp,0x8000);
emit_andimm(temp,0xf80,temp);
emit_andne_imm(temp,0,temp);
- emit_orrshr(temp,2,tl);
+ emit_orrshr_imm(temp,2,tl);
emit_readword((int)®_cop2d[11],temp);
emit_testimm(temp,0x8000);
emit_andimm(temp,0xf80,temp);
emit_andne_imm(temp,0,temp);
- emit_orrshl(temp,3,tl);
+ emit_orrshl_imm(temp,3,tl);
emit_writeword(tl,(int)®_cop2d[copr]);
break;
default:
break;
case 28:
emit_andimm(sl,0x001f,temp);
- emit_shl(temp,7,temp);
+ emit_shlimm(temp,7,temp);
emit_writeword(temp,(int)®_cop2d[9]);
emit_andimm(sl,0x03e0,temp);
- emit_shl(temp,2,temp);
+ emit_shlimm(temp,2,temp);
emit_writeword(temp,(int)®_cop2d[10]);
emit_andimm(sl,0x7c00,temp);
- emit_shr(temp,3,temp);
+ emit_shrimm(temp,3,temp);
emit_writeword(temp,(int)®_cop2d[11]);
emit_writeword(sl,(int)®_cop2d[28]);
break;