From df80d62f5224141d5695b66fa3246774cdc56f79 Mon Sep 17 00:00:00 2001 From: John van Groningen Date: Fri, 20 Nov 2015 10:49:26 +0000 Subject: add support for 'O' in centry on ARM --- cginstructions.c | 65 ++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 63 insertions(+), 2 deletions(-) diff --git a/cginstructions.c b/cginstructions.c index e5b7714..64200bd 100644 --- a/cginstructions.c +++ b/cginstructions.c @@ -5464,7 +5464,7 @@ void code_ccall (char *c_function_name,char *s,int length) #elif defined (ARM) { - int c_offset_before_pushing_arguments,function_address_reg,c_parameter_n; + int c_offset_before_pushing_arguments,function_address_reg,function_address_s_index,c_parameter_n; a_o=-b_result_offset-a_result_offset; b_o=0; @@ -5550,6 +5550,15 @@ void code_ccall (char *c_function_name,char *s,int length) if (--c_parameter_n_1>=4) c_offset_1+=STACK_ELEMENT_SIZE; break; + case 'O': + case 'F': + case '*': + case ']': + while (l>=0 && (s[l]!='F' && s[l]!='O')) + --l; + if (--c_parameter_n_1>=4) + c_offset_1+=STACK_ELEMENT_SIZE; + break; } } @@ -5589,6 +5598,19 @@ void code_ccall (char *c_function_name,char *s,int length) if (--c_parameter_n_2>=4) c_offset_2-=STACK_ELEMENT_SIZE; break; + case 'O': + case 'F': + case '*': + case ']': + while (l>=0 && (s[l]!='F' && s[l]!='O')) + --l; + if (--c_parameter_n_2<4){ + if (l<=last_register_parameter_index){ + new_reg [4-c_parameter_n_2] = n_extra_clean_b_register_parameters+reg_n; + ++reg_n; + } + } + break; } } @@ -5660,6 +5682,25 @@ void code_ccall (char *c_function_name,char *s,int length) } a_o+=STACK_ELEMENT_SIZE; break; + case 'O': + case 'F': + case '*': + case ']': + while (l>=0 && (s[l]!='F' && s[l]!='O')) + --l; + if (--c_parameter_n<4){ + if (l<=last_register_parameter_index){ + /* i_move_r_r (REGISTER_D0+n_extra_clean_b_register_parameters+reg_n,REGISTER_D4-c_parameter_n); */ + ++reg_n; + } else { + b_o-=STACK_ELEMENT_SIZE; + i_move_id_r (b_o+c_offset_before_pushing_arguments,REGISTER_A2,REGISTER_D4-c_parameter_n); + } + + function_address_reg = REGISTER_D4-c_parameter_n; + function_address_s_index = l+1; + break; + } default: error_s (ccall_error_string,c_function_name); } @@ -5676,8 +5717,28 @@ void code_ccall (char *c_function_name,char *s,int length) if (!function_address_parameter) i_call_l (label); - else + else { + int l; + + for (l=function_address_s_index; l