From 41440a54ab504b678244a5174bdc4e34a5d4c2c6 Mon Sep 17 00:00:00 2001 From: John van Groningen Date: Thu, 1 Dec 2011 12:32:08 +0000 Subject: implement mulUUL for 32 bit thread safe code --- cglin.c | 37 +++++++++++++++++++++++++++++++++---- 1 file changed, 33 insertions(+), 4 deletions(-) (limited to 'cglin.c') 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, -- cgit v1.2.3