diff options
| author | Gabriel Kerneis | 2014-07-02 10:21:51 +0100 |
|---|---|---|
| committer | Gabriel Kerneis | 2014-07-02 10:21:51 +0100 |
| commit | e197f0cc7057074714c6aa45a43b2a1f62d51f57 (patch) | |
| tree | 88e88d52439ad625fde09a99986ccbbc58626fb0 /src/test | |
| parent | e90916704f026596f809f4dc578215180082dfdc (diff) | |
Update Power example
Diffstat (limited to 'src/test')
| -rw-r--r-- | src/test/power.sail | 404 |
1 files changed, 312 insertions, 92 deletions
diff --git a/src/test/power.sail b/src/test/power.sail index a9e56c7f..59a529e3 100644 --- a/src/test/power.sail +++ b/src/test/power.sail @@ -1,11 +1,18 @@ -val extern forall Nat 'n. bit['n] -> bit[64] effect pure exts +val extern forall Nat 'n. bit['n] -> bit[64] effect pure EXTS + (* XXX binary coded decimal *) -function forall Type 'a . 'a dec_to_bcd ( x ) = x -function forall Type 'a . 'a bcd_to_dec ( x ) = x +function forall Type 'a . 'a DEC_TO_BCD ( x ) = x +function forall Type 'a . 'a BCD_TO_DEC ( x ) = x (* XXX carry out *) function bit carry_out ( x ) = bitzero (* XXX length *) function nat length ( x ) = 64 +(* XXX break *) +function unit break () = () + +function forall Nat 'n, Nat 'm . + bit['m] EXTS_EXPLICIT((bit['n]) v, ([|'m|]) m) = + (v[0] ^^ (m - length(v))) : v val forall Nat 'n, Nat 'm, 0 <= 'n, 'n <= 'm, 'm <= 63 . ([|'n|],[|'m|]) -> bit[64] @@ -21,51 +28,27 @@ function (bit[64]) MASK(start, stop) = { mask[start .. stop ] := bitone ^^ (stop - start + 1); }; mask; -} - -register (vector <0, 64, inc, bit>) GPR0 -register (vector <0, 64, inc, bit>) GPR1 -register (vector <0, 64, inc, bit>) GPR2 -register (vector <0, 64, inc, bit>) GPR3 -register (vector <0, 64, inc, bit>) GPR4 -register (vector <0, 64, inc, bit>) GPR5 -register (vector <0, 64, inc, bit>) GPR6 -register (vector <0, 64, inc, bit>) GPR7 -register (vector <0, 64, inc, bit>) GPR8 -register (vector <0, 64, inc, bit>) GPR9 -register (vector <0, 64, inc, bit>) GPR10 -register (vector <0, 64, inc, bit>) GPR11 -register (vector <0, 64, inc, bit>) GPR12 -register (vector <0, 64, inc, bit>) GPR13 -register (vector <0, 64, inc, bit>) GPR14 -register (vector <0, 64, inc, bit>) GPR15 -register (vector <0, 64, inc, bit>) GPR16 -register (vector <0, 64, inc, bit>) GPR17 -register (vector <0, 64, inc, bit>) GPR18 -register (vector <0, 64, inc, bit>) GPR19 -register (vector <0, 64, inc, bit>) GPR20 -register (vector <0, 64, inc, bit>) GPR21 -register (vector <0, 64, inc, bit>) GPR22 -register (vector <0, 64, inc, bit>) GPR23 -register (vector <0, 64, inc, bit>) GPR24 -register (vector <0, 64, inc, bit>) GPR25 -register (vector <0, 64, inc, bit>) GPR26 -register (vector <0, 64, inc, bit>) GPR27 -register (vector <0, 64, inc, bit>) GPR28 -register (vector <0, 64, inc, bit>) GPR29 -register (vector <0, 64, inc, bit>) GPR30 -register (vector <0, 64, inc, bit>) GPR31 - -let (vector <0, 32, inc, (register<(vector<0, 64, inc, bit>)>) >) GPR = - [ GPR0, GPR1, GPR2, GPR3, GPR4, GPR5, GPR6, GPR7, GPR8, GPR9, GPR10, - GPR11, GPR12, GPR13, GPR14, GPR15, GPR16, GPR17, GPR18, GPR19, GPR20, - GPR21, GPR22, GPR23, GPR24, GPR25, GPR26, GPR27, GPR28, GPR29, GPR30, GPR31 - ] +} -register (bit[64]) NIA (* next instruction address *) -register (bit[64]) CIA (* current instruction address *) +val forall Nat 'n, 0 <= 'n, 'n <= 63 . + (bit[64], [|'n|]) -> bit[64] effect pure ROTL + +function (bit[64]) ROTL(v, n) = v[n .. 63] : v[0 .. (n-1)] + +(* Branch facility registers *) + +typedef cr = register bits [ 32 : 63 ] { + 32 .. 35 : CR0; (* LT, GT, EQ, SO -- fixed-point *) + 36 .. 39 : CR1; (* FX, FEX, VX, OX -- (decimal) floating-point *) + 40 .. 43 : CR2; + 44 .. 47 : CR3; + 48 .. 51 : CR4; + 52 .. 55 : CR5; + 56 .. 59 : CR6; (* LT, GT, EQ, SO -- vector *) + 60 .. 63 : CR7; +} +register (cr) CR -register (bit[32 : 63]) CR register (bit[64]) CTR register (bit[64]) LR @@ -76,12 +59,62 @@ typedef xer = register bits [ 0 : 63 ] { } register (xer) XER +(* Fixed-point registers *) + +register (bit[64]) GPR0 +register (bit[64]) GPR1 +register (bit[64]) GPR2 +register (bit[64]) GPR3 +register (bit[64]) GPR4 +register (bit[64]) GPR5 +register (bit[64]) GPR6 +register (bit[64]) GPR7 +register (bit[64]) GPR8 +register (bit[64]) GPR9 +register (bit[64]) GPR10 +register (bit[64]) GPR11 +register (bit[64]) GPR12 +register (bit[64]) GPR13 +register (bit[64]) GPR14 +register (bit[64]) GPR15 +register (bit[64]) GPR16 +register (bit[64]) GPR17 +register (bit[64]) GPR18 +register (bit[64]) GPR19 +register (bit[64]) GPR20 +register (bit[64]) GPR21 +register (bit[64]) GPR22 +register (bit[64]) GPR23 +register (bit[64]) GPR24 +register (bit[64]) GPR25 +register (bit[64]) GPR26 +register (bit[64]) GPR27 +register (bit[64]) GPR28 +register (bit[64]) GPR29 +register (bit[64]) GPR30 +register (bit[64]) GPR31 + +let (vector <0, 32, inc, (register<(bit[64])>) >) GPR = + [ GPR0, GPR1, GPR2, GPR3, GPR4, GPR5, GPR6, GPR7, GPR8, GPR9, GPR10, + GPR11, GPR12, GPR13, GPR14, GPR15, GPR16, GPR17, GPR18, GPR19, GPR20, + GPR21, GPR22, GPR23, GPR24, GPR25, GPR26, GPR27, GPR28, GPR29, GPR30, GPR31 + ] + +register (bit[32:63]) VRSAVE + +register (bit[64]) SPRG4 +register (bit[64]) SPRG5 +register (bit[64]) SPRG6 +register (bit[64]) SPRG7 (* XXX bogus, length should be 1024 with many more values - cf. mfspr - definition *) -let (vector <0, 10, inc, (register<(vector<0, 64, inc, bit>)>) >) SPR = - [ undefined, XER, undefined, undefined, undefined, undefined, undefined, undefined, LR, - CTR ] + definition - eg. SPRG4 to SPRG7 are at offsets 260 to 263, VRSAVE is 256, + etc. *) +let (vector <0, 10, inc, (register<(bit[64])>) >) SPR = + [ undefined, XER, undefined, undefined, + undefined, undefined, undefined, undefined, + LR, CTR + ] (* XXX bogus, DCR might be numbered with 64-bit values! - and it's implementation-dependent; also, some DCR are only 32 bits @@ -92,6 +125,176 @@ register (vector <0, 64, inc, bit>) DCR1 let (vector <0, 2, inc, (register<(vector<0, 64, inc, bit>)>) >) DCR = [ DCR0, DCR1 ] +(* Floating-point registers *) + +register (bit[64]) FPR0 +register (bit[64]) FPR1 +register (bit[64]) FPR2 +register (bit[64]) FPR3 +register (bit[64]) FPR4 +register (bit[64]) FPR5 +register (bit[64]) FPR6 +register (bit[64]) FPR7 +register (bit[64]) FPR8 +register (bit[64]) FPR9 +register (bit[64]) FPR10 +register (bit[64]) FPR11 +register (bit[64]) FPR12 +register (bit[64]) FPR13 +register (bit[64]) FPR14 +register (bit[64]) FPR15 +register (bit[64]) FPR16 +register (bit[64]) FPR17 +register (bit[64]) FPR18 +register (bit[64]) FPR19 +register (bit[64]) FPR20 +register (bit[64]) FPR21 +register (bit[64]) FPR22 +register (bit[64]) FPR23 +register (bit[64]) FPR24 +register (bit[64]) FPR25 +register (bit[64]) FPR26 +register (bit[64]) FPR27 +register (bit[64]) FPR28 +register (bit[64]) FPR29 +register (bit[64]) FPR30 +register (bit[64]) FPR31 + +let (vector <0, 32, inc, (register<(bit[64])>) >) FPR = + [ FPR0, FPR1, FPR2, FPR3, FPR4, FPR5, FPR6, FPR7, FPR8, FPR9, FPR10, + FPR11, FPR12, FPR13, FPR14, FPR15, FPR16, FPR17, FPR18, FPR19, FPR20, + FPR21, FPR22, FPR23, FPR24, FPR25, FPR26, FPR27, FPR28, FPR29, FPR30, FPR31 + ] + +typedef fpscr = register bits [ 0 : 63 ] { + 32 : FX; + 33 : FEX; + 34 : VX; + 35 : OX; + 36 : UX; + 37 : ZX; + 38 : XX; + 39 : VXSNAN; + 40 : VXISI; + 41 : VXIDI; + 42 : VXZDZ; + 43 : VXIMZ; + 44 : VXVC; + 45 : FR; + 46 : FI; + 47 .. 51 : FPRF; + 47 : C; + 48 .. 51 : FPCC; (* the bits of FPCC are named FL, FG, FE and FU, + but those names are never used in pseudo-code. *) + 53 : VXSOFT; + 54 : VXSQRT; + 55 : VXCVI; + 56 : VE; + 57 : OE; + 58 : UE; + 59 : ZE; + 60 : XE; + 61 : NI; + 62 .. 63 : RN; +} +register (fpscr) FPSCR + +(* XXX *) +val extern bit[32] -> bit[64] effect pure DOUBLE +val extern bit[64] -> bit[32] effect pure SINGLE + +(* Vector registers *) + +register (bit[128]) VR0 +register (bit[128]) VR1 +register (bit[128]) VR2 +register (bit[128]) VR3 +register (bit[128]) VR4 +register (bit[128]) VR5 +register (bit[128]) VR6 +register (bit[128]) VR7 +register (bit[128]) VR8 +register (bit[128]) VR9 +register (bit[128]) VR10 +register (bit[128]) VR11 +register (bit[128]) VR12 +register (bit[128]) VR13 +register (bit[128]) VR14 +register (bit[128]) VR15 +register (bit[128]) VR16 +register (bit[128]) VR17 +register (bit[128]) VR18 +register (bit[128]) VR19 +register (bit[128]) VR20 +register (bit[128]) VR21 +register (bit[128]) VR22 +register (bit[128]) VR23 +register (bit[128]) VR24 +register (bit[128]) VR25 +register (bit[128]) VR26 +register (bit[128]) VR27 +register (bit[128]) VR28 +register (bit[128]) VR29 +register (bit[128]) VR30 +register (bit[128]) VR31 + +let (vector <0, 32, inc, (register<(bit[128])>) >) VR = + [ VR0, VR1, VR2, VR3, VR4, VR5, VR6, VR7, VR8, VR9, VR10, + VR11, VR12, VR13, VR14, VR15, VR16, VR17, VR18, VR19, VR20, + VR21, VR22, VR23, VR24, VR25, VR26, VR27, VR28, VR29, VR30, VR31 + ] + +typedef vscr = register bits [ 96 : 127 ] { + 111 : NJ; + 127 : SAT; +} +register (vscr) VSCR + +(* XXX extend with zeroes -- the resulting size in completely unknown and depends of context *) +val extern forall Nat 'n, Nat 'm. bit['n] -> bit['m] effect pure EXTZ + +(* Chop has a very weird definition where the resulting size depends of + context, but in practice it is used with the following definition everywhere, + except in vaddcuw which probably needs to be patched accordingly. *) +val forall Nat 'n, Nat 'm, 'm <= 'n. (bit['n], [|'m|]) -> bit['m] effect pure Chop +function forall Nat 'm. (bit['m]) Chop(x, y) = x[0..y] + +val forall Nat 'n, Nat 'm, 'n <= 0, 0 <= 'm. + (nat, [|'n|], [|'m|]) -> [|'n:'m|] effect { wreg } Clamp + +function forall Nat 'n, Nat 'm, 'n <= 0, 0 <= 'm. ([|'n:'m|]) +Clamp((nat) x, ([|'n|]) y, ([|'m|]) z) = { + ([|'n:'m|]) result := 0; + if (x<y) then { + result := y; + VSCR.SAT := bitone; + } else if (x > z) then { + result := z; + VSCR.SAT := bitone; + } else { + result := x; + }; + result; +} + +(* XXX *) +val extern bit[32] -> bit[32] effect pure RoundToSPIntCeil +val extern bit[32] -> bit[32] effect pure RoundToSPIntFloor +val extern bit[32] -> bit[32] effect pure RoundToSPIntNear +val extern bit[32] -> bit[32] effect pure RoundToSPIntTrunc +val extern bit[32] -> bit[32] effect pure RoundToNearSP +val extern bit[32] -> bit[32] effect pure ReciprocalEstimateSP +val extern bit[32] -> bit[32] effect pure ReciprocalSquareRootEstimateSP +val extern bit[32] -> bit[32] effect pure LogBase2EstimateSP +val extern bit[32] -> bit[32] effect pure Power2EstimateSP +val extern (bit[32], bit[5]) -> bit[32] effect pure ConvertSPtoSXWsaturate +val extern (bit[32], bit[5]) -> bit[32] effect pure ConvertSPtoUXWsaturate + + +register (bit[64]) NIA (* next instruction address *) +register (bit[64]) CIA (* current instruction address *) + + val extern forall Nat 'n. ( nat , [|'n|] ) -> (bit[8 * 'n]) effect { wmem , rmem } MEM (* XXX effect for trap? *) @@ -101,17 +304,23 @@ register (bool) mode64bit scattered function unit execute scattered typedef ast = const union + +val bit[32] -> ast effect pure decode + scattered function ast decode -union ast member (vector<0, 2, inc, bit> , vector<0, 5, inc, bit> , vector<0, 5, inc, bit> , bit) BranchConditionaltoLinkRegister +union ast member (bit[5], bit[5], bit[2], bit) Bclr -function clause decode ([0 = bitzero, 1 = bitone, 2 = bitzero, 3 = bitzero, 4 = - bitone, 5 = bitone, 21 = bitzero, 22 = bitzero, 23 = bitzero, 24 = bitzero, 25 = - bitzero, 26 = bitone, 27 = bitzero, 28 = bitzero, 29 = bitzero, 30 = bitzero] as instr) = - BranchConditionaltoLinkRegister - (instr[19 .. 20],instr[11 .. 15],instr[6 .. 10],instr[31]) +function clause decode ([bitzero, bitone, bitzero, bitzero, bitone, bitone] : +(bit[5]) BO : +(bit[5]) BI : +(bit[3]) _ : +(bit[2]) BH : +[bitzero, bitzero, bitzero, bitzero, bitzero, bitone, bitzero, bitzero, bitzero, bitzero] : +[LK] as instr) = + Bclr (BO,BI,BH,LK) -function clause execute (BranchConditionaltoLinkRegister (BH, BI, BO, LK)) = +function clause execute (Bclr (BO, BI, BH, LK)) = { if mode64bit then M := 0 else M := 32; if ~ (BO[2]) then CTR := CTR - 1; @@ -121,67 +330,78 @@ function clause execute (BranchConditionaltoLinkRegister (BH, BI, BO, LK)) = if LK then LR := CIA + 4 } -union ast member (vector<0, 16, inc, bit> , vector<0, 5, inc, bit> , vector<0, 5, inc, bit> ) LoadWordandZero +union ast member (bit[5], bit[5], bit[16]) Lwz -function clause decode ([0 = bitone, 1 = bitzero, 2 = bitzero, 3 = bitzero, 4 = - bitzero, 5 = bitzero] as instr) = - LoadWordandZero (instr[16 .. 31],instr[11 .. 15],instr[6 .. 10]) +function clause decode ([bitone, bitzero, bitzero, bitzero, bitzero, bitzero] : +(bit[5]) RT : +(bit[5]) RA : +(bit[16]) D as instr) = + Lwz (RT,RA,D) -function clause execute (LoadWordandZero (D, RA, RT)) = +function clause execute (Lwz (RT, RA, D)) = { - (vector<0, 64, inc, bit> ) EA := 0; - (vector<0, 64, inc, bit> ) b := 0; + (bit[64]) EA := 0; + (bit[64]) b := 0; if RA == 0 then b := 0 else b := GPR[RA]; - EA := b + exts (D); + EA := b + EXTS (D); GPR[RT] := 0b00000000000000000000000000000000 : MEM (EA,4) } -union ast member (vector<0, 16, inc, bit> , vector<0, 5, inc, bit> , vector<0, 5, inc, bit> ) StoreWord +union ast member (bit[5], bit[5], bit[16]) Stw -function clause decode ([0 = bitone, 1 = bitzero, 2 = bitzero, 3 = bitone, 4 = - bitzero, 5 = bitzero] as instr) = - StoreWord (instr[16 .. 31],instr[11 .. 15],instr[6 .. 10]) +function clause decode ([bitone, bitzero, bitzero, bitone, bitzero, bitzero] : +(bit[5]) RS : +(bit[5]) RA : +(bit[16]) D as instr) = + Stw (RS,RA,D) -function clause execute (StoreWord (D, RA, RS)) = +function clause execute (Stw (RS, RA, D)) = { - (vector<0, 64, inc, bit> ) EA := 0; - (vector<0, 64, inc, bit> ) b := 0; + (bit[64]) EA := 0; + (bit[64]) b := 0; if RA == 0 then b := 0 else b := GPR[RA]; - EA := b + exts (D); + EA := b + EXTS (D); MEM(EA,4) := (GPR[RS])[32 .. 63] } -union ast member (vector<0, 16, inc, bit> , vector<0, 5, inc, bit> , vector<0, 5, inc, bit> ) StoreWordwithUpdate +union ast member (bit[5], bit[5], bit[16]) Stwu -function clause decode ([0 = bitone, 1 = bitzero, 2 = bitzero, 3 = bitone, 4 = - bitzero, 5 = bitone] as instr) = - StoreWordwithUpdate (instr[16 .. 31],instr[11 .. 15],instr[6 .. 10]) +function clause decode ([bitone, bitzero, bitzero, bitone, bitzero, bitone] : +(bit[5]) RS : +(bit[5]) RA : +(bit[16]) D as instr) = + Stwu (RS,RA,D) -function clause execute (StoreWordwithUpdate (D, RA, RS)) = +function clause execute (Stwu (RS, RA, D)) = { - (vector<0, 64, inc, bit> ) EA := 0; - EA := GPR[RA] + exts (D); + (bit[64]) EA := 0; + EA := GPR[RA] + EXTS (D); MEM(EA,4) := (GPR[RS])[32 .. 63]; GPR[RA] := EA } -union ast member (vector<0, 5, inc, bit> , vector<0, 5, inc, bit> , vector<0, 16, inc, bit> ) AddImmediate +union ast member (bit[5], bit[5], bit[16]) Addi -function clause decode ([0 = bitzero, 1 = bitzero, 2 = bitone, 3 = bitone, 4 = - bitone, 5 = bitzero] as instr) = - AddImmediate (instr[11 .. 15],instr[6 .. 10],instr[16 .. 31]) +function clause decode ([bitzero, bitzero, bitone, bitone, bitone, bitzero] : +(bit[5]) RT : +(bit[5]) RA : +(bit[16]) SI as instr) = + Addi (RT,RA,SI) -function clause execute (AddImmediate (RA, RT, SI)) = - if RA == 0 then GPR[RT] := exts (SI) else GPR[RT] := GPR[RA] + exts (SI) +function clause execute (Addi (RT, RA, SI)) = + if RA == 0 then GPR[RT] := EXTS (SI) else GPR[RT] := GPR[RA] + EXTS (SI) -union ast member (vector<0, 5, inc, bit> , vector<0, 5, inc, bit> , vector<0, 5, inc, bit> , bit) OR +union ast member (bit[5], bit[5], bit[5], bit) Or -function clause decode ([0 = bitzero, 1 = bitone, 2 = bitone, 3 = bitone, 4 = - bitone, 5 = bitone, 21 = bitzero, 22 = bitone, 23 = bitone, 24 = bitzero, 25 = - bitone, 26 = bitone, 27 = bitone, 28 = bitone, 29 = bitzero, 30 = bitzero] as instr) = - OR (instr[11 .. 15],instr[16 .. 20],instr[6 .. 10],instr[31]) +function clause decode ([bitzero, bitone, bitone, bitone, bitone, bitone] : +(bit[5]) RS : +(bit[5]) RA : +(bit[5]) RB : +[bitzero, bitone, bitone, bitzero, bitone, bitone, bitone, bitone, bitzero, bitzero] : +[Rc] as instr) = + Or (RS,RA,RB,Rc) -function clause execute (OR (RA, RB, RS, Rc)) = GPR[RA] := (GPR[RS] | GPR[RB]) +function clause execute (Or (RS, RA, RB, Rc)) = GPR[RA] := (GPR[RS] | GPR[RB]) end decode |
