summaryrefslogtreecommitdiff
path: root/src/Helium/Instructions.agda
diff options
context:
space:
mode:
authorGreg Brown <greg.brown@cl.cam.ac.uk>2021-12-20 17:43:43 +0000
committerGreg Brown <greg.brown@cl.cam.ac.uk>2021-12-20 17:43:43 +0000
commite32ce3737798d4519c5497c36e912e92d60bd36b (patch)
treeb737199dbc1d8ccadfc775be6cb1d966474b5035 /src/Helium/Instructions.agda
parentee7e46719f428c61ef785ec791c341ddb350cc40 (diff)
Define semantics of vhsub.
Diffstat (limited to 'src/Helium/Instructions.agda')
-rw-r--r--src/Helium/Instructions.agda27
1 files changed, 27 insertions, 0 deletions
diff --git a/src/Helium/Instructions.agda b/src/Helium/Instructions.agda
index 0d21322..2baf39d 100644
--- a/src/Helium/Instructions.agda
+++ b/src/Helium/Instructions.agda
@@ -2,6 +2,7 @@
module Helium.Instructions where
+open import Data.Bool
open import Data.Fin
open import Data.Nat
open import Data.Sum
@@ -37,3 +38,29 @@ module VAdd
elem*esize≡32 record { size = zero } = refl
elem*esize≡32 record { size = (suc zero) } = refl
elem*esize≡32 record { size = (suc (suc zero)) } = refl
+
+module VHSub
+ where
+
+ record VHSub : Set where
+ field
+ unsigned : Bool
+ size : Fin 3
+ dest : VecReg
+ src₁ : VecReg
+ src₂ : GenReg ⊎ VecReg
+
+ esize : VHSub → Fin 33
+ esize record { size = zero } = # 8
+ esize record { size = (suc zero) } = # 16
+ esize record { size = (suc (suc zero)) } = # 32
+
+ elements : VHSub → Fin 5
+ elements record { size = zero } = # 4
+ elements record { size = (suc zero) } = # 2
+ elements record { size = (suc (suc zero)) } = # 1
+
+ elem*esize≡32 : ∀ d → toℕ (elements d) * toℕ (esize d) ≡ 32
+ elem*esize≡32 record { size = zero } = refl
+ elem*esize≡32 record { size = (suc zero) } = refl
+ elem*esize≡32 record { size = (suc (suc zero)) } = refl