From 4f4600038f8b2f3e5ac8afba053b0fb3e53005f2 Mon Sep 17 00:00:00 2001 From: John van Groningen Date: Tue, 27 Feb 2007 14:01:31 +0000 Subject: pass {#Int} and {#Real} using centry, add {#Int} and {#Real} results for ccall --- cginstructions.c | 227 +++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 177 insertions(+), 50 deletions(-) diff --git a/cginstructions.c b/cginstructions.c index 942d1d0..b2c2b20 100644 --- a/cginstructions.c +++ b/cginstructions.c @@ -58,8 +58,9 @@ extern int offered_b_stack_size; extern LABEL *enter_label (char *label_name,int label_flags); extern LABEL *new_local_label (int label_flags); -extern LABEL * system_sp_label,*new_int_reducer_label,*channelP_label,*stop_reducer_label, - *send_request_label,*send_graph_label,*string_to_string_node_label; +extern LABEL * system_sp_label, + *string_to_string_node_label,*int_array_to_node_label,*real_array_to_node_label, + *new_int_reducer_label,*channelP_label,*stop_reducer_label,*send_request_label,*send_graph_label; #if defined (I486) || defined (G_POWER) LABEL *saved_heap_p_label,*saved_a_stack_p_label; @@ -2566,6 +2567,15 @@ void code_ccall (char *c_function_name,char *s,int length) case 'S': a_result_offset+=STACK_ELEMENT_SIZE; continue; + case 'A': + ++l; + if (l=first_parameter_index; --i){ char c; @@ -4162,11 +4245,31 @@ void code_centry (char *c_function_name,char *clean_function_label,char *s,int l else if (c=='R') offset-=8; else if (c=='S'){ + if (string_to_string_node_label==NULL) + string_to_string_node_label=enter_label ("string_to_string_node",IMPORT_LABEL); offset-=STACK_ELEMENT_SIZE; i_move_id_r (offset,B_STACK_POINTER,REGISTER_A0); i_jsr_l (string_to_string_node_label,0); i_move_r_id (REGISTER_A0,0,A_STACK_POINTER); i_add_i_r (STACK_ELEMENT_SIZE,A_STACK_POINTER); + } else if (c=='i'){ + --i; + if (int_array_to_node_label==NULL) + int_array_to_node_label=enter_label ("int_array_to_node",IMPORT_LABEL); + offset-=STACK_ELEMENT_SIZE; + i_move_id_r (offset,B_STACK_POINTER,REGISTER_A0); + i_jsr_l (int_array_to_node_label,0); + i_move_r_id (REGISTER_A0,0,A_STACK_POINTER); + i_add_i_r (STACK_ELEMENT_SIZE,A_STACK_POINTER); + } else if (c=='r'){ + --i; + if (real_array_to_node_label==NULL) + real_array_to_node_label=enter_label ("real_array_to_node",IMPORT_LABEL); + offset-=STACK_ELEMENT_SIZE; + i_move_id_r (offset,B_STACK_POINTER,REGISTER_A0); + i_jsr_l (real_array_to_node_label,0); + i_move_r_id (REGISTER_A0,0,A_STACK_POINTER); + i_add_i_r (STACK_ELEMENT_SIZE,A_STACK_POINTER); } else break; } @@ -4190,12 +4293,12 @@ void code_centry (char *c_function_name,char *clean_function_label,char *s,int l init_b_stack (0,e_vector); #if defined (I486) && !defined (G_A64) - if (n_string_parameters!=0){ + if (n_string_or_array_parameters!=0){ int i,offset; - offset=5+1+(n_integer_and_float_parameters+n_string_parameters-1); + offset=5+1+(n_integer_and_float_parameters+n_string_or_array_parameters-1); - for (i=first_parameter_index; i=first_parameter_index; --i){ char c; c=s[i]; @@ -4206,6 +4309,9 @@ void code_centry (char *c_function_name,char *clean_function_label,char *s,int l s_push_b (s_get_b (offset)); } else if (c=='S'){ --offset; + } else if (c=='i' || c=='r'){ + --i; + --offset; } else error ("error in centry"); } @@ -4242,7 +4348,7 @@ void code_centry (char *c_function_name,char *clean_function_label,char *s,int l vector_p[i]=0; } - if (n_float_parameters>0){ + if (n_float_parameters!=0){ int i,offset; i=first_parameter_index; @@ -4261,12 +4367,17 @@ void code_centry (char *c_function_name,char *clean_function_label,char *s,int l vector_p[offset>>LOG_SMALL_VECTOR_SIZE] |= (1<< (offset & MASK_SMALL_VECTOR_SIZE)); ++offset; #endif - } else break; + } else if (c=='S') + ; + else if (c=='A') + ++i; + else + break; ++i; } } - code_d (n_string_parameters,n_integer_and_float_parameters,vector_p); + code_d (n_string_or_array_parameters,n_integer_and_float_parameters,vector_p); #ifdef G_POWER /* @@ -4315,12 +4426,12 @@ void code_centry (char *c_function_name,char *clean_function_label,char *s,int l #endif { - int result_pointer_parameter_offset,n_data_results_registers,n_float_results_registers,n_string_results_registers; + int result_pointer_parameter_offset,n_data_results_registers,n_float_results_registers,n_string_or_array_results_registers; #ifdef G_AI64 - result_pointer_parameter_offset=((18+1+4+n_integer_and_float_parameters+n_string_parameters-4)<N_DATA_PARAMETER_REGISTERS) result_pointer_parameter_offset+=(n_integer_results-integer_c_function_result-N_DATA_PARAMETER_REGISTERS)<N_FLOAT_PARAMETER_REGISTERS) n_float_results_registers=N_FLOAT_PARAMETER_REGISTERS; - n_string_results_registers=n_string_results; - if (n_string_results_registers>N_ADDRESS_PARAMETER_REGISTERS) - n_string_results_registers=N_ADDRESS_PARAMETER_REGISTERS; + n_string_or_array_results_registers=n_string_or_array_results; + if (n_string_or_array_results_registers>N_ADDRESS_PARAMETER_REGISTERS) + n_string_or_array_results_registers=N_ADDRESS_PARAMETER_REGISTERS; { - int i,data_result_n,float_result_n,result_offset,string_result_n; + int i,data_result_n,float_result_n,result_offset,string_or_array_result_n; float_result_n=float_c_function_result; data_result_n=integer_c_function_result; - string_result_n=string_c_function_result; + string_or_array_result_n=string_or_array_c_function_result; i=first_result_index; result_offset=0; @@ -4377,16 +4488,30 @@ void code_centry (char *c_function_name,char *clean_function_label,char *s,int l } else if (c=='S'){ int reg_n; - if (string_result_n1) i_move_r_r (n_data_results_registers-1,0); } else if (string_c_function_result) - i_lea_id_r (4,REGISTER_A0,REGISTER_D0); + i_lea_id_r (STACK_ELEMENT_SIZE,REGISTER_A0,REGISTER_D0); + else if (array_c_function_result) + i_lea_id_r (STACK_ELEMENT_SIZE*3,REGISTER_A0,REGISTER_D0); } if (!float_c_function_result) - code_o (0,integer_c_function_result+string_c_function_result,i_vector); + code_o (0,integer_c_function_result+string_or_array_c_function_result,i_vector); else #ifdef G_A64 code_o (0,float_c_function_result,r_vector); @@ -4498,7 +4625,7 @@ void code_centry (char *c_function_name,char *clean_function_label,char *s,int l int b_offset,a_stack_size,b_stack_size; a_stack_size=0; - b_stack_size=string_c_function_result+integer_c_function_result; + b_stack_size=string_or_array_c_function_result+integer_c_function_result; #ifdef G_A64 b_stack_size+=float_c_function_result; #else @@ -4520,8 +4647,8 @@ void code_centry (char *c_function_name,char *clean_function_label,char *s,int l else i_sub_i_r (-b_offset,B_STACK_POINTER); # ifdef I486 - if (callee_pops_arguments && n_integer_and_float_parameters+n_string_parameters>0) - i_rts_i ((n_integer_and_float_parameters+n_string_parameters)<<2); + if (callee_pops_arguments && n_integer_and_float_parameters+n_string_or_array_parameters>0) + i_rts_i ((n_integer_and_float_parameters+n_string_or_array_parameters)<<2); else # endif i_rts(); -- cgit v1.2.3