Is t4 / x29 preserved across calls?
No. t0-t6 are temporary registers and are not preserved across calls.
Temporary register 4 (x29). The psABI classifies t4 as a temporary register for caller-managed short-lived values; its value is not preserved across calls.
The psABI marks t0-t6 as temporary registers. They are not callee-saved; callers must save any value that needs to survive a call.
t4 / x29 belongs to the t0-t6 temporary-register group. The psABI marks it not preserved across calls; callers must save any value that needs to survive a call.
t4 is a caller-saved temporary register, so callees may overwrite it.
If the caller still needs the t4 value after a call, it must save it in advance.
Values that must survive calls should usually live in s* registers or on the stack.
addi t4, a0, 1
# If t4 is needed after the call, the caller must save it to an ABI-valid location first
call foo
# restore t4 from that saved location after the call returnsNo. t0-t6 are temporary registers and are not preserved across calls.
The caller must save it before the call, usually to the stack or another suitable location, and restore it afterward.