summaryrefslogtreecommitdiff
path: root/cgpas.c
diff options
context:
space:
mode:
authorJohn van Groningen2004-06-11 12:59:19 +0000
committerJohn van Groningen2004-06-11 12:59:19 +0000
commit3218d61b531ac02b23b852b27e263795aee3f918 (patch)
tree42709152e80abeac09e6858cc1370c7beaaf95c6 /cgpas.c
parentimprove 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.c18
1 files changed, 15 insertions, 3 deletions
diff --git a/cgpas.c b/cgpas.c
index a537926..eeed99e 100644
--- a/cgpas.c
+++ b/cgpas.c
@@ -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);