boot2

Playing with the boostrap
git clone https://git.ryansepassi.com/git/boot2.git
Log | Files | Refs

commit b024f5b4fca4986de572255327cb70230dd51001
parent 13564bfed1d3e4f66117aeaf9a24138c72696475
Author: Ryan Sepassi <rsepassi@gmail.com>
Date:   Fri, 24 Apr 2026 13:33:54 -0700

Fold LA_BR into branch/call/tail at P1.M1pp layer

The portable P1 spec keeps LA_BR explicit because it makes the
target-materialization step uniform across backends. The P1.M1pp
ergonomic layer doesn't owe users that uniformity, so collapse the
two-step "load branch target / consume" pattern into single macros
that take the label as an argument:

  %b(target), %call(target), %tail(target)
  %beq(ra, rb, target), %bne, %blt, %bltu
  %beqz(ra, target), %bnez, %bltz
  %la(rd, target)

%la_br is gone from the user-facing surface; backend hooks
(%p1_labr, %p1_b, %p1_call, %p1_condb, %p1_tail) are unchanged.
Output binaries are byte-identical for every test fixture on every
backend.

Diffstat:
Mdocs/LIBP1PP.md | 26+++++++++++---------------
Mp1/P1.M1pp | 47++++++++++++++++++++++++++++++++---------------
Mp1/p1pp.P1pp | 621++++++++++++++++++++++++++++---------------------------------------------------
Mtests/p1/double.P1pp | 3+--
Mtests/p1/hello.P1pp | 2+-
Mtests/p1/p1-aliasing.P1pp | 4++--
Mtests/p1/p1-call.P1pp | 10++++------
7 files changed, 266 insertions(+), 447 deletions(-)

