- th=get_reg(i_regs->regmap,rt1[i]|64);
- if(!((i_regs->was32>>rs1[i])&(i_regs->was32>>rs2[i])&1)&&th>=0)
- {
- assert(tl>=0);
- if(tl>=0) {
- s1l=get_reg(i_regs->regmap,rs1[i]);
- s1h=get_reg(i_regs->regmap,rs1[i]|64);
- s2l=get_reg(i_regs->regmap,rs2[i]);
- s2h=get_reg(i_regs->regmap,rs2[i]|64);
- if(rs1[i]&&rs2[i]) {
- assert(s1l>=0);assert(s1h>=0);
- assert(s2l>=0);assert(s2h>=0);
- if(opcode2[i]==0x24) { // AND
- emit_and(s1l,s2l,tl);
- emit_and(s1h,s2h,th);
- } else
- if(opcode2[i]==0x25) { // OR
- emit_or(s1l,s2l,tl);
- emit_or(s1h,s2h,th);
- } else
- if(opcode2[i]==0x26) { // XOR
- emit_xor(s1l,s2l,tl);
- emit_xor(s1h,s2h,th);
- } else
- if(opcode2[i]==0x27) { // NOR
- emit_or(s1l,s2l,tl);
- emit_or(s1h,s2h,th);
- emit_not(tl,tl);
- emit_not(th,th);
- }
- }
- else
- {
- if(opcode2[i]==0x24) { // AND
- emit_zeroreg(tl);
- emit_zeroreg(th);
- } else
- if(opcode2[i]==0x25||opcode2[i]==0x26) { // OR/XOR
- if(rs1[i]){
- if(s1l>=0) emit_mov(s1l,tl);
- else emit_loadreg(rs1[i],tl);
- if(s1h>=0) emit_mov(s1h,th);
- else emit_loadreg(rs1[i]|64,th);
- }
- else
- if(rs2[i]){
- if(s2l>=0) emit_mov(s2l,tl);
- else emit_loadreg(rs2[i],tl);
- if(s2h>=0) emit_mov(s2h,th);
- else emit_loadreg(rs2[i]|64,th);
- }
- else{
- emit_zeroreg(tl);
- emit_zeroreg(th);
- }
- } else
- if(opcode2[i]==0x27) { // NOR
- if(rs1[i]){
- if(s1l>=0) emit_not(s1l,tl);
- else{
- emit_loadreg(rs1[i],tl);
- emit_not(tl,tl);
- }
- if(s1h>=0) emit_not(s1h,th);
- else{
- emit_loadreg(rs1[i]|64,th);
- emit_not(th,th);
- }
- }
- else
- if(rs2[i]){
- if(s2l>=0) emit_not(s2l,tl);
- else{
- emit_loadreg(rs2[i],tl);
- emit_not(tl,tl);
- }
- if(s2h>=0) emit_not(s2h,th);
- else{
- emit_loadreg(rs2[i]|64,th);
- emit_not(th,th);
- }
- }
- else {
- emit_movimm(-1,tl);
- emit_movimm(-1,th);
- }
- }
- }
- }
- }
- else