ETISS 0.11.2
ExtendableTranslatingInstructionSetSimulator(version0.11.2)
Loading...
Searching...
No Matches
RV64IMACFD_RV64IInstr.cpp
Go to the documentation of this file.
1// clang-format off
9#include "RV64IMACFDArch.h"
10#include "RV64IMACFDFuncs.h"
11
12using namespace etiss;
13using namespace etiss::instr;
14
15// LWU -------------------------------------------------------------------------
18 "lwu",
19 (uint32_t) 0x006003,
20 (uint32_t) 0x00707f,
22 {
23
24// -----------------------------------------------------------------------------
25
26// -----------------------------------------------------------------------------
27
28// -----------------------------------------------------------------------------
29// NOLINTBEGIN(clang-diagnostic-unused-but-set-variable)
30etiss_uint8 rd = 0;
31static BitArrayRange R_rd_0(11, 7);
32rd += R_rd_0.read(ba) << 0;
33etiss_uint8 rs1 = 0;
34static BitArrayRange R_rs1_0(19, 15);
35rs1 += R_rs1_0.read(ba) << 0;
36etiss_uint16 imm = 0;
37static BitArrayRange R_imm_0(31, 20);
38imm += R_imm_0.read(ba) << 0;
39
40// NOLINTEND(clang-diagnostic-unused-but-set-variable)
41// -----------------------------------------------------------------------------
42
43 {
45
46 cp.code() = std::string("//LWU\n");
47
48// -----------------------------------------------------------------------------
49cp.code() += "etiss_coverage_count(1, 184);\n";
50{ // block
51cp.code() += "etiss_coverage_count(1, 1169);\n";
52cp.code() += "{ // block\n";
53cp.code() += "cpu->nextPc = " + std::to_string(ic.current_address_ + 4) + "ULL;\n";
54cp.code() += "etiss_coverage_count(5, 1168, 1164, 1167, 1165, 1166);\n";
55cp.code() += "} // block\n";
56} // block
57{ // block
58cp.code() += "etiss_coverage_count(1, 6976);\n";
59cp.code() += "{ // block\n";
60cp.code() += "etiss_uint64 offs = *((RV64IMACFD*)cpu)->X[" + std::to_string(rs1 % 32ULL) + "ULL] + " + std::to_string(((etiss_int16)(((etiss_int16)imm) << (4)) >> (4))) + "LL;\n";
61cp.code() += "etiss_coverage_count(7, 6952, 6951, 6947, 6946, 6944, 6950, 6948);\n";
62cp.code() += "etiss_uint32 mem_val_0;\n";
63cp.code() += "cpu->exception |= (*(system->dread))(system->handle, cpu, offs, (etiss_uint8*)&mem_val_0, 4);\n";
64cp.code() += "if (cpu->exception) { // conditional\n";
65{ // procedure
66cp.code() += "{ // procedure\n";
67cp.code() += "RV64IMACFD_translate_exc_code(cpu, system, plugin_pointers, cpu->exception);\n";
68cp.code() += "goto instr_exit_" + std::to_string(ic.current_address_) + ";\n";
69cp.code() += "} // procedure\n";
70} // procedure
71cp.code() += "} // conditional\n";
72cp.code() += "etiss_uint32 res = (etiss_uint32)(mem_val_0);\n";
73cp.code() += "etiss_coverage_count(4, 6959, 6958, 6956, 6955);\n";
74cp.code() += "etiss_coverage_count(1, 6960);\n";
75if ((rd % 32ULL) != 0LL) { // conditional
76cp.code() += "etiss_coverage_count(5, 6966, 6963, 6961, 6964, 6965);\n";
77cp.code() += "*((RV64IMACFD*)cpu)->X[" + std::to_string(rd % 32ULL) + "ULL] = (etiss_uint64)(res);\n";
78cp.code() += "etiss_coverage_count(6, 6975, 6971, 6970, 6968, 6974, 6972);\n";
79} // conditional
80cp.code() += "} // block\n";
81} // block
82cp.code() += "instr_exit_" + std::to_string(ic.current_address_) + ":\n";
83cp.code() += "cpu->instructionPointer = cpu->nextPc;\n";
84// -----------------------------------------------------------------------------
85 cp.getAffectedRegisters().add("instructionPointer", 32);
86 }
87 {
89
90 cp.code() = std::string("//LWU\n");
91
92// -----------------------------------------------------------------------------
93cp.code() += "if (cpu->return_pending || cpu->exception) return cpu->exception;\n";
94// -----------------------------------------------------------------------------
95 }
96
97 return true;
98 },
99 0,
100 [] (BitArray & ba, Instruction & instr)
101 {
102// -----------------------------------------------------------------------------
103etiss_uint8 rd = 0;
104static BitArrayRange R_rd_0(11, 7);
105rd += R_rd_0.read(ba) << 0;
106etiss_uint8 rs1 = 0;
107static BitArrayRange R_rs1_0(19, 15);
108rs1 += R_rs1_0.read(ba) << 0;
109etiss_uint16 imm = 0;
110static BitArrayRange R_imm_0(31, 20);
111imm += R_imm_0.read(ba) << 0;
112
113// -----------------------------------------------------------------------------
114
115 std::stringstream ss;
116// -----------------------------------------------------------------------------
117ss << "lwu" << " # " << ba << (" [rd=" + std::to_string(rd) + " | rs1=" + std::to_string(rs1) + " | imm=" + std::to_string(imm) + "]");
118// -----------------------------------------------------------------------------
119 return ss.str();
120 }
121);
122
123// LD --------------------------------------------------------------------------
126 "ld",
127 (uint32_t) 0x003003,
128 (uint32_t) 0x00707f,
129 [] (BitArray & ba,etiss::CodeSet & cs,InstructionContext & ic)
130 {
131
132// -----------------------------------------------------------------------------
133
134// -----------------------------------------------------------------------------
135
136// -----------------------------------------------------------------------------
137// NOLINTBEGIN(clang-diagnostic-unused-but-set-variable)
138etiss_uint8 rd = 0;
139static BitArrayRange R_rd_0(11, 7);
140rd += R_rd_0.read(ba) << 0;
141etiss_uint8 rs1 = 0;
142static BitArrayRange R_rs1_0(19, 15);
143rs1 += R_rs1_0.read(ba) << 0;
144etiss_uint16 imm = 0;
145static BitArrayRange R_imm_0(31, 20);
146imm += R_imm_0.read(ba) << 0;
147
148// NOLINTEND(clang-diagnostic-unused-but-set-variable)
149// -----------------------------------------------------------------------------
150
151 {
153
154 cp.code() = std::string("//LD\n");
155
156// -----------------------------------------------------------------------------
157cp.code() += "etiss_coverage_count(1, 185);\n";
158{ // block
159cp.code() += "etiss_coverage_count(1, 1169);\n";
160cp.code() += "{ // block\n";
161cp.code() += "cpu->nextPc = " + std::to_string(ic.current_address_ + 4) + "ULL;\n";
162cp.code() += "etiss_coverage_count(5, 1168, 1164, 1167, 1165, 1166);\n";
163cp.code() += "} // block\n";
164} // block
165{ // block
166cp.code() += "etiss_coverage_count(1, 7010);\n";
167cp.code() += "{ // block\n";
168cp.code() += "etiss_uint64 offs = *((RV64IMACFD*)cpu)->X[" + std::to_string(rs1 % 32ULL) + "ULL] + " + std::to_string(((etiss_int16)(((etiss_int16)imm) << (4)) >> (4))) + "LL;\n";
169cp.code() += "etiss_coverage_count(7, 6986, 6985, 6982, 6981, 6979, 6984, 6983);\n";
170cp.code() += "etiss_uint64 mem_val_0;\n";
171cp.code() += "cpu->exception |= (*(system->dread))(system->handle, cpu, offs, (etiss_uint8*)&mem_val_0, 8);\n";
172cp.code() += "if (cpu->exception) { // conditional\n";
173{ // procedure
174cp.code() += "{ // procedure\n";
175cp.code() += "RV64IMACFD_translate_exc_code(cpu, system, plugin_pointers, cpu->exception);\n";
176cp.code() += "goto instr_exit_" + std::to_string(ic.current_address_) + ";\n";
177cp.code() += "} // procedure\n";
178} // procedure
179cp.code() += "} // conditional\n";
180cp.code() += "etiss_int64 res = (etiss_int64)(mem_val_0);\n";
181cp.code() += "etiss_coverage_count(4, 6993, 6992, 6990, 6989);\n";
182cp.code() += "etiss_coverage_count(1, 6994);\n";
183if ((rd % 32ULL) != 0LL) { // conditional
184cp.code() += "etiss_coverage_count(5, 7000, 6997, 6995, 6998, 6999);\n";
185cp.code() += "*((RV64IMACFD*)cpu)->X[" + std::to_string(rd % 32ULL) + "ULL] = (etiss_uint64)(res);\n";
186cp.code() += "etiss_coverage_count(6, 7009, 7005, 7004, 7002, 7008, 7006);\n";
187} // conditional
188cp.code() += "} // block\n";
189} // block
190cp.code() += "instr_exit_" + std::to_string(ic.current_address_) + ":\n";
191cp.code() += "cpu->instructionPointer = cpu->nextPc;\n";
192// -----------------------------------------------------------------------------
193 cp.getAffectedRegisters().add("instructionPointer", 32);
194 }
195 {
197
198 cp.code() = std::string("//LD\n");
199
200// -----------------------------------------------------------------------------
201cp.code() += "if (cpu->return_pending || cpu->exception) return cpu->exception;\n";
202// -----------------------------------------------------------------------------
203 }
204
205 return true;
206 },
207 0,
208 [] (BitArray & ba, Instruction & instr)
209 {
210// -----------------------------------------------------------------------------
211etiss_uint8 rd = 0;
212static BitArrayRange R_rd_0(11, 7);
213rd += R_rd_0.read(ba) << 0;
214etiss_uint8 rs1 = 0;
215static BitArrayRange R_rs1_0(19, 15);
216rs1 += R_rs1_0.read(ba) << 0;
217etiss_uint16 imm = 0;
218static BitArrayRange R_imm_0(31, 20);
219imm += R_imm_0.read(ba) << 0;
220
221// -----------------------------------------------------------------------------
222
223 std::stringstream ss;
224// -----------------------------------------------------------------------------
225ss << "ld" << " # " << ba << (" [rd=" + std::to_string(rd) + " | rs1=" + std::to_string(rs1) + " | imm=" + std::to_string(imm) + "]");
226// -----------------------------------------------------------------------------
227 return ss.str();
228 }
229);
230
231// SD --------------------------------------------------------------------------
234 "sd",
235 (uint32_t) 0x003023,
236 (uint32_t) 0x00707f,
237 [] (BitArray & ba,etiss::CodeSet & cs,InstructionContext & ic)
238 {
239
240// -----------------------------------------------------------------------------
241
242// -----------------------------------------------------------------------------
243
244// -----------------------------------------------------------------------------
245// NOLINTBEGIN(clang-diagnostic-unused-but-set-variable)
246etiss_uint16 imm = 0;
247static BitArrayRange R_imm_0(11, 7);
248imm += R_imm_0.read(ba) << 0;
249etiss_uint8 rs1 = 0;
250static BitArrayRange R_rs1_0(19, 15);
251rs1 += R_rs1_0.read(ba) << 0;
252etiss_uint8 rs2 = 0;
253static BitArrayRange R_rs2_0(24, 20);
254rs2 += R_rs2_0.read(ba) << 0;
255static BitArrayRange R_imm_5(31, 25);
256imm += R_imm_5.read(ba) << 5;
257
258// NOLINTEND(clang-diagnostic-unused-but-set-variable)
259// -----------------------------------------------------------------------------
260
261 {
263
264 cp.code() = std::string("//SD\n");
265
266// -----------------------------------------------------------------------------
267cp.code() += "etiss_coverage_count(1, 186);\n";
268{ // block
269cp.code() += "etiss_coverage_count(1, 1169);\n";
270cp.code() += "{ // block\n";
271cp.code() += "cpu->nextPc = " + std::to_string(ic.current_address_ + 4) + "ULL;\n";
272cp.code() += "etiss_coverage_count(5, 1168, 1164, 1167, 1165, 1166);\n";
273cp.code() += "} // block\n";
274} // block
275{ // block
276cp.code() += "etiss_coverage_count(1, 7032);\n";
277cp.code() += "{ // block\n";
278cp.code() += "etiss_uint64 offs = *((RV64IMACFD*)cpu)->X[" + std::to_string(rs1 % 32ULL) + "ULL] + " + std::to_string(((etiss_int16)(((etiss_int16)imm) << (4)) >> (4))) + "LL;\n";
279cp.code() += "etiss_coverage_count(7, 7020, 7019, 7016, 7015, 7013, 7018, 7017);\n";
280cp.code() += "etiss_uint64 mem_val_0;\n";
281cp.code() += "mem_val_0 = (etiss_uint64)(*((RV64IMACFD*)cpu)->X[" + std::to_string(rs2 % 32ULL) + "ULL]);\n";
282cp.code() += "etiss_coverage_count(7, 7031, 7023, 7022, 7030, 7028, 7027, 7025);\n";
283cp.code() += "cpu->exception |= (*(system->dwrite))(system->handle, cpu, offs, (etiss_uint8*)&mem_val_0, 8);\n";
284cp.code() += "if (cpu->exception) { // conditional\n";
285{ // procedure
286cp.code() += "{ // procedure\n";
287cp.code() += "RV64IMACFD_translate_exc_code(cpu, system, plugin_pointers, cpu->exception);\n";
288cp.code() += "goto instr_exit_" + std::to_string(ic.current_address_) + ";\n";
289cp.code() += "} // procedure\n";
290} // procedure
291cp.code() += "} // conditional\n";
292cp.code() += "} // block\n";
293} // block
294cp.code() += "instr_exit_" + std::to_string(ic.current_address_) + ":\n";
295cp.code() += "cpu->instructionPointer = cpu->nextPc;\n";
296// -----------------------------------------------------------------------------
297 cp.getAffectedRegisters().add("instructionPointer", 32);
298 }
299 {
301
302 cp.code() = std::string("//SD\n");
303
304// -----------------------------------------------------------------------------
305cp.code() += "if (cpu->return_pending || cpu->exception) return cpu->exception;\n";
306// -----------------------------------------------------------------------------
307 }
308
309 return true;
310 },
311 0,
312 [] (BitArray & ba, Instruction & instr)
313 {
314// -----------------------------------------------------------------------------
315etiss_uint16 imm = 0;
316static BitArrayRange R_imm_0(11, 7);
317imm += R_imm_0.read(ba) << 0;
318etiss_uint8 rs1 = 0;
319static BitArrayRange R_rs1_0(19, 15);
320rs1 += R_rs1_0.read(ba) << 0;
321etiss_uint8 rs2 = 0;
322static BitArrayRange R_rs2_0(24, 20);
323rs2 += R_rs2_0.read(ba) << 0;
324static BitArrayRange R_imm_5(31, 25);
325imm += R_imm_5.read(ba) << 5;
326
327// -----------------------------------------------------------------------------
328
329 std::stringstream ss;
330// -----------------------------------------------------------------------------
331ss << "sd" << " # " << ba << (" [imm=" + std::to_string(imm) + " | rs1=" + std::to_string(rs1) + " | rs2=" + std::to_string(rs2) + "]");
332// -----------------------------------------------------------------------------
333 return ss.str();
334 }
335);
336
337// SLLI ------------------------------------------------------------------------
340 "slli",
341 (uint32_t) 0x001013,
342 (uint32_t) 0xfc00707f,
343 [] (BitArray & ba,etiss::CodeSet & cs,InstructionContext & ic)
344 {
345
346// -----------------------------------------------------------------------------
347
348// -----------------------------------------------------------------------------
349
350// -----------------------------------------------------------------------------
351// NOLINTBEGIN(clang-diagnostic-unused-but-set-variable)
352etiss_uint8 rd = 0;
353static BitArrayRange R_rd_0(11, 7);
354rd += R_rd_0.read(ba) << 0;
355etiss_uint8 rs1 = 0;
356static BitArrayRange R_rs1_0(19, 15);
357rs1 += R_rs1_0.read(ba) << 0;
358etiss_uint8 shamt = 0;
359static BitArrayRange R_shamt_0(25, 20);
360shamt += R_shamt_0.read(ba) << 0;
361
362// NOLINTEND(clang-diagnostic-unused-but-set-variable)
363// -----------------------------------------------------------------------------
364
365 {
367
368 cp.code() = std::string("//SLLI\n");
369
370// -----------------------------------------------------------------------------
371cp.code() += "etiss_coverage_count(1, 187);\n";
372{ // block
373cp.code() += "etiss_coverage_count(1, 1169);\n";
374cp.code() += "{ // block\n";
375cp.code() += "cpu->nextPc = " + std::to_string(ic.current_address_ + 4) + "ULL;\n";
376cp.code() += "etiss_coverage_count(5, 1168, 1164, 1167, 1165, 1166);\n";
377cp.code() += "} // block\n";
378} // block
379cp.code() += "etiss_coverage_count(1, 7033);\n";
380if ((rd % 32ULL) != 0LL) { // conditional
381cp.code() += "etiss_coverage_count(5, 7039, 7036, 7034, 7037, 7038);\n";
382cp.code() += "*((RV64IMACFD*)cpu)->X[" + std::to_string(rd % 32ULL) + "ULL] = *((RV64IMACFD*)cpu)->X[" + std::to_string(rs1 % 32ULL) + "ULL] << " + std::to_string(shamt) + "ULL;\n";
383cp.code() += "etiss_coverage_count(9, 7052, 7044, 7043, 7041, 7051, 7049, 7048, 7046, 7050);\n";
384} // conditional
385cp.code() += "instr_exit_" + std::to_string(ic.current_address_) + ":\n";
386cp.code() += "cpu->instructionPointer = cpu->nextPc;\n";
387// -----------------------------------------------------------------------------
388 cp.getAffectedRegisters().add("instructionPointer", 32);
389 }
390
391 return true;
392 },
393 0,
394 [] (BitArray & ba, Instruction & instr)
395 {
396// -----------------------------------------------------------------------------
397etiss_uint8 rd = 0;
398static BitArrayRange R_rd_0(11, 7);
399rd += R_rd_0.read(ba) << 0;
400etiss_uint8 rs1 = 0;
401static BitArrayRange R_rs1_0(19, 15);
402rs1 += R_rs1_0.read(ba) << 0;
403etiss_uint8 shamt = 0;
404static BitArrayRange R_shamt_0(25, 20);
405shamt += R_shamt_0.read(ba) << 0;
406
407// -----------------------------------------------------------------------------
408
409 std::stringstream ss;
410// -----------------------------------------------------------------------------
411ss << "slli" << " # " << ba << (" [rd=" + std::to_string(rd) + " | rs1=" + std::to_string(rs1) + " | shamt=" + std::to_string(shamt) + "]");
412// -----------------------------------------------------------------------------
413 return ss.str();
414 }
415);
416
417// SRLI ------------------------------------------------------------------------
420 "srli",
421 (uint32_t) 0x005013,
422 (uint32_t) 0xfc00707f,
423 [] (BitArray & ba,etiss::CodeSet & cs,InstructionContext & ic)
424 {
425
426// -----------------------------------------------------------------------------
427
428// -----------------------------------------------------------------------------
429
430// -----------------------------------------------------------------------------
431// NOLINTBEGIN(clang-diagnostic-unused-but-set-variable)
432etiss_uint8 rd = 0;
433static BitArrayRange R_rd_0(11, 7);
434rd += R_rd_0.read(ba) << 0;
435etiss_uint8 rs1 = 0;
436static BitArrayRange R_rs1_0(19, 15);
437rs1 += R_rs1_0.read(ba) << 0;
438etiss_uint8 shamt = 0;
439static BitArrayRange R_shamt_0(25, 20);
440shamt += R_shamt_0.read(ba) << 0;
441
442// NOLINTEND(clang-diagnostic-unused-but-set-variable)
443// -----------------------------------------------------------------------------
444
445 {
447
448 cp.code() = std::string("//SRLI\n");
449
450// -----------------------------------------------------------------------------
451cp.code() += "etiss_coverage_count(1, 188);\n";
452{ // block
453cp.code() += "etiss_coverage_count(1, 1169);\n";
454cp.code() += "{ // block\n";
455cp.code() += "cpu->nextPc = " + std::to_string(ic.current_address_ + 4) + "ULL;\n";
456cp.code() += "etiss_coverage_count(5, 1168, 1164, 1167, 1165, 1166);\n";
457cp.code() += "} // block\n";
458} // block
459cp.code() += "etiss_coverage_count(1, 7053);\n";
460if ((rd % 32ULL) != 0LL) { // conditional
461cp.code() += "etiss_coverage_count(5, 7059, 7056, 7054, 7057, 7058);\n";
462cp.code() += "*((RV64IMACFD*)cpu)->X[" + std::to_string(rd % 32ULL) + "ULL] = *((RV64IMACFD*)cpu)->X[" + std::to_string(rs1 % 32ULL) + "ULL] >> " + std::to_string(shamt) + "ULL;\n";
463cp.code() += "etiss_coverage_count(9, 7072, 7064, 7063, 7061, 7071, 7069, 7068, 7066, 7070);\n";
464} // conditional
465cp.code() += "instr_exit_" + std::to_string(ic.current_address_) + ":\n";
466cp.code() += "cpu->instructionPointer = cpu->nextPc;\n";
467// -----------------------------------------------------------------------------
468 cp.getAffectedRegisters().add("instructionPointer", 32);
469 }
470
471 return true;
472 },
473 0,
474 [] (BitArray & ba, Instruction & instr)
475 {
476// -----------------------------------------------------------------------------
477etiss_uint8 rd = 0;
478static BitArrayRange R_rd_0(11, 7);
479rd += R_rd_0.read(ba) << 0;
480etiss_uint8 rs1 = 0;
481static BitArrayRange R_rs1_0(19, 15);
482rs1 += R_rs1_0.read(ba) << 0;
483etiss_uint8 shamt = 0;
484static BitArrayRange R_shamt_0(25, 20);
485shamt += R_shamt_0.read(ba) << 0;
486
487// -----------------------------------------------------------------------------
488
489 std::stringstream ss;
490// -----------------------------------------------------------------------------
491ss << "srli" << " # " << ba << (" [rd=" + std::to_string(rd) + " | rs1=" + std::to_string(rs1) + " | shamt=" + std::to_string(shamt) + "]");
492// -----------------------------------------------------------------------------
493 return ss.str();
494 }
495);
496
497// SRAI ------------------------------------------------------------------------
500 "srai",
501 (uint32_t) 0x40005013,
502 (uint32_t) 0xfc00707f,
503 [] (BitArray & ba,etiss::CodeSet & cs,InstructionContext & ic)
504 {
505
506// -----------------------------------------------------------------------------
507
508// -----------------------------------------------------------------------------
509
510// -----------------------------------------------------------------------------
511// NOLINTBEGIN(clang-diagnostic-unused-but-set-variable)
512etiss_uint8 rd = 0;
513static BitArrayRange R_rd_0(11, 7);
514rd += R_rd_0.read(ba) << 0;
515etiss_uint8 rs1 = 0;
516static BitArrayRange R_rs1_0(19, 15);
517rs1 += R_rs1_0.read(ba) << 0;
518etiss_uint8 shamt = 0;
519static BitArrayRange R_shamt_0(25, 20);
520shamt += R_shamt_0.read(ba) << 0;
521
522// NOLINTEND(clang-diagnostic-unused-but-set-variable)
523// -----------------------------------------------------------------------------
524
525 {
527
528 cp.code() = std::string("//SRAI\n");
529
530// -----------------------------------------------------------------------------
531cp.code() += "etiss_coverage_count(1, 189);\n";
532{ // block
533cp.code() += "etiss_coverage_count(1, 1169);\n";
534cp.code() += "{ // block\n";
535cp.code() += "cpu->nextPc = " + std::to_string(ic.current_address_ + 4) + "ULL;\n";
536cp.code() += "etiss_coverage_count(5, 1168, 1164, 1167, 1165, 1166);\n";
537cp.code() += "} // block\n";
538} // block
539cp.code() += "etiss_coverage_count(1, 7073);\n";
540if ((rd % 32ULL) != 0LL) { // conditional
541cp.code() += "etiss_coverage_count(5, 7079, 7076, 7074, 7077, 7078);\n";
542cp.code() += "*((RV64IMACFD*)cpu)->X[" + std::to_string(rd % 32ULL) + "ULL] = ((etiss_int64)(*((RV64IMACFD*)cpu)->X[" + std::to_string(rs1 % 32ULL) + "ULL])) >> " + std::to_string(shamt) + "ULL;\n";
543cp.code() += "etiss_coverage_count(11, 7094, 7084, 7083, 7081, 7093, 7090, 7089, 7088, 7086, 7091, 7092);\n";
544} // conditional
545cp.code() += "instr_exit_" + std::to_string(ic.current_address_) + ":\n";
546cp.code() += "cpu->instructionPointer = cpu->nextPc;\n";
547// -----------------------------------------------------------------------------
548 cp.getAffectedRegisters().add("instructionPointer", 32);
549 }
550
551 return true;
552 },
553 0,
554 [] (BitArray & ba, Instruction & instr)
555 {
556// -----------------------------------------------------------------------------
557etiss_uint8 rd = 0;
558static BitArrayRange R_rd_0(11, 7);
559rd += R_rd_0.read(ba) << 0;
560etiss_uint8 rs1 = 0;
561static BitArrayRange R_rs1_0(19, 15);
562rs1 += R_rs1_0.read(ba) << 0;
563etiss_uint8 shamt = 0;
564static BitArrayRange R_shamt_0(25, 20);
565shamt += R_shamt_0.read(ba) << 0;
566
567// -----------------------------------------------------------------------------
568
569 std::stringstream ss;
570// -----------------------------------------------------------------------------
571ss << "srai" << " # " << ba << (" [rd=" + std::to_string(rd) + " | rs1=" + std::to_string(rs1) + " | shamt=" + std::to_string(shamt) + "]");
572// -----------------------------------------------------------------------------
573 return ss.str();
574 }
575);
576
577// ADDIW -----------------------------------------------------------------------
580 "addiw",
581 (uint32_t) 0x00001b,
582 (uint32_t) 0x00707f,
583 [] (BitArray & ba,etiss::CodeSet & cs,InstructionContext & ic)
584 {
585
586// -----------------------------------------------------------------------------
587
588// -----------------------------------------------------------------------------
589
590// -----------------------------------------------------------------------------
591// NOLINTBEGIN(clang-diagnostic-unused-but-set-variable)
592etiss_uint8 rd = 0;
593static BitArrayRange R_rd_0(11, 7);
594rd += R_rd_0.read(ba) << 0;
595etiss_uint8 rs1 = 0;
596static BitArrayRange R_rs1_0(19, 15);
597rs1 += R_rs1_0.read(ba) << 0;
598etiss_uint16 imm = 0;
599static BitArrayRange R_imm_0(31, 20);
600imm += R_imm_0.read(ba) << 0;
601
602// NOLINTEND(clang-diagnostic-unused-but-set-variable)
603// -----------------------------------------------------------------------------
604
605 {
607
608 cp.code() = std::string("//ADDIW\n");
609
610// -----------------------------------------------------------------------------
611cp.code() += "etiss_coverage_count(1, 190);\n";
612{ // block
613cp.code() += "etiss_coverage_count(1, 1169);\n";
614cp.code() += "{ // block\n";
615cp.code() += "cpu->nextPc = " + std::to_string(ic.current_address_ + 4) + "ULL;\n";
616cp.code() += "etiss_coverage_count(5, 1168, 1164, 1167, 1165, 1166);\n";
617cp.code() += "} // block\n";
618} // block
619{ // block
620cp.code() += "etiss_coverage_count(1, 7122);\n";
621cp.code() += "{ // block\n";
622cp.code() += "etiss_coverage_count(1, 7095);\n";
623if ((rd % 32ULL) != 0LL) { // conditional
624cp.code() += "etiss_coverage_count(5, 7101, 7098, 7096, 7099, 7100);\n";
625{ // block
626cp.code() += "etiss_coverage_count(1, 7121);\n";
627cp.code() += "{ // block\n";
628cp.code() += "etiss_int32 res = *((RV64IMACFD*)cpu)->X[" + std::to_string(rs1 % 32ULL) + "ULL] + " + std::to_string(((etiss_int16)(((etiss_int16)imm) << (4)) >> (4))) + "LL;\n";
629cp.code() += "etiss_coverage_count(7, 7111, 7110, 7107, 7106, 7104, 7109, 7108);\n";
630cp.code() += "*((RV64IMACFD*)cpu)->X[" + std::to_string(rd % 32ULL) + "ULL] = (etiss_int64)(res);\n";
631cp.code() += "etiss_coverage_count(6, 7120, 7116, 7115, 7113, 7119, 7117);\n";
632cp.code() += "} // block\n";
633} // block
634} // conditional
635cp.code() += "} // block\n";
636} // block
637cp.code() += "instr_exit_" + std::to_string(ic.current_address_) + ":\n";
638cp.code() += "cpu->instructionPointer = cpu->nextPc;\n";
639// -----------------------------------------------------------------------------
640 cp.getAffectedRegisters().add("instructionPointer", 32);
641 }
642
643 return true;
644 },
645 0,
646 [] (BitArray & ba, Instruction & instr)
647 {
648// -----------------------------------------------------------------------------
649etiss_uint8 rd = 0;
650static BitArrayRange R_rd_0(11, 7);
651rd += R_rd_0.read(ba) << 0;
652etiss_uint8 rs1 = 0;
653static BitArrayRange R_rs1_0(19, 15);
654rs1 += R_rs1_0.read(ba) << 0;
655etiss_uint16 imm = 0;
656static BitArrayRange R_imm_0(31, 20);
657imm += R_imm_0.read(ba) << 0;
658
659// -----------------------------------------------------------------------------
660
661 std::stringstream ss;
662// -----------------------------------------------------------------------------
663ss << "addiw" << " # " << ba << (" [rd=" + std::to_string(rd) + " | rs1=" + std::to_string(rs1) + " | imm=" + std::to_string(imm) + "]");
664// -----------------------------------------------------------------------------
665 return ss.str();
666 }
667);
668
669// SLLIW -----------------------------------------------------------------------
672 "slliw",
673 (uint32_t) 0x00101b,
674 (uint32_t) 0xfe00707f,
675 [] (BitArray & ba,etiss::CodeSet & cs,InstructionContext & ic)
676 {
677
678// -----------------------------------------------------------------------------
679
680// -----------------------------------------------------------------------------
681
682// -----------------------------------------------------------------------------
683// NOLINTBEGIN(clang-diagnostic-unused-but-set-variable)
684etiss_uint8 rd = 0;
685static BitArrayRange R_rd_0(11, 7);
686rd += R_rd_0.read(ba) << 0;
687etiss_uint8 rs1 = 0;
688static BitArrayRange R_rs1_0(19, 15);
689rs1 += R_rs1_0.read(ba) << 0;
690etiss_uint8 shamt = 0;
691static BitArrayRange R_shamt_0(24, 20);
692shamt += R_shamt_0.read(ba) << 0;
693
694// NOLINTEND(clang-diagnostic-unused-but-set-variable)
695// -----------------------------------------------------------------------------
696
697 {
699
700 cp.code() = std::string("//SLLIW\n");
701
702// -----------------------------------------------------------------------------
703cp.code() += "etiss_coverage_count(1, 191);\n";
704{ // block
705cp.code() += "etiss_coverage_count(1, 1169);\n";
706cp.code() += "{ // block\n";
707cp.code() += "cpu->nextPc = " + std::to_string(ic.current_address_ + 4) + "ULL;\n";
708cp.code() += "etiss_coverage_count(5, 1168, 1164, 1167, 1165, 1166);\n";
709cp.code() += "} // block\n";
710} // block
711{ // block
712cp.code() += "etiss_coverage_count(1, 7153);\n";
713cp.code() += "{ // block\n";
714cp.code() += "etiss_coverage_count(1, 7123);\n";
715if ((rd % 32ULL) != 0LL) { // conditional
716cp.code() += "etiss_coverage_count(5, 7129, 7126, 7124, 7127, 7128);\n";
717{ // block
718cp.code() += "etiss_coverage_count(1, 7152);\n";
719cp.code() += "{ // block\n";
720cp.code() += "etiss_uint32 sh_val = ((etiss_uint32)(*((RV64IMACFD*)cpu)->X[" + std::to_string(rs1 % 32ULL) + "ULL])) << " + std::to_string(shamt) + "ULL;\n";
721cp.code() += "etiss_coverage_count(8, 7141, 7140, 7137, 7135, 7134, 7132, 7138, 7139);\n";
722cp.code() += "*((RV64IMACFD*)cpu)->X[" + std::to_string(rd % 32ULL) + "ULL] = (etiss_uint64)((etiss_int32)(sh_val));\n";
723cp.code() += "etiss_coverage_count(7, 7151, 7146, 7145, 7143, 7150, 7148, 7147);\n";
724cp.code() += "} // block\n";
725} // block
726} // conditional
727cp.code() += "} // block\n";
728} // block
729cp.code() += "instr_exit_" + std::to_string(ic.current_address_) + ":\n";
730cp.code() += "cpu->instructionPointer = cpu->nextPc;\n";
731// -----------------------------------------------------------------------------
732 cp.getAffectedRegisters().add("instructionPointer", 32);
733 }
734
735 return true;
736 },
737 0,
738 [] (BitArray & ba, Instruction & instr)
739 {
740// -----------------------------------------------------------------------------
741etiss_uint8 rd = 0;
742static BitArrayRange R_rd_0(11, 7);
743rd += R_rd_0.read(ba) << 0;
744etiss_uint8 rs1 = 0;
745static BitArrayRange R_rs1_0(19, 15);
746rs1 += R_rs1_0.read(ba) << 0;
747etiss_uint8 shamt = 0;
748static BitArrayRange R_shamt_0(24, 20);
749shamt += R_shamt_0.read(ba) << 0;
750
751// -----------------------------------------------------------------------------
752
753 std::stringstream ss;
754// -----------------------------------------------------------------------------
755ss << "slliw" << " # " << ba << (" [rd=" + std::to_string(rd) + " | rs1=" + std::to_string(rs1) + " | shamt=" + std::to_string(shamt) + "]");
756// -----------------------------------------------------------------------------
757 return ss.str();
758 }
759);
760
761// SRLIW -----------------------------------------------------------------------
764 "srliw",
765 (uint32_t) 0x00501b,
766 (uint32_t) 0xfe00707f,
767 [] (BitArray & ba,etiss::CodeSet & cs,InstructionContext & ic)
768 {
769
770// -----------------------------------------------------------------------------
771
772// -----------------------------------------------------------------------------
773
774// -----------------------------------------------------------------------------
775// NOLINTBEGIN(clang-diagnostic-unused-but-set-variable)
776etiss_uint8 rd = 0;
777static BitArrayRange R_rd_0(11, 7);
778rd += R_rd_0.read(ba) << 0;
779etiss_uint8 rs1 = 0;
780static BitArrayRange R_rs1_0(19, 15);
781rs1 += R_rs1_0.read(ba) << 0;
782etiss_uint8 shamt = 0;
783static BitArrayRange R_shamt_0(24, 20);
784shamt += R_shamt_0.read(ba) << 0;
785
786// NOLINTEND(clang-diagnostic-unused-but-set-variable)
787// -----------------------------------------------------------------------------
788
789 {
791
792 cp.code() = std::string("//SRLIW\n");
793
794// -----------------------------------------------------------------------------
795cp.code() += "etiss_coverage_count(1, 192);\n";
796{ // block
797cp.code() += "etiss_coverage_count(1, 1169);\n";
798cp.code() += "{ // block\n";
799cp.code() += "cpu->nextPc = " + std::to_string(ic.current_address_ + 4) + "ULL;\n";
800cp.code() += "etiss_coverage_count(5, 1168, 1164, 1167, 1165, 1166);\n";
801cp.code() += "} // block\n";
802} // block
803{ // block
804cp.code() += "etiss_coverage_count(1, 7184);\n";
805cp.code() += "{ // block\n";
806cp.code() += "etiss_coverage_count(1, 7154);\n";
807if ((rd % 32ULL) != 0LL) { // conditional
808cp.code() += "etiss_coverage_count(5, 7160, 7157, 7155, 7158, 7159);\n";
809{ // block
810cp.code() += "etiss_coverage_count(1, 7183);\n";
811cp.code() += "{ // block\n";
812cp.code() += "etiss_uint32 sh_val = ((etiss_uint32)(*((RV64IMACFD*)cpu)->X[" + std::to_string(rs1 % 32ULL) + "ULL])) >> " + std::to_string(shamt) + "ULL;\n";
813cp.code() += "etiss_coverage_count(8, 7172, 7171, 7168, 7166, 7165, 7163, 7169, 7170);\n";
814cp.code() += "*((RV64IMACFD*)cpu)->X[" + std::to_string(rd % 32ULL) + "ULL] = (etiss_uint64)((etiss_int32)(sh_val));\n";
815cp.code() += "etiss_coverage_count(7, 7182, 7177, 7176, 7174, 7181, 7179, 7178);\n";
816cp.code() += "} // block\n";
817} // block
818} // conditional
819cp.code() += "} // block\n";
820} // block
821cp.code() += "instr_exit_" + std::to_string(ic.current_address_) + ":\n";
822cp.code() += "cpu->instructionPointer = cpu->nextPc;\n";
823// -----------------------------------------------------------------------------
824 cp.getAffectedRegisters().add("instructionPointer", 32);
825 }
826
827 return true;
828 },
829 0,
830 [] (BitArray & ba, Instruction & instr)
831 {
832// -----------------------------------------------------------------------------
833etiss_uint8 rd = 0;
834static BitArrayRange R_rd_0(11, 7);
835rd += R_rd_0.read(ba) << 0;
836etiss_uint8 rs1 = 0;
837static BitArrayRange R_rs1_0(19, 15);
838rs1 += R_rs1_0.read(ba) << 0;
839etiss_uint8 shamt = 0;
840static BitArrayRange R_shamt_0(24, 20);
841shamt += R_shamt_0.read(ba) << 0;
842
843// -----------------------------------------------------------------------------
844
845 std::stringstream ss;
846// -----------------------------------------------------------------------------
847ss << "srliw" << " # " << ba << (" [rd=" + std::to_string(rd) + " | rs1=" + std::to_string(rs1) + " | shamt=" + std::to_string(shamt) + "]");
848// -----------------------------------------------------------------------------
849 return ss.str();
850 }
851);
852
853// SRAIW -----------------------------------------------------------------------
856 "sraiw",
857 (uint32_t) 0x4000501b,
858 (uint32_t) 0xfe00707f,
859 [] (BitArray & ba,etiss::CodeSet & cs,InstructionContext & ic)
860 {
861
862// -----------------------------------------------------------------------------
863
864// -----------------------------------------------------------------------------
865
866// -----------------------------------------------------------------------------
867// NOLINTBEGIN(clang-diagnostic-unused-but-set-variable)
868etiss_uint8 rd = 0;
869static BitArrayRange R_rd_0(11, 7);
870rd += R_rd_0.read(ba) << 0;
871etiss_uint8 rs1 = 0;
872static BitArrayRange R_rs1_0(19, 15);
873rs1 += R_rs1_0.read(ba) << 0;
874etiss_uint8 shamt = 0;
875static BitArrayRange R_shamt_0(24, 20);
876shamt += R_shamt_0.read(ba) << 0;
877
878// NOLINTEND(clang-diagnostic-unused-but-set-variable)
879// -----------------------------------------------------------------------------
880
881 {
883
884 cp.code() = std::string("//SRAIW\n");
885
886// -----------------------------------------------------------------------------
887cp.code() += "etiss_coverage_count(1, 193);\n";
888{ // block
889cp.code() += "etiss_coverage_count(1, 1169);\n";
890cp.code() += "{ // block\n";
891cp.code() += "cpu->nextPc = " + std::to_string(ic.current_address_ + 4) + "ULL;\n";
892cp.code() += "etiss_coverage_count(5, 1168, 1164, 1167, 1165, 1166);\n";
893cp.code() += "} // block\n";
894} // block
895{ // block
896cp.code() += "etiss_coverage_count(1, 7214);\n";
897cp.code() += "{ // block\n";
898cp.code() += "etiss_coverage_count(1, 7185);\n";
899if ((rd % 32ULL) != 0LL) { // conditional
900cp.code() += "etiss_coverage_count(5, 7191, 7188, 7186, 7189, 7190);\n";
901{ // block
902cp.code() += "etiss_coverage_count(1, 7213);\n";
903cp.code() += "{ // block\n";
904cp.code() += "etiss_int32 sh_val = ((etiss_int32)(*((RV64IMACFD*)cpu)->X[" + std::to_string(rs1 % 32ULL) + "ULL])) >> " + std::to_string(shamt) + "ULL;\n";
905cp.code() += "etiss_coverage_count(8, 7203, 7202, 7199, 7197, 7196, 7194, 7200, 7201);\n";
906cp.code() += "*((RV64IMACFD*)cpu)->X[" + std::to_string(rd % 32ULL) + "ULL] = (etiss_uint64)(sh_val);\n";
907cp.code() += "etiss_coverage_count(6, 7212, 7208, 7207, 7205, 7211, 7209);\n";
908cp.code() += "} // block\n";
909} // block
910} // conditional
911cp.code() += "} // block\n";
912} // block
913cp.code() += "instr_exit_" + std::to_string(ic.current_address_) + ":\n";
914cp.code() += "cpu->instructionPointer = cpu->nextPc;\n";
915// -----------------------------------------------------------------------------
916 cp.getAffectedRegisters().add("instructionPointer", 32);
917 }
918
919 return true;
920 },
921 0,
922 [] (BitArray & ba, Instruction & instr)
923 {
924// -----------------------------------------------------------------------------
925etiss_uint8 rd = 0;
926static BitArrayRange R_rd_0(11, 7);
927rd += R_rd_0.read(ba) << 0;
928etiss_uint8 rs1 = 0;
929static BitArrayRange R_rs1_0(19, 15);
930rs1 += R_rs1_0.read(ba) << 0;
931etiss_uint8 shamt = 0;
932static BitArrayRange R_shamt_0(24, 20);
933shamt += R_shamt_0.read(ba) << 0;
934
935// -----------------------------------------------------------------------------
936
937 std::stringstream ss;
938// -----------------------------------------------------------------------------
939ss << "sraiw" << " # " << ba << (" [rd=" + std::to_string(rd) + " | rs1=" + std::to_string(rs1) + " | shamt=" + std::to_string(shamt) + "]");
940// -----------------------------------------------------------------------------
941 return ss.str();
942 }
943);
944
945// ADDW ------------------------------------------------------------------------
948 "addw",
949 (uint32_t) 0x00003b,
950 (uint32_t) 0xfe00707f,
951 [] (BitArray & ba,etiss::CodeSet & cs,InstructionContext & ic)
952 {
953
954// -----------------------------------------------------------------------------
955
956// -----------------------------------------------------------------------------
957
958// -----------------------------------------------------------------------------
959// NOLINTBEGIN(clang-diagnostic-unused-but-set-variable)
960etiss_uint8 rd = 0;
961static BitArrayRange R_rd_0(11, 7);
962rd += R_rd_0.read(ba) << 0;
963etiss_uint8 rs1 = 0;
964static BitArrayRange R_rs1_0(19, 15);
965rs1 += R_rs1_0.read(ba) << 0;
966etiss_uint8 rs2 = 0;
967static BitArrayRange R_rs2_0(24, 20);
968rs2 += R_rs2_0.read(ba) << 0;
969
970// NOLINTEND(clang-diagnostic-unused-but-set-variable)
971// -----------------------------------------------------------------------------
972
973 {
975
976 cp.code() = std::string("//ADDW\n");
977
978// -----------------------------------------------------------------------------
979cp.code() += "etiss_coverage_count(1, 194);\n";
980{ // block
981cp.code() += "etiss_coverage_count(1, 1169);\n";
982cp.code() += "{ // block\n";
983cp.code() += "cpu->nextPc = " + std::to_string(ic.current_address_ + 4) + "ULL;\n";
984cp.code() += "etiss_coverage_count(5, 1168, 1164, 1167, 1165, 1166);\n";
985cp.code() += "} // block\n";
986} // block
987{ // block
988cp.code() += "etiss_coverage_count(1, 7249);\n";
989cp.code() += "{ // block\n";
990cp.code() += "etiss_coverage_count(1, 7215);\n";
991if ((rd % 32ULL) != 0LL) { // conditional
992cp.code() += "etiss_coverage_count(5, 7221, 7218, 7216, 7219, 7220);\n";
993{ // block
994cp.code() += "etiss_coverage_count(1, 7248);\n";
995cp.code() += "{ // block\n";
996cp.code() += "etiss_int32 res = (etiss_int32)(*((RV64IMACFD*)cpu)->X[" + std::to_string(rs1 % 32ULL) + "ULL]) + (etiss_int32)(*((RV64IMACFD*)cpu)->X[" + std::to_string(rs2 % 32ULL) + "ULL]);\n";
997cp.code() += "etiss_coverage_count(10, 7238, 7237, 7229, 7227, 7226, 7224, 7236, 7234, 7233, 7231);\n";
998cp.code() += "*((RV64IMACFD*)cpu)->X[" + std::to_string(rd % 32ULL) + "ULL] = (etiss_int64)(res);\n";
999cp.code() += "etiss_coverage_count(6, 7247, 7243, 7242, 7240, 7246, 7244);\n";
1000cp.code() += "} // block\n";
1001} // block
1002} // conditional
1003cp.code() += "} // block\n";
1004} // block
1005cp.code() += "instr_exit_" + std::to_string(ic.current_address_) + ":\n";
1006cp.code() += "cpu->instructionPointer = cpu->nextPc;\n";
1007// -----------------------------------------------------------------------------
1008 cp.getAffectedRegisters().add("instructionPointer", 32);
1009 }
1010
1011 return true;
1012 },
1013 0,
1014 [] (BitArray & ba, Instruction & instr)
1015 {
1016// -----------------------------------------------------------------------------
1017etiss_uint8 rd = 0;
1018static BitArrayRange R_rd_0(11, 7);
1019rd += R_rd_0.read(ba) << 0;
1020etiss_uint8 rs1 = 0;
1021static BitArrayRange R_rs1_0(19, 15);
1022rs1 += R_rs1_0.read(ba) << 0;
1023etiss_uint8 rs2 = 0;
1024static BitArrayRange R_rs2_0(24, 20);
1025rs2 += R_rs2_0.read(ba) << 0;
1026
1027// -----------------------------------------------------------------------------
1028
1029 std::stringstream ss;
1030// -----------------------------------------------------------------------------
1031ss << "addw" << " # " << ba << (" [rd=" + std::to_string(rd) + " | rs1=" + std::to_string(rs1) + " | rs2=" + std::to_string(rs2) + "]");
1032// -----------------------------------------------------------------------------
1033 return ss.str();
1034 }
1035);
1036
1037// SUBW ------------------------------------------------------------------------
1040 "subw",
1041 (uint32_t) 0x4000003b,
1042 (uint32_t) 0xfe00707f,
1043 [] (BitArray & ba,etiss::CodeSet & cs,InstructionContext & ic)
1044 {
1045
1046// -----------------------------------------------------------------------------
1047
1048// -----------------------------------------------------------------------------
1049
1050// -----------------------------------------------------------------------------
1051// NOLINTBEGIN(clang-diagnostic-unused-but-set-variable)
1052etiss_uint8 rd = 0;
1053static BitArrayRange R_rd_0(11, 7);
1054rd += R_rd_0.read(ba) << 0;
1055etiss_uint8 rs1 = 0;
1056static BitArrayRange R_rs1_0(19, 15);
1057rs1 += R_rs1_0.read(ba) << 0;
1058etiss_uint8 rs2 = 0;
1059static BitArrayRange R_rs2_0(24, 20);
1060rs2 += R_rs2_0.read(ba) << 0;
1061
1062// NOLINTEND(clang-diagnostic-unused-but-set-variable)
1063// -----------------------------------------------------------------------------
1064
1065 {
1067
1068 cp.code() = std::string("//SUBW\n");
1069
1070// -----------------------------------------------------------------------------
1071cp.code() += "etiss_coverage_count(1, 195);\n";
1072{ // block
1073cp.code() += "etiss_coverage_count(1, 1169);\n";
1074cp.code() += "{ // block\n";
1075cp.code() += "cpu->nextPc = " + std::to_string(ic.current_address_ + 4) + "ULL;\n";
1076cp.code() += "etiss_coverage_count(5, 1168, 1164, 1167, 1165, 1166);\n";
1077cp.code() += "} // block\n";
1078} // block
1079{ // block
1080cp.code() += "etiss_coverage_count(1, 7284);\n";
1081cp.code() += "{ // block\n";
1082cp.code() += "etiss_coverage_count(1, 7250);\n";
1083if ((rd % 32ULL) != 0LL) { // conditional
1084cp.code() += "etiss_coverage_count(5, 7256, 7253, 7251, 7254, 7255);\n";
1085{ // block
1086cp.code() += "etiss_coverage_count(1, 7283);\n";
1087cp.code() += "{ // block\n";
1088cp.code() += "etiss_int32 res = (etiss_int32)(*((RV64IMACFD*)cpu)->X[" + std::to_string(rs1 % 32ULL) + "ULL]) - (etiss_int32)(*((RV64IMACFD*)cpu)->X[" + std::to_string(rs2 % 32ULL) + "ULL]);\n";
1089cp.code() += "etiss_coverage_count(10, 7273, 7272, 7264, 7262, 7261, 7259, 7271, 7269, 7268, 7266);\n";
1090cp.code() += "*((RV64IMACFD*)cpu)->X[" + std::to_string(rd % 32ULL) + "ULL] = (etiss_int64)(res);\n";
1091cp.code() += "etiss_coverage_count(6, 7282, 7278, 7277, 7275, 7281, 7279);\n";
1092cp.code() += "} // block\n";
1093} // block
1094} // conditional
1095cp.code() += "} // block\n";
1096} // block
1097cp.code() += "instr_exit_" + std::to_string(ic.current_address_) + ":\n";
1098cp.code() += "cpu->instructionPointer = cpu->nextPc;\n";
1099// -----------------------------------------------------------------------------
1100 cp.getAffectedRegisters().add("instructionPointer", 32);
1101 }
1102
1103 return true;
1104 },
1105 0,
1106 [] (BitArray & ba, Instruction & instr)
1107 {
1108// -----------------------------------------------------------------------------
1109etiss_uint8 rd = 0;
1110static BitArrayRange R_rd_0(11, 7);
1111rd += R_rd_0.read(ba) << 0;
1112etiss_uint8 rs1 = 0;
1113static BitArrayRange R_rs1_0(19, 15);
1114rs1 += R_rs1_0.read(ba) << 0;
1115etiss_uint8 rs2 = 0;
1116static BitArrayRange R_rs2_0(24, 20);
1117rs2 += R_rs2_0.read(ba) << 0;
1118
1119// -----------------------------------------------------------------------------
1120
1121 std::stringstream ss;
1122// -----------------------------------------------------------------------------
1123ss << "subw" << " # " << ba << (" [rd=" + std::to_string(rd) + " | rs1=" + std::to_string(rs1) + " | rs2=" + std::to_string(rs2) + "]");
1124// -----------------------------------------------------------------------------
1125 return ss.str();
1126 }
1127);
1128
1129// SLLW ------------------------------------------------------------------------
1132 "sllw",
1133 (uint32_t) 0x00103b,
1134 (uint32_t) 0xfe00707f,
1135 [] (BitArray & ba,etiss::CodeSet & cs,InstructionContext & ic)
1136 {
1137
1138// -----------------------------------------------------------------------------
1139
1140// -----------------------------------------------------------------------------
1141
1142// -----------------------------------------------------------------------------
1143// NOLINTBEGIN(clang-diagnostic-unused-but-set-variable)
1144etiss_uint8 rd = 0;
1145static BitArrayRange R_rd_0(11, 7);
1146rd += R_rd_0.read(ba) << 0;
1147etiss_uint8 rs1 = 0;
1148static BitArrayRange R_rs1_0(19, 15);
1149rs1 += R_rs1_0.read(ba) << 0;
1150etiss_uint8 rs2 = 0;
1151static BitArrayRange R_rs2_0(24, 20);
1152rs2 += R_rs2_0.read(ba) << 0;
1153
1154// NOLINTEND(clang-diagnostic-unused-but-set-variable)
1155// -----------------------------------------------------------------------------
1156
1157 {
1159
1160 cp.code() = std::string("//SLLW\n");
1161
1162// -----------------------------------------------------------------------------
1163cp.code() += "etiss_coverage_count(1, 196);\n";
1164{ // block
1165cp.code() += "etiss_coverage_count(1, 1169);\n";
1166cp.code() += "{ // block\n";
1167cp.code() += "cpu->nextPc = " + std::to_string(ic.current_address_ + 4) + "ULL;\n";
1168cp.code() += "etiss_coverage_count(5, 1168, 1164, 1167, 1165, 1166);\n";
1169cp.code() += "} // block\n";
1170} // block
1171{ // block
1172cp.code() += "etiss_coverage_count(1, 7325);\n";
1173cp.code() += "{ // block\n";
1174cp.code() += "etiss_coverage_count(1, 7285);\n";
1175if ((rd % 32ULL) != 0LL) { // conditional
1176cp.code() += "etiss_coverage_count(5, 7291, 7288, 7286, 7289, 7290);\n";
1177{ // block
1178cp.code() += "etiss_coverage_count(1, 7324);\n";
1179cp.code() += "{ // block\n";
1180cp.code() += "etiss_uint32 count = (etiss_uint64)(*((RV64IMACFD*)cpu)->X[" + std::to_string(rs2 % 32ULL) + "ULL]) & 31ULL;\n";
1181cp.code() += "etiss_coverage_count(7, 7301, 7300, 7298, 7297, 7296, 7294, 7299);\n";
1182cp.code() += "etiss_uint32 sh_val = ((etiss_uint32)(*((RV64IMACFD*)cpu)->X[" + std::to_string(rs1 % 32ULL) + "ULL])) << count;\n";
1183cp.code() += "etiss_coverage_count(8, 7313, 7312, 7309, 7307, 7306, 7304, 7310, 7311);\n";
1184cp.code() += "*((RV64IMACFD*)cpu)->X[" + std::to_string(rd % 32ULL) + "ULL] = (etiss_uint64)((etiss_int32)(sh_val));\n";
1185cp.code() += "etiss_coverage_count(7, 7323, 7318, 7317, 7315, 7322, 7320, 7319);\n";
1186cp.code() += "} // block\n";
1187} // block
1188} // conditional
1189cp.code() += "} // block\n";
1190} // block
1191cp.code() += "instr_exit_" + std::to_string(ic.current_address_) + ":\n";
1192cp.code() += "cpu->instructionPointer = cpu->nextPc;\n";
1193// -----------------------------------------------------------------------------
1194 cp.getAffectedRegisters().add("instructionPointer", 32);
1195 }
1196
1197 return true;
1198 },
1199 0,
1200 [] (BitArray & ba, Instruction & instr)
1201 {
1202// -----------------------------------------------------------------------------
1203etiss_uint8 rd = 0;
1204static BitArrayRange R_rd_0(11, 7);
1205rd += R_rd_0.read(ba) << 0;
1206etiss_uint8 rs1 = 0;
1207static BitArrayRange R_rs1_0(19, 15);
1208rs1 += R_rs1_0.read(ba) << 0;
1209etiss_uint8 rs2 = 0;
1210static BitArrayRange R_rs2_0(24, 20);
1211rs2 += R_rs2_0.read(ba) << 0;
1212
1213// -----------------------------------------------------------------------------
1214
1215 std::stringstream ss;
1216// -----------------------------------------------------------------------------
1217ss << "sllw" << " # " << ba << (" [rd=" + std::to_string(rd) + " | rs1=" + std::to_string(rs1) + " | rs2=" + std::to_string(rs2) + "]");
1218// -----------------------------------------------------------------------------
1219 return ss.str();
1220 }
1221);
1222
1223// SRLW ------------------------------------------------------------------------
1226 "srlw",
1227 (uint32_t) 0x00503b,
1228 (uint32_t) 0xfe00707f,
1229 [] (BitArray & ba,etiss::CodeSet & cs,InstructionContext & ic)
1230 {
1231
1232// -----------------------------------------------------------------------------
1233
1234// -----------------------------------------------------------------------------
1235
1236// -----------------------------------------------------------------------------
1237// NOLINTBEGIN(clang-diagnostic-unused-but-set-variable)
1238etiss_uint8 rd = 0;
1239static BitArrayRange R_rd_0(11, 7);
1240rd += R_rd_0.read(ba) << 0;
1241etiss_uint8 rs1 = 0;
1242static BitArrayRange R_rs1_0(19, 15);
1243rs1 += R_rs1_0.read(ba) << 0;
1244etiss_uint8 rs2 = 0;
1245static BitArrayRange R_rs2_0(24, 20);
1246rs2 += R_rs2_0.read(ba) << 0;
1247
1248// NOLINTEND(clang-diagnostic-unused-but-set-variable)
1249// -----------------------------------------------------------------------------
1250
1251 {
1253
1254 cp.code() = std::string("//SRLW\n");
1255
1256// -----------------------------------------------------------------------------
1257cp.code() += "etiss_coverage_count(1, 197);\n";
1258{ // block
1259cp.code() += "etiss_coverage_count(1, 1169);\n";
1260cp.code() += "{ // block\n";
1261cp.code() += "cpu->nextPc = " + std::to_string(ic.current_address_ + 4) + "ULL;\n";
1262cp.code() += "etiss_coverage_count(5, 1168, 1164, 1167, 1165, 1166);\n";
1263cp.code() += "} // block\n";
1264} // block
1265{ // block
1266cp.code() += "etiss_coverage_count(1, 7366);\n";
1267cp.code() += "{ // block\n";
1268cp.code() += "etiss_coverage_count(1, 7326);\n";
1269if ((rd % 32ULL) != 0LL) { // conditional
1270cp.code() += "etiss_coverage_count(5, 7332, 7329, 7327, 7330, 7331);\n";
1271{ // block
1272cp.code() += "etiss_coverage_count(1, 7365);\n";
1273cp.code() += "{ // block\n";
1274cp.code() += "etiss_uint32 count = (etiss_uint64)(*((RV64IMACFD*)cpu)->X[" + std::to_string(rs2 % 32ULL) + "ULL]) & 31ULL;\n";
1275cp.code() += "etiss_coverage_count(7, 7342, 7341, 7339, 7338, 7337, 7335, 7340);\n";
1276cp.code() += "etiss_uint32 sh_val = ((etiss_uint32)(*((RV64IMACFD*)cpu)->X[" + std::to_string(rs1 % 32ULL) + "ULL])) >> count;\n";
1277cp.code() += "etiss_coverage_count(8, 7354, 7353, 7350, 7348, 7347, 7345, 7351, 7352);\n";
1278cp.code() += "*((RV64IMACFD*)cpu)->X[" + std::to_string(rd % 32ULL) + "ULL] = (etiss_uint64)((etiss_int32)(sh_val));\n";
1279cp.code() += "etiss_coverage_count(7, 7364, 7359, 7358, 7356, 7363, 7361, 7360);\n";
1280cp.code() += "} // block\n";
1281} // block
1282} // conditional
1283cp.code() += "} // block\n";
1284} // block
1285cp.code() += "instr_exit_" + std::to_string(ic.current_address_) + ":\n";
1286cp.code() += "cpu->instructionPointer = cpu->nextPc;\n";
1287// -----------------------------------------------------------------------------
1288 cp.getAffectedRegisters().add("instructionPointer", 32);
1289 }
1290
1291 return true;
1292 },
1293 0,
1294 [] (BitArray & ba, Instruction & instr)
1295 {
1296// -----------------------------------------------------------------------------
1297etiss_uint8 rd = 0;
1298static BitArrayRange R_rd_0(11, 7);
1299rd += R_rd_0.read(ba) << 0;
1300etiss_uint8 rs1 = 0;
1301static BitArrayRange R_rs1_0(19, 15);
1302rs1 += R_rs1_0.read(ba) << 0;
1303etiss_uint8 rs2 = 0;
1304static BitArrayRange R_rs2_0(24, 20);
1305rs2 += R_rs2_0.read(ba) << 0;
1306
1307// -----------------------------------------------------------------------------
1308
1309 std::stringstream ss;
1310// -----------------------------------------------------------------------------
1311ss << "srlw" << " # " << ba << (" [rd=" + std::to_string(rd) + " | rs1=" + std::to_string(rs1) + " | rs2=" + std::to_string(rs2) + "]");
1312// -----------------------------------------------------------------------------
1313 return ss.str();
1314 }
1315);
1316
1317// SRAW ------------------------------------------------------------------------
1320 "sraw",
1321 (uint32_t) 0x4000503b,
1322 (uint32_t) 0xfe00707f,
1323 [] (BitArray & ba,etiss::CodeSet & cs,InstructionContext & ic)
1324 {
1325
1326// -----------------------------------------------------------------------------
1327
1328// -----------------------------------------------------------------------------
1329
1330// -----------------------------------------------------------------------------
1331// NOLINTBEGIN(clang-diagnostic-unused-but-set-variable)
1332etiss_uint8 rd = 0;
1333static BitArrayRange R_rd_0(11, 7);
1334rd += R_rd_0.read(ba) << 0;
1335etiss_uint8 rs1 = 0;
1336static BitArrayRange R_rs1_0(19, 15);
1337rs1 += R_rs1_0.read(ba) << 0;
1338etiss_uint8 rs2 = 0;
1339static BitArrayRange R_rs2_0(24, 20);
1340rs2 += R_rs2_0.read(ba) << 0;
1341
1342// NOLINTEND(clang-diagnostic-unused-but-set-variable)
1343// -----------------------------------------------------------------------------
1344
1345 {
1347
1348 cp.code() = std::string("//SRAW\n");
1349
1350// -----------------------------------------------------------------------------
1351cp.code() += "etiss_coverage_count(1, 198);\n";
1352{ // block
1353cp.code() += "etiss_coverage_count(1, 1169);\n";
1354cp.code() += "{ // block\n";
1355cp.code() += "cpu->nextPc = " + std::to_string(ic.current_address_ + 4) + "ULL;\n";
1356cp.code() += "etiss_coverage_count(5, 1168, 1164, 1167, 1165, 1166);\n";
1357cp.code() += "} // block\n";
1358} // block
1359{ // block
1360cp.code() += "etiss_coverage_count(1, 7406);\n";
1361cp.code() += "{ // block\n";
1362cp.code() += "etiss_coverage_count(1, 7367);\n";
1363if ((rd % 32ULL) != 0LL) { // conditional
1364cp.code() += "etiss_coverage_count(5, 7373, 7370, 7368, 7371, 7372);\n";
1365{ // block
1366cp.code() += "etiss_coverage_count(1, 7405);\n";
1367cp.code() += "{ // block\n";
1368cp.code() += "etiss_uint32 count = (etiss_uint64)(*((RV64IMACFD*)cpu)->X[" + std::to_string(rs2 % 32ULL) + "ULL]) & 31ULL;\n";
1369cp.code() += "etiss_coverage_count(7, 7383, 7382, 7380, 7379, 7378, 7376, 7381);\n";
1370cp.code() += "etiss_int32 sh_val = ((etiss_int32)(*((RV64IMACFD*)cpu)->X[" + std::to_string(rs1 % 32ULL) + "ULL])) >> count;\n";
1371cp.code() += "etiss_coverage_count(8, 7395, 7394, 7391, 7389, 7388, 7386, 7392, 7393);\n";
1372cp.code() += "*((RV64IMACFD*)cpu)->X[" + std::to_string(rd % 32ULL) + "ULL] = (etiss_int64)(sh_val);\n";
1373cp.code() += "etiss_coverage_count(6, 7404, 7400, 7399, 7397, 7403, 7401);\n";
1374cp.code() += "} // block\n";
1375} // block
1376} // conditional
1377cp.code() += "} // block\n";
1378} // block
1379cp.code() += "instr_exit_" + std::to_string(ic.current_address_) + ":\n";
1380cp.code() += "cpu->instructionPointer = cpu->nextPc;\n";
1381// -----------------------------------------------------------------------------
1382 cp.getAffectedRegisters().add("instructionPointer", 32);
1383 }
1384
1385 return true;
1386 },
1387 0,
1388 [] (BitArray & ba, Instruction & instr)
1389 {
1390// -----------------------------------------------------------------------------
1391etiss_uint8 rd = 0;
1392static BitArrayRange R_rd_0(11, 7);
1393rd += R_rd_0.read(ba) << 0;
1394etiss_uint8 rs1 = 0;
1395static BitArrayRange R_rs1_0(19, 15);
1396rs1 += R_rs1_0.read(ba) << 0;
1397etiss_uint8 rs2 = 0;
1398static BitArrayRange R_rs2_0(24, 20);
1399rs2 += R_rs2_0.read(ba) << 0;
1400
1401// -----------------------------------------------------------------------------
1402
1403 std::stringstream ss;
1404// -----------------------------------------------------------------------------
1405ss << "sraw" << " # " << ba << (" [rd=" + std::to_string(rd) + " | rs1=" + std::to_string(rs1) + " | rs2=" + std::to_string(rs2) + "]");
1406// -----------------------------------------------------------------------------
1407 return ss.str();
1408 }
1409);
1410// clang-format on
etiss::instr::InstructionGroup ISA32_RV64IMACFD("ISA32_RV64IMACFD", 32)
static InstructionDefinition lwu_rd_rs1_imm(ISA32_RV64IMACFD, "lwu",(uint32_t) 0x006003,(uint32_t) 0x00707f, [](BitArray &ba, etiss::CodeSet &cs, InstructionContext &ic) { etiss_uint8 rd=0;static BitArrayRange R_rd_0(11, 7);rd+=R_rd_0.read(ba)<< 0;etiss_uint8 rs1=0;static BitArrayRange R_rs1_0(19, 15);rs1+=R_rs1_0.read(ba)<< 0;etiss_uint16 imm=0;static BitArrayRange R_imm_0(31, 20);imm+=R_imm_0.read(ba)<< 0;{ CodePart &cp=cs.append(CodePart::INITIALREQUIRED);cp.code()=std::string("//LWU\n");cp.code()+="etiss_coverage_count(1, 184);\n";{ cp.code()+="etiss_coverage_count(1, 1169);\n";cp.code()+="{ // block\n";cp.code()+="cpu->nextPc = "+std::to_string(ic.current_address_+4)+"ULL;\n";cp.code()+="etiss_coverage_count(5, 1168, 1164, 1167, 1165, 1166);\n";cp.code()+="} // block\n";} { cp.code()+="etiss_coverage_count(1, 6976);\n";cp.code()+="{ // block\n";cp.code()+="etiss_uint64 offs = *((RV64IMACFD*)cpu)->X["+std::to_string(rs1 % 32ULL)+"ULL] + "+std::to_string(((etiss_int16)(((etiss_int16) imm)<<(4)) > >(4)))+"LL;\n";cp.code()+="etiss_coverage_count(7, 6952, 6951, 6947, 6946, 6944, 6950, 6948);\n";cp.code()+="etiss_uint32 mem_val_0;\n";cp.code()+="cpu->exception |= (*(system->dread))(system->handle, cpu, offs, (etiss_uint8*)&mem_val_0, 4);\n";cp.code()+="if (cpu->exception) { // conditional\n";{ cp.code()+="{ // procedure\n";cp.code()+="RV64IMACFD_translate_exc_code(cpu, system, plugin_pointers, cpu->exception);\n";cp.code()+="goto instr_exit_"+std::to_string(ic.current_address_)+";\n";cp.code()+="} // procedure\n";} cp.code()+="} // conditional\n";cp.code()+="etiss_uint32 res = (etiss_uint32)(mem_val_0);\n";cp.code()+="etiss_coverage_count(4, 6959, 6958, 6956, 6955);\n";cp.code()+="etiss_coverage_count(1, 6960);\n";if((rd % 32ULL) !=0LL) { cp.code()+="etiss_coverage_count(5, 6966, 6963, 6961, 6964, 6965);\n";cp.code()+="*((RV64IMACFD*)cpu)->X["+std::to_string(rd % 32ULL)+"ULL] = (etiss_uint64)(res);\n";cp.code()+="etiss_coverage_count(6, 6975, 6971, 6970, 6968, 6974, 6972);\n";} cp.code()+="} // block\n";} cp.code()+="instr_exit_"+std::to_string(ic.current_address_)+":\n";cp.code()+="cpu->instructionPointer = cpu->nextPc;\n";cp.getAffectedRegisters().add("instructionPointer", 32);} { CodePart &cp=cs.append(CodePart::APPENDEDRETURNINGREQUIRED);cp.code()=std::string("//LWU\n");cp.code()+="if (cpu->return_pending || cpu->exception) return cpu->exception;\n";} return true;}, 0, [](BitArray &ba, Instruction &instr) { etiss_uint8 rd=0;static BitArrayRange R_rd_0(11, 7);rd+=R_rd_0.read(ba)<< 0;etiss_uint8 rs1=0;static BitArrayRange R_rs1_0(19, 15);rs1+=R_rs1_0.read(ba)<< 0;etiss_uint16 imm=0;static BitArrayRange R_imm_0(31, 20);imm+=R_imm_0.read(ba)<< 0;std::stringstream ss;ss<< "lwu"<< " # "<< ba<<(" [rd="+std::to_string(rd)+" | rs1="+std::to_string(rs1)+" | imm="+std::to_string(imm)+"]");return ss.str();})
static InstructionDefinition addw_rd_rs1_rs2(ISA32_RV64IMACFD, "addw",(uint32_t) 0x00003b,(uint32_t) 0xfe00707f, [](BitArray &ba, etiss::CodeSet &cs, InstructionContext &ic) { etiss_uint8 rd=0;static BitArrayRange R_rd_0(11, 7);rd+=R_rd_0.read(ba)<< 0;etiss_uint8 rs1=0;static BitArrayRange R_rs1_0(19, 15);rs1+=R_rs1_0.read(ba)<< 0;etiss_uint8 rs2=0;static BitArrayRange R_rs2_0(24, 20);rs2+=R_rs2_0.read(ba)<< 0;{ CodePart &cp=cs.append(CodePart::INITIALREQUIRED);cp.code()=std::string("//ADDW\n");cp.code()+="etiss_coverage_count(1, 194);\n";{ cp.code()+="etiss_coverage_count(1, 1169);\n";cp.code()+="{ // block\n";cp.code()+="cpu->nextPc = "+std::to_string(ic.current_address_+4)+"ULL;\n";cp.code()+="etiss_coverage_count(5, 1168, 1164, 1167, 1165, 1166);\n";cp.code()+="} // block\n";} { cp.code()+="etiss_coverage_count(1, 7249);\n";cp.code()+="{ // block\n";cp.code()+="etiss_coverage_count(1, 7215);\n";if((rd % 32ULL) !=0LL) { cp.code()+="etiss_coverage_count(5, 7221, 7218, 7216, 7219, 7220);\n";{ cp.code()+="etiss_coverage_count(1, 7248);\n";cp.code()+="{ // block\n";cp.code()+="etiss_int32 res = (etiss_int32)(*((RV64IMACFD*)cpu)->X["+std::to_string(rs1 % 32ULL)+"ULL]) + (etiss_int32)(*((RV64IMACFD*)cpu)->X["+std::to_string(rs2 % 32ULL)+"ULL]);\n";cp.code()+="etiss_coverage_count(10, 7238, 7237, 7229, 7227, 7226, 7224, 7236, 7234, 7233, 7231);\n";cp.code()+="*((RV64IMACFD*)cpu)->X["+std::to_string(rd % 32ULL)+"ULL] = (etiss_int64)(res);\n";cp.code()+="etiss_coverage_count(6, 7247, 7243, 7242, 7240, 7246, 7244);\n";cp.code()+="} // block\n";} } cp.code()+="} // block\n";} cp.code()+="instr_exit_"+std::to_string(ic.current_address_)+":\n";cp.code()+="cpu->instructionPointer = cpu->nextPc;\n";cp.getAffectedRegisters().add("instructionPointer", 32);} return true;}, 0, [](BitArray &ba, Instruction &instr) { etiss_uint8 rd=0;static BitArrayRange R_rd_0(11, 7);rd+=R_rd_0.read(ba)<< 0;etiss_uint8 rs1=0;static BitArrayRange R_rs1_0(19, 15);rs1+=R_rs1_0.read(ba)<< 0;etiss_uint8 rs2=0;static BitArrayRange R_rs2_0(24, 20);rs2+=R_rs2_0.read(ba)<< 0;std::stringstream ss;ss<< "addw"<< " # "<< ba<<(" [rd="+std::to_string(rd)+" | rs1="+std::to_string(rs1)+" | rs2="+std::to_string(rs2)+"]");return ss.str();})
static InstructionDefinition srai_rd_rs1_shamt(ISA32_RV64IMACFD, "srai",(uint32_t) 0x40005013,(uint32_t) 0xfc00707f, [](BitArray &ba, etiss::CodeSet &cs, InstructionContext &ic) { etiss_uint8 rd=0;static BitArrayRange R_rd_0(11, 7);rd+=R_rd_0.read(ba)<< 0;etiss_uint8 rs1=0;static BitArrayRange R_rs1_0(19, 15);rs1+=R_rs1_0.read(ba)<< 0;etiss_uint8 shamt=0;static BitArrayRange R_shamt_0(25, 20);shamt+=R_shamt_0.read(ba)<< 0;{ CodePart &cp=cs.append(CodePart::INITIALREQUIRED);cp.code()=std::string("//SRAI\n");cp.code()+="etiss_coverage_count(1, 189);\n";{ cp.code()+="etiss_coverage_count(1, 1169);\n";cp.code()+="{ // block\n";cp.code()+="cpu->nextPc = "+std::to_string(ic.current_address_+4)+"ULL;\n";cp.code()+="etiss_coverage_count(5, 1168, 1164, 1167, 1165, 1166);\n";cp.code()+="} // block\n";} cp.code()+="etiss_coverage_count(1, 7073);\n";if((rd % 32ULL) !=0LL) { cp.code()+="etiss_coverage_count(5, 7079, 7076, 7074, 7077, 7078);\n";cp.code()+="*((RV64IMACFD*)cpu)->X["+std::to_string(rd % 32ULL)+"ULL] = ((etiss_int64)(*((RV64IMACFD*)cpu)->X["+std::to_string(rs1 % 32ULL)+"ULL])) >> "+std::to_string(shamt)+"ULL;\n";cp.code()+="etiss_coverage_count(11, 7094, 7084, 7083, 7081, 7093, 7090, 7089, 7088, 7086, 7091, 7092);\n";} cp.code()+="instr_exit_"+std::to_string(ic.current_address_)+":\n";cp.code()+="cpu->instructionPointer = cpu->nextPc;\n";cp.getAffectedRegisters().add("instructionPointer", 32);} return true;}, 0, [](BitArray &ba, Instruction &instr) { etiss_uint8 rd=0;static BitArrayRange R_rd_0(11, 7);rd+=R_rd_0.read(ba)<< 0;etiss_uint8 rs1=0;static BitArrayRange R_rs1_0(19, 15);rs1+=R_rs1_0.read(ba)<< 0;etiss_uint8 shamt=0;static BitArrayRange R_shamt_0(25, 20);shamt+=R_shamt_0.read(ba)<< 0;std::stringstream ss;ss<< "srai"<< " # "<< ba<<(" [rd="+std::to_string(rd)+" | rs1="+std::to_string(rs1)+" | shamt="+std::to_string(shamt)+"]");return ss.str();})
static InstructionDefinition subw_rd_rs1_rs2(ISA32_RV64IMACFD, "subw",(uint32_t) 0x4000003b,(uint32_t) 0xfe00707f, [](BitArray &ba, etiss::CodeSet &cs, InstructionContext &ic) { etiss_uint8 rd=0;static BitArrayRange R_rd_0(11, 7);rd+=R_rd_0.read(ba)<< 0;etiss_uint8 rs1=0;static BitArrayRange R_rs1_0(19, 15);rs1+=R_rs1_0.read(ba)<< 0;etiss_uint8 rs2=0;static BitArrayRange R_rs2_0(24, 20);rs2+=R_rs2_0.read(ba)<< 0;{ CodePart &cp=cs.append(CodePart::INITIALREQUIRED);cp.code()=std::string("//SUBW\n");cp.code()+="etiss_coverage_count(1, 195);\n";{ cp.code()+="etiss_coverage_count(1, 1169);\n";cp.code()+="{ // block\n";cp.code()+="cpu->nextPc = "+std::to_string(ic.current_address_+4)+"ULL;\n";cp.code()+="etiss_coverage_count(5, 1168, 1164, 1167, 1165, 1166);\n";cp.code()+="} // block\n";} { cp.code()+="etiss_coverage_count(1, 7284);\n";cp.code()+="{ // block\n";cp.code()+="etiss_coverage_count(1, 7250);\n";if((rd % 32ULL) !=0LL) { cp.code()+="etiss_coverage_count(5, 7256, 7253, 7251, 7254, 7255);\n";{ cp.code()+="etiss_coverage_count(1, 7283);\n";cp.code()+="{ // block\n";cp.code()+="etiss_int32 res = (etiss_int32)(*((RV64IMACFD*)cpu)->X["+std::to_string(rs1 % 32ULL)+"ULL]) - (etiss_int32)(*((RV64IMACFD*)cpu)->X["+std::to_string(rs2 % 32ULL)+"ULL]);\n";cp.code()+="etiss_coverage_count(10, 7273, 7272, 7264, 7262, 7261, 7259, 7271, 7269, 7268, 7266);\n";cp.code()+="*((RV64IMACFD*)cpu)->X["+std::to_string(rd % 32ULL)+"ULL] = (etiss_int64)(res);\n";cp.code()+="etiss_coverage_count(6, 7282, 7278, 7277, 7275, 7281, 7279);\n";cp.code()+="} // block\n";} } cp.code()+="} // block\n";} cp.code()+="instr_exit_"+std::to_string(ic.current_address_)+":\n";cp.code()+="cpu->instructionPointer = cpu->nextPc;\n";cp.getAffectedRegisters().add("instructionPointer", 32);} return true;}, 0, [](BitArray &ba, Instruction &instr) { etiss_uint8 rd=0;static BitArrayRange R_rd_0(11, 7);rd+=R_rd_0.read(ba)<< 0;etiss_uint8 rs1=0;static BitArrayRange R_rs1_0(19, 15);rs1+=R_rs1_0.read(ba)<< 0;etiss_uint8 rs2=0;static BitArrayRange R_rs2_0(24, 20);rs2+=R_rs2_0.read(ba)<< 0;std::stringstream ss;ss<< "subw"<< " # "<< ba<<(" [rd="+std::to_string(rd)+" | rs1="+std::to_string(rs1)+" | rs2="+std::to_string(rs2)+"]");return ss.str();})
static InstructionDefinition sllw_rd_rs1_rs2(ISA32_RV64IMACFD, "sllw",(uint32_t) 0x00103b,(uint32_t) 0xfe00707f, [](BitArray &ba, etiss::CodeSet &cs, InstructionContext &ic) { etiss_uint8 rd=0;static BitArrayRange R_rd_0(11, 7);rd+=R_rd_0.read(ba)<< 0;etiss_uint8 rs1=0;static BitArrayRange R_rs1_0(19, 15);rs1+=R_rs1_0.read(ba)<< 0;etiss_uint8 rs2=0;static BitArrayRange R_rs2_0(24, 20);rs2+=R_rs2_0.read(ba)<< 0;{ CodePart &cp=cs.append(CodePart::INITIALREQUIRED);cp.code()=std::string("//SLLW\n");cp.code()+="etiss_coverage_count(1, 196);\n";{ cp.code()+="etiss_coverage_count(1, 1169);\n";cp.code()+="{ // block\n";cp.code()+="cpu->nextPc = "+std::to_string(ic.current_address_+4)+"ULL;\n";cp.code()+="etiss_coverage_count(5, 1168, 1164, 1167, 1165, 1166);\n";cp.code()+="} // block\n";} { cp.code()+="etiss_coverage_count(1, 7325);\n";cp.code()+="{ // block\n";cp.code()+="etiss_coverage_count(1, 7285);\n";if((rd % 32ULL) !=0LL) { cp.code()+="etiss_coverage_count(5, 7291, 7288, 7286, 7289, 7290);\n";{ cp.code()+="etiss_coverage_count(1, 7324);\n";cp.code()+="{ // block\n";cp.code()+="etiss_uint32 count = (etiss_uint64)(*((RV64IMACFD*)cpu)->X["+std::to_string(rs2 % 32ULL)+"ULL]) & 31ULL;\n";cp.code()+="etiss_coverage_count(7, 7301, 7300, 7298, 7297, 7296, 7294, 7299);\n";cp.code()+="etiss_uint32 sh_val = ((etiss_uint32)(*((RV64IMACFD*)cpu)->X["+std::to_string(rs1 % 32ULL)+"ULL])) << count;\n";cp.code()+="etiss_coverage_count(8, 7313, 7312, 7309, 7307, 7306, 7304, 7310, 7311);\n";cp.code()+="*((RV64IMACFD*)cpu)->X["+std::to_string(rd % 32ULL)+"ULL] = (etiss_uint64)((etiss_int32)(sh_val));\n";cp.code()+="etiss_coverage_count(7, 7323, 7318, 7317, 7315, 7322, 7320, 7319);\n";cp.code()+="} // block\n";} } cp.code()+="} // block\n";} cp.code()+="instr_exit_"+std::to_string(ic.current_address_)+":\n";cp.code()+="cpu->instructionPointer = cpu->nextPc;\n";cp.getAffectedRegisters().add("instructionPointer", 32);} return true;}, 0, [](BitArray &ba, Instruction &instr) { etiss_uint8 rd=0;static BitArrayRange R_rd_0(11, 7);rd+=R_rd_0.read(ba)<< 0;etiss_uint8 rs1=0;static BitArrayRange R_rs1_0(19, 15);rs1+=R_rs1_0.read(ba)<< 0;etiss_uint8 rs2=0;static BitArrayRange R_rs2_0(24, 20);rs2+=R_rs2_0.read(ba)<< 0;std::stringstream ss;ss<< "sllw"<< " # "<< ba<<(" [rd="+std::to_string(rd)+" | rs1="+std::to_string(rs1)+" | rs2="+std::to_string(rs2)+"]");return ss.str();})
static InstructionDefinition addiw_rd_rs1_imm(ISA32_RV64IMACFD, "addiw",(uint32_t) 0x00001b,(uint32_t) 0x00707f, [](BitArray &ba, etiss::CodeSet &cs, InstructionContext &ic) { etiss_uint8 rd=0;static BitArrayRange R_rd_0(11, 7);rd+=R_rd_0.read(ba)<< 0;etiss_uint8 rs1=0;static BitArrayRange R_rs1_0(19, 15);rs1+=R_rs1_0.read(ba)<< 0;etiss_uint16 imm=0;static BitArrayRange R_imm_0(31, 20);imm+=R_imm_0.read(ba)<< 0;{ CodePart &cp=cs.append(CodePart::INITIALREQUIRED);cp.code()=std::string("//ADDIW\n");cp.code()+="etiss_coverage_count(1, 190);\n";{ cp.code()+="etiss_coverage_count(1, 1169);\n";cp.code()+="{ // block\n";cp.code()+="cpu->nextPc = "+std::to_string(ic.current_address_+4)+"ULL;\n";cp.code()+="etiss_coverage_count(5, 1168, 1164, 1167, 1165, 1166);\n";cp.code()+="} // block\n";} { cp.code()+="etiss_coverage_count(1, 7122);\n";cp.code()+="{ // block\n";cp.code()+="etiss_coverage_count(1, 7095);\n";if((rd % 32ULL) !=0LL) { cp.code()+="etiss_coverage_count(5, 7101, 7098, 7096, 7099, 7100);\n";{ cp.code()+="etiss_coverage_count(1, 7121);\n";cp.code()+="{ // block\n";cp.code()+="etiss_int32 res = *((RV64IMACFD*)cpu)->X["+std::to_string(rs1 % 32ULL)+"ULL] + "+std::to_string(((etiss_int16)(((etiss_int16) imm)<<(4)) > >(4)))+"LL;\n";cp.code()+="etiss_coverage_count(7, 7111, 7110, 7107, 7106, 7104, 7109, 7108);\n";cp.code()+="*((RV64IMACFD*)cpu)->X["+std::to_string(rd % 32ULL)+"ULL] = (etiss_int64)(res);\n";cp.code()+="etiss_coverage_count(6, 7120, 7116, 7115, 7113, 7119, 7117);\n";cp.code()+="} // block\n";} } cp.code()+="} // block\n";} cp.code()+="instr_exit_"+std::to_string(ic.current_address_)+":\n";cp.code()+="cpu->instructionPointer = cpu->nextPc;\n";cp.getAffectedRegisters().add("instructionPointer", 32);} return true;}, 0, [](BitArray &ba, Instruction &instr) { etiss_uint8 rd=0;static BitArrayRange R_rd_0(11, 7);rd+=R_rd_0.read(ba)<< 0;etiss_uint8 rs1=0;static BitArrayRange R_rs1_0(19, 15);rs1+=R_rs1_0.read(ba)<< 0;etiss_uint16 imm=0;static BitArrayRange R_imm_0(31, 20);imm+=R_imm_0.read(ba)<< 0;std::stringstream ss;ss<< "addiw"<< " # "<< ba<<(" [rd="+std::to_string(rd)+" | rs1="+std::to_string(rs1)+" | imm="+std::to_string(imm)+"]");return ss.str();})
static InstructionDefinition sraw_rd_rs1_rs2(ISA32_RV64IMACFD, "sraw",(uint32_t) 0x4000503b,(uint32_t) 0xfe00707f, [](BitArray &ba, etiss::CodeSet &cs, InstructionContext &ic) { etiss_uint8 rd=0;static BitArrayRange R_rd_0(11, 7);rd+=R_rd_0.read(ba)<< 0;etiss_uint8 rs1=0;static BitArrayRange R_rs1_0(19, 15);rs1+=R_rs1_0.read(ba)<< 0;etiss_uint8 rs2=0;static BitArrayRange R_rs2_0(24, 20);rs2+=R_rs2_0.read(ba)<< 0;{ CodePart &cp=cs.append(CodePart::INITIALREQUIRED);cp.code()=std::string("//SRAW\n");cp.code()+="etiss_coverage_count(1, 198);\n";{ cp.code()+="etiss_coverage_count(1, 1169);\n";cp.code()+="{ // block\n";cp.code()+="cpu->nextPc = "+std::to_string(ic.current_address_+4)+"ULL;\n";cp.code()+="etiss_coverage_count(5, 1168, 1164, 1167, 1165, 1166);\n";cp.code()+="} // block\n";} { cp.code()+="etiss_coverage_count(1, 7406);\n";cp.code()+="{ // block\n";cp.code()+="etiss_coverage_count(1, 7367);\n";if((rd % 32ULL) !=0LL) { cp.code()+="etiss_coverage_count(5, 7373, 7370, 7368, 7371, 7372);\n";{ cp.code()+="etiss_coverage_count(1, 7405);\n";cp.code()+="{ // block\n";cp.code()+="etiss_uint32 count = (etiss_uint64)(*((RV64IMACFD*)cpu)->X["+std::to_string(rs2 % 32ULL)+"ULL]) & 31ULL;\n";cp.code()+="etiss_coverage_count(7, 7383, 7382, 7380, 7379, 7378, 7376, 7381);\n";cp.code()+="etiss_int32 sh_val = ((etiss_int32)(*((RV64IMACFD*)cpu)->X["+std::to_string(rs1 % 32ULL)+"ULL])) >> count;\n";cp.code()+="etiss_coverage_count(8, 7395, 7394, 7391, 7389, 7388, 7386, 7392, 7393);\n";cp.code()+="*((RV64IMACFD*)cpu)->X["+std::to_string(rd % 32ULL)+"ULL] = (etiss_int64)(sh_val);\n";cp.code()+="etiss_coverage_count(6, 7404, 7400, 7399, 7397, 7403, 7401);\n";cp.code()+="} // block\n";} } cp.code()+="} // block\n";} cp.code()+="instr_exit_"+std::to_string(ic.current_address_)+":\n";cp.code()+="cpu->instructionPointer = cpu->nextPc;\n";cp.getAffectedRegisters().add("instructionPointer", 32);} return true;}, 0, [](BitArray &ba, Instruction &instr) { etiss_uint8 rd=0;static BitArrayRange R_rd_0(11, 7);rd+=R_rd_0.read(ba)<< 0;etiss_uint8 rs1=0;static BitArrayRange R_rs1_0(19, 15);rs1+=R_rs1_0.read(ba)<< 0;etiss_uint8 rs2=0;static BitArrayRange R_rs2_0(24, 20);rs2+=R_rs2_0.read(ba)<< 0;std::stringstream ss;ss<< "sraw"<< " # "<< ba<<(" [rd="+std::to_string(rd)+" | rs1="+std::to_string(rs1)+" | rs2="+std::to_string(rs2)+"]");return ss.str();})
static InstructionDefinition srliw_rd_rs1_shamt(ISA32_RV64IMACFD, "srliw",(uint32_t) 0x00501b,(uint32_t) 0xfe00707f, [](BitArray &ba, etiss::CodeSet &cs, InstructionContext &ic) { etiss_uint8 rd=0;static BitArrayRange R_rd_0(11, 7);rd+=R_rd_0.read(ba)<< 0;etiss_uint8 rs1=0;static BitArrayRange R_rs1_0(19, 15);rs1+=R_rs1_0.read(ba)<< 0;etiss_uint8 shamt=0;static BitArrayRange R_shamt_0(24, 20);shamt+=R_shamt_0.read(ba)<< 0;{ CodePart &cp=cs.append(CodePart::INITIALREQUIRED);cp.code()=std::string("//SRLIW\n");cp.code()+="etiss_coverage_count(1, 192);\n";{ cp.code()+="etiss_coverage_count(1, 1169);\n";cp.code()+="{ // block\n";cp.code()+="cpu->nextPc = "+std::to_string(ic.current_address_+4)+"ULL;\n";cp.code()+="etiss_coverage_count(5, 1168, 1164, 1167, 1165, 1166);\n";cp.code()+="} // block\n";} { cp.code()+="etiss_coverage_count(1, 7184);\n";cp.code()+="{ // block\n";cp.code()+="etiss_coverage_count(1, 7154);\n";if((rd % 32ULL) !=0LL) { cp.code()+="etiss_coverage_count(5, 7160, 7157, 7155, 7158, 7159);\n";{ cp.code()+="etiss_coverage_count(1, 7183);\n";cp.code()+="{ // block\n";cp.code()+="etiss_uint32 sh_val = ((etiss_uint32)(*((RV64IMACFD*)cpu)->X["+std::to_string(rs1 % 32ULL)+"ULL])) >> "+std::to_string(shamt)+"ULL;\n";cp.code()+="etiss_coverage_count(8, 7172, 7171, 7168, 7166, 7165, 7163, 7169, 7170);\n";cp.code()+="*((RV64IMACFD*)cpu)->X["+std::to_string(rd % 32ULL)+"ULL] = (etiss_uint64)((etiss_int32)(sh_val));\n";cp.code()+="etiss_coverage_count(7, 7182, 7177, 7176, 7174, 7181, 7179, 7178);\n";cp.code()+="} // block\n";} } cp.code()+="} // block\n";} cp.code()+="instr_exit_"+std::to_string(ic.current_address_)+":\n";cp.code()+="cpu->instructionPointer = cpu->nextPc;\n";cp.getAffectedRegisters().add("instructionPointer", 32);} return true;}, 0, [](BitArray &ba, Instruction &instr) { etiss_uint8 rd=0;static BitArrayRange R_rd_0(11, 7);rd+=R_rd_0.read(ba)<< 0;etiss_uint8 rs1=0;static BitArrayRange R_rs1_0(19, 15);rs1+=R_rs1_0.read(ba)<< 0;etiss_uint8 shamt=0;static BitArrayRange R_shamt_0(24, 20);shamt+=R_shamt_0.read(ba)<< 0;std::stringstream ss;ss<< "srliw"<< " # "<< ba<<(" [rd="+std::to_string(rd)+" | rs1="+std::to_string(rs1)+" | shamt="+std::to_string(shamt)+"]");return ss.str();})
static InstructionDefinition sd_imm_rs1_rs2(ISA32_RV64IMACFD, "sd",(uint32_t) 0x003023,(uint32_t) 0x00707f, [](BitArray &ba, etiss::CodeSet &cs, InstructionContext &ic) { etiss_uint16 imm=0;static BitArrayRange R_imm_0(11, 7);imm+=R_imm_0.read(ba)<< 0;etiss_uint8 rs1=0;static BitArrayRange R_rs1_0(19, 15);rs1+=R_rs1_0.read(ba)<< 0;etiss_uint8 rs2=0;static BitArrayRange R_rs2_0(24, 20);rs2+=R_rs2_0.read(ba)<< 0;static BitArrayRange R_imm_5(31, 25);imm+=R_imm_5.read(ba)<< 5;{ CodePart &cp=cs.append(CodePart::INITIALREQUIRED);cp.code()=std::string("//SD\n");cp.code()+="etiss_coverage_count(1, 186);\n";{ cp.code()+="etiss_coverage_count(1, 1169);\n";cp.code()+="{ // block\n";cp.code()+="cpu->nextPc = "+std::to_string(ic.current_address_+4)+"ULL;\n";cp.code()+="etiss_coverage_count(5, 1168, 1164, 1167, 1165, 1166);\n";cp.code()+="} // block\n";} { cp.code()+="etiss_coverage_count(1, 7032);\n";cp.code()+="{ // block\n";cp.code()+="etiss_uint64 offs = *((RV64IMACFD*)cpu)->X["+std::to_string(rs1 % 32ULL)+"ULL] + "+std::to_string(((etiss_int16)(((etiss_int16) imm)<<(4)) > >(4)))+"LL;\n";cp.code()+="etiss_coverage_count(7, 7020, 7019, 7016, 7015, 7013, 7018, 7017);\n";cp.code()+="etiss_uint64 mem_val_0;\n";cp.code()+="mem_val_0 = (etiss_uint64)(*((RV64IMACFD*)cpu)->X["+std::to_string(rs2 % 32ULL)+"ULL]);\n";cp.code()+="etiss_coverage_count(7, 7031, 7023, 7022, 7030, 7028, 7027, 7025);\n";cp.code()+="cpu->exception |= (*(system->dwrite))(system->handle, cpu, offs, (etiss_uint8*)&mem_val_0, 8);\n";cp.code()+="if (cpu->exception) { // conditional\n";{ cp.code()+="{ // procedure\n";cp.code()+="RV64IMACFD_translate_exc_code(cpu, system, plugin_pointers, cpu->exception);\n";cp.code()+="goto instr_exit_"+std::to_string(ic.current_address_)+";\n";cp.code()+="} // procedure\n";} cp.code()+="} // conditional\n";cp.code()+="} // block\n";} cp.code()+="instr_exit_"+std::to_string(ic.current_address_)+":\n";cp.code()+="cpu->instructionPointer = cpu->nextPc;\n";cp.getAffectedRegisters().add("instructionPointer", 32);} { CodePart &cp=cs.append(CodePart::APPENDEDRETURNINGREQUIRED);cp.code()=std::string("//SD\n");cp.code()+="if (cpu->return_pending || cpu->exception) return cpu->exception;\n";} return true;}, 0, [](BitArray &ba, Instruction &instr) { etiss_uint16 imm=0;static BitArrayRange R_imm_0(11, 7);imm+=R_imm_0.read(ba)<< 0;etiss_uint8 rs1=0;static BitArrayRange R_rs1_0(19, 15);rs1+=R_rs1_0.read(ba)<< 0;etiss_uint8 rs2=0;static BitArrayRange R_rs2_0(24, 20);rs2+=R_rs2_0.read(ba)<< 0;static BitArrayRange R_imm_5(31, 25);imm+=R_imm_5.read(ba)<< 5;std::stringstream ss;ss<< "sd"<< " # "<< ba<<(" [imm="+std::to_string(imm)+" | rs1="+std::to_string(rs1)+" | rs2="+std::to_string(rs2)+"]");return ss.str();})
static InstructionDefinition slliw_rd_rs1_shamt(ISA32_RV64IMACFD, "slliw",(uint32_t) 0x00101b,(uint32_t) 0xfe00707f, [](BitArray &ba, etiss::CodeSet &cs, InstructionContext &ic) { etiss_uint8 rd=0;static BitArrayRange R_rd_0(11, 7);rd+=R_rd_0.read(ba)<< 0;etiss_uint8 rs1=0;static BitArrayRange R_rs1_0(19, 15);rs1+=R_rs1_0.read(ba)<< 0;etiss_uint8 shamt=0;static BitArrayRange R_shamt_0(24, 20);shamt+=R_shamt_0.read(ba)<< 0;{ CodePart &cp=cs.append(CodePart::INITIALREQUIRED);cp.code()=std::string("//SLLIW\n");cp.code()+="etiss_coverage_count(1, 191);\n";{ cp.code()+="etiss_coverage_count(1, 1169);\n";cp.code()+="{ // block\n";cp.code()+="cpu->nextPc = "+std::to_string(ic.current_address_+4)+"ULL;\n";cp.code()+="etiss_coverage_count(5, 1168, 1164, 1167, 1165, 1166);\n";cp.code()+="} // block\n";} { cp.code()+="etiss_coverage_count(1, 7153);\n";cp.code()+="{ // block\n";cp.code()+="etiss_coverage_count(1, 7123);\n";if((rd % 32ULL) !=0LL) { cp.code()+="etiss_coverage_count(5, 7129, 7126, 7124, 7127, 7128);\n";{ cp.code()+="etiss_coverage_count(1, 7152);\n";cp.code()+="{ // block\n";cp.code()+="etiss_uint32 sh_val = ((etiss_uint32)(*((RV64IMACFD*)cpu)->X["+std::to_string(rs1 % 32ULL)+"ULL])) << "+std::to_string(shamt)+"ULL;\n";cp.code()+="etiss_coverage_count(8, 7141, 7140, 7137, 7135, 7134, 7132, 7138, 7139);\n";cp.code()+="*((RV64IMACFD*)cpu)->X["+std::to_string(rd % 32ULL)+"ULL] = (etiss_uint64)((etiss_int32)(sh_val));\n";cp.code()+="etiss_coverage_count(7, 7151, 7146, 7145, 7143, 7150, 7148, 7147);\n";cp.code()+="} // block\n";} } cp.code()+="} // block\n";} cp.code()+="instr_exit_"+std::to_string(ic.current_address_)+":\n";cp.code()+="cpu->instructionPointer = cpu->nextPc;\n";cp.getAffectedRegisters().add("instructionPointer", 32);} return true;}, 0, [](BitArray &ba, Instruction &instr) { etiss_uint8 rd=0;static BitArrayRange R_rd_0(11, 7);rd+=R_rd_0.read(ba)<< 0;etiss_uint8 rs1=0;static BitArrayRange R_rs1_0(19, 15);rs1+=R_rs1_0.read(ba)<< 0;etiss_uint8 shamt=0;static BitArrayRange R_shamt_0(24, 20);shamt+=R_shamt_0.read(ba)<< 0;std::stringstream ss;ss<< "slliw"<< " # "<< ba<<(" [rd="+std::to_string(rd)+" | rs1="+std::to_string(rs1)+" | shamt="+std::to_string(shamt)+"]");return ss.str();})
static InstructionDefinition ld_rd_rs1_imm(ISA32_RV64IMACFD, "ld",(uint32_t) 0x003003,(uint32_t) 0x00707f, [](BitArray &ba, etiss::CodeSet &cs, InstructionContext &ic) { etiss_uint8 rd=0;static BitArrayRange R_rd_0(11, 7);rd+=R_rd_0.read(ba)<< 0;etiss_uint8 rs1=0;static BitArrayRange R_rs1_0(19, 15);rs1+=R_rs1_0.read(ba)<< 0;etiss_uint16 imm=0;static BitArrayRange R_imm_0(31, 20);imm+=R_imm_0.read(ba)<< 0;{ CodePart &cp=cs.append(CodePart::INITIALREQUIRED);cp.code()=std::string("//LD\n");cp.code()+="etiss_coverage_count(1, 185);\n";{ cp.code()+="etiss_coverage_count(1, 1169);\n";cp.code()+="{ // block\n";cp.code()+="cpu->nextPc = "+std::to_string(ic.current_address_+4)+"ULL;\n";cp.code()+="etiss_coverage_count(5, 1168, 1164, 1167, 1165, 1166);\n";cp.code()+="} // block\n";} { cp.code()+="etiss_coverage_count(1, 7010);\n";cp.code()+="{ // block\n";cp.code()+="etiss_uint64 offs = *((RV64IMACFD*)cpu)->X["+std::to_string(rs1 % 32ULL)+"ULL] + "+std::to_string(((etiss_int16)(((etiss_int16) imm)<<(4)) > >(4)))+"LL;\n";cp.code()+="etiss_coverage_count(7, 6986, 6985, 6982, 6981, 6979, 6984, 6983);\n";cp.code()+="etiss_uint64 mem_val_0;\n";cp.code()+="cpu->exception |= (*(system->dread))(system->handle, cpu, offs, (etiss_uint8*)&mem_val_0, 8);\n";cp.code()+="if (cpu->exception) { // conditional\n";{ cp.code()+="{ // procedure\n";cp.code()+="RV64IMACFD_translate_exc_code(cpu, system, plugin_pointers, cpu->exception);\n";cp.code()+="goto instr_exit_"+std::to_string(ic.current_address_)+";\n";cp.code()+="} // procedure\n";} cp.code()+="} // conditional\n";cp.code()+="etiss_int64 res = (etiss_int64)(mem_val_0);\n";cp.code()+="etiss_coverage_count(4, 6993, 6992, 6990, 6989);\n";cp.code()+="etiss_coverage_count(1, 6994);\n";if((rd % 32ULL) !=0LL) { cp.code()+="etiss_coverage_count(5, 7000, 6997, 6995, 6998, 6999);\n";cp.code()+="*((RV64IMACFD*)cpu)->X["+std::to_string(rd % 32ULL)+"ULL] = (etiss_uint64)(res);\n";cp.code()+="etiss_coverage_count(6, 7009, 7005, 7004, 7002, 7008, 7006);\n";} cp.code()+="} // block\n";} cp.code()+="instr_exit_"+std::to_string(ic.current_address_)+":\n";cp.code()+="cpu->instructionPointer = cpu->nextPc;\n";cp.getAffectedRegisters().add("instructionPointer", 32);} { CodePart &cp=cs.append(CodePart::APPENDEDRETURNINGREQUIRED);cp.code()=std::string("//LD\n");cp.code()+="if (cpu->return_pending || cpu->exception) return cpu->exception;\n";} return true;}, 0, [](BitArray &ba, Instruction &instr) { etiss_uint8 rd=0;static BitArrayRange R_rd_0(11, 7);rd+=R_rd_0.read(ba)<< 0;etiss_uint8 rs1=0;static BitArrayRange R_rs1_0(19, 15);rs1+=R_rs1_0.read(ba)<< 0;etiss_uint16 imm=0;static BitArrayRange R_imm_0(31, 20);imm+=R_imm_0.read(ba)<< 0;std::stringstream ss;ss<< "ld"<< " # "<< ba<<(" [rd="+std::to_string(rd)+" | rs1="+std::to_string(rs1)+" | imm="+std::to_string(imm)+"]");return ss.str();})
static InstructionDefinition slli_rd_rs1_shamt(ISA32_RV64IMACFD, "slli",(uint32_t) 0x001013,(uint32_t) 0xfc00707f, [](BitArray &ba, etiss::CodeSet &cs, InstructionContext &ic) { etiss_uint8 rd=0;static BitArrayRange R_rd_0(11, 7);rd+=R_rd_0.read(ba)<< 0;etiss_uint8 rs1=0;static BitArrayRange R_rs1_0(19, 15);rs1+=R_rs1_0.read(ba)<< 0;etiss_uint8 shamt=0;static BitArrayRange R_shamt_0(25, 20);shamt+=R_shamt_0.read(ba)<< 0;{ CodePart &cp=cs.append(CodePart::INITIALREQUIRED);cp.code()=std::string("//SLLI\n");cp.code()+="etiss_coverage_count(1, 187);\n";{ cp.code()+="etiss_coverage_count(1, 1169);\n";cp.code()+="{ // block\n";cp.code()+="cpu->nextPc = "+std::to_string(ic.current_address_+4)+"ULL;\n";cp.code()+="etiss_coverage_count(5, 1168, 1164, 1167, 1165, 1166);\n";cp.code()+="} // block\n";} cp.code()+="etiss_coverage_count(1, 7033);\n";if((rd % 32ULL) !=0LL) { cp.code()+="etiss_coverage_count(5, 7039, 7036, 7034, 7037, 7038);\n";cp.code()+="*((RV64IMACFD*)cpu)->X["+std::to_string(rd % 32ULL)+"ULL] = *((RV64IMACFD*)cpu)->X["+std::to_string(rs1 % 32ULL)+"ULL] << "+std::to_string(shamt)+"ULL;\n";cp.code()+="etiss_coverage_count(9, 7052, 7044, 7043, 7041, 7051, 7049, 7048, 7046, 7050);\n";} cp.code()+="instr_exit_"+std::to_string(ic.current_address_)+":\n";cp.code()+="cpu->instructionPointer = cpu->nextPc;\n";cp.getAffectedRegisters().add("instructionPointer", 32);} return true;}, 0, [](BitArray &ba, Instruction &instr) { etiss_uint8 rd=0;static BitArrayRange R_rd_0(11, 7);rd+=R_rd_0.read(ba)<< 0;etiss_uint8 rs1=0;static BitArrayRange R_rs1_0(19, 15);rs1+=R_rs1_0.read(ba)<< 0;etiss_uint8 shamt=0;static BitArrayRange R_shamt_0(25, 20);shamt+=R_shamt_0.read(ba)<< 0;std::stringstream ss;ss<< "slli"<< " # "<< ba<<(" [rd="+std::to_string(rd)+" | rs1="+std::to_string(rs1)+" | shamt="+std::to_string(shamt)+"]");return ss.str();})
static InstructionDefinition srli_rd_rs1_shamt(ISA32_RV64IMACFD, "srli",(uint32_t) 0x005013,(uint32_t) 0xfc00707f, [](BitArray &ba, etiss::CodeSet &cs, InstructionContext &ic) { etiss_uint8 rd=0;static BitArrayRange R_rd_0(11, 7);rd+=R_rd_0.read(ba)<< 0;etiss_uint8 rs1=0;static BitArrayRange R_rs1_0(19, 15);rs1+=R_rs1_0.read(ba)<< 0;etiss_uint8 shamt=0;static BitArrayRange R_shamt_0(25, 20);shamt+=R_shamt_0.read(ba)<< 0;{ CodePart &cp=cs.append(CodePart::INITIALREQUIRED);cp.code()=std::string("//SRLI\n");cp.code()+="etiss_coverage_count(1, 188);\n";{ cp.code()+="etiss_coverage_count(1, 1169);\n";cp.code()+="{ // block\n";cp.code()+="cpu->nextPc = "+std::to_string(ic.current_address_+4)+"ULL;\n";cp.code()+="etiss_coverage_count(5, 1168, 1164, 1167, 1165, 1166);\n";cp.code()+="} // block\n";} cp.code()+="etiss_coverage_count(1, 7053);\n";if((rd % 32ULL) !=0LL) { cp.code()+="etiss_coverage_count(5, 7059, 7056, 7054, 7057, 7058);\n";cp.code()+="*((RV64IMACFD*)cpu)->X["+std::to_string(rd % 32ULL)+"ULL] = *((RV64IMACFD*)cpu)->X["+std::to_string(rs1 % 32ULL)+"ULL] >> "+std::to_string(shamt)+"ULL;\n";cp.code()+="etiss_coverage_count(9, 7072, 7064, 7063, 7061, 7071, 7069, 7068, 7066, 7070);\n";} cp.code()+="instr_exit_"+std::to_string(ic.current_address_)+":\n";cp.code()+="cpu->instructionPointer = cpu->nextPc;\n";cp.getAffectedRegisters().add("instructionPointer", 32);} return true;}, 0, [](BitArray &ba, Instruction &instr) { etiss_uint8 rd=0;static BitArrayRange R_rd_0(11, 7);rd+=R_rd_0.read(ba)<< 0;etiss_uint8 rs1=0;static BitArrayRange R_rs1_0(19, 15);rs1+=R_rs1_0.read(ba)<< 0;etiss_uint8 shamt=0;static BitArrayRange R_shamt_0(25, 20);shamt+=R_shamt_0.read(ba)<< 0;std::stringstream ss;ss<< "srli"<< " # "<< ba<<(" [rd="+std::to_string(rd)+" | rs1="+std::to_string(rs1)+" | shamt="+std::to_string(shamt)+"]");return ss.str();})
static InstructionDefinition sraiw_rd_rs1_shamt(ISA32_RV64IMACFD, "sraiw",(uint32_t) 0x4000501b,(uint32_t) 0xfe00707f, [](BitArray &ba, etiss::CodeSet &cs, InstructionContext &ic) { etiss_uint8 rd=0;static BitArrayRange R_rd_0(11, 7);rd+=R_rd_0.read(ba)<< 0;etiss_uint8 rs1=0;static BitArrayRange R_rs1_0(19, 15);rs1+=R_rs1_0.read(ba)<< 0;etiss_uint8 shamt=0;static BitArrayRange R_shamt_0(24, 20);shamt+=R_shamt_0.read(ba)<< 0;{ CodePart &cp=cs.append(CodePart::INITIALREQUIRED);cp.code()=std::string("//SRAIW\n");cp.code()+="etiss_coverage_count(1, 193);\n";{ cp.code()+="etiss_coverage_count(1, 1169);\n";cp.code()+="{ // block\n";cp.code()+="cpu->nextPc = "+std::to_string(ic.current_address_+4)+"ULL;\n";cp.code()+="etiss_coverage_count(5, 1168, 1164, 1167, 1165, 1166);\n";cp.code()+="} // block\n";} { cp.code()+="etiss_coverage_count(1, 7214);\n";cp.code()+="{ // block\n";cp.code()+="etiss_coverage_count(1, 7185);\n";if((rd % 32ULL) !=0LL) { cp.code()+="etiss_coverage_count(5, 7191, 7188, 7186, 7189, 7190);\n";{ cp.code()+="etiss_coverage_count(1, 7213);\n";cp.code()+="{ // block\n";cp.code()+="etiss_int32 sh_val = ((etiss_int32)(*((RV64IMACFD*)cpu)->X["+std::to_string(rs1 % 32ULL)+"ULL])) >> "+std::to_string(shamt)+"ULL;\n";cp.code()+="etiss_coverage_count(8, 7203, 7202, 7199, 7197, 7196, 7194, 7200, 7201);\n";cp.code()+="*((RV64IMACFD*)cpu)->X["+std::to_string(rd % 32ULL)+"ULL] = (etiss_uint64)(sh_val);\n";cp.code()+="etiss_coverage_count(6, 7212, 7208, 7207, 7205, 7211, 7209);\n";cp.code()+="} // block\n";} } cp.code()+="} // block\n";} cp.code()+="instr_exit_"+std::to_string(ic.current_address_)+":\n";cp.code()+="cpu->instructionPointer = cpu->nextPc;\n";cp.getAffectedRegisters().add("instructionPointer", 32);} return true;}, 0, [](BitArray &ba, Instruction &instr) { etiss_uint8 rd=0;static BitArrayRange R_rd_0(11, 7);rd+=R_rd_0.read(ba)<< 0;etiss_uint8 rs1=0;static BitArrayRange R_rs1_0(19, 15);rs1+=R_rs1_0.read(ba)<< 0;etiss_uint8 shamt=0;static BitArrayRange R_shamt_0(24, 20);shamt+=R_shamt_0.read(ba)<< 0;std::stringstream ss;ss<< "sraiw"<< " # "<< ba<<(" [rd="+std::to_string(rd)+" | rs1="+std::to_string(rs1)+" | shamt="+std::to_string(shamt)+"]");return ss.str();})
static InstructionDefinition srlw_rd_rs1_rs2(ISA32_RV64IMACFD, "srlw",(uint32_t) 0x00503b,(uint32_t) 0xfe00707f, [](BitArray &ba, etiss::CodeSet &cs, InstructionContext &ic) { etiss_uint8 rd=0;static BitArrayRange R_rd_0(11, 7);rd+=R_rd_0.read(ba)<< 0;etiss_uint8 rs1=0;static BitArrayRange R_rs1_0(19, 15);rs1+=R_rs1_0.read(ba)<< 0;etiss_uint8 rs2=0;static BitArrayRange R_rs2_0(24, 20);rs2+=R_rs2_0.read(ba)<< 0;{ CodePart &cp=cs.append(CodePart::INITIALREQUIRED);cp.code()=std::string("//SRLW\n");cp.code()+="etiss_coverage_count(1, 197);\n";{ cp.code()+="etiss_coverage_count(1, 1169);\n";cp.code()+="{ // block\n";cp.code()+="cpu->nextPc = "+std::to_string(ic.current_address_+4)+"ULL;\n";cp.code()+="etiss_coverage_count(5, 1168, 1164, 1167, 1165, 1166);\n";cp.code()+="} // block\n";} { cp.code()+="etiss_coverage_count(1, 7366);\n";cp.code()+="{ // block\n";cp.code()+="etiss_coverage_count(1, 7326);\n";if((rd % 32ULL) !=0LL) { cp.code()+="etiss_coverage_count(5, 7332, 7329, 7327, 7330, 7331);\n";{ cp.code()+="etiss_coverage_count(1, 7365);\n";cp.code()+="{ // block\n";cp.code()+="etiss_uint32 count = (etiss_uint64)(*((RV64IMACFD*)cpu)->X["+std::to_string(rs2 % 32ULL)+"ULL]) & 31ULL;\n";cp.code()+="etiss_coverage_count(7, 7342, 7341, 7339, 7338, 7337, 7335, 7340);\n";cp.code()+="etiss_uint32 sh_val = ((etiss_uint32)(*((RV64IMACFD*)cpu)->X["+std::to_string(rs1 % 32ULL)+"ULL])) >> count;\n";cp.code()+="etiss_coverage_count(8, 7354, 7353, 7350, 7348, 7347, 7345, 7351, 7352);\n";cp.code()+="*((RV64IMACFD*)cpu)->X["+std::to_string(rd % 32ULL)+"ULL] = (etiss_uint64)((etiss_int32)(sh_val));\n";cp.code()+="etiss_coverage_count(7, 7364, 7359, 7358, 7356, 7363, 7361, 7360);\n";cp.code()+="} // block\n";} } cp.code()+="} // block\n";} cp.code()+="instr_exit_"+std::to_string(ic.current_address_)+":\n";cp.code()+="cpu->instructionPointer = cpu->nextPc;\n";cp.getAffectedRegisters().add("instructionPointer", 32);} return true;}, 0, [](BitArray &ba, Instruction &instr) { etiss_uint8 rd=0;static BitArrayRange R_rd_0(11, 7);rd+=R_rd_0.read(ba)<< 0;etiss_uint8 rs1=0;static BitArrayRange R_rs1_0(19, 15);rs1+=R_rs1_0.read(ba)<< 0;etiss_uint8 rs2=0;static BitArrayRange R_rs2_0(24, 20);rs2+=R_rs2_0.read(ba)<< 0;std::stringstream ss;ss<< "srlw"<< " # "<< ba<<(" [rd="+std::to_string(rd)+" | rs1="+std::to_string(rs1)+" | rs2="+std::to_string(rs2)+"]");return ss.str();})
int16_t etiss_int16
Definition types.h:51
uint8_t etiss_uint8
Definition types.h:49
uint16_t etiss_uint16
Definition types.h:52
Contains a small code snipped.
Definition CodePart.h:348
@ APPENDEDRETURNINGREQUIRED
Definition CodePart.h:364
std::string & code()
Definition CodePart.h:378
RegisterSet & getAffectedRegisters()
Definition CodePart.h:376
A set of CodeParts.
Definition CodePart.h:399
void append(const CodePart &part, CodePart::TYPE type)
Definition CodePart.h:412
void add(const RegisterPart &rp)
add a registerPart to the set or just its relevant bits if a register with the same name is already p...
Definition CodePart.h:184
Reading through it will only return bits within the range.
I read(const BitArray &ba)
reads bits from the range to the return value starting at the lsb.
stores a bit vector
this class contains parameters that persist in between instruction lookpus/translation within a trans...
uint64_t current_address_
start address of current instruction
holds information and translation callbacks for an instruction.
forwards: include/jit/*
Definition Benchmark.h:17