summaryrefslogtreecommitdiff
path: root/mips_new_tc/mips_regfp.sail
diff options
context:
space:
mode:
Diffstat (limited to 'mips_new_tc/mips_regfp.sail')
-rw-r--r--mips_new_tc/mips_regfp.sail455
1 files changed, 455 insertions, 0 deletions
diff --git a/mips_new_tc/mips_regfp.sail b/mips_new_tc/mips_regfp.sail
new file mode 100644
index 00000000..36750583
--- /dev/null
+++ b/mips_new_tc/mips_regfp.sail
@@ -0,0 +1,455 @@
+(*========================================================================*)
+(* *)
+(* Copyright (c) 2015-2017 Robert M. Norton *)
+(* Copyright (c) 2015-2017 Kathyrn Gray *)
+(* All rights reserved. *)
+(* *)
+(* This software was developed by the University of Cambridge Computer *)
+(* Laboratory as part of the Rigorous Engineering of Mainstream Systems *)
+(* (REMS) project, funded by EPSRC grant EP/K008528/1. *)
+(* *)
+(* Redistribution and use in source and binary forms, with or without *)
+(* modification, are permitted provided that the following conditions *)
+(* are met: *)
+(* 1. Redistributions of source code must retain the above copyright *)
+(* notice, this list of conditions and the following disclaimer. *)
+(* 2. Redistributions in binary form must reproduce the above copyright *)
+(* notice, this list of conditions and the following disclaimer in *)
+(* the documentation and/or other materials provided with the *)
+(* distribution. *)
+(* *)
+(* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' *)
+(* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED *)
+(* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A *)
+(* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR *)
+(* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, *)
+(* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT *)
+(* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF *)
+(* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND *)
+(* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, *)
+(* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT *)
+(* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF *)
+(* SUCH DAMAGE. *)
+(*========================================================================*)
+
+let (vector <0, 32, inc, string >) GPRs =
+ [ "GPR00", "GPR01", "GPR02", "GPR03", "GPR04", "GPR05", "GPR06", "GPR07", "GPR08", "GPR09", "GPR10",
+ "GPR11", "GPR12", "GPR13", "GPR14", "GPR15", "GPR16", "GPR17", "GPR18", "GPR19", "GPR20",
+ "GPR21", "GPR22", "GPR23", "GPR24", "GPR25", "GPR26", "GPR27", "GPR28", "GPR29", "GPR30", "GPR31"
+ ]
+
+let CIA_fp = RFull("CIA")
+let NIA_fp = RFull("NIA")
+
+function (regfps,regfps,regfps,niafps,diafp,instruction_kind) initial_analysis (instr) = {
+ iR := [|| ||];
+ oR := [|| ||];
+ aR := [|| ||];
+ ik := IK_simple;
+ Nias := [|| ||];
+ Dia := DIAFP_none;
+
+ switch instr {
+ case (DADDIU (rs, rt, imm)) -> {
+ if rs == 0 then () else iR := RFull(GPRs[rs]) :: iR;
+ if rt == 0 then () else oR := RFull(GPRs[rt]) :: oR;
+ }
+ case (DADDU (rs, rt, rd)) -> {
+ if rs == 0 then () else iR := RFull(GPRs[rs]) :: iR;
+ if rt == 0 then () else iR := RFull(GPRs[rt]) :: iR;
+ if rd == 0 then () else oR := RFull(GPRs[rd]) :: oR;
+ }
+ case (DADDI (rs, rt, imm)) -> {
+ if rs == 0 then () else iR := RFull(GPRs[rs]) :: iR;
+ if rt == 0 then () else oR := RFull(GPRs[rt]) :: oR;
+ }
+ case (DADD (rs, rt, rd)) -> {
+ if rs == 0 then () else iR := RFull(GPRs[rs]) :: iR;
+ if rt == 0 then () else oR := RFull(GPRs[rt]) :: oR;
+ }
+ case (ADD(rs, rt, rd)) -> {
+ if rs == 0 then () else iR := RFull(GPRs[rs]) :: iR;
+ if rt == 0 then () else iR := RFull(GPRs[rt]) :: iR;
+ if rd == 0 then () else oR := RFull(GPRs[rd]) :: oR;
+ }
+ case (ADDI(rs, rt, imm)) -> {
+ if rs == 0 then () else iR := RFull(GPRs[rs]) :: iR;
+ if rt == 0 then () else oR := RFull(GPRs[rt]) :: oR;
+ }
+ case (ADDU(rs, rt, rd)) -> {
+ if rs == 0 then () else iR := RFull(GPRs[rs]) :: iR;
+ if rt == 0 then () else iR := RFull(GPRs[rt]) :: iR;
+ if rd == 0 then () else oR := RFull(GPRs[rd]) :: oR;
+ }
+ case (ADDIU(rs, rt, imm)) -> {
+ if rs == 0 then () else iR := RFull(GPRs[rs]) :: iR;
+ if rt == 0 then () else oR := RFull(GPRs[rt]) :: oR;
+ }
+ case (DSUBU (rs, rt, rd)) -> {
+ if rs == 0 then () else iR := RFull(GPRs[rs]) :: iR;
+ if rt == 0 then () else iR := RFull(GPRs[rt]) :: iR;
+ if rd == 0 then () else oR := RFull(GPRs[rd]) :: oR;
+ }
+ case (DSUB (rs, rt, rd)) -> {
+ if rs == 0 then () else iR := RFull(GPRs[rs]) :: iR;
+ if rt == 0 then () else iR := RFull(GPRs[rt]) :: iR;
+ if rd == 0 then () else oR := RFull(GPRs[rd]) :: oR;
+ }
+ case (SUB(rs, rt, rd)) -> {
+ if rs == 0 then () else iR := RFull(GPRs[rs]) :: iR;
+ if rt == 0 then () else iR := RFull(GPRs[rt]) :: iR;
+ if rd == 0 then () else oR := RFull(GPRs[rd]) :: oR;
+ }
+ case (SUBU(rs, rt, rd)) -> {
+ if rs == 0 then () else iR := RFull(GPRs[rs]) :: iR;
+ if rt == 0 then () else iR := RFull(GPRs[rt]) :: iR;
+ if rd == 0 then () else oR := RFull(GPRs[rd]) :: oR;
+ }
+ case (AND (rs, rt, rd)) -> {
+ if rs == 0 then () else iR := RFull(GPRs[rs]) :: iR;
+ if rt == 0 then () else iR := RFull(GPRs[rt]) :: iR;
+ if rd == 0 then () else oR := RFull(GPRs[rd]) :: oR;
+ }
+ case (ANDI (rs, rt, imm)) -> {
+ if rs == 0 then () else iR := RFull(GPRs[rs]) :: iR;
+ if rt == 0 then () else oR := RFull(GPRs[rt]) :: oR;
+ }
+ case (OR (rs, rt, rd)) -> {
+ if rs == 0 then () else iR := RFull(GPRs[rs]) :: iR;
+ if rt == 0 then () else iR := RFull(GPRs[rt]) :: iR;
+ if rd == 0 then () else oR := RFull(GPRs[rd]) :: oR;
+ }
+ case (ORI (rs, rt, imm)) -> {
+ if rs == 0 then () else iR := RFull(GPRs[rs]) :: iR;
+ if rt == 0 then () else oR := RFull(GPRs[rt]) :: oR;
+ }
+ case (NOR (rs, rt, rd)) -> {
+ if rs == 0 then () else iR := RFull(GPRs[rs]) :: iR;
+ if rt == 0 then () else iR := RFull(GPRs[rt]) :: iR;
+ if rd == 0 then () else oR := RFull(GPRs[rd]) :: oR;
+ }
+ case (XOR (rs, rt, rd)) -> {
+ if rs == 0 then () else iR := RFull(GPRs[rs]) :: iR;
+ if rt == 0 then () else iR := RFull(GPRs[rt]) :: iR;
+ if rd == 0 then () else oR := RFull(GPRs[rd]) :: oR;
+ }
+ case (XORI (rs, rt, imm)) -> {
+ if rs == 0 then () else iR := RFull(GPRs[rs]) :: iR;
+ if rt == 0 then () else oR := RFull(GPRs[rt]) :: oR;
+ }
+ case (LUI (rt, imm)) -> {
+ if rt == 0 then () else oR := RFull(GPRs[rt]) :: oR;
+ }
+ case (DSLL (rt, rd, sa)) -> {
+ if rt == 0 then () else iR := RFull(GPRs[rt]) :: iR;
+ if rd == 0 then () else oR := RFull(GPRs[rd]) :: oR;
+ }
+ case (DSLL32 (rt, rd, sa)) -> {
+ if rt == 0 then () else iR := RFull(GPRs[rt]) :: iR;
+ if rd == 0 then () else oR := RFull(GPRs[rd]) :: oR;
+ }
+ case (DSLLV (rs, rt, rd)) -> {
+ if rs == 0 then () else iR := RFull(GPRs[rs]) :: iR;
+ if rt == 0 then () else iR := RFull(GPRs[rt]) :: iR;
+ if rd == 0 then () else oR := RFull(GPRs[rd]) :: oR;
+ }
+ case (DSRA (rt, rd, sa)) -> {
+ if rt == 0 then () else iR := RFull(GPRs[rt]) :: iR;
+ if rd == 0 then () else oR := RFull(GPRs[rd]) :: oR;
+ }
+ case (DSRA32 (rt, rd, sa)) -> {
+ if rt == 0 then () else iR := RFull(GPRs[rt]) :: iR;
+ if rd == 0 then () else oR := RFull(GPRs[rd]) :: oR;
+ }
+ case (DSRAV (rs, rt, rd)) -> {
+ if rs == 0 then () else iR := RFull(GPRs[rs]) :: iR;
+ if rt == 0 then () else iR := RFull(GPRs[rt]) :: iR;
+ if rd == 0 then () else oR := RFull(GPRs[rd]) :: oR;
+ }
+ case (DSRL (rt, rd, sa)) -> {
+ if rt == 0 then () else iR := RFull(GPRs[rt]) :: iR;
+ if rd == 0 then () else oR := RFull(GPRs[rd]) :: oR;
+ }
+ case (DSRL32 (rt, rd, sa)) -> {
+ if rt == 0 then () else iR := RFull(GPRs[rt]) :: iR;
+ if rd == 0 then () else oR := RFull(GPRs[rd]) :: oR;
+ }
+ case (DSRLV (rs, rt, rd)) -> {
+ if rs == 0 then () else iR := RFull(GPRs[rs]) :: iR;
+ if rt == 0 then () else iR := RFull(GPRs[rt]) :: iR;
+ if rd == 0 then () else oR := RFull(GPRs[rd]) :: oR;
+ }
+ case (SLL(rt, rd, sa)) -> {
+ if rt == 0 then () else iR := RFull(GPRs[rt]) :: iR;
+ if rd == 0 then () else oR := RFull(GPRs[rd]) :: oR;
+ }
+ case (SLLV(rs, rt, rd)) -> {
+ if rs == 0 then () else iR := RFull(GPRs[rs]) :: iR;
+ if rt == 0 then () else iR := RFull(GPRs[rt]) :: iR;
+ if rd == 0 then () else oR := RFull(GPRs[rd]) :: oR;
+ }
+ case (SRA(rt, rd, sa)) -> {
+ if rt == 0 then () else iR := RFull(GPRs[rt]) :: iR;
+ if rd == 0 then () else oR := RFull(GPRs[rd]) :: oR;
+ }
+ case (SRAV(rs, rt, rd)) -> {
+ if rs == 0 then () else iR := RFull(GPRs[rs]) :: iR;
+ if rt == 0 then () else iR := RFull(GPRs[rt]) :: iR;
+ if rd == 0 then () else oR := RFull(GPRs[rd]) :: oR;
+ }
+ case (SRL(rt, rd, sa)) -> {
+ if rt == 0 then () else iR := RFull(GPRs[rt]) :: iR;
+ if rd == 0 then () else oR := RFull(GPRs[rd]) :: oR;
+ }
+ case (SRLV(rs, rt, rd)) -> {
+ if rs == 0 then () else iR := RFull(GPRs[rs]) :: iR;
+ if rt == 0 then () else iR := RFull(GPRs[rt]) :: iR;
+ if rd == 0 then () else oR := RFull(GPRs[rd]) :: oR;
+ }
+ case (SLT(rs, rt, rd)) -> {
+ if rs == 0 then () else iR := RFull(GPRs[rs]) :: iR;
+ if rt == 0 then () else iR := RFull(GPRs[rt]) :: iR;
+ if rd == 0 then () else oR := RFull(GPRs[rd]) :: oR;
+ }
+ case (SLTI(rs, rt, imm)) -> {
+ if rs == 0 then () else iR := RFull(GPRs[rs]) :: iR;
+ if rt == 0 then () else oR := RFull(GPRs[rt]) :: oR;
+ }
+ case (SLTU(rs, rt, rd)) -> {
+ if rs == 0 then () else iR := RFull(GPRs[rs]) :: iR;
+ if rt == 0 then () else iR := RFull(GPRs[rt]) :: iR;
+ if rd == 0 then () else oR := RFull(GPRs[rd]) :: oR;
+ }
+ case (SLTIU(rs, rt, imm)) -> {
+ if rs == 0 then () else iR := RFull(GPRs[rs]) :: iR;
+ if rt == 0 then () else oR := RFull(GPRs[rt]) :: oR;
+ }
+ case (MOVN(rs, rt, rd)) -> {
+ (* XXX don't always write rd *)
+ if rs == 0 then () else iR := RFull(GPRs[rs]) :: iR;
+ if rt == 0 then () else iR := RFull(GPRs[rt]) :: iR;
+ if rd == 0 then () else oR := RFull(GPRs[rd]) :: oR;
+ }
+ case (MOVZ(rs, rt, rd)) -> {
+ (* XXX don't always write rd *)
+ if rs == 0 then () else iR := RFull(GPRs[rs]) :: iR;
+ if rt == 0 then () else iR := RFull(GPRs[rt]) :: iR;
+ if rd == 0 then () else oR := RFull(GPRs[rd]) :: oR;
+ }
+ case (MFHI(rd)) -> {
+ iR := RFull("HI") :: iR;
+ if rd == 0 then () else oR := RFull(GPRs[rd]) :: oR;
+ }
+ case (MFLO(rd)) -> {
+ iR := RFull("LO") :: iR;
+ if rd == 0 then () else oR := RFull(GPRs[rd]) :: oR;
+ }
+ case (MTHI(rs)) -> {
+ oR := RFull("HI") :: oR;
+ if rs == 0 then () else iR := RFull(GPRs[rs]) :: iR;
+ }
+ case (MTLO(rs)) -> {
+ oR := RFull("LO") :: oR;
+ if rs == 0 then () else iR := RFull(GPRs[rs]) :: iR;
+ }
+ case (MUL(rs, rt, rd)) -> {
+ if rs == 0 then () else iR := RFull(GPRs[rs]) :: iR;
+ if rt == 0 then () else iR := RFull(GPRs[rt]) :: iR;
+ if rd == 0 then () else oR := RFull(GPRs[rd]) :: oR;
+ }
+ case (MULT(rs, rt)) -> {
+ if rs == 0 then () else iR := RFull(GPRs[rs]) :: iR;
+ if rt == 0 then () else iR := RFull(GPRs[rt]) :: iR;
+ oR := RFull("HI") :: RFull ("LO") :: oR;
+ }
+ case (MULTU(rs, rt)) -> {
+ if rs == 0 then () else iR := RFull(GPRs[rs]) :: iR;
+ if rt == 0 then () else iR := RFull(GPRs[rt]) :: iR;
+ oR := RFull("HI") :: RFull ("LO") :: oR;
+ }
+ case (DMULT(rs, rt)) -> {
+ if rs == 0 then () else iR := RFull(GPRs[rs]) :: iR;
+ if rt == 0 then () else iR := RFull(GPRs[rt]) :: iR;
+ oR := RFull("HI") :: RFull ("LO") :: oR;
+ }
+ case (DMULTU(rs, rt)) -> {
+ if rs == 0 then () else iR := RFull(GPRs[rs]) :: iR;
+ if rt == 0 then () else iR := RFull(GPRs[rt]) :: iR;
+ oR := RFull("HI") :: RFull ("LO") :: oR;
+ }
+ case (MADD(rs, rt)) -> {
+ if rs == 0 then () else iR := RFull(GPRs[rs]) :: iR;
+ if rt == 0 then () else iR := RFull(GPRs[rt]) :: iR;
+ iR := RFull("HI") :: RFull ("LO") :: iR;
+ oR := RFull("HI") :: RFull ("LO") :: oR;
+ }
+ case (MADDU(rs, rt)) -> {
+ if rs == 0 then () else iR := RFull(GPRs[rs]) :: iR;
+ if rt == 0 then () else iR := RFull(GPRs[rt]) :: iR;
+ iR := RFull("HI") :: RFull ("LO") :: iR;
+ oR := RFull("HI") :: RFull ("LO") :: oR;
+ }
+ case (MSUB(rs, rt)) -> {
+ if rs == 0 then () else iR := RFull(GPRs[rs]) :: iR;
+ if rt == 0 then () else iR := RFull(GPRs[rt]) :: iR;
+ iR := RFull("HI") :: RFull ("LO") :: iR;
+ oR := RFull("HI") :: RFull ("LO") :: oR;
+ }
+ case (MSUBU(rs, rt)) -> {
+ if rs == 0 then () else iR := RFull(GPRs[rs]) :: iR;
+ if rt == 0 then () else iR := RFull(GPRs[rt]) :: iR;
+ iR := RFull("HI") :: RFull ("LO") :: iR;
+ oR := RFull("HI") :: RFull ("LO") :: oR;
+ }
+ case (DIV(rs, rt)) -> {
+ if rs == 0 then () else iR := RFull(GPRs[rs]) :: iR;
+ if rt == 0 then () else iR := RFull(GPRs[rt]) :: iR;
+ oR := RFull("HI") :: RFull ("LO") :: oR;
+ }
+ case (DIVU(rs, rt)) -> {
+ if rs == 0 then () else iR := RFull(GPRs[rs]) :: iR;
+ if rt == 0 then () else iR := RFull(GPRs[rt]) :: iR;
+ oR := RFull("HI") :: RFull ("LO") :: oR;
+ }
+ case (DDIV(rs, rt)) -> {
+ if rs == 0 then () else iR := RFull(GPRs[rs]) :: iR;
+ if rt == 0 then () else iR := RFull(GPRs[rt]) :: iR;
+ oR := RFull("HI") :: RFull ("LO") :: oR;
+ }
+ case (DDIVU(rs, rt)) -> {
+ if rs == 0 then () else iR := RFull(GPRs[rs]) :: iR;
+ if rt == 0 then () else iR := RFull(GPRs[rt]) :: iR;
+ oR := RFull("HI") :: RFull ("LO") :: oR;
+ }
+ case (J(offset)) -> {
+ (* XXX actually unconditional jump *)
+ (*ik := IK_cond_branch;*)
+ Dia := DIAFP_concrete((PC + 4)[63..28] : offset : 0b00);
+ }
+ case (JAL(offset)) -> {
+ (* XXX actually unconditional jump *)
+ (*ik := IK_cond_branch;*)
+ oR := RFull("GPR31") :: oR;
+ Dia := DIAFP_concrete((PC + 4)[63..28] : offset : 0b00);
+ }
+ case (JR(rs)) -> {
+ (* XXX actually unconditional jump *)
+ (*ik := IK_cond_branch;*)
+ iR := RFull(GPRs[rs]) :: iR;
+ Dia := DIAFP_reg(RFull(GPRs[rs]));
+ }
+ case (JALR(rs, rd)) -> {
+ (* XXX actually unconditional jump *)
+ (*ik := IK_cond_branch;*)
+ iR := RFull(GPRs[rs]) :: iR;
+ oR := RFull("GPR31") :: oR;
+ Dia := DIAFP_reg(RFull(GPRs[rs]));
+ }
+ case (BEQ(rs, rd, imm, ne, likely)) -> {
+ ik := IK_cond_branch;
+ if rs == 0 then () else iR := RFull(GPRs[rs]) :: iR;
+ if rd == 0 then () else iR := RFull(GPRs[rd]) :: iR;
+ let (bit[64]) offset = (EXTS(imm : 0b00) + 4) in
+ Dia := DIAFP_concrete (PC + offset);
+ }
+ case (BCMPZ(rs, imm, cmp, link, likely)) -> {
+ ik := IK_cond_branch;
+ if rs == 0 then () else iR := RFull(GPRs[rs]) :: iR;
+ if link then
+ oR := RFull("GPR31") :: oR;
+ let (bit[64]) offset = (EXTS(imm : 0b00) + 4) in
+ Dia := DIAFP_concrete (PC + offset);
+ }
+ case (SYSCALL_THREAD_START) -> ()
+(*
+
+ case (SYSCALL) =
+ case (BREAK) =
+ case (WAIT) = {
+ case (TRAPREG(rs, rt, cmp)) =
+ case (TRAPIMM(rs, imm, cmp)) =
+*)
+ case (Load(width, signed, linked, base, rt, offset)) -> {
+ ik := IK_mem_read (if linked then Read_reserve else Read_plain);
+ if linked then oR := RFull("CP0LLBit")::RFull("CP0LLAddr")::oR else ();
+ if base == 0 then () else aR := RFull(GPRs[base]) :: aR;
+ iR := aR;
+ if rt == 0 then () else oR := RFull(GPRs[rt]) :: oR;
+ }
+ case (Store(width, conditional, base, rt, offset)) -> {
+ ik := IK_mem_write(if conditional then Write_conditional else Write_plain);
+ if base == 0 then () else aR := RFull(GPRs[base]) :: aR;
+ iR := aR;
+ if conditional then iR := RFull("CP0LLBit")::iR else ();
+ if (conditional & (rt != 0)) then oR := RFull(GPRs[rt])::oR else ();
+ if rt == 0 then () else iR := RFull(GPRs[rt]) :: iR;
+ }
+ case (LWL(base, rt, offset)) -> {
+ ik := IK_mem_read(Read_plain);
+ if base == 0 then () else aR := RFull(GPRs[base]) :: aR;
+ iR := aR;
+ if rt == 0 then () else oR := RFull(GPRs[rt]) :: oR;
+ }
+ case (LWR(base, rt, offset)) -> {
+ ik := IK_mem_read(Read_plain);
+ if base == 0 then () else aR := RFull(GPRs[base]) :: aR;
+ iR := aR;
+ if rt == 0 then () else oR := RFull(GPRs[rt]) :: oR;
+ }
+ case (SWL(base, rt, offset)) -> {
+ ik := IK_mem_write(Write_plain);
+ if base == 0 then () else aR := RFull(GPRs[base]) :: aR;
+ iR := aR;
+ if rt == 0 then () else iR := RFull(GPRs[rt]) :: iR;
+ }
+ case (SWR(base, rt, offset)) -> {
+ ik := IK_mem_write(Write_plain);
+ if base == 0 then () else aR := RFull(GPRs[base]) :: aR;
+ iR := aR;
+ if rt == 0 then () else iR := RFull(GPRs[rt]) :: iR;
+ }
+ case (LDL(base, rt, offset)) -> {
+ ik := IK_mem_read(Read_plain);
+ if base == 0 then () else aR := RFull(GPRs[base]) :: aR;
+ iR := aR;
+ if rt == 0 then () else oR := RFull(GPRs[rt]) :: oR;
+ }
+ case (LDR(base, rt, offset)) -> {
+ ik := IK_mem_read(Read_plain);
+ if base == 0 then () else aR := RFull(GPRs[base]) :: aR;
+ iR := aR;
+ if rt == 0 then () else oR := RFull(GPRs[rt]) :: oR;
+ }
+ case (SDL(base, rt, offset)) -> {
+ ik := IK_mem_write(Write_plain);
+ if base == 0 then () else aR := RFull(GPRs[base]) :: aR;
+ iR := aR;
+ if rt == 0 then () else iR := RFull(GPRs[rt]) :: iR;
+ }
+ case (SDR(base, rt, offset)) -> {
+ ik := IK_mem_write(Write_plain);
+ if base == 0 then () else aR := RFull(GPRs[base]) :: aR;
+ iR := aR;
+ if rt == 0 then () else iR := RFull(GPRs[rt]) :: iR;
+ }
+(*
+ case (CACHE(base, op, imm)) =
+ case (PREF(base, op, imm)) =
+*)
+ case (SYNC) -> {
+ iK := IK_barrier(Barrier_MIPS_SYNC);
+ }
+(*
+ case (MFC0(rt, rd, sel, double))
+ case (HCF)
+ case (MTC0(rt, rd, sel, double))
+ case (TLBWI)
+ case (TLBWR)
+ case (TLBR)
+ case ((TLBP))
+ case (RDHWR(rt, rd))
+ case (ERET)
+*)
+ };
+ (iR,oR,aR,Nias,Dia,ik)
+}