Skip to content

Commit 5ba1a8f

Browse files
authored
Merge pull request #244 from qwe661234/manipulate_register
Manipulate csr_cycle and PC by registers. Drop insn_len
2 parents 16df4da + 15ead60 commit 5ba1a8f

File tree

7 files changed

+359
-289
lines changed

7 files changed

+359
-289
lines changed

src/decode.c

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1255,7 +1255,7 @@ static inline bool op_caddi(rv_insn_t *ir, const uint32_t insn)
12551255
/* dispatch from rd/rs1 field */
12561256
switch (ir->rd) {
12571257
case 0: /* C.NOP */
1258-
ir->opcode = rv_insn_nop;
1258+
ir->opcode = rv_insn_cnop;
12591259
break;
12601260
default: /* C.ADDI */
12611261
/* Add 6-bit signed immediate to rds, serving as NOP for X0 register. */
@@ -1320,7 +1320,7 @@ static inline bool op_clui(rv_insn_t *ir, const uint32_t insn)
13201320
/* dispatch from rd/rs1 region */
13211321
switch (ir->rd) {
13221322
case 0: /* Code point: rd = x0 is HINTS */
1323-
ir->opcode = rv_insn_nop;
1323+
ir->opcode = rv_insn_cnop;
13241324
break;
13251325
case 2: { /* C.ADDI16SP */
13261326
ir->imm = c_decode_caddi16sp_nzimm(insn);
@@ -1381,7 +1381,7 @@ static inline bool op_cmisc_alu(rv_insn_t *ir, const uint32_t insn)
13811381
/* Code point: rd = x0 is HINTS
13821382
* Code point: shamt = 0 is HINTS
13831383
*/
1384-
ir->opcode = (!ir->rs1 || !ir->shamt) ? rv_insn_nop : rv_insn_csrli;
1384+
ir->opcode = (!ir->rs1 || !ir->shamt) ? rv_insn_cnop : rv_insn_csrli;
13851385
break;
13861386
case 1: /* C.SRAI */
13871387
ir->shamt = c_decode_cbtype_shamt(insn);
@@ -1448,7 +1448,7 @@ static inline bool op_cslli(rv_insn_t *ir, const uint32_t insn)
14481448
tmp |= (insn & FCI_IMM_6_2) >> 2;
14491449
ir->imm = tmp;
14501450
ir->rd = c_decode_rd(insn);
1451-
ir->opcode = ir->rd ? rv_insn_cslli : rv_insn_nop;
1451+
ir->opcode = ir->rd ? rv_insn_cslli : rv_insn_cnop;
14521452
return true;
14531453
}
14541454

@@ -1470,7 +1470,7 @@ static inline bool op_clwsp(rv_insn_t *ir, const uint32_t insn)
14701470
ir->rd = c_decode_rd(insn);
14711471

14721472
/* reserved for rd = x0 */
1473-
ir->opcode = ir->rd ? rv_insn_clwsp : rv_insn_nop;
1473+
ir->opcode = ir->rd ? rv_insn_clwsp : rv_insn_cnop;
14741474
return true;
14751475
}
14761476

@@ -1594,7 +1594,7 @@ static inline bool op_ccr(rv_insn_t *ir, const uint32_t insn)
15941594
break;
15951595
default: /* C.MV */
15961596
/* Code point: rd = x0 is HINTS */
1597-
ir->opcode = ir->rd ? rv_insn_cmv : rv_insn_nop;
1597+
ir->opcode = ir->rd ? rv_insn_cmv : rv_insn_cnop;
15981598
break;
15991599
}
16001600
break;
@@ -1603,12 +1603,12 @@ static inline bool op_ccr(rv_insn_t *ir, const uint32_t insn)
16031603
ir->opcode = rv_insn_ebreak;
16041604
else if (ir->rs1 && ir->rs2) { /* C.ADD */
16051605
/* Code point: rd = x0 is HINTS */
1606-
ir->opcode = ir->rd ? rv_insn_cadd : rv_insn_nop;
1606+
ir->opcode = ir->rd ? rv_insn_cadd : rv_insn_cnop;
16071607
} else if (ir->rs1 && !ir->rs2) /* C.JALR */
16081608
ir->opcode = rv_insn_cjalr;
16091609
else { /* rs2 != x0 AND rs1 = x0 */
16101610
/* Hint */
1611-
ir->opcode = rv_insn_nop;
1611+
ir->opcode = rv_insn_cnop;
16121612
}
16131613
break;
16141614
default:
@@ -1726,10 +1726,9 @@ bool rv_decode(rv_insn_t *ir, uint32_t insn)
17261726
/* If the last 2-bit is one of 0b00, 0b01, and 0b10, it is
17271727
* a 16-bit instruction.
17281728
*/
1729-
if ((insn & FC_OPCODE) != 3) {
1729+
if (is_compressed(insn)) {
17301730
insn &= 0x0000FFFF;
17311731
const uint16_t c_index = (insn & FC_FUNC3) >> 11 | (insn & FC_OPCODE);
1732-
ir->insn_len = INSN_16;
17331732

17341733
/* decode instruction (compressed instructions) */
17351734
const decode_t op = rvc_jump_table[c_index];
@@ -1740,7 +1739,6 @@ bool rv_decode(rv_insn_t *ir, uint32_t insn)
17401739

17411740
/* standard uncompressed instruction */
17421741
const uint32_t index = (insn & INSN_6_2) >> 2;
1743-
ir->insn_len = INSN_32;
17441742

17451743
/* decode instruction */
17461744
const decode_t op = rv_jump_table[index];

0 commit comments

Comments
 (0)