On 8/15/25 3:00 AM, Umesh Kalappa wrote:
Addressed the comments and tested "runtest --tool gcc 
--target_board='riscv-sim/-march=rv64gc_zba_zbb_zbc_zbs/-mabi=lp64/-mcmodel=medlow' 
riscv.exp" and 32 bit too

lint warnings can be ignored for riscv-ext.opt.

gcc/ChangeLog:

        * config/riscv/riscv-ext-mips.def (DEFINE_RISCV_EXT):
        Added mips prefetch extension.
        * config/riscv/riscv-ext.opt: Generated file.
        * config/riscv/riscv.md (prefetch):
        Added mips prefetch address operand constraint.
        * config/riscv/constraints.md: Added mips specific constraint.
        * config/riscv/predicates.md (prefetch_operand):
        Updated for mips nine bits offset.
        * config/riscv/riscv.cc (riscv_prefetch_offset_address_p):
        Legitimate address with offset for prefetch check.
        * config/riscv/riscv-protos.h: Likewise.
        * config/riscv/riscv.h:
        Macros to support for mips cached type.
        * doc/riscv-ext.texi: Updated for mips prefetch.

gcc/testsuite/ChangeLog:

        * gcc.target/riscv/mipsprefetch.c: Test file for mips.pref.
---
  gcc/config/riscv/constraints.md               |  4 +++
  gcc/config/riscv/predicates.md                | 20 +++++++++++-
  gcc/config/riscv/riscv-ext-mips.def           | 13 ++++++++
  gcc/config/riscv/riscv-ext.opt                |  2 ++
  gcc/config/riscv/riscv-protos.h               |  2 ++
  gcc/config/riscv/riscv.cc                     | 31 +++++++++++++++++++
  gcc/config/riscv/riscv.h                      | 11 +++++++
  gcc/config/riscv/riscv.md                     | 18 ++++++++---
  gcc/doc/riscv-ext.texi                        |  4 +++
  gcc/testsuite/gcc.target/riscv/mipsprefetch.c | 31 +++++++++++++++++++
  10 files changed, 131 insertions(+), 5 deletions(-)
  create mode 100644 gcc/testsuite/gcc.target/riscv/mipsprefetch.c



+;; REG or REG+D where D fits in a uimm9
+(define_predicate "mips_prefetch_operand"
+  (ior (match_operand 0 "register_operand")
+       (match_test "prefetch_const_operand (op, VOIDmode)")
+       (and (match_code "plus")
+        (match_test "register_operand (XEXP (op, 0), word_mode)")
+        (match_test "prefetch_const_operand (XEXP (op, 1), VOIDmode)"))))
Formatting nit.  Instead of 8 spaces, use a tab.  I've fixed this.



+
+DEFINE_RISCV_EXT (
+  /* NAME.  */ xmipscbop,
+  /* UPPERCASE_NAME.  */ XMIPSCBOP,
+  /* FULL_NAME.  */ "Mips Prefetch extension",
+  /* DESC.  */ "",
+  /* URL.  */ ,
Consider adding your URL here for the extension as a follow-up. We don't require it, but it's potentially helpful in the future if someone needs to lookup precisely how this extension is defined.




diff --git a/gcc/config/riscv/riscv.cc b/gcc/config/riscv/riscv.cc
index e9217dcb043..7722497289b 100644
--- a/gcc/config/riscv/riscv.cc
+++ b/gcc/config/riscv/riscv.cc
@@ -15449,6 +15449,37 @@ synthesize_add (rtx operands[3])
    return true;
  }
+/*
+    hint : argument specify the target cache
+
+    TODO : locality is unused.
When we refer to arguments, variable names, etc in comments it is customary to put them in all caps. I've fixed this.

+
+    Return the first operand of the associated PREF or PREFX insn.  */
+rtx
+riscv_prefetch_cookie (rtx hint, rtx locality)
+{
+  return (GEN_INT (INTVAL (hint)
+                 + CacheHint::DCACHE_HINT + INTVAL (locality) * 0));
+}
Formatting nit. When we wrap a line the operator is indented inside the parens. Like this

(something
 + something else)

I've fixed this.

+
+/* Return true if X is a legitimate address with offset for prefetch.
+   MODE is the mode of the value being accessed.  */
+bool
+riscv_prefetch_offset_address_p (rtx x, machine_mode mode)
+{
+  struct riscv_address_info addr;
+
+  if (riscv_classify_address (&addr, x, mode, false)
+      && addr.type == ADDRESS_REG)
+    {
+      if (TARGET_XMIPSCBOP)
+       return (CONST_INT_P (addr.offset)
+                      && MIPS_RISCV_9BIT_OFFSET_P (INTVAL (addr.offset)));
Similarly here.  I've fixed this too.



  {
+  if (TARGET_XMIPSCBOP)
+    {
+      /* Mips Prefetch write is nop for p8700.  */
+      if (operands[1] != CONST0_RTX (GET_MODE (operands[1])))
+      return "nop";
+
+      operands[1] = riscv_prefetch_cookie (operands[1], operands[2]);
+      return "mips.pref\t%1,%a0";
+    }
+
Always make sure to indent two positions further for the THEN/ELSE clauses after an if-statement. like this;

if (whatever)
  true clause;
else
  false clause;

I've fixed this too.

I've pushed this patch with the fixes noted above to the trunk.  Thanks!

jeff



Reply via email to