summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cgcalc.c5
-rw-r--r--cgcode.c24
-rw-r--r--cginstructions.c4
-rw-r--r--cglin.c24
-rw-r--r--cgstack.c6
5 files changed, 56 insertions, 7 deletions
diff --git a/cgcalc.c b/cgcalc.c
index 1d3c291..6287cf2 100644
--- a/cgcalc.c
+++ b/cgcalc.c
@@ -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");
}
diff --git a/cgcode.c b/cgcode.c
index 9bb620e..8602702 100644
--- a/cgcode.c
+++ b/cgcode.c
@@ -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;
diff --git a/cglin.c b/cglin.c
index eb3991f..56e7ed8 100644
--- a/cglin.c
+++ b/cglin.c
@@ -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;
}
}
diff --git a/cgstack.c b/cgstack.c
index 9be4718..e99df94 100644
--- a/cgstack.c
+++ b/cgstack.c
@@ -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);