- } else {
- if (src->flags & INMEMORY) {
- i386_alu_imm_membase(cd, ALU_CMP, 0, REG_SP, src->regoff * 4);
+ /* mark trace code */
+
+ M_NOP;
+
+ /* keep stack 16-byte aligned */
+
+ M_ASUB_IMM(4 + 4 + 8, REG_SP);
+
+ /* save return value */
+
+ switch (md->returntype.type) {
+ case TYPE_ADR:
+ case TYPE_INT:
+ M_IST(REG_RESULT, REG_SP, 2 * 4);
+ break;
+ case TYPE_LNG:
+ M_LST(REG_RESULT_PACKED, REG_SP, 2 * 4);
+ break;
+ case TYPE_FLT:
+ M_FSTNP(REG_NULL, REG_SP, 2 * 4);
+ break;
+ case TYPE_DBL:
+ M_DSTNP(REG_NULL, REG_SP, 2 * 4);
+ break;
+ }
+
+ M_AST_IMM(m, REG_SP, 0 * 4);
+ M_AST(REG_SP, REG_SP, 1 * 4);
+ M_IADD_IMM_MEMBASE(2 * 4, REG_SP, 1 * 4);
+ M_MOV_IMM(trace_java_call_exit, REG_ITMP1);
+ M_CALL(REG_ITMP1);
+
+ /* restore return value */
+
+ switch (md->returntype.type) {
+ case TYPE_ADR:
+ case TYPE_INT:
+ M_ILD(REG_RESULT, REG_SP, 2 * 4);
+ break;
+ case TYPE_LNG:
+ M_LLD(REG_RESULT_PACKED, REG_SP, 2 * 4);
+ break;
+ }
+
+ M_AADD_IMM(4 + 4 + 8, REG_SP);
+
+ /* mark trace code */
+
+ M_NOP;
+}
+#endif /* !defined(NDEBUG) */