From 535e4297a08c626d0e2e1923914727f914b8c9bd Mon Sep 17 00:00:00 2001 From: Greg Brown Date: Sat, 19 Mar 2022 13:28:42 +0000 Subject: Modify pseudocode definition. This change makes the following changes to the definition of pseudocode: - Add a separate type `bit` for single-bit values. - Change `var` and `state` to take `Fin`s instead of bounded naturals. - Make `[_]` and `unbox` work for any sliced type. - Generalise `_:_` and `slice` into `splice` and `cut` respectively, making the two new operations inverses. - Replace `tup` with `nil` and `cons` for building tuples. - Add destructors `head` and `tail` for tuple types. - Make function and procedure calls take a vector of arguments instead of a tuple. - Introduce an `if_then_` expression for if statements with a trivial else branch. --- src/Helium/Instructions/Base.agda | 145 ++++++++++++++++++-------------------- 1 file changed, 69 insertions(+), 76 deletions(-) (limited to 'src/Helium/Instructions/Base.agda') diff --git a/src/Helium/Instructions/Base.agda b/src/Helium/Instructions/Base.agda index 62a6968..d157d5a 100644 --- a/src/Helium/Instructions/Base.agda +++ b/src/Helium/Instructions/Base.agda @@ -10,6 +10,7 @@ module Helium.Instructions.Base where open import Data.Bool as Bool using (true; false) open import Data.Fin as Fin using (Fin; Fin′; zero; suc; toℕ) +open import Data.Fin.Patterns open import Data.Nat as ℕ using (ℕ; zero; suc) import Data.Nat.Properties as ℕₚ open import Data.Sum using ([_,_]′; inj₂) @@ -49,25 +50,25 @@ open Core.Code State public -- Direct from State S : ∀ {n Γ} → Expression {n} Γ (array (bits 32) 32) -S = state 0 +S = state 0F R : ∀ {n Γ} → Expression {n} Γ (array (bits 32) 16) -R = state 1 +R = state 1F VPR-P0 : ∀ {n Γ} → Expression {n} Γ (bits 16) -VPR-P0 = state 2 +VPR-P0 = state 2F VPR-mask : ∀ {n Γ} → Expression {n} Γ (bits 8) -VPR-mask = state 3 +VPR-mask = state 3F FPSCR-QC : ∀ {n Γ} → Expression {n} Γ bit -FPSCR-QC = state 4 +FPSCR-QC = state 4F AdvanceVPTState : ∀ {n Γ} → Expression {n} Γ bool -AdvanceVPTState = state 5 +AdvanceVPTState = state 5F BeatId : ∀ {n Γ} → Expression {n} Γ beat -BeatId = state 6 +BeatId = state 6F -- Indirect @@ -84,8 +85,7 @@ join {k = k} {suc m} x = cast eq (join (slice x (lit (Fin.fromℕ 1 ′f))) ∶ eq = P.trans (P.cong (k ℕ.+_) (ℕₚ.*-comm k (suc m))) (ℕₚ.*-comm (suc (suc m)) k) index : ∀ {n Γ t m} → Expression {n} Γ (asType t (suc m)) → Expression Γ (fin (suc m)) → Expression Γ (elemType t) -index {t = bits} {m} x i = slice (cast (ℕₚ.+-comm 1 m) x) i -index {t = array _} {m} x i = unbox (slice (cast (ℕₚ.+-comm 1 m) x) i) +index {m = m} x i = unbox (slice (cast (ℕₚ.+-comm 1 m) x) i) Q : ∀ {n Γ} → Expression {n} Γ (array (array (bits 32) 4) 8) Q = group 7 S @@ -98,39 +98,39 @@ elem {k = suc k} (suc m) x i = index (group k (cast (ℕₚ.*-comm (suc k) (suc --- Other utiliies hasBit : ∀ {n Γ m} → Expression {n} Γ (bits (suc m)) → Expression Γ (fin (suc m)) → Expression Γ bool -hasBit {n} x i = index x i ≟ lit ((true ∷ []) ′x) +hasBit {n} x i = index x i ≟ lit (true ′x) sliceⁱ : ∀ {n Γ m} → ℕ → Expression {n} Γ int → Expression Γ (bits m) -sliceⁱ {m = zero} n i = lit ([] ′x) -sliceⁱ {m = suc m} n i = sliceⁱ (suc n) i ∶ get n i +sliceⁱ {m = zero} n i = lit ([] ′xs) +sliceⁱ {m = suc m} n i = sliceⁱ (suc n) i ∶ [ get n i ] --- Functions Int : ∀ {n} → Function (bits n ∷ bool ∷ []) int -Int = skip ∙return (if var 1 then uint (var 0) else sint (var 0)) +Int = skip ∙return (if var 1F then uint (var 0F) else sint (var 0F)) -- arguments swapped, pred n SignedSatQ : ∀ n → Function (int ∷ []) (tuple 2 (bits (suc n) ∷ bool ∷ [])) SignedSatQ n = declare (lit (true ′b)) ( - if max >3 (tup ((var 3) ∷ []))) + tup (index (var 5F) (var 3F) ∷ var 0F ∷ []) ≔ call (SignedSatQ (toℕ esize-1)) (var 1F ∷ []) ∙ + if var 0F && hasBit (var 6F) (fin e*esize>>3 (tup ((var 3F) ∷ []))) then - FPSCR-QC ≔ lit ((true ∷ []) ′x) - else skip))) + FPSCR-QC ≔ lit (true ′x)))) where open Instr.VecOp₂ d @@ -299,9 +292,9 @@ private helper Instr.32bit i = Fin.combine i zero vqdmulh : Instr.VQDMulH → Procedure [] -vqdmulh d = vqr?dmulh d (skip ∙return lit (2 ′i) * var 0 * var 1 >> toℕ esize) +vqdmulh d = vqr?dmulh d (skip ∙return lit (2 ′i) * var 0F * var 1F >> toℕ esize) where open Instr.VecOp₂ d using (esize) vqrdmulh : Instr.VQRDMulH → Procedure [] -vqrdmulh d = vqr?dmulh d (skip ∙return lit (2 ′i) * var 0 * var 1 + lit (1 ′i) << toℕ esize-1 >> toℕ esize) +vqrdmulh d = vqr?dmulh d (skip ∙return lit (2 ′i) * var 0F * var 1F + lit (1 ′i) << toℕ esize-1 >> toℕ esize) where open Instr.VecOp₂ d using (esize; esize-1) -- cgit v1.2.3