PASSING ALL TEST CASES
This commit is contained in:
@@ -313,12 +313,13 @@ Instruction *WordDecoder::decode(const std::vector<Byte> &v, Size &idx) {
|
|||||||
case InstType::I_TYPE:
|
case InstType::I_TYPE:
|
||||||
inst.setDestReg((code>>shift_rd) & reg_mask);
|
inst.setDestReg((code>>shift_rd) & reg_mask);
|
||||||
inst.setSrcReg((code>>shift_rs1) & reg_mask);
|
inst.setSrcReg((code>>shift_rs1) & reg_mask);
|
||||||
|
inst.setFunc7 ((code>>shift_func7) & func7_mask);
|
||||||
func3 = (code>>shift_func3) & func3_mask;
|
func3 = (code>>shift_func3) & func3_mask;
|
||||||
inst.setFunc3 (func3);
|
inst.setFunc3 (func3);
|
||||||
|
|
||||||
if ((func3 == 5) && (op != L_INST))
|
if ((func3 == 5) && (op != L_INST))
|
||||||
{
|
{
|
||||||
|
// std::cout << "func7: " << func7 << "\n";
|
||||||
inst.setSrcImm(signExt(((code>>shift_rs2)®_mask), 5, reg_mask));
|
inst.setSrcImm(signExt(((code>>shift_rs2)®_mask), 5, reg_mask));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|||||||
@@ -292,18 +292,33 @@ void Instruction::executeOn(Warp &c) {
|
|||||||
reg[rdest].trunc(wordSz);
|
reg[rdest].trunc(wordSz);
|
||||||
break;
|
break;
|
||||||
case 5:
|
case 5:
|
||||||
if (!func7)
|
if ((func7 == 0))
|
||||||
{
|
{
|
||||||
// SRAI
|
// SRLI
|
||||||
op1 = reg[rsrc[0]];
|
// std::cout << "WTF\n";
|
||||||
op2 = immsrc;
|
bool isNeg = ((0x80000000 & reg[rsrc[0]])) > 0;
|
||||||
reg[rdest] = op1 >> op2;
|
Word result = Word_u(reg[rsrc[0]]) >> Word_u(immsrc);
|
||||||
|
// if (isNeg)
|
||||||
|
// {
|
||||||
|
// Word mask = 0x80000000;
|
||||||
|
// for (int i = 32; i < Word_u(immsrc); i++)
|
||||||
|
// {
|
||||||
|
// result |= mask;
|
||||||
|
// mask = mask >> 1;
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
reg[rdest] = result;
|
||||||
|
|
||||||
reg[rdest].trunc(wordSz);
|
reg[rdest].trunc(wordSz);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// SRLI
|
// SRAI
|
||||||
reg[rdest] = Word_u(reg[rsrc[0]]) >> Word_u(immsrc);
|
// std::cout << "WOHOOOOO\n";
|
||||||
|
op1 = reg[rsrc[0]];
|
||||||
|
op2 = immsrc;
|
||||||
|
reg[rdest] = op1 >> op2;
|
||||||
reg[rdest].trunc(wordSz);
|
reg[rdest].trunc(wordSz);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -342,14 +342,14 @@ GRADE: PASSED
|
|||||||
|
|
||||||
./riscv_tests/rv32ui-p-srai.hex
|
./riscv_tests/rv32ui-p-srai.hex
|
||||||
INTERRUPT ECALL/EBREAK
|
INTERRUPT ECALL/EBREAK
|
||||||
Total steps: 41
|
Total steps: 244
|
||||||
Total insts: 41
|
Total insts: 244
|
||||||
=== Warp 0 ===
|
=== Warp 0 ===
|
||||||
Steps : 41
|
Steps : 244
|
||||||
Insts : 41
|
Insts : 244
|
||||||
Loads : 0
|
Loads : 0
|
||||||
Stores: 0
|
Stores: 0
|
||||||
GRADE: FAILED 3
|
GRADE: PASSED
|
||||||
|
|
||||||
./riscv_tests/rv32ui-p-srl.hex
|
./riscv_tests/rv32ui-p-srl.hex
|
||||||
INTERRUPT ECALL/EBREAK
|
INTERRUPT ECALL/EBREAK
|
||||||
|
|||||||
Reference in New Issue
Block a user