summaryrefslogtreecommitdiff
path: root/cglin.c
diff options
context:
space:
mode:
authorJohn van Groningen2011-12-01 12:32:08 +0000
committerJohn van Groningen2011-12-01 12:32:08 +0000
commit41440a54ab504b678244a5174bdc4e34a5d4c2c6 (patch)
treefc2a4829e6b3e0e32b33c98cad01369c7029962c /cglin.c
parentgenerate thread safe code on 32 bit windows if THREAD32 is defined (diff)
implement mulUUL for 32 bit thread safe code
Diffstat (limited to 'cglin.c')
-rw-r--r--cglin.c37
1 files changed, 33 insertions, 4 deletions
diff --git a/cglin.c b/cglin.c
index 0ca5605..ab9f7c2 100644
--- a/cglin.c
+++ b/cglin.c
@@ -1807,18 +1807,31 @@ void i_movew_r_pd (int register_1,int register_2)
}
#endif
-#if defined (I486) && !defined (THREAD32)
+#ifdef I486
+# ifdef THREAD32
+void i_mulud_r_r_r (int register_1,int register_2,int register_3)
+# else
void i_mulud_r_r (int register_1,int register_2)
+#endif
{
struct instruction *instruction;
+# ifdef THREAD32
+ instruction=i_new_instruction3 (IMULUD);
+# else
instruction=i_new_instruction2 (IMULUD);
+# endif
S2 (instruction->instruction_parameters[0], parameter_type=P_REGISTER,
parameter_data.i=register_1);
-
+
S2 (instruction->instruction_parameters[1], parameter_type=P_REGISTER,
parameter_data.i=register_2);
+
+# ifdef THREAD32
+ S2 (instruction->instruction_parameters[2], parameter_type=P_REGISTER,
+ parameter_data.i=register_3);
+# endif
}
#endif
@@ -4381,7 +4394,6 @@ static void linearize_two_results_operator (INSTRUCTION_GRAPH result_graph,ADDRE
graph=result_graph->instruction_parameters[0].p;
-#ifndef THREAD32
if (graph->instruction_code==GMULUD){
INSTRUCTION_GRAPH graph_1,graph_2;
@@ -4401,8 +4413,25 @@ static void linearize_two_results_operator (INSTRUCTION_GRAPH result_graph,ADDRE
reg_1=ad_1.ad_register;
reg_2=ad_2.ad_register;
+# ifdef THREAD32
+ {
+ int tmp_reg;
+
+ if (try_allocate_register_number (REGISTER_D0))
+ tmp_reg=REGISTER_D0;
+ else if (try_allocate_register_number (REGISTER_A1))
+ tmp_reg=REGISTER_A1;
+ else
+ tmp_reg=get_dregister();
+ i_mulud_r_r_r (reg_1,reg_2,tmp_reg);
+ free_register (tmp_reg);
+ }
+# else
i_mulud_r_r (reg_1,reg_2);
- } else if (graph->instruction_code==GDIVDU){
+# endif
+ } else
+#ifndef THREAD32
+ if (graph->instruction_code==GDIVDU){
ADDRESS ad_3;
linearize_3_graphs (graph->instruction_parameters[0].p,&ad_1,