All of lore.kernel.org
 help / color / mirror / Atom feed
From: Leonardo Bras <leobras@redhat.com>
To: Andrew Jones <ajones@ventanamicro.com>
Cc: wefu@redhat.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,
	Leonardo Bras <leobras@redhat.com>,
	palmer@dabbelt.com, jszhang@kernel.org,
	panqinglin2020@iscas.ac.cn, Guo Ren <guoren@linux.alibaba.com>,
	guoren@kernel.org, linux-riscv@lists.infradead.org,
	wuwei2016@iscas.ac.cn
Subject: Re: Re: Re: Re: [PATCH V2 1/3] riscv: Add Zicbop instruction definitions & cpufeature
Date: Thu,  4 Jan 2024 14:43:04 -0300	[thread overview]
Message-ID: <ZZbuKCvATa7yyQOc@LeoBras> (raw)
In-Reply-To: <20240104-d6981cf63a39af4dff1d380a@orel>

On Thu, Jan 04, 2024 at 05:40:50PM +0100, Andrew Jones wrote:
> On Thu, Jan 04, 2024 at 12:03:57PM -0300, Leonardo Bras wrote:
> ...
> > > > > > 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.
> > > 
> > 
> > Sorry, I was unable to understand the reasoning.
> > 
> > If we are going to review the numbers sooner or later, would not it be 
> > better to have the instruction define to have "PREFETCH_W" instead of a 
> > number, and a unified list of defines for instructions.
> > 
> > This way we don't need to look into the code for 0's 1's and 3's, but 
> > instead just replace the number in the define list.
> > 
> > What am I missing?  
> 
> PREFETCH_W isn't defined as just 3, it's defined as
>    INSN_S(OPCODE_OP_IMM, FUNC3(6), __RS2(3), ...)
> 
> Adding a define (PREFETCH_W_RS2?) for the 3 just bloats the code and
> requires reviewers of PREFETCH_W to go look up another define.
> OPCODE_OP_IMM gets a define because it's used in multiple instructions,
> but everything else in an instruction definition should be a number
> exactly matching the spec, making it easy to review, or be an argument
> passed into the instruction macro.

Ok, I see your point now.
It's fine by me, then.


> 
> > 
> > > > 
> > > > > 
> > > > > > +
> > > > > > + #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 :) )
> 
> I forgot to reply to this before. The reason I think it may be possible to
> validate offset at compile time is because it must be a constant, i.e.
> __builtin_constant_p(offset) must return true. So maybe something like
> 
>  static_assert(__builtin_constant_p(offset) && !(offset & 0x1f))
> 
> I'll try to find time to play with it.
> 

Let me know if you find anything.

> > > > 
> > > > 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.
> > > 
> > 
> > I agree, it looks better this way.
> > 
> > We could have:
> > INSN_S_SPLIT_IMM(OPCODE, FUNC3, RS1, RS2, SIMM_11_5, SIMM_4_0)
> > 
> > and implement INSN_S like:
> > #define INSN_S(OPCODE, FUNC3, RS1, RS2, SIMM_11_0) \
> > 	INSN_S_SPLIT_IMM(OPCODE, FUNC3, RS1, RS2,  \
> > 		SIMM_11_0 >> 5, SIMM_11_0 & 0x1f)
> 
> That won't work since SIMM_11_0 will be a string. Actually, with
> stringification in mind, I don't think defining INSN_S_SPLIT_IMM()
> is a good idea.

I don't see how SIMM_11_0 will be a string here. Is this due to using it 
on asm code?

I understand a user will call 
---
PREFETCH_W(base, offset), which becomes:

INSN_S(OPCODE_OP_IMM, 6, base, 3, offset) , which becomes:

INSN_S_SPLIT_IMM(OPCODE_OP_IMM, FUNC3(6), RS1(base), RS2(3), \
	SIMM_11_5(offset >> 5), SIMM_4_0(offset & 0x1f))
---

I don't see an issue here, the same wouldwork for every INSN_S() 

Now suppose we make PREFETCH_W use SPLIT_IMM directly:
---
PREFETCH_W(base, offset), which becomes:

INSN_S_SPLIT_IMM(OPCODE_OP_IMM, FUNC3(6), RS1(base), RS2(3), \
	 SIMM_11_5(offset >> 5), SIMM_4_0(0))
---

I don't see how stringification gets in the way.

Thanks!
Leo




 #define CBO_PREFETCH(type, base, offset)                      \
> > > > > > +     INSN_S(OPCODE_OP_IMM, FUNC3(6), __RS2(type),              \
> > > > > > +            SIMM12(offset & ~0x1f), RS1(base))



> 
> Thanks,
> drew
> 


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

