linux-riscv.lists.infradead.org archive mirror
 help / color / mirror / Atom feed
From: Andrew Jones <ajones@ventanamicro.com>
To: Leonardo Bras <leobras@redhat.com>
Cc: Guo Ren <guoren@linux.alibaba.com>,
	keescook@chromium.org, atishp@atishpatra.org,
	peterz@infradead.org, unicorn_wang@outlook.com,
	paul.walmsley@sifive.com, chao.wei@sophgo.com,
	bjorn@rivosinc.com, linux-kernel@vger.kernel.org,
	xiaoguang.xing@sophgo.com, conor.dooley@microchip.com,
	wuwei2016@iscas.ac.cn, palmer@dabbelt.com, jszhang@kernel.org,
	panqinglin2020@iscas.ac.cn, guoren@kernel.org,
	linux-riscv@lists.infradead.org, wefu@redhat.com
Subject: Re: Re: Re: [PATCH V2 1/3] riscv: Add Zicbop instruction definitions & cpufeature
Date: Thu, 4 Jan 2024 10:47:34 +0100	[thread overview]
Message-ID: <20240104-4ecfb92d2f8c95fa773ca695@orel> (raw)
In-Reply-To: <ZZXEpU-JzsvD2UDW@LeoBras>

On Wed, Jan 03, 2024 at 05:33:41PM -0300, Leonardo Bras wrote:
> On Wed, Jan 03, 2024 at 08:29:39PM +0100, Andrew Jones wrote:
> > On Wed, Jan 03, 2024 at 03:52:00PM -0300, Leonardo Bras wrote:
> > > On Sun, Dec 31, 2023 at 03:29:51AM -0500, guoren@kernel.org wrote:
...
> > > The shifts seem correct for S-Type, but I would name the IMM defines in a 
> > > way we could understand where they fit in IMM:
> > > 
> > > 
> > > INSN_S_SIMM5_SHIFT -> INSN_S_SIMM_0_4_SHIFT
> > > INSN_S_SIMM7_SHIFT -> INSN_S_SIMM_5_11_SHIFT
> > > 
> > > What do you think?
> > 
> > I'm in favor of this suggestion, but then wonder if we don't need another
> > patch before this which renames INSN_I_SIMM12_SHIFT to
> > INSN_I_SIMM_0_11_SHIFT in order to keep things consistent.
> 
> Agree. If it's ok, I can provide a patch doing the rename on top of this 
> patchset.

The INSN_I change is only needed if we also take the new INSN_S shift
macros, so I think the INSN_I change should be part of this series.

BTW, I just noticed we wrote the numbers backwards. They should be

 INSN_I_SIMM_11_0_SHIFT
 INSN_S_SIMM_11_5_SHIFT
 INSN_S_SIMM_4_0_SHIFT

> > > >  
> > > > +#define CBO_PREFETCH_I(base, offset)				\
> > > > +	INSN_S(OPCODE_OP_IMM, FUNC3(6), __RS2(0),		\
> > > > +	       SIMM12(offset), RS1(base))
> > > > +
> > > > +#define CBO_PREFETCH_R(base, offset)				\
> > > > +	INSN_S(OPCODE_OP_IMM, FUNC3(6), __RS2(1),		\
> > > > +	       SIMM12(offset), RS1(base))
> > > > +
> > > > +#define CBO_PREFETCH_W(base, offset)				\
> > > > +	INSN_S(OPCODE_OP_IMM, FUNC3(6), __RS2(3),		\
> > > > +	       SIMM12(offset), RS1(base))
> > > > +
> > > 
> > > For OP_IMM & FUNC3(6) we have ORI, right?
> > > For ORI, rd will be at bytes 11:7, which in PREFETCH.{i,r,w} is
> > > offset[4:0].
> > > 
> > > IIUC, when the cpu does not support ZICBOP, this should be fine as long as 
> > > rd = 0, since changes to r0 are disregarded.
> > > 
> > > In this case, we need to guarantee offset[4:0] = 0, or else we migth write 
> > > on an unrelated register. This can be noticed in ZICBOP documentation pages 
> > > 21, 22, 23, as offset[4:0] is always [0 0 0 0 0]. 
> > > (Google docs in first comment)
> > > 
> > > What we need here is something like:
> > > + enum {
> > > + 	PREFETCH_I,
> > > + 	PREFETCH_R,
> > > + 	PREFETCH_W,
> > > + }	 
> > 
> > Can't use enum. This header may be included in assembly.
> 
> Oh, I suggest defines then, since it's better to make it clear instead of 
> using 0, 1, 3.

I don't think we gain anything by adding another define in order to create
the instruction define. We have to review the number sooner or later. I'd
prefer we use the number inside the instruction define so we only need
to look one place, which is also consistent with how we use FUNC fields.

