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

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

import           Asm.M
import           Control.DeepSeq   (NFData (..))
import           Data.Copointed
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

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

instance NFData AReg where
instance NFData FAReg 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 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

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
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 a = Label { forall reg freg a. AArch64 reg freg a -> a
ann :: a, forall reg freg a. AArch64 reg freg a -> Label
label :: Label }
                        | B { ann :: a, label :: Label }
                        | Blr { ann :: a, forall reg freg a. AArch64 reg freg a -> reg
rSrc :: reg }
                        | C { ann :: a, label :: Label }
                        | Bl { ann :: a, forall reg freg a. AArch64 reg freg a -> CFunc
cfunc :: CFunc }
                        | Bc { ann :: a, forall reg freg a. AArch64 reg freg a -> Cond
cond :: Cond, label :: Label }
                        | Ret { ann :: a } | RetL { ann :: a, label :: Label }
                        | FMovXX { ann :: a, forall reg freg a. AArch64 reg freg a -> freg
dDest, forall reg freg a. AArch64 reg freg a -> freg
dSrc :: freg }
                        | FMovDR { ann :: a, dDest :: freg, rSrc :: reg }
                        | MovRR { ann :: a, forall reg freg a. AArch64 reg freg a -> reg
rDest, rSrc :: reg }
                        | MovRC { ann :: a, rDest :: reg, forall reg freg a. AArch64 reg freg a -> Word16
cSrc :: Word16 }
                        | MovZ { ann :: a, rDest :: reg, cSrc :: Word16, forall reg freg a. AArch64 reg freg a -> Int
lsl :: Int }
                        | MovRCf { ann :: a, rDest :: reg, cfunc :: CFunc }
                        | LdrRL { ann :: a, rDest :: reg, forall reg freg a. AArch64 reg freg a -> Int
lSrc :: Int }
                        | MovK { ann :: a, rDest :: reg, cSrc :: Word16, lsl :: Int }
                        | Ldr { ann :: a, rDest :: reg, forall reg freg a. AArch64 reg freg a -> Addr reg
aSrc :: Addr reg }
                        | LdrB { ann :: a, rDest :: reg, aSrc :: Addr reg }
                        | Str { ann :: a, rSrc :: reg, forall reg freg a. AArch64 reg freg 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 a. AArch64 reg freg a -> reg
rSrc1, forall reg freg a. AArch64 reg freg a -> reg
rSrc2 :: reg }
                        | AddRR { ann :: a, rDest, rSrc1, rSrc2 :: reg }
                        | AddRRS { ann :: a, rDest, rSrc1, rSrc2 :: reg, forall reg freg a. AArch64 reg freg 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 a. AArch64 reg freg 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 a. AArch64 reg freg 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 a. AArch64 reg freg a -> freg
dSrc1, forall reg freg a. AArch64 reg freg 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 a. AArch64 reg freg a -> reg
rDest1, forall reg freg a. AArch64 reg freg a -> reg
rDest2 :: reg, aSrc :: Addr reg }
                        | StpD { ann :: a, dSrc1, dSrc2 :: freg, aDest :: Addr reg }
                        | LdpD { ann :: a, forall reg freg a. AArch64 reg freg a -> freg
dDest1, forall reg freg a. AArch64 reg freg a -> freg
dDest2 :: freg, aSrc :: Addr reg }
                        | Fmadd { ann :: a, dDest, dSrc1, dSrc2, forall reg freg a. AArch64 reg freg 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 a. AArch64 reg freg a -> Word8
bit :: Word8, label :: Label }
                        | Tbz { ann :: a, rSrc :: reg, bit :: Word8, label :: Label }
                        | Cbnz { 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 a. AArch64 reg freg a -> BM
imm :: BM }
                        | EorI { ann :: a, rSrc, forall reg freg a. AArch64 reg freg a -> reg
rDesg :: reg, imm :: BM }
                        deriving ((forall a b. (a -> b) -> AArch64 reg freg a -> AArch64 reg freg b)
-> (forall a b. a -> AArch64 reg freg b -> AArch64 reg freg a)
-> Functor (AArch64 reg freg)
forall a b. a -> AArch64 reg freg b -> AArch64 reg freg a
forall a b. (a -> b) -> AArch64 reg freg a -> AArch64 reg freg b
forall reg freg a b. a -> AArch64 reg freg b -> AArch64 reg freg a
forall reg freg a b.
(a -> b) -> AArch64 reg freg a -> AArch64 reg freg 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 a b.
(a -> b) -> AArch64 reg freg a -> AArch64 reg freg b
fmap :: forall a b. (a -> b) -> AArch64 reg freg a -> AArch64 reg freg b
$c<$ :: forall reg freg a b. a -> AArch64 reg freg b -> AArch64 reg freg a
<$ :: forall a b. a -> AArch64 reg freg b -> AArch64 reg freg a
Functor, (forall x. AArch64 reg freg a -> Rep (AArch64 reg freg a) x)
-> (forall x. Rep (AArch64 reg freg a) x -> AArch64 reg freg a)
-> Generic (AArch64 reg freg a)
forall x. Rep (AArch64 reg freg a) x -> AArch64 reg freg a
forall x. AArch64 reg freg a -> Rep (AArch64 reg freg a) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall reg freg a x.
Rep (AArch64 reg freg a) x -> AArch64 reg freg a
forall reg freg a x.
AArch64 reg freg a -> Rep (AArch64 reg freg a) x
$cfrom :: forall reg freg a x.
AArch64 reg freg a -> Rep (AArch64 reg freg a) x
from :: forall x. AArch64 reg freg a -> Rep (AArch64 reg freg a) x
$cto :: forall reg freg a x.
Rep (AArch64 reg freg a) x -> AArch64 reg freg a
to :: forall x. Rep (AArch64 reg freg a) x -> AArch64 reg freg a
Generic)

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

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

