* Merged with default branch at rev 16f3633aaa5a.
[cacao.git] / src / vm / jit / powerpc / codegen.c
index ee92412d180e7a2e22c0fe2005945ae7f01035d4..5c7f3195c27a2ab07056eb7753d289ac21106df4 100644 (file)
@@ -2990,6 +2990,17 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f)
 
        emit_verbosecall_enter(jd);
 
+#if defined(ENABLE_GC_CACAO)
+       /* Save callee saved integer registers in stackframeinfo (GC may
+          need to recover them during a collection). */
+
+       disp = cd->stackframesize * 4 - sizeof(stackframeinfo) +
+               OFFSET(stackframeinfo, intregs);
+
+       for (i = 0; i < INT_SAV_CNT; i++)
+               M_AST(abi_registers_integer_saved[i], REG_SP, disp + i * 4);
+#endif
+
        /* save integer and float argument registers */
 
        for (i = 0; i < md->paramcount; i++) {
@@ -3166,6 +3177,17 @@ void codegen_emit_stub_native(jitdata *jd, methoddesc *nmd, functionptr f)
                break;
        }
 
+#if defined(ENABLE_GC_CACAO)
+       /* Restore callee saved integer registers from stackframeinfo (GC
+          might have modified them during a collection). */
+        
+       disp = cd->stackframesize * 4 - sizeof(stackframeinfo) +
+               OFFSET(stackframeinfo, intregs);
+
+       for (i = 0; i < INT_SAV_CNT; i++)
+               M_ALD(abi_registers_integer_saved[i], REG_SP, disp + i * 4);
+#endif
+
        M_ALD(REG_ITMP2_XPC, REG_SP, cd->stackframesize * 8 + LA_LR_OFFSET);
        M_MTLR(REG_ITMP2_XPC);
        M_LDA(REG_SP, REG_SP, cd->stackframesize * 8); /* remove stackframe       */