diff options
author | John van Groningen | 2004-06-11 12:59:19 +0000 |
---|---|---|
committer | John van Groningen | 2004-06-11 12:59:19 +0000 |
commit | 3218d61b531ac02b23b852b27e263795aee3f918 (patch) | |
tree | 42709152e80abeac09e6858cc1370c7beaaf95c6 /cgpas.c | |
parent | improve code generation for xor on processors other than the M68000 (diff) |
use transition vector for calling functions with ccall "F"
Diffstat (limited to 'cgpas.c')
-rw-r--r-- | cgpas.c | 18 |
1 files changed, 15 insertions, 3 deletions
@@ -1849,8 +1849,16 @@ static void as_jsr_instruction (struct instruction *instruction) frame_size=instruction->instruction_parameters[1].parameter_data.i; - if (parameter0->parameter_type==P_REGISTER) + if (parameter0->parameter_type==P_REGISTER){ +#ifdef G_MACH_O as_mtctr (parameter0->parameter_data.reg.r); +#else + as_lwz (REGISTER_O1,0,parameter0->parameter_data.reg.r); + as_stw (RTOC,20-(frame_size+28),B_STACK_POINTER); + as_lwz (RTOC,4,parameter0->parameter_data.reg.r); + as_mtctr (REGISTER_O1); +#endif + } if (!(instruction->instruction_arity & NO_MFLR)) as_mflr (REGISTER_R0); @@ -1868,6 +1876,11 @@ static void as_jsr_instruction (struct instruction *instruction) #endif if (parameter0->parameter_type==P_REGISTER){ as_bctrl(); +#ifdef G_MACH_O + as_nop(); +#else + as_lwz (RTOC,20,B_STACK_POINTER); +#endif } else { struct label *label; @@ -1908,10 +1921,9 @@ static void as_jsr_instruction (struct instruction *instruction) } #endif as_branch_label (label,BRANCH_RELOCATION); + as_nop(); } - as_nop(); - #ifdef ALIGN_C_CALLS as_lwz (REGISTER_R0,frame_size-4,B_STACK_POINTER); as_lwz (B_STACK_POINTER,0,B_STACK_POINTER); |