summary refs log tree commit diff
path: root/rv64
diff options
context:
space:
mode:
authorQuentin Carbonneaux <quentin@c9x.me>2022-02-27 11:26:50 +0100
committerQuentin Carbonneaux <quentin@c9x.me>2022-02-27 11:27:55 +0100
commit457e568ce9deb0476062fe89383f9a9a6f706e0a (patch)
tree8d99c491c37cb30fe982a15c12c388c9ac42f7bb /rv64
parentddd101df6622ed38736d8600e72f8a18b4e964bf (diff)
downloadroux-457e568ce9deb0476062fe89383f9a9a6f706e0a.tar.gz
rv64: formatting and bug fix in epilogue
Diffstat (limited to 'rv64')
-rw-r--r--rv64/emit.c68
1 files changed, 48 insertions, 20 deletions
diff --git a/rv64/emit.c b/rv64/emit.c
index b34b424..841c555 100644
--- a/rv64/emit.c
+++ b/rv64/emit.c
@@ -104,11 +104,13 @@ static char *rname[] = {
 	[T6] = "t6",
 	[T0] = "t0", "t1", "t2", "t3", "t4", "t5",
 	[A0] = "a0", "a1", "a2", "a3", "a4", "a5", "a6", "a7",
-	[S1] = "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10", "s11",
-
-	[FT0] = "ft0", "ft1", "ft2", "ft3", "ft4", "ft5", "ft6", "ft7", "ft8", "ft9", "ft10", "ft11",
+	[S1] = "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8",
+	       "s9", "s10", "s11",
+	[FT0] = "ft0", "ft1", "ft2", "ft3", "ft4", "ft5", "ft6", "ft7",
+	        "ft8", "ft9", "ft10", "ft11",
 	[FA0] = "fa0", "fa1", "fa2", "fa3", "fa4", "fa5", "fa6", "fa7",
-	[FS0] = "fs0", "fs1", "fs2", "fs3", "fs4", "fs5", "fs6", "fs7", "fs8", "fs9", "fs10", "fs11",
+	[FS0] = "fs0", "fs1", "fs2", "fs3", "fs4", "fs5", "fs6", "fs7",
+	        "fs8", "fs9", "fs10", "fs11",
 };
 
 static int64_t
@@ -184,7 +186,7 @@ emitf(char *s, Ins *i, Fn *fn, FILE *f)
 			case RCon:
 				pc = &fn->con[r.val];
 				assert(pc->type == CBits);
-				assert(pc->bits.i >= -2048 && pc->bits.i <= 2047);
+				assert(pc->bits.i >= -2048 && pc->bits.i < 2048);
 				fprintf(f, "%d", (int)pc->bits.i);
 				break;
 			}
@@ -414,37 +416,50 @@ rv64_emitfn(Fn *fn, FILE *f)
 	gasemitlnk(fn->name, &fn->lnk, ".text", f);
 
 	if (fn->vararg) {
-		/* TODO: only need space for registers unused by named arguments */
+		/* TODO: only need space for registers
+		 * unused by named arguments
+		 */
 		fprintf(f, "\tadd sp, sp, -64\n");
-		for (r = A0; r <= A7; r++)
-			fprintf(f, "\tsd %s, %d(sp)\n", rname[r], 8 * (r - A0));
+		for (r=A0; r<=A7; r++)
+			fprintf(f,
+				"\tsd %s, %d(sp)\n",
+				rname[r], 8 * (r - A0)
+			);
 	}
 	fprintf(f, "\tsd fp, -16(sp)\n");
 	fprintf(f, "\tsd ra, -8(sp)\n");
 	fprintf(f, "\tadd fp, sp, -16\n");
 
 	frame = (16 + 4 * fn->slot + 15) & ~15;
-	for (pr = rv64_rclob; *pr>=0; pr++) {
+	for (pr=rv64_rclob; *pr>=0; pr++) {
 		if (fn->reg & BIT(*pr))
 			frame += 8;
 	}
 	frame = (frame + 15) & ~15;
 
 	if (frame <= 2048)
-		fprintf(f, "\tadd sp, sp, -%d\n", frame);
+		fprintf(f,
+			"\tadd sp, sp, -%d\n",
+			frame
+		);
 	else
 		fprintf(f,
 			"\tli t6, %d\n"
 			"\tsub sp, sp, t6\n",
-			frame);
-	for (pr = rv64_rclob, off = 0; *pr >= 0; pr++) {
+			frame
+		);
+	for (pr=rv64_rclob, off=0; *pr>=0; pr++) {
 		if (fn->reg & BIT(*pr)) {
-			fprintf(f, "\t%s %s, %d(sp)\n", *pr < FT0 ? "sd" : "fsd", rname[*pr], off);
+			fprintf(f,
+				"\t%s %s, %d(sp)\n",
+				*pr < FT0 ? "sd" : "fsd",
+				rname[*pr], off
+			);
 			off += 8;
 		}
 	}
 
-	for (lbl = 0, b = fn->start; b; b=b->link) {
+	for (lbl=0, b=fn->start; b; b=b->link) {
 		if (lbl || b->npred > 1)
 			fprintf(f, ".L%d:\n", id0+b->id);
 		for (i=b->ins; i!=&b->ins[b->nins]; i++)
@@ -454,16 +469,24 @@ rv64_emitfn(Fn *fn, FILE *f)
 		case Jret0:
 			if (fn->dynalloc) {
 				if (frame - 16 <= 2048)
-					fprintf(f, "\tadd sp, fp, -%d\n", frame - 16);
+					fprintf(f,
+						"\tadd sp, fp, -%d\n",
+						frame - 16
+					);
 				else
 					fprintf(f,
 						"\tli t6, %d\n"
-						"\tsub sp, sp, t6\n",
-						frame - 16);
+						"\tsub sp, fp, t6\n",
+						frame - 16
+					);
 			}
-			for (pr = rv64_rclob, off = 0; *pr >= 0; pr++) {
+			for (pr=rv64_rclob, off=0; *pr>=0; pr++) {
 				if (fn->reg & BIT(*pr)) {
-					fprintf(f, "\t%s %s, %d(sp)\n", *pr < FT0 ? "ld" : "fld", rname[*pr], off);
+					fprintf(f,
+						"\t%s %s, %d(sp)\n",
+						*pr < FT0 ? "ld" : "fld",
+						rname[*pr], off
+					);
 					off += 8;
 				}
 			}
@@ -491,7 +514,12 @@ rv64_emitfn(Fn *fn, FILE *f)
 				neg = 1;
 			}
 			assert(isreg(b->jmp.arg));
-			fprintf(f, "\tb%sz %s, .L%d\n", neg ? "ne" : "eq", rname[b->jmp.arg.val], id0+b->s2->id);
+			fprintf(f,
+				"\tb%sz %s, .L%d\n",
+				neg ? "ne" : "eq",
+				rname[b->jmp.arg.val],
+				id0+b->s2->id
+			);
 			goto Jmp;
 		}
 	}