summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Norton2016-11-07 12:17:51 +0000
committerRobert Norton2016-11-08 12:27:56 +0000
commita6dd161641e03fd788308d09cc86a1f51b776b9b (patch)
treeb0c4934ffba0e48050bf2fb9d5b92f4580408e57
parentc187384c60b72b754a51be97d655762c053ea24d (diff)
add mips thread start instruction.
-rw-r--r--mips/hgen/ast.hgen1
-rw-r--r--mips/hgen/fold.hgen1
-rw-r--r--mips/hgen/map.hgen1
-rw-r--r--mips/hgen/pretty.hgen2
-rw-r--r--mips/hgen/sail_trans_out.hgen1
-rw-r--r--mips/hgen/trans_sail.hgen2
-rw-r--r--mips/mips_insts.sail6
-rw-r--r--mips/mips_regfp.sail1
8 files changed, 14 insertions, 1 deletions
diff --git a/mips/hgen/ast.hgen b/mips/hgen/ast.hgen
index 1e70d949..a251adff 100644
--- a/mips/hgen/ast.hgen
+++ b/mips/hgen/ast.hgen
@@ -1,3 +1,4 @@
+| `MIPSThreadStart
| `MIPSRType of mipsRTypeOp * reg * reg * reg
| `MIPSIType of mipsITypeOp * reg * reg * bit16
| `MIPSShiftI of mipsShiftIOp * reg * reg * bit5
diff --git a/mips/hgen/fold.hgen b/mips/hgen/fold.hgen
index fb2f6de2..05b9c808 100644
--- a/mips/hgen/fold.hgen
+++ b/mips/hgen/fold.hgen
@@ -1,3 +1,4 @@
+| `MIPSThreadStart -> (y_reg, y_sreg)
| `MIPSRType (op, rd, rs, rt) -> fold_reg rt (fold_reg rs (fold_reg rd (y_reg, y_sreg)))
| `MIPSIType (op, rs, rt, imm) -> fold_reg rs (fold_reg rt (y_reg, y_sreg))
| `MIPSShiftI (op, rd, rt, imm) -> fold_reg rt (fold_reg rd (y_reg, y_sreg))
diff --git a/mips/hgen/map.hgen b/mips/hgen/map.hgen
index 5c6cde6a..f5116bae 100644
--- a/mips/hgen/map.hgen
+++ b/mips/hgen/map.hgen
@@ -1,3 +1,4 @@
+| `MIPSThreadStart -> `MIPSThreadStart
| `MIPSRType (op, rd, rs, rt) -> `MIPSRType (op, map_reg rd, map_reg rs, map_reg rt)
| `MIPSIType (op, rs, rt, imm) -> `MIPSIType (op, map_reg rs, map_reg rt, imm)
| `MIPSShiftI (op, rd, rt, imm) -> `MIPSShiftI (op, map_reg rd, map_reg rt, imm)
diff --git a/mips/hgen/pretty.hgen b/mips/hgen/pretty.hgen
index d9b94def..e4bc0b6d 100644
--- a/mips/hgen/pretty.hgen
+++ b/mips/hgen/pretty.hgen
@@ -1,4 +1,4 @@
-| `MIPSThreadStart -> "START" (* TODO *)
+| `MIPSThreadStart -> "syscall 0xfffff" (* thread start *)
| `MIPSStopFetching -> "STOP" (* TODO *)
| `MIPSRType (op, rd,rs,rt) ->
sprintf "%s %s,%s,%s" (pp_rtype_op op) (pp_reg rd) (pp_reg rs) (pp_reg rt)
diff --git a/mips/hgen/sail_trans_out.hgen b/mips/hgen/sail_trans_out.hgen
index 2911137e..6c956675 100644
--- a/mips/hgen/sail_trans_out.hgen
+++ b/mips/hgen/sail_trans_out.hgen
@@ -1,3 +1,4 @@
+| ("SYSCALL_THREAD_START", []) -> `MIPSThreadStart
| ("ADD" , [rs; rt; rd]) -> `MIPSRType (MIPSROpADD , (translate_out_ireg rd), (translate_out_ireg rs), (translate_out_ireg rt))
| ("ADDU" , [rs; rt; rd]) -> `MIPSRType (MIPSROpADDU , (translate_out_ireg rd), (translate_out_ireg rs), (translate_out_ireg rt))
| ("AND" , [rs; rt; rd]) -> `MIPSRType (MIPSROpAND , (translate_out_ireg rd), (translate_out_ireg rs), (translate_out_ireg rt))
diff --git a/mips/hgen/trans_sail.hgen b/mips/hgen/trans_sail.hgen
index 4b7c7882..9a34ff49 100644
--- a/mips/hgen/trans_sail.hgen
+++ b/mips/hgen/trans_sail.hgen
@@ -1,3 +1,5 @@
+| `MIPSThreadStart ->
+ ("SYSCALL_THREAD_START", [], [])
| `MIPSStopFetching ->
("ImplementationDefinedStopFetching",
[],
diff --git a/mips/mips_insts.sail b/mips/mips_insts.sail
index fac2aa52..60ef8f2f 100644
--- a/mips/mips_insts.sail
+++ b/mips/mips_insts.sail
@@ -1008,6 +1008,12 @@ function clause execute (BCMPZ(rs, imm, cmp, link, likely)) =
(* SYSCALL/BREAK/WAIT/Trap *)
(**************************************************************************************)
+(* Co-opt syscall 0xfffff for use as thread start in pccmem *)
+union ast member unit SYSCALL_THREAD_START
+function clause decode (0b000000 : 0xfffff : 0b001100) =
+ Some(SYSCALL_THREAD_START)
+function clause execute (SYSCALL_THREAD_START) = ()
+
union ast member unit SYSCALL
function clause decode (0b000000 : (bit[20]) code : 0b001100) =
Some(SYSCALL) (* code is ignored *)
diff --git a/mips/mips_regfp.sail b/mips/mips_regfp.sail
index 390aa82b..b1a86b56 100644
--- a/mips/mips_regfp.sail
+++ b/mips/mips_regfp.sail
@@ -326,6 +326,7 @@ function (regfps,regfps,regfps,niafps,diafp,instruction_kind) initial_analysis (
let (bit[64]) offset = (EXTS(imm : 0b00) + 4) in
Dia := DIAFP_concrete (PC + offset);
}
+ case (SYSCALL_THREAD_START) -> ()
(*
case (SYSCALL) =