mapR :: (areg -> reg) -> AArch64 areg afreg a -> AArch64 reg afreg a
mapR :: forall areg reg afreg a.
(areg -> reg) -> AArch64 areg afreg a -> AArch64 reg afreg a
mapR areg -> reg
_ (Label a
x Label
l)           = a -> Label -> AArch64 reg afreg a
forall reg freg a. a -> Label -> AArch64 reg freg a
Label a
x Label
l
mapR areg -> reg
_ (B a
x Label
l)               = a -> Label -> AArch64 reg afreg a
forall reg freg a. a -> Label -> AArch64 reg freg a
B a
x Label
l
mapR areg -> reg
_ (Bc a
x Cond
c Label
l)            = a -> Cond -> Label -> AArch64 reg afreg a
forall reg freg a. a -> Cond -> Label -> AArch64 reg freg a
Bc a
x Cond
c Label
l
mapR areg -> reg
_ (Bl a
x CFunc
f)              = a -> CFunc -> AArch64 reg afreg a
forall reg freg a. a -> CFunc -> AArch64 reg freg a
Bl a
x CFunc
f
mapR areg -> reg
_ (C a
x Label
l)               = a -> Label -> AArch64 reg afreg a
forall reg freg a. a -> Label -> AArch64 reg freg a
C a
x Label
l
mapR areg -> reg
_ (FMovXX a
l afreg
r0 afreg
r1)      = a -> afreg -> afreg -> AArch64 reg afreg a
forall reg freg a. a -> freg -> freg -> AArch64 reg freg 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 a
forall reg freg a. a -> reg -> reg -> AArch64 reg freg 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 a
forall reg freg a. a -> reg -> Word16 -> AArch64 reg freg 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 a
forall reg freg a. a -> reg -> Addr reg -> AArch64 reg freg 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 a
forall reg freg a. a -> reg -> Addr reg -> AArch64 reg freg 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 a
forall reg freg a. a -> reg -> Addr reg -> AArch64 reg freg 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 a
forall reg freg a. a -> reg -> Addr reg -> AArch64 reg freg 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 a
forall reg freg a. a -> freg -> Addr reg -> AArch64 reg freg 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 a
forall reg freg a. a -> reg -> reg -> reg -> AArch64 reg freg 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 a
forall reg freg a.
a -> reg -> reg -> reg -> Word8 -> AArch64 reg freg 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 a
forall reg freg a. a -> reg -> reg -> reg -> AArch64 reg freg 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 a
forall reg freg a. a -> reg -> reg -> Word16 -> AArch64 reg freg 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 a
forall reg freg a. a -> reg -> reg -> Word16 -> AArch64 reg freg 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 a
forall reg freg a. a -> reg -> AArch64 reg freg 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 a
forall reg freg a. a -> reg -> reg -> AArch64 reg freg 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 a
forall reg freg a. a -> reg -> reg -> reg -> AArch64 reg freg 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 a
forall reg freg a. a -> reg -> reg -> reg -> AArch64 reg freg 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 a
forall reg freg a. a -> reg -> reg -> reg -> AArch64 reg freg 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 a
forall reg freg a. a -> reg -> reg -> Word8 -> AArch64 reg freg 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 a
forall reg freg a. a -> reg -> reg -> Word8 -> AArch64 reg freg 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 a
forall reg freg a. a -> reg -> reg -> AArch64 reg freg 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 a
forall reg freg a. a -> reg -> Word16 -> AArch64 reg freg 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 a
forall reg freg a. a -> reg -> reg -> AArch64 reg freg 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 a
forall reg freg a. a -> freg -> freg -> freg -> AArch64 reg freg 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 a
forall reg freg a. a -> freg -> freg -> freg -> AArch64 reg freg 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 a
forall reg freg a. a -> freg -> freg -> freg -> AArch64 reg freg 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 a
forall reg freg a. a -> freg -> freg -> AArch64 reg freg a
Fneg a
l afreg
xr0 afreg
xr1
mapR areg -> reg
_ (FcmpZ a
l afreg
xr)          = a -> afreg -> AArch64 reg afreg a
forall reg freg a. a -> freg -> AArch64 reg freg a
FcmpZ a
l afreg
xr
mapR areg -> reg
_ (Ret a
l)               = a -> AArch64 reg afreg a
forall reg freg a. a -> AArch64 reg freg a
Ret a
l
mapR areg -> reg
_ (RetL a
x Label
l)            = a -> Label -> AArch64 reg afreg a
forall reg freg a. a -> Label -> AArch64 reg freg 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 a
forall reg freg a. a -> reg -> reg -> reg -> AArch64 reg freg 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 a
forall reg freg a.
a -> reg -> reg -> reg -> reg -> AArch64 reg freg 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 a
forall reg freg a.
a -> reg -> reg -> reg -> reg -> AArch64 reg freg 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 a
forall reg freg a. a -> reg -> reg -> reg -> AArch64 reg freg 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 a
forall reg freg a. a -> freg -> Addr reg -> AArch64 reg freg 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 a
forall reg freg a. a -> freg -> freg -> freg -> AArch64 reg freg 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 a
forall reg freg a. a -> freg -> reg -> AArch64 reg freg 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 a
forall reg freg a. a -> reg -> freg -> AArch64 reg freg 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 a
forall reg freg a. a -> reg -> freg -> AArch64 reg freg 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 a
forall reg freg a. a -> reg -> Word16 -> Int -> AArch64 reg freg 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 a
forall reg freg a. a -> reg -> Word16 -> Int -> AArch64 reg freg 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 a
forall reg freg a. a -> freg -> reg -> AArch64 reg freg 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 a
forall reg freg a. a -> freg -> freg -> AArch64 reg freg 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 a
forall reg freg a.
a -> reg -> reg -> Addr reg -> AArch64 reg freg 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 a
forall reg freg a.
a -> reg -> reg -> Addr reg -> AArch64 reg freg 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 a
forall reg freg a.
a -> freg -> freg -> Addr reg -> AArch64 reg freg 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 a
forall reg freg a.
a -> freg -> freg -> Addr reg -> AArch64 reg freg 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 a
forall reg freg a.
a -> freg -> freg -> freg -> freg -> AArch64 reg freg 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 a
forall reg freg a.
a -> freg -> freg -> freg -> freg -> AArch64 reg freg 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 a
forall reg freg a. a -> freg -> freg -> AArch64 reg freg a
Fsqrt a
l afreg
d0 afreg
d1
mapR areg -> reg
_ (Frintm a
l afreg
d0 afreg
d1)      = a -> afreg -> afreg -> AArch64 reg afreg a
forall reg freg a. a -> freg -> freg -> AArch64 reg freg a
Frintm a
l afreg
d0 afreg
d1
mapR areg -> reg
f (MrsR a
l areg
r)            = a -> reg -> AArch64 reg afreg a
forall reg freg a. a -> reg -> AArch64 reg freg 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 a
forall reg freg a. a -> reg -> CFunc -> AArch64 reg freg 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 a
forall reg freg a. a -> reg -> Int -> AArch64 reg freg 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 a
forall reg freg a. a -> reg -> AArch64 reg freg 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 a
forall reg freg a. a -> freg -> freg -> freg -> AArch64 reg freg 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 a
forall reg freg a. a -> freg -> freg -> freg -> AArch64 reg freg 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 a
forall reg freg a. a -> freg -> freg -> AArch64 reg freg 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 a
forall reg freg a.
a -> reg -> reg -> reg -> Cond -> AArch64 reg freg 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 a
forall reg freg a. a -> reg -> Word8 -> Label -> AArch64 reg freg 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 a
forall reg freg a. a -> reg -> Word8 -> Label -> AArch64 reg freg 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 a
forall reg freg a. a -> reg -> Label -> AArch64 reg freg a
Cbnz 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 a
forall reg freg a.
a -> freg -> freg -> freg -> Cond -> AArch64 reg freg 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 a
forall reg freg a. a -> reg -> BM -> AArch64 reg freg 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 a
forall reg freg a. a -> reg -> Cond -> AArch64 reg freg 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 a
forall reg freg a. a -> reg -> reg -> BM -> AArch64 reg freg a
EorI a
l (areg -> reg
f areg
r0) (areg -> reg
f areg
r1) BM
i

