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:
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)