WARNING: multiple messages have this Message-ID (diff)
From: Leonardo Bras <leobras@redhat.com>
To: Andrew Jones <ajones@ventanamicro.com>
Cc: Leonardo Bras <leobras@redhat.com>,
	guoren@kernel.org, paul.walmsley@sifive.com, palmer@dabbelt.com,
	panqinglin2020@iscas.ac.cn, bjorn@rivosinc.com,
	conor.dooley@microchip.com, peterz@infradead.org,
	keescook@chromium.org, wuwei2016@iscas.ac.cn,
	xiaoguang.xing@sophgo.com, chao.wei@sophgo.com,
	unicorn_wang@outlook.com, uwu@icenowy.me, jszhang@kernel.org,
	wefu@redhat.com, atishp@atishpatra.org,
	linux-riscv@lists.infradead.org, linux-kernel@vger.kernel.org,
	Guo Ren <guoren@linux.alibaba.com>
Subject: Re: Re: Re: Re: [PATCH V2 1/3] riscv: Add Zicbop instruction definitions & cpufeature
Date: Thu,  4 Jan 2024 14:43:04 -0300	[thread overview]
Message-ID: <ZZbuKCvATa7yyQOc@LeoBras> (raw)
In-Reply-To: <20240104-d6981cf63a39af4dff1d380a@orel>

On Thu, Jan 04, 2024 at 05:40:50PM +0100, Andrew Jones wrote:
> On Thu, Jan 04, 2024 at 12:03:57PM -0300, Leonardo Bras wrote:
> ...
> > > > > > 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.
> > > 
> > 
> > Sorry, I was unable to understand the reasoning.
> > 
> > If we are going to review the numbers sooner or later, would not it be 
> > better to have the instruction define to have "PREFETCH_W" instead of a 
> > number, and a unified list of defines for instructions.
> > 
> > This way we don't need to look into the code for 0's 1's and 3's, but 
> > instead just replace the number in the define list.
> > 
> > What am I missing?  
> 
> PREFETCH_W isn't defined as just 3, it's defined as
>    INSN_S(OPCODE_OP_IMM, FUNC3(6), __RS2(3), ...)
> 
> Adding a define (PREFETCH_W_RS2?) for the 3 just bloats the code and
> requires reviewers of PREFETCH_W to go look up another define.
> OPCODE_OP_IMM gets a define because it's used in multiple instructions,
> but everything else in an instruction definition should be a number
> exactly matching the spec, making it easy to review, or be an argument
> passed into the instruction macro.

Ok, I see your point now.
It's fine by me, then.


> 
> > 
> > > > 
> > > > > 
> > > > > > +
> > > > > > + #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 :) )
> 
> I forgot to reply to this before. The reason I think it may be possible to
> validate offset at compile time is because it must be a constant, i.e.
> __builtin_constant_p(offset) must return true. So maybe something like
> 
>  static_assert(__builtin_constant_p(offset) && !(offset & 0x1f))
> 
> I'll try to find time to play with it.
> 

Let me know if you find anything.

> > > > 
> > > > 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.
> > > 
> > 
> > I agree, it looks better this way.
> > 
> > We could have:
> > INSN_S_SPLIT_IMM(OPCODE, FUNC3, RS1, RS2, SIMM_11_5, SIMM_4_0)
> > 
> > and implement INSN_S like:
> > #define INSN_S(OPCODE, FUNC3, RS1, RS2, SIMM_11_0) \
> > 	INSN_S_SPLIT_IMM(OPCODE, FUNC3, RS1, RS2,  \
> > 		SIMM_11_0 >> 5, SIMM_11_0 & 0x1f)
> 
> That won't work since SIMM_11_0 will be a string. Actually, with
> stringification in mind, I don't think defining INSN_S_SPLIT_IMM()
> is a good idea.

I don't see how SIMM_11_0 will be a string here. Is this due to using it 
on asm code?

I understand a user will call 
---
PREFETCH_W(base, offset), which becomes:

INSN_S(OPCODE_OP_IMM, 6, base, 3, offset) , which becomes:

INSN_S_SPLIT_IMM(OPCODE_OP_IMM, FUNC3(6), RS1(base), RS2(3), \
	SIMM_11_5(offset >> 5), SIMM_4_0(offset & 0x1f))
---

I don't see an issue here, the same wouldwork for every INSN_S() 

Now suppose we make PREFETCH_W use SPLIT_IMM directly:
---
PREFETCH_W(base, offset), which becomes:

INSN_S_SPLIT_IMM(OPCODE_OP_IMM, FUNC3(6), RS1(base), RS2(3), \
	 SIMM_11_5(offset >> 5), SIMM_4_0(0))
---

I don't see how stringification gets in the way.

