diff options
-rw-r--r-- | cgcode.c | 9 | ||||
-rw-r--r-- | cgstack.c | 30 | ||||
-rw-r--r-- | cgstack.h | 4 |
3 files changed, 43 insertions, 0 deletions
@@ -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) @@ -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; @@ -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[]); |