DYNAREC: More work on DIV, no effect
[mupen64plus-pandora.git] / source / mupen64plus-core / src / r4300 / new_dynarec / assem_arm.c
index 560fc52..6d2f0b1 100755 (executable)
@@ -4096,6 +4096,22 @@ static void multdiv_assemble_arm(int i,struct regstat *i_regs)
       }
       if(opcode2[i]==0x1A) // DIV
       {
+               #if 0
+        signed char m1l=get_reg(i_regs->regmap,rs1[i]);
+        signed char m2l=get_reg(i_regs->regmap,rs2[i]);
+        assert(m1l>=0);
+        assert(m2l>=0);
+        save_regs(0x100f);
+        if(m1l!=0) emit_mov(m1l,0);
+        if(m2l<1) emit_readword((int)&dynarec_local,1);
+        else if(m2l>1) emit_mov(m2l,1);
+        emit_call((int)&div32);
+        restore_regs(0x100f);
+        signed char hil=get_reg(i_regs->regmap,HIREG);
+        if(hil>=0) emit_loadreg(HIREG,hil);
+        signed char lol=get_reg(i_regs->regmap,LOREG);
+        if(lol>=0) emit_loadreg(LOREG,lol);
+               #else
         signed char d1=get_reg(i_regs->regmap,rs1[i]);
         signed char d2=get_reg(i_regs->regmap,rs2[i]);
         assert(d1>=0);
@@ -4122,10 +4138,27 @@ static void multdiv_assemble_arm(int i,struct regstat *i_regs)
         emit_negmi(quotient,quotient);
         emit_test(d1,d1);
         emit_negmi(remainder,remainder);
+               #endif
       }
       if(opcode2[i]==0x1B) // DIVU
       {
-        signed char d1=get_reg(i_regs->regmap,rs1[i]); // dividend
+           #if 0
+               signed char m1l=get_reg(i_regs->regmap,rs1[i]);
+               signed char m2l=get_reg(i_regs->regmap,rs2[i]);
+               assert(m1l>=0);
+               assert(m2l>=0);
+               save_regs(0x100f);
+               if(m1l!=0) emit_mov(m1l,0);
+               if(m2l<1) emit_readword((int)&dynarec_local,1);
+               else if(m2l>1) emit_mov(m2l,1);
+               emit_call((int)&divu32);
+               restore_regs(0x100f);
+               signed char hil=get_reg(i_regs->regmap,HIREG);
+               if(hil>=0) emit_loadreg(HIREG,hil);
+               signed char lol=get_reg(i_regs->regmap,LOREG);
+               if(lol>=0) emit_loadreg(LOREG,lol);
+               #else
+               signed char d1=get_reg(i_regs->regmap,rs1[i]); // dividend
         signed char d2=get_reg(i_regs->regmap,rs2[i]); // divisor
         assert(d1>=0);
         assert(d2>=0);
@@ -4145,6 +4178,7 @@ static void multdiv_assemble_arm(int i,struct regstat *i_regs)
         emit_adcs(quotient,quotient,quotient);
         emit_shrcc_imm(d2,1,d2);
         emit_jcc((int)out-16); // -4
+               #endif
       }
     }
     else // 64-bit
@@ -4201,8 +4235,12 @@ static void multdiv_assemble_arm(int i,struct regstat *i_regs)
         restore_regs(0x100f);
         signed char hih=get_reg(i_regs->regmap,HIREG|64);
         signed char hil=get_reg(i_regs->regmap,HIREG);
+        if(hih>=0) emit_loadreg(HIREG|64,hih);
+        if(hil>=0) emit_loadreg(HIREG,hil);
         signed char loh=get_reg(i_regs->regmap,LOREG|64);
         signed char lol=get_reg(i_regs->regmap,LOREG);
+        if(loh>=0) emit_loadreg(LOREG|64,loh);
+        if(lol>=0) emit_loadreg(LOREG,lol);
         /*signed char temp=get_reg(i_regs->regmap,-1);
         signed char rh=get_reg(i_regs->regmap,HIREG|64);
         signed char rl=get_reg(i_regs->regmap,HIREG);
@@ -4328,7 +4366,7 @@ static void multdiv_assemble_arm(int i,struct regstat *i_regs)
     // Multiply by zero is zero.
     // MIPS does not have a divide by zero exception.
     // The result is undefined, we return zero.
-/*    if((opcode2[i]&4)!=0) // 64-bit
+    if((opcode2[i]&4)!=0) // 64-bit
     {
         signed char hih=get_reg(i_regs->regmap,HIREG|64);
                signed char hr=get_reg(i_regs->regmap,HIREG);
@@ -4338,7 +4376,7 @@ static void multdiv_assemble_arm(int i,struct regstat *i_regs)
                if(hr>=0) emit_zeroreg(hr);
         if(loh>=0) emit_zeroreg(loh);
                if(lr>=0) emit_zeroreg(lr);
-       } else */
+       } else
        {
                signed char hr=get_reg(i_regs->regmap,HIREG);
                signed char lr=get_reg(i_regs->regmap,LOREG);