mapFR :: (afreg -> freg) -> AArch64 areg afreg a -> AArch64 areg freg a
mapFR :: forall afreg freg areg a.
(afreg -> freg) -> AArch64 areg afreg a -> AArch64 areg freg a
mapFR afreg -> freg
_ (Label a
x Label
l)           = a -> Label -> AArch64 areg freg a
forall reg freg a. a -> Label -> AArch64 reg freg a
Label a
x Label
l
mapFR afreg -> freg
_ (B a
x Label
l)               = a -> Label -> AArch64 areg freg a
forall reg freg a. a -> Label -> AArch64 reg freg a
B a
x Label
l
mapFR afreg -> freg
_ (Bc a
x Cond
c Label
l)            = a -> Cond -> Label -> AArch64 areg freg a
forall reg freg a. a -> Cond -> Label -> AArch64 reg freg a
Bc a
x Cond
c Label
l
mapFR afreg -> freg
_ (Bl a
x CFunc
f)              = a -> CFunc -> AArch64 areg freg a
forall reg freg a. a -> CFunc -> AArch64 reg freg a
Bl a
x CFunc
f
mapFR afreg -> freg
_ (C a
x Label
l)               = a -> Label -> AArch64 areg freg a
forall reg freg a. a -> Label -> AArch64 reg freg a
C a
x Label
l
mapFR afreg -> freg
f (FMovXX a
l afreg
xr0 afreg
xr1)    = a -> freg -> freg -> AArch64 areg freg a
forall reg freg a. a -> freg -> freg -> AArch64 reg freg 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 a
forall reg freg a. a -> reg -> reg -> AArch64 reg freg a
MovRR a
l areg
r0 areg
r1
mapFR afreg -> freg
_ (MovRC a
l areg
r0 Word16
c)        = a -> areg -> Word16 -> AArch64 areg freg a
forall reg freg a. a -> reg -> Word16 -> AArch64 reg freg 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 a
forall reg freg a. a -> reg -> Addr reg -> AArch64 reg freg 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 a
forall reg freg a. a -> reg -> Addr reg -> AArch64 reg freg 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 a
forall reg freg a. a -> reg -> Addr reg -> AArch64 reg freg 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 a
forall reg freg a. a -> reg -> Addr reg -> AArch64 reg freg 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 a
forall reg freg a. a -> freg -> Addr reg -> AArch64 reg freg 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 a
forall reg freg a. a -> reg -> reg -> reg -> AArch64 reg freg 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 a
forall reg freg a.
a -> reg -> reg -> reg -> Word8 -> AArch64 reg freg 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 a
forall reg freg a. a -> reg -> reg -> Word16 -> AArch64 reg freg 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 a
forall reg freg a. a -> reg -> reg -> reg -> AArch64 reg freg 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 a
forall reg freg a. a -> reg -> reg -> Word16 -> AArch64 reg freg a
SubRC a
l areg
r0 areg
r1 Word16
c
mapFR afreg -> freg
_ (ZeroR a
l areg
r)           = a -> areg -> AArch64 areg freg a
forall reg freg a. a -> reg -> AArch64 reg freg a
ZeroR a
l areg
r
mapFR afreg -> freg
_ (Mvn a
l areg
r0 areg
r1)         = a -> areg -> areg -> AArch64 areg freg a
forall reg freg a. a -> reg -> reg -> AArch64 reg freg 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 a
forall reg freg a. a -> reg -> reg -> reg -> AArch64 reg freg 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 a
forall reg freg a. a -> reg -> reg -> reg -> AArch64 reg freg 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 a
forall reg freg a. a -> reg -> reg -> reg -> AArch64 reg freg 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 a
forall reg freg a. a -> reg -> reg -> BM -> AArch64 reg freg 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 a
forall reg freg a. a -> reg -> reg -> Word8 -> AArch64 reg freg 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 a
forall reg freg a. a -> reg -> reg -> Word8 -> AArch64 reg freg 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 a
forall reg freg a. a -> reg -> Word16 -> AArch64 reg freg a
CmpRC a
l areg
r Word16
c
mapFR afreg -> freg
_ (CmpRR a
l areg
r0 areg
r1)       = a -> areg -> areg -> AArch64 areg freg a
forall reg freg a. a -> reg -> reg -> AArch64 reg freg a
CmpRR a
l areg
r0 areg
r1
mapFR afreg -> freg
_ (Neg a
l areg
r0 areg
r1)         = a -> areg -> areg -> AArch64 areg freg a
forall reg freg a. a -> reg -> reg -> AArch64 reg freg 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 a
forall reg freg a. a -> freg -> freg -> freg -> AArch64 reg freg 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 a
forall reg freg a. a -> freg -> freg -> freg -> AArch64 reg freg 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 a
forall reg freg a. a -> freg -> freg -> freg -> AArch64 reg freg 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 a
forall reg freg a. a -> freg -> AArch64 reg freg a
FcmpZ a
l (afreg -> freg
f afreg
xr)
mapFR afreg -> freg
_ (Ret a
l)               = a -> AArch64 areg freg a
forall reg freg a. a -> AArch64 reg freg a
Ret a
l
mapFR afreg -> freg
_ (RetL a
x Label
l)            = a -> Label -> AArch64 areg freg a
forall reg freg a. a -> Label -> AArch64 reg freg 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 a
forall reg freg a. a -> freg -> freg -> freg -> AArch64 reg freg 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 a
forall reg freg a. a -> reg -> reg -> reg -> AArch64 reg freg 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 a
forall reg freg a.
a -> reg -> reg -> reg -> reg -> AArch64 reg freg 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 a
forall reg freg a.
a -> reg -> reg -> reg -> reg -> AArch64 reg freg 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 a
forall reg freg a. a -> reg -> reg -> reg -> AArch64 reg freg 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 a
forall reg freg a. a -> freg -> Addr reg -> AArch64 reg freg 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 a
forall reg freg a. a -> freg -> reg -> AArch64 reg freg 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 a
forall reg freg a. a -> reg -> freg -> AArch64 reg freg 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 a
forall reg freg a. a -> reg -> freg -> AArch64 reg freg 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 a
forall reg freg a. a -> reg -> Word16 -> Int -> AArch64 reg freg 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 a
forall reg freg a. a -> reg -> Word16 -> Int -> AArch64 reg freg 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 a
forall reg freg a. a -> freg -> reg -> AArch64 reg freg 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 a
forall reg freg a. a -> freg -> freg -> AArch64 reg freg 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 a
forall reg freg a.
a -> reg -> reg -> Addr reg -> AArch64 reg freg 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 a
forall reg freg a.
a -> reg -> reg -> Addr reg -> AArch64 reg freg 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 a
forall reg freg a.
a -> freg -> freg -> Addr reg -> AArch64 reg freg 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 a
forall reg freg a.
a -> freg -> freg -> Addr reg -> AArch64 reg freg 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 a
forall reg freg a.
a -> freg -> freg -> freg -> freg -> AArch64 reg freg 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 a
forall reg freg a.
a -> freg -> freg -> freg -> freg -> AArch64 reg freg 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 a
forall reg freg a. a -> freg -> freg -> AArch64 reg freg 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 a
forall reg freg a. a -> freg -> freg -> AArch64 reg freg 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 a
forall reg freg a. a -> freg -> freg -> AArch64 reg freg 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 a
forall reg freg a. a -> reg -> AArch64 reg freg a
MrsR a
l areg
r
mapFR afreg -> freg
_ (Blr a
l areg
r)             = a -> areg -> AArch64 areg freg a
forall reg freg a. a -> reg -> AArch64 reg freg a
Blr a
l areg
r
mapFR afreg -> freg
_ (MovRCf a
l areg
r CFunc
cf)       = a -> areg -> CFunc -> AArch64 areg freg a
forall reg freg a. a -> reg -> CFunc -> AArch64 reg freg a
MovRCf a
l areg
r CFunc
cf
mapFR afreg -> freg
_ (LdrRL a
x areg
r Int
l)         = a -> areg -> Int -> AArch64 areg freg a
forall reg freg a. a -> reg -> Int -> AArch64 reg freg 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 a
forall reg freg a. a -> freg -> freg -> freg -> AArch64 reg freg 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 a
forall reg freg a. a -> freg -> freg -> freg -> AArch64 reg freg 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 a
forall reg freg a. a -> freg -> freg -> AArch64 reg freg 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 a
forall reg freg a.
a -> reg -> reg -> reg -> Cond -> AArch64 reg freg 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 a
forall reg freg a. a -> reg -> Word8 -> Label -> AArch64 reg freg 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 a
forall reg freg a. a -> reg -> Word8 -> Label -> AArch64 reg freg 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 a
forall reg freg a. a -> reg -> Label -> AArch64 reg freg a
Cbnz 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 a
forall reg freg a.
a -> freg -> freg -> freg -> Cond -> AArch64 reg freg 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 a
forall reg freg a. a -> reg -> BM -> AArch64 reg freg a
TstI a
l areg
r BM
i
mapFR afreg -> freg
_ (Cset a
l areg
r Cond
c)          = a -> areg -> Cond -> AArch64 areg freg a
forall reg freg a. a -> reg -> Cond -> AArch64 reg freg a
Cset a
l areg
r Cond
c

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 []         = []

