diff options
-rw-r--r-- | cgcalc.c | 5 | ||||
-rw-r--r-- | cgcode.c | 24 | ||||
-rw-r--r-- | cginstructions.c | 4 | ||||
-rw-r--r-- | cglin.c | 24 | ||||
-rw-r--r-- | cgstack.c | 6 |
5 files changed, 56 insertions, 7 deletions
@@ -1439,6 +1439,11 @@ static void calculate_store_x_operator (INSTRUCTION_GRAPH graph) case GFREGISTER: select_graph=select_graph->instruction_parameters[3].p; break; +#if defined (G_A64) + case GFROMF: + select_graph=select_graph->instruction_parameters[0].p; + break; +#endif default: internal_error_in_function ("calculate_store_x_operator"); } @@ -3756,7 +3756,9 @@ void code_jmp (char label_name[]) if (test_bit (vector,parameter_n)) if (n_a_and_f_registers<N_FLOAT_PARAMETER_REGISTERS){ ++n_a_and_f_registers; +#ifndef G_A64 ++parameter_n; +#endif } else break; } @@ -4073,7 +4075,9 @@ static int too_many_b_stack_parameters_for_registers (int b_stack_size,int n_dat if (demanded_vector[offset>>LOG_VECTOR_ELEMENT_SIZE] & (((ULONG)1)<<(offset & VECTOR_ELEMENT_MASK))){ if (++n_float_registers>n_float_parameter_registers) break; +#ifndef G_A64 ++offset; +#endif } else if (++n_data_registers>n_data_parameter_registers) break; @@ -6328,6 +6332,19 @@ static void code_r_replace (int a_size,int b_size) continue; } } +#else + if (graph_4->instruction_code==GFROMF){ + INSTRUCTION_GRAPH graph_5,graph_6,graph_7; + + graph_5=graph_4->instruction_parameters[0].p; + graph_6=g_fload_x (graph_1,offset+((a_size+i)<<STACK_ELEMENT_LOG_SIZE),0,graph_3); + graph_1=g_fstore_x (graph_5,graph_1,offset+((a_size+i)<<STACK_ELEMENT_LOG_SIZE),0,graph_3); + + graph_7=g_fromf (graph_6); + + s_put_b (i,graph_7); + continue; + } #endif graph_5=g_load_x (graph_1,offset+((a_size+i)<<STACK_ELEMENT_LOG_SIZE),0,graph_3); @@ -6573,7 +6590,9 @@ void code_rtn (void) if (local_demanded_vector[offset>>LOG_VECTOR_ELEMENT_SIZE] & (((ULONG)1)<<(offset & VECTOR_ELEMENT_MASK))){ if (++n_float_registers>n_float_parameter_registers) break; +#ifndef G_A64 ++offset; +#endif } else if (++n_data_registers>n_data_parameter_registers) break; @@ -6603,8 +6622,11 @@ void code_rtn (void) n_data_parameter_registers=n_data_registers; if (n_float_registers>n_float_parameter_registers) n_float_registers=n_float_parameter_registers; +#ifndef G_A64 return_address_offset=n_data_registers+(n_float_registers<<1); - +#else + return_address_offset=n_data_registers+n_float_registers; +#endif graph=s_get_b (b_stack_size); for (offset=b_stack_size-1; offset>=return_address_offset; --offset) s_put_b (offset+1,s_get_b (offset)); diff --git a/cginstructions.c b/cginstructions.c index 1d98737..f4cf7ce 100644 --- a/cginstructions.c +++ b/cginstructions.c @@ -445,9 +445,7 @@ INSTRUCTION_GRAPH g_fp_arg (INSTRUCTION_GRAPH graph_1) previous_loadx=&load_indexed_list; - /* added 25-10-2001 */ while (*previous_loadx!=NULL && *previous_loadx!=graph_1) - /* while (*previous_loadx!=graph_1) */ previous_loadx=&(*previous_loadx)->instruction_parameters[3].p; fload_graph=g_new_node (GFLOAD_X,0,4*sizeof (union instruction_parameter)); @@ -457,9 +455,7 @@ INSTRUCTION_GRAPH g_fp_arg (INSTRUCTION_GRAPH graph_1) fload_graph->instruction_parameters[2].p=graph_1->instruction_parameters[2].p; fload_graph->instruction_parameters[3].p=graph_1->instruction_parameters[3].p; - /* added 25-10-2001 */ if (*previous_loadx!=NULL) - /* */ *previous_loadx=fload_graph; fload_graph->instruction_d_min_a_cost+=1; @@ -4529,6 +4529,20 @@ static void linearize_load_graph (register INSTRUCTION_GRAPH load_graph) case GFREGISTER: case GGFREGISTER: break; +#if defined (G_A64) + case GFROMF: + load_graph=load_graph->instruction_parameters[0].p; + if (load_graph->node_count>0 && load_graph->instruction_code==GFLOAD){ + int reg; + + reg=get_fregister(); + + i_fmove_id_fr (load_graph->instruction_parameters[0].i,load_graph->instruction_parameters[1].i,reg); + + float_register_node (load_graph,reg); + } + break; +#endif default: internal_error_in_function ("linearize_load_graph"); } @@ -5056,7 +5070,9 @@ static void move_float_ad_x (ADDRESS *ad_p,int offset,int areg,int dreg) } else { # endif i_move_id_x (ad_p->ad_offset,ad_p->ad_register,offset,areg,dreg); +# ifndef G_A64 i_move_id_x (ad_p->ad_offset+4,ad_p->ad_register,offset+(4<<2),areg,dreg); +# endif if (--*ad_p->ad_count_p==0) free_aregister (ad_p->ad_register); # ifdef M68000 @@ -7622,7 +7638,7 @@ static int selects_from_array (INSTRUCTION_GRAPH select_graph,INSTRUCTION_GRAPH static void do_array_selects_before_update (INSTRUCTION_GRAPH select_graph,INSTRUCTION_GRAPH graph_1,INSTRUCTION_GRAPH graph_2) { - for (; select_graph!=NULL; select_graph=select_graph->instruction_parameters[3].p){ + for (; select_graph!=NULL; ){ switch (select_graph->instruction_code){ case GLOAD_X: #if 1 @@ -7733,9 +7749,15 @@ static void do_array_selects_before_update (INSTRUCTION_GRAPH select_graph,INSTR #endif case GGREGISTER: break; +#if defined (G_A64) + case GFROMF: + select_graph=select_graph->instruction_parameters[0].p; + continue; +#endif default: internal_error_in_function ("do_array_selects_before_update"); } + select_graph=select_graph->instruction_parameters[3].p; } } @@ -1057,7 +1057,11 @@ static void b_stack_load_register_values (int n_parameters,ULONG vector[],int n_ #ifdef MORE_PARAMETER_REGISTERS + n_extra_data_parameter_registers #endif +#ifndef G_A64 : (mc68881_flag && number_of_f_register_parameters_m_2++<(N_FLOAT_PARAMETER_REGISTERS<<1))) +#else + : (mc68881_flag && number_of_f_register_parameters_m_2++<N_FLOAT_PARAMETER_REGISTERS)) +#endif { if (*element_p!=NULL && (*element_p)->b_stack_offset==required_offset){ register struct b_stack *element; @@ -1069,7 +1073,7 @@ static void b_stack_load_register_values (int n_parameters,ULONG vector[],int n_ element->b_stack_load_graph=graph; } element_p=&(*element_p)->b_stack_next; - } else{ + } else { graph=g_load ((required_offset+global_block.block_graph_b_stack_begin_displacement)<<STACK_ELEMENT_LOG_SIZE,B_STACK_POINTER); new_element=allocate_struct_from_heap (b_stack); |