On 7/16/25 10:54 PM, Umesh Kalappa wrote:
Fixed the regress that caused "pr118241.c" failure 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.def: Likewise.
* 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 9 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.
---
diff --git a/gcc/config/riscv/predicates.md b/gcc/config/riscv/predicates.md
index 1f9a6b562e5..ed7b34438c4 100644
--- a/gcc/config/riscv/predicates.md
+++ b/gcc/config/riscv/predicates.md
@@ -27,10 +27,14 @@
(ior (match_operand 0 "const_arith_operand")
(match_operand 0 "register_operand")))
+(define_predicate "prefetch_const_operand"
+ (and (match_code "const_int")
+ (match_test "(IN_RANGE (INTVAL (op), 0, 511))")))
+
[ ... ]
+;; REG or REG+D where D fits in a uimm9
+(define_predicate "mips_prefetch_operand"
+ (ior (match_operand 0 "register_operand")
+ (and (match_test "prefetch_const_operand (op, VOIDmode)")
+ (match_test "(IN_RANGE (INTVAL (XEXP (op, 1)), 0, 511))"))
+ (and (match_code "plus")
+ (match_test "register_operand (XEXP (op, 0), word_mode)")
+ (match_test "prefetch_const_operand (XEXP (op, 1), VOIDmode)")
+ (match_test "(IN_RANGE (INTVAL (XEXP (op, 1)), 0, 511))"))))
So prefetch_const_operand tests the constant, so isn't the additional
test in mips_prefetch_operand redundant?
diff --git a/gcc/config/riscv/riscv.cc b/gcc/config/riscv/riscv.cc
index 1275b034cf8..ef772659734 100644
--- a/gcc/config/riscv/riscv.cc
+++ b/gcc/config/riscv/riscv.cc
@@ -15389,6 +15389,34 @@ synthesize_and (rtx operands[3])
return true;
}
+/* Given that we have an rtx of the form (prefetch ... WRITE LOCALITY),
+ return the first operand of the associated PREF or PREFX insn. */
+rtx
+riscv_prefetch_cookie (rtx write, rtx locality)
+{
+ /* store / load to data cache. */
+ /* locality is unused. */
+ return GEN_INT (INTVAL (write) + DCACHE_HINT + INTVAL (locality) * 0);
Rather than a comment inside the function documenting the parameters,
the standard way is to document them in the function comment before the
function.
Given the INTVAL (locality) * 0, why not just drop the term entirely?
And if you want to keep the API for the function as-is, just drop the
name of the second argument, but leave it's type.
+}
+
+/* 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));
When you wrap, go ahead and add parenthesis so...
(CONST_INT_P (addr.offset)
&& MIPS_RISCV_9BIT_OFFSET_P (INTVAL (addr.offset)));
diff --git a/gcc/config/riscv/riscv.h b/gcc/config/riscv/riscv.h
index 45fa521f219..270b3fafc7d 100644
--- a/gcc/config/riscv/riscv.h
+++ b/gcc/config/riscv/riscv.h
@@ -1319,4 +1319,13 @@ extern void riscv_remove_unneeded_save_restore_calls
(void);
#define TARGET_HAS_FMV_TARGET_ATTRIBUTE 0
+/* mips pref valid offset range. */
+#define MIPS_RISCV_9BIT_OFFSET_P(OFFSET) (IN_RANGE (OFFSET, 0, 511))
+
+/* mips pref cache hint type. */
+#define ICACHE_HINT (0 << 3)
+#define DCACHE_HINT (1 << 3)
+#define SCACHE_HINT (2 << 3)
+#define TCACHE_HINT (3 << 3)
Consider an enum; the primary advantage of an enum is they can be
referenced symbolically by the debugger.
None of those issues are show-stoppers. I think with them fixed this
patch will be fine to go forward. Please update and repost.
Thanks,
jeff