On Thu, May 29, 2025 at 03:07:34PM -0500, Peter Bergner wrote:
> On 5/29/25 5:35 AM, Segher Boessenkool wrote:
> >
> > Add yourself to suthors as well?
> 
> Agreed.  Just add your name/email address directly under mine, like so:
> 
> 2025-05-29  Peter Bergner  <berg...@linux.ibm.com>
>           Jeevitha Palanisamy  <jeevi...@linux.ibm.com>

Like that.

> >> +{                                                                 \
> >> +  register TYPE _ret asm ("r8");                                  \
> >> +  register TYPE _cond asm ("r9") = _COND;                         \
> >> +  register TYPE _value asm ("r10") = _VALUE;                              
> >> \
> >> +  __asm__ __volatile__ (OPCODE " %[ret],%P[addr],%[code]"         \
> >> +                  : [addr] "+Q" (_PTR[0]), [ret] "=r" (_ret)      \
> >> +                  : "r" (_cond), "r" (_value), [code] "n" (FC));  \
> >> +  return _ret;                                                            
> >> \
> >> +}
> > 
> > Naming the operands is an extra indirection, and makes things way less
> > readable (which means *understandable*) as well.  Just use %0, %1, %2
> > please?  It's a single line, people will not lose track of what is what
> > anyway (and if they would, the code is then way too big for extended
> > asm, so named asm operands is always a code stench).
> 
> I agree that's a little too much syntactic sugar, but we were just

Sugar is an addictive useless slow-killing substance.  This is more like
syntactic fentanyl.

> being consistent with the other existing code that uses this syntax.
> I suppose you could use %1,%0,%4 here (%2 & %3 are not used directly)
> and then clean up the other code similarly as a follow-on cleanup?

It would be nice to get %0,%1,%4 even, like we have in all similar
patterns.

Operands in order, and %0 is the leftmost one, the destination reg.

> >> +#define _AMO_LD_INCREMENT(NAME, TYPE, OPCODE, FC)                 \
> >> +static __inline__ TYPE                                                    
> >> \
> >> +NAME (TYPE *_PTR)                                                 \
> >> +{                                                                 \
> >> +  TYPE _RET;                                                              
> >> \
> >> +  __asm__ volatile (OPCODE " %[ret],%P[addr],%[code]\n"                   
> >> \
> >> +              : [addr] "+Q" (_PTR[0]), [ret] "=r" (_RET)          \
> >> +              : "Q" (*(TYPE (*)[2]) _PTR), [code] "n" (FC));      \
> >> +  return _RET;                                                            
> >> \
> >> +}
> > 
> > I don't understand the [2].  Should it be [1]?  These instructions
> > can use the value at mem+s (as the ISA names things) as input, but not
> > mem+2*s.
> 
> I think 2 is correct here.  This 2 isn't an index like the 0 in _PTR[0],
> but it's a size.

Yeah, it's a declarator here (a type-name), inside a cast.  Nastiness.
Oh well, hidden in a macro ;-)

> This specific use is trying to say we're reading from
> memory and we're reading 2 locations, mem(EA,s) and mem(EA+s,s).
> Maybe we could use separate mentions of _PTR[0] and _PTR[1] instead???

As memory operands?  Yeah that could be cleaner.

> We don't actually use that "operand" in the instruction, it's just there
> to tell the compiler that those memory locations are read.
> 
> Ditto for _AMO_LD_DECREMENT usage, which reads mem(EA-s,s) and mem(EA,s).

Yup.


Segher

Reply via email to