From 8f3bcaa8589450b24dde1685ebab3e1c75b451ff Mon Sep 17 00:00:00 2001 From: John van Groningen Date: Fri, 12 Jan 2007 14:38:46 +0000 Subject: add centry support for strings --- cginstructions.c | 160 +++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 127 insertions(+), 33 deletions(-) diff --git a/cginstructions.c b/cginstructions.c index a76f315..942d1d0 100644 --- a/cginstructions.c +++ b/cginstructions.c @@ -3932,19 +3932,23 @@ 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,callee_pops_arguments,n_integer_and_float_parameters,first_parameter_index,first_result_index; + int i,n,callee_pops_arguments,n_integer_and_float_parameters; + int first_parameter_index,colon_index,first_result_index; int n_integer_parameters,n_integer_results,integer_c_function_result; int n_float_parameters,n_float_results,float_c_function_result; - + int n_string_parameters,n_string_results,string_c_function_result; + if (saved_heap_p_label==NULL) saved_heap_p_label=enter_label ("saved_heap_p",IMPORT_LABEL); if (saved_a_stack_p_label==NULL) saved_a_stack_p_label=enter_label ("saved_a_stack_p",IMPORT_LABEL); - + n_integer_parameters=0; n_float_parameters=0; + n_string_parameters=0; n_integer_results=0; n_float_results=0; + n_string_results=0; i=0; callee_pops_arguments=0; @@ -3952,21 +3956,27 @@ void code_centry (char *c_function_name,char *clean_function_label,char *s,int l i=1; callee_pops_arguments=1; } - + integer_c_function_result=0; float_c_function_result=0; + string_c_function_result=0; first_parameter_index=i; - + while (i=first_parameter_index; --i){ + char c; + + c=s[i]; + if (c=='I') + offset-=STACK_ELEMENT_SIZE; + else if (c=='R') + offset-=8; + else if (c=='S'){ + 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 + break; + } + } +#endif + if (last_block->block_labels==NULL) last_block->block_labels=new_label; else @@ -4132,7 +4180,7 @@ void code_centry (char *c_function_name,char *clean_function_label,char *s,int l last_block_label=new_label; begin_new_basic_block(); - + last_block->block_begin_module=0; last_block->block_link_module=1; @@ -4141,6 +4189,28 @@ void code_centry (char *c_function_name,char *clean_function_label,char *s,int l init_a_stack (0); init_b_stack (0,e_vector); +#if defined (I486) && !defined (G_A64) + if (n_string_parameters!=0){ + int i,offset; + + offset=5+1+(n_integer_and_float_parameters+n_string_parameters-1); + + for (i=first_parameter_index; iN_DATA_PARAMETER_REGISTERS) result_pointer_parameter_offset+=(n_integer_results-integer_c_function_result-N_DATA_PARAMETER_REGISTERS)<N_FLOAT_PARAMETER_REGISTERS) result_pointer_parameter_offset+=(n_float_results-float_c_function_result-N_FLOAT_PARAMETER_REGISTERS)<<3; - n_data_parameter_registers=n_integer_results; - if (n_data_parameter_registers>N_DATA_PARAMETER_REGISTERS) - n_data_parameter_registers=N_DATA_PARAMETER_REGISTERS; + n_data_results_registers=n_integer_results; + if (n_data_results_registers>N_DATA_PARAMETER_REGISTERS) + n_data_results_registers=N_DATA_PARAMETER_REGISTERS; - n_float_parameter_registers=n_float_results; - if (n_float_parameter_registers>N_FLOAT_PARAMETER_REGISTERS) - n_float_parameter_registers=N_FLOAT_PARAMETER_REGISTERS; + n_float_results_registers=n_float_results; + if (n_float_results_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; { - int i,data_result_n,float_result_n,result_offset; + int i,data_result_n,float_result_n,result_offset,string_result_n; float_result_n=float_c_function_result; data_result_n=integer_c_function_result; + string_result_n=string_c_function_result; + i=first_result_index; result_offset=0; while (i1) - i_move_r_r (n_data_parameter_registers-1,0); + if (integer_c_function_result){ + if (n_data_results_registers>1) + 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); } if (!float_c_function_result) - code_o (0,integer_c_function_result,i_vector); + code_o (0,integer_c_function_result+string_c_function_result,i_vector); else #ifdef G_A64 code_o (0,float_c_function_result,r_vector); @@ -4405,10 +4498,11 @@ 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; #ifdef G_A64 - b_stack_size=integer_c_function_result+float_c_function_result; + b_stack_size+=float_c_function_result; #else - b_stack_size=integer_c_function_result+(float_c_function_result<<1); + b_stack_size+=float_c_function_result<<1; #endif #if ! (defined (sparc)) @@ -4426,8 +4520,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>0) - i_rts_i (n_integer_and_float_parameters<<2); + 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); else # endif i_rts(); -- cgit v1.2.3