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