Skip to content

Commit f0f4e64

Browse files
Alexandre Ghitipalmer-dabbelt
authored andcommitted
riscv: Introduce Zicbop instructions
The S-type instructions are first introduced and then used to define the encoding of the Zicbop prefetching instructions. Co-developed-by: Guo Ren <[email protected]> Signed-off-by: Guo Ren <[email protected]> Tested-by: Andrea Parri <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Alexandre Ghiti <[email protected]> Signed-off-by: Palmer Dabbelt <[email protected]>
1 parent 850d7b1 commit f0f4e64

File tree

1 file changed

+60
-0
lines changed

1 file changed

+60
-0
lines changed

arch/riscv/include/asm/insn-def.h

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,13 @@
1818
#define INSN_I_RD_SHIFT 7
1919
#define INSN_I_OPCODE_SHIFT 0
2020

21+
#define INSN_S_SIMM7_SHIFT 25
22+
#define INSN_S_RS2_SHIFT 20
23+
#define INSN_S_RS1_SHIFT 15
24+
#define INSN_S_FUNC3_SHIFT 12
25+
#define INSN_S_SIMM5_SHIFT 7
26+
#define INSN_S_OPCODE_SHIFT 0
27+
2128
#ifdef __ASSEMBLY__
2229

2330
#ifdef CONFIG_AS_HAS_INSN
@@ -30,6 +37,10 @@
3037
.insn i \opcode, \func3, \rd, \rs1, \simm12
3138
.endm
3239

40+
.macro insn_s, opcode, func3, rs2, simm12, rs1
41+
.insn s \opcode, \func3, \rs2, \simm12(\rs1)
42+
.endm
43+
3344
#else
3445

3546
#include <asm/gpr-num.h>
@@ -51,10 +62,20 @@
5162
(\simm12 << INSN_I_SIMM12_SHIFT))
5263
.endm
5364

65+
.macro insn_s, opcode, func3, rs2, simm12, rs1
66+
.4byte ((\opcode << INSN_S_OPCODE_SHIFT) | \
67+
(\func3 << INSN_S_FUNC3_SHIFT) | \
68+
(.L__gpr_num_\rs2 << INSN_S_RS2_SHIFT) | \
69+
(.L__gpr_num_\rs1 << INSN_S_RS1_SHIFT) | \
70+
((\simm12 & 0x1f) << INSN_S_SIMM5_SHIFT) | \
71+
(((\simm12 >> 5) & 0x7f) << INSN_S_SIMM7_SHIFT))
72+
.endm
73+
5474
#endif
5575

5676
#define __INSN_R(...) insn_r __VA_ARGS__
5777
#define __INSN_I(...) insn_i __VA_ARGS__
78+
#define __INSN_S(...) insn_s __VA_ARGS__
5879

5980
#else /* ! __ASSEMBLY__ */
6081

@@ -66,6 +87,9 @@
6687
#define __INSN_I(opcode, func3, rd, rs1, simm12) \
6788
".insn i " opcode ", " func3 ", " rd ", " rs1 ", " simm12 "\n"
6889

90+
#define __INSN_S(opcode, func3, rs2, simm12, rs1) \
91+
".insn s " opcode ", " func3 ", " rs2 ", " simm12 "(" rs1 ")\n"
92+
6993
#else
7094

7195
#include <linux/stringify.h>
@@ -92,12 +116,26 @@
92116
" (\\simm12 << " __stringify(INSN_I_SIMM12_SHIFT) "))\n" \
93117
" .endm\n"
94118

