ETISS 0.8.0
Extendable Translating Instruction Set Simulator (version 0.8.0)
RV64IMACFDFuncs.c
Go to the documentation of this file.
1 
7 #include "RV64IMACFDFuncs.h"
8 
9 etiss_uint8 RV64IMACFD_extension_enabled(ETISS_CPU * const cpu, ETISS_System * const system, void * const * const plugin_pointers, etiss_int8 extension)
10 {
11 { // block
12 return (*((RV64IMACFD*)cpu)->CSR[769LL] >> (extension - 65ULL)) & 1ULL;
13 } // block
14 }
15 
16 etiss_uint8 RV64IMACFD_get_rm(ETISS_CPU * const cpu, ETISS_System * const system, void * const * const plugin_pointers, etiss_uint8 rm)
17 {
18 { // block
19 if (rm == 7ULL) { // conditional
20 rm = ((((((RV64IMACFD*)cpu)->FCSR) >> (5ULL)) & 7ULL)) & 0x7;
21 } // conditional
22 if (rm > 4ULL) { // conditional
23 RV64IMACFD_raise(cpu, system, plugin_pointers, 0LL, 2LL);
24 } // conditional
25 return rm;
26 } // block
27 }
28 
29 etiss_uint64 RV64IMACFD_sstatus_mask(ETISS_CPU * const cpu, ETISS_System * const system, void * const * const plugin_pointers)
30 {
31 { // block
32 etiss_uint64 mask = 0LL;
33 if (RV64IMACFD_extension_enabled(cpu, system, plugin_pointers, 83ULL)) { // conditional
34 { // block
35 mask = mask | 5767458ULL;
36 if (RV64IMACFD_extension_enabled(cpu, system, plugin_pointers, 86ULL)) { // conditional
37 mask = mask | 1536LL;
38 } // conditional
39 if (RV64IMACFD_extension_enabled(cpu, system, plugin_pointers, 70ULL)) { // conditional
40 mask = mask | 24576LL;
41 } // conditional
42 if (RV64IMACFD_extension_enabled(cpu, system, plugin_pointers, 88ULL)) { // conditional
43 mask = mask | 98304LL;
44 } // conditional
45 if ((RV64IMACFD_get_field(*((RV64IMACFD*)cpu)->CSR[384LL], 17293822569102704640ULL))) { // conditional
46 mask = mask | 262144LL;
47 } // conditional
48 } // block
49 } // conditional
50 return mask;
51 } // block
52 }
53 
54 etiss_uint64 RV64IMACFD_mstatus_mask(ETISS_CPU * const cpu, ETISS_System * const system, void * const * const plugin_pointers)
55 {
56 { // block
57 etiss_uint64 mask = 6280ULL;
58 return mask | RV64IMACFD_sstatus_mask(cpu, system, plugin_pointers);
59 } // block
60 }
61 
62 etiss_uint64 RV64IMACFD_csr_read(ETISS_CPU * const cpu, ETISS_System * const system, void * const * const plugin_pointers, etiss_uint32 csr)
63 {
64 { // block
65 if (csr == 1LL) { // conditional
66 return *((RV64IMACFD*)cpu)->CSR[3LL] & 31ULL;
67 } // conditional
68 if (csr == 2LL) { // conditional
69 return (*((RV64IMACFD*)cpu)->CSR[3LL] >> 5ULL) & 7ULL;
70 } // conditional
71 if (csr == 3072LL) { // conditional
72 return etiss_get_cycles(cpu, system, plugin_pointers);
73 } // conditional
74 if (csr == 3200LL) { // conditional
75 return etiss_get_cycles(cpu, system, plugin_pointers) >> 32ULL;
76 } // conditional
77 if (csr == 3073LL) { // conditional
78 return etiss_get_time();
79 } // conditional
80 if (csr == 3201LL) { // conditional
81 return etiss_get_time() >> 32ULL;
82 } // conditional
83 if (csr == 3074LL) { // conditional
84 return etiss_get_instret(cpu, system, plugin_pointers);
85 } // conditional
86 if (csr == 3202LL) { // conditional
87 return etiss_get_instret(cpu, system, plugin_pointers) >> 32ULL;
88 } // conditional
89 if (csr == 768LL || csr == 256LL) { // conditional
90 return *((RV64IMACFD*)cpu)->CSR[768LL] | 8589934592ULL | 34359738368ULL;
91 } // conditional
92 if (csr == 769LL) { // conditional
93 return (((2ULL) << 62) | ((((*((RV64IMACFD*)cpu)->CSR[769LL]) >> (0LL)) & 4611686018427387903ULL)));
94 } // conditional
95 return *((RV64IMACFD*)cpu)->CSR[csr];
96 } // block
97 }
98 
99 void RV64IMACFD_csr_write(ETISS_CPU * const cpu, ETISS_System * const system, void * const * const plugin_pointers, etiss_uint32 csr, etiss_uint64 val)
100 {
101 { // block
102 if (csr == 1LL) { // conditional
103 *((RV64IMACFD*)cpu)->CSR[3LL] = (*((RV64IMACFD*)cpu)->CSR[3LL] & 224ULL) | (val & 31ULL);
104 } // conditional
105  else if (csr == 2LL) { // conditional
106 *((RV64IMACFD*)cpu)->CSR[3LL] = ((val & 7ULL) << 5ULL) | (*((RV64IMACFD*)cpu)->CSR[3LL] & 31ULL);
107 } // conditional
108  else if (csr == 3LL) { // conditional
109 *((RV64IMACFD*)cpu)->CSR[3LL] = val & 255ULL;
110 } // conditional
111  else if (csr == 768LL) { // conditional
112 *((RV64IMACFD*)cpu)->CSR[768LL] = val & RV64IMACFD_mstatus_mask(cpu, system, plugin_pointers);
113 } // conditional
114  else if (csr == 256LL) { // conditional
115 *((RV64IMACFD*)cpu)->CSR[768LL] = val & RV64IMACFD_sstatus_mask(cpu, system, plugin_pointers);
116 } // conditional
117  else if (csr != 769LL) { // conditional
118 *((RV64IMACFD*)cpu)->CSR[csr] = val;
119 } // conditional
120 } // block
121 }
122 
124 {
125 { // block
126 if (!(mask)) { // conditional
127 return 0LL;
128 } // conditional
129 return (reg & mask) / (mask & ~((mask << 1ULL)));
130 } // block
131 }
132 
134 {
135 { // block
136 return ((reg & ~(mask)) | ((val * (mask & ~((mask << 1ULL)))) & mask));
137 } // block
138 }
139 
141 {
142 { // block
143 if (!(val)) { // conditional
144 return 0LL;
145 } // conditional
146 etiss_uint8 res = 0LL;
147 if ((val << 32ULL) == 0LL) { // conditional
148 { // block
149 res = res + 32ULL;
150 val = val >> 32ULL;
151 } // block
152 } // conditional
153 if ((val << 48ULL) == 0LL) { // conditional
154 { // block
155 res = res + 16ULL;
156 val = val >> 16ULL;
157 } // block
158 } // conditional
159 if ((val << 56ULL) == 0LL) { // conditional
160 { // block
161 res = res + 8ULL;
162 val = val >> 8ULL;
163 } // block
164 } // conditional
165 if ((val << 60ULL) == 0LL) { // conditional
166 { // block
167 res = res + 4ULL;
168 val = val >> 4ULL;
169 } // block
170 } // conditional
171 if ((val << 62ULL) == 0LL) { // conditional
172 { // block
173 res = res + 2ULL;
174 val = val >> 2ULL;
175 } // block
176 } // conditional
177 if ((val << 63ULL) == 0LL) { // conditional
178 { // block
179 res = res + 1ULL;
180 val = val >> 1ULL;
181 } // block
182 } // conditional
183 return res;
184 } // block
185 }
186 
187 void RV64IMACFD_raise(ETISS_CPU * const cpu, ETISS_System * const system, void * const * const plugin_pointers, etiss_int32 irq, etiss_uint64 mcause)
188 {
189 cpu->return_pending = 1;
190 cpu->exception = 0;
191 { // block
193 etiss_uint64 deleg = 0LL;
194 etiss_uint64 vector = 0LL;
195 etiss_uint64 bit = mcause;
196 etiss_int32 irq2 = (mcause & 9223372036854775808ULL) != 0LL;
197 if (irq2) { // conditional
198 { // block
199 deleg = ((((RV64IMACFD*)cpu)->PRIV <= 1LL)) ? (*((RV64IMACFD*)cpu)->CSR[771LL]) : (0LL);
200 bit = bit & 9223372036854775807ULL;
201 } // block
202 } // conditional
203 else { // conditional
204 { // block
205 deleg = ((((RV64IMACFD*)cpu)->PRIV <= 1LL)) ? (*((RV64IMACFD*)cpu)->CSR[770LL]) : (0LL);
206 } // block
207 } // conditional
208 if (((RV64IMACFD*)cpu)->PRIV <= 1LL && (deleg >> bit) & 1ULL) { // conditional
209 { // block
210 vector = ((*((RV64IMACFD*)cpu)->CSR[261LL] & 1ULL) && irq2) ? (bit * 4ULL) : (0LL);
211 cpu->nextPc = (*((RV64IMACFD*)cpu)->CSR[261LL] & -2LL) + vector;
212 *((RV64IMACFD*)cpu)->CSR[321LL] = epc;
213 *((RV64IMACFD*)cpu)->CSR[322LL] = mcause;
214 etiss_uint64 s = RV64IMACFD_csr_read(cpu, system, plugin_pointers, 256LL);
216 s = RV64IMACFD_set_field(s, 256LL, ((RV64IMACFD*)cpu)->PRIV);
217 s = RV64IMACFD_set_field(s, 2LL, 0LL);
218 RV64IMACFD_csr_write(cpu, system, plugin_pointers, 256LL, s);
219 ((RV64IMACFD*)cpu)->PRIV = (1LL) & 0x7;
220 } // block
221 } // conditional
222 else { // conditional
223 { // block
224 vector = ((*((RV64IMACFD*)cpu)->CSR[773LL] & 1ULL) && irq2) ? (bit * 4ULL) : (0LL);
225 cpu->nextPc = (*((RV64IMACFD*)cpu)->CSR[773LL] & -2LL) + vector;
226 *((RV64IMACFD*)cpu)->CSR[833LL] = epc;
227 *((RV64IMACFD*)cpu)->CSR[834LL] = mcause;
228 etiss_uint64 s = RV64IMACFD_csr_read(cpu, system, plugin_pointers, 768LL);
230 s = RV64IMACFD_set_field(s, 6144LL, ((RV64IMACFD*)cpu)->PRIV);
231 s = RV64IMACFD_set_field(s, 8LL, 0LL);
232 RV64IMACFD_csr_write(cpu, system, plugin_pointers, 768LL, s);
233 ((RV64IMACFD*)cpu)->PRIV = (3LL) & 0x7;
234 } // block
235 } // conditional
236 } // block
237 }
238 
239 void RV64IMACFD_translate_exc_code(ETISS_CPU * const cpu, ETISS_System * const system, void * const * const plugin_pointers, etiss_int32 cause)
240 {
241 { // block
242 etiss_uint64 code = 0LL;
243 if (cause == -2147483648LL) { // conditional
244 return;
245 } // conditional
246  else if (cause == -5LL) { // conditional
247 code = 5LL;
248 } // conditional
249  else if (cause == -14LL) { // conditional
250 code = 13LL;
251 } // conditional
252  else if (cause == -6LL) { // conditional
253 code = 7LL;
254 } // conditional
255  else if (cause == -15LL) { // conditional
256 code = 15LL;
257 } // conditional
258  else if (cause == -7LL) { // conditional
259 code = 1LL;
260 } // conditional
261  else if (cause == -9LL) { // conditional
262 { // block
263 code = RV64IMACFD_calc_irq_mcause(cpu, system, plugin_pointers);
264 if (!(code)) { // conditional
265 return;
266 } // conditional
267 } // block
268 } // conditional
269 else { // conditional
270 code = 2LL;
271 } // conditional
272 RV64IMACFD_raise(cpu, system, plugin_pointers, 0LL, code);
273 } // block
274 }
275 
276 etiss_uint64 RV64IMACFD_calc_irq_mcause(ETISS_CPU * const cpu, ETISS_System * const system, void * const * const plugin_pointers)
277 {
278 { // block
279 etiss_uint64 pending_interrupts = *((RV64IMACFD*)cpu)->CSR[772LL] & *((RV64IMACFD*)cpu)->CSR[836LL];
280 if (!(pending_interrupts)) { // conditional
281 return 0LL;
282 } // conditional
283 etiss_uint64 mie = RV64IMACFD_get_field(*((RV64IMACFD*)cpu)->CSR[768LL], 8LL);
284 etiss_uint64 m_enabled = ((RV64IMACFD*)cpu)->PRIV < 3LL || (((RV64IMACFD*)cpu)->PRIV == 3LL && mie);
285 etiss_uint64 enabled_interrupts = pending_interrupts & ~(*((RV64IMACFD*)cpu)->CSR[771LL]) & -(m_enabled);
286 if (enabled_interrupts == 0LL) { // conditional
287 { // block
288 etiss_uint64 deleg = *((RV64IMACFD*)cpu)->CSR[771LL];
289 etiss_uint64 sie = RV64IMACFD_get_field(RV64IMACFD_csr_read(cpu, system, plugin_pointers, 256LL), 2LL);
290 etiss_uint64 s_enabled = ((RV64IMACFD*)cpu)->PRIV < 1LL || (((RV64IMACFD*)cpu)->PRIV == 1LL && sie);
291 enabled_interrupts = pending_interrupts & deleg & -(s_enabled);
292 } // block
293 } // conditional
294 if (enabled_interrupts) { // conditional
295 { // block
296 if (enabled_interrupts >> 12ULL) { // conditional
297 enabled_interrupts = enabled_interrupts >> 12ULL << 12ULL;
298 } // conditional
299  else if (enabled_interrupts & 2048LL) { // conditional
300 enabled_interrupts = 2048LL;
301 } // conditional
302  else if (enabled_interrupts & 8LL) { // conditional
303 enabled_interrupts = 8LL;
304 } // conditional
305  else if (enabled_interrupts & 128LL) { // conditional
306 enabled_interrupts = 128LL;
307 } // conditional
308  else if (enabled_interrupts & 512LL) { // conditional
309 enabled_interrupts = 512LL;
310 } // conditional
311  else if (enabled_interrupts & 2LL) { // conditional
312 enabled_interrupts = 2LL;
313 } // conditional
314  else if (enabled_interrupts & 32LL) { // conditional
315 enabled_interrupts = 32LL;
316 } // conditional
317  else if (enabled_interrupts & 8192LL) { // conditional
318 enabled_interrupts = 8192LL;
319 } // conditional
320  else if (enabled_interrupts & 1024LL) { // conditional
321 enabled_interrupts = 1024LL;
322 } // conditional
323  else if (enabled_interrupts & 4LL) { // conditional
324 enabled_interrupts = 4LL;
325 } // conditional
326  else if (enabled_interrupts & 64LL) { // conditional
327 enabled_interrupts = 64LL;
328 } // conditional
329 else { // conditional
330 return 0LL;
331 } // conditional
332 return 9223372036854775808ULL | RV64IMACFD_ctz(enabled_interrupts);
333 } // block
334 } // conditional
335 return 0LL;
336 } // block
337 }
338 
339 void RV64IMACFD_check_irq(ETISS_CPU * const cpu, ETISS_System * const system, void * const * const plugin_pointers)
340 {
341 { // block
342 etiss_uint64 irq_mcause = RV64IMACFD_calc_irq_mcause(cpu, system, plugin_pointers);
343 if (irq_mcause) { // conditional
344 RV64IMACFD_raise(cpu, system, plugin_pointers, 1ULL, irq_mcause);
345 } // conditional
346 } // block
347 }
348 
350 {
351 { // block
352 etiss_int128 res = (etiss_int128)(x) * (etiss_int128)(y);
353 return (etiss_int64)((res >> 64ULL));
354 } // block
355 }
356 
358 {
359 { // block
360 etiss_int128 res = (etiss_int128)(x) * (etiss_uint128)(y);
361 return (etiss_int64)((res >> 64ULL));
362 } // block
363 }
364 
366 {
367 { // block
368 etiss_uint128 res = (etiss_uint128)(x) * (etiss_uint128)(y);
369 return (etiss_uint64)((res >> 64ULL));
370 } // block
371 }
etiss_uint64 RV64IMACFD_sstatus_mask(ETISS_CPU *const cpu, ETISS_System *const system, void *const *const plugin_pointers)
etiss_uint64 RV64IMACFD_set_field(etiss_uint64 reg, etiss_uint64 mask, etiss_uint64 val)
void RV64IMACFD_translate_exc_code(ETISS_CPU *const cpu, ETISS_System *const system, void *const *const plugin_pointers, etiss_int32 cause)
etiss_uint64 RV64IMACFD_mulhu(etiss_uint64 x, etiss_uint64 y)
etiss_uint64 RV64IMACFD_csr_read(ETISS_CPU *const cpu, ETISS_System *const system, void *const *const plugin_pointers, etiss_uint32 csr)
etiss_uint64 RV64IMACFD_calc_irq_mcause(ETISS_CPU *const cpu, ETISS_System *const system, void *const *const plugin_pointers)
etiss_uint64 RV64IMACFD_mstatus_mask(ETISS_CPU *const cpu, ETISS_System *const system, void *const *const plugin_pointers)
void RV64IMACFD_csr_write(ETISS_CPU *const cpu, ETISS_System *const system, void *const *const plugin_pointers, etiss_uint32 csr, etiss_uint64 val)
etiss_uint64 RV64IMACFD_get_field(etiss_uint64 reg, etiss_uint64 mask)
etiss_uint8 RV64IMACFD_extension_enabled(ETISS_CPU *const cpu, ETISS_System *const system, void *const *const plugin_pointers, etiss_int8 extension)
Generated on Wed, 08 May 2024 17:36:07 +0200.
void RV64IMACFD_check_irq(ETISS_CPU *const cpu, ETISS_System *const system, void *const *const plugin_pointers)
etiss_int64 RV64IMACFD_mulhsu(etiss_int64 x, etiss_uint64 y)
etiss_int64 RV64IMACFD_mulh(etiss_int64 x, etiss_int64 y)
etiss_uint8 RV64IMACFD_ctz(etiss_uint64 val)
void RV64IMACFD_raise(ETISS_CPU *const cpu, ETISS_System *const system, void *const *const plugin_pointers, etiss_int32 irq, etiss_uint64 mcause)
etiss_uint8 RV64IMACFD_get_rm(ETISS_CPU *const cpu, ETISS_System *const system, void *const *const plugin_pointers, etiss_uint8 rm)
__device__ __2f16 float bool s
etiss_uint64 etiss_get_instret(ETISS_CPU *const cpu, ETISS_System *const system, void *const *const plugin_pointers)
Definition: CSRCounters.cpp:26
etiss_uint64 etiss_get_time()
Definition: CSRCounters.cpp:18
etiss_uint64 etiss_get_cycles(ETISS_CPU *const cpu, ETISS_System *const system, void *const *const plugin_pointers)
Definition: CSRCounters.cpp:13
uint64_t etiss_uint64
Definition: types.h:96
uint32_t etiss_uint32
Definition: types.h:93
int64_t etiss_int64
Definition: types.h:95
int8_t etiss_int8
Definition: types.h:86
uint8_t etiss_uint8
Definition: types.h:87
int32_t etiss_int32
Definition: types.h:92
basic cpu state structure needed for execution of any cpu architecture.
Definition: CPU.h:89
etiss_uint64 instructionPointer
pointer to next instruction.
Definition: CPU.h:92
etiss_uint32 exception
Definition: CPU.h:111
etiss_uint64 nextPc
Definition: CPU.h:95
etiss_uint32 return_pending
Definition: CPU.h:112
memory access and time synchronization functions.
Definition: System.h:78
Generated on Wed, 08 May 2024 17:36:07 +0200.
Definition: RV64IMACFD.h:16