diff options
| author | Alasdair Armstrong | 2017-07-13 16:42:57 +0100 |
|---|---|---|
| committer | Alasdair Armstrong | 2017-07-13 16:42:57 +0100 |
| commit | 249079742b63d43cdc4c445de3229f594c6d59fc (patch) | |
| tree | 97bdad0820cea632912b5c22e34bc91741cf1cd9 /mips_new_tc | |
| parent | c19b8e2b934149b6670f43d875d773115b08410e (diff) | |
Modified MIPS model so it typechecks with the new typechecker
Diffstat (limited to 'mips_new_tc')
| -rw-r--r-- | mips_new_tc/mips_epilogue.sail | 2 | ||||
| -rw-r--r-- | mips_new_tc/mips_insts.sail | 362 | ||||
| -rw-r--r-- | mips_new_tc/mips_wrappers.sail | 12 |
3 files changed, 196 insertions, 180 deletions
diff --git a/mips_new_tc/mips_epilogue.sail b/mips_new_tc/mips_epilogue.sail index 50993949..09ce7688 100644 --- a/mips_new_tc/mips_epilogue.sail +++ b/mips_new_tc/mips_epilogue.sail @@ -38,4 +38,4 @@ end decode end execute end ast -function option<ast> supported_instructions (instr) = Some(instr) +function option<ast> supported_instructions (ast) instr = Some(instr) diff --git a/mips_new_tc/mips_insts.sail b/mips_new_tc/mips_insts.sail index 19176c72..88c78e80 100644 --- a/mips_new_tc/mips_insts.sail +++ b/mips_new_tc/mips_insts.sail @@ -32,12 +32,12 @@ (* SUCH DAMAGE. *) (*========================================================================*) -(* misp_insts.sail: mips instruction decode and execute clauses and AST node +(* misp_insts.sail: mips instruction decode and execute clauses and AST node declarations *) scattered typedef ast = const union -val ast -> unit effect pure execute +val ast -> unit effect {barr, eamem, escape, rmem, rreg, undef, wmv, wreg} execute scattered function unit execute val bit[32] -> option<ast> effect pure decode @@ -47,13 +47,13 @@ scattered function option<ast> decode (* [D]ADD[I][U] various forms of ADD *) (**************************************************************************************) -(* DADDIU Doubleword Add Immediate Unsigned -- - the simplest possible instruction, no undefined behaviour or exceptions +(* DADDIU Doubleword Add Immediate Unsigned -- + the simplest possible instruction, no undefined behaviour or exceptions reg, reg, immediate *) union ast member regregimm16 DADDIU -function clause decode (0b011001 : (regno) rs : (regno) rt : (imm16) imm) = +function clause decode (0b011001 : (regno) rs : (regno) rt : (imm16) imm) = Some(DADDIU(rs, rt, imm)) function clause execute (DADDIU (rs, rt, imm)) = @@ -66,7 +66,7 @@ function clause execute (DADDIU (rs, rt, imm)) = union ast member regregreg DADDU -function clause decode (0b000000 : (regno) rs : (regno) rt : (regno) rd : 0b00000 : 0b101101) = +function clause decode (0b000000 : (regno) rs : (regno) rt : (regno) rd : 0b00000 : 0b101101) = Some(DADDU(rs, rt, rd)) function clause execute (DADDU (rs, rt, rd)) = @@ -79,7 +79,7 @@ function clause execute (DADDU (rs, rt, rd)) = union ast member regregimm16 DADDI -function clause decode (0b011000 : (regno) rs : (regno) rt : (imm16) imm) = +function clause decode (0b011000 : (regno) rs : (regno) rt : (imm16) imm) = Some(DADDI(rs, rt, imm)) function clause execute (DADDI (rs, rt, imm)) = @@ -98,7 +98,7 @@ function clause execute (DADDI (rs, rt, imm)) = union ast member regregreg DADD -function clause decode (0b000000 : (regno) rs : (regno) rt : (regno) rd : 0b00000 : 0b101100) = +function clause decode (0b000000 : (regno) rs : (regno) rt : (regno) rd : 0b00000 : 0b101100) = Some(DADD(rs, rt, rd)) function clause execute (DADD (rs, rt, rd)) = @@ -140,7 +140,7 @@ union ast member regregimm16 ADDI function clause decode (0b001000 : (regno) rs : (regno) rt : (imm16) imm) = Some(ADDI(rs, rt, imm)) -function clause execute (ADDI(rs, rt, imm)) = +function clause execute (ADDI(rs, rt, imm)) = { (bit[64]) opA := rGPR(rs); if NotWordVal(opA) then @@ -160,7 +160,7 @@ union ast member regregreg ADDU function clause decode (0b000000 : (regno) rs : (regno) rt : (regno) rd : 0b00000 : 0b100001) = Some(ADDU(rs, rt, rd)) -function clause execute (ADDU(rs, rt, rd)) = +function clause execute (ADDU(rs, rt, rd)) = { (bit[64]) opA := rGPR(rs); (bit[64]) opB := rGPR(rt); @@ -178,7 +178,7 @@ union ast member regregimm16 ADDIU function clause decode (0b001001 : (regno) rs : (regno) rt : (imm16) imm) = Some(ADDIU(rs, rt, imm)) -function clause execute (ADDIU(rs, rt, imm)) = +function clause execute (ADDIU(rs, rt, imm)) = { (bit[64]) opA := rGPR(rs); if NotWordVal(opA) then @@ -195,7 +195,7 @@ function clause execute (ADDIU(rs, rt, imm)) = union ast member regregreg DSUBU -function clause decode (0b000000 : (regno) rs : (regno) rt : (regno) rd : 0b00000 : 0b101111) = +function clause decode (0b000000 : (regno) rs : (regno) rt : (regno) rd : 0b00000 : 0b101111) = Some(DSUBU(rs, rt, rd)) function clause execute (DSUBU (rs, rt, rd)) = @@ -207,7 +207,7 @@ function clause execute (DSUBU (rs, rt, rd)) = union ast member regregreg DSUB -function clause decode (0b000000 : (regno) rs : (regno) rt : (regno) rd : 0b00000 : 0b101110) = +function clause decode (0b000000 : (regno) rs : (regno) rt : (regno) rd : 0b00000 : 0b101110) = Some(DSUB(rs, rt, rd)) function clause execute (DSUB (rs, rt, rd)) = @@ -248,7 +248,7 @@ union ast member regregreg SUBU function clause decode (0b000000 : (regno) rs : (regno) rt : (regno) rd : 0b00000 : 0b100011) = Some(SUBU(rs, rt, rd)) -function clause execute (SUBU(rs, rt, rd)) = +function clause execute (SUBU(rs, rt, rd)) = { (bit[64]) opA := rGPR(rs); (bit[64]) opB := rGPR(rt); @@ -265,7 +265,7 @@ function clause execute (SUBU(rs, rt, rd)) = (* AND reg, reg, reg *) union ast member regregreg AND -function clause decode (0b000000 : (regno) rs : (regno) rt : (regno) rd : 0b00000 : 0b100100) = +function clause decode (0b000000 : (regno) rs : (regno) rt : (regno) rd : 0b00000 : 0b100100) = Some(AND(rs, rt, rd)) function clause execute (AND (rs, rt, rd)) = @@ -276,7 +276,7 @@ function clause execute (AND (rs, rt, rd)) = (* ANDI reg, reg, imm *) union ast member regregimm16 ANDI -function clause decode (0b001100 : (regno) rs : (regno) rt : (imm16) imm) = +function clause decode (0b001100 : (regno) rs : (regno) rt : (imm16) imm) = Some(ANDI(rs, rt, imm)) function clause execute (ANDI (rs, rt, imm)) = { @@ -286,7 +286,7 @@ function clause execute (ANDI (rs, rt, imm)) = (* OR reg, reg, reg *) union ast member regregreg OR -function clause decode (0b000000 : (regno) rs : (regno) rt : (regno) rd : 0b00000 : 0b100101) = +function clause decode (0b000000 : (regno) rs : (regno) rt : (regno) rd : 0b00000 : 0b100101) = Some(OR(rs, rt, rd)) function clause execute (OR (rs, rt, rd)) = { @@ -296,7 +296,7 @@ function clause execute (OR (rs, rt, rd)) = (* ORI reg, reg, imm *) union ast member regregimm16 ORI -function clause decode (0b001101 : (regno) rs : (regno) rt : (imm16) imm) = +function clause decode (0b001101 : (regno) rs : (regno) rt : (imm16) imm) = Some(ORI(rs, rt, imm)) function clause execute (ORI (rs, rt, imm)) = { @@ -306,7 +306,7 @@ function clause execute (ORI (rs, rt, imm)) = (* NOR reg, reg, reg *) union ast member regregreg NOR -function clause decode (0b000000 : (regno) rs : (regno) rt : (regno) rd : 0b00000 : 0b100111) = +function clause decode (0b000000 : (regno) rs : (regno) rt : (regno) rd : 0b00000 : 0b100111) = Some(NOR(rs, rt, rd)) function clause execute (NOR (rs, rt, rd)) = { @@ -316,7 +316,7 @@ function clause execute (NOR (rs, rt, rd)) = (* XOR reg, reg, reg *) union ast member regregreg XOR -function clause decode (0b000000 : (regno) rs : (regno) rt : (regno) rd : 0b00000 : 0b100110) = +function clause decode (0b000000 : (regno) rs : (regno) rt : (regno) rd : 0b00000 : 0b100110) = Some(XOR(rs, rt, rd)) function clause execute (XOR (rs, rt, rd)) = { @@ -325,7 +325,7 @@ function clause execute (XOR (rs, rt, rd)) = (* XORI reg, reg, imm *) union ast member regregimm16 XORI -function clause decode (0b001110 : (regno) rs : (regno) rt : (imm16) imm) = +function clause decode (0b001110 : (regno) rs : (regno) rt : (imm16) imm) = Some(XORI(rs, rt, imm)) function clause execute (XORI (rs, rt, imm)) = { @@ -333,8 +333,8 @@ function clause execute (XORI (rs, rt, imm)) = } (* LUI reg, imm 32-bit load immediate into upper 16 bits *) -union ast member (regno, imm16) LUI -function clause decode (0b001111 : 0b00000 : (regno) rt : (imm16) imm) = +union ast member (regno, imm16) LUI +function clause decode (0b001111 : 0b00000 : (regno) rt : (imm16) imm) = Some(LUI(rt, imm)) function clause execute (LUI (rt, imm)) = { @@ -348,18 +348,18 @@ function clause execute (LUI (rt, imm)) = (* DSLL reg, reg, imm5 *) union ast member regregreg DSLL -function clause decode (0b000000 : 0b00000 : (regno) rt : (regno) rd : (bit[5]) sa : 0b111000) = +function clause decode (0b000000 : 0b00000 : (regno) rt : (regno) rd : (bit[5]) sa : 0b111000) = Some(DSLL(rt, rd, sa)) function clause execute (DSLL (rt, rd, sa)) = { - + wGPR(rd) := (rGPR(rt) << sa) (* make tuareg mode less blue >> *) } (* DSLL32 reg, reg, imm5 *) union ast member regregreg DSLL32 -function clause decode (0b000000 : 0b00000 : (regno) rt : (regno) rd : (bit[5]) sa : 0b111100) = +function clause decode (0b000000 : 0b00000 : (regno) rt : (regno) rd : (bit[5]) sa : 0b111100) = Some(DSLL32(rt, rd, sa)) function clause execute (DSLL32 (rt, rd, sa)) = { @@ -369,12 +369,12 @@ function clause execute (DSLL32 (rt, rd, sa)) = (* DSLLV reg, reg, reg *) union ast member regregreg DSLLV -function clause decode (0b000000 : (regno) rs : (regno) rt : (regno) rd : 0b00000 : 0b010100) = +function clause decode (0b000000 : (regno) rs : (regno) rt : (regno) rd : 0b00000 : 0b010100) = Some(DSLLV(rs, rt, rd)) function clause execute (DSLLV (rs, rt, rd)) = { wGPR(rd) := (rGPR(rt) << ((rGPR(rs))[5 .. 0])) (* make tuareg mode less blue >> *) - (* alternative slicing based version of above + (* alternative slicing based version of above sa := (rGPR(rt))[5 .. 0]; v := rGPR(rs); wGPR(rd) := v[(63-sa) .. 0] : (0b0 ^^ sa) *) @@ -383,24 +383,24 @@ function clause execute (DSLLV (rs, rt, rd)) = (* DSRA arithmetic shift duplicating sign bit - reg, reg, imm5 *) union ast member regregreg DSRA -function clause decode (0b000000 : 0b00000 : (regno) rt : (regno) rd : (bit[5]) sa : 0b111011) = +function clause decode (0b000000 : 0b00000 : (regno) rt : (regno) rd : (bit[5]) sa : 0b111011) = Some(DSRA(rt, rd, sa)) function clause execute (DSRA (rt, rd, sa)) = { temp := rGPR(rt); - wGPR(rd) := EXTS((temp[63] ^^ sa) : (temp[63 .. sa])) + wGPR(rd) := EXTZ((temp[63] ^^ sa) : (temp[63 .. sa])) } (* DSRA32 reg, reg, imm5 *) union ast member regregreg DSRA32 -function clause decode (0b000000 : 0b00000 : (regno) rt : (regno) rd : (bit[5]) sa : 0b111111) = +function clause decode (0b000000 : 0b00000 : (regno) rt : (regno) rd : (bit[5]) sa : 0b111111) = Some(DSRA32(rt, rd, sa)) function clause execute (DSRA32 (rt, rd, sa)) = { temp := rGPR(rt); sa32 := (0b1 : sa); (* sa+32 *) - wGPR(rd) := EXTS((temp[63] ^^ sa32) : (temp[63 .. sa32])) + wGPR(rd) := EXTZ((temp[63] ^^ sa32) : (temp[63 .. sa32])) } (* DSRAV reg, reg, reg *) @@ -411,42 +411,42 @@ function clause execute (DSRAV (rs, rt, rd)) = { temp := rGPR(rt); sa := (rGPR(rs)) [5..0]; - wGPR(rd) := EXTS((temp[63] ^^ sa) : temp[63 .. sa]) + wGPR(rd) := EXTZ((temp[63] ^^ sa) : temp[63 .. sa]) } (* DSRL shift right logical - reg, reg, imm5 *) union ast member regregreg DSRL -function clause decode (0b000000 : 0b00000 : (regno) rt : (regno) rd : (bit[5]) sa : 0b111010) = +function clause decode (0b000000 : 0b00000 : (regno) rt : (regno) rd : (bit[5]) sa : 0b111010) = Some(DSRL(rt, rd, sa)) function clause execute (DSRL (rt, rd, sa)) = { temp := rGPR(rt); - wGPR(rd) := EXTS((bitzero ^^ sa) : (temp[63 .. sa])) + wGPR(rd) := EXTZ((bitzero ^^ sa) : (temp[63 .. sa])) } (* DSRL32 reg, reg, imm5 *) union ast member regregreg DSRL32 -function clause decode (0b000000 : 0b00000 : (regno) rt : (regno) rd : (bit[5]) sa : 0b111110) = +function clause decode (0b000000 : 0b00000 : (regno) rt : (regno) rd : (bit[5]) sa : 0b111110) = Some(DSRL32(rt, rd, sa)) function clause execute (DSRL32 (rt, rd, sa)) = { temp := rGPR(rt); sa32 := (0b1 : sa); (* sa+32 *) - wGPR(rd) := EXTS((bitzero ^^ sa32) : (temp[63 .. sa32])) + wGPR(rd) := EXTZ((bitzero ^^ sa32) : (temp[63 .. sa32])) } (* DSRLV reg, reg, reg *) union ast member regregreg DSRLV -function clause decode (0b000000 : (regno) rs : (regno) rt : (regno) rd : 0b00000 : 0b010110) = +function clause decode (0b000000 : (regno) rs : (regno) rt : (regno) rd : 0b00000 : 0b010110) = Some(DSRLV(rs, rt, rd)) function clause execute (DSRLV (rs, rt, rd)) = { temp := rGPR(rt); sa := (rGPR(rs)) [5..0]; - wGPR(rd) := EXTS((bitzero ^^ sa) : temp[63 .. sa]) + wGPR(rd) := EXTZ((bitzero ^^ sa) : temp[63 .. sa]) } (**************************************************************************************) @@ -456,28 +456,28 @@ function clause execute (DSRLV (rs, rt, rd)) = (* SLL 32-bit shift left *) union ast member regregreg SLL -function clause decode (0b000000 : 0b00000 : (regno) rt : (regno) rd : (regno) sa : 0b000000) = +function clause decode (0b000000 : 0b00000 : (regno) rt : (regno) rd : (regno) sa : 0b000000) = Some(SLL(rt, rd, sa)) function clause execute (SLL(rt, rd, sa)) = { - wGPR(rd) := EXTS((rGPR(rt)) [31 - sa .. 0] : (bitzero ^^ sa)) + wGPR(rd) := EXTZ((rGPR(rt)) [31 - sa .. 0] : (bitzero ^^ sa)) } (* SLLV 32-bit shift left variable *) union ast member regregreg SLLV -function clause decode (0b000000 : (regno) rs : (regno) rt : (regno) rd : 0b00000 : 0b000100) = +function clause decode (0b000000 : (regno) rs : (regno) rt : (regno) rd : 0b00000 : 0b000100) = Some(SLLV(rs, rt, rd)) function clause execute (SLLV(rs, rt, rd)) = { sa := (rGPR(rs))[4..0]; - wGPR(rd) := EXTS((rGPR(rt)) [31 - sa .. 0] : (bitzero ^^ sa)) + wGPR(rd) := EXTZ((rGPR(rt)) [31 - sa .. 0] : (bitzero ^^ sa)) } (* SRA 32-bit arithmetic shift right *) union ast member regregreg SRA -function clause decode (0b000000 : 0b00000 : (regno) rt : (regno) rd : (regno) sa : 0b000011) = +function clause decode (0b000000 : 0b00000 : (regno) rt : (regno) rd : (regno) sa : 0b000011) = Some(SRA(rt, rd, sa)) function clause execute (SRA(rt, rd, sa)) = { @@ -485,13 +485,13 @@ function clause execute (SRA(rt, rd, sa)) = if (NotWordVal(temp)) then wGPR(rd) := undefined else - wGPR(rd) := EXTS((temp[31] ^^ (sa+32)) : temp [31..sa]) + wGPR(rd) := EXTZ((temp[31] ^^ (sa+32)) : temp [31..sa]) } (* SRAV 32-bit arithmetic shift right variable *) union ast member regregreg SRAV -function clause decode (0b000000 : (regno) rs : (regno) rt : (regno) rd : 0b00000 : 0b000111) = +function clause decode (0b000000 : (regno) rs : (regno) rt : (regno) rd : 0b00000 : 0b000111) = Some(SRAV(rs, rt, rd)) function clause execute (SRAV(rs, rt, rd)) = { @@ -500,13 +500,13 @@ function clause execute (SRAV(rs, rt, rd)) = if (NotWordVal(temp)) then wGPR(rd) := undefined else - wGPR(rd) := EXTS((temp[31] ^^ (sa+32)) : temp [31..sa]) + wGPR(rd) := EXTZ((temp[31] ^^ (sa+32)) : temp [31..sa]) } (* SRL 32-bit shift right *) union ast member regregreg SRL -function clause decode (0b000000 : 0b00000 : (regno) rt : (regno) rd : (regno) sa : 0b000010) = +function clause decode (0b000000 : 0b00000 : (regno) rt : (regno) rd : (regno) sa : 0b000010) = Some(SRL(rt, rd, sa)) function clause execute (SRL(rt, rd, sa)) = { @@ -514,13 +514,13 @@ function clause execute (SRL(rt, rd, sa)) = if (NotWordVal(temp)) then wGPR(rd) := undefined else - wGPR(rd) := EXTS((bitzero ^^ sa) : (temp [31..sa])) + wGPR(rd) := EXTZ((bitzero ^^ sa) : (temp [31..sa])) } (* SRLV 32-bit shift right variable *) union ast member regregreg SRLV -function clause decode (0b000000 : (regno) rs : (regno) rt : (regno) rd : 0b00000 : 0b000110) = +function clause decode (0b000000 : (regno) rs : (regno) rt : (regno) rd : 0b00000 : 0b000110) = Some(SRLV(rs, rt, rd)) function clause execute (SRLV(rs, rt, rd)) = { @@ -529,7 +529,7 @@ function clause execute (SRLV(rs, rt, rd)) = if (NotWordVal(temp)) then wGPR(rd) := undefined else - wGPR(rd) := EXTS((bitzero ^^ sa) : (temp [31..sa])) + wGPR(rd) := EXTZ((bitzero ^^ sa) : (temp [31..sa])) } (**************************************************************************************) @@ -539,7 +539,7 @@ function clause execute (SRLV(rs, rt, rd)) = (* SLT set if less than (signed) *) union ast member regregreg SLT -function clause decode (0b000000 : (regno) rs : (regno) rt : (regno) rd : 0b00000 : 0b101010) = +function clause decode (0b000000 : (regno) rs : (regno) rt : (regno) rd : 0b00000 : 0b101010) = Some(SLT(rs, rt, rd)) function clause execute (SLT(rs, rt, rd)) = { @@ -549,7 +549,7 @@ function clause execute (SLT(rs, rt, rd)) = (* SLT set if less than immediate (signed) *) union ast member regregimm16 SLTI -function clause decode (0b001010 : (regno) rs : (regno) rt : (imm16) imm) = +function clause decode (0b001010 : (regno) rs : (regno) rt : (imm16) imm) = Some(SLTI(rs, rt, imm)) function clause execute (SLTI(rs, rt, imm)) = { @@ -561,7 +561,7 @@ function clause execute (SLTI(rs, rt, imm)) = (* SLTU set if less than unsigned *) union ast member regregreg SLTU -function clause decode (0b000000 : (regno) rs : (regno) rt : (regno) rd : 0b00000 : 0b101011) = +function clause decode (0b000000 : (regno) rs : (regno) rt : (regno) rd : 0b00000 : 0b101011) = Some(SLTU(rs, rt, rd)) function clause execute (SLTU(rs, rt, rd)) = { @@ -573,7 +573,7 @@ function clause execute (SLTU(rs, rt, rd)) = (* SLTIU set if less than immediate unsigned *) union ast member regregimm16 SLTIU -function clause decode (0b001011 : (regno) rs : (regno) rt : (imm16) imm) = +function clause decode (0b001011 : (regno) rs : (regno) rt : (imm16) imm) = Some(SLTIU(rs, rt, imm)) function clause execute (SLTIU(rs, rt, imm)) = { @@ -585,22 +585,22 @@ function clause execute (SLTIU(rs, rt, imm)) = (* MOVN move if non-zero *) union ast member regregreg MOVN -function clause decode (0b000000 : (regno) rs : (regno) rt : (regno) rd : 0b00000 : 0b001011) = +function clause decode (0b000000 : (regno) rs : (regno) rt : (regno) rd : 0b00000 : 0b001011) = Some(MOVN(rs, rt, rd)) function clause execute (MOVN(rs, rt, rd)) = { - if (rGPR(rt) != 0x0000000000000000) then + if (rGPR(rt) != 0x0000000000000000) then wGPR(rd) := rGPR(rs) } (* MOVZ move if zero *) union ast member regregreg MOVZ -function clause decode (0b000000 : (regno) rs : (regno) rt : (regno) rd : 0b00000 : 0b001010) = +function clause decode (0b000000 : (regno) rs : (regno) rt : (regno) rd : 0b00000 : 0b001010) = Some(MOVZ(rs, rt, rd)) function clause execute (MOVZ(rs, rt, rd)) = { - if (rGPR(rt) == 0x0000000000000000) then + if (rGPR(rt) == 0x0000000000000000) then wGPR(rd) := rGPR(rs) } @@ -610,7 +610,7 @@ function clause execute (MOVZ(rs, rt, rd)) = (* MFHI move from HI register *) union ast member regno MFHI -function clause decode (0b000000 : 0b0000000000 : (regno) rd : 0b00000 : 0b010000) = +function clause decode (0b000000 : 0b0000000000 : (regno) rd : 0b00000 : 0b010000) = Some(MFHI(rd)) function clause execute (MFHI(rd)) = { @@ -619,7 +619,7 @@ function clause execute (MFHI(rd)) = (* MFLO move from LO register *) union ast member regno MFLO -function clause decode (0b000000 : 0b0000000000 : (regno) rd : 0b00000 : 0b010010) = +function clause decode (0b000000 : 0b0000000000 : (regno) rd : 0b00000 : 0b010010) = Some(MFLO(rd)) function clause execute (MFLO(rd)) = { @@ -628,7 +628,7 @@ function clause execute (MFLO(rd)) = (* MTHI move to HI register *) union ast member regno MTHI -function clause decode (0b000000 : (regno) rs : 0b000000000000000 : 0b010001) = +function clause decode (0b000000 : (regno) rs : 0b000000000000000 : 0b010001) = Some(MTHI(rs)) function clause execute (MTHI(rs)) = { @@ -637,7 +637,7 @@ function clause execute (MTHI(rs)) = (* MTLO move to LO register *) union ast member regno MTLO -function clause decode (0b000000 : (regno) rs : 0b000000000000000 : 0b010011) = +function clause decode (0b000000 : (regno) rs : 0b000000000000000 : 0b010011) = Some(MTLO(rs)) function clause execute (MTLO(rs)) = { @@ -657,7 +657,7 @@ function clause execute (MUL(rs, rt, rd)) = undefined else EXTS(result[31..0]); - (* HI and LO are technically undefined after MUL, but this causes problems with tests and + (* HI and LO are technically undefined after MUL, but this causes problems with tests and (potentially) context switch so just leave them alone HI := undefined; LO := undefined; @@ -691,7 +691,7 @@ function clause execute (MULTU(rs, rt)) = (bit[64]) result := if (NotWordVal(rsVal) | NotWordVal(rtVal)) then undefined else - (rsVal[31..0]) * (rtVal[31..0]); + EXTS((rsVal[31..0]) * (rtVal[31..0])); HI := EXTS(result[63..32]); LO := EXTS(result[31..0]); } @@ -796,13 +796,13 @@ function clause execute (DIV(rs, rt)) = rtVal := rGPR(rt); let ((bit[32]) q, (bit[32])r) = ( if (NotWordVal(rsVal) | NotWordVal(rtVal) | (rtVal == 0)) then - (undefined, undefined) + ((bit[32]) undefined, (bit[32]) undefined) else let si = (signed((rsVal[31..0]))) in let ti = (signed((rtVal[31..0]))) in let qi = (si quot ti) in let ri = (si - (ti*qi)) in - ((bit[32]) qi, (bit[32]) ri)) + ((bit[32]) (to_svec(qi)), (bit[32]) (to_svec(ri)))) in { HI := EXTS(r); @@ -820,13 +820,13 @@ function clause execute (DIVU(rs, rt)) = rtVal := rGPR(rt); let ((bit[32]) q, (bit[32])r) = ( if (NotWordVal(rsVal) | NotWordVal(rtVal) | rtVal == 0) then - (undefined, undefined) + ((bit[32]) undefined, (bit[32]) undefined) else let si = unsigned(rsVal[31..0]) in let ti = unsigned(rtVal[31..0]) in let qi = (si quot ti) in let ri = (si mod ti) in - ((bit[32]) qi, (bit[32]) ri)) + ((bit[32]) (to_svec(qi)), (bit[32]) (to_svec(ri)))) in { HI := EXTS(r); @@ -843,11 +843,11 @@ function clause execute (DDIV(rs, rt)) = rsVal := signed(rGPR(rs)); rtVal := signed(rGPR(rt)); let ((bit[64])q, (bit[64])r) = (if (rtVal == 0) - then (undefined, undefined) - else + then ((bit[64]) undefined, (bit[64]) undefined) + else let qi = (rsVal quot rtVal) in let ri = (rsVal - (qi * rtVal)) in - ((bit[64]) qi, (bit[64]) ri)) in + ((bit[64]) (to_svec(qi)), (bit[64]) (to_svec(ri)))) in { LO := q; HI := r; @@ -863,10 +863,10 @@ function clause execute (DDIVU(rs, rt)) = (int) rsVal := rGPR(rs); (int) rtVal := rGPR(rt); let ((bit[64])q, (bit[64])r) = (if (rtVal == 0) - then (undefined, undefined) + then ((bit[64]) undefined, (bit[64]) undefined) else let qi = (rsVal quot rtVal) in let ri = (rsVal mod rtVal) in - ((bit[64]) qi, (bit[64]) ri)) in + ((bit[64]) (to_svec(qi)), (bit[64]) (to_svec(ri)))) in { LO := q; HI := r; @@ -881,7 +881,7 @@ function clause execute (DDIVU(rs, rt)) = union ast member (bit[26]) J function clause decode (0b000010 : (bit[26]) offset) = Some(J(offset)) -function clause execute (J(offset)) = +function clause execute (J(offset)) = { delayedPC := (PC + 4)[63..28] : offset : 0b00; branchPending := 1 @@ -891,11 +891,11 @@ function clause execute (J(offset)) = union ast member (bit[26]) JAL function clause decode (0b000011 : (bit[26]) offset) = Some(JAL(offset)) -function clause execute (JAL(offset)) = +function clause execute (JAL(offset)) = { delayedPC := (PC + 4)[63..28] : offset : 0b00; branchPending := 1; - wGPR(31) := PC + 8; + wGPR(0b11111) := PC + 8; } (* JR -- jump via register *) @@ -925,13 +925,13 @@ function clause execute (JALR(rs, rd)) = (**************************************************************************************) union ast member (regno, regno, imm16, bool, bool) BEQ -function clause decode (0b000100 : (regno) rs : (regno) rt : (imm16) imm) = +function clause decode (0b000100 : (regno) rs : (regno) rt : (imm16) imm) = Some(BEQ(rs, rt, imm, false, false)) (* BEQ *) -function clause decode (0b010100 : (regno) rs : (regno) rt : (imm16) imm) = +function clause decode (0b010100 : (regno) rs : (regno) rt : (imm16) imm) = Some(BEQ(rs, rt, imm, false, true)) (* BEQL *) -function clause decode (0b000101 : (regno) rs : (regno) rt : (imm16) imm) = +function clause decode (0b000101 : (regno) rs : (regno) rt : (imm16) imm) = Some(BEQ(rs, rt, imm, true , false)) (* BNE *) -function clause decode (0b010101 : (regno) rs : (regno) rt : (imm16) imm) = +function clause decode (0b010101 : (regno) rs : (regno) rt : (imm16) imm) = Some(BEQ(rs, rt, imm, true , true)) (* BNEL *) function clause execute (BEQ(rs, rd, imm, ne, likely)) = { @@ -948,8 +948,8 @@ function clause execute (BEQ(rs, rd, imm, ne, likely)) = } } -(* - +(* + Branches comparing with zero (single register operand, possible link in r31) *) @@ -959,32 +959,32 @@ function clause execute (BEQ(rs, rd, imm, ne, likely)) = (**************************************************************************************) union ast member (regno, imm16, Comparison, bool, bool) BCMPZ -function clause decode (0b000001 : (regno) rs : 0b00000 : (imm16) imm) = +function clause decode (0b000001 : (regno) rs : 0b00000 : (imm16) imm) = Some(BCMPZ(rs, imm, LT, false, false)) (* BLTZ *) -function clause decode (0b000001 : (regno) rs : 0b10000 : (imm16) imm) = +function clause decode (0b000001 : (regno) rs : 0b10000 : (imm16) imm) = Some(BCMPZ(rs, imm, LT, true, false)) (* BLTZAL *) -function clause decode (0b000001 : (regno) rs : 0b00010 : (imm16) imm) = +function clause decode (0b000001 : (regno) rs : 0b00010 : (imm16) imm) = Some(BCMPZ(rs, imm, LT, false, true)) (* BLTZL *) -function clause decode (0b000001 : (regno) rs : 0b10010 : (imm16) imm) = +function clause decode (0b000001 : (regno) rs : 0b10010 : (imm16) imm) = Some(BCMPZ(rs, imm, LT, true, true)) (* BLTZALL *) -function clause decode (0b000001 : (regno) rs : 0b00001 : (imm16) imm) = +function clause decode (0b000001 : (regno) rs : 0b00001 : (imm16) imm) = Some(BCMPZ(rs, imm, GE, false, false)) (* BGEZ *) -function clause decode (0b000001 : (regno) rs : 0b10001 : (imm16) imm) = +function clause decode (0b000001 : (regno) rs : 0b10001 : (imm16) imm) = Some(BCMPZ(rs, imm, GE, true, false)) (* BGEZAL *) -function clause decode (0b000001 : (regno) rs : 0b00011 : (imm16) imm) = +function clause decode (0b000001 : (regno) rs : 0b00011 : (imm16) imm) = Some(BCMPZ(rs, imm, GE, false, true)) (* BGEZL *) -function clause decode (0b000001 : (regno) rs : 0b10011 : (imm16) imm) = +function clause decode (0b000001 : (regno) rs : 0b10011 : (imm16) imm) = Some(BCMPZ(rs, imm, GE, true, true)) (* BGEZALL *) -function clause decode (0b000111 : (regno) rs : 0b00000 : (imm16) imm) = +function clause decode (0b000111 : (regno) rs : 0b00000 : (imm16) imm) = Some(BCMPZ(rs, imm, GT, false, false)) (* BGTZ *) -function clause decode (0b010111 : (regno) rs : 0b00000 : (imm16) imm) = +function clause decode (0b010111 : (regno) rs : 0b00000 : (imm16) imm) = Some(BCMPZ(rs, imm, GT, false, true)) (* BGTZL *) -function clause decode (0b000110 : (regno) rs : 0b00000 : (imm16) imm) = +function clause decode (0b000110 : (regno) rs : 0b00000 : (imm16) imm) = Some(BCMPZ(rs, imm, LE, false, false)) (* BLEZ *) -function clause decode (0b010110 : (regno) rs : 0b00000 : (imm16) imm) = +function clause decode (0b010110 : (regno) rs : 0b00000 : (imm16) imm) = Some(BCMPZ(rs, imm, LE, false, true)) (* BLEZL *) function clause execute (BCMPZ(rs, imm, cmp, link, likely)) = @@ -1003,7 +1003,7 @@ function clause execute (BCMPZ(rs, imm, cmp, link, likely)) = nextPC := PC + 8 (* skip branch delay *) }; if (link) then - wGPR(31) := linkVal + wGPR(0b11111) := linkVal } (**************************************************************************************) @@ -1051,17 +1051,17 @@ function clause execute (WAIT) = { (* Trap instructions with two register operands *) union ast member (regno, regno, Comparison) TRAPREG -function clause decode (0b000000 : (regno) rs : (regno) rt : (bit[10]) code : 0b110000) = +function clause decode (0b000000 : (regno) rs : (regno) rt : (bit[10]) code : 0b110000) = Some(TRAPREG(rs, rt, GE)) (* TGE *) -function clause decode (0b000000 : (regno) rs : (regno) rt : (bit[10]) code : 0b110001) = +function clause decode (0b000000 : (regno) rs : (regno) rt : (bit[10]) code : 0b110001) = Some(TRAPREG(rs, rt, GEU)) (* TGEU *) -function clause decode (0b000000 : (regno) rs : (regno) rt : (bit[10]) code : 0b110010) = +function clause decode (0b000000 : (regno) rs : (regno) rt : (bit[10]) code : 0b110010) = Some(TRAPREG(rs, rt, LT)) (* TLT *) -function clause decode (0b000000 : (regno) rs : (regno) rt : (bit[10]) code : 0b110011) = +function clause decode (0b000000 : (regno) rs : (regno) rt : (bit[10]) code : 0b110011) = Some(TRAPREG(rs, rt, LTU)) (* TLTU *) -function clause decode (0b000000 : (regno) rs : (regno) rt : (bit[10]) code : 0b110100) = +function clause decode (0b000000 : (regno) rs : (regno) rt : (bit[10]) code : 0b110100) = Some(TRAPREG(rs, rt, EQ)) (* TEQ *) -function clause decode (0b000000 : (regno) rs : (regno) rt : (bit[10]) code : 0b110110) = +function clause decode (0b000000 : (regno) rs : (regno) rt : (bit[10]) code : 0b110110) = Some(TRAPREG(rs, rt, NE)) (* TNE *) function clause execute (TRAPREG(rs, rt, cmp)) = { @@ -1075,22 +1075,22 @@ function clause execute (TRAPREG(rs, rt, cmp)) = (* Trap instructions with one register and one immediate operand *) union ast member (regno, imm16, Comparison) TRAPIMM -function clause decode (0b000001 : (regno) rs : 0b01100 : (imm16) imm) = +function clause decode (0b000001 : (regno) rs : 0b01100 : (imm16) imm) = Some(TRAPIMM(rs, imm, EQ)) (* TEQI *) -function clause decode (0b000001 : (regno) rs : 0b01110 : (imm16) imm) = +function clause decode (0b000001 : (regno) rs : 0b01110 : (imm16) imm) = Some(TRAPIMM(rs, imm, NE)) (* TNEI *) -function clause decode (0b000001 : (regno) rs : 0b01000 : (imm16) imm) = +function clause decode (0b000001 : (regno) rs : 0b01000 : (imm16) imm) = Some(TRAPIMM(rs, imm, GE)) (* TGEI *) -function clause decode (0b000001 : (regno) rs : 0b01001 : (imm16) imm) = +function clause decode (0b000001 : (regno) rs : 0b01001 : (imm16) imm) = Some(TRAPIMM(rs, imm, GEU)) (* TGEIU *) -function clause decode (0b000001 : (regno) rs : 0b01010 : (imm16) imm) = +function clause decode (0b000001 : (regno) rs : 0b01010 : (imm16) imm) = Some(TRAPIMM(rs, imm, LT)) (* TLTI *) -function clause decode (0b000001 : (regno) rs : 0b01011 : (imm16) imm) = +function clause decode (0b000001 : (regno) rs : 0b01011 : (imm16) imm) = Some(TRAPIMM(rs, imm, LTU)) (* TLTIU *) function clause execute (TRAPIMM(rs, imm, cmp)) = { rs_val := rGPR(rs); - imm_val := EXTS(imm); + (bit[64]) imm_val := EXTS(imm); condition := compare(cmp, rs_val, imm_val); if (condition) then (SignalException(Tr)) @@ -1101,23 +1101,23 @@ function clause execute (TRAPIMM(rs, imm, cmp)) = (**************************************************************************************) union ast member (WordType, bool, bool, regno, regno, imm16) Load -function clause decode (0b100000 : (regno) base : (regno) rt : (imm16) offset) = +function clause decode (0b100000 : (regno) base : (regno) rt : (imm16) offset) = Some(Load(B, true, false, base, rt, offset)) (* LB *) -function clause decode (0b100100 : (regno) base : (regno) rt : (imm16) offset) = +function clause decode (0b100100 : (regno) base : (regno) rt : (imm16) offset) = Some(Load(B, false, false, base, rt, offset)) (* LBU *) -function clause decode (0b100001 : (regno) base : (regno) rt : (imm16) offset) = +function clause decode (0b100001 : (regno) base : (regno) rt : (imm16) offset) = Some(Load(H, true, false, base, rt, offset)) (* LH *) -function clause decode (0b100101 : (regno) base : (regno) rt : (imm16) offset) = +function clause decode (0b100101 : (regno) base : (regno) rt : (imm16) offset) = Some(Load(H, false, false, base, rt, offset)) (* LHU *) -function clause decode (0b100011 : (regno) base : (regno) rt : (imm16) offset) = +function clause decode (0b100011 : (regno) base : (regno) rt : (imm16) offset) = Some(Load(W, true, false, base, rt, offset)) (* LW *) -function clause decode (0b100111 : (regno) base : (regno) rt : (imm16) offset) = +function clause decode (0b100111 : (regno) base : (regno) rt : (imm16) offset) = Some(Load(W, false, false, base, rt, offset)) (* LWU *) -function clause decode (0b110111 : (regno) base : (regno) rt : (imm16) offset) = +function clause decode (0b110111 : (regno) base : (regno) rt : (imm16) offset) = Some(Load(D, false, false, base, rt, offset)) (* LD *) -function clause decode (0b110000 : (regno) base : (regno) rt : (imm16) offset) = +function clause decode (0b110000 : (regno) base : (regno) rt : (imm16) offset) = Some(Load(W, true, true, base, rt, offset)) (* LL *) -function clause decode (0b110100 : (regno) base : (regno) rt : (imm16) offset) = +function clause decode (0b110100 : (regno) base : (regno) rt : (imm16) offset) = Some(Load(D, false, true, base, rt, offset)) (* LLD *) function clause execute (Load(width, signed, linked, base, rt, offset)) = { @@ -1127,15 +1127,25 @@ function clause execute (Load(width, signed, linked, base, rt, offset)) = else let pAddr = (TLBTranslate(vAddr, LoadData)) in { - memResult := if (linked) then + (bit[64]) memResult := if (linked) then { CP0LLBit := 0b1; - CP0LLAddr := pAddr; - MEMr_reserve_wrapper(pAddr, wordWidthBytes(width)); + CP0LLAddr := pAddr; + switch wordWidthBytes(width) { + case ([:1:]) w -> MEMr_reserve_wrapper(pAddr, w) + case ([:2:]) w -> MEMr_reserve_wrapper(pAddr, w) + case ([:4:]) w -> MEMr_reserve_wrapper(pAddr, w) + case ([:8:]) w -> MEMr_reserve_wrapper(pAddr, w) + } } else - MEMr_wrapper(pAddr, wordWidthBytes(width)); - if (signed) then + switch wordWidthBytes(width) { + case ([:1:]) w -> MEMr_reserve_wrapper(pAddr, w) + case ([:2:]) w -> MEMr_reserve_wrapper(pAddr, w) + case ([:4:]) w -> MEMr_reserve_wrapper(pAddr, w) + case ([:8:]) w -> MEMr_reserve_wrapper(pAddr, w) + }; + if (signed) then wGPR(rt) := EXTS(memResult) else wGPR(rt) := EXTZ(memResult) @@ -1147,17 +1157,17 @@ function clause execute (Load(width, signed, linked, base, rt, offset)) = (**************************************************************************************) union ast member (WordType, bool, regno, regno, imm16) Store -function clause decode (0b101000 : (regno) base : (regno) rt : (imm16) offset) = +function clause decode (0b101000 : (regno) base : (regno) rt : (imm16) offset) = Some(Store(B, false, base, rt, offset)) (* SB *) -function clause decode (0b101001 : (regno) base : (regno) rt : (imm16) offset) = +function clause decode (0b101001 : (regno) base : (regno) rt : (imm16) offset) = Some(Store(H, false, base, rt, offset)) (* SH *) -function clause decode (0b101011 : (regno) base : (regno) rt : (imm16) offset) = +function clause decode (0b101011 : (regno) base : (regno) rt : (imm16) offset) = Some(Store(W, false, base, rt, offset)) (* SW *) -function clause decode (0b111111 : (regno) base : (regno) rt : (imm16) offset) = +function clause decode (0b111111 : (regno) base : (regno) rt : (imm16) offset) = Some(Store(D, false, base, rt, offset)) (* SD *) -function clause decode (0b111000 : (regno) base : (regno) rt : (imm16) offset) = +function clause decode (0b111000 : (regno) base : (regno) rt : (imm16) offset) = Some(Store(W, true, base, rt, offset)) (* SC *) -function clause decode (0b111100 : (regno) base : (regno) rt : (imm16) offset) = +function clause decode (0b111100 : (regno) base : (regno) rt : (imm16) offset) = Some(Store(D, true, base, rt, offset)) (* SCD *) function clause execute (Store(width, conditional, base, rt, offset)) = { @@ -1170,14 +1180,14 @@ function clause execute (Store(width, conditional, base, rt, offset)) = { if (conditional) then { - success := if (CP0LLBit[0]) then switch(width) + success := if (CP0LLBit[0]) then (bool) switch(width) { case B -> MEMw_conditional_wrapper(pAddr, 1, rt_val[7..0]) case H -> MEMw_conditional_wrapper(pAddr, 2, rt_val[15..0]) case W -> MEMw_conditional_wrapper(pAddr, 4, rt_val[31..0]) case D -> MEMw_conditional_wrapper(pAddr, 8, rt_val) } else false; - wGPR(rt) := EXTZ([success]) + wGPR(rt) := EXTZ([bool_to_bit(success)]) } else switch(width) @@ -1195,7 +1205,7 @@ function clause execute (Store(width, conditional, base, rt, offset)) = union ast member regregimm16 LWL function clause decode(0b100010 : (regno) base : (regno) rt : (imm16) offset) = Some(LWL(base, rt, offset)) -function clause execute(LWL(base, rt, offset)) = +function clause execute(LWL(base, rt, offset)) = { (* XXX length check not quite right, but conservative *) (bit[64]) vAddr := addrWrapper(EXTS(offset) + rGPR(base), LoadData, W); @@ -1203,19 +1213,19 @@ function clause execute(LWL(base, rt, offset)) = { mem_val := MEMr_wrapper (pAddr[63..2] : 0b00, 4); (* read word of interest *) reg_val := rGPR(rt); - wGPR(rt) := EXTS(switch(vAddr[1..0]) + wGPR(rt) := EXTS((bit[32]) switch(vAddr[1..0]) { case 0b00 -> mem_val case 0b01 -> mem_val[23..0] : reg_val[07..0] case 0b10 -> mem_val[15..0] : reg_val[15..0] case 0b11 -> mem_val[07..0] : reg_val[23..0] - }); + }); } } union ast member regregimm16 LWR function clause decode(0b100110 : (regno) base : (regno) rt : (imm16) offset) = Some(LWR(base, rt, offset)) -function clause execute(LWR(base, rt, offset)) = +function clause execute(LWR(base, rt, offset)) = { (* XXX length check not quite right, but conservative *) (bit[64]) vAddr := addrWrapper(EXTS(offset) + rGPR(base), LoadData, W); @@ -1223,7 +1233,7 @@ function clause execute(LWR(base, rt, offset)) = { mem_val := MEMr_wrapper (pAddr[63..2] : 0b00, 4); (* read word of interest *) reg_val := rGPR(rt); - wGPR(rt) := EXTS(switch(vAddr[1..0]) (* it is acceptable to sign extend in all cases *) + wGPR(rt) := EXTS((bit[32]) switch(vAddr[1..0]) (* it is acceptable to sign extend in all cases *) { case 0b00 -> reg_val[31..8] : mem_val[31..24] case 0b01 -> reg_val[31..16] : mem_val[31..16] @@ -1237,7 +1247,7 @@ function clause execute(LWR(base, rt, offset)) = union ast member regregimm16 SWL function clause decode(0b101010 : (regno) base : (regno) rt : (imm16) offset) = Some(SWL(base, rt, offset)) -function clause execute(SWL(base, rt, offset)) = +function clause execute(SWL(base, rt, offset)) = { (* XXX length check not quite right, but conservative *) (bit[64]) vAddr := addrWrapper(EXTS(offset) + rGPR(base), StoreData, W); @@ -1257,7 +1267,7 @@ function clause execute(SWL(base, rt, offset)) = union ast member regregimm16 SWR function clause decode(0b101110 : (regno) base : (regno) rt : (imm16) offset) = Some(SWR(base, rt, offset)) -function clause execute(SWR(base, rt, offset)) = +function clause execute(SWR(base, rt, offset)) = { (* XXX length check not quite right, but conservative *) (bit[64]) vAddr := addrWrapper(EXTS(offset) + rGPR(base), StoreData, W); @@ -1279,7 +1289,7 @@ function clause execute(SWR(base, rt, offset)) = union ast member regregimm16 LDL function clause decode(0b011010 : (regno) base : (regno) rt : (imm16) offset) = Some(LDL(base, rt, offset)) -function clause execute(LDL(base, rt, offset)) = +function clause execute(LDL(base, rt, offset)) = { (* XXX length check not quite right, but conservative *) (bit[64]) vAddr := addrWrapper(EXTS(offset) + rGPR(base), LoadData, D); @@ -1305,7 +1315,7 @@ function clause execute(LDL(base, rt, offset)) = union ast member regregimm16 LDR function clause decode(0b011011 : (regno) base : (regno) rt : (imm16) offset) = Some(LDR(base, rt, offset)) -function clause execute(LDR(base, rt, offset)) = +function clause execute(LDR(base, rt, offset)) = { (* XXX length check not quite right, but conservative *) (bit[64]) vAddr := addrWrapper(EXTS(offset) + rGPR(base), LoadData, D); @@ -1331,7 +1341,7 @@ function clause execute(LDR(base, rt, offset)) = union ast member regregimm16 SDL function clause decode(0b101100 : (regno) base : (regno) rt : (imm16) offset) = Some(SDL(base, rt, offset)) -function clause execute(SDL(base, rt, offset)) = +function clause execute(SDL(base, rt, offset)) = { (* XXX length check not quite right, but conservative *) (bit[64]) vAddr := addrWrapper(EXTS(offset) + rGPR(base), StoreData, D); @@ -1357,7 +1367,7 @@ function clause execute(SDL(base, rt, offset)) = union ast member regregimm16 SDR function clause decode(0b101101 : (regno) base : (regno) rt : (imm16) offset) = Some(SDR(base, rt, offset)) -function clause execute(SDR(base, rt, offset)) = +function clause execute(SDR(base, rt, offset)) = { (* XXX length check not quite right, but conservative *) (bit[64]) vAddr := addrWrapper(EXTS(offset) + rGPR(base), StoreData, D); @@ -1384,7 +1394,7 @@ function clause execute(SDR(base, rt, offset)) = union ast member regregimm16 CACHE function clause decode (0b101111 : (regno) base : (regno) op : (imm16) imm) = Some(CACHE(base, op, imm)) -function clause execute (CACHE(base, op, imm)) = +function clause execute (CACHE(base, op, imm)) = checkCP0Access () (* pretty much a NOP because no caches *) (* PREF - prefetching into (non-existent) caches *) @@ -1398,7 +1408,7 @@ function clause execute (PREF(base, op, imm)) = (* SYNC - Memory barrier *) union ast member unit SYNC -function clause decode (0b000000 : 0b00000 : 0b00000 : 0b00000 : (regno) stype : 0b001111) = +function clause decode (0b000000 : 0b00000 : 0b00000 : 0b00000 : (regno) stype : 0b001111) = Some((ast) SYNC) (* stype is currently ignored *) function clause execute(SYNC) = MEM_sync() @@ -1413,7 +1423,7 @@ function clause execute (MFC0(rt, rd, sel, double)) = { let (bit[64]) result = switch (rd, sel) { case (0b00000,0b000) -> let (bit[31]) idx = EXTZ(TLBIndex) in - (0x00000000 : [TLBProbe] : idx) (* 0, TLB Index *) + (0x00000000 : TLBProbe : idx) (* 0, TLB Index *) case (0b00001,0b000) -> EXTZ(TLBRandom) (* 1, TLB Random *) case (0b00010,0b000) -> TLBEntryLo0 (* 2, TLB EntryLo0 *) case (0b00011,0b000) -> TLBEntryLo1 (* 3, TLB EntryLo1 *) @@ -1433,9 +1443,9 @@ function clause execute (MFC0(rt, rd, sel, double)) = { case (0b01111,0b110) -> 0 (* 15, sel 6: CHERI core ID *) case (0b01111,0b111) -> 0 (* 15, sel 7: CHERI thread ID *) case (0b10000,0b000) -> EXTZ(0b1 (* M *) (* 16, sel 0: Config0 *) - : 0b000000000000000 (* Impl *) - : 0b1 (* BE *) - : 0b10 (* AT *) + : 0b000000000000000 (* Impl *) + : 0b1 (* BE *) + : 0b10 (* AT *) : 0b000 (* AR *) : 0b001 (* MT standard TLB *) : 0b0000 (* zero *) @@ -1449,7 +1459,7 @@ function clause execute (MFC0(rt, rd, sel, double)) = { : 0b000 (* DS dcache sets *) : 0b000 (* DL dcache lines *) : 0b000 (* DA dcache assoc. *) - : [have_cp2] (* C2 CP2 presence *) + : [bool_to_bit(have_cp2)] (* C2 CP2 presence *) : 0b0 (* MD MDMX implemented *) : 0b0 (* PC performance counters *) : 0b0 (* WR watch registers *) @@ -1476,7 +1486,7 @@ function clause execute (MFC0(rt, rd, sel, double)) = { case _ -> (SignalException(ResI)) } in wGPR(rt) := if (double) then result else EXTS(result[31..0]) -} +} (* simulator halt instruction "MTC0 rt, r23" (cheri specific behaviour) *) union ast member unit HCF @@ -1519,7 +1529,7 @@ function clause execute (MTC0(rt, rd, sel, double)) = { (TLBEntryHi.ASID) := (reg_val[7..0]); } case (0b01011,0b000) -> { (* 11, sel 0: Compare reg *) - CP0Compare := reg_val[31..0]; + CP0Compare := reg_val[31..0]; (CP0Cause[15]) := bitzero; } case (0b01100,0b000) -> { (* 12 Status *) @@ -1546,7 +1556,7 @@ function clause execute (MTC0(rt, rd, sel, double)) = { case _ -> (SignalException(ResI)) } } -(* + function unit TLBWriteEntry((TLBIndexT) idx) = { pagemask := (bit[16]) (EXTZ(TLBPageMask)); (* XXX EXTZ here forces register read in ocaml shallow embedding *) switch(pagemask) { @@ -1561,26 +1571,28 @@ function unit TLBWriteEntry((TLBIndexT) idx) = { case 0xffff -> () case _ -> (SignalException(MCheck)) }; - ((TLBEntries[idx]).pagemask) := pagemask; - ((TLBEntries[idx]).r ) := TLBEntryHi.R; - ((TLBEntries[idx]).vpn2 ) := TLBEntryHi.VPN2; - ((TLBEntries[idx]).asid ) := TLBEntryHi.ASID; - ((TLBEntries[idx]).g ) := ((TLBEntryLo0.G) & (TLBEntryLo1.G)); - ((TLBEntries[idx]).valid ) := bitone; - ((TLBEntries[idx]).caps0 ) := TLBEntryLo0.CapS; - ((TLBEntries[idx]).capl0 ) := TLBEntryLo0.CapL; - ((TLBEntries[idx]).pfn0 ) := TLBEntryLo0.PFN; - ((TLBEntries[idx]).c0 ) := TLBEntryLo0.C; - ((TLBEntries[idx]).d0 ) := TLBEntryLo0.D; - ((TLBEntries[idx]).v0 ) := TLBEntryLo0.V; - ((TLBEntries[idx]).caps1 ) := TLBEntryLo1.CapS; - ((TLBEntries[idx]).capl1 ) := TLBEntryLo1.CapL; - ((TLBEntries[idx]).pfn1 ) := TLBEntryLo1.PFN; - ((TLBEntries[idx]).c1 ) := TLBEntryLo1.C; - ((TLBEntries[idx]).d1 ) := TLBEntryLo1.D; - ((TLBEntries[idx]).v1 ) := TLBEntryLo1.V; + let idxr = unsigned(idx) in { + ((TLBEntries[idxr]).pagemask) := pagemask; + ((TLBEntries[idxr]).r ) := TLBEntryHi.R; + ((TLBEntries[idxr]).vpn2 ) := TLBEntryHi.VPN2; + ((TLBEntries[idxr]).asid ) := TLBEntryHi.ASID; + ((TLBEntries[idxr]).g ) := ((TLBEntryLo0.G) & (TLBEntryLo1.G)); + ((TLBEntries[idxr]).valid ) := bitone; + ((TLBEntries[idxr]).caps0 ) := TLBEntryLo0.CapS; + ((TLBEntries[idxr]).capl0 ) := TLBEntryLo0.CapL; + ((TLBEntries[idxr]).pfn0 ) := TLBEntryLo0.PFN; + ((TLBEntries[idxr]).c0 ) := TLBEntryLo0.C; + ((TLBEntries[idxr]).d0 ) := TLBEntryLo0.D; + ((TLBEntries[idxr]).v0 ) := TLBEntryLo0.V; + ((TLBEntries[idxr]).caps1 ) := TLBEntryLo1.CapS; + ((TLBEntries[idxr]).capl1 ) := TLBEntryLo1.CapL; + ((TLBEntries[idxr]).pfn1 ) := TLBEntryLo1.PFN; + ((TLBEntries[idxr]).c1 ) := TLBEntryLo1.C; + ((TLBEntries[idxr]).d1 ) := TLBEntryLo1.D; + ((TLBEntries[idxr]).v1 ) := TLBEntryLo1.V; + } } -*) + union ast member TLBWI function clause decode (0b010000 : 0b10000000000000000000 : 0b000010) = Some((ast) TLBWI) function clause execute (TLBWI) = { @@ -1599,7 +1611,7 @@ union ast member TLBR function clause decode (0b010000 : 0b10000000000000000000 : 0b000001) = Some((ast) TLBR) function clause execute (TLBR) = { checkCP0Access(); - let entry = TLBEntries[TLBIndex] in { + let entry = TLBEntries[unsigned(TLBIndex)] in { TLBPageMask := entry.pagemask; TLBEntryHi.R := entry.r; TLBEntryHi.VPN2 := entry.vpn2; @@ -1633,17 +1645,17 @@ function clause execute ((TLBP)) = { } case None -> { TLBProbe := [bitone]; - TLBIndex := 0; + TLBIndex := 0b000000; } } } union ast member (regno, regno) RDHWR -function clause decode (0b011111 : 0b00000 : (regno) rt : (regno) rd : 0b00000 : 0b111011) = +function clause decode (0b011111 : 0b00000 : (regno) rt : (regno) rd : 0b00000 : 0b111011) = Some(RDHWR(rt, rd)) function clause execute (RDHWR(rt, rd)) = { let accessLevel = getAccessLevel() in - if ((accessLevel != Kernel) & (~((CP0Status.CU)[0])) & ~(CP0HWREna[rd])) then + if ((accessLevel != Kernel) & (~((CP0Status.CU)[28])) & ~(CP0HWREna[rd])) then (SignalException(ResI)); let (bit[64]) temp = switch (rd) { case 0b00000 -> EXTZ([bitzero]) (* CPUNum *) diff --git a/mips_new_tc/mips_wrappers.sail b/mips_new_tc/mips_wrappers.sail index cdb4316c..5b36983d 100644 --- a/mips_new_tc/mips_wrappers.sail +++ b/mips_new_tc/mips_wrappers.sail @@ -35,8 +35,10 @@ (* mips_wrappers.sail: wrappers functions and hooks for CHERI extensibility (mostly identity functions here) *) -function unit effect {wmem} MEMw_wrapper((bit[64]) addr, ([:8:]) size, (bit[64]) data) = - let ledata = reverse_endianness'(8, data) in +val forall Nat 'n, 'n >= 1, 'n <= 8. (bit[64], [:'n:], bit[8 * 'n]) -> unit effect {eamem, wmv, wreg} MEMw_wrapper + +function unit MEMw_wrapper((bit[64]) addr, ([:'n:]) size, (bit[8 * 'n]) data) = + let ledata = reverse_endianness'(sizeof 'n, data) in if (addr == 0x000000007f000000) then { UART_WDATA := ledata[7..0]; @@ -46,10 +48,12 @@ function unit effect {wmem} MEMw_wrapper((bit[64]) addr, ([:8:]) size, (bit[64]) MEMval(addr, size, ledata); } -function bool effect {wmem} MEMw_conditional_wrapper((bit[64]) addr, ([:8:]) size, (bit[64]) data) = +val forall Nat 'n, 'n >= 1, 'n <= 8. (bit[64], [:'n:], bit[8 * 'n]) -> bool effect {eamem, wmv} MEMw_conditional_wrapper + +function bool MEMw_conditional_wrapper(addr, size, data) = { MEMea_conditional(addr, size); - MEMval_conditional(addr, size, reverse_endianness'(8, data)) + MEMval_conditional(addr, size, reverse_endianness'(sizeof 'n, data)) } function bit[64] addrWrapper((bit[64]) addr, (MemAccessType) accessType, (WordType) width) = |
