+// For simplicity, we assume that SIZEOF_DOUBLE == 2*SIZEOF_VOID_P
+// on a 64-bit machine, we'll end up wasting a couple of words, but
+// it's not a big deal.
+
+#define RESTORE_EVERYTHING \
+ L1 = PK_Word64(Sp+19); \
+ D2 = PK_DBL(Sp+17); \
+ D1 = PK_DBL(Sp+15); \
+ F4 = PK_FLT(Sp+14); \
+ F3 = PK_FLT(Sp+13); \
+ F2 = PK_FLT(Sp+12); \
+ F1 = PK_FLT(Sp+11); \
+ R8.w = Sp[10]; \
+ R7.w = Sp[9]; \
+ R6.w = Sp[8]; \
+ R5.w = Sp[7]; \
+ R4.w = Sp[6]; \
+ R3.w = Sp[5]; \
+ R2.w = Sp[4]; \
+ R1.w = Sp[3]; \
+ Sp += 21;
+
+#define RET_OFFSET (-19)
+
+#define SAVE_EVERYTHING \
+ Sp -= 21; \
+ ASSIGN_Word64(Sp+19,L1); \
+ ASSIGN_DBL(Sp+17,D2); \
+ ASSIGN_DBL(Sp+15,D1); \
+ ASSIGN_FLT(Sp+14,F4); \
+ ASSIGN_FLT(Sp+13,F3); \
+ ASSIGN_FLT(Sp+12,F2); \
+ ASSIGN_FLT(Sp+11,F1); \
+ Sp[10] = R8.w; \
+ Sp[9] = R7.w; \
+ Sp[8] = R6.w; \
+ Sp[7] = R5.w; \
+ Sp[6] = R4.w; \
+ Sp[5] = R3.w; \
+ Sp[4] = R2.w; \
+ Sp[3] = R1.w; \
+ Sp[2] = R10.w; /* return address */ \
+ Sp[1] = R9.w; /* liveness mask */ \
+ Sp[0] = (W_)&stg_gc_gen_info; \
+
+INFO_TABLE_RET( stg_gc_gen_info, stg_gc_gen_ret,
+ 0/*bitmap*/,
+ 0/*SRT*/, 0/*SRT_OFF*/, 0/*SRT_BITMAP*/,
+ RET_DYN,, EF_, 0, 0);
+
+/* bitmap in the above info table is unused, the real one is on the stack.
+ */