summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn van Groningen2010-12-07 12:18:10 +0000
committerJohn van Groningen2010-12-07 12:18:10 +0000
commit456b13d4092017e99a13cde10be3f602ab1e280f (patch)
tree5e494f428969c3081b16913bed20db175c533bc3
parentfix saving and restoring global state for ccall G on 64 bit linux (diff)
fix centry on 64 bit linux for the first 4 int arguments,
to do: fix other centry's on this platform
-rw-r--r--cginstructions.c30
1 files changed, 28 insertions, 2 deletions
diff --git a/cginstructions.c b/cginstructions.c
index 941c016..13d6402 100644
--- a/cginstructions.c
+++ b/cginstructions.c
@@ -5038,9 +5038,15 @@ static void save_registers_before_clean_call (void)
i_sub_i_r (144,B_STACK_POINTER);
i_move_r_id (-6/*RSI*/,136,B_STACK_POINTER);
+# ifdef LINUX_ELF
+ i_move_r_r (-6/*RSI*/,3/*R11*/);
+# endif
i_move_l_r (saved_a_stack_p_label,-6/*RSI*/);
i_move_r_id (-7/*RDI*/,128,B_STACK_POINTER);
+# ifdef LINUX_ELF
+ i_move_r_r (-7/*RDI*/,2/*R10*/);
+# endif
i_lea_l_i_r (saved_heap_p_label,0,-7/*RDI*/);
i_move_r_id ( 7/*R15*/,80,B_STACK_POINTER);
i_move_id_r (8,-7/*RDI*/,REGISTER_D7);
@@ -5051,12 +5057,15 @@ static void save_registers_before_clean_call (void)
i_move_r_id ( 4/*R12*/,104,B_STACK_POINTER);
i_move_r_id ( 5/*R13*/,96,B_STACK_POINTER);
i_move_r_id ( 6/*R14*/,88,B_STACK_POINTER);
+
+# ifndef LINUX_ELF
{
int i;
-
+ /* to do: save all 128 bits, because calling convention has been changed */
for (i=6; i<16; ++i)
i_fmove_fr_id (i,(15-i)<<3,B_STACK_POINTER);
}
+# endif
# else
i_sub_i_r (20,B_STACK_POINTER);
@@ -5114,12 +5123,14 @@ static void restore_registers_after_clean_call (void)
i_move_id_r (104,B_STACK_POINTER, 4/*R12*/);
i_move_id_r ( 96,B_STACK_POINTER, 5/*R13*/);
i_move_id_r ( 88,B_STACK_POINTER, 6/*R14*/);
+# ifndef LINUX_ELF
{
int i;
-
+ /* to do: save all 128 bits, because calling convention has been changed */
for (i=6; i<16; ++i)
i_fmove_id_fr ((15-i)<<3,B_STACK_POINTER,i);
}
+# endif
i_add_i_r (144,B_STACK_POINTER);
# else
i_move_r_l (-4/*ESI*/,saved_a_stack_p_label);
@@ -5506,7 +5517,22 @@ void code_centry (char *c_function_name,char *clean_function_label,char *s,int l
register_n = (n_integer_and_float_parameters-1)-n;
if (s[first_parameter_index+register_n]!='R')
+# ifdef LINUX_ELF
+ {
+ switch (register_n){
+ case 0: register_n= 2/*R10 was RDI*/; break;
+ case 1: register_n= 3/*R11 was RSI*/; break;
+ case 2: register_n=-2/*RDX*/; break;
+ case 3: register_n=-1/*RCX*/; break;
+ case 4: register_n=-3/*R8*/; break;
+ case 5: register_n=-4/*R9*/; break;
+ default: error ("error in centry");
+ }
+ s_push_b (g_g_register (register_n));
+ }
+# else
s_push_b (g_g_register (REGISTER_A0-register_n));
+# endif
else
s_push_b (g_fromf (g_fregister (register_n)));
} else