From 72468b1a690d7b363d4afa2c7152084032739e7b Mon Sep 17 00:00:00 2001 From: John van Groningen Date: Wed, 27 Jun 2007 12:02:13 +0000 Subject: add real, string and unboxed array of int and real for centry on win64 --- cginstructions.c | 98 ++++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 78 insertions(+), 20 deletions(-) diff --git a/cginstructions.c b/cginstructions.c index eb8e747..7655206 100644 --- a/cginstructions.c +++ b/cginstructions.c @@ -4213,6 +4213,14 @@ static void restore_registers_after_c_call (void) #endif } +#ifdef I486 +# ifdef G_AI64 +# define REGISTER_EBP_OR_RBP (-5) +# else +# define REGISTER_EBP_OR_RBP (-3) +# endif +#endif + void code_centry (char *c_function_name,char *clean_function_label,char *s,int length) { #if defined (I486) || defined (G_POWER) @@ -4259,7 +4267,7 @@ void code_centry (char *c_function_name,char *clean_function_label,char *s,int l c=s[i]; if (c=='I') ++n_integer_parameters; -#if defined (I486) && !defined (G_A64) +#if defined (I486) else if (c=='R'){ ++n_float_parameters; float_parameter_or_result=1; @@ -4287,7 +4295,7 @@ void code_centry (char *c_function_name,char *clean_function_label,char *s,int l else if (c=='I'){ integer_c_function_result=1; ++n_integer_results; -#if defined (I486) && !defined (G_A64) +#if defined (I486) } else if (c=='R'){ float_c_function_result=1; ++n_float_results; @@ -4316,7 +4324,7 @@ void code_centry (char *c_function_name,char *clean_function_label,char *s,int l c=s[i]; if (c=='I') ++n_integer_results; -#if defined (I486) && !defined (G_A64) +#if defined (I486) else if (c=='R'){ ++n_float_results; float_parameter_or_result=1; @@ -4409,11 +4417,49 @@ void code_centry (char *c_function_name,char *clean_function_label,char *s,int l save_registers_before_c_call(); -#if defined (I486) && !defined (G_A64) +#if defined (G_AI64) + if (n_string_or_array_parameters!=0){ + int register_n; + + for (i=first_parameter_index,register_n=0; i=first_parameter_index; --i){ char c; @@ -4471,11 +4517,15 @@ 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 defined (I486) if (n_string_or_array_parameters!=0){ int i,offset; +# if defined (G_A64) + offset=18+1+(n_integer_and_float_parameters+n_string_or_array_parameters-1); +# else offset=5+1+(n_integer_and_float_parameters+n_string_or_array_parameters-1); +# endif for (i=colon_index-1; i>=first_parameter_index; --i){ char c; @@ -4485,7 +4535,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=='R'){ s_push_b (s_get_b (offset)); +# if !defined (G_A64) s_push_b (s_get_b (offset)); +# endif } else if (c=='S'){ --offset; } else if (c=='i' || c=='r'){ @@ -4496,17 +4548,23 @@ void code_centry (char *c_function_name,char *clean_function_label,char *s,int l } } else #endif - for (n=0; n=n_integer_parameters-4) - s_push_b (g_g_register (REGISTER_A0-((n_integer_parameters-1)-n))); - else - s_push_b (s_get_b (18+1+4+(n_integer_parameters-4-1))); + if (n>=n_integer_and_float_parameters-4){ + int register_n; + + register_n = (n_integer_and_float_parameters-1)-n; + if (s[first_parameter_index+register_n]!='R') + s_push_b (g_g_register (REGISTER_A0-register_n)); + else + s_push_b (g_fromf (g_fregister (register_n))); + } else + s_push_b (s_get_b (18+1+4+(n_integer_and_float_parameters-4-1))); # else - s_push_b (s_get_b (5+1+(n_integer_and_float_parameters-1))); + s_push_b (s_get_b (5+1+(n_integer_and_float_parameters-1))); # endif #endif @@ -4642,25 +4700,25 @@ void code_centry (char *c_function_name,char *clean_function_label,char *s,int l while (i