From 158655aaa283c0e8d0b1cad6f732f01e54eb70f6 Mon Sep 17 00:00:00 2001 From: John van Groningen Date: Fri, 5 Mar 2004 11:36:14 +0000 Subject: implement tuple result for centry on IA32 --- cginstructions.c | 73 ++++++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 52 insertions(+), 21 deletions(-) diff --git a/cginstructions.c b/cginstructions.c index d5bf7a6..d1da2b3 100644 --- a/cginstructions.c +++ b/cginstructions.c @@ -3099,7 +3099,7 @@ void code_centry (char *c_function_name,char *clean_function_label,char *s,int l #if defined (I486) || defined (G_POWER) struct block_label *new_label; LABEL *label; - int i,n,n_integer_parameters,n_integer_results,callee_pops_arguments; + int i,n,n_integer_parameters,n_integer_results,integer_c_function_result,callee_pops_arguments; if (saved_heap_p_label==NULL) saved_heap_p_label=enter_label ("saved_heap_p",IMPORT_LABEL); @@ -3116,6 +3116,7 @@ void code_centry (char *c_function_name,char *clean_function_label,char *s,int l callee_pops_arguments=1; } + integer_c_function_result=0; while (ilabel_arity=0; cycle_in_spine_label->label_descriptor=EMPTY_label; } - i_lea_l_i_r (cycle_in_spine_label,0,REGISTER_A5); } else { if (reserve_label==NULL){ @@ -3317,7 +3330,34 @@ void code_centry (char *c_function_name,char *clean_function_label,char *s,int l code_jsr (clean_function_label); #endif - code_o (0,1,i_vector); + { + int result_n,result_pointer_parameter_offset,n_data_parameter_registers; + + result_pointer_parameter_offset=20+4+(n_integer_parameters<<2); + if (n_integer_results-integer_c_function_result>N_DATA_PARAMETER_REGISTERS) + result_pointer_parameter_offset+=(n_integer_results-integer_c_function_result-N_DATA_PARAMETER_REGISTERS)<<2; + + n_data_parameter_registers=n_integer_results; + if (n_data_parameter_registers>N_DATA_PARAMETER_REGISTERS) + n_data_parameter_registers=N_DATA_PARAMETER_REGISTERS; + + for (result_n=integer_c_function_result; result_nn_data_parameter_registers) + i_add_i_r ((n_integer_results-n_data_parameter_registers)<<2,B_STACK_POINTER); + + if (integer_c_function_result && n_data_parameter_registers>1) + i_move_r_r (n_data_parameter_registers-1,0); + } + + code_o (0,integer_c_function_result,i_vector); # if defined (I486) i_move_r_l (-4/*ESI*/,saved_a_stack_p_label); @@ -3356,27 +3396,19 @@ void code_centry (char *c_function_name,char *clean_function_label,char *s,int l i_add_i_r (offset,B_STACK_POINTER); } # endif - - /* - code_d (0,1,i_vector); - code_rtn(); - */ { int b_offset,a_stack_size,b_stack_size; - ULONG *local_demanded_vector; a_stack_size=0; - b_stack_size=1; - local_demanded_vector=i_vector; + b_stack_size=integer_c_function_result; #if ! (defined (sparc)) b_offset=0; #else b_offset=4; #endif - - 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); + b_offset+=end_basic_block_with_registers_and_return_b_stack_offset (a_stack_size,b_stack_size,i_vector,N_ADDRESS_PARAMETER_REGISTERS); #if ! (defined (sparc) || defined (G_POWER)) if (b_offset!=0) @@ -3384,7 +3416,6 @@ void code_centry (char *c_function_name,char *clean_function_label,char *s,int l i_add_i_r (b_offset,B_STACK_POINTER); else i_sub_i_r (-b_offset,B_STACK_POINTER); - # ifdef I486 if (callee_pops_arguments && n_integer_parameters>0) i_rts_i (n_integer_parameters<<2); -- cgit v1.2.3