{-# LANGUAGE DeriveFunctor     #-}
{-# LANGUAGE DeriveGeneric     #-}
{-# LANGUAGE OverloadedStrings #-}

module Asm.Aarch64 ( AArch64 (..)
                   , Addr (..)
                   , Cond (..)
                   , Shift (..), BM (..)
                   , AbsReg (..), FAbsReg (..), F2Abs (..)
                   , AReg (..), FAReg (..), F2Reg (..)
                   , SIMD (..), simd2
                   , prettyDebug
                   , mapR, mapFR, mapF2
                   , toInt, fToInt, f2ToInt
                   , pus, pos
                   , puds, pods
                   , pSym
                   ) where

import           Asm.M
import           Control.DeepSeq   (NFData (..))
import           Data.Copointed
import           Data.List         (scanl')
import           Data.Word         (Word16, Word8)
import           GHC.Generics      (Generic)
import           Numeric           (showHex)
import           Prettyprinter     (Doc, Pretty (..), brackets, (<+>))
import           Prettyprinter.Ext
import           System.Info       (os)

-- https://developer.arm.com/documentation/102374/0101/Registers-in-AArch64---other-registers
data AReg = X0 | X1 | X2 | X3 | X4 | X5 | X6 | X7 | X8 | X9 | X10 | X11 | X12 | X13 | X14 | X15 | X16 | X17 | X18 | X19 | X20 | X21 | X22 | X23 | X24 | X25 | X26 | X27 | X28 | X29 | X30 | SP deriving (AReg -> AReg -> Bool
(AReg -> AReg -> Bool) -> (AReg -> AReg -> Bool) -> Eq AReg
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: AReg -> AReg -> Bool
== :: AReg -> AReg -> Bool
$c/= :: AReg -> AReg -> Bool
/= :: AReg -> AReg -> Bool
Eq, Eq AReg
Eq AReg =>
(AReg -> AReg -> Ordering)
-> (AReg -> AReg -> Bool)
-> (AReg -> AReg -> Bool)
-> (AReg -> AReg -> Bool)
-> (AReg -> AReg -> Bool)
-> (AReg -> AReg -> AReg)
-> (AReg -> AReg -> AReg)
-> Ord AReg
AReg -> AReg -> Bool
AReg -> AReg -> Ordering
AReg -> AReg -> AReg
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: AReg -> AReg -> Ordering
compare :: AReg -> AReg -> Ordering
$c< :: AReg -> AReg -> Bool
< :: AReg -> AReg -> Bool
$c<= :: AReg -> AReg -> Bool
<= :: AReg -> AReg -> Bool
$c> :: AReg -> AReg -> Bool
> :: AReg -> AReg -> Bool
$c>= :: AReg -> AReg -> Bool
>= :: AReg -> AReg -> Bool
$cmax :: AReg -> AReg -> AReg
max :: AReg -> AReg -> AReg
$cmin :: AReg -> AReg -> AReg
min :: AReg -> AReg -> AReg
Ord, Int -> AReg
AReg -> Int
AReg -> [AReg]
AReg -> AReg
AReg -> AReg -> [AReg]
AReg -> AReg -> AReg -> [AReg]
(AReg -> AReg)
-> (AReg -> AReg)
-> (Int -> AReg)
-> (AReg -> Int)
-> (AReg -> [AReg])
-> (AReg -> AReg -> [AReg])
-> (AReg -> AReg -> [AReg])
-> (AReg -> AReg -> AReg -> [AReg])
-> Enum AReg
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
$csucc :: AReg -> AReg
succ :: AReg -> AReg
$cpred :: AReg -> AReg
pred :: AReg -> AReg
$ctoEnum :: Int -> AReg
toEnum :: Int -> AReg
$cfromEnum :: AReg -> Int
fromEnum :: AReg -> Int
$cenumFrom :: AReg -> [AReg]
enumFrom :: AReg -> [AReg]
$cenumFromThen :: AReg -> AReg -> [AReg]
enumFromThen :: AReg -> AReg -> [AReg]
$cenumFromTo :: AReg -> AReg -> [AReg]
enumFromTo :: AReg -> AReg -> [AReg]
$cenumFromThenTo :: AReg -> AReg -> AReg -> [AReg]
enumFromThenTo :: AReg -> AReg -> AReg -> [AReg]
Enum, (forall x. AReg -> Rep AReg x)
-> (forall x. Rep AReg x -> AReg) -> Generic AReg
forall x. Rep AReg x -> AReg
forall x. AReg -> Rep AReg x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. AReg -> Rep AReg x
from :: forall x. AReg -> Rep AReg x
$cto :: forall x. Rep AReg x -> AReg
to :: forall x. Rep AReg x -> AReg
Generic)

instance Pretty AReg where
    pretty :: forall ann. AReg -> Doc ann
pretty AReg
X0 = Doc ann
"x0"; pretty AReg
X1 = Doc ann
"x1"; pretty AReg
X2 = Doc ann
"x2"; pretty AReg
X3 = Doc ann
"x3"; pretty AReg
X4 = Doc ann
"x4"; pretty AReg
X5 = Doc ann
"x5"; pretty AReg
X6 = Doc ann
"x6"; pretty AReg
X7 = Doc ann
"x7"
    pretty AReg
X8 = Doc ann
"x8"; pretty AReg
X9 = Doc ann
"x9"; pretty AReg
X10 = Doc ann
"x10"; pretty AReg
X11 = Doc ann
"x11"; pretty AReg
X12 = Doc ann
"x12"; pretty AReg
X13 = Doc ann
"x13"; pretty AReg
X14 = Doc ann
"x14"; pretty AReg
X15 = Doc ann
"x15"
    pretty AReg
X16 = Doc ann
"x16"; pretty AReg
X17 = Doc ann
"x17"; pretty AReg
X18 = Doc ann
"x18"; pretty AReg
X19 = Doc ann
"x19"; pretty AReg
X20 = Doc ann
"x20"; pretty AReg
X21 = Doc ann
"x21"; pretty AReg
X22 = Doc ann
"x22"; pretty AReg
X23 = Doc ann
"x23"
    pretty AReg
X24 = Doc ann
"x24"; pretty AReg
X25 = Doc ann
"x25"; pretty AReg
X26 = Doc ann
"x26"; pretty AReg
X27 = Doc ann
"x27"; pretty AReg
X28 = Doc ann
"x28"; pretty AReg
X29 = Doc ann
"x29"; pretty AReg
X30 = Doc ann
"x30"; pretty AReg
SP = Doc ann
"sp"

instance Show AReg where show :: AReg -> [Char]
show = Doc Any -> [Char]
forall a. Show a => a -> [Char]
show(Doc Any -> [Char]) -> (AReg -> Doc Any) -> AReg -> [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
.AReg -> Doc Any
forall a ann. Pretty a => a -> Doc ann
forall ann. AReg -> Doc ann
pretty

simd2 :: FAReg -> F2Reg
simd2 :: FAReg -> F2Reg
simd2 = Int -> F2Reg
forall a. Enum a => Int -> a
toEnum(Int -> F2Reg) -> (FAReg -> Int) -> FAReg -> F2Reg
forall b c a. (b -> c) -> (a -> b) -> a -> c
.FAReg -> Int
forall a. Enum a => a -> Int
fromEnum

data FAReg = D0 | D1 | D2 | D3 | D4 | D5 | D6 | D7 | D8 | D9 | D10 | D11 | D12 | D13 | D14 | D15 | D16 | D17 | D18 | D19 | D20 | D21 | D22 | D23 | D24 | D25 | D26 | D27 | D28 | D29 | D30 | D31 deriving (FAReg -> FAReg -> Bool
(FAReg -> FAReg -> Bool) -> (FAReg -> FAReg -> Bool) -> Eq FAReg
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: FAReg -> FAReg -> Bool
== :: FAReg -> FAReg -> Bool
$c/= :: FAReg -> FAReg -> Bool
/= :: FAReg -> FAReg -> Bool
Eq, Eq FAReg
Eq FAReg =>
(FAReg -> FAReg -> Ordering)
-> (FAReg -> FAReg -> Bool)
-> (FAReg -> FAReg -> Bool)
-> (FAReg -> FAReg -> Bool)
-> (FAReg -> FAReg -> Bool)
-> (FAReg -> FAReg -> FAReg)
-> (FAReg -> FAReg -> FAReg)
-> Ord FAReg
FAReg -> FAReg -> Bool
FAReg -> FAReg -> Ordering
FAReg -> FAReg -> FAReg
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: FAReg -> FAReg -> Ordering
compare :: FAReg -> FAReg -> Ordering
$c< :: FAReg -> FAReg -> Bool
< :: FAReg -> FAReg -> Bool
$c<= :: FAReg -> FAReg -> Bool
<= :: FAReg -> FAReg -> Bool
$c> :: FAReg -> FAReg -> Bool
> :: FAReg -> FAReg -> Bool
$c>= :: FAReg -> FAReg -> Bool
>= :: FAReg -> FAReg -> Bool
$cmax :: FAReg -> FAReg -> FAReg
max :: FAReg -> FAReg -> FAReg
$cmin :: FAReg -> FAReg -> FAReg
min :: FAReg -> FAReg -> FAReg
Ord, Int -> FAReg
FAReg -> Int
FAReg -> [FAReg]
FAReg -> FAReg
FAReg -> FAReg -> [FAReg]
FAReg -> FAReg -> FAReg -> [FAReg]
(FAReg -> FAReg)
-> (FAReg -> FAReg)
-> (Int -> FAReg)
-> (FAReg -> Int)
-> (FAReg -> [FAReg])
-> (FAReg -> FAReg -> [FAReg])
-> (FAReg -> FAReg -> [FAReg])
-> (FAReg -> FAReg -> FAReg -> [FAReg])
-> Enum FAReg
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
$csucc :: FAReg -> FAReg
succ :: FAReg -> FAReg
$cpred :: FAReg -> FAReg
pred :: FAReg -> FAReg
$ctoEnum :: Int -> FAReg
toEnum :: Int -> FAReg
$cfromEnum :: FAReg -> Int
fromEnum :: FAReg -> Int
$cenumFrom :: FAReg -> [FAReg]
enumFrom :: FAReg -> [FAReg]
$cenumFromThen :: FAReg -> FAReg -> [FAReg]
enumFromThen :: FAReg -> FAReg -> [FAReg]
$cenumFromTo :: FAReg -> FAReg -> [FAReg]
enumFromTo :: FAReg -> FAReg -> [FAReg]
$cenumFromThenTo :: FAReg -> FAReg -> FAReg -> [FAReg]
enumFromThenTo :: FAReg -> FAReg -> FAReg -> [FAReg]
Enum, (forall x. FAReg -> Rep FAReg x)
-> (forall x. Rep FAReg x -> FAReg) -> Generic FAReg
forall x. Rep FAReg x -> FAReg
forall x. FAReg -> Rep FAReg x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. FAReg -> Rep FAReg x
from :: forall x. FAReg -> Rep FAReg x
$cto :: forall x. Rep FAReg x -> FAReg
to :: forall x. Rep FAReg x -> FAReg
Generic)

instance Pretty FAReg where
    pretty :: forall ann. FAReg -> Doc ann
pretty FAReg
D0 = Doc ann
"d0"; pretty FAReg
D1 = Doc ann
"d1"; pretty FAReg
D2 = Doc ann
"d2"; pretty FAReg
D3 = Doc ann
"d3"; pretty FAReg
D4 = Doc ann
"d4"; pretty FAReg
D5 = Doc ann
"d5"; pretty FAReg
D6 = Doc ann
"d6"; pretty FAReg
D7 = Doc ann
"d7"
    pretty FAReg
D8 = Doc ann
"d8"; pretty FAReg
D9 = Doc ann
"d9"; pretty FAReg
D10 = Doc ann
"d10"; pretty FAReg
D11 = Doc ann
"d11"; pretty FAReg
D12 = Doc ann
"d12"; pretty FAReg
D13 = Doc ann
"d13"; pretty FAReg
D14 = Doc ann
"d14"; pretty FAReg
D15 = Doc ann
"d15"
    pretty FAReg
D16 = Doc ann
"d16"; pretty FAReg
D17 = Doc ann
"d17"; pretty FAReg
D18 = Doc ann
"d18"; pretty FAReg
D19 = Doc ann
"d19"; pretty FAReg
D20 = Doc ann
"d20"; pretty FAReg
D21 = Doc ann
"d21"; pretty FAReg
D22 = Doc ann
"d22"; pretty FAReg
D23 = Doc ann
"d23"
    pretty FAReg
D24 = Doc ann
"d24"; pretty FAReg
D25 = Doc ann
"d25"; pretty FAReg
D26 = Doc ann
"d26"; pretty FAReg
D27 = Doc ann
"d27"; pretty FAReg
D28 = Doc ann
"d28"; pretty FAReg
D29 = Doc ann
"d29"; pretty FAReg
D30 = Doc ann
"d30"; pretty FAReg
D31 = Doc ann
"d31"

instance Show FAReg where show :: FAReg -> [Char]
show=Doc Any -> [Char]
forall a. Show a => a -> [Char]
show(Doc Any -> [Char]) -> (FAReg -> Doc Any) -> FAReg -> [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
.FAReg -> Doc Any
forall a ann. Pretty a => a -> Doc ann
forall ann. FAReg -> Doc ann
pretty

data F2Reg = V0 | V1 | V2 | V3 | V4 | V5 | V6 | V7 | V8 | V9 | V10 | V11 | V12 | V13 | V14 | V15 | V16 | V17 | V18 | V19 | V20 | V21 | V22 | V23 | V24 | V25 | V26 | V27 | V28 | V29 | V30 | V31 deriving (F2Reg -> F2Reg -> Bool
(F2Reg -> F2Reg -> Bool) -> (F2Reg -> F2Reg -> Bool) -> Eq F2Reg
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: F2Reg -> F2Reg -> Bool
== :: F2Reg -> F2Reg -> Bool
$c/= :: F2Reg -> F2Reg -> Bool
/= :: F2Reg -> F2Reg -> Bool
Eq, Eq F2Reg
Eq F2Reg =>
(F2Reg -> F2Reg -> Ordering)
-> (F2Reg -> F2Reg -> Bool)
-> (F2Reg -> F2Reg -> Bool)
-> (F2Reg -> F2Reg -> Bool)
-> (F2Reg -> F2Reg -> Bool)
-> (F2Reg -> F2Reg -> F2Reg)
-> (F2Reg -> F2Reg -> F2Reg)
-> Ord F2Reg
F2Reg -> F2Reg -> Bool
F2Reg -> F2Reg -> Ordering
F2Reg -> F2Reg -> F2Reg
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: F2Reg -> F2Reg -> Ordering
compare :: F2Reg -> F2Reg -> Ordering
$c< :: F2Reg -> F2Reg -> Bool
< :: F2Reg -> F2Reg -> Bool
$c<= :: F2Reg -> F2Reg -> Bool
<= :: F2Reg -> F2Reg -> Bool
$c> :: F2Reg -> F2Reg -> Bool
> :: F2Reg -> F2Reg -> Bool
$c>= :: F2Reg -> F2Reg -> Bool
>= :: F2Reg -> F2Reg -> Bool
$cmax :: F2Reg -> F2Reg -> F2Reg
max :: F2Reg -> F2Reg -> F2Reg
$cmin :: F2Reg -> F2Reg -> F2Reg
min :: F2Reg -> F2Reg -> F2Reg
Ord, Int -> F2Reg
F2Reg -> Int
F2Reg -> [F2Reg]
F2Reg -> F2Reg
F2Reg -> F2Reg -> [F2Reg]
F2Reg -> F2Reg -> F2Reg -> [F2Reg]
(F2Reg -> F2Reg)
-> (F2Reg -> F2Reg)
-> (Int -> F2Reg)
-> (F2Reg -> Int)
-> (F2Reg -> [F2Reg])
-> (F2Reg -> F2Reg -> [F2Reg])
-> (F2Reg -> F2Reg -> [F2Reg])
-> (F2Reg -> F2Reg -> F2Reg -> [F2Reg])
-> Enum F2Reg
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
$csucc :: F2Reg -> F2Reg
succ :: F2Reg -> F2Reg
$cpred :: F2Reg -> F2Reg
pred :: F2Reg -> F2Reg
$ctoEnum :: Int -> F2Reg
toEnum :: Int -> F2Reg
$cfromEnum :: F2Reg -> Int
fromEnum :: F2Reg -> Int
$cenumFrom :: F2Reg -> [F2Reg]
enumFrom :: F2Reg -> [F2Reg]
$cenumFromThen :: F2Reg -> F2Reg -> [F2Reg]
enumFromThen :: F2Reg -> F2Reg -> [F2Reg]
$cenumFromTo :: F2Reg -> F2Reg -> [F2Reg]
enumFromTo :: F2Reg -> F2Reg -> [F2Reg]
$cenumFromThenTo :: F2Reg -> F2Reg -> F2Reg -> [F2Reg]
enumFromThenTo :: F2Reg -> F2Reg -> F2Reg -> [F2Reg]
Enum, (forall x. F2Reg -> Rep F2Reg x)
-> (forall x. Rep F2Reg x -> F2Reg) -> Generic F2Reg
forall x. Rep F2Reg x -> F2Reg
forall x. F2Reg -> Rep F2Reg x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. F2Reg -> Rep F2Reg x
from :: forall x. F2Reg -> Rep F2Reg x
$cto :: forall x. Rep F2Reg x -> F2Reg
to :: forall x. Rep F2Reg x -> F2Reg
Generic)

class SIMD a where
    pv :: a -> Doc ann
    pq :: a -> Doc ann

instance SIMD F2Reg where
    pv :: forall ann. F2Reg -> Doc ann
pv F2Reg
V0 = Doc ann
"v0"; pv F2Reg
V1 = Doc ann
"v1"; pv F2Reg
V2 = Doc ann
"v2"; pv F2Reg
V3 = Doc ann
"v3"; pv F2Reg
V4 = Doc ann
"v4"; pv F2Reg
V5 = Doc ann
"v5"; pv F2Reg
V6 = Doc ann
"v6"; pv F2Reg
V7 = Doc ann
"v7"
    pv F2Reg
V8 = Doc ann
"v8"; pv F2Reg
V9 = Doc ann
"v9"; pv F2Reg
V10 = Doc ann
"v10"; pv F2Reg
V11 = Doc ann
"v11"; pv F2Reg
V12 = Doc ann
"v12"; pv F2Reg
V13 = Doc ann
"v13"; pv F2Reg
V14 = Doc ann
"v14"; pv F2Reg
V15 = Doc ann
"v15"
    pv F2Reg
V16 = Doc ann
"v16"; pv F2Reg
V17 = Doc ann
"v17"; pv F2Reg
V18 = Doc ann
"v18"; pv F2Reg
V19 = Doc ann
"v19"; pv F2Reg
V20 = Doc ann
"v20"; pv F2Reg
V21 = Doc ann
"v21"; pv F2Reg
V22 = Doc ann
"v22"; pv F2Reg
V23 = Doc ann
"v23"
    pv F2Reg
V24 = Doc ann
"v24"; pv F2Reg
V25 = Doc ann
"v25"; pv F2Reg
V26 = Doc ann
"v26"; pv F2Reg
V27 = Doc ann
"v27"; pv F2Reg
V28 = Doc ann
"v28"; pv F2Reg
V29 = Doc ann
"v29"; pv F2Reg
V30 = Doc ann
"v30"; pv F2Reg
V31 = Doc ann
"v31"

    pq :: forall ann. F2Reg -> Doc ann
pq F2Reg
V0 = Doc ann
"q0"; pq F2Reg
V1 = Doc ann
"q1"; pq F2Reg
V2 = Doc ann
"q2"; pq F2Reg
V3 = Doc ann
"q3"; pq F2Reg
V4 = Doc ann
"q4"; pq F2Reg
V5 = Doc ann
"q5"; pq F2Reg
V6 = Doc ann
"q6"; pq F2Reg
V7 = Doc ann
"q7"
    pq F2Reg
V8 = Doc ann
"q8"; pq F2Reg
V9 = Doc ann
"q9"; pq F2Reg
V10 = Doc ann
"q10"; pq F2Reg
V11 = Doc ann
"q11"; pq F2Reg
V12 = Doc ann
"q12"; pq F2Reg
V13 = Doc ann
"q13"; pq F2Reg
V14 = Doc ann
"q14"; pq F2Reg
V15 = Doc ann
"q15"
    pq F2Reg
V16 = Doc ann
"q16"; pq F2Reg
V17 = Doc ann
"q17"; pq F2Reg
V18 = Doc ann
"q18"; pq F2Reg
V19 = Doc ann
"q19"; pq F2Reg
V20 = Doc ann
"q20"; pq F2Reg
V21 = Doc ann
"q21"; pq F2Reg
V22 = Doc ann
"q22"; pq F2Reg
V23 = Doc ann
"q23"
    pq F2Reg
V24 = Doc ann
"q24"; pq F2Reg
V25 = Doc ann
"q25"; pq F2Reg
V26 = Doc ann
"q26"; pq F2Reg
V27 = Doc ann
"q27"; pq F2Reg
V28 = Doc ann
"q28"; pq F2Reg
V29 = Doc ann
"q29"; pq F2Reg
V30 = Doc ann
"q30"; pq F2Reg
V31 = Doc ann
"q31"

instance NFData AReg where
instance NFData FAReg where
instance NFData F2Reg where

data AbsReg = IReg !Int | CArg0 | CArg1 | CArg2 | CArg3 | CArg4 | CArg5 | CArg6 | CArg7 | LR | FP | ASP
-- r0-r7 used for return values as well

instance Pretty AbsReg where
    pretty :: forall ann. AbsReg -> Doc ann
pretty (IReg Int
i) = Doc ann
"T" Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Int -> Doc ann
forall ann. Int -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty Int
i
    pretty AbsReg
LR       = Doc ann
"LR"
    pretty AbsReg
ASP      = Doc ann
"SP"
    pretty AbsReg
CArg0    = Doc ann
"X0"
    pretty AbsReg
CArg1    = Doc ann
"X1"
    pretty AbsReg
CArg2    = Doc ann
"X2"
    pretty AbsReg
CArg3    = Doc ann
"X3"
    pretty AbsReg
CArg4    = Doc ann
"X4"
    pretty AbsReg
CArg5    = Doc ann
"X5"
    pretty AbsReg
CArg6    = Doc ann
"X6"
    pretty AbsReg
CArg7    = Doc ann
"X7"
    pretty AbsReg
FP       = Doc ann
"FP"

data F2Abs = F2Reg !Int

instance SIMD F2Abs where pq :: forall ann. F2Abs -> Doc ann
pq (F2Reg Int
i) = Doc ann
"~Q" Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Int -> Doc ann
forall ann. Int -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty Int
i; pv :: forall ann. F2Abs -> Doc ann
pv (F2Reg Int
i) = Doc ann
"~V" Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Int -> Doc ann
forall ann. Int -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty Int
i

data FAbsReg = FReg !Int | FArg0 | FArg1 | FArg2 | FArg3 | FArg4 | FArg5 | FArg6 | FArg7

instance Pretty FAbsReg where
    pretty :: forall ann. FAbsReg -> Doc ann
pretty (FReg Int
i) = Doc ann
"F" Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Int -> Doc ann
forall ann. Int -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty Int
i
    pretty FAbsReg
FArg0    = Doc ann
"D0"
    pretty FAbsReg
FArg1    = Doc ann
"D1"
    pretty FAbsReg
FArg2    = Doc ann
"D2"
    pretty FAbsReg
FArg3    = Doc ann
"D3"
    pretty FAbsReg
FArg4    = Doc ann
"D4"
    pretty FAbsReg
FArg5    = Doc ann
"D5"
    pretty FAbsReg
FArg6    = Doc ann
"D6"
    pretty FAbsReg
FArg7    = Doc ann
"D7"

toInt :: AbsReg -> Int
toInt :: AbsReg -> Int
toInt AbsReg
CArg0    = Int
0
toInt AbsReg
CArg1    = Int
1
toInt AbsReg
CArg2    = Int
2
toInt AbsReg
CArg3    = Int
3
toInt AbsReg
CArg4    = Int
4
toInt AbsReg
CArg5    = Int
5
toInt AbsReg
CArg6    = Int
6
toInt AbsReg
CArg7    = Int
7
toInt AbsReg
LR       = Int
8
toInt AbsReg
ASP      = Int
9
toInt AbsReg
FP       = Int
18
toInt (IReg Int
i) = Int
19Int -> Int -> Int
forall a. Num a => a -> a -> a
+Int
i

fToInt :: FAbsReg -> Int
fToInt :: FAbsReg -> Int
fToInt FAbsReg
FArg0    = Int
10
fToInt FAbsReg
FArg1    = Int
11
fToInt FAbsReg
FArg2    = Int
12
fToInt FAbsReg
FArg3    = Int
13
fToInt FAbsReg
FArg4    = Int
14
fToInt FAbsReg
FArg5    = Int
15
fToInt FAbsReg
FArg6    = Int
16
fToInt FAbsReg
FArg7    = Int
17
fToInt (FReg Int
i) = Int
19Int -> Int -> Int
forall a. Num a => a -> a -> a
+Int
i

f2ToInt :: F2Abs -> Int
f2ToInt :: F2Abs -> Int
f2ToInt (F2Reg Int
i) = Int
19Int -> Int -> Int
forall a. Num a => a -> a -> a
+Int
i

data Shift = Zero | Three

instance NFData Shift where rnf :: Shift -> ()
rnf Shift
Zero = (); rnf Shift
Three = ()

instance Pretty Shift where
    pretty :: forall ann. Shift -> Doc ann
pretty Shift
Zero = Doc ann
"#0"; pretty Shift
Three = Doc ann
"#3"

-- left: shift left by this much
data BM = BM { BM -> Word8
ims, BM -> Word8
left :: !Word8 } deriving BM -> BM -> Bool
(BM -> BM -> Bool) -> (BM -> BM -> Bool) -> Eq BM
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: BM -> BM -> Bool
== :: BM -> BM -> Bool
$c/= :: BM -> BM -> Bool
/= :: BM -> BM -> Bool
Eq

instance NFData BM where rnf :: BM -> ()
rnf (BM Word8
i Word8
ls) = Word8 -> ()
forall a. NFData a => a -> ()
rnf Word8
i () -> () -> ()
forall a b. a -> b -> b
`seq` Word8 -> ()
forall a. NFData a => a -> ()
rnf Word8
ls

instance Pretty BM where
    pretty :: forall ann. BM -> Doc ann
pretty (BM Word8
m Word8
l) = Doc ann
"0b" Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> [Char] -> Doc ann
forall ann. [Char] -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty (Int -> Char -> [Char]
forall a. Int -> a -> [a]
replicate (Word8 -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word8
m) Char
'1' [Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++ Int -> Char -> [Char]
forall a. Int -> a -> [a]
replicate (Word8 -> Int
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word8
l) Char
'0')

data Addr reg = R reg | RP reg Word16 | BI reg reg Shift deriving ((forall a b. (a -> b) -> Addr a -> Addr b)
-> (forall a b. a -> Addr b -> Addr a) -> Functor Addr
forall a b. a -> Addr b -> Addr a
forall a b. (a -> b) -> Addr a -> Addr b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
$cfmap :: forall a b. (a -> b) -> Addr a -> Addr b
fmap :: forall a b. (a -> b) -> Addr a -> Addr b
$c<$ :: forall a b. a -> Addr b -> Addr a
<$ :: forall a b. a -> Addr b -> Addr a
Functor, (forall x. Addr reg -> Rep (Addr reg) x)
-> (forall x. Rep (Addr reg) x -> Addr reg) -> Generic (Addr reg)
forall x. Rep (Addr reg) x -> Addr reg
forall x. Addr reg -> Rep (Addr reg) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall reg x. Rep (Addr reg) x -> Addr reg
forall reg x. Addr reg -> Rep (Addr reg) x
$cfrom :: forall reg x. Addr reg -> Rep (Addr reg) x
from :: forall x. Addr reg -> Rep (Addr reg) x
$cto :: forall reg x. Rep (Addr reg) x -> Addr reg
to :: forall x. Rep (Addr reg) x -> Addr reg
Generic)

instance NFData a => NFData (Addr a) where

instance Pretty reg => Pretty (Addr reg) where
    pretty :: forall ann. Addr reg -> Doc ann
pretty (R reg
r)      = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
brackets (reg -> Doc ann
forall ann. reg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty reg
r)
    pretty (RP reg
r Word16
0)   = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
brackets (reg -> Doc ann
forall ann. reg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty reg
r)
    pretty (RP reg
r Word16
u)   = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
brackets (reg -> Doc ann
forall ann. reg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty reg
r Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"," Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Word16 -> Doc ann
forall a ann. Integral a => a -> Doc ann
hexd Word16
u)
    pretty (BI reg
b reg
i Shift
s) = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
brackets (reg -> Doc ann
forall ann. reg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty reg
b Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"," Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> reg -> Doc ann
forall ann. reg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty reg
i Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"," Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
"LSL" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Shift -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. Shift -> Doc ann
pretty Shift
s)

data Cond = Eq | Neq | Geq | Lt | Gt | Leq

instance NFData Cond where rnf :: Cond -> ()
rnf Cond
Eq=(); rnf Cond
Neq=(); rnf Cond
Geq=(); rnf Cond
Lt=(); rnf Cond
Gt=(); rnf Cond
Leq=()

instance Pretty Cond where
    pretty :: forall ann. Cond -> Doc ann
pretty Cond
Eq = Doc ann
"EQ"; pretty Cond
Neq = Doc ann
"NE"; pretty Cond
Geq = Doc ann
"GE"
    pretty Cond
Lt = Doc ann
"LT"; pretty Cond
Gt = Doc ann
"GT"; pretty Cond
Leq = Doc ann
"LE"

pSym :: Pretty a => a -> Doc ann
pSym :: forall a ann. Pretty a => a -> Doc ann
pSym = case [Char]
os of {[Char]
"linux" -> Doc ann -> Doc ann
forall a. a -> a
id; [Char]
"darwin" -> (Doc ann
"_"Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<>)}(Doc ann -> Doc ann) -> (a -> Doc ann) -> a -> Doc ann
forall b c a. (b -> c) -> (a -> b) -> a -> c
.a -> Doc ann
forall ann. a -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty

-- https://developer.arm.com/documentation/ddi0596/2020-12/Base-Instructions
data AArch64 reg freg f2 a = Label { forall reg freg f2 a. AArch64 reg freg f2 a -> a
ann :: a, forall reg freg f2 a. AArch64 reg freg f2 a -> Label
label :: Label }
                         | B { ann :: a, label :: Label }
                         | Blr { ann :: a, forall reg freg f2 a. AArch64 reg freg f2 a -> reg
rSrc :: reg }
                         | C { ann :: a, label :: Label }
                         | Bl { ann :: a, forall reg freg f2 a. AArch64 reg freg f2 a -> CFunc
cfunc :: CFunc }
                         | Bc { ann :: a, forall reg freg f2 a. AArch64 reg freg f2 a -> Cond
cond :: Cond, label :: Label }
                         | Ret { ann :: a }                                              | RetL { ann :: a, label :: Label }
                         | FMovXX { ann :: a, forall reg freg f2 a. AArch64 reg freg f2 a -> freg
dDest, forall reg freg f2 a. AArch64 reg freg f2 a -> freg
dSrc :: freg }
                         | FMovDR { ann :: a, dDest :: freg, rSrc :: reg }
                         | MovRR { ann :: a, forall reg freg f2 a. AArch64 reg freg f2 a -> reg
rDest, rSrc :: reg }
                         | MovRC { ann :: a, rDest :: reg, forall reg freg f2 a. AArch64 reg freg f2 a -> Word16
cSrc :: Word16 }
                         | MovZ { ann :: a, rDest :: reg, cSrc :: Word16, forall reg freg f2 a. AArch64 reg freg f2 a -> Int
lsl :: Int }
                         | MovRCf { ann :: a, rDest :: reg, cfunc :: CFunc }
                         | LdrRL { ann :: a, rDest :: reg, forall reg freg f2 a. AArch64 reg freg f2 a -> Int
lSrc :: Int }
                         | MovK { ann :: a, rDest :: reg, cSrc :: Word16, lsl :: Int }
                         | Ldr { ann :: a, rDest :: reg, forall reg freg f2 a. AArch64 reg freg f2 a -> Addr reg
aSrc :: Addr reg }
                         | LdrB { ann :: a, rDest :: reg, aSrc :: Addr reg }
                         | Str { ann :: a, rSrc :: reg, forall reg freg f2 a. AArch64 reg freg f2 a -> Addr reg
aDest :: Addr reg }
                         | StrB { ann :: a, rSrc :: reg, aDest :: Addr reg }
                         | LdrD { ann :: a, dDest :: freg, aSrc :: Addr reg }
                         | StrD { ann :: a, dSrc :: freg, aDest :: Addr reg }
                         | SubRR { ann :: a, rDest, forall reg freg f2 a. AArch64 reg freg f2 a -> reg
rSrc1, forall reg freg f2 a. AArch64 reg freg f2 a -> reg
rSrc2 :: reg }
                         | AddRR { ann :: a, rDest, rSrc1, rSrc2 :: reg }
                         | AddRRS { ann :: a, rDest, rSrc1, rSrc2 :: reg, forall reg freg f2 a. AArch64 reg freg f2 a -> Word8
sC :: Word8 }
                         | ZeroR { ann :: a, rDest :: reg }
                         | Mvn { ann :: a, rDest, rSrc :: reg }
                         | AndRR { ann :: a, rDest, rSrc1, rSrc2 :: reg }
                         | OrRR { ann :: a, rDest, rSrc1, rSrc2 :: reg }
                         | Eor { ann :: a, rDest, rSrc1, rSrc2 :: reg }
                         | MulRR { ann :: a, rDest, rSrc1, rSrc2 :: reg }
                         | Madd { ann :: a, rDest, rSrc1, rSrc2, forall reg freg f2 a. AArch64 reg freg f2 a -> reg
rSrc3 :: reg }
                         | Msub { ann :: a, rDest, rSrc1, rSrc2, rSrc3 :: reg }
                         | Sdiv { ann :: a, rDest, rSrc1, rSrc2 :: reg }
                         | AddRC { ann :: a, rDest, rSrc :: reg, forall reg freg f2 a. AArch64 reg freg f2 a -> Word16
rC :: Word16 }
                         | SubRC { ann :: a, rDest, rSrc :: reg, rC :: Word16 }
                         | Lsl { ann :: a, rDest, rSrc :: reg, sC :: Word8 }
                         | Asr { ann :: a, rDest, rSrc :: reg, sC :: Word8 }
                         | CmpRC { ann :: a, rSrc :: reg, cSrc :: Word16 }
                         | CmpRR { ann :: a, rSrc1, rSrc2 :: reg }
                         | Neg { ann :: a, rDest, rSrc :: reg }
                         | Fmul { ann :: a, dDest, forall reg freg f2 a. AArch64 reg freg f2 a -> freg
dSrc1, forall reg freg f2 a. AArch64 reg freg f2 a -> freg
dSrc2 :: freg }
                         | Fadd { ann :: a, dDest, dSrc1, dSrc2 :: freg }
                         | Fsub { ann :: a, dDest, dSrc1, dSrc2 :: freg }
                         | Fdiv { ann :: a, dDest, dSrc1, dSrc2 :: freg }
                         | FcmpZ { ann :: a, dSrc :: freg }
                         | Fcmp { ann :: a, dSrc1, dSrc2 :: freg }
                         | Fneg { ann :: a, dDest, dSrc :: freg }
                         | Scvtf { ann :: a, dDest :: freg, rSrc :: reg }
                         | Fcvtms { ann :: a, rDest :: reg, dSrc :: freg }
                         | Fcvtas { ann :: a, rDest :: reg, dSrc :: freg }
                         | Stp { ann :: a, rSrc1, rSrc2 :: reg, aDest :: Addr reg }
                         | Ldp { ann :: a, forall reg freg f2 a. AArch64 reg freg f2 a -> reg
rDest1, forall reg freg f2 a. AArch64 reg freg f2 a -> reg
rDest2 :: reg, aSrc :: Addr reg }
                         | Stp2 { ann :: a, forall reg freg f2 a. AArch64 reg freg f2 a -> f2
r2Src1, forall reg freg f2 a. AArch64 reg freg f2 a -> f2
r2Src2 :: f2, aDest :: Addr reg }
                         | Ldp2 { ann :: a, forall reg freg f2 a. AArch64 reg freg f2 a -> f2
r2Dest1, forall reg freg f2 a. AArch64 reg freg f2 a -> f2
r2Dest2 :: f2, forall reg freg f2 a. AArch64 reg freg f2 a -> Addr reg
aRc :: Addr reg }
                         | StpD { ann :: a, dSrc1, dSrc2 :: freg, aDest :: Addr reg }
                         | LdpD { ann :: a, forall reg freg f2 a. AArch64 reg freg f2 a -> freg
dDest1, forall reg freg f2 a. AArch64 reg freg f2 a -> freg
dDest2 :: freg, aSrc :: Addr reg }
                         | Fmadd { ann :: a, dDest, dSrc1, dSrc2, forall reg freg f2 a. AArch64 reg freg f2 a -> freg
dSrc3 :: freg }
                         | Fmsub { ann :: a, dDest, dSrc1, dSrc2, dSrc3 :: freg }
                         | Fsqrt { ann :: a, dDest, dSrc :: freg }
                         | Frintm { ann :: a, dDest, dSrc :: freg }
                         | MrsR { ann :: a, rDest :: reg }
                         | Fmax { ann :: a, dDest, dSrc1, dSrc2 :: freg }
                         | Fmin { ann :: a, dDest, dSrc1, dSrc2 :: freg }
                         | Fabs { ann :: a, dDest, dSrc :: freg }
                         | Csel { ann :: a, rDest, rSrc1, rSrc2 :: reg, cond :: Cond }
                         | Tbnz { ann :: a, rSrc :: reg, forall reg freg f2 a. AArch64 reg freg f2 a -> Word8
bit :: Word8, label :: Label }
                         | Tbz { ann :: a, rSrc :: reg, bit :: Word8, label :: Label }
                         | Cbnz { ann :: a, rSrc :: reg, label :: Label }
                         | Cbz { ann :: a, rSrc :: reg, label :: Label }
                         | Fcsel { ann :: a, dDest, dSrc1, dSrc2 :: freg, cond :: Cond }
                         | Cset { ann :: a, rDest :: reg, cond :: Cond }
                         | TstI { ann :: a, rSrc1 :: reg, forall reg freg f2 a. AArch64 reg freg f2 a -> BM
imm :: BM }
                         | EorI { ann :: a, rSrc, forall reg freg f2 a. AArch64 reg freg f2 a -> reg
rDesg :: reg, imm :: BM }
                         deriving ((forall a b.
 (a -> b) -> AArch64 reg freg f2 a -> AArch64 reg freg f2 b)
-> (forall a b.
    a -> AArch64 reg freg f2 b -> AArch64 reg freg f2 a)
-> Functor (AArch64 reg freg f2)
forall a b. a -> AArch64 reg freg f2 b -> AArch64 reg freg f2 a
forall a b.
(a -> b) -> AArch64 reg freg f2 a -> AArch64 reg freg f2 b
forall reg freg f2 a b.
a -> AArch64 reg freg f2 b -> AArch64 reg freg f2 a
forall reg freg f2 a b.
(a -> b) -> AArch64 reg freg f2 a -> AArch64 reg freg f2 b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
$cfmap :: forall reg freg f2 a b.
(a -> b) -> AArch64 reg freg f2 a -> AArch64 reg freg f2 b
fmap :: forall a b.
(a -> b) -> AArch64 reg freg f2 a -> AArch64 reg freg f2 b
$c<$ :: forall reg freg f2 a b.
a -> AArch64 reg freg f2 b -> AArch64 reg freg f2 a
<$ :: forall a b. a -> AArch64 reg freg f2 b -> AArch64 reg freg f2 a
Functor, (forall x. AArch64 reg freg f2 a -> Rep (AArch64 reg freg f2 a) x)
-> (forall x.
    Rep (AArch64 reg freg f2 a) x -> AArch64 reg freg f2 a)
-> Generic (AArch64 reg freg f2 a)
forall x. Rep (AArch64 reg freg f2 a) x -> AArch64 reg freg f2 a
forall x. AArch64 reg freg f2 a -> Rep (AArch64 reg freg f2 a) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall reg freg f2 a x.
Rep (AArch64 reg freg f2 a) x -> AArch64 reg freg f2 a
forall reg freg f2 a x.
AArch64 reg freg f2 a -> Rep (AArch64 reg freg f2 a) x
$cfrom :: forall reg freg f2 a x.
AArch64 reg freg f2 a -> Rep (AArch64 reg freg f2 a) x
from :: forall x. AArch64 reg freg f2 a -> Rep (AArch64 reg freg f2 a) x
$cto :: forall reg freg f2 a x.
Rep (AArch64 reg freg f2 a) x -> AArch64 reg freg f2 a
to :: forall x. Rep (AArch64 reg freg f2 a) x -> AArch64 reg freg f2 a
Generic)

instance (NFData r, NFData d, NFData x, NFData a) => NFData (AArch64 r d x a) where

instance Copointed (AArch64 reg freg f2) where copoint :: forall a. AArch64 reg freg f2 a -> a
copoint = AArch64 reg freg f2 a -> a
forall reg freg f2 a. AArch64 reg freg f2 a -> a
ann

mapR :: (areg -> reg) -> AArch64 areg afreg af2 a -> AArch64 reg afreg af2 a
mapR :: forall areg reg afreg af2 a.
(areg -> reg)
-> AArch64 areg afreg af2 a -> AArch64 reg afreg af2 a
mapR areg -> reg
_ (Label a
x Label
l)           = a -> Label -> AArch64 reg afreg af2 a
forall reg freg f2 a. a -> Label -> AArch64 reg freg f2 a
Label a
x Label
l
mapR areg -> reg
_ (B a
x Label
l)               = a -> Label -> AArch64 reg afreg af2 a
forall reg freg f2 a. a -> Label -> AArch64 reg freg f2 a
B a
x Label
l
mapR areg -> reg
_ (Bc a
x Cond
c Label
l)            = a -> Cond -> Label -> AArch64 reg afreg af2 a
forall reg freg f2 a. a -> Cond -> Label -> AArch64 reg freg f2 a
Bc a
x Cond
c Label
l
mapR areg -> reg
_ (Bl a
x CFunc
f)              = a -> CFunc -> AArch64 reg afreg af2 a
forall reg freg f2 a. a -> CFunc -> AArch64 reg freg f2 a
Bl a
x CFunc
f
mapR areg -> reg
_ (C a
x Label
l)               = a -> Label -> AArch64 reg afreg af2 a
forall reg freg f2 a. a -> Label -> AArch64 reg freg f2 a
C a
x Label
l
mapR areg -> reg
_ (FMovXX a
l afreg
r0 afreg
r1)      = a -> afreg -> afreg -> AArch64 reg afreg af2 a
forall reg freg f2 a. a -> freg -> freg -> AArch64 reg freg f2 a
FMovXX a
l afreg
r0 afreg
r1
mapR areg -> reg
f (MovRR a
l areg
r0 areg
r1)       = a -> reg -> reg -> AArch64 reg afreg af2 a
forall reg freg f2 a. a -> reg -> reg -> AArch64 reg freg f2 a
MovRR a
l (areg -> reg
f areg
r0) (areg -> reg
f areg
r1)
mapR areg -> reg
f (MovRC a
l areg
r Word16
c)         = a -> reg -> Word16 -> AArch64 reg afreg af2 a
forall reg freg f2 a. a -> reg -> Word16 -> AArch64 reg freg f2 a
MovRC a
l (areg -> reg
f areg
r) Word16
c
mapR areg -> reg
f (Ldr a
l areg
r Addr areg
a)           = a -> reg -> Addr reg -> AArch64 reg afreg af2 a
forall reg freg f2 a. a -> reg -> Addr reg -> AArch64 reg freg f2 a
Ldr a
l (areg -> reg
f areg
r) (areg -> reg
f (areg -> reg) -> Addr areg -> Addr reg
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Addr areg
a)
mapR areg -> reg
f (LdrB a
l areg
r Addr areg
a)          = a -> reg -> Addr reg -> AArch64 reg afreg af2 a
forall reg freg f2 a. a -> reg -> Addr reg -> AArch64 reg freg f2 a
LdrB a
l (areg -> reg
f areg
r) (areg -> reg
f (areg -> reg) -> Addr areg -> Addr reg
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Addr areg
a)
mapR areg -> reg
f (Str a
l areg
r Addr areg
a)           = a -> reg -> Addr reg -> AArch64 reg afreg af2 a
forall reg freg f2 a. a -> reg -> Addr reg -> AArch64 reg freg f2 a
Str a
l (areg -> reg
f areg
r) (areg -> reg
f (areg -> reg) -> Addr areg -> Addr reg
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Addr areg
a)
mapR areg -> reg
f (StrB a
l areg
r Addr areg
a)          = a -> reg -> Addr reg -> AArch64 reg afreg af2 a
forall reg freg f2 a. a -> reg -> Addr reg -> AArch64 reg freg f2 a
StrB a
l (areg -> reg
f areg
r) (areg -> reg
f(areg -> reg) -> Addr areg -> Addr reg
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>Addr areg
a)
mapR areg -> reg
f (LdrD a
l afreg
xr Addr areg
a)         = a -> afreg -> Addr reg -> AArch64 reg afreg af2 a
forall reg freg f2 a.
a -> freg -> Addr reg -> AArch64 reg freg f2 a
LdrD a
l afreg
xr (areg -> reg
f (areg -> reg) -> Addr areg -> Addr reg
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Addr areg
a)
mapR areg -> reg
f (AddRR a
l areg
r0 areg
r1 areg
r2)    = a -> reg -> reg -> reg -> AArch64 reg afreg af2 a
forall reg freg f2 a.
a -> reg -> reg -> reg -> AArch64 reg freg f2 a
AddRR a
l (areg -> reg
f areg
r0) (areg -> reg
f areg
r1) (areg -> reg
f areg
r2)
mapR areg -> reg
f (AddRRS a
l areg
r0 areg
r1 areg
r2 Word8
s) = a -> reg -> reg -> reg -> Word8 -> AArch64 reg afreg af2 a
forall reg freg f2 a.
a -> reg -> reg -> reg -> Word8 -> AArch64 reg freg f2 a
AddRRS a
l (areg -> reg
f areg
r0) (areg -> reg
f areg
r1) (areg -> reg
f areg
r2) Word8
s
mapR areg -> reg
f (SubRR a
l areg
r0 areg
r1 areg
r2)    = a -> reg -> reg -> reg -> AArch64 reg afreg af2 a
forall reg freg f2 a.
a -> reg -> reg -> reg -> AArch64 reg freg f2 a
SubRR a
l (areg -> reg
f areg
r0) (areg -> reg
f areg
r1) (areg -> reg
f areg
r2)
mapR areg -> reg
f (AddRC a
l areg
r0 areg
r1 Word16
c)     = a -> reg -> reg -> Word16 -> AArch64 reg afreg af2 a
forall reg freg f2 a.
a -> reg -> reg -> Word16 -> AArch64 reg freg f2 a
AddRC a
l (areg -> reg
f areg
r0) (areg -> reg
f areg
r1) Word16
c
mapR areg -> reg
f (SubRC a
l areg
r0 areg
r1 Word16
c)     = a -> reg -> reg -> Word16 -> AArch64 reg afreg af2 a
forall reg freg f2 a.
a -> reg -> reg -> Word16 -> AArch64 reg freg f2 a
SubRC a
l (areg -> reg
f areg
r0) (areg -> reg
f areg
r1) Word16
c
mapR areg -> reg
f (ZeroR a
l areg
r)           = a -> reg -> AArch64 reg afreg af2 a
forall reg freg f2 a. a -> reg -> AArch64 reg freg f2 a
ZeroR a
l (areg -> reg
f areg
r)
mapR areg -> reg
f (Mvn a
l areg
r0 areg
r1)         = a -> reg -> reg -> AArch64 reg afreg af2 a
forall reg freg f2 a. a -> reg -> reg -> AArch64 reg freg f2 a
Mvn a
l (areg -> reg
f areg
r0) (areg -> reg
f areg
r1)
mapR areg -> reg
f (AndRR a
l areg
r0 areg
r1 areg
r2)    = a -> reg -> reg -> reg -> AArch64 reg afreg af2 a
forall reg freg f2 a.
a -> reg -> reg -> reg -> AArch64 reg freg f2 a
AndRR a
l (areg -> reg
f areg
r0) (areg -> reg
f areg
r1) (areg -> reg
f areg
r2)
mapR areg -> reg
f (OrRR a
l areg
r0 areg
r1 areg
r2)     = a -> reg -> reg -> reg -> AArch64 reg afreg af2 a
forall reg freg f2 a.
a -> reg -> reg -> reg -> AArch64 reg freg f2 a
OrRR a
l (areg -> reg
f areg
r0) (areg -> reg
f areg
r1) (areg -> reg
f areg
r2)
mapR areg -> reg
f (Eor a
l areg
r0 areg
r1 areg
r2)      = a -> reg -> reg -> reg -> AArch64 reg afreg af2 a
forall reg freg f2 a.
a -> reg -> reg -> reg -> AArch64 reg freg f2 a
Eor a
l (areg -> reg
f areg
r0) (areg -> reg
f areg
r1) (areg -> reg
f areg
r2)
mapR areg -> reg
f (Lsl a
l areg
r0 areg
r1 Word8
s)       = a -> reg -> reg -> Word8 -> AArch64 reg afreg af2 a
forall reg freg f2 a.
a -> reg -> reg -> Word8 -> AArch64 reg freg f2 a
Lsl a
l (areg -> reg
f areg
r0) (areg -> reg
f areg
r1) Word8
s
mapR areg -> reg
f (Asr a
l areg
r0 areg
r1 Word8
s)       = a -> reg -> reg -> Word8 -> AArch64 reg afreg af2 a
forall reg freg f2 a.
a -> reg -> reg -> Word8 -> AArch64 reg freg f2 a
Asr a
l (areg -> reg
f areg
r0) (areg -> reg
f areg
r1) Word8
s
mapR areg -> reg
f (CmpRR a
l areg
r0 areg
r1)       = a -> reg -> reg -> AArch64 reg afreg af2 a
forall reg freg f2 a. a -> reg -> reg -> AArch64 reg freg f2 a
CmpRR a
l (areg -> reg
f areg
r0) (areg -> reg
f areg
r1)
mapR areg -> reg
f (CmpRC a
l areg
r Word16
c)         = a -> reg -> Word16 -> AArch64 reg afreg af2 a
forall reg freg f2 a. a -> reg -> Word16 -> AArch64 reg freg f2 a
CmpRC a
l (areg -> reg
f areg
r) Word16
c
mapR areg -> reg
f (Neg a
l areg
r0 areg
r1)         = a -> reg -> reg -> AArch64 reg afreg af2 a
forall reg freg f2 a. a -> reg -> reg -> AArch64 reg freg f2 a
Neg a
l (areg -> reg
f areg
r0) (areg -> reg
f areg
r1)
mapR areg -> reg
_ (Fadd a
l afreg
xr0 afreg
xr1 afreg
xr2)  = a -> afreg -> afreg -> afreg -> AArch64 reg afreg af2 a
forall reg freg f2 a.
a -> freg -> freg -> freg -> AArch64 reg freg f2 a
Fadd a
l afreg
xr0 afreg
xr1 afreg
xr2
mapR areg -> reg
_ (Fsub a
l afreg
xr0 afreg
xr1 afreg
xr2)  = a -> afreg -> afreg -> afreg -> AArch64 reg afreg af2 a
forall reg freg f2 a.
a -> freg -> freg -> freg -> AArch64 reg freg f2 a
Fsub a
l afreg
xr0 afreg
xr1 afreg
xr2
mapR areg -> reg
_ (Fmul a
l afreg
xr0 afreg
xr1 afreg
xr2)  = a -> afreg -> afreg -> afreg -> AArch64 reg afreg af2 a
forall reg freg f2 a.
a -> freg -> freg -> freg -> AArch64 reg freg f2 a
Fmul a
l afreg
xr0 afreg
xr1 afreg
xr2
mapR areg -> reg
_ (Fneg a
l afreg
xr0 afreg
xr1)      = a -> afreg -> afreg -> AArch64 reg afreg af2 a
forall reg freg f2 a. a -> freg -> freg -> AArch64 reg freg f2 a
Fneg a
l afreg
xr0 afreg
xr1
mapR areg -> reg
_ (FcmpZ a
l afreg
xr)          = a -> afreg -> AArch64 reg afreg af2 a
forall reg freg f2 a. a -> freg -> AArch64 reg freg f2 a
FcmpZ a
l afreg
xr
mapR areg -> reg
_ (Ret a
l)               = a -> AArch64 reg afreg af2 a
forall reg freg f2 a. a -> AArch64 reg freg f2 a
Ret a
l
mapR areg -> reg
_ (RetL a
x Label
l)            = a -> Label -> AArch64 reg afreg af2 a
forall reg freg f2 a. a -> Label -> AArch64 reg freg f2 a
RetL a
x Label
l
mapR areg -> reg
f (MulRR a
l areg
r0 areg
r1 areg
r2)    = a -> reg -> reg -> reg -> AArch64 reg afreg af2 a
forall reg freg f2 a.
a -> reg -> reg -> reg -> AArch64 reg freg f2 a
MulRR a
l (areg -> reg
f areg
r0) (areg -> reg
f areg
r1) (areg -> reg
f areg
r2)
mapR areg -> reg
f (Madd a
l areg
r0 areg
r1 areg
r2 areg
r3)  = a -> reg -> reg -> reg -> reg -> AArch64 reg afreg af2 a
forall reg freg f2 a.
a -> reg -> reg -> reg -> reg -> AArch64 reg freg f2 a
Madd a
l (areg -> reg
f areg
r0) (areg -> reg
f areg
r1) (areg -> reg
f areg
r2) (areg -> reg
f areg
r3)
mapR areg -> reg
f (Msub a
l areg
r0 areg
r1 areg
r2 areg
r3)  = a -> reg -> reg -> reg -> reg -> AArch64 reg afreg af2 a
forall reg freg f2 a.
a -> reg -> reg -> reg -> reg -> AArch64 reg freg f2 a
Msub a
l (areg -> reg
f areg
r0) (areg -> reg
f areg
r1) (areg -> reg
f areg
r2) (areg -> reg
f areg
r3)
mapR areg -> reg
f (Sdiv a
l areg
r0 areg
r1 areg
r2)     = a -> reg -> reg -> reg -> AArch64 reg afreg af2 a
forall reg freg f2 a.
a -> reg -> reg -> reg -> AArch64 reg freg f2 a
Sdiv a
l (areg -> reg
f areg
r0) (areg -> reg
f areg
r1) (areg -> reg
f areg
r2)
mapR areg -> reg
f (StrD a
l afreg
d Addr areg
a)          = a -> afreg -> Addr reg -> AArch64 reg afreg af2 a
forall reg freg f2 a.
a -> freg -> Addr reg -> AArch64 reg freg f2 a
StrD a
l afreg
d (areg -> reg
f (areg -> reg) -> Addr areg -> Addr reg
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Addr areg
a)
mapR areg -> reg
_ (Fdiv a
l afreg
d0 afreg
d1 afreg
d2)     = a -> afreg -> afreg -> afreg -> AArch64 reg afreg af2 a
forall reg freg f2 a.
a -> freg -> freg -> freg -> AArch64 reg freg f2 a
Fdiv a
l afreg
d0 afreg
d1 afreg
d2
mapR areg -> reg
f (Scvtf a
l afreg
d areg
r)         = a -> afreg -> reg -> AArch64 reg afreg af2 a
forall reg freg f2 a. a -> freg -> reg -> AArch64 reg freg f2 a
Scvtf a
l afreg
d (areg -> reg
f areg
r)
mapR areg -> reg
f (Fcvtms a
l areg
r afreg
d)        = a -> reg -> afreg -> AArch64 reg afreg af2 a
forall reg freg f2 a. a -> reg -> freg -> AArch64 reg freg f2 a
Fcvtms a
l (areg -> reg
f areg
r) afreg
d
mapR areg -> reg
f (Fcvtas a
l areg
r afreg
d)        = a -> reg -> afreg -> AArch64 reg afreg af2 a
forall reg freg f2 a. a -> reg -> freg -> AArch64 reg freg f2 a
Fcvtas a
l (areg -> reg
f areg
r) afreg
d
mapR areg -> reg
f (MovK a
l areg
r Word16
u Int
s)        = a -> reg -> Word16 -> Int -> AArch64 reg afreg af2 a
forall reg freg f2 a.
a -> reg -> Word16 -> Int -> AArch64 reg freg f2 a
MovK a
l (areg -> reg
f areg
r) Word16
u Int
s
mapR areg -> reg
f (MovZ a
l areg
r Word16
u Int
s)        = a -> reg -> Word16 -> Int -> AArch64 reg afreg af2 a
forall reg freg f2 a.
a -> reg -> Word16 -> Int -> AArch64 reg freg f2 a
MovZ a
l (areg -> reg
f areg
r) Word16
u Int
s
mapR areg -> reg
f (FMovDR a
l afreg
d areg
r)        = a -> afreg -> reg -> AArch64 reg afreg af2 a
forall reg freg f2 a. a -> freg -> reg -> AArch64 reg freg f2 a
FMovDR a
l afreg
d (areg -> reg
f areg
r)
mapR areg -> reg
_ (Fcmp a
l afreg
d0 afreg
d1)        = a -> afreg -> afreg -> AArch64 reg afreg af2 a
forall reg freg f2 a. a -> freg -> freg -> AArch64 reg freg f2 a
Fcmp a
l afreg
d0 afreg
d1
mapR areg -> reg
f (Ldp a
l areg
r0 areg
r1 Addr areg
a)       = a -> reg -> reg -> Addr reg -> AArch64 reg afreg af2 a
forall reg freg f2 a.
a -> reg -> reg -> Addr reg -> AArch64 reg freg f2 a
Ldp a
l (areg -> reg
f areg
r0) (areg -> reg
f areg
r1) (areg -> reg
f (areg -> reg) -> Addr areg -> Addr reg
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Addr areg
a)
mapR areg -> reg
f (Stp a
l areg
r0 areg
r1 Addr areg
a)       = a -> reg -> reg -> Addr reg -> AArch64 reg afreg af2 a
forall reg freg f2 a.
a -> reg -> reg -> Addr reg -> AArch64 reg freg f2 a
Stp a
l (areg -> reg
f areg
r0) (areg -> reg
f areg
r1) (areg -> reg
f (areg -> reg) -> Addr areg -> Addr reg
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Addr areg
a)
mapR areg -> reg
f (LdpD a
l afreg
d0 afreg
d1 Addr areg
a)      = a -> afreg -> afreg -> Addr reg -> AArch64 reg afreg af2 a
forall reg freg f2 a.
a -> freg -> freg -> Addr reg -> AArch64 reg freg f2 a
LdpD a
l afreg
d0 afreg
d1 (areg -> reg
f (areg -> reg) -> Addr areg -> Addr reg
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Addr areg
a)
mapR areg -> reg
f (StpD a
l afreg
d0 afreg
d1 Addr areg
a)      = a -> afreg -> afreg -> Addr reg -> AArch64 reg afreg af2 a
forall reg freg f2 a.
a -> freg -> freg -> Addr reg -> AArch64 reg freg f2 a
StpD a
l afreg
d0 afreg
d1 (areg -> reg
f (areg -> reg) -> Addr areg -> Addr reg
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Addr areg
a)
mapR areg -> reg
_ (Fmadd a
l afreg
d0 afreg
d1 afreg
d2 afreg
d3) = a -> afreg -> afreg -> afreg -> afreg -> AArch64 reg afreg af2 a
forall reg freg f2 a.
a -> freg -> freg -> freg -> freg -> AArch64 reg freg f2 a
Fmadd a
l afreg
d0 afreg
d1 afreg
d2 afreg
d3
mapR areg -> reg
_ (Fmsub a
l afreg
d0 afreg
d1 afreg
d2 afreg
d3) = a -> afreg -> afreg -> afreg -> afreg -> AArch64 reg afreg af2 a
forall reg freg f2 a.
a -> freg -> freg -> freg -> freg -> AArch64 reg freg f2 a
Fmsub a
l afreg
d0 afreg
d1 afreg
d2 afreg
d3
mapR areg -> reg
_ (Fsqrt a
l afreg
d0 afreg
d1)       = a -> afreg -> afreg -> AArch64 reg afreg af2 a
forall reg freg f2 a. a -> freg -> freg -> AArch64 reg freg f2 a
Fsqrt a
l afreg
d0 afreg
d1
mapR areg -> reg
_ (Frintm a
l afreg
d0 afreg
d1)      = a -> afreg -> afreg -> AArch64 reg afreg af2 a
forall reg freg f2 a. a -> freg -> freg -> AArch64 reg freg f2 a
Frintm a
l afreg
d0 afreg
d1
mapR areg -> reg
f (MrsR a
l areg
r)            = a -> reg -> AArch64 reg afreg af2 a
forall reg freg f2 a. a -> reg -> AArch64 reg freg f2 a
MrsR a
l (areg -> reg
f areg
r)
mapR areg -> reg
f (MovRCf a
l areg
r CFunc
cf)       = a -> reg -> CFunc -> AArch64 reg afreg af2 a
forall reg freg f2 a. a -> reg -> CFunc -> AArch64 reg freg f2 a
MovRCf a
l (areg -> reg
f areg
r) CFunc
cf
mapR areg -> reg
f (LdrRL a
x areg
r Int
l)         = a -> reg -> Int -> AArch64 reg afreg af2 a
forall reg freg f2 a. a -> reg -> Int -> AArch64 reg freg f2 a
LdrRL a
x (areg -> reg
f areg
r) Int
l
mapR areg -> reg
f (Blr a
l areg
r)             = a -> reg -> AArch64 reg afreg af2 a
forall reg freg f2 a. a -> reg -> AArch64 reg freg f2 a
Blr a
l (areg -> reg
f areg
r)
mapR areg -> reg
_ (Fmax a
l afreg
d0 afreg
d1 afreg
d2)     = a -> afreg -> afreg -> afreg -> AArch64 reg afreg af2 a
forall reg freg f2 a.
a -> freg -> freg -> freg -> AArch64 reg freg f2 a
Fmax a
l afreg
d0 afreg
d1 afreg
d2
mapR areg -> reg
_ (Fmin a
l afreg
d0 afreg
d1 afreg
d2)     = a -> afreg -> afreg -> afreg -> AArch64 reg afreg af2 a
forall reg freg f2 a.
a -> freg -> freg -> freg -> AArch64 reg freg f2 a
Fmin a
l afreg
d0 afreg
d1 afreg
d2
mapR areg -> reg
_ (Fabs a
l afreg
d0 afreg
d1)        = a -> afreg -> afreg -> AArch64 reg afreg af2 a
forall reg freg f2 a. a -> freg -> freg -> AArch64 reg freg f2 a
Fabs a
l afreg
d0 afreg
d1
mapR areg -> reg
f (Csel a
l areg
r0 areg
r1 areg
r2 Cond
p)   = a -> reg -> reg -> reg -> Cond -> AArch64 reg afreg af2 a
forall reg freg f2 a.
a -> reg -> reg -> reg -> Cond -> AArch64 reg freg f2 a
Csel a
l (areg -> reg
f areg
r0) (areg -> reg
f areg
r1) (areg -> reg
f areg
r2) Cond
p
mapR areg -> reg
f (Tbnz a
l areg
r Word8
n Label
p)        = a -> reg -> Word8 -> Label -> AArch64 reg afreg af2 a
forall reg freg f2 a.
a -> reg -> Word8 -> Label -> AArch64 reg freg f2 a
Tbnz a
l (areg -> reg
f areg
r) Word8
n Label
p
mapR areg -> reg
f (Tbz a
l areg
r Word8
n Label
p)         = a -> reg -> Word8 -> Label -> AArch64 reg afreg af2 a
forall reg freg f2 a.
a -> reg -> Word8 -> Label -> AArch64 reg freg f2 a
Tbz a
l (areg -> reg
f areg
r) Word8
n Label
p
mapR areg -> reg
f (Cbnz a
x areg
r Label
l)          = a -> reg -> Label -> AArch64 reg afreg af2 a
forall reg freg f2 a. a -> reg -> Label -> AArch64 reg freg f2 a
Cbnz a
x (areg -> reg
f areg
r) Label
l
mapR areg -> reg
f (Cbz a
x areg
r Label
l)           = a -> reg -> Label -> AArch64 reg afreg af2 a
forall reg freg f2 a. a -> reg -> Label -> AArch64 reg freg f2 a
Cbz a
x (areg -> reg
f areg
r) Label
l
mapR areg -> reg
_ (Fcsel a
l afreg
d0 afreg
d1 afreg
d2 Cond
p)  = a -> afreg -> afreg -> afreg -> Cond -> AArch64 reg afreg af2 a
forall reg freg f2 a.
a -> freg -> freg -> freg -> Cond -> AArch64 reg freg f2 a
Fcsel a
l afreg
d0 afreg
d1 afreg
d2 Cond
p
mapR areg -> reg
f (TstI a
l areg
r BM
i)          = a -> reg -> BM -> AArch64 reg afreg af2 a
forall reg freg f2 a. a -> reg -> BM -> AArch64 reg freg f2 a
TstI a
l (areg -> reg
f areg
r) BM
i
mapR areg -> reg
f (Cset a
l areg
r Cond
c)          = a -> reg -> Cond -> AArch64 reg afreg af2 a
forall reg freg f2 a. a -> reg -> Cond -> AArch64 reg freg f2 a
Cset a
l (areg -> reg
f areg
r) Cond
c
mapR areg -> reg
f (EorI a
l areg
r0 areg
r1 BM
i)      = a -> reg -> reg -> BM -> AArch64 reg afreg af2 a
forall reg freg f2 a.
a -> reg -> reg -> BM -> AArch64 reg freg f2 a
EorI a
l (areg -> reg
f areg
r0) (areg -> reg
f areg
r1) BM
i
mapR areg -> reg
f (Ldp2 a
l af2
r0 af2
r1 Addr areg
a)      = a -> af2 -> af2 -> Addr reg -> AArch64 reg afreg af2 a
forall reg freg f2 a.
a -> f2 -> f2 -> Addr reg -> AArch64 reg freg f2 a
Ldp2 a
l af2
r0 af2
r1 (areg -> reg
f(areg -> reg) -> Addr areg -> Addr reg
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>Addr areg
a)
mapR areg -> reg
f (Stp2 a
l af2
r0 af2
r1 Addr areg
a)      = a -> af2 -> af2 -> Addr reg -> AArch64 reg afreg af2 a
forall reg freg f2 a.
a -> f2 -> f2 -> Addr reg -> AArch64 reg freg f2 a
Stp2 a
l af2
r0 af2
r1 (areg -> reg
f(areg -> reg) -> Addr areg -> Addr reg
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>Addr areg
a)

mapF2 :: (af2 -> f2) -> AArch64 areg afreg af2 a -> AArch64 areg afreg f2 a
mapF2 :: forall af2 f2 areg afreg a.
(af2 -> f2) -> AArch64 areg afreg af2 a -> AArch64 areg afreg f2 a
mapF2 af2 -> f2
_ (Label a
x Label
l)           = a -> Label -> AArch64 areg afreg f2 a
forall reg freg f2 a. a -> Label -> AArch64 reg freg f2 a
Label a
x Label
l
mapF2 af2 -> f2
_ (B a
x Label
l)               = a -> Label -> AArch64 areg afreg f2 a
forall reg freg f2 a. a -> Label -> AArch64 reg freg f2 a
B a
x Label
l
mapF2 af2 -> f2
_ (Bc a
x Cond
c Label
l)            = a -> Cond -> Label -> AArch64 areg afreg f2 a
forall reg freg f2 a. a -> Cond -> Label -> AArch64 reg freg f2 a
Bc a
x Cond
c Label
l
mapF2 af2 -> f2
_ (Bl a
x CFunc
f)              = a -> CFunc -> AArch64 areg afreg f2 a
forall reg freg f2 a. a -> CFunc -> AArch64 reg freg f2 a
Bl a
x CFunc
f
mapF2 af2 -> f2
_ (C a
x Label
l)               = a -> Label -> AArch64 areg afreg f2 a
forall reg freg f2 a. a -> Label -> AArch64 reg freg f2 a
C a
x Label
l
mapF2 af2 -> f2
_ (FMovXX a
l afreg
xr0 afreg
xr1)    = a -> afreg -> afreg -> AArch64 areg afreg f2 a
forall reg freg f2 a. a -> freg -> freg -> AArch64 reg freg f2 a
FMovXX a
l afreg
xr0 afreg
xr1
mapF2 af2 -> f2
_ (MovRR a
l areg
r0 areg
r1)       = a -> areg -> areg -> AArch64 areg afreg f2 a
forall reg freg f2 a. a -> reg -> reg -> AArch64 reg freg f2 a
MovRR a
l areg
r0 areg
r1
mapF2 af2 -> f2
_ (MovRC a
l areg
r0 Word16
c)        = a -> areg -> Word16 -> AArch64 areg afreg f2 a
forall reg freg f2 a. a -> reg -> Word16 -> AArch64 reg freg f2 a
MovRC a
l areg
r0 Word16
c
mapF2 af2 -> f2
_ (Ldr a
l areg
r Addr areg
a)           = a -> areg -> Addr areg -> AArch64 areg afreg f2 a
forall reg freg f2 a. a -> reg -> Addr reg -> AArch64 reg freg f2 a
Ldr a
l areg
r Addr areg
a
mapF2 af2 -> f2
_ (LdrB a
l areg
r Addr areg
a)          = a -> areg -> Addr areg -> AArch64 areg afreg f2 a
forall reg freg f2 a. a -> reg -> Addr reg -> AArch64 reg freg f2 a
LdrB a
l areg
r Addr areg
a
mapF2 af2 -> f2
_ (Str a
l areg
r Addr areg
a)           = a -> areg -> Addr areg -> AArch64 areg afreg f2 a
forall reg freg f2 a. a -> reg -> Addr reg -> AArch64 reg freg f2 a
Str a
l areg
r Addr areg
a
mapF2 af2 -> f2
_ (StrB a
l areg
r Addr areg
a)          = a -> areg -> Addr areg -> AArch64 areg afreg f2 a
forall reg freg f2 a. a -> reg -> Addr reg -> AArch64 reg freg f2 a
StrB a
l areg
r Addr areg
a
mapF2 af2 -> f2
_ (LdrD a
l afreg
xr Addr areg
a)         = a -> afreg -> Addr areg -> AArch64 areg afreg f2 a
forall reg freg f2 a.
a -> freg -> Addr reg -> AArch64 reg freg f2 a
LdrD a
l afreg
xr Addr areg
a
mapF2 af2 -> f2
_ (AddRR a
l areg
r0 areg
r1 areg
r2)    = a -> areg -> areg -> areg -> AArch64 areg afreg f2 a
forall reg freg f2 a.
a -> reg -> reg -> reg -> AArch64 reg freg f2 a
AddRR a
l areg
r0 areg
r1 areg
r2
mapF2 af2 -> f2
_ (AddRRS a
l areg
r0 areg
r1 areg
r2 Word8
s) = a -> areg -> areg -> areg -> Word8 -> AArch64 areg afreg f2 a
forall reg freg f2 a.
a -> reg -> reg -> reg -> Word8 -> AArch64 reg freg f2 a
AddRRS a
l areg
r0 areg
r1 areg
r2 Word8
s
mapF2 af2 -> f2
_ (AddRC a
l areg
r0 areg
r1 Word16
c)     = a -> areg -> areg -> Word16 -> AArch64 areg afreg f2 a
forall reg freg f2 a.
a -> reg -> reg -> Word16 -> AArch64 reg freg f2 a
AddRC a
l areg
r0 areg
r1 Word16
c
mapF2 af2 -> f2
_ (SubRR a
l areg
r0 areg
r1 areg
r2)    = a -> areg -> areg -> areg -> AArch64 areg afreg f2 a
forall reg freg f2 a.
a -> reg -> reg -> reg -> AArch64 reg freg f2 a
SubRR a
l areg
r0 areg
r1 areg
r2
mapF2 af2 -> f2
_ (SubRC a
l areg
r0 areg
r1 Word16
c)     = a -> areg -> areg -> Word16 -> AArch64 areg afreg f2 a
forall reg freg f2 a.
a -> reg -> reg -> Word16 -> AArch64 reg freg f2 a
SubRC a
l areg
r0 areg
r1 Word16
c
mapF2 af2 -> f2
_ (ZeroR a
l areg
r)           = a -> areg -> AArch64 areg afreg f2 a
forall reg freg f2 a. a -> reg -> AArch64 reg freg f2 a
ZeroR a
l areg
r
mapF2 af2 -> f2
_ (Mvn a
l areg
r0 areg
r1)         = a -> areg -> areg -> AArch64 areg afreg f2 a
forall reg freg f2 a. a -> reg -> reg -> AArch64 reg freg f2 a
Mvn a
l areg
r0 areg
r1
mapF2 af2 -> f2
_ (AndRR a
l areg
r0 areg
r1 areg
r2)    = a -> areg -> areg -> areg -> AArch64 areg afreg f2 a
forall reg freg f2 a.
a -> reg -> reg -> reg -> AArch64 reg freg f2 a
AndRR a
l areg
r0 areg
r1 areg
r2
mapF2 af2 -> f2
_ (OrRR a
l areg
r0 areg
r1 areg
r2)     = a -> areg -> areg -> areg -> AArch64 areg afreg f2 a
forall reg freg f2 a.
a -> reg -> reg -> reg -> AArch64 reg freg f2 a
OrRR a
l areg
r0 areg
r1 areg
r2
mapF2 af2 -> f2
_ (Eor a
l areg
r0 areg
r1 areg
r2)      = a -> areg -> areg -> areg -> AArch64 areg afreg f2 a
forall reg freg f2 a.
a -> reg -> reg -> reg -> AArch64 reg freg f2 a
Eor a
l areg
r0 areg
r1 areg
r2
mapF2 af2 -> f2
_ (EorI a
l areg
r0 areg
r1 BM
i)      = a -> areg -> areg -> BM -> AArch64 areg afreg f2 a
forall reg freg f2 a.
a -> reg -> reg -> BM -> AArch64 reg freg f2 a
EorI a
l areg
r0 areg
r1 BM
i
mapF2 af2 -> f2
_ (Lsl a
l areg
r0 areg
r1 Word8
s)       = a -> areg -> areg -> Word8 -> AArch64 areg afreg f2 a
forall reg freg f2 a.
a -> reg -> reg -> Word8 -> AArch64 reg freg f2 a
Lsl a
l areg
r0 areg
r1 Word8
s
mapF2 af2 -> f2
_ (Asr a
l areg
r0 areg
r1 Word8
s)       = a -> areg -> areg -> Word8 -> AArch64 areg afreg f2 a
forall reg freg f2 a.
a -> reg -> reg -> Word8 -> AArch64 reg freg f2 a
Asr a
l areg
r0 areg
r1 Word8
s
mapF2 af2 -> f2
_ (CmpRC a
l areg
r Word16
c)         = a -> areg -> Word16 -> AArch64 areg afreg f2 a
forall reg freg f2 a. a -> reg -> Word16 -> AArch64 reg freg f2 a
CmpRC a
l areg
r Word16
c
mapF2 af2 -> f2
_ (CmpRR a
l areg
r0 areg
r1)       = a -> areg -> areg -> AArch64 areg afreg f2 a
forall reg freg f2 a. a -> reg -> reg -> AArch64 reg freg f2 a
CmpRR a
l areg
r0 areg
r1
mapF2 af2 -> f2
_ (Neg a
l areg
r0 areg
r1)         = a -> areg -> areg -> AArch64 areg afreg f2 a
forall reg freg f2 a. a -> reg -> reg -> AArch64 reg freg f2 a
Neg a
l areg
r0 areg
r1
mapF2 af2 -> f2
_ (Fmul a
l afreg
xr0 afreg
xr1 afreg
xr2)  = a -> afreg -> afreg -> afreg -> AArch64 areg afreg f2 a
forall reg freg f2 a.
a -> freg -> freg -> freg -> AArch64 reg freg f2 a
Fmul a
l afreg
xr0 afreg
xr1 afreg
xr2
mapF2 af2 -> f2
_ (Fadd a
l afreg
xr0 afreg
xr1 afreg
xr2)  = a -> afreg -> afreg -> afreg -> AArch64 areg afreg f2 a
forall reg freg f2 a.
a -> freg -> freg -> freg -> AArch64 reg freg f2 a
Fadd a
l afreg
xr0 afreg
xr1 afreg
xr2
mapF2 af2 -> f2
_ (Fsub a
l afreg
xr0 afreg
xr1 afreg
xr2)  = a -> afreg -> afreg -> afreg -> AArch64 areg afreg f2 a
forall reg freg f2 a.
a -> freg -> freg -> freg -> AArch64 reg freg f2 a
Fsub a
l afreg
xr0 afreg
xr1 afreg
xr2
mapF2 af2 -> f2
_ (FcmpZ a
l afreg
xr)          = a -> afreg -> AArch64 areg afreg f2 a
forall reg freg f2 a. a -> freg -> AArch64 reg freg f2 a
FcmpZ a
l afreg
xr
mapF2 af2 -> f2
_ (Ret a
l)               = a -> AArch64 areg afreg f2 a
forall reg freg f2 a. a -> AArch64 reg freg f2 a
Ret a
l
mapF2 af2 -> f2
_ (RetL a
x Label
l)            = a -> Label -> AArch64 areg afreg f2 a
forall reg freg f2 a. a -> Label -> AArch64 reg freg f2 a
RetL a
x Label
l
mapF2 af2 -> f2
_ (Fdiv a
l afreg
d0 afreg
d1 afreg
d2)     = a -> afreg -> afreg -> afreg -> AArch64 areg afreg f2 a
forall reg freg f2 a.
a -> freg -> freg -> freg -> AArch64 reg freg f2 a
Fdiv a
l afreg
d0 afreg
d1 afreg
d2
mapF2 af2 -> f2
_ (MulRR a
l areg
r0 areg
r1 areg
r2)    = a -> areg -> areg -> areg -> AArch64 areg afreg f2 a
forall reg freg f2 a.
a -> reg -> reg -> reg -> AArch64 reg freg f2 a
MulRR a
l areg
r0 areg
r1 areg
r2
mapF2 af2 -> f2
_ (Madd a
l areg
r0 areg
r1 areg
r2 areg
r3)  = a -> areg -> areg -> areg -> areg -> AArch64 areg afreg f2 a
forall reg freg f2 a.
a -> reg -> reg -> reg -> reg -> AArch64 reg freg f2 a
Madd a
l areg
r0 areg
r1 areg
r2 areg
r3
mapF2 af2 -> f2
_ (Msub a
l areg
r0 areg
r1 areg
r2 areg
r3)  = a -> areg -> areg -> areg -> areg -> AArch64 areg afreg f2 a
forall reg freg f2 a.
a -> reg -> reg -> reg -> reg -> AArch64 reg freg f2 a
Msub a
l areg
r0 areg
r1 areg
r2 areg
r3
mapF2 af2 -> f2
_ (Sdiv a
l areg
r0 areg
r1 areg
r2)     = a -> areg -> areg -> areg -> AArch64 areg afreg f2 a
forall reg freg f2 a.
a -> reg -> reg -> reg -> AArch64 reg freg f2 a
Sdiv a
l areg
r0 areg
r1 areg
r2
mapF2 af2 -> f2
_ (StrD a
l afreg
d Addr areg
a)          = a -> afreg -> Addr areg -> AArch64 areg afreg f2 a
forall reg freg f2 a.
a -> freg -> Addr reg -> AArch64 reg freg f2 a
StrD a
l afreg
d Addr areg
a
mapF2 af2 -> f2
_ (Scvtf a
l afreg
d areg
r)         = a -> afreg -> areg -> AArch64 areg afreg f2 a
forall reg freg f2 a. a -> freg -> reg -> AArch64 reg freg f2 a
Scvtf a
l afreg
d areg
r
mapF2 af2 -> f2
_ (Fcvtms a
l areg
r afreg
d)        = a -> areg -> afreg -> AArch64 areg afreg f2 a
forall reg freg f2 a. a -> reg -> freg -> AArch64 reg freg f2 a
Fcvtms a
l areg
r afreg
d
mapF2 af2 -> f2
_ (Fcvtas a
l areg
r afreg
d)        = a -> areg -> afreg -> AArch64 areg afreg f2 a
forall reg freg f2 a. a -> reg -> freg -> AArch64 reg freg f2 a
Fcvtas a
l areg
r afreg
d
mapF2 af2 -> f2
_ (MovK a
l areg
r Word16
u Int
s)        = a -> areg -> Word16 -> Int -> AArch64 areg afreg f2 a
forall reg freg f2 a.
a -> reg -> Word16 -> Int -> AArch64 reg freg f2 a
MovK a
l areg
r Word16
u Int
s
mapF2 af2 -> f2
_ (MovZ a
l areg
r Word16
u Int
s)        = a -> areg -> Word16 -> Int -> AArch64 areg afreg f2 a
forall reg freg f2 a.
a -> reg -> Word16 -> Int -> AArch64 reg freg f2 a
MovZ a
l areg
r Word16
u Int
s
mapF2 af2 -> f2
_ (FMovDR a
l afreg
d areg
r)        = a -> afreg -> areg -> AArch64 areg afreg f2 a
forall reg freg f2 a. a -> freg -> reg -> AArch64 reg freg f2 a
FMovDR a
l afreg
d areg
r
mapF2 af2 -> f2
_ (Fcmp a
l afreg
d0 afreg
d1)        = a -> afreg -> afreg -> AArch64 areg afreg f2 a
forall reg freg f2 a. a -> freg -> freg -> AArch64 reg freg f2 a
Fcmp a
l afreg
d0 afreg
d1
mapF2 af2 -> f2
_ (Stp a
l areg
r0 areg
r1 Addr areg
a)       = a -> areg -> areg -> Addr areg -> AArch64 areg afreg f2 a
forall reg freg f2 a.
a -> reg -> reg -> Addr reg -> AArch64 reg freg f2 a
Stp a
l areg
r0 areg
r1 Addr areg
a
mapF2 af2 -> f2
_ (Ldp a
l areg
r0 areg
r1 Addr areg
a)       = a -> areg -> areg -> Addr areg -> AArch64 areg afreg f2 a
forall reg freg f2 a.
a -> reg -> reg -> Addr reg -> AArch64 reg freg f2 a
Ldp a
l areg
r0 areg
r1 Addr areg
a
mapF2 af2 -> f2
_ (StpD a
l afreg
d0 afreg
d1 Addr areg
a)      = a -> afreg -> afreg -> Addr areg -> AArch64 areg afreg f2 a
forall reg freg f2 a.
a -> freg -> freg -> Addr reg -> AArch64 reg freg f2 a
StpD a
l afreg
d0 afreg
d1 Addr areg
a
mapF2 af2 -> f2
_ (LdpD a
l afreg
d0 afreg
d1 Addr areg
a)      = a -> afreg -> afreg -> Addr areg -> AArch64 areg afreg f2 a
forall reg freg f2 a.
a -> freg -> freg -> Addr reg -> AArch64 reg freg f2 a
LdpD a
l afreg
d0 afreg
d1 Addr areg
a
mapF2 af2 -> f2
_ (Fmadd a
l afreg
d0 afreg
d1 afreg
d2 afreg
d3) = a -> afreg -> afreg -> afreg -> afreg -> AArch64 areg afreg f2 a
forall reg freg f2 a.
a -> freg -> freg -> freg -> freg -> AArch64 reg freg f2 a
Fmadd a
l afreg
d0 afreg
d1 afreg
d2 afreg
d3
mapF2 af2 -> f2
_ (Fmsub a
l afreg
d0 afreg
d1 afreg
d2 afreg
d3) = a -> afreg -> afreg -> afreg -> afreg -> AArch64 areg afreg f2 a
forall reg freg f2 a.
a -> freg -> freg -> freg -> freg -> AArch64 reg freg f2 a
Fmsub a
l afreg
d0 afreg
d1 afreg
d2 afreg
d3
mapF2 af2 -> f2
_ (Fsqrt a
l afreg
d0 afreg
d1)       = a -> afreg -> afreg -> AArch64 areg afreg f2 a
forall reg freg f2 a. a -> freg -> freg -> AArch64 reg freg f2 a
Fsqrt a
l afreg
d0 afreg
d1
mapF2 af2 -> f2
_ (Fneg a
l afreg
d0 afreg
d1)        = a -> afreg -> afreg -> AArch64 areg afreg f2 a
forall reg freg f2 a. a -> freg -> freg -> AArch64 reg freg f2 a
Fneg a
l afreg
d0 afreg
d1
mapF2 af2 -> f2
_ (Frintm a
l afreg
d0 afreg
d1)      = a -> afreg -> afreg -> AArch64 areg afreg f2 a
forall reg freg f2 a. a -> freg -> freg -> AArch64 reg freg f2 a
Frintm a
l afreg
d0 afreg
d1
mapF2 af2 -> f2
_ (MrsR a
l areg
r)            = a -> areg -> AArch64 areg afreg f2 a
forall reg freg f2 a. a -> reg -> AArch64 reg freg f2 a
MrsR a
l areg
r
mapF2 af2 -> f2
_ (Blr a
l areg
r)             = a -> areg -> AArch64 areg afreg f2 a
forall reg freg f2 a. a -> reg -> AArch64 reg freg f2 a
Blr a
l areg
r
mapF2 af2 -> f2
_ (MovRCf a
l areg
r CFunc
cf)       = a -> areg -> CFunc -> AArch64 areg afreg f2 a
forall reg freg f2 a. a -> reg -> CFunc -> AArch64 reg freg f2 a
MovRCf a
l areg
r CFunc
cf
mapF2 af2 -> f2
_ (LdrRL a
x areg
r Int
l)         = a -> areg -> Int -> AArch64 areg afreg f2 a
forall reg freg f2 a. a -> reg -> Int -> AArch64 reg freg f2 a
LdrRL a
x areg
r Int
l
mapF2 af2 -> f2
_ (Fmax a
l afreg
d0 afreg
d1 afreg
d2)     = a -> afreg -> afreg -> afreg -> AArch64 areg afreg f2 a
forall reg freg f2 a.
a -> freg -> freg -> freg -> AArch64 reg freg f2 a
Fmax a
l afreg
d0 afreg
d1 afreg
d2
mapF2 af2 -> f2
_ (Fmin a
l afreg
d0 afreg
d1 afreg
d2)     = a -> afreg -> afreg -> afreg -> AArch64 areg afreg f2 a
forall reg freg f2 a.
a -> freg -> freg -> freg -> AArch64 reg freg f2 a
Fmin a
l afreg
d0 afreg
d1 afreg
d2
mapF2 af2 -> f2
_ (Fabs a
l afreg
d0 afreg
d1)        = a -> afreg -> afreg -> AArch64 areg afreg f2 a
forall reg freg f2 a. a -> freg -> freg -> AArch64 reg freg f2 a
Fabs a
l afreg
d0 afreg
d1
mapF2 af2 -> f2
_ (Csel a
l areg
r0 areg
r1 areg
r2 Cond
p)   = a -> areg -> areg -> areg -> Cond -> AArch64 areg afreg f2 a
forall reg freg f2 a.
a -> reg -> reg -> reg -> Cond -> AArch64 reg freg f2 a
Csel a
l areg
r0 areg
r1 areg
r2 Cond
p
mapF2 af2 -> f2
_ (Tbnz a
l areg
r Word8
n Label
p)        = a -> areg -> Word8 -> Label -> AArch64 areg afreg f2 a
forall reg freg f2 a.
a -> reg -> Word8 -> Label -> AArch64 reg freg f2 a
Tbnz a
l areg
r Word8
n Label
p
mapF2 af2 -> f2
_ (Tbz a
l areg
r Word8
n Label
p)         = a -> areg -> Word8 -> Label -> AArch64 areg afreg f2 a
forall reg freg f2 a.
a -> reg -> Word8 -> Label -> AArch64 reg freg f2 a
Tbz a
l areg
r Word8
n Label
p
mapF2 af2 -> f2
_ (Cbnz a
x areg
r Label
l)          = a -> areg -> Label -> AArch64 areg afreg f2 a
forall reg freg f2 a. a -> reg -> Label -> AArch64 reg freg f2 a
Cbnz a
x areg
r Label
l
mapF2 af2 -> f2
_ (Cbz a
x areg
r Label
l)           = a -> areg -> Label -> AArch64 areg afreg f2 a
forall reg freg f2 a. a -> reg -> Label -> AArch64 reg freg f2 a
Cbz a
x areg
r Label
l
mapF2 af2 -> f2
_ (Fcsel a
l afreg
d0 afreg
d1 afreg
d2 Cond
p)  = a -> afreg -> afreg -> afreg -> Cond -> AArch64 areg afreg f2 a
forall reg freg f2 a.
a -> freg -> freg -> freg -> Cond -> AArch64 reg freg f2 a
Fcsel a
l afreg
d0 afreg
d1 afreg
d2 Cond
p
mapF2 af2 -> f2
_ (TstI a
l areg
r BM
i)          = a -> areg -> BM -> AArch64 areg afreg f2 a
forall reg freg f2 a. a -> reg -> BM -> AArch64 reg freg f2 a
TstI a
l areg
r BM
i
mapF2 af2 -> f2
_ (Cset a
l areg
r Cond
c)          = a -> areg -> Cond -> AArch64 areg afreg f2 a
forall reg freg f2 a. a -> reg -> Cond -> AArch64 reg freg f2 a
Cset a
l areg
r Cond
c
mapF2 af2 -> f2
f (Ldp2 a
l af2
r0 af2
r1 Addr areg
a)      = a -> f2 -> f2 -> Addr areg -> AArch64 areg afreg f2 a
forall reg freg f2 a.
a -> f2 -> f2 -> Addr reg -> AArch64 reg freg f2 a
Ldp2 a
l (af2 -> f2
f af2
r0) (af2 -> f2
f af2
r1) Addr areg
a
mapF2 af2 -> f2
f (Stp2 a
l af2
r0 af2
r1 Addr areg
a)      = a -> f2 -> f2 -> Addr areg -> AArch64 areg afreg f2 a
forall reg freg f2 a.
a -> f2 -> f2 -> Addr reg -> AArch64 reg freg f2 a
Stp2 a
l (af2 -> f2
f af2
r0) (af2 -> f2
f af2
r1) Addr areg
a

mapFR :: (afreg -> freg) -> AArch64 areg afreg af2 a -> AArch64 areg freg af2 a
mapFR :: forall afreg freg areg af2 a.
(afreg -> freg)
-> AArch64 areg afreg af2 a -> AArch64 areg freg af2 a
mapFR afreg -> freg
_ (Label a
x Label
l)           = a -> Label -> AArch64 areg freg af2 a
forall reg freg f2 a. a -> Label -> AArch64 reg freg f2 a
Label a
x Label
l
mapFR afreg -> freg
_ (B a
x Label
l)               = a -> Label -> AArch64 areg freg af2 a
forall reg freg f2 a. a -> Label -> AArch64 reg freg f2 a
B a
x Label
l
mapFR afreg -> freg
_ (Bc a
x Cond
c Label
l)            = a -> Cond -> Label -> AArch64 areg freg af2 a
forall reg freg f2 a. a -> Cond -> Label -> AArch64 reg freg f2 a
Bc a
x Cond
c Label
l
mapFR afreg -> freg
_ (Bl a
x CFunc
f)              = a -> CFunc -> AArch64 areg freg af2 a
forall reg freg f2 a. a -> CFunc -> AArch64 reg freg f2 a
Bl a
x CFunc
f
mapFR afreg -> freg
_ (C a
x Label
l)               = a -> Label -> AArch64 areg freg af2 a
forall reg freg f2 a. a -> Label -> AArch64 reg freg f2 a
C a
x Label
l
mapFR afreg -> freg
f (FMovXX a
l afreg
xr0 afreg
xr1)    = a -> freg -> freg -> AArch64 areg freg af2 a
forall reg freg f2 a. a -> freg -> freg -> AArch64 reg freg f2 a
FMovXX a
l (afreg -> freg
f afreg
xr0) (afreg -> freg
f afreg
xr1)
mapFR afreg -> freg
_ (MovRR a
l areg
r0 areg
r1)       = a -> areg -> areg -> AArch64 areg freg af2 a
forall reg freg f2 a. a -> reg -> reg -> AArch64 reg freg f2 a
MovRR a
l areg
r0 areg
r1
mapFR afreg -> freg
_ (MovRC a
l areg
r0 Word16
c)        = a -> areg -> Word16 -> AArch64 areg freg af2 a
forall reg freg f2 a. a -> reg -> Word16 -> AArch64 reg freg f2 a
MovRC a
l areg
r0 Word16
c
mapFR afreg -> freg
_ (Ldr a
l areg
r Addr areg
a)           = a -> areg -> Addr areg -> AArch64 areg freg af2 a
forall reg freg f2 a. a -> reg -> Addr reg -> AArch64 reg freg f2 a
Ldr a
l areg
r Addr areg
a
mapFR afreg -> freg
_ (LdrB a
l areg
r Addr areg
a)          = a -> areg -> Addr areg -> AArch64 areg freg af2 a
forall reg freg f2 a. a -> reg -> Addr reg -> AArch64 reg freg f2 a
LdrB a
l areg
r Addr areg
a
mapFR afreg -> freg
_ (Str a
l areg
r Addr areg
a)           = a -> areg -> Addr areg -> AArch64 areg freg af2 a
forall reg freg f2 a. a -> reg -> Addr reg -> AArch64 reg freg f2 a
Str a
l areg
r Addr areg
a
mapFR afreg -> freg
_ (StrB a
l areg
r Addr areg
a)          = a -> areg -> Addr areg -> AArch64 areg freg af2 a
forall reg freg f2 a. a -> reg -> Addr reg -> AArch64 reg freg f2 a
StrB a
l areg
r Addr areg
a
mapFR afreg -> freg
f (LdrD a
l afreg
xr Addr areg
a)         = a -> freg -> Addr areg -> AArch64 areg freg af2 a
forall reg freg f2 a.
a -> freg -> Addr reg -> AArch64 reg freg f2 a
LdrD a
l (afreg -> freg
f afreg
xr) Addr areg
a
mapFR afreg -> freg
_ (AddRR a
l areg
r0 areg
r1 areg
r2)    = a -> areg -> areg -> areg -> AArch64 areg freg af2 a
forall reg freg f2 a.
a -> reg -> reg -> reg -> AArch64 reg freg f2 a
AddRR a
l areg
r0 areg
r1 areg
r2
mapFR afreg -> freg
_ (AddRRS a
l areg
r0 areg
r1 areg
r2 Word8
s) = a -> areg -> areg -> areg -> Word8 -> AArch64 areg freg af2 a
forall reg freg f2 a.
a -> reg -> reg -> reg -> Word8 -> AArch64 reg freg f2 a
AddRRS a
l areg
r0 areg
r1 areg
r2 Word8
s
mapFR afreg -> freg
_ (AddRC a
l areg
r0 areg
r1 Word16
c)     = a -> areg -> areg -> Word16 -> AArch64 areg freg af2 a
forall reg freg f2 a.
a -> reg -> reg -> Word16 -> AArch64 reg freg f2 a
AddRC a
l areg
r0 areg
r1 Word16
c
mapFR afreg -> freg
_ (SubRR a
l areg
r0 areg
r1 areg
r2)    = a -> areg -> areg -> areg -> AArch64 areg freg af2 a
forall reg freg f2 a.
a -> reg -> reg -> reg -> AArch64 reg freg f2 a
SubRR a
l areg
r0 areg
r1 areg
r2
mapFR afreg -> freg
_ (SubRC a
l areg
r0 areg
r1 Word16
c)     = a -> areg -> areg -> Word16 -> AArch64 areg freg af2 a
forall reg freg f2 a.
a -> reg -> reg -> Word16 -> AArch64 reg freg f2 a
SubRC a
l areg
r0 areg
r1 Word16
c
mapFR afreg -> freg
_ (ZeroR a
l areg
r)           = a -> areg -> AArch64 areg freg af2 a
forall reg freg f2 a. a -> reg -> AArch64 reg freg f2 a
ZeroR a
l areg
r
mapFR afreg -> freg
_ (Mvn a
l areg
r0 areg
r1)         = a -> areg -> areg -> AArch64 areg freg af2 a
forall reg freg f2 a. a -> reg -> reg -> AArch64 reg freg f2 a
Mvn a
l areg
r0 areg
r1
mapFR afreg -> freg
_ (AndRR a
l areg
r0 areg
r1 areg
r2)    = a -> areg -> areg -> areg -> AArch64 areg freg af2 a
forall reg freg f2 a.
a -> reg -> reg -> reg -> AArch64 reg freg f2 a
AndRR a
l areg
r0 areg
r1 areg
r2
mapFR afreg -> freg
_ (OrRR a
l areg
r0 areg
r1 areg
r2)     = a -> areg -> areg -> areg -> AArch64 areg freg af2 a
forall reg freg f2 a.
a -> reg -> reg -> reg -> AArch64 reg freg f2 a
OrRR a
l areg
r0 areg
r1 areg
r2
mapFR afreg -> freg
_ (Eor a
l areg
r0 areg
r1 areg
r2)      = a -> areg -> areg -> areg -> AArch64 areg freg af2 a
forall reg freg f2 a.
a -> reg -> reg -> reg -> AArch64 reg freg f2 a
Eor a
l areg
r0 areg
r1 areg
r2
mapFR afreg -> freg
_ (EorI a
l areg
r0 areg
r1 BM
i)      = a -> areg -> areg -> BM -> AArch64 areg freg af2 a
forall reg freg f2 a.
a -> reg -> reg -> BM -> AArch64 reg freg f2 a
EorI a
l areg
r0 areg
r1 BM
i
mapFR afreg -> freg
_ (Lsl a
l areg
r0 areg
r1 Word8
s)       = a -> areg -> areg -> Word8 -> AArch64 areg freg af2 a
forall reg freg f2 a.
a -> reg -> reg -> Word8 -> AArch64 reg freg f2 a
Lsl a
l areg
r0 areg
r1 Word8
s
mapFR afreg -> freg
_ (Asr a
l areg
r0 areg
r1 Word8
s)       = a -> areg -> areg -> Word8 -> AArch64 areg freg af2 a
forall reg freg f2 a.
a -> reg -> reg -> Word8 -> AArch64 reg freg f2 a
Asr a
l areg
r0 areg
r1 Word8
s
mapFR afreg -> freg
_ (CmpRC a
l areg
r Word16
c)         = a -> areg -> Word16 -> AArch64 areg freg af2 a
forall reg freg f2 a. a -> reg -> Word16 -> AArch64 reg freg f2 a
CmpRC a
l areg
r Word16
c
mapFR afreg -> freg
_ (CmpRR a
l areg
r0 areg
r1)       = a -> areg -> areg -> AArch64 areg freg af2 a
forall reg freg f2 a. a -> reg -> reg -> AArch64 reg freg f2 a
CmpRR a
l areg
r0 areg
r1
mapFR afreg -> freg
_ (Neg a
l areg
r0 areg
r1)         = a -> areg -> areg -> AArch64 areg freg af2 a
forall reg freg f2 a. a -> reg -> reg -> AArch64 reg freg f2 a
Neg a
l areg
r0 areg
r1
mapFR afreg -> freg
f (Fmul a
l afreg
xr0 afreg
xr1 afreg
xr2)  = a -> freg -> freg -> freg -> AArch64 areg freg af2 a
forall reg freg f2 a.
a -> freg -> freg -> freg -> AArch64 reg freg f2 a
Fmul a
l (afreg -> freg
f afreg
xr0) (afreg -> freg
f afreg
xr1) (afreg -> freg
f afreg
xr2)
mapFR afreg -> freg
f (Fadd a
l afreg
xr0 afreg
xr1 afreg
xr2)  = a -> freg -> freg -> freg -> AArch64 areg freg af2 a
forall reg freg f2 a.
a -> freg -> freg -> freg -> AArch64 reg freg f2 a
Fadd a
l (afreg -> freg
f afreg
xr0) (afreg -> freg
f afreg
xr1) (afreg -> freg
f afreg
xr2)
mapFR afreg -> freg
f (Fsub a
l afreg
xr0 afreg
xr1 afreg
xr2)  = a -> freg -> freg -> freg -> AArch64 areg freg af2 a
forall reg freg f2 a.
a -> freg -> freg -> freg -> AArch64 reg freg f2 a
Fsub a
l (afreg -> freg
f afreg
xr0) (afreg -> freg
f afreg
xr1) (afreg -> freg
f afreg
xr2)
mapFR afreg -> freg
f (FcmpZ a
l afreg
xr)          = a -> freg -> AArch64 areg freg af2 a
forall reg freg f2 a. a -> freg -> AArch64 reg freg f2 a
FcmpZ a
l (afreg -> freg
f afreg
xr)
mapFR afreg -> freg
_ (Ret a
l)               = a -> AArch64 areg freg af2 a
forall reg freg f2 a. a -> AArch64 reg freg f2 a
Ret a
l
mapFR afreg -> freg
_ (RetL a
x Label
l)            = a -> Label -> AArch64 areg freg af2 a
forall reg freg f2 a. a -> Label -> AArch64 reg freg f2 a
RetL a
x Label
l
mapFR afreg -> freg
f (Fdiv a
l afreg
d0 afreg
d1 afreg
d2)     = a -> freg -> freg -> freg -> AArch64 areg freg af2 a
forall reg freg f2 a.
a -> freg -> freg -> freg -> AArch64 reg freg f2 a
Fdiv a
l (afreg -> freg
f afreg
d0) (afreg -> freg
f afreg
d1) (afreg -> freg
f afreg
d2)
mapFR afreg -> freg
_ (MulRR a
l areg
r0 areg
r1 areg
r2)    = a -> areg -> areg -> areg -> AArch64 areg freg af2 a
forall reg freg f2 a.
a -> reg -> reg -> reg -> AArch64 reg freg f2 a
MulRR a
l areg
r0 areg
r1 areg
r2
mapFR afreg -> freg
_ (Madd a
l areg
r0 areg
r1 areg
r2 areg
r3)  = a -> areg -> areg -> areg -> areg -> AArch64 areg freg af2 a
forall reg freg f2 a.
a -> reg -> reg -> reg -> reg -> AArch64 reg freg f2 a
Madd a
l areg
r0 areg
r1 areg
r2 areg
r3
mapFR afreg -> freg
_ (Msub a
l areg
r0 areg
r1 areg
r2 areg
r3)  = a -> areg -> areg -> areg -> areg -> AArch64 areg freg af2 a
forall reg freg f2 a.
a -> reg -> reg -> reg -> reg -> AArch64 reg freg f2 a
Msub a
l areg
r0 areg
r1 areg
r2 areg
r3
mapFR afreg -> freg
_ (Sdiv a
l areg
r0 areg
r1 areg
r2)     = a -> areg -> areg -> areg -> AArch64 areg freg af2 a
forall reg freg f2 a.
a -> reg -> reg -> reg -> AArch64 reg freg f2 a
Sdiv a
l areg
r0 areg
r1 areg
r2
mapFR afreg -> freg
f (StrD a
l afreg
d Addr areg
a)          = a -> freg -> Addr areg -> AArch64 areg freg af2 a
forall reg freg f2 a.
a -> freg -> Addr reg -> AArch64 reg freg f2 a
StrD a
l (afreg -> freg
f afreg
d) Addr areg
a
mapFR afreg -> freg
f (Scvtf a
l afreg
d areg
r)         = a -> freg -> areg -> AArch64 areg freg af2 a
forall reg freg f2 a. a -> freg -> reg -> AArch64 reg freg f2 a
Scvtf a
l (afreg -> freg
f afreg
d) areg
r
mapFR afreg -> freg
f (Fcvtms a
l areg
r afreg
d)        = a -> areg -> freg -> AArch64 areg freg af2 a
forall reg freg f2 a. a -> reg -> freg -> AArch64 reg freg f2 a
Fcvtms a
l areg
r (afreg -> freg
f afreg
d)
mapFR afreg -> freg
f (Fcvtas a
l areg
r afreg
d)        = a -> areg -> freg -> AArch64 areg freg af2 a
forall reg freg f2 a. a -> reg -> freg -> AArch64 reg freg f2 a
Fcvtas a
l areg
r (afreg -> freg
f afreg
d)
mapFR afreg -> freg
_ (MovK a
l areg
r Word16
u Int
s)        = a -> areg -> Word16 -> Int -> AArch64 areg freg af2 a
forall reg freg f2 a.
a -> reg -> Word16 -> Int -> AArch64 reg freg f2 a
MovK a
l areg
r Word16
u Int
s
mapFR afreg -> freg
_ (MovZ a
l areg
r Word16
u Int
s)        = a -> areg -> Word16 -> Int -> AArch64 areg freg af2 a
forall reg freg f2 a.
a -> reg -> Word16 -> Int -> AArch64 reg freg f2 a
MovZ a
l areg
r Word16
u Int
s
mapFR afreg -> freg
f (FMovDR a
l afreg
d areg
r)        = a -> freg -> areg -> AArch64 areg freg af2 a
forall reg freg f2 a. a -> freg -> reg -> AArch64 reg freg f2 a
FMovDR a
l (afreg -> freg
f afreg
d) areg
r
mapFR afreg -> freg
f (Fcmp a
l afreg
d0 afreg
d1)        = a -> freg -> freg -> AArch64 areg freg af2 a
forall reg freg f2 a. a -> freg -> freg -> AArch64 reg freg f2 a
Fcmp a
l (afreg -> freg
f afreg
d0) (afreg -> freg
f afreg
d1)
mapFR afreg -> freg
_ (Stp a
l areg
r0 areg
r1 Addr areg
a)       = a -> areg -> areg -> Addr areg -> AArch64 areg freg af2 a
forall reg freg f2 a.
a -> reg -> reg -> Addr reg -> AArch64 reg freg f2 a
Stp a
l areg
r0 areg
r1 Addr areg
a
mapFR afreg -> freg
_ (Ldp a
l areg
r0 areg
r1 Addr areg
a)       = a -> areg -> areg -> Addr areg -> AArch64 areg freg af2 a
forall reg freg f2 a.
a -> reg -> reg -> Addr reg -> AArch64 reg freg f2 a
Ldp a
l areg
r0 areg
r1 Addr areg
a
mapFR afreg -> freg
f (StpD a
l afreg
d0 afreg
d1 Addr areg
a)      = a -> freg -> freg -> Addr areg -> AArch64 areg freg af2 a
forall reg freg f2 a.
a -> freg -> freg -> Addr reg -> AArch64 reg freg f2 a
StpD a
l (afreg -> freg
f afreg
d0) (afreg -> freg
f afreg
d1) Addr areg
a
mapFR afreg -> freg
f (LdpD a
l afreg
d0 afreg
d1 Addr areg
a)      = a -> freg -> freg -> Addr areg -> AArch64 areg freg af2 a
forall reg freg f2 a.
a -> freg -> freg -> Addr reg -> AArch64 reg freg f2 a
LdpD a
l (afreg -> freg
f afreg
d0) (afreg -> freg
f afreg
d1) Addr areg
a
mapFR afreg -> freg
f (Fmadd a
l afreg
d0 afreg
d1 afreg
d2 afreg
d3) = a -> freg -> freg -> freg -> freg -> AArch64 areg freg af2 a
forall reg freg f2 a.
a -> freg -> freg -> freg -> freg -> AArch64 reg freg f2 a
Fmadd a
l (afreg -> freg
f afreg
d0) (afreg -> freg
f afreg
d1) (afreg -> freg
f afreg
d2) (afreg -> freg
f afreg
d3)
mapFR afreg -> freg
f (Fmsub a
l afreg
d0 afreg
d1 afreg
d2 afreg
d3) = a -> freg -> freg -> freg -> freg -> AArch64 areg freg af2 a
forall reg freg f2 a.
a -> freg -> freg -> freg -> freg -> AArch64 reg freg f2 a
Fmsub a
l (afreg -> freg
f afreg
d0) (afreg -> freg
f afreg
d1) (afreg -> freg
f afreg
d2) (afreg -> freg
f afreg
d3)
mapFR afreg -> freg
f (Fsqrt a
l afreg
d0 afreg
d1)       = a -> freg -> freg -> AArch64 areg freg af2 a
forall reg freg f2 a. a -> freg -> freg -> AArch64 reg freg f2 a
Fsqrt a
l (afreg -> freg
f afreg
d0) (afreg -> freg
f afreg
d1)
mapFR afreg -> freg
f (Fneg a
l afreg
d0 afreg
d1)        = a -> freg -> freg -> AArch64 areg freg af2 a
forall reg freg f2 a. a -> freg -> freg -> AArch64 reg freg f2 a
Fneg a
l (afreg -> freg
f afreg
d0) (afreg -> freg
f afreg
d1)
mapFR afreg -> freg
f (Frintm a
l afreg
d0 afreg
d1)      = a -> freg -> freg -> AArch64 areg freg af2 a
forall reg freg f2 a. a -> freg -> freg -> AArch64 reg freg f2 a
Frintm a
l (afreg -> freg
f afreg
d0) (afreg -> freg
f afreg
d1)
mapFR afreg -> freg
_ (MrsR a
l areg
r)            = a -> areg -> AArch64 areg freg af2 a
forall reg freg f2 a. a -> reg -> AArch64 reg freg f2 a
MrsR a
l areg
r
mapFR afreg -> freg
_ (Blr a
l areg
r)             = a -> areg -> AArch64 areg freg af2 a
forall reg freg f2 a. a -> reg -> AArch64 reg freg f2 a
Blr a
l areg
r
mapFR afreg -> freg
_ (MovRCf a
l areg
r CFunc
cf)       = a -> areg -> CFunc -> AArch64 areg freg af2 a
forall reg freg f2 a. a -> reg -> CFunc -> AArch64 reg freg f2 a
MovRCf a
l areg
r CFunc
cf
mapFR afreg -> freg
_ (LdrRL a
x areg
r Int
l)         = a -> areg -> Int -> AArch64 areg freg af2 a
forall reg freg f2 a. a -> reg -> Int -> AArch64 reg freg f2 a
LdrRL a
x areg
r Int
l
mapFR afreg -> freg
f (Fmax a
l afreg
d0 afreg
d1 afreg
d2)     = a -> freg -> freg -> freg -> AArch64 areg freg af2 a
forall reg freg f2 a.
a -> freg -> freg -> freg -> AArch64 reg freg f2 a
Fmax a
l (afreg -> freg
f afreg
d0) (afreg -> freg
f afreg
d1) (afreg -> freg
f afreg
d2)
mapFR afreg -> freg
f (Fmin a
l afreg
d0 afreg
d1 afreg
d2)     = a -> freg -> freg -> freg -> AArch64 areg freg af2 a
forall reg freg f2 a.
a -> freg -> freg -> freg -> AArch64 reg freg f2 a
Fmin a
l (afreg -> freg
f afreg
d0) (afreg -> freg
f afreg
d1) (afreg -> freg
f afreg
d2)
mapFR afreg -> freg
f (Fabs a
l afreg
d0 afreg
d1)        = a -> freg -> freg -> AArch64 areg freg af2 a
forall reg freg f2 a. a -> freg -> freg -> AArch64 reg freg f2 a
Fabs a
l (afreg -> freg
f afreg
d0) (afreg -> freg
f afreg
d1)
mapFR afreg -> freg
_ (Csel a
l areg
r0 areg
r1 areg
r2 Cond
p)   = a -> areg -> areg -> areg -> Cond -> AArch64 areg freg af2 a
forall reg freg f2 a.
a -> reg -> reg -> reg -> Cond -> AArch64 reg freg f2 a
Csel a
l areg
r0 areg
r1 areg
r2 Cond
p
mapFR afreg -> freg
_ (Tbnz a
l areg
r Word8
n Label
p)        = a -> areg -> Word8 -> Label -> AArch64 areg freg af2 a
forall reg freg f2 a.
a -> reg -> Word8 -> Label -> AArch64 reg freg f2 a
Tbnz a
l areg
r Word8
n Label
p
mapFR afreg -> freg
_ (Tbz a
l areg
r Word8
n Label
p)         = a -> areg -> Word8 -> Label -> AArch64 areg freg af2 a
forall reg freg f2 a.
a -> reg -> Word8 -> Label -> AArch64 reg freg f2 a
Tbz a
l areg
r Word8
n Label
p
mapFR afreg -> freg
_ (Cbnz a
x areg
r Label
l)          = a -> areg -> Label -> AArch64 areg freg af2 a
forall reg freg f2 a. a -> reg -> Label -> AArch64 reg freg f2 a
Cbnz a
x areg
r Label
l
mapFR afreg -> freg
_ (Cbz a
x areg
r Label
l)           = a -> areg -> Label -> AArch64 areg freg af2 a
forall reg freg f2 a. a -> reg -> Label -> AArch64 reg freg f2 a
Cbz a
x areg
r Label
l
mapFR afreg -> freg
f (Fcsel a
l afreg
d0 afreg
d1 afreg
d2 Cond
p)  = a -> freg -> freg -> freg -> Cond -> AArch64 areg freg af2 a
forall reg freg f2 a.
a -> freg -> freg -> freg -> Cond -> AArch64 reg freg f2 a
Fcsel a
l (afreg -> freg
f afreg
d0) (afreg -> freg
f afreg
d1) (afreg -> freg
f afreg
d2) Cond
p
mapFR afreg -> freg
_ (TstI a
l areg
r BM
i)          = a -> areg -> BM -> AArch64 areg freg af2 a
forall reg freg f2 a. a -> reg -> BM -> AArch64 reg freg f2 a
TstI a
l areg
r BM
i
mapFR afreg -> freg
_ (Cset a
l areg
r Cond
c)          = a -> areg -> Cond -> AArch64 areg freg af2 a
forall reg freg f2 a. a -> reg -> Cond -> AArch64 reg freg f2 a
Cset a
l areg
r Cond
c
mapFR afreg -> freg
_ (Ldp2 a
l af2
q0 af2
q1 Addr areg
a)      = a -> af2 -> af2 -> Addr areg -> AArch64 areg freg af2 a
forall reg freg f2 a.
a -> f2 -> f2 -> Addr reg -> AArch64 reg freg f2 a
Ldp2 a
l af2
q0 af2
q1 Addr areg
a
mapFR afreg -> freg
_ (Stp2 a
l af2
q0 af2
q1 Addr areg
a)      = a -> af2 -> af2 -> Addr areg -> AArch64 areg freg af2 a
forall reg freg f2 a.
a -> f2 -> f2 -> Addr reg -> AArch64 reg freg f2 a
Stp2 a
l af2
q0 af2
q1 Addr areg
a

s2 :: [a] -> [(a, Maybe a)]
s2 :: forall a. [a] -> [(a, Maybe a)]
s2 (a
r0:a
r1:[a]
rs) = (a
r0, a -> Maybe a
forall a. a -> Maybe a
Just a
r1)(a, Maybe a) -> [(a, Maybe a)] -> [(a, Maybe a)]
forall a. a -> [a] -> [a]
:[a] -> [(a, Maybe a)]
forall a. [a] -> [(a, Maybe a)]
s2 [a]
rs
s2 [a
r]        = [(a
r, Maybe a
forall a. Maybe a
Nothing)]
s2 []         = []

offs :: [a] -> [Word16]
offs :: forall a. [a] -> [Word16]
offs [a]
rs = (Word16 -> a -> Word16) -> Word16 -> [a] -> [Word16]
forall b a. (b -> a -> b) -> b -> [a] -> [b]
scanl' (\Word16
i a
_ -> Word16
iWord16 -> Word16 -> Word16
forall a. Num a => a -> a -> a
+Word16
16) Word16
0 [a]
rs

rsOffs :: [a] -> ([(a, Maybe a)], [Word16], Word16)
rsOffs :: forall a. [a] -> ([(a, Maybe a)], [Word16], Word16)
rsOffs [a]
rs = let ixs :: [Word16]
ixs=[a] -> [Word16]
forall a. [a] -> [Word16]
offs [a]
rs in ([a] -> [(a, Maybe a)]
forall a. [a] -> [(a, Maybe a)]
s2 [a]
rs, [Word16]
ixs, [Word16] -> Word16
forall a. HasCallStack => [a] -> a
last [Word16]
ixs)

pus, pos :: [AReg] -> [AArch64 AReg freg f2reg ()]
pus :: forall freg f2reg. [AReg] -> [AArch64 AReg freg f2reg ()]
pus [AReg]
rs = let ([(AReg, Maybe AReg)]
pps, [Word16]
ixs, Word16
r) = [AReg] -> ([(AReg, Maybe AReg)], [Word16], Word16)
forall a. [a] -> ([(a, Maybe a)], [Word16], Word16)
rsOffs [AReg]
rs in () -> AReg -> AReg -> Word16 -> AArch64 AReg freg f2reg ()
forall reg freg f2 a.
a -> reg -> reg -> Word16 -> AArch64 reg freg f2 a
SubRC () AReg
SP AReg
SP Word16
rAArch64 AReg freg f2reg ()
-> [AArch64 AReg freg f2reg ()] -> [AArch64 AReg freg f2reg ()]
forall a. a -> [a] -> [a]
:[[AArch64 AReg freg f2reg ()]] -> [AArch64 AReg freg f2reg ()]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat (((AReg, Maybe AReg) -> Word16 -> [AArch64 AReg freg f2reg ()])
-> [(AReg, Maybe AReg)]
-> [Word16]
-> [[AArch64 AReg freg f2reg ()]]
forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith (AReg, Maybe AReg) -> Word16 -> [AArch64 AReg freg f2reg ()]
forall {freg} {f2}.
(AReg, Maybe AReg) -> Word16 -> [AArch64 AReg freg f2 ()]
go [(AReg, Maybe AReg)]
pps [Word16]
ixs)
  where go :: (AReg, Maybe AReg) -> Word16 -> [AArch64 AReg freg f2 ()]
go (AReg
r0, Just AReg
r1) Word16
ix = [() -> AReg -> AReg -> Addr AReg -> AArch64 AReg freg f2 ()
forall reg freg f2 a.
a -> reg -> reg -> Addr reg -> AArch64 reg freg f2 a
Stp () AReg
r0 AReg
r1 (AReg -> Word16 -> Addr AReg
forall reg. reg -> Word16 -> Addr reg
RP AReg
SP Word16
ix)]; go (AReg
r, Maybe AReg
Nothing) Word16
ix = [() -> AReg -> Addr AReg -> AArch64 AReg freg f2 ()
forall reg freg f2 a. a -> reg -> Addr reg -> AArch64 reg freg f2 a
Str () AReg
r (AReg -> Word16 -> Addr AReg
forall reg. reg -> Word16 -> Addr reg
RP AReg
SP Word16
ix)]
pos :: forall freg f2reg. [AReg] -> [AArch64 AReg freg f2reg ()]
pos [AReg]
rs = let ([(AReg, Maybe AReg)]
pps, [Word16]
ixs, Word16
r) = [AReg] -> ([(AReg, Maybe AReg)], [Word16], Word16)
forall a. [a] -> ([(a, Maybe a)], [Word16], Word16)
rsOffs [AReg]
rs in [[AArch64 AReg freg f2reg ()]] -> [AArch64 AReg freg f2reg ()]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat (((AReg, Maybe AReg) -> Word16 -> [AArch64 AReg freg f2reg ()])
-> [(AReg, Maybe AReg)]
-> [Word16]
-> [[AArch64 AReg freg f2reg ()]]
forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith (AReg, Maybe AReg) -> Word16 -> [AArch64 AReg freg f2reg ()]
forall {freg} {f2}.
(AReg, Maybe AReg) -> Word16 -> [AArch64 AReg freg f2 ()]
go [(AReg, Maybe AReg)]
pps [Word16]
ixs)[AArch64 AReg freg f2reg ()]
-> [AArch64 AReg freg f2reg ()] -> [AArch64 AReg freg f2reg ()]
forall a. [a] -> [a] -> [a]
++[() -> AReg -> AReg -> Word16 -> AArch64 AReg freg f2reg ()
forall reg freg f2 a.
a -> reg -> reg -> Word16 -> AArch64 reg freg f2 a
AddRC () AReg
SP AReg
SP Word16
r]
  where go :: (AReg, Maybe AReg) -> Word16 -> [AArch64 AReg freg f2 ()]
go (AReg
r0, Just AReg
r1) Word16
ix = [() -> AReg -> AReg -> Addr AReg -> AArch64 AReg freg f2 ()
forall reg freg f2 a.
a -> reg -> reg -> Addr reg -> AArch64 reg freg f2 a
Ldp () AReg
r0 AReg
r1 (AReg -> Word16 -> Addr AReg
forall reg. reg -> Word16 -> Addr reg
RP AReg
SP Word16
ix)]; go (AReg
r, Maybe AReg
Nothing) Word16
ix = [() -> AReg -> Addr AReg -> AArch64 AReg freg f2 ()
forall reg freg f2 a. a -> reg -> Addr reg -> AArch64 reg freg f2 a
Ldr () AReg
r (AReg -> Word16 -> Addr AReg
forall reg. reg -> Word16 -> Addr reg
RP AReg
SP Word16
ix)]

puds, pods :: [freg] -> [AArch64 AReg freg f2reg ()]
puds :: forall freg f2reg. [freg] -> [AArch64 AReg freg f2reg ()]
puds [freg]
rs = let ([(freg, Maybe freg)]
pps, [Word16]
ixs, Word16
r) = [freg] -> ([(freg, Maybe freg)], [Word16], Word16)
forall a. [a] -> ([(a, Maybe a)], [Word16], Word16)
rsOffs [freg]
rs in () -> AReg -> AReg -> Word16 -> AArch64 AReg freg f2reg ()
forall reg freg f2 a.
a -> reg -> reg -> Word16 -> AArch64 reg freg f2 a
SubRC () AReg
SP AReg
SP Word16
rAArch64 AReg freg f2reg ()
-> [AArch64 AReg freg f2reg ()] -> [AArch64 AReg freg f2reg ()]
forall a. a -> [a] -> [a]
:[[AArch64 AReg freg f2reg ()]] -> [AArch64 AReg freg f2reg ()]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat (((freg, Maybe freg) -> Word16 -> [AArch64 AReg freg f2reg ()])
-> [(freg, Maybe freg)]
-> [Word16]
-> [[AArch64 AReg freg f2reg ()]]
forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith (freg, Maybe freg) -> Word16 -> [AArch64 AReg freg f2reg ()]
forall {freg} {f2}.
(freg, Maybe freg) -> Word16 -> [AArch64 AReg freg f2 ()]
go [(freg, Maybe freg)]
pps [Word16]
ixs)
  where go :: (freg, Maybe freg) -> Word16 -> [AArch64 AReg freg f2 ()]
go (freg
r0, Just freg
r1) Word16
ix = [() -> freg -> freg -> Addr AReg -> AArch64 AReg freg f2 ()
forall reg freg f2 a.
a -> freg -> freg -> Addr reg -> AArch64 reg freg f2 a
StpD () freg
r0 freg
r1 (AReg -> Word16 -> Addr AReg
forall reg. reg -> Word16 -> Addr reg
RP AReg
SP Word16
ix)]; go (freg
r, Maybe freg
Nothing) Word16
ix = [() -> freg -> Addr AReg -> AArch64 AReg freg f2 ()
forall reg freg f2 a.
a -> freg -> Addr reg -> AArch64 reg freg f2 a
StrD () freg
r (AReg -> Word16 -> Addr AReg
forall reg. reg -> Word16 -> Addr reg
RP AReg
SP Word16
ix)]
pods :: forall freg f2reg. [freg] -> [AArch64 AReg freg f2reg ()]
pods [freg]
rs = let ([(freg, Maybe freg)]
pps, [Word16]
ixs, Word16
r) = [freg] -> ([(freg, Maybe freg)], [Word16], Word16)
forall a. [a] -> ([(a, Maybe a)], [Word16], Word16)
rsOffs [freg]
rs in [[AArch64 AReg freg f2reg ()]] -> [AArch64 AReg freg f2reg ()]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat (((freg, Maybe freg) -> Word16 -> [AArch64 AReg freg f2reg ()])
-> [(freg, Maybe freg)]
-> [Word16]
-> [[AArch64 AReg freg f2reg ()]]
forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith (freg, Maybe freg) -> Word16 -> [AArch64 AReg freg f2reg ()]
forall {freg} {f2}.
(freg, Maybe freg) -> Word16 -> [AArch64 AReg freg f2 ()]
go [(freg, Maybe freg)]
pps [Word16]
ixs)[AArch64 AReg freg f2reg ()]
-> [AArch64 AReg freg f2reg ()] -> [AArch64 AReg freg f2reg ()]
forall a. [a] -> [a] -> [a]
++[() -> AReg -> AReg -> Word16 -> AArch64 AReg freg f2reg ()
forall reg freg f2 a.
a -> reg -> reg -> Word16 -> AArch64 reg freg f2 a
AddRC () AReg
SP AReg
SP Word16
r]
  where go :: (freg, Maybe freg) -> Word16 -> [AArch64 AReg freg f2 ()]
go (freg
r0, Just freg
r1) Word16
ix = [() -> freg -> freg -> Addr AReg -> AArch64 AReg freg f2 ()
forall reg freg f2 a.
a -> freg -> freg -> Addr reg -> AArch64 reg freg f2 a
LdpD () freg
r0 freg
r1 (AReg -> Word16 -> Addr AReg
forall reg. reg -> Word16 -> Addr reg
RP AReg
SP Word16
ix)]; go (freg
r, Maybe freg
Nothing) Word16
ix = [() -> freg -> Addr AReg -> AArch64 AReg freg f2 ()
forall reg freg f2 a.
a -> freg -> Addr reg -> AArch64 reg freg f2 a
LdrD () freg
r (AReg -> Word16 -> Addr AReg
forall reg. reg -> Word16 -> Addr reg
RP AReg
SP Word16
ix)]

hexd :: Integral a => a -> Doc ann
hexd :: forall a ann. Integral a => a -> Doc ann
hexd = [Char] -> Doc ann
forall ann. [Char] -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty([Char] -> Doc ann) -> (a -> [Char]) -> a -> Doc ann
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(([Char] -> [Char]) -> [Char] -> [Char]
forall a b. (a -> b) -> a -> b
$[Char]
"")(([Char] -> [Char]) -> [Char])
-> (a -> [Char] -> [Char]) -> a -> [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(([Char]
"#0x"[Char] -> [Char] -> [Char]
forall a. [a] -> [a] -> [a]
++)([Char] -> [Char]) -> ([Char] -> [Char]) -> [Char] -> [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
.)(([Char] -> [Char]) -> [Char] -> [Char])
-> (a -> [Char] -> [Char]) -> a -> [Char] -> [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
.a -> [Char] -> [Char]
forall a. Integral a => a -> [Char] -> [Char]
showHex

instance (Pretty reg, Pretty freg, SIMD f2reg) => Pretty (AArch64 reg freg f2reg a) where
    pretty :: forall ann. AArch64 reg freg f2reg a -> Doc ann
pretty (Label a
_ Label
l)            = Label -> Doc ann
forall ann. Label -> Doc ann
prettyLabel Label
l Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
":"
    pretty (B a
_ Label
l)                = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
i4 (Doc ann
"b" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Label -> Doc ann
forall ann. Label -> Doc ann
prettyLabel Label
l)
    pretty (Blr a
_ reg
r)              = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
i4 (Doc ann
"blr" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> reg -> Doc ann
forall ann. reg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty reg
r)
    pretty (Bl a
_ CFunc
l)               = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
i4 (Doc ann
"bl" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> CFunc -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pSym CFunc
l)
    pretty (C a
_ Label
l)                = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
i4 (Doc ann
"call" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Label -> Doc ann
forall ann. Label -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty Label
l)
    pretty (Bc a
_ Cond
c Label
l)             = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
i4 (Doc ann
"b." Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Cond -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. Cond -> Doc ann
pretty Cond
c Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Label -> Doc ann
forall ann. Label -> Doc ann
prettyLabel Label
l)
    pretty (FMovXX a
_ freg
xr0 freg
xr1)     = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
i4 (Doc ann
"fmov" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> freg -> Doc ann
forall ann. freg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty freg
xr0 Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"," Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> freg -> Doc ann
forall ann. freg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty freg
xr1)
    pretty (FMovDR a
_ freg
d reg
r)         = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
i4 (Doc ann
"fmov" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> freg -> Doc ann
forall ann. freg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty freg
d Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"," Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> reg -> Doc ann
forall ann. reg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty reg
r)
    pretty (MovRR a
_ reg
r0 reg
r1)        = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
i4 (Doc ann
"mov" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> reg -> Doc ann
forall ann. reg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty reg
r0 Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"," Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> reg -> Doc ann
forall ann. reg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty reg
r1)
    pretty (MovRC a
_ reg
r Word16
u)          = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
i4 (Doc ann
"mov" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> reg -> Doc ann
forall ann. reg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty reg
r Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"," Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Word16 -> Doc ann
forall a ann. Integral a => a -> Doc ann
hexd Word16
u)
    pretty (Ldr a
_ reg
r Addr reg
a)            = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
i4 (Doc ann
"ldr" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> reg -> Doc ann
forall ann. reg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty reg
r Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"," Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Addr reg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. Addr reg -> Doc ann
pretty Addr reg
a)
    pretty (LdrB a
_ reg
r Addr reg
a)           = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
i4 (Doc ann
"ldrb" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> reg -> Doc ann
forall ann. reg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty reg
r Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"," Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Addr reg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. Addr reg -> Doc ann
pretty Addr reg
a)
    pretty (Str a
_ reg
r Addr reg
a)            = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
i4 (Doc ann
"str" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> reg -> Doc ann
forall ann. reg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty reg
r Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"," Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Addr reg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. Addr reg -> Doc ann
pretty Addr reg
a)
    pretty (StrB a
_ reg
r Addr reg
a)           = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
i4 (Doc ann
"strb" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> reg -> Doc ann
forall ann. reg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty reg
r Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"," Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Addr reg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. Addr reg -> Doc ann
pretty Addr reg
a)
    pretty (LdrD a
_ freg
xr Addr reg
a)          = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
i4 (Doc ann
"ldr" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> freg -> Doc ann
forall ann. freg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty freg
xr Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"," Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Addr reg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. Addr reg -> Doc ann
pretty Addr reg
a)
    pretty (StrD a
_ freg
xr Addr reg
a)          = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
i4 (Doc ann
"str" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> freg -> Doc ann
forall ann. freg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty freg
xr Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"," Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Addr reg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. Addr reg -> Doc ann
pretty Addr reg
a)
    pretty (AddRR a
_ reg
rD reg
rS reg
rS')    = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
i4 (Doc ann
"add" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> reg -> Doc ann
forall ann. reg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty reg
rD Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"," Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> reg -> Doc ann
forall ann. reg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty reg
rS Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"," Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> reg -> Doc ann
forall ann. reg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty reg
rS')
    pretty (AddRRS a
_ reg
rD reg
rS reg
rS' Word8
s) = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
i4 (Doc ann
"add" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> reg -> Doc ann
forall ann. reg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty reg
rD Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"," Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> reg -> Doc ann
forall ann. reg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty reg
rS Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"," Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> reg -> Doc ann
forall ann. reg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty reg
rS' Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"," Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
"LSL" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
"#" Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Word8 -> Doc ann
forall ann. Word8 -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty Word8
s)
    pretty (SubRR a
_ reg
rD reg
rS reg
rS')    = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
i4 (Doc ann
"sub" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> reg -> Doc ann
forall ann. reg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty reg
rD Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"," Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> reg -> Doc ann
forall ann. reg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty reg
rS Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"," Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> reg -> Doc ann
forall ann. reg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty reg
rS')
    pretty (AndRR a
_ reg
rD reg
rS reg
rS')    = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
i4 (Doc ann
"and" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> reg -> Doc ann
forall ann. reg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty reg
rD Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"," Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> reg -> Doc ann
forall ann. reg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty reg
rS Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"," Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> reg -> Doc ann
forall ann. reg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty reg
rS')
    pretty (OrRR a
_ reg
rD reg
rS reg
rS')     = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
i4 (Doc ann
"orr" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> reg -> Doc ann
forall ann. reg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty reg
rD Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"," Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> reg -> Doc ann
forall ann. reg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty reg
rS Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"," Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> reg -> Doc ann
forall ann. reg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty reg
rS')
    pretty (Eor a
_ reg
rD reg
rS reg
rS')      = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
i4 (Doc ann
"eor" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> reg -> Doc ann
forall ann. reg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty reg
rD Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"," Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> reg -> Doc ann
forall ann. reg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty reg
rS Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"," Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> reg -> Doc ann
forall ann. reg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty reg
rS')
    pretty (EorI a
_ reg
rD reg
rS BM
i)       = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
i4 (Doc ann
"eor" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> reg -> Doc ann
forall ann. reg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty reg
rD Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"," Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> reg -> Doc ann
forall ann. reg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty reg
rS Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"," Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> BM -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. BM -> Doc ann
pretty BM
i)
    pretty (ZeroR a
_ reg
rD)           = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
i4 (Doc ann
"eor" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> reg -> Doc ann
forall ann. reg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty reg
rD Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"," Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> reg -> Doc ann
forall ann. reg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty reg
rD Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"," Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> reg -> Doc ann
forall ann. reg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty reg
rD)
    pretty (Mvn a
_ reg
rD reg
rS)          = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
i4 (Doc ann
"mvn" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> reg -> Doc ann
forall ann. reg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty reg
rD Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"," Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> reg -> Doc ann
forall ann. reg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty reg
rS)
    pretty (MulRR a
_ reg
rD reg
rS reg
rS')    = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
i4 (Doc ann
"mul" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> reg -> Doc ann
forall ann. reg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty reg
rD Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"," Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> reg -> Doc ann
forall ann. reg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty reg
rS Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"," Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> reg -> Doc ann
forall ann. reg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty reg
rS')
    pretty (SubRC a
_ reg
rD reg
rS Word16
u)      = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
i4 (Doc ann
"sub" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> reg -> Doc ann
forall ann. reg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty reg
rD Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"," Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> reg -> Doc ann
forall ann. reg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty reg
rS Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"," Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Word16 -> Doc ann
forall a ann. Integral a => a -> Doc ann
hexd Word16
u)
    pretty (AddRC a
_ reg
rD reg
rS Word16
u)      = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
i4 (Doc ann
"add" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> reg -> Doc ann
forall ann. reg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty reg
rD Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"," Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> reg -> Doc ann
forall ann. reg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty reg
rS Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"," Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Word16 -> Doc ann
forall a ann. Integral a => a -> Doc ann
hexd Word16
u)
    pretty (Lsl a
_ reg
rD reg
rS Word8
u)        = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
i4 (Doc ann
"lsl" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> reg -> Doc ann
forall ann. reg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty reg
rD Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"," Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> reg -> Doc ann
forall ann. reg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty reg
rS Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"," Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Word8 -> Doc ann
forall a ann. Integral a => a -> Doc ann
hexd Word8
u)
    pretty (Asr a
_ reg
rD reg
rS Word8
u)        = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
i4 (Doc ann
"asr" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> reg -> Doc ann
forall ann. reg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty reg
rD Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"," Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> reg -> Doc ann
forall ann. reg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty reg
rS Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"," Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Word8 -> Doc ann
forall a ann. Integral a => a -> Doc ann
hexd Word8
u)
    pretty (CmpRC a
_ reg
r Word16
u)          = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
i4 (Doc ann
"cmp" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> reg -> Doc ann
forall ann. reg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty reg
r Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"," Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Word16 -> Doc ann
forall a ann. Integral a => a -> Doc ann
hexd Word16
u)
    pretty (CmpRR a
_ reg
r0 reg
r1)        = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
i4 (Doc ann
"cmp" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> reg -> Doc ann
forall ann. reg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty reg
r0 Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"," Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> reg -> Doc ann
forall ann. reg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty reg
r1)
    pretty (Neg a
_ reg
rD reg
rS)          = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
i4 (Doc ann
"neg" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> reg -> Doc ann
forall ann. reg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty reg
rD Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"," Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> reg -> Doc ann
forall ann. reg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty reg
rS)
    pretty (Fmul a
_ freg
rD freg
r0 freg
r1)      = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
i4 (Doc ann
"fmul" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> freg -> Doc ann
forall ann. freg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty freg
rD Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"," Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> freg -> Doc ann
forall ann. freg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty freg
r0 Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"," Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> freg -> Doc ann
forall ann. freg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty freg
r1)
    pretty (Fadd a
_ freg
rD freg
r0 freg
r1)      = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
i4 (Doc ann
"fadd" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> freg -> Doc ann
forall ann. freg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty freg
rD Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"," Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> freg -> Doc ann
forall ann. freg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty freg
r0 Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"," Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> freg -> Doc ann
forall ann. freg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty freg
r1)
    pretty (Fsub a
_ freg
rD freg
r0 freg
r1)      = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
i4 (Doc ann
"fsub" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> freg -> Doc ann
forall ann. freg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty freg
rD Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"," Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> freg -> Doc ann
forall ann. freg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty freg
r0 Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"," Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> freg -> Doc ann
forall ann. freg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty freg
r1)
    pretty (Fdiv a
_ freg
rD freg
r0 freg
r1)      = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
i4 (Doc ann
"fdiv" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> freg -> Doc ann
forall ann. freg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty freg
rD Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"," Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> freg -> Doc ann
forall ann. freg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty freg
r0 Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"," Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> freg -> Doc ann
forall ann. freg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty freg
r1)
    pretty (FcmpZ a
_ freg
xr)           = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
i4 (Doc ann
"fcmp" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> freg -> Doc ann
forall ann. freg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty freg
xr Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"," Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
"#0.0")
    pretty (Fneg a
_ freg
d0 freg
d1)         = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
i4 (Doc ann
"fneg" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> freg -> Doc ann
forall ann. freg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty freg
d0 Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"," Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> freg -> Doc ann
forall ann. freg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty freg
d1)
    pretty Ret{}                  = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
i4 Doc ann
"ret"
    pretty RetL{}                 = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
i4 Doc ann
"ret"
    pretty (Scvtf a
_ freg
d reg
r)          = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
i4 (Doc ann
"scvtf" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> freg -> Doc ann
forall ann. freg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty freg
d Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"," Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> reg -> Doc ann
forall ann. reg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty reg
r)
    pretty (Fcvtms a
_ reg
r freg
d)         = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
i4 (Doc ann
"fcvtms" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> reg -> Doc ann
forall ann. reg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty reg
r Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"," Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> freg -> Doc ann
forall ann. freg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty freg
d)
    pretty (Fcvtas a
_ reg
r freg
d)         = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
i4 (Doc ann
"fcvtas" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> reg -> Doc ann
forall ann. reg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty reg
r Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"," Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> freg -> Doc ann
forall ann. freg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty freg
d)
    pretty (MovK a
_ reg
r Word16
i Int
s)         = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
i4 (Doc ann
"movk" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> reg -> Doc ann
forall ann. reg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty reg
r Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"," Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Word16 -> Doc ann
forall a ann. Integral a => a -> Doc ann
hexd Word16
i Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"," Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
"LSL" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
"#" Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Int -> Doc ann
forall ann. Int -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty Int
s)
    pretty (MovZ a
_ reg
r Word16
i Int
s)         = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
i4 (Doc ann
"movz" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> reg -> Doc ann
forall ann. reg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty reg
r Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"," Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Word16 -> Doc ann
forall a ann. Integral a => a -> Doc ann
hexd Word16
i Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"," Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
"LSL" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
"#" Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Int -> Doc ann
forall ann. Int -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty Int
s)
    pretty (Fcmp a
_ freg
d0 freg
d1)         = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
i4 (Doc ann
"fcmp" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> freg -> Doc ann
forall ann. freg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty freg
d0 Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"," Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> freg -> Doc ann
forall ann. freg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty freg
d1)
    pretty (Stp a
_ reg
r0 reg
r1 Addr reg
a)        = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
i4 (Doc ann
"stp" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> reg -> Doc ann
forall ann. reg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty reg
r0 Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"," Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> reg -> Doc ann
forall ann. reg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty reg
r1 Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"," Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Addr reg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. Addr reg -> Doc ann
pretty Addr reg
a)
    pretty (Ldp a
_ reg
r0 reg
r1 Addr reg
a)        = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
i4 (Doc ann
"ldp" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> reg -> Doc ann
forall ann. reg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty reg
r0 Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"," Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> reg -> Doc ann
forall ann. reg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty reg
r1 Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"," Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Addr reg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. Addr reg -> Doc ann
pretty Addr reg
a)
    pretty (Ldp2 a
_ f2reg
q0 f2reg
q1 Addr reg
a)       = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
i4 (Doc ann
"ldp" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> f2reg -> Doc ann
forall ann. f2reg -> Doc ann
forall a ann. SIMD a => a -> Doc ann
pq f2reg
q0 Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"," Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> f2reg -> Doc ann
forall ann. f2reg -> Doc ann
forall a ann. SIMD a => a -> Doc ann
pq f2reg
q1 Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"," Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Addr reg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. Addr reg -> Doc ann
pretty Addr reg
a)
    pretty (Stp2 a
_ f2reg
q0 f2reg
q1 Addr reg
a)       = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
i4 (Doc ann
"stp" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> f2reg -> Doc ann
forall ann. f2reg -> Doc ann
forall a ann. SIMD a => a -> Doc ann
pq f2reg
q0 Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"," Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> f2reg -> Doc ann
forall ann. f2reg -> Doc ann
forall a ann. SIMD a => a -> Doc ann
pq f2reg
q1 Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"," Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Addr reg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. Addr reg -> Doc ann
pretty Addr reg
a)
    pretty (StpD a
_ freg
d0 freg
d1 Addr reg
a)       = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
i4 (Doc ann
"stp" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> freg -> Doc ann
forall ann. freg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty freg
d0 Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"," Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> freg -> Doc ann
forall ann. freg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty freg
d1 Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"," Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Addr reg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. Addr reg -> Doc ann
pretty Addr reg
a)
    pretty (LdpD a
_ freg
d0 freg
d1 Addr reg
a)       = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
i4 (Doc ann
"ldp" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> freg -> Doc ann
forall ann. freg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty freg
d0 Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"," Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> freg -> Doc ann
forall ann. freg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty freg
d1 Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"," Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Addr reg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. Addr reg -> Doc ann
pretty Addr reg
a)
    pretty (Fmadd a
_ freg
d0 freg
d1 freg
d2 freg
d3)  = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
i4 (Doc ann
"fmadd" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> freg -> Doc ann
forall ann. freg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty freg
d0 Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"," Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> freg -> Doc ann
forall ann. freg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty freg
d1 Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"," Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> freg -> Doc ann
forall ann. freg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty freg
d2 Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"," Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> freg -> Doc ann
forall ann. freg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty freg
d3)
    pretty (Fmsub a
_ freg
d0 freg
d1 freg
d2 freg
d3)  = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
i4 (Doc ann
"fmsub" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> freg -> Doc ann
forall ann. freg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty freg
d0 Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"," Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> freg -> Doc ann
forall ann. freg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty freg
d1 Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"," Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> freg -> Doc ann
forall ann. freg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty freg
d2 Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"," Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> freg -> Doc ann
forall ann. freg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty freg
d3)
    pretty (Madd a
_ reg
r0 reg
r1 reg
r2 reg
r3)   = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
i4 (Doc ann
"madd" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> reg -> Doc ann
forall ann. reg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty reg
r0 Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"," Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> reg -> Doc ann
forall ann. reg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty reg
r1 Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"," Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> reg -> Doc ann
forall ann. reg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty reg
r2 Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"," Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> reg -> Doc ann
forall ann. reg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty reg
r3)
    pretty (Msub a
_ reg
r0 reg
r1 reg
r2 reg
r3)   = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
i4 (Doc ann
"msub" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> reg -> Doc ann
forall ann. reg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty reg
r0 Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"," Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> reg -> Doc ann
forall ann. reg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty reg
r1 Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"," Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> reg -> Doc ann
forall ann. reg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty reg
r2 Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"," Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> reg -> Doc ann
forall ann. reg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty reg
r3)
    pretty (Sdiv a
_ reg
rD reg
rS reg
rS')     = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
i4 (Doc ann
"sdiv" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> reg -> Doc ann
forall ann. reg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty reg
rD Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"," Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> reg -> Doc ann
forall ann. reg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty reg
rS Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"," Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> reg -> Doc ann
forall ann. reg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty reg
rS')
    pretty (Fsqrt a
_ freg
d0 freg
d1)        = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
i4 (Doc ann
"fsqrt" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> freg -> Doc ann
forall ann. freg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty freg
d0 Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"," Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> freg -> Doc ann
forall ann. freg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty freg
d1)
    pretty (Frintm a
_ freg
d0 freg
d1)       = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
i4 (Doc ann
"frintm" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> freg -> Doc ann
forall ann. freg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty freg
d0 Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"," Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> freg -> Doc ann
forall ann. freg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty freg
d1)
    pretty (MrsR a
_ reg
r)             = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
i4 (Doc ann
"mrs" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> reg -> Doc ann
forall ann. reg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty reg
r Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"," Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
"rndr")
    pretty (MovRCf a
_ reg
r CFunc
cf)        = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
i4 (Doc ann
"mov" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> reg -> Doc ann
forall ann. reg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty reg
r Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"," Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> CFunc -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. CFunc -> Doc ann
pretty CFunc
cf)
    pretty (LdrRL a
_ reg
r Int
l)          = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
i4 (Doc ann
"ldr" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> reg -> Doc ann
forall ann. reg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty reg
r Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"," Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
"=arr_" Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Int -> Doc ann
forall ann. Int -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty Int
l)
    pretty (Fmax a
_ freg
d0 freg
d1 freg
d2)      = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
i4 (Doc ann
"fmax" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> freg -> Doc ann
forall ann. freg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty freg
d0 Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"," Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> freg -> Doc ann
forall ann. freg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty freg
d1 Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"," Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> freg -> Doc ann
forall ann. freg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty freg
d2)
    pretty (Fmin a
_ freg
d0 freg
d1 freg
d2)      = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
i4 (Doc ann
"fmin" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> freg -> Doc ann
forall ann. freg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty freg
d0 Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"," Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> freg -> Doc ann
forall ann. freg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty freg
d1 Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"," Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> freg -> Doc ann
forall ann. freg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty freg
d2)
    pretty (Fabs a
_ freg
d0 freg
d1)         = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
i4 (Doc ann
"fabs" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> freg -> Doc ann
forall ann. freg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty freg
d0 Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"," Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> freg -> Doc ann
forall ann. freg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty freg
d1)
    pretty (Csel a
_ reg
r0 reg
r1 reg
r2 Cond
p)    = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
i4 (Doc ann
"csel" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> reg -> Doc ann
forall ann. reg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty reg
r0 Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"," Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> reg -> Doc ann
forall ann. reg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty reg
r1 Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"," Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> reg -> Doc ann
forall ann. reg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty reg
r2 Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"," Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Cond -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. Cond -> Doc ann
pretty Cond
p)
    pretty (Tbnz a
_ reg
r Word8
n Label
l)         = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
i4 (Doc ann
"tbnz" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> reg -> Doc ann
forall ann. reg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty reg
r Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"," Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
"#" Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Word8 -> Doc ann
forall ann. Word8 -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty Word8
n Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"," Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Label -> Doc ann
forall ann. Label -> Doc ann
prettyLabel Label
l)
    pretty (Tbz a
_ reg
r Word8
n Label
l)          = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
i4 (Doc ann
"tbz" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> reg -> Doc ann
forall ann. reg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty reg
r Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"," Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
"#" Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Word8 -> Doc ann
forall ann. Word8 -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty Word8
n Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"," Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Label -> Doc ann
forall ann. Label -> Doc ann
prettyLabel Label
l)
    pretty (Cbnz a
_ reg
r Label
l)           = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
i4 (Doc ann
"cbnz" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> reg -> Doc ann
forall ann. reg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty reg
r Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"," Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Label -> Doc ann
forall ann. Label -> Doc ann
prettyLabel Label
l)
    pretty (Cbz a
_ reg
r Label
l)            = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
i4 (Doc ann
"cbz" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> reg -> Doc ann
forall ann. reg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty reg
r Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"," Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Label -> Doc ann
forall ann. Label -> Doc ann
prettyLabel Label
l)
    pretty (Fcsel a
_ freg
d0 freg
d1 freg
d2 Cond
p)   = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
i4 (Doc ann
"fcsel" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> freg -> Doc ann
forall ann. freg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty freg
d0 Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"," Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> freg -> Doc ann
forall ann. freg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty freg
d1 Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"," Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> freg -> Doc ann
forall ann. freg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty freg
d2 Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"," Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Cond -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. Cond -> Doc ann
pretty Cond
p)
    pretty (TstI a
_ reg
r BM
i)           = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
i4 (Doc ann
"tst" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> reg -> Doc ann
forall ann. reg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty reg
r Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"," Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> BM -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. BM -> Doc ann
pretty BM
i)
    pretty (Cset a
_ reg
r Cond
c)           = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
i4 (Doc ann
"cset" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> reg -> Doc ann
forall ann. reg -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty reg
r Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"," Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Cond -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. Cond -> Doc ann
pretty Cond
c)

instance (Pretty reg, Pretty freg, SIMD f2reg) => Show (AArch64 reg freg f2reg a) where show :: AArch64 reg freg f2reg a -> [Char]
show=Doc Any -> [Char]
forall a. Show a => a -> [Char]
show(Doc Any -> [Char])
-> (AArch64 reg freg f2reg a -> Doc Any)
-> AArch64 reg freg f2reg a
-> [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
.AArch64 reg freg f2reg a -> Doc Any
forall a ann. Pretty a => a -> Doc ann
forall ann. AArch64 reg freg f2reg a -> Doc ann
pretty

prettyLive :: (Pretty reg, Pretty freg, SIMD f2reg, Pretty o) => AArch64 reg freg f2reg o -> Doc ann
prettyLive :: forall reg freg f2reg o ann.
(Pretty reg, Pretty freg, SIMD f2reg, Pretty o) =>
AArch64 reg freg f2reg o -> Doc ann
prettyLive AArch64 reg freg f2reg o
r = AArch64 reg freg f2reg o -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. AArch64 reg freg f2reg o -> Doc ann
pretty AArch64 reg freg f2reg o
r Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> o -> Doc ann
forall ann. o -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty (AArch64 reg freg f2reg o -> o
forall reg freg f2 a. AArch64 reg freg f2 a -> a
ann AArch64 reg freg f2reg o
r)

prettyDebug :: (Pretty freg, Pretty reg, SIMD f2reg, Pretty o) => [AArch64 reg freg f2reg o] -> Doc ann
prettyDebug :: forall freg reg f2reg o ann.
(Pretty freg, Pretty reg, SIMD f2reg, Pretty o) =>
[AArch64 reg freg f2reg o] -> Doc ann
prettyDebug = [Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
prettyLines ([Doc ann] -> Doc ann)
-> ([AArch64 reg freg f2reg o] -> [Doc ann])
-> [AArch64 reg freg f2reg o]
-> Doc ann
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (AArch64 reg freg f2reg o -> Doc ann)
-> [AArch64 reg freg f2reg o] -> [Doc ann]
forall a b. (a -> b) -> [a] -> [b]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap AArch64 reg freg f2reg o -> Doc ann
forall reg freg f2reg o ann.
(Pretty reg, Pretty freg, SIMD f2reg, Pretty o) =>
AArch64 reg freg f2reg o -> Doc ann
prettyLive