119+
#define DEFINE_INSN_S \
120+
__DEFINE_ASM_GPR_NUMS \
121+
" .macro insn_s, opcode, func3, rs2, simm12, rs1\n" \
122+
" .4byte ((\\opcode << " __stringify(INSN_S_OPCODE_SHIFT) ") |" \
123+
" (\\func3 << " __stringify(INSN_S_FUNC3_SHIFT) ") |" \
124+
" (.L__gpr_num_\\rs2 << " __stringify(INSN_S_RS2_SHIFT) ") |" \
125+
" (.L__gpr_num_\\rs1 << " __stringify(INSN_S_RS1_SHIFT) ") |" \
126+
" ((\\simm12 & 0x1f) << " __stringify(INSN_S_SIMM5_SHIFT) ") |" \
127+
" (((\\simm12 >> 5) & 0x7f) << " __stringify(INSN_S_SIMM7_SHIFT) "))\n" \
128+
" .endm\n"
129+
95130
#define UNDEFINE_INSN_R \
96131
" .purgem insn_r\n"
97132

98133
#define UNDEFINE_INSN_I \
99134
" .purgem insn_i\n"
100135

136+
#define UNDEFINE_INSN_S \
137+
" .purgem insn_s\n"
138+
101139
#define __INSN_R(opcode, func3, func7, rd, rs1, rs2) \
102140
DEFINE_INSN_R \
103141
"insn_r " opcode ", " func3 ", " func7 ", " rd ", " rs1 ", " rs2 "\n" \
@@ -108,6 +146,11 @@
108146
"insn_i " opcode ", " func3 ", " rd ", " rs1 ", " simm12 "\n" \
109147
UNDEFINE_INSN_I
110148

149+
#define __INSN_S(opcode, func3, rs2, simm12, rs1) \
150+
DEFINE_INSN_S \
151+
"insn_s " opcode ", " func3 ", " rs2 ", " simm12 ", " rs1 "\n" \
152+
UNDEFINE_INSN_S
153+
111154
#endif
112155

113156
#endif /* ! __ASSEMBLY__ */
@@ -120,6 +163,10 @@
120163
__INSN_I(RV_##opcode, RV_##func3, RV_##rd, \
121164
RV_##rs1, RV_##simm12)
122165

166+
#define INSN_S(opcode, func3, rs2, simm12, rs1) \
167+
__INSN_S(RV_##opcode, RV_##func3, RV_##rs2, \
168+
RV_##simm12, RV_##rs1)
169+
123170
#define RV_OPCODE(v) __ASM_STR(v)
124171
#define RV_FUNC3(v) __ASM_STR(v)
125172
#define RV_FUNC7(v) __ASM_STR(v)
@@ -133,6 +180,7 @@
133180
#define RV___RS2(v) __RV_REG(v)
134181

135182
#define RV_OPCODE_MISC_MEM RV_OPCODE(15)
183+
#define RV_OPCODE_OP_IMM RV_OPCODE(19)
136184
#define RV_OPCODE_SYSTEM RV_OPCODE(115)
137185

138186
#define HFENCE_VVMA(vaddr, asid) \
@@ -196,6 +244,18 @@
196244
INSN_I(OPCODE_MISC_MEM, FUNC3(2), __RD(0), \
197245
RS1(base), SIMM12(4))
198246

247+
#define PREFETCH_I(base, offset) \
248+
INSN_S(OPCODE_OP_IMM, FUNC3(6), __RS2(0), \
249+
SIMM12((offset) & 0xfe0), RS1(base))
250+
251+
#define PREFETCH_R(base, offset) \
252+
INSN_S(OPCODE_OP_IMM, FUNC3(6), __RS2(1), \
253+
SIMM12((offset) & 0xfe0), RS1(base))
254+
255+
#define PREFETCH_W(base, offset) \
256+
INSN_S(OPCODE_OP_IMM, FUNC3(6), __RS2(3), \
257+
SIMM12((offset) & 0xfe0), RS1(base))
258+
199259
#define RISCV_PAUSE ".4byte 0x100000f"
200260
#define ZAWRS_WRS_NTO ".4byte 0x00d00073"
201261
#define ZAWRS_WRS_STO ".4byte 0x01d00073"

0 commit comments

Comments
 (0)