module Asm.Aarch64.Opt ( opt ) where

import           Asm.Aarch64

opt :: (Eq reg, Eq freg) => [AArch64 reg freg f2reg ()] -> [AArch64 reg freg f2reg ()]
opt :: forall reg freg f2reg.
(Eq reg, Eq freg) =>
[AArch64 reg freg f2reg ()] -> [AArch64 reg freg f2reg ()]
opt (Str ()
_ reg
r0 (R reg
ar0):Str ()
_ reg
r1 (RP reg
ar1 Word16
8):[AArch64 reg freg f2reg ()]
asms) | reg
ar0 reg -> reg -> Bool
forall a. Eq a => a -> a -> Bool
== reg
ar1 = () -> reg -> reg -> Addr reg -> AArch64 reg freg f2reg ()
forall reg freg f2 a.
a -> reg -> reg -> Addr reg -> AArch64 reg freg f2 a
Stp () reg
r0 reg
r1 (reg -> Addr reg
forall reg. reg -> Addr reg
R reg
ar0)AArch64 reg freg f2reg ()
-> [AArch64 reg freg f2reg ()] -> [AArch64 reg freg f2reg ()]
forall a. a -> [a] -> [a]
:[AArch64 reg freg f2reg ()] -> [AArch64 reg freg f2reg ()]
forall reg freg f2reg.
(Eq reg, Eq freg) =>
[AArch64 reg freg f2reg ()] -> [AArch64 reg freg f2reg ()]
opt [AArch64 reg freg f2reg ()]
asms
opt ((MovRC ()
_ reg
r Word16
0):[AArch64 reg freg f2reg ()]
asms) = [AArch64 reg freg f2reg ()] -> [AArch64 reg freg f2reg ()]
forall reg freg f2reg.
(Eq reg, Eq freg) =>
[AArch64 reg freg f2reg ()] -> [AArch64 reg freg f2reg ()]
opt (() -> reg -> AArch64 reg freg f2reg ()
forall reg freg f2 a. a -> reg -> AArch64 reg freg f2 a
ZeroR () reg
rAArch64 reg freg f2reg ()
-> [AArch64 reg freg f2reg ()] -> [AArch64 reg freg f2reg ()]
forall a. a -> [a] -> [a]
:[AArch64 reg freg f2reg ()]
asms)
opt ((ZeroR ()
_ reg
r0):(MovK ()
_ reg
r1 Word16
u Int
s):[AArch64 reg freg f2reg ()]
asms) | reg
r0 reg -> reg -> Bool
forall a. Eq a => a -> a -> Bool
== reg
r1 = [AArch64 reg freg f2reg ()] -> [AArch64 reg freg f2reg ()]
forall reg freg f2reg.
(Eq reg, Eq freg) =>
[AArch64 reg freg f2reg ()] -> [AArch64 reg freg f2reg ()]
opt (() -> reg -> Word16 -> Int -> AArch64 reg freg f2reg ()
forall reg freg f2 a.
a -> reg -> Word16 -> Int -> AArch64 reg freg f2 a
MovZ () reg
r1 Word16
u Int
sAArch64 reg freg f2reg ()
-> [AArch64 reg freg f2reg ()] -> [AArch64 reg freg f2reg ()]
forall a. a -> [a] -> [a]
:[AArch64 reg freg f2reg ()]
asms)
opt ((MovRR ()
_ reg
r0 reg
r1):[AArch64 reg freg f2reg ()]
asms) | reg
r0 reg -> reg -> Bool
forall a. Eq a => a -> a -> Bool
== reg
r1 = [AArch64 reg freg f2reg ()] -> [AArch64 reg freg f2reg ()]
forall reg freg f2reg.
(Eq reg, Eq freg) =>
[AArch64 reg freg f2reg ()] -> [AArch64 reg freg f2reg ()]
opt [AArch64 reg freg f2reg ()]
asms
opt ((FMovXX ()
_ freg
r0 freg
r1):[AArch64 reg freg f2reg ()]
asms) | freg
r0 freg -> freg -> Bool
forall a. Eq a => a -> a -> Bool
== freg
r1 = [AArch64 reg freg f2reg ()] -> [AArch64 reg freg f2reg ()]
forall reg freg f2reg.
(Eq reg, Eq freg) =>
[AArch64 reg freg f2reg ()] -> [AArch64 reg freg f2reg ()]
opt [AArch64 reg freg f2reg ()]
asms
opt (AArch64 reg freg f2reg ()
asm:[AArch64 reg freg f2reg ()]
asms) = AArch64 reg freg f2reg ()
asm AArch64 reg freg f2reg ()
-> [AArch64 reg freg f2reg ()] -> [AArch64 reg freg f2reg ()]
forall a. a -> [a] -> [a]
: [AArch64 reg freg f2reg ()] -> [AArch64 reg freg f2reg ()]
forall reg freg f2reg.
(Eq reg, Eq freg) =>
[AArch64 reg freg f2reg ()] -> [AArch64 reg freg f2reg ()]
opt [AArch64 reg freg f2reg ()]
asms
opt [] = []