[PATCH] RISC-V: Add optional register argument to tail pseudo

Jiawei jiawei@iscas.ac.cn
Thu Sep 17 06:33:21 GMT 2026


> The lpad instruction of Zicfilp is encoded using an auipc hint 
> encoding, so
> an instrumented binary still runs correctly on a CPU without Zicfilp.  For
> that to work, compilers must be able to emit a software guarded tail call
> using t2 as the scratch register without Zicfilp appearing in the ISA
> string.
>
> Add `tail <symbol>, <rt>' for that, which expands the same way as
> `jump <symbol>, <rt>'.
>
> See more: https://github.com/riscv-non-isa/riscv-asm-manual/pull/227
> ---
>  gas/testsuite/gas/riscv/tail-fail.d | 3 +++
>  gas/testsuite/gas/riscv/tail-fail.l | 3 +++
>  gas/testsuite/gas/riscv/tail-fail.s | 3 +++
>  gas/testsuite/gas/riscv/tail.d      | 6 ++++++
>  gas/testsuite/gas/riscv/tail.s      | 3 +++
>  opcodes/riscv-opc.c                 | 1 +
>  6 files changed, 19 insertions(+)
>  create mode 100644 gas/testsuite/gas/riscv/tail-fail.d
>  create mode 100644 gas/testsuite/gas/riscv/tail-fail.l
>  create mode 100644 gas/testsuite/gas/riscv/tail-fail.s
>
> diff --git a/gas/testsuite/gas/riscv/tail-fail.d 
> b/gas/testsuite/gas/riscv/tail-fail.d
> new file mode 100644
> index 00000000000..8568b7b5522
> --- /dev/null
> +++ b/gas/testsuite/gas/riscv/tail-fail.d
> @@ -0,0 +1,3 @@
> +#as: -march=rv32i
> +#source: tail-fail.s
> +#error_output: tail-fail.l
> diff --git a/gas/testsuite/gas/riscv/tail-fail.l 
> b/gas/testsuite/gas/riscv/tail-fail.l
> new file mode 100644
> index 00000000000..4b9b3d136ac
> --- /dev/null
> +++ b/gas/testsuite/gas/riscv/tail-fail.l
> @@ -0,0 +1,3 @@
> +.*: Assembler messages:
> +.*:2: Error: illegal operands `tail foo,x0'
> +.*:3: Error: illegal operands `tail foo,zero'
> diff --git a/gas/testsuite/gas/riscv/tail-fail.s 
> b/gas/testsuite/gas/riscv/tail-fail.s
> new file mode 100644
> index 00000000000..713591ab197
> --- /dev/null
> +++ b/gas/testsuite/gas/riscv/tail-fail.s
> @@ -0,0 +1,3 @@
> +foo:
> +    tail foo, x0
> +    tail foo, zero
> diff --git a/gas/testsuite/gas/riscv/tail.d 
> b/gas/testsuite/gas/riscv/tail.d
> index 6e5db231061..1879c06fec8 100644
> --- a/gas/testsuite/gas/riscv/tail.d
> +++ b/gas/testsuite/gas/riscv/tail.d
> @@ -11,3 +11,9 @@ Disassembly of section .text:
>  [     ]+[0-9a-f]+:[     ]+00030067[     ]+jr[     ]+t1 # 0 <foo>
>  [     ]+[0-9a-f]+:[     ]+00000397[     ]+auipc[     ]+t2,0x0
>  [     ]+[0-9a-f]+:[     ]+00038067[     ]+jr[     ]+t2 # 8 <foo\+0x8>
> +[     ]+[0-9a-f]+:[     ]+00000517[     ]+auipc[     ]+a0,0x0
> +[     ]+[0-9a-f]+:[     ]+00050067[     ]+jr[     ]+a0 # 10 <foo\+0x10>
> +[     ]+[0-9a-f]+:[     ]+00000397[     ]+auipc[     ]+t2,0x0
> +[     ]+[0-9a-f]+:[     ]+00038067[     ]+jr[     ]+t2 # 18 <foo\+0x18>
> +[     ]+[0-9a-f]+:[     ]+00000317[     ]+auipc[     ]+t1,0x0
> +[     ]+[0-9a-f]+:[     ]+00030067[     ]+jr[     ]+t1 # 20 <foo\+0x20>
> diff --git a/gas/testsuite/gas/riscv/tail.s 
> b/gas/testsuite/gas/riscv/tail.s
> index 8058244367b..7d738ebec4f 100644
> --- a/gas/testsuite/gas/riscv/tail.s
> +++ b/gas/testsuite/gas/riscv/tail.s
> @@ -2,8 +2,11 @@ foo:
>  .option push
>  .option arch, rv32i
>      tail foo
> +    tail foo, t2
> +    tail foo, a0
>  .option pop
>  .option push
>  .option arch, rv32i_zicfilp
>      tail foo
> +    tail foo, t1
>  .option pop
> diff --git a/opcodes/riscv-opc.c b/opcodes/riscv-opc.c
> index 7ef6e157d4f..1f7d43050bf 100644
> --- a/opcodes/riscv-opc.c
> +++ b/opcodes/riscv-opc.c
> @@ -510,6 +510,7 @@ const struct riscv_opcode riscv_opcodes[] =
>  {"call",        0, INSN_CLASS_I, "c",         (X_RA << 
> OP_SH_RS1)|(X_RA << OP_SH_RD), (int) M_CALL, NULL, INSN_MACRO },
>  {"tail",        0, INSN_CLASS_ZICFILP, "c",   (X_T2 << OP_SH_RS1), 
> (int) M_CALL, NULL, INSN_MACRO },
>  {"tail",        0, INSN_CLASS_I, "c",         (X_T1 << OP_SH_RS1), 
> (int) M_CALL, NULL, INSN_MACRO },
> +{"tail",        0, INSN_CLASS_I, "c,s",       0, (int) M_CALL, 
> match_rs1_nonzero, INSN_MACRO },
>  {"jump",        0, INSN_CLASS_I, "c,s",       0, (int) M_CALL, 
> match_rs1_nonzero, INSN_MACRO },
>  {"nop",         0, INSN_CLASS_ZCA, "",          MATCH_C_ADDI, 0xffff, 
> match_opcode, INSN_ALIAS },
>  {"nop",         0, INSN_CLASS_I, "",          MATCH_ADDI, 
> MASK_ADDI|MASK_RD|MASK_RS1|MASK_IMM, match_opcode, INSN_ALIAS },
>
LGTM.

Reviewed-by: Jiawei <jiawei@iscas.ac.cn>



More information about the Binutils mailing list