module Bindings.Bfd.Disasm.I386.Insn.Operand where

import Bindings.Bfd.Disasm.I386.Insn.EffectiveAddr


data Operand = Imm  {
                       immed        :: Int
               }
             | IndD {
                       section      :: String
                     , effAddr      :: EffectiveAddr
                     , displacement :: Maybe Int
                     , address      :: Maybe Int
               }
             | IndJ {
                       effAddr      :: EffectiveAddr
                     , displacement :: Maybe Int
                     , address      :: Maybe Int
               }
             | DirD {
                       direct       :: String
               }
             | DirJ {
                       direct       :: String
               }
             | Abs  {
                       absolute     :: Int
               }
             -- the following constructors are created by canonicalizing the above
             | ImmSym {
                       symbolIndex  :: Int
               }
             | IndDSym {
                       effAddr      :: EffectiveAddr
                     , symbolIndex  :: Int
                     , addend       :: Int
               }
             | IndJSym {
                       effAddr      :: EffectiveAddr
                     , symbolIndex  :: Int
                     , addend       :: Int
               }
             | AbsSymT {
                       symbolIndex  :: Int
               }
             | AbsSymL {
                       symbol       :: String
               }
     deriving (Eq, Ord, Show)


isAbs
   :: Operand
   -> Bool
isAbs (Abs _) = True
isAbs _       = False