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