* src/vm/jit/code.c (code_get_stack_frame_size): Implement stack alignment
[cacao.git] / src / vm / jit / code.c
index 5297c32e032676a7e5bff3052e2010eda90ab4bc..dc7cd96c6cbf78341564d8e11e61924d4658df5d 100644 (file)
@@ -151,6 +151,8 @@ int code_get_stack_frame_size(codeinfo *code)
        
        assert(code);
 
+       /* slots allocated by register allocator plus saved registers */
+
 #ifdef HAS_4BYTE_STACKSLOT
        count = code->memuse + code->savedintcount + 2*code->savedfltcount;
 #else
@@ -158,14 +160,25 @@ int code_get_stack_frame_size(codeinfo *code)
 #endif
 
        /* add slots needed in synchronized methods */
+
        count += code_get_sync_slot_count(code);
 
+       /* keep stack aligned */
+
 #if defined(__X86_64__)
-       /* keep stack 16-byte aligned */
+       /* the x86_64 codegen only aligns the stack in non-leaf methods */
        if (!code->isleafmethod || opt_verbosecall)
                count |= 1; /* even when return address is added */
 #endif
 
+       /* XXX align stack on alpha */
+#if defined(__MIPS__)
+       if (code->isleafmethod)
+               count = (count + 1) & ~1;
+       else
+               count |= 1; /* even when return address is added */
+#endif
+
 #if defined(__POWERPC__)
        /* keep stack 16-byte aligned */
        count = (count + 3) & ~3;