diff options
author | Greg Brown <greg.brown@cl.cam.ac.uk> | 2021-12-20 17:45:17 +0000 |
---|---|---|
committer | Greg Brown <greg.brown@cl.cam.ac.uk> | 2021-12-20 17:50:58 +0000 |
commit | d06b8c0a651f101a03ac2efca7cbc3cad0f4496f (patch) | |
tree | 7204170f8d7e22ed0bc3c8a56774919d159edd80 /src/Helium/Semantics | |
parent | e32ce3737798d4519c5497c36e912e92d60bd36b (diff) |
Inline and rearrange to make vadd and vhsub look more similar.
If there are other functions with a similar structure, I may extract larger
patterns. copy-masked is one example of a structure that was easy to extract.
Diffstat (limited to 'src/Helium/Semantics')
-rw-r--r-- | src/Helium/Semantics/Denotational.agda | 43 | ||||
-rw-r--r-- | src/Helium/Semantics/Denotational/Core.agda | 3 |
2 files changed, 23 insertions, 23 deletions
diff --git a/src/Helium/Semantics/Denotational.agda b/src/Helium/Semantics/Denotational.agda index c6d019e..5f83fdf 100644 --- a/src/Helium/Semantics/Denotational.agda +++ b/src/Helium/Semantics/Denotational.agda @@ -106,8 +106,16 @@ elem m &v idx = slice &v λ σ ρ → idx σ ρ >>= λ (σ , i) → just (σ , h -- General functions -int : ∀ {n} → Bool → Function 1 (Bits n , _) ℤ -int b = return ⦇ (Bool.if b then uint else sint) (!# 0) ⦈ +copy-masked : VecReg → Procedure 3 (Bits 32 , Beat , ElmtMask , _) +copy-masked dest = for 4 (lift ( + -- e result beat elmtMask + if ⦇ (λ x y → does (getᵇ y x ≟ᵇ 1b)) (!# 3) (!# 0) ⦈ + then + elem 8 (&Q ⦇ dest ⦈ (!# 2)) (!# 0) ≔ (! elem 8 (var (# 1)) (!# 0)) + else + skip)) + +-- vec-op₂ : VecReg → GenReg → Op₂ (Bits n) -- Instruction semantics @@ -128,18 +136,13 @@ module _ for (toℕ elements) (lift ( -- e op₁ result beat elmtMask elem (toℕ esize) (&cast (sym e*e≡32) (var (# 2))) (!# 0) ≔ - ⦇ ! elem (toℕ esize) (&cast (sym e*e≡32) (var (# 1))) (!# 0) +ᵇ + ⦇ _+ᵇ_ + (! elem (toℕ esize) (&cast (sym e*e≡32) (var (# 1))) (!# 0)) ([ (λ src₂ → ! slice (&R ⦇ src₂ ⦈) ⦇ (esize , zero , refl) ⦈) , (λ src₂ → ! elem (toℕ esize) (&cast (sym e*e≡32) (&Q ⦇ src₂ ⦈ (!# 3))) (!# 0)) ]′ src₂) ⦈ )) ∙ - for 4 (lift ( - -- e op₁ result beat elmtMask - if ⦇ (λ x y → does (getᵇ y x ≟ᵇ 1b)) (!# 4) (!# 0) ⦈ - then - elem 8 (&Q ⦇ dest ⦈ (!# 3)) (!# 0) ≔ (! elem 8 (var (# 2)) (!# 0)) - else - skip)))) + ignore (call (copy-masked dest) ⦇ !# 1 , ⦇ !# 2 , !# 3 ⦈ ⦈))) where open VAdd.VAdd d esize = VAdd.esize d @@ -152,22 +155,16 @@ module _ for (toℕ elements) (lift ( -- e op₁ result beat elmtMask elem (toℕ esize) (&cast (sym e*e≡32) (var (# 2))) (!# 0) ≔ - ⦇ (sliceᶻ (suc (toℕ esize)) (suc zero)) - ⦇ call (int unsigned) (! elem (toℕ esize) (&cast (sym e*e≡32) (var (# 1))) (!# 0)) +ᶻ - ⦇ -ᶻ (call (int unsigned) - ([ (λ src₂ → ! slice (&R ⦇ src₂ ⦈) ⦇ (esize , zero , refl) ⦈) - , (λ src₂ → ! elem (toℕ esize) (&cast (sym e*e≡32) (&Q ⦇ src₂ ⦈ (!# 3))) (!# 0)) - ]′ src₂)) ⦈ ⦈ ⦈ + ⦇ (λ x y → sliceᶻ (suc (toℕ esize)) (suc zero) (int x +ᶻ -ᶻ int y)) + (! elem (toℕ esize) (&cast (sym e*e≡32) (var (# 1))) (!# 0)) + ([ (λ src₂ → ! slice (&R ⦇ src₂ ⦈) ⦇ (esize , zero , refl) ⦈) + , (λ src₂ → ! elem (toℕ esize) (&cast (sym e*e≡32) (&Q ⦇ src₂ ⦈ (!# 3))) (!# 0)) + ]′ src₂) ⦈ )) ∙ - for 4 (lift ( - -- e op₁ result beat elmtMask - if ⦇ (λ x y → does (getᵇ y x ≟ᵇ 1b)) (!# 4) (!# 0) ⦈ - then - elem 8 (&Q ⦇ dest ⦈ (!# 3)) (!# 0) ≔ (! elem 8 (var (# 2)) (!# 0)) - else - skip)))) + ignore (call (copy-masked dest) ⦇ !# 1 , ⦇ !# 2 , !# 3 ⦈ ⦈))) where open VHSub.VHSub d esize = VHSub.esize d elements = VHSub.elements d e*e≡32 = VHSub.elem*esize≡32 d + int = Bool.if unsigned then uint else sint diff --git a/src/Helium/Semantics/Denotational/Core.agda b/src/Helium/Semantics/Denotational/Core.agda index bf5f20f..8c1e231 100644 --- a/src/Helium/Semantics/Denotational/Core.agda +++ b/src/Helium/Semantics/Denotational/Core.agda @@ -102,6 +102,9 @@ infixr 9 _∙_ skip : ∀ {n ls} {Γ : Sets n ls} → Statement n Γ τ skip cont = cont +ignore : ∀ {n ls} {Γ : Sets n ls} → Expr n Γ τ → Statement n Γ τ′ +ignore e cont σ ρ = e σ ρ >>= λ (σ , _) → cont σ ρ + return : ∀ {n ls} {Γ : Sets n ls} → Expr n Γ τ → Statement n Γ τ return e _ = e |