diff options
| author | Kathy Gray | 2014-11-12 14:45:49 +0000 |
|---|---|---|
| committer | Kathy Gray | 2014-11-12 14:45:49 +0000 |
| commit | fa1fca03d9e62d01587166506cccba7895f3a2b0 (patch) | |
| tree | f7f849758b55121823c234f22559c57452d03a64 /src/test | |
| parent | b24b4f40cb7c907ac3c93c6036703ab708e164c0 (diff) | |
Stop overzealously looking for constructors, only when the type suggests to
Diffstat (limited to 'src/test')
| -rw-r--r-- | src/test/power.sail | 78 |
1 files changed, 75 insertions, 3 deletions
diff --git a/src/test/power.sail b/src/test/power.sail index 4305c099..5f4783ce 100644 --- a/src/test/power.sail +++ b/src/test/power.sail @@ -427,6 +427,20 @@ function clause execute (Bclr (BO, BI, BH, LK)) = if LK then LR := CIA + 4 else () } +union ast member (bit[7]) Sc + +function clause decode (0b010001 : +(bit[5]) _ : +(bit[5]) _ : +(bit[4]) _ : +(bit[7]) LEV : +(bit[3]) _ : +0b1 : +(bit[1]) _ as instr) = + Sc (LEV) + +function clause execute (Sc (LEV)) = () + union ast member (bit[5], bit[5], bit[16]) Lwz function clause decode (0b100000 : @@ -538,9 +552,9 @@ function clause execute (Lswi (RT, RA, NB)) = { (bit[64]) EA := 0; if RA == 0 then EA := 0 else EA := GPR[RA]; - (range<0, 32> ) r := 0; + ([|32|]) r := 0; r := RT - 1; - (range<0, 32> ) size := if NB == 0 then 32 else NB; + ([|32|]) size := if NB == 0 then 32 else NB; (bit[256]) membuffer := MEMr (EA,size); j := 0; i := 32; @@ -548,7 +562,7 @@ function clause execute (Lswi (RT, RA, NB)) = { if i == 32 then { - r := (range<0, 32> ) (r + 1) mod 32; + r := ([|32|]) (r + 1) mod 32; GPR[r] := 0 } else (); @@ -584,6 +598,24 @@ function clause execute (Addis (RT, RA, SI)) = then GPR[RT] := EXTS (SI : 0b0000000000000000) else GPR[RT] := GPR[RA] + EXTS (SI : 0b0000000000000000) +union ast member (bit[5], bit[5], bit[5], bit, bit) Add + +function clause decode (0b011111 : +(bit[5]) RT : +(bit[5]) RA : +(bit[5]) RB : +[OE] : +0b100001010 : +[Rc] as instr) = + Add (RT,RA,RB,OE,Rc) + +function clause execute (Add (RT, RA, RB, OE, Rc)) = + { + temp := GPR[RA] + GPR[RB]; + GPR[RT] := temp; + if Rc then set_overflow_cr0 (temp) else () + } + union ast member (bit[5], bit[5], bit[5], bit, bit) Subf function clause decode (0b011111 : @@ -602,6 +634,26 @@ function clause execute (Subf (RT, RA, RB, OE, Rc)) = if Rc then set_overflow_cr0 (temp) else () } +union ast member (bit[5], bit[5], bit[16]) Addic + +function clause decode (0b001100 : +(bit[5]) RT : +(bit[5]) RA : +(bit[16]) SI as instr) = + Addic (RT,RA,SI) + +function clause execute (Addic (RT, RA, SI)) = GPR[RT] := GPR[RA] + EXTS (SI) + +union ast member (bit[5], bit[5], bit[16]) Addic + +function clause decode (0b001101 : +(bit[5]) RT : +(bit[5]) RA : +(bit[16]) SI as instr) = + Addic (RT,RA,SI) + +function clause execute (Addic (RT, RA, SI)) = GPR[RT] := GPR[RA] + EXTS (SI) + union ast member (bit[5], bit[5], bit, bit) Neg function clause decode (0b011111 : @@ -638,6 +690,26 @@ function clause execute (Mullw (RT, RA, RB, OE, Rc)) = if Rc then set_overflow_cr0 (temp) else () } +union ast member (bit[3], bit, bit[5], bit[16]) Cmpi + +function clause decode (0b001011 : +(bit[3]) BF : +(bit[1]) _ : +[L] : +(bit[5]) RA : +(bit[16]) SI as instr) = + Cmpi (BF,L,RA,SI) + +function clause execute (Cmpi (BF, L, RA, SI)) = + { + (bit[64]) a := 0; + if L == 0 then a := EXTS ((GPR[RA])[32 .. 63]) else a := GPR[RA]; + if a < EXTS (SI) + then c := 0b100 + else if a > EXTS (SI) then c := 0b010 else c := 0b001; + CR[4 * BF + 32..4 * BF + 35] := c : [XER.SO] + } + union ast member (bit[3], bit, bit[5], bit[5]) Cmp function clause decode (0b011111 : |
