NEORV32 Software Framework Documentation
The NEORV32 RISC-V Processor
Loading...
Searching...
No Matches
sw
lib
include
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
/**********************************************************************/
22
asm
(
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
Generated by
1.13.2