module Kempe.Asm.Arm.Opt ( optimizeArm ) where import Kempe.Asm.Arm.Type optimizeArm :: Eq reg => [Arm reg a] -> [Arm reg a] optimizeArm :: [Arm reg a] -> [Arm reg a] optimizeArm ((Store a l reg r Addr reg a):(Load a _ reg r' Addr reg a'):[Arm reg a] as) | reg r reg -> reg -> Bool forall a. Eq a => a -> a -> Bool == reg r' Bool -> Bool -> Bool && Addr reg a Addr reg -> Addr reg -> Bool forall a. Eq a => a -> a -> Bool == Addr reg a' = [Arm reg a] -> [Arm reg a] forall reg a. Eq reg => [Arm reg a] -> [Arm reg a] optimizeArm (a -> reg -> Addr reg -> Arm reg a forall reg a. a -> reg -> Addr reg -> Arm reg a Store a l reg r Addr reg a Arm reg a -> [Arm reg a] -> [Arm reg a] forall a. a -> [a] -> [a] : [Arm reg a] as) optimizeArm ((StoreByte a l reg r Addr reg a):(LoadByte a _ reg r' Addr reg a'):[Arm reg a] as) | reg r reg -> reg -> Bool forall a. Eq a => a -> a -> Bool == reg r' Bool -> Bool -> Bool && Addr reg a Addr reg -> Addr reg -> Bool forall a. Eq a => a -> a -> Bool == Addr reg a' = [Arm reg a] -> [Arm reg a] forall reg a. Eq reg => [Arm reg a] -> [Arm reg a] optimizeArm (a -> reg -> Addr reg -> Arm reg a forall reg a. a -> reg -> Addr reg -> Arm reg a StoreByte a l reg r Addr reg a Arm reg a -> [Arm reg a] -> [Arm reg a] forall a. a -> [a] -> [a] : [Arm reg a] as) optimizeArm (Arm reg a a:[Arm reg a] as) = Arm reg a a Arm reg a -> [Arm reg a] -> [Arm reg a] forall a. a -> [a] -> [a] : [Arm reg a] -> [Arm reg a] forall reg a. Eq reg => [Arm reg a] -> [Arm reg a] optimizeArm [Arm reg a] as optimizeArm [] = []