summaryrefslogtreecommitdiff
path: root/src/test
diff options
context:
space:
mode:
Diffstat (limited to 'src/test')
-rw-r--r--src/test/power.sail59
1 files changed, 18 insertions, 41 deletions
diff --git a/src/test/power.sail b/src/test/power.sail
index 7a66cb20..3c9a13e3 100644
--- a/src/test/power.sail
+++ b/src/test/power.sail
@@ -163,8 +163,7 @@ let (vector <0, 32, inc, (register<(bit[64])>) >) GPR =
GPR21, GPR22, GPR23, GPR24, GPR25, GPR26, GPR27, GPR28, GPR29, GPR30, GPR31
]
-(* adapted to make type checker accept SPR definition *)
-register (bit[(* 32 *) 0:63]) VRSAVE
+register (bit[32:63]) VRSAVE
register (bit[64]) SPRG3
register (bit[64]) SPRG4
@@ -173,7 +172,7 @@ register (bit[64]) SPRG6
register (bit[64]) SPRG7
let (vector <0, 1024, inc, (register<(bit[64])>) >) SPR =
- [ 1=XER, 8=LR, 9=CTR, 256=VRSAVE, 259=SPRG3, 260=SPRG4, 261=SPRG5, 262=SPRG6, 263=SPRG7
+ [ 1=XER, 8=LR, 9=CTR(*, 256=VRSAVE (*32 bit, so not 64, caught by type checker at last*)*), 259=SPRG3, 260=SPRG4, 261=SPRG5, 262=SPRG6, 263=SPRG7
]
(* XXX DCR is implementation-dependent; also, some DCR are only 32 bits
@@ -299,7 +298,7 @@ function bit[64] DOUBLE word = {
} else if word[1..8] == 0 & word[9..31] != 0
then {
sign := word[0];
- exp := 0 - 126;
+ exp := -126;
(bit[53]) frac := 0b0 : word[9..31] : 0b00000000000000000000000000000;
foreach (i from 0 to 52) {
if frac[0] == 0
@@ -308,7 +307,7 @@ function bit[64] DOUBLE word = {
else ()
};
temp[0] := sign;
- temp[1..11] := (bit[10]) exp + 1023;
+ temp[1..11] := (bit[11]) exp + 1023;
temp[12..63] := frac[1..52];
} else {
temp[0..1] := word[0..1];
@@ -328,7 +327,7 @@ function bit[32] SINGLE ((bit[64]) frs) = {
else if (874 <= frs[1..11]) & (frs[1..11] <= 896)
then {
sign := frs[0];
- (bit[10]) exp := frs[1..11] - 1023;
+ (bit[11]) exp := frs[1..11] - 1023;
(bit[53]) frac := 0b1 : frs[12..63];
foreach (i from 0 to 53) {
if exp < (0 - 126)
@@ -1422,7 +1421,6 @@ function clause execute (Stdux (RS, RA, RB)) =
MEMw(EA,8) := GPR[RS]
}
-(*
union ast member (bit[5], bit[5], bit[12], bit[4]) Lq
function clause decode (0b111000 :
@@ -1450,9 +1448,7 @@ function clause execute (Lq (RTp, RA, DQ, PT)) =
GPR[RTp + 1] := bytereverse[64 .. 127]
}
}
-*)
-(*
union ast member (bit[5], bit[5], bit[14]) Stq
function clause decode (0b111110 :
@@ -1462,7 +1458,6 @@ function clause decode (0b111110 :
0b10 as instr) =
Stq (RSp,RA,DS)
-
function clause execute (Stq (RSp, RA, DS)) =
{
(bit[64]) b := 0;
@@ -1481,7 +1476,6 @@ function clause execute (Stq (RSp, RA, DS)) =
EA := b + EXTS (DS : 0b00);
MEMw(EA,8) := RSp
}
-*)
union ast member (bit[5], bit[5], bit[5]) Lhbrx
@@ -2229,7 +2223,6 @@ function clause execute (Mullw (RT, RA, RB, OE, Rc)) =
if OE then set_SO_OV (overflow) else ()
}
-(*
union ast member (bit[5], bit[5], bit[5], bit) Mulhw
function clause decode (0b011111 :
@@ -2251,7 +2244,7 @@ function clause execute (Mulhw (RT, RA, RB, Rc)) =
overflow := o
};
(GPR[RT])[32..63] := prod[0 .. 31];
- (GPR[RT])[0..31] := undefined;
+ (GPR[RT])[0..31] := (bit[32]) undefined;
if Rc
then {
xer_so := XER.SO;
@@ -2261,9 +2254,7 @@ function clause execute (Mulhw (RT, RA, RB, Rc)) =
}
else ()
}
-*)
-(*
union ast member (bit[5], bit[5], bit[5], bit) Mulhwu
function clause decode (0b011111 :
@@ -2279,7 +2270,7 @@ function clause execute (Mulhwu (RT, RA, RB, Rc)) =
{
(bit[64]) prod := (GPR[RA])[32 .. 63] * (GPR[RB])[32 .. 63];
(GPR[RT])[32..63] := prod[0 .. 31];
- (GPR[RT])[0..31] := undefined;
+ (GPR[RT])[0..31] := (bit[32]) undefined;
if Rc
then {
xer_so := XER.SO;
@@ -2289,9 +2280,7 @@ function clause execute (Mulhwu (RT, RA, RB, Rc)) =
}
else ()
}
-*)
-(*
union ast member (bit[5], bit[5], bit[5], bit, bit) Divw
function clause decode (0b011111 :
@@ -2316,7 +2305,7 @@ function clause execute (Divw (RT, RA, RB, OE, Rc)) =
overflow := o
};
(GPR[RT])[32..63] := divided[32 .. 63];
- (GPR[RT])[0..31] := undefined;
+ (GPR[RT])[0..31] := (bit[32]) undefined;
if Rc
then {
xer_so := XER.SO;
@@ -2329,7 +2318,6 @@ function clause execute (Divw (RT, RA, RB, OE, Rc)) =
if OE then set_SO_OV (overflow) else ()
}
-
union ast member (bit[5], bit[5], bit[5], bit, bit) Divwu
function clause decode (0b011111 :
@@ -2354,7 +2342,7 @@ function clause execute (Divwu (RT, RA, RB, OE, Rc)) =
overflow := o
};
(GPR[RT])[32..63] := divided[32 .. 63];
- (GPR[RT])[0..31] := undefined;
+ (GPR[RT])[0..31] := (bit[32]) undefined;
if Rc
then {
xer_so := XER.SO;
@@ -2392,7 +2380,7 @@ function clause execute (Divwe (RT, RA, RB, OE, Rc)) =
overflow := o
};
(GPR[RT])[32..63] := divided[32 .. 63];
- (GPR[RT])[0..31] := undefined;
+ (GPR[RT])[0..31] := (bit[32]) undefined;
if Rc
then {
xer_so := XER.SO;
@@ -2430,7 +2418,7 @@ function clause execute (Divweu (RT, RA, RB, OE, Rc)) =
overflow := o
};
(GPR[RT])[32..63] := divided[32 .. 63];
- (GPR[RT])[0..31] := undefined;
+ (GPR[RT])[0..31] := (bit[32]) undefined;
if Rc
then {
xer_so := XER.SO;
@@ -2442,7 +2430,6 @@ function clause execute (Divweu (RT, RA, RB, OE, Rc)) =
else ();
if OE then set_SO_OV (overflow) else ()
}
-*)
union ast member (bit[5], bit[5], bit[5], bit, bit) Mulld
@@ -2745,7 +2732,6 @@ function clause execute (Cmpl (BF, L, RA, RB)) =
CR[4 * BF + 32..4 * BF + 35] := c : [XER.SO]
}
-(*
union ast member (bit[5], bit[5], bit[16]) Twi
function clause decode (0b000011 :
@@ -2784,7 +2770,6 @@ function clause execute (Tw (TO, RA, RB)) =
if a <_u b & TO[3] then trap () else ();
if a >_u b & TO[4] then trap () else ()
}
-*)
union ast member (bit[5], bit[5], bit[16]) Tdi
@@ -3413,7 +3398,7 @@ function clause execute (Rldic (RS, RA, sh, mb, Rc)) =
n := [sh[5]] : sh[0 .. 4];
r := ROTL (GPR[RS],n);
b := [mb[5]] : mb[0 .. 4];
- m := MASK (b,(bit[5]) (~ (n)));
+ m := MASK (b,(bit[6]) (~ (n)));
(bit[64]) temp := (r & m);
GPR[RA] := temp;
if Rc then set_overflow_cr0 (temp,XER.SO) else ()
@@ -3480,7 +3465,7 @@ function clause execute (Rldimi (RS, RA, sh, mb, Rc)) =
n := [sh[5]] : sh[0 .. 4];
r := ROTL (GPR[RS],n);
b := [mb[5]] : mb[0 .. 4];
- m := MASK (b,(bit[5]) (~ (n)));
+ m := MASK (b,(bit[6]) (~ (n)));
(bit[64]) temp := (r & m | GPR[RA] & ~ (m));
GPR[RA] := temp;
if Rc then set_overflow_cr0 (temp,XER.SO) else ()
@@ -3640,7 +3625,7 @@ function clause execute (Sradi (RS, RA, sh, Rc)) =
(bit[64]) temp := (r & m | s ^^ 64 & ~ (m));
GPR[RA] := temp;
if Rc then set_overflow_cr0 (temp,XER.SO) else ();
- XER.CA := if n >_u (bit[5]) 0 then s & ~ ((r & ~ (m)) == 0) else 0
+ XER.CA := if n >_u (bit[6]) 0 then s & ~ ((r & ~ (m)) == 0) else 0
}
union ast member (bit[5], bit[5], bit[5], bit) Srad
@@ -3664,7 +3649,7 @@ function clause execute (Srad (RS, RA, RB, Rc)) =
(bit[64]) temp := (r & m | s ^^ 64 & ~ (m));
GPR[RA] := temp;
if Rc then set_overflow_cr0 (temp,XER.SO) else ();
- XER.CA := if n >_u (bit[5]) 0 then s & ~ ((r & ~ (m)) == 0) else 0
+ XER.CA := if n >_u (bit[6]) 0 then s & ~ ((r & ~ (m)) == 0) else 0
}
union ast member (bit[5], bit[5]) Cdtbcd
@@ -3769,7 +3754,7 @@ function clause execute (Mtspr (RS, spr)) =
}
else if length (SPR[n]) == 64
then SPR[n] := GPR[RS]
- else SPR[n] := (GPR[RS])[32 .. 63]
+ else SPR[n] := ((bit[32]) 0):(GPR[RS])[32 .. 63]
}
union ast member (bit[5], bit[10]) Mfspr
@@ -5920,7 +5905,6 @@ function clause decode (0b011111 :
function clause execute (Lvsr (VRT, RA, RB)) = ()
-(*
union ast member (bit[5], bit[5], bit[5]) Vpkpx
function clause decode (0b000100 :
@@ -5943,7 +5927,6 @@ function clause execute (Vpkpx (VRT, VRA, VRB)) =
(VR[VRT])[i + 75..i + 79] := (VR[VRB])[i * 2 + 24 .. i * 2 + 28]
}
-
union ast member (bit[5], bit[5], bit[5]) Vpkshss
function clause decode (0b000100 :
@@ -6022,7 +6005,6 @@ function clause execute (Vpkswus (VRT, VRA, VRB)) =
31]
}
-
union ast member (bit[5], bit[5], bit[5]) Vpkuhum
function clause decode (0b000100 :
@@ -6039,7 +6021,6 @@ function clause execute (Vpkuhum (VRT, VRA, VRB)) =
(VR[VRT])[i + 64..i + 71] := (VR[VRB])[i * 2 + 8 .. i * 2 + 15]
}
-
union ast member (bit[5], bit[5], bit[5]) Vpkuhus
function clause decode (0b000100 :
@@ -6058,7 +6039,6 @@ function clause execute (Vpkuhus (VRT, VRA, VRB)) =
(Clamp (EXTZ ((VR[VRB])[i * 2 .. i * 2 + 15]),0,255))[24 .. 31]
}
-
union ast member (bit[5], bit[5], bit[5]) Vpkuwum
function clause decode (0b000100 :
@@ -6075,7 +6055,6 @@ function clause execute (Vpkuwum (VRT, VRA, VRB)) =
(VR[VRT])[i + 64..i + 79] := (VR[VRB])[i * 2 + 16 .. i * 2 + 31]
}
-
union ast member (bit[5], bit[5], bit[5]) Vpkuwus
function clause decode (0b000100 :
@@ -10376,8 +10355,6 @@ function clause decode (0b011111 :
Dcbf (L,RA,RB)
function clause execute (Dcbf (L, RA, RB)) = ()
-*)
-
union ast member Isync
@@ -10640,8 +10617,8 @@ function bit illegal_instructions_pred ((ast) instr) = {
case (Stfdp(FRSp,RA,DS)) -> (FRSp mod 2 == 1)
case (Lfdpx(FRTp,RA,RB)) -> (FRTp mod 2 == 1)
case (Stfdpx(FRSp,RA,RB)) -> (FRSp mod 2 == 1)
- (*case (Lq(RTp,RA,DQ,Pt)) -> ((RTp mod 2 ==1) | RTp == RA)
- case (Stq(RSp,RA,RS)) -> (RSp mod 2 == 1) *)
+ case (Lq(RTp,RA,DQ,Pt)) -> ((RTp mod 2 ==1) | RTp == RA)
+ case (Stq(RSp,RA,RS)) -> (RSp mod 2 == 1)
case (Mtspr(RS, spr)) ->
~ ((spr == 1) | (spr == 8) | (spr == 9) | (spr == 256) |
(spr == 512) | (spr == 896) | (spr == 898))