summaryrefslogtreecommitdiff
path: root/cgiwas.c
diff options
context:
space:
mode:
authorJohn van Groningen2011-12-01 16:21:19 +0000
committerJohn van Groningen2011-12-01 16:21:19 +0000
commit3321be8fed86e65f3c365e78083d375b42fffee6 (patch)
tree3e7c996542b2b21f6c85abb9bd72844b53f5ded9 /cgiwas.c
parentimplement mulUUL for 32 bit thread safe code (diff)
implement divLU for 32 bit thread safe code
Diffstat (limited to 'cgiwas.c')
-rw-r--r--cgiwas.c82
1 files changed, 78 insertions, 4 deletions
diff --git a/cgiwas.c b/cgiwas.c
index a021ed8..dfebec4 100644
--- a/cgiwas.c
+++ b/cgiwas.c
@@ -3015,7 +3015,6 @@ static void w_as_mulud_instruction (struct instruction *instruction)
#endif
}
-#ifndef THREAD32
static void w_as_divdu_instruction (struct instruction *instruction)
{
int reg_1,reg_2,reg_3;
@@ -3024,6 +3023,83 @@ static void w_as_divdu_instruction (struct instruction *instruction)
reg_2=instruction->instruction_parameters[1].parameter_data.reg.r;
reg_3=instruction->instruction_parameters[2].parameter_data.reg.r;
+#ifdef THREAD32
+ if (reg_3==REGISTER_D0){
+ if (reg_2==REGISTER_A1)
+ w_as_opcode_register_newline ("div",reg_1);
+ else {
+ w_as_opcode_register_register_newline ("xchg",REGISTER_A1,reg_2);
+ if (reg_1==reg_2)
+ w_as_opcode_register_newline ("div",REGISTER_A1);
+ else if (reg_1==REGISTER_A1)
+ w_as_opcode_register_newline ("div",reg_2);
+ else
+ w_as_opcode_register_newline ("div",reg_1);
+ w_as_opcode_register_register_newline ("xchg",REGISTER_A1,reg_2);
+ }
+ } else if (reg_3==REGISTER_A1){
+ w_as_opcode_register_register_newline ("xchg",REGISTER_D0,REGISTER_A1);
+ if (reg_2==REGISTER_D0){
+ if (reg_1==REGISTER_D0)
+ w_as_opcode_register_newline ("div",REGISTER_A1);
+ else if (reg_1==REGISTER_A1)
+ w_as_opcode_register_newline ("div",REGISTER_D0);
+ else
+ w_as_opcode_register_newline ("div",reg_1);
+ } else {
+ w_as_opcode_register_register_newline ("xchg",REGISTER_A1,reg_2);
+ if (reg_1==reg_2)
+ w_as_opcode_register_newline ("div",REGISTER_A1);
+ else if (reg_1==REGISTER_D0)
+ w_as_opcode_register_newline ("div",reg_2);
+ else if (reg_1==REGISTER_A1)
+ w_as_opcode_register_newline ("div",REGISTER_D0);
+ else
+ w_as_opcode_register_newline ("div",reg_1);
+ w_as_opcode_register_register_newline ("xchg",REGISTER_A1,reg_2);
+ }
+ w_as_opcode_register_register_newline ("xchg",REGISTER_D0,REGISTER_A1);
+ } else {
+ if (reg_2==REGISTER_A1){
+ w_as_opcode_register_register_newline ("xchg",REGISTER_D0,reg_3);
+ if (reg_1==reg_3)
+ w_as_opcode_register_newline ("div",REGISTER_D0);
+ else if (reg_1==REGISTER_D0)
+ w_as_opcode_register_newline ("div",reg_3);
+ else
+ w_as_opcode_register_newline ("div",reg_1);
+ w_as_opcode_register_register_newline ("xchg",REGISTER_D0,reg_3);
+ } else if (reg_2==REGISTER_D0){
+ w_as_opcode_register_register_newline ("xchg",REGISTER_A1,REGISTER_D0);
+ w_as_opcode_register_register_newline ("xchg",REGISTER_D0,reg_3);
+ if (reg_1==reg_3)
+ w_as_opcode_register_newline ("div",REGISTER_D0);
+ else if (reg_1==REGISTER_D0)
+ w_as_opcode_register_newline ("div",REGISTER_A1);
+ else if (reg_1==REGISTER_A1)
+ w_as_opcode_register_newline ("div",reg_3);
+ else
+ w_as_opcode_register_newline ("div",reg_1);
+ w_as_opcode_register_register_newline ("xchg",REGISTER_D0,reg_3);
+ w_as_opcode_register_register_newline ("xchg",REGISTER_A1,REGISTER_D0);
+ } else {
+ w_as_opcode_register_register_newline ("xchg",REGISTER_D0,reg_3);
+ w_as_opcode_register_register_newline ("xchg",REGISTER_A1,reg_2);
+ if (reg_1==REGISTER_D0)
+ w_as_opcode_register_newline ("div",reg_3);
+ else if (reg_1==REGISTER_A1)
+ w_as_opcode_register_newline ("div",reg_2);
+ else if (reg_1==reg_3)
+ w_as_opcode_register_newline ("div",REGISTER_D0);
+ else if (reg_1==reg_2)
+ w_as_opcode_register_newline ("div",REGISTER_A1);
+ else
+ w_as_opcode_register_newline ("div",reg_1);
+ w_as_opcode_register_register_newline ("xchg",REGISTER_A1,reg_2);
+ w_as_opcode_register_register_newline ("xchg",REGISTER_D0,reg_3);
+ }
+ }
+#else
if (reg_1==REGISTER_D0){
if (reg_3==REGISTER_D0){
if (reg_2==REGISTER_A1)
@@ -3131,8 +3207,8 @@ static void w_as_divdu_instruction (struct instruction *instruction)
w_as_opcode_register_register_newline ("xchg",reg_3,REGISTER_D0);
}
}
-}
#endif
+}
static void w_as_or_r_r (int reg_1,int reg_2)
{
@@ -4838,11 +4914,9 @@ static void w_as_instructions (register struct instruction *instruction)
case IMULUD:
w_as_mulud_instruction (instruction);
break;
-#ifndef THREAD32
case IDIVDU:
w_as_divdu_instruction (instruction);
break;
-#endif
case IFLOORDIV:
w_as_floordiv_mod_instruction (instruction,0);
break;