{-# LANGUAGE BinaryLiterals #-}
{-# LANGUAGE MagicHash #-}
{-# LANGUAGE TupleSections #-}
module Asm.Aarch64.Byte ( allFp, assembleCtx, dbgFp ) where
import Asm.Aarch64
import Asm.M
import Control.Monad (when)
import Data.Bifunctor (bimap, second)
import Data.Bits (Bits (..))
import qualified Data.ByteString as BS
import Data.Functor (($>))
import qualified Data.IntMap as IM
import qualified Data.Map as M
import Data.Tuple.Extra (fst3, thd3)
import Data.Word (Word64, Word8)
import Foreign.Ptr (FunPtr, IntPtr (..), Ptr, nullPtr, ptrToIntPtr)
import GHC.Base (Int (I#), iShiftRL#)
import Hs.FFI
import Sys.DL
hasMa :: [AArch64 reg freg f2reg a] -> Bool
hasMa :: forall reg freg f2reg a. [AArch64 reg freg f2reg a] -> Bool
hasMa = (AArch64 reg freg f2reg a -> Bool)
-> [AArch64 reg freg f2reg a] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any AArch64 reg freg f2reg a -> Bool
forall {reg} {freg} {f2} {a}. AArch64 reg freg f2 a -> Bool
g where g :: AArch64 reg freg f2 a -> Bool
g (MovRCf a
_ reg
_ CFunc
Malloc)=Bool
True; g (MovRCf a
_ reg
_ CFunc
Free)=Bool
True; g (MovRCf a
_ reg
_ CFunc
DR)=Bool
True; g AArch64 reg freg f2 a
_=Bool
False
hasMath :: [AArch64 reg freg f2reg a] -> Bool
hasMath :: forall reg freg f2reg a. [AArch64 reg freg f2reg a] -> Bool
hasMath = (AArch64 reg freg f2reg a -> Bool)
-> [AArch64 reg freg f2reg a] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any AArch64 reg freg f2reg a -> Bool
forall {reg} {freg} {f2} {a}. AArch64 reg freg f2 a -> Bool
g where g :: AArch64 reg freg f2 a -> Bool
g (MovRCf a
_ reg
_ CFunc
Exp)=Bool
True; g (MovRCf a
_ reg
_ CFunc
Log)=Bool
True; g (MovRCf a
_ reg
_ CFunc
Pow)=Bool
True; g AArch64 reg freg f2 a
_=Bool
False
prepAddrs :: [AArch64 reg freg f2reg a] -> IO (Maybe CCtx, Maybe MCtx)
prepAddrs :: forall reg freg f2reg a.
[AArch64 reg freg f2reg a] -> IO (Maybe CCtx, Maybe MCtx)
prepAddrs [AArch64 reg freg f2reg a]
ss = case ([AArch64 reg freg f2reg a] -> Bool
forall reg freg f2reg a. [AArch64 reg freg f2reg a] -> Bool
hasMa [AArch64 reg freg f2reg a]
ss, [AArch64 reg freg f2reg a] -> Bool
forall reg freg f2reg a. [AArch64 reg freg f2reg a] -> Bool
hasMath [AArch64 reg freg f2reg a]
ss) of
(Bool
True, Bool
False) -> do {m <- IO CCtx
mem'; pure (Just m, Nothing)}
(Bool
False, Bool
False) -> (Maybe CCtx, Maybe MCtx) -> IO (Maybe CCtx, Maybe MCtx)
forall a. a -> IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Maybe CCtx
forall a. Maybe a
Nothing, Maybe MCtx
forall a. Maybe a
Nothing)
(Bool
False, Bool
True) -> do {m <- IO MCtx
math'; pure (Nothing, Just m)}
(Bool
True, Bool
True) -> do {c <- IO CCtx
mem'; m <- math'; pure (Just c, Just m)}
assembleCtx :: (CCtx, MCtx) -> (IM.IntMap [Word64], [AArch64 AReg FAReg F2Reg ()]) -> IO (BS.ByteString, FunPtr b, Maybe (Ptr Word64))
assembleCtx :: forall b.
(CCtx, MCtx)
-> (IntMap [Word64], [AArch64 AReg FAReg F2Reg ()])
-> IO (ByteString, FunPtr b, Maybe (Ptr Word64))
assembleCtx (CCtx, MCtx)
ctx (IntMap [Word64]
ds, [AArch64 AReg FAReg F2Reg ()]
isns) = do
let (Int
sz, Map Label Int
lbls) = Int -> [AArch64 AReg FAReg F2Reg ()] -> (Int, Map Label Int)
forall a.
Int -> [AArch64 AReg FAReg F2Reg a] -> (Int, Map Label Int)
mkIx Int
0 [AArch64 AReg FAReg F2Reg ()]
isns
p <- if [AArch64 AReg FAReg F2Reg ()] -> Bool
forall reg freg f2reg a. [AArch64 reg freg f2reg a] -> Bool
hasMa [AArch64 AReg FAReg F2Reg ()]
isns then Int -> CSize -> IO (Ptr CChar)
forall a. Int -> CSize -> IO (Ptr a)
allocNear (CCtx -> Int
forall a b c d. (a, b, c, d) -> a
fst4 ((CCtx, MCtx) -> CCtx
forall a b. (a, b) -> a
fst (CCtx, MCtx)
ctx)) (Int -> CSize
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
sz) else CSize -> IO (Ptr CChar)
forall a. CSize -> IO (Ptr a)
allocExec (Int -> CSize
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
sz)
when (p==nullPtr) $ error "failed to allocate memory for JIT"
ps <- aArr ds
let b = [Word8] -> ByteString
BS.pack([Word8] -> ByteString)
-> ([[Word8]] -> [Word8]) -> [[Word8]] -> ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
.([Word8] -> [Word8]) -> [[Word8]] -> [Word8]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap [Word8] -> [Word8]
forall a. [a] -> [a]
reverse([[Word8]] -> ByteString) -> [[Word8]] -> ByteString
forall a b. (a -> b) -> a -> b
$Int
-> (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
-> [AArch64 AReg FAReg F2Reg ()]
-> [[Word8]]
asm Int
0 (IntMap (Ptr Word64)
ps, (CCtx -> Maybe CCtx)
-> (MCtx -> Maybe MCtx) -> (CCtx, MCtx) -> (Maybe CCtx, Maybe MCtx)
forall a b c d. (a -> b) -> (c -> d) -> (a, c) -> (b, d)
forall (p :: * -> * -> *) a b c d.
Bifunctor p =>
(a -> b) -> (c -> d) -> p a c -> p b d
bimap CCtx -> Maybe CCtx
forall a. a -> Maybe a
Just MCtx -> Maybe MCtx
forall a. a -> Maybe a
Just (CCtx, MCtx)
ctx, Map Label Int
lbls) [AArch64 AReg FAReg F2Reg ()]
isns
(b,,snd<$>IM.lookupMin ps)<$>finish b p
dbgFp :: (IntMap [Word64], [AArch64 AReg FAReg F2Reg ()]) -> IO [ByteString]
dbgFp (IntMap [Word64], [AArch64 AReg FAReg F2Reg ()])
asmϵ = do
(bss,_,ps) <- (IntMap [Word64], [AArch64 AReg FAReg F2Reg ()])
-> IO ([ByteString], FunPtr Any, Maybe (Ptr Word64))
forall b.
(IntMap [Word64], [AArch64 AReg FAReg F2Reg ()])
-> IO ([ByteString], FunPtr b, Maybe (Ptr Word64))
allFp (IntMap [Word64], [AArch64 AReg FAReg F2Reg ()])
asmϵ
mFree ps $> bss
allFp :: (IM.IntMap [Word64], [AArch64 AReg FAReg F2Reg ()]) -> IO ([BS.ByteString], FunPtr b, Maybe (Ptr Word64))
allFp :: forall b.
(IntMap [Word64], [AArch64 AReg FAReg F2Reg ()])
-> IO ([ByteString], FunPtr b, Maybe (Ptr Word64))
allFp (IntMap [Word64]
ds, [AArch64 AReg FAReg F2Reg ()]
instrs) = do
let (Int
sz, Map Label Int
lbls) = Int -> [AArch64 AReg FAReg F2Reg ()] -> (Int, Map Label Int)
forall a.
Int -> [AArch64 AReg FAReg F2Reg a] -> (Int, Map Label Int)
mkIx Int
0 [AArch64 AReg FAReg F2Reg ()]
instrs
(fn, p) <- do
res <- [AArch64 AReg FAReg F2Reg ()] -> IO (Maybe CCtx, Maybe MCtx)
forall reg freg f2reg a.
[AArch64 reg freg f2reg a] -> IO (Maybe CCtx, Maybe MCtx)
prepAddrs [AArch64 AReg FAReg F2Reg ()]
instrs
case res of
(Just (Int
m, Int
_, Int
_, Int
_),Maybe MCtx
_) -> ((Maybe CCtx, Maybe MCtx)
res,) (Ptr CChar -> ((Maybe CCtx, Maybe MCtx), Ptr CChar))
-> IO (Ptr CChar) -> IO ((Maybe CCtx, Maybe MCtx), Ptr CChar)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Int -> CSize -> IO (Ptr CChar)
forall a. Int -> CSize -> IO (Ptr a)
allocNear Int
m (Int -> CSize
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
sz)
(Maybe CCtx, Maybe MCtx)
_ -> ((Maybe CCtx, Maybe MCtx)
res,) (Ptr CChar -> ((Maybe CCtx, Maybe MCtx), Ptr CChar))
-> IO (Ptr CChar) -> IO ((Maybe CCtx, Maybe MCtx), Ptr CChar)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> CSize -> IO (Ptr CChar)
forall a. CSize -> IO (Ptr a)
allocExec (Int -> CSize
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
sz)
ps <- aArr ds
let is = Int
-> (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
-> [AArch64 AReg FAReg F2Reg ()]
-> [[Word8]]
asm Int
0 (IntMap (Ptr Word64)
ps, (Maybe CCtx, Maybe MCtx)
fn, Map Label Int
lbls) [AArch64 AReg FAReg F2Reg ()]
instrs; b = [Word8] -> ByteString
BS.pack([Word8] -> ByteString)
-> ([[Word8]] -> [Word8]) -> [[Word8]] -> ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
.([Word8] -> [Word8]) -> [[Word8]] -> [Word8]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap [Word8] -> [Word8]
forall a. [a] -> [a]
reverse([[Word8]] -> ByteString) -> [[Word8]] -> ByteString
forall a b. (a -> b) -> a -> b
$[[Word8]]
is; bsϵ = [Word8] -> ByteString
BS.pack([Word8] -> ByteString)
-> ([Word8] -> [Word8]) -> [Word8] -> ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
.[Word8] -> [Word8]
forall a. [a] -> [a]
reverse([Word8] -> ByteString) -> [[Word8]] -> [ByteString]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>[[Word8]]
is
(bsϵ,,snd<$>IM.lookupMin ps)<$>finish b p
mkIx :: Int -> [AArch64 AReg FAReg F2Reg a] -> (Int, M.Map Label Int)
mkIx :: forall a.
Int -> [AArch64 AReg FAReg F2Reg a] -> (Int, Map Label Int)
mkIx Int
ix (Label a
_ Label
l:[AArch64 AReg FAReg F2Reg a]
asms) = (Map Label Int -> Map Label Int)
-> (Int, Map Label Int) -> (Int, Map Label Int)
forall b c a. (b -> c) -> (a, b) -> (a, c)
forall (p :: * -> * -> *) b c a.
Bifunctor p =>
(b -> c) -> p a b -> p a c
second (Label -> Int -> Map Label Int -> Map Label Int
forall k a. Ord k => k -> a -> Map k a -> Map k a
M.insert Label
l Int
ix) ((Int, Map Label Int) -> (Int, Map Label Int))
-> (Int, Map Label Int) -> (Int, Map Label Int)
forall a b. (a -> b) -> a -> b
$ Int -> [AArch64 AReg FAReg F2Reg a] -> (Int, Map Label Int)
forall a.
Int -> [AArch64 AReg FAReg F2Reg a] -> (Int, Map Label Int)
mkIx Int
ix [AArch64 AReg FAReg F2Reg a]
asms
mkIx Int
ix (C{}:[AArch64 AReg FAReg F2Reg a]
asms) = Int -> [AArch64 AReg FAReg F2Reg a] -> (Int, Map Label Int)
forall a.
Int -> [AArch64 AReg FAReg F2Reg a] -> (Int, Map Label Int)
mkIx (Int
ixInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
20) [AArch64 AReg FAReg F2Reg a]
asms
mkIx Int
ix (MovRCf{}:[AArch64 AReg FAReg F2Reg a]
asms) = Int -> [AArch64 AReg FAReg F2Reg a] -> (Int, Map Label Int)
forall a.
Int -> [AArch64 AReg FAReg F2Reg a] -> (Int, Map Label Int)
mkIx (Int
ixInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
16) [AArch64 AReg FAReg F2Reg a]
asms
mkIx Int
ix (LdrRL{}:[AArch64 AReg FAReg F2Reg a]
asms) = Int -> [AArch64 AReg FAReg F2Reg a] -> (Int, Map Label Int)
forall a.
Int -> [AArch64 AReg FAReg F2Reg a] -> (Int, Map Label Int)
mkIx (Int
ixInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
16) [AArch64 AReg FAReg F2Reg a]
asms
mkIx Int
ix (AArch64 AReg FAReg F2Reg a
_:[AArch64 AReg FAReg F2Reg a]
asms) = Int -> [AArch64 AReg FAReg F2Reg a] -> (Int, Map Label Int)
forall a.
Int -> [AArch64 AReg FAReg F2Reg a] -> (Int, Map Label Int)
mkIx (Int
ixInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
4) [AArch64 AReg FAReg F2Reg a]
asms
mkIx Int
ix [] = (Int
ix, Map Label Int
forall k a. Map k a
M.empty)
be :: Enum a => a -> Word8
be :: forall a. Enum a => a -> Word8
be = Int -> Word8
forall a b. (Integral a, Num b) => a -> b
fromIntegral(Int -> Word8) -> (a -> Int) -> a -> Word8
forall b c a. (b -> c) -> (a -> b) -> a -> c
.a -> Int
forall a. Enum a => a -> Int
fromEnum
bp :: Cond -> Word8
bp :: Cond -> Word8
bp Cond
Eq=Word8
0b0000; bp Cond
Neq=Word8
0b0001; bp Cond
Gt=Word8
0b1100; bp Cond
Leq=Word8
0b1101; bp Cond
Geq=Word8
0b1010; bp Cond
Lt=Word8
0b1011
ip :: Cond -> Word8
ip :: Cond -> Word8
ip = Cond -> Word8
bp(Cond -> Word8) -> (Cond -> Cond) -> Cond -> Word8
forall b c a. (b -> c) -> (a -> b) -> a -> c
.Cond -> Cond
inv where inv :: Cond -> Cond
inv Cond
Eq=Cond
Neq; inv Cond
Neq=Cond
Eq; inv Cond
Gt=Cond
Leq; inv Cond
Geq=Cond
Lt; inv Cond
Lt=Cond
Geq; inv Cond
Leq=Cond
Gt
bs :: Shift -> Word8
bs :: Shift -> Word8
bs Shift
Zero=Word8
0b0; bs Shift
Three=Word8
0b1
lsr :: Int -> Int -> Int
lsr :: Int -> Int -> Int
lsr (I# Int#
n) (I# Int#
k) = Int# -> Int
I# (Int# -> Int# -> Int#
iShiftRL# Int#
n Int#
k)
lb :: a -> a -> Word8
lb a
r a
rD = (Word8
0x7 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.&. a -> Word8
forall a. Enum a => a -> Word8
be a
r) Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
5 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. a -> Word8
forall a. Enum a => a -> Word8
be a
rD
asm :: Int -> (IM.IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), M.Map Label Int) -> [AArch64 AReg FAReg F2Reg ()] -> [[Word8]]
asm :: Int
-> (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
-> [AArch64 AReg FAReg F2Reg ()]
-> [[Word8]]
asm Int
_ (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
_ [] = []
asm Int
ix (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st (MovZ ()
_ AReg
r Word16
i Int
s:[AArch64 AReg FAReg F2Reg ()]
asms) = [Word8
0b11010010, Word8
0b1 Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
7 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Int -> Word8
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int
s Int -> Int -> Int
forall a. Integral a => a -> a -> a
`quot` Int
16) Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
5 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word16 -> Word8
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Word16
i Word16 -> Int -> Word16
forall a. Bits a => a -> Int -> a
`shiftR` Int
11), Word16 -> Word8
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Word16
0xff Word16 -> Word16 -> Word16
forall a. Bits a => a -> a -> a
.&. (Word16
i Word16 -> Int -> Word16
forall a. Bits a => a -> Int -> a
`shiftR` Int
3)), Word16 -> Word8
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Word16
0x7 Word16 -> Word16 -> Word16
forall a. Bits a => a -> a -> a
.&. Word16
i) Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
5 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. AReg -> Word8
forall a. Enum a => a -> Word8
be AReg
r][Word8] -> [[Word8]] -> [[Word8]]
forall a. a -> [a] -> [a]
:Int
-> (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
-> [AArch64 AReg FAReg F2Reg ()]
-> [[Word8]]
asm (Int
ixInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
4) (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st [AArch64 AReg FAReg F2Reg ()]
asms
asm Int
ix (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st (MovRC ()
_ AReg
r Word16
i:[AArch64 AReg FAReg F2Reg ()]
asms) = Int
-> (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
-> [AArch64 AReg FAReg F2Reg ()]
-> [[Word8]]
asm Int
ix (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st (() -> AReg -> Word16 -> Int -> AArch64 AReg FAReg F2Reg ()
forall reg freg f2 a.
a -> reg -> Word16 -> Int -> AArch64 reg freg f2 a
MovZ () AReg
r Word16
i Int
0AArch64 AReg FAReg F2Reg ()
-> [AArch64 AReg FAReg F2Reg ()] -> [AArch64 AReg FAReg F2Reg ()]
forall a. a -> [a] -> [a]
:[AArch64 AReg FAReg F2Reg ()]
asms)
asm Int
ix (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st (MovK ()
_ AReg
r Word16
i Int
s:[AArch64 AReg FAReg F2Reg ()]
asms) = [Word8
0b11110010, Word8
0b1 Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
7 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Int -> Word8
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int
s Int -> Int -> Int
forall a. Integral a => a -> a -> a
`quot` Int
16) Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
5 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word16 -> Word8
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Word16
i Word16 -> Int -> Word16
forall a. Bits a => a -> Int -> a
`shiftR` Int
11), Word16 -> Word8
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Word16
i Word16 -> Int -> Word16
forall a. Bits a => a -> Int -> a
`shiftR` Int
3), (Word16 -> Word8
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Word16
0x7 Word16 -> Word16 -> Word16
forall a. Bits a => a -> a -> a
.&. Word16
i) Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
5) Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. AReg -> Word8
forall a. Enum a => a -> Word8
be AReg
r][Word8] -> [[Word8]] -> [[Word8]]
forall a. a -> [a] -> [a]
:Int
-> (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
-> [AArch64 AReg FAReg F2Reg ()]
-> [[Word8]]
asm (Int
ixInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
4) (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st [AArch64 AReg FAReg F2Reg ()]
asms
asm Int
ix (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st (FMovDR ()
_ FAReg
d AReg
r:[AArch64 AReg FAReg F2Reg ()]
asms) = [Word8
0b10011110, Word8
0b01100111, AReg -> Word8
forall a. Enum a => a -> Word8
be AReg
r Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftR` Int
3, AReg -> FAReg -> Word8
forall {a} {a}. (Enum a, Enum a) => a -> a -> Word8
lb AReg
r FAReg
d][Word8] -> [[Word8]] -> [[Word8]]
forall a. a -> [a] -> [a]
:Int
-> (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
-> [AArch64 AReg FAReg F2Reg ()]
-> [[Word8]]
asm (Int
ixInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
4) (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st [AArch64 AReg FAReg F2Reg ()]
asms
asm Int
ix (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st (FMovXX ()
_ FAReg
d0 FAReg
d1:[AArch64 AReg FAReg F2Reg ()]
asms) = [Word8
0b00011110, Word8
0x1 Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
6 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
0b100000, Word8
0b10000 Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
2 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. FAReg -> Word8
forall a. Enum a => a -> Word8
be FAReg
d1 Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftR` Int
3, FAReg -> FAReg -> Word8
forall {a} {a}. (Enum a, Enum a) => a -> a -> Word8
lb FAReg
d1 FAReg
d0][Word8] -> [[Word8]] -> [[Word8]]
forall a. a -> [a] -> [a]
:Int
-> (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
-> [AArch64 AReg FAReg F2Reg ()]
-> [[Word8]]
asm (Int
ixInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
4) (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st [AArch64 AReg FAReg F2Reg ()]
asms
asm Int
ix (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st (Fadd ()
_ FAReg
d0 FAReg
d1 FAReg
d2:[AArch64 AReg FAReg F2Reg ()]
asms) = [Word8
0b00011110, Word8
0x3 Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
5 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. FAReg -> Word8
forall a. Enum a => a -> Word8
be FAReg
d2, Word8
0b001010 Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
2 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. (FAReg -> Word8
forall a. Enum a => a -> Word8
be FAReg
d1 Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftR` Int
3), FAReg -> FAReg -> Word8
forall {a} {a}. (Enum a, Enum a) => a -> a -> Word8
lb FAReg
d1 FAReg
d0][Word8] -> [[Word8]] -> [[Word8]]
forall a. a -> [a] -> [a]
:Int
-> (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
-> [AArch64 AReg FAReg F2Reg ()]
-> [[Word8]]
asm (Int
ixInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
4) (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st [AArch64 AReg FAReg F2Reg ()]
asms
asm Int
ix (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st (Fmul ()
_ FAReg
d0 FAReg
d1 FAReg
d2:[AArch64 AReg FAReg F2Reg ()]
asms) = [Word8
0b00011110, Word8
0x3 Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
5 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. FAReg -> Word8
forall a. Enum a => a -> Word8
be FAReg
d2, Word8
0x2 Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
2 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. (FAReg -> Word8
forall a. Enum a => a -> Word8
be FAReg
d1 Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftR` Int
3), FAReg -> FAReg -> Word8
forall {a} {a}. (Enum a, Enum a) => a -> a -> Word8
lb FAReg
d1 FAReg
d0][Word8] -> [[Word8]] -> [[Word8]]
forall a. a -> [a] -> [a]
:Int
-> (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
-> [AArch64 AReg FAReg F2Reg ()]
-> [[Word8]]
asm (Int
ixInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
4) (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st [AArch64 AReg FAReg F2Reg ()]
asms
asm Int
ix (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st (Fsub ()
_ FAReg
d0 FAReg
d1 FAReg
d2:[AArch64 AReg FAReg F2Reg ()]
asms) = [Word8
0b00011110, Word8
0x3 Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
5 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. FAReg -> Word8
forall a. Enum a => a -> Word8
be FAReg
d2, Word8
0b1110 Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
2 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. (FAReg -> Word8
forall a. Enum a => a -> Word8
be FAReg
d1 Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftR` Int
3), FAReg -> FAReg -> Word8
forall {a} {a}. (Enum a, Enum a) => a -> a -> Word8
lb FAReg
d1 FAReg
d0][Word8] -> [[Word8]] -> [[Word8]]
forall a. a -> [a] -> [a]
:Int
-> (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
-> [AArch64 AReg FAReg F2Reg ()]
-> [[Word8]]
asm (Int
ixInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
4) (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st [AArch64 AReg FAReg F2Reg ()]
asms
asm Int
ix (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st (Fdiv ()
_ FAReg
d0 FAReg
d1 FAReg
d2:[AArch64 AReg FAReg F2Reg ()]
asms) = [Word8
0b00011110, Word8
0x3 Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
5 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. FAReg -> Word8
forall a. Enum a => a -> Word8
be FAReg
d2, Word8
0b110 Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
2 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. (FAReg -> Word8
forall a. Enum a => a -> Word8
be FAReg
d1 Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftR` Int
3), FAReg -> FAReg -> Word8
forall {a} {a}. (Enum a, Enum a) => a -> a -> Word8
lb FAReg
d1 FAReg
d0][Word8] -> [[Word8]] -> [[Word8]]
forall a. a -> [a] -> [a]
:Int
-> (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
-> [AArch64 AReg FAReg F2Reg ()]
-> [[Word8]]
asm (Int
ixInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
4) (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st [AArch64 AReg FAReg F2Reg ()]
asms
asm Int
ix (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st (Fmax ()
_ FAReg
d0 FAReg
d1 FAReg
d2:[AArch64 AReg FAReg F2Reg ()]
asms) = [Word8
0b00011110, Word8
0x3 Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
5 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. FAReg -> Word8
forall a. Enum a => a -> Word8
be FAReg
d2, Word8
0b10010 Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
2 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. FAReg -> Word8
forall a. Enum a => a -> Word8
be FAReg
d1 Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftR` Int
3, FAReg -> FAReg -> Word8
forall {a} {a}. (Enum a, Enum a) => a -> a -> Word8
lb FAReg
d1 FAReg
d0][Word8] -> [[Word8]] -> [[Word8]]
forall a. a -> [a] -> [a]
:Int
-> (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
-> [AArch64 AReg FAReg F2Reg ()]
-> [[Word8]]
asm (Int
ixInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
4) (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st [AArch64 AReg FAReg F2Reg ()]
asms
asm Int
ix (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st (Fmin ()
_ FAReg
d0 FAReg
d1 FAReg
d2:[AArch64 AReg FAReg F2Reg ()]
asms) = [Word8
0b00011110, Word8
0x3 Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
5 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. FAReg -> Word8
forall a. Enum a => a -> Word8
be FAReg
d2, Word8
0b10110 Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
2 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. FAReg -> Word8
forall a. Enum a => a -> Word8
be FAReg
d1 Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftR` Int
3, FAReg -> FAReg -> Word8
forall {a} {a}. (Enum a, Enum a) => a -> a -> Word8
lb FAReg
d1 FAReg
d0][Word8] -> [[Word8]] -> [[Word8]]
forall a. a -> [a] -> [a]
:Int
-> (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
-> [AArch64 AReg FAReg F2Reg ()]
-> [[Word8]]
asm (Int
ixInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
4) (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st [AArch64 AReg FAReg F2Reg ()]
asms
asm Int
ix (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st (Fabs ()
_ FAReg
d0 FAReg
d1:[AArch64 AReg FAReg F2Reg ()]
asms) = [Word8
0b00011110, Word8
0x60, Word8
0x3 Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
6 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. FAReg -> Word8
forall a. Enum a => a -> Word8
be FAReg
d1 Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftR` Int
3, FAReg -> FAReg -> Word8
forall {a} {a}. (Enum a, Enum a) => a -> a -> Word8
lb FAReg
d1 FAReg
d0][Word8] -> [[Word8]] -> [[Word8]]
forall a. a -> [a] -> [a]
:Int
-> (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
-> [AArch64 AReg FAReg F2Reg ()]
-> [[Word8]]
asm (Int
ixInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
4) (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st [AArch64 AReg FAReg F2Reg ()]
asms
asm Int
ix (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st (Fmadd ()
_ FAReg
d0 FAReg
d1 FAReg
d2 FAReg
d3:[AArch64 AReg FAReg F2Reg ()]
asms) = [Word8
0b00011111, Word8
0x2 Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
5 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. FAReg -> Word8
forall a. Enum a => a -> Word8
be FAReg
d2, FAReg -> Word8
forall a. Enum a => a -> Word8
be FAReg
d3 Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
2 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. FAReg -> Word8
forall a. Enum a => a -> Word8
be FAReg
d1 Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftR` Int
3, FAReg -> FAReg -> Word8
forall {a} {a}. (Enum a, Enum a) => a -> a -> Word8
lb FAReg
d1 FAReg
d0][Word8] -> [[Word8]] -> [[Word8]]
forall a. a -> [a] -> [a]
:Int
-> (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
-> [AArch64 AReg FAReg F2Reg ()]
-> [[Word8]]
asm (Int
ixInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
4) (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st [AArch64 AReg FAReg F2Reg ()]
asms
asm Int
ix (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st (Fmsub ()
_ FAReg
d0 FAReg
d1 FAReg
d2 FAReg
d3:[AArch64 AReg FAReg F2Reg ()]
asms) = [Word8
0b00011111, Word8
0x2 Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
5 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. FAReg -> Word8
forall a. Enum a => a -> Word8
be FAReg
d2, Word8
0x1 Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
7 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. FAReg -> Word8
forall a. Enum a => a -> Word8
be FAReg
d3 Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
2 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. FAReg -> Word8
forall a. Enum a => a -> Word8
be FAReg
d1 Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftR` Int
3, FAReg -> FAReg -> Word8
forall {a} {a}. (Enum a, Enum a) => a -> a -> Word8
lb FAReg
d1 FAReg
d0][Word8] -> [[Word8]] -> [[Word8]]
forall a. a -> [a] -> [a]
:Int
-> (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
-> [AArch64 AReg FAReg F2Reg ()]
-> [[Word8]]
asm (Int
ixInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
4) (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st [AArch64 AReg FAReg F2Reg ()]
asms
asm Int
ix (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st (Label{}:[AArch64 AReg FAReg F2Reg ()]
asms) = Int
-> (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
-> [AArch64 AReg FAReg F2Reg ()]
-> [[Word8]]
asm Int
ix (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st [AArch64 AReg FAReg F2Reg ()]
asms
asm Int
ix (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st (Ret{}:[AArch64 AReg FAReg F2Reg ()]
asms) = [Word8
0b11010110, Word8
0b01011111, AReg -> Word8
forall a. Enum a => a -> Word8
be AReg
X30 Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftR` Int
3, (Word8
0x7 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.&. AReg -> Word8
forall a. Enum a => a -> Word8
be AReg
X30) Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
5][Word8] -> [[Word8]] -> [[Word8]]
forall a. a -> [a] -> [a]
:Int
-> (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
-> [AArch64 AReg FAReg F2Reg ()]
-> [[Word8]]
asm (Int
ixInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
4) (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st [AArch64 AReg FAReg F2Reg ()]
asms
asm Int
ix (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st (RetL{}:[AArch64 AReg FAReg F2Reg ()]
asms) = [Word8
0b11010110, Word8
0b01011111, AReg -> Word8
forall a. Enum a => a -> Word8
be AReg
X30 Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftR` Int
3, (Word8
0x7 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.&. AReg -> Word8
forall a. Enum a => a -> Word8
be AReg
X30) Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
5][Word8] -> [[Word8]] -> [[Word8]]
forall a. a -> [a] -> [a]
:Int
-> (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
-> [AArch64 AReg FAReg F2Reg ()]
-> [[Word8]]
asm (Int
ixInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
4) (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st [AArch64 AReg FAReg F2Reg ()]
asms
asm Int
ix (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st (MrsR ()
_ AReg
r:[AArch64 AReg FAReg F2Reg ()]
asms) = [Word8
0b11010101, Word8
0b00111011, Word8
0b00100100, AReg -> Word8
forall a. Enum a => a -> Word8
be AReg
r][Word8] -> [[Word8]] -> [[Word8]]
forall a. a -> [a] -> [a]
:Int
-> (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
-> [AArch64 AReg FAReg F2Reg ()]
-> [[Word8]]
asm (Int
ixInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
4) (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st [AArch64 AReg FAReg F2Reg ()]
asms
asm Int
_ (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
_ (SubRR ()
_ AReg
_ AReg
SP AReg
SP:[AArch64 AReg FAReg F2Reg ()]
_) = [Char] -> [[Word8]]
forall a. HasCallStack => [Char] -> a
error [Char]
"encoding not valid/supported"
asm Int
_ (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
_ (AddRR ()
_ AReg
_ AReg
SP AReg
SP:[AArch64 AReg FAReg F2Reg ()]
_) = [Char] -> [[Word8]]
forall a. HasCallStack => [Char] -> a
error [Char]
"encoding not valid/supported."
asm Int
ix (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st (SubRR ()
_ AReg
SP AReg
r1 AReg
r2:[AArch64 AReg FAReg F2Reg ()]
asms) = [Word8
0b11001011, Word8
0x1 Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
5 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. AReg -> Word8
forall a. Enum a => a -> Word8
be AReg
r2, Word8
0b111 Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
5 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. AReg -> Word8
forall a. Enum a => a -> Word8
be AReg
r1 Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftR` Int
3, AReg -> AReg -> Word8
forall {a} {a}. (Enum a, Enum a) => a -> a -> Word8
lb AReg
r1 AReg
SP][Word8] -> [[Word8]] -> [[Word8]]
forall a. a -> [a] -> [a]
:Int
-> (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
-> [AArch64 AReg FAReg F2Reg ()]
-> [[Word8]]
asm (Int
ixInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
4) (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st [AArch64 AReg FAReg F2Reg ()]
asms
asm Int
ix (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st (SubRR ()
_ AReg
r0 AReg
SP AReg
r2:[AArch64 AReg FAReg F2Reg ()]
asms) = [Word8
0b11001011, Word8
0x1 Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
5 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. AReg -> Word8
forall a. Enum a => a -> Word8
be AReg
r2, Word8
0b111 Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
5 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. AReg -> Word8
forall a. Enum a => a -> Word8
be AReg
SP Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftR` Int
3, AReg -> AReg -> Word8
forall {a} {a}. (Enum a, Enum a) => a -> a -> Word8
lb AReg
SP AReg
r0][Word8] -> [[Word8]] -> [[Word8]]
forall a. a -> [a] -> [a]
:Int
-> (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
-> [AArch64 AReg FAReg F2Reg ()]
-> [[Word8]]
asm (Int
ixInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
4) (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st [AArch64 AReg FAReg F2Reg ()]
asms
asm Int
ix (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st (SubRR ()
_ AReg
r0 AReg
r1 AReg
r2:[AArch64 AReg FAReg F2Reg ()]
asms) = [Word8
0b11001011, AReg -> Word8
forall a. Enum a => a -> Word8
be AReg
r2, AReg -> Word8
forall a. Enum a => a -> Word8
be AReg
r1 Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftR` Int
3, AReg -> AReg -> Word8
forall {a} {a}. (Enum a, Enum a) => a -> a -> Word8
lb AReg
r1 AReg
r0][Word8] -> [[Word8]] -> [[Word8]]
forall a. a -> [a] -> [a]
:Int
-> (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
-> [AArch64 AReg FAReg F2Reg ()]
-> [[Word8]]
asm (Int
ixInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
4) (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st [AArch64 AReg FAReg F2Reg ()]
asms
asm Int
ix (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st (AddRR ()
_ AReg
SP AReg
r1 AReg
r2:[AArch64 AReg FAReg F2Reg ()]
asms) = [Word8
0b10001011, Word8
0b1 Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
5 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. AReg -> Word8
forall a. Enum a => a -> Word8
be AReg
r2, Word8
0b111 Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
5 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. AReg -> Word8
forall a. Enum a => a -> Word8
be AReg
r1 Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftR` Int
3, AReg -> AReg -> Word8
forall {a} {a}. (Enum a, Enum a) => a -> a -> Word8
lb AReg
r1 AReg
SP][Word8] -> [[Word8]] -> [[Word8]]
forall a. a -> [a] -> [a]
:Int
-> (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
-> [AArch64 AReg FAReg F2Reg ()]
-> [[Word8]]
asm (Int
ixInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
4) (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st [AArch64 AReg FAReg F2Reg ()]
asms
asm Int
ix (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st (AddRR ()
_ AReg
r0 AReg
SP AReg
r2:[AArch64 AReg FAReg F2Reg ()]
asms) = [Word8
0b10001011, Word8
0b1 Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
5 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. AReg -> Word8
forall a. Enum a => a -> Word8
be AReg
r2, Word8
0b111 Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
5 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. AReg -> Word8
forall a. Enum a => a -> Word8
be AReg
SP Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftR` Int
3, AReg -> AReg -> Word8
forall {a} {a}. (Enum a, Enum a) => a -> a -> Word8
lb AReg
SP AReg
r0][Word8] -> [[Word8]] -> [[Word8]]
forall a. a -> [a] -> [a]
:Int
-> (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
-> [AArch64 AReg FAReg F2Reg ()]
-> [[Word8]]
asm (Int
ixInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
4) (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st [AArch64 AReg FAReg F2Reg ()]
asms
asm Int
ix (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st (AddRR ()
l AReg
r0 AReg
r1 AReg
r2:[AArch64 AReg FAReg F2Reg ()]
asms) = Int
-> (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
-> [AArch64 AReg FAReg F2Reg ()]
-> [[Word8]]
asm Int
ix (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st (() -> AReg -> AReg -> AReg -> Word8 -> AArch64 AReg FAReg F2Reg ()
forall reg freg f2 a.
a -> reg -> reg -> reg -> Word8 -> AArch64 reg freg f2 a
AddRRS ()
l AReg
r0 AReg
r1 AReg
r2 Word8
0AArch64 AReg FAReg F2Reg ()
-> [AArch64 AReg FAReg F2Reg ()] -> [AArch64 AReg FAReg F2Reg ()]
forall a. a -> [a] -> [a]
:[AArch64 AReg FAReg F2Reg ()]
asms)
asm Int
ix (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st (AddRRS ()
_ AReg
r0 AReg
r1 AReg
r2 Word8
s:[AArch64 AReg FAReg F2Reg ()]
asms) = [Word8
0b10001011, AReg -> Word8
forall a. Enum a => a -> Word8
be AReg
r2, Word8
s Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
2 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. AReg -> Word8
forall a. Enum a => a -> Word8
be AReg
r1 Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftR` Int
3, AReg -> AReg -> Word8
forall {a} {a}. (Enum a, Enum a) => a -> a -> Word8
lb AReg
r1 AReg
r0][Word8] -> [[Word8]] -> [[Word8]]
forall a. a -> [a] -> [a]
:Int
-> (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
-> [AArch64 AReg FAReg F2Reg ()]
-> [[Word8]]
asm (Int
ixInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
4) (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st [AArch64 AReg FAReg F2Reg ()]
asms
asm Int
ix (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st (AndRR ()
_ AReg
r0 AReg
r1 AReg
r2:[AArch64 AReg FAReg F2Reg ()]
asms) = [Word8
0b10001010, AReg -> Word8
forall a. Enum a => a -> Word8
be AReg
r2, AReg -> Word8
forall a. Enum a => a -> Word8
be AReg
r1 Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftR` Int
3, AReg -> AReg -> Word8
forall {a} {a}. (Enum a, Enum a) => a -> a -> Word8
lb AReg
r1 AReg
r0][Word8] -> [[Word8]] -> [[Word8]]
forall a. a -> [a] -> [a]
:Int
-> (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
-> [AArch64 AReg FAReg F2Reg ()]
-> [[Word8]]
asm (Int
ixInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
4) (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st [AArch64 AReg FAReg F2Reg ()]
asms
asm Int
ix (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st (Eor ()
_ AReg
r0 AReg
r1 AReg
r2:[AArch64 AReg FAReg F2Reg ()]
asms) = [Word8
0b11001010, AReg -> Word8
forall a. Enum a => a -> Word8
be AReg
r2, AReg -> Word8
forall a. Enum a => a -> Word8
be AReg
r1 Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftR` Int
3, AReg -> AReg -> Word8
forall {a} {a}. (Enum a, Enum a) => a -> a -> Word8
lb AReg
r1 AReg
r0][Word8] -> [[Word8]] -> [[Word8]]
forall a. a -> [a] -> [a]
:Int
-> (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
-> [AArch64 AReg FAReg F2Reg ()]
-> [[Word8]]
asm (Int
ixInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
4) (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st [AArch64 AReg FAReg F2Reg ()]
asms
asm Int
ix (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st (Mvn ()
_ AReg
r0 AReg
r1:[AArch64 AReg FAReg F2Reg ()]
asms) = [Word8
0b10101010, Word8
0x1 Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
5 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. AReg -> Word8
forall a. Enum a => a -> Word8
be AReg
r1, Word8
0x3, Word8
0x7 Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
5 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. AReg -> Word8
forall a. Enum a => a -> Word8
be AReg
r0][Word8] -> [[Word8]] -> [[Word8]]
forall a. a -> [a] -> [a]
:Int
-> (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
-> [AArch64 AReg FAReg F2Reg ()]
-> [[Word8]]
asm (Int
ixInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
4) (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st [AArch64 AReg FAReg F2Reg ()]
asms
asm Int
ix (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st (OrRR ()
_ AReg
r0 AReg
r1 AReg
r2:[AArch64 AReg FAReg F2Reg ()]
asms) = [Word8
0b10101010, AReg -> Word8
forall a. Enum a => a -> Word8
be AReg
r2, AReg -> Word8
forall a. Enum a => a -> Word8
be AReg
r1 Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftR` Int
3, AReg -> AReg -> Word8
forall {a} {a}. (Enum a, Enum a) => a -> a -> Word8
lb AReg
r1 AReg
r0][Word8] -> [[Word8]] -> [[Word8]]
forall a. a -> [a] -> [a]
:Int
-> (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
-> [AArch64 AReg FAReg F2Reg ()]
-> [[Word8]]
asm (Int
ixInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
4) (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st [AArch64 AReg FAReg F2Reg ()]
asms
asm Int
ix (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st (Neg ()
_ AReg
r0 AReg
r1:[AArch64 AReg FAReg F2Reg ()]
asms) = [Word8
0b11001011, AReg -> Word8
forall a. Enum a => a -> Word8
be AReg
r1, Word8
0x3, Word8
0x7 Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
5 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. AReg -> Word8
forall a. Enum a => a -> Word8
be AReg
r0][Word8] -> [[Word8]] -> [[Word8]]
forall a. a -> [a] -> [a]
:Int
-> (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
-> [AArch64 AReg FAReg F2Reg ()]
-> [[Word8]]
asm (Int
ixInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
4) (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st [AArch64 AReg FAReg F2Reg ()]
asms
asm Int
ix (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st (MulRR ()
_ AReg
r0 AReg
r1 AReg
r2:[AArch64 AReg FAReg F2Reg ()]
asms) = [Word8
0b10011011, AReg -> Word8
forall a. Enum a => a -> Word8
be AReg
r2, Word8
0b11111 Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
2 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. AReg -> Word8
forall a. Enum a => a -> Word8
be AReg
r1 Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftR` Int
3, AReg -> AReg -> Word8
forall {a} {a}. (Enum a, Enum a) => a -> a -> Word8
lb AReg
r1 AReg
r0][Word8] -> [[Word8]] -> [[Word8]]
forall a. a -> [a] -> [a]
:Int
-> (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
-> [AArch64 AReg FAReg F2Reg ()]
-> [[Word8]]
asm (Int
ixInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
4) (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st [AArch64 AReg FAReg F2Reg ()]
asms
asm Int
ix (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st (Sdiv ()
_ AReg
r0 AReg
r1 AReg
r2:[AArch64 AReg FAReg F2Reg ()]
asms) = [Word8
0b10011010, Word8
0b110 Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
5 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. AReg -> Word8
forall a. Enum a => a -> Word8
be AReg
r2, Word8
0b11 Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
2 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. AReg -> Word8
forall a. Enum a => a -> Word8
be AReg
r1 Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftR` Int
3, AReg -> AReg -> Word8
forall {a} {a}. (Enum a, Enum a) => a -> a -> Word8
lb AReg
r1 AReg
r0][Word8] -> [[Word8]] -> [[Word8]]
forall a. a -> [a] -> [a]
:Int
-> (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
-> [AArch64 AReg FAReg F2Reg ()]
-> [[Word8]]
asm (Int
ixInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
4) (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st [AArch64 AReg FAReg F2Reg ()]
asms
asm Int
ix (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st (Madd ()
_ AReg
r0 AReg
r1 AReg
r2 AReg
r3:[AArch64 AReg FAReg F2Reg ()]
asms) = [Word8
0b10011011, AReg -> Word8
forall a. Enum a => a -> Word8
be AReg
r2, AReg -> Word8
forall a. Enum a => a -> Word8
be AReg
r3 Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
2 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. AReg -> Word8
forall a. Enum a => a -> Word8
be AReg
r1 Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftR` Int
3, AReg -> AReg -> Word8
forall {a} {a}. (Enum a, Enum a) => a -> a -> Word8
lb AReg
r1 AReg
r0][Word8] -> [[Word8]] -> [[Word8]]
forall a. a -> [a] -> [a]
:Int
-> (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
-> [AArch64 AReg FAReg F2Reg ()]
-> [[Word8]]
asm (Int
ixInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
4) (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st [AArch64 AReg FAReg F2Reg ()]
asms
asm Int
ix (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st (Msub ()
_ AReg
r0 AReg
r1 AReg
r2 AReg
r3:[AArch64 AReg FAReg F2Reg ()]
asms) = [Word8
0b10011011, AReg -> Word8
forall a. Enum a => a -> Word8
be AReg
r2, Word8
0b1 Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
7 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. AReg -> Word8
forall a. Enum a => a -> Word8
be AReg
r3 Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
2 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. AReg -> Word8
forall a. Enum a => a -> Word8
be AReg
r1 Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftR` Int
3, AReg -> AReg -> Word8
forall {a} {a}. (Enum a, Enum a) => a -> a -> Word8
lb AReg
r1 AReg
r0][Word8] -> [[Word8]] -> [[Word8]]
forall a. a -> [a] -> [a]
:Int
-> (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
-> [AArch64 AReg FAReg F2Reg ()]
-> [[Word8]]
asm (Int
ixInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
4) (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st [AArch64 AReg FAReg F2Reg ()]
asms
asm Int
ix (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st (AddRC ()
_ AReg
r0 AReg
r1 Word16
i:[AArch64 AReg FAReg F2Reg ()]
asms) = [Word8
0b10010001, Word16 -> Word8
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Word16
i Word16 -> Int -> Word16
forall a. Bits a => a -> Int -> a
`shiftR` Int
6), Word16 -> Word8
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Word16
0b111111 Word16 -> Word16 -> Word16
forall a. Bits a => a -> a -> a
.&. Word16
i) Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
2 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. (AReg -> Word8
forall a. Enum a => a -> Word8
be AReg
r1 Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftR` Int
3), AReg -> AReg -> Word8
forall {a} {a}. (Enum a, Enum a) => a -> a -> Word8
lb AReg
r1 AReg
r0][Word8] -> [[Word8]] -> [[Word8]]
forall a. a -> [a] -> [a]
:Int
-> (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
-> [AArch64 AReg FAReg F2Reg ()]
-> [[Word8]]
asm (Int
ixInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
4) (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st [AArch64 AReg FAReg F2Reg ()]
asms
asm Int
ix (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st (SubRC ()
_ AReg
r0 AReg
r1 Word16
i:[AArch64 AReg FAReg F2Reg ()]
asms) = [Word8
0b11010001, Word16 -> Word8
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Word16
i Word16 -> Int -> Word16
forall a. Bits a => a -> Int -> a
`shiftR` Int
6), Word16 -> Word8
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Word16
0b111111 Word16 -> Word16 -> Word16
forall a. Bits a => a -> a -> a
.&. Word16
i) Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
2 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. AReg -> Word8
forall a. Enum a => a -> Word8
be AReg
r1 Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftR` Int
3, AReg -> AReg -> Word8
forall {a} {a}. (Enum a, Enum a) => a -> a -> Word8
lb AReg
r1 AReg
r0][Word8] -> [[Word8]] -> [[Word8]]
forall a. a -> [a] -> [a]
:Int
-> (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
-> [AArch64 AReg FAReg F2Reg ()]
-> [[Word8]]
asm (Int
ixInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
4) (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st [AArch64 AReg FAReg F2Reg ()]
asms
asm Int
ix (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st (MovRR ()
x AReg
r0 AReg
SP:[AArch64 AReg FAReg F2Reg ()]
asms) = Int
-> (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
-> [AArch64 AReg FAReg F2Reg ()]
-> [[Word8]]
asm Int
ix (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st (() -> AReg -> AReg -> Word16 -> AArch64 AReg FAReg F2Reg ()
forall reg freg f2 a.
a -> reg -> reg -> Word16 -> AArch64 reg freg f2 a
AddRC ()
x AReg
r0 AReg
SP Word16
0AArch64 AReg FAReg F2Reg ()
-> [AArch64 AReg FAReg F2Reg ()] -> [AArch64 AReg FAReg F2Reg ()]
forall a. a -> [a] -> [a]
:[AArch64 AReg FAReg F2Reg ()]
asms)
asm Int
ix (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st (MovRR ()
x AReg
SP AReg
r1:[AArch64 AReg FAReg F2Reg ()]
asms) = Int
-> (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
-> [AArch64 AReg FAReg F2Reg ()]
-> [[Word8]]
asm Int
ix (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st (() -> AReg -> AReg -> Word16 -> AArch64 AReg FAReg F2Reg ()
forall reg freg f2 a.
a -> reg -> reg -> Word16 -> AArch64 reg freg f2 a
AddRC ()
x AReg
SP AReg
r1 Word16
0AArch64 AReg FAReg F2Reg ()
-> [AArch64 AReg FAReg F2Reg ()] -> [AArch64 AReg FAReg F2Reg ()]
forall a. a -> [a] -> [a]
:[AArch64 AReg FAReg F2Reg ()]
asms)
asm Int
ix (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st (MovRR ()
_ AReg
r0 AReg
r1:[AArch64 AReg FAReg F2Reg ()]
asms) = [Word8
0b10101010, AReg -> Word8
forall a. Enum a => a -> Word8
be AReg
r1, Word8
0x3, Word8
0x7 Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
5 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. AReg -> Word8
forall a. Enum a => a -> Word8
be AReg
r0][Word8] -> [[Word8]] -> [[Word8]]
forall a. a -> [a] -> [a]
:Int
-> (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
-> [AArch64 AReg FAReg F2Reg ()]
-> [[Word8]]
asm (Int
ixInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
4) (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st [AArch64 AReg FAReg F2Reg ()]
asms
asm Int
ix (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st (ZeroR ()
_ AReg
r:[AArch64 AReg FAReg F2Reg ()]
asms) = [Word8
0b11001010, AReg -> Word8
forall a. Enum a => a -> Word8
be AReg
r, AReg -> Word8
forall a. Enum a => a -> Word8
be AReg
r Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftR` Int
3, AReg -> AReg -> Word8
forall {a} {a}. (Enum a, Enum a) => a -> a -> Word8
lb AReg
r AReg
r][Word8] -> [[Word8]] -> [[Word8]]
forall a. a -> [a] -> [a]
:Int
-> (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
-> [AArch64 AReg FAReg F2Reg ()]
-> [[Word8]]
asm (Int
ixInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
4) (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st [AArch64 AReg FAReg F2Reg ()]
asms
asm Int
ix (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st (Csel ()
_ AReg
r0 AReg
r1 AReg
r2 Cond
p:[AArch64 AReg FAReg F2Reg ()]
asms) = [Word8
0b10011010, Word8
0x1 Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
7 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. AReg -> Word8
forall a. Enum a => a -> Word8
be AReg
r2, Cond -> Word8
bp Cond
p Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
4 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. AReg -> Word8
forall a. Enum a => a -> Word8
be AReg
r1 Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftR` Int
3, AReg -> AReg -> Word8
forall {a} {a}. (Enum a, Enum a) => a -> a -> Word8
lb AReg
r1 AReg
r0][Word8] -> [[Word8]] -> [[Word8]]
forall a. a -> [a] -> [a]
:Int
-> (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
-> [AArch64 AReg FAReg F2Reg ()]
-> [[Word8]]
asm (Int
ixInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
4) (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st [AArch64 AReg FAReg F2Reg ()]
asms
asm Int
ix (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st (Cset ()
_ AReg
r Cond
p:[AArch64 AReg FAReg F2Reg ()]
asms) = [Word8
0b10011010, Word8
0b10011111, Cond -> Word8
ip Cond
p Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
4 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
0x7, Word8
0x7 Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
5 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. AReg -> Word8
forall a. Enum a => a -> Word8
be AReg
r][Word8] -> [[Word8]] -> [[Word8]]
forall a. a -> [a] -> [a]
:Int
-> (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
-> [AArch64 AReg FAReg F2Reg ()]
-> [[Word8]]
asm (Int
ixInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
4) (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st [AArch64 AReg FAReg F2Reg ()]
asms
asm Int
ix (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st (TstI ()
_ AReg
r (BM Word8
1 Word8
ro):[AArch64 AReg FAReg F2Reg ()]
asms) | Word8
ro Word8 -> Word8 -> Bool
forall a. Ord a => a -> a -> Bool
<= Word8
0b111111 = [Word8
0b11110010, Word8
0x1 Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
6 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. (Word8
0b111111 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.&. (-Word8
ro)), AReg -> Word8
forall a. Enum a => a -> Word8
be AReg
r Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftR` Int
3, (Word8
0x7 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.&. AReg -> Word8
forall a. Enum a => a -> Word8
be AReg
r) Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
5 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
0b11111][Word8] -> [[Word8]] -> [[Word8]]
forall a. a -> [a] -> [a]
:Int
-> (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
-> [AArch64 AReg FAReg F2Reg ()]
-> [[Word8]]
asm (Int
ixInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
4) (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st [AArch64 AReg FAReg F2Reg ()]
asms
asm Int
ix (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st (EorI ()
_ AReg
r0 AReg
r1 (BM Word8
1 Word8
0):[AArch64 AReg FAReg F2Reg ()]
asms) = [Word8
0b11010010, Word8
0x1 Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
6, AReg -> Word8
forall a. Enum a => a -> Word8
be AReg
r1 Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftR` Int
5, AReg -> AReg -> Word8
forall {a} {a}. (Enum a, Enum a) => a -> a -> Word8
lb AReg
r1 AReg
r0][Word8] -> [[Word8]] -> [[Word8]]
forall a. a -> [a] -> [a]
:Int
-> (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
-> [AArch64 AReg FAReg F2Reg ()]
-> [[Word8]]
asm (Int
ixInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
4) (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st [AArch64 AReg FAReg F2Reg ()]
asms
asm Int
ix (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st (Fcsel ()
_ FAReg
d0 FAReg
d1 FAReg
d2 Cond
p:[AArch64 AReg FAReg F2Reg ()]
asms) = [Word8
0b00011110, Word8
0x3 Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
5 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. FAReg -> Word8
forall a. Enum a => a -> Word8
be FAReg
d2, Cond -> Word8
bp Cond
p Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
4 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
0x3 Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
2 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. FAReg -> Word8
forall a. Enum a => a -> Word8
be FAReg
d1 Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftR` Int
3, FAReg -> FAReg -> Word8
forall {a} {a}. (Enum a, Enum a) => a -> a -> Word8
lb FAReg
d1 FAReg
d0][Word8] -> [[Word8]] -> [[Word8]]
forall a. a -> [a] -> [a]
:Int
-> (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
-> [AArch64 AReg FAReg F2Reg ()]
-> [[Word8]]
asm (Int
ixInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
4) (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st [AArch64 AReg FAReg F2Reg ()]
asms
asm Int
ix (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st (Fcmp ()
_ FAReg
d0 FAReg
d1:[AArch64 AReg FAReg F2Reg ()]
asms) = [Word8
0b00011110, Word8
0x3 Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
5 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. FAReg -> Word8
forall a. Enum a => a -> Word8
be FAReg
d1, Word8
0b1000 Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
2 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. FAReg -> Word8
forall a. Enum a => a -> Word8
be FAReg
d0 Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftR` Int
5, FAReg -> Word8
forall a. Enum a => a -> Word8
be FAReg
d0 Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
5][Word8] -> [[Word8]] -> [[Word8]]
forall a. a -> [a] -> [a]
:Int
-> (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
-> [AArch64 AReg FAReg F2Reg ()]
-> [[Word8]]
asm (Int
ixInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
4) (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st [AArch64 AReg FAReg F2Reg ()]
asms
asm Int
ix (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st (Ldr ()
_ AReg
r (RP AReg
rb Word16
u):[AArch64 AReg FAReg F2Reg ()]
asms) | (Word16
uϵ, Word16
0) <- Word16
u Word16 -> Word16 -> (Word16, Word16)
forall a. Integral a => a -> a -> (a, a)
`quotRem` Word16
8 = [Word8
0b11111001, Word8
0x1 Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
6 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word16 -> Word8
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Word16
uϵ Word16 -> Int -> Word16
forall a. Bits a => a -> Int -> a
`shiftR` Int
6), Word16 -> Word8
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Word16
0b111111 Word16 -> Word16 -> Word16
forall a. Bits a => a -> a -> a
.&. Word16
uϵ) Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
2 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. AReg -> Word8
forall a. Enum a => a -> Word8
be AReg
rb Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftR` Int
3, AReg -> AReg -> Word8
forall {a} {a}. (Enum a, Enum a) => a -> a -> Word8
lb AReg
rb AReg
r][Word8] -> [[Word8]] -> [[Word8]]
forall a. a -> [a] -> [a]
:Int
-> (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
-> [AArch64 AReg FAReg F2Reg ()]
-> [[Word8]]
asm (Int
ixInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
4) (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st [AArch64 AReg FAReg F2Reg ()]
asms
asm Int
ix (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st (Ldr ()
_ AReg
r (R AReg
rb):[AArch64 AReg FAReg F2Reg ()]
asms) = [Word8
0xf9, Word8
0x1 Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
6, AReg -> Word8
forall a. Enum a => a -> Word8
be AReg
rb Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftR` Int
3, AReg -> AReg -> Word8
forall {a} {a}. (Enum a, Enum a) => a -> a -> Word8
lb AReg
rb AReg
r][Word8] -> [[Word8]] -> [[Word8]]
forall a. a -> [a] -> [a]
:Int
-> (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
-> [AArch64 AReg FAReg F2Reg ()]
-> [[Word8]]
asm (Int
ixInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
4) (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st [AArch64 AReg FAReg F2Reg ()]
asms
asm Int
ix (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st (Ldr ()
_ AReg
r (BI AReg
rb AReg
ri Shift
s):[AArch64 AReg FAReg F2Reg ()]
asms) = [Word8
0b11111000, Word8
0x3 Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
5 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. AReg -> Word8
forall a. Enum a => a -> Word8
be AReg
ri, Word8
0x3 Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
5 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Shift -> Word8
bs Shift
s Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
4 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
0x2 Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
2 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. (AReg -> Word8
forall a. Enum a => a -> Word8
be AReg
rb Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftR` Int
3), AReg -> AReg -> Word8
forall {a} {a}. (Enum a, Enum a) => a -> a -> Word8
lb AReg
rb AReg
r][Word8] -> [[Word8]] -> [[Word8]]
forall a. a -> [a] -> [a]
:Int
-> (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
-> [AArch64 AReg FAReg F2Reg ()]
-> [[Word8]]
asm (Int
ixInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
4) (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st [AArch64 AReg FAReg F2Reg ()]
asms
asm Int
ix (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st (LdrB ()
x AReg
r (R AReg
rb):[AArch64 AReg FAReg F2Reg ()]
asms) = Int
-> (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
-> [AArch64 AReg FAReg F2Reg ()]
-> [[Word8]]
asm Int
ix (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st (() -> AReg -> Addr AReg -> AArch64 AReg FAReg F2Reg ()
forall reg freg f2 a. a -> reg -> Addr reg -> AArch64 reg freg f2 a
LdrB ()
x AReg
r (AReg -> Word16 -> Addr AReg
forall reg. reg -> Word16 -> Addr reg
RP AReg
rb Word16
0)AArch64 AReg FAReg F2Reg ()
-> [AArch64 AReg FAReg F2Reg ()] -> [AArch64 AReg FAReg F2Reg ()]
forall a. a -> [a] -> [a]
:[AArch64 AReg FAReg F2Reg ()]
asms)
asm Int
ix (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st (LdrB ()
_ AReg
r (RP AReg
rb Word16
u):[AArch64 AReg FAReg F2Reg ()]
asms) | Word16
u Word16 -> Word16 -> Bool
forall a. Ord a => a -> a -> Bool
<= Word16
4095 = [Word8
0b00111001, Word8
0x1 Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
6 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. (Word16 -> Word8
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word16
u Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftR` Int
6), Word16 -> Word8
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Word16
0b111111 Word16 -> Word16 -> Word16
forall a. Bits a => a -> a -> a
.&. Word16
u) Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
2 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. AReg -> Word8
forall a. Enum a => a -> Word8
be AReg
rb Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftR` Int
3, AReg -> AReg -> Word8
forall {a} {a}. (Enum a, Enum a) => a -> a -> Word8
lb AReg
rb AReg
r][Word8] -> [[Word8]] -> [[Word8]]
forall a. a -> [a] -> [a]
:Int
-> (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
-> [AArch64 AReg FAReg F2Reg ()]
-> [[Word8]]
asm (Int
ixInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
4) (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st [AArch64 AReg FAReg F2Reg ()]
asms
asm Int
ix (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st (LdrB ()
_ AReg
r (BI AReg
rb AReg
ri Shift
s):[AArch64 AReg FAReg F2Reg ()]
asms) = [Word8
0b00111000, Word8
0x3 Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
5 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. AReg -> Word8
forall a. Enum a => a -> Word8
be AReg
ri, Word8
0x3 Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
5 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Shift -> Word8
bs Shift
s Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
4 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
0x2 Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
2 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. (AReg -> Word8
forall a. Enum a => a -> Word8
be AReg
rb Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftR` Int
3), AReg -> AReg -> Word8
forall {a} {a}. (Enum a, Enum a) => a -> a -> Word8
lb AReg
rb AReg
r][Word8] -> [[Word8]] -> [[Word8]]
forall a. a -> [a] -> [a]
:Int
-> (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
-> [AArch64 AReg FAReg F2Reg ()]
-> [[Word8]]
asm (Int
ixInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
4) (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st [AArch64 AReg FAReg F2Reg ()]
asms
asm Int
ix (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st (Ldp ()
x AReg
r0 AReg
r1 (R AReg
rb):[AArch64 AReg FAReg F2Reg ()]
asms) = Int
-> (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
-> [AArch64 AReg FAReg F2Reg ()]
-> [[Word8]]
asm Int
ix (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st (() -> AReg -> AReg -> Addr AReg -> AArch64 AReg FAReg F2Reg ()
forall reg freg f2 a.
a -> reg -> reg -> Addr reg -> AArch64 reg freg f2 a
Ldp ()
x AReg
r0 AReg
r1 (AReg -> Word16 -> Addr AReg
forall reg. reg -> Word16 -> Addr reg
RP AReg
rb Word16
0)AArch64 AReg FAReg F2Reg ()
-> [AArch64 AReg FAReg F2Reg ()] -> [AArch64 AReg FAReg F2Reg ()]
forall a. a -> [a] -> [a]
:[AArch64 AReg FAReg F2Reg ()]
asms)
asm Int
ix (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st (Ldp ()
_ AReg
r0 AReg
r1 (RP AReg
rb Word16
u):[AArch64 AReg FAReg F2Reg ()]
asms) | (Word16
u', Word16
0) <- Word16
u Word16 -> Word16 -> (Word16, Word16)
forall a. Integral a => a -> a -> (a, a)
`quotRem` Word16
8, Word16
u Word16 -> Word16 -> Bool
forall a. Ord a => a -> a -> Bool
<= Word16
504 = [Word8
0xa9, Word8
0x1 Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
6 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word16 -> Word8
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Word16
u' Word16 -> Int -> Word16
forall a. Bits a => a -> Int -> a
`shiftR` Int
1), Word16 -> Word8
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Word16
0x1 Word16 -> Word16 -> Word16
forall a. Bits a => a -> a -> a
.&. Word16
u') Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
7 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. AReg -> Word8
forall a. Enum a => a -> Word8
be AReg
r1 Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
2 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. AReg -> Word8
forall a. Enum a => a -> Word8
be AReg
rb Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftR` Int
3, AReg -> AReg -> Word8
forall {a} {a}. (Enum a, Enum a) => a -> a -> Word8
lb AReg
rb AReg
r0][Word8] -> [[Word8]] -> [[Word8]]
forall a. a -> [a] -> [a]
:Int
-> (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
-> [AArch64 AReg FAReg F2Reg ()]
-> [[Word8]]
asm (Int
ixInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
4) (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st [AArch64 AReg FAReg F2Reg ()]
asms
asm Int
ix (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st (Str ()
x AReg
r (R AReg
rb):[AArch64 AReg FAReg F2Reg ()]
asms) = Int
-> (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
-> [AArch64 AReg FAReg F2Reg ()]
-> [[Word8]]
asm Int
ix (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st (() -> AReg -> Addr AReg -> AArch64 AReg FAReg F2Reg ()
forall reg freg f2 a. a -> reg -> Addr reg -> AArch64 reg freg f2 a
Str ()
x AReg
r (AReg -> Word16 -> Addr AReg
forall reg. reg -> Word16 -> Addr reg
RP AReg
rb Word16
0)AArch64 AReg FAReg F2Reg ()
-> [AArch64 AReg FAReg F2Reg ()] -> [AArch64 AReg FAReg F2Reg ()]
forall a. a -> [a] -> [a]
:[AArch64 AReg FAReg F2Reg ()]
asms)
asm Int
ix (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st (Str ()
_ AReg
r (RP AReg
rb Word16
u):[AArch64 AReg FAReg F2Reg ()]
asms) | (Word16
uu, Word16
0) <- Word16
u Word16 -> Word16 -> (Word16, Word16)
forall a. Integral a => a -> a -> (a, a)
`quotRem` Word16
8 = [Word8
0xf9, Word16 -> Word8
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Word16
uu Word16 -> Int -> Word16
forall a. Bits a => a -> Int -> a
`shiftR` Int
6), Word16 -> Word8
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Word16
0b111111 Word16 -> Word16 -> Word16
forall a. Bits a => a -> a -> a
.&. Word16
uu) Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
2 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. AReg -> Word8
forall a. Enum a => a -> Word8
be AReg
rb Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftR` Int
3, AReg -> AReg -> Word8
forall {a} {a}. (Enum a, Enum a) => a -> a -> Word8
lb AReg
rb AReg
r][Word8] -> [[Word8]] -> [[Word8]]
forall a. a -> [a] -> [a]
:Int
-> (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
-> [AArch64 AReg FAReg F2Reg ()]
-> [[Word8]]
asm (Int
ixInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
4) (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st [AArch64 AReg FAReg F2Reg ()]
asms
asm Int
ix (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st (Str ()
_ AReg
r (BI AReg
rb AReg
ri Shift
s):[AArch64 AReg FAReg F2Reg ()]
asms) = [Word8
0b11111000, Word8
0x1 Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
5 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. AReg -> Word8
forall a. Enum a => a -> Word8
be AReg
ri, Word8
0x3 Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
5 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Shift -> Word8
bs Shift
s Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
4 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
0x2 Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
2 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. AReg -> Word8
forall a. Enum a => a -> Word8
be AReg
rb Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftR` Int
3, AReg -> AReg -> Word8
forall {a} {a}. (Enum a, Enum a) => a -> a -> Word8
lb AReg
rb AReg
r][Word8] -> [[Word8]] -> [[Word8]]
forall a. a -> [a] -> [a]
:Int
-> (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
-> [AArch64 AReg FAReg F2Reg ()]
-> [[Word8]]
asm (Int
ixInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
4) (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st [AArch64 AReg FAReg F2Reg ()]
asms
asm Int
ix (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st (StrB ()
x AReg
r (R AReg
rb):[AArch64 AReg FAReg F2Reg ()]
asms) = Int
-> (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
-> [AArch64 AReg FAReg F2Reg ()]
-> [[Word8]]
asm Int
ix (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st (() -> AReg -> Addr AReg -> AArch64 AReg FAReg F2Reg ()
forall reg freg f2 a. a -> reg -> Addr reg -> AArch64 reg freg f2 a
StrB ()
x AReg
r (AReg -> Word16 -> Addr AReg
forall reg. reg -> Word16 -> Addr reg
RP AReg
rb Word16
0)AArch64 AReg FAReg F2Reg ()
-> [AArch64 AReg FAReg F2Reg ()] -> [AArch64 AReg FAReg F2Reg ()]
forall a. a -> [a] -> [a]
:[AArch64 AReg FAReg F2Reg ()]
asms)
asm Int
ix (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st (StrB ()
_ AReg
r (RP AReg
rb Word16
u):[AArch64 AReg FAReg F2Reg ()]
asms) | Word16
u Word16 -> Word16 -> Bool
forall a. Ord a => a -> a -> Bool
<= Word16
4095 = [Word8
0b00111001, Word16 -> Word8
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Word16
u Word16 -> Int -> Word16
forall a. Bits a => a -> Int -> a
`shiftR` Int
6), Word16 -> Word8
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Word16
0b111111 Word16 -> Word16 -> Word16
forall a. Bits a => a -> a -> a
.&. Word16
u) Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
2 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. AReg -> Word8
forall a. Enum a => a -> Word8
be AReg
rb Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftR` Int
3, AReg -> AReg -> Word8
forall {a} {a}. (Enum a, Enum a) => a -> a -> Word8
lb AReg
rb AReg
r][Word8] -> [[Word8]] -> [[Word8]]
forall a. a -> [a] -> [a]
:Int
-> (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
-> [AArch64 AReg FAReg F2Reg ()]
-> [[Word8]]
asm (Int
ixInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
4) (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st [AArch64 AReg FAReg F2Reg ()]
asms
asm Int
ix (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st (StrB ()
_ AReg
r (BI AReg
rb AReg
ri Shift
s):[AArch64 AReg FAReg F2Reg ()]
asms) = [Word8
0b00111000, Word8
0x1 Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
5 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. AReg -> Word8
forall a. Enum a => a -> Word8
be AReg
ri, Word8
0x3 Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
5 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Shift -> Word8
bs Shift
s Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
4 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
0x2 Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
2 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. AReg -> Word8
forall a. Enum a => a -> Word8
be AReg
rb Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftR` Int
3, AReg -> AReg -> Word8
forall {a} {a}. (Enum a, Enum a) => a -> a -> Word8
lb AReg
rb AReg
r][Word8] -> [[Word8]] -> [[Word8]]
forall a. a -> [a] -> [a]
:Int
-> (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
-> [AArch64 AReg FAReg F2Reg ()]
-> [[Word8]]
asm (Int
ixInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
4) (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st [AArch64 AReg FAReg F2Reg ()]
asms
asm Int
ix (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st (StrD ()
_ FAReg
d (BI AReg
rb AReg
ri Shift
s):[AArch64 AReg FAReg F2Reg ()]
asms) = [Word8
0xfc, Word8
0x1 Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
5 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. AReg -> Word8
forall a. Enum a => a -> Word8
be AReg
ri, Word8
0x3 Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
5 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Shift -> Word8
bs Shift
s Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
4 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
0x2 Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
2 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. AReg -> Word8
forall a. Enum a => a -> Word8
be AReg
rb Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftR` Int
3, AReg -> FAReg -> Word8
forall {a} {a}. (Enum a, Enum a) => a -> a -> Word8
lb AReg
rb FAReg
d][Word8] -> [[Word8]] -> [[Word8]]
forall a. a -> [a] -> [a]
:Int
-> (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
-> [AArch64 AReg FAReg F2Reg ()]
-> [[Word8]]
asm (Int
ixInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
4) (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st [AArch64 AReg FAReg F2Reg ()]
asms
asm Int
ix (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st (StrD ()
_ FAReg
d (RP AReg
rb Word16
u):[AArch64 AReg FAReg F2Reg ()]
asms) | (Word16
uϵ, Word16
0) <- Word16
u Word16 -> Word16 -> (Word16, Word16)
forall a. Integral a => a -> a -> (a, a)
`quotRem` Word16
8, Word16
u Word16 -> Word16 -> Bool
forall a. Ord a => a -> a -> Bool
<= Word16
32760 = [Word8
0b11111101, Word16 -> Word8
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Word16
uϵ Word16 -> Int -> Word16
forall a. Bits a => a -> Int -> a
`shiftR` Int
6), Word16 -> Word8
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Word16
uϵ Word16 -> Word16 -> Word16
forall a. Bits a => a -> a -> a
.&. Word16
0b111111) Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
2 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. AReg -> Word8
forall a. Enum a => a -> Word8
be AReg
rb Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftR` Int
3, AReg -> FAReg -> Word8
forall {a} {a}. (Enum a, Enum a) => a -> a -> Word8
lb AReg
rb FAReg
d][Word8] -> [[Word8]] -> [[Word8]]
forall a. a -> [a] -> [a]
:Int
-> (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
-> [AArch64 AReg FAReg F2Reg ()]
-> [[Word8]]
asm (Int
ixInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
4) (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st [AArch64 AReg FAReg F2Reg ()]
asms
asm Int
ix (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st (StrD ()
x FAReg
d (R AReg
rb):[AArch64 AReg FAReg F2Reg ()]
asms) = Int
-> (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
-> [AArch64 AReg FAReg F2Reg ()]
-> [[Word8]]
asm Int
ix (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st (() -> FAReg -> Addr AReg -> AArch64 AReg FAReg F2Reg ()
forall reg freg f2 a.
a -> freg -> Addr reg -> AArch64 reg freg f2 a
StrD ()
x FAReg
d (AReg -> Word16 -> Addr AReg
forall reg. reg -> Word16 -> Addr reg
RP AReg
rb Word16
0)AArch64 AReg FAReg F2Reg ()
-> [AArch64 AReg FAReg F2Reg ()] -> [AArch64 AReg FAReg F2Reg ()]
forall a. a -> [a] -> [a]
:[AArch64 AReg FAReg F2Reg ()]
asms)
asm Int
ix (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st (Stp ()
x AReg
r0 AReg
r1 (R AReg
rb):[AArch64 AReg FAReg F2Reg ()]
asms) = Int
-> (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
-> [AArch64 AReg FAReg F2Reg ()]
-> [[Word8]]
asm Int
ix (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st (() -> AReg -> AReg -> Addr AReg -> AArch64 AReg FAReg F2Reg ()
forall reg freg f2 a.
a -> reg -> reg -> Addr reg -> AArch64 reg freg f2 a
Stp ()
x AReg
r0 AReg
r1 (AReg -> Word16 -> Addr AReg
forall reg. reg -> Word16 -> Addr reg
RP AReg
rb Word16
0)AArch64 AReg FAReg F2Reg ()
-> [AArch64 AReg FAReg F2Reg ()] -> [AArch64 AReg FAReg F2Reg ()]
forall a. a -> [a] -> [a]
:[AArch64 AReg FAReg F2Reg ()]
asms)
asm Int
ix (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st (Stp ()
_ AReg
r0 AReg
r1 (RP AReg
rb Word16
u):[AArch64 AReg FAReg F2Reg ()]
asms) | (Word16
u', Word16
0) <- Word16
u Word16 -> Word16 -> (Word16, Word16)
forall a. Integral a => a -> a -> (a, a)
`quotRem` Word16
8, Word16
u Word16 -> Word16 -> Bool
forall a. Ord a => a -> a -> Bool
<= Word16
504 = [Word8
0xa9, Word16 -> Word8
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Word16
u' Word16 -> Int -> Word16
forall a. Bits a => a -> Int -> a
`shiftR` Int
1), Word16 -> Word8
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Word16
0x1 Word16 -> Word16 -> Word16
forall a. Bits a => a -> a -> a
.&. Word16
u') Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
7 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. AReg -> Word8
forall a. Enum a => a -> Word8
be AReg
r1 Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
2 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. AReg -> Word8
forall a. Enum a => a -> Word8
be AReg
rb Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftR` Int
3, AReg -> AReg -> Word8
forall {a} {a}. (Enum a, Enum a) => a -> a -> Word8
lb AReg
rb AReg
r0][Word8] -> [[Word8]] -> [[Word8]]
forall a. a -> [a] -> [a]
:Int
-> (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
-> [AArch64 AReg FAReg F2Reg ()]
-> [[Word8]]
asm (Int
ixInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
4) (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st [AArch64 AReg FAReg F2Reg ()]
asms
asm Int
ix (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st (Stp2 ()
_ F2Reg
q0 F2Reg
q1 (RP AReg
rb Word16
u):[AArch64 AReg FAReg F2Reg ()]
asms) | (Word16
u', Word16
0) <- Word16
u Word16 -> Word16 -> (Word16, Word16)
forall a. Integral a => a -> a -> (a, a)
`quotRem` Word16
16, Word16
u Word16 -> Word16 -> Bool
forall a. Ord a => a -> a -> Bool
<= Word16
1008 = [Word8
0b10101101, Word16 -> Word8
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Word16
u' Word16 -> Int -> Word16
forall a. Bits a => a -> Int -> a
`shiftR` Int
1), Word16 -> Word8
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Word16
0x1 Word16 -> Word16 -> Word16
forall a. Bits a => a -> a -> a
.&. Word16
u') Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
7 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. F2Reg -> Word8
forall a. Enum a => a -> Word8
be F2Reg
q1 Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
2 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. AReg -> Word8
forall a. Enum a => a -> Word8
be AReg
rb Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftR` Int
3, AReg -> F2Reg -> Word8
forall {a} {a}. (Enum a, Enum a) => a -> a -> Word8
lb AReg
rb F2Reg
q0][Word8] -> [[Word8]] -> [[Word8]]
forall a. a -> [a] -> [a]
:Int
-> (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
-> [AArch64 AReg FAReg F2Reg ()]
-> [[Word8]]
asm (Int
ixInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
4) (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st [AArch64 AReg FAReg F2Reg ()]
asms
asm Int
ix (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st (Stp2 ()
x F2Reg
q0 F2Reg
q1 (R AReg
rb):[AArch64 AReg FAReg F2Reg ()]
asms) = Int
-> (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
-> [AArch64 AReg FAReg F2Reg ()]
-> [[Word8]]
asm Int
ix (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st (() -> F2Reg -> F2Reg -> Addr AReg -> AArch64 AReg FAReg F2Reg ()
forall reg freg f2 a.
a -> f2 -> f2 -> Addr reg -> AArch64 reg freg f2 a
Stp2 ()
x F2Reg
q0 F2Reg
q1 (AReg -> Word16 -> Addr AReg
forall reg. reg -> Word16 -> Addr reg
RP AReg
rb Word16
0)AArch64 AReg FAReg F2Reg ()
-> [AArch64 AReg FAReg F2Reg ()] -> [AArch64 AReg FAReg F2Reg ()]
forall a. a -> [a] -> [a]
:[AArch64 AReg FAReg F2Reg ()]
asms)
asm Int
ix (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st (StpD ()
x FAReg
d0 FAReg
d1 (R AReg
rb):[AArch64 AReg FAReg F2Reg ()]
asms) = Int
-> (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
-> [AArch64 AReg FAReg F2Reg ()]
-> [[Word8]]
asm Int
ix (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st (() -> FAReg -> FAReg -> Addr AReg -> AArch64 AReg FAReg F2Reg ()
forall reg freg f2 a.
a -> freg -> freg -> Addr reg -> AArch64 reg freg f2 a
StpD ()
x FAReg
d0 FAReg
d1 (AReg -> Word16 -> Addr AReg
forall reg. reg -> Word16 -> Addr reg
RP AReg
rb Word16
0)AArch64 AReg FAReg F2Reg ()
-> [AArch64 AReg FAReg F2Reg ()] -> [AArch64 AReg FAReg F2Reg ()]
forall a. a -> [a] -> [a]
:[AArch64 AReg FAReg F2Reg ()]
asms)
asm Int
ix (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st (StpD ()
_ FAReg
d0 FAReg
d1 (RP AReg
rb Word16
u):[AArch64 AReg FAReg F2Reg ()]
asms) | (Word16
uϵ, Word16
0) <- Word16
u Word16 -> Word16 -> (Word16, Word16)
forall a. Integral a => a -> a -> (a, a)
`quotRem` Word16
8, Word16
u Word16 -> Word16 -> Bool
forall a. Ord a => a -> a -> Bool
<= Word16
504 = [Word8
0b01101101, Word16 -> Word8
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Word16
uϵ Word16 -> Int -> Word16
forall a. Bits a => a -> Int -> a
`shiftR` Int
1), Word16 -> Word8
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Word16
uϵ Word16 -> Word16 -> Word16
forall a. Bits a => a -> a -> a
.&. Word16
0b1) Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
7 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. FAReg -> Word8
forall a. Enum a => a -> Word8
be FAReg
d1 Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
2 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. AReg -> Word8
forall a. Enum a => a -> Word8
be AReg
rb Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftR` Int
3, AReg -> FAReg -> Word8
forall {a} {a}. (Enum a, Enum a) => a -> a -> Word8
lb AReg
rb FAReg
d0][Word8] -> [[Word8]] -> [[Word8]]
forall a. a -> [a] -> [a]
:Int
-> (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
-> [AArch64 AReg FAReg F2Reg ()]
-> [[Word8]]
asm (Int
ixInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
4) (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st [AArch64 AReg FAReg F2Reg ()]
asms
asm Int
ix (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st (LdrD ()
x FAReg
d (R AReg
rb):[AArch64 AReg FAReg F2Reg ()]
asms) = Int
-> (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
-> [AArch64 AReg FAReg F2Reg ()]
-> [[Word8]]
asm Int
ix (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st (() -> FAReg -> Addr AReg -> AArch64 AReg FAReg F2Reg ()
forall reg freg f2 a.
a -> freg -> Addr reg -> AArch64 reg freg f2 a
LdrD ()
x FAReg
d (AReg -> Word16 -> Addr AReg
forall reg. reg -> Word16 -> Addr reg
RP AReg
rb Word16
0)AArch64 AReg FAReg F2Reg ()
-> [AArch64 AReg FAReg F2Reg ()] -> [AArch64 AReg FAReg F2Reg ()]
forall a. a -> [a] -> [a]
:[AArch64 AReg FAReg F2Reg ()]
asms)
asm Int
ix (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st (LdrD ()
_ FAReg
d (RP AReg
rb Word16
u):[AArch64 AReg FAReg F2Reg ()]
asms) | (Word16
uϵ, Word16
0) <- Word16
u Word16 -> Word16 -> (Word16, Word16)
forall a. Integral a => a -> a -> (a, a)
`quotRem` Word16
8, Word16
u Word16 -> Word16 -> Bool
forall a. Ord a => a -> a -> Bool
< Word16
32760 = [Word8
0b11111101, Word8
0x1 Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
6 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word16 -> Word8
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Word16
uϵ Word16 -> Int -> Word16
forall a. Bits a => a -> Int -> a
`shiftR` Int
6), Word16 -> Word8
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Word16
0b111111 Word16 -> Word16 -> Word16
forall a. Bits a => a -> a -> a
.&. Word16
uϵ) Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
2 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. AReg -> Word8
forall a. Enum a => a -> Word8
be AReg
rb Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftR` Int
3, AReg -> FAReg -> Word8
forall {a} {a}. (Enum a, Enum a) => a -> a -> Word8
lb AReg
rb FAReg
d][Word8] -> [[Word8]] -> [[Word8]]
forall a. a -> [a] -> [a]
:Int
-> (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
-> [AArch64 AReg FAReg F2Reg ()]
-> [[Word8]]
asm (Int
ixInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
4) (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st [AArch64 AReg FAReg F2Reg ()]
asms
asm Int
ix (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st (LdrD ()
_ FAReg
d (BI AReg
rb AReg
ri Shift
s):[AArch64 AReg FAReg F2Reg ()]
asms) = [Word8
0b11111100, Word8
0x3 Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
5 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. AReg -> Word8
forall a. Enum a => a -> Word8
be AReg
ri, Word8
0x3 Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
5 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Shift -> Word8
bs Shift
s Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
4 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
0x2 Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
2 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. AReg -> Word8
forall a. Enum a => a -> Word8
be AReg
rb Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftR` Int
3, AReg -> FAReg -> Word8
forall {a} {a}. (Enum a, Enum a) => a -> a -> Word8
lb AReg
rb FAReg
d][Word8] -> [[Word8]] -> [[Word8]]
forall a. a -> [a] -> [a]
:Int
-> (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
-> [AArch64 AReg FAReg F2Reg ()]
-> [[Word8]]
asm (Int
ixInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
4) (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st [AArch64 AReg FAReg F2Reg ()]
asms
asm Int
ix (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st (LdpD ()
_ FAReg
d0 FAReg
d1 (RP AReg
rb Word16
u):[AArch64 AReg FAReg F2Reg ()]
asms) | (Word16
uϵ, Word16
0) <- Word16
u Word16 -> Word16 -> (Word16, Word16)
forall a. Integral a => a -> a -> (a, a)
`quotRem` Word16
8, Word16
uϵ Word16 -> Word16 -> Bool
forall a. Ord a => a -> a -> Bool
<= Word16
504 = [Word8
0x6d, Word8
0x1 Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
6 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word16 -> Word8
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Word16
uϵ Word16 -> Int -> Word16
forall a. Bits a => a -> Int -> a
`shiftR` Int
1), Word16 -> Word8
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Word16
uϵ Word16 -> Word16 -> Word16
forall a. Bits a => a -> a -> a
.&. Word16
0b1) Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
7 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. FAReg -> Word8
forall a. Enum a => a -> Word8
be FAReg
d1 Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
2 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. AReg -> Word8
forall a. Enum a => a -> Word8
be AReg
rb Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftR` Int
3, AReg -> FAReg -> Word8
forall {a} {a}. (Enum a, Enum a) => a -> a -> Word8
lb AReg
rb FAReg
d0][Word8] -> [[Word8]] -> [[Word8]]
forall a. a -> [a] -> [a]
:Int
-> (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
-> [AArch64 AReg FAReg F2Reg ()]
-> [[Word8]]
asm (Int
ixInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
4) (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st [AArch64 AReg FAReg F2Reg ()]
asms
asm Int
ix (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st (LdpD ()
x FAReg
d0 FAReg
d1 (R AReg
rb):[AArch64 AReg FAReg F2Reg ()]
asms) = Int
-> (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
-> [AArch64 AReg FAReg F2Reg ()]
-> [[Word8]]
asm Int
ix (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st (() -> FAReg -> FAReg -> Addr AReg -> AArch64 AReg FAReg F2Reg ()
forall reg freg f2 a.
a -> freg -> freg -> Addr reg -> AArch64 reg freg f2 a
LdpD ()
x FAReg
d0 FAReg
d1 (AReg -> Word16 -> Addr AReg
forall reg. reg -> Word16 -> Addr reg
RP AReg
rb Word16
0)AArch64 AReg FAReg F2Reg ()
-> [AArch64 AReg FAReg F2Reg ()] -> [AArch64 AReg FAReg F2Reg ()]
forall a. a -> [a] -> [a]
:[AArch64 AReg FAReg F2Reg ()]
asms)
asm Int
ix (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st (Ldp2 ()
_ F2Reg
q0 F2Reg
q1 (RP AReg
rb Word16
u):[AArch64 AReg FAReg F2Reg ()]
asms) | (Word16
uϵ, Word16
0) <- Word16
u Word16 -> Word16 -> (Word16, Word16)
forall a. Integral a => a -> a -> (a, a)
`quotRem` Word16
16, Word16
u Word16 -> Word16 -> Bool
forall a. Ord a => a -> a -> Bool
<= Word16
1008 = [Word8
0b10101101, Word8
0x1 Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
6 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word16 -> Word8
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Word16
uϵ Word16 -> Int -> Word16
forall a. Bits a => a -> Int -> a
`shiftR` Int
1), Word16 -> Word8
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Word16
0x1 Word16 -> Word16 -> Word16
forall a. Bits a => a -> a -> a
.&. Word16
uϵ) Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
7 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. F2Reg -> Word8
forall a. Enum a => a -> Word8
be F2Reg
q1 Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
2 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. AReg -> Word8
forall a. Enum a => a -> Word8
be AReg
rb Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftR` Int
3, AReg -> F2Reg -> Word8
forall {a} {a}. (Enum a, Enum a) => a -> a -> Word8
lb AReg
rb F2Reg
q0][Word8] -> [[Word8]] -> [[Word8]]
forall a. a -> [a] -> [a]
:Int
-> (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
-> [AArch64 AReg FAReg F2Reg ()]
-> [[Word8]]
asm (Int
ixInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
4) (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st [AArch64 AReg FAReg F2Reg ()]
asms
asm Int
ix (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st (Ldp2 ()
x F2Reg
q0 F2Reg
q1 (R AReg
rb):[AArch64 AReg FAReg F2Reg ()]
asms) = Int
-> (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
-> [AArch64 AReg FAReg F2Reg ()]
-> [[Word8]]
asm Int
ix (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st (() -> F2Reg -> F2Reg -> Addr AReg -> AArch64 AReg FAReg F2Reg ()
forall reg freg f2 a.
a -> f2 -> f2 -> Addr reg -> AArch64 reg freg f2 a
Ldp2 ()
x F2Reg
q0 F2Reg
q1 (AReg -> Word16 -> Addr AReg
forall reg. reg -> Word16 -> Addr reg
RP AReg
rb Word16
0)AArch64 AReg FAReg F2Reg ()
-> [AArch64 AReg FAReg F2Reg ()] -> [AArch64 AReg FAReg F2Reg ()]
forall a. a -> [a] -> [a]
:[AArch64 AReg FAReg F2Reg ()]
asms)
asm Int
ix (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st (CmpRR ()
_ AReg
r0 AReg
r1:[AArch64 AReg FAReg F2Reg ()]
asms) = [Word8
0b11101011, AReg -> Word8
forall a. Enum a => a -> Word8
be AReg
r1, AReg -> Word8
forall a. Enum a => a -> Word8
be AReg
r0 Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftR` Int
3, (Word8
0x7 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.&. AReg -> Word8
forall a. Enum a => a -> Word8
be AReg
r0) Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
5 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
0b11111][Word8] -> [[Word8]] -> [[Word8]]
forall a. a -> [a] -> [a]
:Int
-> (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
-> [AArch64 AReg FAReg F2Reg ()]
-> [[Word8]]
asm (Int
ixInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
4) (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st [AArch64 AReg FAReg F2Reg ()]
asms
asm Int
ix (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st (CmpRC ()
_ AReg
r Word16
u:[AArch64 AReg FAReg F2Reg ()]
asms) = [Word8
0b11110001, Word16 -> Word8
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Word16
u Word16 -> Int -> Word16
forall a. Bits a => a -> Int -> a
`shiftR` Int
6), (Word8
0b111111 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.&. Word16 -> Word8
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word16
u) Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
2 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. (AReg -> Word8
forall a. Enum a => a -> Word8
be AReg
r Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftR` Int
3), (Word8
0x7 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.&. AReg -> Word8
forall a. Enum a => a -> Word8
be AReg
r) Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
5 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
0b11111][Word8] -> [[Word8]] -> [[Word8]]
forall a. a -> [a] -> [a]
:Int
-> (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
-> [AArch64 AReg FAReg F2Reg ()]
-> [[Word8]]
asm (Int
ixInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
4) (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st [AArch64 AReg FAReg F2Reg ()]
asms
asm Int
ix (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st (Scvtf ()
_ FAReg
d AReg
r:[AArch64 AReg FAReg F2Reg ()]
asms) = [Word8
0b10011110, Word8
0b01100010, AReg -> Word8
forall a. Enum a => a -> Word8
be AReg
r Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftR` Int
3, AReg -> FAReg -> Word8
forall {a} {a}. (Enum a, Enum a) => a -> a -> Word8
lb AReg
r FAReg
d][Word8] -> [[Word8]] -> [[Word8]]
forall a. a -> [a] -> [a]
:Int
-> (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
-> [AArch64 AReg FAReg F2Reg ()]
-> [[Word8]]
asm (Int
ixInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
4) (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st [AArch64 AReg FAReg F2Reg ()]
asms
asm Int
ix (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st (Fcvtms ()
_ AReg
r FAReg
d:[AArch64 AReg FAReg F2Reg ()]
asms) = [Word8
0b10011110, Word8
0x1 Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
6 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
0b110000, FAReg -> Word8
forall a. Enum a => a -> Word8
be FAReg
d Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftR` Int
3, FAReg -> AReg -> Word8
forall {a} {a}. (Enum a, Enum a) => a -> a -> Word8
lb FAReg
d AReg
r][Word8] -> [[Word8]] -> [[Word8]]
forall a. a -> [a] -> [a]
:Int
-> (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
-> [AArch64 AReg FAReg F2Reg ()]
-> [[Word8]]
asm (Int
ixInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
4) (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st [AArch64 AReg FAReg F2Reg ()]
asms
asm Int
ix (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st (Fcvtas ()
_ AReg
r FAReg
d:[AArch64 AReg FAReg F2Reg ()]
asms) = [Word8
0b10011110, Word8
0x1 Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
6 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
0b100100, FAReg -> Word8
forall a. Enum a => a -> Word8
be FAReg
d Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftR` Int
3, FAReg -> AReg -> Word8
forall {a} {a}. (Enum a, Enum a) => a -> a -> Word8
lb FAReg
d AReg
r][Word8] -> [[Word8]] -> [[Word8]]
forall a. a -> [a] -> [a]
:Int
-> (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
-> [AArch64 AReg FAReg F2Reg ()]
-> [[Word8]]
asm (Int
ixInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
4) (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st [AArch64 AReg FAReg F2Reg ()]
asms
asm Int
ix (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st (Fsqrt ()
_ FAReg
d0 FAReg
d1:[AArch64 AReg FAReg F2Reg ()]
asms) = [Word8
0b00011110, Word8
0b01100001, Word8
0x3 Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
6 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. FAReg -> Word8
forall a. Enum a => a -> Word8
be FAReg
d1 Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftR` Int
3, FAReg -> FAReg -> Word8
forall {a} {a}. (Enum a, Enum a) => a -> a -> Word8
lb FAReg
d1 FAReg
d0][Word8] -> [[Word8]] -> [[Word8]]
forall a. a -> [a] -> [a]
:Int
-> (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
-> [AArch64 AReg FAReg F2Reg ()]
-> [[Word8]]
asm (Int
ixInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
4) (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st [AArch64 AReg FAReg F2Reg ()]
asms
asm Int
ix (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st (Fneg ()
_ FAReg
d0 FAReg
d1:[AArch64 AReg FAReg F2Reg ()]
asms) = [Word8
0b00011110, Word8
0b01100001, Word8
0x1 Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
6 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. FAReg -> Word8
forall a. Enum a => a -> Word8
be FAReg
d1 Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftR` Int
3, FAReg -> FAReg -> Word8
forall {a} {a}. (Enum a, Enum a) => a -> a -> Word8
lb FAReg
d1 FAReg
d0][Word8] -> [[Word8]] -> [[Word8]]
forall a. a -> [a] -> [a]
:Int
-> (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
-> [AArch64 AReg FAReg F2Reg ()]
-> [[Word8]]
asm (Int
ixInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
4) (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st [AArch64 AReg FAReg F2Reg ()]
asms
asm Int
ix (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st (Frintm ()
_ FAReg
d0 FAReg
d1:[AArch64 AReg FAReg F2Reg ()]
asms) = [Word8
0b00011110, Word8
0b01100101, Word8
0x1 Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
6 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. FAReg -> Word8
forall a. Enum a => a -> Word8
be FAReg
d1 Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftR` Int
3, FAReg -> FAReg -> Word8
forall {a} {a}. (Enum a, Enum a) => a -> a -> Word8
lb FAReg
d1 FAReg
d0][Word8] -> [[Word8]] -> [[Word8]]
forall a. a -> [a] -> [a]
:Int
-> (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
-> [AArch64 AReg FAReg F2Reg ()]
-> [[Word8]]
asm (Int
ixInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
4) (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st [AArch64 AReg FAReg F2Reg ()]
asms
asm Int
ix (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st (Asr ()
_ AReg
r0 AReg
r1 Word8
s:[AArch64 AReg FAReg F2Reg ()]
asms) = [Word8
0b10010011, Word8
0x1 Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
6 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
s, Word8
0b111111 Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
2 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. AReg -> Word8
forall a. Enum a => a -> Word8
be AReg
r1 Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftR` Int
3, AReg -> AReg -> Word8
forall {a} {a}. (Enum a, Enum a) => a -> a -> Word8
lb AReg
r0 AReg
r1][Word8] -> [[Word8]] -> [[Word8]]
forall a. a -> [a] -> [a]
:Int
-> (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
-> [AArch64 AReg FAReg F2Reg ()]
-> [[Word8]]
asm (Int
ixInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
4) (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st [AArch64 AReg FAReg F2Reg ()]
asms
asm Int
ix (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st (Lsl ()
_ AReg
r0 AReg
r1 Word8
s:[AArch64 AReg FAReg F2Reg ()]
asms) =
let immr :: Word8
immr= (-Word8
s) Word8 -> Word8 -> Word8
forall a. Integral a => a -> a -> a
`mod` Word8
64
imms :: Word8
imms=Word8
63Word8 -> Word8 -> Word8
forall a. Num a => a -> a -> a
-Word8
s
in [Word8
0b11010011, Word8
0x1 Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
6 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Word8
immr, Word8
imms Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
2 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. AReg -> Word8
forall a. Enum a => a -> Word8
be AReg
r1 Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftR` Int
3, AReg -> AReg -> Word8
forall {a} {a}. (Enum a, Enum a) => a -> a -> Word8
lb AReg
r1 AReg
r0][Word8] -> [[Word8]] -> [[Word8]]
forall a. a -> [a] -> [a]
:Int
-> (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
-> [AArch64 AReg FAReg F2Reg ()]
-> [[Word8]]
asm (Int
ixInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
4) (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st [AArch64 AReg FAReg F2Reg ()]
asms
asm Int
ix (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st (Bc ()
_ Cond
p Label
l:[AArch64 AReg FAReg F2Reg ()]
asms) =
let lIx :: Int
lIx=Label
-> (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
-> Int
get Label
l (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st
offs :: Int
offs=(Int
lIxInt -> Int -> Int
forall a. Num a => a -> a -> a
-Int
ix) Int -> Int -> Int
forall a. Integral a => a -> a -> a
`quot` Int
4
isn :: [Word8]
isn=[Word8
0b01010100, Int -> Word8
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int
offs Int -> Int -> Int
`lsr` Int
11), Int -> Word8
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int
0xff Int -> Int -> Int
forall a. Bits a => a -> a -> a
.&. (Int
offs Int -> Int -> Int
`lsr` Int
3)), (Int -> Word8
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int
0x7 Int -> Int -> Int
forall a. Bits a => a -> a -> a
.&. Int
offs) Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
5) Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Cond -> Word8
bp Cond
p]
in [Word8]
isn[Word8] -> [[Word8]] -> [[Word8]]
forall a. a -> [a] -> [a]
:Int
-> (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
-> [AArch64 AReg FAReg F2Reg ()]
-> [[Word8]]
asm (Int
ixInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
4) (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st [AArch64 AReg FAReg F2Reg ()]
asms
asm Int
ix (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st (Cbnz ()
_ AReg
r Label
l:[AArch64 AReg FAReg F2Reg ()]
asms) =
let lIx :: Int
lIx=Label
-> (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
-> Int
get Label
l (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st
offs :: Int
offs=(Int
lIxInt -> Int -> Int
forall a. Num a => a -> a -> a
-Int
ix) Int -> Int -> Int
forall a. Integral a => a -> a -> a
`quot` Int
4
isn :: [Word8]
isn=[Word8
0b10110101, Int -> Word8
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int
offs Int -> Int -> Int
`lsr` Int
11), Int -> Word8
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int
0xff Int -> Int -> Int
forall a. Bits a => a -> a -> a
.&. (Int
offs Int -> Int -> Int
`lsr` Int
3)), Int -> Word8
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int
0x7 Int -> Int -> Int
forall a. Bits a => a -> a -> a
.&. Int
offs) Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
5 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. AReg -> Word8
forall a. Enum a => a -> Word8
be AReg
r]
in [Word8]
isn[Word8] -> [[Word8]] -> [[Word8]]
forall a. a -> [a] -> [a]
:Int
-> (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
-> [AArch64 AReg FAReg F2Reg ()]
-> [[Word8]]
asm (Int
ixInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
4) (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st [AArch64 AReg FAReg F2Reg ()]
asms
asm Int
ix (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st (Cbz ()
_ AReg
r Label
l:[AArch64 AReg FAReg F2Reg ()]
asms) =
let lIx :: Int
lIx=Label
-> (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
-> Int
get Label
l (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st
offs :: Int
offs=(Int
lIxInt -> Int -> Int
forall a. Num a => a -> a -> a
-Int
ix) Int -> Int -> Int
forall a. Integral a => a -> a -> a
`quot` Int
4
isn :: [Word8]
isn=[Word8
0b10110100, Int -> Word8
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int
offs Int -> Int -> Int
`lsr` Int
11), Int -> Word8
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int
0xff Int -> Int -> Int
forall a. Bits a => a -> a -> a
.&. (Int
offs Int -> Int -> Int
`lsr` Int
3)), Int -> Word8
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int
0x7 Int -> Int -> Int
forall a. Bits a => a -> a -> a
.&. Int
offs) Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
5 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. AReg -> Word8
forall a. Enum a => a -> Word8
be AReg
r]
in [Word8]
isn[Word8] -> [[Word8]] -> [[Word8]]
forall a. a -> [a] -> [a]
:Int
-> (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
-> [AArch64 AReg FAReg F2Reg ()]
-> [[Word8]]
asm (Int
ixInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
4) (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st [AArch64 AReg FAReg F2Reg ()]
asms
asm Int
ix (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st (Tbz ()
_ AReg
r Word8
b Label
l:[AArch64 AReg FAReg F2Reg ()]
asms) | Word8
b Word8 -> Word8 -> Bool
forall a. Ord a => a -> a -> Bool
<= Word8
31 =
let lIx :: Int
lIx=Label
-> (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
-> Int
get Label
l (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st
offs :: Int
offs=(Int
lIxInt -> Int -> Int
forall a. Num a => a -> a -> a
-Int
ix) Int -> Int -> Int
forall a. Integral a => a -> a -> a
`quot` Int
4
isn :: [Word8]
isn=[Word8
0b00110110, Word8
b Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
3 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Int -> Word8
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int
offs Int -> Int -> Int
`lsr` Int
11), Int -> Word8
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int
0xff Int -> Int -> Int
forall a. Bits a => a -> a -> a
.&. (Int
offs Int -> Int -> Int
`lsr` Int
3)), Int -> Word8
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int
0x7 Int -> Int -> Int
forall a. Bits a => a -> a -> a
.&. Int
offs) Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
5 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. AReg -> Word8
forall a. Enum a => a -> Word8
be AReg
r]
in [Word8]
isn[Word8] -> [[Word8]] -> [[Word8]]
forall a. a -> [a] -> [a]
:Int
-> (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
-> [AArch64 AReg FAReg F2Reg ()]
-> [[Word8]]
asm (Int
ixInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
4) (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st [AArch64 AReg FAReg F2Reg ()]
asms
asm Int
ix (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st (Tbnz ()
_ AReg
r Word8
b Label
l:[AArch64 AReg FAReg F2Reg ()]
asms) | Word8
b Word8 -> Word8 -> Bool
forall a. Ord a => a -> a -> Bool
<= Word8
31 =
let lIx :: Int
lIx=Label
-> (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
-> Int
get Label
l (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st
offs :: Int
offs=(Int
lIxInt -> Int -> Int
forall a. Num a => a -> a -> a
-Int
ix) Int -> Int -> Int
forall a. Integral a => a -> a -> a
`quot` Int
4
isn :: [Word8]
isn=[Word8
0b00110111, Word8
b Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
3 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Int -> Word8
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int
offs Int -> Int -> Int
`lsr` Int
11), Int -> Word8
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int
0xff Int -> Int -> Int
forall a. Bits a => a -> a -> a
.&. (Int
offs Int -> Int -> Int
`lsr` Int
3)), Int -> Word8
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int
0x7 Int -> Int -> Int
forall a. Bits a => a -> a -> a
.&. Int
offs) Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
5 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. AReg -> Word8
forall a. Enum a => a -> Word8
be AReg
r]
in [Word8]
isn[Word8] -> [[Word8]] -> [[Word8]]
forall a. a -> [a] -> [a]
:Int
-> (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
-> [AArch64 AReg FAReg F2Reg ()]
-> [[Word8]]
asm (Int
ixInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
4) (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st [AArch64 AReg FAReg F2Reg ()]
asms
asm Int
ix (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st (C ()
_ Label
l:[AArch64 AReg FAReg F2Reg ()]
asms) =
let lIx :: Int
lIx=Label
-> (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
-> Int
get Label
l (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st
offs :: Int
offs=(Int
lIxInt -> Int -> Int
forall a. Num a => a -> a -> a
-(Int
ixInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
8)) Int -> Int -> Int
forall a. Integral a => a -> a -> a
`quot` Int
4
isn :: [Word8]
isn=[Word8
0b100101 Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
2 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Int -> Word8
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int
0x3 Int -> Int -> Int
forall a. Bits a => a -> a -> a
.&. (Int
offs Int -> Int -> Int
`lsr` Int
24)), Int -> Word8
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int
0xff Int -> Int -> Int
forall a. Bits a => a -> a -> a
.&. (Int
offs Int -> Int -> Int
`lsr` Int
16)), Int -> Word8
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int
0xff Int -> Int -> Int
forall a. Bits a => a -> a -> a
.&. (Int
offs Int -> Int -> Int
`lsr` Int
8)), Int -> Word8
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int
0xff Int -> Int -> Int
forall a. Bits a => a -> a -> a
.&. Int
offs)]
pro :: [[Word8]]
pro=Int
-> (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
-> [AArch64 AReg FAReg F2Reg ()]
-> [[Word8]]
asm Int
ix (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
forall a. HasCallStack => a
undefined [() -> AReg -> AReg -> Word16 -> AArch64 AReg FAReg F2Reg ()
forall reg freg f2 a.
a -> reg -> reg -> Word16 -> AArch64 reg freg f2 a
SubRC () AReg
SP AReg
SP Word16
16, () -> AReg -> AReg -> Addr AReg -> AArch64 AReg FAReg F2Reg ()
forall reg freg f2 a.
a -> reg -> reg -> Addr reg -> AArch64 reg freg f2 a
Stp () AReg
X29 AReg
X30 (AReg -> Addr AReg
forall reg. reg -> Addr reg
R AReg
SP)]
in [[Word8]]
pro[[Word8]] -> [[Word8]] -> [[Word8]]
forall a. [a] -> [a] -> [a]
++[Word8]
isn[Word8] -> [[Word8]] -> [[Word8]]
forall a. a -> [a] -> [a]
:Int
-> (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
-> [AArch64 AReg FAReg F2Reg ()]
-> [[Word8]]
asm (Int
ixInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
12) (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st (() -> AReg -> AReg -> Addr AReg -> AArch64 AReg FAReg F2Reg ()
forall reg freg f2 a.
a -> reg -> reg -> Addr reg -> AArch64 reg freg f2 a
Ldp () AReg
X29 AReg
X30 (AReg -> Addr AReg
forall reg. reg -> Addr reg
R AReg
SP)AArch64 AReg FAReg F2Reg ()
-> [AArch64 AReg FAReg F2Reg ()] -> [AArch64 AReg FAReg F2Reg ()]
forall a. a -> [a] -> [a]
:() -> AReg -> AReg -> Word16 -> AArch64 AReg FAReg F2Reg ()
forall reg freg f2 a.
a -> reg -> reg -> Word16 -> AArch64 reg freg f2 a
AddRC () AReg
SP AReg
SP Word16
16AArch64 AReg FAReg F2Reg ()
-> [AArch64 AReg FAReg F2Reg ()] -> [AArch64 AReg FAReg F2Reg ()]
forall a. a -> [a] -> [a]
:[AArch64 AReg FAReg F2Reg ()]
asms)
asm Int
ix (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st (B ()
_ Label
l:[AArch64 AReg FAReg F2Reg ()]
asms) =
let lIx :: Int
lIx=Label
-> (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
-> Int
get Label
l (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st
offs :: Int
offs=(Int
lIxInt -> Int -> Int
forall a. Num a => a -> a -> a
-Int
ix) Int -> Int -> Int
forall a. Integral a => a -> a -> a
`quot` Int
4
isn :: [Word8]
isn=[Word8
0x5 Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
2 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.|. Int -> Word8
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int
0x3 Int -> Int -> Int
forall a. Bits a => a -> a -> a
.&. (Int
offs Int -> Int -> Int
`lsr` Int
24)), Int -> Word8
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int
0xff Int -> Int -> Int
forall a. Bits a => a -> a -> a
.&. (Int
offs Int -> Int -> Int
`lsr` Int
16)), Int -> Word8
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int
0xff Int -> Int -> Int
forall a. Bits a => a -> a -> a
.&. (Int
offs Int -> Int -> Int
`lsr` Int
8)), Int -> Word8
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int
0xff Int -> Int -> Int
forall a. Bits a => a -> a -> a
.&. Int
offs)]
in [Word8]
isn[Word8] -> [[Word8]] -> [[Word8]]
forall a. a -> [a] -> [a]
:Int
-> (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
-> [AArch64 AReg FAReg F2Reg ()]
-> [[Word8]]
asm (Int
ixInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
4) (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st [AArch64 AReg FAReg F2Reg ()]
asms
asm Int
ix (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st (Blr ()
_ AReg
r:[AArch64 AReg FAReg F2Reg ()]
asms) = [Word8
0b11010110, Word8
0b00111111, AReg -> Word8
forall a. Enum a => a -> Word8
be AReg
r Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftR` Int
3, (Word8
0x7 Word8 -> Word8 -> Word8
forall a. Bits a => a -> a -> a
.&. AReg -> Word8
forall a. Enum a => a -> Word8
be AReg
r) Word8 -> Int -> Word8
forall a. Bits a => a -> Int -> a
`shiftL` Int
5][Word8] -> [[Word8]] -> [[Word8]]
forall a. a -> [a] -> [a]
:Int
-> (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
-> [AArch64 AReg FAReg F2Reg ()]
-> [[Word8]]
asm (Int
ixInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
4) (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st [AArch64 AReg FAReg F2Reg ()]
asms
asm Int
ix st :: (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st@(IntMap (Ptr Word64)
_, (Just (Int
m, Int
_, Int
_, Int
_), Maybe MCtx
_), Map Label Int
_) (MovRCf ()
_ AReg
r CFunc
Malloc:[AArch64 AReg FAReg F2Reg ()]
asms) =
Int
-> (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
-> [AArch64 AReg FAReg F2Reg ()]
-> [[Word8]]
asm Int
ix (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st (AReg -> Int -> [AArch64 AReg FAReg F2Reg ()]
m4 AReg
r Int
m[AArch64 AReg FAReg F2Reg ()]
-> [AArch64 AReg FAReg F2Reg ()] -> [AArch64 AReg FAReg F2Reg ()]
forall a. [a] -> [a] -> [a]
++[AArch64 AReg FAReg F2Reg ()]
asms)
asm Int
ix st :: (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st@(IntMap (Ptr Word64)
_, (Just (Int
_, Int
f, Int
_, Int
_), Maybe MCtx
_), Map Label Int
_) (MovRCf ()
_ AReg
r CFunc
Free:[AArch64 AReg FAReg F2Reg ()]
asms) =
Int
-> (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
-> [AArch64 AReg FAReg F2Reg ()]
-> [[Word8]]
asm Int
ix (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st (AReg -> Int -> [AArch64 AReg FAReg F2Reg ()]
m4 AReg
r Int
f[AArch64 AReg FAReg F2Reg ()]
-> [AArch64 AReg FAReg F2Reg ()] -> [AArch64 AReg FAReg F2Reg ()]
forall a. [a] -> [a] -> [a]
++[AArch64 AReg FAReg F2Reg ()]
asms)
asm Int
ix st :: (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st@(IntMap (Ptr Word64)
_, (Just (Int
_, Int
_, Int
d, Int
_), Maybe MCtx
_),Map Label Int
_) (MovRCf ()
_ AReg
r CFunc
DR:[AArch64 AReg FAReg F2Reg ()]
asms) =
Int
-> (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
-> [AArch64 AReg FAReg F2Reg ()]
-> [[Word8]]
asm Int
ix (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st (AReg -> Int -> [AArch64 AReg FAReg F2Reg ()]
m4 AReg
r Int
d[AArch64 AReg FAReg F2Reg ()]
-> [AArch64 AReg FAReg F2Reg ()] -> [AArch64 AReg FAReg F2Reg ()]
forall a. [a] -> [a] -> [a]
++[AArch64 AReg FAReg F2Reg ()]
asms)
asm Int
ix st :: (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st@(IntMap (Ptr Word64)
_, (Just (Int
_, Int
_, Int
_, Int
j), Maybe MCtx
_),Map Label Int
_) (MovRCf ()
_ AReg
r CFunc
JR:[AArch64 AReg FAReg F2Reg ()]
asms) =
Int
-> (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
-> [AArch64 AReg FAReg F2Reg ()]
-> [[Word8]]
asm Int
ix (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st (AReg -> Int -> [AArch64 AReg FAReg F2Reg ()]
m4 AReg
r Int
j[AArch64 AReg FAReg F2Reg ()]
-> [AArch64 AReg FAReg F2Reg ()] -> [AArch64 AReg FAReg F2Reg ()]
forall a. [a] -> [a] -> [a]
++[AArch64 AReg FAReg F2Reg ()]
asms)
asm Int
ix st :: (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st@(IntMap (Ptr Word64)
_, (Maybe CCtx
_, Just (Int
e, Int
_, Int
_)),Map Label Int
_) (MovRCf ()
_ AReg
r CFunc
Exp:[AArch64 AReg FAReg F2Reg ()]
asms) =
Int
-> (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
-> [AArch64 AReg FAReg F2Reg ()]
-> [[Word8]]
asm Int
ix (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st (AReg -> Int -> [AArch64 AReg FAReg F2Reg ()]
m4 AReg
r Int
e[AArch64 AReg FAReg F2Reg ()]
-> [AArch64 AReg FAReg F2Reg ()] -> [AArch64 AReg FAReg F2Reg ()]
forall a. [a] -> [a] -> [a]
++[AArch64 AReg FAReg F2Reg ()]
asms)
asm Int
ix st :: (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st@(IntMap (Ptr Word64)
_, (Maybe CCtx
_, Just (Int
_, Int
l, Int
_)),Map Label Int
_) (MovRCf ()
_ AReg
r CFunc
Log:[AArch64 AReg FAReg F2Reg ()]
asms) =
Int
-> (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
-> [AArch64 AReg FAReg F2Reg ()]
-> [[Word8]]
asm Int
ix (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st (AReg -> Int -> [AArch64 AReg FAReg F2Reg ()]
m4 AReg
r Int
l[AArch64 AReg FAReg F2Reg ()]
-> [AArch64 AReg FAReg F2Reg ()] -> [AArch64 AReg FAReg F2Reg ()]
forall a. [a] -> [a] -> [a]
++[AArch64 AReg FAReg F2Reg ()]
asms)
asm Int
ix st :: (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st@(IntMap (Ptr Word64)
_, (Maybe CCtx
_, Just (Int
_, Int
_, Int
p)),Map Label Int
_) (MovRCf ()
_ AReg
r CFunc
Pow:[AArch64 AReg FAReg F2Reg ()]
asms) =
Int
-> (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
-> [AArch64 AReg FAReg F2Reg ()]
-> [[Word8]]
asm Int
ix (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st (AReg -> Int -> [AArch64 AReg FAReg F2Reg ()]
m4 AReg
r Int
p[AArch64 AReg FAReg F2Reg ()]
-> [AArch64 AReg FAReg F2Reg ()] -> [AArch64 AReg FAReg F2Reg ()]
forall a. [a] -> [a] -> [a]
++[AArch64 AReg FAReg F2Reg ()]
asms)
asm Int
ix (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st (LdrRL ()
_ AReg
r Int
l:[AArch64 AReg FAReg F2Reg ()]
asms) =
let p :: Int
p = Ptr Word64 -> Int
forall a. Ptr a -> Int
pI(Ptr Word64 -> Int) -> Ptr Word64 -> Int
forall a b. (a -> b) -> a -> b
$Int
-> (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
-> Ptr Word64
arr Int
l (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st
w0 :: Int
w0=Int
p Int -> Int -> Int
forall a. Bits a => a -> a -> a
.&. Int
0xffff; w1 :: Int
w1=(Int
p Int -> Int -> Int
forall a. Bits a => a -> a -> a
.&. Int
0xffff0000) Int -> Int -> Int
`lsr` Int
16; w2 :: Int
w2=(Int
p Int -> Int -> Int
forall a. Bits a => a -> a -> a
.&. Int
0xFFFF00000000) Int -> Int -> Int
`lsr` Int
32; w3 :: Int
w3=(Int
p Int -> Int -> Int
forall a. Bits a => a -> a -> a
.&. Int
0xFFFF000000000000) Int -> Int -> Int
`lsr` Int
48
in Int
-> (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
-> [AArch64 AReg FAReg F2Reg ()]
-> [[Word8]]
asm Int
ix (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
st (() -> AReg -> Word16 -> AArch64 AReg FAReg F2Reg ()
forall reg freg f2 a. a -> reg -> Word16 -> AArch64 reg freg f2 a
MovRC () AReg
r (Int -> Word16
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
w0)AArch64 AReg FAReg F2Reg ()
-> [AArch64 AReg FAReg F2Reg ()] -> [AArch64 AReg FAReg F2Reg ()]
forall a. a -> [a] -> [a]
:() -> AReg -> Word16 -> Int -> AArch64 AReg FAReg F2Reg ()
forall reg freg f2 a.
a -> reg -> Word16 -> Int -> AArch64 reg freg f2 a
MovK () AReg
r (Int -> Word16
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
w1) Int
16AArch64 AReg FAReg F2Reg ()
-> [AArch64 AReg FAReg F2Reg ()] -> [AArch64 AReg FAReg F2Reg ()]
forall a. a -> [a] -> [a]
:() -> AReg -> Word16 -> Int -> AArch64 AReg FAReg F2Reg ()
forall reg freg f2 a.
a -> reg -> Word16 -> Int -> AArch64 reg freg f2 a
MovK () AReg
r (Int -> Word16
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
w2) Int
32AArch64 AReg FAReg F2Reg ()
-> [AArch64 AReg FAReg F2Reg ()] -> [AArch64 AReg FAReg F2Reg ()]
forall a. a -> [a] -> [a]
:() -> AReg -> Word16 -> Int -> AArch64 AReg FAReg F2Reg ()
forall reg freg f2 a.
a -> reg -> Word16 -> Int -> AArch64 reg freg f2 a
MovK () AReg
r (Int -> Word16
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
w3) Int
48AArch64 AReg FAReg F2Reg ()
-> [AArch64 AReg FAReg F2Reg ()] -> [AArch64 AReg FAReg F2Reg ()]
forall a. a -> [a] -> [a]
:[AArch64 AReg FAReg F2Reg ()]
asms)
asm Int
_ (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
_ (AArch64 AReg FAReg F2Reg ()
isn:[AArch64 AReg FAReg F2Reg ()]
_) = [Char] -> [[Word8]]
forall a. HasCallStack => [Char] -> a
error (AArch64 AReg FAReg F2Reg () -> [Char]
forall a. Show a => a -> [Char]
show AArch64 AReg FAReg F2Reg ()
isn)
m4 :: AReg -> Int -> [AArch64 AReg FAReg F2Reg ()]
m4 :: AReg -> Int -> [AArch64 AReg FAReg F2Reg ()]
m4 AReg
r Int
a = let w0 :: Int
w0=Int
a Int -> Int -> Int
forall a. Bits a => a -> a -> a
.&. Int
0xffff; w1 :: Int
w1=(Int
a Int -> Int -> Int
forall a. Bits a => a -> a -> a
.&. Int
0xffff0000) Int -> Int -> Int
`lsr` Int
16; w2 :: Int
w2=(Int
a Int -> Int -> Int
forall a. Bits a => a -> a -> a
.&. Int
0xFFFF00000000) Int -> Int -> Int
`lsr` Int
32; w3 :: Int
w3=(Int
a Int -> Int -> Int
forall a. Bits a => a -> a -> a
.&. Int
0xFFFF000000000000) Int -> Int -> Int
`lsr` Int
48
in [() -> AReg -> Word16 -> AArch64 AReg FAReg F2Reg ()
forall reg freg f2 a. a -> reg -> Word16 -> AArch64 reg freg f2 a
MovRC () AReg
r (Int -> Word16
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
w0), () -> AReg -> Word16 -> Int -> AArch64 AReg FAReg F2Reg ()
forall reg freg f2 a.
a -> reg -> Word16 -> Int -> AArch64 reg freg f2 a
MovK () AReg
r (Int -> Word16
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
w1) Int
16, () -> AReg -> Word16 -> Int -> AArch64 AReg FAReg F2Reg ()
forall reg freg f2 a.
a -> reg -> Word16 -> Int -> AArch64 reg freg f2 a
MovK () AReg
r (Int -> Word16
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
w2) Int
32, () -> AReg -> Word16 -> Int -> AArch64 AReg FAReg F2Reg ()
forall reg freg f2 a.
a -> reg -> Word16 -> Int -> AArch64 reg freg f2 a
MovK () AReg
r (Int -> Word16
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
w3) Int
48]
get :: Label -> (IM.IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), M.Map Label Int) -> Int
get :: Label
-> (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
-> Int
get Label
l =
Int -> Label -> Map Label Int -> Int
forall k a. Ord k => a -> k -> Map k a -> a
M.findWithDefault ([Char] -> Int
forall a. HasCallStack => [Char] -> a
error [Char]
"Internal error: label not found") Label
l (Map Label Int -> Int)
-> ((IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
-> Map Label Int)
-> (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
-> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
-> Map Label Int
forall a b c. (a, b, c) -> c
thd3
arr :: Int -> (IM.IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), M.Map Label Int) -> Ptr Word64
arr :: Int
-> (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
-> Ptr Word64
arr Int
n = Ptr Word64 -> Int -> IntMap (Ptr Word64) -> Ptr Word64
forall a. a -> Int -> IntMap a -> a
IM.findWithDefault ([Char] -> Ptr Word64
forall a. HasCallStack => [Char] -> a
error [Char]
"Internal error: array not found during assembler stage") Int
n (IntMap (Ptr Word64) -> Ptr Word64)
-> ((IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
-> IntMap (Ptr Word64))
-> (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
-> Ptr Word64
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (IntMap (Ptr Word64), (Maybe CCtx, Maybe MCtx), Map Label Int)
-> IntMap (Ptr Word64)
forall a b c. (a, b, c) -> a
fst3
fst4 :: (a, b, c, d) -> a
fst4 :: forall a b c d. (a, b, c, d) -> a
fst4 (a
x, b
_, c
_, d
_) = a
x
pI :: Ptr a -> Int
pI :: forall a. Ptr a -> Int
pI = (\(IntPtr Int
i) -> Int
i) (IntPtr -> Int) -> (Ptr a -> IntPtr) -> Ptr a -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Ptr a -> IntPtr
forall a. Ptr a -> IntPtr
ptrToIntPtr