> 
> > 
> > > +
> > > + #define CBO_PREFETCH(type, base, offset)                      \
> > > +     INSN_S(OPCODE_OP_IMM, FUNC3(6), __RS2(type),              \
> > > +            SIMM12(offset & ~0x1f), RS1(base))
> > 
> > Yes. I suggested we mask offset as well, but ideally we'd detect a caller
> > using an offset with nonzero lower 5 bits at compile time.
> 
> I would suggest the compiler would take care of this, but I am not sure 
> about the assembly, since I am not sure if it gets any optimization.
> 
> I don't think we can detect a caller with non-zero offset at compile time, 
> since it will be used in locks which can be at (potentially) any place in 
> the block size. (if you have any idea though, please let me know :) )
> 
> On the other hand, we could create a S-Type macro which deliberately 
> ignores imm[4:0], like  
> 
> + INSN_S_TRUNCATE(OPCODE_OP_IMM, FUNC3(6), __RS2(3),               \
> +                 SIMM12(offset), RS1(base))
> 
> Which saves the bits 11:5 of offset  into imm[11:5], and zero-fill 
> imm[4:0], like
> 
> +#define DEFINE_INSN_S                                                    \
> + __DEFINE_ASM_GPR_NUMS                                           \
> +"        .macro insn_s, opcode, func3, rs2, simm12, rs1\n"               \
> +"        .4byte  ((\\opcode << " __stringify(INSN_S_OPCODE_SHIFT) ") |"  \
> +"                 (\\func3 << " __stringify(INSN_S_FUNC3_SHIFT) ") |"    \
> +"                 (.L__gpr_num_\\rs2 << " __stringify(INSN_S_RS2_SHIFT) ") |" \
> +"                 (.L__gpr_num_\\rs1 << " __stringify(INSN_S_RS1_SHIFT) ") |" \
> +"                 (((\\simm12 >> 5) & 0x7f) << " __stringify(INSN_S_SIMM7_SHIFT) "))\n" \
> +"        .endm\n"
> +
> 
> Does this make sense?

If we create a special version of INSN_S, then I suggest we create one
where its two SIMM fields are independent and then define prefetch
instructions like this

 #define PREFETCH_W(base, offset) \
     INSN_S_SPLIT_IMM(OPCODE_OP_IMM, FUNC3(6), __RS2(3), \
         SIMM_11_5(offset >> 5), SIMM_4_0(0), RS1(base))

which would allow simple review against the spec and potentially
support other instructions which use hard coded values in the
immediate fields.

But I'm not sure it's worth it. I think

 #define PREFETCH_W(base, offset) \
     INSN_S(OPCODE_OP_IMM, FUNC3(6), __RS2(3), \
         SIMM12(offset & ~0x1f), RS1(base))

is also pretty easy to review against the spec and we don't have any other
instructions yet with other requirements for the immediates.

Thanks,
drew

_______________________________________________
linux-riscv mailing list
linux-riscv@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-riscv

  reply	other threads:[~2024-01-04  9:47 UTC|newest]

Thread overview: 42+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-12-31  8:29 [PATCH V2 0/3] riscv: Add Zicbop & prefetchw support guoren
2023-12-31  8:29 ` [PATCH V2 1/3] riscv: Add Zicbop instruction definitions & cpufeature guoren
2024-01-02 10:32   ` Andrew Jones
2024-01-03  6:13     ` Guo Ren
2024-01-03  6:49       ` Andrew Jones
2024-01-03 19:44         ` Andrew Jones
2024-01-03 19:06     ` Leonardo Bras
2024-01-03  9:31   ` Clément Léger
2024-01-03 12:00     ` Andrew Jones
2024-01-11 10:31       ` Clément Léger
2024-01-11 10:45         ` Andrew Jones
2024-01-11 10:49           ` Clément Léger
2024-01-11 11:12             ` Conor Dooley
2024-01-03 18:52   ` Leonardo Bras
2024-01-03 19:29     ` Andrew Jones
2024-01-03 20:33       ` Leonardo Bras
2024-01-04  9:47         ` Andrew Jones [this message]
2024-01-04 15:03           ` Leonardo Bras
2024-01-04 16:40             ` Andrew Jones
2024-01-04 17:43               ` Leonardo Bras
2024-01-05 13:24                 ` Andrew Jones
2024-01-08 14:34                   ` Leonardo Bras
2024-01-08 15:24                     ` Andrew Jones
2024-01-08 16:14                       ` Leonardo Bras
2024-01-03 19:48   ` Andrew Jones
2024-01-03 20:34     ` Leonardo Bras
2023-12-31  8:29 ` [PATCH V2 2/3] riscv: Add ARCH_HAS_PRETCHW support with Zibop guoren
2024-01-01  2:29   ` Guo Ren
2024-01-03 19:04     ` Leonardo Bras
2024-01-02 10:45   ` Andrew Jones
2024-01-03  6:19     ` Guo Ren
2024-01-03 19:56       ` Andrew Jones
2024-01-05 13:31     ` Andrew Jones
2023-12-31  8:29 ` [PATCH V2 3/3] riscv: xchg: Prefetch the destination word for sc.w guoren
2024-01-02 11:18   ` Andrew Jones
2024-01-03  6:15     ` Guo Ren
2024-01-03 19:45       ` Leonardo Bras
2024-01-04  1:24         ` Guo Ren
2024-01-04  3:56           ` Leonardo Bras
2024-01-04  8:14             ` Guo Ren
2024-01-04 14:17               ` Leonardo Bras
2024-01-05  1:13                 ` Guo Ren

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20240104-4ecfb92d2f8c95fa773ca695@orel \
    --to=ajones@ventanamicro.com \
    --cc=atishp@atishpatra.org \
    --cc=bjorn@rivosinc.com \
    --cc=chao.wei@sophgo.com \
    --cc=conor.dooley@microchip.com \
    --cc=guoren@kernel.org \
    --cc=guoren@linux.alibaba.com \
    --cc=jszhang@kernel.org \
    --cc=keescook@chromium.org \
    --cc=leobras@redhat.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-riscv@lists.infradead.org \
    --cc=palmer@dabbelt.com \
    --cc=panqinglin2020@iscas.ac.cn \
    --cc=paul.walmsley@sifive.com \
    --cc=peterz@infradead.org \
    --cc=unicorn_wang@outlook.com \
    --cc=wefu@redhat.com \
    --cc=wuwei2016@iscas.ac.cn \
    --cc=xiaoguang.xing@sophgo.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).