diff --git a/src_Core/RISCY_OOO/procs/lib/Decode.bsv b/src_Core/RISCY_OOO/procs/lib/Decode.bsv index 321ff67..f8e5f59 100755 --- a/src_Core/RISCY_OOO/procs/lib/Decode.bsv +++ b/src_Core/RISCY_OOO/procs/lib/Decode.bsv @@ -1128,13 +1128,11 @@ function DecodeResult decode(Instruction inst, Bool cap_mode); dInst.capFunc = CapModify (Unseal (Src1)); end f7_cap_CTestSubset: begin - illegalInst = True; - // TODO dInst.iType = Cap; regs.dst = Valid(tagged Gpr rd); - regs.src1 = Valid(tagged Gpr rs1); - regs.src2 = Valid(tagged Gpr rs2); - dInst.imm = Invalid; + regs.src1 = Valid(tagged Gpr rs2); + regs.src2 = rs1 == 0 ? Invalid : Valid(tagged Gpr rs1); + dInst.scr = rs1 == 0 ? Valid (SCR_DDC) : Invalid; dInst.capFunc = CapInspect (TestSubset); end f7_cap_CCopyType: begin diff --git a/src_Core/RISCY_OOO/procs/lib/Exec.bsv b/src_Core/RISCY_OOO/procs/lib/Exec.bsv index d40cae8..fb2e16b 100755 --- a/src_Core/RISCY_OOO/procs/lib/Exec.bsv +++ b/src_Core/RISCY_OOO/procs/lib/Exec.bsv @@ -230,8 +230,12 @@ endfunction (* noinline *) function Data capInspect(CapPipe a, CapPipe b, CapInspectFunc func); Data res = (case(func) matches - //tagged TestSubset : - // error("TestSubset not yet implemented"); + tagged TestSubset : + // TODO will be bad for timing. Would like to reuse bounds check + zeroExtend(pack( (isValidCap(b) == isValidCap(a)) + && ((getPerms(a) & getPerms(b)) == getPerms(a)) + && (getBase(a) >= getBase(b)) + && (getTop(a) >= getTop(b)))); tagged GetLen : truncate(getLength(a)); tagged GetBase :