NEORV32 Software Framework Documentation
The NEORV32 RISC-V Processor
Loading...
Searching...
No Matches
neorv32_intrinsics.h
Go to the documentation of this file.
1// ================================================================================ //
2// The NEORV32 RISC-V Processor - https://github.com/stnolting/neorv32 //
3// Copyright (c) NEORV32 contributors. //
4// Copyright (c) 2020 - 2025 Stephan Nolting. All rights reserved. //
5// Licensed under the BSD-3-Clause license, see LICENSE for details. //
6// SPDX-License-Identifier: BSD-3-Clause //
7// ================================================================================ //
8
13
14#ifndef NEORV32_INTRINSICS_H
15#define NEORV32_INTRINSICS_H
16
17#include <stdint.h>
18
19/**********************************************************************/
22asm (
23 ".set reg_x0, 0 \n"
24 ".set reg_x1, 1 \n"
25 ".set reg_x2, 2 \n"
26 ".set reg_x3, 3 \n"
27 ".set reg_x4, 4 \n"
28 ".set reg_x5, 5 \n"
29 ".set reg_x6, 6 \n"
30 ".set reg_x7, 7 \n"
31 ".set reg_x8, 8 \n"
32 ".set reg_x9, 9 \n"
33 ".set reg_x10, 10 \n"
34 ".set reg_x11, 11 \n"
35 ".set reg_x12, 12 \n"
36 ".set reg_x13, 13 \n"
37 ".set reg_x14, 14 \n"
38 ".set reg_x15, 15 \n"
39#ifndef __riscv_32e
40 ".set reg_x16, 16 \n"
41 ".set reg_x17, 17 \n"
42 ".set reg_x18, 18 \n"
43 ".set reg_x19, 19 \n"
44 ".set reg_x20, 20 \n"
45 ".set reg_x21, 21 \n"
46 ".set reg_x22, 22 \n"
47 ".set reg_x23, 23 \n"
48 ".set reg_x24, 24 \n"
49 ".set reg_x25, 25 \n"
50 ".set reg_x26, 26 \n"
51 ".set reg_x27, 27 \n"
52 ".set reg_x28, 28 \n"
53 ".set reg_x29, 29 \n"
54 ".set reg_x30, 30 \n"
55 ".set reg_x31, 31 \n"
56#endif
57 ".set reg_zero, 0 \n"
58 ".set reg_ra, 1 \n"
59 ".set reg_sp, 2 \n"
60 ".set reg_gp, 3 \n"
61 ".set reg_tp, 4 \n"
62 ".set reg_t0, 5 \n"
63 ".set reg_t1, 6 \n"
64 ".set reg_t2, 7 \n"
65 ".set reg_s0, 8 \n"
66 ".set reg_s1, 9 \n"
67 ".set reg_a0, 10 \n"
68 ".set reg_a1, 11 \n"
69 ".set reg_a2, 12 \n"
70 ".set reg_a3, 13 \n"
71 ".set reg_a4, 14 \n"
72 ".set reg_a5, 15 \n"
73#ifndef __riscv_32e
74 ".set reg_a6, 16 \n"
75 ".set reg_a7, 17 \n"
76 ".set reg_s2, 18 \n"
77 ".set reg_s3, 19 \n"
78 ".set reg_s4, 20 \n"
79 ".set reg_s5, 21 \n"
80 ".set reg_s6, 22 \n"
81 ".set reg_s7, 23 \n"
82 ".set reg_s8, 24 \n"
83 ".set reg_s9, 25 \n"
84 ".set reg_s10, 26 \n"
85 ".set reg_s11, 27 \n"
86 ".set reg_t3, 28 \n"
87 ".set reg_t4, 29 \n"
88 ".set reg_t5, 30 \n"
89 ".set reg_t6, 31 \n"
90#endif
91);
92
93
94/**********************************************************************/
97#define CUSTOM_INSTR_R2_TYPE(funct7, funct5, rs1, funct3, opcode) \
98({ \
99 uint32_t __return; \
100 asm volatile( \
101 ".word ( \
102 (((" #funct7 ") & 0x7f) << 25) | \
103 (((" #funct5 ") & 0x1f) << 20) | \
104 ((( reg_%1 ) & 0x1f) << 15) | \
105 (((" #funct3 ") & 0x07) << 12) | \
106 ((( reg_%0 ) & 0x1f) << 7) | \
107 (((" #opcode ") & 0x7f) << 0) \
108 );" \
109 : [rd] "=r" (__return) \
110 : "r" (rs1) \
111 ); \
112 __return; \
113})
114
115
116/**********************************************************************/
119#define CUSTOM_INSTR_R3_TYPE(funct7, rs2, rs1, funct3, opcode) \
120({ \
121 uint32_t __return; \
122 asm volatile ( \
123 ".word ( \
124 (((" #funct7 ") & 0x7f) << 25) | \
125 ((( reg_%2 ) & 0x1f) << 20) | \
126 ((( reg_%1 ) & 0x1f) << 15) | \
127 (((" #funct3 ") & 0x07) << 12) | \
128 ((( reg_%0 ) & 0x1f) << 7) | \
129 (((" #opcode ") & 0x7f) << 0) \
130 );" \
131 : [rd] "=r" (__return) \
132 : "r" (rs1), \
133 "r" (rs2) \
134 ); \
135 __return; \
136})
137
138
139/**********************************************************************/
142#define CUSTOM_INSTR_R4_TYPE(rs3, rs2, rs1, funct3, opcode) \
143({ \
144 uint32_t __return; \
145 asm volatile ( \
146 ".word ( \
147 ((( reg_%3 ) & 0x1f) << 27) | \
148 ((( reg_%2 ) & 0x1f) << 20) | \
149 ((( reg_%1 ) & 0x1f) << 15) | \
150 (((" #funct3 ") & 0x07) << 12) | \
151 ((( reg_%0 ) & 0x1f) << 7) | \
152 (((" #opcode ") & 0x7f) << 0) \
153 );" \
154 : [rd] "=r" (__return) \
155 : "r" (rs1), \
156 "r" (rs2), \
157 "r" (rs3) \
158 ); \
159 __return; \
160})
161
162
163/**********************************************************************/
166#define CUSTOM_INSTR_I_TYPE(imm12, rs1, funct3, opcode) \
167({ \
168 uint32_t __return; \
169 asm volatile ( \
170 ".word ( \
171 (((" #imm12 ") & 0xfff) << 20) | \
172 ((( reg_%1 ) & 0x1f) << 15) | \
173 (((" #funct3 ") & 0x07) << 12) | \
174 ((( reg_%0 ) & 0x1f) << 7) | \
175 (((" #opcode ") & 0x7f) << 0) \
176 );" \
177 : [rd] "=r" (__return) \
178 : "r" (rs1) \
179 ); \
180 __return; \
181})
182
183
184/**********************************************************************/
187#define CUSTOM_INSTR_S_TYPE(imm12, rs2, rs1, funct3, opcode) \
188({ \
189 asm volatile ( \
190 ".word ( \
191 ((((" #imm12 ") >> 5) & 0x7f) << 25) | \
192 ((( reg_%1 ) & 0x1f) << 20) | \
193 ((( reg_%0 ) & 0x1f) << 15) | \
194 (((" #funct3 ") & 0x07) << 12) | \
195 (((" #imm12 ") & 0x1f) << 7) | \
196 (((" #opcode ") & 0x7f) << 0) \
197 );" \
198 : \
199 : "r" (rs1), \
200 "r" (rs2) \
201 ); \
202})
203
204
205#endif // NEORV32_INTRINSICS_H