diff --git a/docs/LIBP1PP.md b/docs/LIBP1PP.md @@ -199,11 +199,9 @@ explicit labels: :scan_loop ... - LA_BR &scan_end - BEQZ a0 + BEQZ a0, &scan_end ... - LA_BR &scan_loop - B + B &scan_loop :scan_end ### Tagged loops: `%loop_tag`, `%while_tag_<cc>`, `%for_lt_tag` @@ -211,7 +209,7 @@ explicit labels: > Tagged loops predate M1PP's `%scope` feature. They still work, but new > code should prefer the scoped equivalents (`%loop_scoped`, > `%while_scoped_<cc>`, `%for_lt_scoped`) paired with the generic -> `%break()` / `%continue()` — no tag argument required. +> `%break` / `%continue` — no tag argument required. M1PP's `@` local-label mechanism is scoped to the defining macro's body: an `&@name` token passed to a macro through an argument is not stamped and @@ -242,13 +240,12 @@ for `%loop_tag`, `tag_top` names the head of the body. %break(tag) -Emits `LA_BR &tag_end; B`. Transfers control out of the enclosing -tagged loop. +Emits `B &tag_end`. Transfers control out of the enclosing tagged loop. %continue(tag) -Emits `LA_BR &tag_top; B`. Transfers control to the enclosing tagged -loop's re-test / increment point. +Emits `B &tag_top`. Transfers control to the enclosing tagged loop's +re-test / increment point. Both `%break` and `%continue` work from arbitrary depth inside a tagged loop, including inside `%if_<cc>`, `%ifelse_<cc>`, or another nested @@ -307,7 +304,7 @@ frame-local storage. Expands to: - a matching `%endscope`. `%fn` is a scope-introducing-with-block macro: it pushes the scope -`name` around `body`. Any `%break()` / `%continue()` directly in `body` +`name` around `body`. Any `%break` / `%continue` directly in `body` would target `name__end` / `name__top` — which `%fn` itself does not define, so those should only appear inside a nested scope-introducing loop. @@ -320,8 +317,7 @@ Example: ST a0, [sp + %parse_f.state] ST a1, [sp + %parse_f.cursor] ... - LA_BR &::done - BEQZ t0 + BEQZ t0, &::done ... ::done LD a0, [sp + %parse_f.state] @@ -540,9 +536,9 @@ invariant violations. Each macro asserts that the named condition holds and calls `panic` with `msg_label` (a NUL-terminated string label in the program image) if it -does not. They lower to one `%if_<cc_inverse>` containing a -`LA a0, msg_label` / `LA_BR &panic` / `CALL` sequence, so the non-failure -path adds no runtime cost beyond the original branch. +does not. They lower to a `B<cc>` past an `LA a0, msg_label` / +`CALL &panic` sequence, so the non-failure path adds no runtime cost +beyond the original branch. Because the failure path issues a `CALL`, `%assert_*` may be used only in functions that have established a frame with `ENTER`. diff --git a/p1/P1.M1pp b/p1/P1.M1pp @@ -13,12 +13,9 @@ %p1_li(rd) %endm -%macro la(rd) +%macro la(rd, target) %p1_la(rd) -%endm - -%macro la_br() -%p1_labr() +target %endm # ---- Moves ---------------------------------------------------------------- @@ -123,7 +120,9 @@ # ---- Branching ------------------------------------------------------------ -%macro b() +%macro b(target) +%p1_labr() +target %p1_b() %endm @@ -131,37 +130,53 @@ %p1_br(rs) %endm -%macro beq(ra, rb) +%macro beq(ra, rb, target) +%p1_labr() +target %p1_condb(BEQ, ra, rb) %endm -%macro bne(ra, rb) +%macro bne(ra, rb, target) +%p1_labr() +target %p1_condb(BNE, ra, rb) %endm -%macro blt(ra, rb) +%macro blt(ra, rb, target) +%p1_labr() +target %p1_condb(BLT, ra, rb) %endm -%macro bltu(ra, rb) +%macro bltu(ra, rb, target) +%p1_labr() +target %p1_condb(BLTU, ra, rb) %endm -%macro beqz(ra) +%macro beqz(ra, target) +%p1_labr() +target %p1_condbz(BEQZ, ra) %endm -%macro bnez(ra) +%macro bnez(ra, target) +%p1_labr() +target %p1_condbz(BNEZ, ra) %endm -%macro bltz(ra) +%macro bltz(ra, target) +%p1_labr() +target %p1_condbz(BLTZ, ra) %endm # ---- Calls, returns, and frames ------------------------------------------ -%macro call() +%macro call(target) +%p1_labr() +target %p1_call() %endm @@ -173,7 +188,9 @@ %p1_ret() %endm -%macro tail() +%macro tail(target) +%p1_labr() +target %p1_tail() %endm diff --git a/p1/p1pp.P1pp b/p1/p1pp.P1pp @@ -22,70 +22,56 @@ # ---- %if_<cc> ----------------------------------------------------------- %macro if_eq(ra, rb, body) -%la_br() &@body -%beq(ra, rb) -%la_br() &@end -%b() +%beq(ra, rb, &@body) +%b(&@end) :@body body :@end %endm %macro if_ne(ra, rb, body) -%la_br() &@body -%bne(ra, rb) -%la_br() &@end -%b() +%bne(ra, rb, &@body) +%b(&@end) :@body body :@end %endm %macro if_lt(ra, rb, body) -%la_br() &@body -%blt(ra, rb) -%la_br() &@end -%b() +%blt(ra, rb, &@body) +%b(&@end) :@body body :@end %endm %macro if_ltu(ra, rb, body) -%la_br() &@body -%bltu(ra, rb) -%la_br() &@end -%b() +%bltu(ra, rb, &@body) +%b(&@end) :@body body :@end %endm %macro if_eqz(ra, body) -%la_br() &@body -%beqz(ra) -%la_br() &@end -%b() +%beqz(ra, &@body) +%b(&@end) :@body body :@end %endm %macro if_nez(ra, body) -%la_br() &@body -%bnez(ra) -%la_br() &@end -%b() +%bnez(ra, &@body) +%b(&@end) :@body body :@end %endm %macro if_ltz(ra, body) -%la_br() &@body -%bltz(ra) -%la_br() &@end -%b() +%bltz(ra, &@body) +%b(&@end) :@body body :@end @@ -94,77 +80,63 @@ body # ---- %ifelse_<cc> ------------------------------------------------------- %macro ifelse_eq(ra, rb, tblk, fblk) -%la_br() &@tblk -%beq(ra, rb) +%beq(ra, rb, &@tblk) fblk -%la_br() &@end -%b() +%b(&@end) :@tblk tblk :@end %endm %macro ifelse_ne(ra, rb, tblk, fblk) -%la_br() &@tblk -%bne(ra, rb) +%bne(ra, rb, &@tblk) fblk -%la_br() &@end -%b() +%b(&@end) :@tblk tblk :@end %endm %macro ifelse_lt(ra, rb, tblk, fblk) -%la_br() &@tblk -%blt(ra, rb) +%blt(ra, rb, &@tblk) fblk -%la_br() &@end -%b() +%b(&@end) :@tblk tblk :@end %endm %macro ifelse_ltu(ra, rb, tblk, fblk) -%la_br() &@tblk -%bltu(ra, rb) +%bltu(ra, rb, &@tblk) fblk -%la_br() &@end -%b() +%b(&@end) :@tblk tblk :@end %endm %macro ifelse_eqz(ra, tblk, fblk) -%la_br() &@tblk -%beqz(ra) +%beqz(ra, &@tblk) fblk -%la_br() &@end -%b() +%b(&@end) :@tblk tblk :@end %endm %macro ifelse_nez(ra, tblk, fblk) -%la_br() &@tblk -%bnez(ra) +%bnez(ra, &@tblk) fblk -%la_br() &@end -%b() +%b(&@end) :@tblk tblk :@end %endm %macro ifelse_ltz(ra, tblk, fblk) -%la_br() &@tblk -%bltz(ra) +%bltz(ra, &@tblk) fblk -%la_br() &@end -%b() +%b(&@end) :@tblk tblk :@end @@ -177,73 +149,59 @@ tblk # branch at entry. %macro while_eq(ra, rb, body) -%la_br() &@test -%b() +%b(&@test) :@body body :@test -%la_br() &@body -%beq(ra, rb) +%beq(ra, rb, &@body) %endm %macro while_ne(ra, rb, body) -%la_br() &@test -%b() +%b(&@test) :@body body :@test -%la_br() &@body -%bne(ra, rb) +%bne(ra, rb, &@body) %endm %macro while_lt(ra, rb, body) -%la_br() &@test -%b() +%b(&@test) :@body body :@test -%la_br() &@body -%blt(ra, rb) +%blt(ra, rb, &@body) %endm %macro while_ltu(ra, rb, body) -%la_br() &@test -%b() +%b(&@test) :@body body :@test -%la_br() &@body -%bltu(ra, rb) +%bltu(ra, rb, &@body) %endm %macro while_eqz(ra, body) -%la_br() &@test -%b() +%b(&@test) :@body body :@test -%la_br() &@body -%beqz(ra) +%beqz(ra, &@body) %endm %macro while_nez(ra, body) -%la_br() &@test -%b() +%b(&@test) :@body body :@test -%la_br() &@body -%bnez(ra) +%bnez(ra, &@body) %endm %macro while_ltz(ra, body) -%la_br() &@test -%b() +%b(&@test) :@body body :@test -%la_br() &@body -%bltz(ra) +%bltz(ra, &@body) %endm # ---- %do_while_<cc> ---------------------------------------------------- @@ -251,64 +209,55 @@ body %macro do_while_eq(ra, rb, body) :@body body -%la_br() &@body -%beq(ra, rb) +%beq(ra, rb, &@body) %endm %macro do_while_ne(ra, rb, body) :@body body -%la_br() &@body -%bne(ra, rb) +%bne(ra, rb, &@body) %endm %macro do_while_lt(ra, rb, body) :@body body -%la_br() &@body -%blt(ra, rb) +%blt(ra, rb, &@body) %endm %macro do_while_ltu(ra, rb, body) :@body body -%la_br() &@body -%bltu(ra, rb) +%bltu(ra, rb, &@body) %endm %macro do_while_eqz(ra, body) :@body body -%la_br() &@body -%beqz(ra) +%beqz(ra, &@body) %endm %macro do_while_nez(ra, body) :@body body -%la_br() &@body -%bnez(ra) +%bnez(ra, &@body) %endm %macro do_while_ltz(ra, body) :@body body -%la_br() &@body -%bltz(ra) +%bltz(ra, &@body) %endm # ---- %for_lt ------------------------------------------------------------ %macro for_lt(i_reg, n_reg, body) %li(i_reg) $(0) -%la_br() &@test -%b() +%b(&@test) :@body body %addi(i_reg, i_reg, 1) :@test -%la_br() &@body -%blt(i_reg, n_reg) +%blt(i_reg, n_reg, &@body) %endm # ---- %loop -------------------------------------------------------------- @@ -316,8 +265,7 @@ body %macro loop(body) :@top body -%la_br() &@top -%b() +%b(&@top) %endm # ---- Tagged loops ------------------------------------------------------- @@ -329,110 +277,91 @@ body %macro loop_tag(tag, body) : ## tag ## _top body -%la_br() & ## tag ## _top -%b() +%b(& ## tag ## _top) : ## tag ## _end %endm %macro while_tag_eq(tag, ra, rb, body) -%la_br() & ## tag ## _top -%b() +%b(& ## tag ## _top) :@body body : ## tag ## _top -%la_br() &@body -%beq(ra, rb) +%beq(ra, rb, &@body) : ## tag ## _end %endm %macro while_tag_ne(tag, ra, rb, body) -%la_br() & ## tag ## _top -%b() +%b(& ## tag ## _top) :@body body : ## tag ## _top -%la_br() &@body -%bne(ra, rb) +%bne(ra, rb, &@body) : ## tag ## _end %endm %macro while_tag_lt(tag, ra, rb, body) -%la_br() & ## tag ## _top -%b() +%b(& ## tag ## _top) :@body body : ## tag ## _top -%la_br() &@body -%blt(ra, rb) +%blt(ra, rb, &@body) : ## tag ## _end %endm %macro while_tag_ltu(tag, ra, rb, body) -%la_br() & ## tag ## _top -%b() +%b(& ## tag ## _top) :@body body : ## tag ## _top -%la_br() &@body -%bltu(ra, rb) +%bltu(ra, rb, &@body) : ## tag ## _end %endm %macro while_tag_eqz(tag, ra, body) -%la_br() & ## tag ## _top -%b() +%b(& ## tag ## _top) :@body body : ## tag ## _top -%la_br() &@body -%beqz(ra) +%beqz(ra, &@body) : ## tag ## _end %endm %macro while_tag_nez(tag, ra, body) -%la_br() & ## tag ## _top -%b() +%b(& ## tag ## _top) :@body body : ## tag ## _top -%la_br() &@body -%bnez(ra) +%bnez(ra, &@body) : ## tag ## _end %endm %macro while_tag_ltz(tag, ra, body) -%la_br() & ## tag ## _top -%b() +%b(& ## tag ## _top) :@body body : ## tag ## _top -%la_br() &@body -%bltz(ra) +%bltz(ra, &@body) : ## tag ## _end %endm %macro for_lt_tag(tag, i_reg, n_reg, body) %li(i_reg) $(0) -%la_br() & ## tag ## _test -%b() +%b(& ## tag ## _test) :@body body : ## tag ## _top %addi(i_reg, i_reg, 1) : ## tag ## _test -%la_br() &@body -%blt(i_reg, n_reg) +%blt(i_reg, n_reg, &@body) : ## tag ## _end %endm %macro break(tag) -%la_br() & ## tag ## _end -%b() +%b(& ## tag ## _end) %endm %macro continue(tag) -%la_br() & ## tag ## _top -%b() +%b(& ## tag ## _top) %endm # ========================================================================= @@ -461,65 +390,51 @@ body # enclosing function to have an established frame. %macro assert_eq(ra, rb, msg) -%la_br() &@done -%beq(ra, rb) -%la(a0) & ## msg -%la_br() &panic -%call() +%beq(ra, rb, &@done) +%la(a0, & ## msg) +%call(&panic) :@done %endm %macro assert_ne(ra, rb, msg) -%la_br() &@done -%bne(ra, rb) -%la(a0) & ## msg -%la_br() &panic -%call() +%bne(ra, rb, &@done) +%la(a0, & ## msg) +%call(&panic) :@done %endm %macro assert_lt(ra, rb, msg) -%la_br() &@done -%blt(ra, rb) -%la(a0) & ## msg -%la_br() &panic -%call() +%blt(ra, rb, &@done) +%la(a0, & ## msg) +%call(&panic) :@done %endm %macro assert_ltu(ra, rb, msg) -%la_br() &@done -%bltu(ra, rb) -%la(a0) & ## msg -%la_br() &panic -%call() +%bltu(ra, rb, &@done) +%la(a0, & ## msg) +%call(&panic) :@done %endm %macro assert_eqz(ra, msg) -%la_br() &@done -%beqz(ra) -%la(a0) & ## msg -%la_br() &panic -%call() +%beqz(ra, &@done) +%la(a0, & ## msg) +%call(&panic) :@done %endm %macro assert_nez(ra, msg) -%la_br() &@done -%bnez(ra) -%la(a0) & ## msg -%la_br() &panic -%call() +%bnez(ra, &@done) +%la(a0, & ## msg) +%call(&panic) :@done %endm %macro assert_ltz(ra, msg) -%la_br() &@done -%bltz(ra) -%la(a0) & ## msg -%la_br() &panic -%call() +%bltz(ra, &@done) +%la(a0, & ## msg) +%call(&panic) :@done %endm @@ -535,15 +450,13 @@ body %mov(a3, a0) %li(t0) $(0) ::loop -%la_br() &::done -%beq(t0, a2) +%beq(t0, a2, &::done) %add(t1, a1, t0) %lb(t1, t1, 0) %add(t2, a3, t0) %sb(t1, t2, 0) %addi(t0, t0, 1) -%la_br() &::loop -%b() +%b(&::loop) ::done %mov(a0, a3) %ret() @@ -555,13 +468,11 @@ body %mov(a3, a0) %li(t0) $(0) ::loop -%la_br() &::done -%beq(t0, a2) +%beq(t0, a2, &::done) %add(t1, a3, t0) %sb(a1, t1, 0) %addi(t0, t0, 1) -%la_br() &::loop -%b() +%b(&::loop) ::done %mov(a0, a3) %ret() @@ -572,19 +483,15 @@ body %scope memcmp %li(t0) $(0) ::loop -%la_br() &::eq -%beq(t0, a2) +%beq(t0, a2, &::eq) %add(t1, a0, t0) %lb(t1, t1, 0) %add(t2, a1, t0) %lb(t2, t2, 0) -%la_br() &::lt -%bltu(t1, t2) -%la_br() &::gt -%bltu(t2, t1) +%bltu(t1, t2, &::lt) +%bltu(t2, t1, &::gt) %addi(t0, t0, 1) -%la_br() &::loop -%b() +%b(&::loop) ::lt %li(a0) $(-1) %ret() @@ -602,11 +509,9 @@ body %mov(a1, a0) ::loop %lb(t0, a1, 0) -%la_br() &::done -%beqz(t0) +%beqz(t0, &::done) %addi(a1, a1, 1) -%la_br() &::loop -%b() +%b(&::loop) ::done %sub(a0, a1, a0) %ret() @@ -618,14 +523,11 @@ body ::loop %lb(t0, a0, 0) %lb(t1, a1, 0) -%la_br() &::ne -%bne(t0, t1) -%la_br() &::eq -%beqz(t0) +%bne(t0, t1, &::ne) +%beqz(t0, &::eq) %addi(a0, a0, 1) %addi(a1, a1, 1) -%la_br() &::loop -%b() +%b(&::loop) ::ne %li(a0) $(0) %ret() @@ -640,16 +542,12 @@ body ::loop %lb(t0, a0, 0) %lb(t1, a1, 0) -%la_br() &::lt -%bltu(t0, t1) -%la_br() &::gt -%bltu(t1, t0) -%la_br() &::eq -%beqz(t0) +%bltu(t0, t1, &::lt) +%bltu(t1, t0, &::gt) +%beqz(t0, &::eq) %addi(a0, a0, 1) %addi(a1, a1, 1) -%la_br() &::loop -%b() +%b(&::loop) ::lt %li(a0) $(-1) %ret() @@ -677,12 +575,10 @@ body %li(t0) $(0) %li(t1) $(0) -%la_br() &::after_sign -%beq(a2, a3) +%beq(a2, a3, &::after_sign) %lb(t2, a2, 0) %addi(t2, t2, -45) -%la_br() &::after_sign -%bnez(t2) +%bnez(t2, &::after_sign) %li(t0) $(1) %addi(a2, a2, 1) @@ -690,30 +586,23 @@ body %mov(a1, a2) ::digit_loop -%la_br() &::digits_done -%beq(a2, a3) +%beq(a2, a3, &::digits_done) %lb(t2, a2, 0) %addi(t2, t2, -48) -%la_br() &::digits_done -%bltz(t2) +%bltz(t2, &::digits_done) %li(a0) $(9) -%la_br() &::digits_done -%bltu(a0, t2) +%bltu(a0, t2, &::digits_done) %li(a0) $(10) %mul(t1, t1, a0) %add(t1, t1, t2) %addi(a2, a2, 1) -%la_br() &::digit_loop -%b() +%b(&::digit_loop) ::digits_done -%la_br() &::no_digits -%beq(a2, a1) +%beq(a2, a1, &::no_digits) -%la_br() &::apply_sign -%bnez(t0) -%la_br() &::compute_return -%b() +%bnez(t0, &::apply_sign) +%b(&::compute_return) ::apply_sign %li(a0) $(0) %sub(t1, a0, t1) @@ -741,49 +630,38 @@ body %mov(a1, a2) ::loop -%la_br() &::done -%beq(a2, a3) +%beq(a2, a3, &::done) %lb(t2, a2, 0) %addi(t0, t2, -48) -%la_br() &::check_lower -%bltz(t0) +%bltz(t0, &::check_lower) %li(a0) $(9) -%la_br() &::check_lower -%bltu(a0, t0) -%la_br() &::accept -%b() +%bltu(a0, t0, &::check_lower) +%b(&::accept) ::check_lower %addi(t0, t2, -97) -%la_br() &::check_upper -%bltz(t0) +%bltz(t0, &::check_upper) %li(a0) $(5) -%la_br() &::check_upper -%bltu(a0, t0) +%bltu(a0, t0, &::check_upper) %addi(t0, t0, 10) -%la_br() &::accept -%b() +%b(&::accept) ::check_upper %addi(t0, t2, -65) -%la_br() &::done -%bltz(t0) +%bltz(t0, &::done) %li(a0) $(5) -%la_br() &::done -%bltu(a0, t0) +%bltu(a0, t0, &::done) %addi(t0, t0, 10) ::accept %shli(t1, t1, 4) %or(t1, t1, t0) %addi(a2, a2, 1) -%la_br() &::loop -%b() +%b(&::loop) ::done -%la_br() &::no_digits -%beq(a2, a1) +%beq(a2, a1, &::no_digits) %ld(a0, sp, 0) %sub(a1, a2, a0) %mov(a0, t1) @@ -805,10 +683,8 @@ body %enter(8) %st(a0, sp, 0) -%la_br() &::is_neg -%bltz(a1) -%la_br() &::count -%b() +%bltz(a1, &::is_neg) +%b(&::count) ::is_neg %li(t0) $(45) %sb(t0, a0, 0) @@ -820,11 +696,9 @@ body %li(t1) $(10) ::count_loop %div(t0, t0, t1) -%la_br() &::count_done -%beqz(t0) +%beqz(t0, &::count_done) %addi(a2, a2, 1) -%la_br() &::count_loop -%b() +%b(&::count_loop) ::count_done %add(a3, a0, a2) @@ -832,10 +706,8 @@ body ::dig_loop %addi(a3, a3, -1) %rem(t0, a1, t1) -%la_br() &::neg_digit -%bltz(t0) -%la_br() &::write_digit -%b() +%bltz(t0, &::neg_digit) +%b(&::write_digit) ::neg_digit %li(t2) $(0) %sub(t0, t2, t0) @@ -843,8 +715,7 @@ body %addi(t0, t0, 48) %sb(t0, a3, 0) %div(a1, a1, t1) -%la_br() &::dig_loop -%bnez(a1) +%bnez(a1, &::dig_loop) %ld(t2, sp, 0) %add(a0, a0, a2) @@ -858,8 +729,7 @@ body %enter(8) %st(a0, sp, 0) -%la_br() &::nonzero -%bnez(a1) +%bnez(a1, &::nonzero) %li(t0) $(48) %sb(t0, a0, 0) %li(a0) $(1) @@ -871,8 +741,7 @@ body ::count_loop %addi(a2, a2, 1) %shri(t0, t0, 4) -%la_br() &::count_loop -%bnez(t0) +%bnez(t0, &::count_loop) %add(a3, a0, a2) @@ -880,19 +749,16 @@ body %addi(a3, a3, -1) %andi(t0, a1, 15) %li(t1) $(10) -%la_br() &::is_letter -%bltu(t0, t1) +%bltu(t0, t1, &::is_letter) %addi(t0, t0, -10) %addi(t0, t0, 97) -%la_br() &::write_digit -%b() +%b(&::write_digit) ::is_letter %addi(t0, t0, 48) ::write_digit %sb(t0, a3, 0) %shri(a1, a1, 4) -%la_br() &::dig_loop -%bnez(a1) +%bnez(a1, &::dig_loop) %ld(t2, sp, 0) %add(a0, a0, a2) @@ -910,8 +776,7 @@ body %addi(t0, a0, -48) %li(t1) $(10) %li(a0) $(1) -%la_br() &::done -%bltu(t0, t1) +%bltu(t0, t1, &::done) %li(a0) $(0) ::done %ret() @@ -923,15 +788,12 @@ body %li(t2) $(1) %addi(t0, a0, -48) %li(t1) $(10) -%la_br() &::done -%bltu(t0, t1) +%bltu(t0, t1, &::done) %addi(t0, a0, -97) %li(t1) $(6) -%la_br() &::done -%bltu(t0, t1) +%bltu(t0, t1, &::done) %addi(t0, a0, -65) -%la_br() &::done -%bltu(t0, t1) +%bltu(t0, t1, &::done) %li(t2) $(0) ::done %mov(a0, t2) @@ -943,12 +805,10 @@ body %scope is_space %li(t2) $(1) %addi(t0, a0, -32) -%la_br() &::done -%beqz(t0) +%beqz(t0, &::done) %addi(t0, a0, -9) %li(t1) $(5) -%la_br() &::done -%bltu(t0, t1) +%bltu(t0, t1, &::done) %li(t2) $(0) ::done %mov(a0, t2) @@ -961,11 +821,9 @@ body %li(t2) $(1) %addi(t0, a0, -97) %li(t1) $(26) -%la_br() &::done -%bltu(t0, t1) +%bltu(t0, t1, &::done) %addi(t0, a0, -65) -%la_br() &::done -%bltu(t0, t1) +%bltu(t0, t1, &::done) %li(t2) $(0) ::done %mov(a0, t2) @@ -978,15 +836,12 @@ body %li(t2) $(1) %addi(t0, a0, -48) %li(t1) $(10) -%la_br() &::done -%bltu(t0, t1) +%bltu(t0, t1, &::done) %addi(t0, a0, -97) %li(t1) $(26) -%la_br() &::done -%bltu(t0, t1) +%bltu(t0, t1, &::done) %addi(t0, a0, -65) -%la_br() &::done -%bltu(t0, t1) +%bltu(t0, t1, &::done) %li(t2) $(0) ::done %mov(a0, t2) @@ -1045,8 +900,7 @@ body %li(a0) %p1_sys_exit() %syscall() ::spin -%la_br() &::spin -%b() +%b(&::spin) %endscope # ========================================================================= @@ -1064,19 +918,15 @@ body %mov(s1, a1) ::loop -%la_br() &::done_ok -%beqz(s1) +%beqz(s1, &::done_ok) %li(a0) $(1) %mov(a1, s0) %mov(a2, s1) -%la_br() &sys_write -%call() -%la_br() &::done -%bltz(a0) +%call(&sys_write) +%bltz(a0, &::done) %add(s0, s0, a0) %sub(s1, s1, a0) -%la_br() &::loop -%b() +%b(&::loop) ::done_ok %li(a0) $(0) @@ -1092,19 +942,15 @@ body %mov(s1, a1) ::loop -%la_br() &::done_ok -%beqz(s1) +%beqz(s1, &::done_ok) %li(a0) $(2) %mov(a1, s0) %mov(a2, s1) -%la_br() &sys_write -%call() -%la_br() &::done -%bltz(a0) +%call(&sys_write) +%bltz(a0, &::done) %add(s0, s0, a0) %sub(s1, s1, a0) -%la_br() &::loop -%b() +%b(&::loop) ::done_ok %li(a0) $(0) @@ -1116,16 +962,13 @@ body %fn(println, 16, { %st(s0, sp, 0) -%la_br() &print -%call() +%call(&print) %mov(s0, a0) -%la_br() &::done -%bltz(s0) +%bltz(s0, &::done) -%la(a0) &libp1pp__newline +%la(a0, &libp1pp__newline) %li(a1) $(1) -%la_br() &print -%call() +%call(&print) %mov(s0, a0) ::done @@ -1136,16 +979,13 @@ body %fn(eprintln, 16, { %st(s0, sp, 0) -%la_br() &eprint -%call() +%call(&eprint) %mov(s0, a0) -%la_br() &::done -%bltz(s0) +%bltz(s0, &::done) -%la(a0) &libp1pp__newline +%la(a0, &libp1pp__newline) %li(a1) $(1) -%la_br() &eprint -%call() +%call(&eprint) %mov(s0, a0) ::done @@ -1156,47 +996,39 @@ body %fn(print_cstr, 16, { %st(s0, sp, 0) %mov(s0, a0) -%la_br() &strlen -%call() +%call(&strlen) %mov(a1, a0) %mov(a0, s0) -%la_br() &print -%call() +%call(&print) %ld(s0, sp, 0) }) %fn(eprint_cstr, 16, { %st(s0, sp, 0) %mov(s0, a0) -%la_br() &strlen -%call() +%call(&strlen) %mov(a1, a0) %mov(a0, s0) -%la_br() &eprint -%call() +%call(&eprint) %ld(s0, sp, 0) }) %fn(print_int, 0, { %mov(a1, a0) -%la(a0) &libp1pp__num_buf -%la_br() &fmt_dec -%call() +%la(a0, &libp1pp__num_buf) +%call(&fmt_dec) %mov(a1, a0) -%la(a0) &libp1pp__num_buf -%la_br() &print -%call() +%la(a0, &libp1pp__num_buf) +%call(&print) }) %fn(print_hex, 0, { %mov(a1, a0) -%la(a0) &libp1pp__num_buf -%la_br() &fmt_hex -%call() +%la(a0, &libp1pp__num_buf) +%call(&fmt_hex) %mov(a1, a0) -%la(a0) &libp1pp__num_buf -%la_br() &print -%call() +%la(a0, &libp1pp__num_buf) +%call(&print) }) # ========================================================================= @@ -1215,33 +1047,26 @@ body %li(a1) $(0) %li(a2) $(0) -%la_br() &sys_open -%call() -%la_br() &::open_fail -%bltz(a0) +%call(&sys_open) +%bltz(a0, &::open_fail) %mov(s3, a0) %mov(a0, s3) %mov(a1, s1) %mov(a2, s2) -%la_br() &sys_read -%call() +%call(&sys_read) %mov(s0, a0) %mov(a0, s3) -%la_br() &sys_close -%call() +%call(&sys_close) %mov(a0, s0) -%la_br() &::read_fail -%bltz(a0) -%la_br() &::done -%b() +%bltz(a0, &::read_fail) +%b(&::done) ::read_fail %li(a0) $(-1) -%la_br() &::done -%b() +%b(&::done) ::open_fail %li(a0) $(-1) @@ -1268,19 +1093,15 @@ body %mov(s2, a2) ::loop -%la_br() &::done_ok -%beqz(s2) +%beqz(s2, &::done_ok) %mov(a0, s0) %mov(a1, s1) %mov(a2, s2) -%la_br() &sys_write -%call() -%la_br() &::done -%bltz(a0) +%call(&sys_write) +%bltz(a0, &::done) %add(s1, s1, a0) %sub(s2, s2, a0) -%la_br() &::loop -%b() +%b(&::loop) ::done_ok %li(a0) $(0) @@ -1304,34 +1125,27 @@ body %li(a1) $(0x241) %li(a2) $(0x1A4) -%la_br() &sys_open -%call() -%la_br() &::open_fail -%bltz(a0) +%call(&sys_open) +%bltz(a0, &::open_fail) %mov(s2, a0) %mov(a0, s2) %mov(a1, s0) %mov(a2, s1) -%la_br() &libp1pp__write_all -%call() +%call(&libp1pp__write_all) %mov(s0, a0) %mov(a0, s2) -%la_br() &sys_close -%call() +%call(&sys_close) %mov(a0, s0) -%la_br() &::fail_ret -%bltz(a0) +%bltz(a0, &::fail_ret) %li(a0) $(0) -%la_br() &::done -%b() +%b(&::done) ::fail_ret %li(a0) $(-1) -%la_br() &::done -%b() +%b(&::done) ::open_fail %li(a0) $(-1) @@ -1351,11 +1165,11 @@ body # bump_init(base=a0, cap=a1) -> 0 :bump_init -%la(t0) &libp1pp__bump_base +%la(t0, &libp1pp__bump_base) %st(a0, t0, 0) -%la(t0) &libp1pp__bump_cursor +%la(t0, &libp1pp__bump_cursor) %st(a0, t0, 0) -%la(t0) &libp1pp__bump_cap +%la(t0, &libp1pp__bump_cap) %st(a1, t0, 0) %li(a0) $(0) %ret() @@ -1370,16 +1184,15 @@ body %addi(a0, a0, 7) %li(t0) $(-8) %and(a0, a0, t0) -%la(t0) &libp1pp__bump_cursor +%la(t0, &libp1pp__bump_cursor) %ld(t1, t0, 0) %add(t2, t1, a0) -%la(a1) &libp1pp__bump_base +%la(a1, &libp1pp__bump_base) %ld(a2, a1, 0) -%la(a1) &libp1pp__bump_cap +%la(a1, &libp1pp__bump_cap) %ld(a3, a1, 0) %add(a3, a2, a3) -%la_br() &::fail -%bltu(a3, t2) +%bltu(a3, t2, &::fail) %st(t2, t0, 0) %mov(a0, t1) %ret() @@ -1390,22 +1203,22 @@ body # bump_mark() -> saved :bump_mark -%la(t0) &libp1pp__bump_cursor +%la(t0, &libp1pp__bump_cursor) %ld(a0, t0, 0) %ret() # bump_release(saved=a0) -> 0 :bump_release -%la(t0) &libp1pp__bump_cursor +%la(t0, &libp1pp__bump_cursor) %st(a0, t0, 0) %li(a0) $(0) %ret() # bump_reset() -> 0 :bump_reset -%la(t0) &libp1pp__bump_base +%la(t0, &libp1pp__bump_base) %ld(t1, t0, 0) -%la(t0) &libp1pp__bump_cursor +%la(t0, &libp1pp__bump_cursor) %st(t1, t0, 0) %li(a0) $(0) %ret() @@ -1416,18 +1229,14 @@ body # panic(msg_cstr=a0) -> never returns %fn(panic, 0, { -%la_br() &eprint_cstr -%call() -%la(a0) &libp1pp__newline +%call(&eprint_cstr) +%la(a0, &libp1pp__newline) %li(a1) $(1) -%la_br() &eprint -%call() +%call(&eprint) %li(a0) $(1) -%la_br() &sys_exit -%call() +%call(&sys_exit) ::spin -%la_br() &::spin -%b() +%b(&::spin) }) # ========================================================================= diff --git a/tests/p1/double.P1pp b/tests/p1/double.P1pp @@ -12,8 +12,7 @@ :p1_main %enter(0) - %la_br() &double - %call() + %call(&double) %eret() :ELF_end diff --git a/tests/p1/hello.P1pp b/tests/p1/hello.P1pp @@ -13,7 +13,7 @@ :p1_main %li(a0) %sys_write() %li(a1) %1 %0 - %la(a2) &msg + %la(a2, &msg) %li(a3) %14 %0 %syscall() %li(a0) %0 %0 diff --git a/tests/p1/p1-aliasing.P1pp b/tests/p1/p1-aliasing.P1pp @@ -50,12 +50,12 @@ %addi(s0, s0, 16) # Store s0 as the first byte of msg_buf, then write msg_buf[0..2]. - %la(t0) &msg_buf + %la(t0, &msg_buf) %sb(s0, t0, 0) %li(a0) %sys_write() %li(a1) $(1) - %la(a2) &msg_buf + %la(a2, &msg_buf) %li(a3) $(2) %syscall() diff --git a/tests/p1/p1-call.P1pp b/tests/p1/p1-call.P1pp @@ -9,16 +9,14 @@ %mov(s0, a0) # write_msg("A\n") - %la(a0) &msg_a + %la(a0, &msg_a) %li(a1) $(2) - %la_br() &write_msg - %call() + %call(&write_msg) # write_msg("BC\n") - %la(a0) &msg_bc + %la(a0, &msg_bc) %li(a1) $(3) - %la_br() &write_msg - %call() + %call(&write_msg) # exit status = argc + 1 (so it's always >= 2). %addi(a0, s0, 1)