On Sat, 26 Apr 2025 09:59:45 +0300, Dimitar Dimitrov wrote: > On Fri, Apr 25, 2025 at 01:25:50PM +0800, Jin Ma wrote: > > For RV32 inline assembly, when handling 64-bit integer data, it is > > often necessary to process the lower and upper 32 bits separately. > > Unfortunately, we can only output the current register name > > (lower 32 bits) but not the next register name (upper 32 bits). > > > > To address this, the modifier 'H' has been added to allow users > > to handle the upper 32 bits of the data. While I believe the > > modifier 'N' (representing the next register name) might be more > > suitable for this functionality, 'N' is already in use. > > Therefore, 'H' (representing the high register) was chosen instead. > > > > Does anyone have any comments on this? > > > > gcc/ChangeLog: > > > > * config/riscv/riscv.cc (riscv_print_operand): Add H. > > * doc/extend.texi: Document for H. > > > > gcc/testsuite/ChangeLog: > > > > * gcc.target/riscv/modifier-H.c: New test. > > --- > > gcc/config/riscv/riscv.cc | 12 +++++++++++ > > gcc/doc/extend.texi | 1 + > > gcc/testsuite/gcc.target/riscv/modifier-H.c | 22 +++++++++++++++++++++ > > 3 files changed, 35 insertions(+) > > create mode 100644 gcc/testsuite/gcc.target/riscv/modifier-H.c > > > > diff --git a/gcc/config/riscv/riscv.cc b/gcc/config/riscv/riscv.cc > > index bad59e248d0..4ef96532f35 100644 > > --- a/gcc/config/riscv/riscv.cc > > +++ b/gcc/config/riscv/riscv.cc > > @@ -6879,6 +6879,7 @@ riscv_asm_output_opcode (FILE *asm_out_file, const > > char *p) > > 'T' Print shift-index of inverted single-bit mask OP. > > '~' Print w if TARGET_64BIT is true; otherwise not print anything. > > 'N' Print register encoding as integer (0-31). > > + 'H' Print the name of the high register for OP, which is the next > > register. > > > > Note please keep this list and the list in riscv.md in sync. */ > > > > @@ -7174,6 +7175,17 @@ riscv_print_operand (FILE *file, rtx op, int letter) > > asm_fprintf (file, "%u", (regno - offset)); > > break; > > } > > + case 'H': > > + { > > + if (!REG_P (op)) > > + { > > + output_operand_lossage ("modifier 'H' require register operand"); > > + break; > > + } > > Given the intended usage, does it make sense to limit this modifier only > to regular integer registers? Example: > > if (REGNO (op) > 31 ) > { > output_operand_lossage ("modifier 'H' is for integer registers only"); > break; > } > if (REGNO (op) == 31 ) > { > output_operand_lossage ("modifier 'H' cannot be applied to R31"); > break; > } > > Is it an error to apply H modifier to R0? > > If not, would you consider rejecting the last HW register: > if (REGNO (op) >= FIRST_PSEUDO_REGISTER - 1 ) > { > output_operand_lossage ("modifier 'H' cannot be applied to last HW > register"); > break; > }
Thanks. These are excellent review comments, and I will incorporate them into the next version. Does anyone else have additional suggestions? Best regards, Jin