summaryrefslogtreecommitdiff
path: root/src/Helium/Instructions.agda
blob: 2baf39df377e22a370a164537c0fc3238d5ef274 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
{-# OPTIONS --safe --without-K #-}

module Helium.Instructions where

open import Data.Bool
open import Data.Fin
open import Data.Nat
open import Data.Sum
open import Relation.Binary.PropositionalEquality

GenReg : Set
GenReg = Fin 16

VecReg : Set
VecReg = Fin 8

module VAdd
  where

  record VAdd : Set where
    field
      size : Fin 3
      dest : VecReg
      src₁ : VecReg
      src₂ : GenReg ⊎ VecReg

  esize : VAdd → Fin 33
  esize record { size = zero }             = # 8
  esize record { size = (suc zero) }       = # 16
  esize record { size = (suc (suc zero)) } = # 32

  elements : VAdd → 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

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