diff options
author | John van Groningen | 2006-05-31 11:05:44 +0000 |
---|---|---|
committer | John van Groningen | 2006-05-31 11:05:44 +0000 |
commit | 73a3291f2dac8090a61e58c596b8a3d6dac296e0 (patch) | |
tree | 761f865fdd7913ddeda1e585282ce7af427d5504 /cginstructions.c | |
parent | fix printing of integers of more than 32 bits (diff) |
pass floating point parameters in registers in ccall for AI64
Diffstat (limited to 'cginstructions.c')
-rw-r--r-- | cginstructions.c | 60 |
1 files changed, 36 insertions, 24 deletions
diff --git a/cginstructions.c b/cginstructions.c index f39a79c..8605143 100644 --- a/cginstructions.c +++ b/cginstructions.c @@ -2441,13 +2441,16 @@ void code_ccall (char *c_function_name,char *s,int length) #if defined (sparc) || defined (G_POWER) int c_parameter_n; # ifdef G_POWER - int c_offset,c_fp_parameter_n; + int c_offset; # endif #elif defined (I486) int c_offset; #else error ("ABC instruction 'ccall' not implemented"); #endif +#if defined (G_POWER) || defined (G_A64) + int c_fp_parameter_n; +#endif function_address_parameter=0; @@ -2781,7 +2784,7 @@ void code_ccall (char *c_function_name,char *s,int length) i_fmove_id_fr (b_o,B_STACK_REGISTER,1+c_fp_parameter_n-14); } else { # ifdef LINUX_ELF - error_s ("Passing more than 8 fp register not implemented (in '%s')",c_function_name); + error_s ("Passing more than 8 fp registers not implemented (in '%s')",c_function_name); # else i_move_id_r (b_o,B_STACK_REGISTER,REGISTER_A3); i_move_r_id (REGISTER_A3,(FIRST_C_STACK_PARAMETER_WORD_OFFSET+c_parameter_n++)<<2,SP_REGISTER); @@ -3226,7 +3229,8 @@ void code_ccall (char *c_function_name,char *s,int length) # else /* G_AI64 */ a_o=-b_result_offset-a_result_offset; b_o=0; - + c_fp_parameter_n=0; + if (a_result_offset+b_result_offset>b_offset){ i_sub_i_r (a_result_offset+b_result_offset-b_offset,B_STACK_POINTER); c_offset=a_result_offset+b_result_offset; @@ -3449,26 +3453,29 @@ void code_ccall (char *c_function_name,char *s,int length) } break; case 'R': - { - int temp_register; - b_o-=8; - if (c_parameter_n>2 || n_c_parameters<=2) - temp_register=REGISTER_A1; - else if ((used_clean_b_parameter_registers & 1)==0) - temp_register=REGISTER_D0; - else if ((used_clean_b_parameter_registers & 2)==0) - temp_register=REGISTER_D1; - else if ((used_clean_b_parameter_registers & 4)==0) - temp_register=REGISTER_D2; - else - error_s (ccall_error_string,c_function_name); - - i_move_id_r (b_o+c_offset_before_pushing_arguments,REGISTER_RBP,temp_register); - i_move_r_pd (temp_register,B_STACK_POINTER); - c_offset+=8; + if (c_fp_parameter_n<8){ + i_fmove_id_fr (b_o+c_offset_before_pushing_arguments,REGISTER_RBP,c_fp_parameter_n); + ++c_fp_parameter_n; + } else { + int temp_register; + + if (c_parameter_n>2 || n_c_parameters<=2) + temp_register=REGISTER_A1; + else if ((used_clean_b_parameter_registers & 1)==0) + temp_register=REGISTER_D0; + else if ((used_clean_b_parameter_registers & 2)==0) + temp_register=REGISTER_D1; + else if ((used_clean_b_parameter_registers & 4)==0) + temp_register=REGISTER_D2; + else + error_s (ccall_error_string,c_function_name); + + i_move_id_r (b_o+c_offset_before_pushing_arguments,REGISTER_RBP,temp_register); + i_move_r_pd (temp_register,B_STACK_POINTER); + c_offset+=8; + } break; - } case 'S': case 's': case 'A': @@ -3689,9 +3696,14 @@ void code_ccall (char *c_function_name,char *s,int length) break; case 'R': b_o-=8; - i_move_id_r (b_o+c_offset_before_pushing_arguments,REGISTER_RBP,REGISTER_A0); - i_move_r_pd (REGISTER_A0,B_STACK_POINTER); - c_offset+=8; + if (c_fp_parameter_n<8){ + i_fmove_id_fr (b_o+c_offset_before_pushing_arguments,REGISTER_RBP,c_fp_parameter_n); + ++c_fp_parameter_n; + } else { + i_move_id_r (b_o+c_offset_before_pushing_arguments,REGISTER_RBP,REGISTER_A0); + i_move_r_pd (REGISTER_A0,B_STACK_POINTER); + c_offset+=8; + } break; case 'S': if (--c_parameter_n<4){ |