5
5
6
6
#include "riscv.h"
7
7
#include "riscv_private.h"
8
- #include "statistics.h"
9
8
10
9
static void rv_except_inst_misaligned (struct riscv_t * rv , uint32_t old_pc )
11
10
{
@@ -132,35 +131,30 @@ static bool op_load(struct riscv_t *rv, uint32_t inst UNUSED)
132
131
switch (funct3 ) {
133
132
case 0 : // LB
134
133
rv -> X [rd ] = sign_extend_b (rv -> io .mem_read_b (rv , addr ));
135
- instruction_count (LB );
136
134
break ;
137
135
case 1 : // LH
138
136
if (addr & 1 ) {
139
137
rv_except_load_misaligned (rv , addr );
140
138
return false;
141
139
}
142
140
rv -> X [rd ] = sign_extend_h (rv -> io .mem_read_s (rv , addr ));
143
- instruction_count (LH );
144
141
break ;
145
142
case 2 : // LW
146
143
if (addr & 3 ) {
147
144
rv_except_load_misaligned (rv , addr );
148
145
return false;
149
146
}
150
147
rv -> X [rd ] = rv -> io .mem_read_w (rv , addr );
151
- instruction_count (LW );
152
148
break ;
153
149
case 4 : // LBU
154
150
rv -> X [rd ] = rv -> io .mem_read_b (rv , addr );
155
- instruction_count (LBU );
156
151
break ;
157
152
case 5 : // LHU
158
153
if (addr & 1 ) {
159
154
rv_except_load_misaligned (rv , addr );
160
155
return false;
161
156
}
162
157
rv -> X [rd ] = rv -> io .mem_read_s (rv , addr );
163
- instruction_count (LHU );
164
158
break ;
165
159
default :
166
160
rv_except_illegal_inst (rv , inst );
@@ -197,42 +191,33 @@ static bool op_op_imm(struct riscv_t *rv, uint32_t inst)
197
191
switch (funct3 ) {
198
192
case 0 : // ADDI
199
193
rv -> X [rd ] = (int32_t )(rv -> X [rs1 ]) + imm ;
200
- instruction_count (ADDI );
201
194
break ;
202
195
case 1 : // SLLI
203
196
rv -> X [rd ] = rv -> X [rs1 ] << (imm & 0x1f );
204
- instruction_count (SLLI );
205
197
break ;
206
198
case 2 : // SLTI
207
199
rv -> X [rd ] = ((int32_t )(rv -> X [rs1 ]) < imm ) ? 1 : 0 ;
208
- instruction_count (SLTI );
209
200
break ;
210
201
case 3 : // SLTIU
211
202
rv -> X [rd ] = (rv -> X [rs1 ] < (uint32_t ) imm ) ? 1 : 0 ;
212
- instruction_count (SLTIU );
213
203
break ;
214
204
case 4 : // XORI
215
205
rv -> X [rd ] = rv -> X [rs1 ] ^ imm ;
216
- instruction_count (XORI );
217
206
break ;
218
207
case 5 :
219
208
if (imm & ~0x1f ) {
220
209
// SRAI
221
210
rv -> X [rd ] = ((int32_t ) rv -> X [rs1 ]) >> (imm & 0x1f );
222
- instruction_count (SRAI );
223
211
} else {
224
212
// SRLI
225
213
rv -> X [rd ] = rv -> X [rs1 ] >> (imm & 0x1f );
226
- instruction_count (SRLI );
227
214
}
228
215
break ;
229
216
case 6 : // ORI
230
217
rv -> X [rd ] = rv -> X [rs1 ] | imm ;
231
- instruction_count (ORI );
232
218
break ;
233
219
case 7 : // ANDI
234
220
rv -> X [rd ] = rv -> X [rs1 ] & imm ;
235
- instruction_count (ANDI );
236
221
break ;
237
222
default :
238
223
rv_except_illegal_inst (rv , inst );
@@ -263,7 +248,6 @@ static bool op_auipc(struct riscv_t *rv, uint32_t inst)
263
248
if (rd == rv_reg_zero )
264
249
rv -> X [rv_reg_zero ] = 0 ;
265
250
266
- instruction_count (AUIPC );
267
251
return true;
268
252
}
269
253
@@ -283,23 +267,20 @@ static bool op_store(struct riscv_t *rv, uint32_t inst)
283
267
switch (funct3 ) {
284
268
case 0 : // SB
285
269
rv -> io .mem_write_b (rv , addr , data );
286
- instruction_count (SB );
287
270
break ;
288
271
case 1 : // SH
289
272
if (addr & 1 ) {
290
273
rv_except_store_misaligned (rv , addr );
291
274
return false;
292
275
}
293
276
rv -> io .mem_write_s (rv , addr , data );
294
- instruction_count (SH );
295
277
break ;
296
278
case 2 : // SW
297
279
if (addr & 3 ) {
298
280
rv_except_store_misaligned (rv , addr );
299
281
return false;
300
282
}
301
283
rv -> io .mem_write_w (rv , addr , data );
302
- instruction_count (SW );
303
284
break ;
304
285
default :
305
286
rv_except_illegal_inst (rv , inst );
@@ -327,35 +308,27 @@ static bool op_op(struct riscv_t *rv, uint32_t inst)
327
308
switch (funct3 ) {
328
309
case 0b000 : // ADD
329
310
rv -> X [rd ] = (int32_t )(rv -> X [rs1 ]) + (int32_t )(rv -> X [rs2 ]);
330
- instruction_count (ADD );
331
311
break ;
332
312
case 0b001 : // SLL
333
313
rv -> X [rd ] = rv -> X [rs1 ] << (rv -> X [rs2 ] & 0x1f );
334
- instruction_count (SLL );
335
314
break ;
336
315
case 0b010 : // SLT
337
316
rv -> X [rd ] = ((int32_t )(rv -> X [rs1 ]) < (int32_t )(rv -> X [rs2 ])) ? 1 : 0 ;
338
- instruction_count (SLT );
339
317
break ;
340
318
case 0b011 : // SLTU
341
319
rv -> X [rd ] = (rv -> X [rs1 ] < rv -> X [rs2 ]) ? 1 : 0 ;
342
- instruction_count (SLTU );
343
320
break ;
344
321
case 0b100 : // XOR
345
322
rv -> X [rd ] = rv -> X [rs1 ] ^ rv -> X [rs2 ];
346
- instruction_count (XOR );
347
323
break ;
348
324
case 0b101 : // SRL
349
325
rv -> X [rd ] = rv -> X [rs1 ] >> (rv -> X [rs2 ] & 0x1f );
350
- instruction_count (SRL );
351
326
break ;
352
327
case 0b110 : // OR
353
328
rv -> X [rd ] = rv -> X [rs1 ] | rv -> X [rs2 ];
354
- instruction_count (OR );
355
329
break ;
356
330
case 0b111 : // AND
357
331
rv -> X [rd ] = rv -> X [rs1 ] & rv -> X [rs2 ];
358
- instruction_count (AND );
359
332
break ;
360
333
default :
361
334
rv_except_illegal_inst (rv , inst );
@@ -368,23 +341,19 @@ static bool op_op(struct riscv_t *rv, uint32_t inst)
368
341
switch (funct3 ) {
369
342
case 0b000 : // MUL
370
343
rv -> X [rd ] = (int32_t ) rv -> X [rs1 ] * (int32_t ) rv -> X [rs2 ];
371
- instruction_count (MUL );
372
344
break ;
373
345
case 0b001 : { // MULH
374
346
const int64_t a = (int32_t ) rv -> X [rs1 ];
375
347
const int64_t b = (int32_t ) rv -> X [rs2 ];
376
348
rv -> X [rd ] = ((uint64_t )(a * b )) >> 32 ;
377
- instruction_count (MULH );
378
349
} break ;
379
350
case 0b010 : { // MULHSU
380
351
const int64_t a = (int32_t ) rv -> X [rs1 ];
381
352
const uint64_t b = rv -> X [rs2 ];
382
353
rv -> X [rd ] = ((uint64_t )(a * b )) >> 32 ;
383
- instruction_count (MULHSU );
384
354
} break ;
385
355
case 0b011 : // MULHU
386
356
rv -> X [rd ] = ((uint64_t ) rv -> X [rs1 ] * (uint64_t ) rv -> X [rs2 ]) >> 32 ;
387
- instruction_count (MULHU );
388
357
break ;
389
358
case 0b100 : { // DIV
390
359
const int32_t dividend = (int32_t ) rv -> X [rs1 ];
@@ -396,7 +365,6 @@ static bool op_op(struct riscv_t *rv, uint32_t inst)
396
365
} else {
397
366
rv -> X [rd ] = dividend / divisor ;
398
367
}
399
- instruction_count (DIV );
400
368
} break ;
401
369
case 0b101 : { // DIVU
402
370
const uint32_t dividend = rv -> X [rs1 ];
@@ -406,7 +374,6 @@ static bool op_op(struct riscv_t *rv, uint32_t inst)
406
374
} else {
407
375
rv -> X [rd ] = dividend / divisor ;
408
376
}
409
- instruction_count (DIVU );
410
377
} break ;
411
378
case 0b110 : { // REM
412
379
const int32_t dividend = rv -> X [rs1 ];
@@ -418,7 +385,6 @@ static bool op_op(struct riscv_t *rv, uint32_t inst)
418
385
} else {
419
386
rv -> X [rd ] = dividend % divisor ;
420
387
}
421
- instruction_count (REM );
422
388
} break ;
423
389
case 0b111 : { // REMU
424
390
const uint32_t dividend = rv -> X [rs1 ];
@@ -428,7 +394,6 @@ static bool op_op(struct riscv_t *rv, uint32_t inst)
428
394
} else {
429
395
rv -> X [rd ] = dividend % divisor ;
430
396
}
431
- instruction_count (REMU );
432
397
} break ;
433
398
default :
434
399
rv_except_illegal_inst (rv , inst );
@@ -440,11 +405,9 @@ static bool op_op(struct riscv_t *rv, uint32_t inst)
440
405
switch (funct3 ) {
441
406
case 0b000 : // SUB
442
407
rv -> X [rd ] = (int32_t )(rv -> X [rs1 ]) - (int32_t )(rv -> X [rs2 ]);
443
- instruction_count (SUB );
444
408
break ;
445
409
case 0b101 : // SRA
446
410
rv -> X [rd ] = ((int32_t ) rv -> X [rs1 ]) >> (rv -> X [rs2 ] & 0x1f );
447
- instruction_count (SRA );
448
411
break ;
449
412
default :
450
413
rv_except_illegal_inst (rv , inst );
@@ -476,7 +439,6 @@ static bool op_lui(struct riscv_t *rv, uint32_t inst)
476
439
// enforce zero register
477
440
if (rd == rv_reg_zero )
478
441
rv -> X [rv_reg_zero ] = 0 ;
479
- instruction_count (LUI );
480
442
return true;
481
443
}
482
444
@@ -488,7 +450,6 @@ static bool op_branch(struct riscv_t *rv, uint32_t inst)
488
450
const int32_t imm = dec_btype_imm (inst );
489
451
const uint32_t rs1 = dec_rs1 (inst );
490
452
const uint32_t rs2 = dec_rs2 (inst );
491
- branch_count ();
492
453
493
454
494
455
// track if branch is taken or not
@@ -498,28 +459,22 @@ static bool op_branch(struct riscv_t *rv, uint32_t inst)
498
459
switch (func3 ) {
499
460
case 0 : // BEQ
500
461
taken = (rv -> X [rs1 ] == rv -> X [rs2 ]);
501
- instruction_count (BEQ );
502
462
503
463
break ;
504
464
case 1 : // BNE
505
465
taken = (rv -> X [rs1 ] != rv -> X [rs2 ]);
506
- instruction_count (BNE );
507
466
break ;
508
467
case 4 : // BLT
509
468
taken = ((int32_t ) rv -> X [rs1 ] < (int32_t ) rv -> X [rs2 ]);
510
- instruction_count (BLT );
511
469
break ;
512
470
case 5 : // BGE
513
471
taken = ((int32_t ) rv -> X [rs1 ] >= (int32_t ) rv -> X [rs2 ]);
514
- instruction_count (BGE );
515
472
break ;
516
473
case 6 : // BLTU
517
474
taken = (rv -> X [rs1 ] < rv -> X [rs2 ]);
518
- instruction_count (BLTU );
519
475
break ;
520
476
case 7 : // BGEU
521
477
taken = (rv -> X [rs1 ] >= rv -> X [rs2 ]);
522
- instruction_count (BGEU );
523
478
break ;
524
479
default :
525
480
rv_except_illegal_inst (rv , inst );
@@ -528,7 +483,6 @@ static bool op_branch(struct riscv_t *rv, uint32_t inst)
528
483
// perform branch action
529
484
if (taken ) {
530
485
rv -> PC += imm ;
531
- jump_count (imm );
532
486
if (rv -> PC & 0x3 )
533
487
rv_except_inst_misaligned (rv , pc );
534
488
} else {
@@ -550,10 +504,8 @@ static bool op_jalr(struct riscv_t *rv, uint32_t inst)
550
504
551
505
// compute return address
552
506
const uint32_t ra = rv -> PC + rv -> inst_len ;
553
- branch_count ();
554
507
555
508
// jump
556
- jalr_jump_count (rv -> PC , (rv -> X [rs1 ] + imm ) & ~1u );
557
509
rv -> PC = (rv -> X [rs1 ] + imm ) & ~1u ;
558
510
559
511
// link
@@ -571,7 +523,6 @@ static bool op_jalr(struct riscv_t *rv, uint32_t inst)
571
523
}
572
524
// can branch
573
525
574
- instruction_count (JALR );
575
526
return false;
576
527
}
577
528
@@ -585,7 +536,6 @@ static bool op_jal(struct riscv_t *rv, uint32_t inst)
585
536
// compute return address
586
537
const uint32_t ra = rv -> PC + rv -> inst_len ;
587
538
rv -> PC += rel ;
588
- jump_count (rel );
589
539
590
540
// link
591
541
if (rd != rv_reg_zero )
@@ -601,7 +551,6 @@ static bool op_jal(struct riscv_t *rv, uint32_t inst)
601
551
return false;
602
552
}
603
553
// can branch
604
- instruction_count (JAL );
605
554
return false;
606
555
}
607
556
@@ -1354,7 +1303,6 @@ void rv_step(struct riscv_t *rv, int32_t cycles)
1354
1303
assert (rv );
1355
1304
const uint64_t cycles_target = rv -> csr_cycle + cycles ;
1356
1305
uint32_t inst = 0 ;
1357
- uint32_t buffer = 0 ;
1358
1306
// clang-format off
1359
1307
#define OP_UNIMP op_unimp
1360
1308
#ifdef ENABLE_COMPUTED_GOTO
@@ -1398,14 +1346,12 @@ void rv_step(struct riscv_t *rv, int32_t cycles)
1398
1346
if ((inst & 3 ) == 3 ) { \
1399
1347
uint32_t index = (inst & INST_6_2 ) >> 2 ; \
1400
1348
rv -> inst_len = INST_32 ; \
1401
- cycle_count (); \
1402
1349
goto * jump_table [index ]; \
1403
1350
} else { \
1404
1351
/* Compressed Extension Instruction */ \
1405
1352
inst &= 0x0000FFFF ; \
1406
1353
int16_t c_index = (inst & FC_FUNC3 ) >> 11 | (inst & FC_OPCODE ); \
1407
1354
rv -> inst_len = INST_16 ; \
1408
- cycle_count (); \
1409
1355
goto * jump_tablec [c_index ]; \
1410
1356
} \
1411
1357
}
0 commit comments