Skip to content

Commit 587e3ad

Browse files
Merge pull request #157 from physical-computation/Issue#155,-using-bit-masking
Issue#155, using bit masking
2 parents 4c91f4f + 430762b commit 587e3ad

File tree

2 files changed

+16
-8
lines changed

2 files changed

+16
-8
lines changed

sim/bit.h

+3
Original file line numberDiff line numberDiff line change
@@ -134,15 +134,18 @@ enum
134134
maskExtractBit7 = 0x1 << 7,
135135
maskExtractBits7to11 = 0x1F << 7,
136136
maskExtractBits8to11 = 0xF << 8,
137+
maskExtractBits12to14 = 0x7 << 12,
137138
maskExtractBits12to19 = 0xFF << 12,
138139
maskExtractBits12to31 = 0xFFFFF << 12,
139140
maskExtractBits15to19 = 0x1F << 15,
140141
maskExtractBit20 = 0x1 << 20,
141142
maskExtractBits20to24 = 0x1F << 20,
142143
maskExtractBits20to31 = 0xFFF << 20,
143144
maskExtractBits21to30 = 0x7FE << 20,
145+
maskExtractBits25to26 = 0x3 << 25,
144146
maskExtractBits25to30 = 0x3F << 25,
145147
maskExtractBits25to31 = 0x7F << 25,
148+
maskExtractBits27to31 = 0x1F << 27,
146149
maskExtractBit31 = 0x1 << 31,
147150

148151
};

sim/pipeline-riscv.c

+13-8
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ Assumed pipeline implementation:
9595
1 stall:
9696
LOAD instrs that write to a reg-required-by-next-instr after reading from mem:
9797
...EX of next instr needs reg data from MA of LOAD instrs.
98-
BRANCH instrs test for (in)equality in ID, dependent on previous instr:
98+
BRANCH instrs test for (in)equality in ID which is dependent on previous instr:
9999
...ID of BRANCH instr needs reg data from EX of previous instr.
100100
2 stalls:
101101
LOAD instr followed by dependent BRANCH instr:
@@ -634,17 +634,23 @@ riscvstep(Engine *E, State *S, int drain_pipeline)
634634
(tmp&maskExtractBit20) >> 20,
635635
(tmp&maskExtractBits12to19) >> 12,
636636
(tmp&maskExtractBit31) >> 31);
637-
S->dyncnt++; */
637+
S->dyncnt++;
638+
638639
S->riscv->instruction_distribution[S->riscv->P.EX.op]++;
640+
*/
641+
639642
break;
640643
}
641644

642645
case INSTR_R4:
643646
{
644-
instr_r4 *tmp;
645-
646-
tmp = (instr_r4 *)&S->riscv->P.EX.instr;
647-
(*(S->riscv->P.EX.fptr))(E, S, tmp->rs1, tmp->rs2, tmp->rs3, tmp->rm, tmp->rd);
647+
uint32_t tmp = S->riscv->P.EX.instr;
648+
(*(S->riscv->P.EX.fptr))(E, S,
649+
(tmp&maskExtractBits15to19) >> 15,
650+
(tmp&maskExtractBits20to24) >> 20,
651+
(tmp&maskExtractBits27to31) >> 27,
652+
(tmp&maskExtractBits12to14) >> 12,
653+
(tmp&maskExtractBits7to11) >> 7);
648654
break;
649655
}
650656

@@ -750,7 +756,6 @@ riscvstep(Engine *E, State *S, int drain_pipeline)
750756
(tmp&maskExtractBit20) >> 20,
751757
(tmp&maskExtractBits12to19) >> 12,
752758
(tmp&maskExtractBit31) >> 31);
753-
S->riscv->instruction_distribution[S->riscv->P.ID.op]++;
754759
}
755760
else
756761
{
@@ -762,8 +767,8 @@ riscvstep(Engine *E, State *S, int drain_pipeline)
762767
(tmp&maskExtractBits25to30) >> 25,
763768
(tmp&maskExtractBit7) >> 7,
764769
(tmp&maskExtractBit31) >> 31);
765-
S->riscv->instruction_distribution[S->riscv->P.ID.op]++;
766770
}
771+
S->riscv->instruction_distribution[S->riscv->P.ID.op]++;
767772
S->dyncnt++;
768773
riscvIFflush(S);
769774
}

0 commit comments

Comments
 (0)