summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--lisc/emit.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/lisc/emit.c b/lisc/emit.c
index 8a9983f..ab7a72a 100644
--- a/lisc/emit.c
+++ b/lisc/emit.c
@@ -83,10 +83,16 @@ Next:
 			break;
 		case RSlot:
 		Slot: {
+			int off;
 			struct { int i:14; } x = {ref.val}; /* fixme */
 			assert(NAlign == 3);
-			assert(fn->slot >= x.i);
-			fprintf(f, "%d(%%rbp)", -4 * (fn->slot - x.i));
+			if (x.i < 0)
+				off = -4 * x.i;
+			else {
+				assert(fn->slot >= x.i);
+				off = -4 * (fn->slot - x.i);
+			}
+			fprintf(f, "%d(%%rbp)", off);
 			break;
 		}
 		case RCon: