ETISS 0.11.2
ExtendableTranslatingInstructionSetSimulator(version0.11.2)
Loading...
Searching...
No Matches
RV32IMACFD_RV32MInstr.cpp
Go to the documentation of this file.
1// clang-format off
9#include "RV32IMACFDArch.h"
10#include "RV32IMACFDFuncs.h"
11
12using namespace etiss;
13using namespace etiss::instr;
14
15// MUL -------------------------------------------------------------------------
18 "mul",
19 (uint32_t) 0x2000033,
20 (uint32_t) 0xfe00707f,
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_uint8 rs2 = 0;
37static BitArrayRange R_rs2_0(24, 20);
38rs2 += R_rs2_0.read(ba) << 0;
39
40// NOLINTEND(clang-diagnostic-unused-but-set-variable)
41// -----------------------------------------------------------------------------
42
43 {
45
46 cp.code() = std::string("//MUL\n");
47
48// -----------------------------------------------------------------------------
49cp.code() += "etiss_coverage_count(1, 72);\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, 2846);\n";
59cp.code() += "{ // block\n";
60cp.code() += "etiss_coverage_count(1, 2810);\n";
61if ((rd % 32ULL) != 0LL) { // conditional
62cp.code() += "etiss_coverage_count(5, 2816, 2813, 2811, 2814, 2815);\n";
63{ // block
64cp.code() += "etiss_coverage_count(1, 2845);\n";
65cp.code() += "{ // block\n";
66cp.code() += "etiss_int64 res = (etiss_int64)((etiss_int32)(*((RV32IMACFD*)cpu)->X[" + std::to_string(rs1 % 32ULL) + "ULL])) * (etiss_int64)((etiss_int32)(*((RV32IMACFD*)cpu)->X[" + std::to_string(rs2 % 32ULL) + "ULL]));\n";
67cp.code() += "etiss_coverage_count(12, 2835, 2834, 2825, 2823, 2822, 2821, 2819, 2833, 2831, 2830, 2829, 2827);\n";
68cp.code() += "*((RV32IMACFD*)cpu)->X[" + std::to_string(rd % 32ULL) + "ULL] = (etiss_uint32)(res);\n";
69cp.code() += "etiss_coverage_count(6, 2844, 2840, 2839, 2837, 2843, 2841);\n";
70cp.code() += "} // block\n";
71} // block
72} // conditional
73cp.code() += "} // block\n";
74} // block
75cp.code() += "instr_exit_" + std::to_string(ic.current_address_) + ":\n";
76cp.code() += "cpu->instructionPointer = cpu->nextPc;\n";
77// -----------------------------------------------------------------------------
78 cp.getAffectedRegisters().add("instructionPointer", 32);
79 }
80
81 return true;
82 },
83 0,
84 [] (BitArray & ba, Instruction & instr)
85 {
86// -----------------------------------------------------------------------------
87etiss_uint8 rd = 0;
88static BitArrayRange R_rd_0(11, 7);
89rd += R_rd_0.read(ba) << 0;
90etiss_uint8 rs1 = 0;
91static BitArrayRange R_rs1_0(19, 15);
92rs1 += R_rs1_0.read(ba) << 0;
93etiss_uint8 rs2 = 0;
94static BitArrayRange R_rs2_0(24, 20);
95rs2 += R_rs2_0.read(ba) << 0;
96
97// -----------------------------------------------------------------------------
98
99 std::stringstream ss;
100// -----------------------------------------------------------------------------
101ss << "mul" << " # " << ba << (" [rd=" + std::to_string(rd) + " | rs1=" + std::to_string(rs1) + " | rs2=" + std::to_string(rs2) + "]");
102// -----------------------------------------------------------------------------
103 return ss.str();
104 }
105);
106
107// MULH ------------------------------------------------------------------------
110 "mulh",
111 (uint32_t) 0x2001033,
112 (uint32_t) 0xfe00707f,
113 [] (BitArray & ba,etiss::CodeSet & cs,InstructionContext & ic)
114 {
115
116// -----------------------------------------------------------------------------
117
118// -----------------------------------------------------------------------------
119
120// -----------------------------------------------------------------------------
121// NOLINTBEGIN(clang-diagnostic-unused-but-set-variable)
122etiss_uint8 rd = 0;
123static BitArrayRange R_rd_0(11, 7);
124rd += R_rd_0.read(ba) << 0;
125etiss_uint8 rs1 = 0;
126static BitArrayRange R_rs1_0(19, 15);
127rs1 += R_rs1_0.read(ba) << 0;
128etiss_uint8 rs2 = 0;
129static BitArrayRange R_rs2_0(24, 20);
130rs2 += R_rs2_0.read(ba) << 0;
131
132// NOLINTEND(clang-diagnostic-unused-but-set-variable)
133// -----------------------------------------------------------------------------
134
135 {
137
138 cp.code() = std::string("//MULH\n");
139
140// -----------------------------------------------------------------------------
141cp.code() += "etiss_coverage_count(1, 73);\n";
142{ // block
143cp.code() += "etiss_coverage_count(1, 1169);\n";
144cp.code() += "{ // block\n";
145cp.code() += "cpu->nextPc = " + std::to_string(ic.current_address_ + 4) + "ULL;\n";
146cp.code() += "etiss_coverage_count(5, 1168, 1164, 1167, 1165, 1166);\n";
147cp.code() += "} // block\n";
148} // block
149{ // block
150cp.code() += "etiss_coverage_count(1, 2886);\n";
151cp.code() += "{ // block\n";
152cp.code() += "etiss_coverage_count(1, 2847);\n";
153if ((rd % 32ULL) != 0LL) { // conditional
154cp.code() += "etiss_coverage_count(5, 2853, 2850, 2848, 2851, 2852);\n";
155{ // block
156cp.code() += "etiss_coverage_count(1, 2885);\n";
157cp.code() += "{ // block\n";
158cp.code() += "etiss_int64 res = (etiss_int64)((etiss_int32)(*((RV32IMACFD*)cpu)->X[" + std::to_string(rs1 % 32ULL) + "ULL])) * (etiss_int64)((etiss_int32)(*((RV32IMACFD*)cpu)->X[" + std::to_string(rs2 % 32ULL) + "ULL]));\n";
159cp.code() += "etiss_coverage_count(12, 2872, 2871, 2862, 2860, 2859, 2858, 2856, 2870, 2868, 2867, 2866, 2864);\n";
160cp.code() += "*((RV32IMACFD*)cpu)->X[" + std::to_string(rd % 32ULL) + "ULL] = (etiss_uint32)((res >> 32ULL));\n";
161cp.code() += "etiss_coverage_count(8, 2884, 2877, 2876, 2874, 2883, 2880, 2878, 2881);\n";
162cp.code() += "} // block\n";
163} // block
164} // conditional
165cp.code() += "} // block\n";
166} // block
167cp.code() += "instr_exit_" + std::to_string(ic.current_address_) + ":\n";
168cp.code() += "cpu->instructionPointer = cpu->nextPc;\n";
169// -----------------------------------------------------------------------------
170 cp.getAffectedRegisters().add("instructionPointer", 32);
171 }
172
173 return true;
174 },
175 0,
176 [] (BitArray & ba, Instruction & instr)
177 {
178// -----------------------------------------------------------------------------
179etiss_uint8 rd = 0;
180static BitArrayRange R_rd_0(11, 7);
181rd += R_rd_0.read(ba) << 0;
182etiss_uint8 rs1 = 0;
183static BitArrayRange R_rs1_0(19, 15);
184rs1 += R_rs1_0.read(ba) << 0;
185etiss_uint8 rs2 = 0;
186static BitArrayRange R_rs2_0(24, 20);
187rs2 += R_rs2_0.read(ba) << 0;
188
189// -----------------------------------------------------------------------------
190
191 std::stringstream ss;
192// -----------------------------------------------------------------------------
193ss << "mulh" << " # " << ba << (" [rd=" + std::to_string(rd) + " | rs1=" + std::to_string(rs1) + " | rs2=" + std::to_string(rs2) + "]");
194// -----------------------------------------------------------------------------
195 return ss.str();
196 }
197);
198
199// MULHSU ----------------------------------------------------------------------
202 "mulhsu",
203 (uint32_t) 0x2002033,
204 (uint32_t) 0xfe00707f,
205 [] (BitArray & ba,etiss::CodeSet & cs,InstructionContext & ic)
206 {
207
208// -----------------------------------------------------------------------------
209
210// -----------------------------------------------------------------------------
211
212// -----------------------------------------------------------------------------
213// NOLINTBEGIN(clang-diagnostic-unused-but-set-variable)
214etiss_uint8 rd = 0;
215static BitArrayRange R_rd_0(11, 7);
216rd += R_rd_0.read(ba) << 0;
217etiss_uint8 rs1 = 0;
218static BitArrayRange R_rs1_0(19, 15);
219rs1 += R_rs1_0.read(ba) << 0;
220etiss_uint8 rs2 = 0;
221static BitArrayRange R_rs2_0(24, 20);
222rs2 += R_rs2_0.read(ba) << 0;
223
224// NOLINTEND(clang-diagnostic-unused-but-set-variable)
225// -----------------------------------------------------------------------------
226
227 {
229
230 cp.code() = std::string("//MULHSU\n");
231
232// -----------------------------------------------------------------------------
233cp.code() += "etiss_coverage_count(1, 74);\n";
234{ // block
235cp.code() += "etiss_coverage_count(1, 1169);\n";
236cp.code() += "{ // block\n";
237cp.code() += "cpu->nextPc = " + std::to_string(ic.current_address_ + 4) + "ULL;\n";
238cp.code() += "etiss_coverage_count(5, 1168, 1164, 1167, 1165, 1166);\n";
239cp.code() += "} // block\n";
240} // block
241{ // block
242cp.code() += "etiss_coverage_count(1, 2925);\n";
243cp.code() += "{ // block\n";
244cp.code() += "etiss_coverage_count(1, 2887);\n";
245if ((rd % 32ULL) != 0LL) { // conditional
246cp.code() += "etiss_coverage_count(5, 2893, 2890, 2888, 2891, 2892);\n";
247{ // block
248cp.code() += "etiss_coverage_count(1, 2924);\n";
249cp.code() += "{ // block\n";
250cp.code() += "etiss_int64 res = (etiss_int64)((etiss_int32)(*((RV32IMACFD*)cpu)->X[" + std::to_string(rs1 % 32ULL) + "ULL])) * (etiss_uint64)(*((RV32IMACFD*)cpu)->X[" + std::to_string(rs2 % 32ULL) + "ULL]);\n";
251cp.code() += "etiss_coverage_count(11, 2911, 2910, 2902, 2900, 2899, 2898, 2896, 2909, 2907, 2906, 2904);\n";
252cp.code() += "*((RV32IMACFD*)cpu)->X[" + std::to_string(rd % 32ULL) + "ULL] = (etiss_uint32)((res >> 32ULL));\n";
253cp.code() += "etiss_coverage_count(8, 2923, 2916, 2915, 2913, 2922, 2919, 2917, 2920);\n";
254cp.code() += "} // block\n";
255} // block
256} // conditional
257cp.code() += "} // block\n";
258} // block
259cp.code() += "instr_exit_" + std::to_string(ic.current_address_) + ":\n";
260cp.code() += "cpu->instructionPointer = cpu->nextPc;\n";
261// -----------------------------------------------------------------------------
262 cp.getAffectedRegisters().add("instructionPointer", 32);
263 }
264
265 return true;
266 },
267 0,
268 [] (BitArray & ba, Instruction & instr)
269 {
270// -----------------------------------------------------------------------------
271etiss_uint8 rd = 0;
272static BitArrayRange R_rd_0(11, 7);
273rd += R_rd_0.read(ba) << 0;
274etiss_uint8 rs1 = 0;
275static BitArrayRange R_rs1_0(19, 15);
276rs1 += R_rs1_0.read(ba) << 0;
277etiss_uint8 rs2 = 0;
278static BitArrayRange R_rs2_0(24, 20);
279rs2 += R_rs2_0.read(ba) << 0;
280
281// -----------------------------------------------------------------------------
282
283 std::stringstream ss;
284// -----------------------------------------------------------------------------
285ss << "mulhsu" << " # " << ba << (" [rd=" + std::to_string(rd) + " | rs1=" + std::to_string(rs1) + " | rs2=" + std::to_string(rs2) + "]");
286// -----------------------------------------------------------------------------
287 return ss.str();
288 }
289);
290
291// MULHU -----------------------------------------------------------------------
294 "mulhu",
295 (uint32_t) 0x2003033,
296 (uint32_t) 0xfe00707f,
297 [] (BitArray & ba,etiss::CodeSet & cs,InstructionContext & ic)
298 {
299
300// -----------------------------------------------------------------------------
301
302// -----------------------------------------------------------------------------
303
304// -----------------------------------------------------------------------------
305// NOLINTBEGIN(clang-diagnostic-unused-but-set-variable)
306etiss_uint8 rd = 0;
307static BitArrayRange R_rd_0(11, 7);
308rd += R_rd_0.read(ba) << 0;
309etiss_uint8 rs1 = 0;
310static BitArrayRange R_rs1_0(19, 15);
311rs1 += R_rs1_0.read(ba) << 0;
312etiss_uint8 rs2 = 0;
313static BitArrayRange R_rs2_0(24, 20);
314rs2 += R_rs2_0.read(ba) << 0;
315
316// NOLINTEND(clang-diagnostic-unused-but-set-variable)
317// -----------------------------------------------------------------------------
318
319 {
321
322 cp.code() = std::string("//MULHU\n");
323
324// -----------------------------------------------------------------------------
325cp.code() += "etiss_coverage_count(1, 75);\n";
326{ // block
327cp.code() += "etiss_coverage_count(1, 1169);\n";
328cp.code() += "{ // block\n";
329cp.code() += "cpu->nextPc = " + std::to_string(ic.current_address_ + 4) + "ULL;\n";
330cp.code() += "etiss_coverage_count(5, 1168, 1164, 1167, 1165, 1166);\n";
331cp.code() += "} // block\n";
332} // block
333{ // block
334cp.code() += "etiss_coverage_count(1, 2963);\n";
335cp.code() += "{ // block\n";
336cp.code() += "etiss_coverage_count(1, 2926);\n";
337if ((rd % 32ULL) != 0LL) { // conditional
338cp.code() += "etiss_coverage_count(5, 2932, 2929, 2927, 2930, 2931);\n";
339{ // block
340cp.code() += "etiss_coverage_count(1, 2962);\n";
341cp.code() += "{ // block\n";
342cp.code() += "etiss_uint64 res = (etiss_uint64)(*((RV32IMACFD*)cpu)->X[" + std::to_string(rs1 % 32ULL) + "ULL]) * (etiss_uint64)(*((RV32IMACFD*)cpu)->X[" + std::to_string(rs2 % 32ULL) + "ULL]);\n";
343cp.code() += "etiss_coverage_count(10, 2949, 2948, 2940, 2938, 2937, 2935, 2947, 2945, 2944, 2942);\n";
344cp.code() += "*((RV32IMACFD*)cpu)->X[" + std::to_string(rd % 32ULL) + "ULL] = (etiss_uint32)((res >> 32ULL));\n";
345cp.code() += "etiss_coverage_count(8, 2961, 2954, 2953, 2951, 2960, 2957, 2955, 2958);\n";
346cp.code() += "} // block\n";
347} // block
348} // conditional
349cp.code() += "} // block\n";
350} // block
351cp.code() += "instr_exit_" + std::to_string(ic.current_address_) + ":\n";
352cp.code() += "cpu->instructionPointer = cpu->nextPc;\n";
353// -----------------------------------------------------------------------------
354 cp.getAffectedRegisters().add("instructionPointer", 32);
355 }
356
357 return true;
358 },
359 0,
360 [] (BitArray & ba, Instruction & instr)
361 {
362// -----------------------------------------------------------------------------
363etiss_uint8 rd = 0;
364static BitArrayRange R_rd_0(11, 7);
365rd += R_rd_0.read(ba) << 0;
366etiss_uint8 rs1 = 0;
367static BitArrayRange R_rs1_0(19, 15);
368rs1 += R_rs1_0.read(ba) << 0;
369etiss_uint8 rs2 = 0;
370static BitArrayRange R_rs2_0(24, 20);
371rs2 += R_rs2_0.read(ba) << 0;
372
373// -----------------------------------------------------------------------------
374
375 std::stringstream ss;
376// -----------------------------------------------------------------------------
377ss << "mulhu" << " # " << ba << (" [rd=" + std::to_string(rd) + " | rs1=" + std::to_string(rs1) + " | rs2=" + std::to_string(rs2) + "]");
378// -----------------------------------------------------------------------------
379 return ss.str();
380 }
381);
382
383// DIV -------------------------------------------------------------------------
386 "div",
387 (uint32_t) 0x2004033,
388 (uint32_t) 0xfe00707f,
389 [] (BitArray & ba,etiss::CodeSet & cs,InstructionContext & ic)
390 {
391
392// -----------------------------------------------------------------------------
393
394// -----------------------------------------------------------------------------
395
396// -----------------------------------------------------------------------------
397// NOLINTBEGIN(clang-diagnostic-unused-but-set-variable)
398etiss_uint8 rd = 0;
399static BitArrayRange R_rd_0(11, 7);
400rd += R_rd_0.read(ba) << 0;
401etiss_uint8 rs1 = 0;
402static BitArrayRange R_rs1_0(19, 15);
403rs1 += R_rs1_0.read(ba) << 0;
404etiss_uint8 rs2 = 0;
405static BitArrayRange R_rs2_0(24, 20);
406rs2 += R_rs2_0.read(ba) << 0;
407
408// NOLINTEND(clang-diagnostic-unused-but-set-variable)
409// -----------------------------------------------------------------------------
410
411 {
413
414 cp.code() = std::string("//DIV\n");
415
416// -----------------------------------------------------------------------------
417cp.code() += "etiss_coverage_count(1, 76);\n";
418{ // block
419cp.code() += "etiss_coverage_count(1, 1169);\n";
420cp.code() += "{ // block\n";
421cp.code() += "cpu->nextPc = " + std::to_string(ic.current_address_ + 4) + "ULL;\n";
422cp.code() += "etiss_coverage_count(5, 1168, 1164, 1167, 1165, 1166);\n";
423cp.code() += "} // block\n";
424} // block
425{ // block
426cp.code() += "etiss_coverage_count(1, 3044);\n";
427cp.code() += "{ // block\n";
428cp.code() += "etiss_coverage_count(1, 2964);\n";
429if ((rd % 32ULL) != 0LL) { // conditional
430cp.code() += "etiss_coverage_count(5, 2970, 2967, 2965, 2968, 2969);\n";
431{ // block
432cp.code() += "etiss_coverage_count(1, 3043);\n";
433cp.code() += "{ // block\n";
434cp.code() += "etiss_coverage_count(1, 2971);\n";
435cp.code() += "if (*((RV32IMACFD*)cpu)->X[" + std::to_string(rs2 % 32ULL) + "ULL] != 0LL) { // conditional\n";
436cp.code() += "etiss_coverage_count(5, 2978, 2976, 2975, 2973, 2977);\n";
437{ // block
438cp.code() += "etiss_coverage_count(1, 3034);\n";
439cp.code() += "{ // block\n";
440etiss_uint32 MMIN = 2147483648ULL;
441cp.code() += "etiss_coverage_count(1, 2986);\n";
442cp.code() += "etiss_coverage_count(1, 2987);\n";
443cp.code() += "if (*((RV32IMACFD*)cpu)->X[" + std::to_string(rs1 % 32ULL) + "ULL] == " + std::to_string(MMIN) + "ULL && (etiss_int32)(*((RV32IMACFD*)cpu)->X[" + std::to_string(rs2 % 32ULL) + "ULL]) == -1LL) { // conditional\n";
444cp.code() += "etiss_coverage_count(11, 3005, 2994, 2992, 2991, 2989, 2993, 3004, 3001, 2999, 2998, 2996);\n";
445cp.code() += "*((RV32IMACFD*)cpu)->X[" + std::to_string(rd % 32ULL) + "ULL] = " + std::to_string(MMIN) + "ULL;\n";
446cp.code() += "etiss_coverage_count(5, 3012, 3010, 3009, 3007, 3011);\n";
447cp.code() += "} // conditional\n";
448cp.code() += "else { // conditional\n";
449cp.code() += "*((RV32IMACFD*)cpu)->X[" + std::to_string(rd % 32ULL) + "ULL] = (etiss_int32)(*((RV32IMACFD*)cpu)->X[" + std::to_string(rs1 % 32ULL) + "ULL]) / (etiss_int32)(*((RV32IMACFD*)cpu)->X[" + std::to_string(rs2 % 32ULL) + "ULL]);\n";
450cp.code() += "etiss_coverage_count(13, 3033, 3017, 3016, 3014, 3032, 3024, 3022, 3021, 3019, 3031, 3029, 3028, 3026);\n";
451cp.code() += "} // conditional\n";
452cp.code() += "} // block\n";
453} // block
454cp.code() += "} // conditional\n";
455cp.code() += "else { // conditional\n";
456cp.code() += "*((RV32IMACFD*)cpu)->X[" + std::to_string(rd % 32ULL) + "ULL] = -1LL;\n";
457cp.code() += "etiss_coverage_count(4, 3042, 3039, 3038, 3036);\n";
458cp.code() += "} // conditional\n";
459cp.code() += "} // block\n";
460} // block
461} // conditional
462cp.code() += "} // block\n";
463} // block
464cp.code() += "instr_exit_" + std::to_string(ic.current_address_) + ":\n";
465cp.code() += "cpu->instructionPointer = cpu->nextPc;\n";
466// -----------------------------------------------------------------------------
467 cp.getAffectedRegisters().add("instructionPointer", 32);
468 }
469
470 return true;
471 },
472 0,
473 [] (BitArray & ba, Instruction & instr)
474 {
475// -----------------------------------------------------------------------------
476etiss_uint8 rd = 0;
477static BitArrayRange R_rd_0(11, 7);
478rd += R_rd_0.read(ba) << 0;
479etiss_uint8 rs1 = 0;
480static BitArrayRange R_rs1_0(19, 15);
481rs1 += R_rs1_0.read(ba) << 0;
482etiss_uint8 rs2 = 0;
483static BitArrayRange R_rs2_0(24, 20);
484rs2 += R_rs2_0.read(ba) << 0;
485
486// -----------------------------------------------------------------------------
487
488 std::stringstream ss;
489// -----------------------------------------------------------------------------
490ss << "div" << " # " << ba << (" [rd=" + std::to_string(rd) + " | rs1=" + std::to_string(rs1) + " | rs2=" + std::to_string(rs2) + "]");
491// -----------------------------------------------------------------------------
492 return ss.str();
493 }
494);
495
496// DIVU ------------------------------------------------------------------------
499 "divu",
500 (uint32_t) 0x2005033,
501 (uint32_t) 0xfe00707f,
502 [] (BitArray & ba,etiss::CodeSet & cs,InstructionContext & ic)
503 {
504
505// -----------------------------------------------------------------------------
506
507// -----------------------------------------------------------------------------
508
509// -----------------------------------------------------------------------------
510// NOLINTBEGIN(clang-diagnostic-unused-but-set-variable)
511etiss_uint8 rd = 0;
512static BitArrayRange R_rd_0(11, 7);
513rd += R_rd_0.read(ba) << 0;
514etiss_uint8 rs1 = 0;
515static BitArrayRange R_rs1_0(19, 15);
516rs1 += R_rs1_0.read(ba) << 0;
517etiss_uint8 rs2 = 0;
518static BitArrayRange R_rs2_0(24, 20);
519rs2 += R_rs2_0.read(ba) << 0;
520
521// NOLINTEND(clang-diagnostic-unused-but-set-variable)
522// -----------------------------------------------------------------------------
523
524 {
526
527 cp.code() = std::string("//DIVU\n");
528
529// -----------------------------------------------------------------------------
530cp.code() += "etiss_coverage_count(1, 77);\n";
531{ // block
532cp.code() += "etiss_coverage_count(1, 1169);\n";
533cp.code() += "{ // block\n";
534cp.code() += "cpu->nextPc = " + std::to_string(ic.current_address_ + 4) + "ULL;\n";
535cp.code() += "etiss_coverage_count(5, 1168, 1164, 1167, 1165, 1166);\n";
536cp.code() += "} // block\n";
537} // block
538{ // block
539cp.code() += "etiss_coverage_count(1, 3086);\n";
540cp.code() += "{ // block\n";
541cp.code() += "etiss_coverage_count(1, 3045);\n";
542if ((rd % 32ULL) != 0LL) { // conditional
543cp.code() += "etiss_coverage_count(5, 3051, 3048, 3046, 3049, 3050);\n";
544{ // block
545cp.code() += "etiss_coverage_count(1, 3085);\n";
546cp.code() += "{ // block\n";
547cp.code() += "etiss_coverage_count(1, 3052);\n";
548cp.code() += "if (*((RV32IMACFD*)cpu)->X[" + std::to_string(rs2 % 32ULL) + "ULL] != 0LL) { // conditional\n";
549cp.code() += "etiss_coverage_count(5, 3059, 3057, 3056, 3054, 3058);\n";
550cp.code() += "*((RV32IMACFD*)cpu)->X[" + std::to_string(rd % 32ULL) + "ULL] = *((RV32IMACFD*)cpu)->X[" + std::to_string(rs1 % 32ULL) + "ULL] / *((RV32IMACFD*)cpu)->X[" + std::to_string(rs2 % 32ULL) + "ULL];\n";
551cp.code() += "etiss_coverage_count(11, 3076, 3064, 3063, 3061, 3075, 3069, 3068, 3066, 3074, 3073, 3071);\n";
552cp.code() += "} // conditional\n";
553cp.code() += "else { // conditional\n";
554cp.code() += "*((RV32IMACFD*)cpu)->X[" + std::to_string(rd % 32ULL) + "ULL] = -1LL;\n";
555cp.code() += "etiss_coverage_count(4, 3084, 3081, 3080, 3078);\n";
556cp.code() += "} // conditional\n";
557cp.code() += "} // block\n";
558} // block
559} // conditional
560cp.code() += "} // block\n";
561} // block
562cp.code() += "instr_exit_" + std::to_string(ic.current_address_) + ":\n";
563cp.code() += "cpu->instructionPointer = cpu->nextPc;\n";
564// -----------------------------------------------------------------------------
565 cp.getAffectedRegisters().add("instructionPointer", 32);
566 }
567
568 return true;
569 },
570 0,
571 [] (BitArray & ba, Instruction & instr)
572 {
573// -----------------------------------------------------------------------------
574etiss_uint8 rd = 0;
575static BitArrayRange R_rd_0(11, 7);
576rd += R_rd_0.read(ba) << 0;
577etiss_uint8 rs1 = 0;
578static BitArrayRange R_rs1_0(19, 15);
579rs1 += R_rs1_0.read(ba) << 0;
580etiss_uint8 rs2 = 0;
581static BitArrayRange R_rs2_0(24, 20);
582rs2 += R_rs2_0.read(ba) << 0;
583
584// -----------------------------------------------------------------------------
585
586 std::stringstream ss;
587// -----------------------------------------------------------------------------
588ss << "divu" << " # " << ba << (" [rd=" + std::to_string(rd) + " | rs1=" + std::to_string(rs1) + " | rs2=" + std::to_string(rs2) + "]");
589// -----------------------------------------------------------------------------
590 return ss.str();
591 }
592);
593
594// REM -------------------------------------------------------------------------
597 "rem",
598 (uint32_t) 0x2006033,
599 (uint32_t) 0xfe00707f,
600 [] (BitArray & ba,etiss::CodeSet & cs,InstructionContext & ic)
601 {
602
603// -----------------------------------------------------------------------------
604
605// -----------------------------------------------------------------------------
606
607// -----------------------------------------------------------------------------
608// NOLINTBEGIN(clang-diagnostic-unused-but-set-variable)
609etiss_uint8 rd = 0;
610static BitArrayRange R_rd_0(11, 7);
611rd += R_rd_0.read(ba) << 0;
612etiss_uint8 rs1 = 0;
613static BitArrayRange R_rs1_0(19, 15);
614rs1 += R_rs1_0.read(ba) << 0;
615etiss_uint8 rs2 = 0;
616static BitArrayRange R_rs2_0(24, 20);
617rs2 += R_rs2_0.read(ba) << 0;
618
619// NOLINTEND(clang-diagnostic-unused-but-set-variable)
620// -----------------------------------------------------------------------------
621
622 {
624
625 cp.code() = std::string("//REM\n");
626
627// -----------------------------------------------------------------------------
628cp.code() += "etiss_coverage_count(1, 78);\n";
629{ // block
630cp.code() += "etiss_coverage_count(1, 1169);\n";
631cp.code() += "{ // block\n";
632cp.code() += "cpu->nextPc = " + std::to_string(ic.current_address_ + 4) + "ULL;\n";
633cp.code() += "etiss_coverage_count(5, 1168, 1164, 1167, 1165, 1166);\n";
634cp.code() += "} // block\n";
635} // block
636{ // block
637cp.code() += "etiss_coverage_count(1, 3170);\n";
638cp.code() += "{ // block\n";
639cp.code() += "etiss_coverage_count(1, 3087);\n";
640if ((rd % 32ULL) != 0LL) { // conditional
641cp.code() += "etiss_coverage_count(5, 3093, 3090, 3088, 3091, 3092);\n";
642{ // block
643cp.code() += "etiss_coverage_count(1, 3169);\n";
644cp.code() += "{ // block\n";
645cp.code() += "etiss_coverage_count(1, 3094);\n";
646cp.code() += "if (*((RV32IMACFD*)cpu)->X[" + std::to_string(rs2 % 32ULL) + "ULL] != 0LL) { // conditional\n";
647cp.code() += "etiss_coverage_count(5, 3101, 3099, 3098, 3096, 3100);\n";
648{ // block
649cp.code() += "etiss_coverage_count(1, 3157);\n";
650cp.code() += "{ // block\n";
651etiss_uint32 MMIN = 2147483648ULL;
652cp.code() += "etiss_coverage_count(1, 3109);\n";
653cp.code() += "etiss_coverage_count(1, 3110);\n";
654cp.code() += "if (*((RV32IMACFD*)cpu)->X[" + std::to_string(rs1 % 32ULL) + "ULL] == " + std::to_string(MMIN) + "ULL && (etiss_int32)(*((RV32IMACFD*)cpu)->X[" + std::to_string(rs2 % 32ULL) + "ULL]) == -1LL) { // conditional\n";
655cp.code() += "etiss_coverage_count(11, 3128, 3117, 3115, 3114, 3112, 3116, 3127, 3124, 3122, 3121, 3119);\n";
656cp.code() += "*((RV32IMACFD*)cpu)->X[" + std::to_string(rd % 32ULL) + "ULL] = 0LL;\n";
657cp.code() += "etiss_coverage_count(5, 3135, 3133, 3132, 3130, 3134);\n";
658cp.code() += "} // conditional\n";
659cp.code() += "else { // conditional\n";
660cp.code() += "*((RV32IMACFD*)cpu)->X[" + std::to_string(rd % 32ULL) + "ULL] = (etiss_int32)(*((RV32IMACFD*)cpu)->X[" + std::to_string(rs1 % 32ULL) + "ULL]) % (etiss_int32)(*((RV32IMACFD*)cpu)->X[" + std::to_string(rs2 % 32ULL) + "ULL]);\n";
661cp.code() += "etiss_coverage_count(13, 3156, 3140, 3139, 3137, 3155, 3147, 3145, 3144, 3142, 3154, 3152, 3151, 3149);\n";
662cp.code() += "} // conditional\n";
663cp.code() += "} // block\n";
664} // block
665cp.code() += "} // conditional\n";
666cp.code() += "else { // conditional\n";
667cp.code() += "*((RV32IMACFD*)cpu)->X[" + std::to_string(rd % 32ULL) + "ULL] = *((RV32IMACFD*)cpu)->X[" + std::to_string(rs1 % 32ULL) + "ULL];\n";
668cp.code() += "etiss_coverage_count(7, 3168, 3162, 3161, 3159, 3167, 3166, 3164);\n";
669cp.code() += "} // conditional\n";
670cp.code() += "} // block\n";
671} // block
672} // conditional
673cp.code() += "} // block\n";
674} // block
675cp.code() += "instr_exit_" + std::to_string(ic.current_address_) + ":\n";
676cp.code() += "cpu->instructionPointer = cpu->nextPc;\n";
677// -----------------------------------------------------------------------------
678 cp.getAffectedRegisters().add("instructionPointer", 32);
679 }
680
681 return true;
682 },
683 0,
684 [] (BitArray & ba, Instruction & instr)
685 {
686// -----------------------------------------------------------------------------
687etiss_uint8 rd = 0;
688static BitArrayRange R_rd_0(11, 7);
689rd += R_rd_0.read(ba) << 0;
690etiss_uint8 rs1 = 0;
691static BitArrayRange R_rs1_0(19, 15);
692rs1 += R_rs1_0.read(ba) << 0;
693etiss_uint8 rs2 = 0;
694static BitArrayRange R_rs2_0(24, 20);
695rs2 += R_rs2_0.read(ba) << 0;
696
697// -----------------------------------------------------------------------------
698
699 std::stringstream ss;
700// -----------------------------------------------------------------------------
701ss << "rem" << " # " << ba << (" [rd=" + std::to_string(rd) + " | rs1=" + std::to_string(rs1) + " | rs2=" + std::to_string(rs2) + "]");
702// -----------------------------------------------------------------------------
703 return ss.str();
704 }
705);
706
707// REMU ------------------------------------------------------------------------
710 "remu",
711 (uint32_t) 0x2007033,
712 (uint32_t) 0xfe00707f,
713 [] (BitArray & ba,etiss::CodeSet & cs,InstructionContext & ic)
714 {
715
716// -----------------------------------------------------------------------------
717
718// -----------------------------------------------------------------------------
719
720// -----------------------------------------------------------------------------
721// NOLINTBEGIN(clang-diagnostic-unused-but-set-variable)
722etiss_uint8 rd = 0;
723static BitArrayRange R_rd_0(11, 7);
724rd += R_rd_0.read(ba) << 0;
725etiss_uint8 rs1 = 0;
726static BitArrayRange R_rs1_0(19, 15);
727rs1 += R_rs1_0.read(ba) << 0;
728etiss_uint8 rs2 = 0;
729static BitArrayRange R_rs2_0(24, 20);
730rs2 += R_rs2_0.read(ba) << 0;
731
732// NOLINTEND(clang-diagnostic-unused-but-set-variable)
733// -----------------------------------------------------------------------------
734
735 {
737
738 cp.code() = std::string("//REMU\n");
739
740// -----------------------------------------------------------------------------
741cp.code() += "etiss_coverage_count(1, 79);\n";
742{ // block
743cp.code() += "etiss_coverage_count(1, 1169);\n";
744cp.code() += "{ // block\n";
745cp.code() += "cpu->nextPc = " + std::to_string(ic.current_address_ + 4) + "ULL;\n";
746cp.code() += "etiss_coverage_count(5, 1168, 1164, 1167, 1165, 1166);\n";
747cp.code() += "} // block\n";
748} // block
749{ // block
750cp.code() += "etiss_coverage_count(1, 3215);\n";
751cp.code() += "{ // block\n";
752cp.code() += "etiss_coverage_count(1, 3171);\n";
753if ((rd % 32ULL) != 0LL) { // conditional
754cp.code() += "etiss_coverage_count(5, 3177, 3174, 3172, 3175, 3176);\n";
755{ // block
756cp.code() += "etiss_coverage_count(1, 3214);\n";
757cp.code() += "{ // block\n";
758cp.code() += "etiss_coverage_count(1, 3178);\n";
759cp.code() += "if (*((RV32IMACFD*)cpu)->X[" + std::to_string(rs2 % 32ULL) + "ULL] != 0LL) { // conditional\n";
760cp.code() += "etiss_coverage_count(5, 3185, 3183, 3182, 3180, 3184);\n";
761cp.code() += "*((RV32IMACFD*)cpu)->X[" + std::to_string(rd % 32ULL) + "ULL] = *((RV32IMACFD*)cpu)->X[" + std::to_string(rs1 % 32ULL) + "ULL] % *((RV32IMACFD*)cpu)->X[" + std::to_string(rs2 % 32ULL) + "ULL];\n";
762cp.code() += "etiss_coverage_count(11, 3202, 3190, 3189, 3187, 3201, 3195, 3194, 3192, 3200, 3199, 3197);\n";
763cp.code() += "} // conditional\n";
764cp.code() += "else { // conditional\n";
765cp.code() += "*((RV32IMACFD*)cpu)->X[" + std::to_string(rd % 32ULL) + "ULL] = *((RV32IMACFD*)cpu)->X[" + std::to_string(rs1 % 32ULL) + "ULL];\n";
766cp.code() += "etiss_coverage_count(7, 3213, 3207, 3206, 3204, 3212, 3211, 3209);\n";
767cp.code() += "} // conditional\n";
768cp.code() += "} // block\n";
769} // block
770} // conditional
771cp.code() += "} // block\n";
772} // block
773cp.code() += "instr_exit_" + std::to_string(ic.current_address_) + ":\n";
774cp.code() += "cpu->instructionPointer = cpu->nextPc;\n";
775// -----------------------------------------------------------------------------
776 cp.getAffectedRegisters().add("instructionPointer", 32);
777 }
778
779 return true;
780 },
781 0,
782 [] (BitArray & ba, Instruction & instr)
783 {
784// -----------------------------------------------------------------------------
785etiss_uint8 rd = 0;
786static BitArrayRange R_rd_0(11, 7);
787rd += R_rd_0.read(ba) << 0;
788etiss_uint8 rs1 = 0;
789static BitArrayRange R_rs1_0(19, 15);
790rs1 += R_rs1_0.read(ba) << 0;
791etiss_uint8 rs2 = 0;
792static BitArrayRange R_rs2_0(24, 20);
793rs2 += R_rs2_0.read(ba) << 0;
794
795// -----------------------------------------------------------------------------
796
797 std::stringstream ss;
798// -----------------------------------------------------------------------------
799ss << "remu" << " # " << ba << (" [rd=" + std::to_string(rd) + " | rs1=" + std::to_string(rs1) + " | rs2=" + std::to_string(rs2) + "]");
800// -----------------------------------------------------------------------------
801 return ss.str();
802 }
803);
804// clang-format on
etiss::instr::InstructionGroup ISA32_RV32IMACFD("ISA32_RV32IMACFD", 32)
static InstructionDefinition divu_rd_rs1_rs2(ISA32_RV32IMACFD, "divu",(uint32_t) 0x2005033,(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("//DIVU\n");cp.code()+="etiss_coverage_count(1, 77);\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, 3086);\n";cp.code()+="{ // block\n";cp.code()+="etiss_coverage_count(1, 3045);\n";if((rd % 32ULL) !=0LL) { cp.code()+="etiss_coverage_count(5, 3051, 3048, 3046, 3049, 3050);\n";{ cp.code()+="etiss_coverage_count(1, 3085);\n";cp.code()+="{ // block\n";cp.code()+="etiss_coverage_count(1, 3052);\n";cp.code()+="if (*((RV32IMACFD*)cpu)->X["+std::to_string(rs2 % 32ULL)+"ULL] != 0LL) { // conditional\n";cp.code()+="etiss_coverage_count(5, 3059, 3057, 3056, 3054, 3058);\n";cp.code()+="*((RV32IMACFD*)cpu)->X["+std::to_string(rd % 32ULL)+"ULL] = *((RV32IMACFD*)cpu)->X["+std::to_string(rs1 % 32ULL)+"ULL] / *((RV32IMACFD*)cpu)->X["+std::to_string(rs2 % 32ULL)+"ULL];\n";cp.code()+="etiss_coverage_count(11, 3076, 3064, 3063, 3061, 3075, 3069, 3068, 3066, 3074, 3073, 3071);\n";cp.code()+="} // conditional\n";cp.code()+="else { // conditional\n";cp.code()+="*((RV32IMACFD*)cpu)->X["+std::to_string(rd % 32ULL)+"ULL] = -1LL;\n";cp.code()+="etiss_coverage_count(4, 3084, 3081, 3080, 3078);\n";cp.code()+="} // conditional\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<< "divu"<< " # "<< ba<<(" [rd="+std::to_string(rd)+" | rs1="+std::to_string(rs1)+" | rs2="+std::to_string(rs2)+"]");return ss.str();})
static InstructionDefinition mulh_rd_rs1_rs2(ISA32_RV32IMACFD, "mulh",(uint32_t) 0x2001033,(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("//MULH\n");cp.code()+="etiss_coverage_count(1, 73);\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, 2886);\n";cp.code()+="{ // block\n";cp.code()+="etiss_coverage_count(1, 2847);\n";if((rd % 32ULL) !=0LL) { cp.code()+="etiss_coverage_count(5, 2853, 2850, 2848, 2851, 2852);\n";{ cp.code()+="etiss_coverage_count(1, 2885);\n";cp.code()+="{ // block\n";cp.code()+="etiss_int64 res = (etiss_int64)((etiss_int32)(*((RV32IMACFD*)cpu)->X["+std::to_string(rs1 % 32ULL)+"ULL])) * (etiss_int64)((etiss_int32)(*((RV32IMACFD*)cpu)->X["+std::to_string(rs2 % 32ULL)+"ULL]));\n";cp.code()+="etiss_coverage_count(12, 2872, 2871, 2862, 2860, 2859, 2858, 2856, 2870, 2868, 2867, 2866, 2864);\n";cp.code()+="*((RV32IMACFD*)cpu)->X["+std::to_string(rd % 32ULL)+"ULL] = (etiss_uint32)((res >> 32ULL));\n";cp.code()+="etiss_coverage_count(8, 2884, 2877, 2876, 2874, 2883, 2880, 2878, 2881);\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<< "mulh"<< " # "<< ba<<(" [rd="+std::to_string(rd)+" | rs1="+std::to_string(rs1)+" | rs2="+std::to_string(rs2)+"]");return ss.str();})
static InstructionDefinition rem_rd_rs1_rs2(ISA32_RV32IMACFD, "rem",(uint32_t) 0x2006033,(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("//REM\n");cp.code()+="etiss_coverage_count(1, 78);\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, 3170);\n";cp.code()+="{ // block\n";cp.code()+="etiss_coverage_count(1, 3087);\n";if((rd % 32ULL) !=0LL) { cp.code()+="etiss_coverage_count(5, 3093, 3090, 3088, 3091, 3092);\n";{ cp.code()+="etiss_coverage_count(1, 3169);\n";cp.code()+="{ // block\n";cp.code()+="etiss_coverage_count(1, 3094);\n";cp.code()+="if (*((RV32IMACFD*)cpu)->X["+std::to_string(rs2 % 32ULL)+"ULL] != 0LL) { // conditional\n";cp.code()+="etiss_coverage_count(5, 3101, 3099, 3098, 3096, 3100);\n";{ cp.code()+="etiss_coverage_count(1, 3157);\n";cp.code()+="{ // block\n";etiss_uint32 MMIN=2147483648ULL;cp.code()+="etiss_coverage_count(1, 3109);\n";cp.code()+="etiss_coverage_count(1, 3110);\n";cp.code()+="if (*((RV32IMACFD*)cpu)->X["+std::to_string(rs1 % 32ULL)+"ULL] == "+std::to_string(MMIN)+"ULL && (etiss_int32)(*((RV32IMACFD*)cpu)->X["+std::to_string(rs2 % 32ULL)+"ULL]) == -1LL) { // conditional\n";cp.code()+="etiss_coverage_count(11, 3128, 3117, 3115, 3114, 3112, 3116, 3127, 3124, 3122, 3121, 3119);\n";cp.code()+="*((RV32IMACFD*)cpu)->X["+std::to_string(rd % 32ULL)+"ULL] = 0LL;\n";cp.code()+="etiss_coverage_count(5, 3135, 3133, 3132, 3130, 3134);\n";cp.code()+="} // conditional\n";cp.code()+="else { // conditional\n";cp.code()+="*((RV32IMACFD*)cpu)->X["+std::to_string(rd % 32ULL)+"ULL] = (etiss_int32)(*((RV32IMACFD*)cpu)->X["+std::to_string(rs1 % 32ULL)+"ULL]) % (etiss_int32)(*((RV32IMACFD*)cpu)->X["+std::to_string(rs2 % 32ULL)+"ULL]);\n";cp.code()+="etiss_coverage_count(13, 3156, 3140, 3139, 3137, 3155, 3147, 3145, 3144, 3142, 3154, 3152, 3151, 3149);\n";cp.code()+="} // conditional\n";cp.code()+="} // block\n";} cp.code()+="} // conditional\n";cp.code()+="else { // conditional\n";cp.code()+="*((RV32IMACFD*)cpu)->X["+std::to_string(rd % 32ULL)+"ULL] = *((RV32IMACFD*)cpu)->X["+std::to_string(rs1 % 32ULL)+"ULL];\n";cp.code()+="etiss_coverage_count(7, 3168, 3162, 3161, 3159, 3167, 3166, 3164);\n";cp.code()+="} // conditional\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<< "rem"<< " # "<< ba<<(" [rd="+std::to_string(rd)+" | rs1="+std::to_string(rs1)+" | rs2="+std::to_string(rs2)+"]");return ss.str();})
static InstructionDefinition div_rd_rs1_rs2(ISA32_RV32IMACFD, "div",(uint32_t) 0x2004033,(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("//DIV\n");cp.code()+="etiss_coverage_count(1, 76);\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, 3044);\n";cp.code()+="{ // block\n";cp.code()+="etiss_coverage_count(1, 2964);\n";if((rd % 32ULL) !=0LL) { cp.code()+="etiss_coverage_count(5, 2970, 2967, 2965, 2968, 2969);\n";{ cp.code()+="etiss_coverage_count(1, 3043);\n";cp.code()+="{ // block\n";cp.code()+="etiss_coverage_count(1, 2971);\n";cp.code()+="if (*((RV32IMACFD*)cpu)->X["+std::to_string(rs2 % 32ULL)+"ULL] != 0LL) { // conditional\n";cp.code()+="etiss_coverage_count(5, 2978, 2976, 2975, 2973, 2977);\n";{ cp.code()+="etiss_coverage_count(1, 3034);\n";cp.code()+="{ // block\n";etiss_uint32 MMIN=2147483648ULL;cp.code()+="etiss_coverage_count(1, 2986);\n";cp.code()+="etiss_coverage_count(1, 2987);\n";cp.code()+="if (*((RV32IMACFD*)cpu)->X["+std::to_string(rs1 % 32ULL)+"ULL] == "+std::to_string(MMIN)+"ULL && (etiss_int32)(*((RV32IMACFD*)cpu)->X["+std::to_string(rs2 % 32ULL)+"ULL]) == -1LL) { // conditional\n";cp.code()+="etiss_coverage_count(11, 3005, 2994, 2992, 2991, 2989, 2993, 3004, 3001, 2999, 2998, 2996);\n";cp.code()+="*((RV32IMACFD*)cpu)->X["+std::to_string(rd % 32ULL)+"ULL] = "+std::to_string(MMIN)+"ULL;\n";cp.code()+="etiss_coverage_count(5, 3012, 3010, 3009, 3007, 3011);\n";cp.code()+="} // conditional\n";cp.code()+="else { // conditional\n";cp.code()+="*((RV32IMACFD*)cpu)->X["+std::to_string(rd % 32ULL)+"ULL] = (etiss_int32)(*((RV32IMACFD*)cpu)->X["+std::to_string(rs1 % 32ULL)+"ULL]) / (etiss_int32)(*((RV32IMACFD*)cpu)->X["+std::to_string(rs2 % 32ULL)+"ULL]);\n";cp.code()+="etiss_coverage_count(13, 3033, 3017, 3016, 3014, 3032, 3024, 3022, 3021, 3019, 3031, 3029, 3028, 3026);\n";cp.code()+="} // conditional\n";cp.code()+="} // block\n";} cp.code()+="} // conditional\n";cp.code()+="else { // conditional\n";cp.code()+="*((RV32IMACFD*)cpu)->X["+std::to_string(rd % 32ULL)+"ULL] = -1LL;\n";cp.code()+="etiss_coverage_count(4, 3042, 3039, 3038, 3036);\n";cp.code()+="} // conditional\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<< "div"<< " # "<< ba<<(" [rd="+std::to_string(rd)+" | rs1="+std::to_string(rs1)+" | rs2="+std::to_string(rs2)+"]");return ss.str();})
static InstructionDefinition mulhsu_rd_rs1_rs2(ISA32_RV32IMACFD, "mulhsu",(uint32_t) 0x2002033,(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("//MULHSU\n");cp.code()+="etiss_coverage_count(1, 74);\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, 2925);\n";cp.code()+="{ // block\n";cp.code()+="etiss_coverage_count(1, 2887);\n";if((rd % 32ULL) !=0LL) { cp.code()+="etiss_coverage_count(5, 2893, 2890, 2888, 2891, 2892);\n";{ cp.code()+="etiss_coverage_count(1, 2924);\n";cp.code()+="{ // block\n";cp.code()+="etiss_int64 res = (etiss_int64)((etiss_int32)(*((RV32IMACFD*)cpu)->X["+std::to_string(rs1 % 32ULL)+"ULL])) * (etiss_uint64)(*((RV32IMACFD*)cpu)->X["+std::to_string(rs2 % 32ULL)+"ULL]);\n";cp.code()+="etiss_coverage_count(11, 2911, 2910, 2902, 2900, 2899, 2898, 2896, 2909, 2907, 2906, 2904);\n";cp.code()+="*((RV32IMACFD*)cpu)->X["+std::to_string(rd % 32ULL)+"ULL] = (etiss_uint32)((res >> 32ULL));\n";cp.code()+="etiss_coverage_count(8, 2923, 2916, 2915, 2913, 2922, 2919, 2917, 2920);\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<< "mulhsu"<< " # "<< ba<<(" [rd="+std::to_string(rd)+" | rs1="+std::to_string(rs1)+" | rs2="+std::to_string(rs2)+"]");return ss.str();})
static InstructionDefinition mulhu_rd_rs1_rs2(ISA32_RV32IMACFD, "mulhu",(uint32_t) 0x2003033,(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("//MULHU\n");cp.code()+="etiss_coverage_count(1, 75);\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, 2963);\n";cp.code()+="{ // block\n";cp.code()+="etiss_coverage_count(1, 2926);\n";if((rd % 32ULL) !=0LL) { cp.code()+="etiss_coverage_count(5, 2932, 2929, 2927, 2930, 2931);\n";{ cp.code()+="etiss_coverage_count(1, 2962);\n";cp.code()+="{ // block\n";cp.code()+="etiss_uint64 res = (etiss_uint64)(*((RV32IMACFD*)cpu)->X["+std::to_string(rs1 % 32ULL)+"ULL]) * (etiss_uint64)(*((RV32IMACFD*)cpu)->X["+std::to_string(rs2 % 32ULL)+"ULL]);\n";cp.code()+="etiss_coverage_count(10, 2949, 2948, 2940, 2938, 2937, 2935, 2947, 2945, 2944, 2942);\n";cp.code()+="*((RV32IMACFD*)cpu)->X["+std::to_string(rd % 32ULL)+"ULL] = (etiss_uint32)((res >> 32ULL));\n";cp.code()+="etiss_coverage_count(8, 2961, 2954, 2953, 2951, 2960, 2957, 2955, 2958);\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<< "mulhu"<< " # "<< ba<<(" [rd="+std::to_string(rd)+" | rs1="+std::to_string(rs1)+" | rs2="+std::to_string(rs2)+"]");return ss.str();})
static InstructionDefinition mul_rd_rs1_rs2(ISA32_RV32IMACFD, "mul",(uint32_t) 0x2000033,(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("//MUL\n");cp.code()+="etiss_coverage_count(1, 72);\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, 2846);\n";cp.code()+="{ // block\n";cp.code()+="etiss_coverage_count(1, 2810);\n";if((rd % 32ULL) !=0LL) { cp.code()+="etiss_coverage_count(5, 2816, 2813, 2811, 2814, 2815);\n";{ cp.code()+="etiss_coverage_count(1, 2845);\n";cp.code()+="{ // block\n";cp.code()+="etiss_int64 res = (etiss_int64)((etiss_int32)(*((RV32IMACFD*)cpu)->X["+std::to_string(rs1 % 32ULL)+"ULL])) * (etiss_int64)((etiss_int32)(*((RV32IMACFD*)cpu)->X["+std::to_string(rs2 % 32ULL)+"ULL]));\n";cp.code()+="etiss_coverage_count(12, 2835, 2834, 2825, 2823, 2822, 2821, 2819, 2833, 2831, 2830, 2829, 2827);\n";cp.code()+="*((RV32IMACFD*)cpu)->X["+std::to_string(rd % 32ULL)+"ULL] = (etiss_uint32)(res);\n";cp.code()+="etiss_coverage_count(6, 2844, 2840, 2839, 2837, 2843, 2841);\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<< "mul"<< " # "<< ba<<(" [rd="+std::to_string(rd)+" | rs1="+std::to_string(rs1)+" | rs2="+std::to_string(rs2)+"]");return ss.str();})
static InstructionDefinition remu_rd_rs1_rs2(ISA32_RV32IMACFD, "remu",(uint32_t) 0x2007033,(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("//REMU\n");cp.code()+="etiss_coverage_count(1, 79);\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, 3215);\n";cp.code()+="{ // block\n";cp.code()+="etiss_coverage_count(1, 3171);\n";if((rd % 32ULL) !=0LL) { cp.code()+="etiss_coverage_count(5, 3177, 3174, 3172, 3175, 3176);\n";{ cp.code()+="etiss_coverage_count(1, 3214);\n";cp.code()+="{ // block\n";cp.code()+="etiss_coverage_count(1, 3178);\n";cp.code()+="if (*((RV32IMACFD*)cpu)->X["+std::to_string(rs2 % 32ULL)+"ULL] != 0LL) { // conditional\n";cp.code()+="etiss_coverage_count(5, 3185, 3183, 3182, 3180, 3184);\n";cp.code()+="*((RV32IMACFD*)cpu)->X["+std::to_string(rd % 32ULL)+"ULL] = *((RV32IMACFD*)cpu)->X["+std::to_string(rs1 % 32ULL)+"ULL] % *((RV32IMACFD*)cpu)->X["+std::to_string(rs2 % 32ULL)+"ULL];\n";cp.code()+="etiss_coverage_count(11, 3202, 3190, 3189, 3187, 3201, 3195, 3194, 3192, 3200, 3199, 3197);\n";cp.code()+="} // conditional\n";cp.code()+="else { // conditional\n";cp.code()+="*((RV32IMACFD*)cpu)->X["+std::to_string(rd % 32ULL)+"ULL] = *((RV32IMACFD*)cpu)->X["+std::to_string(rs1 % 32ULL)+"ULL];\n";cp.code()+="etiss_coverage_count(7, 3213, 3207, 3206, 3204, 3212, 3211, 3209);\n";cp.code()+="} // conditional\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<< "remu"<< " # "<< ba<<(" [rd="+std::to_string(rd)+" | rs1="+std::to_string(rs1)+" | rs2="+std::to_string(rs2)+"]");return ss.str();})
uint32_t etiss_uint32
Definition types.h:55
uint8_t etiss_uint8
Definition types.h:49
Contains a small code snipped.
Definition CodePart.h:348
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