@@ -256,9 +256,6 @@ static bool insn_is_misaligned(uint32_t pc)
256
256
257
257
static bool emulate (riscv_t * rv , rv_insn_t * ir )
258
258
{
259
- /* check instruction is compressed or not */
260
- rv -> compressed = (ir -> insn_len == INSN_16 );
261
-
262
259
switch (ir -> opcode ) {
263
260
/* RV32I Base Instruction Set */
264
261
case rv_insn_lui : /* LUI: Load Upper Immediate */
@@ -290,6 +287,7 @@ static bool emulate(riscv_t *rv, rv_insn_t *ir)
290
287
rv -> X [ir -> rd ] = pc + ir -> insn_len ;
291
288
/* check instruction misaligned */
292
289
if (insn_is_misaligned (rv -> PC )) {
290
+ rv -> compressed = false;
293
291
rv_except_insn_misaligned (rv , pc );
294
292
return false;
295
293
}
@@ -312,6 +310,7 @@ static bool emulate(riscv_t *rv, rv_insn_t *ir)
312
310
rv -> X [ir -> rd ] = pc + ir -> insn_len ;
313
311
/* check instruction misaligned */
314
312
if (insn_is_misaligned (rv -> PC )) {
313
+ rv -> compressed = false;
315
314
rv_except_insn_misaligned (rv , pc );
316
315
return false;
317
316
}
@@ -324,6 +323,7 @@ static bool emulate(riscv_t *rv, rv_insn_t *ir)
324
323
rv -> PC += ir -> imm ;
325
324
/* check instruction misaligned */
326
325
if (insn_is_misaligned (rv -> PC )) {
326
+ rv -> compressed = false;
327
327
rv_except_insn_misaligned (rv , pc );
328
328
return false;
329
329
}
@@ -338,6 +338,7 @@ static bool emulate(riscv_t *rv, rv_insn_t *ir)
338
338
rv -> PC += ir -> imm ;
339
339
/* check instruction misaligned */
340
340
if (insn_is_misaligned (rv -> PC )) {
341
+ rv -> compressed = false;
341
342
rv_except_insn_misaligned (rv , pc );
342
343
return false;
343
344
}
@@ -352,6 +353,7 @@ static bool emulate(riscv_t *rv, rv_insn_t *ir)
352
353
rv -> PC += ir -> imm ;
353
354
/* check instruction misaligned */
354
355
if (insn_is_misaligned (rv -> PC )) {
356
+ rv -> compressed = false;
355
357
rv_except_insn_misaligned (rv , pc );
356
358
return false;
357
359
}
@@ -366,6 +368,7 @@ static bool emulate(riscv_t *rv, rv_insn_t *ir)
366
368
rv -> PC += ir -> imm ;
367
369
/* check instruction misaligned */
368
370
if (insn_is_misaligned (rv -> PC )) {
371
+ rv -> compressed = false;
369
372
rv_except_insn_misaligned (rv , pc );
370
373
return false;
371
374
}
@@ -380,6 +383,7 @@ static bool emulate(riscv_t *rv, rv_insn_t *ir)
380
383
rv -> PC += ir -> imm ;
381
384
/* check instruction misaligned */
382
385
if (insn_is_misaligned (rv -> PC )) {
386
+ rv -> compressed = false;
383
387
rv_except_insn_misaligned (rv , pc );
384
388
return false;
385
389
}
@@ -394,6 +398,7 @@ static bool emulate(riscv_t *rv, rv_insn_t *ir)
394
398
rv -> PC += ir -> imm ;
395
399
/* check instruction misaligned */
396
400
if (insn_is_misaligned (rv -> PC )) {
401
+ rv -> compressed = false;
397
402
rv_except_insn_misaligned (rv , pc );
398
403
return false;
399
404
}
@@ -409,6 +414,7 @@ static bool emulate(riscv_t *rv, rv_insn_t *ir)
409
414
case rv_insn_lh : { /* LH: Load Halfword */
410
415
const uint32_t addr = rv -> X [ir -> rs1 ] + ir -> imm ;
411
416
if (addr & 1 ) {
417
+ rv -> compressed = false;
412
418
rv_except_load_misaligned (rv , addr );
413
419
return false;
414
420
}
@@ -418,6 +424,7 @@ static bool emulate(riscv_t *rv, rv_insn_t *ir)
418
424
case rv_insn_lw : { /* LW: Load Word */
419
425
const uint32_t addr = rv -> X [ir -> rs1 ] + ir -> imm ;
420
426
if (addr & 3 ) {
427
+ rv -> compressed = false;
421
428
rv_except_load_misaligned (rv , addr );
422
429
return false;
423
430
}
@@ -430,6 +437,7 @@ static bool emulate(riscv_t *rv, rv_insn_t *ir)
430
437
case rv_insn_lhu : { /* LHU: Load Halfword Unsigned */
431
438
const uint32_t addr = rv -> X [ir -> rs1 ] + ir -> imm ;
432
439
if (addr & 1 ) {
440
+ rv -> compressed = false;
433
441
rv_except_load_misaligned (rv , addr );
434
442
return false;
435
443
}
@@ -442,6 +450,7 @@ static bool emulate(riscv_t *rv, rv_insn_t *ir)
442
450
case rv_insn_sh : { /* SH: Store Halfword */
443
451
const uint32_t addr = rv -> X [ir -> rs1 ] + ir -> imm ;
444
452
if (addr & 1 ) {
453
+ rv -> compressed = false;
445
454
rv_except_store_misaligned (rv , addr );
446
455
return false;
447
456
}
@@ -451,6 +460,7 @@ static bool emulate(riscv_t *rv, rv_insn_t *ir)
451
460
case rv_insn_sw : { /* SW: Store Word */
452
461
const uint32_t addr = rv -> X [ir -> rs1 ] + ir -> imm ;
453
462
if (addr & 3 ) {
463
+ rv -> compressed = false;
454
464
rv_except_store_misaligned (rv , addr );
455
465
return false;
456
466
}
@@ -541,9 +551,11 @@ static bool emulate(riscv_t *rv, rv_insn_t *ir)
541
551
rv -> X [ir -> rd ] = rv -> X [ir -> rs1 ] & rv -> X [ir -> rs2 ];
542
552
break ;
543
553
case rv_insn_ecall : /* ECALL: Environment Call */
554
+ rv -> compressed = false;
544
555
rv -> io .on_ecall (rv );
545
556
return true;
546
557
case rv_insn_ebreak : /* EBREAK: Environment Break */
558
+ rv -> compressed = false;
547
559
rv -> io .on_ebreak (rv );
548
560
return true;
549
561
case rv_insn_wfi : /* WFI: Wait for Interrupt */
@@ -931,6 +943,7 @@ static bool emulate(riscv_t *rv, rv_insn_t *ir)
931
943
*/
932
944
const uint32_t addr = rv -> X [ir -> rs1 ] + (uint32_t ) ir -> imm ;
933
945
if (addr & 3 ) {
946
+ rv -> compressed = true;
934
947
rv_except_load_misaligned (rv , addr );
935
948
return false;
936
949
}
@@ -945,6 +958,7 @@ static bool emulate(riscv_t *rv, rv_insn_t *ir)
945
958
*/
946
959
const uint32_t addr = rv -> X [ir -> rs1 ] + (uint32_t ) ir -> imm ;
947
960
if (addr & 3 ) {
961
+ rv -> compressed = true;
948
962
rv_except_store_misaligned (rv , addr );
949
963
return false;
950
964
}
@@ -967,6 +981,7 @@ static bool emulate(riscv_t *rv, rv_insn_t *ir)
967
981
rv -> X [1 ] = rv -> PC + ir -> insn_len ;
968
982
rv -> PC += ir -> imm ;
969
983
if (rv -> PC & 0x1 ) {
984
+ rv -> compressed = true;
970
985
rv_except_insn_misaligned (rv , rv -> PC );
971
986
return false;
972
987
}
@@ -1044,6 +1059,7 @@ static bool emulate(riscv_t *rv, rv_insn_t *ir)
1044
1059
*/
1045
1060
rv -> PC += ir -> imm ;
1046
1061
if (rv -> PC & 0x1 ) {
1062
+ rv -> compressed = true;
1047
1063
rv_except_insn_misaligned (rv , rv -> PC );
1048
1064
return false;
1049
1065
}
@@ -1074,6 +1090,7 @@ static bool emulate(riscv_t *rv, rv_insn_t *ir)
1074
1090
case rv_insn_clwsp : { /* C.LWSP */
1075
1091
const uint32_t addr = rv -> X [rv_reg_sp ] + ir -> imm ;
1076
1092
if (addr & 3 ) {
1093
+ rv -> compressed = true;
1077
1094
rv_except_load_misaligned (rv , addr );
1078
1095
return false;
1079
1096
}
@@ -1088,6 +1105,7 @@ static bool emulate(riscv_t *rv, rv_insn_t *ir)
1088
1105
rv -> X [ir -> rd ] = rv -> X [ir -> rs2 ];
1089
1106
break ;
1090
1107
case rv_insn_cebreak : /* C.EBREAK */
1108
+ rv -> compressed = true;
1091
1109
rv -> io .on_ebreak (rv );
1092
1110
/* can branch */
1093
1111
return true;
@@ -1097,6 +1115,7 @@ static bool emulate(riscv_t *rv, rv_insn_t *ir)
1097
1115
rv -> X [rv_reg_ra ] = rv -> PC + ir -> insn_len ;
1098
1116
rv -> PC = jump_to ;
1099
1117
if (rv -> PC & 0x1 ) {
1118
+ rv -> compressed = true;
1100
1119
rv_except_insn_misaligned (rv , rv -> PC );
1101
1120
return false;
1102
1121
}
@@ -1116,6 +1135,7 @@ static bool emulate(riscv_t *rv, rv_insn_t *ir)
1116
1135
case rv_insn_cswsp : { /* C.SWSP */
1117
1136
const uint32_t addr = rv -> X [2 ] + ir -> imm ;
1118
1137
if (addr & 3 ) {
1138
+ rv -> compressed = true;
1119
1139
rv_except_store_misaligned (rv , addr );
1120
1140
return false;
1121
1141
}
@@ -1252,6 +1272,7 @@ static void block_translate(riscv_t *rv, block_t *block)
1252
1272
1253
1273
/* decode the instruction */
1254
1274
if (!rv_decode (ir , insn )) {
1275
+ rv -> compressed = (ir -> insn_len == INSN_16 );
1255
1276
rv_except_illegal_insn (rv , insn );
1256
1277
break ;
1257
1278
}
0 commit comments