summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cgcode.c9
-rw-r--r--cgstack.c30
-rw-r--r--cgstack.h4
3 files changed, 43 insertions, 0 deletions
diff --git a/cgcode.c b/cgcode.c
index a0f8f2a..9bb620e 100644
--- a/cgcode.c
+++ b/cgcode.c
@@ -6599,6 +6599,8 @@ void code_rtn (void)
if (n_data_registers>n_data_parameter_registers)
n_data_registers=n_data_parameter_registers;
+ else if (n_data_registers<n_data_parameter_registers)
+ n_data_parameter_registers=n_data_registers;
if (n_float_registers>n_float_parameter_registers)
n_float_registers=n_float_parameter_registers;
return_address_offset=n_data_registers+(n_float_registers<<1);
@@ -6641,9 +6643,16 @@ void code_rtn (void)
#ifndef I486
if (return_with_rts){
#endif
+
+#ifdef I486
+ b_offset+=
+ end_basic_block_with_registers_and_return_address_and_return_b_stack_offset
+ (a_stack_size,b_stack_size,local_demanded_vector,n_data_parameter_registers);
+#else
b_offset+=
end_basic_block_with_registers_and_return_b_stack_offset
(a_stack_size,b_stack_size,local_demanded_vector,N_ADDRESS_PARAMETER_REGISTERS);
+#endif
#if ! (defined (sparc) || defined (G_POWER))
if (b_offset!=0)
diff --git a/cgstack.c b/cgstack.c
index d3d07be..9be4718 100644
--- a/cgstack.c
+++ b/cgstack.c
@@ -4298,6 +4298,36 @@ void generate_code_for_previous_blocks (int jmp_jsr_or_rtn_flag)
}
}
+#ifdef I486
+int end_basic_block_with_registers_and_return_address_and_return_b_stack_offset
+ (int n_a_parameters,int n_b_parameters,ULONG vector[],int n_data_parameter_registers)
+{
+ int b_stack_offset;
+
+ a_stack_load_register_values (n_a_parameters,N_ADDRESS_PARAMETER_REGISTERS);
+ b_stack_load_register_values (n_b_parameters,vector,n_data_parameter_registers
+# ifdef MORE_PARAMETER_REGISTERS
+ ,N_ADDRESS_PARAMETER_REGISTERS-n_a_parameters
+# endif
+ );
+
+ generate_code_for_previous_blocks (1);
+
+ a_stack_stores (n_a_parameters,N_ADDRESS_PARAMETER_REGISTERS);
+ b_stack_stores (n_b_parameters,vector,n_data_parameter_registers
+# ifdef MORE_PARAMETER_REGISTERS
+ ,N_ADDRESS_PARAMETER_REGISTERS-n_a_parameters,
+ global_block.block_graph_a_register_parameter_node,global_block.block_graph_d_register_parameter_node
+# endif
+ );
+
+ linearize_stack_graphs();
+ b_stack_offset=local_register_allocation_and_adjust_a_stack_pointer (0);
+
+ return b_stack_offset;
+}
+#endif
+
int end_basic_block_with_registers_and_return_b_stack_offset (int n_a_parameters,int n_b_parameters,ULONG vector[],int n_address_parameter_registers)
{
int b_stack_offset;
diff --git a/cgstack.h b/cgstack.h
index e47f8b5..1f45fb2 100644
--- a/cgstack.h
+++ b/cgstack.h
@@ -39,6 +39,10 @@ extern void insert_basic_block_with_extra_parameters_on_stack (int block_graph_k
extern void adjust_stack_pointers (VOID);
extern void end_basic_block_with_registers (int n_a_parameters,int n_b_parameters,ULONG vector[]);
+#ifdef I486
+extern int end_basic_block_with_registers_and_return_address_and_return_b_stack_offset
+ (int n_a_parameters,int n_b_parameters,ULONG vector[],int n_data_parameter_registers);
+#endif
extern int end_basic_block_with_registers_and_return_b_stack_offset
(int n_a_parameters,int n_b_parameters,ULONG vector[],int n_adress_parameter_registers);
extern void end_stack_elements (int n_a_parameters,int n_b_parameters,ULONG vector[]);