Thanks!
Leo




 #define CBO_PREFETCH(type, base, offset)                      \
> > > > > > +     INSN_S(OPCODE_OP_IMM, FUNC3(6), __RS2(type),              \
> > > > > > +            SIMM12(offset & ~0x1f), RS1(base))



> 
> Thanks,
> drew
> 


  reply	other threads:[~2024-01-04 17:43 UTC|newest]

Thread overview: 84+ 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 ` guoren
2023-12-31  8:29 ` [PATCH V2 1/3] riscv: Add Zicbop instruction definitions & cpufeature guoren
2023-12-31  8:29   ` guoren
2024-01-02 10:32   ` Andrew Jones
2024-01-02 10:32     ` Andrew Jones
2024-01-03  6:13     ` Guo Ren
2024-01-03  6:13       ` Guo Ren
2024-01-03  6:49       ` Andrew Jones
2024-01-03  6:49         ` Andrew Jones
2024-01-03 19:44         ` Andrew Jones
2024-01-03 19:44           ` Andrew Jones
2024-01-03 19:06     ` Leonardo Bras
2024-01-03 19:06       ` Leonardo Bras
2024-01-03  9:31   ` Clément Léger
2024-01-03  9:31     ` Clément Léger
2024-01-03 12:00     ` Andrew Jones
2024-01-03 12:00       ` Andrew Jones
2024-01-11 10:31       ` Clément Léger
2024-01-11 10:31         ` Clément Léger
2024-01-11 10:45         ` Andrew Jones
2024-01-11 10:45           ` Andrew Jones
2024-01-11 10:49           ` Clément Léger
2024-01-11 10:49             ` Clément Léger
2024-01-11 11:12             ` Conor Dooley
2024-01-11 11:12               ` Conor Dooley
2024-01-03 18:52   ` Leonardo Bras
2024-01-03 18:52     ` Leonardo Bras
2024-01-03 19:29     ` Andrew Jones
2024-01-03 19:29       ` Andrew Jones
2024-01-03 20:33       ` Leonardo Bras
2024-01-03 20:33         ` Leonardo Bras
2024-01-04  9:47         ` Andrew Jones
2024-01-04  9:47           ` Andrew Jones
2024-01-04 15:03           ` Leonardo Bras
2024-01-04 15:03             ` Leonardo Bras
2024-01-04 16:40             ` Andrew Jones
2024-01-04 16:40               ` Andrew Jones
2024-01-04 17:43               ` Leonardo Bras [this message]
2024-01-04 17:43                 ` Leonardo Bras
2024-01-05 13:24                 ` Andrew Jones
2024-01-05 13:24                   ` Andrew Jones
2024-01-08 14:34                   ` Leonardo Bras
2024-01-08 14:34                     ` Leonardo Bras
2024-01-08 15:24                     ` Andrew Jones
2024-01-08 15:24                       ` Andrew Jones
2024-01-08 16:14                       ` Leonardo Bras
2024-01-08 16:14                         ` Leonardo Bras
2024-01-03 19:48   ` Andrew Jones
2024-01-03 19:48     ` Andrew Jones
2024-01-03 20:34     ` Leonardo Bras
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
2023-12-31  8:29   ` guoren
2024-01-01  2:29   ` Guo Ren
2024-01-01  2:29     ` Guo Ren
2024-01-03 19:04     ` Leonardo Bras
2024-01-03 19:04       ` Leonardo Bras
2024-01-02 10:45   ` Andrew Jones
2024-01-02 10:45     ` Andrew Jones
2024-01-03  6:19     ` Guo Ren
2024-01-03  6:19       ` Guo Ren
2024-01-03 19:56       ` Andrew Jones
2024-01-03 19:56         ` Andrew Jones
2024-01-05 13:31     ` 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
2023-12-31  8:29   ` guoren
2024-01-02 11:18   ` Andrew Jones
2024-01-02 11:18     ` Andrew Jones
2024-01-03  6:15     ` Guo Ren
2024-01-03  6:15       ` Guo Ren
2024-01-03 19:45       ` Leonardo Bras
2024-01-03 19:45         ` Leonardo Bras
2024-01-04  1:24         ` Guo Ren
2024-01-04  1:24           ` Guo Ren
2024-01-04  3:56           ` Leonardo Bras
2024-01-04  3:56             ` Leonardo Bras
2024-01-04  8:14             ` Guo Ren
2024-01-04  8:14               ` Guo Ren
2024-01-04 14:17               ` Leonardo Bras
2024-01-04 14:17                 ` Leonardo Bras
2024-01-05  1:13                 ` Guo Ren
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=ZZbuKCvATa7yyQOc@LeoBras \
    --to=leobras@redhat.com \
    --cc=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=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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.