|
18 | 18 | #define INSN_I_RD_SHIFT 7
|
19 | 19 | #define INSN_I_OPCODE_SHIFT 0
|
20 | 20 |
|
| 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 | + |
21 | 28 | #ifdef __ASSEMBLY__
|
22 | 29 |
|
23 | 30 | #ifdef CONFIG_AS_HAS_INSN
|
|
30 | 37 | .insn i \opcode, \func3, \rd, \rs1, \simm12
|
31 | 38 | .endm
|
32 | 39 |
|
| 40 | + .macro insn_s, opcode, func3, rs2, simm12, rs1 |
| 41 | + .insn s \opcode, \func3, \rs2, \simm12(\rs1) |
| 42 | + .endm |
| 43 | + |
33 | 44 | #else
|
34 | 45 |
|
35 | 46 | #include <asm/gpr-num.h>
|
|
51 | 62 | (\simm12 << INSN_I_SIMM12_SHIFT))
|
52 | 63 | .endm
|
53 | 64 |
|
| 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 | + |
54 | 74 | #endif
|
55 | 75 |
|
56 | 76 | #define __INSN_R(...) insn_r __VA_ARGS__
|
57 | 77 | #define __INSN_I(...) insn_i __VA_ARGS__
|
| 78 | +#define __INSN_S(...) insn_s __VA_ARGS__ |
58 | 79 |
|
59 | 80 | #else /* ! __ASSEMBLY__ */
|
60 | 81 |
|
|
66 | 87 | #define __INSN_I(opcode, func3, rd, rs1, simm12) \
|
67 | 88 | ".insn i " opcode ", " func3 ", " rd ", " rs1 ", " simm12 "\n"
|
68 | 89 |
|
| 90 | +#define __INSN_S(opcode, func3, rs2, simm12, rs1) \ |
| 91 | + ".insn s " opcode ", " func3 ", " rs2 ", " simm12 "(" rs1 ")\n" |
| 92 | + |
69 | 93 | #else
|
70 | 94 |
|
71 | 95 | #include <linux/stringify.h>
|
|
92 | 116 | " (\\simm12 << " __stringify(INSN_I_SIMM12_SHIFT) "))\n" \
|
93 | 117 | " .endm\n"
|
94 | 118 |
|
| 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 | + |
95 | 130 | #define UNDEFINE_INSN_R \
|
96 | 131 | " .purgem insn_r\n"
|
97 | 132 |
|
98 | 133 | #define UNDEFINE_INSN_I \
|
99 | 134 | " .purgem insn_i\n"
|
100 | 135 |
|
| 136 | +#define UNDEFINE_INSN_S \ |
| 137 | +" .purgem insn_s\n" |
| 138 | + |
101 | 139 | #define __INSN_R(opcode, func3, func7, rd, rs1, rs2) \
|
102 | 140 | DEFINE_INSN_R \
|
103 | 141 | "insn_r " opcode ", " func3 ", " func7 ", " rd ", " rs1 ", " rs2 "\n" \
|
|
108 | 146 | "insn_i " opcode ", " func3 ", " rd ", " rs1 ", " simm12 "\n" \
|
109 | 147 | UNDEFINE_INSN_I
|
110 | 148 |
|
| 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 | + |
111 | 154 | #endif
|
112 | 155 |
|
113 | 156 | #endif /* ! __ASSEMBLY__ */
|
|
120 | 163 | __INSN_I(RV_##opcode, RV_##func3, RV_##rd, \
|
121 | 164 | RV_##rs1, RV_##simm12)
|
122 | 165 |
|
| 166 | +#define INSN_S(opcode, func3, rs2, simm12, rs1) \ |
| 167 | + __INSN_S(RV_##opcode, RV_##func3, RV_##rs2, \ |
| 168 | + RV_##simm12, RV_##rs1) |
| 169 | + |
123 | 170 | #define RV_OPCODE(v) __ASM_STR(v)
|
124 | 171 | #define RV_FUNC3(v) __ASM_STR(v)
|
125 | 172 | #define RV_FUNC7(v) __ASM_STR(v)
|
|
133 | 180 | #define RV___RS2(v) __RV_REG(v)
|
134 | 181 |
|
135 | 182 | #define RV_OPCODE_MISC_MEM RV_OPCODE(15)
|
| 183 | +#define RV_OPCODE_OP_IMM RV_OPCODE(19) |
136 | 184 | #define RV_OPCODE_SYSTEM RV_OPCODE(115)
|
137 | 185 |
|
138 | 186 | #define HFENCE_VVMA(vaddr, asid) \
|
|
196 | 244 | INSN_I(OPCODE_MISC_MEM, FUNC3(2), __RD(0), \
|
197 | 245 | RS1(base), SIMM12(4))
|
198 | 246 |
|
| 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 | + |
199 | 259 | #define RISCV_PAUSE ".4byte 0x100000f"
|
200 | 260 | #define ZAWRS_WRS_NTO ".4byte 0x00d00073"
|
201 | 261 | #define ZAWRS_WRS_STO ".4byte 0x01d00073"
|
|
0 commit comments