pus, pos :: [AReg] -> [AArch64 AReg freg ()]
pus :: forall freg. [AReg] -> [AArch64 AReg freg ()]
pus = ((AReg, Maybe AReg) -> [AArch64 AReg freg ()])
-> [(AReg, Maybe AReg)] -> [AArch64 AReg freg ()]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap (AReg, Maybe AReg) -> [AArch64 AReg freg ()]
forall {freg}. (AReg, Maybe AReg) -> [AArch64 AReg freg ()]
go([(AReg, Maybe AReg)] -> [AArch64 AReg freg ()])
-> ([AReg] -> [(AReg, Maybe AReg)])
-> [AReg]
-> [AArch64 AReg freg ()]
forall b c a. (b -> c) -> (a -> b) -> a -> c
.[AReg] -> [(AReg, Maybe AReg)]
forall a. [a] -> [(a, Maybe a)]
s2 where go :: (AReg, Maybe AReg) -> [AArch64 AReg freg ()]
go (AReg
r0, Just AReg
r1) = [() -> AReg -> AReg -> Word16 -> AArch64 AReg freg ()
forall reg freg a. a -> reg -> reg -> Word16 -> AArch64 reg freg a
SubRC () AReg
SP AReg
SP Word16
16, () -> AReg -> AReg -> Addr AReg -> AArch64 AReg freg ()
forall reg freg a.
a -> reg -> reg -> Addr reg -> AArch64 reg freg a
Stp () AReg
r0 AReg
r1 (AReg -> Addr AReg
forall reg. reg -> Addr reg
R AReg
SP)]; go (AReg
r, Maybe AReg
Nothing) = [() -> AReg -> AReg -> Word16 -> AArch64 AReg freg ()
forall reg freg a. a -> reg -> reg -> Word16 -> AArch64 reg freg a
SubRC () AReg
SP AReg
SP Word16
16, () -> AReg -> Addr AReg -> AArch64 AReg freg ()
forall reg freg a. a -> reg -> Addr reg -> AArch64 reg freg a
Str () AReg
r (AReg -> Addr AReg
forall reg. reg -> Addr reg
R AReg
SP)]
pos :: forall freg. [AReg] -> [AArch64 AReg freg ()]
pos = ((AReg, Maybe AReg) -> [AArch64 AReg freg ()])
-> [(AReg, Maybe AReg)] -> [AArch64 AReg freg ()]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap (AReg, Maybe AReg) -> [AArch64 AReg freg ()]
forall {freg}. (AReg, Maybe AReg) -> [AArch64 AReg freg ()]
go([(AReg, Maybe AReg)] -> [AArch64 AReg freg ()])
-> ([AReg] -> [(AReg, Maybe AReg)])
-> [AReg]
-> [AArch64 AReg freg ()]
forall b c a. (b -> c) -> (a -> b) -> a -> c
.[(AReg, Maybe AReg)] -> [(AReg, Maybe AReg)]
forall a. [a] -> [a]
reverse([(AReg, Maybe AReg)] -> [(AReg, Maybe AReg)])
-> ([AReg] -> [(AReg, Maybe AReg)])
-> [AReg]
-> [(AReg, Maybe AReg)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
.[AReg] -> [(AReg, Maybe AReg)]
forall a. [a] -> [(a, Maybe a)]
s2 where go :: (AReg, Maybe AReg) -> [AArch64 AReg freg ()]
go (AReg
r0, Just AReg
r1) = [() -> AReg -> AReg -> Addr AReg -> AArch64 AReg freg ()
forall reg freg a.
a -> reg -> reg -> Addr reg -> AArch64 reg freg a
Ldp () AReg
r0 AReg
r1 (AReg -> Addr AReg
forall reg. reg -> Addr reg
R AReg
SP), () -> AReg -> AReg -> Word16 -> AArch64 AReg freg ()
forall reg freg a. a -> reg -> reg -> Word16 -> AArch64 reg freg a
AddRC () AReg
SP AReg
SP Word16
16]; go (AReg
r, Maybe AReg
Nothing) = [() -> AReg -> Addr AReg -> AArch64 AReg freg ()
forall reg freg a. a -> reg -> Addr reg -> AArch64 reg freg a
Ldr () AReg
r (AReg -> Addr AReg
forall reg. reg -> Addr reg
R AReg
SP), () -> AReg -> AReg -> Word16 -> AArch64 AReg freg ()
forall reg freg a. a -> reg -> reg -> Word16 -> AArch64 reg freg a
AddRC () AReg
SP AReg
SP Word16
16]

puds, pods :: [freg] -> [AArch64 AReg freg ()]
puds :: forall freg. [freg] -> [AArch64 AReg freg ()]
puds = ((freg, Maybe freg) -> [AArch64 AReg freg ()])
-> [(freg, Maybe freg)] -> [AArch64 AReg freg ()]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap (freg, Maybe freg) -> [AArch64 AReg freg ()]
forall {freg}. (freg, Maybe freg) -> [AArch64 AReg freg ()]
go([(freg, Maybe freg)] -> [AArch64 AReg freg ()])
-> ([freg] -> [(freg, Maybe freg)])
-> [freg]
-> [AArch64 AReg freg ()]
forall b c a. (b -> c) -> (a -> b) -> a -> c
.[freg] -> [(freg, Maybe freg)]
forall a. [a] -> [(a, Maybe a)]
s2 where go :: (freg, Maybe freg) -> [AArch64 AReg freg ()]
go (freg
r0, Just freg
r1) = [() -> AReg -> AReg -> Word16 -> AArch64 AReg freg ()
forall reg freg a. a -> reg -> reg -> Word16 -> AArch64 reg freg a
SubRC () AReg
SP AReg
SP Word16
16, () -> freg -> freg -> Addr AReg -> AArch64 AReg freg ()
forall reg freg a.
a -> freg -> freg -> Addr reg -> AArch64 reg freg a
StpD () freg
r0 freg
r1 (AReg -> Addr AReg
forall reg. reg -> Addr reg
R AReg
SP)]; go (freg
r, Maybe freg
Nothing) = [() -> AReg -> AReg -> Word16 -> AArch64 AReg freg ()
forall reg freg a. a -> reg -> reg -> Word16 -> AArch64 reg freg a
SubRC () AReg
SP AReg
SP Word16
16, () -> freg -> Addr AReg -> AArch64 AReg freg ()
forall reg freg a. a -> freg -> Addr reg -> AArch64 reg freg a
StrD () freg
r (AReg -> Addr AReg
forall reg. reg -> Addr reg
R AReg
SP)]
pods :: forall freg. [freg] -> [AArch64 AReg freg ()]
pods = ((freg, Maybe freg) -> [AArch64 AReg freg ()])
-> [(freg, Maybe freg)] -> [AArch64 AReg freg ()]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap (freg, Maybe freg) -> [AArch64 AReg freg ()]
forall {freg}. (freg, Maybe freg) -> [AArch64 AReg freg ()]
go([(freg, Maybe freg)] -> [AArch64 AReg freg ()])
-> ([freg] -> [(freg, Maybe freg)])
-> [freg]
-> [AArch64 AReg freg ()]
forall b c a. (b -> c) -> (a -> b) -> a -> c
.[(freg, Maybe freg)] -> [(freg, Maybe freg)]
forall a. [a] -> [a]
reverse([(freg, Maybe freg)] -> [(freg, Maybe freg)])
-> ([freg] -> [(freg, Maybe freg)])
-> [freg]
-> [(freg, Maybe freg)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
.[freg] -> [(freg, Maybe freg)]
forall a. [a] -> [(a, Maybe a)]
s2 where go :: (freg, Maybe freg) -> [AArch64 AReg freg ()]
go (freg
r0, Just freg
r1) = [() -> freg -> freg -> Addr AReg -> AArch64 AReg freg ()
forall reg freg a.
a -> freg -> freg -> Addr reg -> AArch64 reg freg a
LdpD () freg
r0 freg
r1 (AReg -> Addr AReg
forall reg. reg -> Addr reg
R AReg
SP), () -> AReg -> AReg -> Word16 -> AArch64 AReg freg ()
forall reg freg a. a -> reg -> reg -> Word16 -> AArch64 reg freg a
AddRC () AReg
SP AReg
SP Word16
16]; go (freg
r, Maybe freg
Nothing) = [() -> freg -> Addr AReg -> AArch64 AReg freg ()
forall reg freg a. a -> freg -> Addr reg -> AArch64 reg freg a
LdrD () freg
r (AReg -> Addr AReg
forall reg. reg -> Addr reg
R AReg
SP), () -> AReg -> AReg -> Word16 -> AArch64 AReg freg ()
forall reg freg a. a -> reg -> reg -> Word16 -> AArch64 reg freg a
AddRC () AReg
SP AReg
SP Word16
16]

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) => Pretty (AArch64 reg freg a) where
    pretty :: forall ann. AArch64 reg freg 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 (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 (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) => Show (AArch64 reg freg a) where show :: AArch64 reg freg a -> [Char]
show=Doc Any -> [Char]
forall a. Show a => a -> [Char]
show(Doc Any -> [Char])
-> (AArch64 reg freg a -> Doc Any) -> AArch64 reg freg a -> [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
.AArch64 reg freg a -> Doc Any
forall a ann. Pretty a => a -> Doc ann
forall ann. AArch64 reg freg a -> Doc ann
pretty

prettyLive :: (Pretty reg, Pretty freg, Pretty o) => AArch64 reg freg o -> Doc ann
prettyLive :: forall reg freg o ann.
(Pretty reg, Pretty freg, Pretty o) =>
AArch64 reg freg o -> Doc ann
prettyLive AArch64 reg freg o
r = AArch64 reg freg o -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. AArch64 reg freg o -> Doc ann
pretty AArch64 reg freg 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 o -> o
forall reg freg a. AArch64 reg freg a -> a
ann AArch64 reg freg o
r)

prettyDebug :: (Pretty freg, Pretty reg, Pretty o) => [AArch64 reg freg o] -> Doc ann
prettyDebug :: forall freg reg o ann.
(Pretty freg, Pretty reg, Pretty o) =>
[AArch64 reg freg o] -> Doc ann
prettyDebug = [Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
prettyLines ([Doc ann] -> Doc ann)
-> ([AArch64 reg freg o] -> [Doc ann])
-> [AArch64 reg freg o]
-> Doc ann
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (AArch64 reg freg o -> Doc ann)
-> [AArch64 reg freg 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 o -> Doc ann
forall reg freg o ann.
(Pretty reg, Pretty freg, Pretty o) =>
AArch64 reg freg o -> Doc ann
prettyLive