On 4/18/23 14:48, Patrick O'Neill wrote:
On 4/18/23 09:59, Jeff Law wrote:
On 4/18/23 08:28, Patrick O'Neill wrote:
...
+  rtx addr = force_reg (Pmode, XEXP (mem, 0));
+
+  rtx aligned_addr = gen_reg_rtx (Pmode);
+  emit_move_insn (aligned_addr,  gen_rtx_AND (Pmode, addr,
+                          gen_int_mode (-4, Pmode)));
So rather than -4 as a magic number, GET_MODE_MASK would be better. That may result in needing to rewrap this code.  I'd bring the gen_rtx_AND down on a new line, aligned with aligned_addr.
IIUC GET_MODE_MASK generates masks like 0xFF for QI (for example). It doesn't have the granularity to generate 0x3 (which we can NOT to get -4). I searched the GCC internals docs but couldn't find a function that does address alignment masks.
Yea, yea.  Big "duh" on my side.

Presumably using SImode is intentional here rather than wanting to use word_mode which would be SImode for rv32 and DImode for rv64?  I'm going to work based on that assumption, but if it isn't there's more work to do to generalize this code.
It's been a year but IIRC it was just simpler to implement (and to me it didn't make sense to use 64 bits for a subword op).
Is there a benefit in using 64 bit instructions when computing subwords?
Given that rv64 should have 32bit load/stores, I don't offhand see any advantage.


+
+(define_expand "atomic_fetch_nand<mode>"
+  [(set (match_operand:SHORT 0 "register_operand" "=&r")
+    (match_operand:SHORT 1 "memory_operand" "+A"))
+   (set (match_dup 1)
+    (unspec_volatile:SHORT
+      [(not:SHORT (and:SHORT (match_dup 1)
+                 (match_operand:SHORT 2 "reg_or_0_operand" "rJ")))
+       (match_operand:SI 3 "const_int_operand")] ;; model
+     UNSPEC_SYNC_OLD_OP_SUBWORD))]
+  "TARGET_ATOMIC && TARGET_INLINE_SUBWORD_ATOMIC"
Just a note, constraints aren't necessary for a define_expand. They don't hurt anything though.  They do document expectations, but then you have to maintain them over time.  I'm OK leaving them, mostly wanted to make sure you're aware they aren't strictly necessary for a define_expand.
I wasn't aware, thanks for pointing it out! - you're referring to the "TARGET_ATOMIC && TARGET_INLINE_SUBWORD_ATOMIC", (not the register constraints) right?
I was referring to the register constraints like "=&r". They're ignored on define_expand constructors. A define_expand generates RTL that will be matched later by a define_insn.

The "TARGET_ATOMIC && TARGET_INLINE_SUBWORD_ATOMIC" is usually referred to as the insn condition.


Thanks for reviewing!
NP.  Looking forward to V6 which I expect will be ready for inclusion.

jeff

Reply via email to